From 250e509737308d5428d6a89086c8bab8a11cd638 Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Sun, 29 Oct 2023 05:00:19 +0200 Subject: [PATCH 01/64] Cleanup --- .github/CODEOWNERS | 3 -- .github/PULL_REQUEST_TEMPLATE.md | 33 -------------------- .github/workflows/ci.yml | 52 -------------------------------- 3 files changed, 88 deletions(-) delete mode 100644 .github/CODEOWNERS delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/ci.yml diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 7bd16fe97..000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,3 +0,0 @@ -# At least one of the code owners below will be required on each PR: - -* @markAtMicrosoft @smmatte @adclements @abmahdy @iennae @nasadigital @isadorasophia @sagarmanchanda diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index ef9bbe450..000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,33 +0,0 @@ -# Description: - -Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. - -## Type of change - -Please delete options that are not relevant. - -- [ ] Bug fix (non-breaking change which fixes an issue) -- [ ] New feature (non-breaking change which adds functionality) -- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) -- [ ] This change requires a documentation update - -# Limitations: - -Please describe limitations of this PR - -# Testing: - -Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration - -- [ ] Test A -- [ ] Test B - -# Checklist: - -- [ ] My code follows the style guidelines of this project -- [ ] My code has been formatted with `npm run format` and passes the checks in `npm run check` -- [ ] I have performed a self-review of my own code -- [ ] I have commented my code, particularly in hard-to-understand areas -- [ ] I have made corresponding changes to the documentation -- [ ] My changes generate no new warnings -- [ ] Any dependent changes have been merged and published in downstream modules diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 93eb4fa78..000000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,52 +0,0 @@ -# This workflow will do a clean install of node dependencies, python dependencies, build the source code and run tests - -name: CI - -on: - push: - branches: [ dev, staging ] - pull_request: - branches: [ dev, staging ] - -jobs: - build-and-test: - - runs-on: ${{ matrix.os }} - - strategy: - fail-fast: false - matrix: - os: [macos-latest, windows-latest, ubuntu-18.04] - node-version: [10.x] - - steps: - - uses: actions/checkout@v2 - - name: Install Linux dependencies - if: matrix.os == 'ubuntu-18.04' - run: | - sudo apt-get update - sudo apt-get install g++-multilib - sudo apt-get install -y build-essential - sudo apt-get install libudev-dev - - name: Use Node.js ${{ matrix.node-version }} and install npm dependencies - uses: actions/setup-node@v2 - with: - node-version: ${{ matrix.node-version }} - - run: npm install - - name: Setup Python environment - uses: actions/setup-python@v2 - with: - python-version: 3.x - - run: | - python -m pip install --upgrade pip - pip install -r ./src/dev-requirements.txt - - name: Use npm to compile, format-check and test - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - run: npm run compile - - run: npm run check - - name: Run tests - uses: GabrielBB/xvfb-action@v1.0 - with: - run: npm run test From 2a2f9ad179c49f0db23c221192cda4cfdcad598f Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Sun, 29 Oct 2023 08:17:33 +0200 Subject: [PATCH 02/64] squash! --- CHANGELOG.md | 9 - CONTRIBUTING.md | 14 - SECURITY.md | 21 - ThirdPartyNotices.txt | 6225 -------- package-lock.json | 32342 ---------------------------------------- package.json | 126 +- 6 files changed, 63 insertions(+), 38674 deletions(-) delete mode 100644 CHANGELOG.md delete mode 100644 CONTRIBUTING.md delete mode 100644 SECURITY.md delete mode 100644 ThirdPartyNotices.txt delete mode 100644 package-lock.json diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 230138ddb..000000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,9 +0,0 @@ -# Change Log - -All notable changes to the "embedded-python" extension will be documented in this file. - -Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. - -## [Unreleased] - -- Initial release \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index c282e9a1a..000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,14 +0,0 @@ -# Contributing - -This project welcomes contributions and suggestions. Most contributions require you to -agree to a Contributor License Agreement (CLA) declaring that you have the right to, -and actually do, grant us the rights to use your contribution. For details, visit -https://cla.microsoft.com. - -When you submit a pull request, a CLA-bot will automatically determine whether you need -to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the -instructions provided by the bot. You will only need to do this once across all repositories using our CLA. - -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). -For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) -or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. \ No newline at end of file diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 034e84803..000000000 --- a/SECURITY.md +++ /dev/null @@ -1,21 +0,0 @@ -# Security Policy - -## Supported Versions - -Use this section to tell people about which versions of your project are -currently being supported with security updates. - -| Version | Supported | -| ------- | ------------------ | -| 5.1.x | :white_check_mark: | -| 5.0.x | :x: | -| 4.0.x | :white_check_mark: | -| < 4.0 | :x: | - -## Reporting a Vulnerability - -Use this section to tell people how to report a vulnerability. - -Tell them where to go, how often they can expect to get an update on a -reported vulnerability, what to expect if the vulnerability is accepted or -declined, etc. diff --git a/ThirdPartyNotices.txt b/ThirdPartyNotices.txt deleted file mode 100644 index f062565a7..000000000 --- a/ThirdPartyNotices.txt +++ /dev/null @@ -1,6225 +0,0 @@ -NOTICES AND INFORMATION -Do Not Translate or Localize - -This software incorporates material from third parties. -Microsoft makes certain open source code available at https://3rdpartysource.microsoft.com, -or you may send a check or money order for US $5.00, including the product name, -the open source component name, and version number, to: - -Source Code Compliance Team -Microsoft Corporation -One Microsoft Way -Redmond, WA 98052 -USA - -Notwithstanding any other terms, you may reverse engineer this software to the extent -required to debug changes to any libraries licensed under the GNU Lesser General Public License. - - -------------------------------------------------------------------- - -detect-node 2.0.4 - ISC -https://github.com/iliakan/detect-node -Copyright (c) 2017 Ilya Kantor - -The ISC License - -Copyright (c) Isaac Z. Schlueter - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - - - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -inherits 2.0.3 - ISC -https://github.com/isaacs/inherits#readme -Copyright (c) Isaac Z. Schlueter - -The ISC License - -Copyright (c) Isaac Z. Schlueter - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - - - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -semver 5.7.0 - ISC -https://github.com/npm/node-semver#readme -Copyright Isaac Z. -Copyright Isaac Z. Schlueter -Copyright (c) Isaac Z. Schlueter and Contributors - -The ISC License - -Copyright (c) Isaac Z. Schlueter - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - - - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -setprototypeof 1.1.0 - ISC -https://github.com/wesleytodd/setprototypeof -Copyright (c) 2015, Wes Todd - -The ISC License - -Copyright (c) Isaac Z. Schlueter - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - - - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -@types/node 10.14.7 - MIT -Copyright (c) Microsoft Corporation. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -@types/open 6.1.0 - MIT - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -@types/socket.io 2.1.2 - MIT -Copyright (c) Microsoft Corporation. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -accepts 1.3.7 - MIT -https://github.com/jshttp/accepts#readme -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015 Douglas Christopher Wilson -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015 Douglas Christopher Wilson - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -after 0.8.2 - MIT -https://github.com/Raynos/after#readme -Copyright (c) 2011 Raynos. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -applicationinsights 1.0.8 - MIT -https://github.com/Microsoft/ApplicationInsights-node.js#readme -Copyright (c) Microsoft Corporation. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -arraybuffer.slice 0.0.7 - MIT -https://github.com/rase-/arraybuffer.slice -Copyright (c) 2013 Rase - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -async 1.5.2 - MIT -https://github.com/caolan/async#readme -Copyright 2010-2014 Caolan McMahon -Copyright (c) 2010-2014 Caolan McMahon - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -async-limiter 1.0.0 - MIT -https://github.com/strml/async-limiter#readme -Copyright (c) 2017 Samuel Reed - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -backo2 1.0.2 - MIT -https://github.com/mokesmokes/backo - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -base64-arraybuffer 0.1.5 - MIT -https://github.com/niklasvh/base64-arraybuffer -Copyright (c) 2012 Niklas von Hertzen - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -base64id 1.0.0 - MIT -https://github.com/faeldt/base64id#readme -Copyright (c) 2012-2016 Kristian Faeldt - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -batch 0.6.1 - MIT -https://github.com/visionmedia/batch#readme -Copyright (c) 2013 TJ Holowaychuk - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -better-assert 1.0.2 - MIT -https://github.com/visionmedia/better-assert -Copyright (c) 2012 TJ Holowaychuk - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -blob 0.0.5 - MIT -https://github.com/webmodules/blob -Copyright (c) 2014 Rase - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -callsite 1.0.0 - MIT - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -compare-versions 3.5.1 - MIT -https://github.com/omichelsen/compare-versions#readme -Copyright (c) 2015-2017 Ole Michelsen - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -component-bind 1.0.0 - MIT -https://github.com/component/bind - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -component-emitter 1.2.1 - MIT -https://github.com/component/emitter#readme -Copyright (c) 2014 Component - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -component-inherit 0.0.3 - MIT -https://github.com/component/inherit - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -cookie 0.3.1 - MIT -https://github.com/jshttp/cookie -Copyright (c) 2012-2014 Roman Shtylman -Copyright (c) 2015 Douglas Christopher Wilson -Copyright (c) 2012-2014 Roman Shtylman -Copyright (c) 2015 Douglas Christopher Wilson - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -debug 3.1.0 - MIT -https://github.com/visionmedia/debug#readme -Copyright (c) 2014 TJ Holowaychuk -Copyright (c) 2014-2017 TJ Holowaychuk - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -debug 4.1.1 - MIT -https://github.com/visionmedia/debug#readme -Copyright (c) 2014 TJ Holowaychuk -Copyright (c) 2014-2017 TJ Holowaychuk - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -define-properties 1.1.3 - MIT -https://github.com/ljharb/define-properties#readme -Copyright (c) 2015 Jordan Harband - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -diagnostic-channel 0.2.0 - MIT -https://github.com/Microsoft/node-diagnostic-channel -Copyright (c) Microsoft Corporation. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -diagnostic-channel-publishers 0.2.1 - MIT -https://github.com/Microsoft/node-diagnostic-channel -Copyright (c) Microsoft Corporation. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -engine.io 3.3.2 - MIT -https://github.com/socketio/engine.io -Copyright (c) 2014 Guillermo Rauch - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -engine.io-client 3.3.2 - MIT -https://github.com/socketio/engine.io-client -Copyright (c) 2014 Automattic, Inc. -Copyright (c) 2012 Niklas von Hertzen -Copyright (c) 2014-2015 Automattic - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -engine.io-parser 2.1.3 - MIT -https://github.com/socketio/engine.io-parser -Copyright (c) 2016 Guillermo Rauch - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -es-abstract 1.13.0 - MIT -https://github.com/ljharb/es-abstract#readme -Copyright (c) 2015 Jordan Harband - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -es-to-primitive 1.2.0 - MIT -https://github.com/ljharb/es-to-primitive#readme -Copyright (c) 2015 Jordan Harband - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -eventemitter2 5.0.1 - MIT -https://github.com/hij1nx/EventEmitter2#readme -Copyright (c) 2013 -Copyright (c) 2016 Paolo Fragomeni and Contributors - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -eventsource 1.0.7 - MIT -http://github.com/EventSource/eventsource -Copyright (c) EventSource GitHub -Copyright Joyent, Inc. and other Node contributors. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -faye-websocket 0.11.1 - MIT -https://github.com/faye/faye-websocket-node -Copyright (c) 2010-2017 James Coglan - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -faye-websocket 0.10.0 - MIT -http://github.com/faye/faye-websocket-node -Copyright (c) 2010-2015 James Coglan - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -function-bind 1.1.1 - MIT -https://github.com/Raynos/function-bind -Copyright (c) 2013 Raynos. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -handle-thing 2.0.0 - MIT -https://github.com/spdy-http2/handle-thing#readme -Copyright Fedor Indutny, 2015. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -has 1.0.3 - MIT -https://github.com/tarruda/has -Copyright (c) 2013 Thiago de Arruda - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -has-binary2 1.0.3 - MIT -Copyright (c) 2014 Kevin Roark - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -has-cors 1.1.0 - MIT -https://github.com/component/has-cors - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -has-symbols 1.0.0 - MIT -https://github.com/ljharb/has-symbols#readme -Copyright (c) 2016 Jordan Harband - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -hpack.js 2.1.6 - MIT -https://github.com/indutny/hpack.js#readme -Copyright Fedor Indutny, 2015. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -http-deceiver 1.2.7 - MIT -https://github.com/indutny/http-deceiver#readme -Copyright Fedor Indutny, 2015. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -http-errors 1.6.3 - MIT -https://github.com/jshttp/http-errors#readme -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2016 Douglas Christopher Wilson -Copyright (c) 2014 Jonathan Ong me@jongleberry.com -Copyright (c) 2016 Douglas Christopher Wilson doug@somethingdoug.com - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -http-parser-js 0.5.0 - MIT -https://github.com/creationix/http-parser-js#readme -Copyright Joyent, Inc. and other Node contributors. -Copyright (c) 2015 Tim Caswell (https://github.com/creationix) and other contributors. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -indexof 0.0.1 - MIT - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -is-arguments 1.0.4 - MIT -https://github.com/ljharb/is-arguments -Copyright (c) 2014 Jordan Harband - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -is-callable 1.1.4 - MIT -https://github.com/ljharb/is-callable#readme -Copyright (c) 2015 Jordan Harband - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -is-date-object 1.0.1 - MIT -https://github.com/ljharb/is-date-object#readme -Copyright (c) 2015 Jordan Harband - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -is-generator-function 1.0.7 - MIT -https://github.com/ljharb/is-generator-function#readme -Copyright (c) 2014 Jordan Harband - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -is-regex 1.0.4 - MIT -https://github.com/ljharb/is-regex -Copyright (c) 2014 Jordan Harband - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -is-symbol 1.0.2 - MIT -https://github.com/ljharb/is-symbol#readme -Copyright (c) 2015 Jordan Harband - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -is-wsl 1.1.0 - MIT -https://github.com/sindresorhus/is-wsl#readme -(c) Sindre Sorhus (https://sindresorhus.com) -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -isarray 2.0.1 - MIT -https://github.com/juliangruber/isarray -Copyright (c) 2013 Julian Gruber - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -js-tokens 4.0.0 - MIT -https://github.com/lydell/js-tokens#readme -Copyright 2014, 2015, 2016, 2017, 2018 Simon Lydell -Copyright (c) 2014, 2015, 2016, 2017, 2018 Simon Lydell - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -json3 3.3.3 - MIT -https://bestiejs.github.io/json3 -Copyright (c) 2013-2015 Benjamin Tan. https://d10.github.io -Copyright (c) 2012-2015 Kit Cambridge. http://kitcambridge.be -Copyright 2012-2015, Kit Cambridge, Benjamin Tan http://kit.mit-license.org -(c) 2012-2015 http://kitcambridge.be/' Kit Cambridge, https://d10.github.io/' Benjamin Tan - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -loose-envify 1.4.0 - MIT -https://github.com/zertosh/loose-envify -Copyright (c) 2015 Andres Suarez - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -mime-db 1.40.0 - MIT -https://github.com/jshttp/mime-db#readme -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -mime-types 2.1.24 - MIT -https://github.com/jshttp/mime-types#readme -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015 Douglas Christopher Wilson -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015 Douglas Christopher Wilson - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -ms 2.1.1 - MIT -https://github.com/zeit/ms#readme -Copyright (c) 2016 Zeit, Inc. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -ms 2.0.0 - MIT -https://github.com/zeit/ms#readme -Copyright (c) 2016 Zeit, Inc. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -negotiator 0.6.2 - MIT -https://github.com/jshttp/negotiator#readme -Copyright (c) 2012 Federico Romero -Copyright (c) 2014 Federico Romero -Copyright (c) 2012 Isaac Z. Schlueter -Copyright (c) 2012-2014 Federico Romero -Copyright (c) 2012-2014 Isaac Z. Schlueter -Copyright (c) 2015 Douglas Christopher Wilson -Copyright (c) 2014-2015 Douglas Christopher Wilson - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -object-assign 4.1.1 - MIT -https://github.com/sindresorhus/object-assign#readme -(c) Sindre Sorhus -(c) Sindre Sorhus (https://sindresorhus.com) -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -object-component 0.0.3 - MIT - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -object-keys 1.1.1 - MIT -https://github.com/ljharb/object-keys#readme -Copyright (c) 2013 Jordan Harband - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -object.entries 1.1.0 - MIT -https://github.com/es-shims/Object.entries#readme -Copyright (c) 2015 Jordan Harband - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -obuf 1.1.2 - MIT -https://github.com/indutny/offset-buffer -Copyright Fedor Indutny, 2015. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -open 6.4.0 - MIT -https://github.com/sindresorhus/open#readme -Copyright 2006, Kevin Krammer -Copyright 2006, Jeremy White -Copyright 2009-2010, Fathi Boudra -Copyright 2009-2010, Rex Dieter -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -original 1.0.2 - MIT -https://github.com/unshiftio/original#readme -Copyright (c) 2015 Unshift.io, Arnout Kazemier - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -os 0.1.1 - MIT -https://github.com/DiegoRBaquero/node-os#readme -Copyright (c) 2016 Diego Rodriguez Baquero -Copyright (c) Diego Rodriguez Baquero (https://diegorbaquero.com). - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -parseqs 0.0.5 - MIT -https://github.com/get/querystring -Copyright (c) 2015 Gal Koren - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -parseuri 0.0.5 - MIT -https://github.com/get/parseuri -Copyright (c) 2014 Gal Koren - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -pkg-up 2.0.0 - MIT -https://github.com/sindresorhus/pkg-up#readme -(c) Sindre Sorhus (https://sindresorhus.com) -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -portfinder 1.0.20 - MIT -https://github.com/indexzero/node-portfinder#readme -(c) 2011, Charlie Robbins -Copyright (c) 2012 Charlie Robbins - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -prop-types 15.7.2 - MIT -https://facebook.github.io/react/ -(c) Sindre Sorhus -Copyright (c) 2013-present, Facebook, Inc. -Copyright (c) Facebook, Inc. and its affiliates. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -querystringify 2.1.1 - MIT -https://github.com/unshiftio/querystringify -Copyright (c) 2015 Unshift.io, Arnout Kazemier - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -react 16.8.6 - MIT -https://reactjs.org/ -(c) Sindre Sorhus -Copyright (c) 2013-present, Facebook, Inc. -Copyright (c) Facebook, Inc. and its affiliates. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -react-dom 16.8.6 - MIT -https://reactjs.org/ -Copyright (c) 2013-present, Facebook, Inc. -Copyright (c) Facebook, Inc. and its affiliates. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -react-error-overlay 5.1.6 - MIT -https://github.com/facebook/create-react-app#readme -(c) 2019 Denis Pushkarev -Copyright (c) 2013-present, Facebook, Inc. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -react-is 16.8.6 - MIT -https://reactjs.org/ -Copyright (c) Facebook, Inc. and its affiliates. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -recursive-readdir 2.2.2 - MIT -https://github.com/jergason/recursive-readdir#readme - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -safe-buffer 5.1.2 - MIT -https://github.com/feross/safe-buffer -Copyright (c) Feross Aboukhadijeh -Copyright (c) Feross Aboukhadijeh (http://feross.org) - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -scheduler 0.13.6 - MIT -https://reactjs.org/ -Copyright (c) Facebook, Inc. and its affiliates. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -select-hose 2.0.0 - MIT -https://github.com/indutny/select-hose#readme -Copyright Fedor Indutny, 2015. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -selfsigned 1.10.4 - MIT -https://github.com/jfromaniello/selfsigned#readme -Copyright (c) 2013 Jose F. Romaniello - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -serve-index 1.9.1 - MIT -https://github.com/expressjs/serve-index#readme -Copyright (c) 2011 LearnBoost -Copyright (c) 2010 Sencha Inc. -Copyright (c) 2011 Sencha Inc. -Copyright (c) 2011 TJ Holowaychuk -Copyright (c) 2014-2015 Douglas Christopher Wilson - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -socket.io 2.2.0 - MIT -https://github.com/socketio/socket.io#readme -Copyright (c) 2014-2018 Automattic - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -socket.io-adapter 1.1.1 - MIT -https://github.com/socketio/socket.io-adapter#readme -Copyright (c) 2014 Guillermo Rauch - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -socket.io-client 2.2.0 - MIT -https://github.com/Automattic/socket.io-client#readme -(c) 2014-2018 Guillermo Rauch -Copyright (c) 2014 Guillermo Rauch -Copyright (c) 2012 Niklas von Hertzen - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -socket.io-parser 3.3.0 - MIT -https://github.com/Automattic/socket.io-parser#readme -Copyright (c) 2014 Guillermo Rauch - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -sockjs 0.3.19 - MIT -https://github.com/sockjs/sockjs-node -Copyright (c) 2011 VMware, Inc. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -sockjs-client 1.3.0 - MIT -http://sockjs.org -Copyright (c) 2011-2012 VMware, Inc. -Copyright 2012-2014, Kit Cambridge http://kit.mit-license.org - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -spdy 4.0.0 - MIT -https://github.com/indutny/node-spdy -Copyright Fedor Indutny, 2015. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -spdy-transport 3.0.0 - MIT -https://github.com/spdy-http2/spdy-transport -Copyright Fedor Indutny, 2015. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -svg-inline-react 3.1.0 - MIT -https://github.com/sairion/svg-inline-react -Copyright 2015-2017 Jaeho Lee - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -to-array 0.1.4 - MIT -https://github.com/Raynos/to-array -Copyright (c) 2012 Raynos. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -url-parse 1.4.7 - MIT -https://github.com/unshiftio/url-parse#readme -Copyright (c) 2015 Unshift.io, Arnout Kazemier - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -util 0.12.1 - MIT -https://github.com/browserify/node-util -Copyright Joyent, Inc. and other Node contributors. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -vscode-extension-telemetry 0.1.1 - MIT -https://github.com/Microsoft/vscode-extension-telemetry#readme -Copyright (c) Microsoft Corporation. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -vscode-nls 4.1.1 - MIT -https://github.com/Microsoft/vscode-nls#readme -Copyright (c) Microsoft Corporation. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -wbuf 1.7.3 - MIT -https://github.com/indutny/wbuf -Copyright Fedor Indutny, 2014. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -webpack-dev-middleware 3.7.0 - MIT -https://github.com/webpack/webpack-dev-middleware -Copyright JS Foundation and other contributors - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -webpack-log 2.0.0 - MIT -https://github.com/webpack-contrib/webpack-log#readme -Copyright (c) 2017 - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -websocket-driver 0.7.0 - MIT -https://github.com/faye/websocket-driver-node -Copyright (c) 2010-2017 James Coglan - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -websocket-extensions 0.1.3 - MIT -http://github.com/faye/websocket-extensions-node -Copyright (c) 2014-2017 James Coglan - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -ws 6.1.4 - MIT -https://github.com/websockets/ws -Copyright (c) 2011 Einar Otto Stangvik - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -xmlhttprequest-ssl 1.5.5 - MIT -https://github.com/mjwwit/node-XMLHttpRequest#readme -Copyright (c) 2010 passive.ly LLC - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -yeast 0.1.2 - MIT -https://github.com/unshiftio/yeast -Copyright (c) 2015 Unshift.io, Arnout Kazemier - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -zone.js 0.7.6 - MIT -https://github.com/angular/zone.js#readme -Copyright Google Inc. -Copyright (c) 2016 Google, Inc. - -Copyright (c) 2012-2015 Kit Cambridge. -http://kitcambridge.be/ - -Copyright (c) 2013-2015 Benjamin Tan. -https://d10.github.io/ - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------- - -------------------------------------------------------------------- - -Additional - - -Python 3.7.4 -1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and - the Individual or Organization ("Licensee") accessing and otherwise using Python - 3.7.4 software in source or binary form and its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, PSF hereby - grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, - analyze, test, perform and/or display publicly, prepare derivative works, - distribute, and otherwise use Python 3.7.4 alone or in any derivative - version, provided, however, that PSF's License Agreement and PSF's notice of - copyright, i.e., "Copyright © 2001-2019 Python Software Foundation; All Rights - Reserved" are retained in Python 3.7.4 alone or in any derivative version - prepared by Licensee. - -3. In the event Licensee prepares a derivative work that is based on or - incorporates Python 3.7.4 or any part thereof, and wants to make the - derivative work available to others as provided herein, then Licensee hereby - agrees to include in any such work a brief summary of the changes made to Python - 3.7.4. - -4. PSF is making Python 3.7.4 available to Licensee on an "AS IS" basis. - PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF - EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR - WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE - USE OF PYTHON 3.7.4 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. - -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 3.7.4 - FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF - MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 3.7.4, OR ANY DERIVATIVE - THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material breach of - its terms and conditions. - -7. Nothing in this License Agreement shall be deemed to create any relationship - of agency, partnership, or joint venture between PSF and Licensee. This License - Agreement does not grant permission to use PSF trademarks or trade name in a - trademark sense to endorse or promote products or services of Licensee, or any - third party. - -8. By copying, installing or otherwise using Python 3.7.4, Licensee agrees - to be bound by the terms and conditions of this License Agreement. - - -Python extension for Visual Studio Code -Copyright (c) Microsoft Corporation. All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -Microsoft Python Language Server -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright (c) 2018 Microsoft Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -Visual Studio Code -MIT License - -Copyright (c) 2015 - present Microsoft Corporation - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -TypeScript -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - -If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -TypeScript is authored by: -* Aaron Holmes -* Abubaker Bashir -* Adam Freidin -* Adi Dahiya -* Aditya Daflapurkar -* Adnan Chowdhury -* Adrian Leonhard -* Adrien Gibrat -* Ahmad Farid -* Akshar Patel -* Alan Agius -* Alex Chugaev -* Alex Eagle -* Alex Khomchenko -* Alex Ryan -* Alexander Kuvaev -* Alexander Rusakov -* Alexander Tarasyuk -* Ali Sabzevari -* Aliaksandr Radzivanovich -* Aluan Haddad -* Anatoly Ressin -* Anders Hejlsberg -* Andreas Martin -* Andrej Baran -* Andrew Casey -* Andrew Faulkner -* Andrew Ochsner -* Andrew Stegmaier -* Andrew Z Allen -* András Parditka -* Andy Hanson -* Anil Anar -* Anton Khlynovskiy -* Anton Tolmachev -* Anubha Mathur -* Armando Aguirre -* Arnaud Tournier -* Arnav Singh -* Artem Tyurin -* Arthur Ozga -* Asad Saeeduddin -* Avery Morin -* Basarat Ali Syed -* @begincalendar -* Ben Duffield -* Ben Mosher -* Benjamin Bock -* Benjamin Lichtman -* Benny Neugebauer -* Bill Ticehurst -* Blaine Bublitz -* Blake Embrey -* @bluelovers -* @bootstraponline -* Bowden Kelly -* Bowden Kenny -* Brandon Slade -* Brett Mayen -* Bryan Forbes -* Caitlin Potter -* Cameron Taggart -* @cedvdb -* Charles Pierce -* Charly POLY -* Chris Bubernak -* Christophe Vidal -* Chuck Jazdzewski -* Colby Russell -* Colin Snover -* Cotton Hou -* Cyrus Najmabadi -* Dafrok Zhang -* Dahan Gong -* Dan Corder -* Dan Freeman -* Dan Quirk -* Daniel Gooss -* Daniel Hollocher -* Daniel Król -* Daniel Lehenbauer -* Daniel Rosenwasser -* David Kmenta -* David Li -* David Sheldrick -* David Sherret -* David Souther -* David Staheli -* Denis Nedelyaev -* Derek P Sifford -* Dhruv Rajvanshi -* Dick van den Brink -* Diogo Franco (Kovensky) -* Dirk Bäumer -* Dirk Holtwick -* Dom Chen -* Donald Pipowitch -* Doug Ilijev -* @e-cloud -* Ecole Keine -* Elisée Maurer -* Elizabeth Dinella -* Emilio García-Pumarino -* Eric Grube -* Eric Tsang -* Erik Edrosa -* Erik McClenney -* Esakki Raj -* Ethan Resnick -* Ethan Rubio -* Eugene Timokhov -* Evan Martin -* Evan Sebastian -* Eyas Sharaiha -* Fabian Cook -* @falsandtru -* Filipe Silva -* @flowmemo -* Francois Wouts -* Frank Wallis -* Franklin Tse -* František Žiacik -* Gabe Moothart -* Gabriel Isenberg -* Gilad Peleg -* Godfrey Chan -* Graeme Wicksted -* Guilherme Oenning -* Guillaume Salles -* Guy Bedford -* Halasi Tamás -* Harald Niesche -* Hendrik Liebau -* Henry Mercer -* Herrington Darkholme -* Holger Jeromin -* Homa Wong -* Iain Monro -* @IdeaHunter -* Igor Novozhilov -* Ika -* Ingvar Stepanyan -* Isiah Meadows -* Ivan Enderlin -* Ivo Gabe de Wolff -* Iwata Hidetaka -* Jack Williams -* Jakub Korzeniowski -* Jakub Młokosiewicz -* James Henry -* James Whitney -* Jan Melcher -* Jason Freeman -* Jason Jarrett -* Jason Killian -* Jason Ramsay -* JBerger -* Jed Mao -* Jeffrey Morlan -* Jesse Schalken -* Jing Ma -* Jiri Tobisek -* Joe Calzaretta -* Joe Chung -* Joel Day -* Joey Wilson -* Johannes Rieken -* John Doe -* John Vilk -* Jonathan Bond-Caron -* Jonathan Park -* Jonathan Toland -* Jonathan Turner -* Jonathon Smith -* Jordi Oliveras Rovira -* Joscha Feth -* Josh Abernathy -* Josh Goldberg -* Josh Kalderimis -* Josh Soref -* Juan Luis Boya García -* Julian Williams -* Justin Bay -* Justin Johansson -* K. Preißer -* Kagami Sascha Rosylight -* Kanchalai Tanglertsampan -* Kate Miháliková -* Keith Mashinter -* Ken Howard -* Kenji Imamula -* Kerem Kat -* Kevin Donnelly -* Kevin Gibbons -* Kevin Lang -* Khải -* Kitson Kelly -* Klaus Meinhardt -* Kris Zyp -* Kyle Kelley -* Kārlis Gaņģis -* Lorant Pinter -* Lucien Greathouse -* Lukas Elmer -* Maarten Sijm -* Magnus Hiie -* Magnus Kulke -* Manish Giri -* Marin Marinov -* Marius Schulz -* Markus Johnsson -* Martin Hiller -* Martin Probst -* Martin Vseticka -* Martyn Janes -* Masahiro Wakame -* Mateusz Burzyński -* Matt Bierner -* Matt McCutchen -* Matt Mitchell -* Mattias Buelens -* Mattias Buelens -* Max Deepfield -* Maxwell Paul Brickner -* @meyer -* Micah Zoltu -* @micbou -* Michael -* Michael Bromley -* Mike Busyrev -* Mike Morearty -* Mine Starks -* Mohamed Hegazy -* Mohsen Azimi -* Myles Megyesi -* Nathan Shively-Sanders -* Nathan Yee -* Nicolas Henry -* Nicu Micleușanu -* @nieltg -* Nima Zahedi -* Noah Chen -* Noel Varanda -* Noj Vek -* Oleg Mihailik -* Oleksandr Chekhovskyi -* Omer Sheikh -* Orta Therox -* Oskar Segersva¨rd -* Oussama Ben Brahim -* Patrick Zhong -* Paul Jolly -* Paul Koerbitz -* Paul van Brenk -* @pcbro -* Pedro Maltez -* Perry Jiang -* Peter Burns -* Philip Bulley -* Philippe Voinov -* Pi Lanningham -* Piero Cangianiello -* @piloopin -* Prayag Verma -* Priyantha Lankapura -* @progre -* Punya Biswal -* Rado Kirov -* Raj Dosanjh -* Reiner Dolp -* Remo H. Jansen -* @rhysd -* Ricardo N Feliciano -* Richard Karmazín -* Richard Knoll -* Richard Sentino -* Robert Coie -* Rohit Verma -* Ron Buckton -* Rostislav Galimsky -* Rowan Wyborn -* Ryan Cavanaugh -* Ryohei Ikegami -* Sam Bostock -* Sam El-Husseini -* Sarangan Rajamanickam -* Sean Barag -* Sergey Rubanov -* Sergey Shandar -* Sergii Bezliudnyi -* Sharon Rolel -* Sheetal Nandi -* Shengping Zhong -* Shyyko Serhiy -* Simon Hürlimann -* Slawomir Sadziak -* Solal Pirelli -* Soo Jae Hwang -* Stan Thomas -* Stanislav Iliev -* Stanislav Sysoev -* Stas Vilchik -* Stephan Ginthör -* Steve Lucco -* @styfle -* Sudheesh Singanamalla -* Sébastien Arod -* @T18970237136 -* @t_ -* Taras Mankovski -* Tarik Ozket -* Tetsuharu Ohzeki -* Thomas den Hollander -* Thomas Loubiou -* Tien Hoanhtien -* Tim Lancina -* Tim Perry -* Tim Viiding-Spader -* Tingan Ho -* Todd Thomson -* togru -* Tomas Grubliauskas -* Torben Fitschen -* @TravCav -* TruongSinh Tran-Nguyen -* Tycho Grouwstra -* Vadi Taslim -* Vakhurin Sergey -* Vidar Tonaas Fauske -* Viktor Zozulyak -* Vilic Vane -* Vimal Raghubir -* Vladimir Kurchatkin -* Vladimir Matveev -* Vyacheslav Pukhanov -* Wenlu Wang -* Wesley Wigham -* William Orr -* Wilson Hobbs -* York Yao -* @yortus -* Yuichi Nukiyama -* Yuval Greenfield -* Zeeshan Ahmed -* Zev Spitz -* Zhengbo Li -* @Zzzen - - -Node -Node.js is licensed for use as follows: - -""" -Copyright Node.js contributors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -""" - -This license applies to parts of Node.js originating from the -https://github.com/joyent/node repository: - -""" -Copyright Joyent, Inc. and other Node contributors. All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -""" - -The Node.js license applies to all parts of Node.js that are not externally -maintained libraries. - -The externally maintained libraries used by Node.js are: - -- Acorn, located at deps/acorn, is licensed as follows: - """ - Copyright (C) 2012-2018 by various contributors (see AUTHORS) - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - """ - -- Acorn plugins, located at deps/acorn-plugins, is licensed as follows: - """ - Copyright (C) 2017-2018 by Adrian Heine - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - """ - -- c-ares, located at deps/cares, is licensed as follows: - """ - Copyright (c) 2007 - 2018, Daniel Stenberg with many contributors, see AUTHORS - file. - - Copyright 1998 by the Massachusetts Institute of Technology. - - Permission to use, copy, modify, and distribute this software and its - documentation for any purpose and without fee is hereby granted, provided that - the above copyright notice appear in all copies and that both that copyright - notice and this permission notice appear in supporting documentation, and that - the name of M.I.T. not be used in advertising or publicity pertaining to - distribution of the software without specific, written prior permission. - M.I.T. makes no representations about the suitability of this software for any - purpose. It is provided "as is" without express or implied warranty. - """ - -- HTTP Parser, located at deps/http_parser, is licensed as follows: - """ - Copyright Joyent, Inc. and other Node contributors. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to - deal in the Software without restriction, including without limitation the - rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - IN THE SOFTWARE. - """ - -- ICU, located at deps/icu-small, is licensed as follows: - """ - COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later) - - Copyright © 1991-2019 Unicode, Inc. All rights reserved. - Distributed under the Terms of Use in https://www.unicode.org/copyright.html. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of the Unicode data files and any associated documentation - (the "Data Files") or Unicode software and any associated documentation - (the "Software") to deal in the Data Files or Software - without restriction, including without limitation the rights to use, - copy, modify, merge, publish, distribute, and/or sell copies of - the Data Files or Software, and to permit persons to whom the Data Files - or Software are furnished to do so, provided that either - (a) this copyright and permission notice appear with all copies - of the Data Files or Software, or - (b) this copyright and permission notice appear in associated - Documentation. - - THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF - ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE - WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT OF THIRD PARTY RIGHTS. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS - NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL - DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THE DATA FILES OR SOFTWARE. - - Except as contained in this notice, the name of a copyright holder - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in these Data Files or Software without prior - written authorization of the copyright holder. - - --------------------- - -- libuv, located at deps/uv, is licensed as follows: - """ - libuv is licensed for use as follows: - - ==== - Copyright (c) 2015-present libuv project contributors. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to - deal in the Software without restriction, including without limitation the - rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - IN THE SOFTWARE. - ==== - - This license applies to parts of libuv originating from the - https://github.com/joyent/libuv repository: - - ==== - - Copyright Joyent, Inc. and other Node contributors. All rights reserved. - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to - deal in the Software without restriction, including without limitation the - rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - IN THE SOFTWARE. - - ==== - - This license applies to all parts of libuv that are not externally - maintained libraries. - - The externally maintained libraries used by libuv are: - - - tree.h (from FreeBSD), copyright Niels Provos. Two clause BSD license. - - - inet_pton and inet_ntop implementations, contained in src/inet.c, are - copyright the Internet Systems Consortium, Inc., and licensed under the ISC - license. - - - stdint-msvc2008.h (from msinttypes), copyright Alexander Chemeris. Three - clause BSD license. - - - pthread-fixes.c, copyright Google Inc. and Sony Mobile Communications AB. - Three clause BSD license. - - - android-ifaddrs.h, android-ifaddrs.c, copyright Berkeley Software Design - Inc, Kenneth MacKay and Emergya (Cloud4all, FP7/2007-2013, grant agreement - n° 289016). Three clause BSD license. - """ - -- llhttp, located at deps/llhttp, is licensed as follows: - """ - This software is licensed under the MIT License. - - Copyright Fedor Indutny, 2018. - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to permit - persons to whom the Software is furnished to do so, subject to the - following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN - NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR - OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE - USE OR OTHER DEALINGS IN THE SOFTWARE. - """ - -- OpenSSL, located at deps/openssl, is licensed as follows: - """ - Copyright (c) 1998-2019 The OpenSSL Project. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - 3. All advertising materials mentioning features or use of this - software must display the following acknowledgment: - "This product includes software developed by the OpenSSL Project - for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - - 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - endorse or promote products derived from this software without - prior written permission. For written permission, please contact - openssl-core@openssl.org. - - 5. Products derived from this software may not be called "OpenSSL" - nor may "OpenSSL" appear in their names without prior written - permission of the OpenSSL Project. - - 6. Redistributions of any form whatsoever must retain the following - acknowledgment: - "This product includes software developed by the OpenSSL Project - for use in the OpenSSL Toolkit (http://www.openssl.org/)" - - THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. - ==================================================================== - - This product includes cryptographic software written by Eric Young - (eay@cryptsoft.com). This product includes software written by Tim - Hudson (tjh@cryptsoft.com). - """ - -- Punycode.js, located at lib/punycode.js, is licensed as follows: - """ - Copyright Mathias Bynens - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - """ - -- V8, located at deps/v8, is licensed as follows: - """ - This license applies to all parts of V8 that are not externally - maintained libraries. The externally maintained libraries used by V8 - are: - - - PCRE test suite, located in - test/mjsunit/third_party/regexp-pcre/regexp-pcre.js. This is based on the - test suite from PCRE-7.3, which is copyrighted by the University - of Cambridge and Google, Inc. The copyright notice and license - are embedded in regexp-pcre.js. - - - Layout tests, located in test/mjsunit/third_party/object-keys. These are - based on layout tests from webkit.org which are copyrighted by - Apple Computer, Inc. and released under a 3-clause BSD license. - - - Strongtalk assembler, the basis of the files assembler-arm-inl.h, - assembler-arm.cc, assembler-arm.h, assembler-ia32-inl.h, - assembler-ia32.cc, assembler-ia32.h, assembler-x64-inl.h, - assembler-x64.cc, assembler-x64.h, assembler-mips-inl.h, - assembler-mips.cc, assembler-mips.h, assembler.cc and assembler.h. - This code is copyrighted by Sun Microsystems Inc. and released - under a 3-clause BSD license. - - - Valgrind client API header, located at src/third_party/valgrind/valgrind.h - This is released under the BSD license. - - - The Wasm C/C++ API headers, located at third_party/wasm-api/wasm.{h,hh} - This is released under the Apache license. The API's upstream prototype - implementation also formed the basis of V8's implementation in - src/wasm/c-api.cc. - - These libraries have their own licenses; we recommend you read them, - as their terms may differ from the terms below. - - Further license information can be found in LICENSE files located in - sub-directories. - - Copyright 2014, the V8 project authors. All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of Google Inc. nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - """ - -- SipHash, located at deps/v8/src/third_party/siphash, is licensed as follows: - """ - SipHash reference C implementation - - Copyright (c) 2016 Jean-Philippe Aumasson - - To the extent possible under law, the author(s) have dedicated all - copyright and related and neighboring rights to this software to the public - domain worldwide. This software is distributed without any warranty. - """ - -- zlib, located at deps/zlib, is licensed as follows: - """ - zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.11, January 15th, 2017 - - Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - """ - -- npm, located at deps/npm, is licensed as follows: - """ - The npm application - Copyright (c) npm, Inc. and Contributors - Licensed on the terms of The Artistic License 2.0 - - Node package dependencies of the npm application - Copyright (c) their respective copyright owners - Licensed on their respective license terms - - The npm public registry at https://registry.npmjs.org - and the npm website at https://www.npmjs.com - Operated by npm, Inc. - Use governed by terms published on https://www.npmjs.com - - "Node.js" - Trademark Joyent, Inc., https://joyent.com - Neither npm nor npm, Inc. are affiliated with Joyent, Inc. - - The Node.js application - Project of Node Foundation, https://nodejs.org - - The npm Logo - Copyright (c) Mathias Pettersson and Brian Hammond - - "Gubblebum Blocky" typeface - Copyright (c) Tjarda Koster, https://jelloween.deviantart.com - Used with permission - - -------- - - The Artistic License 2.0 - - Copyright (c) 2000-2006, The Perl Foundation. - - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - This license establishes the terms under which a given free software - Package may be copied, modified, distributed, and/or redistributed. - The intent is that the Copyright Holder maintains some artistic - control over the development of that Package while still keeping the - Package available as open source and free software. - - You are always permitted to make arrangements wholly outside of this - license directly with the Copyright Holder of a given Package. If the - terms of this license do not permit the full use that you propose to - make of the Package, you should contact the Copyright Holder and seek - a different licensing arrangement. - - Definitions - - "Copyright Holder" means the individual(s) or organization(s) - named in the copyright notice for the entire Package. - - "Contributor" means any party that has contributed code or other - material to the Package, in accordance with the Copyright Holder's - procedures. - - "You" and "your" means any person who would like to copy, - distribute, or modify the Package. - - "Package" means the collection of files distributed by the - Copyright Holder, and derivatives of that collection and/or of - those files. A given Package may consist of either the Standard - Version, or a Modified Version. - - "Distribute" means providing a copy of the Package or making it - accessible to anyone else, or in the case of a company or - organization, to others outside of your company or organization. - - "Distributor Fee" means any fee that you charge for Distributing - this Package or providing support for this Package to another - party. It does not mean licensing fees. - - "Standard Version" refers to the Package if it has not been - modified, or has been modified only in ways explicitly requested - by the Copyright Holder. - - "Modified Version" means the Package, if it has been changed, and - such changes were not explicitly requested by the Copyright - Holder. - - "Original License" means this Artistic License as Distributed with - the Standard Version of the Package, in its current version or as - it may be modified by The Perl Foundation in the future. - - "Source" form means the source code, documentation source, and - configuration files for the Package. - - "Compiled" form means the compiled bytecode, object code, binary, - or any other form resulting from mechanical transformation or - translation of the Source form. - - Permission for Use and Modification Without Distribution - - (1) You are permitted to use the Standard Version and create and use - Modified Versions for any purpose without restriction, provided that - you do not Distribute the Modified Version. - - Permissions for Redistribution of the Standard Version - - (2) You may Distribute verbatim copies of the Source form of the - Standard Version of this Package in any medium without restriction, - either gratis or for a Distributor Fee, provided that you duplicate - all of the original copyright notices and associated disclaimers. At - your discretion, such verbatim copies may or may not include a - Compiled form of the Package. - - (3) You may apply any bug fixes, portability changes, and other - modifications made available from the Copyright Holder. The resulting - Package will still be considered the Standard Version, and as such - will be subject to the Original License. - - Distribution of Modified Versions of the Package as Source - - (4) You may Distribute your Modified Version as Source (either gratis - or for a Distributor Fee, and with or without a Compiled form of the - Modified Version) provided that you clearly document how it differs - from the Standard Version, including, but not limited to, documenting - any non-standard features, executables, or modules, and provided that - you do at least ONE of the following: - - (a) make the Modified Version available to the Copyright Holder - of the Standard Version, under the Original License, so that the - Copyright Holder may include your modifications in the Standard - Version. - - (b) ensure that installation of your Modified Version does not - prevent the user installing or running the Standard Version. In - addition, the Modified Version must bear a name that is different - from the name of the Standard Version. - - (c) allow anyone who receives a copy of the Modified Version to - make the Source form of the Modified Version available to others - under - - (i) the Original License or - - (ii) a license that permits the licensee to freely copy, - modify and redistribute the Modified Version using the same - licensing terms that apply to the copy that the licensee - received, and requires that the Source form of the Modified - Version, and of any works derived from it, be made freely - available in that license fees are prohibited but Distributor - Fees are allowed. - - Distribution of Compiled Forms of the Standard Version - or Modified Versions without the Source - - (5) You may Distribute Compiled forms of the Standard Version without - the Source, provided that you include complete instructions on how to - get the Source of the Standard Version. Such instructions must be - valid at the time of your distribution. If these instructions, at any - time while you are carrying out such distribution, become invalid, you - must provide new instructions on demand or cease further distribution. - If you provide valid instructions or cease distribution within thirty - days after you become aware that the instructions are invalid, then - you do not forfeit any of your rights under this license. - - (6) You may Distribute a Modified Version in Compiled form without - the Source, provided that you comply with Section 4 with respect to - the Source of the Modified Version. - - Aggregating or Linking the Package - - (7) You may aggregate the Package (either the Standard Version or - Modified Version) with other packages and Distribute the resulting - aggregation provided that you do not charge a licensing fee for the - Package. Distributor Fees are permitted, and licensing fees for other - components in the aggregation are permitted. The terms of this license - apply to the use and Distribution of the Standard or Modified Versions - as included in the aggregation. - - (8) You are permitted to link Modified and Standard Versions with - other works, to embed the Package in a larger work of your own, or to - build stand-alone binary or bytecode versions of applications that - include the Package, and Distribute the result without restriction, - provided the result does not expose a direct interface to the Package. - - Items That are Not Considered Part of a Modified Version - - (9) Works (including, but not limited to, modules and scripts) that - merely extend or make use of the Package, do not, by themselves, cause - the Package to be a Modified Version. In addition, such works are not - considered parts of the Package itself, and are not subject to the - terms of this license. - - General Provisions - - (10) Any use, modification, and distribution of the Standard or - Modified Versions is governed by this Artistic License. By using, - modifying or distributing the Package, you accept this license. Do not - use, modify, or distribute the Package, if you do not accept this - license. - - (11) If your Modified Version has been derived from a Modified - Version made by someone other than you, you are nevertheless required - to ensure that your Modified Version complies with the requirements of - this license. - - (12) This license does not grant you the right to use any trademark, - service mark, tradename, or logo of the Copyright Holder. - - (13) This license includes the non-exclusive, worldwide, - free-of-charge patent license to make, have made, use, offer to sell, - sell, import and otherwise transfer the Package with respect to any - patent claims licensable by the Copyright Holder that are necessarily - infringed by the Package. If you institute patent litigation - (including a cross-claim or counterclaim) against any party alleging - that the Package constitutes direct or contributory patent - infringement, then this Artistic License to you shall terminate on the - date that such litigation is filed. - - (14) Disclaimer of Warranty: - THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS - IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED - WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR - NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL - LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL - DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -------- - """ - -- GYP, located at tools/gyp, is licensed as follows: - """ - Copyright (c) 2009 Google Inc. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - * Neither the name of Google Inc. nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - """ - -- inspector_protocol, located at tools/inspector_protocol, is licensed as follows: - """ - // Copyright 2016 The Chromium Authors. All rights reserved. - // - // Redistribution and use in source and binary forms, with or without - // modification, are permitted provided that the following conditions are - // met: - // - // * Redistributions of source code must retain the above copyright - // notice, this list of conditions and the following disclaimer. - // * Redistributions in binary form must reproduce the above - // copyright notice, this list of conditions and the following disclaimer - // in the documentation and/or other materials provided with the - // distribution. - // * Neither the name of Google Inc. nor the names of its - // contributors may be used to endorse or promote products derived from - // this software without specific prior written permission. - // - // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - """ - -- jinja2, located at tools/inspector_protocol/jinja2, is licensed as follows: - """ - Copyright (c) 2009 by the Jinja Team, see AUTHORS for more details. - - Some rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - * The names of the contributors may not be used to endorse or - promote products derived from this software without specific - prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - """ - -- markupsafe, located at tools/inspector_protocol/markupsafe, is licensed as follows: - """ - Copyright (c) 2010 by Armin Ronacher and contributors. See AUTHORS - for more details. - - Some rights reserved. - - Redistribution and use in source and binary forms of the software as well - as documentation, with or without modification, are permitted provided - that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - * The names of the contributors may not be used to endorse or - promote products derived from this software without specific - prior written permission. - - THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT - NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - DAMAGE. - """ - -- cpplint.py, located at tools/cpplint.py, is licensed as follows: - """ - Copyright (c) 2009 Google Inc. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - * Neither the name of Google Inc. nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - """ - -- ESLint, located at tools/node_modules/eslint, is licensed as follows: - """ - Copyright JS Foundation and other contributors, https://js.foundation - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - """ - -- babel-eslint, located at tools/node_modules/babel-eslint, is licensed as follows: - """ - Copyright (c) 2014-2016 Sebastian McKenzie - - MIT License - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - """ - -- gtest, located at test/cctest/gtest, is licensed as follows: - """ - Copyright 2008, Google Inc. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - * Neither the name of Google Inc. nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - """ - -- nghttp2, located at deps/nghttp2, is licensed as follows: - """ - The MIT License - - Copyright (c) 2012, 2014, 2015, 2016 Tatsuhiro Tsujikawa - Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - """ - -- node-inspect, located at deps/node-inspect, is licensed as follows: - """ - Copyright Node.js contributors. All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to - deal in the Software without restriction, including without limitation the - rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - IN THE SOFTWARE. - """ - -- large_pages, located at src/large_pages, is licensed as follows: - """ - Copyright (C) 2018 Intel Corporation - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom - the Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES - OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE - OR OTHER DEALINGS IN THE SOFTWARE. - """ - -- caja, located at lib/internal/freeze_intrinsics.js, is licensed as follows: - """ - Adapted from SES/Caja - Copyright (C) 2011 Google Inc. - Copyright (C) 2018 Agoric - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - """ - -- brotli, located at deps/brotli, is licensed as follows: - """ - Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - """ - -- HdrHistogram, located at deps/histogram, is licensed as follows: - """ - The code in this repository code was Written by Gil Tene, Michael Barker, - and Matt Warren, and released to the public domain, as explained at - http://creativecommons.org/publicdomain/zero/1.0/ - - For users of this code who wish to consume it under the "BSD" license - rather than under the public domain or CC0 contribution text mentioned - above, the code found under this directory is *also* provided under the - following license (commonly referred to as the BSD 2-Clause License). This - license does not detract from the above stated release of the code into - the public domain, and simply represents an additional license granted by - the Author. - - ----------------------------------------------------------------------------- - ** Beginning of "BSD 2-Clause License" text. ** - - Copyright (c) 2012, 2013, 2014 Gil Tene - Copyright (c) 2014 Michael Barker - Copyright (c) 2014 Matt Warren - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - THE POSSIBILITY OF SUCH DAMAGE. - """ - -- node-heapdump, located at src/heap_utils.cc, is licensed as follows: - """ - ISC License - - Copyright (c) 2012, Ben Noordhuis - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - === src/compat.h src/compat-inl.h === - - ISC License - - Copyright (c) 2014, StrongLoop Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - """ - - -gulp -The MIT License (MIT) - -Copyright (c) 2013-2018 Blaine Bublitz , Eric Schoffstall and other contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -Microsoft MakeCode (PXT - Programming eXperience Toolkit) -The MIT License (MIT) - -Copyright (c) Microsoft Corporation - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -MakeCode for Adafruit Circuit Playground Express -PXT-Adafruit - -The MIT License (MIT) - -Copyright (c) Microsoft Corporation - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -pywin32 -Unless stated in the specfic source file, this work is -Copyright (c) 1996-2008, Greg Stein and Mark Hammond. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. - -Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in -the documentation and/or other materials provided with the distribution. - -Neither names of Greg Stein, Mark Hammond nor the name of contributors may be used -to endorse or promote products derived from this software without -specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS -IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Unless stated in the specfic source file, this work is -Copyright (c) 1994-2008, Mark Hammond -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. - -Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in -the documentation and/or other materials provided with the distribution. - -Neither name of Mark Hammond nor the name of contributors may be used -to endorse or promote products derived from this software without -specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS -IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Unless stated in the specfic source file, this work is -Copyright (c) 1994-2008, Mark Hammond -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. - -Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in -the documentation and/or other materials provided with the distribution. - -Neither name of Mark Hammond nor the name of contributors may be used -to endorse or promote products derived from this software without -specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS -IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -playsound -The MIT License (MIT) - -Copyright (c) 2016 Taylor Marks - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -pytest -The MIT License (MIT) - -Copyright (c) 2004-2019 Holger Krekel and others - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -Visual Studio Code extension for Arduino ------------------------------------------- START OF LICENSE ----------------------------------------- - -vscode-arduino - -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ""Software""), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ------------------------------------------------ END OF LICENSE ------------------------------------------ - - -Python-Socketio -The MIT License (MIT) - -Copyright (c) 2015 Miguel Grinberg - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -Requests -Copyright 2018 Kenneth Reitz - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -Jest -MIT License - -Copyright (c) Facebook, Inc. and its affiliates. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -Black -The MIT License (MIT) - -Copyright (c) 2018 Łukasz Langa - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -Prettier -Copyright © James Long and contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -uflash -The MIT License (MIT) -Copyright (c) 2015-2018 Nicholas H.Tollervey and others. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------- - -------------------------------------------------------------------- - -node-forge 0.7.5 - BSD-3-Clause OR GPL-2.0 -https://github.com/digitalbazaar/forge -(c) 2016 -Copyright (c) 2005 Tom Wu -Copyright (c) 2003-2005 Tom Wu -Copyright (c) 2005-2009 Tom Wu -Copyright (c) 2012 Kenji Urushima -Copyright (c) 2013 Digital Bazaar, Inc. -Copyright (c) 2014 Digital Bazaar, Inc. -Copyright (c) 2010, Digital Bazaar, Inc. -Copyright 2008-2013 Digital Bazaar, Inc. -Copyright 2011-2016 Digital Bazaar, Inc. -Copyright 2011-2017 Digital Bazaar, Inc. -copyrighted by the Free Software Foundation -Copyright (c) 2008-2013 Digital Bazaar, Inc. -Copyright (c) 2009-2012 Digital Bazaar, Inc. -Copyright (c) 2009-2013 Digital Bazaar, Inc. -Copyright (c) 2009-2014 Digital Bazaar, Inc. -Copyright (c) 2009-2015 Digital Bazaar, Inc. -Copyright (c) 2010-2012 Digital Bazaar, Inc. -Copyright (c) 2010-2013 Digital Bazaar, Inc. -Copyright (c) 2010-2014 Digital Bazaar, Inc. -Copyright (c) 2010-2015 Digital Bazaar, Inc. -Copyright (c) 2010-2018 Digital Bazaar, Inc. -Copyright (c) 2011-2014 Digital Bazaar, Inc. -Copyright (c) 2012-2014 Digital Bazaar, Inc. -Copyright (c) 2012-2015 Digital Bazaar, Inc. -Copyright (c) 2013-2014 Digital Bazaar, Inc. -Copyright (c) 2014-2015 Digital Bazaar, Inc. -Copyright (c) 2017-2018 Digital Bazaar, Inc. -Copyright 2012 Stefan Siegl -Copyright (c) 2012 Stefan Siegl -Copyright (c) 1989, 1991 Free Software Foundation, Inc. -Copyright (c) Ellis Pritchard, Guardian Unlimited 2003. -Copyright (c) 2014 Lautaro Cozzani - -You may use the Forge project under the terms of either the BSD License or the -GNU General Public License (GPL) Version 2. - -The BSD License is recommended for most projects. It is simple and easy to -understand and it places almost no restrictions on what you can do with the -Forge project. - -If the GPL suits your project better you are also free to use Forge under -that license. - -You don't have to do anything special to choose one license or the other and -you don't have to notify anyone which license you are using. You are free to -use this project in commercial projects as long as the copyright header is -left intact. - -If you are a commercial entity and use this set of libraries in your -commercial software then reasonable payment to Digital Bazaar, if you can -afford it, is not required but is expected and would be appreciated. If this -library saves you time, then it's saving you money. The cost of developing -the Forge software was on the order of several hundred hours and tens of -thousands of dollars. We are attempting to strike a balance between helping -the development community while not being taken advantage of by lucrative -commercial entities for our efforts. - -------------------------------------------------------------------------------- -New BSD License (3-clause) -Copyright (c) 2010, Digital Bazaar, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Digital Bazaar, Inc. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL DIGITAL BAZAAR BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -------------------------------------------------------------------------------- - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - - -------------------------------------------------------------------- diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 83024d259..000000000 --- a/package-lock.json +++ /dev/null @@ -1,32342 +0,0 @@ -{ - "name": "__EXTENSIONNAME__", - "version": "0.0.0-UNTRACKEDVERSION", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/compat-data": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.5.tgz", - "integrity": "sha512-jWYUqQX/ObOhG1UiEkbH5SANsE/8oKXiQWjj7p7xgj9Zmnt//aUvyz4dBkK0HNsS8/cbyC5NmmH87VekW+mXFg==", - "dev": true, - "requires": { - "browserslist": "^4.8.5", - "invariant": "^2.2.4", - "semver": "^5.5.0" - } - }, - "@babel/core": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.3.tgz", - "integrity": "sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.0", - "@babel/helpers": "^7.4.3", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "convert-source-map": "^1.1.0", - "debug": "^4.1.0", - "json5": "^2.1.0", - "lodash": "^4.17.11", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", - "requires": { - "@babel/types": "^7.4.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", - "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", - "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-builder-react-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz", - "integrity": "sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "esutils": "^2.0.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-call-delegate": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz", - "integrity": "sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz", - "integrity": "sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.8.4", - "browserslist": "^4.8.5", - "invariant": "^2.2.4", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz", - "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz", - "integrity": "sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==", - "dev": true, - "requires": { - "@babel/helper-regex": "^7.8.3", - "regexpu-core": "^4.6.0" - }, - "dependencies": { - "regexpu-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", - "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.1.0", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" - } - }, - "regjsgen": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", - "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", - "dev": true - }, - "regjsparser": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.3.tgz", - "integrity": "sha512-8uZvYbnfAtEm9Ab8NTb3hdLwL4g/LQzEYP7Xs27T96abJCCE2d6r3cPZPQEsLKy0vRSGVNG+/zVGtLr86HQduA==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } - } - } - }, - "@babel/helper-define-map": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", - "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/types": "^7.8.3", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", - "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", - "dev": true, - "requires": { - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", - "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-module-imports": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", - "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-module-transforms": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz", - "integrity": "sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-simple-access": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==" - }, - "@babel/helper-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", - "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", - "dev": true, - "requires": { - "lodash": "^4.17.13" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", - "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-wrap-function": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-replace-supers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", - "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-simple-access": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", - "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@babel/helper-wrap-function": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", - "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helpers": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz", - "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", - "requires": { - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==" - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", - "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3", - "@babel/plugin-syntax-async-generators": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz", - "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-decorators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz", - "integrity": "sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-decorators": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", - "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", - "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", - "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - } - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz", - "integrity": "sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz", - "integrity": "sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - } - } - }, - "@babel/plugin-syntax-decorators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz", - "integrity": "sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-flow": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz", - "integrity": "sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz", - "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", - "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", - "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz", - "integrity": "sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - } - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", - "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", - "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", - "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", - "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-classes": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz", - "integrity": "sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-define-map": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", - "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz", - "integrity": "sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", - "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", - "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", - "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.8.3.tgz", - "integrity": "sha512-g/6WTWG/xbdd2exBBzMfygjX/zw4eyNC4X8pRaq7aRHRoDUCzAIu3kGYIXviOv8BjCuWm8vDBwjHcjiRNgXrPA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-flow": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz", - "integrity": "sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", - "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/plugin-transform-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", - "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", - "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz", - "integrity": "sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz", - "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-simple-access": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz", - "integrity": "sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.8.3", - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz", - "integrity": "sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", - "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", - "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", - "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz", - "integrity": "sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA==", - "dev": true, - "requires": { - "@babel/helper-call-delegate": "^7.8.3", - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", - "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-constant-elements": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.8.3.tgz", - "integrity": "sha512-glrzN2U+egwRfkNFtL34xIBYTxbbUF2qJTP8HD3qETBBqzAWSeNB821X0GjU06+dNpq/UyCIjI72FmGE5NNkQQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", - "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz", - "integrity": "sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g==", - "dev": true, - "requires": { - "@babel/helper-builder-react-jsx": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz", - "integrity": "sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz", - "integrity": "sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz", - "integrity": "sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA==", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.0" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", - "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz", - "integrity": "sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "resolve": "^1.8.1", - "semver": "^5.5.1" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", - "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", - "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", - "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-regex": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", - "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", - "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.3.tgz", - "integrity": "sha512-Ebj230AxcrKGZPKIp4g4TdQLrqX95TobLUWKd/CwG7X1XHUH1ZpkpFvXuXqWbtGRWb7uuEWNlrl681wsOArAdQ==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-typescript": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz", - "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==", - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - }, - "@babel/helper-replace-supers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", - "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", - "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/preset-env": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.4.tgz", - "integrity": "sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.8.4", - "@babel/helper-compilation-targets": "^7.8.4", - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-proposal-async-generator-functions": "^7.8.3", - "@babel/plugin-proposal-dynamic-import": "^7.8.3", - "@babel/plugin-proposal-json-strings": "^7.8.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.8.3", - "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", - "@babel/plugin-proposal-optional-chaining": "^7.8.3", - "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.8.3", - "@babel/plugin-transform-async-to-generator": "^7.8.3", - "@babel/plugin-transform-block-scoped-functions": "^7.8.3", - "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/plugin-transform-classes": "^7.8.3", - "@babel/plugin-transform-computed-properties": "^7.8.3", - "@babel/plugin-transform-destructuring": "^7.8.3", - "@babel/plugin-transform-dotall-regex": "^7.8.3", - "@babel/plugin-transform-duplicate-keys": "^7.8.3", - "@babel/plugin-transform-exponentiation-operator": "^7.8.3", - "@babel/plugin-transform-for-of": "^7.8.4", - "@babel/plugin-transform-function-name": "^7.8.3", - "@babel/plugin-transform-literals": "^7.8.3", - "@babel/plugin-transform-member-expression-literals": "^7.8.3", - "@babel/plugin-transform-modules-amd": "^7.8.3", - "@babel/plugin-transform-modules-commonjs": "^7.8.3", - "@babel/plugin-transform-modules-systemjs": "^7.8.3", - "@babel/plugin-transform-modules-umd": "^7.8.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", - "@babel/plugin-transform-new-target": "^7.8.3", - "@babel/plugin-transform-object-super": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.8.4", - "@babel/plugin-transform-property-literals": "^7.8.3", - "@babel/plugin-transform-regenerator": "^7.8.3", - "@babel/plugin-transform-reserved-words": "^7.8.3", - "@babel/plugin-transform-shorthand-properties": "^7.8.3", - "@babel/plugin-transform-spread": "^7.8.3", - "@babel/plugin-transform-sticky-regex": "^7.8.3", - "@babel/plugin-transform-template-literals": "^7.8.3", - "@babel/plugin-transform-typeof-symbol": "^7.8.4", - "@babel/plugin-transform-unicode-regex": "^7.8.3", - "@babel/types": "^7.8.3", - "browserslist": "^4.8.5", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/preset-react": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.8.3.tgz", - "integrity": "sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-transform-react-display-name": "^7.8.3", - "@babel/plugin-transform-react-jsx": "^7.8.3", - "@babel/plugin-transform-react-jsx-self": "^7.8.3", - "@babel/plugin-transform-react-jsx-source": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/preset-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.8.3.tgz", - "integrity": "sha512-qee5LgPGui9zQ0jR1TeU5/fP9L+ovoArklEqY12ek8P/wV5ZeM/VYSQYwICeoT6FfpJTekG9Ilay5PhwsOpMHA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-transform-typescript": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - } - } - }, - "@babel/runtime": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz", - "integrity": "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" - }, - "@cnakazawa/watch": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", - "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, - "@csstools/convert-colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", - "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", - "dev": true - }, - "@csstools/normalize.css": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", - "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==", - "dev": true - }, - "@fluentui/react-focus": { - "version": "7.1.13", - "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-7.1.13.tgz", - "integrity": "sha512-voY84/vRkcZGUHSwrPO6eEplc0EGKRGf06ov826NdzMq8s2BXoG2JMMdFNclFppQsCtcXOCPmfzwGHShJvGu5g==", - "requires": { - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/set-version": "^7.0.9", - "@uifabric/styling": "^7.11.2", - "@uifabric/utilities": "^7.15.5", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@formatjs/intl-relativetimeformat": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-2.8.0.tgz", - "integrity": "sha512-5T3m5hJSxXrbwtnFHyYBSbTjOXPXu+4NJ0MUu1LAf4fPEdd+pJZfWKuMJSWgFQPVMbLYq9NLvDWQda3hVe99sg==" - }, - "@gulp-sourcemaps/identity-map": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz", - "integrity": "sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==", - "dev": true, - "requires": { - "acorn": "^5.0.3", - "css": "^2.2.1", - "normalize-path": "^2.1.1", - "source-map": "^0.6.0", - "through2": "^2.0.3" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - } - } - }, - "@gulp-sourcemaps/map-sources": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", - "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", - "dev": true, - "requires": { - "normalize-path": "^2.0.1", - "through2": "^2.0.3" - } - }, - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", - "dev": true - }, - "@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", - "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", - "dev": true - }, - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "dev": true - }, - "@hapi/joi": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", - "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", - "dev": true, - "requires": { - "@hapi/address": "2.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/topo": "3.x.x" - } - }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", - "dev": true, - "requires": { - "@hapi/hoek": "^8.3.0" - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", - "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==" - }, - "@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", - "dev": true, - "requires": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@jest/core": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.1.0.tgz", - "integrity": "sha512-iz05+NmwCmZRzMXvMo6KFipW7nzhbpEawrKrkkdJzgytavPse0biEnCNr2wRlyCsp3SmKaEY+SGv7YWYQnIdig==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/reporters": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-changed-files": "^25.1.0", - "jest-config": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-resolve-dependencies": "^25.1.0", - "jest-runner": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "jest-watcher": "^25.1.0", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "realpath-native": "^1.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "requires": { - "type-fest": "^0.8.1" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "jest-watcher": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.1.0.tgz", - "integrity": "sha512-Q9eZ7pyaIr6xfU24OeTg4z1fUqBF/4MP6J801lyQfg7CsnZ/TCzAPvCfckKdL5dlBBEKBeHV0AdyjFZ5eWj4ig==", - "requires": { - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "string-length": "^3.1.0" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - } - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "@jest/environment": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.1.0.tgz", - "integrity": "sha512-cTpUtsjU4cum53VqBDlcW0E4KbQF03Cn0jckGPW/5rrE9tb+porD3+hhLtHAwhthsqfyF+bizyodTlsRA++sHg==", - "requires": { - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/fake-timers": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.1.0.tgz", - "integrity": "sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ==", - "requires": { - "@jest/types": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "lolex": "^5.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", - "requires": { - "@jest/types": "^25.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "@jest/fake-timers": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - } - } - }, - "@jest/reporters": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.1.0.tgz", - "integrity": "sha512-ORLT7hq2acJQa8N+NKfs68ZtHFnJPxsGqmofxW7v7urVhzJvpKZG9M7FAcgh9Ee1ZbCteMrirHA3m5JfBtAaDg==", - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.0", - "jest-haste-map": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", - "node-notifier": "^6.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^3.1.0", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^4.0.1" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "istanbul-lib-instrument": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz", - "integrity": "sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ==", - "requires": { - "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", - "source-map": "^0.6.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - } - } - }, - "@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", - "dev": true, - "requires": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - } - } - }, - "@jest/test-sequencer": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.1.0.tgz", - "integrity": "sha512-WgZLRgVr2b4l/7ED1J1RJQBOharxS11EFhmwDqknpknE0Pm87HLZVS2Asuuw+HQdfQvm2aXL2FvvBLxOD1D0iw==", - "requires": { - "@jest/test-result": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-runner": "^25.1.0", - "jest-runtime": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/transform": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.1.0.tgz", - "integrity": "sha512-4ktrQ2TPREVeM+KxB4zskAT84SnmG1vaz4S+51aTefyqn3zocZUnliLLm5Fsl85I3p/kFPN4CRp1RElIfXGegQ==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^25.1.0", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^3.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-util": "^25.1.0", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "istanbul-lib-instrument": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz", - "integrity": "sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ==", - "requires": { - "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "write-file-atomic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", - "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - } - } - }, - "@jest/types": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.1.0.tgz", - "integrity": "sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - }, - "dependencies": { - "@types/yargs": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.1.tgz", - "integrity": "sha512-sYlwNU7zYi6eZbMzFvG6eHD7VsEvFdoDtlD7eI1JTg7YNnuguzmiGsc6MPSq5l8n+h21AsNof0je+9sgOe4+dg==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@microsoft/load-themed-styles": { - "version": "1.10.43", - "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.43.tgz", - "integrity": "sha512-9RUeBMXPHbT/qHTRIQi9oQs3bw5JkQGBQ8ayjycq95q+1OUI9jBJPiJi2d8btpGdJWisVb3ZXxRsUx5u6f5dRA==" - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, - "@serialport/binding-abstract": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/binding-abstract/-/binding-abstract-8.0.6.tgz", - "integrity": "sha512-1swwUVoRyQ9ubxrkJ8JPppykohUpTAP4jkGr36e9NjbVocSPfqeX6tFZFwl/IdUlwJwxGdbKDqq7FvXniCQUMw==", - "requires": { - "debug": "^4.1.1" - } - }, - "@serialport/binding-mock": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/binding-mock/-/binding-mock-8.0.6.tgz", - "integrity": "sha512-BIbY5/PsDDo0QWDNCCxDgpowAdks+aZR8BOsEtK2GoASTTcJCy1fBwPIfH870o7rnbH901wY3C+yuTfdOvSO9A==", - "requires": { - "@serialport/binding-abstract": "^8.0.6", - "debug": "^4.1.1" - } - }, - "@serialport/bindings": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/@serialport/bindings/-/bindings-8.0.7.tgz", - "integrity": "sha512-IqudDL8ne2Y2S0W5fKA6wdgHCIA2e2OIaPVYhGy6duE6legNHFY+05CLicHAyAeTocXmHU7rVNxzVQrOG5tM4g==", - "requires": { - "@serialport/binding-abstract": "^8.0.6", - "@serialport/parser-readline": "^8.0.6", - "bindings": "^1.5.0", - "debug": "^4.1.1", - "nan": "^2.14.0", - "prebuild-install": "^5.3.0" - } - }, - "@serialport/parser-byte-length": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-byte-length/-/parser-byte-length-8.0.6.tgz", - "integrity": "sha512-92mrFxFEvq3gRvSM7ANK/jfbmHslz91a5oYJy/nbSn4H/MCRXjxR2YOkQgVXuN+zLt+iyDoW3pcOP4Sc1nWdqQ==" - }, - "@serialport/parser-cctalk": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-cctalk/-/parser-cctalk-8.0.6.tgz", - "integrity": "sha512-pqtCYQPgxnxHygiXUPCfgX7sEx+fdR/ObjpscidynEULUq2fFrC5kBkrxRbTfHRtTaU2ii9DyjFq0JVRCbhI0Q==" - }, - "@serialport/parser-delimiter": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-8.0.6.tgz", - "integrity": "sha512-ogKOcPisPMlVtirkuDu3SFTF0+xT0ijxoH7XjpZiYL41EVi367MwuCnEmXG+dEKKnF0j9EPqOyD2LGSJxaFmhQ==" - }, - "@serialport/parser-readline": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-8.0.6.tgz", - "integrity": "sha512-OYBT2mpczh9QUI3MTw8j0A0tIlPVjpVipvuVnjRkYwxrxPeq04RaLFhaDpuRzua5rTKMt89c1y3btYeoDXMjAA==", - "requires": { - "@serialport/parser-delimiter": "^8.0.6" - } - }, - "@serialport/parser-ready": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-ready/-/parser-ready-8.0.6.tgz", - "integrity": "sha512-xcEqv4rc119WR5JzAuu8UeJOlAwET2PTdNb6aIrrLlmTxhvuBbuRFcsnF3BpH9jUL30Kh7a6QiNXIwVG+WR/1Q==" - }, - "@serialport/parser-regex": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-regex/-/parser-regex-8.0.6.tgz", - "integrity": "sha512-J8KY75Azz5ZyExmyM5YfUxbXOWBkZCytKgCCmZ966ttwZS0bUZOuoCaZj2Zp4VILJAiLuxHoqc0foi67Fri5+g==" - }, - "@serialport/stream": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-8.0.6.tgz", - "integrity": "sha512-ym1PwM0rwLrj90vRBB66I1hwMXbuMw9wGTxqns75U3N/tuNFOH85mxXaYVF2TpI66aM849NoI1jMm50fl9equg==", - "requires": { - "debug": "^4.1.1" - } - }, - "@sheerun/mutationobserver-shim": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz", - "integrity": "sha512-vTCdPp/T/Q3oSqwHmZ5Kpa9oI7iLtGl3RQaA/NyLHikvcrPxACkkKVr/XzkSPJWXHRhKGzVvb0urJsbMlRxi1Q==" - }, - "@sinonjs/commons": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.0.tgz", - "integrity": "sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg==", - "requires": { - "type-detect": "4.0.8" - } - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==", - "dev": true - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==", - "dev": true - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", - "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==", - "dev": true - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", - "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==", - "dev": true - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz", - "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==", - "dev": true - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", - "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==", - "dev": true - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", - "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==", - "dev": true - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", - "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==", - "dev": true - }, - "@svgr/babel-preset": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz", - "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", - "dev": true, - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", - "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3", - "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", - "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", - "@svgr/babel-plugin-transform-svg-component": "^4.2.0" - } - }, - "@svgr/core": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz", - "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", - "dev": true, - "requires": { - "@svgr/plugin-jsx": "^4.3.3", - "camelcase": "^5.3.1", - "cosmiconfig": "^5.2.1" - } - }, - "@svgr/hast-util-to-babel-ast": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", - "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@svgr/plugin-jsx": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz", - "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", - "dev": true, - "requires": { - "@babel/core": "^7.4.5", - "@svgr/babel-preset": "^4.3.3", - "@svgr/hast-util-to-babel-ast": "^4.3.2", - "svg-parser": "^2.0.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@svgr/plugin-svgo": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", - "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", - "dev": true, - "requires": { - "cosmiconfig": "^5.2.1", - "merge-deep": "^3.0.2", - "svgo": "^1.2.2" - } - }, - "@svgr/webpack": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz", - "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==", - "dev": true, - "requires": { - "@babel/core": "^7.4.5", - "@babel/plugin-transform-react-constant-elements": "^7.0.0", - "@babel/preset-env": "^7.4.5", - "@babel/preset-react": "^7.0.0", - "@svgr/core": "^4.3.3", - "@svgr/plugin-jsx": "^4.3.3", - "@svgr/plugin-svgo": "^4.3.1", - "loader-utils": "^1.2.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@testing-library/dom": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-6.11.0.tgz", - "integrity": "sha512-Pkx9LMIGshyNbfmecjt18rrAp/ayMqGH674jYER0SXj0iG9xZc+zWRjk2Pg9JgPBDvwI//xGrI/oOQkAi4YEew==", - "requires": { - "@babel/runtime": "^7.6.2", - "@sheerun/mutationobserver-shim": "^0.3.2", - "@types/testing-library__dom": "^6.0.0", - "aria-query": "3.0.0", - "pretty-format": "^24.9.0", - "wait-for-expect": "^3.0.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "requires": { - "regenerator-runtime": "^0.13.2" - } - } - } - }, - "@testing-library/jest-dom": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.0.2.tgz", - "integrity": "sha512-Pl3si4eH88+5wlVz6NjecLfeO7PjTbbgWKwVZXUtBfrGuJLjGdUUo+O92XRu/59wft8HAmwvXHeMWpqWTg2Uwg==", - "requires": { - "@babel/runtime": "^7.5.1", - "@types/testing-library__jest-dom": "^5.0.0", - "chalk": "^2.4.1", - "css": "^2.2.3", - "css.escape": "^1.5.1", - "jest-diff": "^24.0.0", - "jest-matcher-utils": "^24.0.0", - "lodash": "^4.17.11", - "pretty-format": "^24.0.0", - "redent": "^3.0.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@testing-library/react": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-9.4.0.tgz", - "integrity": "sha512-XdhDWkI4GktUPsz0AYyeQ8M9qS/JFie06kcSnUVcpgOwFjAu9vhwR83qBl+lw9yZWkbECjL8Hd+n5hH6C0oWqg==", - "requires": { - "@babel/runtime": "^7.7.6", - "@testing-library/dom": "^6.11.0", - "@types/testing-library__react": "^9.1.2" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "requires": { - "regenerator-runtime": "^0.13.2" - } - } - } - }, - "@types/babel__core": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", - "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.8.tgz", - "integrity": "sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw==", - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" - }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true - }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", - "dev": true, - "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", - "requires": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, - "@types/invariant": { - "version": "2.2.30", - "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.30.tgz", - "integrity": "sha512-98fB+yo7imSD2F7PF7GIpELNgtLNgo5wjivu0W5V4jx+KVVJxo6p/qN4zdzSTBWy4/sN3pPyXwnhRSD28QX+ag==" - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==" - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-dXvuABY9nM1xgsXlOtLQXJKdacxZJd7AtvLsKZ/0b57ruMXDKCOXAC/M75GbllQX6o1pcZ5hAG4JzYy7Z/wM2w==", - "requires": { - "jest-diff": "^24.3.0" - } - }, - "@types/json-schema": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", - "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/node": { - "version": "10.14.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.7.tgz", - "integrity": "sha512-on4MmIDgHXiuJDELPk1NFaKVUxxCFr37tm8E9yN6rAiF5Pzp/9bBfBHkoexqRiY+hk/Z04EJU9kKEb59YqJ82A==" - }, - "@types/open": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/open/-/open-6.1.0.tgz", - "integrity": "sha512-sdB0OltczakZfdn5DYg3ZbHoQeYtU8Vbo4dys0U98gikn++M4gGDI02dzEWXPMP5uXGSjGx9GnK/yLlJMfGjlg==", - "requires": { - "@types/node": "*" - } - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" - }, - "@types/q": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", - "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", - "dev": true - }, - "@types/react": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.8.6.tgz", - "integrity": "sha512-bN9qDjEMltmHrl0PZRI4IF2AbB7V5UlRfG+OOduckVnRQ4VzXVSzy/1eLAh778IEqhTnW0mmgL9yShfinNverA==", - "requires": { - "@types/prop-types": "*", - "csstype": "^2.2.0" - } - }, - "@types/react-dom": { - "version": "16.8.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.8.4.tgz", - "integrity": "sha512-eIRpEW73DCzPIMaNBDP5pPIpK1KXyZwNgfxiVagb5iGiz6da+9A5hslSX6GAQKdO7SayVCS/Fr2kjqprgAvkfA==", - "requires": { - "@types/react": "*" - } - }, - "@types/react-test-renderer": { - "version": "16.9.2", - "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-16.9.2.tgz", - "integrity": "sha512-4eJr1JFLIAlWhzDkBCkhrOIWOvOxcCAfQh+jiKg7l/nNZcCIL2MHl2dZhogIFKyHzedVWHaVP1Yydq/Ruu4agw==", - "requires": { - "@types/react": "*" - } - }, - "@types/socket.io": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/socket.io/-/socket.io-2.1.2.tgz", - "integrity": "sha512-Ind+4qMNfQ62llyB4IMs1D8znMEBsMKohZBPqfBUIXqLQ9bdtWIbNTBWwtdcBWJKnokMZGcmWOOKslatni5vtA==", - "requires": { - "@types/node": "*" - } - }, - "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" - }, - "@types/testing-library__dom": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/@types/testing-library__dom/-/testing-library__dom-6.11.1.tgz", - "integrity": "sha512-ImChHtQqmjwraRLqBC2sgSQFtczeFvBmBcfhTYZn/3KwXbyD07LQykEQ0xJo7QHc1GbVvf7pRyGaIe6PkCdxEw==", - "requires": { - "pretty-format": "^24.3.0" - } - }, - "@types/testing-library__jest-dom": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.0.0.tgz", - "integrity": "sha512-Pm+2mvqs9sND247oMVJbu3QmPUqMzBuJbY5uHHYQdl9MXq5hwWkTbesw1sPIky52Y0sHksWAZnVvGLbdyFSyrA==", - "requires": { - "@types/jest": "*" - } - }, - "@types/testing-library__react": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@types/testing-library__react/-/testing-library__react-9.1.2.tgz", - "integrity": "sha512-CYaMqrswQ+cJACy268jsLAw355DZtPZGt3Jwmmotlcu8O/tkoXBI6AeZ84oZBJsIsesozPKzWzmv/0TIU+1E9Q==", - "requires": { - "@types/react-dom": "*", - "@types/testing-library__dom": "*" - } - }, - "@types/vscode": { - "version": "1.45.1", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.45.1.tgz", - "integrity": "sha512-0NO9qrrEJBO8FsqHCrFMgR2suKnwCsKBWvRSb2OzH5gs4i3QO5AhEMQYrSzDbU/wLPt7N617/rN9lPY213gmwg==", - "dev": true - }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" - }, - "@typescript-eslint/eslint-plugin": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.20.0.tgz", - "integrity": "sha512-cimIdVDV3MakiGJqMXw51Xci6oEDEoPkvh8ggJe2IIzcc0fYqAxOXN6Vbeanahz6dLZq64W+40iUEc9g32FLDQ==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "2.20.0", - "eslint-utils": "^1.4.3", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.20.0.tgz", - "integrity": "sha512-fEBy9xYrwG9hfBLFEwGW2lKwDRTmYzH3DwTmYbT+SMycmxAoPl0eGretnBFj/s+NfYBG63w/5c3lsvqqz5mYag==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.20.0", - "eslint-scope": "^5.0.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - } - } - }, - "@typescript-eslint/parser": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.20.0.tgz", - "integrity": "sha512-o8qsKaosLh2qhMZiHNtaHKTHyCHc3Triq6aMnwnWj7budm3xAY9owSZzV1uon5T9cWmJRJGzTFa90aex4m77Lw==", - "dev": true, - "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.20.0", - "@typescript-eslint/typescript-estree": "2.20.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.20.0.tgz", - "integrity": "sha512-WlFk8QtI8pPaE7JGQGxU7nGcnk1ccKAJkhbVookv94ZcAef3m6oCE/jEDL6dGte3JcD7reKrA0o55XhBRiVT3A==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^6.3.0", - "tsutils": "^3.17.1" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@uifabric/foundation": { - "version": "7.5.25", - "resolved": "https://registry.npmjs.org/@uifabric/foundation/-/foundation-7.5.25.tgz", - "integrity": "sha512-5PcqVMjXG1or7GrZHCWQ1SRNcCUV6lPm7OoAi1AKtVrSEi69g56VjJCJ7sqc/Q587ehDN6LqK9RhLc2IhQVO+Q==", - "requires": { - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/set-version": "^7.0.9", - "@uifabric/styling": "^7.11.2", - "@uifabric/utilities": "^7.15.5", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/icons": { - "version": "7.3.24", - "resolved": "https://registry.npmjs.org/@uifabric/icons/-/icons-7.3.24.tgz", - "integrity": "sha512-0CkTEgY8xwvNs+zUQcvWKLnuYxudjJfPI016385bqizE9dkCMyAfXer/7sgyrp6FjxNUrHGyQUKvdVoT3zSNYA==", - "requires": { - "@uifabric/set-version": "^7.0.9", - "@uifabric/styling": "^7.11.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/merge-styles": { - "version": "7.8.11", - "resolved": "https://registry.npmjs.org/@uifabric/merge-styles/-/merge-styles-7.8.11.tgz", - "integrity": "sha512-U1gYewj/j6ZGBSXD84Ekp+En4N5hH79TsK9hWJq2wKJKK3h0MKmY50WyFKWIL2/kS+wM7zIR6irK0xY+mfjB2g==", - "requires": { - "@uifabric/set-version": "^7.0.9", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/react-hooks": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@uifabric/react-hooks/-/react-hooks-7.1.2.tgz", - "integrity": "sha512-gFsjCeh+g0rZYSx13WIJcA2HLxNKiY4RQsxLuOq1cMsBgiUGix8ofMPd3S5ys+qfVdl+XwoqlV/25PgvIRrpUA==", - "requires": { - "@uifabric/set-version": "^7.0.9", - "@uifabric/utilities": "^7.15.5", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/set-version": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@uifabric/set-version/-/set-version-7.0.9.tgz", - "integrity": "sha512-YJL6WLBlFKDJcLSw1ihqW5PTFi2XMoluEvwGd2qtzp2IVbHvdbk7uIdWuTALo3dFNNqWPN8shSNUdHVATE/1jQ==", - "requires": { - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/styling": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-7.11.2.tgz", - "integrity": "sha512-0so6oM6d0WOogDiOxT5bbfOrkGEvhrmRukSrgr1mY/3tkQ3gue/XW4yus0fNi7H9R8wZa2rIPQaUcZBW3Hrc0g==", - "requires": { - "@microsoft/load-themed-styles": "^1.10.26", - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/set-version": "^7.0.9", - "@uifabric/utilities": "^7.15.5", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/utilities": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-7.15.5.tgz", - "integrity": "sha512-cjnhT7tTvHNXt0rvuajk5s/RQtSWFh2JfRhbmS7dTGfg3vNieoHg2EiNt+ulzKXxtdkFriXoFHRSNkTuV4/L9w==", - "requires": { - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/set-version": "^7.0.9", - "prop-types": "^15.7.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==" - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" - }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", - "dev": true - }, - "acorn-globals": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", - "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" - } - } - }, - "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", - "dev": true - }, - "acorn-walk": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", - "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==" - }, - "address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", - "dev": true - }, - "adjust-sourcemap-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", - "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", - "dev": true, - "requires": { - "assert": "1.4.1", - "camelcase": "5.0.0", - "loader-utils": "1.2.3", - "object-path": "0.11.4", - "regex-parser": "2.2.10" - }, - "dependencies": { - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - } - }, - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", - "dev": true - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "dev": true, - "requires": { - "buffer-equal": "^1.0.0" - } - }, - "applicationinsights": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-1.0.8.tgz", - "integrity": "sha512-KzOOGdphOS/lXWMFZe5440LUdFbrLpMvh2SaRxn7BmiI550KAoSb2gIhiq6kJZ9Ir3AxRRztjhzif+e5P5IXIg==", - "requires": { - "diagnostic-channel": "0.2.0", - "diagnostic-channel-publishers": "0.2.1", - "zone.js": "0.7.6" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", - "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - } - }, - "arity-n": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", - "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" - }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "dev": true, - "requires": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", - "dev": true, - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", - "dev": true - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", - "dev": true - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", - "dev": true, - "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", - "dev": true - }, - "async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "dev": true, - "requires": { - "async-done": "^1.2.2" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "autoprefixer": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz", - "integrity": "sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==", - "dev": true, - "requires": { - "browserslist": "^4.8.3", - "caniuse-lite": "^1.0.30001020", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.26", - "postcss-value-parser": "^4.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-value-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", - "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" - }, - "axobject-query": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz", - "integrity": "sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ==", - "dev": true - }, - "azure-devops-node-api": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-7.2.0.tgz", - "integrity": "sha512-pMfGJ6gAQ7LRKTHgiRF+8iaUUeGAI0c8puLaqHLc7B8AR7W6GJLozK9RFeUHFjEGybC9/EB3r67WPd7e46zQ8w==", - "dev": true, - "requires": { - "os": "0.1.1", - "tunnel": "0.0.4", - "typed-rest-client": "1.2.0", - "underscore": "1.8.3" - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - } - } - }, - "babel-eslint": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", - "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "babel-extract-comments": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", - "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", - "dev": true, - "requires": { - "babylon": "^6.18.0" - } - }, - "babel-jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.1.0.tgz", - "integrity": "sha512-tz0VxUhhOE2y+g8R2oFrO/2VtVjA1lkJeavlhExuRBg3LdNJY9gwQ+Vcvqt9+cqy71MCTJhewvTB7Qtnnr9SWg==", - "requires": { - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^25.1.0", - "chalk": "^3.0.0", - "slash": "^3.0.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@jest/transform": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.1.0.tgz", - "integrity": "sha512-4ktrQ2TPREVeM+KxB4zskAT84SnmG1vaz4S+51aTefyqn3zocZUnliLLm5Fsl85I3p/kFPN4CRp1RElIfXGegQ==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^25.1.0", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^3.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-util": "^25.1.0", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": true - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "istanbul-lib-instrument": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz", - "integrity": "sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ==", - "requires": { - "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "jest-haste-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.1.0.tgz", - "integrity": "sha512-/2oYINIdnQZAqyWSn1GTku571aAfs8NxzSErGek65Iu5o8JYb+113bZysRMcC/pjE5v9w0Yz+ldbj9NxrFyPyw==", - "requires": { - "@jest/types": "^25.1.0", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.3", - "jest-serializer": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-regex-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.1.0.tgz", - "integrity": "sha512-9lShaDmDpqwg+xAd73zHydKrBbbrIi08Kk9YryBEBybQFg/lBWR/2BDjjiSE7KIppM9C5+c03XiDaZ+m4Pgs1w==" - }, - "jest-serializer": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.1.0.tgz", - "integrity": "sha512-20Wkq5j7o84kssBwvyuJ7Xhn7hdPeTXndnwIblKDR2/sy1SUm6rWWiG9kSCgJPIfkDScJCIsTtOKdlzfIHOfKA==" - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "write-file-atomic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", - "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - } - } - }, - "babel-loader": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", - "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", - "dev": true, - "requires": { - "find-cache-dir": "^2.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1", - "pify": "^4.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", - "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-istanbul": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.3.0", - "test-exclude": "^5.2.3" - } - }, - "babel-plugin-jest-hoist": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.1.0.tgz", - "integrity": "sha512-oIsopO41vW4YFZ9yNYoLQATnnN46lp+MZ6H4VvPKFkcc2/fkl3CfE/NZZSmnEIEsJRmJAgkVEK0R7Zbl50CpTw==", - "requires": { - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "babel-plugin-named-asset-import": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz", - "integrity": "sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA==", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" - } - }, - "babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", - "dev": true - }, - "babel-preset-jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.1.0.tgz", - "integrity": "sha512-eCGn64olaqwUMaugXsTtGAM2I0QTahjEtnRu0ql8Ie+gDWAc1N6wqN0k2NilnyTunM69Pad7gJY7LOtwLimoFQ==", - "requires": { - "@babel/plugin-syntax-bigint": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^25.1.0" - } - }, - "babel-preset-react-app": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.1.1.tgz", - "integrity": "sha512-YkWP2UwY//TLltNlEBRngDOrYhvSLb+CA330G7T9M5UhGEMWe+JK/8IXJc5p2fDTSfSiETf+PY0+PYXFMix81Q==", - "dev": true, - "requires": { - "@babel/core": "7.8.4", - "@babel/plugin-proposal-class-properties": "7.8.3", - "@babel/plugin-proposal-decorators": "7.8.3", - "@babel/plugin-proposal-numeric-separator": "7.8.3", - "@babel/plugin-transform-flow-strip-types": "7.8.3", - "@babel/plugin-transform-react-display-name": "7.8.3", - "@babel/plugin-transform-runtime": "7.8.3", - "@babel/preset-env": "7.8.4", - "@babel/preset-react": "7.8.3", - "@babel/preset-typescript": "7.8.3", - "@babel/runtime": "7.8.4", - "babel-plugin-macros": "2.8.0", - "babel-plugin-transform-react-remove-prop-types": "0.4.24" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", - "dev": true, - "requires": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" - } - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bl": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", - "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" - }, - "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==" - }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" - } - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.8.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.7.tgz", - "integrity": "sha512-gFOnZNYBHrEyUML0xr5NJ6edFaaKbTFX9S9kQHlYfCP0Rit/boRIz4G+Avq6/4haEKJXdGGUnoolx+5MWW2BoA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001027", - "electron-to-chromium": "^1.3.349", - "node-releases": "^1.1.49" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", - "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "cacache": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", - "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", - "dev": true, - "requires": { - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "minipass": "^3.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^7.0.0", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camel-case": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", - "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", - "dev": true, - "requires": { - "pascal-case": "^3.1.1", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001028", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001028.tgz", - "integrity": "sha512-Vnrq+XMSHpT7E+LWoIYhs3Sne8h9lx9YJV3acH3THNCwU/9zV93/ta4xVfzTtnqd3rvnuVpVjE3DFqf56tr3aQ==", - "dev": true - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "requires": { - "rsvp": "^4.8.4" - } - }, - "case-sensitive-paths-webpack-plugin": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", - "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "cheerio": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", - "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", - "dev": true, - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.1", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - }, - "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, - "requires": { - "@types/node": "*" - } - } - } - }, - "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - } - } - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-deep": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", - "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", - "dev": true, - "requires": { - "for-own": "^0.1.3", - "is-plain-object": "^2.0.1", - "kind-of": "^3.0.2", - "lazy-cache": "^1.0.3", - "shallow-clone": "^0.1.2" - } - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "collect-v8-coverage": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.0.tgz", - "integrity": "sha512-VKIhJgvk8E1W28m5avZ2Gv2Ruv5YiF56ug2oclvaG9md69BuZImMG2sk9g7QNKLUbtYAKQjXjYxbYZVUlMMKmQ==" - }, - "collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "dev": true, - "requires": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", - "dev": true, - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "compare-versions": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.5.1.tgz", - "integrity": "sha512-9fGPIB7C6AyM18CJJBHt5EnCZDG3oiTJYy0NjfIAGjKpzv0tkxWko7TNQHF5ymqm7IH03tqmeuBxtvD+Izh6mg==" - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" - }, - "compose-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", - "dev": true, - "requires": { - "arity-n": "^1.0.4" - } - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - }, - "dependencies": { - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", - "dev": true - } - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "confusing-browser-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", - "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", - "dev": true - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", - "dev": true, - "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" - } - }, - "core-js": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", - "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", - "dev": true - }, - "core-js-compat": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", - "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", - "dev": true, - "requires": { - "browserslist": "^4.8.3", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - } - }, - "css-blank-pseudo": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", - "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "dev": true, - "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-has-pseudo": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", - "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^5.0.0-rc.4" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-loader": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", - "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash": "^4.17.11", - "postcss": "^6.0.23", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - } - }, - "css-modules-loader-core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz", - "integrity": "sha1-WQhmgpShvs0mGuCkziGwtVHyHRY=", - "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.1", - "postcss-modules-extract-imports": "1.1.0", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz", - "integrity": "sha1-AA29H47vIXqjaLmiEsX8QLKo8/I=", - "requires": { - "chalk": "^1.1.3", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-modules-extract-imports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", - "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", - "requires": { - "postcss": "^6.0.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "css-prefers-color-scheme": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", - "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - }, - "dependencies": { - "css-what": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", - "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", - "dev": true - } - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "css-selector-tokenizer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", - "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", - "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" - } - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dev": true, - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "dev": true - }, - "css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" - }, - "cssdb": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", - "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==", - "dev": true - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" - }, - "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", - "dev": true, - "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", - "postcss-unique-selectors": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "dev": true - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "dev": true - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", - "dev": true - }, - "csso": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", - "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", - "dev": true, - "requires": { - "css-tree": "1.0.0-alpha.37" - } - }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", - "dev": true, - "requires": { - "cssom": "0.3.x" - } - }, - "csstype": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.8.tgz", - "integrity": "sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA==" - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - }, - "dependencies": { - "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "debug-fabulous": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz", - "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==", - "dev": true, - "requires": { - "debug": "3.X", - "memoizee": "0.4.X", - "object-assign": "4.X" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "requires": { - "mimic-response": "^2.0.0" - } - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", - "dev": true, - "requires": { - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - } - }, - "default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" - }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true - }, - "detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "dev": true, - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "diagnostic-channel": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz", - "integrity": "sha1-zJmvlhLCP7H/8TYSxy8sv6qNWhc=", - "requires": { - "semver": "^5.3.0" - } - }, - "diagnostic-channel-publishers": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.2.1.tgz", - "integrity": "sha1-ji1geottef6IC1SLxYzGvrKIxPM=" - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "diff-sequences": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==" - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "requires": { - "webidl-conversions": "^4.0.2" - } - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz", - "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==", - "dev": true, - "requires": { - "no-case": "^3.0.3", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", - "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "dev": true - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.355", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.355.tgz", - "integrity": "sha512-zKO/wS+2ChI/jz9WAo647xSW8t2RmgRLFdbUb/77cORkUTargO+SCj4ctTHjBn2VeNFrsLgDT7IuDVrd3F8mLQ==", - "dev": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "requires": { - "once": "^1.4.0" - } - }, - "engine.io": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", - "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", - "requires": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "~7.4.2" - }, - "dependencies": { - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" - }, - "ws": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", - "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==" - } - } - }, - "engine.io-client": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.1.tgz", - "integrity": "sha512-oVu9kBkGbcggulyVF0kz6BV3ganqUeqXvD79WOFKa+11oK692w1NyFkuEj4xrkFRpZhn92QOqTk4RQq5LiBXbQ==", - "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "ws": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", - "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==" - } - } - }, - "engine.io-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", - "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.4", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", - "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.50", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz", - "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "^1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escodegen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", - "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", - "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" - } - } - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "eslint-config-react-app": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.0.tgz", - "integrity": "sha512-WrHjoGpKr1kLLiWDD81tme9jMM0hk5cMxasLSdyno6DdPt+IfLOrDJBVo6jN7tn4y1nzhs43TmUaZWO6Sf0blw==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.9" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", - "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-loader": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.3.tgz", - "integrity": "sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw==", - "dev": true, - "requires": { - "fs-extra": "^8.1.0", - "loader-fs-cache": "^1.0.2", - "loader-utils": "^1.2.3", - "object-hash": "^2.0.1", - "schema-utils": "^2.6.1" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz", - "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - } - } - }, - "eslint-plugin-flowtype": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz", - "integrity": "sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "eslint-plugin-import": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.0.tgz", - "integrity": "sha512-NK42oA0mUc8Ngn4kONOPsPB1XhbUvNHqF+g307dPV28aknPoiNnKLFd9em4nkswwepdF5ouieqv5Th/63U7YJQ==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.1", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.0", - "read-pkg-up": "^2.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", - "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.4.5", - "aria-query": "^3.0.0", - "array-includes": "^3.0.3", - "ast-types-flow": "^0.0.7", - "axobject-query": "^2.0.2", - "damerau-levenshtein": "^1.0.4", - "emoji-regex": "^7.0.2", - "has": "^1.0.3", - "jsx-ast-utils": "^2.2.1" - } - }, - "eslint-plugin-react": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.18.0.tgz", - "integrity": "sha512-p+PGoGeV4SaZRDsXqdj9OWcOrOpZn8gXoGPcIQTzo2IDMbAKhNDnME9myZWqO3Ic4R3YmwAZ1lDjWl2R2hMUVQ==", - "dev": true, - "requires": { - "array-includes": "^3.1.1", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.2.3", - "object.entries": "^1.1.1", - "object.fromentries": "^2.0.2", - "object.values": "^1.1.1", - "prop-types": "^15.7.2", - "resolve": "^1.14.2" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "object.entries": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", - "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-plugin-react-hooks": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", - "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==", - "dev": true - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - }, - "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", - "dev": true, - "requires": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", - "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "event-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", - "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "from": "^0.1.7", - "map-stream": "0.0.7", - "pause-stream": "^0.0.11", - "split": "^1.0.1", - "stream-combiner": "^0.2.2", - "through": "^2.3.8" - } - }, - "eventemitter2": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", - "integrity": "sha1-YZegldX7a1folC9v1+qtY6CclFI=" - }, - "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", - "dev": true - }, - "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", - "dev": true - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "exec-sh": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", - "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==" - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "expect": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.1.0.tgz", - "integrity": "sha512-wqHzuoapQkhc3OKPlrpetsfueuEiMf3iWh0R8+duCu9PIjXoP7HgD5aeypwTnXUAjC8aMsiVDaWwlbJ1RlQ38g==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-styles": "^4.0.0", - "jest-get-type": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-regex-util": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "diff-sequences": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", - "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-diff": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", - "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-matcher-utils": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", - "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", - "requires": { - "chalk": "^3.0.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fb-watchman": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", - "requires": { - "bser": "^2.0.0" - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "file-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", - "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.5.0" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "filesize": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz", - "integrity": "sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg==", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, - "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "dev": true, - "requires": { - "is-buffer": "~2.0.3" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", - "dev": true - }, - "flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", - "dev": true - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", - "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", - "dev": true, - "requires": { - "debug": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "fork-ts-checker-webpack-plugin": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz", - "integrity": "sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ==", - "dev": true, - "requires": { - "babel-code-frame": "^6.22.0", - "chalk": "^2.4.1", - "chokidar": "^3.3.0", - "micromatch": "^3.1.10", - "minimatch": "^3.0.4", - "semver": "^5.6.0", - "tapable": "^1.0.0", - "worker-rpc": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", - "dev": true, - "requires": { - "picomatch": "^2.0.7" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - } - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": false, - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": false, - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": false, - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "debug": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": false, - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": false, - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "resolved": false, - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": false, - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": false, - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": false, - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": false, - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": false, - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": false, - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.3.5", - "resolved": false, - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "resolved": false, - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": false, - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.0", - "resolved": false, - "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", - "dev": true, - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "resolved": false, - "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": false, - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "resolved": false, - "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": false, - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": false, - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": false, - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": false, - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": false, - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": false, - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": false, - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": false, - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": false, - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.0", - "resolved": false, - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": false, - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "resolved": false, - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": false, - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.0.3", - "resolved": false, - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true, - "optional": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "generic-names": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-1.0.3.tgz", - "integrity": "sha1-LXhqEhruUIh2eWk56OO/+DbCCRc=", - "requires": { - "loader-utils": "^0.2.16" - }, - "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - } - } - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "git-rev-sync": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/git-rev-sync/-/git-rev-sync-1.12.0.tgz", - "integrity": "sha1-RGhAbH5sO6TPRYeZnhrbKNnRr1U=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "graceful-fs": "4.1.11", - "shelljs": "0.7.7" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - } - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "glob-watcher": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", - "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "object.defaults": "^1.1.0" - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - }, - "dependencies": { - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - } - } - }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" - }, - "gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", - "dev": true, - "requires": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" - } - }, - "gulp-cli": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", - "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.1.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.0.1", - "yargs": "^7.1.0" - }, - "dependencies": { - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", - "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "object.assign": "^4.1.0" - } - } - } - }, - "gulp-filter": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz", - "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=", - "dev": true, - "requires": { - "multimatch": "^2.0.0", - "plugin-error": "^0.1.2", - "streamfilter": "^1.0.5" - } - }, - "gulp-sourcemaps": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz", - "integrity": "sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg==", - "dev": true, - "requires": { - "@gulp-sourcemaps/identity-map": "1.X", - "@gulp-sourcemaps/map-sources": "1.X", - "acorn": "5.X", - "convert-source-map": "1.X", - "css": "2.X", - "debug-fabulous": "1.X", - "detect-newline": "2.X", - "graceful-fs": "4.X", - "source-map": "~0.6.0", - "strip-bom-string": "1.X", - "through2": "2.X" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - } - } - }, - "gulp-typescript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-5.0.1.tgz", - "integrity": "sha512-YuMMlylyJtUSHG1/wuSVTrZp60k1dMEFKYOvDf7OvbAJWrDtxxD4oZon4ancdWwzjj30ztiidhe4VXJniF0pIQ==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.5", - "plugin-error": "^1.0.1", - "source-map": "^0.7.3", - "through2": "^3.0.0", - "vinyl": "^2.1.0", - "vinyl-fs": "^3.0.3" - }, - "dependencies": { - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - }, - "dependencies": { - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - } - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", - "dev": true, - "requires": { - "readable-stream": "2 || 3" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - } - }, - "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "handle-thing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "harmony-reflect": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", - "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", - "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", - "requires": { - "react-is": "^16.7.0" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "requires": { - "whatwg-encoding": "^1.0.1" - } - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true - }, - "html-escaper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", - "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==" - }, - "html-minifier-terser": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.0.4.tgz", - "integrity": "sha512-fHwmKQ+GzhlqdxEtwrqLT7MSuheiA+rif5/dZgbz3GjoMXJzcRzy1L9NXoiiyxrnap+q5guSiv8Tz5lrh9g42g==", - "dev": true, - "requires": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", - "he": "^1.2.0", - "param-case": "^3.0.3", - "relateurl": "^0.2.7", - "terser": "^4.6.3" - }, - "dependencies": { - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - } - } - }, - "html-webpack-plugin": { - "version": "4.0.0-beta.11", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz", - "integrity": "sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg==", - "dev": true, - "requires": { - "html-minifier-terser": "^5.0.1", - "loader-utils": "^1.2.3", - "lodash": "^4.17.15", - "pretty-error": "^2.1.1", - "tapable": "^1.1.3", - "util.promisify": "1.0.0" - } - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "dev": true, - "requires": { - "agent-base": "4", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "dev": true, - "requires": { - "postcss": "^6.0.1" - } - }, - "identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", - "dev": true, - "requires": { - "harmony-reflect": "^1.4.6" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true - }, - "immer": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", - "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==", - "dev": true - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "requires": { - "resolve-from": "^3.0.0" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "inquirer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", - "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "intl-format-cache": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/intl-format-cache/-/intl-format-cache-4.1.13.tgz", - "integrity": "sha512-d/1NI8ctPZsPJU3G6k0pIuydnebeck7hG+wIHJOJUJm3eZ2+3bcZCD34o/Mc18M5ZiEZei02xsMtp8g1IQc23A==" - }, - "intl-locales-supported": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/intl-locales-supported/-/intl-locales-supported-1.4.5.tgz", - "integrity": "sha512-D7oriM5x46rd7kNlSW0f9noIBegFr3ReIM6xlMpwH4lfIPD/zvBelPlCjR10IK16boGJG9lKccOvRAM8wzpbrA==" - }, - "intl-messageformat": { - "version": "6.1.9", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-6.1.9.tgz", - "integrity": "sha512-vnPujdP+gpWK/+GxWUo3nWRfrUj67/NAZoBNAyCvZ0fnfWh5jvIkKNr5ZZYewdZ7J3cEFLU6hYYgWztiCEFZGg==", - "requires": { - "intl-format-cache": "^4.1.13", - "intl-messageformat-parser": "^3.0.7" - } - }, - "intl-messageformat-parser": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-3.0.7.tgz", - "integrity": "sha512-L16VbbV3NFaiZV65XwOIH9fBe52TS2EkOR0k8Y4ratsgTE7KPEbcUCUrz/iEQwJo7BcWY4ohkZbeYZRgAiPR1Q==" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" - }, - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", - "dev": true - }, - "is": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", - "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", - "dev": true - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" - }, - "is-docker": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", - "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" - }, - "is-generator-function": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", - "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.1.0.tgz", - "integrity": "sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "requires": { - "has": "^1.0.1" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "dev": true - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "dev": true, - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - } - } - }, - "istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A==", - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-25.1.0.tgz", - "integrity": "sha512-FV6jEruneBhokkt9MQk0WUFoNTwnF76CLXtwNMfsc0um0TlB/LG2yxUd0KqaFjEJ9laQmVWQWS0sG/t2GsuI0w==", - "requires": { - "@jest/core": "^25.1.0", - "import-local": "^3.0.2", - "jest-cli": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "jest-cli": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.1.0.tgz", - "integrity": "sha512-p+aOfczzzKdo3AsLJlhs8J5EW6ffVidfSZZxXedJ0mHPBOln1DccqFmGCoO8JWd4xRycfmwy1eoQkMsF8oekPg==", - "requires": { - "@jest/core": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^15.0.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.1.0.tgz", - "integrity": "sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg==", - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^16.1.0" - } - } - } - }, - "jest-changed-files": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.1.0.tgz", - "integrity": "sha512-bdL1aHjIVy3HaBO3eEQeemGttsq1BDlHgWcOjEOIAcga7OOEGWHD2WSu8HhL7I1F0mFFyci8VKU4tRNk+qtwDA==", - "requires": { - "@jest/types": "^25.1.0", - "execa": "^3.2.0", - "throat": "^5.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "jest-config": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.1.0.tgz", - "integrity": "sha512-tLmsg4SZ5H7tuhBC5bOja0HEblM0coS3Wy5LTCb2C8ZV6eWLewHyK+3qSq9Bi29zmWQ7ojdCd3pxpx4l4d2uGw==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^25.1.0", - "@jest/types": "^25.1.0", - "babel-jest": "^25.1.0", - "chalk": "^3.0.0", - "glob": "^7.1.1", - "jest-environment-jsdom": "^25.1.0", - "jest-environment-node": "^25.1.0", - "jest-get-type": "^25.1.0", - "jest-jasmine2": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "micromatch": "^4.0.2", - "pretty-format": "^25.1.0", - "realpath-native": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", - "requires": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-docblock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.1.0.tgz", - "integrity": "sha512-370P/mh1wzoef6hUKiaMcsPtIapY25suP6JqM70V9RJvdKLrV4GaGbfUseUVk4FZJw4oTZ1qSCJNdrClKt5JQA==", - "requires": { - "detect-newline": "^3.0.0" - }, - "dependencies": { - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" - } - } - }, - "jest-each": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.1.0.tgz", - "integrity": "sha512-R9EL8xWzoPySJ5wa0DXFTj7NrzKpRD40Jy+zQDp3Qr/2QmevJgkN9GqioCGtAJ2bW9P/MQRznQHQQhoeAyra7A==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "jest-get-type": "^25.1.0", - "jest-util": "^25.1.0", - "pretty-format": "^25.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-environment-jsdom": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.1.0.tgz", - "integrity": "sha512-ILb4wdrwPAOHX6W82GGDUiaXSSOE274ciuov0lztOIymTChKFtC02ddyicRRCdZlB5YSrv3vzr1Z5xjpEe1OHQ==", - "requires": { - "@jest/environment": "^25.1.0", - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "jsdom": "^15.1.1" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/fake-timers": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.1.0.tgz", - "integrity": "sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ==", - "requires": { - "@jest/types": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "lolex": "^5.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", - "requires": { - "@jest/types": "^25.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-environment-jsdom-fourteen": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-1.0.1.tgz", - "integrity": "sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q==", - "dev": true, - "requires": { - "@jest/environment": "^24.3.0", - "@jest/fake-timers": "^24.3.0", - "@jest/types": "^24.3.0", - "jest-mock": "^24.0.0", - "jest-util": "^24.0.0", - "jsdom": "^14.1.0" - }, - "dependencies": { - "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", - "dev": true, - "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" - } - }, - "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - } - }, - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, - "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", - "dev": true - }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jsdom": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz", - "integrity": "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^6.0.4", - "acorn-globals": "^4.3.0", - "array-equal": "^1.0.0", - "cssom": "^0.3.4", - "cssstyle": "^1.1.1", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.0", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.1.3", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.5.0", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^6.1.2", - "xml-name-validator": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "jest-environment-node": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.1.0.tgz", - "integrity": "sha512-U9kFWTtAPvhgYY5upnH9rq8qZkj6mYLup5l1caAjjx9uNnkLHN2xgZy5mo4SyLdmrh/EtB9UPpKFShvfQHD0Iw==", - "requires": { - "@jest/environment": "^25.1.0", - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/fake-timers": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.1.0.tgz", - "integrity": "sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ==", - "requires": { - "@jest/types": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "lolex": "^5.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", - "requires": { - "@jest/types": "^25.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" - }, - "jest-haste-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.1.0.tgz", - "integrity": "sha512-/2oYINIdnQZAqyWSn1GTku571aAfs8NxzSErGek65Iu5o8JYb+113bZysRMcC/pjE5v9w0Yz+ldbj9NxrFyPyw==", - "requires": { - "@jest/types": "^25.1.0", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.3", - "jest-serializer": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": true - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-jasmine2": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.1.0.tgz", - "integrity": "sha512-GdncRq7jJ7sNIQ+dnXvpKO2MyP6j3naNK41DTTjEAhLEdpImaDA9zSAZwDhijjSF/D7cf4O5fdyUApGBZleaEg==", - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^25.1.0", - "@jest/source-map": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "co": "^4.6.0", - "expect": "^25.1.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "pretty-format": "^25.1.0", - "throat": "^5.0.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "diff-sequences": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", - "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-diff": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", - "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-matcher-utils": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", - "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", - "requires": { - "chalk": "^3.0.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-leak-detector": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.1.0.tgz", - "integrity": "sha512-3xRI264dnhGaMHRvkFyEKpDeaRzcEBhyNrOG5oT8xPxOyUAblIAQnpiR3QXu4wDor47MDTiHbiFcbypdLcLW5w==", - "requires": { - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - } - } - }, - "jest-matcher-utils": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", - "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", - "requires": { - "chalk": "^2.0.1", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", - "stack-utils": "^1.0.1" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-mock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - } - } - }, - "jest-pnp-resolver": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", - "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==" - }, - "jest-regex-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.1.0.tgz", - "integrity": "sha512-9lShaDmDpqwg+xAd73zHydKrBbbrIi08Kk9YryBEBybQFg/lBWR/2BDjjiSE7KIppM9C5+c03XiDaZ+m4Pgs1w==" - }, - "jest-resolve": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", - "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.1.0.tgz", - "integrity": "sha512-Cu/Je38GSsccNy4I2vL12ZnBlD170x2Oh1devzuM9TLH5rrnLW1x51lN8kpZLYTvzx9j+77Y5pqBaTqfdzVzrw==", - "requires": { - "@jest/types": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-snapshot": "^25.1.0" - } - }, - "jest-runner": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.1.0.tgz", - "integrity": "sha512-su3O5fy0ehwgt+e8Wy7A8CaxxAOCMzL4gUBftSs0Ip32S0epxyZPDov9Znvkl1nhVOJNf4UwAsnqfc3plfQH9w==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-config": "^25.1.0", - "jest-docblock": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-jasmine2": "^25.1.0", - "jest-leak-detector": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-runtime": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.1.0.tgz", - "integrity": "sha512-mpPYYEdbExKBIBB16ryF6FLZTc1Rbk9Nx0ryIpIMiDDkOeGa0jQOKVI/QeGvVGlunKKm62ywcioeFVzIbK03bA==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/source-map": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.3", - "jest-config": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "realpath-native": "^1.1.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.0.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@types/yargs": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.1.tgz", - "integrity": "sha512-sYlwNU7zYi6eZbMzFvG6eHD7VsEvFdoDtlD7eI1JTg7YNnuguzmiGsc6MPSq5l8n+h21AsNof0je+9sgOe4+dg==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", - "requires": { - "@jest/types": "^25.1.0" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.1.0.tgz", - "integrity": "sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg==", - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^16.1.0" - } - } - } - }, - "jest-serializer": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.1.0.tgz", - "integrity": "sha512-20Wkq5j7o84kssBwvyuJ7Xhn7hdPeTXndnwIblKDR2/sy1SUm6rWWiG9kSCgJPIfkDScJCIsTtOKdlzfIHOfKA==" - }, - "jest-snapshot": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.1.0.tgz", - "integrity": "sha512-xZ73dFYN8b/+X2hKLXz4VpBZGIAn7muD/DAg+pXtDzDGw3iIV10jM7WiHqhCcpDZfGiKEj7/2HXAEPtHTj0P2A==", - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "expect": "^25.1.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^25.1.0", - "semver": "^7.1.1" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "diff-sequences": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", - "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-diff": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", - "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-matcher-utils": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", - "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", - "requires": { - "chalk": "^3.0.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "semver": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.1.tgz", - "integrity": "sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-transform-css": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jest-transform-css/-/jest-transform-css-2.0.0.tgz", - "integrity": "sha512-KV5pD27qUltAVj0mZEVvqd+Ahe+WNPOVWKA1BRpIhBJ5OeUUOM46ivAznJrC5B1JrVNbMzWjPxnKl6QTsAAT3Q==", - "requires": { - "common-tags": "1.8.0", - "cosmiconfig": "5.0.6", - "cross-spawn": "6.0.5", - "postcss-load-config": "2.0.0", - "postcss-modules": "1.3.2", - "style-inject": "0.3.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.6.tgz", - "integrity": "sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ==", - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0" - } - } - } - }, - "jest-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", - "dev": true, - "requires": { - "@jest/console": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/source-map": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-validate": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.1.0.tgz", - "integrity": "sha512-kGbZq1f02/zVO2+t1KQGSVoCTERc5XeObLwITqC6BTRH3Adv7NZdYqCpKIZLUgpLXf2yISzQ465qOZpul8abXA==", - "requires": { - "@jest/types": "^25.1.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "jest-get-type": "^25.1.0", - "leven": "^3.1.0", - "pretty-format": "^25.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-watch-typeahead": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz", - "integrity": "sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.1", - "jest-regex-util": "^24.9.0", - "jest-watcher": "^24.3.0", - "slash": "^3.0.0", - "string-length": "^3.1.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", - "dev": true, - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-watcher": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", - "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", - "dev": true, - "requires": { - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "jest-util": "^24.9.0", - "string-length": "^2.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsdom": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", - "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", - "requires": { - "abab": "^2.0.0", - "acorn": "^7.1.0", - "acorn-globals": "^4.3.2", - "array-equal": "^1.0.0", - "cssom": "^0.4.1", - "cssstyle": "^2.0.0", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.1", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.2.0", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^7.0.0", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" - }, - "cssstyle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", - "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - } - } - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" - }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jsx-ast-utils": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", - "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "object.assign": "^4.1.0" - } - }, - "just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", - "dev": true - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - } - } - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" - }, - "last-call-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", - "dev": true, - "requires": { - "lodash": "^4.17.5", - "webpack-sources": "^1.1.0" - } - }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "dev": true, - "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "dev": true, - "requires": { - "flush-write-stream": "^1.0.2" - } - }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", - "dev": true - }, - "less": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", - "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", - "dev": true, - "requires": { - "clone": "^2.1.2", - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "mime": "^1.4.1", - "mkdirp": "^0.5.0", - "promise": "^7.1.1", - "request": "^2.83.0", - "source-map": "~0.6.0" - } - }, - "less-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", - "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "loader-utils": "^1.1.0", - "pify": "^3.0.0" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "dev": true, - "requires": { - "leven": "^3.1.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - }, - "dependencies": { - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - } - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "linkify-it": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.1.0.tgz", - "integrity": "sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg==", - "dev": true, - "requires": { - "uc.micro": "^1.0.1" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "loader-fs-cache": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz", - "integrity": "sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw==", - "dev": true, - "requires": { - "find-cache-dir": "^0.1.1", - "mkdirp": "0.5.1" - }, - "dependencies": { - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "^1.0.0" - } - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" - }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "loglevel": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", - "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==", - "dev": true - }, - "lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", - "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", - "dev": true, - "requires": { - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "dev": true, - "requires": { - "es5-ext": "~0.10.2" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==" - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "requires": { - "tmpl": "1.0.x" - } - }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", - "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "entities": "~1.1.1", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - } - }, - "matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "dev": true, - "requires": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - } - } - }, - "memoizee": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", - "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.45", - "es6-weak-map": "^2.0.2", - "event-emitter": "^0.3.5", - "is-promise": "^2.1", - "lru-queue": "0.1", - "next-tick": "1", - "timers-ext": "^0.1.5" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true - }, - "merge-deep": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", - "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "clone-deep": "^0.2.4", - "kind-of": "^3.0.2" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", - "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "microevent.ts": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", - "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "requires": { - "mime-db": "1.40.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" - }, - "min-indent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz", - "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=" - }, - "mini-css-extract-plugin": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", - "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "minipass": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", - "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", - "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mixin-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", - "dev": true, - "requires": { - "for-in": "^0.1.3", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-in": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", - "dev": true - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, - "mocha": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.1.4.tgz", - "integrity": "sha512-PN8CIy4RXsIoxoFJzS4QNnCH4psUCPWc4/rPrst/ecSJJbLBkubMiyGCP2Kj/9YnWbotFqAoeXyXMucj7gwCFg==", - "dev": true, - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.2.2", - "yargs-parser": "13.0.0", - "yargs-unparser": "1.5.0" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" - } - }, - "yargs-parser": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", - "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" - } - }, - "mute-stdout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "no-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", - "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", - "dev": true, - "requires": { - "lower-case": "^2.0.1", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "node-abi": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.15.0.tgz", - "integrity": "sha512-FeLpTS0F39U7hHZU1srAK4Vx+5AHNVOTP+hxBNQknR/54laTHSFIJkDWDqiquY1LeLUgTfPN7sLPhMubx0PLAg==", - "requires": { - "semver": "^5.4.1" - } - }, - "node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" - }, - "node-libs-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", - "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - } - } - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" - }, - "node-notifier": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", - "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.1.1", - "semver": "^6.3.0", - "shellwords": "^0.1.1", - "which": "^1.3.1" - }, - "dependencies": { - "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", - "optional": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "optional": true - } - } - }, - "node-releases": { - "version": "1.1.49", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.49.tgz", - "integrity": "sha512-xH8t0LS0disN0mtRCh+eByxFPie+msJUBL/lJDBuap53QGiYPa9joh83K4pCZgWJ+2L4b9h88vCVdXQ60NO2bg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "noop-logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, - "now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "dev": true, - "requires": { - "once": "^1.3.2" - } - }, - "npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "object-hash": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", - "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==", - "dev": true - }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true - }, - "object-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", - "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object-path": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", - "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "object.entries": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", - "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "object.fromentries": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", - "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } - }, - "object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "office-ui-fabric-react": { - "version": "7.105.12", - "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-7.105.12.tgz", - "integrity": "sha512-PUmhth8szgLzR6xoN4HkPA0aIahpYr6/sU5oPob5zPRXB2JrhOCnCL9lFsL7/xU0lCFf/OAdoH+ARvF8DcAa0w==", - "requires": { - "@fluentui/react-focus": "^7.1.13", - "@microsoft/load-themed-styles": "^1.10.26", - "@uifabric/foundation": "^7.5.25", - "@uifabric/icons": "^7.3.24", - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/react-hooks": "^7.1.2", - "@uifabric/set-version": "^7.0.9", - "@uifabric/styling": "^7.11.2", - "@uifabric/utilities": "^7.15.5", - "prop-types": "^15.7.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "on-error-resume-next": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-error-resume-next/-/on-error-resume-next-1.1.0.tgz", - "integrity": "sha512-XhWMbmKV0+W95yLJjT1Z9zdkKiPUjDn63YYsji1pdvKqaa7pq4coeHaHEXPsa36SFlffOyOlPK/0rn6Njfb+LA==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "requires": { - "is-wsl": "^1.1.0" - } - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "optimize-css-assets-webpack-plugin": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", - "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", - "dev": true, - "requires": { - "cssnano": "^4.1.10", - "last-call-webpack-plugin": "^3.0.0" - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz", - "integrity": "sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M=" - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-each-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", - "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", - "dev": true - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", - "dev": true - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "param-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz", - "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==", - "dev": true, - "requires": { - "dot-case": "^3.0.3", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - } - } - }, - "parse-asn1": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", - "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parse-semver": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", - "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=", - "dev": true, - "requires": { - "semver": "^5.1.0" - } - }, - "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" - }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascal-case": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", - "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", - "dev": true, - "requires": { - "no-case": "^3.0.3", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "~2.3" - } - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "picomatch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", - "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==" - }, - "pidtree": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", - "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - } - } - }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" - }, - "pnp-webpack-plugin": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.0.tgz", - "integrity": "sha512-ZcMGn/xF/fCOq+9kWMP9vVVxjIkMCja72oy3lziR7UHy0hHFZ57iVpQ71OtveVbmzeCmphBg8pxNdk/hlK99aQ==", - "dev": true, - "requires": { - "ts-pnp": "^1.1.2" - } - }, - "portfinder": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", - "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.1" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-attribute-case-insensitive": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", - "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^6.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-browser-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", - "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", - "dev": true, - "requires": { - "postcss": "^7" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-calc": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", - "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", - "dev": true, - "requires": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", - "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-functional-notation": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", - "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-gray": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", - "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-hex-alpha": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", - "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", - "dev": true, - "requires": { - "postcss": "^7.0.14", - "postcss-values-parser": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-mod-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", - "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-rebeccapurple": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", - "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-custom-media": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", - "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-custom-properties": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", - "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", - "dev": true, - "requires": { - "postcss": "^7.0.17", - "postcss-values-parser": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-custom-selectors": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", - "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-dir-pseudo-class": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", - "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-double-position-gradients": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", - "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", - "dev": true, - "requires": { - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-env-function": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", - "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-flexbugs-fixes": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz", - "integrity": "sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-focus-visible": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", - "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-focus-within": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", - "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-font-variant": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz", - "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-gap-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", - "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-image-set-function": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", - "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-initial": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", - "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", - "dev": true, - "requires": { - "lodash.template": "^4.5.0", - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-lab-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", - "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", - "requires": { - "cosmiconfig": "^4.0.0", - "import-cwd": "^2.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" - } - } - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-logical": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", - "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-media-minmax": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", - "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", - "dev": true, - "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-1.3.2.tgz", - "integrity": "sha512-QujH5ZpPtr1fBWTKDa43Hx45gm7p19aEtHaAtkMCBZZiB/D5za2wXSMtAf94tDUZHF3F5KZcTXISUNqgEQRiDw==", - "requires": { - "css-modules-loader-core": "^1.1.0", - "generic-names": "^1.0.3", - "lodash.camelcase": "^4.3.0", - "postcss": "^7.0.1", - "string-hash": "^1.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.26.tgz", - "integrity": "sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", - "dev": true, - "requires": { - "postcss": "^6.0.1" - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - } - }, - "postcss-nesting": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", - "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", - "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", - "dev": true, - "requires": { - "@csstools/normalize.css": "^10.1.0", - "browserslist": "^4.6.2", - "postcss": "^7.0.17", - "postcss-browser-comments": "^3.0.0", - "sanitize.css": "^10.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", - "dev": true, - "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", - "dev": true, - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-overflow-shorthand": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", - "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-page-break": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", - "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-place": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", - "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-preset-env": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", - "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", - "dev": true, - "requires": { - "autoprefixer": "^9.6.1", - "browserslist": "^4.6.4", - "caniuse-lite": "^1.0.30000981", - "css-blank-pseudo": "^0.1.4", - "css-has-pseudo": "^0.10.0", - "css-prefers-color-scheme": "^3.1.1", - "cssdb": "^4.4.0", - "postcss": "^7.0.17", - "postcss-attribute-case-insensitive": "^4.0.1", - "postcss-color-functional-notation": "^2.0.1", - "postcss-color-gray": "^5.0.0", - "postcss-color-hex-alpha": "^5.0.3", - "postcss-color-mod-function": "^3.0.3", - "postcss-color-rebeccapurple": "^4.0.1", - "postcss-custom-media": "^7.0.8", - "postcss-custom-properties": "^8.0.11", - "postcss-custom-selectors": "^5.1.2", - "postcss-dir-pseudo-class": "^5.0.0", - "postcss-double-position-gradients": "^1.0.0", - "postcss-env-function": "^2.0.2", - "postcss-focus-visible": "^4.0.0", - "postcss-focus-within": "^3.0.0", - "postcss-font-variant": "^4.0.0", - "postcss-gap-properties": "^2.0.0", - "postcss-image-set-function": "^3.0.1", - "postcss-initial": "^3.0.0", - "postcss-lab-function": "^2.0.1", - "postcss-logical": "^3.0.0", - "postcss-media-minmax": "^4.0.0", - "postcss-nesting": "^7.0.0", - "postcss-overflow-shorthand": "^2.0.0", - "postcss-page-break": "^2.0.0", - "postcss-place": "^4.0.1", - "postcss-pseudo-class-any-link": "^6.0.0", - "postcss-replace-overflow-wrap": "^3.0.0", - "postcss-selector-matches": "^4.0.0", - "postcss-selector-not": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-pseudo-class-any-link": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", - "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-replace-overflow-wrap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", - "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-safe-parser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz", - "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-selector-matches": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", - "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-selector-not": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz", - "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "dependencies": { - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - } - } - }, - "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", - "dev": true, - "requires": { - "is-svg": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "prebuild-install": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.3.tgz", - "integrity": "sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==", - "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.7.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true - }, - "pretty-bytes": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", - "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==", - "dev": true - }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "dev": true, - "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" - } - }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", - "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/yargs": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.6.tgz", - "integrity": "sha512-IkltIncDQWv6fcAvnHtJ6KtkmY/vtR3bViOaCzpj/A3yNhlfZAgxNe6AEQD1cQrkYD+YsKVo08DSxvNKEsD7BA==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - } - } - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "optional": true, - "requires": { - "asap": "~2.0.3" - } - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "prompts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz", - "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==", - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.3" - } - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "psl": { - "version": "1.1.32", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.32.tgz", - "integrity": "sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==" - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", - "dev": true - }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dev": true, - "requires": { - "performance-now": "^2.1.0" - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "react": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", - "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - } - }, - "react-app-polyfill": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz", - "integrity": "sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g==", - "dev": true, - "requires": { - "core-js": "^3.5.0", - "object-assign": "^4.1.1", - "promise": "^8.0.3", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.3", - "whatwg-fetch": "^3.0.0" - }, - "dependencies": { - "promise": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.3.tgz", - "integrity": "sha512-HeRDUL1RJiLhyA0/grn+PTShlBAcLuh/1BJGtrvjwbvRDCTLLMEz9rOGCV+R3vHY4MixIuoMEd9Yq/XvsTPcjw==", - "dev": true, - "requires": { - "asap": "~2.0.6" - } - }, - "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", - "dev": true - } - } - }, - "react-dev-utils": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.2.0.tgz", - "integrity": "sha512-MwrvQW2TFjLblhqpDNeqCXHBkz3G5vc7k4wntgutAJZX4ia3o07eGKo6uYGhUOeJ0hfOxcpJFNFk7+4XCc1S8g==", - "dev": true, - "requires": { - "@babel/code-frame": "7.8.3", - "address": "1.1.2", - "browserslist": "4.8.6", - "chalk": "2.4.2", - "cross-spawn": "7.0.1", - "detect-port-alt": "1.1.6", - "escape-string-regexp": "2.0.0", - "filesize": "6.0.1", - "find-up": "4.1.0", - "fork-ts-checker-webpack-plugin": "3.1.1", - "global-modules": "2.0.0", - "globby": "8.0.2", - "gzip-size": "5.1.1", - "immer": "1.10.0", - "inquirer": "7.0.4", - "is-root": "2.1.0", - "loader-utils": "1.2.3", - "open": "^7.0.2", - "pkg-up": "3.1.0", - "react-error-overlay": "^6.0.6", - "recursive-readdir": "2.2.2", - "shell-quote": "1.7.2", - "strip-ansi": "6.0.0", - "text-table": "0.2.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "browserslist": { - "version": "4.8.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.6.tgz", - "integrity": "sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001023", - "electron-to-chromium": "^1.3.341", - "node-releases": "^1.1.47" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } - } - }, - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "open": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.2.tgz", - "integrity": "sha512-70E/pFTPr7nZ9nLDPNTcj3IVqnNvKuP4VsBmoKV9YGTnChe0mlS3C4qM7qKarhZ8rGaHKLfo+vBTHXDp6ZSyLQ==", - "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "react-dom": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", - "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.18.0" - } - }, - "react-error-overlay": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.6.tgz", - "integrity": "sha512-Yzpno3enVzSrSCnnljmr4b/2KUQSMZaPuqmS26t9k4nW7uwJk6STWmH9heNjPuvqUTO3jOSPkHoKgO4+Dw7uIw==", - "dev": true - }, - "react-intl": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-3.1.9.tgz", - "integrity": "sha512-mQxhcFsYsj7O+k2Gsf1p+QaGhEdr+g7v5hYaa88dqar1m1xdWldEJjZ4JK/waHTp4zhVPoco4NQ1JdPkhs8HkA==", - "requires": { - "@formatjs/intl-relativetimeformat": "^2.6.3", - "@types/hoist-non-react-statics": "^3.3.1", - "@types/invariant": "^2.2.30", - "hoist-non-react-statics": "^3.3.0", - "intl-format-cache": "^4.1.10", - "intl-locales-supported": "^1.4.5", - "intl-messageformat": "^6.1.6", - "intl-messageformat-parser": "^3.0.7", - "invariant": "^2.1.1", - "shallow-equal": "^1.1.0" - } - }, - "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==" - }, - "react-scripts": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.0.tgz", - "integrity": "sha512-pBqaAroFoHnFAkuX+uSK9Th1uEh2GYdGY2IG1I9/7HmuEf+ls3lLCk1p2GFYRSrLMz6ieQR/SyN6TLIGK3hKRg==", - "dev": true, - "requires": { - "@babel/core": "7.8.4", - "@svgr/webpack": "4.3.3", - "@typescript-eslint/eslint-plugin": "^2.10.0", - "@typescript-eslint/parser": "^2.10.0", - "babel-eslint": "10.0.3", - "babel-jest": "^24.9.0", - "babel-loader": "8.0.6", - "babel-plugin-named-asset-import": "^0.3.6", - "babel-preset-react-app": "^9.1.1", - "camelcase": "^5.3.1", - "case-sensitive-paths-webpack-plugin": "2.3.0", - "css-loader": "3.4.2", - "dotenv": "8.2.0", - "dotenv-expand": "5.1.0", - "eslint": "^6.6.0", - "eslint-config-react-app": "^5.2.0", - "eslint-loader": "3.0.3", - "eslint-plugin-flowtype": "4.6.0", - "eslint-plugin-import": "2.20.0", - "eslint-plugin-jsx-a11y": "6.2.3", - "eslint-plugin-react": "7.18.0", - "eslint-plugin-react-hooks": "^1.6.1", - "file-loader": "4.3.0", - "fs-extra": "^8.1.0", - "fsevents": "2.1.2", - "html-webpack-plugin": "4.0.0-beta.11", - "identity-obj-proxy": "3.0.0", - "jest": "24.9.0", - "jest-environment-jsdom-fourteen": "1.0.1", - "jest-resolve": "24.9.0", - "jest-watch-typeahead": "0.4.2", - "mini-css-extract-plugin": "0.9.0", - "optimize-css-assets-webpack-plugin": "5.0.3", - "pnp-webpack-plugin": "1.6.0", - "postcss-flexbugs-fixes": "4.1.0", - "postcss-loader": "3.0.0", - "postcss-normalize": "8.0.1", - "postcss-preset-env": "6.7.0", - "postcss-safe-parser": "4.0.1", - "react-app-polyfill": "^1.0.6", - "react-dev-utils": "^10.2.0", - "resolve": "1.15.0", - "resolve-url-loader": "3.1.1", - "sass-loader": "8.0.2", - "semver": "6.3.0", - "style-loader": "0.23.1", - "terser-webpack-plugin": "2.3.4", - "ts-pnp": "1.1.5", - "url-loader": "2.3.0", - "webpack": "4.41.5", - "webpack-dev-server": "3.10.2", - "webpack-manifest-plugin": "2.2.0", - "workbox-webpack-plugin": "4.3.1" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@jest/core": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", - "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/reporters": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.9.0", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-resolve-dependencies": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "jest-watcher": "^24.9.0", - "micromatch": "^3.1.10", - "p-each-series": "^1.0.0", - "realpath-native": "^1.1.0", - "rimraf": "^2.5.4", - "slash": "^2.0.0", - "strip-ansi": "^5.0.0" - } - }, - "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", - "dev": true, - "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" - } - }, - "@jest/reporters": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", - "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^2.0.2", - "istanbul-lib-instrument": "^3.0.1", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.2.6", - "jest-haste-map": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "node-notifier": "^5.4.2", - "slash": "^2.0.0", - "source-map": "^0.6.0", - "string-length": "^2.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@jest/test-sequencer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", - "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", - "dev": true, - "requires": { - "@jest/test-result": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0" - } - }, - "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - }, - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "babel-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", - "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", - "dev": true, - "requires": { - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.9.0", - "chalk": "^2.4.2", - "slash": "^2.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", - "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", - "dev": true, - "requires": { - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", - "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", - "dev": true, - "requires": { - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "css-loader": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", - "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.23", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.1.1", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.0.2", - "schema-utils": "^2.6.0" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "expect": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", - "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "ansi-styles": "^3.2.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.9.0" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "find-cache-dir": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", - "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.0", - "pkg-dir": "^4.1.0" - }, - "dependencies": { - "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - } - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "dev": true, - "optional": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0" - } - }, - "jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", - "dev": true, - "requires": { - "import-local": "^2.0.0", - "jest-cli": "^24.9.0" - }, - "dependencies": { - "jest-cli": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", - "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", - "dev": true, - "requires": { - "@jest/core": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "import-local": "^2.0.0", - "is-ci": "^2.0.0", - "jest-config": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^13.3.0" - } - } - } - }, - "jest-changed-files": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", - "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "execa": "^1.0.0", - "throat": "^4.0.0" - } - }, - "jest-config": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", - "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.9.0", - "@jest/types": "^24.9.0", - "babel-jest": "^24.9.0", - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^24.9.0", - "jest-environment-node": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "micromatch": "^3.1.10", - "pretty-format": "^24.9.0", - "realpath-native": "^1.1.0" - } - }, - "jest-docblock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", - "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", - "dev": true, - "requires": { - "detect-newline": "^2.1.0" - } - }, - "jest-each": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", - "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-environment-jsdom": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", - "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0", - "jsdom": "^11.5.1" - } - }, - "jest-environment-node": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", - "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0" - } - }, - "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, - "dependencies": { - "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": false, - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": false, - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.3", - "resolved": false, - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": false, - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "resolved": false, - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": false, - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": false, - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": false, - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": false, - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": false, - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": false, - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "resolved": false, - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": false, - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": false, - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": false, - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "resolved": false, - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": false, - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": false, - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.2", - "resolved": false, - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "optional": true - }, - "needle": { - "version": "2.4.0", - "resolved": false, - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "resolved": false, - "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": false, - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.7", - "resolved": false, - "integrity": "sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": false, - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": false, - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": false, - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": false, - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": false, - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": false, - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": false, - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": false, - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": false, - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "resolved": false, - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": false, - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "resolved": false, - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": false, - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "resolved": false, - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "optional": true - } - } - } - } - }, - "jest-jasmine2": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", - "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^24.9.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0", - "throat": "^4.0.0" - } - }, - "jest-leak-detector": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", - "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", - "dev": true, - "requires": { - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, - "jest-resolve-dependencies": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", - "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.9.0" - } - }, - "jest-runner": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", - "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.4.2", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-leak-detector": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "source-map-support": "^0.5.6", - "throat": "^4.0.0" - } - }, - "jest-runtime": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", - "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "strip-bom": "^3.0.0", - "yargs": "^13.3.0" - } - }, - "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", - "dev": true - }, - "jest-snapshot": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", - "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "expect": "^24.9.0", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^24.9.0", - "semver": "^6.2.0" - } - }, - "jest-validate": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", - "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "camelcase": "^5.3.1", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "leven": "^3.1.0", - "pretty-format": "^24.9.0" - } - }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", - "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - } - }, - "node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", - "dev": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "p-each-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", - "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", - "dev": true, - "requires": { - "p-reduce": "^1.0.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "postcss-modules-local-by-default": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", - "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", - "dev": true, - "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.16", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.0" - } - }, - "postcss-modules-scope": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz", - "integrity": "sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - } - }, - "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", - "dev": true, - "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" - } - }, - "postcss-value-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", - "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "resolve": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", - "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "terser-webpack-plugin": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.4.tgz", - "integrity": "sha512-Nv96Nws2R2nrFOpbzF6IxRDpIkkIfmhvOws+IqMvYdFLO7o6wAILWFKONFgaYy8+T4LVz77DQW0f7wOeDEAjrg==", - "dev": true, - "requires": { - "cacache": "^13.0.1", - "find-cache-dir": "^3.2.0", - "jest-worker": "^25.1.0", - "p-limit": "^2.2.2", - "schema-utils": "^2.6.4", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.4.3", - "webpack-sources": "^1.4.3" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "webpack": { - "version": "4.41.5", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", - "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.0", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - }, - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - } - } - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "react-test-renderer": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.12.0.tgz", - "integrity": "sha512-Vj/teSqt2oayaWxkbhQ6gKis+t5JrknXfPVo+aIJ8QwYAqMPH77uptOdrlphyxl8eQI/rtkOYg86i/UWkpFu0w==", - "requires": { - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "react-is": "^16.8.6", - "scheduler": "^0.18.0" - }, - "dependencies": { - "scheduler": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", - "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - } - } - }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "dev": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", - "requires": { - "util.promisify": "^1.0.0" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", - "dev": true, - "requires": { - "minimatch": "3.0.4" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" - }, - "regenerate-unicode-properties": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", - "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" - }, - "regenerator-transform": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", - "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", - "dev": true, - "requires": { - "private": "^0.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regex-parser": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", - "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "regexpp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", - "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", - "dev": true - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "~0.5.0" - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - } - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dev": true, - "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "renderkid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", - "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", - "dev": true, - "requires": { - "css-select": "^1.1.0", - "dom-converter": "^0.2", - "htmlparser2": "^3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" - }, - "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - } - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", - "requires": { - "lodash": "^4.17.11" - } - }, - "request-promise-native": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", - "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", - "requires": { - "request-promise-core": "1.1.2", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", - "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "dependencies": { - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - } - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - }, - "resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "dev": true, - "requires": { - "value-or-function": "^3.0.0" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "resolve-url-loader": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz", - "integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==", - "dev": true, - "requires": { - "adjust-sourcemap-loader": "2.0.0", - "camelcase": "5.3.1", - "compose-function": "3.0.3", - "convert-source-map": "1.7.0", - "es6-iterator": "2.0.3", - "loader-utils": "1.2.3", - "postcss": "7.0.21", - "rework": "1.0.1", - "rework-visit": "1.0.0", - "source-map": "0.6.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "dev": true, - "requires": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - }, - "dependencies": { - "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", - "dev": true - } - } - }, - "rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", - "dev": true - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, - "rimraf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", - "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rsvp": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.4.tgz", - "integrity": "sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA==" - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - } - }, - "sanitize.css": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", - "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==", - "dev": true - }, - "sass-loader": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", - "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "loader-utils": "^1.2.3", - "neo-async": "^2.6.1", - "schema-utils": "^2.6.1", - "semver": "^6.3.0" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "saxes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.9.tgz", - "integrity": "sha512-FZeKhJglhJHk7eWG5YM0z46VHmI3KJpMBAQm3xa9meDvd+wevB5GuBB0wc0exPInZiBBHqi00DbS8AcvCGCFMw==", - "requires": { - "xmlchars": "^1.3.1" - } - }, - "scheduler": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", - "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", - "dev": true, - "requires": { - "node-forge": "0.9.0" - } - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" - }, - "semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", - "dev": true, - "requires": { - "sver-compat": "^1.5.0" - } - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - } - } - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, - "serialport": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/serialport/-/serialport-8.0.7.tgz", - "integrity": "sha512-R9bfNebs2dblYf5sD/Aaa7j8+siP4X7TGT02lqHM9DF5fyjlrPGXmsLw9+LKOz1AvjGjkxf2NzBVnDpqRX7clQ==", - "requires": { - "@serialport/binding-mock": "^8.0.6", - "@serialport/bindings": "^8.0.7", - "@serialport/parser-byte-length": "^8.0.6", - "@serialport/parser-cctalk": "^8.0.6", - "@serialport/parser-delimiter": "^8.0.6", - "@serialport/parser-readline": "^8.0.6", - "@serialport/parser-ready": "^8.0.6", - "@serialport/parser-regex": "^8.0.6", - "@serialport/stream": "^8.0.6", - "debug": "^4.1.1" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-clone": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", - "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", - "dev": true, - "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^2.0.1", - "lazy-cache": "^0.2.3", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", - "dev": true, - "requires": { - "is-buffer": "^1.0.2" - } - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", - "dev": true - } - } - }, - "shallow-equal": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.0.tgz", - "integrity": "sha512-Z21pVxR4cXsfwpMKMhCEIO1PCi5sp7KEp+CmOpBQ+E8GpHwKOw2sEzk7sgblM3d/j4z4gakoWEoPcjK0VJQogA==" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "dev": true, - "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } - }, - "shelljs": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.7.tgz", - "integrity": "sha1-svXHfvlxSPS09uImguELuoZnz/E=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" - }, - "simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - } - } - }, - "sisteransi": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", - "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==" - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - } - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - } - }, - "socket.io": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.0.tgz", - "integrity": "sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ==", - "requires": { - "debug": "~4.1.0", - "engine.io": "~3.5.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.4.0", - "socket.io-parser": "~3.4.0" - } - }, - "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" - }, - "socket.io-client": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", - "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "engine.io-client": "~3.5.0", - "has-binary2": "~1.0.2", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "socket.io-parser": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", - "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", - "requires": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" - } - } - } - }, - "socket.io-parser": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", - "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", - "requires": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - } - } - }, - "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", - "dev": true, - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" - } - }, - "sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", - "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", - "dev": true, - "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", - "dev": true - }, - "spdy": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", - "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", - "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "minipass": "^3.1.1" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - }, - "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==" - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", - "dev": true - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "streamfilter": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz", - "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=" - }, - "string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", - "dev": true, - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string.prototype.padend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", - "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.4.3", - "function-bind": "^1.0.2" - } - }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dev": true, - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "dependencies": { - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", - "dev": true - }, - "strip-comments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", - "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", - "dev": true, - "requires": { - "babel-extract-comments": "^1.0.0", - "babel-plugin-transform-object-rest-spread": "^6.26.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "style-inject": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", - "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==" - }, - "style-loader": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.21.0.tgz", - "integrity": "sha512-T+UNsAcl3Yg+BsPKs1vd22Fr8sVT+CJMtzqc6LEw9bbJZb43lm9GoeIfUcDEefBSWC0BhYbcdupV1GtI4DGzxg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^0.4.5" - }, - "dependencies": { - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "supports-hyperlinks": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.0.0.tgz", - "integrity": "sha512-bFhn0MQ8qefLyJ3K7PpHiPUTuTVPWw6RXfaMeV6xgJLXtBbszyboz1bvGTVv4R0YpQm2DqlXXn0fFHhxUHVE5w==", - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "dev": true, - "requires": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "svg-inline-react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/svg-inline-react/-/svg-inline-react-3.1.0.tgz", - "integrity": "sha512-c39AIRQOUXLMD8fQ2rHmK1GOSO3tVuZk61bAXqIT05uhhm3z4VtQFITQSwyhL0WA2uxoJAIhPd2YV0CYQOolSA==", - "requires": { - "prop-types": "^15.5.0" - } - }, - "svg-parser": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.3.tgz", - "integrity": "sha512-fnCWiifNhK8i2Z7b9R5tbNahpxrRdAaQbnoxKlT2KrSCj9Kq/yBSgulCRgBJRhy1dPnSY5slg5ehPUnzpEcHlg==", - "dev": true - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "symbol-tree": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "tar-fs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", - "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", - "requires": { - "chownr": "^1.1.1", - "mkdirp": "^0.5.1", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - } - }, - "tar-stream": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", - "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", - "requires": { - "bl": "^4.0.1", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "dependencies": { - "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "requires": { - "type-fest": "^0.8.1" - } - } - } - }, - "terser": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - }, - "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "terser": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } - } - }, - "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "dev": true, - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "dev": true, - "requires": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" - }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - } - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "dev": true, - "requires": { - "through2": "^2.0.3" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "requires": { - "punycode": "^2.1.0" - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - }, - "ts-import-plugin": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/ts-import-plugin/-/ts-import-plugin-1.5.5.tgz", - "integrity": "sha512-i0ULERaX+vycmASUeJFbAqx+KeMBAH+iFaSim+U9t05DxK+ZGpMCHT18zTRzTEh1dA6OWsHzVZmHgFKh5UTKUA==", - "dev": true, - "requires": { - "tslib": "^1.9.2" - } - }, - "ts-jest": { - "version": "25.0.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-25.0.0.tgz", - "integrity": "sha512-F+hZg3j7XYOFpXJteXb4lnqy7vQzTmpTmX7AJT6pvSGeZejyXj1Lk0ArpnrEPOpv6Zu/NugHc5W7FINngC9WZQ==", - "requires": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "mkdirp": "0.x", - "resolve": "1.x", - "semver": "^5.5", - "yargs-parser": "10.x" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "ts-loader": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-4.5.0.tgz", - "integrity": "sha512-ihgVaSmgrX4crGV4n7yuoHPoCHbDzj9aepCZR9TgIx4SgJ9gdnB6xLHgUBb7bsFM/f0K6x9iXa65KY/Fu1Klkw==", - "dev": true, - "requires": { - "chalk": "^2.3.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^1.0.2", - "micromatch": "^3.1.4", - "semver": "^5.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "ts-pnp": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.5.tgz", - "integrity": "sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA==", - "dev": true - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - }, - "tslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz", - "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^3.2.0", - "glob": "^7.1.1", - "js-yaml": "^3.13.0", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tslint-config-prettier": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz", - "integrity": "sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==", - "dev": true - }, - "tslint-microsoft-contrib": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-6.2.0.tgz", - "integrity": "sha512-6tfi/2tHqV/3CL77pULBcK+foty11Rr0idRDxKnteTaKm6gWF9qmaCNU17HVssOuwlYNyOmd9Jsmjd+1t3a3qw==", - "dev": true, - "requires": { - "tsutils": "^2.27.2 <2.29.0" - }, - "dependencies": { - "tsutils": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz", - "integrity": "sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tslint-react": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/tslint-react/-/tslint-react-3.6.0.tgz", - "integrity": "sha512-AIv1QcsSnj7e9pFir6cJ6vIncTqxfqeFF3Lzh8SuuBljueYzEAtByuB6zMaD27BL0xhMEqsZ9s5eHuCONydjBw==", - "dev": true, - "requires": { - "tsutils": "^2.13.1" - }, - "dependencies": { - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tslint-react-hooks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslint-react-hooks/-/tslint-react-hooks-2.1.0.tgz", - "integrity": "sha512-ccjyguEHGEU5rXikLDaQ6kT1AVo3C0HV8gi2MIJc7SbYAXjbzJkpbs4IXulgfqdEY1T6RnNSuGhyXg+2jTm5Bg==", - "dev": true - }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", - "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/type/-/type-1.0.1.tgz", - "integrity": "sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw==", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typed-rest-client": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.2.0.tgz", - "integrity": "sha512-FrUshzZ1yxH8YwGR29PWWnfksLEILbWJydU7zfIRkyH7kAEzB62uMAl2WY6EyolWpLpVHeJGgQm45/MaruaHpw==", - "dev": true, - "requires": { - "tunnel": "0.0.4", - "underscore": "1.8.3" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", - "dev": true - }, - "typescript-react-intl": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/typescript-react-intl/-/typescript-react-intl-0.4.0.tgz", - "integrity": "sha512-sCQN2YdWSaWNAK9bBezmqZStswfh0MMWQnIlBOn+iFBN4fE1m36fv1zqUaw33jTbQUjIaZ4N+NFbMfS/cnyIew==", - "dev": true, - "requires": { - "typescript": "^2.6.2" - }, - "dependencies": { - "typescript": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", - "dev": true - } - } - }, - "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true - }, - "undertaker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", - "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - } - }, - "undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", - "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", - "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "dev": true, - "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } - } - }, - "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-join": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", - "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=", - "dev": true - }, - "url-loader": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", - "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "mime": "^2.4.4", - "schema-utils": "^2.5.0" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } - } - }, - "url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "usb-detection": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/usb-detection/-/usb-detection-4.7.0.tgz", - "integrity": "sha512-HE9y5uYfA2ebVo64BrIB0OVNaVKZ2oWkadpTItCi4YQXyZ9vD0705iqQ3B7Rz8xevcrW/RNg/85E2o2JoPFmsQ==", - "requires": { - "bindings": "^1.3.0", - "eventemitter2": "^5.0.1", - "nan": "^2.13.2", - "prebuild-install": "^5.1.0" - } - }, - "usb-native": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/usb-native/-/usb-native-5.0.1.tgz", - "integrity": "sha512-FuKUVJmzgo7I6jclH0fCLuQLuOTg3jzzDvQwFgFWJM5Qe1L09snrl84adFCNvE/LGbCCCa4XjLuGGIgB7+zGQA==", - "requires": { - "fs-extra": "^8.1.0", - "serialport": "^8.0.7", - "usb-detection": "^4.7.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "util": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.1.tgz", - "integrity": "sha512-MREAtYOp+GTt9/+kwf00IYoHZyjM8VU4aVrkzUlejyqaIjd2GztVl5V9hGXKlvBKE3gENn/FMfHE5v6hElXGcQ==", - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "object.entries": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - }, - "v8-compile-cache": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", - "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", - "dev": true - }, - "v8-to-istanbul": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.0.1.tgz", - "integrity": "sha512-x0yZvZAkjJwdD3fPiJzYP37aod0ati4LlmD2RmpKjqewjKAov/u/ytZ8ViIZb07cN4cePKzl9ijiUi7C1LQ8hQ==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } - } - }, - "v8flags": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", - "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "version-from-git": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/version-from-git/-/version-from-git-1.1.1.tgz", - "integrity": "sha512-R8kAZ+EFJcqG5HGrfjk7bSBAWKB3AE/Dnh21llvNg6CWJIPJAKsYNLR7lvYrCwu33A3TU4UljPLpp577UxgL3w==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "commander": "^2.15.1", - "cross-spawn": "^6.0.5", - "git-rev-sync": "^1.12.0", - "on-error-resume-next": "^1.0.0", - "semver": "^5.5.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - } - }, - "vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "dev": true, - "requires": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "vsce": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.62.0.tgz", - "integrity": "sha512-KXtPBsdC0K27hmDksINyjoRl9BiuTB+ntmoJEDbbO3GIc+L3wfOclaSy8iYqddnpSA33YDkhKzKXhT0JGzrG/A==", - "dev": true, - "requires": { - "azure-devops-node-api": "^7.2.0", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.1", - "commander": "^2.8.1", - "denodeify": "^1.2.1", - "glob": "^7.0.6", - "lodash": "^4.17.10", - "markdown-it": "^8.3.1", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "osenv": "^0.1.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "semver": "^5.1.0", - "tmp": "0.0.29", - "typed-rest-client": "1.2.0", - "url-join": "^1.1.0", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tmp": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", - "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.1" - } - } - } - }, - "vscode-extension-telemetry": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.1.1.tgz", - "integrity": "sha512-TkKKG/B/J94DP5qf6xWB4YaqlhWDg6zbbqVx7Bz//stLQNnfE9XS1xm3f6fl24c5+bnEK0/wHgMgZYKIKxPeUA==", - "requires": { - "applicationinsights": "1.0.8" - } - }, - "vscode-nls": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.1.tgz", - "integrity": "sha512-4R+2UoUUU/LdnMnFjePxfLqNhBS8lrAFyX7pjb2ud/lqDkrUavFUTcG7wR0HBZFakae0Q6KLBFjMS6W93F403A==" - }, - "vscode-nls-dev": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/vscode-nls-dev/-/vscode-nls-dev-3.3.1.tgz", - "integrity": "sha512-fug18D7CXb8pv8JoQ0D0JmZaIYDQoKLiyZxkAy5P8Cln/FwlNsdzwQILDph62EdGY5pvsJ2Jd1T5qgHAExe/tg==", - "dev": true, - "requires": { - "ansi-colors": "^3.2.3", - "clone": "^2.1.1", - "event-stream": "^3.3.4", - "fancy-log": "^1.3.3", - "glob": "^7.1.2", - "iconv-lite": "^0.4.19", - "is": "^3.2.1", - "source-map": "^0.6.1", - "typescript": "^2.6.2", - "vinyl": "^2.1.0", - "xml2js": "^0.4.19", - "yargs": "^13.2.4" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "event-stream": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.5.tgz", - "integrity": "sha512-vyibDcu5JL20Me1fP734QBH/kenBGLZap2n0+XXM7mvuUPzJ20Ydqj1aKcIeMdri1p+PU+4yAKugjN8KCVst+g==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "from": "^0.1.7", - "map-stream": "0.0.7", - "pause-stream": "^0.0.11", - "split": "^1.0.1", - "stream-combiner": "^0.2.2", - "through": "^2.3.8" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "typescript": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "vscode-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.0.0.tgz", - "integrity": "sha512-RnZUhxEXYCozHtBAQwX/UISlw0JPqlv1I9LLl4++vcPDIvjs2Zfz2Inp8haxixS1sOTftHJ9kiecrwWF9S3taQ==", - "dev": true, - "requires": { - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1" - } - }, - "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", - "requires": { - "browser-process-hrtime": "^0.1.2" - } - }, - "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", - "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" - } - }, - "wait-for-expect": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-3.0.1.tgz", - "integrity": "sha512-3Ha7lu+zshEG/CeHdcpmQsZnnZpPj/UsG3DuKO8FskjuDbkx3jE3845H+CuwZjA2YWYDfKMU2KhnCaXMLd3wVw==" - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "requires": { - "makeerror": "1.0.x" - } - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "dev": true, - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - }, - "webpack": { - "version": "4.32.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.32.2.tgz", - "integrity": "sha512-F+H2Aa1TprTQrpodRAWUMJn7A8MgDx82yQiNvYMaj3d1nv3HetKU0oqEulL9huj8enirKi8KvEXQ3QtuHF89Zg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.0.5", - "acorn-dynamic-import": "^4.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^1.0.0", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - } - } - }, - "webpack-cli": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.2.tgz", - "integrity": "sha512-FLkobnaJJ+03j5eplxlI0TUxhGCOdfewspIGuvDVtpOlrAuKMFC57K42Ukxqs1tn8947/PM6tP95gQc0DCzRYA==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.0", - "findup-sync": "^2.0.0", - "global-modules": "^1.0.0", - "import-local": "^2.0.0", - "interpret": "^1.1.0", - "loader-utils": "^1.1.0", - "supports-color": "^5.5.0", - "v8-compile-cache": "^2.0.2", - "yargs": "^12.0.5" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", - "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", - "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - }, - "dependencies": { - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - } - } - }, - "webpack-dev-server": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.2.tgz", - "integrity": "sha512-pxZKPYb+n77UN8u9YxXT4IaIrGcNtijh/mi8TXbErHmczw0DtPnMTTjHj+eNjkqLOaAZM/qD7V59j/qJsEiaZA==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.2.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.6", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.25", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "0.3.19", - "sockjs-client": "1.4.0", - "spdy": "^4.0.1", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "12.0.5" - }, - "dependencies": { - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "webpack-manifest-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", - "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", - "dev": true, - "requires": { - "fs-extra": "^7.0.0", - "lodash": ">=3.5 <5", - "object.entries": "^1.1.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.4.0 <0.4.11", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==", - "dev": true - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - }, - "workbox-background-sync": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz", - "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-broadcast-update": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz", - "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-build": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-4.3.1.tgz", - "integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.3.4", - "@hapi/joi": "^15.0.0", - "common-tags": "^1.8.0", - "fs-extra": "^4.0.2", - "glob": "^7.1.3", - "lodash.template": "^4.4.0", - "pretty-bytes": "^5.1.0", - "stringify-object": "^3.3.0", - "strip-comments": "^1.0.2", - "workbox-background-sync": "^4.3.1", - "workbox-broadcast-update": "^4.3.1", - "workbox-cacheable-response": "^4.3.1", - "workbox-core": "^4.3.1", - "workbox-expiration": "^4.3.1", - "workbox-google-analytics": "^4.3.1", - "workbox-navigation-preload": "^4.3.1", - "workbox-precaching": "^4.3.1", - "workbox-range-requests": "^4.3.1", - "workbox-routing": "^4.3.1", - "workbox-strategies": "^4.3.1", - "workbox-streams": "^4.3.1", - "workbox-sw": "^4.3.1", - "workbox-window": "^4.3.1" - }, - "dependencies": { - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "workbox-cacheable-response": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz", - "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-core": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", - "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==", - "dev": true - }, - "workbox-expiration": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz", - "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-google-analytics": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz", - "integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==", - "dev": true, - "requires": { - "workbox-background-sync": "^4.3.1", - "workbox-core": "^4.3.1", - "workbox-routing": "^4.3.1", - "workbox-strategies": "^4.3.1" - } - }, - "workbox-navigation-preload": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz", - "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-precaching": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz", - "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-range-requests": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz", - "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-routing": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz", - "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-strategies": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz", - "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-streams": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-4.3.1.tgz", - "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-sw": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz", - "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==", - "dev": true - }, - "workbox-webpack-plugin": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz", - "integrity": "sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.0.0", - "json-stable-stringify": "^1.0.1", - "workbox-build": "^4.3.1" - } - }, - "workbox-window": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-4.3.1.tgz", - "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "worker-rpc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", - "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", - "dev": true, - "requires": { - "microevent.ts": "~0.1.1" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "ws": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.1.tgz", - "integrity": "sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A==" - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true - }, - "xmlchars": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-1.3.1.tgz", - "integrity": "sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw==" - }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true - }, - "yaml": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz", - "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.6.3" - } - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - }, - "dependencies": { - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "yargs-parser": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", - "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yargs-unparser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", - "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", - "dev": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.11", - "yargs": "^12.0.5" - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3" - } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" - }, - "zone.js": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.7.6.tgz", - "integrity": "sha1-+7w50+AmHQmG8boGMG6zrrDSIAk=" - } - } -} diff --git a/package.json b/package.json index c3d9e093d..5eb0c9a40 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "instrumentationKey": "__AIKEY__", "icon": "assets/icon.png", "engines": { - "vscode": "^1.43.0" + "vscode": "1.43.0" }, "categories": [ "Other" @@ -253,70 +253,70 @@ "package": "vsce package" }, "devDependencies": { - "@types/glob": "^7.1.1", - "@types/node": "^10.12.21", - "@types/react": "16.8.6", - "@types/react-dom": "16.8.4", - "@types/vscode": "^1.45.1", - "css-loader": "^1.0.0", - "del": "^4.0.0", - "event-stream": "^4.0.1", - "gulp": "^4.0.2", - "gulp-cli": "^2.1.0", - "gulp-filter": "^5.1.0", - "gulp-sourcemaps": "^2.6.5", - "gulp-typescript": "^5.0.1", - "less": "^3.7.0", - "less-loader": "^4.1.0", - "mocha": "^6.1.4", - "npm-run-all": "^4.1.3", - "prettier": "^1.19.1", - "react-scripts": "^3.4.0", - "style-loader": "^0.21.0", - "ts-import-plugin": "^1.5.4", - "ts-loader": "^4.4.2", - "tslint": "^5.12.1", - "tslint-config-prettier": "^1.18.0", - "tslint-microsoft-contrib": "^6.1.0", - "tslint-react": "^3.6.0", - "tslint-react-hooks": "^2.0.0", - "typescript": "^3.8.3", - "typescript-react-intl": "^0.4.0", - "version-from-git": "^1.1.1", - "vsce": "^1.47.0", - "vscode-nls-dev": "^3.2.6", - "vscode-test": "^1.0.0", - "webpack": "^4.15.1", - "webpack-cli": "^3.0.8" + "@types/glob": "8.1.0", + "@types/node": "20.8.9", + "@types/react": "18.2.33", + "@types/react-dom": "18.2.14", + "@types/vscode": "1.83.1", + "css-loader": "6.8.1", + "del": "7.1.0", + "event-stream": "4.0.1", + "gulp": "4.0.2", + "gulp-cli": "2.3.0", + "gulp-filter": "8.0.0", + "gulp-sourcemaps": "3.0.0", + "gulp-typescript": "5.0.1", + "less": "4.2.0", + "less-loader": "11.1.3", + "mocha": "10.2.0", + "npm-run-all": "4.1.5", + "prettier": "3.0.3", + "react-scripts": "5.0.1", + "style-loader": "3.3.3", + "ts-import-plugin": "3.0.0", + "ts-loader": "9.5.0", + "tslint": "5.20.1", + "tslint-config-prettier": "1.18.0", + "tslint-microsoft-contrib": "6.1.0", + "tslint-react": "4.1.0", + "tslint-react-hooks": "2.2.2", + "typescript": "5.2.2", + "typescript-react-intl": "0.4.1", + "version-from-git": "1.1.1", + "vsce": "1.47.0", + "vscode-nls-dev": "4.0.4", + "vscode-test": "1.0.0", + "webpack": "5.89.0", + "webpack-cli": "5.1.4" }, "dependencies": { - "@babel/preset-typescript": "^7.8.3", - "@testing-library/jest-dom": "^5.0.2", - "@testing-library/react": "^9.4.0", - "@types/jest": "^24.9.0", - "@types/open": "^6.1.0", - "@types/react-test-renderer": "^16.9.0", - "@types/socket.io": "^2.1.2", - "babel-jest": "^25.1.0", - "compare-versions": "^3.5.1", - "eventemitter2": "^5.0.1", - "glob": "^7.1.4", - "jest": "^25.1.0", - "jest-transform-css": "^2.0.0", - "office-ui-fabric-react": "^7.105.12", - "open": "^6.4.0", - "os": "^0.1.1", - "react": "^16.9.0", - "react-dom": "^16.9.0", - "react-intl": "^3.1.9", - "react-test-renderer": "^16.9.0", - "socket.io": "^2.4.0", - "svg-inline-react": "^3.1.0", - "ts-jest": "^25.0.0", - "usb-native": "^5.0.1", - "util": "^0.12.1", - "vscode-extension-telemetry": "^0.1.1", - "vscode-nls": "^4.1.0" + "@babel/preset-typescript": "7.23.2", + "@testing-library/jest-dom": "6.1.4", + "@testing-library/react": "14.0.0", + "@types/jest": "29.5.6", + "@types/open": "6.1.0", + "@types/react-test-renderer": "18.0.5", + "@types/socket.io": "3.0.1", + "babel-jest": "29.7.0", + "compare-versions": "6.1.0", + "eventemitter2": "6.4.9", + "glob": "10.3.10", + "jest": "29.7.0", + "jest-transform-css": "6.0.1", + "office-ui-fabric-react": "7.204.0", + "open": "9.1.0", + "os": "0.1.2", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-intl": "6.5.1", + "react-test-renderer": "18.2.0", + "socket.io": "4.7.2", + "svg-inline-react": "3.2.1", + "ts-jest": "29.1.1", + "usb-native": "6.0.0", + "util": "0.12.5", + "vscode-extension-telemetry": "0.1.1", + "vscode-nls": "5.2.0" }, "eslintConfig": { "extends": "react-app" From 87f569921fafcd7b3a27245588a5063d37864c0e Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Sun, 29 Oct 2023 09:58:14 +0200 Subject: [PATCH 03/64] squash! --- package.json | 635 ++++++++++++++++++++++++++------------------------- 1 file changed, 322 insertions(+), 313 deletions(-) diff --git a/package.json b/package.json index 5eb0c9a40..873bcb88e 100644 --- a/package.json +++ b/package.json @@ -1,327 +1,336 @@ { - "name": "__EXTENSIONNAME__", - "displayName": "__DISPLAYNAME__", - "description": "__DESCRIPTION__", - "version": "0.0.0-UNTRACKEDVERSION", - "publisher": "__PUBLISHER__", - "instrumentationKey": "__AIKEY__", - "icon": "assets/icon.png", - "engines": { - "vscode": "1.43.0" - }, - "categories": [ - "Other" + "name": "__EXTENSIONNAME__", + "displayName": "__DISPLAYNAME__", + "description": "__DESCRIPTION__", + "version": "0.0.1", + "publisher": "__PUBLISHER__", + "instrumentationKey": "__AIKEY__", + "icon": "assets/icon.png", + "engines": { + "vscode": "1.43.0" + }, + "categories": [ + "Other" + ], + "preview": true, + "license": "MIT", + "homepage": "https://github.com/CodeEditorLand/CodeEditorLand#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/CodeEditorLand/CodeEditorLand.git" + }, + "bugs": { + "url": "https://github.com/CodeEditorLand/CodeEditorLand/issues" + }, + "keywords": [ + "python", + "CircuitPython", + "Adafruit", + "microbit", + "MicroPython" + ], + "activationEvents": [ + "onCommand:deviceSimulatorExpress.common.installDependencies", + "onCommand:deviceSimulatorExpress.common.openSerialMonitor", + "onCommand:deviceSimulatorExpress.common.runSimulator", + "onCommand:deviceSimulatorExpress.common.selectSerialPort", + "onCommand:deviceSimulatorExpress.common.gettingStarted", + "onCommand:deviceSimulatorExpress.common.deployToDevice", + "onCommand:deviceSimulatorExpress.common.newFile", + "onCommand:deviceSimulatorExpress.common.openSimulator", + "onDebug" + ], + "main": "./out/extension.js", + "contributes": { + "commands": [ + { + "command": "deviceSimulatorExpress.common.installDependencies", + "title": "%deviceSimulatorExpressExtension.commands.common.installDependencies%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.changeBaudRate", + "title": "%deviceSimulatorExpressExtension.commands.common.changeBaudRate%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.closeSerialMonitor", + "title": "%deviceSimulatorExpressExtension.commands.common.closeSerialMonitor%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.openSerialMonitor", + "title": "%deviceSimulatorExpressExtension.commands.common.openSerialMonitor%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.selectSerialPort", + "title": "%deviceSimulatorExpressExtension.commands.common.selectSerialPort%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.runSimulator", + "title": "%deviceSimulatorExpressExtension.commands.common.runSimulator%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.gettingStarted", + "title": "%deviceSimulatorExpressExtension.commands.common.gettingStarted%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.deployToDevice", + "title": "%deviceSimulatorExpressExtension.commands.common.deployToDevice%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.newFile", + "title": "%deviceSimulatorExpressExtension.commands.common.newFile%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.openSimulator", + "title": "%deviceSimulatorExpressExtension.commands.common.openSimulator%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + } ], - "preview": true, - "license": "MIT", - "homepage": "https://github.com/microsoft/vscode-python-devicesimulator", - "repository": { - "type": "git", - "url": "https://github.com/microsoft/vscode-python-devicesimulator" - }, - "bugs": { - "url": "https://github.com/microsoft/vscode-python-devicesimulator/issues" - }, - "keywords": [ - "python", - "CircuitPython", - "Adafruit", - "microbit", - "MicroPython" + "colors": [ + { + "id": "highContrastButtonBorderOverride.color", + "description": "Color for the high contrast border updated", + "defaults": { + "dark": "debugToolBar.background", + "light": "debugToolBar.background", + "highContrast": "#6FC3DF" + } + }, + { + "id": "badgeForegroundOverride", + "description": "Color that fixes the issue with midnight blue ", + "defaults": { + "dark": "#FFFFFF", + "light": "badge.foreground", + "highContrast": "#FFFFFF" + } + } ], - "activationEvents": [ - "onCommand:deviceSimulatorExpress.common.installDependencies", - "onCommand:deviceSimulatorExpress.common.openSerialMonitor", - "onCommand:deviceSimulatorExpress.common.runSimulator", - "onCommand:deviceSimulatorExpress.common.selectSerialPort", - "onCommand:deviceSimulatorExpress.common.gettingStarted", - "onCommand:deviceSimulatorExpress.common.deployToDevice", - "onCommand:deviceSimulatorExpress.common.newFile", - "onCommand:deviceSimulatorExpress.common.openSimulator", - "onDebug" + "configuration": { + "type": "object", + "title": "%deviceSimulatorExpressExtension.configuration.title%", + "properties": { + "deviceSimulatorExpress.configNewEnvironmentUponSwitch": { + "type": "boolean", + "default": false, + "description": "%deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange%", + "scope": "resource" + }, + "deviceSimulatorExpress.enableUSBDetection": { + "type": "boolean", + "default": true + }, + "deviceSimulatorExpress.showDependencyInstall": { + "type": "boolean", + "default": true, + "description": "%deviceSimulatorExpressExtension.configuration.properties.dependencyChecker%", + "scope": "resource" + }, + "deviceSimulatorExpress.showNewFilePopup": { + "type": "boolean", + "default": true, + "scope": "resource" + }, + "deviceSimulatorExpress.debuggerServerPort": { + "type": "number", + "default": 5577, + "description": "%deviceSimulatorExpressExtension.configuration.properties.debuggerPort%", + "scope": "resource" + } + } + }, + "breakpoints": [ + { + "language": "python" + } ], - "main": "./out/extension.js", - "contributes": { - "commands": [ - { - "command": "deviceSimulatorExpress.common.installDependencies", - "title": "%deviceSimulatorExpressExtension.commands.common.installDependencies%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.changeBaudRate", - "title": "%deviceSimulatorExpressExtension.commands.common.changeBaudRate%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.closeSerialMonitor", - "title": "%deviceSimulatorExpressExtension.commands.common.closeSerialMonitor%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.openSerialMonitor", - "title": "%deviceSimulatorExpressExtension.commands.common.openSerialMonitor%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.selectSerialPort", - "title": "%deviceSimulatorExpressExtension.commands.common.selectSerialPort%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.runSimulator", - "title": "%deviceSimulatorExpressExtension.commands.common.runSimulator%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.gettingStarted", - "title": "%deviceSimulatorExpressExtension.commands.common.gettingStarted%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.deployToDevice", - "title": "%deviceSimulatorExpressExtension.commands.common.deployToDevice%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.newFile", - "title": "%deviceSimulatorExpressExtension.commands.common.newFile%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.openSimulator", - "title": "%deviceSimulatorExpressExtension.commands.common.openSimulator%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - } + "debuggers": [ + { + "type": "deviceSimulatorExpress", + "label": "Device Simulator Express Debugger", + "languages": [ + "python" ], - "colors": [ - { - "id": "highContrastButtonBorderOverride.color", - "description": "Color for the high contrast border updated", - "defaults": { - "dark": "debugToolBar.background", - "light": "debugToolBar.background", - "highContrast": "#6FC3DF" - } - }, - { - "id": "badgeForegroundOverride", - "description": "Color that fixes the issue with midnight blue ", - "defaults": { - "dark": "#FFFFFF", - "light": "badge.foreground", - "highContrast": "#FFFFFF" - } - } - ], - "configuration": { - "type": "object", - "title": "%deviceSimulatorExpressExtension.configuration.title%", + "configurationAttributes": { + "launch": { "properties": { - "deviceSimulatorExpress.configNewEnvironmentUponSwitch": { - "type": "boolean", - "default": false, - "description": "%deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange%", - "scope": "resource" - }, - "deviceSimulatorExpress.enableUSBDetection": { - "type": "boolean", - "default": true - }, - "deviceSimulatorExpress.showDependencyInstall": { - "type": "boolean", - "default": true, - "description": "%deviceSimulatorExpressExtension.configuration.properties.dependencyChecker%", - "scope": "resource" - }, - "deviceSimulatorExpress.showNewFilePopup": { - "type": "boolean", - "default": true, - "scope": "resource" - }, - "deviceSimulatorExpress.debuggerServerPort": { - "type": "number", - "default": 5577, - "description": "%deviceSimulatorExpressExtension.configuration.properties.debuggerPort%", - "scope": "resource" + "program": { + "type": "string", + "description": "Absolute path to the code file.", + "default": "${file}" + }, + "stopOnEntry": { + "type": "boolean", + "description": "Automatically stop after launch.", + "default": true + }, + "console": { + "enum": [ + "internalConsole", + "integratedTerminal", + "externalTerminal" + ], + "description": "Where to launch the debug target: internal console, integrated terminal, or external terminal.", + "default": "integratedTerminal" + }, + "args": { + "type": "array", + "description": "Command line arguments passed to the program.", + "default": [], + "items": { + "filePath": "string", + "serverPort": "string" + } + }, + "rules": { + "type": "array", + "description": "Debugger rules.", + "default": [], + "items": { + "path": "string", + "include": "boolean" } + } } + } }, - "breakpoints": [ - { - "language": "python" - } + "initialConfigurations": [ + { + "type": "deviceSimulatorExpress", + "request": "launch", + "name": "Device Simulator Express Debugger", + "console": "integratedTerminal" + } ], - "debuggers": [ - { - "type": "deviceSimulatorExpress", - "label": "Device Simulator Express Debugger", - "languages": [ - "python" - ], - "configurationAttributes": { - "launch": { - "properties": { - "program": { - "type": "string", - "description": "Absolute path to the code file.", - "default": "${file}" - }, - "stopOnEntry": { - "type": "boolean", - "description": "Automatically stop after launch.", - "default": true - }, - "console": { - "enum": [ - "internalConsole", - "integratedTerminal", - "externalTerminal" - ], - "description": "Where to launch the debug target: internal console, integrated terminal, or external terminal.", - "default": "integratedTerminal" - }, - "args": { - "type": "array", - "description": "Command line arguments passed to the program.", - "default": [], - "items": { - "filePath": "string", - "serverPort": "string" - } - }, - "rules": { - "type": "array", - "description": "Debugger rules.", - "default": [], - "items": { - "path": "string", - "include": "boolean" - } - } - } - } - }, - "initialConfigurations": [ - { - "type": "deviceSimulatorExpress", - "request": "launch", - "name": "Device Simulator Express Debugger", - "console": "integratedTerminal" - } - ], - "configurationSnippets": [ - { - "label": "Device Simulator Express Debugger : Launch", - "description": "Device Simulator Express Debugger - A configuration for debugging a python code file for the Device Simulator Express simulator.", - "body": { - "type": "deviceSimulatorExpress", - "request": "launch", - "name": "Device Simulator Express Debugger", - "console": "integratedTerminal" - } - } - ] + "configurationSnippets": [ + { + "label": "Device Simulator Express Debugger : Launch", + "description": "Device Simulator Express Debugger - A configuration for debugging a python code file for the Device Simulator Express simulator.", + "body": { + "type": "deviceSimulatorExpress", + "request": "launch", + "name": "Device Simulator Express Debugger", + "console": "integratedTerminal" } + } ] - }, - "scripts": { - "start": "webpack-dev-server", - "vscode:prepublish": "npm run compile", - "build": "gulp build", - "clean": "gulp clean", - "compile": "npm-run-all compile:*", - "compile:extension": "gulp compile", - "compile:views": "webpack --mode development", - "watch": "npm-run-all -p watch:*", - "watch:extension": "tsc --watch", - "watch:views": "webpack --watch --mode development", - "pretest": "npm run compile", - "test": "npm-run-all test:*", - "test:extension-tests": "node ./out/test/runTest.js", - "test:ts": "jest", - "test:api-tests": "pytest src", - "lint": "npm-run-all lint:*", - "lint:ts": "tslint -c tslint.json src/**/*.{ts,tsx}", - "lint:python": "pylint src", - "format": "npm-run-all format:*", - "format:ts": "prettier --config .prettierrc.yaml --write src/**/*.{css,ts,tsx}", - "format:python": "black src", - "check": "npm-run-all check:*", - "check:ts": "prettier --config .prettierrc.yaml --check src/**/*.{css,ts,tsx}", - "check:python": "black src --check", - "package": "vsce package" - }, - "devDependencies": { - "@types/glob": "8.1.0", - "@types/node": "20.8.9", - "@types/react": "18.2.33", - "@types/react-dom": "18.2.14", - "@types/vscode": "1.83.1", - "css-loader": "6.8.1", - "del": "7.1.0", - "event-stream": "4.0.1", - "gulp": "4.0.2", - "gulp-cli": "2.3.0", - "gulp-filter": "8.0.0", - "gulp-sourcemaps": "3.0.0", - "gulp-typescript": "5.0.1", - "less": "4.2.0", - "less-loader": "11.1.3", - "mocha": "10.2.0", - "npm-run-all": "4.1.5", - "prettier": "3.0.3", - "react-scripts": "5.0.1", - "style-loader": "3.3.3", - "ts-import-plugin": "3.0.0", - "ts-loader": "9.5.0", - "tslint": "5.20.1", - "tslint-config-prettier": "1.18.0", - "tslint-microsoft-contrib": "6.1.0", - "tslint-react": "4.1.0", - "tslint-react-hooks": "2.2.2", - "typescript": "5.2.2", - "typescript-react-intl": "0.4.1", - "version-from-git": "1.1.1", - "vsce": "1.47.0", - "vscode-nls-dev": "4.0.4", - "vscode-test": "1.0.0", - "webpack": "5.89.0", - "webpack-cli": "5.1.4" - }, - "dependencies": { - "@babel/preset-typescript": "7.23.2", - "@testing-library/jest-dom": "6.1.4", - "@testing-library/react": "14.0.0", - "@types/jest": "29.5.6", - "@types/open": "6.1.0", - "@types/react-test-renderer": "18.0.5", - "@types/socket.io": "3.0.1", - "babel-jest": "29.7.0", - "compare-versions": "6.1.0", - "eventemitter2": "6.4.9", - "glob": "10.3.10", - "jest": "29.7.0", - "jest-transform-css": "6.0.1", - "office-ui-fabric-react": "7.204.0", - "open": "9.1.0", - "os": "0.1.2", - "react": "18.2.0", - "react-dom": "18.2.0", - "react-intl": "6.5.1", - "react-test-renderer": "18.2.0", - "socket.io": "4.7.2", - "svg-inline-react": "3.2.1", - "ts-jest": "29.1.1", - "usb-native": "6.0.0", - "util": "0.12.5", - "vscode-extension-telemetry": "0.1.1", - "vscode-nls": "5.2.0" - }, - "eslintConfig": { - "extends": "react-app" - }, - "extensionDependencies": [ - "ms-python.python" + } ] + }, + "scripts": { + "start": "webpack-dev-server", + "vscode:prepublish": "npm run compile", + "build": "gulp build", + "clean": "gulp clean", + "compile": "npm-run-all compile:*", + "compile:extension": "gulp compile", + "compile:views": "webpack --mode development", + "watch": "npm-run-all -p watch:*", + "watch:extension": "tsc --watch", + "watch:views": "webpack --watch --mode development", + "pretest": "npm run compile", + "test": "npm-run-all test:*", + "test:extension-tests": "node ./out/test/runTest.js", + "test:ts": "jest", + "test:api-tests": "pytest src", + "lint": "npm-run-all lint:*", + "lint:ts": "tslint -c tslint.json src/**/*.{ts,tsx}", + "lint:python": "pylint src", + "format": "npm-run-all format:*", + "format:ts": "prettier --config .prettierrc.yaml --write src/**/*.{css,ts,tsx}", + "format:python": "black src", + "check": "npm-run-all check:*", + "check:ts": "prettier --config .prettierrc.yaml --check src/**/*.{css,ts,tsx}", + "check:python": "black src --check", + "package": "vsce package", + "prepublishOnly": "TypeScriptESBuild Source/**/*.ts" + }, + "devDependencies": { + "@types/glob": "8.1.0", + "@types/node": "20.8.9", + "@types/react": "18.2.33", + "@types/react-dom": "18.2.14", + "@types/vscode": "1.83.1", + "css-loader": "6.8.1", + "del": "7.1.0", + "event-stream": "4.0.1", + "gulp": "4.0.2", + "gulp-cli": "2.3.0", + "gulp-filter": "8.0.0", + "gulp-sourcemaps": "3.0.0", + "gulp-typescript": "5.0.1", + "less": "4.2.0", + "less-loader": "11.1.3", + "mocha": "10.2.0", + "npm-run-all": "4.1.5", + "prettier": "3.0.3", + "react-scripts": "5.0.1", + "style-loader": "3.3.3", + "ts-import-plugin": "3.0.0", + "ts-loader": "9.5.0", + "tslint": "5.20.1", + "tslint-config-prettier": "1.18.0", + "tslint-microsoft-contrib": "6.1.0", + "tslint-react": "4.1.0", + "tslint-react-hooks": "2.2.2", + "typescript": "5.2.2", + "typescript-react-intl": "0.4.1", + "version-from-git": "1.1.1", + "vsce": "1.47.0", + "vscode-nls-dev": "4.0.4", + "vscode-test": "1.0.0", + "webpack": "5.89.0", + "webpack-cli": "5.1.4", + "typescript-esbuild": "0.3.1" + }, + "dependencies": { + "@babel/preset-typescript": "7.23.2", + "@testing-library/jest-dom": "6.1.4", + "@testing-library/react": "14.0.0", + "@types/jest": "29.5.6", + "@types/open": "6.1.0", + "@types/react-test-renderer": "18.0.5", + "@types/socket.io": "3.0.1", + "babel-jest": "29.7.0", + "compare-versions": "6.1.0", + "eventemitter2": "6.4.9", + "glob": "10.3.10", + "jest": "29.7.0", + "jest-transform-css": "6.0.1", + "office-ui-fabric-react": "7.204.0", + "open": "9.1.0", + "os": "0.1.2", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-intl": "6.5.1", + "react-test-renderer": "18.2.0", + "socket.io": "4.7.2", + "svg-inline-react": "3.2.1", + "ts-jest": "29.1.1", + "usb-native": "6.0.0", + "util": "0.12.5", + "vscode-extension-telemetry": "0.1.1", + "vscode-nls": "5.2.0" + }, + "extensionDependencies": [ + "ms-python.python" + ], + "type": "module", + "private": "false", + "publishConfig": { + "access": "public" + }, + "author": { + "name": "Nikola Hristov", + "email": "nikola@nikolahristov.tech", + "url": "https://nikolahristov.tech" + } } From bf45b7d0f8d116250b3f5d7c8d90bc85c8fb0235 Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Sun, 29 Oct 2023 11:48:25 +0200 Subject: [PATCH 04/64] squash! --- package.json | 236 +++++++++++++++++++++++++-------------------------- 1 file changed, 118 insertions(+), 118 deletions(-) diff --git a/package.json b/package.json index 873bcb88e..48386ce14 100644 --- a/package.json +++ b/package.json @@ -1,27 +1,12 @@ { "name": "__EXTENSIONNAME__", "displayName": "__DISPLAYNAME__", - "description": "__DESCRIPTION__", "version": "0.0.1", - "publisher": "__PUBLISHER__", - "instrumentationKey": "__AIKEY__", - "icon": "assets/icon.png", - "engines": { - "vscode": "1.43.0" - }, + "private": "false", + "description": "__DESCRIPTION__", "categories": [ "Other" ], - "preview": true, - "license": "MIT", - "homepage": "https://github.com/CodeEditorLand/CodeEditorLand#readme", - "repository": { - "type": "git", - "url": "git+https://github.com/CodeEditorLand/CodeEditorLand.git" - }, - "bugs": { - "url": "https://github.com/CodeEditorLand/CodeEditorLand/issues" - }, "keywords": [ "python", "CircuitPython", @@ -29,19 +14,77 @@ "microbit", "MicroPython" ], - "activationEvents": [ - "onCommand:deviceSimulatorExpress.common.installDependencies", - "onCommand:deviceSimulatorExpress.common.openSerialMonitor", - "onCommand:deviceSimulatorExpress.common.runSimulator", - "onCommand:deviceSimulatorExpress.common.selectSerialPort", - "onCommand:deviceSimulatorExpress.common.gettingStarted", - "onCommand:deviceSimulatorExpress.common.deployToDevice", - "onCommand:deviceSimulatorExpress.common.newFile", - "onCommand:deviceSimulatorExpress.common.openSimulator", - "onDebug" - ], + "homepage": "https://github.com/CodeEditorLand/CodeEditorLand#readme", + "bugs": { + "url": "https://github.com/CodeEditorLand/CodeEditorLand/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/CodeEditorLand/CodeEditorLand.git" + }, + "license": "MIT", + "author": { + "name": "Nikola Hristov", + "email": "nikola@nikolahristov.tech", + "url": "https://nikolahristov.tech" + }, + "publisher": "playform", + "type": "module", "main": "./out/extension.js", + "scripts": { + "start": "webpack-dev-server", + "vscode:prepublish": "npm run compile", + "build": "gulp build", + "clean": "gulp clean", + "compile": "npm-run-all compile:*", + "compile:extension": "gulp compile", + "compile:views": "webpack --mode development", + "watch": "npm-run-all -p watch:*", + "watch:extension": "tsc --watch", + "watch:views": "webpack --watch --mode development", + "pretest": "npm run compile", + "test": "npm-run-all test:*", + "test:extension-tests": "node ./out/test/runTest.js", + "test:ts": "jest", + "test:api-tests": "pytest src", + "lint": "npm-run-all lint:*", + "lint:ts": "tslint -c tslint.json src/**/*.{ts,tsx}", + "lint:python": "pylint src", + "format": "npm-run-all format:*", + "format:ts": "prettier --config .prettierrc.yaml --write src/**/*.{css,ts,tsx}", + "format:python": "black src", + "check": "npm-run-all check:*", + "check:ts": "prettier --config .prettierrc.yaml --check src/**/*.{css,ts,tsx}", + "check:python": "black src --check", + "package": "vsce package", + "prepublishOnly": "TypeScriptESBuild Source/**/*.ts" + }, "contributes": { + "breakpoints": [ + { + "language": "python" + } + ], + "colors": [ + { + "id": "highContrastButtonBorderOverride.color", + "description": "Color for the high contrast border updated", + "defaults": { + "dark": "debugToolBar.background", + "light": "debugToolBar.background", + "highContrast": "#6FC3DF" + } + }, + { + "id": "badgeForegroundOverride", + "description": "Color that fixes the issue with midnight blue ", + "defaults": { + "dark": "#FFFFFF", + "light": "badge.foreground", + "highContrast": "#FFFFFF" + } + } + ], "commands": [ { "command": "deviceSimulatorExpress.common.installDependencies", @@ -94,26 +137,6 @@ "category": "%deviceSimulatorExpressExtension.commands.common.label%" } ], - "colors": [ - { - "id": "highContrastButtonBorderOverride.color", - "description": "Color for the high contrast border updated", - "defaults": { - "dark": "debugToolBar.background", - "light": "debugToolBar.background", - "highContrast": "#6FC3DF" - } - }, - { - "id": "badgeForegroundOverride", - "description": "Color that fixes the issue with midnight blue ", - "defaults": { - "dark": "#FFFFFF", - "light": "badge.foreground", - "highContrast": "#FFFFFF" - } - } - ], "configuration": { "type": "object", "title": "%deviceSimulatorExpressExtension.configuration.title%", @@ -147,11 +170,6 @@ } } }, - "breakpoints": [ - { - "language": "python" - } - ], "debuggers": [ { "type": "deviceSimulatorExpress", @@ -225,33 +243,45 @@ } ] }, - "scripts": { - "start": "webpack-dev-server", - "vscode:prepublish": "npm run compile", - "build": "gulp build", - "clean": "gulp clean", - "compile": "npm-run-all compile:*", - "compile:extension": "gulp compile", - "compile:views": "webpack --mode development", - "watch": "npm-run-all -p watch:*", - "watch:extension": "tsc --watch", - "watch:views": "webpack --watch --mode development", - "pretest": "npm run compile", - "test": "npm-run-all test:*", - "test:extension-tests": "node ./out/test/runTest.js", - "test:ts": "jest", - "test:api-tests": "pytest src", - "lint": "npm-run-all lint:*", - "lint:ts": "tslint -c tslint.json src/**/*.{ts,tsx}", - "lint:python": "pylint src", - "format": "npm-run-all format:*", - "format:ts": "prettier --config .prettierrc.yaml --write src/**/*.{css,ts,tsx}", - "format:python": "black src", - "check": "npm-run-all check:*", - "check:ts": "prettier --config .prettierrc.yaml --check src/**/*.{css,ts,tsx}", - "check:python": "black src --check", - "package": "vsce package", - "prepublishOnly": "TypeScriptESBuild Source/**/*.ts" + "activationEvents": [ + "onCommand:deviceSimulatorExpress.common.installDependencies", + "onCommand:deviceSimulatorExpress.common.openSerialMonitor", + "onCommand:deviceSimulatorExpress.common.runSimulator", + "onCommand:deviceSimulatorExpress.common.selectSerialPort", + "onCommand:deviceSimulatorExpress.common.gettingStarted", + "onCommand:deviceSimulatorExpress.common.deployToDevice", + "onCommand:deviceSimulatorExpress.common.newFile", + "onCommand:deviceSimulatorExpress.common.openSimulator", + "onDebug" + ], + "dependencies": { + "@babel/preset-typescript": "7.23.2", + "@testing-library/jest-dom": "6.1.4", + "@testing-library/react": "14.0.0", + "@types/jest": "29.5.6", + "@types/open": "6.1.0", + "@types/react-test-renderer": "18.0.5", + "@types/socket.io": "3.0.1", + "babel-jest": "29.7.0", + "compare-versions": "6.1.0", + "eventemitter2": "6.4.9", + "glob": "10.3.10", + "jest": "29.7.0", + "jest-transform-css": "6.0.1", + "office-ui-fabric-react": "7.204.0", + "open": "9.1.0", + "os": "0.1.2", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-intl": "6.5.1", + "react-test-renderer": "18.2.0", + "socket.io": "4.7.2", + "svg-inline-react": "3.2.1", + "ts-jest": "29.1.1", + "usb-native": "6.0.0", + "util": "0.12.5", + "vscode-extension-telemetry": "0.1.1", + "vscode-nls": "5.2.0" }, "devDependencies": { "@types/glob": "8.1.0", @@ -282,55 +312,25 @@ "tslint-react": "4.1.0", "tslint-react-hooks": "2.2.2", "typescript": "5.2.2", + "typescript-esbuild": "0.3.1", "typescript-react-intl": "0.4.1", "version-from-git": "1.1.1", "vsce": "1.47.0", "vscode-nls-dev": "4.0.4", "vscode-test": "1.0.0", "webpack": "5.89.0", - "webpack-cli": "5.1.4", - "typescript-esbuild": "0.3.1" - }, - "dependencies": { - "@babel/preset-typescript": "7.23.2", - "@testing-library/jest-dom": "6.1.4", - "@testing-library/react": "14.0.0", - "@types/jest": "29.5.6", - "@types/open": "6.1.0", - "@types/react-test-renderer": "18.0.5", - "@types/socket.io": "3.0.1", - "babel-jest": "29.7.0", - "compare-versions": "6.1.0", - "eventemitter2": "6.4.9", - "glob": "10.3.10", - "jest": "29.7.0", - "jest-transform-css": "6.0.1", - "office-ui-fabric-react": "7.204.0", - "open": "9.1.0", - "os": "0.1.2", - "react": "18.2.0", - "react-dom": "18.2.0", - "react-intl": "6.5.1", - "react-test-renderer": "18.2.0", - "socket.io": "4.7.2", - "svg-inline-react": "3.2.1", - "ts-jest": "29.1.1", - "usb-native": "6.0.0", - "util": "0.12.5", - "vscode-extension-telemetry": "0.1.1", - "vscode-nls": "5.2.0" + "webpack-cli": "5.1.4" }, "extensionDependencies": [ "ms-python.python" ], - "type": "module", - "private": "false", + "engines": { + "vscode": "1.43.0" + }, "publishConfig": { "access": "public" }, - "author": { - "name": "Nikola Hristov", - "email": "nikola@nikolahristov.tech", - "url": "https://nikolahristov.tech" - } + "icon": "assets/icon.png", + "preview": true, + "instrumentationKey": "__AIKEY__" } From 58ab9c7bc70aad7535c88f851a159d78567c08ba Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Sun, 29 Oct 2023 21:49:45 +0200 Subject: [PATCH 05/64] squash! --- .../adafruit_circuitplayground/__init__.py | 0 .../adafruit_circuitplayground/constants.py | 0 .../adafruit_circuitplayground/express.py | 0 .../locale/en/LC_MESSAGES/express.po | 0 .../locale/express.pot | 0 .../adafruit_circuitplayground/pixel.py | 0 .../test/__init__.py | 0 .../test/sample.mp4 | Bin .../test/sample.wav | Bin .../test/test_express.py | 0 .../test/test_pixel.py | 0 .../base_circuitpython/__init__.py | 16 +- .../base_circuitpython/base_cp_constants.py | 0 {src => Source}/base_circuitpython/board.py | 256 +- .../base_circuitpython/digitalio.py | 34 +- .../base_circuitpython/displayio/__init__.py | 22 +- .../base_circuitpython/displayio/bitmap.py | 210 +- .../displayio/color_type.py | 24 +- .../base_circuitpython/displayio/constants.py | 24 +- .../base_circuitpython/displayio/group.py | 708 +-- .../base_circuitpython/displayio/palette.py | 162 +- .../displayio/test/__init__.py | 0 .../displayio/test/img/group_test_result.bmp | Bin .../displayio/test/test_bitmap.py | 88 +- .../displayio/test/test_group.py | 348 +- .../displayio/test/test_palette.py | 62 +- .../displayio/test/test_tile_grid.py | 346 +- .../base_circuitpython/displayio/tile_grid.py | 560 +-- {src => Source}/base_circuitpython/fontio.py | 28 +- .../base_circuitpython/fonts/ter-u12n.bdf | 0 .../base_circuitpython/img/blinka.bmp | Bin .../base_circuitpython/neopixel_write.py | 110 +- {src => Source}/base_circuitpython/pulseio.py | 32 +- .../base_circuitpython/terminal_handler.py | 216 +- .../base_circuitpython/terminalio.py | 30 +- .../base_circuitpython/test/__init__.py | 0 .../test/test_terminal_handler.py | 122 +- {src => Source}/check_if_venv.py | 22 +- {src => Source}/check_python_dependencies.py | 0 {src => Source}/clue/__init__.py | 2 +- {src => Source}/clue/adafruit_clue.py | 1704 ++++---- .../clue/adafruit_display_text/label.py | 560 +-- {src => Source}/clue/adafruit_slideshow.py | 814 ++-- {src => Source}/clue/test/__init__.py | 0 .../clue/test/img/test_clue_text_1.bmp | Bin .../clue/test/img/test_display_text_1.bmp | Bin .../clue/test/img/test_display_text_2.bmp | Bin .../clue/test/img/test_display_text_3.bmp | Bin .../clue/test/img/test_display_text_4.bmp | Bin .../clue/test/img/test_image_shapes_1.bmp | Bin .../clue/test/img/test_image_shapes_2.bmp | Bin .../clue/test/img/test_image_shapes_3.bmp | Bin .../clue/test/img/test_image_shapes_4.bmp | Bin .../clue/test/img/test_image_shapes_5.bmp | Bin .../clue/test/img/test_image_text_1.bmp | Bin .../clue/test/img/test_image_text_2.bmp | Bin .../clue/test/img/test_image_text_3.bmp | Bin .../clue/test/img/test_image_text_4.bmp | Bin .../clue/test/slideshow_pics/pic_1.bmp | Bin .../clue/test/slideshow_pics/pic_2.bmp | Bin .../clue/test/slideshow_pics/pic_3.bmp | Bin .../clue/test/slideshow_pics/pic_4.bmp | Bin .../clue/test/slideshow_pics/pic_5.bmp | Bin .../clue/test/slideshow_pics/pic_6.bmp | Bin .../clue/test/slideshow_pics/pic_7.bmp | Bin .../clue/test/slideshow_pics/pic_8.bmp | Bin .../clue/test/test_adafruit_clue.py | 386 +- .../clue/test/test_adafruit_display_shapes.py | 162 +- .../clue/test/test_adafruit_display_text.py | 130 +- .../clue/test/test_adafruit_slideshow.py | 200 +- {src => Source}/clue/test/test_helpers.py | 64 +- {src => Source}/common/__init__.py | 0 {src => Source}/common/constants.py | 24 +- .../common/debugger_communication_client.py | 0 {src => Source}/common/telemetry.py | 0 {src => Source}/common/telemetry_events.py | 130 +- {src => Source}/common/test/__init__.py | 0 .../test_debugger_communication_client.py | 0 {src => Source}/common/test/test_utils.py | 0 {src => Source}/common/utils.py | 0 {src => Source}/constants.ts | 0 {src => Source}/cpxWorkspace.ts | 0 {src => Source}/debug_user_code.py | 0 {src => Source}/debugger/debugAdapter.ts | 0 .../debugger/debugAdapterFactory.ts | 0 .../debuggerCommunicationServer.ts | 0 {src => Source}/dev-requirements.txt | 0 {src => Source}/device.py | 0 {src => Source}/deviceContext.ts | 0 {src => Source}/extension.ts | 0 {src => Source}/extension_utils/utils.ts | 0 {src => Source}/install_dependencies.py | 18 +- {src => Source}/latest_release_note.ts | 0 {src => Source}/micropython/__init__.py | 0 {src => Source}/micropython/audio.py | 0 .../micropython/microbit/__init__.py | 0 .../microbit/__model/accelerometer.py | 0 .../micropython/microbit/__model/button.py | 0 .../micropython/microbit/__model/compass.py | 0 .../micropython/microbit/__model/constants.py | 0 .../micropython/microbit/__model/display.py | 0 .../micropython/microbit/__model/i2c.py | 0 .../micropython/microbit/__model/image.py | 0 .../microbit/__model/microbit_model.py | 0 .../microbit/__model/producer_property.py | 0 .../micropython/microbit/__model/spi.py | 0 .../micropython/microbit/test/__init__.py | 0 .../microbit/test/test_accelerometer.py | 0 .../micropython/microbit/test/test_button.py | 0 .../micropython/microbit/test/test_display.py | 0 .../micropython/microbit/test/test_image.py | 0 .../micropython/microbit/test/test_init.py | 0 .../microbit/test/test_microbit_model.py | 0 {src => Source}/micropython/music.py | 218 +- {src => Source}/micropython/radio.py | 360 +- {src => Source}/micropython/speech.py | 122 +- {src => Source}/micropython/utime.py | 264 +- {src => Source}/process_user_code.py | 0 {src => Source}/python_constants.py | 0 {src => Source}/requirements.txt | 0 {src => Source}/serialMonitor.ts | 0 {src => Source}/serialPortControl.ts | 0 {src => Source}/service/PopupService.ts | 32 +- .../service/debuggerCommunicationService.ts | 54 +- .../service/deviceSelectionService.ts | 24 +- .../service/fileSelectionService.ts | 190 +- {src => Source}/service/messagingService.ts | 0 {src => Source}/service/setupService.ts | 1152 ++--- .../service/telemetryHandlerService.ts | 0 {src => Source}/service/webviewService.ts | 0 .../simulatorDebugConfigurationProvider.ts | 0 {src => Source}/telemetry/getPackageInfo.ts | 0 {src => Source}/telemetry/telemetryAI.ts | 0 {src => Source}/templates/clue_template.py | 32 +- {src => Source}/templates/cpx_template.py | 32 +- .../templates/microbit_template.py | 22 +- {src => Source}/test/runTest.ts | 0 {src => Source}/test/suite/index.ts | 0 {src => Source}/usbDetector.ts | 0 {src => Source}/view/App.css | 0 {src => Source}/view/App.spec.tsx | 0 {src => Source}/view/App.tsx | 0 .../view/__snapshots__/App.spec.tsx.snap | 0 {src => Source}/view/components/Button.tsx | 0 {src => Source}/view/components/Dropdown.tsx | 0 .../view/components/clue/Clue.spec.tsx | 58 +- {src => Source}/view/components/clue/Clue.tsx | 316 +- .../view/components/clue/ClueImage.tsx | 312 +- .../view/components/clue/ClueSimulator.tsx | 0 .../view/components/clue/Clue_svg.tsx | 2368 +++++------ .../clue/__snapshots__/Clue.spec.tsx.snap | 0 .../components/cpx/Accessibility_utils.ts | 0 .../view/components/cpx/Cpx.spec.tsx | 58 +- {src => Source}/view/components/cpx/Cpx.tsx | 208 +- .../view/components/cpx/CpxImage.tsx | 0 .../view/components/cpx/CpxSimulator.tsx | 0 .../view/components/cpx/Cpx_svg.tsx | 0 .../view/components/cpx/Cpx_svg_style.tsx | 0 .../view/components/cpx/Svg_utils.tsx | 0 .../cpx/__snapshots__/Cpx.spec.tsx.snap | 0 .../components/microbit/Microbit.spec.tsx | 58 +- .../view/components/microbit/Microbit.tsx | 260 +- .../components/microbit/MicrobitImage.tsx | 332 +- .../components/microbit/MicrobitSimulator.tsx | 518 +-- .../view/components/microbit/Microbit_svg.tsx | 3780 ++++++++--------- .../__snapshots__/Microbit.spec.tsx.snap | 0 .../view/components/simulator/ActionBar.tsx | 0 .../toolbar/GenericSliderComponent.tsx | 82 +- .../view/components/toolbar/Gesture.tsx | 142 +- .../view/components/toolbar/InputSlider.tsx | 0 .../view/components/toolbar/SensorButton.tsx | 0 .../components/toolbar/SensorModalUtils.tsx | 0 .../view/components/toolbar/ToolBar.tsx | 0 .../view/components/toolbar/Toolbar.spec.tsx | 114 +- .../__snapshots__/Toolbar.spec.tsx.snap | 0 .../toolbar/clue/ClueModalContent.tsx | 636 +-- .../toolbar/clue/ClueSensorProperties.tsx | 432 +- .../toolbar/cpx/CpxModalContent.tsx | 0 .../toolbar/cpx/CpxSensorProperties.tsx | 0 .../toolbar/microbit/MicrobitModalContent.tsx | 374 +- .../microbit/MicrobitSensorProperties.tsx | 0 {src => Source}/view/constants.ts | 0 .../view/container/device/Device.spec.tsx | 60 +- .../view/container/device/Device.tsx | 0 .../device/__snapshots__/Device.spec.tsx.snap | 0 {src => Source}/view/context.ts | 0 {src => Source}/view/index.css | 0 {src => Source}/view/index.tsx | 0 .../gettingStarted.spec.tsx.snap | 0 {src => Source}/view/pages/gettingStarted.css | 112 +- .../view/pages/gettingStarted.spec.tsx | 58 +- {src => Source}/view/pages/gettingStarted.tsx | 562 +-- .../debugger/debugger_vars.png | Bin .../debugger/debugging.gif | Bin .../debugger/start_debugging.jpg | Bin .../debugger/toolbar.png | Bin {src => Source}/view/react-app-env.d.ts | 0 {src => Source}/view/styles/Button.css | 0 {src => Source}/view/styles/Dropdown.css | 0 {src => Source}/view/styles/InputSlider.css | 0 .../view/styles/LightSensorBar.css | 0 .../view/styles/MotionSensorBar.css | 0 {src => Source}/view/styles/SensorButton.css | 0 {src => Source}/view/styles/Simulator.css | 0 {src => Source}/view/styles/SimulatorSvg.css | 580 +-- .../view/styles/TemperatureSensorBar.css | 0 {src => Source}/view/styles/ToolBar.css | 0 {src => Source}/view/svgs/arrow_right_svg.tsx | 0 {src => Source}/view/svgs/close_svg.tsx | 0 {src => Source}/view/svgs/play_svg.tsx | 0 {src => Source}/view/svgs/refresh_svg.tsx | 0 {src => Source}/view/svgs/stop_svg.tsx | 0 {src => Source}/view/svgs/tag_input_svg.tsx | 0 {src => Source}/view/svgs/tag_output_svg.tsx | 0 {src => Source}/view/svgs/toolbar_svg.tsx | 0 {src => Source}/view/translations/en.json | 224 +- {src => Source}/view/tsconfig.json | 0 {src => Source}/view/utils/MessageUtils.tsx | 24 +- {src => Source}/view/viewUtils.tsx | 0 {src => Source}/vscode_import.ts | 0 220 files changed, 10892 insertions(+), 10892 deletions(-) rename {src => Source}/adafruit_circuitplayground/__init__.py (100%) rename {src => Source}/adafruit_circuitplayground/constants.py (100%) rename {src => Source}/adafruit_circuitplayground/express.py (100%) rename {src => Source}/adafruit_circuitplayground/locale/en/LC_MESSAGES/express.po (100%) rename {src => Source}/adafruit_circuitplayground/locale/express.pot (100%) rename {src => Source}/adafruit_circuitplayground/pixel.py (100%) rename {src => Source}/adafruit_circuitplayground/test/__init__.py (100%) rename {src => Source}/adafruit_circuitplayground/test/sample.mp4 (100%) rename {src => Source}/adafruit_circuitplayground/test/sample.wav (100%) rename {src => Source}/adafruit_circuitplayground/test/test_express.py (100%) rename {src => Source}/adafruit_circuitplayground/test/test_pixel.py (100%) rename {src => Source}/base_circuitpython/__init__.py (96%) rename {src => Source}/base_circuitpython/base_cp_constants.py (100%) rename {src => Source}/base_circuitpython/board.py (92%) rename {src => Source}/base_circuitpython/digitalio.py (95%) rename {src => Source}/base_circuitpython/displayio/__init__.py (96%) rename {src => Source}/base_circuitpython/displayio/bitmap.py (96%) rename {src => Source}/base_circuitpython/displayio/color_type.py (96%) rename {src => Source}/base_circuitpython/displayio/constants.py (97%) rename {src => Source}/base_circuitpython/displayio/group.py (96%) rename {src => Source}/base_circuitpython/displayio/palette.py (97%) rename {src => Source}/base_circuitpython/displayio/test/__init__.py (100%) rename {src => Source}/base_circuitpython/displayio/test/img/group_test_result.bmp (100%) rename {src => Source}/base_circuitpython/displayio/test/test_bitmap.py (97%) rename {src => Source}/base_circuitpython/displayio/test/test_group.py (96%) rename {src => Source}/base_circuitpython/displayio/test/test_palette.py (97%) rename {src => Source}/base_circuitpython/displayio/test/test_tile_grid.py (97%) rename {src => Source}/base_circuitpython/displayio/tile_grid.py (96%) rename {src => Source}/base_circuitpython/fontio.py (97%) rename {src => Source}/base_circuitpython/fonts/ter-u12n.bdf (100%) rename {src => Source}/base_circuitpython/img/blinka.bmp (100%) rename {src => Source}/base_circuitpython/neopixel_write.py (96%) rename {src => Source}/base_circuitpython/pulseio.py (96%) rename {src => Source}/base_circuitpython/terminal_handler.py (96%) rename {src => Source}/base_circuitpython/terminalio.py (97%) rename {src => Source}/base_circuitpython/test/__init__.py (100%) rename {src => Source}/base_circuitpython/test/test_terminal_handler.py (96%) rename {src => Source}/check_if_venv.py (96%) rename {src => Source}/check_python_dependencies.py (100%) rename {src => Source}/clue/__init__.py (96%) rename {src => Source}/clue/adafruit_clue.py (97%) rename {src => Source}/clue/adafruit_display_text/label.py (97%) rename {src => Source}/clue/adafruit_slideshow.py (97%) rename {src => Source}/clue/test/__init__.py (100%) rename {src => Source}/clue/test/img/test_clue_text_1.bmp (100%) rename {src => Source}/clue/test/img/test_display_text_1.bmp (100%) rename {src => Source}/clue/test/img/test_display_text_2.bmp (100%) rename {src => Source}/clue/test/img/test_display_text_3.bmp (100%) rename {src => Source}/clue/test/img/test_display_text_4.bmp (100%) rename {src => Source}/clue/test/img/test_image_shapes_1.bmp (100%) rename {src => Source}/clue/test/img/test_image_shapes_2.bmp (100%) rename {src => Source}/clue/test/img/test_image_shapes_3.bmp (100%) rename {src => Source}/clue/test/img/test_image_shapes_4.bmp (100%) rename {src => Source}/clue/test/img/test_image_shapes_5.bmp (100%) rename {src => Source}/clue/test/img/test_image_text_1.bmp (100%) rename {src => Source}/clue/test/img/test_image_text_2.bmp (100%) rename {src => Source}/clue/test/img/test_image_text_3.bmp (100%) rename {src => Source}/clue/test/img/test_image_text_4.bmp (100%) rename {src => Source}/clue/test/slideshow_pics/pic_1.bmp (100%) rename {src => Source}/clue/test/slideshow_pics/pic_2.bmp (100%) rename {src => Source}/clue/test/slideshow_pics/pic_3.bmp (100%) rename {src => Source}/clue/test/slideshow_pics/pic_4.bmp (100%) rename {src => Source}/clue/test/slideshow_pics/pic_5.bmp (100%) rename {src => Source}/clue/test/slideshow_pics/pic_6.bmp (100%) rename {src => Source}/clue/test/slideshow_pics/pic_7.bmp (100%) rename {src => Source}/clue/test/slideshow_pics/pic_8.bmp (100%) rename {src => Source}/clue/test/test_adafruit_clue.py (97%) rename {src => Source}/clue/test/test_adafruit_display_shapes.py (96%) rename {src => Source}/clue/test/test_adafruit_display_text.py (96%) rename {src => Source}/clue/test/test_adafruit_slideshow.py (96%) rename {src => Source}/clue/test/test_helpers.py (96%) rename {src => Source}/common/__init__.py (100%) rename {src => Source}/common/constants.py (95%) rename {src => Source}/common/debugger_communication_client.py (100%) rename {src => Source}/common/telemetry.py (100%) rename {src => Source}/common/telemetry_events.py (97%) rename {src => Source}/common/test/__init__.py (100%) rename {src => Source}/common/test/test_debugger_communication_client.py (100%) rename {src => Source}/common/test/test_utils.py (100%) rename {src => Source}/common/utils.py (100%) rename {src => Source}/constants.ts (100%) rename {src => Source}/cpxWorkspace.ts (100%) rename {src => Source}/debug_user_code.py (100%) rename {src => Source}/debugger/debugAdapter.ts (100%) rename {src => Source}/debugger/debugAdapterFactory.ts (100%) rename {src => Source}/debuggerCommunicationServer.ts (100%) rename {src => Source}/dev-requirements.txt (100%) rename {src => Source}/device.py (100%) rename {src => Source}/deviceContext.ts (100%) rename {src => Source}/extension.ts (100%) rename {src => Source}/extension_utils/utils.ts (100%) rename {src => Source}/install_dependencies.py (96%) rename {src => Source}/latest_release_note.ts (100%) rename {src => Source}/micropython/__init__.py (100%) rename {src => Source}/micropython/audio.py (100%) rename {src => Source}/micropython/microbit/__init__.py (100%) rename {src => Source}/micropython/microbit/__model/accelerometer.py (100%) rename {src => Source}/micropython/microbit/__model/button.py (100%) rename {src => Source}/micropython/microbit/__model/compass.py (100%) rename {src => Source}/micropython/microbit/__model/constants.py (100%) rename {src => Source}/micropython/microbit/__model/display.py (100%) rename {src => Source}/micropython/microbit/__model/i2c.py (100%) rename {src => Source}/micropython/microbit/__model/image.py (100%) rename {src => Source}/micropython/microbit/__model/microbit_model.py (100%) rename {src => Source}/micropython/microbit/__model/producer_property.py (100%) rename {src => Source}/micropython/microbit/__model/spi.py (100%) rename {src => Source}/micropython/microbit/test/__init__.py (100%) rename {src => Source}/micropython/microbit/test/test_accelerometer.py (100%) rename {src => Source}/micropython/microbit/test/test_button.py (100%) rename {src => Source}/micropython/microbit/test/test_display.py (100%) rename {src => Source}/micropython/microbit/test/test_image.py (100%) rename {src => Source}/micropython/microbit/test/test_init.py (100%) rename {src => Source}/micropython/microbit/test/test_microbit_model.py (100%) rename {src => Source}/micropython/music.py (97%) rename {src => Source}/micropython/radio.py (97%) rename {src => Source}/micropython/speech.py (97%) rename {src => Source}/micropython/utime.py (97%) rename {src => Source}/process_user_code.py (100%) rename {src => Source}/python_constants.py (100%) rename {src => Source}/requirements.txt (100%) rename {src => Source}/serialMonitor.ts (100%) rename {src => Source}/serialPortControl.ts (100%) rename {src => Source}/service/PopupService.ts (96%) rename {src => Source}/service/debuggerCommunicationService.ts (97%) rename {src => Source}/service/deviceSelectionService.ts (96%) rename {src => Source}/service/fileSelectionService.ts (97%) rename {src => Source}/service/messagingService.ts (100%) rename {src => Source}/service/setupService.ts (97%) rename {src => Source}/service/telemetryHandlerService.ts (100%) rename {src => Source}/service/webviewService.ts (100%) rename {src => Source}/simulatorDebugConfigurationProvider.ts (100%) rename {src => Source}/telemetry/getPackageInfo.ts (100%) rename {src => Source}/telemetry/telemetryAI.ts (100%) rename {src => Source}/templates/clue_template.py (97%) rename {src => Source}/templates/cpx_template.py (97%) rename {src => Source}/templates/microbit_template.py (97%) rename {src => Source}/test/runTest.ts (100%) rename {src => Source}/test/suite/index.ts (100%) rename {src => Source}/usbDetector.ts (100%) rename {src => Source}/view/App.css (100%) rename {src => Source}/view/App.spec.tsx (100%) rename {src => Source}/view/App.tsx (100%) rename {src => Source}/view/__snapshots__/App.spec.tsx.snap (100%) rename {src => Source}/view/components/Button.tsx (100%) rename {src => Source}/view/components/Dropdown.tsx (100%) rename {src => Source}/view/components/clue/Clue.spec.tsx (96%) rename {src => Source}/view/components/clue/Clue.tsx (96%) rename {src => Source}/view/components/clue/ClueImage.tsx (97%) rename {src => Source}/view/components/clue/ClueSimulator.tsx (100%) rename {src => Source}/view/components/clue/Clue_svg.tsx (97%) rename {src => Source}/view/components/clue/__snapshots__/Clue.spec.tsx.snap (100%) rename {src => Source}/view/components/cpx/Accessibility_utils.ts (100%) rename {src => Source}/view/components/cpx/Cpx.spec.tsx (96%) rename {src => Source}/view/components/cpx/Cpx.tsx (96%) rename {src => Source}/view/components/cpx/CpxImage.tsx (100%) rename {src => Source}/view/components/cpx/CpxSimulator.tsx (100%) rename {src => Source}/view/components/cpx/Cpx_svg.tsx (100%) rename {src => Source}/view/components/cpx/Cpx_svg_style.tsx (100%) rename {src => Source}/view/components/cpx/Svg_utils.tsx (100%) rename {src => Source}/view/components/cpx/__snapshots__/Cpx.spec.tsx.snap (100%) rename {src => Source}/view/components/microbit/Microbit.spec.tsx (96%) rename {src => Source}/view/components/microbit/Microbit.tsx (96%) rename {src => Source}/view/components/microbit/MicrobitImage.tsx (97%) rename {src => Source}/view/components/microbit/MicrobitSimulator.tsx (97%) rename {src => Source}/view/components/microbit/Microbit_svg.tsx (97%) rename {src => Source}/view/components/microbit/__snapshots__/Microbit.spec.tsx.snap (100%) rename {src => Source}/view/components/simulator/ActionBar.tsx (100%) rename {src => Source}/view/components/toolbar/GenericSliderComponent.tsx (97%) rename {src => Source}/view/components/toolbar/Gesture.tsx (97%) rename {src => Source}/view/components/toolbar/InputSlider.tsx (100%) rename {src => Source}/view/components/toolbar/SensorButton.tsx (100%) rename {src => Source}/view/components/toolbar/SensorModalUtils.tsx (100%) rename {src => Source}/view/components/toolbar/ToolBar.tsx (100%) rename {src => Source}/view/components/toolbar/Toolbar.spec.tsx (96%) rename {src => Source}/view/components/toolbar/__snapshots__/Toolbar.spec.tsx.snap (100%) rename {src => Source}/view/components/toolbar/clue/ClueModalContent.tsx (97%) rename {src => Source}/view/components/toolbar/clue/ClueSensorProperties.tsx (95%) rename {src => Source}/view/components/toolbar/cpx/CpxModalContent.tsx (100%) rename {src => Source}/view/components/toolbar/cpx/CpxSensorProperties.tsx (100%) rename {src => Source}/view/components/toolbar/microbit/MicrobitModalContent.tsx (97%) rename {src => Source}/view/components/toolbar/microbit/MicrobitSensorProperties.tsx (100%) rename {src => Source}/view/constants.ts (100%) rename {src => Source}/view/container/device/Device.spec.tsx (97%) rename {src => Source}/view/container/device/Device.tsx (100%) rename {src => Source}/view/container/device/__snapshots__/Device.spec.tsx.snap (100%) rename {src => Source}/view/context.ts (100%) rename {src => Source}/view/index.css (100%) rename {src => Source}/view/index.tsx (100%) rename {src => Source}/view/pages/__snapshots__/gettingStarted.spec.tsx.snap (100%) rename {src => Source}/view/pages/gettingStarted.css (95%) rename {src => Source}/view/pages/gettingStarted.spec.tsx (96%) rename {src => Source}/view/pages/gettingStarted.tsx (98%) rename {src => Source}/view/pages/gettingStartedPictures/debugger/debugger_vars.png (100%) rename {src => Source}/view/pages/gettingStartedPictures/debugger/debugging.gif (100%) rename {src => Source}/view/pages/gettingStartedPictures/debugger/start_debugging.jpg (100%) rename {src => Source}/view/pages/gettingStartedPictures/debugger/toolbar.png (100%) rename {src => Source}/view/react-app-env.d.ts (100%) rename {src => Source}/view/styles/Button.css (100%) rename {src => Source}/view/styles/Dropdown.css (100%) rename {src => Source}/view/styles/InputSlider.css (100%) rename {src => Source}/view/styles/LightSensorBar.css (100%) rename {src => Source}/view/styles/MotionSensorBar.css (100%) rename {src => Source}/view/styles/SensorButton.css (100%) rename {src => Source}/view/styles/Simulator.css (100%) rename {src => Source}/view/styles/SimulatorSvg.css (93%) rename {src => Source}/view/styles/TemperatureSensorBar.css (100%) rename {src => Source}/view/styles/ToolBar.css (100%) rename {src => Source}/view/svgs/arrow_right_svg.tsx (100%) rename {src => Source}/view/svgs/close_svg.tsx (100%) rename {src => Source}/view/svgs/play_svg.tsx (100%) rename {src => Source}/view/svgs/refresh_svg.tsx (100%) rename {src => Source}/view/svgs/stop_svg.tsx (100%) rename {src => Source}/view/svgs/tag_input_svg.tsx (100%) rename {src => Source}/view/svgs/tag_output_svg.tsx (100%) rename {src => Source}/view/svgs/toolbar_svg.tsx (100%) rename {src => Source}/view/translations/en.json (99%) rename {src => Source}/view/tsconfig.json (100%) rename {src => Source}/view/utils/MessageUtils.tsx (95%) rename {src => Source}/view/viewUtils.tsx (100%) rename {src => Source}/vscode_import.ts (100%) diff --git a/src/adafruit_circuitplayground/__init__.py b/Source/adafruit_circuitplayground/__init__.py similarity index 100% rename from src/adafruit_circuitplayground/__init__.py rename to Source/adafruit_circuitplayground/__init__.py diff --git a/src/adafruit_circuitplayground/constants.py b/Source/adafruit_circuitplayground/constants.py similarity index 100% rename from src/adafruit_circuitplayground/constants.py rename to Source/adafruit_circuitplayground/constants.py diff --git a/src/adafruit_circuitplayground/express.py b/Source/adafruit_circuitplayground/express.py similarity index 100% rename from src/adafruit_circuitplayground/express.py rename to Source/adafruit_circuitplayground/express.py diff --git a/src/adafruit_circuitplayground/locale/en/LC_MESSAGES/express.po b/Source/adafruit_circuitplayground/locale/en/LC_MESSAGES/express.po similarity index 100% rename from src/adafruit_circuitplayground/locale/en/LC_MESSAGES/express.po rename to Source/adafruit_circuitplayground/locale/en/LC_MESSAGES/express.po diff --git a/src/adafruit_circuitplayground/locale/express.pot b/Source/adafruit_circuitplayground/locale/express.pot similarity index 100% rename from src/adafruit_circuitplayground/locale/express.pot rename to Source/adafruit_circuitplayground/locale/express.pot diff --git a/src/adafruit_circuitplayground/pixel.py b/Source/adafruit_circuitplayground/pixel.py similarity index 100% rename from src/adafruit_circuitplayground/pixel.py rename to Source/adafruit_circuitplayground/pixel.py diff --git a/src/adafruit_circuitplayground/test/__init__.py b/Source/adafruit_circuitplayground/test/__init__.py similarity index 100% rename from src/adafruit_circuitplayground/test/__init__.py rename to Source/adafruit_circuitplayground/test/__init__.py diff --git a/src/adafruit_circuitplayground/test/sample.mp4 b/Source/adafruit_circuitplayground/test/sample.mp4 similarity index 100% rename from src/adafruit_circuitplayground/test/sample.mp4 rename to Source/adafruit_circuitplayground/test/sample.mp4 diff --git a/src/adafruit_circuitplayground/test/sample.wav b/Source/adafruit_circuitplayground/test/sample.wav similarity index 100% rename from src/adafruit_circuitplayground/test/sample.wav rename to Source/adafruit_circuitplayground/test/sample.wav diff --git a/src/adafruit_circuitplayground/test/test_express.py b/Source/adafruit_circuitplayground/test/test_express.py similarity index 100% rename from src/adafruit_circuitplayground/test/test_express.py rename to Source/adafruit_circuitplayground/test/test_express.py diff --git a/src/adafruit_circuitplayground/test/test_pixel.py b/Source/adafruit_circuitplayground/test/test_pixel.py similarity index 100% rename from src/adafruit_circuitplayground/test/test_pixel.py rename to Source/adafruit_circuitplayground/test/test_pixel.py diff --git a/src/base_circuitpython/__init__.py b/Source/base_circuitpython/__init__.py similarity index 96% rename from src/base_circuitpython/__init__.py rename to Source/base_circuitpython/__init__.py index 398a3936b..719319efe 100644 --- a/src/base_circuitpython/__init__.py +++ b/Source/base_circuitpython/__init__.py @@ -1,8 +1,8 @@ -import pathlib -import os -import sys - -abs_path = pathlib.Path(__file__).parent.absolute() -clue_path = os.path.join(abs_path, "../clue") -sys.path.insert(0, os.path.join(abs_path)) -sys.path.insert(0, os.path.join(clue_path)) +import pathlib +import os +import sys + +abs_path = pathlib.Path(__file__).parent.absolute() +clue_path = os.path.join(abs_path, "../clue") +sys.path.insert(0, os.path.join(abs_path)) +sys.path.insert(0, os.path.join(clue_path)) diff --git a/src/base_circuitpython/base_cp_constants.py b/Source/base_circuitpython/base_cp_constants.py similarity index 100% rename from src/base_circuitpython/base_cp_constants.py rename to Source/base_circuitpython/base_cp_constants.py diff --git a/src/base_circuitpython/board.py b/Source/base_circuitpython/board.py similarity index 92% rename from src/base_circuitpython/board.py rename to Source/base_circuitpython/board.py index 8bef9ed4f..5b01da9f6 100644 --- a/src/base_circuitpython/board.py +++ b/Source/base_circuitpython/board.py @@ -1,128 +1,128 @@ -# dummy class for references to board display to work -# https://learn.adafruit.com/arduino-to-circuitpython/the-board-module - - -import terminal_handler - - -class __Display: - def __init__(self): - self.active_group = None - self.terminal = terminal_handler.Terminal() - - def show(self, group=None): - if group != self.active_group: - self.active_group = group - - if group == None: - self.terminal._Terminal__draw() - return - - # if the group has no attribute called - # "draw", then it is liable for updating itself - # when it calls show - if hasattr(group, "_Group__draw"): - group._Group__draw() - - -DISPLAY = __Display() - -# default pin for neopixel, -# shows that this could -# refer to the CPX -# or CLUE neopixel pin -NEOPIXEL = "D00" - -# ETC PINS WITHIN THE CLUE THAT MAY BE REFERENCED -# found by runing print(dir(board)) on clue -A0 = 0 -A1 = 0 -A2 = 0 -A3 = 0 -A4 = 0 -A5 = 0 -A6 = 0 -A7 = 0 - -ACCELEROMETER_GYRO_INTERRUPT = 0 - -BUTTON_A = 0 -BUTTON_B = 0 - -D0 = 0 -D1 = 0 -D2 = 0 -D3 = 0 -D4 = 0 -D5 = 0 -D6 = 0 -D7 = 0 -D8 = 0 -D9 = 0 -D10 = 0 -D11 = 0 -D12 = 0 -D13 = 0 -D14 = 0 -D15 = 0 -D16 = 0 -D17 = 0 -D18 = 0 -D19 = 0 -D20 = 0 - -I2C = 0 - -L = 0 - -MICROPHONE_CLOCK = 0 -MICROPHONE_DATA = 0 - -MISO = 0 -MOSI = 0 - -P0 = 0 -P1 = 0 -P2 = 0 -P3 = 0 -P4 = 0 -P5 = 0 -P6 = 0 -P7 = 0 -P8 = 0 -P9 = 0 -P10 = 0 -P11 = 0 -P12 = 0 -P13 = 0 -P14 = 0 -P15 = 0 -P16 = 0 -P17 = 0 -P18 = 0 -P19 = 0 -P20 = 0 - -PROXIMITY_LIGHT_INTERRUPT = 0 - -RX = 0 -SCK = 0 -SCL = 0 -SDA = 0 - -SPEAKER = 0 - -SPI = 0 - -TFT_BACKLIGHT = 0 -TFT_CS = 0 -TFT_DC = 0 -TFT_MOSI = 0 -TFT_RESET = 0 -TFT_SCK = 0 - -TX = 0 - -UART = 0 - -WHITE_LEDS = 0 +# dummy class for references to board display to work +# https://learn.adafruit.com/arduino-to-circuitpython/the-board-module + + +import terminal_handler + + +class __Display: + def __init__(self): + self.active_group = None + self.terminal = terminal_handler.Terminal() + + def show(self, group=None): + if group != self.active_group: + self.active_group = group + + if group == None: + self.terminal._Terminal__draw() + return + + # if the group has no attribute called + # "draw", then it is liable for updating itself + # when it calls show + if hasattr(group, "_Group__draw"): + group._Group__draw() + + +DISPLAY = __Display() + +# default pin for neopixel, +# shows that this could +# refer to the CPX +# or CLUE neopixel pin +NEOPIXEL = "D00" + +# ETC PINS WITHIN THE CLUE THAT MAY BE REFERENCED +# found by runing print(dir(board)) on clue +A0 = 0 +A1 = 0 +A2 = 0 +A3 = 0 +A4 = 0 +A5 = 0 +A6 = 0 +A7 = 0 + +ACCELEROMETER_GYRO_INTERRUPT = 0 + +BUTTON_A = 0 +BUTTON_B = 0 + +D0 = 0 +D1 = 0 +D2 = 0 +D3 = 0 +D4 = 0 +D5 = 0 +D6 = 0 +D7 = 0 +D8 = 0 +D9 = 0 +D10 = 0 +D11 = 0 +D12 = 0 +D13 = 0 +D14 = 0 +D15 = 0 +D16 = 0 +D17 = 0 +D18 = 0 +D19 = 0 +D20 = 0 + +I2C = 0 + +L = 0 + +MICROPHONE_CLOCK = 0 +MICROPHONE_DATA = 0 + +MISO = 0 +MOSI = 0 + +P0 = 0 +P1 = 0 +P2 = 0 +P3 = 0 +P4 = 0 +P5 = 0 +P6 = 0 +P7 = 0 +P8 = 0 +P9 = 0 +P10 = 0 +P11 = 0 +P12 = 0 +P13 = 0 +P14 = 0 +P15 = 0 +P16 = 0 +P17 = 0 +P18 = 0 +P19 = 0 +P20 = 0 + +PROXIMITY_LIGHT_INTERRUPT = 0 + +RX = 0 +SCK = 0 +SCL = 0 +SDA = 0 + +SPEAKER = 0 + +SPI = 0 + +TFT_BACKLIGHT = 0 +TFT_CS = 0 +TFT_DC = 0 +TFT_MOSI = 0 +TFT_RESET = 0 +TFT_SCK = 0 + +TX = 0 + +UART = 0 + +WHITE_LEDS = 0 diff --git a/src/base_circuitpython/digitalio.py b/Source/base_circuitpython/digitalio.py similarity index 95% rename from src/base_circuitpython/digitalio.py rename to Source/base_circuitpython/digitalio.py index 604db72c3..8d755be82 100644 --- a/src/base_circuitpython/digitalio.py +++ b/Source/base_circuitpython/digitalio.py @@ -1,17 +1,17 @@ -# dummy class for neopixel library to work - -# original implementation docs for digitalio: -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/digitalio/__init__.html - - -class DigitalInOut: - def __init__(self, pin): - self.pin = pin - pass - - def deinit(self): - pass - - -class Direction: - OUTPUT = 0 +# dummy class for neopixel library to work + +# original implementation docs for digitalio: +# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/digitalio/__init__.html + + +class DigitalInOut: + def __init__(self, pin): + self.pin = pin + pass + + def deinit(self): + pass + + +class Direction: + OUTPUT = 0 diff --git a/src/base_circuitpython/displayio/__init__.py b/Source/base_circuitpython/displayio/__init__.py similarity index 96% rename from src/base_circuitpython/displayio/__init__.py rename to Source/base_circuitpython/displayio/__init__.py index a926bf965..d3cce835b 100644 --- a/src/base_circuitpython/displayio/__init__.py +++ b/Source/base_circuitpython/displayio/__init__.py @@ -1,11 +1,11 @@ -# Displayio implementation loosely based on the -# displayio package in Adafruit CircuitPython - -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/__init__.html - -from .bitmap import Bitmap -from .group import Group -from .palette import Palette - -# references to img and bmp_img are for testing purposes -from .tile_grid import TileGrid +# Displayio implementation loosely based on the +# displayio package in Adafruit CircuitPython + +# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/__init__.html + +from .bitmap import Bitmap +from .group import Group +from .palette import Palette + +# references to img and bmp_img are for testing purposes +from .tile_grid import TileGrid diff --git a/src/base_circuitpython/displayio/bitmap.py b/Source/base_circuitpython/displayio/bitmap.py similarity index 96% rename from src/base_circuitpython/displayio/bitmap.py rename to Source/base_circuitpython/displayio/bitmap.py index c913dff2b..b694b6172 100644 --- a/src/base_circuitpython/displayio/bitmap.py +++ b/Source/base_circuitpython/displayio/bitmap.py @@ -1,105 +1,105 @@ -from . import constants as CONSTANTS - -# Bitmap implementation loosely based on the -# displayio.Bitmap class in Adafruit CircuitPython - -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/Bitmap.html - -# The colour of a certain pixel is interpreted -# within the TileGrid instance that the object -# lives within. Each pixel is an integer value -# that refers to the colours in the palette via index. - - -class Bitmap: - """ - .. currentmodule:: displayio - - `Bitmap` -- Stores values in a 2D array - ========================================================================== - - Stores values of a certain size in a 2D array - - .. class:: Bitmap(width, height, value_count) - - Create a Bitmap object with the given fixed size. Each pixel stores a value that is used to - index into a corresponding palette. This enables differently colored sprites to share the - underlying Bitmap. value_count is used to minimize the memory used to store the Bitmap. - - :param int width: The number of values wide - :param int height: The number of values high - :param int value_count: The number of possible pixel values. - - """ - - def __init__(self, width, height, value_count=255): - self.__width = width - self.__height = height - self.values = bytearray(width * height) - - @property - def width(self): - """ - .. attribute:: width - - Width of the bitmap. (read only) - - """ - return self.__width - - @property - def height(self): - """ - .. attribute:: height - - Height of the bitmap. (read only) - - """ - return self.__height - - def __setitem__(self, index, value): - """ - .. method:: __setitem__(index, value) - - Sets the value at the given index. The index can either be an x,y tuple or an int equal - to ``y * width + x``. - - This allows you to:: - - bitmap[0,1] = 3 - - """ - if isinstance(index, tuple): - if index[0] >= self.width or index[1] >= self.height: - raise IndexError(CONSTANTS.PIXEL_OUT_OF_BOUNDS) - - index = index[0] + index[1] * self.width - - try: - self.values[index] = value - except IndexError: - raise IndexError(CONSTANTS.PIXEL_OUT_OF_BOUNDS) - - def __getitem__(self, index): - """ - .. method:: __getitem__(index) - - Returns the value at the given index. The index can either be an x,y tuple or an int equal - to ``y * width + x``. - - This allows you to:: - - print(bitmap[0,1]) - - """ - - if isinstance(index, tuple): - if index[0] >= self.width or index[1] >= self.height: - raise IndexError(CONSTANTS.PIXEL_OUT_OF_BOUNDS) - - index = index[0] + index[1] * self.width - - try: - return self.values[index] - except IndexError: - raise IndexError(CONSTANTS.PIXEL_OUT_OF_BOUNDS) +from . import constants as CONSTANTS + +# Bitmap implementation loosely based on the +# displayio.Bitmap class in Adafruit CircuitPython + +# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/Bitmap.html + +# The colour of a certain pixel is interpreted +# within the TileGrid instance that the object +# lives within. Each pixel is an integer value +# that refers to the colours in the palette via index. + + +class Bitmap: + """ + .. currentmodule:: displayio + + `Bitmap` -- Stores values in a 2D array + ========================================================================== + + Stores values of a certain size in a 2D array + + .. class:: Bitmap(width, height, value_count) + + Create a Bitmap object with the given fixed size. Each pixel stores a value that is used to + index into a corresponding palette. This enables differently colored sprites to share the + underlying Bitmap. value_count is used to minimize the memory used to store the Bitmap. + + :param int width: The number of values wide + :param int height: The number of values high + :param int value_count: The number of possible pixel values. + + """ + + def __init__(self, width, height, value_count=255): + self.__width = width + self.__height = height + self.values = bytearray(width * height) + + @property + def width(self): + """ + .. attribute:: width + + Width of the bitmap. (read only) + + """ + return self.__width + + @property + def height(self): + """ + .. attribute:: height + + Height of the bitmap. (read only) + + """ + return self.__height + + def __setitem__(self, index, value): + """ + .. method:: __setitem__(index, value) + + Sets the value at the given index. The index can either be an x,y tuple or an int equal + to ``y * width + x``. + + This allows you to:: + + bitmap[0,1] = 3 + + """ + if isinstance(index, tuple): + if index[0] >= self.width or index[1] >= self.height: + raise IndexError(CONSTANTS.PIXEL_OUT_OF_BOUNDS) + + index = index[0] + index[1] * self.width + + try: + self.values[index] = value + except IndexError: + raise IndexError(CONSTANTS.PIXEL_OUT_OF_BOUNDS) + + def __getitem__(self, index): + """ + .. method:: __getitem__(index) + + Returns the value at the given index. The index can either be an x,y tuple or an int equal + to ``y * width + x``. + + This allows you to:: + + print(bitmap[0,1]) + + """ + + if isinstance(index, tuple): + if index[0] >= self.width or index[1] >= self.height: + raise IndexError(CONSTANTS.PIXEL_OUT_OF_BOUNDS) + + index = index[0] + index[1] * self.width + + try: + return self.values[index] + except IndexError: + raise IndexError(CONSTANTS.PIXEL_OUT_OF_BOUNDS) diff --git a/src/base_circuitpython/displayio/color_type.py b/Source/base_circuitpython/displayio/color_type.py similarity index 96% rename from src/base_circuitpython/displayio/color_type.py rename to Source/base_circuitpython/displayio/color_type.py index c56347315..9589028dd 100644 --- a/src/base_circuitpython/displayio/color_type.py +++ b/Source/base_circuitpython/displayio/color_type.py @@ -1,12 +1,12 @@ -# Datatype for the items within a palette -class _ColorType: - def __init__(self, rgb888): - self.rgb888 = rgb888 - self.transparent = False - - def __eq__(self, other): - return ( - isinstance(other, _ColorType) - and self.rgb888 == other.rgb888 - and self.transparent == other.transparent - ) +# Datatype for the items within a palette +class _ColorType: + def __init__(self, rgb888): + self.rgb888 = rgb888 + self.transparent = False + + def __eq__(self, other): + return ( + isinstance(other, _ColorType) + and self.rgb888 == other.rgb888 + and self.transparent == other.transparent + ) diff --git a/src/base_circuitpython/displayio/constants.py b/Source/base_circuitpython/displayio/constants.py similarity index 97% rename from src/base_circuitpython/displayio/constants.py rename to Source/base_circuitpython/displayio/constants.py index bca672472..0a2f180d4 100644 --- a/src/base_circuitpython/displayio/constants.py +++ b/Source/base_circuitpython/displayio/constants.py @@ -1,12 +1,12 @@ -PIXEL_OUT_OF_BOUNDS = "pixel coordinates out of bounds" -PALETTE_OUT_OF_RANGE = "Palette index out of range" -TILE_OUT_OF_BOUNDS = "Tile index out of bounds" -INCORR_SUBCLASS = "Layer must be a Group or TileGrid subclass." -LAYER_ALREADY_IN_GROUP = "Layer already in a group." -GROUP_FULL = "Group Full" -SCALE_TOO_SMALL = "scale must be >= 1" - -SCREEN_HEIGHT_WIDTH = 240 - -CLUE = "CLUE" -BASE_64 = "display_base64" +PIXEL_OUT_OF_BOUNDS = "pixel coordinates out of bounds" +PALETTE_OUT_OF_RANGE = "Palette index out of range" +TILE_OUT_OF_BOUNDS = "Tile index out of bounds" +INCORR_SUBCLASS = "Layer must be a Group or TileGrid subclass." +LAYER_ALREADY_IN_GROUP = "Layer already in a group." +GROUP_FULL = "Group Full" +SCALE_TOO_SMALL = "scale must be >= 1" + +SCREEN_HEIGHT_WIDTH = 240 + +CLUE = "CLUE" +BASE_64 = "display_base64" diff --git a/src/base_circuitpython/displayio/group.py b/Source/base_circuitpython/displayio/group.py similarity index 96% rename from src/base_circuitpython/displayio/group.py rename to Source/base_circuitpython/displayio/group.py index 5acc1f2a8..fa7c142a8 100644 --- a/src/base_circuitpython/displayio/group.py +++ b/Source/base_circuitpython/displayio/group.py @@ -1,354 +1,354 @@ -import base64 -from io import BytesIO -from PIL import Image -import adafruit_display_text - -from displayio.tile_grid import TileGrid -from . import constants as CONSTANTS - -import common -import board -import sys - -# Group implementation loosely based on the -# displayio.Group class in Adafruit CircuitPython -# (with only the functions needed for the CLUE) - -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/Group.html - - -class Group: - """ - `Group` -- Group together sprites and subgroups - ========================================================================== - - Manage a group of sprites and groups and how they are inter-related. - - .. class:: Group(*, max_size=4, scale=1, x=0, y=0) - Create a Group of a given size and scale. Scale is in one dimension. For example, scale=2 - leads to a layer's pixel being 2x2 pixels when in the group. - :param int max_size: The maximum group size. - :param int scale: Scale of layer pixels in one dimension. - :param int x: Initial x position within the parent. - :param int y: Initial y position within the parent. - """ - - def __init__( - self, - max_size=sys.maxsize, - scale=1, - x=0, - y=0, - check_active_group_ref=True, - auto_write=True, - ): - self.__check_active_group_ref = check_active_group_ref - self.__auto_write = auto_write - self.__contents = [] - self.__max_size = max_size - - if scale < 1: - raise ValueError(CONSTANTS.SCALE_TOO_SMALL) - - self.__scale = scale - """ - .. attribute:: scale - - Scales each pixel within the Group in both directions. For example, when scale=2 each pixel - will be represented by 2x2 pixels. - - """ - self.__x = x - """ - .. attribute:: x - - X position of the Group in the parent. - - """ - self.__y = y - """ - .. attribute:: y - - Y position of the Group in the parent. - """ - self.__parent = None - self.__hidden = False - - @property - def x(self): - return self.__x - - @x.setter - def x(self, val): - if self.__x != val: - self.__x = val - self.__elem_changed() - - @property - def y(self): - return self.__y - - @y.setter - def y(self, val): - if self.__y != val: - self.__y = val - self.__elem_changed() - - @property - def scale(self): - return self.__scale - - @scale.setter - def scale(self, val): - if val < 1: - raise ValueError(CONSTANTS.SCALE_TOO_SMALL) - - if self.__scale != val: - self.__scale = val - self.__elem_changed() - - @property - def hidden(self): - """ - .. attribute:: hidden - - True when the Group and all of it's layers are not visible. When False, the Group's layers - are visible if they haven't been hidden. - """ - return self.__hidden - - @hidden.setter - def hidden(self, val): - changed = val != self.__hidden - self.__hidden = val - for elem in self.__contents: - elem.hidden = val - - if changed: - self.__elem_changed() - - def append(self, item): - """ - .. method:: append(layer) - - Append a layer to the group. It will be drawn above other layers. - """ - self.__prepare_for_add(item) - self.__contents.append(item) - self.__elem_changed() - - def insert(self, idx, item): - """ - .. method:: insert(index, layer) - - Insert a layer into the group. - """ - self.__prepare_for_add(item) - self.__contents.insert(idx, item) - self.__elem_changed() - - def index(self, layer): - """ - .. method:: index(layer) - - Returns the index of the first copy of layer. Raises ValueError if not found. - """ - for idx, elem in enumerate(self.__contents): - if elem == layer: - return idx - - return ValueError() - - def pop(self, i=-1): - """ - .. method:: pop(i=-1) - - Remove the ith item and return it. - """ - item = self.__contents.pop(i) - self.__set_parent(item, None) - self.__elem_changed() - return item - - def remove(self, layer): - """ - .. method:: remove(layer) - - Remove the first copy of layer. Raises ValueError if it is not present. - """ - idx = self.index(layer) - item = self.__contents[idx] - - self.__set_parent(item, None) - self.__contents.pop(idx) - self.__elem_changed() - - def __delitem__(self, index): - """ - .. method:: __delitem__(index) - - Deletes the value at the given index. - - This allows you to:: - - del group[0] - """ - item = self.__contents[index] - self.__set_parent(item, None) - del self.__contents[index] - self.__elem_changed() - - def __getitem__(self, index): - """ - .. method:: __getitem__(index) - - Returns the value at the given index. - - This allows you to:: - - print(group[0]) - - """ - return self.__contents[index] - - def __setitem__(self, index, val): - """ - .. method:: __setitem__(index, value) - - Sets the value at the given index. - - This allows you to:: - - group[0] = sprite - """ - old_val = self.__contents[index] - - self.__contents[index] = val - if old_val != val: - self.__elem_changed() - - def __len__(self): - """ - .. method:: __len__() - - Returns the number of layers in a Group - """ - if not self.__contents: - return 0 - else: - return len(self.__contents) - - @property - def __in_group(self): - return self.__parent != None - - def __prepare_for_add(self, item): - if len(self.__contents) == self.__max_size: - raise RuntimeError(CONSTANTS.GROUP_FULL) - elif not isinstance(item, TileGrid) and not isinstance(item, Group): - raise ValueError(CONSTANTS.INCORR_SUBCLASS) - elif (isinstance(item, Group) and item._Group__in_group) or ( - isinstance(item, TileGrid) and item._TileGrid__in_group - ): - raise ValueError(CONSTANTS.LAYER_ALREADY_IN_GROUP) - self.__set_parent(item, self) - - def __set_parent(self, item, val): - if isinstance(item, TileGrid): - item._TileGrid__parent = val - else: - item._Group__parent = val - - def __elem_changed(self): - # Ensure that this group is what the board is currently showing. - # Otherwise, don't bother to draw it. - if self.__auto_write: - self.__trigger_draw() - - def __trigger_draw(self): - # select the correct parent to draw from if necessary - if self.__check_active_group_ref and board.DISPLAY.active_group == self: - self.__draw() - - elif self.__in_group: - # If a sub-group is modified, propagate to top level to - # see if one of the parents are the current active group. - self.__parent._Group__elem_changed() - - def __draw(self, img=None, x=0, y=0, scale=None, show=True): - # this function is not a part of the orignal implementation - # it is what draws itself and its children and potentially shows it to the - # frontend - if img == None: - img = Image.new( - "RGBA", - (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), - (0, 0, 0, 0), - ) - if scale is None: - scale = self.scale - else: - scale *= self.scale - - try: - if isinstance(self, adafruit_display_text.label.Label): - # adafruit_display_text has some positioning considerations - # that need to be handled. - - # This was found manually, display must be positioned upwards - # 1 unit (1 unit * scale = scale) - y -= scale - - # Group is positioned against anchored_position (already incorporated into self.x and self.y), - # which is positioned against anchor_point - - x += self._anchor_point[0] - y += self._anchor_point[1] - except AttributeError: - pass - - for elem in self.__contents: - if not elem.hidden: - if isinstance(elem, Group): - img = elem._Group__draw( - img=img, x=x + self.x, y=y + self.y, scale=scale, show=False, - ) - else: - img = elem._TileGrid__draw( - img=img, x=x + self.x, y=y + self.y, scale=scale - ) - - # show should only be true to the highest parent group - if show: - self.__show(img) - - # return value only used if this is within another group - return img - - def __show(self, img): - # sends current img to the frontend - buffered = BytesIO() - img.save(buffered, format="BMP") - byte_base64 = base64.b64encode(buffered.getvalue()) - img_str = str(byte_base64)[2:-1] - - sendable_json = {CONSTANTS.BASE_64: img_str} - - if common.utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - sendable_json, CONSTANTS.CLUE - ) - else: - common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) - - def __len__(self): - if not self.__contents: - return 0 - else: - return len(self.__contents) - - def pop(self, i=-1): - item = self.__contents.pop(i) - item.parent = None - self.__elem_changed() - return item +import base64 +from io import BytesIO +from PIL import Image +import adafruit_display_text + +from displayio.tile_grid import TileGrid +from . import constants as CONSTANTS + +import common +import board +import sys + +# Group implementation loosely based on the +# displayio.Group class in Adafruit CircuitPython +# (with only the functions needed for the CLUE) + +# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/Group.html + + +class Group: + """ + `Group` -- Group together sprites and subgroups + ========================================================================== + + Manage a group of sprites and groups and how they are inter-related. + + .. class:: Group(*, max_size=4, scale=1, x=0, y=0) + Create a Group of a given size and scale. Scale is in one dimension. For example, scale=2 + leads to a layer's pixel being 2x2 pixels when in the group. + :param int max_size: The maximum group size. + :param int scale: Scale of layer pixels in one dimension. + :param int x: Initial x position within the parent. + :param int y: Initial y position within the parent. + """ + + def __init__( + self, + max_size=sys.maxsize, + scale=1, + x=0, + y=0, + check_active_group_ref=True, + auto_write=True, + ): + self.__check_active_group_ref = check_active_group_ref + self.__auto_write = auto_write + self.__contents = [] + self.__max_size = max_size + + if scale < 1: + raise ValueError(CONSTANTS.SCALE_TOO_SMALL) + + self.__scale = scale + """ + .. attribute:: scale + + Scales each pixel within the Group in both directions. For example, when scale=2 each pixel + will be represented by 2x2 pixels. + + """ + self.__x = x + """ + .. attribute:: x + + X position of the Group in the parent. + + """ + self.__y = y + """ + .. attribute:: y + + Y position of the Group in the parent. + """ + self.__parent = None + self.__hidden = False + + @property + def x(self): + return self.__x + + @x.setter + def x(self, val): + if self.__x != val: + self.__x = val + self.__elem_changed() + + @property + def y(self): + return self.__y + + @y.setter + def y(self, val): + if self.__y != val: + self.__y = val + self.__elem_changed() + + @property + def scale(self): + return self.__scale + + @scale.setter + def scale(self, val): + if val < 1: + raise ValueError(CONSTANTS.SCALE_TOO_SMALL) + + if self.__scale != val: + self.__scale = val + self.__elem_changed() + + @property + def hidden(self): + """ + .. attribute:: hidden + + True when the Group and all of it's layers are not visible. When False, the Group's layers + are visible if they haven't been hidden. + """ + return self.__hidden + + @hidden.setter + def hidden(self, val): + changed = val != self.__hidden + self.__hidden = val + for elem in self.__contents: + elem.hidden = val + + if changed: + self.__elem_changed() + + def append(self, item): + """ + .. method:: append(layer) + + Append a layer to the group. It will be drawn above other layers. + """ + self.__prepare_for_add(item) + self.__contents.append(item) + self.__elem_changed() + + def insert(self, idx, item): + """ + .. method:: insert(index, layer) + + Insert a layer into the group. + """ + self.__prepare_for_add(item) + self.__contents.insert(idx, item) + self.__elem_changed() + + def index(self, layer): + """ + .. method:: index(layer) + + Returns the index of the first copy of layer. Raises ValueError if not found. + """ + for idx, elem in enumerate(self.__contents): + if elem == layer: + return idx + + return ValueError() + + def pop(self, i=-1): + """ + .. method:: pop(i=-1) + + Remove the ith item and return it. + """ + item = self.__contents.pop(i) + self.__set_parent(item, None) + self.__elem_changed() + return item + + def remove(self, layer): + """ + .. method:: remove(layer) + + Remove the first copy of layer. Raises ValueError if it is not present. + """ + idx = self.index(layer) + item = self.__contents[idx] + + self.__set_parent(item, None) + self.__contents.pop(idx) + self.__elem_changed() + + def __delitem__(self, index): + """ + .. method:: __delitem__(index) + + Deletes the value at the given index. + + This allows you to:: + + del group[0] + """ + item = self.__contents[index] + self.__set_parent(item, None) + del self.__contents[index] + self.__elem_changed() + + def __getitem__(self, index): + """ + .. method:: __getitem__(index) + + Returns the value at the given index. + + This allows you to:: + + print(group[0]) + + """ + return self.__contents[index] + + def __setitem__(self, index, val): + """ + .. method:: __setitem__(index, value) + + Sets the value at the given index. + + This allows you to:: + + group[0] = sprite + """ + old_val = self.__contents[index] + + self.__contents[index] = val + if old_val != val: + self.__elem_changed() + + def __len__(self): + """ + .. method:: __len__() + + Returns the number of layers in a Group + """ + if not self.__contents: + return 0 + else: + return len(self.__contents) + + @property + def __in_group(self): + return self.__parent != None + + def __prepare_for_add(self, item): + if len(self.__contents) == self.__max_size: + raise RuntimeError(CONSTANTS.GROUP_FULL) + elif not isinstance(item, TileGrid) and not isinstance(item, Group): + raise ValueError(CONSTANTS.INCORR_SUBCLASS) + elif (isinstance(item, Group) and item._Group__in_group) or ( + isinstance(item, TileGrid) and item._TileGrid__in_group + ): + raise ValueError(CONSTANTS.LAYER_ALREADY_IN_GROUP) + self.__set_parent(item, self) + + def __set_parent(self, item, val): + if isinstance(item, TileGrid): + item._TileGrid__parent = val + else: + item._Group__parent = val + + def __elem_changed(self): + # Ensure that this group is what the board is currently showing. + # Otherwise, don't bother to draw it. + if self.__auto_write: + self.__trigger_draw() + + def __trigger_draw(self): + # select the correct parent to draw from if necessary + if self.__check_active_group_ref and board.DISPLAY.active_group == self: + self.__draw() + + elif self.__in_group: + # If a sub-group is modified, propagate to top level to + # see if one of the parents are the current active group. + self.__parent._Group__elem_changed() + + def __draw(self, img=None, x=0, y=0, scale=None, show=True): + # this function is not a part of the orignal implementation + # it is what draws itself and its children and potentially shows it to the + # frontend + if img == None: + img = Image.new( + "RGBA", + (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), + (0, 0, 0, 0), + ) + if scale is None: + scale = self.scale + else: + scale *= self.scale + + try: + if isinstance(self, adafruit_display_text.label.Label): + # adafruit_display_text has some positioning considerations + # that need to be handled. + + # This was found manually, display must be positioned upwards + # 1 unit (1 unit * scale = scale) + y -= scale + + # Group is positioned against anchored_position (already incorporated into self.x and self.y), + # which is positioned against anchor_point + + x += self._anchor_point[0] + y += self._anchor_point[1] + except AttributeError: + pass + + for elem in self.__contents: + if not elem.hidden: + if isinstance(elem, Group): + img = elem._Group__draw( + img=img, x=x + self.x, y=y + self.y, scale=scale, show=False, + ) + else: + img = elem._TileGrid__draw( + img=img, x=x + self.x, y=y + self.y, scale=scale + ) + + # show should only be true to the highest parent group + if show: + self.__show(img) + + # return value only used if this is within another group + return img + + def __show(self, img): + # sends current img to the frontend + buffered = BytesIO() + img.save(buffered, format="BMP") + byte_base64 = base64.b64encode(buffered.getvalue()) + img_str = str(byte_base64)[2:-1] + + sendable_json = {CONSTANTS.BASE_64: img_str} + + if common.utils.debug_mode: + common.debugger_communication_client.debug_send_to_simulator( + sendable_json, CONSTANTS.CLUE + ) + else: + common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) + + def __len__(self): + if not self.__contents: + return 0 + else: + return len(self.__contents) + + def pop(self, i=-1): + item = self.__contents.pop(i) + item.parent = None + self.__elem_changed() + return item diff --git a/src/base_circuitpython/displayio/palette.py b/Source/base_circuitpython/displayio/palette.py similarity index 97% rename from src/base_circuitpython/displayio/palette.py rename to Source/base_circuitpython/displayio/palette.py index b954d982b..486535d11 100644 --- a/src/base_circuitpython/displayio/palette.py +++ b/Source/base_circuitpython/displayio/palette.py @@ -1,81 +1,81 @@ -from .color_type import _ColorType -from . import constants as CONSTANTS - -# Palette implementation loosely based on the -# displayio.Palette class in Adafruit CircuitPython -# (with only the functions needed for the CLUE) - -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/Palette.html - - -class Palette: - """ - `Palette` -- Stores a mapping from bitmap pixel palette_indexes to display colors - ========================================================================================= - - Map a pixel palette_index to a full color. Colors are transformed to the display's format internally to - save memory. - - .. class:: Palette(color_count) - - Create a Palette object to store a set number of colors. - - :param int color_count: The number of colors in the Palette - """ - - def __init__(self, color_count): - self.__color_count = color_count - self.__contents = [] - - # set all colours to black by default - for i in range(self.__color_count): - self.__contents.append(_ColorType((0, 0, 0))) - - def __setitem__(self, index, value): - """ - .. method:: __setitem__(index, value) - - Sets the pixel color at the given index. The index should be an integer in the range 0 to color_count-1. - - The value argument represents a color, and can be from 0x000000 to 0xFFFFFF (to represent an RGB value). - Value can be an int, bytes (3 bytes (RGB) or 4 bytes (RGB + pad byte)), bytearray, - or a tuple or list of 3 integers. - - This allows you to:: - - palette[0] = 0xFFFFFF # set using an integer - palette[1] = b'\xff\xff\x00' # set using 3 bytes - palette[2] = b'\xff\xff\x00\x00' # set using 4 bytes - palette[3] = bytearray(b'\x00\x00\xFF') # set using a bytearay of 3 or 4 bytes - palette[4] = (10, 20, 30) # set using a tuple of 3 integers - - """ - if index >= self.__color_count: - raise IndexError(CONSTANTS.PALETTE_OUT_OF_RANGE) - - self.__contents[index].rgb888 = value - - def __len__(self): - """ - .. method:: __len__() - - Returns the number of colors in a Palette - - """ - return self.__color_count - - def make_transparent(self, index): - """ - .. method:: make_transparent(palette_index) - """ - self.__toggle_transparency(index, True) - - def make_opaque(self, index): - """ - .. method:: make_opaque(palette_index) - """ - self.__toggle_transparency(index, False) - - def __toggle_transparency(self, index, transparency): - if self.__contents[index]: - self.__contents[index].transparent = transparency +from .color_type import _ColorType +from . import constants as CONSTANTS + +# Palette implementation loosely based on the +# displayio.Palette class in Adafruit CircuitPython +# (with only the functions needed for the CLUE) + +# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/Palette.html + + +class Palette: + """ + `Palette` -- Stores a mapping from bitmap pixel palette_indexes to display colors + ========================================================================================= + + Map a pixel palette_index to a full color. Colors are transformed to the display's format internally to + save memory. + + .. class:: Palette(color_count) + + Create a Palette object to store a set number of colors. + + :param int color_count: The number of colors in the Palette + """ + + def __init__(self, color_count): + self.__color_count = color_count + self.__contents = [] + + # set all colours to black by default + for i in range(self.__color_count): + self.__contents.append(_ColorType((0, 0, 0))) + + def __setitem__(self, index, value): + """ + .. method:: __setitem__(index, value) + + Sets the pixel color at the given index. The index should be an integer in the range 0 to color_count-1. + + The value argument represents a color, and can be from 0x000000 to 0xFFFFFF (to represent an RGB value). + Value can be an int, bytes (3 bytes (RGB) or 4 bytes (RGB + pad byte)), bytearray, + or a tuple or list of 3 integers. + + This allows you to:: + + palette[0] = 0xFFFFFF # set using an integer + palette[1] = b'\xff\xff\x00' # set using 3 bytes + palette[2] = b'\xff\xff\x00\x00' # set using 4 bytes + palette[3] = bytearray(b'\x00\x00\xFF') # set using a bytearay of 3 or 4 bytes + palette[4] = (10, 20, 30) # set using a tuple of 3 integers + + """ + if index >= self.__color_count: + raise IndexError(CONSTANTS.PALETTE_OUT_OF_RANGE) + + self.__contents[index].rgb888 = value + + def __len__(self): + """ + .. method:: __len__() + + Returns the number of colors in a Palette + + """ + return self.__color_count + + def make_transparent(self, index): + """ + .. method:: make_transparent(palette_index) + """ + self.__toggle_transparency(index, True) + + def make_opaque(self, index): + """ + .. method:: make_opaque(palette_index) + """ + self.__toggle_transparency(index, False) + + def __toggle_transparency(self, index, transparency): + if self.__contents[index]: + self.__contents[index].transparent = transparency diff --git a/src/base_circuitpython/displayio/test/__init__.py b/Source/base_circuitpython/displayio/test/__init__.py similarity index 100% rename from src/base_circuitpython/displayio/test/__init__.py rename to Source/base_circuitpython/displayio/test/__init__.py diff --git a/src/base_circuitpython/displayio/test/img/group_test_result.bmp b/Source/base_circuitpython/displayio/test/img/group_test_result.bmp similarity index 100% rename from src/base_circuitpython/displayio/test/img/group_test_result.bmp rename to Source/base_circuitpython/displayio/test/img/group_test_result.bmp diff --git a/src/base_circuitpython/displayio/test/test_bitmap.py b/Source/base_circuitpython/displayio/test/test_bitmap.py similarity index 97% rename from src/base_circuitpython/displayio/test/test_bitmap.py rename to Source/base_circuitpython/displayio/test/test_bitmap.py index 2967aa632..6e4e44fbf 100644 --- a/src/base_circuitpython/displayio/test/test_bitmap.py +++ b/Source/base_circuitpython/displayio/test/test_bitmap.py @@ -1,44 +1,44 @@ -import pytest -from ..bitmap import Bitmap -from .. import constants as CONSTANTS - - -class TestBitmap(object): - @pytest.mark.parametrize("x, y", [(1, 1), (2, 6), (0, 0)]) - def test_create_bitmap(self, x, y): - bitmap = Bitmap(x, y) - - @pytest.mark.parametrize("x, y, palette_num", [(1, 1, 4), (2, 3, 6), (4, 4, 9)]) - def test_set_and_get_pixel(self, x, y, palette_num): - bitmap = Bitmap(5, 5) - bitmap[x, y] = palette_num - assert palette_num == bitmap[x, y] - - @pytest.mark.parametrize("i, palette_num", [(1, 1), (24, 2)]) - def test_set_and_get_pixel_singular_index(self, i, palette_num): - bitmap = Bitmap(5, 5) - bitmap[i] = palette_num - assert palette_num == bitmap[i] - - @pytest.mark.parametrize( - "x_size, y_size, x_coord, y_coord", - [(1, 1, 0, 4), (1, 1, 4, 0), (200, 200, 300, 1), (200, 200, 1, 300)], - ) - def test_get_set_index_err(self, x_size, y_size, x_coord, y_coord): - bitmap = Bitmap(x_size, y_size) - - with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): - bitmap[x_coord, y_coord] = 0 - - with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): - val = bitmap[x_coord, y_coord] - - @pytest.mark.parametrize("x_size, y_size, i", [(1, 1, 3), (200, 200, 40000)]) - def test_get_set_index_err_singular_index(self, x_size, y_size, i): - bitmap = Bitmap(x_size, y_size) - - with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): - bitmap[i] = 0 - - with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): - val = bitmap[i] +import pytest +from ..bitmap import Bitmap +from .. import constants as CONSTANTS + + +class TestBitmap(object): + @pytest.mark.parametrize("x, y", [(1, 1), (2, 6), (0, 0)]) + def test_create_bitmap(self, x, y): + bitmap = Bitmap(x, y) + + @pytest.mark.parametrize("x, y, palette_num", [(1, 1, 4), (2, 3, 6), (4, 4, 9)]) + def test_set_and_get_pixel(self, x, y, palette_num): + bitmap = Bitmap(5, 5) + bitmap[x, y] = palette_num + assert palette_num == bitmap[x, y] + + @pytest.mark.parametrize("i, palette_num", [(1, 1), (24, 2)]) + def test_set_and_get_pixel_singular_index(self, i, palette_num): + bitmap = Bitmap(5, 5) + bitmap[i] = palette_num + assert palette_num == bitmap[i] + + @pytest.mark.parametrize( + "x_size, y_size, x_coord, y_coord", + [(1, 1, 0, 4), (1, 1, 4, 0), (200, 200, 300, 1), (200, 200, 1, 300)], + ) + def test_get_set_index_err(self, x_size, y_size, x_coord, y_coord): + bitmap = Bitmap(x_size, y_size) + + with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): + bitmap[x_coord, y_coord] = 0 + + with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): + val = bitmap[x_coord, y_coord] + + @pytest.mark.parametrize("x_size, y_size, i", [(1, 1, 3), (200, 200, 40000)]) + def test_get_set_index_err_singular_index(self, x_size, y_size, i): + bitmap = Bitmap(x_size, y_size) + + with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): + bitmap[i] = 0 + + with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): + val = bitmap[i] diff --git a/src/base_circuitpython/displayio/test/test_group.py b/Source/base_circuitpython/displayio/test/test_group.py similarity index 96% rename from src/base_circuitpython/displayio/test/test_group.py rename to Source/base_circuitpython/displayio/test/test_group.py index 3e4b3601e..f24ae0975 100644 --- a/src/base_circuitpython/displayio/test/test_group.py +++ b/Source/base_circuitpython/displayio/test/test_group.py @@ -1,174 +1,174 @@ -import sys -import os -import pytest -import pathlib - -from unittest import mock - -from common import utils - -from displayio.tile_grid import TileGrid -from displayio.group import Group -from displayio.palette import Palette -from displayio.bitmap import Bitmap -from .. import constants as CONSTANTS -from PIL import Image - - -class TestGroup(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - self.dummy_bitmap = Bitmap(500, 500) - self.dummy_palette = Palette(5) - self.dummy_pos = (0, 0) - - utils.send_to_simulator = mock.Mock() - - def test_append_tilegrid_group_to_group(self): - tg1 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - tg2 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - g1 = Group(max_size=10) - g2 = Group(max_size=10) - - g2.append(g1) - g2.append(tg1) - g2.append(tg2) - - assert len(g2._Group__contents) == 3 - assert len(g1._Group__contents) == 0 - - @pytest.mark.parametrize("group_item", [(""), (5), ((4, 5))]) - def test_incorr_subclass(self, group_item): - g1 = Group(max_size=10) - with pytest.raises(ValueError, match=CONSTANTS.INCORR_SUBCLASS): - g1.append(group_item) - - @pytest.mark.parametrize("scale", [(0), (-2)]) - def test_invalid_scale(self, scale): - with pytest.raises(ValueError, match=CONSTANTS.SCALE_TOO_SMALL): - g1 = Group(scale=scale) - - def test_layer_already_in_group(self): - g1 = Group(max_size=4) - - tg1 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - tg2 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - g1.append(tg1) - - # should allow this, since it checks equality by reference: - g1.append(tg2) - - # should throw error for same group by reference - with pytest.raises(ValueError, match=CONSTANTS.LAYER_ALREADY_IN_GROUP): - g1.append(tg1) - - def test_group_full(self): - g1 = Group(max_size=1) - - tg1 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - tg2 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - g1.append(tg1) - - with pytest.raises(RuntimeError, match=CONSTANTS.GROUP_FULL): - g1.append(tg2) - - @pytest.mark.parametrize( - "size_w,size_h,draw_w,draw_h,accent_colors,x_offset,y_offset,scale_sub,scale_main", - [ - ( - (30, 27), - (63, 34), - (10, 11), - (40, 20), - ((244, 266, 23), (134, 26, 3)), - 3, - 9, - 2, - 3, - ) - ], - ) - def test_draw_group( - self, - size_w, - size_h, - draw_w, - draw_h, - accent_colors, - x_offset, - y_offset, - scale_sub, - scale_main, - ): - palette = Palette(3) - palette[1] = accent_colors[0] - palette[2] = accent_colors[1] - - bmp_1 = Bitmap(size_w[0], size_h[0]) - bmp_2 = Bitmap(size_w[1], size_h[1]) - - for i in range(draw_h[0]): - for j in range(draw_w[0]): - try: - bmp_1[j, i] = 1 - except IndexError: - continue - - for i in range(draw_h[1]): - for j in range(draw_w[1]): - try: - bmp_2[j, i] = 2 - except IndexError: - continue - - tg = TileGrid(bitmap=bmp_1, pixel_shader=palette, position=(0, 0)) - tg2 = TileGrid(bitmap=bmp_2, pixel_shader=palette, position=(50, 50)) - - group_main = Group(max_size=10, scale=scale_main, check_active_group_ref=False) - group_sub = Group(max_size=10, scale=scale_sub) - - group_sub.append(tg) - group_main.append(group_sub) - group_main.append(tg2) - img = group_main._Group__draw() - - img.putalpha(255) - expected = Image.open( - os.path.join(self.abs_path, "img", "group_test_result.bmp") - ) - expected.putalpha(255) - bmp_img_expected = expected.load() - bmp_img = img.load() - for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - assert bmp_img_expected[j, i] == bmp_img[j, i] +import sys +import os +import pytest +import pathlib + +from unittest import mock + +from common import utils + +from displayio.tile_grid import TileGrid +from displayio.group import Group +from displayio.palette import Palette +from displayio.bitmap import Bitmap +from .. import constants as CONSTANTS +from PIL import Image + + +class TestGroup(object): + def setup_method(self): + self.abs_path = pathlib.Path(__file__).parent.absolute() + self.dummy_bitmap = Bitmap(500, 500) + self.dummy_palette = Palette(5) + self.dummy_pos = (0, 0) + + utils.send_to_simulator = mock.Mock() + + def test_append_tilegrid_group_to_group(self): + tg1 = TileGrid( + bitmap=self.dummy_bitmap, + pixel_shader=self.dummy_palette, + position=self.dummy_pos, + ) + + tg2 = TileGrid( + bitmap=self.dummy_bitmap, + pixel_shader=self.dummy_palette, + position=self.dummy_pos, + ) + + g1 = Group(max_size=10) + g2 = Group(max_size=10) + + g2.append(g1) + g2.append(tg1) + g2.append(tg2) + + assert len(g2._Group__contents) == 3 + assert len(g1._Group__contents) == 0 + + @pytest.mark.parametrize("group_item", [(""), (5), ((4, 5))]) + def test_incorr_subclass(self, group_item): + g1 = Group(max_size=10) + with pytest.raises(ValueError, match=CONSTANTS.INCORR_SUBCLASS): + g1.append(group_item) + + @pytest.mark.parametrize("scale", [(0), (-2)]) + def test_invalid_scale(self, scale): + with pytest.raises(ValueError, match=CONSTANTS.SCALE_TOO_SMALL): + g1 = Group(scale=scale) + + def test_layer_already_in_group(self): + g1 = Group(max_size=4) + + tg1 = TileGrid( + bitmap=self.dummy_bitmap, + pixel_shader=self.dummy_palette, + position=self.dummy_pos, + ) + + tg2 = TileGrid( + bitmap=self.dummy_bitmap, + pixel_shader=self.dummy_palette, + position=self.dummy_pos, + ) + + g1.append(tg1) + + # should allow this, since it checks equality by reference: + g1.append(tg2) + + # should throw error for same group by reference + with pytest.raises(ValueError, match=CONSTANTS.LAYER_ALREADY_IN_GROUP): + g1.append(tg1) + + def test_group_full(self): + g1 = Group(max_size=1) + + tg1 = TileGrid( + bitmap=self.dummy_bitmap, + pixel_shader=self.dummy_palette, + position=self.dummy_pos, + ) + + tg2 = TileGrid( + bitmap=self.dummy_bitmap, + pixel_shader=self.dummy_palette, + position=self.dummy_pos, + ) + + g1.append(tg1) + + with pytest.raises(RuntimeError, match=CONSTANTS.GROUP_FULL): + g1.append(tg2) + + @pytest.mark.parametrize( + "size_w,size_h,draw_w,draw_h,accent_colors,x_offset,y_offset,scale_sub,scale_main", + [ + ( + (30, 27), + (63, 34), + (10, 11), + (40, 20), + ((244, 266, 23), (134, 26, 3)), + 3, + 9, + 2, + 3, + ) + ], + ) + def test_draw_group( + self, + size_w, + size_h, + draw_w, + draw_h, + accent_colors, + x_offset, + y_offset, + scale_sub, + scale_main, + ): + palette = Palette(3) + palette[1] = accent_colors[0] + palette[2] = accent_colors[1] + + bmp_1 = Bitmap(size_w[0], size_h[0]) + bmp_2 = Bitmap(size_w[1], size_h[1]) + + for i in range(draw_h[0]): + for j in range(draw_w[0]): + try: + bmp_1[j, i] = 1 + except IndexError: + continue + + for i in range(draw_h[1]): + for j in range(draw_w[1]): + try: + bmp_2[j, i] = 2 + except IndexError: + continue + + tg = TileGrid(bitmap=bmp_1, pixel_shader=palette, position=(0, 0)) + tg2 = TileGrid(bitmap=bmp_2, pixel_shader=palette, position=(50, 50)) + + group_main = Group(max_size=10, scale=scale_main, check_active_group_ref=False) + group_sub = Group(max_size=10, scale=scale_sub) + + group_sub.append(tg) + group_main.append(group_sub) + group_main.append(tg2) + img = group_main._Group__draw() + + img.putalpha(255) + expected = Image.open( + os.path.join(self.abs_path, "img", "group_test_result.bmp") + ) + expected.putalpha(255) + bmp_img_expected = expected.load() + bmp_img = img.load() + for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): + for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): + assert bmp_img_expected[j, i] == bmp_img[j, i] diff --git a/src/base_circuitpython/displayio/test/test_palette.py b/Source/base_circuitpython/displayio/test/test_palette.py similarity index 97% rename from src/base_circuitpython/displayio/test/test_palette.py rename to Source/base_circuitpython/displayio/test/test_palette.py index 8b0d1aa38..413b61318 100644 --- a/src/base_circuitpython/displayio/test/test_palette.py +++ b/Source/base_circuitpython/displayio/test/test_palette.py @@ -1,31 +1,31 @@ -import pytest -from ..palette import Palette -from .. import constants as CONSTANTS -from ..color_type import _ColorType - - -class TestPalette(object): - @pytest.mark.parametrize( - "color_count, palette_num, val", - [(11, 5, (255, 255, 255)), (1, 0, (255, 0, 255)), (4, 3, (0, 0, 0))], - ) - def test_get_and_set_palette(self, color_count, palette_num, val): - palette = Palette(color_count) - palette[palette_num] = val - assert palette._Palette__contents[palette_num] == _ColorType(val) - - @pytest.mark.parametrize("palette_size, palette_index", [(3, 7), (0, 0), (3, 3)]) - def test_get_and_set_palette_err(self, palette_size, palette_index): - palette = Palette(palette_size) - with pytest.raises(IndexError, match=CONSTANTS.PALETTE_OUT_OF_RANGE): - palette[palette_index] = 0 - - def test_set_transparency(self): - palette = Palette(5) - assert palette._Palette__contents[2].transparent == False - - palette.make_transparent(2) - assert palette._Palette__contents[2].transparent == True - - palette.make_opaque(2) - assert palette._Palette__contents[2].transparent == False +import pytest +from ..palette import Palette +from .. import constants as CONSTANTS +from ..color_type import _ColorType + + +class TestPalette(object): + @pytest.mark.parametrize( + "color_count, palette_num, val", + [(11, 5, (255, 255, 255)), (1, 0, (255, 0, 255)), (4, 3, (0, 0, 0))], + ) + def test_get_and_set_palette(self, color_count, palette_num, val): + palette = Palette(color_count) + palette[palette_num] = val + assert palette._Palette__contents[palette_num] == _ColorType(val) + + @pytest.mark.parametrize("palette_size, palette_index", [(3, 7), (0, 0), (3, 3)]) + def test_get_and_set_palette_err(self, palette_size, palette_index): + palette = Palette(palette_size) + with pytest.raises(IndexError, match=CONSTANTS.PALETTE_OUT_OF_RANGE): + palette[palette_index] = 0 + + def test_set_transparency(self): + palette = Palette(5) + assert palette._Palette__contents[2].transparent == False + + palette.make_transparent(2) + assert palette._Palette__contents[2].transparent == True + + palette.make_opaque(2) + assert palette._Palette__contents[2].transparent == False diff --git a/src/base_circuitpython/displayio/test/test_tile_grid.py b/Source/base_circuitpython/displayio/test/test_tile_grid.py similarity index 97% rename from src/base_circuitpython/displayio/test/test_tile_grid.py rename to Source/base_circuitpython/displayio/test/test_tile_grid.py index 1f2d9d5fa..d7e8ffadf 100644 --- a/src/base_circuitpython/displayio/test/test_tile_grid.py +++ b/Source/base_circuitpython/displayio/test/test_tile_grid.py @@ -1,173 +1,173 @@ -import pytest -from PIL import Image -from ..tile_grid import TileGrid -from ..palette import Palette -from ..bitmap import Bitmap -from .. import constants as CONSTANTS - - -class TestTileGrid(object): - def setup_method(self): - self.dummy_bitmap = Bitmap(500, 500) - self.dummy_palette = Palette(5) - self.dummy_pos = (0, 0) - - @pytest.mark.parametrize( - "bitmap_w,bitmap_h,palette_num,tile_width,tile_height,position", - [(1, 1, 3, 1, 1, (0, 5)), (5, 7, 4, 2, 3, (0, 5))], - ) - def test_basic_constructor( - self, bitmap_w, bitmap_h, palette_num, tile_width, tile_height, position - ): - # constructor with position tuple - tg1 = TileGrid( - bitmap=Bitmap(bitmap_w, bitmap_h), - pixel_shader=Palette(palette_num), - tile_width=tile_width, - tile_height=tile_height, - position=position, - ) - - # alternate constructor with no position tuple - - tg2 = TileGrid( - bitmap=Bitmap(bitmap_w, bitmap_h), - pixel_shader=Palette(palette_num), - tile_width=tile_width, - tile_height=tile_height, - x=position[0], - y=position[1], - ) - - tile_grids = [tg1, tg2] - - for tg in tile_grids: - assert tg._TileGrid__bitmap.width == bitmap_w - assert tg._TileGrid__bitmap.height == bitmap_h - assert len(tg.pixel_shader._Palette__contents) == palette_num - assert tg._TileGrid__tile_width == tile_width - assert tg._TileGrid__tile_height == tile_height - assert tg.x == position[0] - assert tg.y == position[1] - - # alternate constructor with no height and width -> takes the bitmap's height and width - tg3 = TileGrid( - bitmap=Bitmap(bitmap_w, bitmap_h), - pixel_shader=Palette(palette_num), - x=position[0], - y=position[1], - ) - - assert tg3._TileGrid__bitmap.width == bitmap_w - assert tg3._TileGrid__bitmap.height == bitmap_h - assert len(tg3.pixel_shader._Palette__contents) == palette_num - assert tg3._TileGrid__tile_width == bitmap_w - assert tg3._TileGrid__tile_height == bitmap_h - assert tg3.x == position[0] - assert tg3.y == position[1] - - @pytest.mark.parametrize( - "w, h, x, y", [(5, 5, 2, 1), (2, 7, 0, 0), (66, 88, 65, 87)] - ) - def test_tile_set_get(self, w, h, x, y): - tg = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - tile_width=w, - tile_height=h, - position=self.dummy_pos, - ) - - tg_x_y = tg[x, y] - assert tg_x_y == tg._TileGrid__bitmap[x, y] - - @pytest.mark.parametrize( - "w, h, x, y", [(55, 56, 100, 1), (55, 56, 0, 56), (66, 88, 66, 88)] - ) - def test_tile_out_of_bounds(self, w, h, x, y): - tg = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - tile_width=w, - tile_height=h, - position=self.dummy_pos, - ) - with pytest.raises(IndexError, match=CONSTANTS.TILE_OUT_OF_BOUNDS): - tg_x_y = tg[x, y] - - @pytest.mark.parametrize( - "size_w, size_h, x, y, draw_w, draw_h, bg_color, accent_color, x_offset, y_offset, scale", - [ - (10, 10, 5, 5, 5, 5, (3, 0, 0, 255), (244, 255, 23, 255), 2, 0, 2), - (100, 30, 2, 3, 6, 3, (255, 255, 255, 255), (45, 45, 77, 255), 0, 7, 5), - ], - ) - def test_draw( - self, - size_w, - size_h, - x, - y, - draw_w, - draw_h, - bg_color, - accent_color, - x_offset, - y_offset, - scale, - ): - - palette = Palette(2) - palette[0] = bg_color - palette[1] = accent_color - - bmp = Bitmap(size_w, size_h) - - for i in range(size_h): - for j in range(size_w): - bmp[j, i] = 0 - - for i in range(y, y + draw_h): - for j in range(x, x + draw_w): - try: - bmp[j, i] = 1 - except IndexError: - continue - - tg = TileGrid(bitmap=bmp, pixel_shader=palette, position=(0, 0)) - tg2 = TileGrid(bitmap=bmp, pixel_shader=palette, position=(0, 0)) - img = Image.new( - "RGBA", (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - # without scaling, test output - img = tg._TileGrid__draw(img, x_offset, y_offset, 1) - bmp_img = img.load() - for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - if (i in range(y_offset + y, y_offset + y + draw_h)) and ( - j in range(x_offset + x, x_offset + x + draw_w) - ): - assert bmp_img[j, i] == accent_color - elif (i in range(y_offset, y_offset + size_h)) and ( - j in range(x_offset, x_offset + size_w) - ): - assert bmp_img[j, i] == bg_color - - img = Image.new( - "RGBA", (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - # with scaling, test output - img = tg._TileGrid__draw(img, x_offset, y_offset, scale) - bmp_img = img.load() - for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - if ( - i in range(y_offset + y * scale, y_offset + (y + draw_h) * scale) - ) and ( - j in range(x_offset + x * scale, x_offset + (x + draw_w) * scale) - ): - assert bmp_img[j, i] == accent_color - elif (i in range(y_offset * scale, (y_offset + draw_h) * scale)) and ( - j in range(x_offset * scale, (x_offset + draw_w) * scale) - ): - assert bmp_img[j, i] == bg_color +import pytest +from PIL import Image +from ..tile_grid import TileGrid +from ..palette import Palette +from ..bitmap import Bitmap +from .. import constants as CONSTANTS + + +class TestTileGrid(object): + def setup_method(self): + self.dummy_bitmap = Bitmap(500, 500) + self.dummy_palette = Palette(5) + self.dummy_pos = (0, 0) + + @pytest.mark.parametrize( + "bitmap_w,bitmap_h,palette_num,tile_width,tile_height,position", + [(1, 1, 3, 1, 1, (0, 5)), (5, 7, 4, 2, 3, (0, 5))], + ) + def test_basic_constructor( + self, bitmap_w, bitmap_h, palette_num, tile_width, tile_height, position + ): + # constructor with position tuple + tg1 = TileGrid( + bitmap=Bitmap(bitmap_w, bitmap_h), + pixel_shader=Palette(palette_num), + tile_width=tile_width, + tile_height=tile_height, + position=position, + ) + + # alternate constructor with no position tuple + + tg2 = TileGrid( + bitmap=Bitmap(bitmap_w, bitmap_h), + pixel_shader=Palette(palette_num), + tile_width=tile_width, + tile_height=tile_height, + x=position[0], + y=position[1], + ) + + tile_grids = [tg1, tg2] + + for tg in tile_grids: + assert tg._TileGrid__bitmap.width == bitmap_w + assert tg._TileGrid__bitmap.height == bitmap_h + assert len(tg.pixel_shader._Palette__contents) == palette_num + assert tg._TileGrid__tile_width == tile_width + assert tg._TileGrid__tile_height == tile_height + assert tg.x == position[0] + assert tg.y == position[1] + + # alternate constructor with no height and width -> takes the bitmap's height and width + tg3 = TileGrid( + bitmap=Bitmap(bitmap_w, bitmap_h), + pixel_shader=Palette(palette_num), + x=position[0], + y=position[1], + ) + + assert tg3._TileGrid__bitmap.width == bitmap_w + assert tg3._TileGrid__bitmap.height == bitmap_h + assert len(tg3.pixel_shader._Palette__contents) == palette_num + assert tg3._TileGrid__tile_width == bitmap_w + assert tg3._TileGrid__tile_height == bitmap_h + assert tg3.x == position[0] + assert tg3.y == position[1] + + @pytest.mark.parametrize( + "w, h, x, y", [(5, 5, 2, 1), (2, 7, 0, 0), (66, 88, 65, 87)] + ) + def test_tile_set_get(self, w, h, x, y): + tg = TileGrid( + bitmap=self.dummy_bitmap, + pixel_shader=self.dummy_palette, + tile_width=w, + tile_height=h, + position=self.dummy_pos, + ) + + tg_x_y = tg[x, y] + assert tg_x_y == tg._TileGrid__bitmap[x, y] + + @pytest.mark.parametrize( + "w, h, x, y", [(55, 56, 100, 1), (55, 56, 0, 56), (66, 88, 66, 88)] + ) + def test_tile_out_of_bounds(self, w, h, x, y): + tg = TileGrid( + bitmap=self.dummy_bitmap, + pixel_shader=self.dummy_palette, + tile_width=w, + tile_height=h, + position=self.dummy_pos, + ) + with pytest.raises(IndexError, match=CONSTANTS.TILE_OUT_OF_BOUNDS): + tg_x_y = tg[x, y] + + @pytest.mark.parametrize( + "size_w, size_h, x, y, draw_w, draw_h, bg_color, accent_color, x_offset, y_offset, scale", + [ + (10, 10, 5, 5, 5, 5, (3, 0, 0, 255), (244, 255, 23, 255), 2, 0, 2), + (100, 30, 2, 3, 6, 3, (255, 255, 255, 255), (45, 45, 77, 255), 0, 7, 5), + ], + ) + def test_draw( + self, + size_w, + size_h, + x, + y, + draw_w, + draw_h, + bg_color, + accent_color, + x_offset, + y_offset, + scale, + ): + + palette = Palette(2) + palette[0] = bg_color + palette[1] = accent_color + + bmp = Bitmap(size_w, size_h) + + for i in range(size_h): + for j in range(size_w): + bmp[j, i] = 0 + + for i in range(y, y + draw_h): + for j in range(x, x + draw_w): + try: + bmp[j, i] = 1 + except IndexError: + continue + + tg = TileGrid(bitmap=bmp, pixel_shader=palette, position=(0, 0)) + tg2 = TileGrid(bitmap=bmp, pixel_shader=palette, position=(0, 0)) + img = Image.new( + "RGBA", (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) + ) + # without scaling, test output + img = tg._TileGrid__draw(img, x_offset, y_offset, 1) + bmp_img = img.load() + for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): + for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): + if (i in range(y_offset + y, y_offset + y + draw_h)) and ( + j in range(x_offset + x, x_offset + x + draw_w) + ): + assert bmp_img[j, i] == accent_color + elif (i in range(y_offset, y_offset + size_h)) and ( + j in range(x_offset, x_offset + size_w) + ): + assert bmp_img[j, i] == bg_color + + img = Image.new( + "RGBA", (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) + ) + # with scaling, test output + img = tg._TileGrid__draw(img, x_offset, y_offset, scale) + bmp_img = img.load() + for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): + for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): + if ( + i in range(y_offset + y * scale, y_offset + (y + draw_h) * scale) + ) and ( + j in range(x_offset + x * scale, x_offset + (x + draw_w) * scale) + ): + assert bmp_img[j, i] == accent_color + elif (i in range(y_offset * scale, (y_offset + draw_h) * scale)) and ( + j in range(x_offset * scale, (x_offset + draw_w) * scale) + ): + assert bmp_img[j, i] == bg_color diff --git a/src/base_circuitpython/displayio/tile_grid.py b/Source/base_circuitpython/displayio/tile_grid.py similarity index 96% rename from src/base_circuitpython/displayio/tile_grid.py rename to Source/base_circuitpython/displayio/tile_grid.py index ad948cfde..371ee38ee 100644 --- a/src/base_circuitpython/displayio/tile_grid.py +++ b/Source/base_circuitpython/displayio/tile_grid.py @@ -1,280 +1,280 @@ -from PIL import Image, ImageColor -from . import constants as CONSTANTS -import threading -import queue -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# TileGrid implementation loosely based on the -# displayio.TileGrid class in Adafruit CircuitPython -# (with only the functions needed for the CLUE) -# this version of the class only supports a single tile, -# therefore, get/set functionality is a bit different. - -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/TileGrid.html - - -class TileGrid: - """ - `TileGrid` -- A grid of tiles sourced out of one bitmap - ========================================================================== - - Position a grid of tiles sourced from a bitmap and pixel_shader combination. Multiple grids - can share bitmaps and pixel shaders. - - A single tile grid is also known as a Sprite. - - .. class:: TileGrid(bitmap, *, pixel_shader, width=1, height=1, tile_width=None, tile_height=None, default_tile=0, x=0, y=0) - - Create a TileGrid object. The bitmap is source for 2d pixels. The pixel_shader is used to - convert the value and its location to a display native pixel color. This may be a simple color - palette lookup, a gradient, a pattern or a color transformer. - - tile_width and tile_height match the height of the bitmap by default. - - :param displayio.Bitmap bitmap: The bitmap storing one or more tiles. - :param displayio.Palette pixel_shader: The pixel shader that produces colors from values - :param int width: Width of the grid in tiles. - :param int height: Height of the grid in tiles. - :param int tile_width: Width of a single tile in pixels. Defaults to the full Bitmap and must evenly divide into the Bitmap's dimensions. - :param int tile_height: Height of a single tile in pixels. Defaults to the full Bitmap and must evenly divide into the Bitmap's dimensions. - :param int default_tile: Default tile index to show. - :param int x: Initial x position of the left edge within the parent. - :param int y: Initial y position of the top edge within the parent. - """ - - def __init__( - self, - bitmap, - pixel_shader, - default_tile=0, - tile_width=None, - tile_height=None, - x=0, - y=0, - position=None, - ): - self.x = None - """ - .. attribute:: x - - X position of the left edge in the parent. - """ - self.y = None - """ - .. attribute:: y - - Y position of the top edge in the parent. - """ - self.pixel_shader = pixel_shader - """ - .. attribute:: pixel_shader - - The pixel shader of the tilegrid. - """ - self.hidden = False - """ - .. attribute:: hidden - - True when the TileGrid is hidden. This may be False even when a part of a hidden Group. - """ - - self.__bitmap = bitmap - self.__tile_width = None - self.__tile_height = None - - if tile_width is None: - self.__tile_width = bitmap.width - else: - self.__tile_width = tile_width - - if tile_height is None: - self.__tile_height = bitmap.height - else: - self.__tile_height = tile_height - - if position and isinstance(position, tuple): - self.x = position[0] - self.y = position[1] - else: - self.x = x - self.y = y - - self.__parent = None - - # unimplemented features - self.__flip_x = False - self.__flip_y = False - self.__transpose_xy = False - - telemetry_py.send_telemetry(TelemetryEvent.CLUE_API_TILE_GRID) - - @property - def flip_x(self): - """ - .. attribute:: flip_x - - If true, the left edge rendered will be the right edge of the right-most tile. - """ - return self.__flip_x - - @flip_x.setter - def flip_x(self, val): - utils.print_for_unimplemented_functions(TileGrid.flip_x.__name_) - self.__flip_x = val - - @property - def flip_y(self): - - """ - .. attribute:: flip_y - - If true, the top edge rendered will be the bottom edge of the bottom-most tile. - """ - return self.__flip_y - - @flip_y.setter - def flip_y(self, val): - utils.print_for_unimplemented_functions(TileGrid.flip_y.__name_) - self.__flip_y = val - - @property - def transpose_xy(self): - - """ - .. attribute:: transpose_xy - - If true, the TileGrid's axis will be swapped. When combined with mirroring, any 90 degree - rotation can be achieved along with the corresponding mirrored version. - """ - return self.__transpose_xy - - @transpose_xy.setter - def transpose_xy(self, val): - utils.print_for_unimplemented_functions(TileGrid.transpose_xy.__name_) - self.__transpose_xy = val - - # setitem for an index simply gets the index of the bitmap - # rather than the tile index - def __setitem__(self, index, value): - """ - .. method:: __setitem__(index, tile_index) - Sets the tile index at the given index. The index can either be an x,y tuple or an int equal - to ``y * width + x``. - - This allows you to:: - - grid[0] = 10 - - or:: - - grid[0,0] = 10 - """ - if isinstance(index, tuple): - if index[0] >= self.__tile_width or index[1] >= self.__tile_height: - raise IndexError(CONSTANTS.TILE_OUT_OF_BOUNDS) - - self.__bitmap[index] = value - - # getitem for an index simply gets the index of the bitmap - # rather than the tile index - def __getitem__(self, index): - """ - .. method:: __getitem__(index) - Returns the tile index at the given index. The index can either be an x,y tuple or an int equal - to ``y * width + x``. - - This allows you to:: - - print(grid[0]) - """ - if isinstance(index, tuple): - if index[0] >= self.__tile_width or index[1] >= self.__tile_height: - raise IndexError(CONSTANTS.TILE_OUT_OF_BOUNDS) - - return self.__bitmap[index] - - @property - def __in_group(self): - return self.__parent != None - - # methods that are not in the origin class: - - def __draw(self, img, x, y, scale): - # draw the current bitmap with - # appropriate scale on the global bmp_img - x = self.x * scale + x - y = self.y * scale + y - - new_shape = self.__draw_group( - x, y, 0, self.__tile_height, 0, self.__tile_width, scale - ) - - img.paste(new_shape, (x, y), new_shape) - return img - - def __draw_group(self, x, y, y_start, y_end, x_start, x_end, scale): - height = y_end - y_start - width = x_end - x_start - - this_img = Image.new("RGBA", (width * scale, height * scale), (0, 0, 0, 0)) - this_img.putalpha(0) - this_bmp_img = this_img.load() - - for i in range(y_start, y_end): - for j in range(x_start, x_end): - x_offset = j * scale - y_offset = i * scale - - x_max = min(x_offset + scale, width * scale) - y_max = min(y_offset + scale, height * scale) - - curr_val = self.__bitmap[j, i] - palette_obj = self.pixel_shader._Palette__contents[curr_val] - - transparent = palette_obj.transparent - - if not transparent and x_offset >= 0 and y_offset >= 0: - - curr_colour = palette_obj.rgb888 - self.__fill_pixel( - curr_val, - curr_colour, - x_offset, - y_offset, - scale, - x_max, - y_max, - this_bmp_img, - ) - - return this_img - - # helper method for drawing pixels on bmp_img - # given the src, offset, and scale - def __fill_pixel( - self, - curr_val, - curr_colour, - x_offset, - y_offset, - scale, - x_max, - y_max, - this_bmp_img, - ): - - for new_y in range(y_offset, y_max): - for new_x in range(x_offset, x_max): - try: - if isinstance(curr_colour, tuple): - this_bmp_img[new_x, new_y] = curr_colour - else: - this_bmp_img[new_x, new_y] = ( - (curr_colour >> 16) & 255, - (curr_colour >> 8) & 255, - (curr_colour) & 255, - ) - except IndexError: - pass +from PIL import Image, ImageColor +from . import constants as CONSTANTS +import threading +import queue +from common import utils +from common.telemetry import telemetry_py +from common.telemetry_events import TelemetryEvent + +# TileGrid implementation loosely based on the +# displayio.TileGrid class in Adafruit CircuitPython +# (with only the functions needed for the CLUE) +# this version of the class only supports a single tile, +# therefore, get/set functionality is a bit different. + +# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/TileGrid.html + + +class TileGrid: + """ + `TileGrid` -- A grid of tiles sourced out of one bitmap + ========================================================================== + + Position a grid of tiles sourced from a bitmap and pixel_shader combination. Multiple grids + can share bitmaps and pixel shaders. + + A single tile grid is also known as a Sprite. + + .. class:: TileGrid(bitmap, *, pixel_shader, width=1, height=1, tile_width=None, tile_height=None, default_tile=0, x=0, y=0) + + Create a TileGrid object. The bitmap is source for 2d pixels. The pixel_shader is used to + convert the value and its location to a display native pixel color. This may be a simple color + palette lookup, a gradient, a pattern or a color transformer. + + tile_width and tile_height match the height of the bitmap by default. + + :param displayio.Bitmap bitmap: The bitmap storing one or more tiles. + :param displayio.Palette pixel_shader: The pixel shader that produces colors from values + :param int width: Width of the grid in tiles. + :param int height: Height of the grid in tiles. + :param int tile_width: Width of a single tile in pixels. Defaults to the full Bitmap and must evenly divide into the Bitmap's dimensions. + :param int tile_height: Height of a single tile in pixels. Defaults to the full Bitmap and must evenly divide into the Bitmap's dimensions. + :param int default_tile: Default tile index to show. + :param int x: Initial x position of the left edge within the parent. + :param int y: Initial y position of the top edge within the parent. + """ + + def __init__( + self, + bitmap, + pixel_shader, + default_tile=0, + tile_width=None, + tile_height=None, + x=0, + y=0, + position=None, + ): + self.x = None + """ + .. attribute:: x + + X position of the left edge in the parent. + """ + self.y = None + """ + .. attribute:: y + + Y position of the top edge in the parent. + """ + self.pixel_shader = pixel_shader + """ + .. attribute:: pixel_shader + + The pixel shader of the tilegrid. + """ + self.hidden = False + """ + .. attribute:: hidden + + True when the TileGrid is hidden. This may be False even when a part of a hidden Group. + """ + + self.__bitmap = bitmap + self.__tile_width = None + self.__tile_height = None + + if tile_width is None: + self.__tile_width = bitmap.width + else: + self.__tile_width = tile_width + + if tile_height is None: + self.__tile_height = bitmap.height + else: + self.__tile_height = tile_height + + if position and isinstance(position, tuple): + self.x = position[0] + self.y = position[1] + else: + self.x = x + self.y = y + + self.__parent = None + + # unimplemented features + self.__flip_x = False + self.__flip_y = False + self.__transpose_xy = False + + telemetry_py.send_telemetry(TelemetryEvent.CLUE_API_TILE_GRID) + + @property + def flip_x(self): + """ + .. attribute:: flip_x + + If true, the left edge rendered will be the right edge of the right-most tile. + """ + return self.__flip_x + + @flip_x.setter + def flip_x(self, val): + utils.print_for_unimplemented_functions(TileGrid.flip_x.__name_) + self.__flip_x = val + + @property + def flip_y(self): + + """ + .. attribute:: flip_y + + If true, the top edge rendered will be the bottom edge of the bottom-most tile. + """ + return self.__flip_y + + @flip_y.setter + def flip_y(self, val): + utils.print_for_unimplemented_functions(TileGrid.flip_y.__name_) + self.__flip_y = val + + @property + def transpose_xy(self): + + """ + .. attribute:: transpose_xy + + If true, the TileGrid's axis will be swapped. When combined with mirroring, any 90 degree + rotation can be achieved along with the corresponding mirrored version. + """ + return self.__transpose_xy + + @transpose_xy.setter + def transpose_xy(self, val): + utils.print_for_unimplemented_functions(TileGrid.transpose_xy.__name_) + self.__transpose_xy = val + + # setitem for an index simply gets the index of the bitmap + # rather than the tile index + def __setitem__(self, index, value): + """ + .. method:: __setitem__(index, tile_index) + Sets the tile index at the given index. The index can either be an x,y tuple or an int equal + to ``y * width + x``. + + This allows you to:: + + grid[0] = 10 + + or:: + + grid[0,0] = 10 + """ + if isinstance(index, tuple): + if index[0] >= self.__tile_width or index[1] >= self.__tile_height: + raise IndexError(CONSTANTS.TILE_OUT_OF_BOUNDS) + + self.__bitmap[index] = value + + # getitem for an index simply gets the index of the bitmap + # rather than the tile index + def __getitem__(self, index): + """ + .. method:: __getitem__(index) + Returns the tile index at the given index. The index can either be an x,y tuple or an int equal + to ``y * width + x``. + + This allows you to:: + + print(grid[0]) + """ + if isinstance(index, tuple): + if index[0] >= self.__tile_width or index[1] >= self.__tile_height: + raise IndexError(CONSTANTS.TILE_OUT_OF_BOUNDS) + + return self.__bitmap[index] + + @property + def __in_group(self): + return self.__parent != None + + # methods that are not in the origin class: + + def __draw(self, img, x, y, scale): + # draw the current bitmap with + # appropriate scale on the global bmp_img + x = self.x * scale + x + y = self.y * scale + y + + new_shape = self.__draw_group( + x, y, 0, self.__tile_height, 0, self.__tile_width, scale + ) + + img.paste(new_shape, (x, y), new_shape) + return img + + def __draw_group(self, x, y, y_start, y_end, x_start, x_end, scale): + height = y_end - y_start + width = x_end - x_start + + this_img = Image.new("RGBA", (width * scale, height * scale), (0, 0, 0, 0)) + this_img.putalpha(0) + this_bmp_img = this_img.load() + + for i in range(y_start, y_end): + for j in range(x_start, x_end): + x_offset = j * scale + y_offset = i * scale + + x_max = min(x_offset + scale, width * scale) + y_max = min(y_offset + scale, height * scale) + + curr_val = self.__bitmap[j, i] + palette_obj = self.pixel_shader._Palette__contents[curr_val] + + transparent = palette_obj.transparent + + if not transparent and x_offset >= 0 and y_offset >= 0: + + curr_colour = palette_obj.rgb888 + self.__fill_pixel( + curr_val, + curr_colour, + x_offset, + y_offset, + scale, + x_max, + y_max, + this_bmp_img, + ) + + return this_img + + # helper method for drawing pixels on bmp_img + # given the src, offset, and scale + def __fill_pixel( + self, + curr_val, + curr_colour, + x_offset, + y_offset, + scale, + x_max, + y_max, + this_bmp_img, + ): + + for new_y in range(y_offset, y_max): + for new_x in range(x_offset, x_max): + try: + if isinstance(curr_colour, tuple): + this_bmp_img[new_x, new_y] = curr_colour + else: + this_bmp_img[new_x, new_y] = ( + (curr_colour >> 16) & 255, + (curr_colour >> 8) & 255, + (curr_colour) & 255, + ) + except IndexError: + pass diff --git a/src/base_circuitpython/fontio.py b/Source/base_circuitpython/fontio.py similarity index 97% rename from src/base_circuitpython/fontio.py rename to Source/base_circuitpython/fontio.py index 3c7e567bd..95efb9690 100644 --- a/src/base_circuitpython/fontio.py +++ b/Source/base_circuitpython/fontio.py @@ -1,14 +1,14 @@ -# dummy library for adafruit_bitmap_font to work - -# original implementation docs for fontio: -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/fontio/__init__.html - -# file taken from adafruit_bitmap_font's examples: -# https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font/blob/master/test/fontio.py -import collections -import displayio - -Glyph = collections.namedtuple( - "Glyph", - ["bitmap", "tile_index", "width", "height", "dx", "dy", "shift_x", "shift_y"], -) +# dummy library for adafruit_bitmap_font to work + +# original implementation docs for fontio: +# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/fontio/__init__.html + +# file taken from adafruit_bitmap_font's examples: +# https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font/blob/master/test/fontio.py +import collections +import displayio + +Glyph = collections.namedtuple( + "Glyph", + ["bitmap", "tile_index", "width", "height", "dx", "dy", "shift_x", "shift_y"], +) diff --git a/src/base_circuitpython/fonts/ter-u12n.bdf b/Source/base_circuitpython/fonts/ter-u12n.bdf similarity index 100% rename from src/base_circuitpython/fonts/ter-u12n.bdf rename to Source/base_circuitpython/fonts/ter-u12n.bdf diff --git a/src/base_circuitpython/img/blinka.bmp b/Source/base_circuitpython/img/blinka.bmp similarity index 100% rename from src/base_circuitpython/img/blinka.bmp rename to Source/base_circuitpython/img/blinka.bmp diff --git a/src/base_circuitpython/neopixel_write.py b/Source/base_circuitpython/neopixel_write.py similarity index 96% rename from src/base_circuitpython/neopixel_write.py rename to Source/base_circuitpython/neopixel_write.py index 341215f35..d30cda7c0 100644 --- a/src/base_circuitpython/neopixel_write.py +++ b/Source/base_circuitpython/neopixel_write.py @@ -1,55 +1,55 @@ -# overriden neopixel_write library to write to frontend - -# original implementation docs for neopixel_write: -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/neopixel_write/__init__.html - - -import pathlib -import sys -import os - -import common -from adafruit_circuitplayground import cp -import base_cp_constants as CONSTANTS - - -def neopixel_write(gpio, buf): - """Write buf out on the given DigitalInOut.""" - - if len(tuple(buf)) > 0: - # if we are explicitly given - # the clue pin, that means that - # the clue is definitely the active device - # because the constructor for the - # clue is what calls neopixel - # with the clue pin argument - if gpio.pin != CONSTANTS.CLUE_PIN: - send_cpx(buf) - send_clue(buf) - - -def send_clue(buf): - sendable_json = {CONSTANTS.PIXELS: tuple(buf)} - if common.utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - sendable_json, CONSTANTS.CLUE - ) - else: - common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) - - -def send_cpx(buf): - buf_list = list(buf) - ret_list = [] - temp_list = [] - for idx, elem in enumerate(buf_list): - if idx % 3 == 0 and idx != 0: - ret_list.append(tuple(temp_list)) - temp_list = [] - temp_list.append(elem) - - if len(temp_list) == 3: - ret_list.append(tuple(temp_list)) - - max_index = min(len(ret_list), 10) - cp.pixels[0:max_index] = ret_list[0:max_index] +# overriden neopixel_write library to write to frontend + +# original implementation docs for neopixel_write: +# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/neopixel_write/__init__.html + + +import pathlib +import sys +import os + +import common +from adafruit_circuitplayground import cp +import base_cp_constants as CONSTANTS + + +def neopixel_write(gpio, buf): + """Write buf out on the given DigitalInOut.""" + + if len(tuple(buf)) > 0: + # if we are explicitly given + # the clue pin, that means that + # the clue is definitely the active device + # because the constructor for the + # clue is what calls neopixel + # with the clue pin argument + if gpio.pin != CONSTANTS.CLUE_PIN: + send_cpx(buf) + send_clue(buf) + + +def send_clue(buf): + sendable_json = {CONSTANTS.PIXELS: tuple(buf)} + if common.utils.debug_mode: + common.debugger_communication_client.debug_send_to_simulator( + sendable_json, CONSTANTS.CLUE + ) + else: + common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) + + +def send_cpx(buf): + buf_list = list(buf) + ret_list = [] + temp_list = [] + for idx, elem in enumerate(buf_list): + if idx % 3 == 0 and idx != 0: + ret_list.append(tuple(temp_list)) + temp_list = [] + temp_list.append(elem) + + if len(temp_list) == 3: + ret_list.append(tuple(temp_list)) + + max_index = min(len(ret_list), 10) + cp.pixels[0:max_index] = ret_list[0:max_index] diff --git a/src/base_circuitpython/pulseio.py b/Source/base_circuitpython/pulseio.py similarity index 96% rename from src/base_circuitpython/pulseio.py rename to Source/base_circuitpython/pulseio.py index f69a45836..2e29b699c 100644 --- a/src/base_circuitpython/pulseio.py +++ b/Source/base_circuitpython/pulseio.py @@ -1,16 +1,16 @@ -from common import utils - - -class PulseIn: - def __init__(self, pin, maxlen=2, *, idle_state=False): - utils.print_for_unimplemented_functions(PulseIn.__init__.__qualname__) - - -class PulseOut: - def __init__(self, carrier): - utils.print_for_unimplemented_functions(PulseOut.__init__.__qualname__) - - -class PWMOut: - def __init__(self, pin, *, duty_cycle=0, frequency=500, variable_frequency=False): - utils.print_for_unimplemented_functions(PWMOut.__init__.__qualname__) +from common import utils + + +class PulseIn: + def __init__(self, pin, maxlen=2, *, idle_state=False): + utils.print_for_unimplemented_functions(PulseIn.__init__.__qualname__) + + +class PulseOut: + def __init__(self, carrier): + utils.print_for_unimplemented_functions(PulseOut.__init__.__qualname__) + + +class PWMOut: + def __init__(self, pin, *, duty_cycle=0, frequency=500, variable_frequency=False): + utils.print_for_unimplemented_functions(PWMOut.__init__.__qualname__) diff --git a/src/base_circuitpython/terminal_handler.py b/Source/base_circuitpython/terminal_handler.py similarity index 96% rename from src/base_circuitpython/terminal_handler.py rename to Source/base_circuitpython/terminal_handler.py index 83130f0b0..d00b5c495 100644 --- a/src/base_circuitpython/terminal_handler.py +++ b/Source/base_circuitpython/terminal_handler.py @@ -1,108 +1,108 @@ -from PIL import Image -import threading -import os -import base64 -from io import BytesIO -import time -import collections -import pathlib - -from common import utils -import board -import base_cp_constants as CONSTANTS -import displayio -import terminalio - - -class Terminal: - def __init__(self): - self.__output_values = collections.deque() - self.__lock = threading.Lock() - self.__abs_path = pathlib.Path(__file__).parent.absolute() - self.__base_img = Image.open( - os.path.join(self.__abs_path, CONSTANTS.IMG_DIR_NAME, CONSTANTS.BLINKA_BMP) - ) - - def __create_newline(self, str_list): - self.__lock.acquire() - for string in str_list: - self.__output_values.appendleft(string) - - over = len(self.__output_values) - CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX - - # max CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX items in output_values - if over > 0: - for i in range(over): - self.__output_values.pop() - - self.__lock.release() - - def __draw(self, no_verif=False): - - import adafruit_display_text.label - - # no need to check the active group within the Group class - # since the caller of draw already did - splash = displayio.Group( - max_size=20, check_active_group_ref=False, auto_write=False - ) - - self.__lock.acquire() - - # since the text starts from the bottom, - # we need to find an offset if there are empty spots - - # handling of output_values already ensures that there are - # max CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX items in output_values deque - num_empty_slots = CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX - len( - self.__output_values - ) - curr_y = CONSTANTS.CLUE_TERMINAL_Y_OFFSET + ( - CONSTANTS.CLUE_TERMINAL_LINE_HEIGHT * num_empty_slots - ) - for output_val in reversed(self.__output_values): - if len(output_val): - text_area = adafruit_display_text.label.Label( - terminalio.FONT, text=output_val, line_spacing=1.25 - ) - - text_area.y = curr_y - text_area.x = CONSTANTS.CLUE_TERMINAL_X_OFFSET - splash.append(text_area) - - curr_y += CONSTANTS.CLUE_TERMINAL_LINE_HEIGHT - - self.__lock.release() - - splash._Group__draw(img=self.__base_img.copy()) - - def add_str_to_terminal(self, curr_display_string=""): - - line_break_amt = CONSTANTS.CLUE_TERMINAL_LINE_BREAK_AMT - - # characters until forced newline - newline_expected_val = line_break_amt - out_str = "" - new_strs = [] - for idx, d in enumerate(curr_display_string): - # handle custom or forced newline - if d == "\n" or newline_expected_val == 0: - new_strs.append(out_str) - out_str = "" - newline_expected_val = line_break_amt - - # if it was a custom newline, no longer need to - # process the character - if d == "\n": - continue - else: - newline_expected_val -= 1 - out_str += d - new_strs.append(out_str) - - self.__create_newline(new_strs) - - # only go ahead to draw the screen - # if the terminal is actively on the screen - if board.DISPLAY.active_group == None: - self.__draw() +from PIL import Image +import threading +import os +import base64 +from io import BytesIO +import time +import collections +import pathlib + +from common import utils +import board +import base_cp_constants as CONSTANTS +import displayio +import terminalio + + +class Terminal: + def __init__(self): + self.__output_values = collections.deque() + self.__lock = threading.Lock() + self.__abs_path = pathlib.Path(__file__).parent.absolute() + self.__base_img = Image.open( + os.path.join(self.__abs_path, CONSTANTS.IMG_DIR_NAME, CONSTANTS.BLINKA_BMP) + ) + + def __create_newline(self, str_list): + self.__lock.acquire() + for string in str_list: + self.__output_values.appendleft(string) + + over = len(self.__output_values) - CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX + + # max CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX items in output_values + if over > 0: + for i in range(over): + self.__output_values.pop() + + self.__lock.release() + + def __draw(self, no_verif=False): + + import adafruit_display_text.label + + # no need to check the active group within the Group class + # since the caller of draw already did + splash = displayio.Group( + max_size=20, check_active_group_ref=False, auto_write=False + ) + + self.__lock.acquire() + + # since the text starts from the bottom, + # we need to find an offset if there are empty spots + + # handling of output_values already ensures that there are + # max CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX items in output_values deque + num_empty_slots = CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX - len( + self.__output_values + ) + curr_y = CONSTANTS.CLUE_TERMINAL_Y_OFFSET + ( + CONSTANTS.CLUE_TERMINAL_LINE_HEIGHT * num_empty_slots + ) + for output_val in reversed(self.__output_values): + if len(output_val): + text_area = adafruit_display_text.label.Label( + terminalio.FONT, text=output_val, line_spacing=1.25 + ) + + text_area.y = curr_y + text_area.x = CONSTANTS.CLUE_TERMINAL_X_OFFSET + splash.append(text_area) + + curr_y += CONSTANTS.CLUE_TERMINAL_LINE_HEIGHT + + self.__lock.release() + + splash._Group__draw(img=self.__base_img.copy()) + + def add_str_to_terminal(self, curr_display_string=""): + + line_break_amt = CONSTANTS.CLUE_TERMINAL_LINE_BREAK_AMT + + # characters until forced newline + newline_expected_val = line_break_amt + out_str = "" + new_strs = [] + for idx, d in enumerate(curr_display_string): + # handle custom or forced newline + if d == "\n" or newline_expected_val == 0: + new_strs.append(out_str) + out_str = "" + newline_expected_val = line_break_amt + + # if it was a custom newline, no longer need to + # process the character + if d == "\n": + continue + else: + newline_expected_val -= 1 + out_str += d + new_strs.append(out_str) + + self.__create_newline(new_strs) + + # only go ahead to draw the screen + # if the terminal is actively on the screen + if board.DISPLAY.active_group == None: + self.__draw() diff --git a/src/base_circuitpython/terminalio.py b/Source/base_circuitpython/terminalio.py similarity index 97% rename from src/base_circuitpython/terminalio.py rename to Source/base_circuitpython/terminalio.py index 58abb7fc4..ba6ca6159 100644 --- a/src/base_circuitpython/terminalio.py +++ b/Source/base_circuitpython/terminalio.py @@ -1,15 +1,15 @@ -# overriden terminalio library, which uses -# adafruit_bitmap_font to load the default font - -# original implementation docs for terminalio: -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/terminalio/__init__.html - -from adafruit_bitmap_font import bitmap_font # pylint: disable=wrong-import-position - -import os -import pathlib - -abs_path = pathlib.Path(__file__).parent.absolute() - -# load default font -FONT = bitmap_font.load_font(os.path.join(abs_path, "fonts", "ter-u12n.bdf")) +# overriden terminalio library, which uses +# adafruit_bitmap_font to load the default font + +# original implementation docs for terminalio: +# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/terminalio/__init__.html + +from adafruit_bitmap_font import bitmap_font # pylint: disable=wrong-import-position + +import os +import pathlib + +abs_path = pathlib.Path(__file__).parent.absolute() + +# load default font +FONT = bitmap_font.load_font(os.path.join(abs_path, "fonts", "ter-u12n.bdf")) diff --git a/src/base_circuitpython/test/__init__.py b/Source/base_circuitpython/test/__init__.py similarity index 100% rename from src/base_circuitpython/test/__init__.py rename to Source/base_circuitpython/test/__init__.py diff --git a/src/base_circuitpython/test/test_terminal_handler.py b/Source/base_circuitpython/test/test_terminal_handler.py similarity index 96% rename from src/base_circuitpython/test/test_terminal_handler.py rename to Source/base_circuitpython/test/test_terminal_handler.py index 22a8986af..cb9f97338 100644 --- a/src/base_circuitpython/test/test_terminal_handler.py +++ b/Source/base_circuitpython/test/test_terminal_handler.py @@ -1,61 +1,61 @@ -import pytest - -import base_circuitpython.terminal_handler -from common import utils -from unittest import mock - - -class TestTerminal(object): - def setup_method(self): - - utils.send_to_simulator = mock.Mock() - - @pytest.mark.parametrize( - "str_vals", - [ - (["potato", "Lorem ipsum"]), - ([""]), - ([".......", "123456", "", "test"]), - (["123456789 123456789 123456789 1234567"]), - ], - ) - def test_single_line(self, str_vals): - self.terminal = base_circuitpython.terminal_handler.Terminal() - for s in str_vals: - self.terminal.add_str_to_terminal(s) - - result = list(self.terminal._Terminal__output_values) - result.reverse() - - # output should just be the reversed version since all lines - # don't have newline or exceed 37 characters - assert str_vals == result - - @pytest.mark.parametrize( - "str_vals, expected", - [ - ( - ["\nCode done running. Waiting for reload."], - [".", "Code done running. Waiting for reload", ""], - ), - ( - ["TESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTEST"], - ["ESTTESTTEST", "TESTTESTTESTTESTTESTTESTTESTTESTTESTT"], - ), - ( - ["\nCode done running. Waiting for reload.", "........."], - [".........", ".", "Code done running. Waiting for reload", ""], - ), - ( - ["TEST TEST TEST TEST TEST ", "..."], - ["...", " ", "TEST TEST TEST TEST TEST "], - ), - ], - ) - def test_multiline(self, str_vals, expected): - self.terminal = base_circuitpython.terminal_handler.Terminal() - for s in str_vals: - self.terminal.add_str_to_terminal(s) - - result = list(self.terminal._Terminal__output_values) - assert result == expected +import pytest + +import base_circuitpython.terminal_handler +from common import utils +from unittest import mock + + +class TestTerminal(object): + def setup_method(self): + + utils.send_to_simulator = mock.Mock() + + @pytest.mark.parametrize( + "str_vals", + [ + (["potato", "Lorem ipsum"]), + ([""]), + ([".......", "123456", "", "test"]), + (["123456789 123456789 123456789 1234567"]), + ], + ) + def test_single_line(self, str_vals): + self.terminal = base_circuitpython.terminal_handler.Terminal() + for s in str_vals: + self.terminal.add_str_to_terminal(s) + + result = list(self.terminal._Terminal__output_values) + result.reverse() + + # output should just be the reversed version since all lines + # don't have newline or exceed 37 characters + assert str_vals == result + + @pytest.mark.parametrize( + "str_vals, expected", + [ + ( + ["\nCode done running. Waiting for reload."], + [".", "Code done running. Waiting for reload", ""], + ), + ( + ["TESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTEST"], + ["ESTTESTTEST", "TESTTESTTESTTESTTESTTESTTESTTESTTESTT"], + ), + ( + ["\nCode done running. Waiting for reload.", "........."], + [".........", ".", "Code done running. Waiting for reload", ""], + ), + ( + ["TEST TEST TEST TEST TEST ", "..."], + ["...", " ", "TEST TEST TEST TEST TEST "], + ), + ], + ) + def test_multiline(self, str_vals, expected): + self.terminal = base_circuitpython.terminal_handler.Terminal() + for s in str_vals: + self.terminal.add_str_to_terminal(s) + + result = list(self.terminal._Terminal__output_values) + assert result == expected diff --git a/src/check_if_venv.py b/Source/check_if_venv.py similarity index 96% rename from src/check_if_venv.py rename to Source/check_if_venv.py index 45fd3dd2b..6055fa258 100644 --- a/src/check_if_venv.py +++ b/Source/check_if_venv.py @@ -1,11 +1,11 @@ -# from https://stackoverflow.com/questions/1871549/determine-if-python-is-running-inside-virtualenv -import sys - -isVenv = hasattr(sys, "real_prefix") or ( - hasattr(sys, "base_prefix") and sys.base_prefix != sys.prefix -) - -# prints result for frontend to read -# 1 -> is a venv -# 0 -> is NOT a venv -print(int(isVenv)) +# from https://stackoverflow.com/questions/1871549/determine-if-python-is-running-inside-virtualenv +import sys + +isVenv = hasattr(sys, "real_prefix") or ( + hasattr(sys, "base_prefix") and sys.base_prefix != sys.prefix +) + +# prints result for frontend to read +# 1 -> is a venv +# 0 -> is NOT a venv +print(int(isVenv)) diff --git a/src/check_python_dependencies.py b/Source/check_python_dependencies.py similarity index 100% rename from src/check_python_dependencies.py rename to Source/check_python_dependencies.py diff --git a/src/clue/__init__.py b/Source/clue/__init__.py similarity index 96% rename from src/clue/__init__.py rename to Source/clue/__init__.py index c34e9688b..43f8ed82b 100644 --- a/src/clue/__init__.py +++ b/Source/clue/__init__.py @@ -1 +1 @@ -import base_circuitpython +import base_circuitpython diff --git a/src/clue/adafruit_clue.py b/Source/clue/adafruit_clue.py similarity index 97% rename from src/clue/adafruit_clue.py rename to Source/clue/adafruit_clue.py index 059573021..e7a578d11 100644 --- a/src/clue/adafruit_clue.py +++ b/Source/clue/adafruit_clue.py @@ -1,852 +1,852 @@ -# The MIT License (MIT) -# -# Copyright (c) 2020 Kattni Rembor for Adafruit Industries -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -""" -`adafruit_clue` -================================================================================ - -A high level library representing all the features of the Adafruit CLUE. - - -* Author(s): Kattni Rembor - -Implementation Notes --------------------- - -**Hardware:** - -.. "* `Adafruit CLUE - nRF52840 Express with Bluetooth LE `_" - -**Software and Dependencies:** - -* Adafruit CircuitPython firmware for the supported boards: - https://github.com/adafruit/circuitpython/releases - - * Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice - * Adafruit's Register library: https://github.com/adafruit/Adafruit_CircuitPython_Register - * Adafruit's LSM6DS CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_LSM6DS - * Adafruit's LIS3MDL CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_LIS3MDL - * Adafruit's APDS9960 CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_APDS9960 - * Adafruit's BMP280 CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_BMP280 - * Adafruit's SHT31D CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_SHT31D - * Adafruit's NeoPixel CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_NeoPixel -""" - -import common -from base_circuitpython import base_cp_constants as CONSTANTS -import neopixel -import time -import array -import math -from PIL import Image -import pathlib -import sys -import os -import board - -abs_path = pathlib.Path(__file__).parent.absolute() -sys.path.insert(0, os.path.join(abs_path)) - -# REVISED VERSION OF THE ADAFRUIT CLUE LIBRARY FOR DSX - -__version__ = "0.0.0-auto.0" -__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_CLUE.git" - - -class _ClueSimpleTextDisplay: - """Easily display lines of text on CLUE display.""" - - def __init__( - self, - title=None, - title_color=0xFFFFFF, - title_scale=1, # pylint: disable=too-many-arguments - text_scale=1, - font=None, - colors=None, - ): - import displayio - import terminalio - from adafruit_display_text import label - - if not colors: - colors = ( - Clue.VIOLET, - Clue.GREEN, - Clue.RED, - Clue.CYAN, - Clue.ORANGE, - Clue.BLUE, - Clue.MAGENTA, - Clue.SKY, - Clue.YELLOW, - Clue.PURPLE, - ) - - self._display = board.DISPLAY - self._colors = colors - self._label = label - self._font = terminalio.FONT - if font: - self._font = font - self.text_scale = text_scale - self.text_group = displayio.Group(max_size=20, scale=self.text_scale) - if title: - # Fail gracefully if title is longer than 60 characters. - if len(title) > 60: - raise ValueError("Title must be 60 characters or less.") - - title = label.Label( - self._font, - text=title, - max_glyphs=60, - color=title_color, - scale=title_scale, - ) - title.x = 0 - title.y = 8 * self.text_scale - self._y = title.y + 18 * self.text_scale - - self.text_group.append(title) - else: - self._y = 3 * self.text_scale - - self._lines = [] - for num in range(1): - self._lines.append(self.add_text_line(color=colors[num % len(colors)])) - - def __getitem__(self, item): - """Fetch the Nth text line Group""" - if len(self._lines) - 1 < item: - for _ in range(item - (len(self._lines) - 1)): - self._lines.append( - self.add_text_line(color=self._colors[item % len(self._colors)]) - ) - return self._lines[item] - - def add_text_line(self, color=0xFFFFFF): - """Adds a line on the display of the specified color and returns the label object.""" - text_label = self._label.Label(self._font, text="", max_glyphs=45, color=color) - text_label.x = 0 - text_label.y = self._y - self._y = text_label.y + 13 * self.text_scale - self.text_group.append(text_label) - - return text_label - - def show(self): - """Call show() to display the data list.""" - self._display.show(self.text_group) - - def show_terminal(self): - """Revert to terminalio screen.""" - self._display.show(None) - - -class Clue: # pylint: disable=too-many-instance-attributes, too-many-public-methods - """Represents a single CLUE.""" - - # Color variables available for import. - RED = (255, 0, 0) - YELLOW = (255, 255, 0) - ORANGE = (255, 150, 0) - GREEN = (0, 255, 0) - TEAL = (0, 255, 120) - CYAN = (0, 255, 255) - BLUE = (0, 0, 255) - PURPLE = (180, 0, 255) - MAGENTA = (255, 0, 150) - WHITE = (255, 255, 255) - BLACK = (0, 0, 0) - - GOLD = (255, 222, 30) - PINK = (242, 90, 255) - AQUA = (50, 255, 255) - JADE = (0, 255, 40) - AMBER = (255, 100, 0) - VIOLET = (255, 0, 255) - SKY = (0, 180, 255) - - RAINBOW = (RED, ORANGE, YELLOW, GREEN, BLUE, PURPLE) - - def __init__(self): - self.__state = {} - self.__state[CONSTANTS.CLUE_STATE.BUTTON_A] = False - self.__state[CONSTANTS.CLUE_STATE.BUTTON_B] = False - self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS] = set() - self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE] = 1013.25 - self.__state[CONSTANTS.CLUE_STATE.TEMPERATURE] = 0 - self.__state[CONSTANTS.CLUE_STATE.PROXIMITY] = 0 - self.__state[CONSTANTS.CLUE_STATE.GESTURE] = "" - self.__state[CONSTANTS.CLUE_STATE.HUMIDITY] = 0 - self.__state[CONSTANTS.CLUE_STATE.PRESSURE] = 1013 - self.__state[CONSTANTS.CLUE_STATE.PIXEL] = neopixel.NeoPixel( - pin=CONSTANTS.CLUE_PIN, n=1, pixel_order=neopixel.RGB - ) - # Accelerometer - self.__state[CONSTANTS.CLUE_STATE.MOTION_X] = 0 - self.__state[CONSTANTS.CLUE_STATE.MOTION_Y] = 0 - self.__state[CONSTANTS.CLUE_STATE.MOTION_Z] = 0 - # Light/color sensor - self.__state[CONSTANTS.CLUE_STATE.LIGHT_R] = 0 - self.__state[CONSTANTS.CLUE_STATE.LIGHT_G] = 0 - self.__state[CONSTANTS.CLUE_STATE.LIGHT_B] = 0 - self.__state[CONSTANTS.CLUE_STATE.LIGHT_C] = 0 - # Magnetometer - self.__state[CONSTANTS.CLUE_STATE.MAGNET_X] = 0 - self.__state[CONSTANTS.CLUE_STATE.MAGNET_Y] = 0 - self.__state[CONSTANTS.CLUE_STATE.MAGNET_Z] = 0 - # Gyroscope - self.__state[CONSTANTS.CLUE_STATE.GYRO_X] = 0 - self.__state[CONSTANTS.CLUE_STATE.GYRO_Y] = 0 - self.__state[CONSTANTS.CLUE_STATE.GYRO_Z] = 0 - # LEDs - self.__state[CONSTANTS.CLUE_STATE.RED_LED] = False - self.__state[CONSTANTS.CLUE_STATE.WHITE_LEDS] = False - - self.button_mapping = { - CONSTANTS.CLUE_STATE.BUTTON_A: "A", - CONSTANTS.CLUE_STATE.BUTTON_B: "B", - } - self.display = board.DISPLAY - - @property - def button_a(self): - """``True`` when Button A is pressed. ``False`` if not. - This example prints when button A is pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.button_a: - print("Button A pressed") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_BUTTON_A - ) - return self.__state[CONSTANTS.CLUE_STATE.BUTTON_A] - - @property - def button_b(self): - """``True`` when Button B is pressed. ``False`` if not. - This example prints when button B is pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.button_b: - print("Button B pressed") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_BUTTON_B - ) - return self.__state[CONSTANTS.CLUE_STATE.BUTTON_B] - - @property - def were_pressed(self): - """Returns a set of the buttons that have been pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print(clue.were_pressed) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_WERE_PRESSED - ) - ret = self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS].copy() - self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS].clear() - return ret - - @property - def acceleration(self): - """Obtain acceleration data from the x, y and z axes. - This example prints the values. Try moving the board to see how the printed values change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Accel: {:.2f} {:.2f} {:.2f}".format(*clue.acceleration)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_ACCELERATION - ) - return ( - self.__state[CONSTANTS.CLUE_STATE.MOTION_X], - self.__state[CONSTANTS.CLUE_STATE.MOTION_Y], - self.__state[CONSTANTS.CLUE_STATE.MOTION_Z], - ) - - def shake(self, shake_threshold=30, avg_count=10, total_delay=0.1): - """Detect when the accelerometer is shaken. Optional parameters: - :param shake_threshold: Increase or decrease to change shake sensitivity. This - requires a minimum value of 10. 10 is the total - acceleration if the board is not moving, therefore - anything less than 10 will erroneously report a constant - shake detected. (Default 30) - :param avg_count: The number of readings taken and used for the average - acceleration. (Default 10) - :param total_delay: The total time in seconds it takes to obtain avg_count - readings from acceleration. (Default 0.1) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SHAKE - ) - is_shaken = self.__state[CONSTANTS.CLUE_STATE.GESTURE] == CONSTANTS.SHAKE - return is_shaken - - @property - def color(self): - """The red, green, blue, and clear light values. (r, g, b, c) - This example prints the values. Try holding something up to the sensor to see the values - change. Works best with white LEDs enabled. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Color: R: {} G: {} B: {} C: {}".format(*clue.color)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_COLOR - ) - return ( - self.__state[CONSTANTS.CLUE_STATE.LIGHT_R], - self.__state[CONSTANTS.CLUE_STATE.LIGHT_G], - self.__state[CONSTANTS.CLUE_STATE.LIGHT_B], - self.__state[CONSTANTS.CLUE_STATE.LIGHT_C], - ) - - @property - def temperature(self): - """The temperature in degrees Celsius. - This example prints the value. Try touching the sensor to see the value change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - print("Temperature: {:.1f}C".format(clue.temperature)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TEMPERATURE - ) - return self.__state[CONSTANTS.CLUE_STATE.TEMPERATURE] - - @property - def magnetic(self): - """Obtain x, y, z magnetic values in microteslas. - This example prints the values. Try moving the board to see how the printed values change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Magnetic: {:.3f} {:.3f} {:.3f}".format(*clue.magnetic)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_MAGNETIC - ) - return ( - self.__state[CONSTANTS.CLUE_STATE.MAGNET_X], - self.__state[CONSTANTS.CLUE_STATE.MAGNET_Y], - self.__state[CONSTANTS.CLUE_STATE.MAGNET_Z], - ) - - @property - def proximity(self): - """A relative proximity to the sensor in values from 0 - 255. - This example prints the value. Try moving your hand towards and away from the front of the - board to see how the printed values change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Proximity: {}".format(clue.proximity)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_PROXIMITY - ) - return self.__state[CONSTANTS.CLUE_STATE.PROXIMITY] - - @property - def gyro(self): - """Obtain x, y, z angular velocity values in degrees/second. - This example prints the values. Try moving the board to see how the printed values change. - print("Gyro: {:.2f} {:.2f} {:.2f}".format(*clue.gyro)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_GYRO - ) - return ( - self.__state[CONSTANTS.CLUE_STATE.GYRO_X], - self.__state[CONSTANTS.CLUE_STATE.GYRO_Y], - self.__state[CONSTANTS.CLUE_STATE.GYRO_Z], - ) - - @property - def gesture(self): - """A gesture code if gesture is detected. Shows ``0`` if no gesture detected. - ``1`` if an UP gesture is detected, ``2`` if DOWN, ``3`` if LEFT, and ``4`` if RIGHT. - This example prints the gesture values. Try moving your hand up, down, left or right over - the sensor to see the value change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Gesture: {}".format(clue.gesture)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_GESTURE - ) - gesture_mapping = {"": 0, "up": 1, "down": 2, "left": 3, "right": 4} - return gesture_mapping.get(self.__state[CONSTANTS.CLUE_STATE.GESTURE], 0) - - @property - def humidity(self): - """The measured relative humidity in percent. - This example prints the value. Try breathing on the sensor to see the values change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Humidity: {:.1f}%".format(clue.humidity)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_HUMIDITY - ) - return self.__state[CONSTANTS.CLUE_STATE.HUMIDITY] - - @property - def pressure(self): - """The barometric pressure in hectoPascals. - This example prints the value. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - print("Pressure: {:.3f}hPa".format(clue.pressure)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_PRESSURE - ) - return self.__state[CONSTANTS.CLUE_STATE.PRESSURE] - - @property - def altitude(self): - """The altitude in meters based on the sea level pressure at your location. You must set - ``sea_level_pressure`` to receive an accurate reading. - This example prints the value. Try moving the board vertically to see the value change. - .. code-block:: python - from adafruit_clue import clue - clue.sea_level_pressure = 1015 - print("Altitude: {:.1f}m".format(clue.altitude)) - """ - # National Oceanic and Atmospheric Administration (NOAA) formula for converting atmospheric pressure to pressure altitude. - OUTSIDE_MULTIPLER_CONSTANT = 44330 - POWER_CONSTANT = 0.1903 - WHOLE_CONSTANT = 1 - - altitude = OUTSIDE_MULTIPLER_CONSTANT * ( - WHOLE_CONSTANT - - math.pow( - self.__state[CONSTANTS.CLUE_STATE.PRESSURE] - / self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE], - POWER_CONSTANT, - ) - ) - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_ALTITUDE - ) - return altitude - - @property - def sea_level_pressure(self): - """Set to the pressure at sea level at your location, before reading altitude for - the most accurate altitude measurement. - This example prints the value. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - clue.sea_level_pressure = 1015 - print("Pressure: {:.3f}hPa".format(clue.pressure)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SEA_LEVEL_PRESSURE - ) - return self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE] - - @sea_level_pressure.setter - def sea_level_pressure(self, value): - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SEA_LEVEL_PRESSURE - ) - self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE] = value - - @property - def pixel(self): - """The NeoPixel RGB LED. - This example turns the NeoPixel purple. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - clue.pixel.fill((255, 0, 255)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_PIXEL - ) - return self.__state[CONSTANTS.CLUE_STATE.PIXEL] - - @property - def touch_0(self): - """Not Implemented! - - Detect touch on capacitive touch pad 0. - .. image :: ../docs/_static/pad_0.jpg - :alt: Pad 0 - This example prints when pad 0 is touched. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.touch_0: - print("Touched pad 0") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TOUCH - ) - common.utils.print_for_unimplemented_functions("touch_0") - - @property - def touch_1(self): - """Not Implemented! - - Detect touch on capacitive touch pad 1. - .. image :: ../docs/_static/pad_1.jpg - :alt: Pad 1 - This example prints when pad 1 is touched. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.touch_1: - print("Touched pad 1") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TOUCH - ) - common.utils.print_for_unimplemented_functions("touch_1") - - @property - def touch_2(self): - """Not Implemented! - - Detect touch on capacitive touch pad 2. - .. image :: ../docs/_static/pad_2.jpg - :alt: Pad 2 - This example prints when pad 2 is touched. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.touch_2: - print("Touched pad 2") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TOUCH - ) - common.utils.print_for_unimplemented_functions("touch_2") - - @property - def white_leds(self): - """The red led next to the USB plug labeled LED. - .. image :: ../docs/_static/white_leds.jpg - :alt: White LEDs - This example turns on the white LEDs. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - clue.white_leds = True - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_WHITE_LEDS - ) - return self.__state[CONSTANTS.CLUE_STATE.WHITE_LEDS] - - @white_leds.setter - def white_leds(self, value): - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_WHITE_LEDS - ) - self.__set_leds(CONSTANTS.CLUE_STATE.WHITE_LEDS, value) - - @property - def red_led(self): - """The red led next to the USB plug labeled LED. - .. image :: ../docs/_static/red_led.jpg - :alt: Red LED - This example turns on the red LED. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - clue.red_led = True - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_RED_LED - ) - return self.__state[CONSTANTS.CLUE_STATE.RED_LED] - - @red_led.setter - def red_led(self, value): - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_RED_LED - ) - self.__set_leds(CONSTANTS.CLUE_STATE.RED_LED, value) - - def play_tone(self, frequency, duration): - """ Not Implemented! - Produce a tone using the speaker. Try changing frequency to change - the pitch of the tone. - :param int frequency: The frequency of the tone in Hz - :param float duration: The duration of the tone in seconds - .. image :: ../docs/_static/speaker.jpg - :alt: Speaker - This example plays a 880 Hz tone for a duration of 1 second. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - clue.play_tone(880, 1) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions(Clue.play_tone.__name__) - - def start_tone(self, frequency): - """ Not Implemented! - Produce a tone using the speaker. Try changing frequency to change - the pitch of the tone. - :param int frequency: The frequency of the tone in Hz - .. image :: ../docs/_static/speaker.jpg - :alt: Speaker - This example plays a 523Hz tone when button A is pressed and a 587Hz tone when button B is - pressed, only while the buttons are being pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.button_a: - clue.start_tone(523) - elif clue.button_b: - clue.start_tone(587) - else: - clue.stop_tone() - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions(Clue.start_tone.__name__) - - def stop_tone(self): - """ Not Implemented! - Use with start_tone to stop the tone produced. - .. image :: ../docs/_static/speaker.jpg - :alt: Speaker - This example plays a 523Hz tone when button A is pressed and a 587Hz tone when button B is - pressed, only while the buttons are being pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.button_a: - clue.start_tone(523) - elif clue.button_b: - clue.start_tone(587) - else: - clue.stop_tone() - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions(Clue.stop_tone.__name__) - - @property - def sound_level(self): - """Not Implemented! - Obtain the sound level from the microphone (sound sensor). - .. image :: ../docs/_static/microphone.jpg - :alt: Microphone (sound sensor) - This example prints the sound levels. Try clapping or blowing on - the microphone to see the levels change. - .. code-block:: python - from adafruit_clue import clue - while True: - print(clue.sound_level) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions("sound_level") - - def loud_sound(self, sound_threshold=200): - """Not Implemented! - Utilise a loud sound as an input. - :param int sound_threshold: Threshold sound level must exceed to return true (Default: 200) - .. image :: ../docs/_static/microphone.jpg - :alt: Microphone (sound sensor) - This example turns the NeoPixel LED blue each time you make a loud sound. - Try clapping or blowing onto the microphone to trigger it. - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.loud_sound(): - clue.pixel.fill((0, 50, 0)) - else: - clue.pixel.fill(0) - You may find that the code is not responding how you would like. - If this is the case, you can change the loud sound threshold to - make it more or less responsive. Setting it to a higher number - means it will take a louder sound to trigger. Setting it to a - lower number will take a quieter sound to trigger. The following - example shows the threshold being set to a higher number than - the default. - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.loud_sound(sound_threshold=300): - clue.pixel.fill((0, 50, 0)) - else: - clue.pixel.fill(0) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions(Clue.loud_sound.__name__) - - @staticmethod - def simple_text_display( - title=None, - title_color=(255, 255, 255), - title_scale=1, # pylint: disable=too-many-arguments - text_scale=1, - font=None, - colors=None, - ): - """Display lines of text on the CLUE display. Lines of text are created in order as shown - in the example below. If you skip a number, the line will be shown blank on the display, - e.g. if you include ``[0]`` and ``[2]``, the second line on the display will be empty, and - the text specified for lines 0 and 2 will be displayed on the first and third line. - Remember, Python begins counting at 0, so the first line on the display is 0 in the code. - - Setup occurs before the loop. For data to be dynamically updated on the display, you must - include the data call in the loop by using ``.text =``. For example, if setup is saved as - ``clue_data = display_clue_data()`` then ``clue_data[0].text = clue.proximity`` must be - inside the ``while True:`` loop for the proximity data displayed to update as the - values change. You must call ``show()`` at the end of the list for anything to display. - See example below for usage. - - :param str title: The title displayed above the data. Set ``title="Title text"`` to provide - a title. Defaults to None. - :param title_color: The color of the title. Not necessary if no title is provided. Defaults - to white (255, 255, 255). - :param int title_scale: Scale the size of the title. Not necessary if no title is provided. - Defaults to 1. - :param int text_scale: Scale the size of the data lines. Scales the title as well. - Defaults to 1. - :param str font: The font to use to display the title and data. Defaults to built in - ``terminalio.FONT``. - :param colors: A list of colors for the lines of data on the display. If you provide a - single color, all lines will be that color. Otherwise it will cycle through - the list you provide if the list is less than the number of lines displayed. - Default colors are used if ``colors`` is not set. For example, if creating - two lines of data, ``colors=((255, 255, 255), (255, 0, 0))`` would set the - first line white and the second line red, and if you created four lines of - data with the same setup, it would alternate white and red. - - .. image :: ../docs/_static/display_clue_data.jpg - :alt: Display Clue Data demo - - This example displays three lines with acceleration, gyro and magnetic data on the display. - Remember to call ``show()`` after the list to update the display. - - .. code-block:: python - - from adafruit_clue import clue - - clue_data = clue.simple_text_display(title="CLUE Sensor Data!", title_scale=2) - - while True: - clue_data[0].text = "Acceleration: {:.2f} {:.2f} {:.2f}".format(*clue.acceleration) - clue_data[1].text = "Gyro: {:.2f} {:.2f} {:.2f}".format(*clue.gyro) - clue_data[2].text = "Magnetic: {:.3f} {:.3f} {:.3f}".format(*clue.magnetic) - clue_data.show() - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TEXT_DISPLAY - ) - return _ClueSimpleTextDisplay( - title=title, - title_color=title_color, - title_scale=title_scale, - text_scale=text_scale, - font=font, - colors=colors, - ) - - def update_state(self, new_state): - for event in new_state.keys(): - if event in CONSTANTS.EXPECTED_INPUT_BUTTONS: - self.__update_button(event, new_state.get(event)) - elif event in CONSTANTS.ALL_EXPECTED_INPUT_EVENTS: - if self.__state[event] != new_state[event]: - self.__state[event] = new_state.get(event) - - # helpers - def __update_button(self, button, value): - if value: - self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS].add( - self.button_mapping[button] - ) - self.__state[button] = value - - def __set_leds(self, led, value): - value = bool(value) - self.__state[led] = value - sendable_json = {led: value} - if common.utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - sendable_json, CONSTANTS.CLUE - ) - else: - common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) - - -clue = Clue() # pylint: disable=invalid-name -"""Object that is automatically created on import. - - To use, simply import it from the module: - - .. code-block:: python - - from adafruit_clue import clue -""" +# The MIT License (MIT) +# +# Copyright (c) 2020 Kattni Rembor for Adafruit Industries +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +""" +`adafruit_clue` +================================================================================ + +A high level library representing all the features of the Adafruit CLUE. + + +* Author(s): Kattni Rembor + +Implementation Notes +-------------------- + +**Hardware:** + +.. "* `Adafruit CLUE - nRF52840 Express with Bluetooth LE `_" + +**Software and Dependencies:** + +* Adafruit CircuitPython firmware for the supported boards: + https://github.com/adafruit/circuitpython/releases + + * Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice + * Adafruit's Register library: https://github.com/adafruit/Adafruit_CircuitPython_Register + * Adafruit's LSM6DS CircuitPython Library: + https://github.com/adafruit/Adafruit_CircuitPython_LSM6DS + * Adafruit's LIS3MDL CircuitPython Library: + https://github.com/adafruit/Adafruit_CircuitPython_LIS3MDL + * Adafruit's APDS9960 CircuitPython Library: + https://github.com/adafruit/Adafruit_CircuitPython_APDS9960 + * Adafruit's BMP280 CircuitPython Library: + https://github.com/adafruit/Adafruit_CircuitPython_BMP280 + * Adafruit's SHT31D CircuitPython Library: + https://github.com/adafruit/Adafruit_CircuitPython_SHT31D + * Adafruit's NeoPixel CircuitPython Library: + https://github.com/adafruit/Adafruit_CircuitPython_NeoPixel +""" + +import common +from base_circuitpython import base_cp_constants as CONSTANTS +import neopixel +import time +import array +import math +from PIL import Image +import pathlib +import sys +import os +import board + +abs_path = pathlib.Path(__file__).parent.absolute() +sys.path.insert(0, os.path.join(abs_path)) + +# REVISED VERSION OF THE ADAFRUIT CLUE LIBRARY FOR DSX + +__version__ = "0.0.0-auto.0" +__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_CLUE.git" + + +class _ClueSimpleTextDisplay: + """Easily display lines of text on CLUE display.""" + + def __init__( + self, + title=None, + title_color=0xFFFFFF, + title_scale=1, # pylint: disable=too-many-arguments + text_scale=1, + font=None, + colors=None, + ): + import displayio + import terminalio + from adafruit_display_text import label + + if not colors: + colors = ( + Clue.VIOLET, + Clue.GREEN, + Clue.RED, + Clue.CYAN, + Clue.ORANGE, + Clue.BLUE, + Clue.MAGENTA, + Clue.SKY, + Clue.YELLOW, + Clue.PURPLE, + ) + + self._display = board.DISPLAY + self._colors = colors + self._label = label + self._font = terminalio.FONT + if font: + self._font = font + self.text_scale = text_scale + self.text_group = displayio.Group(max_size=20, scale=self.text_scale) + if title: + # Fail gracefully if title is longer than 60 characters. + if len(title) > 60: + raise ValueError("Title must be 60 characters or less.") + + title = label.Label( + self._font, + text=title, + max_glyphs=60, + color=title_color, + scale=title_scale, + ) + title.x = 0 + title.y = 8 * self.text_scale + self._y = title.y + 18 * self.text_scale + + self.text_group.append(title) + else: + self._y = 3 * self.text_scale + + self._lines = [] + for num in range(1): + self._lines.append(self.add_text_line(color=colors[num % len(colors)])) + + def __getitem__(self, item): + """Fetch the Nth text line Group""" + if len(self._lines) - 1 < item: + for _ in range(item - (len(self._lines) - 1)): + self._lines.append( + self.add_text_line(color=self._colors[item % len(self._colors)]) + ) + return self._lines[item] + + def add_text_line(self, color=0xFFFFFF): + """Adds a line on the display of the specified color and returns the label object.""" + text_label = self._label.Label(self._font, text="", max_glyphs=45, color=color) + text_label.x = 0 + text_label.y = self._y + self._y = text_label.y + 13 * self.text_scale + self.text_group.append(text_label) + + return text_label + + def show(self): + """Call show() to display the data list.""" + self._display.show(self.text_group) + + def show_terminal(self): + """Revert to terminalio screen.""" + self._display.show(None) + + +class Clue: # pylint: disable=too-many-instance-attributes, too-many-public-methods + """Represents a single CLUE.""" + + # Color variables available for import. + RED = (255, 0, 0) + YELLOW = (255, 255, 0) + ORANGE = (255, 150, 0) + GREEN = (0, 255, 0) + TEAL = (0, 255, 120) + CYAN = (0, 255, 255) + BLUE = (0, 0, 255) + PURPLE = (180, 0, 255) + MAGENTA = (255, 0, 150) + WHITE = (255, 255, 255) + BLACK = (0, 0, 0) + + GOLD = (255, 222, 30) + PINK = (242, 90, 255) + AQUA = (50, 255, 255) + JADE = (0, 255, 40) + AMBER = (255, 100, 0) + VIOLET = (255, 0, 255) + SKY = (0, 180, 255) + + RAINBOW = (RED, ORANGE, YELLOW, GREEN, BLUE, PURPLE) + + def __init__(self): + self.__state = {} + self.__state[CONSTANTS.CLUE_STATE.BUTTON_A] = False + self.__state[CONSTANTS.CLUE_STATE.BUTTON_B] = False + self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS] = set() + self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE] = 1013.25 + self.__state[CONSTANTS.CLUE_STATE.TEMPERATURE] = 0 + self.__state[CONSTANTS.CLUE_STATE.PROXIMITY] = 0 + self.__state[CONSTANTS.CLUE_STATE.GESTURE] = "" + self.__state[CONSTANTS.CLUE_STATE.HUMIDITY] = 0 + self.__state[CONSTANTS.CLUE_STATE.PRESSURE] = 1013 + self.__state[CONSTANTS.CLUE_STATE.PIXEL] = neopixel.NeoPixel( + pin=CONSTANTS.CLUE_PIN, n=1, pixel_order=neopixel.RGB + ) + # Accelerometer + self.__state[CONSTANTS.CLUE_STATE.MOTION_X] = 0 + self.__state[CONSTANTS.CLUE_STATE.MOTION_Y] = 0 + self.__state[CONSTANTS.CLUE_STATE.MOTION_Z] = 0 + # Light/color sensor + self.__state[CONSTANTS.CLUE_STATE.LIGHT_R] = 0 + self.__state[CONSTANTS.CLUE_STATE.LIGHT_G] = 0 + self.__state[CONSTANTS.CLUE_STATE.LIGHT_B] = 0 + self.__state[CONSTANTS.CLUE_STATE.LIGHT_C] = 0 + # Magnetometer + self.__state[CONSTANTS.CLUE_STATE.MAGNET_X] = 0 + self.__state[CONSTANTS.CLUE_STATE.MAGNET_Y] = 0 + self.__state[CONSTANTS.CLUE_STATE.MAGNET_Z] = 0 + # Gyroscope + self.__state[CONSTANTS.CLUE_STATE.GYRO_X] = 0 + self.__state[CONSTANTS.CLUE_STATE.GYRO_Y] = 0 + self.__state[CONSTANTS.CLUE_STATE.GYRO_Z] = 0 + # LEDs + self.__state[CONSTANTS.CLUE_STATE.RED_LED] = False + self.__state[CONSTANTS.CLUE_STATE.WHITE_LEDS] = False + + self.button_mapping = { + CONSTANTS.CLUE_STATE.BUTTON_A: "A", + CONSTANTS.CLUE_STATE.BUTTON_B: "B", + } + self.display = board.DISPLAY + + @property + def button_a(self): + """``True`` when Button A is pressed. ``False`` if not. + This example prints when button A is pressed. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + if clue.button_a: + print("Button A pressed") + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_BUTTON_A + ) + return self.__state[CONSTANTS.CLUE_STATE.BUTTON_A] + + @property + def button_b(self): + """``True`` when Button B is pressed. ``False`` if not. + This example prints when button B is pressed. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + if clue.button_b: + print("Button B pressed") + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_BUTTON_B + ) + return self.__state[CONSTANTS.CLUE_STATE.BUTTON_B] + + @property + def were_pressed(self): + """Returns a set of the buttons that have been pressed. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + print(clue.were_pressed) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_WERE_PRESSED + ) + ret = self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS].copy() + self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS].clear() + return ret + + @property + def acceleration(self): + """Obtain acceleration data from the x, y and z axes. + This example prints the values. Try moving the board to see how the printed values change. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + print("Accel: {:.2f} {:.2f} {:.2f}".format(*clue.acceleration)) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_ACCELERATION + ) + return ( + self.__state[CONSTANTS.CLUE_STATE.MOTION_X], + self.__state[CONSTANTS.CLUE_STATE.MOTION_Y], + self.__state[CONSTANTS.CLUE_STATE.MOTION_Z], + ) + + def shake(self, shake_threshold=30, avg_count=10, total_delay=0.1): + """Detect when the accelerometer is shaken. Optional parameters: + :param shake_threshold: Increase or decrease to change shake sensitivity. This + requires a minimum value of 10. 10 is the total + acceleration if the board is not moving, therefore + anything less than 10 will erroneously report a constant + shake detected. (Default 30) + :param avg_count: The number of readings taken and used for the average + acceleration. (Default 10) + :param total_delay: The total time in seconds it takes to obtain avg_count + readings from acceleration. (Default 0.1) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_SHAKE + ) + is_shaken = self.__state[CONSTANTS.CLUE_STATE.GESTURE] == CONSTANTS.SHAKE + return is_shaken + + @property + def color(self): + """The red, green, blue, and clear light values. (r, g, b, c) + This example prints the values. Try holding something up to the sensor to see the values + change. Works best with white LEDs enabled. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + print("Color: R: {} G: {} B: {} C: {}".format(*clue.color)) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_COLOR + ) + return ( + self.__state[CONSTANTS.CLUE_STATE.LIGHT_R], + self.__state[CONSTANTS.CLUE_STATE.LIGHT_G], + self.__state[CONSTANTS.CLUE_STATE.LIGHT_B], + self.__state[CONSTANTS.CLUE_STATE.LIGHT_C], + ) + + @property + def temperature(self): + """The temperature in degrees Celsius. + This example prints the value. Try touching the sensor to see the value change. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + print("Temperature: {:.1f}C".format(clue.temperature)) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_TEMPERATURE + ) + return self.__state[CONSTANTS.CLUE_STATE.TEMPERATURE] + + @property + def magnetic(self): + """Obtain x, y, z magnetic values in microteslas. + This example prints the values. Try moving the board to see how the printed values change. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + print("Magnetic: {:.3f} {:.3f} {:.3f}".format(*clue.magnetic)) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_MAGNETIC + ) + return ( + self.__state[CONSTANTS.CLUE_STATE.MAGNET_X], + self.__state[CONSTANTS.CLUE_STATE.MAGNET_Y], + self.__state[CONSTANTS.CLUE_STATE.MAGNET_Z], + ) + + @property + def proximity(self): + """A relative proximity to the sensor in values from 0 - 255. + This example prints the value. Try moving your hand towards and away from the front of the + board to see how the printed values change. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + print("Proximity: {}".format(clue.proximity)) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_PROXIMITY + ) + return self.__state[CONSTANTS.CLUE_STATE.PROXIMITY] + + @property + def gyro(self): + """Obtain x, y, z angular velocity values in degrees/second. + This example prints the values. Try moving the board to see how the printed values change. + print("Gyro: {:.2f} {:.2f} {:.2f}".format(*clue.gyro)) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_GYRO + ) + return ( + self.__state[CONSTANTS.CLUE_STATE.GYRO_X], + self.__state[CONSTANTS.CLUE_STATE.GYRO_Y], + self.__state[CONSTANTS.CLUE_STATE.GYRO_Z], + ) + + @property + def gesture(self): + """A gesture code if gesture is detected. Shows ``0`` if no gesture detected. + ``1`` if an UP gesture is detected, ``2`` if DOWN, ``3`` if LEFT, and ``4`` if RIGHT. + This example prints the gesture values. Try moving your hand up, down, left or right over + the sensor to see the value change. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + print("Gesture: {}".format(clue.gesture)) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_GESTURE + ) + gesture_mapping = {"": 0, "up": 1, "down": 2, "left": 3, "right": 4} + return gesture_mapping.get(self.__state[CONSTANTS.CLUE_STATE.GESTURE], 0) + + @property + def humidity(self): + """The measured relative humidity in percent. + This example prints the value. Try breathing on the sensor to see the values change. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + print("Humidity: {:.1f}%".format(clue.humidity)) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_HUMIDITY + ) + return self.__state[CONSTANTS.CLUE_STATE.HUMIDITY] + + @property + def pressure(self): + """The barometric pressure in hectoPascals. + This example prints the value. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + print("Pressure: {:.3f}hPa".format(clue.pressure)) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_PRESSURE + ) + return self.__state[CONSTANTS.CLUE_STATE.PRESSURE] + + @property + def altitude(self): + """The altitude in meters based on the sea level pressure at your location. You must set + ``sea_level_pressure`` to receive an accurate reading. + This example prints the value. Try moving the board vertically to see the value change. + .. code-block:: python + from adafruit_clue import clue + clue.sea_level_pressure = 1015 + print("Altitude: {:.1f}m".format(clue.altitude)) + """ + # National Oceanic and Atmospheric Administration (NOAA) formula for converting atmospheric pressure to pressure altitude. + OUTSIDE_MULTIPLER_CONSTANT = 44330 + POWER_CONSTANT = 0.1903 + WHOLE_CONSTANT = 1 + + altitude = OUTSIDE_MULTIPLER_CONSTANT * ( + WHOLE_CONSTANT + - math.pow( + self.__state[CONSTANTS.CLUE_STATE.PRESSURE] + / self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE], + POWER_CONSTANT, + ) + ) + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_ALTITUDE + ) + return altitude + + @property + def sea_level_pressure(self): + """Set to the pressure at sea level at your location, before reading altitude for + the most accurate altitude measurement. + This example prints the value. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + clue.sea_level_pressure = 1015 + print("Pressure: {:.3f}hPa".format(clue.pressure)) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_SEA_LEVEL_PRESSURE + ) + return self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE] + + @sea_level_pressure.setter + def sea_level_pressure(self, value): + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_SEA_LEVEL_PRESSURE + ) + self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE] = value + + @property + def pixel(self): + """The NeoPixel RGB LED. + This example turns the NeoPixel purple. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + clue.pixel.fill((255, 0, 255)) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_PIXEL + ) + return self.__state[CONSTANTS.CLUE_STATE.PIXEL] + + @property + def touch_0(self): + """Not Implemented! + + Detect touch on capacitive touch pad 0. + .. image :: ../docs/_static/pad_0.jpg + :alt: Pad 0 + This example prints when pad 0 is touched. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + if clue.touch_0: + print("Touched pad 0") + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_TOUCH + ) + common.utils.print_for_unimplemented_functions("touch_0") + + @property + def touch_1(self): + """Not Implemented! + + Detect touch on capacitive touch pad 1. + .. image :: ../docs/_static/pad_1.jpg + :alt: Pad 1 + This example prints when pad 1 is touched. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + if clue.touch_1: + print("Touched pad 1") + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_TOUCH + ) + common.utils.print_for_unimplemented_functions("touch_1") + + @property + def touch_2(self): + """Not Implemented! + + Detect touch on capacitive touch pad 2. + .. image :: ../docs/_static/pad_2.jpg + :alt: Pad 2 + This example prints when pad 2 is touched. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + if clue.touch_2: + print("Touched pad 2") + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_TOUCH + ) + common.utils.print_for_unimplemented_functions("touch_2") + + @property + def white_leds(self): + """The red led next to the USB plug labeled LED. + .. image :: ../docs/_static/white_leds.jpg + :alt: White LEDs + This example turns on the white LEDs. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + clue.white_leds = True + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_WHITE_LEDS + ) + return self.__state[CONSTANTS.CLUE_STATE.WHITE_LEDS] + + @white_leds.setter + def white_leds(self, value): + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_WHITE_LEDS + ) + self.__set_leds(CONSTANTS.CLUE_STATE.WHITE_LEDS, value) + + @property + def red_led(self): + """The red led next to the USB plug labeled LED. + .. image :: ../docs/_static/red_led.jpg + :alt: Red LED + This example turns on the red LED. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + clue.red_led = True + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_RED_LED + ) + return self.__state[CONSTANTS.CLUE_STATE.RED_LED] + + @red_led.setter + def red_led(self, value): + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_RED_LED + ) + self.__set_leds(CONSTANTS.CLUE_STATE.RED_LED, value) + + def play_tone(self, frequency, duration): + """ Not Implemented! + Produce a tone using the speaker. Try changing frequency to change + the pitch of the tone. + :param int frequency: The frequency of the tone in Hz + :param float duration: The duration of the tone in seconds + .. image :: ../docs/_static/speaker.jpg + :alt: Speaker + This example plays a 880 Hz tone for a duration of 1 second. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + clue.play_tone(880, 1) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_SOUND + ) + common.utils.print_for_unimplemented_functions(Clue.play_tone.__name__) + + def start_tone(self, frequency): + """ Not Implemented! + Produce a tone using the speaker. Try changing frequency to change + the pitch of the tone. + :param int frequency: The frequency of the tone in Hz + .. image :: ../docs/_static/speaker.jpg + :alt: Speaker + This example plays a 523Hz tone when button A is pressed and a 587Hz tone when button B is + pressed, only while the buttons are being pressed. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + if clue.button_a: + clue.start_tone(523) + elif clue.button_b: + clue.start_tone(587) + else: + clue.stop_tone() + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_SOUND + ) + common.utils.print_for_unimplemented_functions(Clue.start_tone.__name__) + + def stop_tone(self): + """ Not Implemented! + Use with start_tone to stop the tone produced. + .. image :: ../docs/_static/speaker.jpg + :alt: Speaker + This example plays a 523Hz tone when button A is pressed and a 587Hz tone when button B is + pressed, only while the buttons are being pressed. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + if clue.button_a: + clue.start_tone(523) + elif clue.button_b: + clue.start_tone(587) + else: + clue.stop_tone() + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_SOUND + ) + common.utils.print_for_unimplemented_functions(Clue.stop_tone.__name__) + + @property + def sound_level(self): + """Not Implemented! + Obtain the sound level from the microphone (sound sensor). + .. image :: ../docs/_static/microphone.jpg + :alt: Microphone (sound sensor) + This example prints the sound levels. Try clapping or blowing on + the microphone to see the levels change. + .. code-block:: python + from adafruit_clue import clue + while True: + print(clue.sound_level) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_SOUND + ) + common.utils.print_for_unimplemented_functions("sound_level") + + def loud_sound(self, sound_threshold=200): + """Not Implemented! + Utilise a loud sound as an input. + :param int sound_threshold: Threshold sound level must exceed to return true (Default: 200) + .. image :: ../docs/_static/microphone.jpg + :alt: Microphone (sound sensor) + This example turns the NeoPixel LED blue each time you make a loud sound. + Try clapping or blowing onto the microphone to trigger it. + .. code-block:: python + from adafruit_clue import clue + while True: + if clue.loud_sound(): + clue.pixel.fill((0, 50, 0)) + else: + clue.pixel.fill(0) + You may find that the code is not responding how you would like. + If this is the case, you can change the loud sound threshold to + make it more or less responsive. Setting it to a higher number + means it will take a louder sound to trigger. Setting it to a + lower number will take a quieter sound to trigger. The following + example shows the threshold being set to a higher number than + the default. + .. code-block:: python + from adafruit_clue import clue + while True: + if clue.loud_sound(sound_threshold=300): + clue.pixel.fill((0, 50, 0)) + else: + clue.pixel.fill(0) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_SOUND + ) + common.utils.print_for_unimplemented_functions(Clue.loud_sound.__name__) + + @staticmethod + def simple_text_display( + title=None, + title_color=(255, 255, 255), + title_scale=1, # pylint: disable=too-many-arguments + text_scale=1, + font=None, + colors=None, + ): + """Display lines of text on the CLUE display. Lines of text are created in order as shown + in the example below. If you skip a number, the line will be shown blank on the display, + e.g. if you include ``[0]`` and ``[2]``, the second line on the display will be empty, and + the text specified for lines 0 and 2 will be displayed on the first and third line. + Remember, Python begins counting at 0, so the first line on the display is 0 in the code. + + Setup occurs before the loop. For data to be dynamically updated on the display, you must + include the data call in the loop by using ``.text =``. For example, if setup is saved as + ``clue_data = display_clue_data()`` then ``clue_data[0].text = clue.proximity`` must be + inside the ``while True:`` loop for the proximity data displayed to update as the + values change. You must call ``show()`` at the end of the list for anything to display. + See example below for usage. + + :param str title: The title displayed above the data. Set ``title="Title text"`` to provide + a title. Defaults to None. + :param title_color: The color of the title. Not necessary if no title is provided. Defaults + to white (255, 255, 255). + :param int title_scale: Scale the size of the title. Not necessary if no title is provided. + Defaults to 1. + :param int text_scale: Scale the size of the data lines. Scales the title as well. + Defaults to 1. + :param str font: The font to use to display the title and data. Defaults to built in + ``terminalio.FONT``. + :param colors: A list of colors for the lines of data on the display. If you provide a + single color, all lines will be that color. Otherwise it will cycle through + the list you provide if the list is less than the number of lines displayed. + Default colors are used if ``colors`` is not set. For example, if creating + two lines of data, ``colors=((255, 255, 255), (255, 0, 0))`` would set the + first line white and the second line red, and if you created four lines of + data with the same setup, it would alternate white and red. + + .. image :: ../docs/_static/display_clue_data.jpg + :alt: Display Clue Data demo + + This example displays three lines with acceleration, gyro and magnetic data on the display. + Remember to call ``show()`` after the list to update the display. + + .. code-block:: python + + from adafruit_clue import clue + + clue_data = clue.simple_text_display(title="CLUE Sensor Data!", title_scale=2) + + while True: + clue_data[0].text = "Acceleration: {:.2f} {:.2f} {:.2f}".format(*clue.acceleration) + clue_data[1].text = "Gyro: {:.2f} {:.2f} {:.2f}".format(*clue.gyro) + clue_data[2].text = "Magnetic: {:.3f} {:.3f} {:.3f}".format(*clue.magnetic) + clue_data.show() + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_TEXT_DISPLAY + ) + return _ClueSimpleTextDisplay( + title=title, + title_color=title_color, + title_scale=title_scale, + text_scale=text_scale, + font=font, + colors=colors, + ) + + def update_state(self, new_state): + for event in new_state.keys(): + if event in CONSTANTS.EXPECTED_INPUT_BUTTONS: + self.__update_button(event, new_state.get(event)) + elif event in CONSTANTS.ALL_EXPECTED_INPUT_EVENTS: + if self.__state[event] != new_state[event]: + self.__state[event] = new_state.get(event) + + # helpers + def __update_button(self, button, value): + if value: + self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS].add( + self.button_mapping[button] + ) + self.__state[button] = value + + def __set_leds(self, led, value): + value = bool(value) + self.__state[led] = value + sendable_json = {led: value} + if common.utils.debug_mode: + common.debugger_communication_client.debug_send_to_simulator( + sendable_json, CONSTANTS.CLUE + ) + else: + common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) + + +clue = Clue() # pylint: disable=invalid-name +"""Object that is automatically created on import. + + To use, simply import it from the module: + + .. code-block:: python + + from adafruit_clue import clue +""" diff --git a/src/clue/adafruit_display_text/label.py b/Source/clue/adafruit_display_text/label.py similarity index 97% rename from src/clue/adafruit_display_text/label.py rename to Source/clue/adafruit_display_text/label.py index f7bab0b7f..9cfff6842 100644 --- a/src/clue/adafruit_display_text/label.py +++ b/Source/clue/adafruit_display_text/label.py @@ -1,280 +1,280 @@ -# The MIT License (MIT) -# -# Copyright (c) 2019 Scott Shawcroft for Adafruit Industries LLC -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -""" -`adafruit_display_text.label` -==================================================== - -Displays text labels using CircuitPython's displayio. - -* Author(s): Scott Shawcroft - -Implementation Notes --------------------- - -**Hardware:** - -**Software and Dependencies:** - -* Adafruit CircuitPython firmware for the supported boards: - https://github.com/adafruit/circuitpython/releases - -""" - -import displayio - -__version__ = "0.0.0-auto.0" -__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git" - - -class Label(displayio.Group): - """A label displaying a string of text. The origin point set by ``x`` and ``y`` - properties will be the left edge of the bounding box, and in the center of a M - glyph (if its one line), or the (number of lines * linespacing + M)/2. That is, - it will try to have it be center-left as close as possible. - - :param Font font: A font class that has ``get_bounding_box`` and ``get_glyph``. - Must include a capital M for measuring character size. - :param str text: Text to display - :param int max_glyphs: The largest quantity of glyphs we will display - :param int color: Color of all text in RGB hex - :param double line_spacing: Line spacing of text to display""" - - def __init__( - self, - font, - *, - x=0, - y=0, - text=None, - max_glyphs=None, - color=0xFFFFFF, - background_color=None, - line_spacing=1.25, - **kwargs - ): - if not max_glyphs and not text: - raise RuntimeError("Please provide a max size, or initial text") - if not max_glyphs: - max_glyphs = len(text) - super().__init__(max_size=max_glyphs, auto_write=False, **kwargs) - self.width = max_glyphs - self.font = font - self._text = None - self._anchor_point = (0, 0) - self.x = x - self.y = y - - self.palette = displayio.Palette(2) - if background_color is not None: - self.palette[0] = background_color - self.palette.make_opaque(0) - self._transparent_background = False - else: - self.palette[0] = 0 - self.palette.make_transparent(0) - self._transparent_background = True - self.palette[1] = color - - bounds = self.font.get_bounding_box() - self.height = bounds[1] - self._line_spacing = line_spacing - self._boundingbox = None - - if text is not None: - self._update_text(str(text)) - - def _update_text(self, new_text): # pylint: disable=too-many-locals - x = 0 - y = 0 - i = 0 - old_c = 0 - y_offset = int( - ( - self.font.get_glyph(ord("M")).height - - new_text.count("\n") * self.height * self.line_spacing - ) - / 2 - ) - # print("y offset from baseline", y_offset) - left = right = top = bottom = 0 - for character in new_text: - if character == "\n": - y += int(self.height * self._line_spacing) - x = 0 - continue - glyph = self.font.get_glyph(ord(character)) - if not glyph: - continue - right = max(right, x + glyph.width) - if y == 0: # first line, find the Ascender height - top = min(top, -glyph.height + y_offset) - bottom = max(bottom, y - glyph.dy + y_offset) - position_y = y - glyph.height - glyph.dy + y_offset - position_x = x + glyph.dx - if ( - not self._text - or old_c >= len(self._text) - or character != self._text[old_c] - ): - try: - face = displayio.TileGrid( - glyph.bitmap, - pixel_shader=self.palette, - default_tile=glyph.tile_index, - tile_width=glyph.width, - tile_height=glyph.height, - position=(position_x, position_y), - ) - except TypeError: - face = displayio.TileGrid( - glyph.bitmap, - pixel_shader=self.palette, - default_tile=glyph.tile_index, - tile_width=glyph.width, - tile_height=glyph.height, - x=position_x, - y=position_y, - ) - if i < len(self): - self[i] = face - else: - self.append(face) - elif self._text and character == self._text[old_c]: - try: - self[i].position = (position_x, position_y) - except AttributeError: - self[i].x = position_x - self[i].y = position_y - - x += glyph.shift_x - - # TODO skip this for control sequences or non-printables. - i += 1 - old_c += 1 - # skip all non-prinables in the old string - while ( - self._text - and old_c < len(self._text) - and ( - self._text[old_c] == "\n" - or not self.font.get_glyph(ord(self._text[old_c])) - ) - ): - old_c += 1 - # Remove the rest - while len(self) > i: - self.pop() - self._text = new_text - self._boundingbox = (left, top, left + right, bottom - top) - - @property - def bounding_box(self): - """An (x, y, w, h) tuple that completely covers all glyphs. The - first two numbers are offset from the x, y origin of this group""" - return tuple(self._boundingbox) - - @property - def line_spacing(self): - """The amount of space between lines of text, in multiples of the font's - bounding-box height. (E.g. 1.0 is the bounding-box height)""" - return self._line_spacing - - @line_spacing.setter - def line_spacing(self, spacing): - if self._line_spacing != spacing: - self._line_spacing = spacing - self._Group__trigger_draw() - - @property - def color(self): - """Color of the text as an RGB hex number.""" - return self.palette[1] - - @color.setter - def color(self, new_color): - self.palette[1] = new_color - self._Group__trigger_draw() - - @property - def background_color(self): - """Color of the background as an RGB hex number.""" - if not self._transparent_background: - return self.palette[0] - return None - - @background_color.setter - def background_color(self, new_color): - if new_color is not None: - self.palette[0] = new_color - self.palette.make_opaque(0) - self._transparent_background = False - else: - self.palette[0] = 0 - self.palette.make_transparent(0) - self._transparent_background = True - - self._Group__trigger_draw() - - @property - def text(self): - """Text to display.""" - return self._text - - @text.setter - def text(self, new_text): - # APR 2, 2O2O -> - # Added manual trigger to update text since - # on-screen text updating is a lot faster this way. - - # Previously, the group was set to auto_write=True - # and each letter in the group was individually - # drawn and sent to the front-end display. - if new_text != self._text: - self._update_text(str(new_text)) - self._Group__trigger_draw() - - @property - def anchor_point(self): - """Point that anchored_position moves relative to. - Tuple with decimal percentage of width and height. - (E.g. (0,0) is top left, (1.0, 0.5): is middle right.)""" - return self._anchor_point - - @anchor_point.setter - def anchor_point(self, new_anchor_point): - if self._anchor_point != new_anchor_point: - self._Group__trigger_draw() - - @property - def anchored_position(self): - """Position relative to the anchor_point. Tuple containing x,y - pixel coordinates.""" - return ( - self.x - self._boundingbox[2] * self._anchor_point[0], - self.y - self._boundingbox[3] * self._anchor_point[1], - ) - - @anchored_position.setter - def anchored_position(self, new_position): - self.x = int(new_position[0] - (self._boundingbox[2] * self._anchor_point[0])) - self.y = int(new_position[1] - (self._boundingbox[3] * self._anchor_point[1])) - self._Group__trigger_draw() +# The MIT License (MIT) +# +# Copyright (c) 2019 Scott Shawcroft for Adafruit Industries LLC +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +""" +`adafruit_display_text.label` +==================================================== + +Displays text labels using CircuitPython's displayio. + +* Author(s): Scott Shawcroft + +Implementation Notes +-------------------- + +**Hardware:** + +**Software and Dependencies:** + +* Adafruit CircuitPython firmware for the supported boards: + https://github.com/adafruit/circuitpython/releases + +""" + +import displayio + +__version__ = "0.0.0-auto.0" +__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git" + + +class Label(displayio.Group): + """A label displaying a string of text. The origin point set by ``x`` and ``y`` + properties will be the left edge of the bounding box, and in the center of a M + glyph (if its one line), or the (number of lines * linespacing + M)/2. That is, + it will try to have it be center-left as close as possible. + + :param Font font: A font class that has ``get_bounding_box`` and ``get_glyph``. + Must include a capital M for measuring character size. + :param str text: Text to display + :param int max_glyphs: The largest quantity of glyphs we will display + :param int color: Color of all text in RGB hex + :param double line_spacing: Line spacing of text to display""" + + def __init__( + self, + font, + *, + x=0, + y=0, + text=None, + max_glyphs=None, + color=0xFFFFFF, + background_color=None, + line_spacing=1.25, + **kwargs + ): + if not max_glyphs and not text: + raise RuntimeError("Please provide a max size, or initial text") + if not max_glyphs: + max_glyphs = len(text) + super().__init__(max_size=max_glyphs, auto_write=False, **kwargs) + self.width = max_glyphs + self.font = font + self._text = None + self._anchor_point = (0, 0) + self.x = x + self.y = y + + self.palette = displayio.Palette(2) + if background_color is not None: + self.palette[0] = background_color + self.palette.make_opaque(0) + self._transparent_background = False + else: + self.palette[0] = 0 + self.palette.make_transparent(0) + self._transparent_background = True + self.palette[1] = color + + bounds = self.font.get_bounding_box() + self.height = bounds[1] + self._line_spacing = line_spacing + self._boundingbox = None + + if text is not None: + self._update_text(str(text)) + + def _update_text(self, new_text): # pylint: disable=too-many-locals + x = 0 + y = 0 + i = 0 + old_c = 0 + y_offset = int( + ( + self.font.get_glyph(ord("M")).height + - new_text.count("\n") * self.height * self.line_spacing + ) + / 2 + ) + # print("y offset from baseline", y_offset) + left = right = top = bottom = 0 + for character in new_text: + if character == "\n": + y += int(self.height * self._line_spacing) + x = 0 + continue + glyph = self.font.get_glyph(ord(character)) + if not glyph: + continue + right = max(right, x + glyph.width) + if y == 0: # first line, find the Ascender height + top = min(top, -glyph.height + y_offset) + bottom = max(bottom, y - glyph.dy + y_offset) + position_y = y - glyph.height - glyph.dy + y_offset + position_x = x + glyph.dx + if ( + not self._text + or old_c >= len(self._text) + or character != self._text[old_c] + ): + try: + face = displayio.TileGrid( + glyph.bitmap, + pixel_shader=self.palette, + default_tile=glyph.tile_index, + tile_width=glyph.width, + tile_height=glyph.height, + position=(position_x, position_y), + ) + except TypeError: + face = displayio.TileGrid( + glyph.bitmap, + pixel_shader=self.palette, + default_tile=glyph.tile_index, + tile_width=glyph.width, + tile_height=glyph.height, + x=position_x, + y=position_y, + ) + if i < len(self): + self[i] = face + else: + self.append(face) + elif self._text and character == self._text[old_c]: + try: + self[i].position = (position_x, position_y) + except AttributeError: + self[i].x = position_x + self[i].y = position_y + + x += glyph.shift_x + + # TODO skip this for control sequences or non-printables. + i += 1 + old_c += 1 + # skip all non-prinables in the old string + while ( + self._text + and old_c < len(self._text) + and ( + self._text[old_c] == "\n" + or not self.font.get_glyph(ord(self._text[old_c])) + ) + ): + old_c += 1 + # Remove the rest + while len(self) > i: + self.pop() + self._text = new_text + self._boundingbox = (left, top, left + right, bottom - top) + + @property + def bounding_box(self): + """An (x, y, w, h) tuple that completely covers all glyphs. The + first two numbers are offset from the x, y origin of this group""" + return tuple(self._boundingbox) + + @property + def line_spacing(self): + """The amount of space between lines of text, in multiples of the font's + bounding-box height. (E.g. 1.0 is the bounding-box height)""" + return self._line_spacing + + @line_spacing.setter + def line_spacing(self, spacing): + if self._line_spacing != spacing: + self._line_spacing = spacing + self._Group__trigger_draw() + + @property + def color(self): + """Color of the text as an RGB hex number.""" + return self.palette[1] + + @color.setter + def color(self, new_color): + self.palette[1] = new_color + self._Group__trigger_draw() + + @property + def background_color(self): + """Color of the background as an RGB hex number.""" + if not self._transparent_background: + return self.palette[0] + return None + + @background_color.setter + def background_color(self, new_color): + if new_color is not None: + self.palette[0] = new_color + self.palette.make_opaque(0) + self._transparent_background = False + else: + self.palette[0] = 0 + self.palette.make_transparent(0) + self._transparent_background = True + + self._Group__trigger_draw() + + @property + def text(self): + """Text to display.""" + return self._text + + @text.setter + def text(self, new_text): + # APR 2, 2O2O -> + # Added manual trigger to update text since + # on-screen text updating is a lot faster this way. + + # Previously, the group was set to auto_write=True + # and each letter in the group was individually + # drawn and sent to the front-end display. + if new_text != self._text: + self._update_text(str(new_text)) + self._Group__trigger_draw() + + @property + def anchor_point(self): + """Point that anchored_position moves relative to. + Tuple with decimal percentage of width and height. + (E.g. (0,0) is top left, (1.0, 0.5): is middle right.)""" + return self._anchor_point + + @anchor_point.setter + def anchor_point(self, new_anchor_point): + if self._anchor_point != new_anchor_point: + self._Group__trigger_draw() + + @property + def anchored_position(self): + """Position relative to the anchor_point. Tuple containing x,y + pixel coordinates.""" + return ( + self.x - self._boundingbox[2] * self._anchor_point[0], + self.y - self._boundingbox[3] * self._anchor_point[1], + ) + + @anchored_position.setter + def anchored_position(self, new_position): + self.x = int(new_position[0] - (self._boundingbox[2] * self._anchor_point[0])) + self.y = int(new_position[1] - (self._boundingbox[3] * self._anchor_point[1])) + self._Group__trigger_draw() diff --git a/src/clue/adafruit_slideshow.py b/Source/clue/adafruit_slideshow.py similarity index 97% rename from src/clue/adafruit_slideshow.py rename to Source/clue/adafruit_slideshow.py index aa1fb6b65..1e2662a92 100644 --- a/src/clue/adafruit_slideshow.py +++ b/Source/clue/adafruit_slideshow.py @@ -1,407 +1,407 @@ -from PIL import Image - -import os -import base64 -from io import BytesIO -from base_circuitpython import base_cp_constants as CONSTANTS -import time -from random import shuffle -import common -import board - -# taken from adafruit -# https://github.com/adafruit/Adafruit_CircuitPython_Slideshow/blob/master/adafruit_slideshow.py - - -class PlayBackOrder: - """Defines possible slideshow playback orders.""" - - # pylint: disable=too-few-public-methods - ALPHABETICAL = 0 - """Orders by alphabetical sort of filenames""" - - RANDOM = 1 - """Randomly shuffles the images""" - # pylint: enable=too-few-public-methods - - -class PlayBackDirection: - """Defines possible slideshow playback directions.""" - - # pylint: disable=too-few-public-methods - BACKWARD = -1 - """The next image is before the current image. When alphabetically sorted, this is towards A.""" - - FORWARD = 1 - """The next image is after the current image. When alphabetically sorted, this is towards Z.""" - # pylint: enable=too-few-public-methods - - -# custom -class SlideShow: - """ - Class for displaying a slideshow of .bmp images on displays. - :param str folder: Specify the folder containing the image files, in quotes. Default is - the root directory, ``"/"``. - :param PlayBackOrder order: The order in which the images display. You can choose random - (``RANDOM``) or alphabetical (``ALPHABETICAL``). Default is - ``ALPHABETICAL``. - :param bool loop: Specify whether to loop the images or play through the list once. `True` - if slideshow will continue to loop, ``False`` if it will play only once. - Default is ``True``. - :param int dwell: The number of seconds each image displays, in seconds. Default is 3. - :param bool fade_effect: Specify whether to include the fade effect between images. ``True`` - tells the code to fade the backlight up and down between image display - transitions. ``False`` maintains max brightness on the backlight between - image transitions. Default is ``True``. - :param bool auto_advance: Specify whether to automatically advance after dwell seconds. ``True`` - if slideshow should auto play, ``False`` if you want to control advancement - manually. Default is ``True``. - :param PlayBackDirection direction: The playback direction. - Example code for Hallowing Express. With this example, the slideshow will play through once - in alphabetical order: - .. code-block:: python - from adafruit_slideshow import PlayBackOrder, SlideShow - import board - import pulseio - slideshow = SlideShow(board.DISPLAY, pulseio.PWMOut(board.TFT_BACKLIGHT), folder="/", - loop=False, order=PlayBackOrder.ALPHABETICAL) - while slideshow.update(): - pass - Example code for Hallowing Express. Sets ``dwell`` to 0 seconds, turns ``auto_advance`` off, - and uses capacitive touch to advance backwards and forwards through the images and to control - the brightness level of the backlight: - .. code-block:: python - from adafruit_slideshow import PlayBackOrder, SlideShow, PlayBackDirection - import touchio - import board - import pulseio - forward_button = touchio.TouchIn(board.TOUCH4) - back_button = touchio.TouchIn(board.TOUCH1) - brightness_up = touchio.TouchIn(board.TOUCH3) - brightness_down = touchio.TouchIn(board.TOUCH2) - slideshow = SlideShow(board.DISPLAY, pulseio.PWMOut(board.TFT_BACKLIGHT), folder="/", - auto_advance=False, dwell=0) - while True: - if forward_button.value: - slideshow.direction = PlayBackDirection.FORWARD - slideshow.advance() - if back_button.value: - slideshow.direction = PlayBackDirection.BACKWARD - slideshow.advance() - if brightness_up.value: - slideshow.brightness += 0.001 - elif brightness_down.value: - slideshow.brightness -= 0.001 - """ - - def __init__( - self, - display, - backlight_pwm=None, - *, - folder=".", - order=PlayBackOrder.ALPHABETICAL, - loop=True, - dwell=3, - fade_effect=True, - auto_advance=True, - direction=PlayBackDirection.FORWARD, - ): - self._BASE_DWELL = 0.3 - self._BASE_DWELL_DARK = 0.7 - self._NO_FADE_TRANSITION_INCREMENTS = 18 - - self.auto_advance = auto_advance - """Enable auto-advance based on dwell time. Set to ``False`` to manually control.""" - - self.loop = loop - """Specifies whether to loop through the images continuously or play through the list once. - ``True`` will continue to loop, ``False`` will play only once.""" - - self.fade_effect = fade_effect - """Whether to include the fade effect between images. ``True`` tells the code to fade the - backlight up and down between image display transitions. ``False`` maintains max - brightness on the backlight between image transitions.""" - - self.dwell = self._BASE_DWELL + dwell - """The number of seconds each image displays, in seconds.""" - - self.direction = direction - """Specify the playback direction. Default is ``PlayBackDirection.FORWARD``. Can also be - ``PlayBackDirection.BACKWARD``.""" - - self.advance = self.__advance_with_fade - """Displays the next image. Returns True when a new image was displayed, False otherwise. - """ - - self.fade_frames = 8 - - # assign new advance method if fade is disabled - if not fade_effect: - self.advance = self.__advance_no_fade - - self._img_start = None - - self.brightness = 1.0 - - # blank screen for start - self._curr_img_handle = Image.new( - "RGBA", (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - - # if path is relative, this makes sure that - # it's relative to the users's code file - abs_path_parent_dir = os.path.abspath( - os.path.join(common.utils.abs_path_to_user_file, os.pardir) - ) - abs_path_folder = os.path.normpath(os.path.join(abs_path_parent_dir, folder)) - - self.folder = abs_path_folder - - # get files within specified directory - self.dirs = os.listdir(self.folder) - - self._order = order - self._curr_img = "" - self._current_image_index = None - - # load images into main queue - self.__load_images() - - display.show(self) - # show the first working image - self.advance() - - common.telemetry.telemetry_py.send_telemetry( - common.telemetry.TelemetryEvent.CLUE_API_SLIDESHOW - ) - - @property - def current_image_name(self): - """Returns the current image name.""" - return self._curr_img - - @property - def order(self): - """Specifies the order in which the images are displayed. Options are random (``RANDOM``) or - alphabetical (``ALPHABETICAL``). Default is ``RANDOM``.""" - return self._order - - @order.setter - def order(self, order): - if order not in [PlayBackOrder.ALPHABETICAL, PlayBackOrder.RANDOM]: - raise ValueError("Order must be either 'RANDOM' or 'ALPHABETICAL'") - - self._order = order - self.__load_images() - - @property - def brightness(self): - """Brightness of the backlight when an image is displaying. Clamps to 0 to 1.0""" - return self._brightness - - @brightness.setter - def brightness(self, brightness): - if brightness < 0: - brightness = 0 - elif brightness > 1.0: - brightness = 1.0 - self._brightness = brightness - - def update(self): - """Updates the slideshow to the next image.""" - now = time.monotonic() - if not self.auto_advance or now - self._img_start < self.dwell: - return True - - return self.advance() - - def __get_next_img(self): - - if self.direction == PlayBackDirection.FORWARD: - if self._current_image_index == None: - self._current_image_index = 0 - else: - self._current_image_index += 1 - - if self._current_image_index >= len(self.dir_imgs): - - if self.loop: - self._current_image_index = 0 - self.__load_images() - else: - self._current_image_index = len(self.dir_imgs) - 10 - return "" - - else: - if self._current_image_index == None: - self._current_image_index = len(self.dir_imgs) - 1 - else: - self._current_image_index -= 1 - - if self._current_image_index < 0: - if self.loop: - self._current_image_index = len(self.dir_imgs) - 1 - self.__load_images() - else: - self._current_image_index = 0 - return "" - - img = self.dir_imgs[self._current_image_index] - return img - - def __load_images(self): - self.dir_imgs = [] - for d in self.dirs: - try: - new_path = os.path.join(self.folder, d) - - # only add bmp imgs - if os.path.splitext(new_path)[-1] == CONSTANTS.BMP_IMG_ENDING: - self.dir_imgs.append(new_path) - except Image.UnidentifiedImageError as e: - continue - - if not len(self.dir_imgs): - raise RuntimeError(CONSTANTS.NO_VALID_IMGS_ERR) - - if self._order == PlayBackOrder.RANDOM: - shuffle(self.dir_imgs) - else: - self.dir_imgs.sort() - - def __advance_with_fade(self): - if board.DISPLAY.active_group != self: - return - - old_img = self._curr_img_handle - advance_sucessful = False - - while not advance_sucessful: - new_path = self.__get_next_img() - if new_path == "": - self._img_start = time.monotonic() - return False - - try: - new_img = Image.open(new_path) - - new_img = new_img.convert("RGBA") - new_img.putalpha(255) - - new_img = new_img.crop( - (0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - - if new_img.size[0] < 240 or new_img.size[1] < 240: - black_overlay = Image.new( - "RGBA", - CONSTANTS.SCREEN_HEIGHT_WIDTH, - CONSTANTS.SCREEN_HEIGHT_WIDTH, - ) - black_overlay.paste(new_img) - new_img = black_overlay - - black_overlay = Image.new("RGBA", new_img.size) - advance_sucessful = True - except Image.UnidentifiedImageError as e: - pass - - # fade out old photo - for i in range(self.fade_frames, -1, -1): - sendable_img = Image.blend( - black_overlay, old_img, i * self.brightness / self.fade_frames - ) - self.__send(sendable_img) - - time.sleep(self._BASE_DWELL_DARK) - - # fade in new photo - for i in range(self.fade_frames + 1): - sendable_img = Image.blend( - black_overlay, new_img, i * self.brightness / self.fade_frames - ) - self.__send(sendable_img) - - self._curr_img_handle = new_img - self._curr_img = new_path - self._img_start = time.monotonic() - return True - - def __advance_no_fade(self): - if board.DISPLAY.active_group != self: - return - - old_img = self._curr_img_handle - - advance_sucessful = False - - while not advance_sucessful: - new_path = self.__get_next_img() - if new_path == "": - self._img_start = time.monotonic() - return False - - try: - new_img = Image.open(new_path) - - new_img = new_img.crop( - (0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - - if ( - new_img.size[0] < CONSTANTS.SCREEN_HEIGHT_WIDTH - or new_img.size[1] < CONSTANTS.SCREEN_HEIGHT_WIDTH - ): - black_overlay = Image.new( - "RGBA", - CONSTANTS.SCREEN_HEIGHT_WIDTH, - CONSTANTS.SCREEN_HEIGHT_WIDTH, - ) - black_overlay.paste(new_img) - new_img = black_overlay - - self._curr_img = new_path - - new_img = new_img.convert("RGBA") - new_img.putalpha(255) - advance_sucessful = True - except Image.UnidentifiedImageError as e: - pass - - if self.brightness < 1.0: - black_overlay = Image.new("RGBA", new_img.size) - new_img = Image.blend(black_overlay, new_img, self.brightness) - - # gradually scroll new img over old img - for i in range(self._NO_FADE_TRANSITION_INCREMENTS + 1): - curr_y = ( - i * CONSTANTS.SCREEN_HEIGHT_WIDTH / self._NO_FADE_TRANSITION_INCREMENTS - ) - img_piece = new_img.crop((0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, curr_y)) - old_img.paste(img_piece) - self.__send(old_img) - - self._curr_img_handle = new_img - self._curr_img = new_path - self._img_start = time.monotonic() - return True - - def __send(self, img): - # sends current bmp_img to the frontend - buffered = BytesIO() - img.save(buffered, format=CONSTANTS.BMP_IMG) - byte_base64 = base64.b64encode(buffered.getvalue()) - - # only send the base_64 string contents - img_str = str(byte_base64)[2:-1] - - sendable_json = {CONSTANTS.BASE_64: img_str} - - if common.utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - sendable_json, CONSTANTS.CLUE - ) - else: - common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) +from PIL import Image + +import os +import base64 +from io import BytesIO +from base_circuitpython import base_cp_constants as CONSTANTS +import time +from random import shuffle +import common +import board + +# taken from adafruit +# https://github.com/adafruit/Adafruit_CircuitPython_Slideshow/blob/master/adafruit_slideshow.py + + +class PlayBackOrder: + """Defines possible slideshow playback orders.""" + + # pylint: disable=too-few-public-methods + ALPHABETICAL = 0 + """Orders by alphabetical sort of filenames""" + + RANDOM = 1 + """Randomly shuffles the images""" + # pylint: enable=too-few-public-methods + + +class PlayBackDirection: + """Defines possible slideshow playback directions.""" + + # pylint: disable=too-few-public-methods + BACKWARD = -1 + """The next image is before the current image. When alphabetically sorted, this is towards A.""" + + FORWARD = 1 + """The next image is after the current image. When alphabetically sorted, this is towards Z.""" + # pylint: enable=too-few-public-methods + + +# custom +class SlideShow: + """ + Class for displaying a slideshow of .bmp images on displays. + :param str folder: Specify the folder containing the image files, in quotes. Default is + the root directory, ``"/"``. + :param PlayBackOrder order: The order in which the images display. You can choose random + (``RANDOM``) or alphabetical (``ALPHABETICAL``). Default is + ``ALPHABETICAL``. + :param bool loop: Specify whether to loop the images or play through the list once. `True` + if slideshow will continue to loop, ``False`` if it will play only once. + Default is ``True``. + :param int dwell: The number of seconds each image displays, in seconds. Default is 3. + :param bool fade_effect: Specify whether to include the fade effect between images. ``True`` + tells the code to fade the backlight up and down between image display + transitions. ``False`` maintains max brightness on the backlight between + image transitions. Default is ``True``. + :param bool auto_advance: Specify whether to automatically advance after dwell seconds. ``True`` + if slideshow should auto play, ``False`` if you want to control advancement + manually. Default is ``True``. + :param PlayBackDirection direction: The playback direction. + Example code for Hallowing Express. With this example, the slideshow will play through once + in alphabetical order: + .. code-block:: python + from adafruit_slideshow import PlayBackOrder, SlideShow + import board + import pulseio + slideshow = SlideShow(board.DISPLAY, pulseio.PWMOut(board.TFT_BACKLIGHT), folder="/", + loop=False, order=PlayBackOrder.ALPHABETICAL) + while slideshow.update(): + pass + Example code for Hallowing Express. Sets ``dwell`` to 0 seconds, turns ``auto_advance`` off, + and uses capacitive touch to advance backwards and forwards through the images and to control + the brightness level of the backlight: + .. code-block:: python + from adafruit_slideshow import PlayBackOrder, SlideShow, PlayBackDirection + import touchio + import board + import pulseio + forward_button = touchio.TouchIn(board.TOUCH4) + back_button = touchio.TouchIn(board.TOUCH1) + brightness_up = touchio.TouchIn(board.TOUCH3) + brightness_down = touchio.TouchIn(board.TOUCH2) + slideshow = SlideShow(board.DISPLAY, pulseio.PWMOut(board.TFT_BACKLIGHT), folder="/", + auto_advance=False, dwell=0) + while True: + if forward_button.value: + slideshow.direction = PlayBackDirection.FORWARD + slideshow.advance() + if back_button.value: + slideshow.direction = PlayBackDirection.BACKWARD + slideshow.advance() + if brightness_up.value: + slideshow.brightness += 0.001 + elif brightness_down.value: + slideshow.brightness -= 0.001 + """ + + def __init__( + self, + display, + backlight_pwm=None, + *, + folder=".", + order=PlayBackOrder.ALPHABETICAL, + loop=True, + dwell=3, + fade_effect=True, + auto_advance=True, + direction=PlayBackDirection.FORWARD, + ): + self._BASE_DWELL = 0.3 + self._BASE_DWELL_DARK = 0.7 + self._NO_FADE_TRANSITION_INCREMENTS = 18 + + self.auto_advance = auto_advance + """Enable auto-advance based on dwell time. Set to ``False`` to manually control.""" + + self.loop = loop + """Specifies whether to loop through the images continuously or play through the list once. + ``True`` will continue to loop, ``False`` will play only once.""" + + self.fade_effect = fade_effect + """Whether to include the fade effect between images. ``True`` tells the code to fade the + backlight up and down between image display transitions. ``False`` maintains max + brightness on the backlight between image transitions.""" + + self.dwell = self._BASE_DWELL + dwell + """The number of seconds each image displays, in seconds.""" + + self.direction = direction + """Specify the playback direction. Default is ``PlayBackDirection.FORWARD``. Can also be + ``PlayBackDirection.BACKWARD``.""" + + self.advance = self.__advance_with_fade + """Displays the next image. Returns True when a new image was displayed, False otherwise. + """ + + self.fade_frames = 8 + + # assign new advance method if fade is disabled + if not fade_effect: + self.advance = self.__advance_no_fade + + self._img_start = None + + self.brightness = 1.0 + + # blank screen for start + self._curr_img_handle = Image.new( + "RGBA", (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) + ) + + # if path is relative, this makes sure that + # it's relative to the users's code file + abs_path_parent_dir = os.path.abspath( + os.path.join(common.utils.abs_path_to_user_file, os.pardir) + ) + abs_path_folder = os.path.normpath(os.path.join(abs_path_parent_dir, folder)) + + self.folder = abs_path_folder + + # get files within specified directory + self.dirs = os.listdir(self.folder) + + self._order = order + self._curr_img = "" + self._current_image_index = None + + # load images into main queue + self.__load_images() + + display.show(self) + # show the first working image + self.advance() + + common.telemetry.telemetry_py.send_telemetry( + common.telemetry.TelemetryEvent.CLUE_API_SLIDESHOW + ) + + @property + def current_image_name(self): + """Returns the current image name.""" + return self._curr_img + + @property + def order(self): + """Specifies the order in which the images are displayed. Options are random (``RANDOM``) or + alphabetical (``ALPHABETICAL``). Default is ``RANDOM``.""" + return self._order + + @order.setter + def order(self, order): + if order not in [PlayBackOrder.ALPHABETICAL, PlayBackOrder.RANDOM]: + raise ValueError("Order must be either 'RANDOM' or 'ALPHABETICAL'") + + self._order = order + self.__load_images() + + @property + def brightness(self): + """Brightness of the backlight when an image is displaying. Clamps to 0 to 1.0""" + return self._brightness + + @brightness.setter + def brightness(self, brightness): + if brightness < 0: + brightness = 0 + elif brightness > 1.0: + brightness = 1.0 + self._brightness = brightness + + def update(self): + """Updates the slideshow to the next image.""" + now = time.monotonic() + if not self.auto_advance or now - self._img_start < self.dwell: + return True + + return self.advance() + + def __get_next_img(self): + + if self.direction == PlayBackDirection.FORWARD: + if self._current_image_index == None: + self._current_image_index = 0 + else: + self._current_image_index += 1 + + if self._current_image_index >= len(self.dir_imgs): + + if self.loop: + self._current_image_index = 0 + self.__load_images() + else: + self._current_image_index = len(self.dir_imgs) - 10 + return "" + + else: + if self._current_image_index == None: + self._current_image_index = len(self.dir_imgs) - 1 + else: + self._current_image_index -= 1 + + if self._current_image_index < 0: + if self.loop: + self._current_image_index = len(self.dir_imgs) - 1 + self.__load_images() + else: + self._current_image_index = 0 + return "" + + img = self.dir_imgs[self._current_image_index] + return img + + def __load_images(self): + self.dir_imgs = [] + for d in self.dirs: + try: + new_path = os.path.join(self.folder, d) + + # only add bmp imgs + if os.path.splitext(new_path)[-1] == CONSTANTS.BMP_IMG_ENDING: + self.dir_imgs.append(new_path) + except Image.UnidentifiedImageError as e: + continue + + if not len(self.dir_imgs): + raise RuntimeError(CONSTANTS.NO_VALID_IMGS_ERR) + + if self._order == PlayBackOrder.RANDOM: + shuffle(self.dir_imgs) + else: + self.dir_imgs.sort() + + def __advance_with_fade(self): + if board.DISPLAY.active_group != self: + return + + old_img = self._curr_img_handle + advance_sucessful = False + + while not advance_sucessful: + new_path = self.__get_next_img() + if new_path == "": + self._img_start = time.monotonic() + return False + + try: + new_img = Image.open(new_path) + + new_img = new_img.convert("RGBA") + new_img.putalpha(255) + + new_img = new_img.crop( + (0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) + ) + + if new_img.size[0] < 240 or new_img.size[1] < 240: + black_overlay = Image.new( + "RGBA", + CONSTANTS.SCREEN_HEIGHT_WIDTH, + CONSTANTS.SCREEN_HEIGHT_WIDTH, + ) + black_overlay.paste(new_img) + new_img = black_overlay + + black_overlay = Image.new("RGBA", new_img.size) + advance_sucessful = True + except Image.UnidentifiedImageError as e: + pass + + # fade out old photo + for i in range(self.fade_frames, -1, -1): + sendable_img = Image.blend( + black_overlay, old_img, i * self.brightness / self.fade_frames + ) + self.__send(sendable_img) + + time.sleep(self._BASE_DWELL_DARK) + + # fade in new photo + for i in range(self.fade_frames + 1): + sendable_img = Image.blend( + black_overlay, new_img, i * self.brightness / self.fade_frames + ) + self.__send(sendable_img) + + self._curr_img_handle = new_img + self._curr_img = new_path + self._img_start = time.monotonic() + return True + + def __advance_no_fade(self): + if board.DISPLAY.active_group != self: + return + + old_img = self._curr_img_handle + + advance_sucessful = False + + while not advance_sucessful: + new_path = self.__get_next_img() + if new_path == "": + self._img_start = time.monotonic() + return False + + try: + new_img = Image.open(new_path) + + new_img = new_img.crop( + (0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) + ) + + if ( + new_img.size[0] < CONSTANTS.SCREEN_HEIGHT_WIDTH + or new_img.size[1] < CONSTANTS.SCREEN_HEIGHT_WIDTH + ): + black_overlay = Image.new( + "RGBA", + CONSTANTS.SCREEN_HEIGHT_WIDTH, + CONSTANTS.SCREEN_HEIGHT_WIDTH, + ) + black_overlay.paste(new_img) + new_img = black_overlay + + self._curr_img = new_path + + new_img = new_img.convert("RGBA") + new_img.putalpha(255) + advance_sucessful = True + except Image.UnidentifiedImageError as e: + pass + + if self.brightness < 1.0: + black_overlay = Image.new("RGBA", new_img.size) + new_img = Image.blend(black_overlay, new_img, self.brightness) + + # gradually scroll new img over old img + for i in range(self._NO_FADE_TRANSITION_INCREMENTS + 1): + curr_y = ( + i * CONSTANTS.SCREEN_HEIGHT_WIDTH / self._NO_FADE_TRANSITION_INCREMENTS + ) + img_piece = new_img.crop((0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, curr_y)) + old_img.paste(img_piece) + self.__send(old_img) + + self._curr_img_handle = new_img + self._curr_img = new_path + self._img_start = time.monotonic() + return True + + def __send(self, img): + # sends current bmp_img to the frontend + buffered = BytesIO() + img.save(buffered, format=CONSTANTS.BMP_IMG) + byte_base64 = base64.b64encode(buffered.getvalue()) + + # only send the base_64 string contents + img_str = str(byte_base64)[2:-1] + + sendable_json = {CONSTANTS.BASE_64: img_str} + + if common.utils.debug_mode: + common.debugger_communication_client.debug_send_to_simulator( + sendable_json, CONSTANTS.CLUE + ) + else: + common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) diff --git a/src/clue/test/__init__.py b/Source/clue/test/__init__.py similarity index 100% rename from src/clue/test/__init__.py rename to Source/clue/test/__init__.py diff --git a/src/clue/test/img/test_clue_text_1.bmp b/Source/clue/test/img/test_clue_text_1.bmp similarity index 100% rename from src/clue/test/img/test_clue_text_1.bmp rename to Source/clue/test/img/test_clue_text_1.bmp diff --git a/src/clue/test/img/test_display_text_1.bmp b/Source/clue/test/img/test_display_text_1.bmp similarity index 100% rename from src/clue/test/img/test_display_text_1.bmp rename to Source/clue/test/img/test_display_text_1.bmp diff --git a/src/clue/test/img/test_display_text_2.bmp b/Source/clue/test/img/test_display_text_2.bmp similarity index 100% rename from src/clue/test/img/test_display_text_2.bmp rename to Source/clue/test/img/test_display_text_2.bmp diff --git a/src/clue/test/img/test_display_text_3.bmp b/Source/clue/test/img/test_display_text_3.bmp similarity index 100% rename from src/clue/test/img/test_display_text_3.bmp rename to Source/clue/test/img/test_display_text_3.bmp diff --git a/src/clue/test/img/test_display_text_4.bmp b/Source/clue/test/img/test_display_text_4.bmp similarity index 100% rename from src/clue/test/img/test_display_text_4.bmp rename to Source/clue/test/img/test_display_text_4.bmp diff --git a/src/clue/test/img/test_image_shapes_1.bmp b/Source/clue/test/img/test_image_shapes_1.bmp similarity index 100% rename from src/clue/test/img/test_image_shapes_1.bmp rename to Source/clue/test/img/test_image_shapes_1.bmp diff --git a/src/clue/test/img/test_image_shapes_2.bmp b/Source/clue/test/img/test_image_shapes_2.bmp similarity index 100% rename from src/clue/test/img/test_image_shapes_2.bmp rename to Source/clue/test/img/test_image_shapes_2.bmp diff --git a/src/clue/test/img/test_image_shapes_3.bmp b/Source/clue/test/img/test_image_shapes_3.bmp similarity index 100% rename from src/clue/test/img/test_image_shapes_3.bmp rename to Source/clue/test/img/test_image_shapes_3.bmp diff --git a/src/clue/test/img/test_image_shapes_4.bmp b/Source/clue/test/img/test_image_shapes_4.bmp similarity index 100% rename from src/clue/test/img/test_image_shapes_4.bmp rename to Source/clue/test/img/test_image_shapes_4.bmp diff --git a/src/clue/test/img/test_image_shapes_5.bmp b/Source/clue/test/img/test_image_shapes_5.bmp similarity index 100% rename from src/clue/test/img/test_image_shapes_5.bmp rename to Source/clue/test/img/test_image_shapes_5.bmp diff --git a/src/clue/test/img/test_image_text_1.bmp b/Source/clue/test/img/test_image_text_1.bmp similarity index 100% rename from src/clue/test/img/test_image_text_1.bmp rename to Source/clue/test/img/test_image_text_1.bmp diff --git a/src/clue/test/img/test_image_text_2.bmp b/Source/clue/test/img/test_image_text_2.bmp similarity index 100% rename from src/clue/test/img/test_image_text_2.bmp rename to Source/clue/test/img/test_image_text_2.bmp diff --git a/src/clue/test/img/test_image_text_3.bmp b/Source/clue/test/img/test_image_text_3.bmp similarity index 100% rename from src/clue/test/img/test_image_text_3.bmp rename to Source/clue/test/img/test_image_text_3.bmp diff --git a/src/clue/test/img/test_image_text_4.bmp b/Source/clue/test/img/test_image_text_4.bmp similarity index 100% rename from src/clue/test/img/test_image_text_4.bmp rename to Source/clue/test/img/test_image_text_4.bmp diff --git a/src/clue/test/slideshow_pics/pic_1.bmp b/Source/clue/test/slideshow_pics/pic_1.bmp similarity index 100% rename from src/clue/test/slideshow_pics/pic_1.bmp rename to Source/clue/test/slideshow_pics/pic_1.bmp diff --git a/src/clue/test/slideshow_pics/pic_2.bmp b/Source/clue/test/slideshow_pics/pic_2.bmp similarity index 100% rename from src/clue/test/slideshow_pics/pic_2.bmp rename to Source/clue/test/slideshow_pics/pic_2.bmp diff --git a/src/clue/test/slideshow_pics/pic_3.bmp b/Source/clue/test/slideshow_pics/pic_3.bmp similarity index 100% rename from src/clue/test/slideshow_pics/pic_3.bmp rename to Source/clue/test/slideshow_pics/pic_3.bmp diff --git a/src/clue/test/slideshow_pics/pic_4.bmp b/Source/clue/test/slideshow_pics/pic_4.bmp similarity index 100% rename from src/clue/test/slideshow_pics/pic_4.bmp rename to Source/clue/test/slideshow_pics/pic_4.bmp diff --git a/src/clue/test/slideshow_pics/pic_5.bmp b/Source/clue/test/slideshow_pics/pic_5.bmp similarity index 100% rename from src/clue/test/slideshow_pics/pic_5.bmp rename to Source/clue/test/slideshow_pics/pic_5.bmp diff --git a/src/clue/test/slideshow_pics/pic_6.bmp b/Source/clue/test/slideshow_pics/pic_6.bmp similarity index 100% rename from src/clue/test/slideshow_pics/pic_6.bmp rename to Source/clue/test/slideshow_pics/pic_6.bmp diff --git a/src/clue/test/slideshow_pics/pic_7.bmp b/Source/clue/test/slideshow_pics/pic_7.bmp similarity index 100% rename from src/clue/test/slideshow_pics/pic_7.bmp rename to Source/clue/test/slideshow_pics/pic_7.bmp diff --git a/src/clue/test/slideshow_pics/pic_8.bmp b/Source/clue/test/slideshow_pics/pic_8.bmp similarity index 100% rename from src/clue/test/slideshow_pics/pic_8.bmp rename to Source/clue/test/slideshow_pics/pic_8.bmp diff --git a/src/clue/test/test_adafruit_clue.py b/Source/clue/test/test_adafruit_clue.py similarity index 97% rename from src/clue/test/test_adafruit_clue.py rename to Source/clue/test/test_adafruit_clue.py index 0d7204205..d9a88d731 100644 --- a/src/clue/test/test_adafruit_clue.py +++ b/Source/clue/test/test_adafruit_clue.py @@ -1,193 +1,193 @@ -import pytest - -import os -import pathlib -from PIL import Image - -from unittest import mock -from unittest.mock import MagicMock, patch - -from common import utils - -import displayio -import terminalio - -from ..adafruit_clue import clue -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS - - -class TestAdafruitClue(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - - self.main_img = Image.new( - "RGBA", - (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), - (0, 0, 0, 0), - ) - - utils.send_to_simulator = mock.Mock() - - def test_clue_display_text(self): - img = Image.open( - os.path.join(self.abs_path, CONSTANTS.IMG_DIR_NAME, f"test_clue_text_1.bmp") - ) - - img.putalpha(255) - expected = img.load() - clue_data = clue.simple_text_display(title="LET'S TEST!", title_scale=2) - - clue_data.text_group._Group__show = self.__send_helper - clue_data.text_group._Group__check_active_group_ref = False - - clue_data[0].text = "Lorem ipsum" - clue_data[1].text = "dolor sit amet, consectetur " - clue_data[2].text = "adipiscing:" - - clue_data[4].text = "e" - clue_data[5].text = "sed do eiusmod" - clue_data[6].text = "tempor incididunt\nut labore" - clue_data[7].text = "ut labore" - - clue_data[10].text = "et dolore" - clue_data[11].text = "magna" - clue_data[12].text = "aliqua\ntestest" - clue_data[13].text = "Ut enim ad" - clue_data[14].text = "Excepteur sint" - clue_data.show() - helper._Helper__test_image_equality(self.main_img.load(), expected) - - def __send_helper(self, image): - self.main_img = image - - def test_buttons(self): - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_A, True) - assert clue.button_a - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_A, False) - assert not clue.button_a - - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_B, True) - assert clue.button_b - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_B, False) - assert not clue.button_b - - assert clue.were_pressed == set(["A", "B"]) - assert clue.were_pressed == set() - - @pytest.mark.parametrize( - "mock_x, mock_y, mock_z", [(1, 2, 3), (0, 0, 0), (4, 6, 100)] - ) - def test_acceleration(self, mock_x, mock_y, mock_z): - clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_X] = mock_x - clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_Y] = mock_y - clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_Z] = mock_z - assert clue.acceleration == (mock_x, mock_y, mock_z) - - @pytest.mark.parametrize( - "mock_color_r, mock_color_g,mock_color_b,mock_color_c", - [(1, 2, 3, 4), (255, 255, 255, 255), (120, 140, 160, 180)], - ) - def test_color(self, mock_color_r, mock_color_g, mock_color_b, mock_color_c): - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_R] = mock_color_r - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_G] = mock_color_g - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_B] = mock_color_b - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_C] = mock_color_c - assert clue.color == (mock_color_r, mock_color_g, mock_color_b, mock_color_c) - - @pytest.mark.parametrize("mock_temperature", [-10, 0, 10]) - def test_temperature(self, mock_temperature): - clue._Clue__state[CONSTANTS.CLUE_STATE.TEMPERATURE] = mock_temperature - assert clue.temperature == mock_temperature - - @pytest.mark.parametrize( - "mock_magnetic_x, mock_magnetic_y, mock_magnetic_z", - [(1, 2, 3), (100, 150, 200), (10, 5, 15)], - ) - def test_magnetic(self, mock_magnetic_x, mock_magnetic_y, mock_magnetic_z): - clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_X] = mock_magnetic_x - clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_Y] = mock_magnetic_y - clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_Z] = mock_magnetic_z - assert clue.magnetic == (mock_magnetic_x, mock_magnetic_y, mock_magnetic_z,) - - @pytest.mark.parametrize("mock_distance", (0, 10, 250, 255)) - def test_proximity(self, mock_distance): - clue._Clue__state[CONSTANTS.CLUE_STATE.PROXIMITY] = mock_distance - assert clue.proximity == mock_distance - - @pytest.mark.parametrize( - "mock_gyro_x, mock_gyro_y, mock_gyro_z", - [(1, 2, 3), (100, 150, 200), (10, 5, 15)], - ) - def test_gyro(self, mock_gyro_x, mock_gyro_y, mock_gyro_z): - clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_X] = mock_gyro_x - clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_Y] = mock_gyro_y - clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_Z] = mock_gyro_z - assert clue.gyro == (mock_gyro_x, mock_gyro_y, mock_gyro_z) - - @pytest.mark.parametrize( - "gesture_word, gesture_number", - [("", 0), ("up", 1), ("down", 2), ("left", 3), ("right", 4)], - ) - def test_gesture(self, gesture_word, gesture_number): - clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = gesture_word - assert clue.gesture == gesture_number - - def test_shake(self): - NONE = "none" - SHAKE = "shake" - clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = SHAKE - assert clue.shake() - clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = NONE - assert not clue.shake() - - @pytest.mark.parametrize("mock_humidity", [0, 10, 50, 100]) - def test_humidity(self, mock_humidity): - clue._Clue__state[CONSTANTS.CLUE_STATE.HUMIDITY] = mock_humidity - assert clue.humidity == mock_humidity - - @pytest.mark.parametrize("mock_pressure", [0, 10, 50, 100]) - def test_pressure(self, mock_pressure): - clue._Clue__state[CONSTANTS.CLUE_STATE.PRESSURE] = mock_pressure - assert clue.pressure == mock_pressure - - @pytest.mark.parametrize( - "mock_pressure, mock_sea_level_pressure, expected_altitude", - [ - (1000, 1015, 125.42255615546036), - (1030, 1015, -123.93061640175468), - (1020, 1013, -58.13176263932101), - ], - ) - def test_altitude(self, mock_pressure, mock_sea_level_pressure, expected_altitude): - clue.sea_level_pressure = mock_sea_level_pressure - clue._Clue__state[CONSTANTS.CLUE_STATE.PRESSURE] = mock_pressure - assert expected_altitude == pytest.approx(clue.altitude) - - @pytest.mark.parametrize("mock_sea_level_pressure", [1040, 1015, 1013]) - def test_sea_level_pressure(self, mock_sea_level_pressure): - clue.sea_level_pressure = mock_sea_level_pressure - assert mock_sea_level_pressure == clue.sea_level_pressure - - @pytest.mark.parametrize( - "mock_color", [(255, 0, 0), (255, 255, 255), (123, 123, 123)] - ) - def test_pixel(self, mock_color): - clue.pixel.fill(mock_color) - assert clue.pixel[0] == mock_color - - @pytest.mark.parametrize( - "value, expected", - [(True, True), (False, False), (1, True), ("a", True), (0, False), ("", False)], - ) - def test_red_led(self, value, expected): - clue.red_led = value - assert clue.red_led == expected - - @pytest.mark.parametrize( - "value, expected", - [(True, True), (False, False), (1, True), ("a", True), (0, False), ("", False)], - ) - def test_white_leds(self, value, expected): - clue.white_leds = value - assert clue.white_leds == expected +import pytest + +import os +import pathlib +from PIL import Image + +from unittest import mock +from unittest.mock import MagicMock, patch + +from common import utils + +import displayio +import terminalio + +from ..adafruit_clue import clue +from .test_helpers import helper +from base_circuitpython import base_cp_constants as CONSTANTS + + +class TestAdafruitClue(object): + def setup_method(self): + self.abs_path = pathlib.Path(__file__).parent.absolute() + + self.main_img = Image.new( + "RGBA", + (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), + (0, 0, 0, 0), + ) + + utils.send_to_simulator = mock.Mock() + + def test_clue_display_text(self): + img = Image.open( + os.path.join(self.abs_path, CONSTANTS.IMG_DIR_NAME, f"test_clue_text_1.bmp") + ) + + img.putalpha(255) + expected = img.load() + clue_data = clue.simple_text_display(title="LET'S TEST!", title_scale=2) + + clue_data.text_group._Group__show = self.__send_helper + clue_data.text_group._Group__check_active_group_ref = False + + clue_data[0].text = "Lorem ipsum" + clue_data[1].text = "dolor sit amet, consectetur " + clue_data[2].text = "adipiscing:" + + clue_data[4].text = "e" + clue_data[5].text = "sed do eiusmod" + clue_data[6].text = "tempor incididunt\nut labore" + clue_data[7].text = "ut labore" + + clue_data[10].text = "et dolore" + clue_data[11].text = "magna" + clue_data[12].text = "aliqua\ntestest" + clue_data[13].text = "Ut enim ad" + clue_data[14].text = "Excepteur sint" + clue_data.show() + helper._Helper__test_image_equality(self.main_img.load(), expected) + + def __send_helper(self, image): + self.main_img = image + + def test_buttons(self): + clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_A, True) + assert clue.button_a + clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_A, False) + assert not clue.button_a + + clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_B, True) + assert clue.button_b + clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_B, False) + assert not clue.button_b + + assert clue.were_pressed == set(["A", "B"]) + assert clue.were_pressed == set() + + @pytest.mark.parametrize( + "mock_x, mock_y, mock_z", [(1, 2, 3), (0, 0, 0), (4, 6, 100)] + ) + def test_acceleration(self, mock_x, mock_y, mock_z): + clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_X] = mock_x + clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_Y] = mock_y + clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_Z] = mock_z + assert clue.acceleration == (mock_x, mock_y, mock_z) + + @pytest.mark.parametrize( + "mock_color_r, mock_color_g,mock_color_b,mock_color_c", + [(1, 2, 3, 4), (255, 255, 255, 255), (120, 140, 160, 180)], + ) + def test_color(self, mock_color_r, mock_color_g, mock_color_b, mock_color_c): + clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_R] = mock_color_r + clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_G] = mock_color_g + clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_B] = mock_color_b + clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_C] = mock_color_c + assert clue.color == (mock_color_r, mock_color_g, mock_color_b, mock_color_c) + + @pytest.mark.parametrize("mock_temperature", [-10, 0, 10]) + def test_temperature(self, mock_temperature): + clue._Clue__state[CONSTANTS.CLUE_STATE.TEMPERATURE] = mock_temperature + assert clue.temperature == mock_temperature + + @pytest.mark.parametrize( + "mock_magnetic_x, mock_magnetic_y, mock_magnetic_z", + [(1, 2, 3), (100, 150, 200), (10, 5, 15)], + ) + def test_magnetic(self, mock_magnetic_x, mock_magnetic_y, mock_magnetic_z): + clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_X] = mock_magnetic_x + clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_Y] = mock_magnetic_y + clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_Z] = mock_magnetic_z + assert clue.magnetic == (mock_magnetic_x, mock_magnetic_y, mock_magnetic_z,) + + @pytest.mark.parametrize("mock_distance", (0, 10, 250, 255)) + def test_proximity(self, mock_distance): + clue._Clue__state[CONSTANTS.CLUE_STATE.PROXIMITY] = mock_distance + assert clue.proximity == mock_distance + + @pytest.mark.parametrize( + "mock_gyro_x, mock_gyro_y, mock_gyro_z", + [(1, 2, 3), (100, 150, 200), (10, 5, 15)], + ) + def test_gyro(self, mock_gyro_x, mock_gyro_y, mock_gyro_z): + clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_X] = mock_gyro_x + clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_Y] = mock_gyro_y + clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_Z] = mock_gyro_z + assert clue.gyro == (mock_gyro_x, mock_gyro_y, mock_gyro_z) + + @pytest.mark.parametrize( + "gesture_word, gesture_number", + [("", 0), ("up", 1), ("down", 2), ("left", 3), ("right", 4)], + ) + def test_gesture(self, gesture_word, gesture_number): + clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = gesture_word + assert clue.gesture == gesture_number + + def test_shake(self): + NONE = "none" + SHAKE = "shake" + clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = SHAKE + assert clue.shake() + clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = NONE + assert not clue.shake() + + @pytest.mark.parametrize("mock_humidity", [0, 10, 50, 100]) + def test_humidity(self, mock_humidity): + clue._Clue__state[CONSTANTS.CLUE_STATE.HUMIDITY] = mock_humidity + assert clue.humidity == mock_humidity + + @pytest.mark.parametrize("mock_pressure", [0, 10, 50, 100]) + def test_pressure(self, mock_pressure): + clue._Clue__state[CONSTANTS.CLUE_STATE.PRESSURE] = mock_pressure + assert clue.pressure == mock_pressure + + @pytest.mark.parametrize( + "mock_pressure, mock_sea_level_pressure, expected_altitude", + [ + (1000, 1015, 125.42255615546036), + (1030, 1015, -123.93061640175468), + (1020, 1013, -58.13176263932101), + ], + ) + def test_altitude(self, mock_pressure, mock_sea_level_pressure, expected_altitude): + clue.sea_level_pressure = mock_sea_level_pressure + clue._Clue__state[CONSTANTS.CLUE_STATE.PRESSURE] = mock_pressure + assert expected_altitude == pytest.approx(clue.altitude) + + @pytest.mark.parametrize("mock_sea_level_pressure", [1040, 1015, 1013]) + def test_sea_level_pressure(self, mock_sea_level_pressure): + clue.sea_level_pressure = mock_sea_level_pressure + assert mock_sea_level_pressure == clue.sea_level_pressure + + @pytest.mark.parametrize( + "mock_color", [(255, 0, 0), (255, 255, 255), (123, 123, 123)] + ) + def test_pixel(self, mock_color): + clue.pixel.fill(mock_color) + assert clue.pixel[0] == mock_color + + @pytest.mark.parametrize( + "value, expected", + [(True, True), (False, False), (1, True), ("a", True), (0, False), ("", False)], + ) + def test_red_led(self, value, expected): + clue.red_led = value + assert clue.red_led == expected + + @pytest.mark.parametrize( + "value, expected", + [(True, True), (False, False), (1, True), ("a", True), (0, False), ("", False)], + ) + def test_white_leds(self, value, expected): + clue.white_leds = value + assert clue.white_leds == expected diff --git a/src/clue/test/test_adafruit_display_shapes.py b/Source/clue/test/test_adafruit_display_shapes.py similarity index 96% rename from src/clue/test/test_adafruit_display_shapes.py rename to Source/clue/test/test_adafruit_display_shapes.py index 8c1c3c303..7be1c982f 100644 --- a/src/clue/test/test_adafruit_display_shapes.py +++ b/Source/clue/test/test_adafruit_display_shapes.py @@ -1,81 +1,81 @@ -import pytest -import pathlib -import os - -import displayio - -from PIL import Image -from unittest import mock - -from common import utils - - -from adafruit_display_shapes.rect import Rect -from adafruit_display_shapes.circle import Circle -from adafruit_display_shapes.roundrect import RoundRect - -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS -import board - - -class TestAdafruitDisplayShapes(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - - utils.send_to_simulator = mock.Mock() - self.main_img = Image.new( - "RGBA", - (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), - (0, 0, 0, 0), - ) - - def test_shapes(self): - - expected_images = [] - for i in range(5): - img = Image.open( - os.path.join( - self.abs_path, - CONSTANTS.IMG_DIR_NAME, - f"test_image_shapes_{i+1}.bmp", - ) - ) - - img.putalpha(255) - expected_images.append(img.load()) - - # TAKEN FROM ADAFRUIT'S DISPLAY SHAPES LIBRARY - # https://github.com/ladyada/Adafruit_CircuitPython_Display_Shapes/blob/master/examples/display_shapes_simpletest.py - splash = displayio.Group(max_size=10) - splash._Group__show = self.__send_helper - board.DISPLAY.show(splash) - color_bitmap = displayio.Bitmap(320, 240, 1) - color_palette = displayio.Palette(1) - color_palette[0] = 0xFFFFFF - bg_sprite = displayio.TileGrid( - color_bitmap, x=0, y=0, pixel_shader=color_palette - ) - splash.append(bg_sprite) - helper._Helper__test_image_equality(self.main_img.load(), expected_images[0]) - - rect = Rect(80, 20, 41, 41, fill=0x00FF00) - splash.append(rect) - helper._Helper__test_image_equality(self.main_img.load(), expected_images[1]) - circle = Circle(100, 100, 20, fill=0x00FF00, outline=0xFF00FF) - splash.append(circle) - - helper._Helper__test_image_equality(self.main_img.load(), expected_images[2]) - - rect2 = Rect(50, 100, 61, 81, outline=0x0, stroke=3) - splash.append(rect2) - - helper._Helper__test_image_equality(self.main_img.load(), expected_images[3]) - - roundrect = RoundRect(10, 10, 61, 81, 10, fill=0x0, outline=0xFF00FF, stroke=6) - splash.append(roundrect) - - helper._Helper__test_image_equality(self.main_img.load(), expected_images[4]) - - def __send_helper(self, image): - self.main_img = image +import pytest +import pathlib +import os + +import displayio + +from PIL import Image +from unittest import mock + +from common import utils + + +from adafruit_display_shapes.rect import Rect +from adafruit_display_shapes.circle import Circle +from adafruit_display_shapes.roundrect import RoundRect + +from .test_helpers import helper +from base_circuitpython import base_cp_constants as CONSTANTS +import board + + +class TestAdafruitDisplayShapes(object): + def setup_method(self): + self.abs_path = pathlib.Path(__file__).parent.absolute() + + utils.send_to_simulator = mock.Mock() + self.main_img = Image.new( + "RGBA", + (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), + (0, 0, 0, 0), + ) + + def test_shapes(self): + + expected_images = [] + for i in range(5): + img = Image.open( + os.path.join( + self.abs_path, + CONSTANTS.IMG_DIR_NAME, + f"test_image_shapes_{i+1}.bmp", + ) + ) + + img.putalpha(255) + expected_images.append(img.load()) + + # TAKEN FROM ADAFRUIT'S DISPLAY SHAPES LIBRARY + # https://github.com/ladyada/Adafruit_CircuitPython_Display_Shapes/blob/master/examples/display_shapes_simpletest.py + splash = displayio.Group(max_size=10) + splash._Group__show = self.__send_helper + board.DISPLAY.show(splash) + color_bitmap = displayio.Bitmap(320, 240, 1) + color_palette = displayio.Palette(1) + color_palette[0] = 0xFFFFFF + bg_sprite = displayio.TileGrid( + color_bitmap, x=0, y=0, pixel_shader=color_palette + ) + splash.append(bg_sprite) + helper._Helper__test_image_equality(self.main_img.load(), expected_images[0]) + + rect = Rect(80, 20, 41, 41, fill=0x00FF00) + splash.append(rect) + helper._Helper__test_image_equality(self.main_img.load(), expected_images[1]) + circle = Circle(100, 100, 20, fill=0x00FF00, outline=0xFF00FF) + splash.append(circle) + + helper._Helper__test_image_equality(self.main_img.load(), expected_images[2]) + + rect2 = Rect(50, 100, 61, 81, outline=0x0, stroke=3) + splash.append(rect2) + + helper._Helper__test_image_equality(self.main_img.load(), expected_images[3]) + + roundrect = RoundRect(10, 10, 61, 81, 10, fill=0x0, outline=0xFF00FF, stroke=6) + splash.append(roundrect) + + helper._Helper__test_image_equality(self.main_img.load(), expected_images[4]) + + def __send_helper(self, image): + self.main_img = image diff --git a/src/clue/test/test_adafruit_display_text.py b/Source/clue/test/test_adafruit_display_text.py similarity index 96% rename from src/clue/test/test_adafruit_display_text.py rename to Source/clue/test/test_adafruit_display_text.py index 922230275..f73ae3cd0 100644 --- a/src/clue/test/test_adafruit_display_text.py +++ b/Source/clue/test/test_adafruit_display_text.py @@ -1,65 +1,65 @@ -import pytest - -import os -import sys -import pathlib -from PIL import Image -from unittest import mock - -from common import utils - -import displayio -import terminalio - -from adafruit_display_text import label - -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS - -# to keep track of test # to find right expected bmp -test_count = 0 - - -class TestAdafruitDisplayText(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - # Create a new black (default) image - utils.send_to_simulator = mock.Mock() - - @pytest.mark.parametrize( - "text, x,y, scale, color", - [ - ("Hello World", 1, 10, 4, (0, 22, 103)), - ("WWWWwwwmMMmmm", 30, 6, 1, (190, 173, 222)), - ("wOooo00ooo", 104, 49, 9, 0xEFEFEF), - ("!!!\n yay!", 100, 100, 5, (200, 200, 255)), - ], - ) - def test_display_text(self, text, x, y, scale, color): - global test_count - - expected_image = Image.open( - os.path.join( - self.abs_path, - CONSTANTS.IMG_DIR_NAME, - f"test_display_text_{test_count+1}.bmp", - ) - ) - expected_image.convert("RGBA") - expected_image.putalpha(255) - loaded_img = expected_image.load() - - text_area = label.Label( - terminalio.FONT, - text=text, - scale=scale, - color=color, - check_active_group_ref=False, - ) - text_area.x = x - text_area.y = y - - main_img = text_area._Group__draw() - - helper._Helper__test_image_equality(main_img.load(), loaded_img) - test_count += 1 +import pytest + +import os +import sys +import pathlib +from PIL import Image +from unittest import mock + +from common import utils + +import displayio +import terminalio + +from adafruit_display_text import label + +from .test_helpers import helper +from base_circuitpython import base_cp_constants as CONSTANTS + +# to keep track of test # to find right expected bmp +test_count = 0 + + +class TestAdafruitDisplayText(object): + def setup_method(self): + self.abs_path = pathlib.Path(__file__).parent.absolute() + # Create a new black (default) image + utils.send_to_simulator = mock.Mock() + + @pytest.mark.parametrize( + "text, x,y, scale, color", + [ + ("Hello World", 1, 10, 4, (0, 22, 103)), + ("WWWWwwwmMMmmm", 30, 6, 1, (190, 173, 222)), + ("wOooo00ooo", 104, 49, 9, 0xEFEFEF), + ("!!!\n yay!", 100, 100, 5, (200, 200, 255)), + ], + ) + def test_display_text(self, text, x, y, scale, color): + global test_count + + expected_image = Image.open( + os.path.join( + self.abs_path, + CONSTANTS.IMG_DIR_NAME, + f"test_display_text_{test_count+1}.bmp", + ) + ) + expected_image.convert("RGBA") + expected_image.putalpha(255) + loaded_img = expected_image.load() + + text_area = label.Label( + terminalio.FONT, + text=text, + scale=scale, + color=color, + check_active_group_ref=False, + ) + text_area.x = x + text_area.y = y + + main_img = text_area._Group__draw() + + helper._Helper__test_image_equality(main_img.load(), loaded_img) + test_count += 1 diff --git a/src/clue/test/test_adafruit_slideshow.py b/Source/clue/test/test_adafruit_slideshow.py similarity index 96% rename from src/clue/test/test_adafruit_slideshow.py rename to Source/clue/test/test_adafruit_slideshow.py index 1f966b15a..b82c953d0 100644 --- a/src/clue/test/test_adafruit_slideshow.py +++ b/Source/clue/test/test_adafruit_slideshow.py @@ -1,100 +1,100 @@ -from ..adafruit_slideshow import SlideShow, PlayBackDirection, PlayBackOrder -import board -import pathlib -import os - -from PIL import Image -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS - -from unittest import mock - -from common import utils - - -class TestAdafruitSlideShow(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - - # Create a new black (default) image - self.main_img = Image.new( - "RGBA", - (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), - (0, 0, 0, 0), - ) - - utils.send_to_simulator = mock.Mock() - - def test_slideshow(self): - - pic_dir = os.path.join(self.abs_path, "slideshow_pics") - slideshow_images = [] - for i in range(8): - img = Image.open(os.path.join(pic_dir, f"pic_{i+1}.bmp")) - img = img.convert("RGBA") - img.putalpha(255) - - img = img.crop( - (0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - - if img.size[0] < 240 or img.size[1] < 240: - black_overlay = Image.new( - "RGBA", - CONSTANTS.SCREEN_HEIGHT_WIDTH, - CONSTANTS.SCREEN_HEIGHT_WIDTH, - ) - black_overlay.paste(img) - img = black_overlay - - slideshow_images.append(img) - - # Create the slideshow object that plays through once alphabetically. - slideshow = SlideShow( - board.DISPLAY, - dwell=3, - folder=pic_dir, - loop=True, - fade_effect=True, - auto_advance=True, - order=PlayBackOrder.ALPHABETICAL, - direction=PlayBackDirection.FORWARD, - ) - - slideshow._SlideShow__send = self.__send_helper - - # first image's appear time is unstable,since it fades/scrolls in - # can only predict following ones... - - for i in range(1, 8): - slideshow.advance() - helper._Helper__test_image_equality( - self.main_img.load(), slideshow_images[i].load() - ) - - # Create the slideshow object that plays through once backwards. - slideshow2 = SlideShow( - board.DISPLAY, - dwell=3, - folder=pic_dir, - loop=True, - fade_effect=False, - auto_advance=True, - order=PlayBackOrder.ALPHABETICAL, - direction=PlayBackDirection.BACKWARD, - ) - - slideshow2._SlideShow__send = self.__send_helper - - helper._Helper__test_image_equality( - self.main_img.load(), slideshow_images[7].load() - ) - - for i in range(6, -1, -1): - slideshow2.advance() - helper._Helper__test_image_equality( - self.main_img.load(), slideshow_images[i].load() - ) - - def __send_helper(self, image): - self.main_img = image +from ..adafruit_slideshow import SlideShow, PlayBackDirection, PlayBackOrder +import board +import pathlib +import os + +from PIL import Image +from .test_helpers import helper +from base_circuitpython import base_cp_constants as CONSTANTS + +from unittest import mock + +from common import utils + + +class TestAdafruitSlideShow(object): + def setup_method(self): + self.abs_path = pathlib.Path(__file__).parent.absolute() + + # Create a new black (default) image + self.main_img = Image.new( + "RGBA", + (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), + (0, 0, 0, 0), + ) + + utils.send_to_simulator = mock.Mock() + + def test_slideshow(self): + + pic_dir = os.path.join(self.abs_path, "slideshow_pics") + slideshow_images = [] + for i in range(8): + img = Image.open(os.path.join(pic_dir, f"pic_{i+1}.bmp")) + img = img.convert("RGBA") + img.putalpha(255) + + img = img.crop( + (0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) + ) + + if img.size[0] < 240 or img.size[1] < 240: + black_overlay = Image.new( + "RGBA", + CONSTANTS.SCREEN_HEIGHT_WIDTH, + CONSTANTS.SCREEN_HEIGHT_WIDTH, + ) + black_overlay.paste(img) + img = black_overlay + + slideshow_images.append(img) + + # Create the slideshow object that plays through once alphabetically. + slideshow = SlideShow( + board.DISPLAY, + dwell=3, + folder=pic_dir, + loop=True, + fade_effect=True, + auto_advance=True, + order=PlayBackOrder.ALPHABETICAL, + direction=PlayBackDirection.FORWARD, + ) + + slideshow._SlideShow__send = self.__send_helper + + # first image's appear time is unstable,since it fades/scrolls in + # can only predict following ones... + + for i in range(1, 8): + slideshow.advance() + helper._Helper__test_image_equality( + self.main_img.load(), slideshow_images[i].load() + ) + + # Create the slideshow object that plays through once backwards. + slideshow2 = SlideShow( + board.DISPLAY, + dwell=3, + folder=pic_dir, + loop=True, + fade_effect=False, + auto_advance=True, + order=PlayBackOrder.ALPHABETICAL, + direction=PlayBackDirection.BACKWARD, + ) + + slideshow2._SlideShow__send = self.__send_helper + + helper._Helper__test_image_equality( + self.main_img.load(), slideshow_images[7].load() + ) + + for i in range(6, -1, -1): + slideshow2.advance() + helper._Helper__test_image_equality( + self.main_img.load(), slideshow_images[i].load() + ) + + def __send_helper(self, image): + self.main_img = image diff --git a/src/clue/test/test_helpers.py b/Source/clue/test/test_helpers.py similarity index 96% rename from src/clue/test/test_helpers.py rename to Source/clue/test/test_helpers.py index 429965aaf..ef8c7caf2 100644 --- a/src/clue/test/test_helpers.py +++ b/Source/clue/test/test_helpers.py @@ -1,32 +1,32 @@ -from base_circuitpython import base_cp_constants as CONSTANTS - - -class Helper: - def __test_image_equality(self, image_1, image_2): - for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - pixel_1 = image_1[j, i] - pixel_2 = image_2[j, i] - - if not isinstance(pixel_1, tuple): - pixel_1 = self.hex2rgba(pixel_1) - - if not isinstance(pixel_2, tuple): - pixel_2 = self.hex2rgba(pixel_2) - assert pixel_1[0:3] == pixel_2[0:3] - - def hex2rgba(self, curr_colour): - - ret_list = [] - - for i in range(3, -1, -1): - val = (curr_colour >> (2 ** (i + 1))) & 255 - if val == 0: - ret_list.append(0) - else: - ret_list.append(val) - - return tuple(ret_list) - - -helper = Helper() +from base_circuitpython import base_cp_constants as CONSTANTS + + +class Helper: + def __test_image_equality(self, image_1, image_2): + for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): + for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): + pixel_1 = image_1[j, i] + pixel_2 = image_2[j, i] + + if not isinstance(pixel_1, tuple): + pixel_1 = self.hex2rgba(pixel_1) + + if not isinstance(pixel_2, tuple): + pixel_2 = self.hex2rgba(pixel_2) + assert pixel_1[0:3] == pixel_2[0:3] + + def hex2rgba(self, curr_colour): + + ret_list = [] + + for i in range(3, -1, -1): + val = (curr_colour >> (2 ** (i + 1))) & 255 + if val == 0: + ret_list.append(0) + else: + ret_list.append(val) + + return tuple(ret_list) + + +helper = Helper() diff --git a/src/common/__init__.py b/Source/common/__init__.py similarity index 100% rename from src/common/__init__.py rename to Source/common/__init__.py diff --git a/src/common/constants.py b/Source/common/constants.py similarity index 95% rename from src/common/constants.py rename to Source/common/constants.py index c0592c7db..8495f421d 100644 --- a/src/common/constants.py +++ b/Source/common/constants.py @@ -1,12 +1,12 @@ -MAC_OS = "darwin" - -ERROR_SENDING_EVENT = "Error trying to send event to the process : " - -ACTIVE_DEVICE_FIELD = "active_device" -STATE_FIELD = "state" - -CONNECTION_ATTEMPTS = 10 -TIME_DELAY = 0.03 -DEFAULT_PORT = "5577" - -MICROPYTHON_LIBRARY_NAME = "micropython" +MAC_OS = "darwin" + +ERROR_SENDING_EVENT = "Error trying to send event to the process : " + +ACTIVE_DEVICE_FIELD = "active_device" +STATE_FIELD = "state" + +CONNECTION_ATTEMPTS = 10 +TIME_DELAY = 0.03 +DEFAULT_PORT = "5577" + +MICROPYTHON_LIBRARY_NAME = "micropython" diff --git a/src/common/debugger_communication_client.py b/Source/common/debugger_communication_client.py similarity index 100% rename from src/common/debugger_communication_client.py rename to Source/common/debugger_communication_client.py diff --git a/src/common/telemetry.py b/Source/common/telemetry.py similarity index 100% rename from src/common/telemetry.py rename to Source/common/telemetry.py diff --git a/src/common/telemetry_events.py b/Source/common/telemetry_events.py similarity index 97% rename from src/common/telemetry_events.py rename to Source/common/telemetry_events.py index a140c823b..a0155529e 100644 --- a/src/common/telemetry_events.py +++ b/Source/common/telemetry_events.py @@ -1,65 +1,65 @@ -import enum - - -class TelemetryEvent(enum.Enum): - CPX_API_ACCELERATION = "CPX.API.ACCELERATION" - CPX_API_BUTTON_A = "CPX.API.BUTTON.A" - CPX_API_BUTTON_B = "CPX.API.BUTTON.B" - CPX_API_SWITCH = "CPX.API.SWITCH" - CPX_API_TEMPERATURE = "CPX.API.TEMPERATURE" - CPX_API_BRIGHTNESS = "CPX.API.BRIGHTNESS" - CPX_API_LIGHT = "CPX.API.LIGHT" - CPX_API_TOUCH = "CPX.API.TOUCH" - CPX_API_SHAKE = "CPX.API.SHAKE" - CPX_API_TAPPED = "CPX.API.TAPPED" - CPX_API_PLAY_FILE = "CPX.API.PLAY.FILE" - CPX_API_PLAY_TONE = "CPX.API.PLAY.TONE" - CPX_API_START_TONE = "CPX.API.START.TONE" - CPX_API_STOP_TONE = "CPX.API.STOP.TONE" - CPX_API_DETECT_TAPS = "CPX.API.DETECT.TAPS" - CPX_API_ADJUST_THRESHOLD = "CPX.API.ADJUST.THRESHOLD" - CPX_API_RED_LED = "CPX.API.RED.LED" - CPX_API_PIXELS = "CPX.API.PIXELS" - MICROBIT_API_TEMPERATURE = "MICROBIT.API.TEMPERATURE" - MICROBIT_API_ACCELEROMETER = "MICROBIT.API.ACCELEROMETER" - MICROBIT_API_GESTURE = "MICROBIT.API.GESTURE" - MICROBIT_API_DISPLAY_SCROLL = "MICROBIT.API.DISPLAY.SCROLL" - MICROBIT_API_DISPLAY_SHOW = "MICROBIT.API.DISPLAY.SHOW" - MICROBIT_API_DISPLAY_OTHER = "MICROBIT.API.DISPLAY_OTHER" - MICROBIT_API_LIGHT_LEVEL = "MICROBIT.API.LIGHT.LEVEL" - MICROBIT_API_IMAGE_CREATION = "MICROBIT.API.IMAGE.CREATION" - MICROBIT_API_IMAGE_OTHER = "MICROBIT.API.IMAGE.OTHER" - MICROBIT_API_IMAGE_STATIC = "MICROBIT.API.IMAGE.STATIC" - MICROBIT_API_BUTTON = "MICROBIT.API.BUTTON" - MICROBIT_API_COMPASS = "MICROBIT.API.COMPASS" - MICROBIT_API_I2C = "MICROBIT.API.I2C" - MICROBIT_API_SPI = "MICROBIT.API.SPI" - MICROBIT_API_AUDIO = "MICROBIT.API.AUDIO" - MICROBIT_API_MUSIC = "MICROBIT.API.MUSIC" - MICROBIT_API_NEOPIXEL = "MICROBIT.API.NEOPIXEL" - MICROBIT_API_RADIO = "MICROBIT.API.RADIO" - MICROBIT_API_SPEECH = "MICROBIT.API.SPEECH" - MICROBIT_API_UTIME = "MICROBIT.API.UTIME" - CLUE_API_ACCELERATION = "CLUE.API.ACCELERATION" - CLUE_API_BUTTON_A = "CLUE.API.BUTTON.A" - CLUE_API_BUTTON_B = "CLUE.API.BUTTON.B" - CLUE_API_WERE_PRESSED = "CLUE.API.WERE.PRESSED" - CLUE_API_SHAKE = "CLUE.API.SHAKE" - CLUE_API_COLOR = "CLUE.API.COLOR" - CLUE_API_TEMPERATURE = "CLUE.API.TEMPERATURE" - CLUE_API_MAGNETIC = "CLUE.API.MAGNETIC" - CLUE_API_PROXIMITY = "CLUE.API.PROXIMITY" - CLUE_API_GYRO = "CLUE.API.GYRO" - CLUE_API_GESTURE = "CLUE.API.GESTURE" - CLUE_API_HUMIDITY = "CLUE.API.HUMIDITY" - CLUE_API_PRESSURE = "CLUE.API.PRESSURE" - CLUE_API_ALTITUDE = "CLUE.API.ALTITUDE" - CLUE_API_SEA_LEVEL_PRESSURE = "CLUE.API.SEA.LEVEL.PRESSURE" - CLUE_API_PIXEL = "CLUE.API.PIXEL" - CLUE_API_TOUCH = "CLUE.API.TOUCH" - CLUE_API_WHITE_LEDS = "CLUE.API.WHITE.LEDS" - CLUE_API_RED_LED = "CLUE.API.RED.LED" - CLUE_API_SOUND = "CLUE.API.SOUND" - CLUE_API_TEXT_DISPLAY = "CLUE.API.TEXT.DISPLAY" - CLUE_API_SLIDESHOW = "CLUE.API.SLIDESHOW" - CLUE_API_TILE_GRID = "CLUE.API.TILE.GRID" +import enum + + +class TelemetryEvent(enum.Enum): + CPX_API_ACCELERATION = "CPX.API.ACCELERATION" + CPX_API_BUTTON_A = "CPX.API.BUTTON.A" + CPX_API_BUTTON_B = "CPX.API.BUTTON.B" + CPX_API_SWITCH = "CPX.API.SWITCH" + CPX_API_TEMPERATURE = "CPX.API.TEMPERATURE" + CPX_API_BRIGHTNESS = "CPX.API.BRIGHTNESS" + CPX_API_LIGHT = "CPX.API.LIGHT" + CPX_API_TOUCH = "CPX.API.TOUCH" + CPX_API_SHAKE = "CPX.API.SHAKE" + CPX_API_TAPPED = "CPX.API.TAPPED" + CPX_API_PLAY_FILE = "CPX.API.PLAY.FILE" + CPX_API_PLAY_TONE = "CPX.API.PLAY.TONE" + CPX_API_START_TONE = "CPX.API.START.TONE" + CPX_API_STOP_TONE = "CPX.API.STOP.TONE" + CPX_API_DETECT_TAPS = "CPX.API.DETECT.TAPS" + CPX_API_ADJUST_THRESHOLD = "CPX.API.ADJUST.THRESHOLD" + CPX_API_RED_LED = "CPX.API.RED.LED" + CPX_API_PIXELS = "CPX.API.PIXELS" + MICROBIT_API_TEMPERATURE = "MICROBIT.API.TEMPERATURE" + MICROBIT_API_ACCELEROMETER = "MICROBIT.API.ACCELEROMETER" + MICROBIT_API_GESTURE = "MICROBIT.API.GESTURE" + MICROBIT_API_DISPLAY_SCROLL = "MICROBIT.API.DISPLAY.SCROLL" + MICROBIT_API_DISPLAY_SHOW = "MICROBIT.API.DISPLAY.SHOW" + MICROBIT_API_DISPLAY_OTHER = "MICROBIT.API.DISPLAY_OTHER" + MICROBIT_API_LIGHT_LEVEL = "MICROBIT.API.LIGHT.LEVEL" + MICROBIT_API_IMAGE_CREATION = "MICROBIT.API.IMAGE.CREATION" + MICROBIT_API_IMAGE_OTHER = "MICROBIT.API.IMAGE.OTHER" + MICROBIT_API_IMAGE_STATIC = "MICROBIT.API.IMAGE.STATIC" + MICROBIT_API_BUTTON = "MICROBIT.API.BUTTON" + MICROBIT_API_COMPASS = "MICROBIT.API.COMPASS" + MICROBIT_API_I2C = "MICROBIT.API.I2C" + MICROBIT_API_SPI = "MICROBIT.API.SPI" + MICROBIT_API_AUDIO = "MICROBIT.API.AUDIO" + MICROBIT_API_MUSIC = "MICROBIT.API.MUSIC" + MICROBIT_API_NEOPIXEL = "MICROBIT.API.NEOPIXEL" + MICROBIT_API_RADIO = "MICROBIT.API.RADIO" + MICROBIT_API_SPEECH = "MICROBIT.API.SPEECH" + MICROBIT_API_UTIME = "MICROBIT.API.UTIME" + CLUE_API_ACCELERATION = "CLUE.API.ACCELERATION" + CLUE_API_BUTTON_A = "CLUE.API.BUTTON.A" + CLUE_API_BUTTON_B = "CLUE.API.BUTTON.B" + CLUE_API_WERE_PRESSED = "CLUE.API.WERE.PRESSED" + CLUE_API_SHAKE = "CLUE.API.SHAKE" + CLUE_API_COLOR = "CLUE.API.COLOR" + CLUE_API_TEMPERATURE = "CLUE.API.TEMPERATURE" + CLUE_API_MAGNETIC = "CLUE.API.MAGNETIC" + CLUE_API_PROXIMITY = "CLUE.API.PROXIMITY" + CLUE_API_GYRO = "CLUE.API.GYRO" + CLUE_API_GESTURE = "CLUE.API.GESTURE" + CLUE_API_HUMIDITY = "CLUE.API.HUMIDITY" + CLUE_API_PRESSURE = "CLUE.API.PRESSURE" + CLUE_API_ALTITUDE = "CLUE.API.ALTITUDE" + CLUE_API_SEA_LEVEL_PRESSURE = "CLUE.API.SEA.LEVEL.PRESSURE" + CLUE_API_PIXEL = "CLUE.API.PIXEL" + CLUE_API_TOUCH = "CLUE.API.TOUCH" + CLUE_API_WHITE_LEDS = "CLUE.API.WHITE.LEDS" + CLUE_API_RED_LED = "CLUE.API.RED.LED" + CLUE_API_SOUND = "CLUE.API.SOUND" + CLUE_API_TEXT_DISPLAY = "CLUE.API.TEXT.DISPLAY" + CLUE_API_SLIDESHOW = "CLUE.API.SLIDESHOW" + CLUE_API_TILE_GRID = "CLUE.API.TILE.GRID" diff --git a/src/common/test/__init__.py b/Source/common/test/__init__.py similarity index 100% rename from src/common/test/__init__.py rename to Source/common/test/__init__.py diff --git a/src/common/test/test_debugger_communication_client.py b/Source/common/test/test_debugger_communication_client.py similarity index 100% rename from src/common/test/test_debugger_communication_client.py rename to Source/common/test/test_debugger_communication_client.py diff --git a/src/common/test/test_utils.py b/Source/common/test/test_utils.py similarity index 100% rename from src/common/test/test_utils.py rename to Source/common/test/test_utils.py diff --git a/src/common/utils.py b/Source/common/utils.py similarity index 100% rename from src/common/utils.py rename to Source/common/utils.py diff --git a/src/constants.ts b/Source/constants.ts similarity index 100% rename from src/constants.ts rename to Source/constants.ts diff --git a/src/cpxWorkspace.ts b/Source/cpxWorkspace.ts similarity index 100% rename from src/cpxWorkspace.ts rename to Source/cpxWorkspace.ts diff --git a/src/debug_user_code.py b/Source/debug_user_code.py similarity index 100% rename from src/debug_user_code.py rename to Source/debug_user_code.py diff --git a/src/debugger/debugAdapter.ts b/Source/debugger/debugAdapter.ts similarity index 100% rename from src/debugger/debugAdapter.ts rename to Source/debugger/debugAdapter.ts diff --git a/src/debugger/debugAdapterFactory.ts b/Source/debugger/debugAdapterFactory.ts similarity index 100% rename from src/debugger/debugAdapterFactory.ts rename to Source/debugger/debugAdapterFactory.ts diff --git a/src/debuggerCommunicationServer.ts b/Source/debuggerCommunicationServer.ts similarity index 100% rename from src/debuggerCommunicationServer.ts rename to Source/debuggerCommunicationServer.ts diff --git a/src/dev-requirements.txt b/Source/dev-requirements.txt similarity index 100% rename from src/dev-requirements.txt rename to Source/dev-requirements.txt diff --git a/src/device.py b/Source/device.py similarity index 100% rename from src/device.py rename to Source/device.py diff --git a/src/deviceContext.ts b/Source/deviceContext.ts similarity index 100% rename from src/deviceContext.ts rename to Source/deviceContext.ts diff --git a/src/extension.ts b/Source/extension.ts similarity index 100% rename from src/extension.ts rename to Source/extension.ts diff --git a/src/extension_utils/utils.ts b/Source/extension_utils/utils.ts similarity index 100% rename from src/extension_utils/utils.ts rename to Source/extension_utils/utils.ts diff --git a/src/install_dependencies.py b/Source/install_dependencies.py similarity index 96% rename from src/install_dependencies.py rename to Source/install_dependencies.py index 00fe81d37..84aeb1d32 100644 --- a/src/install_dependencies.py +++ b/Source/install_dependencies.py @@ -1,9 +1,9 @@ -import subprocess -import sys -import pathlib -import os - -os.chdir(str(pathlib.Path(__file__).parent.parent.absolute())) -subprocess.check_call( - [sys.executable, "-m", "pip", "install", "-r", "./out/requirements.txt"] -) +import subprocess +import sys +import pathlib +import os + +os.chdir(str(pathlib.Path(__file__).parent.parent.absolute())) +subprocess.check_call( + [sys.executable, "-m", "pip", "install", "-r", "./out/requirements.txt"] +) diff --git a/src/latest_release_note.ts b/Source/latest_release_note.ts similarity index 100% rename from src/latest_release_note.ts rename to Source/latest_release_note.ts diff --git a/src/micropython/__init__.py b/Source/micropython/__init__.py similarity index 100% rename from src/micropython/__init__.py rename to Source/micropython/__init__.py diff --git a/src/micropython/audio.py b/Source/micropython/audio.py similarity index 100% rename from src/micropython/audio.py rename to Source/micropython/audio.py diff --git a/src/micropython/microbit/__init__.py b/Source/micropython/microbit/__init__.py similarity index 100% rename from src/micropython/microbit/__init__.py rename to Source/micropython/microbit/__init__.py diff --git a/src/micropython/microbit/__model/accelerometer.py b/Source/micropython/microbit/__model/accelerometer.py similarity index 100% rename from src/micropython/microbit/__model/accelerometer.py rename to Source/micropython/microbit/__model/accelerometer.py diff --git a/src/micropython/microbit/__model/button.py b/Source/micropython/microbit/__model/button.py similarity index 100% rename from src/micropython/microbit/__model/button.py rename to Source/micropython/microbit/__model/button.py diff --git a/src/micropython/microbit/__model/compass.py b/Source/micropython/microbit/__model/compass.py similarity index 100% rename from src/micropython/microbit/__model/compass.py rename to Source/micropython/microbit/__model/compass.py diff --git a/src/micropython/microbit/__model/constants.py b/Source/micropython/microbit/__model/constants.py similarity index 100% rename from src/micropython/microbit/__model/constants.py rename to Source/micropython/microbit/__model/constants.py diff --git a/src/micropython/microbit/__model/display.py b/Source/micropython/microbit/__model/display.py similarity index 100% rename from src/micropython/microbit/__model/display.py rename to Source/micropython/microbit/__model/display.py diff --git a/src/micropython/microbit/__model/i2c.py b/Source/micropython/microbit/__model/i2c.py similarity index 100% rename from src/micropython/microbit/__model/i2c.py rename to Source/micropython/microbit/__model/i2c.py diff --git a/src/micropython/microbit/__model/image.py b/Source/micropython/microbit/__model/image.py similarity index 100% rename from src/micropython/microbit/__model/image.py rename to Source/micropython/microbit/__model/image.py diff --git a/src/micropython/microbit/__model/microbit_model.py b/Source/micropython/microbit/__model/microbit_model.py similarity index 100% rename from src/micropython/microbit/__model/microbit_model.py rename to Source/micropython/microbit/__model/microbit_model.py diff --git a/src/micropython/microbit/__model/producer_property.py b/Source/micropython/microbit/__model/producer_property.py similarity index 100% rename from src/micropython/microbit/__model/producer_property.py rename to Source/micropython/microbit/__model/producer_property.py diff --git a/src/micropython/microbit/__model/spi.py b/Source/micropython/microbit/__model/spi.py similarity index 100% rename from src/micropython/microbit/__model/spi.py rename to Source/micropython/microbit/__model/spi.py diff --git a/src/micropython/microbit/test/__init__.py b/Source/micropython/microbit/test/__init__.py similarity index 100% rename from src/micropython/microbit/test/__init__.py rename to Source/micropython/microbit/test/__init__.py diff --git a/src/micropython/microbit/test/test_accelerometer.py b/Source/micropython/microbit/test/test_accelerometer.py similarity index 100% rename from src/micropython/microbit/test/test_accelerometer.py rename to Source/micropython/microbit/test/test_accelerometer.py diff --git a/src/micropython/microbit/test/test_button.py b/Source/micropython/microbit/test/test_button.py similarity index 100% rename from src/micropython/microbit/test/test_button.py rename to Source/micropython/microbit/test/test_button.py diff --git a/src/micropython/microbit/test/test_display.py b/Source/micropython/microbit/test/test_display.py similarity index 100% rename from src/micropython/microbit/test/test_display.py rename to Source/micropython/microbit/test/test_display.py diff --git a/src/micropython/microbit/test/test_image.py b/Source/micropython/microbit/test/test_image.py similarity index 100% rename from src/micropython/microbit/test/test_image.py rename to Source/micropython/microbit/test/test_image.py diff --git a/src/micropython/microbit/test/test_init.py b/Source/micropython/microbit/test/test_init.py similarity index 100% rename from src/micropython/microbit/test/test_init.py rename to Source/micropython/microbit/test/test_init.py diff --git a/src/micropython/microbit/test/test_microbit_model.py b/Source/micropython/microbit/test/test_microbit_model.py similarity index 100% rename from src/micropython/microbit/test/test_microbit_model.py rename to Source/micropython/microbit/test/test_microbit_model.py diff --git a/src/micropython/music.py b/Source/micropython/music.py similarity index 97% rename from src/micropython/music.py rename to Source/micropython/music.py index ad25816a6..cff300710 100644 --- a/src/micropython/music.py +++ b/Source/micropython/music.py @@ -1,109 +1,109 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/music.html. - - -def set_tempo(ticks=4, bpm=120): - """ - This function is not implemented in the simulator. - - Sets the approximate tempo for playback. - - A number of ticks (expressed as an integer) constitute a beat. Each beat is to be played at a certain frequency per minute (expressed as the more familiar BPM - beats per minute - also as an integer). - - Suggested default values allow the following useful behaviour: - - * ``music.set_tempo()`` - reset the tempo to default of ticks = 4, bpm = 120 - * ``music.set_tempo(ticks=8)`` - change the "definition" of a beat - * ``music.set_tempo(bpm=180)`` - just change the tempo - - To work out the length of a tick in milliseconds is very simple arithmetic: ``60000/bpm/ticks_per_beat`` . For the default values that's ``60000/120/4 = 125 milliseconds`` or ``1 beat = 500 milliseconds``. - """ - utils.print_for_unimplemented_functions(set_tempo.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def get_tempo(): - """ - This function is not implemented in the simulator. - - Gets the current tempo as a tuple of integers: ``(ticks, bpm)``. - """ - utils.print_for_unimplemented_functions(get_tempo.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def play(music, pin="microbit.pin0", wait=True, loop=False): - """ - This function is not implemented in the simulator. - - Plays ``music`` containing the musical DSL defined above. - - If ``music`` is a string it is expected to be a single note such as, - ``'c1:4'``. - - If ``music`` is specified as a list of notes (as defined in the section on - the musical DSL, above) then they are played one after the other to perform - a melody. - - In both cases, the ``duration`` and ``octave`` values are reset to - their defaults before the music (whatever it may be) is played. - - An optional argument to specify the output pin can be used to override the - default of ``microbit.pin0``. - - If ``wait`` is set to ``True``, this function is blocking. - - If ``loop`` is set to ``True``, the tune repeats until ``stop`` is called - (see below) or the blocking call is interrupted. - """ - utils.print_for_unimplemented_functions(play.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def pitch(frequency, duration=-1, pin="microbit.pin0", wait=True): - """ - This function is not implemented in the simulator. - - Plays a pitch at the integer frequency given for the specified number of - milliseconds. For example, if the frequency is set to 440 and the length to - 1000 then we hear a standard concert A for one second. - - Note that you can only play one pitch on one pin at any one time. - - If ``wait`` is set to ``True``, this function is blocking. - - If ``duration`` is negative the pitch is played continuously until either the - blocking call is interrupted or, in the case of a background call, a new - frequency is set or ``stop`` is called (see below). - """ - utils.print_for_unimplemented_functions(pitch.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def stop(pin="microbit.pin0"): - """ - This function is not implemented in the simulator. - - Stops all music playback on a given pin, eg. ``music.stop(pin1)``. - If no pin is given, eg. ``music.stop()`` pin0 is assumed. - """ - utils.print_for_unimplemented_functions(stop.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def reset(): - """ - This function is not implemented in the simulator. - - Resets the state of the following attributes in the following way: - - * ``ticks = 4`` - * ``bpm = 120`` - * ``duration = 4`` - * ``octave = 4`` - """ - utils.print_for_unimplemented_functions(reset.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) +from common import utils +from common.telemetry import telemetry_py +from common.telemetry_events import TelemetryEvent + +# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/music.html. + + +def set_tempo(ticks=4, bpm=120): + """ + This function is not implemented in the simulator. + + Sets the approximate tempo for playback. + + A number of ticks (expressed as an integer) constitute a beat. Each beat is to be played at a certain frequency per minute (expressed as the more familiar BPM - beats per minute - also as an integer). + + Suggested default values allow the following useful behaviour: + + * ``music.set_tempo()`` - reset the tempo to default of ticks = 4, bpm = 120 + * ``music.set_tempo(ticks=8)`` - change the "definition" of a beat + * ``music.set_tempo(bpm=180)`` - just change the tempo + + To work out the length of a tick in milliseconds is very simple arithmetic: ``60000/bpm/ticks_per_beat`` . For the default values that's ``60000/120/4 = 125 milliseconds`` or ``1 beat = 500 milliseconds``. + """ + utils.print_for_unimplemented_functions(set_tempo.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) + + +def get_tempo(): + """ + This function is not implemented in the simulator. + + Gets the current tempo as a tuple of integers: ``(ticks, bpm)``. + """ + utils.print_for_unimplemented_functions(get_tempo.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) + + +def play(music, pin="microbit.pin0", wait=True, loop=False): + """ + This function is not implemented in the simulator. + + Plays ``music`` containing the musical DSL defined above. + + If ``music`` is a string it is expected to be a single note such as, + ``'c1:4'``. + + If ``music`` is specified as a list of notes (as defined in the section on + the musical DSL, above) then they are played one after the other to perform + a melody. + + In both cases, the ``duration`` and ``octave`` values are reset to + their defaults before the music (whatever it may be) is played. + + An optional argument to specify the output pin can be used to override the + default of ``microbit.pin0``. + + If ``wait`` is set to ``True``, this function is blocking. + + If ``loop`` is set to ``True``, the tune repeats until ``stop`` is called + (see below) or the blocking call is interrupted. + """ + utils.print_for_unimplemented_functions(play.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) + + +def pitch(frequency, duration=-1, pin="microbit.pin0", wait=True): + """ + This function is not implemented in the simulator. + + Plays a pitch at the integer frequency given for the specified number of + milliseconds. For example, if the frequency is set to 440 and the length to + 1000 then we hear a standard concert A for one second. + + Note that you can only play one pitch on one pin at any one time. + + If ``wait`` is set to ``True``, this function is blocking. + + If ``duration`` is negative the pitch is played continuously until either the + blocking call is interrupted or, in the case of a background call, a new + frequency is set or ``stop`` is called (see below). + """ + utils.print_for_unimplemented_functions(pitch.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) + + +def stop(pin="microbit.pin0"): + """ + This function is not implemented in the simulator. + + Stops all music playback on a given pin, eg. ``music.stop(pin1)``. + If no pin is given, eg. ``music.stop()`` pin0 is assumed. + """ + utils.print_for_unimplemented_functions(stop.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) + + +def reset(): + """ + This function is not implemented in the simulator. + + Resets the state of the following attributes in the following way: + + * ``ticks = 4`` + * ``bpm = 120`` + * ``duration = 4`` + * ``octave = 4`` + """ + utils.print_for_unimplemented_functions(reset.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) diff --git a/src/micropython/radio.py b/Source/micropython/radio.py similarity index 97% rename from src/micropython/radio.py rename to Source/micropython/radio.py index ac6d24fe3..971f13720 100644 --- a/src/micropython/radio.py +++ b/Source/micropython/radio.py @@ -1,180 +1,180 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/radio.html. - -RATE_250KBIT = "" - -RATE_1MBIT = "" - -RATE_2MBIT = "" - - -def on(): - """ - This function is not implemented in the simulator. - - Turns the radio on. This needs to be explicitly called since the radio - draws power and takes up memory that you may otherwise need. - """ - utils.print_for_unimplemented_functions(on.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def off(): - """ - This function is not implemented in the simulator. - - Turns off the radio, thus saving power and memory - """ - utils.print_for_unimplemented_functions(off.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def config(**kwargs): - """ - This function is not implemented in the simulator. - - Configures various keyword based settings relating to the radio. The - available settings and their sensible default values are listed below. - - The ``length`` (default=32) defines the maximum length, in bytes, of a - message sent via the radio. It can be up to 251 bytes long (254 - 3 bytes - for S0, LENGTH and S1 preamble). - - The ``queue`` (default=3) specifies the number of messages that can be - stored on the incoming message queue. If there are no spaces left on the - queue for incoming messages, then the incoming message is dropped. - - The ``channel`` (default=7) can be an integer value from 0 to 83 - (inclusive) that defines an arbitrary "channel" to which the radio is - tuned. Messages will be sent via this channel and only messages received - via this channel will be put onto the incoming message queue. Each step is - 1MHz wide, based at 2400MHz. - - The ``power`` (default=6) is an integer value from 0 to 7 (inclusive) to - indicate the strength of signal used when broadcasting a message. The - higher the value the stronger the signal, but the more power is consumed - by the device. The numbering translates to positions in the following list - of dBm (decibel milliwatt) values: -30, -20, -16, -12, -8, -4, 0, 4. - - The ``address`` (default=0x75626974) is an arbitrary name, expressed as a - 32-bit address, that's used to filter incoming packets at the hardware - level, keeping only those that match the address you set. The default used - by other micro:bit related platforms is the default setting used here. - - The ``group`` (default=0) is an 8-bit value (0-255) used with the - ``address`` when filtering messages. Conceptually, "address" is like a - house/office address and "group" is like the person at that address to - which you want to send your message. - - The ``data_rate`` (default=radio.RATE_1MBIT) indicates the speed at which - data throughput takes place. Can be one of the following contants defined - in the ``radio`` module : ``RATE_250KBIT``, ``RATE_1MBIT`` or - ``RATE_2MBIT``. - - If ``config`` is not called then the defaults described above are assumed. - """ - utils.print_for_unimplemented_functions(config.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def reset(): - """ - This function is not implemented in the simulator. - - Reset the settings to their default values (as listed in the documentation - for the ``config`` function above). - """ - utils.print_for_unimplemented_functions(reset.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def send_bytes(message): - """ - This function is not implemented in the simulator. - - Sends a message containing bytes. - """ - utils.print_for_unimplemented_functions(send_bytes.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def receive_bytes(): - """ - This function is not implemented in the simulator. - - Receive the next incoming message on the message queue. Returns ``None`` if - there are no pending messages. Messages are returned as bytes. - """ - utils.print_for_unimplemented_functions(receive_bytes.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def receive_bytes_into(buffer): - """ - This function is not implemented in the simulator. - - Receive the next incoming message on the message queue. Copies the message - into ``buffer``, trimming the end of the message if necessary. - Returns ``None`` if there are no pending messages, otherwise it returns the length - of the message (which might be more than the length of the buffer). - """ - utils.print_for_unimplemented_functions(receive_bytes_into.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def send(message): - """ - This function is not implemented in the simulator. - - Sends a message containing bytes. - """ - utils.print_for_unimplemented_functions(send.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def receive(): - """ - This function is not implemented in the simulator. - - Works in exactly the same way as ``receive_bytes`` but returns - whatever was sent. - - Currently, it's equivalent to ``str(receive_bytes(), 'utf8')`` but with a - check that the the first three bytes are ``b'\x01\x00\x01'`` (to make it - compatible with other platforms that may target the micro:bit). It strips - the prepended bytes before converting to a string. - - A ``ValueError`` exception is raised if conversion to string fails. - """ - utils.print_for_unimplemented_functions(receive.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def receive_full(): - """ - This function is not implemented in the simulator. - - Returns a tuple containing three values representing the next incoming - message on the message queue. If there are no pending messages then - ``None`` is returned. - - The three values in the tuple represent: - - * the next incoming message on the message queue as bytes. - * the RSSI (signal strength): a value between 0 (strongest) and -255 (weakest) as measured in dBm. - * a microsecond timestamp: the value returned by ``time.ticks_us()`` when the message was received. - - For example:: - - details = radio.receive_full() - if details: - msg, rssi, timestamp = details - - This function is useful for providing information needed for triangulation - and/or triliteration with other micro:bit devices. - """ - utils.print_for_unimplemented_functions(receive_full.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) +from common import utils +from common.telemetry import telemetry_py +from common.telemetry_events import TelemetryEvent + +# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/radio.html. + +RATE_250KBIT = "" + +RATE_1MBIT = "" + +RATE_2MBIT = "" + + +def on(): + """ + This function is not implemented in the simulator. + + Turns the radio on. This needs to be explicitly called since the radio + draws power and takes up memory that you may otherwise need. + """ + utils.print_for_unimplemented_functions(on.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) + + +def off(): + """ + This function is not implemented in the simulator. + + Turns off the radio, thus saving power and memory + """ + utils.print_for_unimplemented_functions(off.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) + + +def config(**kwargs): + """ + This function is not implemented in the simulator. + + Configures various keyword based settings relating to the radio. The + available settings and their sensible default values are listed below. + + The ``length`` (default=32) defines the maximum length, in bytes, of a + message sent via the radio. It can be up to 251 bytes long (254 - 3 bytes + for S0, LENGTH and S1 preamble). + + The ``queue`` (default=3) specifies the number of messages that can be + stored on the incoming message queue. If there are no spaces left on the + queue for incoming messages, then the incoming message is dropped. + + The ``channel`` (default=7) can be an integer value from 0 to 83 + (inclusive) that defines an arbitrary "channel" to which the radio is + tuned. Messages will be sent via this channel and only messages received + via this channel will be put onto the incoming message queue. Each step is + 1MHz wide, based at 2400MHz. + + The ``power`` (default=6) is an integer value from 0 to 7 (inclusive) to + indicate the strength of signal used when broadcasting a message. The + higher the value the stronger the signal, but the more power is consumed + by the device. The numbering translates to positions in the following list + of dBm (decibel milliwatt) values: -30, -20, -16, -12, -8, -4, 0, 4. + + The ``address`` (default=0x75626974) is an arbitrary name, expressed as a + 32-bit address, that's used to filter incoming packets at the hardware + level, keeping only those that match the address you set. The default used + by other micro:bit related platforms is the default setting used here. + + The ``group`` (default=0) is an 8-bit value (0-255) used with the + ``address`` when filtering messages. Conceptually, "address" is like a + house/office address and "group" is like the person at that address to + which you want to send your message. + + The ``data_rate`` (default=radio.RATE_1MBIT) indicates the speed at which + data throughput takes place. Can be one of the following contants defined + in the ``radio`` module : ``RATE_250KBIT``, ``RATE_1MBIT`` or + ``RATE_2MBIT``. + + If ``config`` is not called then the defaults described above are assumed. + """ + utils.print_for_unimplemented_functions(config.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) + + +def reset(): + """ + This function is not implemented in the simulator. + + Reset the settings to their default values (as listed in the documentation + for the ``config`` function above). + """ + utils.print_for_unimplemented_functions(reset.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) + + +def send_bytes(message): + """ + This function is not implemented in the simulator. + + Sends a message containing bytes. + """ + utils.print_for_unimplemented_functions(send_bytes.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) + + +def receive_bytes(): + """ + This function is not implemented in the simulator. + + Receive the next incoming message on the message queue. Returns ``None`` if + there are no pending messages. Messages are returned as bytes. + """ + utils.print_for_unimplemented_functions(receive_bytes.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) + + +def receive_bytes_into(buffer): + """ + This function is not implemented in the simulator. + + Receive the next incoming message on the message queue. Copies the message + into ``buffer``, trimming the end of the message if necessary. + Returns ``None`` if there are no pending messages, otherwise it returns the length + of the message (which might be more than the length of the buffer). + """ + utils.print_for_unimplemented_functions(receive_bytes_into.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) + + +def send(message): + """ + This function is not implemented in the simulator. + + Sends a message containing bytes. + """ + utils.print_for_unimplemented_functions(send.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) + + +def receive(): + """ + This function is not implemented in the simulator. + + Works in exactly the same way as ``receive_bytes`` but returns + whatever was sent. + + Currently, it's equivalent to ``str(receive_bytes(), 'utf8')`` but with a + check that the the first three bytes are ``b'\x01\x00\x01'`` (to make it + compatible with other platforms that may target the micro:bit). It strips + the prepended bytes before converting to a string. + + A ``ValueError`` exception is raised if conversion to string fails. + """ + utils.print_for_unimplemented_functions(receive.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) + + +def receive_full(): + """ + This function is not implemented in the simulator. + + Returns a tuple containing three values representing the next incoming + message on the message queue. If there are no pending messages then + ``None`` is returned. + + The three values in the tuple represent: + + * the next incoming message on the message queue as bytes. + * the RSSI (signal strength): a value between 0 (strongest) and -255 (weakest) as measured in dBm. + * a microsecond timestamp: the value returned by ``time.ticks_us()`` when the message was received. + + For example:: + + details = radio.receive_full() + if details: + msg, rssi, timestamp = details + + This function is useful for providing information needed for triangulation + and/or triliteration with other micro:bit devices. + """ + utils.print_for_unimplemented_functions(receive_full.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) diff --git a/src/micropython/speech.py b/Source/micropython/speech.py similarity index 97% rename from src/micropython/speech.py rename to Source/micropython/speech.py index e92458a96..0fef5c6fb 100644 --- a/src/micropython/speech.py +++ b/Source/micropython/speech.py @@ -1,61 +1,61 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/speech.html. - - -def translate(words): - """ - This function is not implemented in the simulator. - - Given English words in the string ``words``, return a string containing - a best guess at the appropriate phonemes to pronounce. The output is - generated from this - `text to phoneme translation table `_. - - This function should be used to generate a first approximation of phonemes - that can be further hand-edited to improve accuracy, inflection and - emphasis. - """ - utils.print_for_unimplemented_functions(translate.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) - - -def pronounce(phonemes, pitch=64, speed=72, mouth=128, throat=128): - """ - This function is not implemented in the simulator. - - Pronounce the phonemes in the string ``phonemes``. See below for details of - how to use phonemes to finely control the output of the speech synthesiser. - Override the optional pitch, speed, mouth and throat settings to change the - timbre (quality) of the voice. - """ - utils.print_for_unimplemented_functions(pronounce.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) - - -def say(words, pitch=64, speed=72, mouth=128, throat=128): - """ - This function is not implemented in the simulator. - - Say the English words in the string ``words``. The result is semi-accurate - for English. Override the optional pitch, speed, mouth and throat - settings to change the timbre (quality) of the voice. This is a short-hand - equivalent of: ``speech.pronounce(speech.translate(words))`` - """ - utils.print_for_unimplemented_functions(say.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) - - -def sing(phonemes, pitch=64, speed=72, mouth=128, throat=128): - """ - This function is not implemented in the simulator. - - Sing the phonemes contained in the string ``phonemes``. Changing the pitch - and duration of the note is described below. Override the optional pitch, - speed, mouth and throat settings to change the timbre (quality) of the - voice. - """ - utils.print_for_unimplemented_functions(sing.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) +from common import utils +from common.telemetry import telemetry_py +from common.telemetry_events import TelemetryEvent + +# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/speech.html. + + +def translate(words): + """ + This function is not implemented in the simulator. + + Given English words in the string ``words``, return a string containing + a best guess at the appropriate phonemes to pronounce. The output is + generated from this + `text to phoneme translation table `_. + + This function should be used to generate a first approximation of phonemes + that can be further hand-edited to improve accuracy, inflection and + emphasis. + """ + utils.print_for_unimplemented_functions(translate.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) + + +def pronounce(phonemes, pitch=64, speed=72, mouth=128, throat=128): + """ + This function is not implemented in the simulator. + + Pronounce the phonemes in the string ``phonemes``. See below for details of + how to use phonemes to finely control the output of the speech synthesiser. + Override the optional pitch, speed, mouth and throat settings to change the + timbre (quality) of the voice. + """ + utils.print_for_unimplemented_functions(pronounce.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) + + +def say(words, pitch=64, speed=72, mouth=128, throat=128): + """ + This function is not implemented in the simulator. + + Say the English words in the string ``words``. The result is semi-accurate + for English. Override the optional pitch, speed, mouth and throat + settings to change the timbre (quality) of the voice. This is a short-hand + equivalent of: ``speech.pronounce(speech.translate(words))`` + """ + utils.print_for_unimplemented_functions(say.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) + + +def sing(phonemes, pitch=64, speed=72, mouth=128, throat=128): + """ + This function is not implemented in the simulator. + + Sing the phonemes contained in the string ``phonemes``. Changing the pitch + and duration of the note is described below. Override the optional pitch, + speed, mouth and throat settings to change the timbre (quality) of the + voice. + """ + utils.print_for_unimplemented_functions(sing.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) diff --git a/src/micropython/utime.py b/Source/micropython/utime.py similarity index 97% rename from src/micropython/utime.py rename to Source/micropython/utime.py index 9ae5ee4df..4caee2d9b 100644 --- a/src/micropython/utime.py +++ b/Source/micropython/utime.py @@ -1,132 +1,132 @@ -import time - -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/utime.html. - - -def sleep(seconds): - """ - Sleep for the given number of seconds. You can use a floating-point number - to sleep for a fractional number of seconds, or use the - :func:`utime.sleep_ms()` and :func:`utime.sleep_us()` functions. - """ - time.sleep(seconds) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def sleep_ms(ms): - """ - Delay for given number of milliseconds, should be positive or 0. - """ - time.sleep(ms / 1000) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def sleep_us(us): - """ - Delay for given number of microseconds, should be positive or 0. - """ - time.sleep(us / 1000000) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def ticks_ms(): - """ - This function is not implemented in the simulator. - - Returns an increasing millisecond counter with an arbitrary reference point, - that wraps around after some value. - """ - utils.print_for_unimplemented_functions(ticks_ms.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def ticks_us(): - """ - This function is not implemented in the simulator. - - Just like :func:`utime.ticks_ms()` above, but in microseconds. - """ - utils.print_for_unimplemented_functions(ticks_us.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def ticks_add(ticks, delta): - """ - This function is not implemented in the simulator. - - Offset ticks value by a given number, which can be either positive or - negative. Given a ticks value, this function allows to calculate ticks - value delta ticks before or after it, following modular-arithmetic - definition of tick values. - - Example: - - .. code-block:: python - - # Find out what ticks value there was 100ms ago - print(ticks_add(time.ticks_ms(), -100)) - - # Calculate deadline for operation and test for it - deadline = ticks_add(time.ticks_ms(), 200) - while ticks_diff(deadline, time.ticks_ms()) > 0: - do_a_little_of_something() - - # Find out TICKS_MAX used by this port - print(ticks_add(0, -1)) - """ - utils.print_for_unimplemented_functions(ticks_add.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def ticks_diff(ticks1, ticks2): - """ - This function is not implemented in the simulator. - - Measure ticks difference between values returned from - :func:`utime.ticks_ms()` or :func:`ticks_us()` functions, as a signed value - which may wrap around. - - The argument order is the same as for subtraction operator, - ``ticks_diff(ticks1, ticks2)`` has the same meaning as ``ticks1 - ticks2``. - - :func:`utime.ticks_diff()` is designed to accommodate various usage - patterns, among them: - - Polling with timeout. In this case, the order of events is known, and you - will deal only with positive results of :func:`utime.ticks_diff()`: - - .. code-block:: python - - # Wait for GPIO pin to be asserted, but at most 500us - start = time.ticks_us() - while pin.value() == 0: - if time.ticks_diff(time.ticks_us(), start) > 500: - raise TimeoutError - - - Scheduling events. In this case, :func:`utime.ticks_diff()` result may be - negative if an event is overdue: - - - .. code-block:: python - - # This code snippet is not optimized - now = time.ticks_ms() - scheduled_time = task.scheduled_time() - if ticks_diff(scheduled_time, now) > 0: - print("Too early, let's nap") - sleep_ms(ticks_diff(scheduled_time, now)) - task.run() - elif ticks_diff(scheduled_time, now) == 0: - print("Right at time!") - task.run() - elif ticks_diff(scheduled_time, now) < 0: - print("Oops, running late, tell task to run faster!") - task.run(run_faster=true) - """ - utils.print_for_unimplemented_functions(ticks_diff.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) +import time + +from common import utils +from common.telemetry import telemetry_py +from common.telemetry_events import TelemetryEvent + +# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/utime.html. + + +def sleep(seconds): + """ + Sleep for the given number of seconds. You can use a floating-point number + to sleep for a fractional number of seconds, or use the + :func:`utime.sleep_ms()` and :func:`utime.sleep_us()` functions. + """ + time.sleep(seconds) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) + + +def sleep_ms(ms): + """ + Delay for given number of milliseconds, should be positive or 0. + """ + time.sleep(ms / 1000) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) + + +def sleep_us(us): + """ + Delay for given number of microseconds, should be positive or 0. + """ + time.sleep(us / 1000000) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) + + +def ticks_ms(): + """ + This function is not implemented in the simulator. + + Returns an increasing millisecond counter with an arbitrary reference point, + that wraps around after some value. + """ + utils.print_for_unimplemented_functions(ticks_ms.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) + + +def ticks_us(): + """ + This function is not implemented in the simulator. + + Just like :func:`utime.ticks_ms()` above, but in microseconds. + """ + utils.print_for_unimplemented_functions(ticks_us.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) + + +def ticks_add(ticks, delta): + """ + This function is not implemented in the simulator. + + Offset ticks value by a given number, which can be either positive or + negative. Given a ticks value, this function allows to calculate ticks + value delta ticks before or after it, following modular-arithmetic + definition of tick values. + + Example: + + .. code-block:: python + + # Find out what ticks value there was 100ms ago + print(ticks_add(time.ticks_ms(), -100)) + + # Calculate deadline for operation and test for it + deadline = ticks_add(time.ticks_ms(), 200) + while ticks_diff(deadline, time.ticks_ms()) > 0: + do_a_little_of_something() + + # Find out TICKS_MAX used by this port + print(ticks_add(0, -1)) + """ + utils.print_for_unimplemented_functions(ticks_add.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) + + +def ticks_diff(ticks1, ticks2): + """ + This function is not implemented in the simulator. + + Measure ticks difference between values returned from + :func:`utime.ticks_ms()` or :func:`ticks_us()` functions, as a signed value + which may wrap around. + + The argument order is the same as for subtraction operator, + ``ticks_diff(ticks1, ticks2)`` has the same meaning as ``ticks1 - ticks2``. + + :func:`utime.ticks_diff()` is designed to accommodate various usage + patterns, among them: + + Polling with timeout. In this case, the order of events is known, and you + will deal only with positive results of :func:`utime.ticks_diff()`: + + .. code-block:: python + + # Wait for GPIO pin to be asserted, but at most 500us + start = time.ticks_us() + while pin.value() == 0: + if time.ticks_diff(time.ticks_us(), start) > 500: + raise TimeoutError + + + Scheduling events. In this case, :func:`utime.ticks_diff()` result may be + negative if an event is overdue: + + + .. code-block:: python + + # This code snippet is not optimized + now = time.ticks_ms() + scheduled_time = task.scheduled_time() + if ticks_diff(scheduled_time, now) > 0: + print("Too early, let's nap") + sleep_ms(ticks_diff(scheduled_time, now)) + task.run() + elif ticks_diff(scheduled_time, now) == 0: + print("Right at time!") + task.run() + elif ticks_diff(scheduled_time, now) < 0: + print("Oops, running late, tell task to run faster!") + task.run(run_faster=true) + """ + utils.print_for_unimplemented_functions(ticks_diff.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) diff --git a/src/process_user_code.py b/Source/process_user_code.py similarity index 100% rename from src/process_user_code.py rename to Source/process_user_code.py diff --git a/src/python_constants.py b/Source/python_constants.py similarity index 100% rename from src/python_constants.py rename to Source/python_constants.py diff --git a/src/requirements.txt b/Source/requirements.txt similarity index 100% rename from src/requirements.txt rename to Source/requirements.txt diff --git a/src/serialMonitor.ts b/Source/serialMonitor.ts similarity index 100% rename from src/serialMonitor.ts rename to Source/serialMonitor.ts diff --git a/src/serialPortControl.ts b/Source/serialPortControl.ts similarity index 100% rename from src/serialPortControl.ts rename to Source/serialPortControl.ts diff --git a/src/service/PopupService.ts b/Source/service/PopupService.ts similarity index 96% rename from src/service/PopupService.ts rename to Source/service/PopupService.ts index 9bff8ba5b..d5aadbff4 100644 --- a/src/service/PopupService.ts +++ b/Source/service/PopupService.ts @@ -1,16 +1,16 @@ -// import { Webview } from "vscode"; -import * as vscode from "vscode"; -import { LATEST_RELEASE_NOTE } from "../latest_release_note"; - -export class PopupService { - public static openReleaseNote() { - const panel = vscode.window.createWebviewPanel( - "releaseNote", - "Release Note", - vscode.ViewColumn.One, - {} - ); - - panel.webview.html = LATEST_RELEASE_NOTE; - } -} +// import { Webview } from "vscode"; +import * as vscode from "vscode"; +import { LATEST_RELEASE_NOTE } from "../latest_release_note"; + +export class PopupService { + public static openReleaseNote() { + const panel = vscode.window.createWebviewPanel( + "releaseNote", + "Release Note", + vscode.ViewColumn.One, + {} + ); + + panel.webview.html = LATEST_RELEASE_NOTE; + } +} diff --git a/src/service/debuggerCommunicationService.ts b/Source/service/debuggerCommunicationService.ts similarity index 97% rename from src/service/debuggerCommunicationService.ts rename to Source/service/debuggerCommunicationService.ts index 9a8c1d6f0..b37b1c2ed 100644 --- a/src/service/debuggerCommunicationService.ts +++ b/Source/service/debuggerCommunicationService.ts @@ -1,27 +1,27 @@ -import { DebuggerCommunicationServer } from "../debuggerCommunicationServer"; - -export class DebuggerCommunicationService { - private currentDebuggerServer?: DebuggerCommunicationServer; - private previousDebuggerServerToDisconnect?: DebuggerCommunicationServer; - - public setCurrentDebuggerServer(debugServer: DebuggerCommunicationServer) { - this.currentDebuggerServer = debugServer; - } - // Used for restart and stop event - public resetCurrentDebuggerServer() { - if (this.currentDebuggerServer) { - this.currentDebuggerServer.closeConnection(); - } - this.previousDebuggerServerToDisconnect = this.currentDebuggerServer; - this.currentDebuggerServer = undefined; - } - public getCurrentDebuggerServer() { - return this.currentDebuggerServer; - } - // Only used for stop event - public handleStopEvent() { - if (this.previousDebuggerServerToDisconnect) { - this.previousDebuggerServerToDisconnect.disconnectFromPort(); - } - } -} +import { DebuggerCommunicationServer } from "../debuggerCommunicationServer"; + +export class DebuggerCommunicationService { + private currentDebuggerServer?: DebuggerCommunicationServer; + private previousDebuggerServerToDisconnect?: DebuggerCommunicationServer; + + public setCurrentDebuggerServer(debugServer: DebuggerCommunicationServer) { + this.currentDebuggerServer = debugServer; + } + // Used for restart and stop event + public resetCurrentDebuggerServer() { + if (this.currentDebuggerServer) { + this.currentDebuggerServer.closeConnection(); + } + this.previousDebuggerServerToDisconnect = this.currentDebuggerServer; + this.currentDebuggerServer = undefined; + } + public getCurrentDebuggerServer() { + return this.currentDebuggerServer; + } + // Only used for stop event + public handleStopEvent() { + if (this.previousDebuggerServerToDisconnect) { + this.previousDebuggerServerToDisconnect.disconnectFromPort(); + } + } +} diff --git a/src/service/deviceSelectionService.ts b/Source/service/deviceSelectionService.ts similarity index 96% rename from src/service/deviceSelectionService.ts rename to Source/service/deviceSelectionService.ts index fd37ab6ed..39a8b5988 100644 --- a/src/service/deviceSelectionService.ts +++ b/Source/service/deviceSelectionService.ts @@ -1,12 +1,12 @@ -import { DEFAULT_DEVICE } from "../constants"; - -export class DeviceSelectionService { - private currentActiveDevice: string = DEFAULT_DEVICE; - - public getCurrentActiveDevice(): string { - return this.currentActiveDevice; - } - public setCurrentActiveDevice(newActiveDevice: string) { - this.currentActiveDevice = newActiveDevice; - } -} +import { DEFAULT_DEVICE } from "../constants"; + +export class DeviceSelectionService { + private currentActiveDevice: string = DEFAULT_DEVICE; + + public getCurrentActiveDevice(): string { + return this.currentActiveDevice; + } + public setCurrentActiveDevice(newActiveDevice: string) { + this.currentActiveDevice = newActiveDevice; + } +} diff --git a/src/service/fileSelectionService.ts b/Source/service/fileSelectionService.ts similarity index 97% rename from src/service/fileSelectionService.ts rename to Source/service/fileSelectionService.ts index 11f901ed9..d5b0eea11 100644 --- a/src/service/fileSelectionService.ts +++ b/Source/service/fileSelectionService.ts @@ -1,95 +1,95 @@ -import * as vscode from "vscode"; -import { LANGUAGE_VARS } from "../constants"; -import { VSCODE_MESSAGES_TO_WEBVIEW } from "../view/constants"; -import { DeviceSelectionService } from "./deviceSelectionService"; -import { MessagingService } from "./messagingService"; - -export class FileSelectionService { - private currentFileAbsPath: string = ""; - private currentTextDocument: vscode.TextDocument; - private messagingService: MessagingService; - - constructor(messagingService: MessagingService) { - this.messagingService = messagingService; - } - - public getCurrentFileAbsPath() { - return this.currentFileAbsPath; - } - public getCurrentTextDocument() { - return this.currentTextDocument; - } - public updateCurrentFileFromTextFile = async ( - activeTextDocument: vscode.TextDocument | undefined - ) => { - if (activeTextDocument) { - await this.updateCurrentFileFromEditor({ - document: activeTextDocument, - } as vscode.TextEditor); - } else { - return; - } - }; - public updateCurrentFileFromEditor = async ( - activeTextDocument: vscode.TextEditor | undefined - ) => { - if ( - activeTextDocument && - activeTextDocument.document && - activeTextDocument.document.languageId === "python" - ) { - this.setPathAndSendMessage(activeTextDocument.document.fileName); - this.currentTextDocument = activeTextDocument.document; - } else if (this.currentFileAbsPath === "") { - this.setPathAndSendMessage(this.getActivePythonFile() || ""); - } - if ( - this.currentTextDocument && - this.getActiveEditorFromPath(this.currentTextDocument.fileName) === - undefined - ) { - await vscode.window.showTextDocument( - this.currentTextDocument, - vscode.ViewColumn.One - ); - } - }; - public findCurrentTextDocument() { - if (this.currentFileAbsPath) { - const foundDocument = this.getActiveEditorFromPath( - this.currentFileAbsPath - ); - if (foundDocument !== undefined) { - this.currentTextDocument = foundDocument; - } - } - } - - public setPathAndSendMessage = (newFilePath: string) => { - this.currentFileAbsPath = newFilePath; - this.messagingService.sendMessageToWebview( - VSCODE_MESSAGES_TO_WEBVIEW.CURRENT_FILE, - { - running_file: newFilePath, - } - ); - }; - private getActiveEditorFromPath = ( - filePath: string - ): vscode.TextDocument => { - const activeEditor = vscode.window.visibleTextEditors.find( - (editor: vscode.TextEditor) => editor.document.fileName === filePath - ); - return activeEditor ? activeEditor.document : undefined; - }; - private getActivePythonFile = () => { - const editors: vscode.TextEditor[] = vscode.window.visibleTextEditors; - const activeEditor = editors.find( - editor => editor.document.languageId === LANGUAGE_VARS.PYTHON.ID - ); - if (activeEditor) { - this.currentTextDocument = activeEditor.document; - } - return activeEditor ? activeEditor.document.fileName : ""; - }; -} +import * as vscode from "vscode"; +import { LANGUAGE_VARS } from "../constants"; +import { VSCODE_MESSAGES_TO_WEBVIEW } from "../view/constants"; +import { DeviceSelectionService } from "./deviceSelectionService"; +import { MessagingService } from "./messagingService"; + +export class FileSelectionService { + private currentFileAbsPath: string = ""; + private currentTextDocument: vscode.TextDocument; + private messagingService: MessagingService; + + constructor(messagingService: MessagingService) { + this.messagingService = messagingService; + } + + public getCurrentFileAbsPath() { + return this.currentFileAbsPath; + } + public getCurrentTextDocument() { + return this.currentTextDocument; + } + public updateCurrentFileFromTextFile = async ( + activeTextDocument: vscode.TextDocument | undefined + ) => { + if (activeTextDocument) { + await this.updateCurrentFileFromEditor({ + document: activeTextDocument, + } as vscode.TextEditor); + } else { + return; + } + }; + public updateCurrentFileFromEditor = async ( + activeTextDocument: vscode.TextEditor | undefined + ) => { + if ( + activeTextDocument && + activeTextDocument.document && + activeTextDocument.document.languageId === "python" + ) { + this.setPathAndSendMessage(activeTextDocument.document.fileName); + this.currentTextDocument = activeTextDocument.document; + } else if (this.currentFileAbsPath === "") { + this.setPathAndSendMessage(this.getActivePythonFile() || ""); + } + if ( + this.currentTextDocument && + this.getActiveEditorFromPath(this.currentTextDocument.fileName) === + undefined + ) { + await vscode.window.showTextDocument( + this.currentTextDocument, + vscode.ViewColumn.One + ); + } + }; + public findCurrentTextDocument() { + if (this.currentFileAbsPath) { + const foundDocument = this.getActiveEditorFromPath( + this.currentFileAbsPath + ); + if (foundDocument !== undefined) { + this.currentTextDocument = foundDocument; + } + } + } + + public setPathAndSendMessage = (newFilePath: string) => { + this.currentFileAbsPath = newFilePath; + this.messagingService.sendMessageToWebview( + VSCODE_MESSAGES_TO_WEBVIEW.CURRENT_FILE, + { + running_file: newFilePath, + } + ); + }; + private getActiveEditorFromPath = ( + filePath: string + ): vscode.TextDocument => { + const activeEditor = vscode.window.visibleTextEditors.find( + (editor: vscode.TextEditor) => editor.document.fileName === filePath + ); + return activeEditor ? activeEditor.document : undefined; + }; + private getActivePythonFile = () => { + const editors: vscode.TextEditor[] = vscode.window.visibleTextEditors; + const activeEditor = editors.find( + editor => editor.document.languageId === LANGUAGE_VARS.PYTHON.ID + ); + if (activeEditor) { + this.currentTextDocument = activeEditor.document; + } + return activeEditor ? activeEditor.document.fileName : ""; + }; +} diff --git a/src/service/messagingService.ts b/Source/service/messagingService.ts similarity index 100% rename from src/service/messagingService.ts rename to Source/service/messagingService.ts diff --git a/src/service/setupService.ts b/Source/service/setupService.ts similarity index 97% rename from src/service/setupService.ts rename to Source/service/setupService.ts index 04c757a72..f5c80e037 100644 --- a/src/service/setupService.ts +++ b/Source/service/setupService.ts @@ -1,576 +1,576 @@ -import * as fs from "fs"; -import * as os from "os"; -import * as path from "path"; -import * as vscode from "vscode"; -import { - CONFIG, - CONSTANTS, - DialogResponses, - GLOBAL_ENV_VARS, - HELPER_FILES, - TelemetryEventName, - VERSIONS, -} from "../constants"; -import { - checkConfig, - createEscapedPath, - exec, - getConfig, - getPathToScript, - showPrivacyModal, -} from "../extension_utils/utils"; -import TelemetryAI from "../telemetry/telemetryAI"; - -export class SetupService { - private telemetryAI: TelemetryAI; - - constructor(telemetryAI: TelemetryAI) { - this.telemetryAI = telemetryAI; - } - - public setupEnv = async ( - context: vscode.ExtensionContext, - needsResponse: boolean = false - ) => { - const originalPythonExecutablePath = await this.getCurrentPythonExecutablePath(); - if (originalPythonExecutablePath === "") { - return; - } - let pythonExecutablePath = originalPythonExecutablePath; - const pythonExecutableName: string = - os.platform() === "win32" - ? HELPER_FILES.PYTHON_EXE - : HELPER_FILES.PYTHON; - - if ( - !(await this.areDependenciesInstalled( - context, - pythonExecutablePath - )) - ) { - // environment needs to install dependencies - if (!(await this.checkIfVenv(context, pythonExecutablePath))) { - const pythonExecutablePathVenv = await this.getPythonVenv( - context, - pythonExecutableName - ); - if (await this.hasVenv(context)) { - // venv in extention exists with wrong dependencies - - if ( - !(await this.areDependenciesInstalled( - context, - pythonExecutablePathVenv - )) - ) { - pythonExecutablePath = await this.installDependenciesWrapper( - context, - pythonExecutablePathVenv, - pythonExecutablePath - ); - } else { - pythonExecutablePath = pythonExecutablePathVenv; - } - } else { - pythonExecutablePath = await this.promptInstallVenv( - context, - originalPythonExecutablePath, - pythonExecutableName - ); - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INSTALL_VENV - ); - } - - if (pythonExecutablePath === pythonExecutablePathVenv) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.UPDATED_TO_EXTENSION_VENV - ); - vscode.workspace - .getConfiguration() - .update(CONFIG.PYTHON_PATH, pythonExecutablePath); - } - } else { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_HAS_VENV - ); - } - if (pythonExecutablePath === originalPythonExecutablePath) { - // going with original interpreter, either because - // already in venv or error in creating custom venv - if (checkConfig(CONFIG.SHOW_DEPENDENCY_INSTALL)) { - await vscode.window - .showInformationMessage( - CONSTANTS.INFO.INSTALL_PYTHON_DEPS, - DialogResponses.INSTALL_NOW, - DialogResponses.DONT_INSTALL - ) - .then( - async ( - installChoice: vscode.MessageItem | undefined - ) => { - if ( - installChoice === - DialogResponses.INSTALL_NOW - ) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL - ); - await this.installDependenciesWrapper( - context, - pythonExecutablePath - ); - } else { - await vscode.window - .showInformationMessage( - CONSTANTS.INFO.ARE_YOU_SURE, - DialogResponses.INSTALL_NOW, - DialogResponses.DONT_INSTALL - ) - .then( - async ( - installChoice2: - | vscode.MessageItem - | undefined - ) => { - if ( - installChoice2 === - DialogResponses.INSTALL_NOW - ) { - await this.installDependenciesWrapper( - context, - pythonExecutablePath - ); - } else { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_NO_DEPS_INSTALLED - ); - } - } - ); - } - } - ); - } - } - } else if (needsResponse) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.ALREADY_SUCCESSFUL_INSTALL - ); - } - - return pythonExecutablePath; - }; - - public getCurrentPythonExecutablePath = async ( - isTryingPython3: boolean = false - ) => { - let originalPythonExecutablePath = ""; - const systemPythonVar = isTryingPython3 - ? GLOBAL_ENV_VARS.PYTHON3 - : GLOBAL_ENV_VARS.PYTHON; - // try to get name from interpreter - try { - originalPythonExecutablePath = getConfig(CONFIG.PYTHON_PATH); - } catch (err) { - originalPythonExecutablePath = systemPythonVar; - } - - if ( - originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON3 || - originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON || - originalPythonExecutablePath === "" - ) { - // catching any instance where the python path needs to be resolved - // from an system variable - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_AUTO_RESOLVE_PYTHON_PATH - ); - try { - const { stdout } = await this.executePythonCommand( - systemPythonVar, - `-c "import sys; print(sys.executable)"` - ); - originalPythonExecutablePath = stdout.trim(); - } catch (err) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_NO_PYTHON_PATH - ); - if (isTryingPython3) { - // if trying python3 failed, that means that BOTH - // python and python3 failed as system variables - // so that means that there is no python - vscode.window - .showErrorMessage( - CONSTANTS.ERROR.NO_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.INSTALL_PYTHON) { - const okAction = () => { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON - ); - open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON - ); - } - }); - // no python installed, cannot get path - return ""; - } else { - // "python" didn't resolve to anything, trying "python3" - return this.getCurrentPythonExecutablePath(true); - } - } - if ( - !(await this.validatePythonVersion( - originalPythonExecutablePath - )) - ) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_VER - ); - if (isTryingPython3) { - // if we're trying python3, it means we already tried python and it - // all doesn't seem to work, but it got this far, so it means that - // their system python3 version is still not above 3.7, but they - // don't have a path selected. - vscode.window - .showInformationMessage( - CONSTANTS.ERROR.INVALID_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON - ) - .then( - (installChoice: vscode.MessageItem | undefined) => { - if ( - installChoice === - DialogResponses.INSTALL_PYTHON - ) { - const okAction = () => { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON - ); - open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO - .THIRD_PARTY_WEBSITE_PYTHON - ); - } - } - ); - return ""; - } else { - // otherwise, we ran the "python" system variable - // and we can try python3 - return this.getCurrentPythonExecutablePath(true); - } - } - } else { - // should only be applicable if the user defined their own path - - // fix path to be absolute - if (!path.isAbsolute(originalPythonExecutablePath)) { - originalPythonExecutablePath = path.join( - vscode.workspace.rootPath, - originalPythonExecutablePath - ); - } - - if (!fs.existsSync(originalPythonExecutablePath)) { - await vscode.window.showErrorMessage( - CONSTANTS.ERROR.BAD_PYTHON_PATH - ); - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_INTERPRETER_PATH - ); - return ""; - } - - if ( - !(await this.validatePythonVersion( - originalPythonExecutablePath - )) - ) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_VER - ); - vscode.window - .showInformationMessage( - CONSTANTS.ERROR.INVALID_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON - ) - .then((installChoice: vscode.MessageItem | undefined) => { - if (installChoice === DialogResponses.INSTALL_PYTHON) { - const okAction = () => { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON - ); - open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON - ); - } - }); - return ""; - } - } - - return originalPythonExecutablePath; - }; - - public isPipInstalled = async (pythonExecutablePath: string) => { - try { - await this.executePythonCommand(pythonExecutablePath, " -m pip"); - return true; - } catch (err) { - vscode.window - .showErrorMessage( - `We found that you may not have Pip installed on your interpreter at ${pythonExecutablePath}, please install it and try again.`, - DialogResponses.INSTALL_PIP - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.INSTALL_PIP) { - const okAction = () => { - open(CONSTANTS.LINKS.DOWNLOAD_PIP); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PIP - ); - } - }); - return false; - } - }; - - public checkIfVenv = async ( - context: vscode.ExtensionContext, - pythonExecutablePath: string - ) => { - const venvCheckerPath: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.CHECK_IF_VENV_PY - ); - const { stdout } = await this.executePythonCommand( - pythonExecutablePath, - `"${venvCheckerPath}"` - ); - return stdout.trim() === "1"; - }; - - public executePythonCommand = async ( - pythonExecutablePath: string, - command: string - ) => { - return exec(`${createEscapedPath(pythonExecutablePath)} ${command}`); - }; - - public validatePythonVersion = async (pythonExecutablePath: string) => { - const { stdout } = await this.executePythonCommand( - pythonExecutablePath, - "--version" - ); - if (stdout < VERSIONS.MIN_PY_VERSION) { - return false; - } else { - return true; - } - }; - - public hasVenv = async (context: vscode.ExtensionContext) => { - const pathToEnv: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR - ); - - return fs.existsSync(pathToEnv); - }; - - public promptInstallVenv = ( - context: vscode.ExtensionContext, - pythonExecutable: string, - pythonExecutableName: string - ) => { - return vscode.window - .showInformationMessage( - CONSTANTS.INFO.INSTALL_PYTHON_VENV, - DialogResponses.YES, - DialogResponses.NO - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.YES) { - return this.installPythonVenv( - context, - pythonExecutable, - pythonExecutableName - ); - } else { - // return pythonExecutable, notifying the caller - // that the user was unwilling to create venv - // and by default, this will trigger the extension to - // try using pythonExecutable - return pythonExecutable; - } - }); - }; - - public getPythonVenv = async ( - context: vscode.ExtensionContext, - pythonExecutableName: string - ) => { - const subFolder = os.platform() === "win32" ? "Scripts" : "bin"; - - return getPathToScript( - context, - path.join(CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR, subFolder), - pythonExecutableName - ); - }; - - public installPythonVenv = async ( - context: vscode.ExtensionContext, - pythonExecutable: string, - pythonExecutableName: string - ) => { - const pathToEnv: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR - ); - - vscode.window.showInformationMessage( - CONSTANTS.INFO.INSTALLING_PYTHON_VENV - ); - - const pythonPath: string = await this.getPythonVenv( - context, - pythonExecutableName - ); - - try { - // make venv - // run command to download dependencies to out/python_libs - await this.executePythonCommand( - pythonExecutable, - `-m venv "${pathToEnv}"` - ); - } catch (err) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_VENV_CREATION_ERR - ); - vscode.window - .showErrorMessage( - `Virtual environment for download could not be completed. Using original interpreter at: ${pythonExecutable}. If you're on Linux, try running "sudo apt-get install python3-venv".`, - DialogResponses.READ_INSTALL_MD - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.READ_INSTALL_MD) { - open(CONSTANTS.LINKS.INSTALL); - } - }); - - console.error(err); - - return pythonExecutable; - } - - return this.installDependenciesWrapper( - context, - pythonPath, - pythonExecutable - ); - }; - - public areDependenciesInstalled = async ( - context: vscode.ExtensionContext, - pythonPath: string - ) => { - const dependencyCheckerPath: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.CHECK_PYTHON_DEPENDENCIES - ); - try { - // python script will throw exception - // if not all dependencies are downloaded - const { stdout } = await this.executePythonCommand( - pythonPath, - `"${dependencyCheckerPath}"` - ); - - // output for debugging purposes - console.info(stdout); - return true; - } catch (err) { - return false; - } - }; - - public installDependencies = async ( - context: vscode.ExtensionContext, - pythonPath: string - ) => { - const requirementsPyInstallPath: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - "install_dependencies.py" - ); - - if (!this.isPipInstalled(pythonPath)) { - this.telemetryAI.trackFeatureUsage(TelemetryEventName.SETUP_NO_PIP); - return false; - } - - try { - const { stdout } = await this.executePythonCommand( - pythonPath, - `"${requirementsPyInstallPath}"` - ); - console.log(`DSE ${stdout}`); - vscode.window.showInformationMessage( - CONSTANTS.INFO.SUCCESSFUL_INSTALL - ); - return true; - } catch (err) { - console.log(`DSE ${err}`); - return false; - } - }; - - public installDependenciesWrapper = async ( - context: vscode.ExtensionContext, - pythonPath: string, - backupPythonPath: string = "" - ) => { - let errMessage = CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR; - if (backupPythonPath !== "") { - errMessage = `${errMessage} Using original interpreter at: ${backupPythonPath}.`; - } - if (!(await this.installDependencies(context, pythonPath))) { - vscode.window - .showErrorMessage( - CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR, - DialogResponses.READ_INSTALL_MD - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.READ_INSTALL_MD) { - open(CONSTANTS.LINKS.INSTALL); - } - }); - - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DEP_INSTALL_FAIL - ); - return backupPythonPath; - } - return pythonPath; - }; -} +import * as fs from "fs"; +import * as os from "os"; +import * as path from "path"; +import * as vscode from "vscode"; +import { + CONFIG, + CONSTANTS, + DialogResponses, + GLOBAL_ENV_VARS, + HELPER_FILES, + TelemetryEventName, + VERSIONS, +} from "../constants"; +import { + checkConfig, + createEscapedPath, + exec, + getConfig, + getPathToScript, + showPrivacyModal, +} from "../extension_utils/utils"; +import TelemetryAI from "../telemetry/telemetryAI"; + +export class SetupService { + private telemetryAI: TelemetryAI; + + constructor(telemetryAI: TelemetryAI) { + this.telemetryAI = telemetryAI; + } + + public setupEnv = async ( + context: vscode.ExtensionContext, + needsResponse: boolean = false + ) => { + const originalPythonExecutablePath = await this.getCurrentPythonExecutablePath(); + if (originalPythonExecutablePath === "") { + return; + } + let pythonExecutablePath = originalPythonExecutablePath; + const pythonExecutableName: string = + os.platform() === "win32" + ? HELPER_FILES.PYTHON_EXE + : HELPER_FILES.PYTHON; + + if ( + !(await this.areDependenciesInstalled( + context, + pythonExecutablePath + )) + ) { + // environment needs to install dependencies + if (!(await this.checkIfVenv(context, pythonExecutablePath))) { + const pythonExecutablePathVenv = await this.getPythonVenv( + context, + pythonExecutableName + ); + if (await this.hasVenv(context)) { + // venv in extention exists with wrong dependencies + + if ( + !(await this.areDependenciesInstalled( + context, + pythonExecutablePathVenv + )) + ) { + pythonExecutablePath = await this.installDependenciesWrapper( + context, + pythonExecutablePathVenv, + pythonExecutablePath + ); + } else { + pythonExecutablePath = pythonExecutablePathVenv; + } + } else { + pythonExecutablePath = await this.promptInstallVenv( + context, + originalPythonExecutablePath, + pythonExecutableName + ); + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INSTALL_VENV + ); + } + + if (pythonExecutablePath === pythonExecutablePathVenv) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.UPDATED_TO_EXTENSION_VENV + ); + vscode.workspace + .getConfiguration() + .update(CONFIG.PYTHON_PATH, pythonExecutablePath); + } + } else { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_HAS_VENV + ); + } + if (pythonExecutablePath === originalPythonExecutablePath) { + // going with original interpreter, either because + // already in venv or error in creating custom venv + if (checkConfig(CONFIG.SHOW_DEPENDENCY_INSTALL)) { + await vscode.window + .showInformationMessage( + CONSTANTS.INFO.INSTALL_PYTHON_DEPS, + DialogResponses.INSTALL_NOW, + DialogResponses.DONT_INSTALL + ) + .then( + async ( + installChoice: vscode.MessageItem | undefined + ) => { + if ( + installChoice === + DialogResponses.INSTALL_NOW + ) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL + ); + await this.installDependenciesWrapper( + context, + pythonExecutablePath + ); + } else { + await vscode.window + .showInformationMessage( + CONSTANTS.INFO.ARE_YOU_SURE, + DialogResponses.INSTALL_NOW, + DialogResponses.DONT_INSTALL + ) + .then( + async ( + installChoice2: + | vscode.MessageItem + | undefined + ) => { + if ( + installChoice2 === + DialogResponses.INSTALL_NOW + ) { + await this.installDependenciesWrapper( + context, + pythonExecutablePath + ); + } else { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_NO_DEPS_INSTALLED + ); + } + } + ); + } + } + ); + } + } + } else if (needsResponse) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.ALREADY_SUCCESSFUL_INSTALL + ); + } + + return pythonExecutablePath; + }; + + public getCurrentPythonExecutablePath = async ( + isTryingPython3: boolean = false + ) => { + let originalPythonExecutablePath = ""; + const systemPythonVar = isTryingPython3 + ? GLOBAL_ENV_VARS.PYTHON3 + : GLOBAL_ENV_VARS.PYTHON; + // try to get name from interpreter + try { + originalPythonExecutablePath = getConfig(CONFIG.PYTHON_PATH); + } catch (err) { + originalPythonExecutablePath = systemPythonVar; + } + + if ( + originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON3 || + originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON || + originalPythonExecutablePath === "" + ) { + // catching any instance where the python path needs to be resolved + // from an system variable + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_AUTO_RESOLVE_PYTHON_PATH + ); + try { + const { stdout } = await this.executePythonCommand( + systemPythonVar, + `-c "import sys; print(sys.executable)"` + ); + originalPythonExecutablePath = stdout.trim(); + } catch (err) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_NO_PYTHON_PATH + ); + if (isTryingPython3) { + // if trying python3 failed, that means that BOTH + // python and python3 failed as system variables + // so that means that there is no python + vscode.window + .showErrorMessage( + CONSTANTS.ERROR.NO_PYTHON_PATH, + DialogResponses.INSTALL_PYTHON + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.INSTALL_PYTHON) { + const okAction = () => { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DOWNLOAD_PYTHON + ); + open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON + ); + } + }); + // no python installed, cannot get path + return ""; + } else { + // "python" didn't resolve to anything, trying "python3" + return this.getCurrentPythonExecutablePath(true); + } + } + if ( + !(await this.validatePythonVersion( + originalPythonExecutablePath + )) + ) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INVALID_PYTHON_VER + ); + if (isTryingPython3) { + // if we're trying python3, it means we already tried python and it + // all doesn't seem to work, but it got this far, so it means that + // their system python3 version is still not above 3.7, but they + // don't have a path selected. + vscode.window + .showInformationMessage( + CONSTANTS.ERROR.INVALID_PYTHON_PATH, + DialogResponses.INSTALL_PYTHON + ) + .then( + (installChoice: vscode.MessageItem | undefined) => { + if ( + installChoice === + DialogResponses.INSTALL_PYTHON + ) { + const okAction = () => { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DOWNLOAD_PYTHON + ); + open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO + .THIRD_PARTY_WEBSITE_PYTHON + ); + } + } + ); + return ""; + } else { + // otherwise, we ran the "python" system variable + // and we can try python3 + return this.getCurrentPythonExecutablePath(true); + } + } + } else { + // should only be applicable if the user defined their own path + + // fix path to be absolute + if (!path.isAbsolute(originalPythonExecutablePath)) { + originalPythonExecutablePath = path.join( + vscode.workspace.rootPath, + originalPythonExecutablePath + ); + } + + if (!fs.existsSync(originalPythonExecutablePath)) { + await vscode.window.showErrorMessage( + CONSTANTS.ERROR.BAD_PYTHON_PATH + ); + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INVALID_PYTHON_INTERPRETER_PATH + ); + return ""; + } + + if ( + !(await this.validatePythonVersion( + originalPythonExecutablePath + )) + ) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INVALID_PYTHON_VER + ); + vscode.window + .showInformationMessage( + CONSTANTS.ERROR.INVALID_PYTHON_PATH, + DialogResponses.INSTALL_PYTHON + ) + .then((installChoice: vscode.MessageItem | undefined) => { + if (installChoice === DialogResponses.INSTALL_PYTHON) { + const okAction = () => { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DOWNLOAD_PYTHON + ); + open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON + ); + } + }); + return ""; + } + } + + return originalPythonExecutablePath; + }; + + public isPipInstalled = async (pythonExecutablePath: string) => { + try { + await this.executePythonCommand(pythonExecutablePath, " -m pip"); + return true; + } catch (err) { + vscode.window + .showErrorMessage( + `We found that you may not have Pip installed on your interpreter at ${pythonExecutablePath}, please install it and try again.`, + DialogResponses.INSTALL_PIP + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.INSTALL_PIP) { + const okAction = () => { + open(CONSTANTS.LINKS.DOWNLOAD_PIP); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PIP + ); + } + }); + return false; + } + }; + + public checkIfVenv = async ( + context: vscode.ExtensionContext, + pythonExecutablePath: string + ) => { + const venvCheckerPath: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.CHECK_IF_VENV_PY + ); + const { stdout } = await this.executePythonCommand( + pythonExecutablePath, + `"${venvCheckerPath}"` + ); + return stdout.trim() === "1"; + }; + + public executePythonCommand = async ( + pythonExecutablePath: string, + command: string + ) => { + return exec(`${createEscapedPath(pythonExecutablePath)} ${command}`); + }; + + public validatePythonVersion = async (pythonExecutablePath: string) => { + const { stdout } = await this.executePythonCommand( + pythonExecutablePath, + "--version" + ); + if (stdout < VERSIONS.MIN_PY_VERSION) { + return false; + } else { + return true; + } + }; + + public hasVenv = async (context: vscode.ExtensionContext) => { + const pathToEnv: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR + ); + + return fs.existsSync(pathToEnv); + }; + + public promptInstallVenv = ( + context: vscode.ExtensionContext, + pythonExecutable: string, + pythonExecutableName: string + ) => { + return vscode.window + .showInformationMessage( + CONSTANTS.INFO.INSTALL_PYTHON_VENV, + DialogResponses.YES, + DialogResponses.NO + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.YES) { + return this.installPythonVenv( + context, + pythonExecutable, + pythonExecutableName + ); + } else { + // return pythonExecutable, notifying the caller + // that the user was unwilling to create venv + // and by default, this will trigger the extension to + // try using pythonExecutable + return pythonExecutable; + } + }); + }; + + public getPythonVenv = async ( + context: vscode.ExtensionContext, + pythonExecutableName: string + ) => { + const subFolder = os.platform() === "win32" ? "Scripts" : "bin"; + + return getPathToScript( + context, + path.join(CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR, subFolder), + pythonExecutableName + ); + }; + + public installPythonVenv = async ( + context: vscode.ExtensionContext, + pythonExecutable: string, + pythonExecutableName: string + ) => { + const pathToEnv: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR + ); + + vscode.window.showInformationMessage( + CONSTANTS.INFO.INSTALLING_PYTHON_VENV + ); + + const pythonPath: string = await this.getPythonVenv( + context, + pythonExecutableName + ); + + try { + // make venv + // run command to download dependencies to out/python_libs + await this.executePythonCommand( + pythonExecutable, + `-m venv "${pathToEnv}"` + ); + } catch (err) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_VENV_CREATION_ERR + ); + vscode.window + .showErrorMessage( + `Virtual environment for download could not be completed. Using original interpreter at: ${pythonExecutable}. If you're on Linux, try running "sudo apt-get install python3-venv".`, + DialogResponses.READ_INSTALL_MD + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.READ_INSTALL_MD) { + open(CONSTANTS.LINKS.INSTALL); + } + }); + + console.error(err); + + return pythonExecutable; + } + + return this.installDependenciesWrapper( + context, + pythonPath, + pythonExecutable + ); + }; + + public areDependenciesInstalled = async ( + context: vscode.ExtensionContext, + pythonPath: string + ) => { + const dependencyCheckerPath: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.CHECK_PYTHON_DEPENDENCIES + ); + try { + // python script will throw exception + // if not all dependencies are downloaded + const { stdout } = await this.executePythonCommand( + pythonPath, + `"${dependencyCheckerPath}"` + ); + + // output for debugging purposes + console.info(stdout); + return true; + } catch (err) { + return false; + } + }; + + public installDependencies = async ( + context: vscode.ExtensionContext, + pythonPath: string + ) => { + const requirementsPyInstallPath: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + "install_dependencies.py" + ); + + if (!this.isPipInstalled(pythonPath)) { + this.telemetryAI.trackFeatureUsage(TelemetryEventName.SETUP_NO_PIP); + return false; + } + + try { + const { stdout } = await this.executePythonCommand( + pythonPath, + `"${requirementsPyInstallPath}"` + ); + console.log(`DSE ${stdout}`); + vscode.window.showInformationMessage( + CONSTANTS.INFO.SUCCESSFUL_INSTALL + ); + return true; + } catch (err) { + console.log(`DSE ${err}`); + return false; + } + }; + + public installDependenciesWrapper = async ( + context: vscode.ExtensionContext, + pythonPath: string, + backupPythonPath: string = "" + ) => { + let errMessage = CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR; + if (backupPythonPath !== "") { + errMessage = `${errMessage} Using original interpreter at: ${backupPythonPath}.`; + } + if (!(await this.installDependencies(context, pythonPath))) { + vscode.window + .showErrorMessage( + CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR, + DialogResponses.READ_INSTALL_MD + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.READ_INSTALL_MD) { + open(CONSTANTS.LINKS.INSTALL); + } + }); + + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DEP_INSTALL_FAIL + ); + return backupPythonPath; + } + return pythonPath; + }; +} diff --git a/src/service/telemetryHandlerService.ts b/Source/service/telemetryHandlerService.ts similarity index 100% rename from src/service/telemetryHandlerService.ts rename to Source/service/telemetryHandlerService.ts diff --git a/src/service/webviewService.ts b/Source/service/webviewService.ts similarity index 100% rename from src/service/webviewService.ts rename to Source/service/webviewService.ts diff --git a/src/simulatorDebugConfigurationProvider.ts b/Source/simulatorDebugConfigurationProvider.ts similarity index 100% rename from src/simulatorDebugConfigurationProvider.ts rename to Source/simulatorDebugConfigurationProvider.ts diff --git a/src/telemetry/getPackageInfo.ts b/Source/telemetry/getPackageInfo.ts similarity index 100% rename from src/telemetry/getPackageInfo.ts rename to Source/telemetry/getPackageInfo.ts diff --git a/src/telemetry/telemetryAI.ts b/Source/telemetry/telemetryAI.ts similarity index 100% rename from src/telemetry/telemetryAI.ts rename to Source/telemetry/telemetryAI.ts diff --git a/src/templates/clue_template.py b/Source/templates/clue_template.py similarity index 97% rename from src/templates/clue_template.py rename to Source/templates/clue_template.py index 40719f439..489f21666 100644 --- a/src/templates/clue_template.py +++ b/Source/templates/clue_template.py @@ -1,16 +1,16 @@ -""" -To get started, check out the "Device Simulator Express: Getting Started" command in the command pallete, which you can access with `CMD + SHIFT + P` For Mac and `CTRL + SHIFT + P` for Windows and Linux. - -To learn more about the CLUE and CircuitPython, check this link out: -https://learn.adafruit.com/adafruit-clue/circuitpython - -Find example code for CPX on: -https://blog.adafruit.com/2020/02/12/three-fun-sensor-packed-projects-to-try-on-your-clue-adafruitlearningsystem-adafruit-circuitpython-adafruit/ -""" - -from adafruit_clue import clue - -clue_data = clue.simple_text_display(title="Hello World", title_scale=3) - -while True: - clue_data.show() +""" +To get started, check out the "Device Simulator Express: Getting Started" command in the command pallete, which you can access with `CMD + SHIFT + P` For Mac and `CTRL + SHIFT + P` for Windows and Linux. + +To learn more about the CLUE and CircuitPython, check this link out: +https://learn.adafruit.com/adafruit-clue/circuitpython + +Find example code for CPX on: +https://blog.adafruit.com/2020/02/12/three-fun-sensor-packed-projects-to-try-on-your-clue-adafruitlearningsystem-adafruit-circuitpython-adafruit/ +""" + +from adafruit_clue import clue + +clue_data = clue.simple_text_display(title="Hello World", title_scale=3) + +while True: + clue_data.show() diff --git a/src/templates/cpx_template.py b/Source/templates/cpx_template.py similarity index 97% rename from src/templates/cpx_template.py rename to Source/templates/cpx_template.py index 830b9a8e1..2efc6ba41 100644 --- a/src/templates/cpx_template.py +++ b/Source/templates/cpx_template.py @@ -1,16 +1,16 @@ -""" -To get started, check out the "Device Simulator Express: Getting Started" command in the command pallete, which you can access with `CMD + SHIFT + P` For Mac and `CTRL + SHIFT + P` for Windows and Linux. - -Getting started with CPX and CircuitPython intro on: -https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library - -Find example code for CPX on: -https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples -""" - -# import CPX library -from adafruit_circuitplayground import cp - -while True: - # start your code here - pass +""" +To get started, check out the "Device Simulator Express: Getting Started" command in the command pallete, which you can access with `CMD + SHIFT + P` For Mac and `CTRL + SHIFT + P` for Windows and Linux. + +Getting started with CPX and CircuitPython intro on: +https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library + +Find example code for CPX on: +https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples +""" + +# import CPX library +from adafruit_circuitplayground import cp + +while True: + # start your code here + pass diff --git a/src/templates/microbit_template.py b/Source/templates/microbit_template.py similarity index 97% rename from src/templates/microbit_template.py rename to Source/templates/microbit_template.py index 3c1cfbb8e..35751174d 100644 --- a/src/templates/microbit_template.py +++ b/Source/templates/microbit_template.py @@ -1,11 +1,11 @@ -""" -To get started, check out the "Device Simulator Express: Getting Started" command in the command pallete, which you can access with `CMD + SHIFT + P` For Mac and `CTRL + SHIFT + P` for Windows and Linux. - -Get started with micro:bit and MicroPython on: -https://microbit-micropython.readthedocs.io/en/latest/. -""" - -from microbit import * - -while True: - display.scroll("Hello World!") +""" +To get started, check out the "Device Simulator Express: Getting Started" command in the command pallete, which you can access with `CMD + SHIFT + P` For Mac and `CTRL + SHIFT + P` for Windows and Linux. + +Get started with micro:bit and MicroPython on: +https://microbit-micropython.readthedocs.io/en/latest/. +""" + +from microbit import * + +while True: + display.scroll("Hello World!") diff --git a/src/test/runTest.ts b/Source/test/runTest.ts similarity index 100% rename from src/test/runTest.ts rename to Source/test/runTest.ts diff --git a/src/test/suite/index.ts b/Source/test/suite/index.ts similarity index 100% rename from src/test/suite/index.ts rename to Source/test/suite/index.ts diff --git a/src/usbDetector.ts b/Source/usbDetector.ts similarity index 100% rename from src/usbDetector.ts rename to Source/usbDetector.ts diff --git a/src/view/App.css b/Source/view/App.css similarity index 100% rename from src/view/App.css rename to Source/view/App.css diff --git a/src/view/App.spec.tsx b/Source/view/App.spec.tsx similarity index 100% rename from src/view/App.spec.tsx rename to Source/view/App.spec.tsx diff --git a/src/view/App.tsx b/Source/view/App.tsx similarity index 100% rename from src/view/App.tsx rename to Source/view/App.tsx diff --git a/src/view/__snapshots__/App.spec.tsx.snap b/Source/view/__snapshots__/App.spec.tsx.snap similarity index 100% rename from src/view/__snapshots__/App.spec.tsx.snap rename to Source/view/__snapshots__/App.spec.tsx.snap diff --git a/src/view/components/Button.tsx b/Source/view/components/Button.tsx similarity index 100% rename from src/view/components/Button.tsx rename to Source/view/components/Button.tsx diff --git a/src/view/components/Dropdown.tsx b/Source/view/components/Dropdown.tsx similarity index 100% rename from src/view/components/Dropdown.tsx rename to Source/view/components/Dropdown.tsx diff --git a/src/view/components/clue/Clue.spec.tsx b/Source/view/components/clue/Clue.spec.tsx similarity index 96% rename from src/view/components/clue/Clue.spec.tsx rename to Source/view/components/clue/Clue.spec.tsx index c69b4ebe7..55d065bce 100644 --- a/src/view/components/clue/Clue.spec.tsx +++ b/Source/view/components/clue/Clue.spec.tsx @@ -1,29 +1,29 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { Clue } from "./Clue"; - -describe("Clue component", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); +import * as React from "react"; +import * as ReactDOM from "react-dom"; +import { IntlProvider } from "react-intl"; +import * as testRenderer from "react-test-renderer"; +import { Clue } from "./Clue"; + +describe("Clue component", () => { + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); + + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); +}); diff --git a/src/view/components/clue/Clue.tsx b/Source/view/components/clue/Clue.tsx similarity index 96% rename from src/view/components/clue/Clue.tsx rename to Source/view/components/clue/Clue.tsx index 546f136ee..552ff54c3 100644 --- a/src/view/components/clue/Clue.tsx +++ b/Source/view/components/clue/Clue.tsx @@ -1,158 +1,158 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { - GESTURES_CLUE, - SENSOR_LIST, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, -} from "../../constants"; -import "../../styles/Simulator.css"; -import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; -import { sendMessage } from "../../utils/MessageUtils"; -import { CLUE_TOOLBAR_ICON_ID } from "../toolbar/SensorModalUtils"; -import ToolBar from "../toolbar/ToolBar"; -import { ClueSimulator } from "./ClueSimulator"; - -// Component grouping the functionality for micro:bit functionalities -interface IState { - sensors: { [key: string]: number }; - currentSelectedGesture: string; -} -const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT_R]: 0, - [SENSOR_LIST.LIGHT_G]: 0, - [SENSOR_LIST.LIGHT_B]: 0, - [SENSOR_LIST.LIGHT_C]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - [SENSOR_LIST.HUMIDITY]: 0, - [SENSOR_LIST.PRESSURE]: 1013, - [SENSOR_LIST.PROXIMITY]: 0, - [SENSOR_LIST.GYRO_X]: 0, - [SENSOR_LIST.GYRO_Y]: 0, - [SENSOR_LIST.GYRO_Z]: 0, - [SENSOR_LIST.MAGNET_X]: 0, - [SENSOR_LIST.MAGNET_Y]: 0, - [SENSOR_LIST.MAGNET_Z]: 0, - }, - currentSelectedGesture: GESTURES_CLUE[0], -}; - -export class Clue extends React.Component<{}, IState> { - state = DEFAULT_STATE; - - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; - - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; - updateGesture = (event: React.ChangeEvent) => { - this.setState({ currentSelectedGesture: event.target.value }); - }; - sendGesture = (isActive: boolean) => { - if (this.state.currentSelectedGesture) { - if (isActive) { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: this.state.currentSelectedGesture, - }); - } else { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: "", - }); - } - } - }; -} - -const CLUE_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - label: CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.LEDS, - image: TOOLBAR_SVG.NEO_PIXEL_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.TEMPERATURE, - image: TOOLBAR_SVG.TEMPERATURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.LIGHT, - image: TOOLBAR_SVG.LIGHT_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, - image: TOOLBAR_SVG.MOTION_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.HUMIDITY, - image: TOOLBAR_SVG.HUMIDITY_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.PRESSURE, - image: TOOLBAR_SVG.PRESSURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.PROXIMITY, - image: TOOLBAR_SVG.PROXIMITY_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GESTURE, - image: TOOLBAR_SVG.GESTURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GYROSCOPE, - image: TOOLBAR_SVG.GYROSCOPE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, - image: TOOLBAR_SVG.MAGNET_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GPIO, - image: TOOLBAR_SVG.GPIO_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.SOUND, - image: TOOLBAR_SVG.SOUND_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.SPEAKER, - image: TOOLBAR_SVG.SPEAKER_SVG, - }, -]; +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import * as React from "react"; +import { + GESTURES_CLUE, + SENSOR_LIST, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_MESSAGES, +} from "../../constants"; +import "../../styles/Simulator.css"; +import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; +import { sendMessage } from "../../utils/MessageUtils"; +import { CLUE_TOOLBAR_ICON_ID } from "../toolbar/SensorModalUtils"; +import ToolBar from "../toolbar/ToolBar"; +import { ClueSimulator } from "./ClueSimulator"; + +// Component grouping the functionality for micro:bit functionalities +interface IState { + sensors: { [key: string]: number }; + currentSelectedGesture: string; +} +const DEFAULT_STATE = { + sensors: { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT_R]: 0, + [SENSOR_LIST.LIGHT_G]: 0, + [SENSOR_LIST.LIGHT_B]: 0, + [SENSOR_LIST.LIGHT_C]: 0, + [SENSOR_LIST.MOTION_X]: 0, + [SENSOR_LIST.MOTION_Y]: 0, + [SENSOR_LIST.MOTION_Z]: 0, + [SENSOR_LIST.HUMIDITY]: 0, + [SENSOR_LIST.PRESSURE]: 1013, + [SENSOR_LIST.PROXIMITY]: 0, + [SENSOR_LIST.GYRO_X]: 0, + [SENSOR_LIST.GYRO_Y]: 0, + [SENSOR_LIST.GYRO_Z]: 0, + [SENSOR_LIST.MAGNET_X]: 0, + [SENSOR_LIST.MAGNET_Y]: 0, + [SENSOR_LIST.MAGNET_Z]: 0, + }, + currentSelectedGesture: GESTURES_CLUE[0], +}; + +export class Clue extends React.Component<{}, IState> { + state = DEFAULT_STATE; + + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } + + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + handleMessage = (event: any): void => { + const message = event.data; + + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.RESET: + this.setState({ ...DEFAULT_STATE }); + break; + } + }; + render() { + return ( + + + + + ); + } + updateSensor = (sensor: SENSOR_LIST, value: number) => { + this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); + }; + updateGesture = (event: React.ChangeEvent) => { + this.setState({ currentSelectedGesture: event.target.value }); + }; + sendGesture = (isActive: boolean) => { + if (this.state.currentSelectedGesture) { + if (isActive) { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: this.state.currentSelectedGesture, + }); + } else { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: "", + }); + } + } + }; +} + +const CLUE_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ + { + label: CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, + image: TOOLBAR_SVG.PUSH_BUTTON_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.LEDS, + image: TOOLBAR_SVG.NEO_PIXEL_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.TEMPERATURE, + image: TOOLBAR_SVG.TEMPERATURE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.LIGHT, + image: TOOLBAR_SVG.LIGHT_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, + image: TOOLBAR_SVG.MOTION_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.HUMIDITY, + image: TOOLBAR_SVG.HUMIDITY_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.PRESSURE, + image: TOOLBAR_SVG.PRESSURE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.PROXIMITY, + image: TOOLBAR_SVG.PROXIMITY_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.GESTURE, + image: TOOLBAR_SVG.GESTURE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.GYROSCOPE, + image: TOOLBAR_SVG.GYROSCOPE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, + image: TOOLBAR_SVG.MAGNET_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.GPIO, + image: TOOLBAR_SVG.GPIO_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.SOUND, + image: TOOLBAR_SVG.SOUND_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.SPEAKER, + image: TOOLBAR_SVG.SPEAKER_SVG, + }, +]; diff --git a/src/view/components/clue/ClueImage.tsx b/Source/view/components/clue/ClueImage.tsx similarity index 97% rename from src/view/components/clue/ClueImage.tsx rename to Source/view/components/clue/ClueImage.tsx index 85694d4e0..b3c3edcf2 100644 --- a/src/view/components/clue/ClueImage.tsx +++ b/Source/view/components/clue/ClueImage.tsx @@ -1,156 +1,156 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { BUTTON_CLASSNAME, VIEW_STATE } from "../../constants"; -import CONSTANTS, { BUTTON_STYLING_CLASSES } from "../../constants"; -import { ViewStateContext } from "../../context"; -import { ClueSvg, IRefObject } from "./Clue_svg"; - -interface EventTriggers { - onMouseUp: (event: Event, buttonKey: string) => void; - onMouseDown: (event: Event, buttonKey: string) => void; - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; -} -interface IProps { - eventTriggers: EventTriggers; - displayMessage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; -} - -export enum BUTTONS_KEYS { - BTN_A = "BTN_A", - BTN_B = "BTN_B", - BTN_AB = "BTN_AB", -} -// Displays the SVG and call necessary svg modification. -export class ClueImage extends React.Component { - private svgRef: React.RefObject = React.createRef(); - constructor(props: IProps) { - super(props); - } - componentDidMount() { - const svgElement = this.svgRef.current; - if (svgElement) { - setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); - this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); - } - } - componentDidUpdate() { - if (this.context === VIEW_STATE.PAUSE && this.svgRef.current) { - disableAllButtons(this.svgRef.current.getButtons()); - } else if (this.context === VIEW_STATE.RUNNING && this.svgRef.current) { - setupAllButtons( - this.props.eventTriggers, - this.svgRef.current.getButtons() - ); - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.eventTriggers.onKeyEvent(event, true, event.key); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.eventTriggers.onKeyEvent(event, false, event.key); - }; - render() { - return ( - - ); - } - public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { - const button = this.svgRef.current?.getButtons()[key].current; - if (button) { - button.focus(); - if (isActive) { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.KEYPRESSED - ); - } else { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.DEFAULT - ); - } - button.setAttribute("pressed", `${isActive}`); - button.setAttribute("aria-pressed", `${isActive}`); - } - } -} - -ClueImage.contextType = ViewStateContext; -const setupButton = ( - buttonElement: SVGRectElement, - eventTriggers: EventTriggers, - key: string -) => { - buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); - buttonElement.onmousedown = e => { - buttonElement.focus(); - eventTriggers.onMouseDown(e, key); - }; - buttonElement.onmouseup = e => { - eventTriggers.onMouseUp(e, key); - }; - - buttonElement.onkeydown = e => { - // ensure that the keydown is enter, - // or else it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - eventTriggers.onKeyEvent(e, true, key); - } - }; - buttonElement.onkeyup = e => { - eventTriggers.onKeyEvent(e, false, key); - }; -}; -const setupAllButtons = ( - eventTriggers: EventTriggers, - buttonRefs: IRefObject -) => { - for (const [key, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - setupButton(ref.current, eventTriggers, key); - } - } -}; -const disableAllButtons = (buttonRefs: IRefObject) => { - for (const [, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - // to implement - ref.current.onmousedown = null; - ref.current.onmouseup = null; - ref.current.onkeydown = null; - ref.current.onkeyup = null; - ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); - } - } -}; +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import * as React from "react"; +import { BUTTON_CLASSNAME, VIEW_STATE } from "../../constants"; +import CONSTANTS, { BUTTON_STYLING_CLASSES } from "../../constants"; +import { ViewStateContext } from "../../context"; +import { ClueSvg, IRefObject } from "./Clue_svg"; + +interface EventTriggers { + onMouseUp: (event: Event, buttonKey: string) => void; + onMouseDown: (event: Event, buttonKey: string) => void; + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; +} +interface IProps { + eventTriggers: EventTriggers; + displayMessage: string; + leds: { + neopixel: number[]; + isRedLedOn: boolean; + isWhiteLedOn: boolean; + }; +} + +export enum BUTTONS_KEYS { + BTN_A = "BTN_A", + BTN_B = "BTN_B", + BTN_AB = "BTN_AB", +} +// Displays the SVG and call necessary svg modification. +export class ClueImage extends React.Component { + private svgRef: React.RefObject = React.createRef(); + constructor(props: IProps) { + super(props); + } + componentDidMount() { + const svgElement = this.svgRef.current; + if (svgElement) { + setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); + this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); + } + } + componentDidUpdate() { + if (this.context === VIEW_STATE.PAUSE && this.svgRef.current) { + disableAllButtons(this.svgRef.current.getButtons()); + } else if (this.context === VIEW_STATE.RUNNING && this.svgRef.current) { + setupAllButtons( + this.props.eventTriggers, + this.svgRef.current.getButtons() + ); + } + } + componentWillUnmount() { + window.document.removeEventListener("keydown", this.handleKeyDown); + window.document.removeEventListener("keyup", this.handleKeyUp); + } + setupKeyPresses = ( + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void + ) => { + window.document.addEventListener("keydown", this.handleKeyDown); + window.document.addEventListener("keyup", this.handleKeyUp); + }; + handleKeyDown = (event: KeyboardEvent) => { + const keyEvents = [event.key, event.code]; + // Don't listen to keydown events for the run button, restart button and enter key + if ( + !( + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) + ) + ) { + this.props.eventTriggers.onKeyEvent(event, true, event.key); + } + }; + handleKeyUp = (event: KeyboardEvent) => { + this.props.eventTriggers.onKeyEvent(event, false, event.key); + }; + render() { + return ( + + ); + } + public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { + const button = this.svgRef.current?.getButtons()[key].current; + if (button) { + button.focus(); + if (isActive) { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.KEYPRESSED + ); + } else { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.DEFAULT + ); + } + button.setAttribute("pressed", `${isActive}`); + button.setAttribute("aria-pressed", `${isActive}`); + } + } +} + +ClueImage.contextType = ViewStateContext; +const setupButton = ( + buttonElement: SVGRectElement, + eventTriggers: EventTriggers, + key: string +) => { + buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); + buttonElement.onmousedown = e => { + buttonElement.focus(); + eventTriggers.onMouseDown(e, key); + }; + buttonElement.onmouseup = e => { + eventTriggers.onMouseUp(e, key); + }; + + buttonElement.onkeydown = e => { + // ensure that the keydown is enter, + // or else it may register shortcuts twice + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + eventTriggers.onKeyEvent(e, true, key); + } + }; + buttonElement.onkeyup = e => { + eventTriggers.onKeyEvent(e, false, key); + }; +}; +const setupAllButtons = ( + eventTriggers: EventTriggers, + buttonRefs: IRefObject +) => { + for (const [key, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + setupButton(ref.current, eventTriggers, key); + } + } +}; +const disableAllButtons = (buttonRefs: IRefObject) => { + for (const [, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + // to implement + ref.current.onmousedown = null; + ref.current.onmouseup = null; + ref.current.onkeydown = null; + ref.current.onkeyup = null; + ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); + } + } +}; diff --git a/src/view/components/clue/ClueSimulator.tsx b/Source/view/components/clue/ClueSimulator.tsx similarity index 100% rename from src/view/components/clue/ClueSimulator.tsx rename to Source/view/components/clue/ClueSimulator.tsx diff --git a/src/view/components/clue/Clue_svg.tsx b/Source/view/components/clue/Clue_svg.tsx similarity index 97% rename from src/view/components/clue/Clue_svg.tsx rename to Source/view/components/clue/Clue_svg.tsx index bcbf4e6d2..b67b1f0f9 100644 --- a/src/view/components/clue/Clue_svg.tsx +++ b/Source/view/components/clue/Clue_svg.tsx @@ -1,1184 +1,1184 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { CLUE_LEDS_COLORS, CONSTANTS } from "../../constants"; -import "../../styles/SimulatorSvg.css"; -import svg from "../cpx/Svg_utils"; -import { DEFAULT_CLUE_STATE } from "./ClueSimulator"; -export interface IRefObject { - [key: string]: React.RefObject; -} -interface IProps { - displayImage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; -} -export class ClueSvg extends React.Component { - private svgRef: React.RefObject = React.createRef(); - private ledsRefs = { - neopixel: React.createRef(), - redLed: React.createRef(), - whiteLeds: [ - React.createRef(), - React.createRef(), - ], - }; - private gradientRefs = { - neopixel: React.createRef(), - whiteLed: React.createRef(), - redLed: React.createRef(), - }; - - private buttonRefs: IRefObject = { - BTN_A: React.createRef(), - BTN_B: React.createRef(), - BTN_AB: React.createRef(), - }; - - private displayRef: React.RefObject = React.createRef(); - - public getSvgRef(): React.RefObject { - return this.svgRef; - } - public getButtons(): IRefObject { - return this.buttonRefs; - } - public getDisplayRef(): React.RefObject { - return this.displayRef; - } - componentDidMount() { - this.updateSvg(); - } - componentDidUpdate() { - this.updateSvg(); - } - - render() { - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - - LIGHT - - - GESTURE - - - P - - R - - - O - - - XIMI - - - T - - - Y - - - - - - - - - - - - - - Red LED - - - - - Neopixel - - - - -
- ); - } - private updateSvg() { - this.updateDisplay(); - this.updateNeopixel(); - this.updateLeds(); - } - - private updateDisplay() { - if (this.props.displayImage) { - this.displayRef.current?.setAttribute( - "href", - `data:image/png;base64,${this.props.displayImage}` - ); - } - } - - private updateNeopixel() { - const { neopixel } = this.props.leds; - const rgbColor = `rgb(${neopixel[0] + - (255 - neopixel[0]) * CONSTANTS.LED_TINT_FACTOR}, - ${neopixel[1] + - (255 - neopixel[1]) * CONSTANTS.LED_TINT_FACTOR},${neopixel[2] + - (255 - neopixel[2]) * CONSTANTS.LED_TINT_FACTOR})`; - - this.ledsRefs.neopixel.current?.setAttribute("fill", rgbColor); - - if (neopixel === DEFAULT_CLUE_STATE.leds.neopixel) { - this.gradientRefs.neopixel.current?.setAttribute( - "stop-opacity", - "0" - ); - } else { - this.gradientRefs.neopixel.current?.setAttribute( - "stop-opacity", - "1" - ); - } - this.gradientRefs.neopixel.current?.setAttribute( - "stop-color", - rgbColor - ); - } - private updateLeds() { - // update white led - const { isWhiteLedOn, isRedLedOn } = this.props.leds; - - this.ledsRefs.whiteLeds.map( - (ledRef: React.RefObject) => { - svg.setLed( - isWhiteLedOn, - CLUE_LEDS_COLORS.WHITE_LEDS_OFF, - CLUE_LEDS_COLORS.WHITE_LEDS_ON, - ledRef.current, - this.gradientRefs.whiteLed.current - ); - } - ); - svg.setLed( - isRedLedOn, - CLUE_LEDS_COLORS.RED_LED_OFF, - CLUE_LEDS_COLORS.RED_LED_ON, - this.ledsRefs.redLed.current, - this.gradientRefs.redLed.current - ); - } -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import * as React from "react"; +import { CLUE_LEDS_COLORS, CONSTANTS } from "../../constants"; +import "../../styles/SimulatorSvg.css"; +import svg from "../cpx/Svg_utils"; +import { DEFAULT_CLUE_STATE } from "./ClueSimulator"; +export interface IRefObject { + [key: string]: React.RefObject; +} +interface IProps { + displayImage: string; + leds: { + neopixel: number[]; + isRedLedOn: boolean; + isWhiteLedOn: boolean; + }; +} +export class ClueSvg extends React.Component { + private svgRef: React.RefObject = React.createRef(); + private ledsRefs = { + neopixel: React.createRef(), + redLed: React.createRef(), + whiteLeds: [ + React.createRef(), + React.createRef(), + ], + }; + private gradientRefs = { + neopixel: React.createRef(), + whiteLed: React.createRef(), + redLed: React.createRef(), + }; + + private buttonRefs: IRefObject = { + BTN_A: React.createRef(), + BTN_B: React.createRef(), + BTN_AB: React.createRef(), + }; + + private displayRef: React.RefObject = React.createRef(); + + public getSvgRef(): React.RefObject { + return this.svgRef; + } + public getButtons(): IRefObject { + return this.buttonRefs; + } + public getDisplayRef(): React.RefObject { + return this.displayRef; + } + componentDidMount() { + this.updateSvg(); + } + componentDidUpdate() { + this.updateSvg(); + } + + render() { + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A+B + + + + + + + + + + + LIGHT + + + GESTURE + + + P + + R + + + O + + + XIMI + + + T + + + Y + + + + + + + + + + + + + + Red LED + + + + + Neopixel + + + + +
+ ); + } + private updateSvg() { + this.updateDisplay(); + this.updateNeopixel(); + this.updateLeds(); + } + + private updateDisplay() { + if (this.props.displayImage) { + this.displayRef.current?.setAttribute( + "href", + `data:image/png;base64,${this.props.displayImage}` + ); + } + } + + private updateNeopixel() { + const { neopixel } = this.props.leds; + const rgbColor = `rgb(${neopixel[0] + + (255 - neopixel[0]) * CONSTANTS.LED_TINT_FACTOR}, + ${neopixel[1] + + (255 - neopixel[1]) * CONSTANTS.LED_TINT_FACTOR},${neopixel[2] + + (255 - neopixel[2]) * CONSTANTS.LED_TINT_FACTOR})`; + + this.ledsRefs.neopixel.current?.setAttribute("fill", rgbColor); + + if (neopixel === DEFAULT_CLUE_STATE.leds.neopixel) { + this.gradientRefs.neopixel.current?.setAttribute( + "stop-opacity", + "0" + ); + } else { + this.gradientRefs.neopixel.current?.setAttribute( + "stop-opacity", + "1" + ); + } + this.gradientRefs.neopixel.current?.setAttribute( + "stop-color", + rgbColor + ); + } + private updateLeds() { + // update white led + const { isWhiteLedOn, isRedLedOn } = this.props.leds; + + this.ledsRefs.whiteLeds.map( + (ledRef: React.RefObject) => { + svg.setLed( + isWhiteLedOn, + CLUE_LEDS_COLORS.WHITE_LEDS_OFF, + CLUE_LEDS_COLORS.WHITE_LEDS_ON, + ledRef.current, + this.gradientRefs.whiteLed.current + ); + } + ); + svg.setLed( + isRedLedOn, + CLUE_LEDS_COLORS.RED_LED_OFF, + CLUE_LEDS_COLORS.RED_LED_ON, + this.ledsRefs.redLed.current, + this.gradientRefs.redLed.current + ); + } +} diff --git a/src/view/components/clue/__snapshots__/Clue.spec.tsx.snap b/Source/view/components/clue/__snapshots__/Clue.spec.tsx.snap similarity index 100% rename from src/view/components/clue/__snapshots__/Clue.spec.tsx.snap rename to Source/view/components/clue/__snapshots__/Clue.spec.tsx.snap diff --git a/src/view/components/cpx/Accessibility_utils.ts b/Source/view/components/cpx/Accessibility_utils.ts similarity index 100% rename from src/view/components/cpx/Accessibility_utils.ts rename to Source/view/components/cpx/Accessibility_utils.ts diff --git a/src/view/components/cpx/Cpx.spec.tsx b/Source/view/components/cpx/Cpx.spec.tsx similarity index 96% rename from src/view/components/cpx/Cpx.spec.tsx rename to Source/view/components/cpx/Cpx.spec.tsx index 24c53d551..3b5bdfb6a 100644 --- a/src/view/components/cpx/Cpx.spec.tsx +++ b/Source/view/components/cpx/Cpx.spec.tsx @@ -1,29 +1,29 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { Cpx } from "./Cpx"; - -describe("CPX component", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); +import * as React from "react"; +import * as ReactDOM from "react-dom"; +import { IntlProvider } from "react-intl"; +import * as testRenderer from "react-test-renderer"; +import { Cpx } from "./Cpx"; + +describe("CPX component", () => { + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); + + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); +}); diff --git a/src/view/components/cpx/Cpx.tsx b/Source/view/components/cpx/Cpx.tsx similarity index 96% rename from src/view/components/cpx/Cpx.tsx rename to Source/view/components/cpx/Cpx.tsx index d91728fba..02560623a 100644 --- a/src/view/components/cpx/Cpx.tsx +++ b/Source/view/components/cpx/Cpx.tsx @@ -1,104 +1,104 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { CPX_TOOLBAR_ICON_ID } from "../../components/toolbar/SensorModalUtils"; -import ToolBar from "../../components/toolbar/ToolBar"; -import { SENSOR_LIST, VSCODE_MESSAGES_TO_WEBVIEW } from "../../constants"; -import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; -import Simulator from "./CpxSimulator"; - -// Component grouping the functionality for circuit playground express -const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - }, -}; - -export class Cpx extends React.Component { - state = DEFAULT_STATE; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; - - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; -} - -const CPX_TOOLBAR_BUTTONS: Array<{ label: any; image: any }> = [ - { - image: TOOLBAR_SVG.SLIDER_SWITCH_SVG, - label: CPX_TOOLBAR_ICON_ID.SWITCH, - }, - { - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - label: CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, - }, - { - image: TOOLBAR_SVG.RED_LED_SVG, - label: CPX_TOOLBAR_ICON_ID.RED_LED, - }, - { - image: TOOLBAR_SVG.SOUND_SVG, - label: CPX_TOOLBAR_ICON_ID.SOUND, - }, - { - image: TOOLBAR_SVG.TEMPERATURE_SVG, - label: CPX_TOOLBAR_ICON_ID.TEMPERATURE, - }, - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: CPX_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.NEO_PIXEL_SVG, - label: CPX_TOOLBAR_ICON_ID.NEO_PIXEL, - }, - { - image: TOOLBAR_SVG.SPEAKER_SVG, - label: CPX_TOOLBAR_ICON_ID.SPEAKER, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: CPX_TOOLBAR_ICON_ID.MOTION, - }, - { - image: TOOLBAR_SVG.IR_SVG, - label: CPX_TOOLBAR_ICON_ID.IR, - }, - { - image: TOOLBAR_SVG.GPIO_SVG, - label: CPX_TOOLBAR_ICON_ID.GPIO, - }, -]; +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import * as React from "react"; +import { CPX_TOOLBAR_ICON_ID } from "../../components/toolbar/SensorModalUtils"; +import ToolBar from "../../components/toolbar/ToolBar"; +import { SENSOR_LIST, VSCODE_MESSAGES_TO_WEBVIEW } from "../../constants"; +import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; +import Simulator from "./CpxSimulator"; + +// Component grouping the functionality for circuit playground express +const DEFAULT_STATE = { + sensors: { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT]: 0, + [SENSOR_LIST.MOTION_X]: 0, + [SENSOR_LIST.MOTION_Y]: 0, + [SENSOR_LIST.MOTION_Z]: 0, + }, +}; + +export class Cpx extends React.Component { + state = DEFAULT_STATE; + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } + + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + handleMessage = (event: any): void => { + const message = event.data; + + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.RESET: + this.setState({ ...DEFAULT_STATE }); + break; + } + }; + + render() { + return ( + + + + + ); + } + updateSensor = (sensor: SENSOR_LIST, value: number) => { + this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); + }; +} + +const CPX_TOOLBAR_BUTTONS: Array<{ label: any; image: any }> = [ + { + image: TOOLBAR_SVG.SLIDER_SWITCH_SVG, + label: CPX_TOOLBAR_ICON_ID.SWITCH, + }, + { + image: TOOLBAR_SVG.PUSH_BUTTON_SVG, + label: CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, + }, + { + image: TOOLBAR_SVG.RED_LED_SVG, + label: CPX_TOOLBAR_ICON_ID.RED_LED, + }, + { + image: TOOLBAR_SVG.SOUND_SVG, + label: CPX_TOOLBAR_ICON_ID.SOUND, + }, + { + image: TOOLBAR_SVG.TEMPERATURE_SVG, + label: CPX_TOOLBAR_ICON_ID.TEMPERATURE, + }, + { + image: TOOLBAR_SVG.LIGHT_SVG, + label: CPX_TOOLBAR_ICON_ID.LIGHT, + }, + { + image: TOOLBAR_SVG.NEO_PIXEL_SVG, + label: CPX_TOOLBAR_ICON_ID.NEO_PIXEL, + }, + { + image: TOOLBAR_SVG.SPEAKER_SVG, + label: CPX_TOOLBAR_ICON_ID.SPEAKER, + }, + { + image: TOOLBAR_SVG.MOTION_SVG, + label: CPX_TOOLBAR_ICON_ID.MOTION, + }, + { + image: TOOLBAR_SVG.IR_SVG, + label: CPX_TOOLBAR_ICON_ID.IR, + }, + { + image: TOOLBAR_SVG.GPIO_SVG, + label: CPX_TOOLBAR_ICON_ID.GPIO, + }, +]; diff --git a/src/view/components/cpx/CpxImage.tsx b/Source/view/components/cpx/CpxImage.tsx similarity index 100% rename from src/view/components/cpx/CpxImage.tsx rename to Source/view/components/cpx/CpxImage.tsx diff --git a/src/view/components/cpx/CpxSimulator.tsx b/Source/view/components/cpx/CpxSimulator.tsx similarity index 100% rename from src/view/components/cpx/CpxSimulator.tsx rename to Source/view/components/cpx/CpxSimulator.tsx diff --git a/src/view/components/cpx/Cpx_svg.tsx b/Source/view/components/cpx/Cpx_svg.tsx similarity index 100% rename from src/view/components/cpx/Cpx_svg.tsx rename to Source/view/components/cpx/Cpx_svg.tsx diff --git a/src/view/components/cpx/Cpx_svg_style.tsx b/Source/view/components/cpx/Cpx_svg_style.tsx similarity index 100% rename from src/view/components/cpx/Cpx_svg_style.tsx rename to Source/view/components/cpx/Cpx_svg_style.tsx diff --git a/src/view/components/cpx/Svg_utils.tsx b/Source/view/components/cpx/Svg_utils.tsx similarity index 100% rename from src/view/components/cpx/Svg_utils.tsx rename to Source/view/components/cpx/Svg_utils.tsx diff --git a/src/view/components/cpx/__snapshots__/Cpx.spec.tsx.snap b/Source/view/components/cpx/__snapshots__/Cpx.spec.tsx.snap similarity index 100% rename from src/view/components/cpx/__snapshots__/Cpx.spec.tsx.snap rename to Source/view/components/cpx/__snapshots__/Cpx.spec.tsx.snap diff --git a/src/view/components/microbit/Microbit.spec.tsx b/Source/view/components/microbit/Microbit.spec.tsx similarity index 96% rename from src/view/components/microbit/Microbit.spec.tsx rename to Source/view/components/microbit/Microbit.spec.tsx index e948a1988..386086866 100644 --- a/src/view/components/microbit/Microbit.spec.tsx +++ b/Source/view/components/microbit/Microbit.spec.tsx @@ -1,29 +1,29 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { Microbit } from "./Microbit"; - -describe("Microbit component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); +import * as React from "react"; +import * as ReactDOM from "react-dom"; +import { IntlProvider } from "react-intl"; +import * as testRenderer from "react-test-renderer"; +import { Microbit } from "./Microbit"; + +describe("Microbit component ", () => { + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); + + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); +}); diff --git a/src/view/components/microbit/Microbit.tsx b/Source/view/components/microbit/Microbit.tsx similarity index 96% rename from src/view/components/microbit/Microbit.tsx rename to Source/view/components/microbit/Microbit.tsx index b85565e67..e10c0bfb9 100644 --- a/src/view/components/microbit/Microbit.tsx +++ b/Source/view/components/microbit/Microbit.tsx @@ -1,130 +1,130 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { MICROBIT_TOOLBAR_ICON_ID } from "../../components/toolbar/SensorModalUtils"; -import { - GESTURES_MICROBIT, - SENSOR_LIST, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, -} from "../../constants"; -import "../../styles/Simulator.css"; -import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; -import { sendMessage } from "../../utils/MessageUtils"; -import ToolBar from "../toolbar/ToolBar"; -import { MicrobitSimulator } from "./MicrobitSimulator"; - -// Component grouping the functionality for micro:bit functionalities -interface IState { - sensors: { [key: string]: number }; - currentSelectedGesture?: string; -} -const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - }, - currentSelectedGesture: GESTURES_MICROBIT[0], -}; - -export class Microbit extends React.Component<{}, IState> { - state = DEFAULT_STATE; - - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; - - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; - updateGesture = (event: React.ChangeEvent) => { - this.setState({ currentSelectedGesture: event.target.value }); - }; - sendGesture = (isActive: boolean) => { - if (this.state.currentSelectedGesture) { - if (isActive) { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: this.state.currentSelectedGesture, - }); - } else { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: "", - }); - } - } - }; -} - -const MICROBIT_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, - }, - { - image: TOOLBAR_SVG.RED_LED_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LEDS, - }, - { - image: TOOLBAR_SVG.TEMPERATURE_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, - }, - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - }, - { - image: TOOLBAR_SVG.GESTURE_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.GESTURE, - }, - { - image: TOOLBAR_SVG.GPIO_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.GPIO, - }, - { - image: TOOLBAR_SVG.COMPASS_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.COMPASS, - }, - { - image: TOOLBAR_SVG.SPEAKER_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.SOUND, - }, - { - image: TOOLBAR_SVG.WIRELESS_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.WIRELESS, - }, -]; +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import * as React from "react"; +import { MICROBIT_TOOLBAR_ICON_ID } from "../../components/toolbar/SensorModalUtils"; +import { + GESTURES_MICROBIT, + SENSOR_LIST, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_MESSAGES, +} from "../../constants"; +import "../../styles/Simulator.css"; +import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; +import { sendMessage } from "../../utils/MessageUtils"; +import ToolBar from "../toolbar/ToolBar"; +import { MicrobitSimulator } from "./MicrobitSimulator"; + +// Component grouping the functionality for micro:bit functionalities +interface IState { + sensors: { [key: string]: number }; + currentSelectedGesture?: string; +} +const DEFAULT_STATE = { + sensors: { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT]: 0, + [SENSOR_LIST.MOTION_X]: 0, + [SENSOR_LIST.MOTION_Y]: 0, + [SENSOR_LIST.MOTION_Z]: 0, + }, + currentSelectedGesture: GESTURES_MICROBIT[0], +}; + +export class Microbit extends React.Component<{}, IState> { + state = DEFAULT_STATE; + + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } + + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + handleMessage = (event: any): void => { + const message = event.data; + + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.RESET: + this.setState({ ...DEFAULT_STATE }); + break; + } + }; + render() { + return ( + + + + + ); + } + updateSensor = (sensor: SENSOR_LIST, value: number) => { + this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); + }; + updateGesture = (event: React.ChangeEvent) => { + this.setState({ currentSelectedGesture: event.target.value }); + }; + sendGesture = (isActive: boolean) => { + if (this.state.currentSelectedGesture) { + if (isActive) { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: this.state.currentSelectedGesture, + }); + } else { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: "", + }); + } + } + }; +} + +const MICROBIT_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ + { + image: TOOLBAR_SVG.PUSH_BUTTON_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, + }, + { + image: TOOLBAR_SVG.RED_LED_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.LEDS, + }, + { + image: TOOLBAR_SVG.TEMPERATURE_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, + }, + { + image: TOOLBAR_SVG.LIGHT_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, + }, + { + image: TOOLBAR_SVG.MOTION_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, + }, + { + image: TOOLBAR_SVG.GESTURE_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.GESTURE, + }, + { + image: TOOLBAR_SVG.GPIO_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.GPIO, + }, + { + image: TOOLBAR_SVG.COMPASS_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.COMPASS, + }, + { + image: TOOLBAR_SVG.SPEAKER_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.SOUND, + }, + { + image: TOOLBAR_SVG.WIRELESS_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.WIRELESS, + }, +]; diff --git a/src/view/components/microbit/MicrobitImage.tsx b/Source/view/components/microbit/MicrobitImage.tsx similarity index 97% rename from src/view/components/microbit/MicrobitImage.tsx rename to Source/view/components/microbit/MicrobitImage.tsx index a216dceef..c9e95216a 100644 --- a/src/view/components/microbit/MicrobitImage.tsx +++ b/Source/view/components/microbit/MicrobitImage.tsx @@ -1,166 +1,166 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { BUTTON_CLASSNAME, VIEW_STATE } from "../../constants"; -import CONSTANTS, { BUTTON_STYLING_CLASSES } from "../../constants"; -import { ViewStateContext } from "../../context"; -import { IRefObject, MicrobitSvg } from "./Microbit_svg"; - -interface EventTriggers { - onMouseUp: (event: Event, buttonKey: string) => void; - onMouseDown: (event: Event, buttonKey: string) => void; - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; -} -interface IProps { - eventTriggers: EventTriggers; - leds: number[][]; -} - -export enum BUTTONS_KEYS { - BTN_A = "BTN_A", - BTN_B = "BTN_B", - BTN_AB = "BTN_AB", -} -// Displays the SVG and call necessary svg modification. -export class MicrobitImage extends React.Component { - private svgRef: React.RefObject = React.createRef(); - constructor(props: IProps) { - super(props); - } - componentDidMount() { - const svgElement = this.svgRef.current; - if (svgElement) { - updateAllLeds(this.props.leds, svgElement.getLeds()); - setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); - this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); - } - } - componentDidUpdate() { - if (this.svgRef.current) { - updateAllLeds(this.props.leds, this.svgRef.current.getLeds()); - if (this.context === VIEW_STATE.PAUSE) { - disableAllButtons(this.svgRef.current.getButtons()); - } else if (this.context === VIEW_STATE.RUNNING) { - setupAllButtons( - this.props.eventTriggers, - this.svgRef.current.getButtons() - ); - } - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.eventTriggers.onKeyEvent(event, true, event.key); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.eventTriggers.onKeyEvent(event, false, event.key); - }; - render() { - return ; - } - public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { - const button = this.svgRef.current?.getButtons()[key].current; - if (button) { - button.focus(); - if (isActive) { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.KEYPRESSED - ); - } else { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.DEFAULT - ); - } - button.setAttribute("pressed", `${isActive}`); - button.setAttribute("aria-pressed", `${isActive}`); - } - } -} - -MicrobitImage.contextType = ViewStateContext; -const setupButton = ( - buttonElement: SVGRectElement, - eventTriggers: EventTriggers, - key: string -) => { - buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); - - buttonElement.onmousedown = e => { - buttonElement.focus(); - eventTriggers.onMouseDown(e, key); - }; - buttonElement.onmouseup = e => { - eventTriggers.onMouseUp(e, key); - }; - - buttonElement.onkeydown = e => { - // ensure that the keydown is enter, - // or else it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - eventTriggers.onKeyEvent(e, true, key); - } - }; - buttonElement.onkeyup = e => { - eventTriggers.onKeyEvent(e, false, key); - }; -}; -const setupAllButtons = ( - eventTriggers: EventTriggers, - buttonRefs: IRefObject -) => { - for (const [key, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - setupButton(ref.current, eventTriggers, key); - } - } -}; -const disableAllButtons = (buttonRefs: IRefObject) => { - for (const [, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - // to implement - ref.current.onmousedown = null; - ref.current.onmouseup = null; - ref.current.onkeydown = null; - ref.current.onkeyup = null; - ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); - } - } -}; -const updateAllLeds = ( - leds: number[][], - ledRefs: Array>> -) => { - for (let j = 0; j < leds.length; j++) { - for (let i = 0; i < leds[0].length; i++) { - const ledElement = ledRefs[j][i].current; - if (ledElement) { - setupLed(ledElement, leds[i][j]); - } - } - } -}; -const setupLed = (ledElement: SVGRectElement, brightness: number) => { - ledElement.style.opacity = (brightness / 10).toString(); -}; +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import * as React from "react"; +import { BUTTON_CLASSNAME, VIEW_STATE } from "../../constants"; +import CONSTANTS, { BUTTON_STYLING_CLASSES } from "../../constants"; +import { ViewStateContext } from "../../context"; +import { IRefObject, MicrobitSvg } from "./Microbit_svg"; + +interface EventTriggers { + onMouseUp: (event: Event, buttonKey: string) => void; + onMouseDown: (event: Event, buttonKey: string) => void; + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; +} +interface IProps { + eventTriggers: EventTriggers; + leds: number[][]; +} + +export enum BUTTONS_KEYS { + BTN_A = "BTN_A", + BTN_B = "BTN_B", + BTN_AB = "BTN_AB", +} +// Displays the SVG and call necessary svg modification. +export class MicrobitImage extends React.Component { + private svgRef: React.RefObject = React.createRef(); + constructor(props: IProps) { + super(props); + } + componentDidMount() { + const svgElement = this.svgRef.current; + if (svgElement) { + updateAllLeds(this.props.leds, svgElement.getLeds()); + setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); + this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); + } + } + componentDidUpdate() { + if (this.svgRef.current) { + updateAllLeds(this.props.leds, this.svgRef.current.getLeds()); + if (this.context === VIEW_STATE.PAUSE) { + disableAllButtons(this.svgRef.current.getButtons()); + } else if (this.context === VIEW_STATE.RUNNING) { + setupAllButtons( + this.props.eventTriggers, + this.svgRef.current.getButtons() + ); + } + } + } + componentWillUnmount() { + window.document.removeEventListener("keydown", this.handleKeyDown); + window.document.removeEventListener("keyup", this.handleKeyUp); + } + setupKeyPresses = ( + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void + ) => { + window.document.addEventListener("keydown", this.handleKeyDown); + window.document.addEventListener("keyup", this.handleKeyUp); + }; + handleKeyDown = (event: KeyboardEvent) => { + const keyEvents = [event.key, event.code]; + // Don't listen to keydown events for the run button, restart button and enter key + if ( + !( + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) + ) + ) { + this.props.eventTriggers.onKeyEvent(event, true, event.key); + } + }; + handleKeyUp = (event: KeyboardEvent) => { + this.props.eventTriggers.onKeyEvent(event, false, event.key); + }; + render() { + return ; + } + public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { + const button = this.svgRef.current?.getButtons()[key].current; + if (button) { + button.focus(); + if (isActive) { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.KEYPRESSED + ); + } else { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.DEFAULT + ); + } + button.setAttribute("pressed", `${isActive}`); + button.setAttribute("aria-pressed", `${isActive}`); + } + } +} + +MicrobitImage.contextType = ViewStateContext; +const setupButton = ( + buttonElement: SVGRectElement, + eventTriggers: EventTriggers, + key: string +) => { + buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); + + buttonElement.onmousedown = e => { + buttonElement.focus(); + eventTriggers.onMouseDown(e, key); + }; + buttonElement.onmouseup = e => { + eventTriggers.onMouseUp(e, key); + }; + + buttonElement.onkeydown = e => { + // ensure that the keydown is enter, + // or else it may register shortcuts twice + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + eventTriggers.onKeyEvent(e, true, key); + } + }; + buttonElement.onkeyup = e => { + eventTriggers.onKeyEvent(e, false, key); + }; +}; +const setupAllButtons = ( + eventTriggers: EventTriggers, + buttonRefs: IRefObject +) => { + for (const [key, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + setupButton(ref.current, eventTriggers, key); + } + } +}; +const disableAllButtons = (buttonRefs: IRefObject) => { + for (const [, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + // to implement + ref.current.onmousedown = null; + ref.current.onmouseup = null; + ref.current.onkeydown = null; + ref.current.onkeyup = null; + ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); + } + } +}; +const updateAllLeds = ( + leds: number[][], + ledRefs: Array>> +) => { + for (let j = 0; j < leds.length; j++) { + for (let i = 0; i < leds[0].length; i++) { + const ledElement = ledRefs[j][i].current; + if (ledElement) { + setupLed(ledElement, leds[i][j]); + } + } + } +}; +const setupLed = (ledElement: SVGRectElement, brightness: number) => { + ledElement.style.opacity = (brightness / 10).toString(); +}; diff --git a/src/view/components/microbit/MicrobitSimulator.tsx b/Source/view/components/microbit/MicrobitSimulator.tsx similarity index 97% rename from src/view/components/microbit/MicrobitSimulator.tsx rename to Source/view/components/microbit/MicrobitSimulator.tsx index d3507710c..467efcaaa 100644 --- a/src/view/components/microbit/MicrobitSimulator.tsx +++ b/Source/view/components/microbit/MicrobitSimulator.tsx @@ -1,259 +1,259 @@ -import * as React from "react"; -import { - AB_BUTTONS_KEYS, - CONSTANTS, - DEVICE_LIST_KEY, - VIEW_STATE, - WEBVIEW_MESSAGES, -} from "../../constants"; -import { ViewStateContext } from "../../context"; -import PlayLogo from "../../svgs/play_svg"; -import StopLogo from "../../svgs/stop_svg"; -import { sendMessage } from "../../utils/MessageUtils"; -import ActionBar from "../simulator/ActionBar"; -import { BUTTONS_KEYS, MicrobitImage } from "./MicrobitImage"; - -const DEFAULT_MICROBIT_STATE: IMicrobitState = { - leds: [ - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - ], - buttons: { button_a: false, button_b: false }, -}; - -interface IState { - active_editors: string[]; - running_file?: string; - currently_selected_file: string; - play_button: boolean; - selected_file: string; - microbit: IMicrobitState; - sendGesture?: (isActive: boolean) => void; -} - -interface IMicrobitState { - leds: number[][]; - buttons: { button_a: boolean; button_b: boolean }; -} -export class MicrobitSimulator extends React.Component { - private imageRef: React.RefObject = React.createRef(); - constructor() { - super({}); - this.state = { - microbit: DEFAULT_MICROBIT_STATE, - play_button: false, - selected_file: "", - active_editors: [], - running_file: undefined, - currently_selected_file: "", - }; - this.onKeyEvent = this.onKeyEvent.bind(this); - } - handleMessage = (event: any): void => { - const message = event.data; - - if (message.active_device !== DEVICE_LIST_KEY.MICROBIT) { - return; - } - - switch (message.command) { - case "reset-state": - this.setState({ - microbit: DEFAULT_MICROBIT_STATE, - play_button: false, - }); - break; - case "set-state": - this.setState({ - microbit: { - ...this.state.microbit, - leds: message.state.leds, - }, - }); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - }); - break; - case "visible-editors": - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } - - break; - } - }; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } - - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
-
- -
- -
- ); - } - - protected togglePlayClick = () => { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - }; - - protected refreshSimulatorClick = () => { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - }; - protected handleButtonClick = (key: string, isActive: boolean) => { - let newButtonState = this.state.microbit.buttons; - switch (key) { - case AB_BUTTONS_KEYS.BTN_A: - newButtonState.button_a = isActive; - break; - case AB_BUTTONS_KEYS.BTN_B: - newButtonState.button_b = isActive; - break; - case AB_BUTTONS_KEYS.BTN_AB: - newButtonState = { - button_a: isActive, - button_b: isActive, - }; - break; - } - sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); - this.setState({ - microbit: { - ...this.state.microbit, - buttons: newButtonState, - }, - }); - }; - - protected onMouseUp = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, false); - }; - - protected onMouseDown = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, true); - }; - - protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { - event.stopPropagation(); - if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(key, active); - if (key === BUTTONS_KEYS.BTN_A) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if (key === BUTTONS_KEYS.BTN_B) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if (key === BUTTONS_KEYS.BTN_AB) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); - - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); - - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); - - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } - } -} -MicrobitSimulator.contextType = ViewStateContext; +import * as React from "react"; +import { + AB_BUTTONS_KEYS, + CONSTANTS, + DEVICE_LIST_KEY, + VIEW_STATE, + WEBVIEW_MESSAGES, +} from "../../constants"; +import { ViewStateContext } from "../../context"; +import PlayLogo from "../../svgs/play_svg"; +import StopLogo from "../../svgs/stop_svg"; +import { sendMessage } from "../../utils/MessageUtils"; +import ActionBar from "../simulator/ActionBar"; +import { BUTTONS_KEYS, MicrobitImage } from "./MicrobitImage"; + +const DEFAULT_MICROBIT_STATE: IMicrobitState = { + leds: [ + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + ], + buttons: { button_a: false, button_b: false }, +}; + +interface IState { + active_editors: string[]; + running_file?: string; + currently_selected_file: string; + play_button: boolean; + selected_file: string; + microbit: IMicrobitState; + sendGesture?: (isActive: boolean) => void; +} + +interface IMicrobitState { + leds: number[][]; + buttons: { button_a: boolean; button_b: boolean }; +} +export class MicrobitSimulator extends React.Component { + private imageRef: React.RefObject = React.createRef(); + constructor() { + super({}); + this.state = { + microbit: DEFAULT_MICROBIT_STATE, + play_button: false, + selected_file: "", + active_editors: [], + running_file: undefined, + currently_selected_file: "", + }; + this.onKeyEvent = this.onKeyEvent.bind(this); + } + handleMessage = (event: any): void => { + const message = event.data; + + if (message.active_device !== DEVICE_LIST_KEY.MICROBIT) { + return; + } + + switch (message.command) { + case "reset-state": + this.setState({ + microbit: DEFAULT_MICROBIT_STATE, + play_button: false, + }); + break; + case "set-state": + this.setState({ + microbit: { + ...this.state.microbit, + leds: message.state.leds, + }, + }); + break; + case "activate-play": + const newRunningFile = this.state.currently_selected_file; + this.setState({ + play_button: !this.state.play_button, + running_file: newRunningFile, + }); + break; + case "visible-editors": + this.setState({ + active_editors: message.state.activePythonEditors, + }); + break; + case "current-file": + if (this.state.play_button) { + this.setState({ + currently_selected_file: message.state.running_file, + }); + } else { + this.setState({ + running_file: message.state.running_file, + currently_selected_file: message.state.running_file, + }); + } + + break; + } + }; + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } + componentWillUnmount() { + window.removeEventListener("message", this.handleMessage); + } + + render() { + const playStopImage = this.state.play_button ? StopLogo : PlayLogo; + const playStopLabel = this.state.play_button ? "stop" : "play"; + return ( +
+
+ {this.state.running_file && this.state.play_button + ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) + : CONSTANTS.FILES_PLACEHOLDER} +
+
+ +
+ +
+ ); + } + + protected togglePlayClick = () => { + const button = + window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || + window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { + selected_file: this.state.selected_file, + state: !this.state.play_button, + }); + }; + + protected refreshSimulatorClick = () => { + const button = window.document.getElementById( + CONSTANTS.ID_NAME.REFRESH_BUTTON + ); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); + }; + protected handleButtonClick = (key: string, isActive: boolean) => { + let newButtonState = this.state.microbit.buttons; + switch (key) { + case AB_BUTTONS_KEYS.BTN_A: + newButtonState.button_a = isActive; + break; + case AB_BUTTONS_KEYS.BTN_B: + newButtonState.button_b = isActive; + break; + case AB_BUTTONS_KEYS.BTN_AB: + newButtonState = { + button_a: isActive, + button_b: isActive, + }; + break; + } + sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); + this.setState({ + microbit: { + ...this.state.microbit, + buttons: newButtonState, + }, + }); + }; + + protected onMouseUp = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, false); + }; + + protected onMouseDown = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, true); + }; + + protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { + event.stopPropagation(); + if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(key, active); + if (key === BUTTONS_KEYS.BTN_A) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active + ); + } else if (key === BUTTONS_KEYS.BTN_B) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active + ); + } else if (key === BUTTONS_KEYS.BTN_AB) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active + ); + } + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); + + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); + + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); + + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active + ); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { + this.togglePlayClick(); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { + this.refreshSimulatorClick(); + } + } +} +MicrobitSimulator.contextType = ViewStateContext; diff --git a/src/view/components/microbit/Microbit_svg.tsx b/Source/view/components/microbit/Microbit_svg.tsx similarity index 97% rename from src/view/components/microbit/Microbit_svg.tsx rename to Source/view/components/microbit/Microbit_svg.tsx index c3d95fdbb..22854c38f 100644 --- a/src/view/components/microbit/Microbit_svg.tsx +++ b/Source/view/components/microbit/Microbit_svg.tsx @@ -1,1890 +1,1890 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Adapted from : https://makecode.microbit.org/#editor - -import * as React from "react"; -import "../../styles/SimulatorSvg.css"; - -export interface IRefObject { - [key: string]: React.RefObject; -} -/* tslint:disable */ - -const N_LED_COLUMN = 5; -const N_LED_ROW = 5; -export class MicrobitSvg extends React.Component { - constructor(props: Readonly<{}>) { - super(props); - for (let j = 0; j < N_LED_ROW; j++) { - const led_row: React.RefObject[] = []; - for (let i = 0; i < N_LED_COLUMN; i++) { - led_row.push(React.createRef()); - } - this.ledRefs.push(led_row); - } - } - private svgRef: React.RefObject = React.createRef(); - - private buttonRefs: IRefObject = { - BTN_A: React.createRef(), - BTN_B: React.createRef(), - BTN_AB: React.createRef(), - }; - - private ledRefs: React.RefObject[][] = []; - public getSvgRef(): React.RefObject { - return this.svgRef; - } - public getButtons(): IRefObject { - return this.buttonRefs; - } - public getLeds(): React.RefObject[][] { - return this.ledRefs; - } - - render() { - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (0,0) - - - - (1,0) - - - - (2,0) - - - - (3,0) - - - - (4,0) - - - - (0,1) - - - - (1,1) - - - - (2,1) - - - - (3,1) - - - - (4,1) - - - - (0,2) - - - - (1,2) - - - - (2,2) - - - - (3,2) - - - - (4,2) - - - - (0,3) - - - - (1,3) - - - - (2,3) - - - - (3,3) - - - - (4,3) - - - - (0,4) - - - - (1,4) - - - - (2,4) - - - - (3,4) - - - - (4,4) - - - - - - - - - - P0, ANALOG IN - - - P1, ANALOG IN - - - P2, ANALOG IN - - - P3, ANALOG IN, LED Col 1 - - - P4, ANALOG IN, LED Col 2 - - - P5, BUTTON A - - - P6, LED Col 9 - - - P7, LED Col 8 - - - P8 - - - P9, LED Col 7 - - - P10, ANALOG IN, LED Col 3 - - - P11, BUTTON B - - - P12, RESERVED ACCESSIBILITY - - - P13, SPI - SCK - - - P14, SPI - MISO - - - P15, SPI - MOSI - - - P16, SPI - Chip Select - - - P17, +3v3 - - - P18, +3v3 - - - P19, I2C - SCL - - - P20, I2C - SDA - - - GND - - - GND - - - +3v3 - - - GND - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - - - - - - - - - - - - - - -
- ); - } -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +// Adapted from : https://makecode.microbit.org/#editor + +import * as React from "react"; +import "../../styles/SimulatorSvg.css"; + +export interface IRefObject { + [key: string]: React.RefObject; +} +/* tslint:disable */ + +const N_LED_COLUMN = 5; +const N_LED_ROW = 5; +export class MicrobitSvg extends React.Component { + constructor(props: Readonly<{}>) { + super(props); + for (let j = 0; j < N_LED_ROW; j++) { + const led_row: React.RefObject[] = []; + for (let i = 0; i < N_LED_COLUMN; i++) { + led_row.push(React.createRef()); + } + this.ledRefs.push(led_row); + } + } + private svgRef: React.RefObject = React.createRef(); + + private buttonRefs: IRefObject = { + BTN_A: React.createRef(), + BTN_B: React.createRef(), + BTN_AB: React.createRef(), + }; + + private ledRefs: React.RefObject[][] = []; + public getSvgRef(): React.RefObject { + return this.svgRef; + } + public getButtons(): IRefObject { + return this.buttonRefs; + } + public getLeds(): React.RefObject[][] { + return this.ledRefs; + } + + render() { + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (0,0) + + + + (1,0) + + + + (2,0) + + + + (3,0) + + + + (4,0) + + + + (0,1) + + + + (1,1) + + + + (2,1) + + + + (3,1) + + + + (4,1) + + + + (0,2) + + + + (1,2) + + + + (2,2) + + + + (3,2) + + + + (4,2) + + + + (0,3) + + + + (1,3) + + + + (2,3) + + + + (3,3) + + + + (4,3) + + + + (0,4) + + + + (1,4) + + + + (2,4) + + + + (3,4) + + + + (4,4) + + + + + + + + + + P0, ANALOG IN + + + P1, ANALOG IN + + + P2, ANALOG IN + + + P3, ANALOG IN, LED Col 1 + + + P4, ANALOG IN, LED Col 2 + + + P5, BUTTON A + + + P6, LED Col 9 + + + P7, LED Col 8 + + + P8 + + + P9, LED Col 7 + + + P10, ANALOG IN, LED Col 3 + + + P11, BUTTON B + + + P12, RESERVED ACCESSIBILITY + + + P13, SPI - SCK + + + P14, SPI - MISO + + + P15, SPI - MOSI + + + P16, SPI - Chip Select + + + P17, +3v3 + + + P18, +3v3 + + + P19, I2C - SCL + + + P20, I2C - SDA + + + GND + + + GND + + + +3v3 + + + GND + + + + + + + + + + + + + + + + + + + + + + A+B + + + + + + + + + + + + + + + + + + + + + + + +
+ ); + } +} diff --git a/src/view/components/microbit/__snapshots__/Microbit.spec.tsx.snap b/Source/view/components/microbit/__snapshots__/Microbit.spec.tsx.snap similarity index 100% rename from src/view/components/microbit/__snapshots__/Microbit.spec.tsx.snap rename to Source/view/components/microbit/__snapshots__/Microbit.spec.tsx.snap diff --git a/src/view/components/simulator/ActionBar.tsx b/Source/view/components/simulator/ActionBar.tsx similarity index 100% rename from src/view/components/simulator/ActionBar.tsx rename to Source/view/components/simulator/ActionBar.tsx diff --git a/src/view/components/toolbar/GenericSliderComponent.tsx b/Source/view/components/toolbar/GenericSliderComponent.tsx similarity index 97% rename from src/view/components/toolbar/GenericSliderComponent.tsx rename to Source/view/components/toolbar/GenericSliderComponent.tsx index 273896621..747721075 100644 --- a/src/view/components/toolbar/GenericSliderComponent.tsx +++ b/Source/view/components/toolbar/GenericSliderComponent.tsx @@ -1,41 +1,41 @@ -import * as React from "react"; -import { SENSOR_LIST } from "../../constants"; -import { ISensorProps, ISliderProps } from "../../viewUtils"; -import InputSlider from "./InputSlider"; - -interface IProps { - axisProperties: ISensorProps; - axisValues: { - // key is accessed with axisLabel - [key: string]: number; - }; - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void; -} -export const GenericSliderComponent: React.FC = props => { - return ( -
- {props.axisProperties.sliderProps.map( - (sliderProperties: ISliderProps, index: number) => { - return ( - - -
-
- ); - } - )} -
- ); -}; +import * as React from "react"; +import { SENSOR_LIST } from "../../constants"; +import { ISensorProps, ISliderProps } from "../../viewUtils"; +import InputSlider from "./InputSlider"; + +interface IProps { + axisProperties: ISensorProps; + axisValues: { + // key is accessed with axisLabel + [key: string]: number; + }; + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void; +} +export const GenericSliderComponent: React.FC = props => { + return ( +
+ {props.axisProperties.sliderProps.map( + (sliderProperties: ISliderProps, index: number) => { + return ( + + +
+
+ ); + } + )} +
+ ); +}; diff --git a/src/view/components/toolbar/Gesture.tsx b/Source/view/components/toolbar/Gesture.tsx similarity index 97% rename from src/view/components/toolbar/Gesture.tsx rename to Source/view/components/toolbar/Gesture.tsx index a89a3bd5c..4cf941f13 100644 --- a/src/view/components/toolbar/Gesture.tsx +++ b/Source/view/components/toolbar/Gesture.tsx @@ -1,71 +1,71 @@ -import * as React from "react"; -import { CONSTANTS } from "../../constants"; -import { Dropdown } from "../Dropdown"; -import SensorButton from "./SensorButton"; - -const GESTURE_BUTTON_MESSAGE = "Send Gesture"; -interface IProps { - gestures: string[]; - onSelectGestures?: (event: React.ChangeEvent) => void; - onSendGesture?: (isActive: boolean) => void; -} -export class Gesture extends React.Component { - private sensorButtonRef: React.RefObject = React.createRef(); - render() { - return ( -
- - { - if (this.props.onSendGesture) { - this.props.onSendGesture(true); - } - }} - onMouseUp={() => { - if (this.props.onSendGesture) { - this.props.onSendGesture(false); - } - }} - onKeyDown={this.handleOnKeyDown} - onKeyUp={this.handleOnKeyUp} - type="gesture" - /> -
- ); - } - private handleOnKeyDown = (e: React.KeyboardEvent) => { - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - this.sensorButtonRef!.current!.setButtonClass(true); - if (this.props.onSendGesture) { - this.props.onSendGesture(true); - } - } - }; - - private handleOnKeyUp = ( - e: React.KeyboardEvent, - onSendGesture?: (isActive: boolean) => void - ) => { - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - this.sensorButtonRef!.current!.setButtonClass(false); - - if (this.props.onSendGesture) { - this.props.onSendGesture(false); - } - } - }; -} +import * as React from "react"; +import { CONSTANTS } from "../../constants"; +import { Dropdown } from "../Dropdown"; +import SensorButton from "./SensorButton"; + +const GESTURE_BUTTON_MESSAGE = "Send Gesture"; +interface IProps { + gestures: string[]; + onSelectGestures?: (event: React.ChangeEvent) => void; + onSendGesture?: (isActive: boolean) => void; +} +export class Gesture extends React.Component { + private sensorButtonRef: React.RefObject = React.createRef(); + render() { + return ( +
+ + { + if (this.props.onSendGesture) { + this.props.onSendGesture(true); + } + }} + onMouseUp={() => { + if (this.props.onSendGesture) { + this.props.onSendGesture(false); + } + }} + onKeyDown={this.handleOnKeyDown} + onKeyUp={this.handleOnKeyUp} + type="gesture" + /> +
+ ); + } + private handleOnKeyDown = (e: React.KeyboardEvent) => { + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + this.sensorButtonRef!.current!.setButtonClass(true); + if (this.props.onSendGesture) { + this.props.onSendGesture(true); + } + } + }; + + private handleOnKeyUp = ( + e: React.KeyboardEvent, + onSendGesture?: (isActive: boolean) => void + ) => { + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + this.sensorButtonRef!.current!.setButtonClass(false); + + if (this.props.onSendGesture) { + this.props.onSendGesture(false); + } + } + }; +} diff --git a/src/view/components/toolbar/InputSlider.tsx b/Source/view/components/toolbar/InputSlider.tsx similarity index 100% rename from src/view/components/toolbar/InputSlider.tsx rename to Source/view/components/toolbar/InputSlider.tsx diff --git a/src/view/components/toolbar/SensorButton.tsx b/Source/view/components/toolbar/SensorButton.tsx similarity index 100% rename from src/view/components/toolbar/SensorButton.tsx rename to Source/view/components/toolbar/SensorButton.tsx diff --git a/src/view/components/toolbar/SensorModalUtils.tsx b/Source/view/components/toolbar/SensorModalUtils.tsx similarity index 100% rename from src/view/components/toolbar/SensorModalUtils.tsx rename to Source/view/components/toolbar/SensorModalUtils.tsx diff --git a/src/view/components/toolbar/ToolBar.tsx b/Source/view/components/toolbar/ToolBar.tsx similarity index 100% rename from src/view/components/toolbar/ToolBar.tsx rename to Source/view/components/toolbar/ToolBar.tsx diff --git a/src/view/components/toolbar/Toolbar.spec.tsx b/Source/view/components/toolbar/Toolbar.spec.tsx similarity index 96% rename from src/view/components/toolbar/Toolbar.spec.tsx rename to Source/view/components/toolbar/Toolbar.spec.tsx index bd122082e..7598ff1c0 100644 --- a/src/view/components/toolbar/Toolbar.spec.tsx +++ b/Source/view/components/toolbar/Toolbar.spec.tsx @@ -1,57 +1,57 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { SENSOR_LIST } from "../../constants"; -import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; -import { MICROBIT_TOOLBAR_ICON_ID } from "./SensorModalUtils"; -import Toolbar from "./ToolBar"; - -const MOCK_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - }, -]; -const mockUpdateSensors = () => { - return; -}; -const mockInitialValues = { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, -}; -describe("Toolbar component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); +import * as React from "react"; +import * as ReactDOM from "react-dom"; +import { IntlProvider } from "react-intl"; +import * as testRenderer from "react-test-renderer"; +import { SENSOR_LIST } from "../../constants"; +import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; +import { MICROBIT_TOOLBAR_ICON_ID } from "./SensorModalUtils"; +import Toolbar from "./ToolBar"; + +const MOCK_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ + { + image: TOOLBAR_SVG.LIGHT_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, + }, + { + image: TOOLBAR_SVG.MOTION_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, + }, +]; +const mockUpdateSensors = () => { + return; +}; +const mockInitialValues = { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT]: 0, +}; +describe("Toolbar component ", () => { + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); + + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); +}); diff --git a/src/view/components/toolbar/__snapshots__/Toolbar.spec.tsx.snap b/Source/view/components/toolbar/__snapshots__/Toolbar.spec.tsx.snap similarity index 100% rename from src/view/components/toolbar/__snapshots__/Toolbar.spec.tsx.snap rename to Source/view/components/toolbar/__snapshots__/Toolbar.spec.tsx.snap diff --git a/src/view/components/toolbar/clue/ClueModalContent.tsx b/Source/view/components/toolbar/clue/ClueModalContent.tsx similarity index 97% rename from src/view/components/toolbar/clue/ClueModalContent.tsx rename to Source/view/components/toolbar/clue/ClueModalContent.tsx index 250e61388..b4fc4a136 100644 --- a/src/view/components/toolbar/clue/ClueModalContent.tsx +++ b/Source/view/components/toolbar/clue/ClueModalContent.tsx @@ -1,318 +1,318 @@ -import * as React from "react"; -import { GESTURES_CLUE, SENSOR_LIST } from "../../../constants"; -import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; -import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; -import { GenericSliderComponent } from "../GenericSliderComponent"; -import { Gesture } from "../Gesture"; -import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; -import * as SENSOR_PROPERTIES from "./ClueSensorProperties"; - -export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-clue-temperature-sensor.description", - descriptionTitle: "toolbar-clue-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-temperature-sensor.tryItDescription", - }; -}; - -export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-gpio.description", - tryItDescription: "toolbar-clue-gpio.tryItDescription", - components: undefined, - id: "GPIO", - }; -}; - -export const ACCELEROMETER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const accelerometerSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-accelerometer-sensor.description", - descriptionTitle: "toolbar-clue-accelerometer-sensor.title", - id: "accelerometer", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-accelerometer-sensor.tryItDescription", - }; -}; -export const GYROSCOPE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const gyroSensorValues = { - X: sensorValues[SENSOR_LIST.GYRO_X], - Y: sensorValues[SENSOR_LIST.GYRO_Y], - Z: sensorValues[SENSOR_LIST.GYRO_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-gyroscope-sensor.description", - descriptionTitle: "toolbar-clue-gyroscope-sensor.title", - id: "gyroscope", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-gyroscope-sensor.tryItDescription", - }; -}; -export const MAGNETOSCOPE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const magnetSensorValues = { - X: sensorValues[SENSOR_LIST.MAGNET_X], - Y: sensorValues[SENSOR_LIST.MAGNET_Y], - Z: sensorValues[SENSOR_LIST.MAGNET_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-magnet-sensor.description", - descriptionTitle: "toolbar-clue-magnet-sensor.title", - id: "magnetoscope", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-magnet-sensor.tryItDescription", - }; -}; - -export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const lightSensorValues = { - R: sensorValues[SENSOR_LIST.LIGHT_R], - G: sensorValues[SENSOR_LIST.LIGHT_G], - B: sensorValues[SENSOR_LIST.LIGHT_B], - C: sensorValues[SENSOR_LIST.LIGHT_C], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-light-sensor.description", - descriptionTitle: "toolbar-clue-light-sensor.title", - id: "light_sensor", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-light-sensor.tryItDescription", - }; -}; - -export const HUMIDITY_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const humiditySensorValues = { - H: sensorValues[SENSOR_LIST.HUMIDITY], - }; - return { - descriptionTitle: "toolbar-clue-humidity-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-humidity-sensor.description", - tryItDescription: "toolbar-clue-humidity-sensor.tryItDescription", - components: [ - , - ], - id: "humidity_sensor", - }; -}; - -export const GESTURE_CONTENT = ( - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-gesture-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-gesture-sensor.description", - tryItDescription: "toolbar-clue-gesture-sensor.tryItDescription", - components: [ - , - ], - id: "gesture_sensor", - }; -}; - -export const PROXIMITY_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const proximitySensorValues = { - P: sensorValues[SENSOR_LIST.PROXIMITY], - }; - return { - descriptionTitle: "toolbar-clue-proximity-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-proximity-sensor.description", - tryItDescription: "toolbar-clue-proximity-sensor.tryItDescription", - components: [ - , - ], - id: "proximity_sensor", - }; -}; - -export const PRESSURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const pressureSensorValues = { - P: sensorValues[SENSOR_LIST.PRESSURE], - }; - return { - descriptionTitle: "toolbar-clue-pressure-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-pressure-sensor.description", - tryItDescription: "toolbar-clue-pressure-sensor.tryItDescription", - components: [ - , - ], - id: "pressure_sensor", - }; -}; - -export const BUTTON_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-a-b-push.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-clue-a-b-push.description", - tryItDescription: "toolbar-clue-a-b-push.tryItDescription", - components: undefined, - id: "microbit_button", - }; -}; - -export const BLUETOOTH_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-bluetooth.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-clue-bluetooth.description", - tryItDescription: "toolbar-clue-bluetooth.tryItDescription", - components: undefined, - id: "bluetooth", - }; -}; - -export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-sound-sensor.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-sound-sensor.description", - tryItDescription: "toolbar-clue-sound-sensor.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "sound_sensor", - }; -}; - -export const LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-led.description", - tryItDescription: "toolbar-clue-led.tryItDescription", - components: undefined, - id: "clue_neopixel", - }; -}; - -export const SPEAKER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-speaker.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-speaker.description", - tryItDescription: "toolbar-speaker.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "speaker", - }; -}; +import * as React from "react"; +import { GESTURES_CLUE, SENSOR_LIST } from "../../../constants"; +import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; +import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; +import { GenericSliderComponent } from "../GenericSliderComponent"; +import { Gesture } from "../Gesture"; +import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; +import * as SENSOR_PROPERTIES from "./ClueSensorProperties"; + +export const TEMPERATURE_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + const temperatureSensorValues = { + T: sensorValues[SENSOR_LIST.TEMPERATURE], + }; + return { + components: [ + , + ], + descriptionText: "toolbar-clue-temperature-sensor.description", + descriptionTitle: "toolbar-clue-temperature-sensor.title", + id: "temperature", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-temperature-sensor.tryItDescription", + }; +}; + +export const GPIO_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-clue-gpio.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-gpio.description", + tryItDescription: "toolbar-clue-gpio.tryItDescription", + components: undefined, + id: "GPIO", + }; +}; + +export const ACCELEROMETER_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + const accelerometerSensorValues = { + X: sensorValues[SENSOR_LIST.MOTION_X], + Y: sensorValues[SENSOR_LIST.MOTION_Y], + Z: sensorValues[SENSOR_LIST.MOTION_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-accelerometer-sensor.description", + descriptionTitle: "toolbar-clue-accelerometer-sensor.title", + id: "accelerometer", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-accelerometer-sensor.tryItDescription", + }; +}; +export const GYROSCOPE_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + const gyroSensorValues = { + X: sensorValues[SENSOR_LIST.GYRO_X], + Y: sensorValues[SENSOR_LIST.GYRO_Y], + Z: sensorValues[SENSOR_LIST.GYRO_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-gyroscope-sensor.description", + descriptionTitle: "toolbar-clue-gyroscope-sensor.title", + id: "gyroscope", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-gyroscope-sensor.tryItDescription", + }; +}; +export const MAGNETOSCOPE_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + const magnetSensorValues = { + X: sensorValues[SENSOR_LIST.MAGNET_X], + Y: sensorValues[SENSOR_LIST.MAGNET_Y], + Z: sensorValues[SENSOR_LIST.MAGNET_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-magnet-sensor.description", + descriptionTitle: "toolbar-clue-magnet-sensor.title", + id: "magnetoscope", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-magnet-sensor.tryItDescription", + }; +}; + +export const LIGHT_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + const lightSensorValues = { + R: sensorValues[SENSOR_LIST.LIGHT_R], + G: sensorValues[SENSOR_LIST.LIGHT_G], + B: sensorValues[SENSOR_LIST.LIGHT_B], + C: sensorValues[SENSOR_LIST.LIGHT_C], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-light-sensor.description", + descriptionTitle: "toolbar-clue-light-sensor.title", + id: "light_sensor", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-light-sensor.tryItDescription", + }; +}; + +export const HUMIDITY_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + const humiditySensorValues = { + H: sensorValues[SENSOR_LIST.HUMIDITY], + }; + return { + descriptionTitle: "toolbar-clue-humidity-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-humidity-sensor.description", + tryItDescription: "toolbar-clue-humidity-sensor.tryItDescription", + components: [ + , + ], + id: "humidity_sensor", + }; +}; + +export const GESTURE_CONTENT = ( + onSelectGestures?: (event: React.ChangeEvent) => void, + sendGesture?: (isActive: boolean) => void +): IModalContent => { + return { + descriptionTitle: "toolbar-clue-gesture-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-gesture-sensor.description", + tryItDescription: "toolbar-clue-gesture-sensor.tryItDescription", + components: [ + , + ], + id: "gesture_sensor", + }; +}; + +export const PROXIMITY_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + const proximitySensorValues = { + P: sensorValues[SENSOR_LIST.PROXIMITY], + }; + return { + descriptionTitle: "toolbar-clue-proximity-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-proximity-sensor.description", + tryItDescription: "toolbar-clue-proximity-sensor.tryItDescription", + components: [ + , + ], + id: "proximity_sensor", + }; +}; + +export const PRESSURE_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + const pressureSensorValues = { + P: sensorValues[SENSOR_LIST.PRESSURE], + }; + return { + descriptionTitle: "toolbar-clue-pressure-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-pressure-sensor.description", + tryItDescription: "toolbar-clue-pressure-sensor.tryItDescription", + components: [ + , + ], + id: "pressure_sensor", + }; +}; + +export const BUTTON_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-clue-a-b-push.title", + tagInput: undefined, + tagOutput: TAG_INPUT_SVG, + descriptionText: "toolbar-clue-a-b-push.description", + tryItDescription: "toolbar-clue-a-b-push.tryItDescription", + components: undefined, + id: "microbit_button", + }; +}; + +export const BLUETOOTH_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-clue-bluetooth.title", + tagInput: undefined, + tagOutput: TAG_INPUT_SVG, + descriptionText: "toolbar-clue-bluetooth.description", + tryItDescription: "toolbar-clue-bluetooth.tryItDescription", + components: undefined, + id: "bluetooth", + }; +}; + +export const SOUND_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-clue-sound-sensor.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-sound-sensor.description", + tryItDescription: "toolbar-clue-sound-sensor.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "sound_sensor", + }; +}; + +export const LED_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-clue-led.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-led.description", + tryItDescription: "toolbar-clue-led.tryItDescription", + components: undefined, + id: "clue_neopixel", + }; +}; + +export const SPEAKER_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-speaker.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-speaker.description", + tryItDescription: "toolbar-speaker.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "speaker", + }; +}; diff --git a/src/view/components/toolbar/clue/ClueSensorProperties.tsx b/Source/view/components/toolbar/clue/ClueSensorProperties.tsx similarity index 95% rename from src/view/components/toolbar/clue/ClueSensorProperties.tsx rename to Source/view/components/toolbar/clue/ClueSensorProperties.tsx index ccb8d8e1b..f8194eeb3 100644 --- a/src/view/components/toolbar/clue/ClueSensorProperties.tsx +++ b/Source/view/components/toolbar/clue/ClueSensorProperties.tsx @@ -1,216 +1,216 @@ -import { SENSOR_LIST } from "../../../constants"; -import { ISensorProps, ISliderProps } from "../../../viewUtils"; - -const CLUE_SLIDER_R: ISliderProps = { - axisLabel: "R", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_R, - step: 1, -}; - -const CLUE_SLIDER_G: ISliderProps = { - axisLabel: "G", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_G, - step: 1, -}; - -const CLUE_SLIDER_B: ISliderProps = { - axisLabel: "B", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_B, - step: 1, -}; -const CLUE_SLIDER_C: ISliderProps = { - axisLabel: "C", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_C, - step: 1, -}; - -export const CLUE_LIGHT_PROPERTIES: ISensorProps = { - LABEL: "Light Sensor", - sliderProps: [CLUE_SLIDER_R, CLUE_SLIDER_G, CLUE_SLIDER_B, CLUE_SLIDER_C], - unitLabel: "Lux", -}; - -// Range for magnet found here https://www.adafruit.com/product/4479 -const CLUE_MAGNET_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_X, - step: 0.1, -}; -const CLUE_MAGNET_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_Y, - step: 0.1, -}; -const CLUE_MAGNET_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_Z, - step: 0.1, -}; - -export const CLUE_MAGNET_PROPERTIES: ISensorProps = { - LABEL: "Magnetoscope", - sliderProps: [CLUE_MAGNET_X, CLUE_MAGNET_Y, CLUE_MAGNET_Z], - unitLabel: "μT", -}; -const CLUE_GYRO_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_X, - step: 0.1, -}; -const CLUE_GYRO_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_Y, - step: 0.1, -}; -const CLUE_GYRO_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_Z, - step: 0.1, -}; - -export const CLUE_GYRO_PROPERTIES: ISensorProps = { - LABEL: "Gyroscope", - sliderProps: [CLUE_GYRO_X, CLUE_GYRO_Y, CLUE_GYRO_Z], - unitLabel: "deg/s", -}; - -export const CLUE_HUMIDITY_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "H", - maxLabel: "Max", - maxValue: 100, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.HUMIDITY, - step: 0.1, - }, - ], - unitLabel: "%", -}; -export const CLUE__PROXIMITY_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "P", - maxLabel: "Max", - maxValue: 255, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.PROXIMITY, - step: 1, - }, - ], - unitLabel: "", -}; -export const CLUE_PRESSURE_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "P", - maxLabel: "Max", - maxValue: 1100, - minLabel: "Min", - minValue: 800, - type: SENSOR_LIST.PRESSURE, - step: 0.1, - }, - ], - unitLabel: "hPa", -}; -const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 1023, - minLabel: "Left", - minValue: -1023, - type: SENSOR_LIST.MOTION_X, - step: 0.1, -}; - -const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 1023, - minLabel: "Back", - minValue: -1023, - type: SENSOR_LIST.MOTION_Y, - step: 0.1, -}; - -const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 1023, - minLabel: "Up", - minValue: -1023, - type: SENSOR_LIST.MOTION_Z, - step: 0.1, -}; - -export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "m/s2", -}; - -const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 0.1, -}; - -export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", -}; +import { SENSOR_LIST } from "../../../constants"; +import { ISensorProps, ISliderProps } from "../../../viewUtils"; + +const CLUE_SLIDER_R: ISliderProps = { + axisLabel: "R", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_R, + step: 1, +}; + +const CLUE_SLIDER_G: ISliderProps = { + axisLabel: "G", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_G, + step: 1, +}; + +const CLUE_SLIDER_B: ISliderProps = { + axisLabel: "B", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_B, + step: 1, +}; +const CLUE_SLIDER_C: ISliderProps = { + axisLabel: "C", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_C, + step: 1, +}; + +export const CLUE_LIGHT_PROPERTIES: ISensorProps = { + LABEL: "Light Sensor", + sliderProps: [CLUE_SLIDER_R, CLUE_SLIDER_G, CLUE_SLIDER_B, CLUE_SLIDER_C], + unitLabel: "Lux", +}; + +// Range for magnet found here https://www.adafruit.com/product/4479 +const CLUE_MAGNET_X: ISliderProps = { + axisLabel: "X", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.MAGNET_X, + step: 0.1, +}; +const CLUE_MAGNET_Y: ISliderProps = { + axisLabel: "Y", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.MAGNET_Y, + step: 0.1, +}; +const CLUE_MAGNET_Z: ISliderProps = { + axisLabel: "Z", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.MAGNET_Z, + step: 0.1, +}; + +export const CLUE_MAGNET_PROPERTIES: ISensorProps = { + LABEL: "Magnetoscope", + sliderProps: [CLUE_MAGNET_X, CLUE_MAGNET_Y, CLUE_MAGNET_Z], + unitLabel: "μT", +}; +const CLUE_GYRO_X: ISliderProps = { + axisLabel: "X", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.GYRO_X, + step: 0.1, +}; +const CLUE_GYRO_Y: ISliderProps = { + axisLabel: "Y", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.GYRO_Y, + step: 0.1, +}; +const CLUE_GYRO_Z: ISliderProps = { + axisLabel: "Z", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.GYRO_Z, + step: 0.1, +}; + +export const CLUE_GYRO_PROPERTIES: ISensorProps = { + LABEL: "Gyroscope", + sliderProps: [CLUE_GYRO_X, CLUE_GYRO_Y, CLUE_GYRO_Z], + unitLabel: "deg/s", +}; + +export const CLUE_HUMIDITY_PROPERTIES: ISensorProps = { + LABEL: "Humidity Sensor", + sliderProps: [ + { + axisLabel: "H", + maxLabel: "Max", + maxValue: 100, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.HUMIDITY, + step: 0.1, + }, + ], + unitLabel: "%", +}; +export const CLUE__PROXIMITY_PROPERTIES: ISensorProps = { + LABEL: "Humidity Sensor", + sliderProps: [ + { + axisLabel: "P", + maxLabel: "Max", + maxValue: 255, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.PROXIMITY, + step: 1, + }, + ], + unitLabel: "", +}; +export const CLUE_PRESSURE_PROPERTIES: ISensorProps = { + LABEL: "Humidity Sensor", + sliderProps: [ + { + axisLabel: "P", + maxLabel: "Max", + maxValue: 1100, + minLabel: "Min", + minValue: 800, + type: SENSOR_LIST.PRESSURE, + step: 0.1, + }, + ], + unitLabel: "hPa", +}; +const MOTION_SLIDER_PROPS_X: ISliderProps = { + axisLabel: "X", + maxLabel: "Right", + maxValue: 1023, + minLabel: "Left", + minValue: -1023, + type: SENSOR_LIST.MOTION_X, + step: 0.1, +}; + +const MOTION_SLIDER_PROPS_Y: ISliderProps = { + axisLabel: "Y", + maxLabel: "Front", + maxValue: 1023, + minLabel: "Back", + minValue: -1023, + type: SENSOR_LIST.MOTION_Y, + step: 0.1, +}; + +const MOTION_SLIDER_PROPS_Z: ISliderProps = { + axisLabel: "Z", + maxLabel: "Down", + maxValue: 1023, + minLabel: "Up", + minValue: -1023, + type: SENSOR_LIST.MOTION_Z, + step: 0.1, +}; + +export const MOTION_SENSOR_PROPERTIES: ISensorProps = { + LABEL: "Motion sensor", + sliderProps: [ + MOTION_SLIDER_PROPS_X, + MOTION_SLIDER_PROPS_Y, + MOTION_SLIDER_PROPS_Z, + ], + unitLabel: "m/s2", +}; + +const TEMPERATURE_SLIDER_PROPS: ISliderProps = { + axisLabel: "T", + maxLabel: "Hot", + maxValue: 125, + minLabel: "Cold", + minValue: -55, + type: SENSOR_LIST.TEMPERATURE, + step: 0.1, +}; + +export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { + LABEL: "Temperature sensor", + sliderProps: [TEMPERATURE_SLIDER_PROPS], + unitLabel: "°C", +}; diff --git a/src/view/components/toolbar/cpx/CpxModalContent.tsx b/Source/view/components/toolbar/cpx/CpxModalContent.tsx similarity index 100% rename from src/view/components/toolbar/cpx/CpxModalContent.tsx rename to Source/view/components/toolbar/cpx/CpxModalContent.tsx diff --git a/src/view/components/toolbar/cpx/CpxSensorProperties.tsx b/Source/view/components/toolbar/cpx/CpxSensorProperties.tsx similarity index 100% rename from src/view/components/toolbar/cpx/CpxSensorProperties.tsx rename to Source/view/components/toolbar/cpx/CpxSensorProperties.tsx diff --git a/src/view/components/toolbar/microbit/MicrobitModalContent.tsx b/Source/view/components/toolbar/microbit/MicrobitModalContent.tsx similarity index 97% rename from src/view/components/toolbar/microbit/MicrobitModalContent.tsx rename to Source/view/components/toolbar/microbit/MicrobitModalContent.tsx index 6d4ae76ef..c53cf5554 100644 --- a/src/view/components/toolbar/microbit/MicrobitModalContent.tsx +++ b/Source/view/components/toolbar/microbit/MicrobitModalContent.tsx @@ -1,187 +1,187 @@ -import * as React from "react"; -import { GESTURES_MICROBIT, SENSOR_LIST } from "../../../constants"; -import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; -import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; -import { GenericSliderComponent } from "../GenericSliderComponent"; -import { Gesture } from "../Gesture"; -import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; -import * as SENSOR_PROPERTIES from "./MicrobitSensorProperties"; - -export const ACCELEROMETER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - // this object will be accessed with the axis label - const accelerometerSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-accelerometer-sensor.description", - descriptionTitle: "toolbar-accelerometer-sensor.title", - id: "accelerometer", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-accelerometer-sensor.tryItDescription", - }; -}; -export const LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-led.description", - tryItDescription: "toolbar-microbit-led.tryItDescription", - components: undefined, - id: "microbit_LED", - }; -}; - -export const BUTTON_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-a-b-push.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-microbit-a-b-push.description", - tryItDescription: "toolbar-microbit-a-b-push.tryItDescription", - components: undefined, - id: "microbit_button", - }; -}; -export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-sound.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-sound.description", - tryItDescription: "toolbar-microbit-sound.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_sound", - }; -}; -export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-gpio.description", - tryItDescription: "toolbar-microbit-gpio.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_gpio", - }; -}; -export const COMPASS_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-compass-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-compass-sensor.description", - tryItDescription: "toolbar-microbit-compass-sensor.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_compass", - }; -}; -export const WIRELESS_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-wireless.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-wireless.description", - tryItDescription: "toolbar-microbit-wireless.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_wireless", - }; -}; -export const GESTURE_CONTENT = ( - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-gesture-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-microbit-gesture-sensor.description", - tryItDescription: "toolbar-microbit-gesture-sensor.tryItDescription", - components: [ - , - ], - id: "gesture_sensor", - }; -}; -export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const lightSensorValues = { - L: sensorValues[SENSOR_LIST.LIGHT], - }; - return { - descriptionTitle: "toolbar-light-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-light-sensor.description", - tryItDescription: "toolbar-light-sensor.tryItDescription", - components: [ - , - ], - id: "light_sensor", - }; -}; - -export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-temperature-sensor.description", - descriptionTitle: "toolbar-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-temperature-sensor.tryItDescription", - }; -}; +import * as React from "react"; +import { GESTURES_MICROBIT, SENSOR_LIST } from "../../../constants"; +import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; +import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; +import { GenericSliderComponent } from "../GenericSliderComponent"; +import { Gesture } from "../Gesture"; +import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; +import * as SENSOR_PROPERTIES from "./MicrobitSensorProperties"; + +export const ACCELEROMETER_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + // this object will be accessed with the axis label + const accelerometerSensorValues = { + X: sensorValues[SENSOR_LIST.MOTION_X], + Y: sensorValues[SENSOR_LIST.MOTION_Y], + Z: sensorValues[SENSOR_LIST.MOTION_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-accelerometer-sensor.description", + descriptionTitle: "toolbar-accelerometer-sensor.title", + id: "accelerometer", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-accelerometer-sensor.tryItDescription", + }; +}; +export const LED_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-microbit-led.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-led.description", + tryItDescription: "toolbar-microbit-led.tryItDescription", + components: undefined, + id: "microbit_LED", + }; +}; + +export const BUTTON_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-microbit-a-b-push.title", + tagInput: undefined, + tagOutput: TAG_INPUT_SVG, + descriptionText: "toolbar-microbit-a-b-push.description", + tryItDescription: "toolbar-microbit-a-b-push.tryItDescription", + components: undefined, + id: "microbit_button", + }; +}; +export const SOUND_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-microbit-sound.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-sound.description", + tryItDescription: "toolbar-microbit-sound.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_sound", + }; +}; +export const GPIO_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-microbit-gpio.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-gpio.description", + tryItDescription: "toolbar-microbit-gpio.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_gpio", + }; +}; +export const COMPASS_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-microbit-compass-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-compass-sensor.description", + tryItDescription: "toolbar-microbit-compass-sensor.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_compass", + }; +}; +export const WIRELESS_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-microbit-wireless.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-wireless.description", + tryItDescription: "toolbar-microbit-wireless.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_wireless", + }; +}; +export const GESTURE_CONTENT = ( + onSelectGestures?: (event: React.ChangeEvent) => void, + sendGesture?: (isActive: boolean) => void +): IModalContent => { + return { + descriptionTitle: "toolbar-microbit-gesture-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-microbit-gesture-sensor.description", + tryItDescription: "toolbar-microbit-gesture-sensor.tryItDescription", + components: [ + , + ], + id: "gesture_sensor", + }; +}; +export const LIGHT_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + const lightSensorValues = { + L: sensorValues[SENSOR_LIST.LIGHT], + }; + return { + descriptionTitle: "toolbar-light-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-light-sensor.description", + tryItDescription: "toolbar-light-sensor.tryItDescription", + components: [ + , + ], + id: "light_sensor", + }; +}; + +export const TEMPERATURE_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + const temperatureSensorValues = { + T: sensorValues[SENSOR_LIST.TEMPERATURE], + }; + return { + components: [ + , + ], + descriptionText: "toolbar-temperature-sensor.description", + descriptionTitle: "toolbar-temperature-sensor.title", + id: "temperature", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-temperature-sensor.tryItDescription", + }; +}; diff --git a/src/view/components/toolbar/microbit/MicrobitSensorProperties.tsx b/Source/view/components/toolbar/microbit/MicrobitSensorProperties.tsx similarity index 100% rename from src/view/components/toolbar/microbit/MicrobitSensorProperties.tsx rename to Source/view/components/toolbar/microbit/MicrobitSensorProperties.tsx diff --git a/src/view/constants.ts b/Source/view/constants.ts similarity index 100% rename from src/view/constants.ts rename to Source/view/constants.ts diff --git a/src/view/container/device/Device.spec.tsx b/Source/view/container/device/Device.spec.tsx similarity index 97% rename from src/view/container/device/Device.spec.tsx rename to Source/view/container/device/Device.spec.tsx index 491d4e2a5..0423721ef 100644 --- a/src/view/container/device/Device.spec.tsx +++ b/Source/view/container/device/Device.spec.tsx @@ -1,30 +1,30 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { DEVICE_LIST_KEY } from "../../constants"; -import { Device } from "./Device"; - -describe("Device component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); +import * as React from "react"; +import * as ReactDOM from "react-dom"; +import { IntlProvider } from "react-intl"; +import * as testRenderer from "react-test-renderer"; +import { DEVICE_LIST_KEY } from "../../constants"; +import { Device } from "./Device"; + +describe("Device component ", () => { + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); + + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); +}); diff --git a/src/view/container/device/Device.tsx b/Source/view/container/device/Device.tsx similarity index 100% rename from src/view/container/device/Device.tsx rename to Source/view/container/device/Device.tsx diff --git a/src/view/container/device/__snapshots__/Device.spec.tsx.snap b/Source/view/container/device/__snapshots__/Device.spec.tsx.snap similarity index 100% rename from src/view/container/device/__snapshots__/Device.spec.tsx.snap rename to Source/view/container/device/__snapshots__/Device.spec.tsx.snap diff --git a/src/view/context.ts b/Source/view/context.ts similarity index 100% rename from src/view/context.ts rename to Source/view/context.ts diff --git a/src/view/index.css b/Source/view/index.css similarity index 100% rename from src/view/index.css rename to Source/view/index.css diff --git a/src/view/index.tsx b/Source/view/index.tsx similarity index 100% rename from src/view/index.tsx rename to Source/view/index.tsx diff --git a/src/view/pages/__snapshots__/gettingStarted.spec.tsx.snap b/Source/view/pages/__snapshots__/gettingStarted.spec.tsx.snap similarity index 100% rename from src/view/pages/__snapshots__/gettingStarted.spec.tsx.snap rename to Source/view/pages/__snapshots__/gettingStarted.spec.tsx.snap diff --git a/src/view/pages/gettingStarted.css b/Source/view/pages/gettingStarted.css similarity index 95% rename from src/view/pages/gettingStarted.css rename to Source/view/pages/gettingStarted.css index d312598b1..ae6d20b4f 100644 --- a/src/view/pages/gettingStarted.css +++ b/Source/view/pages/gettingStarted.css @@ -1,56 +1,56 @@ -.inv { - display: none; -} - -.codeText { - overflow-x: auto; - white-space: pre-wrap; - word-wrap: break-word; -} - -li:not(:last-child) { - margin-bottom: 6px; -} - -.normalFontWeight { - font-weight: normal; -} - -.deviceSelector { - width: 250px; - border: 1px solid var(--vscode-dropdown-border); - background-color: var(--vscode-dropdown-background); - color: var(--vscode-dropdown-foreground); - margin: 0 0 5px; - padding: 8px; - border-radius: 5px; - font-size: 12px; - padding-right: 30px; -} - -.deviceSelector optgroup { - background-color: var(--vscode-dropdown-listBackground); - color: var(--vscode-dropdown-foreground); -} - -.deviceSelector option { - background-color: var(--vscode-dropdown-listBackground); - color: var(--vscode-dropdown-foreground); -} - -.codeBox { - display: block; - width: 90%; - margin: 10px; - padding: 15px; - text-align: left; - background: none; - border: 1px solid grey; - border-radius: 4px; - background-color: var(--vscode-textCodeBlock-background); -} - -.container { - text-align: left; - padding: 0 10px 20px 10px; -} +.inv { + display: none; +} + +.codeText { + overflow-x: auto; + white-space: pre-wrap; + word-wrap: break-word; +} + +li:not(:last-child) { + margin-bottom: 6px; +} + +.normalFontWeight { + font-weight: normal; +} + +.deviceSelector { + width: 250px; + border: 1px solid var(--vscode-dropdown-border); + background-color: var(--vscode-dropdown-background); + color: var(--vscode-dropdown-foreground); + margin: 0 0 5px; + padding: 8px; + border-radius: 5px; + font-size: 12px; + padding-right: 30px; +} + +.deviceSelector optgroup { + background-color: var(--vscode-dropdown-listBackground); + color: var(--vscode-dropdown-foreground); +} + +.deviceSelector option { + background-color: var(--vscode-dropdown-listBackground); + color: var(--vscode-dropdown-foreground); +} + +.codeBox { + display: block; + width: 90%; + margin: 10px; + padding: 15px; + text-align: left; + background: none; + border: 1px solid grey; + border-radius: 4px; + background-color: var(--vscode-textCodeBlock-background); +} + +.container { + text-align: left; + padding: 0 10px 20px 10px; +} diff --git a/src/view/pages/gettingStarted.spec.tsx b/Source/view/pages/gettingStarted.spec.tsx similarity index 96% rename from src/view/pages/gettingStarted.spec.tsx rename to Source/view/pages/gettingStarted.spec.tsx index 278d5ed4b..12554fdfb 100644 --- a/src/view/pages/gettingStarted.spec.tsx +++ b/Source/view/pages/gettingStarted.spec.tsx @@ -1,29 +1,29 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { GettingStartedPage } from "./gettingStarted"; - -describe("GettingStartedPage component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); +import * as React from "react"; +import * as ReactDOM from "react-dom"; +import { IntlProvider } from "react-intl"; +import * as testRenderer from "react-test-renderer"; +import { GettingStartedPage } from "./gettingStarted"; + +describe("GettingStartedPage component ", () => { + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); + + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); +}); diff --git a/src/view/pages/gettingStarted.tsx b/Source/view/pages/gettingStarted.tsx similarity index 98% rename from src/view/pages/gettingStarted.tsx rename to Source/view/pages/gettingStarted.tsx index 2477594e7..c58be7145 100644 --- a/src/view/pages/gettingStarted.tsx +++ b/Source/view/pages/gettingStarted.tsx @@ -1,281 +1,281 @@ -import * as React from "react"; -import "./gettingStarted.css"; - -export class GettingStartedPage extends React.Component { - private selectRef: React.RefObject = React.createRef(); - - componentDidMount() { - this.selectRef.current?.addEventListener("change", (event: any) => { - const visibleElement = document.querySelector(".visibleElement"); - const target = document.getElementById(event!.target!.value); - if (visibleElement !== null) { - visibleElement.className = "inv"; - } - if (target !== null) { - target.className = "visibleElement"; - } - }); - } - - render() { - return ( - -
-

Getting started

- -

- Copy these snippets of code to a .py file and run the - simulator -

- {/* prettier-ignore */} -
-

Tutorial for Circuit Playground Express

-

- > Import the Circuit Playground library to use it (This is required) -

- -
from adafruit_circuitplayground import cp
-
-

> Turn on the little red LED

- -
while True:
-
    cp.red_led = True
-
-

> Turn up red LED when button A is clicked

- -
while True:
-
    if cp.button_a:
-
        cp.red_led = True
-
-

> Light up the first neopixel blue

- -
cp.pixels[0] = (0, 0, 255)
-
-

And much more! These links have more tutorials:

-

- - Getting started with CPX and CircuitPython - -

-

- - More example code - -

-

Keyboard Shortcuts

-
    -
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • -
  • Refresh the simulator: Shift + R
  • -
  • Run the simulator: Shift + F
  • -
-
- {/* prettier-ignore */} -
-

Tutorial for micro:bit

-

- > Import the micro:bit library to use it (This is - required) -

- -
from microbit import *
-
-

- > Light up your micro:bit with love by showing a - heart -

- -
display.show(Image.HEART)
-
-

- > Use your micro:bit to tell the world how you’re - feeling -

- -
while True:
-
    if button_a.is_pressed():
-
        display.show(Image.HAPPY)
-
    if button_b.is_pressed():
-
        display.show(Image.SAD)
-
-

> Read then display the temperature

- -
while True:
-
    temp = temperature()
-
    display.show(temp)
-
-

- > Display your name with the scroll functionality -

- -
while True:
-
    display.show("Your name")
-
-

And much more! These links have more tutorials:

-

- - Microbit Tutorials - -

-

- - Microbit official documentation - -

-

Keyboard Shortcuts

-
    -
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • -
  • Refresh the simulator: Shift + R
  • -
  • Run the simulator: Shift + F
  • -
-
- {/* prettier-ignore */} -
-

Tutorial for CLUE

-

- > Import the the main CLUE library (This is - required) -

- -
from adafruit_clue import clue
-
-

- > Display text on the CLUE and change the text when - a button is pressed -

- -
-                                clue_data = clue.simple_text_display(title="CLUE!")
-                            
-
while True:
-
    clue_data[1].text = "Hello World!"
-
    if clue.button_a:
-
        clue_data[5].text = "A is pressed!"
-
    else:
-
        clue_data[5].text = "A is not pressed!"
-
    clue_data.show()
-
-

> Create a slide show on the CLUE

-

- Make sure there are bitmap (.bmp) pictures of your choice in the same directory - as the code file. -

- -
import board
-
from adafruit_slideshow import SlideShow
-
 
-
slideshow = SlideShow(clue.display, auto_advance=True, dwell=3, fade_effect=True)
-                            
-
while slideshow.update():
-
    pass
-
-

> Light up the neopixel green

- -
clue.pixel.fill(clue.GREEN)
-
-

> Display sensor data on the CLUE

- -
clue_data = clue.simple_text_display(title="CLUE Sensor Data!", title_scale=2)
-
while True:
-
    clue_data[0].text = "Acceleration: {"{}"} {"{}"} {"{}"}".format(*clue.acceleration)
-
    clue_data[1].text = "Gyro: {"{}"} {"{}"} {"{}"}".format(*clue.gyro)
-
    clue_data[2].text = "Magnetic: {"{}"} {"{}"} {"{}"}".format(*clue.magnetic)
-
    clue_data[3].text = "Pressure: {"{}"}hPa".format(clue.pressure)
-
    clue_data[4].text = "Altitude: {"{}"}m".format(clue.altitude)
-
    clue_data[5].text = "Temperature: {"{}"}C".format(clue.temperature)
-
    clue_data[6].text = "Humidity: {"{}"}%".format(clue.humidity)
-
    clue_data[7].text = "Proximity: {"{}"}".format(clue.proximity)
-
    clue_data[8].text = "Gesture: {"{}"}".format(clue.gesture)
-
    clue_data[9].text = "Color: R: {"{}"} G: {"{}"} B: {"{}"} C: {"{}"}".format(*clue.color)
-
    clue_data[10].text = "Button A: {"{}"}".format(clue.button_a)
-
    clue_data[11].text = "Button B: {"{}"}".format(clue.button_b)
-
    clue_data.show()
-
-

> Draw a blue rectangle on the screen

- -
import board
-
import displayio
-
from adafruit_display_shapes.rect import Rect
-
 
-
splash = displayio.Group(max_size=20)
-
board.DISPLAY.show(splash)
-
 
-
rect = Rect(80, 20, 41, 41, fill=0x0000FF)
-
splash.append(rect)
-
-

And much more! These links have more tutorials:

-

- - Getting started with CLUE and CircuitPython - -

-

- - More example code - -

-

Keyboard Shortcuts

-
    -
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • -
  • Refresh the simulator: Shift + R
  • -
  • Run the simulator: Shift + F
  • -
  • Capacitive Touch Sensor: Shift + 1 ~ 7 for GPIO pins A1 - A7
  • -
  • Slider Switch: Shift + S
  • -
-
- {/* prettier-ignore */} -
-

Tutorial for using the debugger

-

- > Enter debug mode -

-

Press F5 or go to Run -> Start Debugging

- Start debugging -

- > Set a breakpoint or multiple breakpoints -

-

Stopping at a breakpoint pauses the program at that particular place.

-

Use the debug toolbar or the shortcuts below

- Debugger Toolbar -
    -
  • F5 to continue / pause
  • -
  • F10 to step over (execute current statement and all functions that it calls and stop before the next statement)
  • -
  • F11 to step into (stop at first statement of first function called from first line)
  • -
  • Shift + F11 to step out (run current function to end)
  • -
  • Ctrl + Shift + F11 to restart
  • -
  • Shift + F5 to stop
  • -
- debugging experience -

- > Observe the device's state on the "Variables" tab on the left when stopped at a breakpoint -

- Debugger Variables -

And much more! These links have more tutorials:

-

- - Learn more about debugging in VS Code - -

-
-
-
- ); - } -} +import * as React from "react"; +import "./gettingStarted.css"; + +export class GettingStartedPage extends React.Component { + private selectRef: React.RefObject = React.createRef(); + + componentDidMount() { + this.selectRef.current?.addEventListener("change", (event: any) => { + const visibleElement = document.querySelector(".visibleElement"); + const target = document.getElementById(event!.target!.value); + if (visibleElement !== null) { + visibleElement.className = "inv"; + } + if (target !== null) { + target.className = "visibleElement"; + } + }); + } + + render() { + return ( + +
+

Getting started

+ +

+ Copy these snippets of code to a .py file and run the + simulator +

+ {/* prettier-ignore */} +
+

Tutorial for Circuit Playground Express

+

+ > Import the Circuit Playground library to use it (This is required) +

+ +
from adafruit_circuitplayground import cp
+
+

> Turn on the little red LED

+ +
while True:
+
    cp.red_led = True
+
+

> Turn up red LED when button A is clicked

+ +
while True:
+
    if cp.button_a:
+
        cp.red_led = True
+
+

> Light up the first neopixel blue

+ +
cp.pixels[0] = (0, 0, 255)
+
+

And much more! These links have more tutorials:

+

+ + Getting started with CPX and CircuitPython + +

+

+ + More example code + +

+

Keyboard Shortcuts

+
    +
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • +
  • Refresh the simulator: Shift + R
  • +
  • Run the simulator: Shift + F
  • +
+
+ {/* prettier-ignore */} +
+

Tutorial for micro:bit

+

+ > Import the micro:bit library to use it (This is + required) +

+ +
from microbit import *
+
+

+ > Light up your micro:bit with love by showing a + heart +

+ +
display.show(Image.HEART)
+
+

+ > Use your micro:bit to tell the world how you’re + feeling +

+ +
while True:
+
    if button_a.is_pressed():
+
        display.show(Image.HAPPY)
+
    if button_b.is_pressed():
+
        display.show(Image.SAD)
+
+

> Read then display the temperature

+ +
while True:
+
    temp = temperature()
+
    display.show(temp)
+
+

+ > Display your name with the scroll functionality +

+ +
while True:
+
    display.show("Your name")
+
+

And much more! These links have more tutorials:

+

+ + Microbit Tutorials + +

+

+ + Microbit official documentation + +

+

Keyboard Shortcuts

+
    +
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • +
  • Refresh the simulator: Shift + R
  • +
  • Run the simulator: Shift + F
  • +
+
+ {/* prettier-ignore */} +
+

Tutorial for CLUE

+

+ > Import the the main CLUE library (This is + required) +

+ +
from adafruit_clue import clue
+
+

+ > Display text on the CLUE and change the text when + a button is pressed +

+ +
+                                clue_data = clue.simple_text_display(title="CLUE!")
+                            
+
while True:
+
    clue_data[1].text = "Hello World!"
+
    if clue.button_a:
+
        clue_data[5].text = "A is pressed!"
+
    else:
+
        clue_data[5].text = "A is not pressed!"
+
    clue_data.show()
+
+

> Create a slide show on the CLUE

+

+ Make sure there are bitmap (.bmp) pictures of your choice in the same directory + as the code file. +

+ +
import board
+
from adafruit_slideshow import SlideShow
+
 
+
slideshow = SlideShow(clue.display, auto_advance=True, dwell=3, fade_effect=True)
+                            
+
while slideshow.update():
+
    pass
+
+

> Light up the neopixel green

+ +
clue.pixel.fill(clue.GREEN)
+
+

> Display sensor data on the CLUE

+ +
clue_data = clue.simple_text_display(title="CLUE Sensor Data!", title_scale=2)
+
while True:
+
    clue_data[0].text = "Acceleration: {"{}"} {"{}"} {"{}"}".format(*clue.acceleration)
+
    clue_data[1].text = "Gyro: {"{}"} {"{}"} {"{}"}".format(*clue.gyro)
+
    clue_data[2].text = "Magnetic: {"{}"} {"{}"} {"{}"}".format(*clue.magnetic)
+
    clue_data[3].text = "Pressure: {"{}"}hPa".format(clue.pressure)
+
    clue_data[4].text = "Altitude: {"{}"}m".format(clue.altitude)
+
    clue_data[5].text = "Temperature: {"{}"}C".format(clue.temperature)
+
    clue_data[6].text = "Humidity: {"{}"}%".format(clue.humidity)
+
    clue_data[7].text = "Proximity: {"{}"}".format(clue.proximity)
+
    clue_data[8].text = "Gesture: {"{}"}".format(clue.gesture)
+
    clue_data[9].text = "Color: R: {"{}"} G: {"{}"} B: {"{}"} C: {"{}"}".format(*clue.color)
+
    clue_data[10].text = "Button A: {"{}"}".format(clue.button_a)
+
    clue_data[11].text = "Button B: {"{}"}".format(clue.button_b)
+
    clue_data.show()
+
+

> Draw a blue rectangle on the screen

+ +
import board
+
import displayio
+
from adafruit_display_shapes.rect import Rect
+
 
+
splash = displayio.Group(max_size=20)
+
board.DISPLAY.show(splash)
+
 
+
rect = Rect(80, 20, 41, 41, fill=0x0000FF)
+
splash.append(rect)
+
+

And much more! These links have more tutorials:

+

+ + Getting started with CLUE and CircuitPython + +

+

+ + More example code + +

+

Keyboard Shortcuts

+
    +
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • +
  • Refresh the simulator: Shift + R
  • +
  • Run the simulator: Shift + F
  • +
  • Capacitive Touch Sensor: Shift + 1 ~ 7 for GPIO pins A1 - A7
  • +
  • Slider Switch: Shift + S
  • +
+
+ {/* prettier-ignore */} +
+

Tutorial for using the debugger

+

+ > Enter debug mode +

+

Press F5 or go to Run -> Start Debugging

+ Start debugging +

+ > Set a breakpoint or multiple breakpoints +

+

Stopping at a breakpoint pauses the program at that particular place.

+

Use the debug toolbar or the shortcuts below

+ Debugger Toolbar +
    +
  • F5 to continue / pause
  • +
  • F10 to step over (execute current statement and all functions that it calls and stop before the next statement)
  • +
  • F11 to step into (stop at first statement of first function called from first line)
  • +
  • Shift + F11 to step out (run current function to end)
  • +
  • Ctrl + Shift + F11 to restart
  • +
  • Shift + F5 to stop
  • +
+ debugging experience +

+ > Observe the device's state on the "Variables" tab on the left when stopped at a breakpoint +

+ Debugger Variables +

And much more! These links have more tutorials:

+

+ + Learn more about debugging in VS Code + +

+
+
+
+ ); + } +} diff --git a/src/view/pages/gettingStartedPictures/debugger/debugger_vars.png b/Source/view/pages/gettingStartedPictures/debugger/debugger_vars.png similarity index 100% rename from src/view/pages/gettingStartedPictures/debugger/debugger_vars.png rename to Source/view/pages/gettingStartedPictures/debugger/debugger_vars.png diff --git a/src/view/pages/gettingStartedPictures/debugger/debugging.gif b/Source/view/pages/gettingStartedPictures/debugger/debugging.gif similarity index 100% rename from src/view/pages/gettingStartedPictures/debugger/debugging.gif rename to Source/view/pages/gettingStartedPictures/debugger/debugging.gif diff --git a/src/view/pages/gettingStartedPictures/debugger/start_debugging.jpg b/Source/view/pages/gettingStartedPictures/debugger/start_debugging.jpg similarity index 100% rename from src/view/pages/gettingStartedPictures/debugger/start_debugging.jpg rename to Source/view/pages/gettingStartedPictures/debugger/start_debugging.jpg diff --git a/src/view/pages/gettingStartedPictures/debugger/toolbar.png b/Source/view/pages/gettingStartedPictures/debugger/toolbar.png similarity index 100% rename from src/view/pages/gettingStartedPictures/debugger/toolbar.png rename to Source/view/pages/gettingStartedPictures/debugger/toolbar.png diff --git a/src/view/react-app-env.d.ts b/Source/view/react-app-env.d.ts similarity index 100% rename from src/view/react-app-env.d.ts rename to Source/view/react-app-env.d.ts diff --git a/src/view/styles/Button.css b/Source/view/styles/Button.css similarity index 100% rename from src/view/styles/Button.css rename to Source/view/styles/Button.css diff --git a/src/view/styles/Dropdown.css b/Source/view/styles/Dropdown.css similarity index 100% rename from src/view/styles/Dropdown.css rename to Source/view/styles/Dropdown.css diff --git a/src/view/styles/InputSlider.css b/Source/view/styles/InputSlider.css similarity index 100% rename from src/view/styles/InputSlider.css rename to Source/view/styles/InputSlider.css diff --git a/src/view/styles/LightSensorBar.css b/Source/view/styles/LightSensorBar.css similarity index 100% rename from src/view/styles/LightSensorBar.css rename to Source/view/styles/LightSensorBar.css diff --git a/src/view/styles/MotionSensorBar.css b/Source/view/styles/MotionSensorBar.css similarity index 100% rename from src/view/styles/MotionSensorBar.css rename to Source/view/styles/MotionSensorBar.css diff --git a/src/view/styles/SensorButton.css b/Source/view/styles/SensorButton.css similarity index 100% rename from src/view/styles/SensorButton.css rename to Source/view/styles/SensorButton.css diff --git a/src/view/styles/Simulator.css b/Source/view/styles/Simulator.css similarity index 100% rename from src/view/styles/Simulator.css rename to Source/view/styles/Simulator.css diff --git a/src/view/styles/SimulatorSvg.css b/Source/view/styles/SimulatorSvg.css similarity index 93% rename from src/view/styles/SimulatorSvg.css rename to Source/view/styles/SimulatorSvg.css index c9266c4a3..10d839893 100644 --- a/src/view/styles/SimulatorSvg.css +++ b/Source/view/styles/SimulatorSvg.css @@ -1,290 +1,290 @@ -.microbit-svg { - padding: 0 0 0 10px; -} -svg.sim { - box-sizing: border-box; - width: 100%; - height: 100%; - display: block; -} -svg.sim.grayscale { - -moz-filter: grayscale(1); - -webkit-filter: grayscale(1); - filter: grayscale(1); -} -.sim-button-group { - cursor: pointer; -} -.sim-button { - pointer-events: none; - fill: "rgb(17, 17, 17)"; -} -.sim-button-group > .sim-button:active { - fill: orange; -} -.sim-text-outside { - font-size: 25px; - fill: var(--vscode-foreground); -} -.sim-board, -.sim-display, -sim-button { - fill: #111; -} -.sim-button-group > .sim-button-outer:hover { - stroke: orange; - stroke-width: 4px; -} -.sim-button-group > .sim-button-outer:active { - fill: orange; -} -.sim-button-outer { - fill: #7e7272; -} - -.sim-button-key-press { - fill: orange; -} - -.sim-button-nut { - fill: #704a4a; - pointer-events: none; -} - -.sim-systemled { - fill: #333; - stroke: #555; - stroke-width: 1px; -} -.sim-light-level-button { - stroke: #fff; - stroke-width: 3px; -} -.sim-antenna { - stroke: #555; - stroke-width: 2px; -} -.sim-text { - font-family: "Lucida Console", Monaco, monospace; - font-size: 25px; - fill: #fff; - pointer-events: none; -} -.sim-text-pin { - font-family: "Lucida Console", Monaco, monospace; - font-size: 20px; - fill: #fff; - pointer-events: none; -} -.sim-thermometer { - stroke: #aaa; - stroke-width: 3px; -} -/* animations */ -.sim-flash { - animation-name: sim-flash-animation; - animation-duration: 0.1s; -} -@keyframes sim-flash-animation { - from { - fill: yellow; - } - to { - fill: default; - } -} -.sim-flash-stroke { - animation-name: sim-flash-stroke-animation; - animation-duration: 0.4s; - animation-timing-function: ease-in; -} -@keyframes sim-flash-stroke-animation { - from { - stroke: yellow; - } - to { - stroke: default; - } -} -/* wireframe */ -.sim-wireframe * { - fill: none; - stroke: black; -} -.sim-wireframe .sim-display, -.sim-wireframe .sim-led, -.sim-wireframe .sim-led-back, -.sim-wireframe .sim-head, -.sim-wireframe .sim-theme, -.sim-wireframe .sim-button-group, -.sim-wireframe .sim-button-label, -.sim-wireframe .sim-button, -.sim-wireframe .sim-text-pin { - visibility: hidden; -} -.sim-wireframe .sim-label { - stroke: none; - fill: #777; -} -.sim-label, -.sim-button-label { - fill: #000; -} -.sim-wireframe .sim-board { - stroke-width: 2px; -} -*:focus { - outline: none; -} -.sim-button-group:focus { - stroke: #4d90fe; - stroke-width: 4px; -} -.sim-button-group:focus { - stroke: #4d90fe; - stroke-width: 4px; -} -*:focus .sim-button-outer, -.sim-pin:focus, -.sim-thermometer:focus, -.sim-shake:focus, -.no-drag, -.sim-text, -.sim-text-pin { - user-drag: none; - user-select: none; - -moz-user-select: none; - -webkit-user-drag: none; - -webkit-user-select: none; - -ms-user-select: none; -} -.sim-button { - stroke: none; -} -.sim-button:active { - stroke: none; -} -.cls-1 { - fill: #097054; -} -.cls-1, -.cls-14, -.cls-23, -.cls-9 { - stroke: #000; -} -.cls-1, -.cls-11, -.cls-12, -.cls-14, -.cls-17, -.cls-22, -.cls-23, -.cls-3, -.cls-4, -.cls-5, -.cls-6, -.cls-9 { - stroke-miterlimit: 10; -} -.cls-1, -.cls-23 { - stroke-width: 1.99px; -} -.cls-18, -.cls-2 { - fill: #fff; -} -.cls-11, -.cls-12, -.cls-17, -.cls-23, -.cls-3, -.cls-4, -.cls-5, -.cls-6, -.cls-7, -.cls-8 { - fill: none; -} -.cls-11, -.cls-12, -.cls-17, -.cls-3, -.cls-4, -.cls-5, -.cls-6, -.cls-7, -.cls-8 { - stroke: #fff; -} -.cls-3 { - stroke-width: 2px; -} -.cls-12, -.cls-17, -.cls-4, -.cls-5, -.cls-6, -.cls-7, -.cls-8 { - stroke-linecap: round; -} -.cls-4, -.cls-7 { - stroke-width: 1.63px; -} -.cls-5 { - stroke-width: 1.41px; -} -.cls-6 { - stroke-width: 1.6px; -} -.cls-7, -.cls-8 { - stroke-linejoin: round; -} -.cls-8 { - stroke-width: 1.63px; -} -.cls-10, -.cls-9 { - fill: #7e7272; -} -.cls-22, -.cls-9 { - stroke-width: 1.5px; -} -.cls-12 { - stroke-width: 1.71px; -} - -.cls-14 { - stroke-width: 0.25px; -} - -.cls-17 { - stroke-width: 2.02px; -} -.cls-18 { - font-size: 7px; - font-family: SegoeUI-Bold, Segoe UI; - font-weight: 700; - letter-spacing: -0.02em; -} -.cls-19 { - letter-spacing: -0.03em; -} -.cls-20 { - letter-spacing: -0.05em; -} -.cls-21 { - letter-spacing: 0em; -} -.cls-22 { - stroke: #7e7272; -} -.sim-text-outside-clue { - font-size: 14px; - fill: var(--vscode-foreground); -} +.microbit-svg { + padding: 0 0 0 10px; +} +svg.sim { + box-sizing: border-box; + width: 100%; + height: 100%; + display: block; +} +svg.sim.grayscale { + -moz-filter: grayscale(1); + -webkit-filter: grayscale(1); + filter: grayscale(1); +} +.sim-button-group { + cursor: pointer; +} +.sim-button { + pointer-events: none; + fill: "rgb(17, 17, 17)"; +} +.sim-button-group > .sim-button:active { + fill: orange; +} +.sim-text-outside { + font-size: 25px; + fill: var(--vscode-foreground); +} +.sim-board, +.sim-display, +sim-button { + fill: #111; +} +.sim-button-group > .sim-button-outer:hover { + stroke: orange; + stroke-width: 4px; +} +.sim-button-group > .sim-button-outer:active { + fill: orange; +} +.sim-button-outer { + fill: #7e7272; +} + +.sim-button-key-press { + fill: orange; +} + +.sim-button-nut { + fill: #704a4a; + pointer-events: none; +} + +.sim-systemled { + fill: #333; + stroke: #555; + stroke-width: 1px; +} +.sim-light-level-button { + stroke: #fff; + stroke-width: 3px; +} +.sim-antenna { + stroke: #555; + stroke-width: 2px; +} +.sim-text { + font-family: "Lucida Console", Monaco, monospace; + font-size: 25px; + fill: #fff; + pointer-events: none; +} +.sim-text-pin { + font-family: "Lucida Console", Monaco, monospace; + font-size: 20px; + fill: #fff; + pointer-events: none; +} +.sim-thermometer { + stroke: #aaa; + stroke-width: 3px; +} +/* animations */ +.sim-flash { + animation-name: sim-flash-animation; + animation-duration: 0.1s; +} +@keyframes sim-flash-animation { + from { + fill: yellow; + } + to { + fill: default; + } +} +.sim-flash-stroke { + animation-name: sim-flash-stroke-animation; + animation-duration: 0.4s; + animation-timing-function: ease-in; +} +@keyframes sim-flash-stroke-animation { + from { + stroke: yellow; + } + to { + stroke: default; + } +} +/* wireframe */ +.sim-wireframe * { + fill: none; + stroke: black; +} +.sim-wireframe .sim-display, +.sim-wireframe .sim-led, +.sim-wireframe .sim-led-back, +.sim-wireframe .sim-head, +.sim-wireframe .sim-theme, +.sim-wireframe .sim-button-group, +.sim-wireframe .sim-button-label, +.sim-wireframe .sim-button, +.sim-wireframe .sim-text-pin { + visibility: hidden; +} +.sim-wireframe .sim-label { + stroke: none; + fill: #777; +} +.sim-label, +.sim-button-label { + fill: #000; +} +.sim-wireframe .sim-board { + stroke-width: 2px; +} +*:focus { + outline: none; +} +.sim-button-group:focus { + stroke: #4d90fe; + stroke-width: 4px; +} +.sim-button-group:focus { + stroke: #4d90fe; + stroke-width: 4px; +} +*:focus .sim-button-outer, +.sim-pin:focus, +.sim-thermometer:focus, +.sim-shake:focus, +.no-drag, +.sim-text, +.sim-text-pin { + user-drag: none; + user-select: none; + -moz-user-select: none; + -webkit-user-drag: none; + -webkit-user-select: none; + -ms-user-select: none; +} +.sim-button { + stroke: none; +} +.sim-button:active { + stroke: none; +} +.cls-1 { + fill: #097054; +} +.cls-1, +.cls-14, +.cls-23, +.cls-9 { + stroke: #000; +} +.cls-1, +.cls-11, +.cls-12, +.cls-14, +.cls-17, +.cls-22, +.cls-23, +.cls-3, +.cls-4, +.cls-5, +.cls-6, +.cls-9 { + stroke-miterlimit: 10; +} +.cls-1, +.cls-23 { + stroke-width: 1.99px; +} +.cls-18, +.cls-2 { + fill: #fff; +} +.cls-11, +.cls-12, +.cls-17, +.cls-23, +.cls-3, +.cls-4, +.cls-5, +.cls-6, +.cls-7, +.cls-8 { + fill: none; +} +.cls-11, +.cls-12, +.cls-17, +.cls-3, +.cls-4, +.cls-5, +.cls-6, +.cls-7, +.cls-8 { + stroke: #fff; +} +.cls-3 { + stroke-width: 2px; +} +.cls-12, +.cls-17, +.cls-4, +.cls-5, +.cls-6, +.cls-7, +.cls-8 { + stroke-linecap: round; +} +.cls-4, +.cls-7 { + stroke-width: 1.63px; +} +.cls-5 { + stroke-width: 1.41px; +} +.cls-6 { + stroke-width: 1.6px; +} +.cls-7, +.cls-8 { + stroke-linejoin: round; +} +.cls-8 { + stroke-width: 1.63px; +} +.cls-10, +.cls-9 { + fill: #7e7272; +} +.cls-22, +.cls-9 { + stroke-width: 1.5px; +} +.cls-12 { + stroke-width: 1.71px; +} + +.cls-14 { + stroke-width: 0.25px; +} + +.cls-17 { + stroke-width: 2.02px; +} +.cls-18 { + font-size: 7px; + font-family: SegoeUI-Bold, Segoe UI; + font-weight: 700; + letter-spacing: -0.02em; +} +.cls-19 { + letter-spacing: -0.03em; +} +.cls-20 { + letter-spacing: -0.05em; +} +.cls-21 { + letter-spacing: 0em; +} +.cls-22 { + stroke: #7e7272; +} +.sim-text-outside-clue { + font-size: 14px; + fill: var(--vscode-foreground); +} diff --git a/src/view/styles/TemperatureSensorBar.css b/Source/view/styles/TemperatureSensorBar.css similarity index 100% rename from src/view/styles/TemperatureSensorBar.css rename to Source/view/styles/TemperatureSensorBar.css diff --git a/src/view/styles/ToolBar.css b/Source/view/styles/ToolBar.css similarity index 100% rename from src/view/styles/ToolBar.css rename to Source/view/styles/ToolBar.css diff --git a/src/view/svgs/arrow_right_svg.tsx b/Source/view/svgs/arrow_right_svg.tsx similarity index 100% rename from src/view/svgs/arrow_right_svg.tsx rename to Source/view/svgs/arrow_right_svg.tsx diff --git a/src/view/svgs/close_svg.tsx b/Source/view/svgs/close_svg.tsx similarity index 100% rename from src/view/svgs/close_svg.tsx rename to Source/view/svgs/close_svg.tsx diff --git a/src/view/svgs/play_svg.tsx b/Source/view/svgs/play_svg.tsx similarity index 100% rename from src/view/svgs/play_svg.tsx rename to Source/view/svgs/play_svg.tsx diff --git a/src/view/svgs/refresh_svg.tsx b/Source/view/svgs/refresh_svg.tsx similarity index 100% rename from src/view/svgs/refresh_svg.tsx rename to Source/view/svgs/refresh_svg.tsx diff --git a/src/view/svgs/stop_svg.tsx b/Source/view/svgs/stop_svg.tsx similarity index 100% rename from src/view/svgs/stop_svg.tsx rename to Source/view/svgs/stop_svg.tsx diff --git a/src/view/svgs/tag_input_svg.tsx b/Source/view/svgs/tag_input_svg.tsx similarity index 100% rename from src/view/svgs/tag_input_svg.tsx rename to Source/view/svgs/tag_input_svg.tsx diff --git a/src/view/svgs/tag_output_svg.tsx b/Source/view/svgs/tag_output_svg.tsx similarity index 100% rename from src/view/svgs/tag_output_svg.tsx rename to Source/view/svgs/tag_output_svg.tsx diff --git a/src/view/svgs/toolbar_svg.tsx b/Source/view/svgs/toolbar_svg.tsx similarity index 100% rename from src/view/svgs/toolbar_svg.tsx rename to Source/view/svgs/toolbar_svg.tsx diff --git a/src/view/translations/en.json b/Source/view/translations/en.json similarity index 99% rename from src/view/translations/en.json rename to Source/view/translations/en.json index 0a873c763..c5e6ebed9 100644 --- a/src/view/translations/en.json +++ b/Source/view/translations/en.json @@ -1,112 +1,112 @@ -{ - "toolbar-gpio.description": "8 GPIOs on the device! Pin A1 - A7 can also be used as capacitive touch sensors, and A0 is a true analog output pin.", - "toolbar-gpio.title": "GPIO", - "toolbar-gpio.tryItDescription": "Use your mouse to interact with the pin A1 - A7 or use your keyboard SHIFT + ”1” - “7”.", - "toolbar-ir-sensor.description": "Allows you to send commands to the device with a remote control, or even send messages between multiple devices! You can also do very simple proximity sensing since it reads the reflected light.", - "toolbar-ir-sensor.title": "IR Transmit & Receiver", - "toolbar-ir-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-light-sensor.description": "An analog light sensor can be used to detect ambient light, with similar spectral response to the human eye.", - "toolbar-light-sensor.title": "Light Sensor", - "toolbar-light-sensor.tryItDescription": "Change the brightness detected by the sensor here!", - "toolbar-motion-sensor.description": "Detects acceleration in X, Y and Z orientations. It can also detect 'tap' and 'double tap' strikes on the board and when the board is shaken.", - "toolbar-motion-sensor.title": "Motion Sensor", - "toolbar-motion-sensor.tryItDescription": "Change the acceleration here and click or click on the button to simulate a shake. The tap feature is not supported by the Device Simulator Express. If you would like to see the 'tap' feature implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-neo-pixels.description": "The 10 full color RGB LEDs surrounding the outer edge of the boards can be set to any color. Great for beautiful lighting effects!", - "toolbar-neo-pixels.title": "NeoPixels", - "toolbar-neo-pixels.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-a-b-push.description": "Two push buttons A and B are connected to digital pin #4 (Left) and #5 (Right) each.", - "toolbar-a-b-push.title": "Push Buttons", - "toolbar-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-red-led.description": "This Red LED is connected to the digital #13 GPIO pin. It can be very handy when you want an indicator LED.", - "toolbar-red-led.title": "Red LED", - "toolbar-red-led.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-sound-sensor.description": "A digital microphone can detect audio volume and even perform basic FFT functions but cannot read it like an analog voltage.", - "toolbar-sound-sensor.title": "Sound Sensor", - "toolbar-sound-sensor.tryItDescription": "If you would like to see the sound sensor implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-slider-switch.description": "This slide switch returns True or False depending on whether it's ON or OFF and can be used as a toggle switch in your code!", - "toolbar-slider-switch.title": "Slider Switch", - "toolbar-slider-switch.tryItDescription": "Click it with your mouse or press 'S' on your keyboard to switch it ON and OFF!", - "toolbar-speaker.description": "This speaker can play a .wav file and different tones and also has a class D amplifier that is connected to an output A0 pin built in! You can turn it off using the shutdown control on pin #11 on the physical device.", - "toolbar-speaker.title": "Speaker", - "toolbar-speaker.tryItDescription": "Right now the tones are not supported on the simulator. If you would like to see tones implemented, please +1 the feature addition issue on GitHub! Regardless, you can play it on your device!", - "toolbar-temperature-sensor.description": "This sensor uses an NTC thermistor to sense temperature an calculate it with the analog voltage on analog pin #A9.", - "toolbar-temperature-sensor.title": "Temperature Sensor", - "toolbar-temperature-sensor.tryItDescription": "You can set the temperature in degrees Celsius.", - "toolbar-accelerometer-sensor.title": "Accelerometer", - "toolbar-accelerometer-sensor.description": "An accelerometer measures the acceleration of your micro:bit; this component senses when the micro:bit is moved.", - "toolbar-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", - "toolbar-microbit-light-sensor.title": "Light Sensor", - "toolbar-microbit-temperature-sensor.title": "Temperature Sensor", - "toolbar-microbit-led.title": "LEDs", - "toolbar-microbit-led.description": "The microbit has 25 LEDs for you to play with. The LEDs have 9 levels of brightness.", - "toolbar-microbit-led.tryItDescription": "Run your code and see the LEDs light up!", - "toolbar-microbit-a-b-push.title": "Buttons", - "toolbar-microbit-a-b-push.description": "There are two buttons on the front of the micro:bit (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", - "toolbar-microbit-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-microbit-sound.title": "Sound", - "toolbar-microbit-sound.description": "Your BBC micro:bit can be programmed to make a wide variety of sounds - from single notes, tones and beats to your own musical compositions.", - "toolbar-microbit-sound.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-gpio.title": "GPIO (Pins)", - "toolbar-microbit-gpio.description": "On the bottom edge of your BBC micro:bit there are 25 gold strips, called pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", - "toolbar-microbit-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-wireless.title": "Bluetooth & Radio", - "toolbar-microbit-wireless.description": "micro:bits can use radio waves and bluetooth services to communicate with each other.", - - "toolbar-microbit-wireless.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-gesture-sensor.title": "Gesture", - "toolbar-microbit-gesture-sensor.description": "If you move your BBC micro:bit in a certain way (as a gesture) then the micro:bit is able to detect this. It can recognize the following gestures: up, down, left, right, face up, face down, freefall, 3g, 6g, 8g, and shake.", - - "toolbar-microbit-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", - "toolbar-microbit-compass-sensor.title": "Compass", - "toolbar-microbit-compass-sensor.description": "A digital compass is an input sensor that detects magnetic fields. Your BBC micro:bit has an inbuilt compass that can detect the direction in which it is facing.", - "toolbar-microbit-compass-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-temperature-sensor.title": "Temperature", - "toolbar-clue-temperature-sensor.description": "CLUE uses the BMP280 sensor, an environmental sensor with temperature. This precision sensor from Bosch is the best low-cost, precision sensing solution for measuring temperature with ±1.0°C accuracy.", - - "toolbar-clue-temperature-sensor.tryItDescription": "You can simulate the temperature in your code!", - - "toolbar-clue-light-sensor.title": "Light/Color Sensor", - "toolbar-clue-light-sensor.description": "The light sensor uses APDS9960 and is able to return the red, blue, green and clear light.", - "toolbar-clue-light-sensor.tryItDescription": "You can set the color values of the light detected.", - "toolbar-clue-accelerometer-sensor.title": "Accelerometer", - "toolbar-clue-accelerometer-sensor.description": " The 3-axis accelerometer, can tell you which direction is down towards the Earth (by measuring gravity) or how fast the board is accelerating in 3D space.", - "toolbar-clue-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", - "toolbar-clue-led.title": "Neopixel", - "toolbar-clue-led.description": "The CLUE has one full RGB LED (NeoPixel) on the back of the device.", - - "toolbar-clue-led.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-clue-a-b-push.title": "Buttons", - "toolbar-clue-a-b-push.description": "There are two buttons on the front of the CLUE (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", - "toolbar-clue-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-clue-gpio.title": "Input/Output (GPIO)", - "toolbar-clue-gpio.description": "On the bottom edge of your CLUE, you have 25 pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", - "toolbar-clue-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-sound-sensor.title": "Sound", - "toolbar-clue-sound-sensor.description": "The CLUE uses a PDM MEMS microphone. PDM is a little like 1-bit PWM. You clock the mic with a 1 MHz - 3 MHz clock rate, and on the data line you'll get a square wave out that syncs with the clock.", - "toolbar-clue-sound-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-pressure-sensor.title": "Pressure", - "toolbar-clue-pressure-sensor.description": "CLUE uses the BMP280 sensor for barometric pressure. Because pressure changes with altitude, you can also use it as an altimeter with ±1 meter accuracy.", - - "toolbar-clue-pressure-sensor.tryItDescription": "You can set the pressure here in hectoPascals (hPa).", - "toolbar-clue-humidity-sensor.title": "Humidity", - "toolbar-clue-humidity-sensor.description": "The SHT30-D sensor has an excellent ±2% relative humidity and ±0.5°C accuracy for most uses.", - "toolbar-clue-humidity-sensor.tryItDescription": "You can set the humidity in percentage (%) here.", - "toolbar-clue-gesture-sensor.title": "Gesture", - "toolbar-clue-gesture-sensor.description": "The gesture sensor can detect directional gestures (left to right, right to left, up to down, down to up), but in theory more complicated gestures like zig-zag, clockwise or counterclockwise circle, near to far, etc. could also be detected with additional code. ", - "toolbar-clue-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", - "toolbar-clue-proximity-sensor.title": "Proximity", - "toolbar-clue-proximity-sensor.description": "The proximity sensor uses APDS9960 and is able to return how close an object is to the front of the sensor. This is a number from 0 to 255 where the higher the number the closer an object is to the sensor. You won't be able to translate this into an absolute value in units like inches or millimeters, you can only see how it changes relative to other values.", - - "toolbar-clue-proximity-sensor.tryItDescription": "Set relative proximity to the sensor in values from 0 - 255, where 0 means very close and 255 means very far.", - - "toolbar-clue-bluetooth.title": "Bluetooth", - "toolbar-clue-bluetooth.description": "You can transmit data over Bluetooth to a computer or mobile device for data plotting and logging, or save it to the built in storage.", - "toolbar-clue-bluetooth.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! ", - "toolbar-clue-speaker.description": "The CLUE has a buzzer/speaker for playing tones and beeps.", - "toolbar-clue-magnet-sensor.title": "Magnetometer", - "toolbar-clue-magnet-sensor.description": "Sense the magnetic fields that surround us with this handy triple-axis magnetometer (compass) module. Magnetometers can sense where the strongest magnetic force is coming from, generally used to detect magnetic north, but can also be used for measuring magnetic fields.", - "toolbar-clue-magnet-sensor.tryItDescription": "You can set the magnetic field value in microTeslas (uT).", - "toolbar-clue-gyroscope-sensor.title": "Gyroscope", - "toolbar-clue-gyroscope-sensor.description": "The 3-axis gyroscope that can measure spin and twist users LSM6DS33.", - "toolbar-clue-gyroscope-sensor.tryItDescription": "Set the angular velocity in degrees/second." -} +{ + "toolbar-gpio.description": "8 GPIOs on the device! Pin A1 - A7 can also be used as capacitive touch sensors, and A0 is a true analog output pin.", + "toolbar-gpio.title": "GPIO", + "toolbar-gpio.tryItDescription": "Use your mouse to interact with the pin A1 - A7 or use your keyboard SHIFT + ”1” - “7”.", + "toolbar-ir-sensor.description": "Allows you to send commands to the device with a remote control, or even send messages between multiple devices! You can also do very simple proximity sensing since it reads the reflected light.", + "toolbar-ir-sensor.title": "IR Transmit & Receiver", + "toolbar-ir-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-light-sensor.description": "An analog light sensor can be used to detect ambient light, with similar spectral response to the human eye.", + "toolbar-light-sensor.title": "Light Sensor", + "toolbar-light-sensor.tryItDescription": "Change the brightness detected by the sensor here!", + "toolbar-motion-sensor.description": "Detects acceleration in X, Y and Z orientations. It can also detect 'tap' and 'double tap' strikes on the board and when the board is shaken.", + "toolbar-motion-sensor.title": "Motion Sensor", + "toolbar-motion-sensor.tryItDescription": "Change the acceleration here and click or click on the button to simulate a shake. The tap feature is not supported by the Device Simulator Express. If you would like to see the 'tap' feature implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-neo-pixels.description": "The 10 full color RGB LEDs surrounding the outer edge of the boards can be set to any color. Great for beautiful lighting effects!", + "toolbar-neo-pixels.title": "NeoPixels", + "toolbar-neo-pixels.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-a-b-push.description": "Two push buttons A and B are connected to digital pin #4 (Left) and #5 (Right) each.", + "toolbar-a-b-push.title": "Push Buttons", + "toolbar-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", + "toolbar-red-led.description": "This Red LED is connected to the digital #13 GPIO pin. It can be very handy when you want an indicator LED.", + "toolbar-red-led.title": "Red LED", + "toolbar-red-led.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-sound-sensor.description": "A digital microphone can detect audio volume and even perform basic FFT functions but cannot read it like an analog voltage.", + "toolbar-sound-sensor.title": "Sound Sensor", + "toolbar-sound-sensor.tryItDescription": "If you would like to see the sound sensor implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-slider-switch.description": "This slide switch returns True or False depending on whether it's ON or OFF and can be used as a toggle switch in your code!", + "toolbar-slider-switch.title": "Slider Switch", + "toolbar-slider-switch.tryItDescription": "Click it with your mouse or press 'S' on your keyboard to switch it ON and OFF!", + "toolbar-speaker.description": "This speaker can play a .wav file and different tones and also has a class D amplifier that is connected to an output A0 pin built in! You can turn it off using the shutdown control on pin #11 on the physical device.", + "toolbar-speaker.title": "Speaker", + "toolbar-speaker.tryItDescription": "Right now the tones are not supported on the simulator. If you would like to see tones implemented, please +1 the feature addition issue on GitHub! Regardless, you can play it on your device!", + "toolbar-temperature-sensor.description": "This sensor uses an NTC thermistor to sense temperature an calculate it with the analog voltage on analog pin #A9.", + "toolbar-temperature-sensor.title": "Temperature Sensor", + "toolbar-temperature-sensor.tryItDescription": "You can set the temperature in degrees Celsius.", + "toolbar-accelerometer-sensor.title": "Accelerometer", + "toolbar-accelerometer-sensor.description": "An accelerometer measures the acceleration of your micro:bit; this component senses when the micro:bit is moved.", + "toolbar-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", + "toolbar-microbit-light-sensor.title": "Light Sensor", + "toolbar-microbit-temperature-sensor.title": "Temperature Sensor", + "toolbar-microbit-led.title": "LEDs", + "toolbar-microbit-led.description": "The microbit has 25 LEDs for you to play with. The LEDs have 9 levels of brightness.", + "toolbar-microbit-led.tryItDescription": "Run your code and see the LEDs light up!", + "toolbar-microbit-a-b-push.title": "Buttons", + "toolbar-microbit-a-b-push.description": "There are two buttons on the front of the micro:bit (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", + "toolbar-microbit-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", + "toolbar-microbit-sound.title": "Sound", + "toolbar-microbit-sound.description": "Your BBC micro:bit can be programmed to make a wide variety of sounds - from single notes, tones and beats to your own musical compositions.", + "toolbar-microbit-sound.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-microbit-gpio.title": "GPIO (Pins)", + "toolbar-microbit-gpio.description": "On the bottom edge of your BBC micro:bit there are 25 gold strips, called pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", + "toolbar-microbit-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-microbit-wireless.title": "Bluetooth & Radio", + "toolbar-microbit-wireless.description": "micro:bits can use radio waves and bluetooth services to communicate with each other.", + + "toolbar-microbit-wireless.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-microbit-gesture-sensor.title": "Gesture", + "toolbar-microbit-gesture-sensor.description": "If you move your BBC micro:bit in a certain way (as a gesture) then the micro:bit is able to detect this. It can recognize the following gestures: up, down, left, right, face up, face down, freefall, 3g, 6g, 8g, and shake.", + + "toolbar-microbit-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", + "toolbar-microbit-compass-sensor.title": "Compass", + "toolbar-microbit-compass-sensor.description": "A digital compass is an input sensor that detects magnetic fields. Your BBC micro:bit has an inbuilt compass that can detect the direction in which it is facing.", + "toolbar-microbit-compass-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", + "toolbar-clue-temperature-sensor.title": "Temperature", + "toolbar-clue-temperature-sensor.description": "CLUE uses the BMP280 sensor, an environmental sensor with temperature. This precision sensor from Bosch is the best low-cost, precision sensing solution for measuring temperature with ±1.0°C accuracy.", + + "toolbar-clue-temperature-sensor.tryItDescription": "You can simulate the temperature in your code!", + + "toolbar-clue-light-sensor.title": "Light/Color Sensor", + "toolbar-clue-light-sensor.description": "The light sensor uses APDS9960 and is able to return the red, blue, green and clear light.", + "toolbar-clue-light-sensor.tryItDescription": "You can set the color values of the light detected.", + "toolbar-clue-accelerometer-sensor.title": "Accelerometer", + "toolbar-clue-accelerometer-sensor.description": " The 3-axis accelerometer, can tell you which direction is down towards the Earth (by measuring gravity) or how fast the board is accelerating in 3D space.", + "toolbar-clue-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", + "toolbar-clue-led.title": "Neopixel", + "toolbar-clue-led.description": "The CLUE has one full RGB LED (NeoPixel) on the back of the device.", + + "toolbar-clue-led.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-clue-a-b-push.title": "Buttons", + "toolbar-clue-a-b-push.description": "There are two buttons on the front of the CLUE (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", + "toolbar-clue-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", + "toolbar-clue-gpio.title": "Input/Output (GPIO)", + "toolbar-clue-gpio.description": "On the bottom edge of your CLUE, you have 25 pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", + "toolbar-clue-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", + "toolbar-clue-sound-sensor.title": "Sound", + "toolbar-clue-sound-sensor.description": "The CLUE uses a PDM MEMS microphone. PDM is a little like 1-bit PWM. You clock the mic with a 1 MHz - 3 MHz clock rate, and on the data line you'll get a square wave out that syncs with the clock.", + "toolbar-clue-sound-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", + "toolbar-clue-pressure-sensor.title": "Pressure", + "toolbar-clue-pressure-sensor.description": "CLUE uses the BMP280 sensor for barometric pressure. Because pressure changes with altitude, you can also use it as an altimeter with ±1 meter accuracy.", + + "toolbar-clue-pressure-sensor.tryItDescription": "You can set the pressure here in hectoPascals (hPa).", + "toolbar-clue-humidity-sensor.title": "Humidity", + "toolbar-clue-humidity-sensor.description": "The SHT30-D sensor has an excellent ±2% relative humidity and ±0.5°C accuracy for most uses.", + "toolbar-clue-humidity-sensor.tryItDescription": "You can set the humidity in percentage (%) here.", + "toolbar-clue-gesture-sensor.title": "Gesture", + "toolbar-clue-gesture-sensor.description": "The gesture sensor can detect directional gestures (left to right, right to left, up to down, down to up), but in theory more complicated gestures like zig-zag, clockwise or counterclockwise circle, near to far, etc. could also be detected with additional code. ", + "toolbar-clue-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", + "toolbar-clue-proximity-sensor.title": "Proximity", + "toolbar-clue-proximity-sensor.description": "The proximity sensor uses APDS9960 and is able to return how close an object is to the front of the sensor. This is a number from 0 to 255 where the higher the number the closer an object is to the sensor. You won't be able to translate this into an absolute value in units like inches or millimeters, you can only see how it changes relative to other values.", + + "toolbar-clue-proximity-sensor.tryItDescription": "Set relative proximity to the sensor in values from 0 - 255, where 0 means very close and 255 means very far.", + + "toolbar-clue-bluetooth.title": "Bluetooth", + "toolbar-clue-bluetooth.description": "You can transmit data over Bluetooth to a computer or mobile device for data plotting and logging, or save it to the built in storage.", + "toolbar-clue-bluetooth.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! ", + "toolbar-clue-speaker.description": "The CLUE has a buzzer/speaker for playing tones and beeps.", + "toolbar-clue-magnet-sensor.title": "Magnetometer", + "toolbar-clue-magnet-sensor.description": "Sense the magnetic fields that surround us with this handy triple-axis magnetometer (compass) module. Magnetometers can sense where the strongest magnetic force is coming from, generally used to detect magnetic north, but can also be used for measuring magnetic fields.", + "toolbar-clue-magnet-sensor.tryItDescription": "You can set the magnetic field value in microTeslas (uT).", + "toolbar-clue-gyroscope-sensor.title": "Gyroscope", + "toolbar-clue-gyroscope-sensor.description": "The 3-axis gyroscope that can measure spin and twist users LSM6DS33.", + "toolbar-clue-gyroscope-sensor.tryItDescription": "Set the angular velocity in degrees/second." +} diff --git a/src/view/tsconfig.json b/Source/view/tsconfig.json similarity index 100% rename from src/view/tsconfig.json rename to Source/view/tsconfig.json diff --git a/src/view/utils/MessageUtils.tsx b/Source/view/utils/MessageUtils.tsx similarity index 95% rename from src/view/utils/MessageUtils.tsx rename to Source/view/utils/MessageUtils.tsx index 41e093455..a9fcf9c75 100644 --- a/src/view/utils/MessageUtils.tsx +++ b/Source/view/utils/MessageUtils.tsx @@ -1,12 +1,12 @@ -interface vscode { - postMessage(message: any): void; -} - -declare const vscode: vscode; - -export const sendMessage = ( - type: string, - state: TState -) => { - vscode.postMessage({ command: type, text: state }); -}; +interface vscode { + postMessage(message: any): void; +} + +declare const vscode: vscode; + +export const sendMessage = ( + type: string, + state: TState +) => { + vscode.postMessage({ command: type, text: state }); +}; diff --git a/src/view/viewUtils.tsx b/Source/view/viewUtils.tsx similarity index 100% rename from src/view/viewUtils.tsx rename to Source/view/viewUtils.tsx diff --git a/src/vscode_import.ts b/Source/vscode_import.ts similarity index 100% rename from src/vscode_import.ts rename to Source/vscode_import.ts From 703cd3f54962090fde1a53fe1bb85f3e23515814 Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Mon, 30 Oct 2023 12:22:07 +0200 Subject: [PATCH 06/64] squash! --- CODING_STANDARDS.md | 33 +- PRIVACY.md | 34 +- README.md | 254 +- Source/constants.ts | 1014 +-- Source/cpxWorkspace.ts | 36 +- Source/debugger/debugAdapter.ts | 84 +- Source/debugger/debugAdapterFactory.ts | 50 +- Source/debuggerCommunicationServer.ts | 235 +- Source/dev-requirements.txt | 2 +- Source/deviceContext.ts | 274 +- Source/extension.ts | 2080 +++--- Source/extension_utils/utils.ts | 300 +- Source/requirements.txt | 2 +- Source/serialMonitor.ts | 522 +- Source/serialPortControl.ts | 362 +- Source/service/PopupService.ts | 18 +- .../service/debuggerCommunicationService.ts | 44 +- Source/service/deviceSelectionService.ts | 14 +- Source/service/fileSelectionService.ts | 168 +- Source/service/messagingService.ts | 57 +- Source/service/setupService.ts | 1130 ++-- Source/service/telemetryHandlerService.ts | 1054 +-- Source/service/webviewService.ts | 147 +- Source/simulatorDebugConfigurationProvider.ts | 143 +- Source/telemetry/getPackageInfo.ts | 86 +- Source/telemetry/telemetryAI.ts | 134 +- Source/test/runTest.ts | 26 +- Source/test/suite/index.ts | 54 +- Source/usbDetector.ts | 194 +- Source/view/App.css | 22 +- Source/view/App.spec.tsx | 40 +- Source/view/App.tsx | 152 +- Source/view/components/Button.tsx | 45 +- Source/view/components/Dropdown.tsx | 43 +- Source/view/components/clue/Clue.spec.tsx | 40 +- Source/view/components/clue/Clue.tsx | 262 +- Source/view/components/clue/ClueImage.tsx | 252 +- Source/view/components/clue/ClueSimulator.tsx | 550 +- Source/view/components/clue/Clue_svg.tsx | 2309 ++++--- .../components/cpx/Accessibility_utils.ts | 32 +- Source/view/components/cpx/Cpx.spec.tsx | 40 +- Source/view/components/cpx/Cpx.tsx | 164 +- Source/view/components/cpx/CpxImage.tsx | 688 +- Source/view/components/cpx/CpxSimulator.tsx | 730 +- Source/view/components/cpx/Cpx_svg.tsx | 5981 ++++++++--------- Source/view/components/cpx/Cpx_svg_style.tsx | 68 +- Source/view/components/cpx/Svg_utils.tsx | 156 +- .../components/microbit/Microbit.spec.tsx | 40 +- Source/view/components/microbit/Microbit.tsx | 206 +- .../components/microbit/MicrobitImage.tsx | 260 +- .../components/microbit/MicrobitSimulator.tsx | 452 +- .../view/components/microbit/Microbit_svg.tsx | 3661 +++++----- .../view/components/simulator/ActionBar.tsx | 60 +- .../toolbar/GenericSliderComponent.tsx | 66 +- Source/view/components/toolbar/Gesture.tsx | 117 +- .../view/components/toolbar/InputSlider.tsx | 212 +- .../view/components/toolbar/SensorButton.tsx | 59 +- .../components/toolbar/SensorModalUtils.tsx | 274 +- Source/view/components/toolbar/ToolBar.tsx | 392 +- .../view/components/toolbar/Toolbar.spec.tsx | 78 +- .../toolbar/clue/ClueModalContent.tsx | 504 +- .../toolbar/clue/ClueSensorProperties.tsx | 312 +- .../toolbar/cpx/CpxModalContent.tsx | 310 +- .../toolbar/cpx/CpxSensorProperties.tsx | 96 +- .../toolbar/microbit/MicrobitModalContent.tsx | 292 +- .../microbit/MicrobitSensorProperties.tsx | 96 +- Source/view/constants.ts | 220 +- Source/view/container/device/Device.spec.tsx | 40 +- Source/view/container/device/Device.tsx | 48 +- Source/view/index.css | 10 +- Source/view/index.tsx | 10 +- Source/view/pages/gettingStarted.css | 60 +- Source/view/pages/gettingStarted.spec.tsx | 40 +- Source/view/styles/Button.css | 34 +- Source/view/styles/Dropdown.css | 28 +- Source/view/styles/InputSlider.css | 116 +- Source/view/styles/LightSensorBar.css | 24 +- Source/view/styles/MotionSensorBar.css | 18 +- Source/view/styles/SensorButton.css | 32 +- Source/view/styles/Simulator.css | 122 +- Source/view/styles/SimulatorSvg.css | 212 +- Source/view/styles/TemperatureSensorBar.css | 22 +- Source/view/styles/ToolBar.css | 232 +- Source/view/svgs/arrow_right_svg.tsx | 29 +- Source/view/svgs/close_svg.tsx | 39 +- Source/view/svgs/play_svg.tsx | 25 +- Source/view/svgs/refresh_svg.tsx | 27 +- Source/view/svgs/stop_svg.tsx | 29 +- Source/view/svgs/tag_input_svg.tsx | 41 +- Source/view/svgs/tag_output_svg.tsx | 39 +- Source/view/svgs/toolbar_svg.tsx | 1289 ++-- Source/view/translations/en.json | 204 +- Source/view/tsconfig.json | 34 +- Source/view/utils/MessageUtils.tsx | 8 +- Source/view/viewUtils.tsx | 36 +- assets/dark-theme/open-simulator.svg | 8 +- assets/dark-theme/run-on-simulator.svg | 8 +- assets/dark-theme/save-to-board.svg | 8 +- assets/light-theme/open-simulator.svg | 8 +- assets/light-theme/run-on-simulator.svg | 8 +- assets/light-theme/save-to-board.svg | 8 +- docs/developers-setup.md | 119 +- docs/how-to-use.md | 148 +- docs/install.md | 61 +- docs/telemetry.md | 12 +- gulpfile.js | 162 +- jest.config.js | 49 +- locales/en/out/constants.i18n.json | 84 +- locales/en/package.i18n.json | 32 +- misc/usbmapping.json | 31 +- package.json | 668 +- package.nls.json | 32 +- tsconfig.json | 22 +- tslint.json | 64 +- webpack.config.js | 162 +- 115 files changed, 16215 insertions(+), 16159 deletions(-) diff --git a/CODING_STANDARDS.md b/CODING_STANDARDS.md index 629e68791..a19ef621b 100644 --- a/CODING_STANDARDS.md +++ b/CODING_STANDARDS.md @@ -2,24 +2,31 @@ ## Coding guidelines for TypeScript -- The following standards are inspired from [Coding guidelines for TypeScript](https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines) (which you should follow when something is not specified in this document, although any pre-existing practices in a file being edited trump either style guide). +- The following standards are inspired from + [Coding guidelines for TypeScript](https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines) + (which you should follow when something is not specified in this document, + although any pre-existing practices in a file being edited trump either + style guide). ### Names - Use `PascalCase` for type names. -- Use `I` as a prefix for interface names only when an interface is implemented by a class. +- Use `I` as a prefix for interface names only when an interface is + implemented by a class. - Use `PascalCase` for enum values. - Use `camelCase` for function names. - Use `camelCase` for property names and local variables. -- Do not use `_` as a prefix for private properties (unless used as backing properties). +- Do not use `_` as a prefix for private properties (unless used as backing + properties). - Use whole words in names when possible. ### Types -- Do not export types/functions unless you need to share it across multiple components. +- Do not export types/functions unless you need to share it across multiple + components. - Do not introduce new types/values to the global namespace. -- Shared types should be defined in `types.ts`. - Within a file, type definitions should come first. +- Shared types should be defined in `types.ts`. Within a file, type + definitions should come first. ### null and undefined @@ -37,16 +44,21 @@ Use single quotes for strings. ### Imports - Use ES6 module imports. -- Do not use bare `import *`; all imports should either explicitly pull in an object or import an entire module, otherwise you're implicitly polluting the global namespace and making it difficult to figure out from code examination where a name originates from. +- Do not use bare `import *`; all imports should either explicitly pull in an + object or import an entire module, otherwise you're implicitly polluting the + global namespace and making it difficult to figure out from code examination + where a name originates from. ### Style - Use `prettier` to format `TypeScript` and `JavaScript` code. - Use arrow functions over anonymous function expressions. -- Always surround loop and conditional bodies with curly braces. Statements on the same line are allowed to omit braces. +- Always surround loop and conditional bodies with curly braces. Statements on + the same line are allowed to omit braces. - Open curly braces always go on the same line as whatever necessitates them. - Parenthesized constructs should have no surrounding whitespace. -- A single space follows commas, colons, and semicolons in those constructs. For example: +- A single space follows commas, colons, and semicolons in those constructs. + For example: - `for (var i = 0, n = str.length; i < 10; i++) { }` - `if (x < 10) { }` @@ -58,4 +70,5 @@ Use single quotes for strings. ## Coding Standards for Python -Please follow the [Google Python Style Guide](https://google.github.io/styleguide/pyguide.html). +Please follow the +[Google Python Style Guide](https://google.github.io/styleguide/pyguide.html). diff --git a/PRIVACY.md b/PRIVACY.md index c97adaf9a..7ca7ec04b 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -2,21 +2,31 @@ ## Data Collection -The software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft's privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704​​​​​​​. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices. +The software may collect information about you and your use of the software and +send it to Microsoft. Microsoft may use this information to provide services and +improve our products and services. You may turn off the telemetry as described +in the repository. There are also some features in the software that may enable +you and Microsoft to collect data from users of your applications. If you use +these features, you must comply with applicable law, including providing +appropriate notices to users of your applications together with a copy of +Microsoft's privacy statement. Our privacy statement is located at +https://go.microsoft.com/fwlink/?LinkID=824704​​​​​​​. You can learn more about +data collection and use in the help documentation and our privacy statement. +Your use of the software operates as your consent to these practices. ## Disable Telemetry -The Microsoft Device Simulator Express Extension for Visual Studio Code collects usage -data and sends it to Microsoft to help improve our products and -services. Read our -[privacy statement](https://privacy.microsoft.com/privacystatement) to -learn more. This extension respects the `telemetry.enableTelemetry` -setting which you can learn more about at +The Microsoft Device Simulator Express Extension for Visual Studio Code collects +usage data and sends it to Microsoft to help improve our products and services. +Read our [privacy statement](https://privacy.microsoft.com/privacystatement) to +learn more. This extension respects the `telemetry.enableTelemetry` setting +which you can learn more about at https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting. To disable telemetry, follow these steps: -1) Open **File** (Open **Code** on macOS) -2) Select **Preferences** -3) Select **Settings** -4) Search for `telemetry` -5) Uncheck the **Telemetry: Enable Telemetry** setting \ No newline at end of file + +1. Open **File** (Open **Code** on macOS) +2. Select **Preferences** +3. Select **Settings** +4. Search for `telemetry` +5. Uncheck the **Telemetry: Enable Telemetry** setting diff --git a/README.md b/README.md index fd019ee59..ed0782015 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,44 @@ # ⚠️ NOTE: this extension is no longer maintained! ⚠️ -Please see the [deprecation notice](https://github.com/microsoft/vscode-python-devicesimulator/wiki/Deprecation-of-the-extension) for details. +Please see the +[deprecation notice](https://github.com/microsoft/vscode-python-devicesimulator/wiki/Deprecation-of-the-extension) +for details. # Device Simulator Express, a Microsoft Garage project -Make without limit! Device Simulator Express, a Microsoft Garage project, allows you to code microcontrollers without the hardware on hand! You can program your Adafruit Circuit Playground Express (CPX), your BBC micro:bit or the Adafruit CLUE! Test and debug your code on the device simulator and see the same -result when you plug in your actual microcontroller. Curious about the output of the device, the serial -monitor allows you to observe the device output. +Make without limit! Device Simulator Express, a Microsoft Garage project, allows +you to code microcontrollers without the hardware on hand! You can program your +Adafruit Circuit Playground Express (CPX), your BBC micro:bit or the Adafruit +CLUE! Test and debug your code on the device simulator and see the same result +when you plug in your actual microcontroller. Curious about the output of the +device, the serial monitor allows you to observe the device output. ## Table of Contents - - [Devices we support](#devices-we-support) - - [Prerequisites](#prerequisites) - - [Adafruit Circuit Playground Express (CPX) Simulator](#adafruit-circuit-playground-express-cpx-simulator) - - [Features](#features) - - [Useful Links](#useful-links) - - [Keyboard Shortcuts](#keyboard-shortcuts) - - [BBC micro:bit Simulator](#bbc-microbit-simulator) - - [Features](#features-1) - - [Useful Links](#useful-links-1) - - [Keyboard Shortcuts](#keyboard-shortcuts-1) - - [Adafruit CLUE Simulator](#adafruit-clue-simulator) - - [Features](#features-2) - - [Useful Links](#useful-links-2) - - [Keyboard Shortcuts](#keyboard-shortcuts-2) - - [How to use](#how-to-use) - - [Commands](#commands) - - [Contribute](#contribute) - - [Provide feedback](#provide-feedback) - - [Privacy and Telemetry Notice](#privacy-and-telemetry-notice) - - [Third Party Notice](#third-party-notice) - - [Troubleshooting Tips](#troubleshooting-tips) - - [License](#license) - - [Notes](#notes) - + +- [Devices we support](#devices-we-support) +- [Prerequisites](#prerequisites) +- [Adafruit Circuit Playground Express (CPX) Simulator](#adafruit-circuit-playground-express-cpx-simulator) + - [Features](#features) + - [Useful Links](#useful-links) + - [Keyboard Shortcuts](#keyboard-shortcuts) +- [BBC micro:bit Simulator](#bbc-microbit-simulator) + - [Features](#features-1) + - [Useful Links](#useful-links-1) + - [Keyboard Shortcuts](#keyboard-shortcuts-1) +- [Adafruit CLUE Simulator](#adafruit-clue-simulator) + - [Features](#features-2) + - [Useful Links](#useful-links-2) + - [Keyboard Shortcuts](#keyboard-shortcuts-2) +- [How to use](#how-to-use) + - [Commands](#commands) +- [Contribute](#contribute) +- [Provide feedback](#provide-feedback) +- [Privacy and Telemetry Notice](#privacy-and-telemetry-notice) +- [Third Party Notice](#third-party-notice) +- [Troubleshooting Tips](#troubleshooting-tips) +- [License](#license) +- [Notes](#notes) + ## Devices we support - [**Adafruit Circuit Playground Express (CPX)**](#adafruit-circuit-playground-express-cpx-simulator) @@ -57,18 +63,23 @@ monitor allows you to observe the device output. ## Prerequisites -The following dependencies are required to install before launching Device Simulator Express. +The following dependencies are required to install before launching Device +Simulator Express. You will be prompted to install the Python dependencies during the first use. - _**[Visual Studio Code](https://code.visualstudio.com/)**_ -- _**[Python 3.7+](https://www.python.org/downloads/)**_: Make sure you've added Python and pip to your PATH in your environment variables. (1) -- _**[Python VS Code extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python)**_: This will be installed automatically from the marketplace when you install Device Simulator Express. +- _**[Python 3.7+](https://www.python.org/downloads/)**_: Make sure you've + added Python and pip to your PATH in your environment variables. (1) +- _**[Python VS Code extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python)**_: + This will be installed automatically from the marketplace when you install + Device Simulator Express. ## Adafruit Circuit Playground Express (CPX) Simulator ### Features -- IntelliSense and syntax highlighting for CircuitPython code for the CPX library +- IntelliSense and syntax highlighting for CircuitPython code for the CPX + library - Template file generation - Integrated Python Debugging for the Simulator - Serial monitor (available on Windows and Mac only) @@ -88,9 +99,12 @@ You will be prompted to install the Python dependencies during the first use. - Temperature sensor - 7 Capacitive Touch sensors -The simulator supports most of the sensors on CPX except **IR transmitter & Receiver**, **Sound Sensor (microphone)**, **Speaker (Play Tone)** and the **"tap" on Motion Sensor**. -The code related to these sensors can still run on the actual CPX board and be deployed using Device Simulator Express. -As we only support CPX library now, other libraries (i.e. simpleio) can’t run on the simulator. But they will work on the actual device! +The simulator supports most of the sensors on CPX except **IR transmitter & +Receiver**, **Sound Sensor (microphone)**, **Speaker (Play Tone)** and the +**"tap" on Motion Sensor**. The code related to these sensors can still run on +the actual CPX board and be deployed using Device Simulator Express. +As we only support CPX library now, other libraries (i.e. simpleio) can’t run on +the simulator. But they will work on the actual device! ### Useful Links @@ -107,8 +121,10 @@ As we only support CPX library now, other libraries (i.e. simpleio) can’t run In Device Simulator Express, you can use keyboard to interact with the device: -- Push Button: A for Button A, B for Button B, C for Buttons A & B -- Capacitive Touch Sensor: Shift + 1 ~ 7 for GPIO pins A1 - A7 +- Push Button: A for Button A, B for Button B, + C for Buttons A & B +- Capacitive Touch Sensor: Shift + 1 ~ 7 for + GPIO pins A1 - A7 - Slider Switch: Shift + S - Refresh the simulator: Shift + R - Run the simulator: Shift + F @@ -117,7 +133,8 @@ In Device Simulator Express, you can use keyboard to interact with the device: ### Features -- IntelliSense and syntax highlighting for MicroPython code for the micro:bit library +- IntelliSense and syntax highlighting for MicroPython code for the micro:bit + library - Template file generation - Integrated Python Debugging for the Simulator - Deploy MicroPython code to the physical device @@ -138,7 +155,8 @@ In Device Simulator Express, you can use keyboard to interact with the device: ### Keyboard Shortcuts -- Push Button: A for Button A, B for Button B, C for Buttons A & B +- Push Button: A for Button A, B for Button B, + C for Buttons A & B - Refresh the simulator: Shift + R - Run the simulator: Shift + F @@ -146,7 +164,8 @@ In Device Simulator Express, you can use keyboard to interact with the device: ### Features -- IntelliSense and syntax highlighting for CircuitPython code for the following drivers and libraries: +- IntelliSense and syntax highlighting for CircuitPython code for the + following drivers and libraries: - `adafruit_clue` - `adafruit_slideshow` - `adafruit_display_shapes` @@ -182,19 +201,26 @@ In Device Simulator Express, you can use keyboard to interact with the device: ### Keyboard Shortcuts -- Push Button: A for Button A, B for Button B, C for Buttons A & B +- Push Button: A for Button A, B for Button B, + C for Buttons A & B - Refresh the simulator: Shift + R - Run the simulator: Shift + F ## How to use -To use Device Simulator Express, install the extension from the marketplace and reload VS Code. +To use Device Simulator Express, install the extension from the marketplace and +reload VS Code. -To access many of the commands, you need to open the command palette. This can be done with Ctrl + Shift + P for Windows and Linux / Cmd + Shift + P for Mac. It can also be accessed from the toolbar by going to `View -> Command Palette`. +To access many of the commands, you need to open the command palette. This can +be done with Ctrl + Shift + P for Windows and +Linux / Cmd + Shift + P for Mac. It can also be +accessed from the toolbar by going to `View -> Command Palette`. ### I. Take a look at the "Device Simulator Express: Getting Started" Command. -1. Type in `"Device Simulator Express: Getting Started"` in the command palette (Ctrl + Shift + P / Cmd + Shift + P to open the command palette). +1. Type in `"Device Simulator Express: Getting Started"` in the command palette + (Ctrl + Shift + P / Cmd + + Shift + P to open the command palette). 2. Choose the the device you want to play with from the dropdown. 3. Read, copy and learn some of the things you can do with the simulator! @@ -202,40 +228,51 @@ To access many of the commands, you need to open the command palette. This can b ### II. Start with the "Device Simulator Express: New File" Command. -1. Type in `"Device Simulator Express: New File"` in the command palette (Ctrl + Shift + P / Cmd + Shift + P to open the command palette). +1. Type in `"Device Simulator Express: New File"` in the command palette + (Ctrl + Shift + P / Cmd + + Shift + P to open the command palette). 2. Select the device you want to use. 3. Name and save your file somewhere, and we’re good to go! -4. Start with some examples: you can find examples files and tutorials inside the comments at the top of the file. +4. Start with some examples: you can find examples files and tutorials inside + the comments at the top of the file. "New File" animation ### III. Start from an existing Python file. 1. Open the folder or your .py file in Visual Studio Code. -2. Run `Device Simulator Express: Open Simulator` from the command palette or icon in the editor toolbar. +2. Run `Device Simulator Express: Open Simulator` from the command palette or + icon in the editor toolbar. 3. Select the device you want to use. ### IV. Run your code on the simulator. -1. Run `Run Simulator` from the command palette or use the `Play` button on the simulator webview. +1. Run `Run Simulator` from the command palette or use the `Play` button on the + simulator webview. How to run the simulator animation ### V. Deploy your code to the physical device -Before deploying the Python code to your CPX device, you need to format your device by following these tutorials: +Before deploying the Python code to your CPX device, you need to format your +device by following these tutorials: - _For the CPX_: - - Download the firmware with the .uf2 file (link: https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart). - - Download the lastest versions of the cpx libraries (link: https://learn.adafruit.com/welcome-to-circuitpython/circuitpython-libraries). + - Download the firmware with the .uf2 file (link: + https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart). + - Download the lastest versions of the cpx libraries (link: + https://learn.adafruit.com/welcome-to-circuitpython/circuitpython-libraries). - _For the micro:bit_: - - Download the firmware with the .hex file (link: https://microbit.org/get-started/user-guide/firmware/). + - Download the firmware with the .hex file (link: + https://microbit.org/get-started/user-guide/firmware/). - _For the CLUE_: - - Download the latest versions of the cpx libraries and follow the instructions here (link:https://learn.adafruit.com/adafruit-clue/circuitpython). + - Download the latest versions of the cpx libraries and follow the + instructions here + (link:https://learn.adafruit.com/adafruit-clue/circuitpython). 1. Plug in your device (make sure it’s formatted properly already). 2. Run the command `"Device Simulator Express: Deploy to Device"`. @@ -252,21 +289,35 @@ Before deploying the Python code to your CPX device, you need to format your dev ### VII. Debug your project on the simulator 1. Add breakpoints in your code -2. Press F5 to enter the debugging mode, and you can start debugging line by line! +2. Press F5 to enter the debugging mode, and you can start debugging line by + line! ### Commands -Device Simulator Express provides several commands in the Command Palette (F1 or Ctrl + Shift + P / Cmd + Shift + P for Mac OS) for working with \*.py files: - -- `Device Simulator Express: Getting Started`: Opens a page in VS Code that helps users get started with the extension. Here, users can browse through code that they can use to play with the simulators. -- `Device Simulator Express: Run Simulator`: Runs Python code on the simulator. -- `Device Simulator Express: New File`: Opens an unsaved .py file with template code, also opens the simulator for the selected device. -- `Device Simulator Express: Open Simulator`: Opens the simulator in the simulator window for the selected device -- `Device Simulator Express: Deploy to Device`: Copies the current file to the selected device. -- `Device Simulator Express: Open Serial Monitor`: Opens the serial monitor in the integrated output window. -- `Device Simulator Express: Close Serial Monitor`: Stops the serial monitor and releases the serial port. -- `Device Simulator Express: Change Baud Rate`: Changes the baud rate of the selected serial port. For Adafruit CPX, the default baud rate is 115200. -- `Device Simulator Express: Select Serial Port`: Changes the current serial port. +Device Simulator Express provides several commands in the Command Palette +(F1 or Ctrl + Shift + P / +Cmd + Shift + P for Mac OS) for working with +\*.py files: + +- `Device Simulator Express: Getting Started`: Opens a page in VS Code that + helps users get started with the extension. Here, users can browse through + code that they can use to play with the simulators. +- `Device Simulator Express: Run Simulator`: Runs Python code on the + simulator. +- `Device Simulator Express: New File`: Opens an unsaved .py file with + template code, also opens the simulator for the selected device. +- `Device Simulator Express: Open Simulator`: Opens the simulator in the + simulator window for the selected device +- `Device Simulator Express: Deploy to Device`: Copies the current file to the + selected device. +- `Device Simulator Express: Open Serial Monitor`: Opens the serial monitor in + the integrated output window. +- `Device Simulator Express: Close Serial Monitor`: Stops the serial monitor + and releases the serial port. +- `Device Simulator Express: Change Baud Rate`: Changes the baud rate of the + selected serial port. For Adafruit CPX, the default baud rate is 115200. +- `Device Simulator Express: Select Serial Port`: Changes the current serial + port. ## Contribute @@ -274,25 +325,37 @@ Device Simulator Express provides several commands in the Command Palette ( ## Provide feedback -To add a review for our extension, please do so on the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-python.devicesimulatorexpress) +To add a review for our extension, please do so on the +[Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-python.devicesimulatorexpress) -To report issues, provide feedback or requests, please use this link: [Provide Feedback](https://github.com/microsoft/vscode-python-devicesimulator/issues). -We would love to hear from you about your experience to keep improving our project. +To report issues, provide feedback or requests, please use this link: +[Provide Feedback](https://github.com/microsoft/vscode-python-devicesimulator/issues). +We would love to hear from you about your experience to keep improving our +project. ## Privacy and Telemetry Notice ### Data Collection -The software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft's privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices. +The software may collect information about you and your use of the software and +send it to Microsoft. Microsoft may use this information to provide services and +improve our products and services. You may turn off the telemetry as described +in the repository. There are also some features in the software that may enable +you and Microsoft to collect data from users of your applications. If you use +these features, you must comply with applicable law, including providing +appropriate notices to users of your applications together with a copy of +Microsoft's privacy statement. Our privacy statement is located at +https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data +collection and use in the help documentation and our privacy statement. Your use +of the software operates as your consent to these practices. ### Disable Telemetry -The Microsoft Device Simulator Express Extension for Visual Studio Code collects usage -data and sends it to Microsoft to help improve our products and -services. Read our -[privacy statement](https://privacy.microsoft.com/privacystatement) to -learn more. This extension respects the `telemetry.enableTelemetry` -setting which you can learn more about at +The Microsoft Device Simulator Express Extension for Visual Studio Code collects +usage data and sends it to Microsoft to help improve our products and services. +Read our [privacy statement](https://privacy.microsoft.com/privacystatement) to +learn more. This extension respects the `telemetry.enableTelemetry` setting +which you can learn more about at https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting. To disable telemetry, follow these steps: @@ -305,17 +368,34 @@ To disable telemetry, follow these steps: ## Third Party Notice -A `ThirdPartyNotices.txt` file is provided in the extension's source code listing the appropriate third-party notices. +A `ThirdPartyNotices.txt` file is provided in the extension's source code +listing the appropriate third-party notices. ## Troubleshooting Tips -- The first time you install the extension, you'll need to execute the `run` command at least once in order to access auto-completion. -- While running a code file, if you get an error saying it can't find the file, make sure you've clicked on a valid Python code file before running it. -- To open the output panel again after closing it go to VS Code menu: `View -> Output`. -- If you try to deploy to the CPX while it's plugged in but you still get an error saying it cannot find the board, make sure your device is formatted correctly and that its name matches `CIRCUITPY`. -- If you can't get the Simulator communication working while debugging, try to open your `Settings` and check the port used under `"Device Simulator Express: Debugger Server Port"`. You can either change it (usually ports above 5000 should work) or try to free it, then start debugging again. -- When you are using the serial monitor, if you get some unusual error messages, unplug the device and reload the VS Code windows. -- If you're using Ubuntu and having some problems with setting up the environment, try reviewing [this article's](https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-local-programming-environment-on-ubuntu-16-04) "Step 1" section on how to set up Python 3 on Ubuntu 16.04. Then, ensure that you've run `sudo apt-get install -y python3-venv` to allow for virtual environment creation. +- The first time you install the extension, you'll need to execute the `run` + command at least once in order to access auto-completion. +- While running a code file, if you get an error saying it can't find the + file, make sure you've clicked on a valid Python code file before running + it. +- To open the output panel again after closing it go to VS Code menu: + `View -> Output`. +- If you try to deploy to the CPX while it's plugged in but you still get an + error saying it cannot find the board, make sure your device is formatted + correctly and that its name matches `CIRCUITPY`. +- If you can't get the Simulator communication working while debugging, try to + open your `Settings` and check the port used under + `"Device Simulator Express: Debugger Server Port"`. You can either change it + (usually ports above 5000 should work) or try to free it, then start + debugging again. +- When you are using the serial monitor, if you get some unusual error + messages, unplug the device and reload the VS Code windows. +- If you're using Ubuntu and having some problems with setting up the + environment, try reviewing + [this article's](https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-local-programming-environment-on-ubuntu-16-04) + "Step 1" section on how to set up Python 3 on Ubuntu 16.04. Then, ensure + that you've run `sudo apt-get install -y python3-venv` to allow for virtual + environment creation. ## License @@ -345,5 +425,9 @@ A `ThirdPartyNotices.txt` file is provided in the extension's source code listin ## Notes -1. Make sure that when you type _python_ in a terminal, the command is recognized and you have the correct version. The easiest way to do it is to select the "Add to PATH" option directly when you install Python. Otherwise you can search how to insert it manually. -2. You can choose to see the prompt or not by changing the extension configurations. +1. Make sure that when you type _python_ in a terminal, the command is + recognized and you have the correct version. The easiest way to do it is to + select the "Add to PATH" option directly when you install Python. Otherwise + you can search how to insert it manually. +2. You can choose to see the prompt or not by changing the extension + configurations. diff --git a/Source/constants.ts b/Source/constants.ts index b14d875f0..fe702c639 100644 --- a/Source/constants.ts +++ b/Source/constants.ts @@ -7,549 +7,549 @@ import * as nls from "vscode-nls"; // Debugger Server export const SERVER_INFO = { - DEFAULT_SERVER_PORT: 5577, - ERROR_CODE_INIT_SERVER: "ERROR_INIT_SERVER", - SERVER_PORT_CONFIGURATION: "deviceSimulatorExpress.debuggerServerPort", + DEFAULT_SERVER_PORT: 5577, + ERROR_CODE_INIT_SERVER: "ERROR_INIT_SERVER", + SERVER_PORT_CONFIGURATION: "deviceSimulatorExpress.debuggerServerPort", }; const localize: nls.LocalizeFunc = nls.config({ - messageFormat: nls.MessageFormat.file, + messageFormat: nls.MessageFormat.file, })(); export const CONFIG = { - CONFIG_ENV_ON_SWITCH: - "deviceSimulatorExpress.configNewEnvironmentUponSwitch", - PYTHON_PATH: "python.pythonPath", - SHOW_DEPENDENCY_INSTALL: "deviceSimulatorExpress.showDependencyInstall", - SHOW_NEW_FILE_POPUP: "deviceSimulatorExpress.showNewFilePopup", + CONFIG_ENV_ON_SWITCH: + "deviceSimulatorExpress.configNewEnvironmentUponSwitch", + PYTHON_PATH: "python.pythonPath", + SHOW_DEPENDENCY_INSTALL: "deviceSimulatorExpress.showDependencyInstall", + SHOW_NEW_FILE_POPUP: "deviceSimulatorExpress.showNewFilePopup", }; export const CONSTANTS = { - WEBVIEW_TYPE: { - SIMULATOR: "simulator", - TUTORIAL: "tutorial", - }, - DEBUG_CONFIGURATION_TYPE: "deviceSimulatorExpress", - DEVICE_NAME: { - CPX: "CPX", - MICROBIT: "micro:bit", - CLUE: "CLUE", - }, - DEVICE_NAME_FORMAL: { - CPX: "Circuit Playground Express", - MICROBIT: "micro:bit", - CLUE: "CLUE", - }, - SCRIPT_PATH: { - SIMULATOR: "out/simulator.js", - VSCODE_API: "out/vscode_import.js", - }, - ERROR: { - BAD_PYTHON_PATH: - 'Your interpreter is not pointing to a valid Python executable. Please select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application', - COMPORT_UNKNOWN_ERROR: - "Writing to COM port (GetOverlappedResult): Unknown error code 121", - CPX_FILE_ERROR: localize( - "error.cpxFileFormat", - "The cpx.json file format is not correct." - ), - DEBUGGER_SERVER_INIT_FAILED: (port: number) => { - return localize( - "error.debuggerServerInitFailed", - `Warning : The Debugger Server cannot be opened. Please try to free the port ${port} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.` - ); - }, - DEBUGGING_SESSION_IN_PROGESS: localize( - "error.debuggingSessionInProgress", - "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n" - ), - DEPENDENCY_DOWNLOAD_ERROR: - "Dependency download could not be completed. Functionality may be limited. Please review the installation docs.", - - FAILED_TO_OPEN_SERIAL_PORT: (port: string): string => { - return localize( - "error.failedToOpenSerialPort", - `[ERROR] Failed to open serial port ${port}.` - ); - }, - FAILED_TO_OPEN_SERIAL_PORT_DUE_TO: (port: string, error: any) => { - return localize( - "error.failedToOpenSerialPortDueTo", - `[ERROR] Failed to open serial port ${port} due to error: ${error}. \n` - ); - }, - INSTALLATION_ERROR: localize( - "error.installationError", - "Installation Error" - ), - - INVALID_FILE_EXTENSION_DEBUG: localize( - "error.invalidFileExtensionDebug", - "The file you tried to run isn't a Python file." - ), - INVALID_PYTHON_PATH: localize( - "error.invalidPythonPath", - 'We found that your selected Python interpreter version is too low to run the extension. Please upgrade to version 3.7+ or select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application.' - ), - LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT: localize( - "error.lowPythonVersionForMicrobitDeployment", - "To deploy your code to the micro:bit, you must be using Python 3.3+" - ), - NO_DEVICE: localize( - "error.noDevice", - "The device is not detected. Please double check if your board is connected and/or properly formatted" - ), - NO_FILE_TO_RUN: localize( - "error.noFileToRun", - '[ERROR] We can\'t find a Python file to run. Please make sure you select or open a new ".py" code file, or use the "New File" command to get started and see useful links.\n' - ), - NO_FILE_TO_DEPLOY: localize( - "error.noFileToDeploy", - "[ERROR] We can't find a Python file to deploy to your device.\n" - ), - NO_FOLDER_OPENED: localize( - "error.noFolderCreated", - "In order to use the Serial Monitor, you need to open a folder and reload VS Code." - ), - NO_PROGRAM_FOUND_DEBUG: localize( - "error.noProgramFoundDebug", - "Cannot find a program to debug." - ), - NO_PYTHON_PATH: localize( - "error.noPythonPath", - "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again." - ), - RECONNECT_DEVICE: localize( - "error.reconnectDevice", - "Please disconnect your Circuit Playground Express and try again." - ), - STDERR: (data: string) => { - return localize("error.stderr", `\n[ERROR] ${data} \n`); - }, - UNEXPECTED_MESSAGE: localize( - "error.unexpectedMessage", - "Webview sent an unexpected message" - ), - }, - FILESYSTEM: { - BASE_CIRCUITPYTHON: "base_circuitpython", - CLUE: "clue", - PYTHON_VENV_DIR: "venv", - MICROPYTHON_DIRECTORY: "micropython", - OUTPUT_DIRECTORY: "out", - }, - INFO: { - ALREADY_SUCCESSFUL_INSTALL: localize( - "info.successfulInstall", - "Your current configuration is already successfully set up for the Device Simulator Expresss." - ), - ARE_YOU_SURE: localize( - "info.areYouSure", - "Are you sure you don't want to install the dependencies? The extension can't run without installing them." - ), - CLOSED_SERIAL_PORT: (port: string) => { - return localize( - "info.closedSerialPort", - `[DONE] Closed the serial port - ${port} \n` - ); - }, - COMPLETED_MESSAGE: "Completed", - CPX_JSON_ALREADY_GENERATED: localize( - "info.cpxJsonAlreadyGenerated", - "cpx.json has already been generated." - ), - DEPLOY_DEVICE: localize( - "info.deployDevice", - "\n[INFO] Deploying code to the device...\n" - ), - DEPLOY_SIMULATOR: localize( - "info.deploySimulator", - "\n[INFO] Deploying code to the simulator...\n" - ), - DEPLOY_SUCCESS: localize( - "info.deploySuccess", - "\n[INFO] Code successfully copied! Your device should be loading and ready to go shortly.\n" - ), - EXTENSION_ACTIVATED: localize( - "info.extensionActivated", - "Congratulations, your extension Device Simulator Express is now active!" - ), - FILE_SELECTED: (filePath: string) => { - return localize( - "info.fileSelected", - `[INFO] File selected : ${filePath} \n` - ); - }, - FIRST_TIME_WEBVIEW: localize( - "info.firstTimeWebview", - 'To reopen the simulator select the command "Open Simulator" from command palette.' - ), - INSTALLING_PYTHON_VENV: localize( - "info.installingPythonVenv", - "A virtual environment is currently being created. The required Python packages will be installed. You will be prompted a message telling you when the installation is done." - ), - INSTALL_PYTHON_DEPS: localize( - "info.installPythonDependencies", - "Do you want us to try and install this extension's dependencies on your selected Python interpreter for you?" - ), - INSTALL_PYTHON_VENV: localize( - "info.installPythonVenv", - "Do you want us to try and install this extension's dependencies via virtual environment for you?" - ), - NEW_FILE: localize( - "info.newFile", - "New to Python or the Circuit Playground Express? We are here to help!" - ), - NO_DEVICE_CHOSEN_TO_DEPLOY_TO: localize( - "info.noDeviceChosenToDeployTo", - "\n[INFO] No device was selected to deploy to.\n" - ), - NO_DEVICE_CHOSEN_TO_SIMULATE_TO: localize( - "info.noDeviceChosenToSimulateTo", - "\n[INFO] No device was selected to simulate.\n" - ), - NO_DEVICE_CHOSEN_FOR_NEW_FILE: localize( - "info.noDeviceChosenForNewFile", - "\n[INFO] No device was selected to open a template file for.\n" - ), - OPENED_SERIAL_PORT: (port: string) => { - return localize( - "info.openedSerialPort", - `[INFO] Opened the serial port - ${port} \n` - ); - }, - OPENING_SERIAL_PORT: (port: string) => { - return localize( - "info.openingSerialPort", - `[STARTING] Opening the serial port - ${port} \n` - ); - }, - PLEASE_OPEN_FOLDER: localize( - "info.pleaseOpenFolder", - "Please open a folder first." - ), - REDIRECT: localize("info.redirect", "You are being redirected."), - RUNNING_CODE: localize("info.runningCode", "Running user code"), - SUCCESSFUL_INSTALL: localize( - "info.successfulInstall", - "Successfully set up the Python environment." - ), - THIRD_PARTY_WEBSITE_ADAFRUIT: localize( - "info.thirdPartyWebsiteAdafruit", - 'By clicking "Agree and Proceed" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit\'s privacy policy' - ), - THIRD_PARTY_WEBSITE_PIP: localize( - "info.thirdPartyWebsitePip", - 'By clicking "Agree and Proceed" you will be redirected to pip.pypa.io, a third party website not managed by Microsoft. Please note that your activity on pip.pypa.io is subject to PyPA\'s privacy policy' - ), - THIRD_PARTY_WEBSITE_PYTHON: localize( - "info.thirdPartyWebsitePython", - 'By clicking "Agree and Proceed" you will be redirected to python.org, a third party website not managed by Microsoft. Please note that your activity on python.org is subject to Python\'s privacy policy' - ), - UPDATED_TO_EXTENSION_VENV: localize( - "info.updatedToExtensionsVenv", - "Automatically updated interpreter to point to extension's virtual environment." - ), - WELCOME_OUTPUT_TAB: localize( - "info.welcomeOutputTab", - "Welcome to the Device Simulator Express output tab!\n\n" - ), - }, - LABEL: { - WEBVIEW_PANEL: localize( - "label.webviewPanel", - "Device Simulator Express" - ), - }, - LINKS: { - DOWNLOAD_PIP: "https://pip.pypa.io/en/stable/installing/", - DOWNLOAD_PYTHON: "https://www.python.org/downloads/", - EXAMPLE_CODE: - "https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples", - CPX_HELP: - "https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart", - CLUE_HELP: "https://learn.adafruit.com/adafruit-clue/circuitpython", - INSTALL: - "https://github.com/microsoft/vscode-python-devicesimulator/blob/dev/docs/install.md", - PRIVACY: "https://www.adafruit.com/privacy", - TUTORIALS: - "https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library", - }, - MISC: { - SELECT_PORT_PLACEHOLDER: localize( - "misc.selectPortPlaceholder", - "Select a serial port" - ), - SERIAL_MONITOR_NAME: localize( - "misc.serialMonitorName", - "Device Simulator Express Serial Monitor" - ), - SERIAL_MONITOR_TEST_IF_OPEN: localize( - "misc.testIfPortOpen", - "Test if serial port is open" - ), - }, - NAME: localize("name", "Device Simulator Express"), - TEMPLATE: { - CPX: "cpx_template.py", - MICROBIT: "microbit_template.py", - CLUE: "clue_template.py", - }, - WARNING: { - ACCEPT_AND_RUN: localize( - "warning.agreeAndRun", - "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk." - ), - INVALID_BAUD_RATE: localize( - "warning.invalidBaudRate", - "Invalid baud rate, keep baud rate unchanged." - ), - NO_RATE_SELECTED: localize( - "warning.noRateSelected", - "No rate is selected, keep baud rate unchanged." - ), - NO_SERIAL_PORT_SELECTED: localize( - "warning.noSerialPortSelected", - "No serial port was selected, please select a serial port first" - ), - SERIAL_MONITOR_ALREADY_OPENED: (port: string) => { - return localize( - "warning.serialMonitorAlreadyOpened", - `Serial monitor is already opened for ${port} \n` - ); - }, - SERIAL_MONITOR_NOT_STARTED: localize( - "warning.serialMonitorNotStarted", - "Serial monitor has not been started." - ), - SERIAL_PORT_NOT_STARTED: localize( - "warning.serialPortNotStarted", - "Serial port has not been started.\n" - ), - }, + WEBVIEW_TYPE: { + SIMULATOR: "simulator", + TUTORIAL: "tutorial", + }, + DEBUG_CONFIGURATION_TYPE: "deviceSimulatorExpress", + DEVICE_NAME: { + CPX: "CPX", + MICROBIT: "micro:bit", + CLUE: "CLUE", + }, + DEVICE_NAME_FORMAL: { + CPX: "Circuit Playground Express", + MICROBIT: "micro:bit", + CLUE: "CLUE", + }, + SCRIPT_PATH: { + SIMULATOR: "out/simulator.js", + VSCODE_API: "out/vscode_import.js", + }, + ERROR: { + BAD_PYTHON_PATH: + 'Your interpreter is not pointing to a valid Python executable. Please select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application', + COMPORT_UNKNOWN_ERROR: + "Writing to COM port (GetOverlappedResult): Unknown error code 121", + CPX_FILE_ERROR: localize( + "error.cpxFileFormat", + "The cpx.json file format is not correct." + ), + DEBUGGER_SERVER_INIT_FAILED: (port: number) => { + return localize( + "error.debuggerServerInitFailed", + `Warning : The Debugger Server cannot be opened. Please try to free the port ${port} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.` + ); + }, + DEBUGGING_SESSION_IN_PROGESS: localize( + "error.debuggingSessionInProgress", + "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n" + ), + DEPENDENCY_DOWNLOAD_ERROR: + "Dependency download could not be completed. Functionality may be limited. Please review the installation docs.", + + FAILED_TO_OPEN_SERIAL_PORT: (port: string): string => { + return localize( + "error.failedToOpenSerialPort", + `[ERROR] Failed to open serial port ${port}.` + ); + }, + FAILED_TO_OPEN_SERIAL_PORT_DUE_TO: (port: string, error: any) => { + return localize( + "error.failedToOpenSerialPortDueTo", + `[ERROR] Failed to open serial port ${port} due to error: ${error}. \n` + ); + }, + INSTALLATION_ERROR: localize( + "error.installationError", + "Installation Error" + ), + + INVALID_FILE_EXTENSION_DEBUG: localize( + "error.invalidFileExtensionDebug", + "The file you tried to run isn't a Python file." + ), + INVALID_PYTHON_PATH: localize( + "error.invalidPythonPath", + 'We found that your selected Python interpreter version is too low to run the extension. Please upgrade to version 3.7+ or select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application.' + ), + LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT: localize( + "error.lowPythonVersionForMicrobitDeployment", + "To deploy your code to the micro:bit, you must be using Python 3.3+" + ), + NO_DEVICE: localize( + "error.noDevice", + "The device is not detected. Please double check if your board is connected and/or properly formatted" + ), + NO_FILE_TO_RUN: localize( + "error.noFileToRun", + '[ERROR] We can\'t find a Python file to run. Please make sure you select or open a new ".py" code file, or use the "New File" command to get started and see useful links.\n' + ), + NO_FILE_TO_DEPLOY: localize( + "error.noFileToDeploy", + "[ERROR] We can't find a Python file to deploy to your device.\n" + ), + NO_FOLDER_OPENED: localize( + "error.noFolderCreated", + "In order to use the Serial Monitor, you need to open a folder and reload VS Code." + ), + NO_PROGRAM_FOUND_DEBUG: localize( + "error.noProgramFoundDebug", + "Cannot find a program to debug." + ), + NO_PYTHON_PATH: localize( + "error.noPythonPath", + "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again." + ), + RECONNECT_DEVICE: localize( + "error.reconnectDevice", + "Please disconnect your Circuit Playground Express and try again." + ), + STDERR: (data: string) => { + return localize("error.stderr", `\n[ERROR] ${data} \n`); + }, + UNEXPECTED_MESSAGE: localize( + "error.unexpectedMessage", + "Webview sent an unexpected message" + ), + }, + FILESYSTEM: { + BASE_CIRCUITPYTHON: "base_circuitpython", + CLUE: "clue", + PYTHON_VENV_DIR: "venv", + MICROPYTHON_DIRECTORY: "micropython", + OUTPUT_DIRECTORY: "out", + }, + INFO: { + ALREADY_SUCCESSFUL_INSTALL: localize( + "info.successfulInstall", + "Your current configuration is already successfully set up for the Device Simulator Expresss." + ), + ARE_YOU_SURE: localize( + "info.areYouSure", + "Are you sure you don't want to install the dependencies? The extension can't run without installing them." + ), + CLOSED_SERIAL_PORT: (port: string) => { + return localize( + "info.closedSerialPort", + `[DONE] Closed the serial port - ${port} \n` + ); + }, + COMPLETED_MESSAGE: "Completed", + CPX_JSON_ALREADY_GENERATED: localize( + "info.cpxJsonAlreadyGenerated", + "cpx.json has already been generated." + ), + DEPLOY_DEVICE: localize( + "info.deployDevice", + "\n[INFO] Deploying code to the device...\n" + ), + DEPLOY_SIMULATOR: localize( + "info.deploySimulator", + "\n[INFO] Deploying code to the simulator...\n" + ), + DEPLOY_SUCCESS: localize( + "info.deploySuccess", + "\n[INFO] Code successfully copied! Your device should be loading and ready to go shortly.\n" + ), + EXTENSION_ACTIVATED: localize( + "info.extensionActivated", + "Congratulations, your extension Device Simulator Express is now active!" + ), + FILE_SELECTED: (filePath: string) => { + return localize( + "info.fileSelected", + `[INFO] File selected : ${filePath} \n` + ); + }, + FIRST_TIME_WEBVIEW: localize( + "info.firstTimeWebview", + 'To reopen the simulator select the command "Open Simulator" from command palette.' + ), + INSTALLING_PYTHON_VENV: localize( + "info.installingPythonVenv", + "A virtual environment is currently being created. The required Python packages will be installed. You will be prompted a message telling you when the installation is done." + ), + INSTALL_PYTHON_DEPS: localize( + "info.installPythonDependencies", + "Do you want us to try and install this extension's dependencies on your selected Python interpreter for you?" + ), + INSTALL_PYTHON_VENV: localize( + "info.installPythonVenv", + "Do you want us to try and install this extension's dependencies via virtual environment for you?" + ), + NEW_FILE: localize( + "info.newFile", + "New to Python or the Circuit Playground Express? We are here to help!" + ), + NO_DEVICE_CHOSEN_TO_DEPLOY_TO: localize( + "info.noDeviceChosenToDeployTo", + "\n[INFO] No device was selected to deploy to.\n" + ), + NO_DEVICE_CHOSEN_TO_SIMULATE_TO: localize( + "info.noDeviceChosenToSimulateTo", + "\n[INFO] No device was selected to simulate.\n" + ), + NO_DEVICE_CHOSEN_FOR_NEW_FILE: localize( + "info.noDeviceChosenForNewFile", + "\n[INFO] No device was selected to open a template file for.\n" + ), + OPENED_SERIAL_PORT: (port: string) => { + return localize( + "info.openedSerialPort", + `[INFO] Opened the serial port - ${port} \n` + ); + }, + OPENING_SERIAL_PORT: (port: string) => { + return localize( + "info.openingSerialPort", + `[STARTING] Opening the serial port - ${port} \n` + ); + }, + PLEASE_OPEN_FOLDER: localize( + "info.pleaseOpenFolder", + "Please open a folder first." + ), + REDIRECT: localize("info.redirect", "You are being redirected."), + RUNNING_CODE: localize("info.runningCode", "Running user code"), + SUCCESSFUL_INSTALL: localize( + "info.successfulInstall", + "Successfully set up the Python environment." + ), + THIRD_PARTY_WEBSITE_ADAFRUIT: localize( + "info.thirdPartyWebsiteAdafruit", + 'By clicking "Agree and Proceed" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit\'s privacy policy' + ), + THIRD_PARTY_WEBSITE_PIP: localize( + "info.thirdPartyWebsitePip", + 'By clicking "Agree and Proceed" you will be redirected to pip.pypa.io, a third party website not managed by Microsoft. Please note that your activity on pip.pypa.io is subject to PyPA\'s privacy policy' + ), + THIRD_PARTY_WEBSITE_PYTHON: localize( + "info.thirdPartyWebsitePython", + 'By clicking "Agree and Proceed" you will be redirected to python.org, a third party website not managed by Microsoft. Please note that your activity on python.org is subject to Python\'s privacy policy' + ), + UPDATED_TO_EXTENSION_VENV: localize( + "info.updatedToExtensionsVenv", + "Automatically updated interpreter to point to extension's virtual environment." + ), + WELCOME_OUTPUT_TAB: localize( + "info.welcomeOutputTab", + "Welcome to the Device Simulator Express output tab!\n\n" + ), + }, + LABEL: { + WEBVIEW_PANEL: localize( + "label.webviewPanel", + "Device Simulator Express" + ), + }, + LINKS: { + DOWNLOAD_PIP: "https://pip.pypa.io/en/stable/installing/", + DOWNLOAD_PYTHON: "https://www.python.org/downloads/", + EXAMPLE_CODE: + "https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples", + CPX_HELP: + "https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart", + CLUE_HELP: "https://learn.adafruit.com/adafruit-clue/circuitpython", + INSTALL: + "https://github.com/microsoft/vscode-python-devicesimulator/blob/dev/docs/install.md", + PRIVACY: "https://www.adafruit.com/privacy", + TUTORIALS: + "https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library", + }, + MISC: { + SELECT_PORT_PLACEHOLDER: localize( + "misc.selectPortPlaceholder", + "Select a serial port" + ), + SERIAL_MONITOR_NAME: localize( + "misc.serialMonitorName", + "Device Simulator Express Serial Monitor" + ), + SERIAL_MONITOR_TEST_IF_OPEN: localize( + "misc.testIfPortOpen", + "Test if serial port is open" + ), + }, + NAME: localize("name", "Device Simulator Express"), + TEMPLATE: { + CPX: "cpx_template.py", + MICROBIT: "microbit_template.py", + CLUE: "clue_template.py", + }, + WARNING: { + ACCEPT_AND_RUN: localize( + "warning.agreeAndRun", + "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk." + ), + INVALID_BAUD_RATE: localize( + "warning.invalidBaudRate", + "Invalid baud rate, keep baud rate unchanged." + ), + NO_RATE_SELECTED: localize( + "warning.noRateSelected", + "No rate is selected, keep baud rate unchanged." + ), + NO_SERIAL_PORT_SELECTED: localize( + "warning.noSerialPortSelected", + "No serial port was selected, please select a serial port first" + ), + SERIAL_MONITOR_ALREADY_OPENED: (port: string) => { + return localize( + "warning.serialMonitorAlreadyOpened", + `Serial monitor is already opened for ${port} \n` + ); + }, + SERIAL_MONITOR_NOT_STARTED: localize( + "warning.serialMonitorNotStarted", + "Serial monitor has not been started." + ), + SERIAL_PORT_NOT_STARTED: localize( + "warning.serialPortNotStarted", + "Serial port has not been started.\n" + ), + }, }; export enum CONFIG_KEYS { - ENABLE_USB_DETECTION = "deviceSimulatorExpress.enableUSBDetection", + ENABLE_USB_DETECTION = "deviceSimulatorExpress.enableUSBDetection", } export enum TelemetryEventName { - FAILED_TO_OPEN_SIMULATOR = "SIMULATOR.FAILED_TO_OPEN", - - // Debugger - CPX_DEBUGGER_INIT_SUCCESS = "CPX.DEBUGGER.INIT.SUCCESS", - CPX_DEBUGGER_INIT_FAIL = "CPX.DEBUGGER.INIT.FAIL", - MICROBIT_DEBUGGER_INIT_SUCCESS = "MICROBIT.DEBUGGER.INIT.SUCCESS", - MICROBIT_DEBUGGER_INIT_FAIL = "MICROBIT.DEBUGGER.INIT.FAIL", - CLUE_DEBUGGER_INIT_SUCCESS = "CLUE.DEBUGGER.INIT.SUCCESS", - CLUE_DEBUGGER_INIT_FAIL = "CLUE.DEBUGGER.INIT.FAIL", - - // Extension commands - COMMAND_RUN_SIMULATOR_BUTTON = "COMMAND.RUN.SIMULATOR_BUTTON", - COMMAND_RUN_PALETTE = "COMMAND.RUN.PALETTE", - COMMAND_INSTALL_EXTENSION_DEPENDENCIES = "COMMAND.INSTALL.EXTENSION.DEPENDENCIES", - COMMAND_SERIAL_MONITOR_CHOOSE_PORT = "COMMAND.SERIAL_MONITOR.CHOOSE_PORT", - COMMAND_SERIAL_MONITOR_OPEN = "COMMAND.SERIAL_MONITOR.OPEN", - COMMAND_SERIAL_MONITOR_BAUD_RATE = "COMMAND.SERIAL_MONITOR.BAUD_RATE", - COMMAND_SERIAL_MONITOR_CLOSE = "COMMAND.SERIAL_MONITOR.CLOSE", - COMMAND_GETTING_STARTED = "COMMAND.GETTING_STARTED", - - CPX_COMMAND_DEPLOY_DEVICE = "CPX.COMMAND.DEPLOY.DEVICE", - CPX_COMMAND_NEW_FILE = "CPX.COMMAND.NEW.FILE.CPX", - CPX_COMMAND_OPEN_SIMULATOR = "CPX.COMMAND.OPEN.SIMULATOR", - - MICROBIT_COMMAND_DEPLOY_DEVICE = "MICROBIT.COMMAND.DEPLOY.DEVICE", - MICROBIT_COMMAND_NEW_FILE = "MICROBIT.COMMAND.NEW.FILE", - MICROBIT_COMMAND_OPEN_SIMULATOR = "MICROBIT.COMMAND.OPEN.SIMULATOR", - - CLUE_COMMAND_DEPLOY_DEVICE = "CLUE.COMMAND.DEPLOY.DEVICE", - CLUE_COMMAND_NEW_FILE = "CLUE.COMMAND.NEW.FILE.CPX", - CLUE_COMMAND_OPEN_SIMULATOR = "CLUE.COMMAND.OPEN.SIMULATOR", - - // Simulator interaction - CPX_SIMULATOR_BUTTON_A = "CPX.SIMULATOR.BUTTON.A", - CPX_SIMULATOR_BUTTON_B = "CPX.SIMULATOR.BUTTON.B", - CPX_SIMULATOR_BUTTON_AB = "CPX.SIMULATOR.BUTTON.AB", - CPX_SIMULATOR_SWITCH = "CPX.SIMULATOR.SWITCH", - - MICROBIT_SIMULATOR_BUTTON_A = "MICROBIT.SIMULATOR.BUTTON.A", - MICROBIT_SIMULATOR_BUTTON_B = "MICROBIT.SIMULATOR.BUTTON.B", - MICROBIT_SIMULATOR_BUTTON_AB = "MICROBIT.SIMULATOR.BUTTON.AB", - - CLUE_SIMULATOR_BUTTON_A = "CLUE.SIMULATOR.BUTTON.A", - CLUE_SIMULATOR_BUTTON_B = "CLUE.SIMULATOR.BUTTON.B", - CLUE_SIMULATOR_BUTTON_AB = "CLUE.SIMULATOR.BUTTON.AB", - - // Sensors - CPX_SIMULATOR_TEMPERATURE_SENSOR = "CPX.SIMULATOR.TEMPERATURE", - CPX_SIMULATOR_LIGHT_SENSOR = "CPX.SIMULATOR.LIGHT", - CPX_SIMULATOR_MOTION_SENSOR = "CPX.SIMULATOR.MOTION", - CPX_SIMULATOR_SHAKE = "CPX.SIMULATOR.SHAKE", - CPX_SIMULATOR_CAPACITIVE_TOUCH = "CPX.SIMULATOR.CAPACITIVE.TOUCH", - - MICROBIT_SIMULATOR_TEMPERATURE_SENSOR = "MICROBIT.SIMULATOR.TEMPERATURE", - MICROBIT_SIMULATOR_LIGHT_SENSOR = "MICROBIT.SIMULATOR.LIGHT", - MICROBIT_SIMULATOR_MOTION_SENSOR = "MICROBIT.SIMULATOR.MOTION", - MICROBIT_SIMULATOR_GESTURE_SENSOR = "MICROBIT.SIMULATOR.GESTURE", - - CLUE_SIMULATOR_TEMPERATURE_SENSOR = "CLUE.SIMULATOR.TEMPERATURE", - CLUE_SIMULATOR_LIGHT_SENSOR = "CLUE.SIMULATOR.LIGHT", - CLUE_SIMULATOR_MOTION_SENSOR = "CLUE.SIMULATOR.MOTION", - CLUE_SIMULATOR_GESTURE_SENSOR = "CLUE.SIMULATOR.GESTURE", - CLUE_SIMULATOR_PRESSURE_SENSOR = "CLUE.SIMULATOR.PRESSURE", - CLUE_SIMULATOR_PROXIMITY_SENSOR = "CLUE.SIMULATOR.PROXIMITY", - CLUE_SIMULATOR_HUMIDITY_SENSOR = "CLUE.SIMULATOR.HUMIDITY", - CLUE_SIMULATOR_GYRO_SENSOR = "CLUE.SIMULATOR.GYRO", - CLUE_SIMULATOR_MAGNET_SENSOR = "CLUE.SIMULATOR.MAGNET", - - // Pop-up dialog - CPX_CLICK_DIALOG_DONT_SHOW = "CPX.CLICK.DIALOG.DONT.SHOW", - CPX_CLICK_DIALOG_EXAMPLE_CODE = "CPX.CLICK.DIALOG.EXAMPLE.CODE", - CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CPX.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", - CPX_CLICK_DIALOG_TUTORIALS = "CPX.CLICK.DIALOG.TUTORIALS", - - CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CLUE.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", - - ERROR_PYTHON_PROCESS = "ERROR.PYTHON.PROCESS", - - CPX_ERROR_COMMAND_NEW_FILE = "CPX.ERROR.COMMAND.NEW.FILE", - CPX_ERROR_DEPLOY_WITHOUT_DEVICE = "CPX.ERROR.DEPLOY.WITHOUT.DEVICE", - CPX_ERROR_PYTHON_DEVICE_PROCESS = "CPX.ERROR.PYTHON.DEVICE.PROCESS", - CPX_SUCCESS_COMMAND_DEPLOY_DEVICE = "CPX.SUCCESS.COMMAND.DEPLOY.DEVICE", - - MICROBIT_ERROR_COMMAND_NEW_FILE = "MICROBIT.ERROR.COMMAND.NEW.FILE", - MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE = "MICROBIT.ERROR.DEPLOY.WITHOUT.DEVICE", - MICROBIT_ERROR_PYTHON_DEVICE_PROCESS = "MICROBIT.ERROR.PYTHON.DEVICE.PROCESS", - MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE = "MICROBIT.SUCCESS.COMMAND.DEPLOY.DEVICE", - - CLUE_ERROR_COMMAND_NEW_FILE = "CLUE.ERROR.COMMAND.NEW.FILE", - CLUE_ERROR_DEPLOY_WITHOUT_DEVICE = "CLUE.ERROR.DEPLOY.WITHOUT.DEVICE", - CLUE_ERROR_PYTHON_DEVICE_PROCESS = "CLUE.ERROR.PYTHON.DEVICE.PROCESS", - CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE = "CLUE.SUCCESS.COMMAND.DEPLOY.DEVICE", - - // Performance - CPX_PERFORMANCE_DEPLOY_DEVICE = "CPX.PERFORMANCE.DEPLOY.DEVICE", - CPX_PERFORMANCE_NEW_FILE = "CPX.PERFORMANCE.NEW.FILE", - CPX_PERFORMANCE_OPEN_SIMULATOR = "CPX.PERFORMANCE.OPEN.SIMULATOR", - - MICROBIT_PERFORMANCE_DEPLOY_DEVICE = "MICROBIT.PERFORMANCE.DEPLOY.DEVICE", - MICROBIT_PERFORMANCE_NEW_FILE = "MICROBIT.PERFORMANCE.NEW.FILE", - MICROBIT_PERFORMANCE_OPEN_SIMULATOR = "MICROBIT.PERFORMANCE.OPEN.SIMULATOR", - - CLUE_PERFORMANCE_DEPLOY_DEVICE = "CLUE.PERFORMANCE.DEPLOY.DEVICE", - CLUE_PERFORMANCE_NEW_FILE = "CLUE.PERFORMANCE.NEW.FILE", - CLUE_PERFORMANCE_OPEN_SIMULATOR = "CLUE.PERFORMANCE.OPEN.SIMULATOR", - - // Venv options - SETUP_VENV_CREATION_ERR = "SETUP.VENV.CREATION.ERR", - SETUP_NO_PIP = "SETUP.NO.PIP", - SETUP_DEP_INSTALL_FAIL = "SETUP.DEP.INSTALL.FAIL", - SETUP_AUTO_RESOLVE_PYTHON_PATH = "SETUP.AUTO.RESOLVE.PYTHON.PATH", - SETUP_NO_PYTHON_PATH = "SETUP.NO.PYTHON.PATH", - SETUP_DOWNLOAD_PYTHON = "SETUP.DOWNLOAD.PYTHON", - SETUP_INVALID_PYTHON_INTERPRETER_PATH = "SETUP.INVALID.PYTHON.INTERPRETER.PATH", - SETUP_INVALID_PYTHON_VER = "SETUP.INVALID.PYTHON.VER", - SETUP_INSTALL_VENV = "SETUP.INSTALL.VENV", - SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL = "SETUP.ORIGINAL.INTERPRETER.DEP.INSTALL", - SETUP_HAS_VENV = "SETUP.HAS.VENV", - SETUP_NO_DEPS_INSTALLED = "SETUP.NO.DEPS.INSTALLED", + FAILED_TO_OPEN_SIMULATOR = "SIMULATOR.FAILED_TO_OPEN", + + // Debugger + CPX_DEBUGGER_INIT_SUCCESS = "CPX.DEBUGGER.INIT.SUCCESS", + CPX_DEBUGGER_INIT_FAIL = "CPX.DEBUGGER.INIT.FAIL", + MICROBIT_DEBUGGER_INIT_SUCCESS = "MICROBIT.DEBUGGER.INIT.SUCCESS", + MICROBIT_DEBUGGER_INIT_FAIL = "MICROBIT.DEBUGGER.INIT.FAIL", + CLUE_DEBUGGER_INIT_SUCCESS = "CLUE.DEBUGGER.INIT.SUCCESS", + CLUE_DEBUGGER_INIT_FAIL = "CLUE.DEBUGGER.INIT.FAIL", + + // Extension commands + COMMAND_RUN_SIMULATOR_BUTTON = "COMMAND.RUN.SIMULATOR_BUTTON", + COMMAND_RUN_PALETTE = "COMMAND.RUN.PALETTE", + COMMAND_INSTALL_EXTENSION_DEPENDENCIES = "COMMAND.INSTALL.EXTENSION.DEPENDENCIES", + COMMAND_SERIAL_MONITOR_CHOOSE_PORT = "COMMAND.SERIAL_MONITOR.CHOOSE_PORT", + COMMAND_SERIAL_MONITOR_OPEN = "COMMAND.SERIAL_MONITOR.OPEN", + COMMAND_SERIAL_MONITOR_BAUD_RATE = "COMMAND.SERIAL_MONITOR.BAUD_RATE", + COMMAND_SERIAL_MONITOR_CLOSE = "COMMAND.SERIAL_MONITOR.CLOSE", + COMMAND_GETTING_STARTED = "COMMAND.GETTING_STARTED", + + CPX_COMMAND_DEPLOY_DEVICE = "CPX.COMMAND.DEPLOY.DEVICE", + CPX_COMMAND_NEW_FILE = "CPX.COMMAND.NEW.FILE.CPX", + CPX_COMMAND_OPEN_SIMULATOR = "CPX.COMMAND.OPEN.SIMULATOR", + + MICROBIT_COMMAND_DEPLOY_DEVICE = "MICROBIT.COMMAND.DEPLOY.DEVICE", + MICROBIT_COMMAND_NEW_FILE = "MICROBIT.COMMAND.NEW.FILE", + MICROBIT_COMMAND_OPEN_SIMULATOR = "MICROBIT.COMMAND.OPEN.SIMULATOR", + + CLUE_COMMAND_DEPLOY_DEVICE = "CLUE.COMMAND.DEPLOY.DEVICE", + CLUE_COMMAND_NEW_FILE = "CLUE.COMMAND.NEW.FILE.CPX", + CLUE_COMMAND_OPEN_SIMULATOR = "CLUE.COMMAND.OPEN.SIMULATOR", + + // Simulator interaction + CPX_SIMULATOR_BUTTON_A = "CPX.SIMULATOR.BUTTON.A", + CPX_SIMULATOR_BUTTON_B = "CPX.SIMULATOR.BUTTON.B", + CPX_SIMULATOR_BUTTON_AB = "CPX.SIMULATOR.BUTTON.AB", + CPX_SIMULATOR_SWITCH = "CPX.SIMULATOR.SWITCH", + + MICROBIT_SIMULATOR_BUTTON_A = "MICROBIT.SIMULATOR.BUTTON.A", + MICROBIT_SIMULATOR_BUTTON_B = "MICROBIT.SIMULATOR.BUTTON.B", + MICROBIT_SIMULATOR_BUTTON_AB = "MICROBIT.SIMULATOR.BUTTON.AB", + + CLUE_SIMULATOR_BUTTON_A = "CLUE.SIMULATOR.BUTTON.A", + CLUE_SIMULATOR_BUTTON_B = "CLUE.SIMULATOR.BUTTON.B", + CLUE_SIMULATOR_BUTTON_AB = "CLUE.SIMULATOR.BUTTON.AB", + + // Sensors + CPX_SIMULATOR_TEMPERATURE_SENSOR = "CPX.SIMULATOR.TEMPERATURE", + CPX_SIMULATOR_LIGHT_SENSOR = "CPX.SIMULATOR.LIGHT", + CPX_SIMULATOR_MOTION_SENSOR = "CPX.SIMULATOR.MOTION", + CPX_SIMULATOR_SHAKE = "CPX.SIMULATOR.SHAKE", + CPX_SIMULATOR_CAPACITIVE_TOUCH = "CPX.SIMULATOR.CAPACITIVE.TOUCH", + + MICROBIT_SIMULATOR_TEMPERATURE_SENSOR = "MICROBIT.SIMULATOR.TEMPERATURE", + MICROBIT_SIMULATOR_LIGHT_SENSOR = "MICROBIT.SIMULATOR.LIGHT", + MICROBIT_SIMULATOR_MOTION_SENSOR = "MICROBIT.SIMULATOR.MOTION", + MICROBIT_SIMULATOR_GESTURE_SENSOR = "MICROBIT.SIMULATOR.GESTURE", + + CLUE_SIMULATOR_TEMPERATURE_SENSOR = "CLUE.SIMULATOR.TEMPERATURE", + CLUE_SIMULATOR_LIGHT_SENSOR = "CLUE.SIMULATOR.LIGHT", + CLUE_SIMULATOR_MOTION_SENSOR = "CLUE.SIMULATOR.MOTION", + CLUE_SIMULATOR_GESTURE_SENSOR = "CLUE.SIMULATOR.GESTURE", + CLUE_SIMULATOR_PRESSURE_SENSOR = "CLUE.SIMULATOR.PRESSURE", + CLUE_SIMULATOR_PROXIMITY_SENSOR = "CLUE.SIMULATOR.PROXIMITY", + CLUE_SIMULATOR_HUMIDITY_SENSOR = "CLUE.SIMULATOR.HUMIDITY", + CLUE_SIMULATOR_GYRO_SENSOR = "CLUE.SIMULATOR.GYRO", + CLUE_SIMULATOR_MAGNET_SENSOR = "CLUE.SIMULATOR.MAGNET", + + // Pop-up dialog + CPX_CLICK_DIALOG_DONT_SHOW = "CPX.CLICK.DIALOG.DONT.SHOW", + CPX_CLICK_DIALOG_EXAMPLE_CODE = "CPX.CLICK.DIALOG.EXAMPLE.CODE", + CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CPX.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", + CPX_CLICK_DIALOG_TUTORIALS = "CPX.CLICK.DIALOG.TUTORIALS", + + CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CLUE.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", + + ERROR_PYTHON_PROCESS = "ERROR.PYTHON.PROCESS", + + CPX_ERROR_COMMAND_NEW_FILE = "CPX.ERROR.COMMAND.NEW.FILE", + CPX_ERROR_DEPLOY_WITHOUT_DEVICE = "CPX.ERROR.DEPLOY.WITHOUT.DEVICE", + CPX_ERROR_PYTHON_DEVICE_PROCESS = "CPX.ERROR.PYTHON.DEVICE.PROCESS", + CPX_SUCCESS_COMMAND_DEPLOY_DEVICE = "CPX.SUCCESS.COMMAND.DEPLOY.DEVICE", + + MICROBIT_ERROR_COMMAND_NEW_FILE = "MICROBIT.ERROR.COMMAND.NEW.FILE", + MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE = "MICROBIT.ERROR.DEPLOY.WITHOUT.DEVICE", + MICROBIT_ERROR_PYTHON_DEVICE_PROCESS = "MICROBIT.ERROR.PYTHON.DEVICE.PROCESS", + MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE = "MICROBIT.SUCCESS.COMMAND.DEPLOY.DEVICE", + + CLUE_ERROR_COMMAND_NEW_FILE = "CLUE.ERROR.COMMAND.NEW.FILE", + CLUE_ERROR_DEPLOY_WITHOUT_DEVICE = "CLUE.ERROR.DEPLOY.WITHOUT.DEVICE", + CLUE_ERROR_PYTHON_DEVICE_PROCESS = "CLUE.ERROR.PYTHON.DEVICE.PROCESS", + CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE = "CLUE.SUCCESS.COMMAND.DEPLOY.DEVICE", + + // Performance + CPX_PERFORMANCE_DEPLOY_DEVICE = "CPX.PERFORMANCE.DEPLOY.DEVICE", + CPX_PERFORMANCE_NEW_FILE = "CPX.PERFORMANCE.NEW.FILE", + CPX_PERFORMANCE_OPEN_SIMULATOR = "CPX.PERFORMANCE.OPEN.SIMULATOR", + + MICROBIT_PERFORMANCE_DEPLOY_DEVICE = "MICROBIT.PERFORMANCE.DEPLOY.DEVICE", + MICROBIT_PERFORMANCE_NEW_FILE = "MICROBIT.PERFORMANCE.NEW.FILE", + MICROBIT_PERFORMANCE_OPEN_SIMULATOR = "MICROBIT.PERFORMANCE.OPEN.SIMULATOR", + + CLUE_PERFORMANCE_DEPLOY_DEVICE = "CLUE.PERFORMANCE.DEPLOY.DEVICE", + CLUE_PERFORMANCE_NEW_FILE = "CLUE.PERFORMANCE.NEW.FILE", + CLUE_PERFORMANCE_OPEN_SIMULATOR = "CLUE.PERFORMANCE.OPEN.SIMULATOR", + + // Venv options + SETUP_VENV_CREATION_ERR = "SETUP.VENV.CREATION.ERR", + SETUP_NO_PIP = "SETUP.NO.PIP", + SETUP_DEP_INSTALL_FAIL = "SETUP.DEP.INSTALL.FAIL", + SETUP_AUTO_RESOLVE_PYTHON_PATH = "SETUP.AUTO.RESOLVE.PYTHON.PATH", + SETUP_NO_PYTHON_PATH = "SETUP.NO.PYTHON.PATH", + SETUP_DOWNLOAD_PYTHON = "SETUP.DOWNLOAD.PYTHON", + SETUP_INVALID_PYTHON_INTERPRETER_PATH = "SETUP.INVALID.PYTHON.INTERPRETER.PATH", + SETUP_INVALID_PYTHON_VER = "SETUP.INVALID.PYTHON.VER", + SETUP_INSTALL_VENV = "SETUP.INSTALL.VENV", + SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL = "SETUP.ORIGINAL.INTERPRETER.DEP.INSTALL", + SETUP_HAS_VENV = "SETUP.HAS.VENV", + SETUP_NO_DEPS_INSTALLED = "SETUP.NO.DEPS.INSTALLED", } export const DEFAULT_DEVICE = CONSTANTS.DEVICE_NAME.CPX; // tslint:disable-next-line: no-namespace export namespace DialogResponses { - export const ACCEPT_AND_RUN: MessageItem = { - title: localize("dialogResponses.agreeAndRun", "Agree and Run"), - }; - export const AGREE_AND_PROCEED: MessageItem = { - title: localize("dialogResponses.agreeAndProceed", "Agree and Proceed"), - }; - export const CANCEL: MessageItem = { - title: localize("dialogResponses.cancel", "Cancel"), - }; - export const SELECT: MessageItem = { - title: localize("dialogResponses.select", "Select"), - }; - export const HELP: MessageItem = { - title: localize("dialogResponses.help", "I need help"), - }; - export const DONT_SHOW: MessageItem = { - title: localize("dialogResponses.dontShowAgain", "Don't Show Again"), - }; - export const NO: MessageItem = { - title: localize("dialogResponses.No", "No"), - }; - export const INSTALL_NOW: MessageItem = { - title: localize("dialogResponses.installNow", "Install Now"), - }; - export const DONT_INSTALL: MessageItem = { - title: localize("dialogResponses.dontInstall", "Don't Install"), - }; - export const PRIVACY_STATEMENT: MessageItem = { - title: localize("info.privacyStatement", "Privacy Statement"), - }; - export const TUTORIALS: MessageItem = { - title: localize("dialogResponses.tutorials", "Tutorials on Adafruit"), - }; - export const EXAMPLE_CODE: MessageItem = { - title: localize( - "dialogResponses.exampleCode", - "Example Code on GitHub" - ), - }; - export const MESSAGE_UNDERSTOOD: MessageItem = { - title: localize("dialogResponses.messageUnderstood", "Got It"), - }; - export const INSTALL_PIP: MessageItem = { - title: localize( - "dialogResponses.installPip", - "Install from Pip's webpage" - ), - }; - export const INSTALL_PYTHON: MessageItem = { - title: localize( - "dialogResponses.installPython", - "Install from python.org" - ), - }; - export const YES: MessageItem = { - title: localize("dialogResponses.Yes", "Yes"), - }; - export const READ_INSTALL_MD: MessageItem = { - title: localize( - "dialogResponses.readInstall", - "Read installation docs" - ), - }; + export const ACCEPT_AND_RUN: MessageItem = { + title: localize("dialogResponses.agreeAndRun", "Agree and Run"), + }; + export const AGREE_AND_PROCEED: MessageItem = { + title: localize("dialogResponses.agreeAndProceed", "Agree and Proceed"), + }; + export const CANCEL: MessageItem = { + title: localize("dialogResponses.cancel", "Cancel"), + }; + export const SELECT: MessageItem = { + title: localize("dialogResponses.select", "Select"), + }; + export const HELP: MessageItem = { + title: localize("dialogResponses.help", "I need help"), + }; + export const DONT_SHOW: MessageItem = { + title: localize("dialogResponses.dontShowAgain", "Don't Show Again"), + }; + export const NO: MessageItem = { + title: localize("dialogResponses.No", "No"), + }; + export const INSTALL_NOW: MessageItem = { + title: localize("dialogResponses.installNow", "Install Now"), + }; + export const DONT_INSTALL: MessageItem = { + title: localize("dialogResponses.dontInstall", "Don't Install"), + }; + export const PRIVACY_STATEMENT: MessageItem = { + title: localize("info.privacyStatement", "Privacy Statement"), + }; + export const TUTORIALS: MessageItem = { + title: localize("dialogResponses.tutorials", "Tutorials on Adafruit"), + }; + export const EXAMPLE_CODE: MessageItem = { + title: localize( + "dialogResponses.exampleCode", + "Example Code on GitHub" + ), + }; + export const MESSAGE_UNDERSTOOD: MessageItem = { + title: localize("dialogResponses.messageUnderstood", "Got It"), + }; + export const INSTALL_PIP: MessageItem = { + title: localize( + "dialogResponses.installPip", + "Install from Pip's webpage" + ), + }; + export const INSTALL_PYTHON: MessageItem = { + title: localize( + "dialogResponses.installPython", + "Install from python.org" + ), + }; + export const YES: MessageItem = { + title: localize("dialogResponses.Yes", "Yes"), + }; + export const READ_INSTALL_MD: MessageItem = { + title: localize( + "dialogResponses.readInstall", + "Read installation docs" + ), + }; } export const CPX_CONFIG_FILE = path.join(".vscode", "cpx.json"); export const STATUS_BAR_PRIORITY = { - PORT: 20, - OPEN_PORT: 30, - BAUD_RATE: 40, + PORT: 20, + OPEN_PORT: 30, + BAUD_RATE: 40, }; export const VERSIONS = { - MIN_PY_VERSION: "Python 3.7.0", + MIN_PY_VERSION: "Python 3.7.0", }; export const HELPER_FILES = { - CHECK_IF_VENV_PY: "check_if_venv.py", - CHECK_PYTHON_DEPENDENCIES: "check_python_dependencies.py", - DEVICE_PY: "device.py", - PROCESS_USER_CODE_PY: "process_user_code.py", - PYTHON_EXE: "python.exe", - PYTHON: "python", + CHECK_IF_VENV_PY: "check_if_venv.py", + CHECK_PYTHON_DEPENDENCIES: "check_python_dependencies.py", + DEVICE_PY: "device.py", + PROCESS_USER_CODE_PY: "process_user_code.py", + PYTHON_EXE: "python.exe", + PYTHON: "python", }; export const GLOBAL_ENV_VARS = { - PYTHON: "python", - PYTHON3: "python3", + PYTHON: "python", + PYTHON3: "python3", }; export const LANGUAGE_VARS = { - PYTHON: { ID: "python", FILE_ENDS: ".py" }, + PYTHON: { ID: "python", FILE_ENDS: ".py" }, }; export default CONSTANTS; diff --git a/Source/cpxWorkspace.ts b/Source/cpxWorkspace.ts index 47239a79a..cec9a6289 100644 --- a/Source/cpxWorkspace.ts +++ b/Source/cpxWorkspace.ts @@ -3,24 +3,24 @@ import * as path from "path"; import * as vscode from "vscode"; export class CPXWorkspace { - static get rootPath(): string | undefined { - const workspaceFolders = vscode.workspace.workspaceFolders; - if (!workspaceFolders || workspaceFolders.length === 0) { - return undefined; - } + static get rootPath(): string | undefined { + const workspaceFolders = vscode.workspace.workspaceFolders; + if (!workspaceFolders || workspaceFolders.length === 0) { + return undefined; + } - for (const workspaceFolder of workspaceFolders) { - const workspaceFolderPath = workspaceFolder.uri.fsPath; - const cpxConfigPath = path.join( - workspaceFolderPath, - ".vscode", - "cpx.json" - ); - if (fs.existsSync(cpxConfigPath)) { - return workspaceFolderPath; - } - } + for (const workspaceFolder of workspaceFolders) { + const workspaceFolderPath = workspaceFolder.uri.fsPath; + const cpxConfigPath = path.join( + workspaceFolderPath, + ".vscode", + "cpx.json" + ); + if (fs.existsSync(cpxConfigPath)) { + return workspaceFolderPath; + } + } - return workspaceFolders[0].uri.fsPath; - } + return workspaceFolders[0].uri.fsPath; + } } diff --git a/Source/debugger/debugAdapter.ts b/Source/debugger/debugAdapter.ts index 59a78482e..9dd7c1dfb 100644 --- a/Source/debugger/debugAdapter.ts +++ b/Source/debugger/debugAdapter.ts @@ -4,46 +4,46 @@ import { MessagingService } from "../service/messagingService"; import { DEBUG_COMMANDS } from "../view/constants"; export class DebugAdapter implements DebugAdapterTracker { - private readonly console: DebugConsole | undefined; - private readonly messagingService: MessagingService; - private debugCommunicationService: DebuggerCommunicationService; - constructor( - debugSession: DebugSession, - messagingService: MessagingService, - debugCommunicationService: DebuggerCommunicationService - ) { - this.console = debugSession.configuration.console; - this.messagingService = messagingService; - this.debugCommunicationService = debugCommunicationService; - } - onWillStartSession() { - // To Implement - } - onWillReceiveMessage(message: any): void { - if (message.command) { - // Only send pertinent debug messages - switch (message.command) { - case DEBUG_COMMANDS.CONTINUE: - this.messagingService.sendStartMessage(); - break; - case DEBUG_COMMANDS.STACK_TRACE: - this.messagingService.sendPauseMessage(); - break; - case DEBUG_COMMANDS.DISCONNECT: - // Triggered on stop event for debugger - if (!message.arguments.restart) { - this.debugCommunicationService.handleStopEvent(); - } - break; - } - } - } - // A debugger error should unlock the webview - onError() { - this.messagingService.sendStartMessage(); - } - // Device is always running when exiting debugging mode - onExit() { - this.messagingService.sendStartMessage(); - } + private readonly console: DebugConsole | undefined; + private readonly messagingService: MessagingService; + private debugCommunicationService: DebuggerCommunicationService; + constructor( + debugSession: DebugSession, + messagingService: MessagingService, + debugCommunicationService: DebuggerCommunicationService + ) { + this.console = debugSession.configuration.console; + this.messagingService = messagingService; + this.debugCommunicationService = debugCommunicationService; + } + onWillStartSession() { + // To Implement + } + onWillReceiveMessage(message: any): void { + if (message.command) { + // Only send pertinent debug messages + switch (message.command) { + case DEBUG_COMMANDS.CONTINUE: + this.messagingService.sendStartMessage(); + break; + case DEBUG_COMMANDS.STACK_TRACE: + this.messagingService.sendPauseMessage(); + break; + case DEBUG_COMMANDS.DISCONNECT: + // Triggered on stop event for debugger + if (!message.arguments.restart) { + this.debugCommunicationService.handleStopEvent(); + } + break; + } + } + } + // A debugger error should unlock the webview + onError() { + this.messagingService.sendStartMessage(); + } + // Device is always running when exiting debugging mode + onExit() { + this.messagingService.sendStartMessage(); + } } diff --git a/Source/debugger/debugAdapterFactory.ts b/Source/debugger/debugAdapterFactory.ts index 5b0e2b401..8bec8cfc8 100644 --- a/Source/debugger/debugAdapterFactory.ts +++ b/Source/debugger/debugAdapterFactory.ts @@ -1,33 +1,33 @@ import { - DebugAdapterTracker, - DebugAdapterTrackerFactory, - DebugSession, - ProviderResult, + DebugAdapterTracker, + DebugAdapterTrackerFactory, + DebugSession, + ProviderResult, } from "vscode"; import { DebuggerCommunicationService } from "../service/debuggerCommunicationService"; import { MessagingService } from "../service/messagingService"; import { DebugAdapter } from "./debugAdapter"; export class DebugAdapterFactory implements DebugAdapterTrackerFactory { - private debugSession: DebugSession; - private messagingService: MessagingService; - private debugCommunicationService: DebuggerCommunicationService; - constructor( - debugSession: DebugSession, - messagingService: MessagingService, - debugCommunicationService: DebuggerCommunicationService - ) { - this.debugSession = debugSession; - this.messagingService = messagingService; - this.debugCommunicationService = debugCommunicationService; - } - public createDebugAdapterTracker( - session: DebugSession - ): ProviderResult { - return new DebugAdapter( - session, - this.messagingService, - this.debugCommunicationService - ); - } + private debugSession: DebugSession; + private messagingService: MessagingService; + private debugCommunicationService: DebuggerCommunicationService; + constructor( + debugSession: DebugSession, + messagingService: MessagingService, + debugCommunicationService: DebuggerCommunicationService + ) { + this.debugSession = debugSession; + this.messagingService = messagingService; + this.debugCommunicationService = debugCommunicationService; + } + public createDebugAdapterTracker( + session: DebugSession + ): ProviderResult { + return new DebugAdapter( + session, + this.messagingService, + this.debugCommunicationService + ); + } } diff --git a/Source/debuggerCommunicationServer.ts b/Source/debuggerCommunicationServer.ts index 0fa4a65cc..3deeff1c4 100644 --- a/Source/debuggerCommunicationServer.ts +++ b/Source/debuggerCommunicationServer.ts @@ -8,133 +8,134 @@ import { SERVER_INFO } from "./constants"; import { DeviceSelectionService } from "./service/deviceSelectionService"; export const DEBUGGER_MESSAGES = { - EMITTER: { - INPUT_CHANGED: "input_changed", - RECEIVED_STATE: "received_state", - DISCONNECT: "process_disconnect", - }, - LISTENER: { - UPDATE_STATE: "updateState", - RECEIVED_STATE: "receivedState", - DISCONNECT: "disconnect", - }, + EMITTER: { + INPUT_CHANGED: "input_changed", + RECEIVED_STATE: "received_state", + DISCONNECT: "process_disconnect", + }, + LISTENER: { + UPDATE_STATE: "updateState", + RECEIVED_STATE: "receivedState", + DISCONNECT: "disconnect", + }, }; export class DebuggerCommunicationServer { - private port: number; - private serverHttp: http.Server; - private serverIo: socketio.Server; - private simulatorWebview: WebviewPanel | undefined; - private deviceSelectionService: DeviceSelectionService; - private isPendingResponse = false; - private pendingCallbacks: Function[] = []; + private port: number; + private serverHttp: http.Server; + private serverIo: socketio.Server; + private simulatorWebview: WebviewPanel | undefined; + private deviceSelectionService: DeviceSelectionService; + private isPendingResponse = false; + private pendingCallbacks: Function[] = []; - constructor( - webviewPanel: WebviewPanel | undefined, - port = SERVER_INFO.DEFAULT_SERVER_PORT, - deviceSelectionService: DeviceSelectionService - ) { - this.port = port; - this.serverHttp = new http.Server(); - this.initHttpServer(); + constructor( + webviewPanel: WebviewPanel | undefined, + port = SERVER_INFO.DEFAULT_SERVER_PORT, + deviceSelectionService: DeviceSelectionService + ) { + this.port = port; + this.serverHttp = new http.Server(); + this.initHttpServer(); - this.serverIo = socketio(this.serverHttp); - this.simulatorWebview = webviewPanel; - this.initEventsHandlers(); - console.info(`Server running on port ${this.port}`); + this.serverIo = socketio(this.serverHttp); + this.simulatorWebview = webviewPanel; + this.initEventsHandlers(); + console.info(`Server running on port ${this.port}`); - this.deviceSelectionService = deviceSelectionService; - } + this.deviceSelectionService = deviceSelectionService; + } - // send the message to start closing the connection - public closeConnection(): void { - this.sendDisconnectEvent(); - } + // send the message to start closing the connection + public closeConnection(): void { + this.sendDisconnectEvent(); + } - public setWebview(webviewPanel: WebviewPanel | undefined) { - this.simulatorWebview = webviewPanel; - } - // Events are pushed when the previous processed event is over - public emitInputChanged(newState: string): void { - if (this.isPendingResponse) { - this.pendingCallbacks.push(() => { - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, - newState - ); - }); - } else { - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, - newState - ); - this.isPendingResponse = true; - } - } - public disconnectFromPort() { - this.serverIo.close(); - this.serverHttp.close(); - } - private sendDisconnectEvent() { - this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); - } + public setWebview(webviewPanel: WebviewPanel | undefined) { + this.simulatorWebview = webviewPanel; + } + // Events are pushed when the previous processed event is over + public emitInputChanged(newState: string): void { + if (this.isPendingResponse) { + this.pendingCallbacks.push(() => { + this.serverIo.emit( + DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, + newState + ); + }); + } else { + this.serverIo.emit( + DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, + newState + ); + this.isPendingResponse = true; + } + } + public disconnectFromPort() { + this.serverIo.close(); + this.serverHttp.close(); + } + private sendDisconnectEvent() { + this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); + } - private initHttpServer(): void { - this.serverHttp.listen(this.port); - if (!this.serverHttp.listening) { - throw new Error(SERVER_INFO.ERROR_CODE_INIT_SERVER); - } - } + private initHttpServer(): void { + this.serverHttp.listen(this.port); + if (!this.serverHttp.listening) { + throw new Error(SERVER_INFO.ERROR_CODE_INIT_SERVER); + } + } - private initEventsHandlers(): void { - this.serverIo.on("connection", (socket: any) => { - socket.on(DEBUGGER_MESSAGES.LISTENER.UPDATE_STATE, (data: any) => { - this.handleState(data); - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.RECEIVED_STATE, - {} - ); - }); - socket.on(DEBUGGER_MESSAGES.LISTENER.RECEIVED_STATE, () => { - if (this.pendingCallbacks.length > 0) { - const currentCall = this.pendingCallbacks.shift(); - currentCall(); - this.isPendingResponse = true; - } else { - this.isPendingResponse = false; - } - }); + private initEventsHandlers(): void { + this.serverIo.on("connection", (socket: any) => { + socket.on(DEBUGGER_MESSAGES.LISTENER.UPDATE_STATE, (data: any) => { + this.handleState(data); + this.serverIo.emit( + DEBUGGER_MESSAGES.EMITTER.RECEIVED_STATE, + {} + ); + }); + socket.on(DEBUGGER_MESSAGES.LISTENER.RECEIVED_STATE, () => { + if (this.pendingCallbacks.length > 0) { + const currentCall = this.pendingCallbacks.shift(); + currentCall(); + this.isPendingResponse = true; + } else { + this.isPendingResponse = false; + } + }); - socket.on(DEBUGGER_MESSAGES.LISTENER.DISCONNECT, () => { - this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); - if (this.simulatorWebview) { - this.simulatorWebview.webview.postMessage({ - command: "reset-state", - }); - } - }); - }); - } + socket.on(DEBUGGER_MESSAGES.LISTENER.DISCONNECT, () => { + this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); + if (this.simulatorWebview) { + this.simulatorWebview.webview.postMessage({ + command: "reset-state", + }); + } + }); + }); + } - private handleState(data: any): void { - try { - const messageToWebview = JSON.parse(data); - if (messageToWebview.type === "state") { - const messageState = JSON.parse(messageToWebview.data); - if ( - this.simulatorWebview && - messageState.device_name === - this.deviceSelectionService.getCurrentActiveDevice() - ) { - this.simulatorWebview.webview.postMessage({ - active_device: this.deviceSelectionService.getCurrentActiveDevice(), - command: "set-state", - state: messageState, - }); - } - } - } catch (err) { - console.error(`Error: Non-JSON output from the process : ${data}`); - } - } + private handleState(data: any): void { + try { + const messageToWebview = JSON.parse(data); + if (messageToWebview.type === "state") { + const messageState = JSON.parse(messageToWebview.data); + if ( + this.simulatorWebview && + messageState.device_name === + this.deviceSelectionService.getCurrentActiveDevice() + ) { + this.simulatorWebview.webview.postMessage({ + active_device: + this.deviceSelectionService.getCurrentActiveDevice(), + command: "set-state", + state: messageState, + }); + } + } + } catch (err) { + console.error(`Error: Non-JSON output from the process : ${data}`); + } + } } diff --git a/Source/dev-requirements.txt b/Source/dev-requirements.txt index 26f334b51..6b117ff69 100644 --- a/Source/dev-requirements.txt +++ b/Source/dev-requirements.txt @@ -1,3 +1,3 @@ -r ./requirements.txt black==19.10b0 -pytest==5.0.1 \ No newline at end of file +pytest==5.0.1 diff --git a/Source/deviceContext.ts b/Source/deviceContext.ts index a4f0afd2e..9144ef23b 100644 --- a/Source/deviceContext.ts +++ b/Source/deviceContext.ts @@ -11,141 +11,141 @@ import { CPXWorkspace } from "./cpxWorkspace"; import * as utils from "./extension_utils/utils"; export class DeviceContext implements vscode.Disposable { - public static getInstance(): DeviceContext { - return DeviceContext._deviceContext; - } - - private static _deviceContext: DeviceContext = new DeviceContext(); - - private _onDidChange = new vscode.EventEmitter(); - private _watcher: vscode.FileSystemWatcher; - private _vscodeWatcher: vscode.FileSystemWatcher; - private _port!: string; - - private constructor() { - if (vscode.workspace && CPXWorkspace.rootPath) { - this._watcher = vscode.workspace.createFileSystemWatcher( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ); - this._vscodeWatcher = vscode.workspace.createFileSystemWatcher( - path.join(CPXWorkspace.rootPath, ".vscode"), - true, - true, - false - ); - - // Reloads the config into the code if the cpx config file has changed - this._watcher.onDidCreate(() => this.loadContext()); - this._watcher.onDidChange(() => this.loadContext()); - this._watcher.onDidDelete(() => this.loadContext()); - - this._vscodeWatcher.onDidDelete(() => this.loadContext()); - } - } - - public loadContext(): Thenable { - return vscode.workspace.findFiles(CPX_CONFIG_FILE, null, 1).then( - files => { - let cpxConfigJson: any = {}; - if (files && files.length > 0) { - const configFile = files[0]; - cpxConfigJson = utils.tryParseJSON( - fs.readFileSync(configFile.fsPath, "utf8") - ); - if (cpxConfigJson) { - this._port = cpxConfigJson.port; - this._onDidChange.fire(); - } else { - console.error(CONSTANTS.ERROR.CPX_FILE_ERROR); - } - } else { - this._port = null; - this._onDidChange.fire(); - } - return this; - }, - reason => { - this._port = null; - this._onDidChange.fire(); - return this; - } - ); - } - - public saveContext() { - if (!CPXWorkspace.rootPath) { - return; - } - const cpxConfigFile = path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE); - let cpxConfigJson: any = {}; - if (utils.fileExistsSync(cpxConfigFile)) { - cpxConfigJson = utils.tryParseJSON( - fs.readFileSync(cpxConfigFile, "utf8") - ); - } - if (!cpxConfigJson) { - // log and notify user error - return; - } - cpxConfigJson.port = this.port; - - utils.mkdirRecursivelySync(path.dirname(cpxConfigFile)); - fs.writeFileSync( - cpxConfigFile, - JSON.stringify( - cpxConfigJson, - (key, value) => { - if (value === null) { - return undefined; - } - return value; - }, - 4 - ) - ); - } - - public dispose() { - if (this._watcher) { - this._watcher.dispose(); - } - - if (this._vscodeWatcher) { - this._vscodeWatcher.dispose(); - } - } - - public async initialize() { - if ( - CPXWorkspace.rootPath && - utils.fileExistsSync( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ) - ) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.CPX_JSON_ALREADY_GENERATED - ); - return; - } else { - if (!CPXWorkspace.rootPath) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.PLEASE_OPEN_FOLDER - ); - return; - } - } - } - - public get onDidChange(): vscode.Event { - return this._onDidChange.event; - } - - public get port() { - return this._port; - } - - public set port(value: string) { - this._port = value; - this.saveContext(); - } + public static getInstance(): DeviceContext { + return DeviceContext._deviceContext; + } + + private static _deviceContext: DeviceContext = new DeviceContext(); + + private _onDidChange = new vscode.EventEmitter(); + private _watcher: vscode.FileSystemWatcher; + private _vscodeWatcher: vscode.FileSystemWatcher; + private _port!: string; + + private constructor() { + if (vscode.workspace && CPXWorkspace.rootPath) { + this._watcher = vscode.workspace.createFileSystemWatcher( + path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) + ); + this._vscodeWatcher = vscode.workspace.createFileSystemWatcher( + path.join(CPXWorkspace.rootPath, ".vscode"), + true, + true, + false + ); + + // Reloads the config into the code if the cpx config file has changed + this._watcher.onDidCreate(() => this.loadContext()); + this._watcher.onDidChange(() => this.loadContext()); + this._watcher.onDidDelete(() => this.loadContext()); + + this._vscodeWatcher.onDidDelete(() => this.loadContext()); + } + } + + public loadContext(): Thenable { + return vscode.workspace.findFiles(CPX_CONFIG_FILE, null, 1).then( + (files) => { + let cpxConfigJson: any = {}; + if (files && files.length > 0) { + const configFile = files[0]; + cpxConfigJson = utils.tryParseJSON( + fs.readFileSync(configFile.fsPath, "utf8") + ); + if (cpxConfigJson) { + this._port = cpxConfigJson.port; + this._onDidChange.fire(); + } else { + console.error(CONSTANTS.ERROR.CPX_FILE_ERROR); + } + } else { + this._port = null; + this._onDidChange.fire(); + } + return this; + }, + (reason) => { + this._port = null; + this._onDidChange.fire(); + return this; + } + ); + } + + public saveContext() { + if (!CPXWorkspace.rootPath) { + return; + } + const cpxConfigFile = path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE); + let cpxConfigJson: any = {}; + if (utils.fileExistsSync(cpxConfigFile)) { + cpxConfigJson = utils.tryParseJSON( + fs.readFileSync(cpxConfigFile, "utf8") + ); + } + if (!cpxConfigJson) { + // log and notify user error + return; + } + cpxConfigJson.port = this.port; + + utils.mkdirRecursivelySync(path.dirname(cpxConfigFile)); + fs.writeFileSync( + cpxConfigFile, + JSON.stringify( + cpxConfigJson, + (key, value) => { + if (value === null) { + return undefined; + } + return value; + }, + 4 + ) + ); + } + + public dispose() { + if (this._watcher) { + this._watcher.dispose(); + } + + if (this._vscodeWatcher) { + this._vscodeWatcher.dispose(); + } + } + + public async initialize() { + if ( + CPXWorkspace.rootPath && + utils.fileExistsSync( + path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) + ) + ) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.CPX_JSON_ALREADY_GENERATED + ); + return; + } else { + if (!CPXWorkspace.rootPath) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.PLEASE_OPEN_FOLDER + ); + return; + } + } + } + + public get onDidChange(): vscode.Event { + return this._onDidChange.event; + } + + public get port() { + return this._port; + } + + public set port(value: string) { + this._port = value; + this.saveContext(); + } } diff --git a/Source/extension.ts b/Source/extension.ts index 5940217dc..d73a05b05 100644 --- a/Source/extension.ts +++ b/Source/extension.ts @@ -7,15 +7,15 @@ import * as open from "open"; import * as path from "path"; import * as vscode from "vscode"; import { - CONFIG, - CONSTANTS, - CPX_CONFIG_FILE, - DialogResponses, - GLOBAL_ENV_VARS, - HELPER_FILES, - LANGUAGE_VARS, - SERVER_INFO, - TelemetryEventName, + CONFIG, + CONSTANTS, + CPX_CONFIG_FILE, + DialogResponses, + GLOBAL_ENV_VARS, + HELPER_FILES, + LANGUAGE_VARS, + SERVER_INFO, + TelemetryEventName, } from "./constants"; import { CPXWorkspace } from "./cpxWorkspace"; import { DebugAdapterFactory } from "./debugger/debugAdapterFactory"; @@ -35,9 +35,9 @@ import getPackageInfo from "./telemetry/getPackageInfo"; import TelemetryAI from "./telemetry/telemetryAI"; import { UsbDetector } from "./usbDetector"; import { - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, - WEBVIEW_TYPES, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_MESSAGES, + WEBVIEW_TYPES, } from "./view/constants"; let telemetryAI: TelemetryAI; @@ -59,1043 +59,1055 @@ let pythonProcessDataBuffer: string[]; export let outChannel: vscode.OutputChannel | undefined; const sendCurrentDeviceMessage = (currentPanel: vscode.WebviewPanel) => { - if (currentPanel) { - currentPanel.webview.postMessage({ - command: VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE, - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } + if (currentPanel) { + currentPanel.webview.postMessage({ + command: VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE, + active_device: deviceSelectionService.getCurrentActiveDevice(), + }); + } }; // Extension activation export async function activate(context: vscode.ExtensionContext) { - telemetryAI = new TelemetryAI(context); - setupService = new SetupService(telemetryAI); - let currentPanel: vscode.WebviewPanel | undefined; - let childProcess: cp.ChildProcess | undefined; - let messageListener: vscode.Disposable; - let activeEditorListener: vscode.Disposable; - const webviewService = new WebviewService(context, deviceSelectionService); - const telemetryHandlerService = new TelemetryHandlerService( - telemetryAI, - deviceSelectionService - ); - const formalNameToNickNameMapping = { - [CONSTANTS.DEVICE_NAME_FORMAL.CPX]: CONSTANTS.DEVICE_NAME.CPX, - [CONSTANTS.DEVICE_NAME_FORMAL.MICROBIT]: CONSTANTS.DEVICE_NAME.MICROBIT, - [CONSTANTS.DEVICE_NAME_FORMAL.CLUE]: CONSTANTS.DEVICE_NAME.CLUE, - }; - - // Add our library path to settings.json for autocomplete functionality - updatePythonExtraPaths(); - - // ignore import errors so that adafruit_circuitplayground library - // doesn't trigger lint errors - updatePylintArgs(context); - - pythonExecutablePath = await setupService.setupEnv(context); - - try { - utils.generateCPXConfig(); - configFileCreated = true; - } catch (err) { - console.info("Failed to create the CPX config file."); - configFileCreated = false; - } - - if (pythonExecutablePath === "") { - return; - } - - if (outChannel === undefined) { - outChannel = vscode.window.createOutputChannel(CONSTANTS.NAME); - utils.logToOutputChannel(outChannel, CONSTANTS.INFO.WELCOME_OUTPUT_TAB); - } - - vscode.workspace.onDidSaveTextDocument( - async (document: vscode.TextDocument) => { - await fileSelectionService.updateCurrentFileFromTextFile(document); - } - ); - - const currVersionReleaseName = - "release_note_" + getPackageInfo(context).extensionVersion; - const viewedReleaseNote = context.globalState.get( - currVersionReleaseName, - false - ); - - if (!viewedReleaseNote) { - PopupService.openReleaseNote(); - context.globalState.update(currVersionReleaseName, true); - } - - const openWebview = () => { - if (currentPanel && currentPanel.webview) { - messagingService.setWebview(currentPanel.webview); - currentPanel.webview.html = webviewService.getWebviewContent( - WEBVIEW_TYPES.SIMULATOR, - true, - currentPanel - ); - currentPanel.reveal(vscode.ViewColumn.Beside); - } else { - currentPanel = vscode.window.createWebviewPanel( - CONSTANTS.WEBVIEW_TYPE.SIMULATOR, - CONSTANTS.LABEL.WEBVIEW_PANEL, - { preserveFocus: true, viewColumn: vscode.ViewColumn.Beside }, - { - // Only allow the webview to access resources in our extension's media directory - localResourceRoots: [ - vscode.Uri.file( - path.join( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY - ) - ), - ], - enableScripts: true, - } - ); - - currentPanel.webview.html = webviewService.getWebviewContent( - WEBVIEW_TYPES.SIMULATOR, - true, - currentPanel - ); - messagingService.setWebview(currentPanel.webview); - - if (messageListener !== undefined) { - messageListener.dispose(); - const index = context.subscriptions.indexOf(messageListener); - if (index > -1) { - context.subscriptions.splice(index, 1); - } - } - - if (activeEditorListener !== undefined) { - activeEditorListener.dispose(); - const index = context.subscriptions.indexOf( - activeEditorListener - ); - if (index > -1) { - context.subscriptions.splice(index, 1); - } - } - - if (currentPanel) { - // Handle messages from webview - messageListener = currentPanel.webview.onDidReceiveMessage( - message => { - const messageJson = JSON.stringify({ - active_device: deviceSelectionService.getCurrentActiveDevice(), - state: message.text, - }); - switch (message.command) { - case WEBVIEW_MESSAGES.BUTTON_PRESS: - // Send input to the Python process - telemetryHandlerService.handleButtonPressTelemetry( - message.text - ); - console.log(`About to write ${messageJson} \n`); - if ( - inDebugMode && - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .emitInputChanged(messageJson); - } else if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - break; - case WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP: - console.log(`Play button ${messageJson} \n`); - if (message.text.state as boolean) { - fileSelectionService.setPathAndSendMessage( - message.text.selected_file - ); - fileSelectionService.findCurrentTextDocument(); - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_RUN_SIMULATOR_BUTTON - ); - runSimulatorCommand(); - } else { - killProcessIfRunning(); - } - - if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - - break; - case WEBVIEW_MESSAGES.GESTURE: - case WEBVIEW_MESSAGES.SENSOR_CHANGED: - telemetryHandlerService.handleGestureTelemetry( - message.text - ); - console.log(`Sensor changed ${messageJson} \n`); - if ( - inDebugMode && - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .emitInputChanged(messageJson); - } else if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - break; - case WEBVIEW_MESSAGES.REFRESH_SIMULATOR: - console.log("Refresh button"); - runSimulatorCommand(); - break; - case WEBVIEW_MESSAGES.SLIDER_TELEMETRY: - telemetryHandlerService.handleSensorTelemetry( - message.text - ); - break; - case WEBVIEW_MESSAGES.SWITCH_DEVICE: - deviceSelectionService.setCurrentActiveDevice( - message.text.active_device - ); - killProcessIfRunning(); - break; - default: - vscode.window.showInformationMessage( - CONSTANTS.ERROR.UNEXPECTED_MESSAGE - ); - break; - } - }, - undefined, - context.subscriptions - ); - - activeEditorListener = utils.addVisibleTextEditorCallback( - currentPanel, - context - ); - } - - currentPanel.onDidDispose( - () => { - currentPanel = undefined; - if ( - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .setWebview(undefined); - } - killProcessIfRunning(); - if (firstTimeClosed) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.FIRST_TIME_WEBVIEW - ); - firstTimeClosed = false; - } - }, - undefined, - context.subscriptions - ); - } - sendCurrentDeviceMessage(currentPanel); - }; - - // Open Simulator on the webview - const openSimulator: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.openSimulator", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_SIMULATE_TO, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - deviceSelectionService.setCurrentActiveDevice(device); - const telemetryEvents = telemetryHandlerService.getTelemetryEventsForOpenSimulator( - device - ); - telemetryAI.trackFeatureUsage( - telemetryEvents.openSimulatorTelemetryEvent - ); - telemetryAI.runWithLatencyMeasure( - openWebview, - telemetryEvents.openSimulatorPerformanceTelemetryEvent - ); - } - ); - - const gettingStartedOpen: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.gettingStarted", - () => { - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_GETTING_STARTED - ); - webviewService.openTutorialPanel(); - } - ); - - const openTemplateFile = (template: string) => { - const fileName = template; - const filePath = - __dirname + path.sep + "templates" + path.sep + fileName; - const file = fs.readFileSync(filePath, "utf8"); - const showNewFilePopup: boolean = vscode.workspace - .getConfiguration() - .get(CONFIG.SHOW_NEW_FILE_POPUP); - - if (showNewFilePopup && template === CONSTANTS.TEMPLATE.CPX) { - vscode.window - .showInformationMessage( - CONSTANTS.INFO.NEW_FILE, - DialogResponses.DONT_SHOW, - DialogResponses.EXAMPLE_CODE, - DialogResponses.TUTORIALS - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.DONT_SHOW) { - vscode.workspace - .getConfiguration() - .update(CONFIG.SHOW_NEW_FILE_POPUP, false); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_DONT_SHOW - ); - } else if (selection === DialogResponses.EXAMPLE_CODE) { - open(CONSTANTS.LINKS.EXAMPLE_CODE); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_EXAMPLE_CODE - ); - } else if (selection === DialogResponses.TUTORIALS) { - const okAction = () => { - open(CONSTANTS.LINKS.TUTORIALS); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_TUTORIALS - ); - }; - utils.showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT - ); - } - }); - } - - // tslint:disable-next-line: ban-comma-operator - vscode.workspace - .openTextDocument({ - content: file, - language: LANGUAGE_VARS.PYTHON.ID, - }) - .then((template: vscode.TextDocument) => { - vscode.window.showTextDocument(template, 1, false).then(() => { - openWebview(); - }); - }), - // tslint:disable-next-line: no-unused-expression - (error: any) => { - telemetryHandlerService.handleNewFileErrorTelemetry(); - console.error(`Failed to open a new text document: ${error}`); - }; - }; - - const newFile: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.newFile", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_FOR_NEW_FILE, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - deviceSelectionService.setCurrentActiveDevice(device); - - const deviceToTemplateMapping = { - [CONSTANTS.DEVICE_NAME.CPX]: CONSTANTS.TEMPLATE.CPX, - [CONSTANTS.DEVICE_NAME.MICROBIT]: CONSTANTS.TEMPLATE.MICROBIT, - [CONSTANTS.DEVICE_NAME.CLUE]: CONSTANTS.TEMPLATE.CLUE, - }; - const templateFile = deviceToTemplateMapping[device]; - - const telemetryEvents = telemetryHandlerService.getTelemetryEventsForNewFile( - device - ); - - telemetryAI.trackFeatureUsage( - telemetryEvents.newFileTelemetryEvent - ); - telemetryAI.runWithLatencyMeasure( - () => openTemplateFile(templateFile), - telemetryEvents.newFilePerformanceTelemetryEvent - ); - } - ); - - const installDependencies: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.installDependencies", - async () => { - pythonExecutablePath = await setupService.setupEnv(context, true); - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_INSTALL_EXTENSION_DEPENDENCIES - ); - } - ); - - const killProcessIfRunning = () => { - if (childProcess !== undefined) { - if (currentPanel) { - currentPanel.webview.postMessage({ - command: "reset-state", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } - // TODO: We need to check the process was correctly killed - childProcess.kill(); - childProcess = undefined; - } - }; - - const runSimulatorCommand = async () => { - pythonProcessDataBuffer = []; - // Prevent running new code if a debug session is active - if (inDebugMode) { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.DEBUGGING_SESSION_IN_PROGESS - ); - return; - } - if (shouldShowRunCodePopup) { - const shouldExitCommand = await vscode.window - .showWarningMessage( - CONSTANTS.WARNING.ACCEPT_AND_RUN, - DialogResponses.ACCEPT_AND_RUN, - DialogResponses.CANCEL - ) - .then((selection: vscode.MessageItem | undefined) => { - let hasAccepted = true; - if (selection === DialogResponses.ACCEPT_AND_RUN) { - shouldShowRunCodePopup = false; - hasAccepted = false; - } - return hasAccepted; - }); - // Don't run users code if they don't accept - if (shouldExitCommand) { - return; - } - } - - openWebview(); - - if (!currentPanel) { - return; - } - - console.info(CONSTANTS.INFO.RUNNING_CODE); - - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_SIMULATOR, - true - ); - - killProcessIfRunning(); - - await fileSelectionService.updateCurrentFileFromEditor( - vscode.window.activeTextEditor - ); - - if (fileSelectionService.getCurrentFileAbsPath() === "") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_RUN, - true - ); - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FILE_TO_RUN, - DialogResponses.MESSAGE_UNDERSTOOD - ); - } else { - // Save on run - await fileSelectionService.getCurrentTextDocument().save(); - - if ( - !fileSelectionService - .getCurrentTextDocument() - .fileName.endsWith(LANGUAGE_VARS.PYTHON.FILE_ENDS) - ) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_RUN, - true - ); - return; - } - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.FILE_SELECTED( - fileSelectionService.getCurrentFileAbsPath() - ) - ); - - // Activate the run webview button - currentPanel.webview.postMessage({ - command: "activate-play", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - const args = [ - utils.getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.PROCESS_USER_CODE_PY - ), - fileSelectionService.getCurrentFileAbsPath(), - JSON.stringify({ enable_telemetry: utils.getTelemetryState() }), - ]; - childProcess = cp.spawn(pythonExecutablePath, args); - - let dataFromTheProcess = ""; - let oldMessage = ""; - - // Data received from Python process - childProcess.stdout.on("data", data => { - dataFromTheProcess = data.toString(); - if (currentPanel) { - // NOTE: parts of the flow regarding pythonProcessDataBuffer - // are needed for the CLUE simulator to properly receive - // base_64 strings on UNIX systems. - - // added any incomplete data to beginning - const processedData = pythonProcessDataBuffer - .join("") - .concat(dataFromTheProcess); - pythonProcessDataBuffer = []; - - // Process the data from the process and send one state at a time - processedData.split("\0").forEach(message => { - if ( - currentPanel && - message.length > 0 && - message !== oldMessage - ) { - oldMessage = message; - let messageToWebview; - // Check the message is a JSON - try { - messageToWebview = JSON.parse(message); - // Check the JSON is a state - switch (messageToWebview.type) { - case "state": - const messageData = JSON.parse( - messageToWebview.data - ); - if ( - messageData.device_name === - deviceSelectionService.getCurrentActiveDevice() - ) { - messagingService.sendMessageToWebview( - VSCODE_MESSAGES_TO_WEBVIEW.SET_STATE, - messageData - ); - } - break; - - case "print": - console.log( - `Process print statement output = ${messageToWebview.data}` - ); - utils.logToOutputChannel( - outChannel, - `[PRINT] ${messageToWebview.data}` - ); - break; - - default: - console.log( - `Non-state JSON output from the process : ${messageToWebview}` - ); - break; - } - } catch (err) { - if (err instanceof SyntaxError) { - // if not a JSON string, it is incomplete - // add to beginning of next strings - pythonProcessDataBuffer.push(message); - } else { - console.log( - `Errored output: ${messageToWebview}` - ); - } - } - } - }); - } - }); - - // Std error output - childProcess.stderr.on("data", data => { - console.error( - `Error from the Python process through stderr: ${data}` - ); - telemetryAI.trackFeatureUsage( - TelemetryEventName.ERROR_PYTHON_PROCESS - ); - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.STDERR(data), - true - ); - if (currentPanel) { - currentPanel.webview.postMessage({ - active_device: deviceSelectionService.getCurrentActiveDevice(), - command: "reset-state", - }); - } - }); - - // When the process is done - childProcess.on("end", (code: number) => { - console.info(`Command execution exited with code: ${code}`); - }); - } - }; - - // Send message to the webview - const runSimulator: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.runSimulator", - () => { - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_RUN_PALETTE - ); - runSimulatorCommand(); - } - ); - - const deployCode = async (device: string) => { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_DEVICE, - true - ); - - await fileSelectionService.updateCurrentFileFromEditor( - vscode.window.activeTextEditor - ); - - if (fileSelectionService.getCurrentFileAbsPath() === "") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, - true - ); - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, - DialogResponses.MESSAGE_UNDERSTOOD - ); - } else { - await fileSelectionService.getCurrentTextDocument().save(); - - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.FILE_SELECTED( - fileSelectionService.getCurrentFileAbsPath() - ) - ); - - const deviceProcess = cp.spawn(pythonExecutablePath, [ - utils.getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.DEVICE_PY - ), - device, - fileSelectionService.getCurrentFileAbsPath(), - ]); - - let dataFromTheProcess = ""; - - // Data received from Python process - deviceProcess.stdout.on("data", data => { - dataFromTheProcess = data.toString(); - - let messageToWebview; - try { - messageToWebview = JSON.parse(dataFromTheProcess); - if (messageToWebview.type === "complete") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_SUCCESS, - true - ); - } - telemetryHandlerService.handleDeployToDeviceFinishedTelemetry( - messageToWebview, - device - ); - } catch (err) { - console.log( - `Non-JSON output from the process : ${dataFromTheProcess}` - ); - } - }); - - // Std error output - deviceProcess.stderr.on("data", data => { - telemetryHandlerService.handleDeployToDeviceErrorTelemetry( - data, - device - ); - console.error( - `Error from the Python device process through stderr: ${data}` - ); - utils.logToOutputChannel( - outChannel, - `[ERROR] ${data} \n`, - true - ); - }); - - // When the process is done - deviceProcess.on("end", (code: number) => { - console.info(`Command execution exited with code: ${code}`); - }); - } - }; - - const deployToDevice: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.deployToDevice", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_DEPLOY_TO, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - - const telemetryEvents = telemetryHandlerService.getTelemetryEventsForStartingDeployToDevice( - device - ); - - telemetryAI.trackFeatureUsage(telemetryEvents.deployTelemetryEvent); - telemetryAI.runWithLatencyMeasure(() => { - deployCode(device); - }, telemetryEvents.deployPerformanceTelemetryEvent); - } - ); - - let serialMonitor: SerialMonitor | undefined; - if (configFileCreated) { - serialMonitor = SerialMonitor.getInstance(); - context.subscriptions.push(serialMonitor); - } - - const selectSerialPort: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.selectSerialPort", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.selectSerialPort(null, null); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CHOOSE_PORT); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const openSerialMonitor: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.openSerialMonitor", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure( - serialMonitor.openSerialMonitor.bind(serialMonitor), - TelemetryEventName.COMMAND_SERIAL_MONITOR_OPEN - ); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const changeBaudRate: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.changeBaudRate", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure( - serialMonitor.changeBaudRate.bind(serialMonitor), - TelemetryEventName.COMMAND_SERIAL_MONITOR_BAUD_RATE - ); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const closeSerialMonitor: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.closeSerialMonitor", - (port, showWarning = true) => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.closeSerialMonitor(port, showWarning); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const showReleaseNote = vscode.commands.registerCommand( - "deviceSimulatorExpress.", - (port, showWarning = true) => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.closeSerialMonitor(port, showWarning); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - UsbDetector.getInstance().initialize(context.extensionPath); - UsbDetector.getInstance().startListening(); - - if ( - CPXWorkspace.rootPath && - (utils.fileExistsSync( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ) || - vscode.window.activeTextEditor) - ) { - (() => { - if (!SerialMonitor.getInstance().initialized) { - SerialMonitor.getInstance().initialize(); - } - })(); - } - - // Debugger configuration - const simulatorDebugConfiguration = new SimulatorDebugConfigurationProvider( - utils.getPathToScript(context, "out/", "debug_user_code.py") - ); - - const debugAdapterFactory = new DebugAdapterFactory( - vscode.debug.activeDebugSession, - messagingService, - debuggerCommunicationService - ); - vscode.debug.registerDebugAdapterTrackerFactory( - LANGUAGE_VARS.PYTHON.ID, - debugAdapterFactory - ); - // On Debug Session Start: Init comunication - const debugSessionsStarted = vscode.debug.onDidStartDebugSession(() => { - if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { - // Reinitialize process - killProcessIfRunning(); - inDebugMode = true; - - try { - // Shut down existing server on debug restart - if (debuggerCommunicationService.getCurrentDebuggerServer()) { - debuggerCommunicationService.resetCurrentDebuggerServer(); - } - - debuggerCommunicationService.setCurrentDebuggerServer( - new DebuggerCommunicationServer( - currentPanel, - utils.getServerPortConfig(), - deviceSelectionService - ) - ); - - telemetryHandlerService.handleDebuggerTelemetry(); - - openWebview(); - if (currentPanel) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .setWebview(currentPanel); - currentPanel.webview.postMessage({ - active_device: deviceSelectionService.getCurrentActiveDevice(), - command: "activate-play", - }); - } - } catch (err) { - if (err.message === SERVER_INFO.ERROR_CODE_INIT_SERVER) { - console.error( - `Error trying to init the server on port ${utils.getServerPortConfig()}` - ); - - telemetryHandlerService.handleDebuggerFailTelemetry(); - - vscode.window.showErrorMessage( - CONSTANTS.ERROR.DEBUGGER_SERVER_INIT_FAILED( - utils.getServerPortConfig() - ) - ); - } - } - } - }); - - // On Debug Session Stop: Stop communiation - const debugSessionStopped = vscode.debug.onDidTerminateDebugSession(() => { - if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { - inDebugMode = false; - simulatorDebugConfiguration.deviceSimulatorExpressDebug = false; - if (debuggerCommunicationService.getCurrentDebuggerServer()) { - debuggerCommunicationService.resetCurrentDebuggerServer(); - } - if (currentPanel) { - currentPanel.webview.postMessage({ - command: "reset-state", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } - } - }); - - const configsChanged = vscode.workspace.onDidChangeConfiguration( - async () => { - if (utils.checkConfig(CONFIG.CONFIG_ENV_ON_SWITCH)) { - pythonExecutablePath = await setupService.setupEnv(context); - } - } - ); - - context.subscriptions.push( - installDependencies, - runSimulator, - changeBaudRate, - closeSerialMonitor, - deployToDevice, - newFile, - openSimulator, - openSerialMonitor, - selectSerialPort, - gettingStartedOpen, - vscode.debug.registerDebugConfigurationProvider( - CONSTANTS.DEBUG_CONFIGURATION_TYPE, - simulatorDebugConfiguration - ), - debugSessionsStarted, - debugSessionStopped, - configsChanged - ); + telemetryAI = new TelemetryAI(context); + setupService = new SetupService(telemetryAI); + let currentPanel: vscode.WebviewPanel | undefined; + let childProcess: cp.ChildProcess | undefined; + let messageListener: vscode.Disposable; + let activeEditorListener: vscode.Disposable; + const webviewService = new WebviewService(context, deviceSelectionService); + const telemetryHandlerService = new TelemetryHandlerService( + telemetryAI, + deviceSelectionService + ); + const formalNameToNickNameMapping = { + [CONSTANTS.DEVICE_NAME_FORMAL.CPX]: CONSTANTS.DEVICE_NAME.CPX, + [CONSTANTS.DEVICE_NAME_FORMAL.MICROBIT]: CONSTANTS.DEVICE_NAME.MICROBIT, + [CONSTANTS.DEVICE_NAME_FORMAL.CLUE]: CONSTANTS.DEVICE_NAME.CLUE, + }; + + // Add our library path to settings.json for autocomplete functionality + updatePythonExtraPaths(); + + // ignore import errors so that adafruit_circuitplayground library + // doesn't trigger lint errors + updatePylintArgs(context); + + pythonExecutablePath = await setupService.setupEnv(context); + + try { + utils.generateCPXConfig(); + configFileCreated = true; + } catch (err) { + console.info("Failed to create the CPX config file."); + configFileCreated = false; + } + + if (pythonExecutablePath === "") { + return; + } + + if (outChannel === undefined) { + outChannel = vscode.window.createOutputChannel(CONSTANTS.NAME); + utils.logToOutputChannel(outChannel, CONSTANTS.INFO.WELCOME_OUTPUT_TAB); + } + + vscode.workspace.onDidSaveTextDocument( + async (document: vscode.TextDocument) => { + await fileSelectionService.updateCurrentFileFromTextFile(document); + } + ); + + const currVersionReleaseName = + "release_note_" + getPackageInfo(context).extensionVersion; + const viewedReleaseNote = context.globalState.get( + currVersionReleaseName, + false + ); + + if (!viewedReleaseNote) { + PopupService.openReleaseNote(); + context.globalState.update(currVersionReleaseName, true); + } + + const openWebview = () => { + if (currentPanel && currentPanel.webview) { + messagingService.setWebview(currentPanel.webview); + currentPanel.webview.html = webviewService.getWebviewContent( + WEBVIEW_TYPES.SIMULATOR, + true, + currentPanel + ); + currentPanel.reveal(vscode.ViewColumn.Beside); + } else { + currentPanel = vscode.window.createWebviewPanel( + CONSTANTS.WEBVIEW_TYPE.SIMULATOR, + CONSTANTS.LABEL.WEBVIEW_PANEL, + { preserveFocus: true, viewColumn: vscode.ViewColumn.Beside }, + { + // Only allow the webview to access resources in our extension's media directory + localResourceRoots: [ + vscode.Uri.file( + path.join( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY + ) + ), + ], + enableScripts: true, + } + ); + + currentPanel.webview.html = webviewService.getWebviewContent( + WEBVIEW_TYPES.SIMULATOR, + true, + currentPanel + ); + messagingService.setWebview(currentPanel.webview); + + if (messageListener !== undefined) { + messageListener.dispose(); + const index = context.subscriptions.indexOf(messageListener); + if (index > -1) { + context.subscriptions.splice(index, 1); + } + } + + if (activeEditorListener !== undefined) { + activeEditorListener.dispose(); + const index = + context.subscriptions.indexOf(activeEditorListener); + if (index > -1) { + context.subscriptions.splice(index, 1); + } + } + + if (currentPanel) { + // Handle messages from webview + messageListener = currentPanel.webview.onDidReceiveMessage( + (message) => { + const messageJson = JSON.stringify({ + active_device: + deviceSelectionService.getCurrentActiveDevice(), + state: message.text, + }); + switch (message.command) { + case WEBVIEW_MESSAGES.BUTTON_PRESS: + // Send input to the Python process + telemetryHandlerService.handleButtonPressTelemetry( + message.text + ); + console.log(`About to write ${messageJson} \n`); + if ( + inDebugMode && + debuggerCommunicationService.getCurrentDebuggerServer() + ) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .emitInputChanged(messageJson); + } else if (childProcess) { + childProcess.stdin.write( + messageJson + "\n" + ); + } + break; + case WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP: + console.log(`Play button ${messageJson} \n`); + if (message.text.state as boolean) { + fileSelectionService.setPathAndSendMessage( + message.text.selected_file + ); + fileSelectionService.findCurrentTextDocument(); + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_RUN_SIMULATOR_BUTTON + ); + runSimulatorCommand(); + } else { + killProcessIfRunning(); + } + + if (childProcess) { + childProcess.stdin.write( + messageJson + "\n" + ); + } + + break; + case WEBVIEW_MESSAGES.GESTURE: + case WEBVIEW_MESSAGES.SENSOR_CHANGED: + telemetryHandlerService.handleGestureTelemetry( + message.text + ); + console.log(`Sensor changed ${messageJson} \n`); + if ( + inDebugMode && + debuggerCommunicationService.getCurrentDebuggerServer() + ) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .emitInputChanged(messageJson); + } else if (childProcess) { + childProcess.stdin.write( + messageJson + "\n" + ); + } + break; + case WEBVIEW_MESSAGES.REFRESH_SIMULATOR: + console.log("Refresh button"); + runSimulatorCommand(); + break; + case WEBVIEW_MESSAGES.SLIDER_TELEMETRY: + telemetryHandlerService.handleSensorTelemetry( + message.text + ); + break; + case WEBVIEW_MESSAGES.SWITCH_DEVICE: + deviceSelectionService.setCurrentActiveDevice( + message.text.active_device + ); + killProcessIfRunning(); + break; + default: + vscode.window.showInformationMessage( + CONSTANTS.ERROR.UNEXPECTED_MESSAGE + ); + break; + } + }, + undefined, + context.subscriptions + ); + + activeEditorListener = utils.addVisibleTextEditorCallback( + currentPanel, + context + ); + } + + currentPanel.onDidDispose( + () => { + currentPanel = undefined; + if ( + debuggerCommunicationService.getCurrentDebuggerServer() + ) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .setWebview(undefined); + } + killProcessIfRunning(); + if (firstTimeClosed) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.FIRST_TIME_WEBVIEW + ); + firstTimeClosed = false; + } + }, + undefined, + context.subscriptions + ); + } + sendCurrentDeviceMessage(currentPanel); + }; + + // Open Simulator on the webview + const openSimulator: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.openSimulator", + async () => { + const chosen_device = await vscode.window.showQuickPick( + Object.values(CONSTANTS.DEVICE_NAME_FORMAL) + ); + + if (!chosen_device) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_SIMULATE_TO, + true + ); + return; + } + + const device = formalNameToNickNameMapping[chosen_device]; + deviceSelectionService.setCurrentActiveDevice(device); + const telemetryEvents = + telemetryHandlerService.getTelemetryEventsForOpenSimulator( + device + ); + telemetryAI.trackFeatureUsage( + telemetryEvents.openSimulatorTelemetryEvent + ); + telemetryAI.runWithLatencyMeasure( + openWebview, + telemetryEvents.openSimulatorPerformanceTelemetryEvent + ); + } + ); + + const gettingStartedOpen: vscode.Disposable = + vscode.commands.registerCommand( + "deviceSimulatorExpress.common.gettingStarted", + () => { + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_GETTING_STARTED + ); + webviewService.openTutorialPanel(); + } + ); + + const openTemplateFile = (template: string) => { + const fileName = template; + const filePath = + __dirname + path.sep + "templates" + path.sep + fileName; + const file = fs.readFileSync(filePath, "utf8"); + const showNewFilePopup: boolean = vscode.workspace + .getConfiguration() + .get(CONFIG.SHOW_NEW_FILE_POPUP); + + if (showNewFilePopup && template === CONSTANTS.TEMPLATE.CPX) { + vscode.window + .showInformationMessage( + CONSTANTS.INFO.NEW_FILE, + DialogResponses.DONT_SHOW, + DialogResponses.EXAMPLE_CODE, + DialogResponses.TUTORIALS + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.DONT_SHOW) { + vscode.workspace + .getConfiguration() + .update(CONFIG.SHOW_NEW_FILE_POPUP, false); + telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_CLICK_DIALOG_DONT_SHOW + ); + } else if (selection === DialogResponses.EXAMPLE_CODE) { + open(CONSTANTS.LINKS.EXAMPLE_CODE); + telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_CLICK_DIALOG_EXAMPLE_CODE + ); + } else if (selection === DialogResponses.TUTORIALS) { + const okAction = () => { + open(CONSTANTS.LINKS.TUTORIALS); + telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_CLICK_DIALOG_TUTORIALS + ); + }; + utils.showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT + ); + } + }); + } + + // tslint:disable-next-line: ban-comma-operator + vscode.workspace + .openTextDocument({ + content: file, + language: LANGUAGE_VARS.PYTHON.ID, + }) + .then((template: vscode.TextDocument) => { + vscode.window.showTextDocument(template, 1, false).then(() => { + openWebview(); + }); + }), + // tslint:disable-next-line: no-unused-expression + (error: any) => { + telemetryHandlerService.handleNewFileErrorTelemetry(); + console.error(`Failed to open a new text document: ${error}`); + }; + }; + + const newFile: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.newFile", + async () => { + const chosen_device = await vscode.window.showQuickPick( + Object.values(CONSTANTS.DEVICE_NAME_FORMAL) + ); + + if (!chosen_device) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.NO_DEVICE_CHOSEN_FOR_NEW_FILE, + true + ); + return; + } + + const device = formalNameToNickNameMapping[chosen_device]; + deviceSelectionService.setCurrentActiveDevice(device); + + const deviceToTemplateMapping = { + [CONSTANTS.DEVICE_NAME.CPX]: CONSTANTS.TEMPLATE.CPX, + [CONSTANTS.DEVICE_NAME.MICROBIT]: CONSTANTS.TEMPLATE.MICROBIT, + [CONSTANTS.DEVICE_NAME.CLUE]: CONSTANTS.TEMPLATE.CLUE, + }; + const templateFile = deviceToTemplateMapping[device]; + + const telemetryEvents = + telemetryHandlerService.getTelemetryEventsForNewFile(device); + + telemetryAI.trackFeatureUsage( + telemetryEvents.newFileTelemetryEvent + ); + telemetryAI.runWithLatencyMeasure( + () => openTemplateFile(templateFile), + telemetryEvents.newFilePerformanceTelemetryEvent + ); + } + ); + + const installDependencies: vscode.Disposable = + vscode.commands.registerCommand( + "deviceSimulatorExpress.common.installDependencies", + async () => { + pythonExecutablePath = await setupService.setupEnv( + context, + true + ); + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_INSTALL_EXTENSION_DEPENDENCIES + ); + } + ); + + const killProcessIfRunning = () => { + if (childProcess !== undefined) { + if (currentPanel) { + currentPanel.webview.postMessage({ + command: "reset-state", + active_device: + deviceSelectionService.getCurrentActiveDevice(), + }); + } + // TODO: We need to check the process was correctly killed + childProcess.kill(); + childProcess = undefined; + } + }; + + const runSimulatorCommand = async () => { + pythonProcessDataBuffer = []; + // Prevent running new code if a debug session is active + if (inDebugMode) { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.DEBUGGING_SESSION_IN_PROGESS + ); + return; + } + if (shouldShowRunCodePopup) { + const shouldExitCommand = await vscode.window + .showWarningMessage( + CONSTANTS.WARNING.ACCEPT_AND_RUN, + DialogResponses.ACCEPT_AND_RUN, + DialogResponses.CANCEL + ) + .then((selection: vscode.MessageItem | undefined) => { + let hasAccepted = true; + if (selection === DialogResponses.ACCEPT_AND_RUN) { + shouldShowRunCodePopup = false; + hasAccepted = false; + } + return hasAccepted; + }); + // Don't run users code if they don't accept + if (shouldExitCommand) { + return; + } + } + + openWebview(); + + if (!currentPanel) { + return; + } + + console.info(CONSTANTS.INFO.RUNNING_CODE); + + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.DEPLOY_SIMULATOR, + true + ); + + killProcessIfRunning(); + + await fileSelectionService.updateCurrentFileFromEditor( + vscode.window.activeTextEditor + ); + + if (fileSelectionService.getCurrentFileAbsPath() === "") { + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.NO_FILE_TO_RUN, + true + ); + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FILE_TO_RUN, + DialogResponses.MESSAGE_UNDERSTOOD + ); + } else { + // Save on run + await fileSelectionService.getCurrentTextDocument().save(); + + if ( + !fileSelectionService + .getCurrentTextDocument() + .fileName.endsWith(LANGUAGE_VARS.PYTHON.FILE_ENDS) + ) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.NO_FILE_TO_RUN, + true + ); + return; + } + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.FILE_SELECTED( + fileSelectionService.getCurrentFileAbsPath() + ) + ); + + // Activate the run webview button + currentPanel.webview.postMessage({ + command: "activate-play", + active_device: deviceSelectionService.getCurrentActiveDevice(), + }); + const args = [ + utils.getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.PROCESS_USER_CODE_PY + ), + fileSelectionService.getCurrentFileAbsPath(), + JSON.stringify({ enable_telemetry: utils.getTelemetryState() }), + ]; + childProcess = cp.spawn(pythonExecutablePath, args); + + let dataFromTheProcess = ""; + let oldMessage = ""; + + // Data received from Python process + childProcess.stdout.on("data", (data) => { + dataFromTheProcess = data.toString(); + if (currentPanel) { + // NOTE: parts of the flow regarding pythonProcessDataBuffer + // are needed for the CLUE simulator to properly receive + // base_64 strings on UNIX systems. + + // added any incomplete data to beginning + const processedData = pythonProcessDataBuffer + .join("") + .concat(dataFromTheProcess); + pythonProcessDataBuffer = []; + + // Process the data from the process and send one state at a time + processedData.split("\0").forEach((message) => { + if ( + currentPanel && + message.length > 0 && + message !== oldMessage + ) { + oldMessage = message; + let messageToWebview; + // Check the message is a JSON + try { + messageToWebview = JSON.parse(message); + // Check the JSON is a state + switch (messageToWebview.type) { + case "state": + const messageData = JSON.parse( + messageToWebview.data + ); + if ( + messageData.device_name === + deviceSelectionService.getCurrentActiveDevice() + ) { + messagingService.sendMessageToWebview( + VSCODE_MESSAGES_TO_WEBVIEW.SET_STATE, + messageData + ); + } + break; + + case "print": + console.log( + `Process print statement output = ${messageToWebview.data}` + ); + utils.logToOutputChannel( + outChannel, + `[PRINT] ${messageToWebview.data}` + ); + break; + + default: + console.log( + `Non-state JSON output from the process : ${messageToWebview}` + ); + break; + } + } catch (err) { + if (err instanceof SyntaxError) { + // if not a JSON string, it is incomplete + // add to beginning of next strings + pythonProcessDataBuffer.push(message); + } else { + console.log( + `Errored output: ${messageToWebview}` + ); + } + } + } + }); + } + }); + + // Std error output + childProcess.stderr.on("data", (data) => { + console.error( + `Error from the Python process through stderr: ${data}` + ); + telemetryAI.trackFeatureUsage( + TelemetryEventName.ERROR_PYTHON_PROCESS + ); + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.STDERR(data), + true + ); + if (currentPanel) { + currentPanel.webview.postMessage({ + active_device: + deviceSelectionService.getCurrentActiveDevice(), + command: "reset-state", + }); + } + }); + + // When the process is done + childProcess.on("end", (code: number) => { + console.info(`Command execution exited with code: ${code}`); + }); + } + }; + + // Send message to the webview + const runSimulator: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.runSimulator", + () => { + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_RUN_PALETTE + ); + runSimulatorCommand(); + } + ); + + const deployCode = async (device: string) => { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.DEPLOY_DEVICE, + true + ); + + await fileSelectionService.updateCurrentFileFromEditor( + vscode.window.activeTextEditor + ); + + if (fileSelectionService.getCurrentFileAbsPath() === "") { + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, + true + ); + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, + DialogResponses.MESSAGE_UNDERSTOOD + ); + } else { + await fileSelectionService.getCurrentTextDocument().save(); + + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.FILE_SELECTED( + fileSelectionService.getCurrentFileAbsPath() + ) + ); + + const deviceProcess = cp.spawn(pythonExecutablePath, [ + utils.getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.DEVICE_PY + ), + device, + fileSelectionService.getCurrentFileAbsPath(), + ]); + + let dataFromTheProcess = ""; + + // Data received from Python process + deviceProcess.stdout.on("data", (data) => { + dataFromTheProcess = data.toString(); + + let messageToWebview; + try { + messageToWebview = JSON.parse(dataFromTheProcess); + if (messageToWebview.type === "complete") { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.DEPLOY_SUCCESS, + true + ); + } + telemetryHandlerService.handleDeployToDeviceFinishedTelemetry( + messageToWebview, + device + ); + } catch (err) { + console.log( + `Non-JSON output from the process : ${dataFromTheProcess}` + ); + } + }); + + // Std error output + deviceProcess.stderr.on("data", (data) => { + telemetryHandlerService.handleDeployToDeviceErrorTelemetry( + data, + device + ); + console.error( + `Error from the Python device process through stderr: ${data}` + ); + utils.logToOutputChannel( + outChannel, + `[ERROR] ${data} \n`, + true + ); + }); + + // When the process is done + deviceProcess.on("end", (code: number) => { + console.info(`Command execution exited with code: ${code}`); + }); + } + }; + + const deployToDevice: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.deployToDevice", + async () => { + const chosen_device = await vscode.window.showQuickPick( + Object.values(CONSTANTS.DEVICE_NAME_FORMAL) + ); + + if (!chosen_device) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_DEPLOY_TO, + true + ); + return; + } + + const device = formalNameToNickNameMapping[chosen_device]; + + const telemetryEvents = + telemetryHandlerService.getTelemetryEventsForStartingDeployToDevice( + device + ); + + telemetryAI.trackFeatureUsage(telemetryEvents.deployTelemetryEvent); + telemetryAI.runWithLatencyMeasure(() => { + deployCode(device); + }, telemetryEvents.deployPerformanceTelemetryEvent); + } + ); + + let serialMonitor: SerialMonitor | undefined; + if (configFileCreated) { + serialMonitor = SerialMonitor.getInstance(); + context.subscriptions.push(serialMonitor); + } + + const selectSerialPort: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.selectSerialPort", + () => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure(() => { + serialMonitor.selectSerialPort(null, null); + }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CHOOSE_PORT); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + const openSerialMonitor: vscode.Disposable = + vscode.commands.registerCommand( + "deviceSimulatorExpress.common.openSerialMonitor", + () => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure( + serialMonitor.openSerialMonitor.bind(serialMonitor), + TelemetryEventName.COMMAND_SERIAL_MONITOR_OPEN + ); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + const changeBaudRate: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.changeBaudRate", + () => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure( + serialMonitor.changeBaudRate.bind(serialMonitor), + TelemetryEventName.COMMAND_SERIAL_MONITOR_BAUD_RATE + ); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + const closeSerialMonitor: vscode.Disposable = + vscode.commands.registerCommand( + "deviceSimulatorExpress.common.closeSerialMonitor", + (port, showWarning = true) => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure(() => { + serialMonitor.closeSerialMonitor(port, showWarning); + }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + const showReleaseNote = vscode.commands.registerCommand( + "deviceSimulatorExpress.", + (port, showWarning = true) => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure(() => { + serialMonitor.closeSerialMonitor(port, showWarning); + }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + UsbDetector.getInstance().initialize(context.extensionPath); + UsbDetector.getInstance().startListening(); + + if ( + CPXWorkspace.rootPath && + (utils.fileExistsSync( + path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) + ) || + vscode.window.activeTextEditor) + ) { + (() => { + if (!SerialMonitor.getInstance().initialized) { + SerialMonitor.getInstance().initialize(); + } + })(); + } + + // Debugger configuration + const simulatorDebugConfiguration = new SimulatorDebugConfigurationProvider( + utils.getPathToScript(context, "out/", "debug_user_code.py") + ); + + const debugAdapterFactory = new DebugAdapterFactory( + vscode.debug.activeDebugSession, + messagingService, + debuggerCommunicationService + ); + vscode.debug.registerDebugAdapterTrackerFactory( + LANGUAGE_VARS.PYTHON.ID, + debugAdapterFactory + ); + // On Debug Session Start: Init comunication + const debugSessionsStarted = vscode.debug.onDidStartDebugSession(() => { + if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { + // Reinitialize process + killProcessIfRunning(); + inDebugMode = true; + + try { + // Shut down existing server on debug restart + if (debuggerCommunicationService.getCurrentDebuggerServer()) { + debuggerCommunicationService.resetCurrentDebuggerServer(); + } + + debuggerCommunicationService.setCurrentDebuggerServer( + new DebuggerCommunicationServer( + currentPanel, + utils.getServerPortConfig(), + deviceSelectionService + ) + ); + + telemetryHandlerService.handleDebuggerTelemetry(); + + openWebview(); + if (currentPanel) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .setWebview(currentPanel); + currentPanel.webview.postMessage({ + active_device: + deviceSelectionService.getCurrentActiveDevice(), + command: "activate-play", + }); + } + } catch (err) { + if (err.message === SERVER_INFO.ERROR_CODE_INIT_SERVER) { + console.error( + `Error trying to init the server on port ${utils.getServerPortConfig()}` + ); + + telemetryHandlerService.handleDebuggerFailTelemetry(); + + vscode.window.showErrorMessage( + CONSTANTS.ERROR.DEBUGGER_SERVER_INIT_FAILED( + utils.getServerPortConfig() + ) + ); + } + } + } + }); + + // On Debug Session Stop: Stop communiation + const debugSessionStopped = vscode.debug.onDidTerminateDebugSession(() => { + if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { + inDebugMode = false; + simulatorDebugConfiguration.deviceSimulatorExpressDebug = false; + if (debuggerCommunicationService.getCurrentDebuggerServer()) { + debuggerCommunicationService.resetCurrentDebuggerServer(); + } + if (currentPanel) { + currentPanel.webview.postMessage({ + command: "reset-state", + active_device: + deviceSelectionService.getCurrentActiveDevice(), + }); + } + } + }); + + const configsChanged = vscode.workspace.onDidChangeConfiguration( + async () => { + if (utils.checkConfig(CONFIG.CONFIG_ENV_ON_SWITCH)) { + pythonExecutablePath = await setupService.setupEnv(context); + } + } + ); + + context.subscriptions.push( + installDependencies, + runSimulator, + changeBaudRate, + closeSerialMonitor, + deployToDevice, + newFile, + openSimulator, + openSerialMonitor, + selectSerialPort, + gettingStartedOpen, + vscode.debug.registerDebugConfigurationProvider( + CONSTANTS.DEBUG_CONFIGURATION_TYPE, + simulatorDebugConfiguration + ), + debugSessionsStarted, + debugSessionStopped, + configsChanged + ); } const updatePythonExtraPaths = () => { - updateConfigLists( - "python.autoComplete.extraPaths", - [ - __dirname, - path.join(__dirname, CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY), - path.join(__dirname, CONSTANTS.FILESYSTEM.CLUE), - path.join(__dirname, CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON), - ], - vscode.ConfigurationTarget.Global - ); + updateConfigLists( + "python.autoComplete.extraPaths", + [ + __dirname, + path.join(__dirname, CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY), + path.join(__dirname, CONSTANTS.FILESYSTEM.CLUE), + path.join(__dirname, CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON), + ], + vscode.ConfigurationTarget.Global + ); }; const updatePylintArgs = (context: vscode.ExtensionContext) => { - const outPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY - ); - const micropythonPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY - ); - - const cluePath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.CLUE - ); - - const baseCircuitPythonPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON - ); - // update pylint args to extend system path - // to include python libs local to extention - updateConfigLists( - "python.linting.pylintArgs", - [ - "--init-hook", - `import sys; sys.path.extend([\"${outPath}\",\"${micropythonPath}\",\"${cluePath}\",\"${baseCircuitPythonPath}\"])`, - ], - vscode.ConfigurationTarget.Workspace - ); + const outPath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY + ); + const micropythonPath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY + ); + + const cluePath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + CONSTANTS.FILESYSTEM.CLUE + ); + + const baseCircuitPythonPath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON + ); + // update pylint args to extend system path + // to include python libs local to extention + updateConfigLists( + "python.linting.pylintArgs", + [ + "--init-hook", + `import sys; sys.path.extend([\"${outPath}\",\"${micropythonPath}\",\"${cluePath}\",\"${baseCircuitPythonPath}\"])`, + ], + vscode.ConfigurationTarget.Workspace + ); }; const updateConfigLists = ( - section: string, - newItems: string[], - scope: vscode.ConfigurationTarget + section: string, + newItems: string[], + scope: vscode.ConfigurationTarget ) => { - // function for adding elements to configuration arrays - const currentExtraItems: string[] = - vscode.workspace.getConfiguration().get(section) || []; - const extraItemsSet: Set = new Set( - currentExtraItems.concat(newItems) - ); - - vscode.workspace - .getConfiguration() - .update(section, Array.from(extraItemsSet), scope); + // function for adding elements to configuration arrays + const currentExtraItems: string[] = + vscode.workspace.getConfiguration().get(section) || []; + const extraItemsSet: Set = new Set( + currentExtraItems.concat(newItems) + ); + + vscode.workspace + .getConfiguration() + .update(section, Array.from(extraItemsSet), scope); }; // this method is called when your extension is deactivated export async function deactivate() { - const monitor: SerialMonitor = SerialMonitor.getInstance(); - await monitor.closeSerialMonitor(null, false); - UsbDetector.getInstance().stopListening(); + const monitor: SerialMonitor = SerialMonitor.getInstance(); + await monitor.closeSerialMonitor(null, false); + UsbDetector.getInstance().stopListening(); } diff --git a/Source/extension_utils/utils.ts b/Source/extension_utils/utils.ts index b7be3b71c..e276605a5 100644 --- a/Source/extension_utils/utils.ts +++ b/Source/extension_utils/utils.ts @@ -7,11 +7,11 @@ import * as path from "path"; import * as util from "util"; import * as vscode from "vscode"; import { - CONSTANTS, - CPX_CONFIG_FILE, - DialogResponses, - GLOBAL_ENV_VARS, - SERVER_INFO, + CONSTANTS, + CPX_CONFIG_FILE, + DialogResponses, + GLOBAL_ENV_VARS, + SERVER_INFO, } from "../constants"; import { CPXWorkspace } from "../cpxWorkspace"; import { DeviceContext } from "../deviceContext"; @@ -19,94 +19,94 @@ import { DeviceContext } from "../deviceContext"; export const exec = util.promisify(cp.exec); const errorChannel = vscode.window.createOutputChannel( - CONSTANTS.ERROR.INSTALLATION_ERROR + CONSTANTS.ERROR.INSTALLATION_ERROR ); // tslint:disable-next-line: export-name export const getPathToScript = ( - context: vscode.ExtensionContext, - folderName: string, - fileName: string = "" + context: vscode.ExtensionContext, + folderName: string, + fileName: string = "" ) => { - const onDiskPath = vscode.Uri.file( - path.join(context.extensionPath, folderName, fileName) - ); - const scriptPath = onDiskPath.with({ scheme: "vscode-resource" }); - return scriptPath.fsPath; + const onDiskPath = vscode.Uri.file( + path.join(context.extensionPath, folderName, fileName) + ); + const scriptPath = onDiskPath.with({ scheme: "vscode-resource" }); + return scriptPath.fsPath; }; export const showPrivacyModal = ( - okAction: () => void, - thirdPartyDisclaimer: string + okAction: () => void, + thirdPartyDisclaimer: string ) => { - vscode.window - .showInformationMessage( - `${thirdPartyDisclaimer}: ${CONSTANTS.LINKS.PRIVACY}`, - DialogResponses.AGREE_AND_PROCEED, - DialogResponses.CANCEL - ) - .then((privacySelection: vscode.MessageItem | undefined) => { - if (privacySelection === DialogResponses.AGREE_AND_PROCEED) { - okAction(); - } else if (privacySelection === DialogResponses.CANCEL) { - // do nothing - } - }); + vscode.window + .showInformationMessage( + `${thirdPartyDisclaimer}: ${CONSTANTS.LINKS.PRIVACY}`, + DialogResponses.AGREE_AND_PROCEED, + DialogResponses.CANCEL + ) + .then((privacySelection: vscode.MessageItem | undefined) => { + if (privacySelection === DialogResponses.AGREE_AND_PROCEED) { + okAction(); + } else if (privacySelection === DialogResponses.CANCEL) { + // do nothing + } + }); }; export const logToOutputChannel = ( - outChannel: vscode.OutputChannel | undefined, - message: string, - show: boolean = false + outChannel: vscode.OutputChannel | undefined, + message: string, + show: boolean = false ): void => { - if (outChannel) { - if (show) { - outChannel.show(true); - } - outChannel.append(message); - } + if (outChannel) { + if (show) { + outChannel.show(true); + } + outChannel.append(message); + } }; export function tryParseJSON(jsonString: string): any | boolean { - try { - const jsonObj = JSON.parse(jsonString); - if (jsonObj && typeof jsonObj === "object") { - return jsonObj; - } - } catch (exception) {} - - return false; + try { + const jsonObj = JSON.parse(jsonString); + if (jsonObj && typeof jsonObj === "object") { + return jsonObj; + } + } catch (exception) {} + + return false; } export function fileExistsSync(filePath: string): boolean { - try { - return fs.statSync(filePath).isFile(); - } catch (error) { - return false; - } + try { + return fs.statSync(filePath).isFile(); + } catch (error) { + return false; + } } export function mkdirRecursivelySync(dirPath: string): void { - if (directoryExistsSync(dirPath)) { - return; - } - const dirname = path.dirname(dirPath); - if (path.normalize(dirname) === path.normalize(dirPath)) { - fs.mkdirSync(dirPath); - } else if (directoryExistsSync(dirname)) { - fs.mkdirSync(dirPath); - } else { - mkdirRecursivelySync(dirname); - fs.mkdirSync(dirPath); - } + if (directoryExistsSync(dirPath)) { + return; + } + const dirname = path.dirname(dirPath); + if (path.normalize(dirname) === path.normalize(dirPath)) { + fs.mkdirSync(dirPath); + } else if (directoryExistsSync(dirname)) { + fs.mkdirSync(dirPath); + } else { + mkdirRecursivelySync(dirname); + fs.mkdirSync(dirPath); + } } export function directoryExistsSync(dirPath: string): boolean { - try { - return fs.statSync(dirPath).isDirectory(); - } catch (e) { - return false; - } + try { + return fs.statSync(dirPath).isDirectory(); + } catch (e) { + return false; + } } /** @@ -115,119 +115,121 @@ export function directoryExistsSync(dirPath: string): boolean { * The padding is applied from the start (left) of the current string. */ export function padStart( - sourceString: string, - targetLength: number, - padString?: string + sourceString: string, + targetLength: number, + padString?: string ): string { - if (!sourceString) { - return sourceString; - } - - if (!(String.prototype as any).padStart) { - // https://github.com/uxitten/polyfill/blob/master/string.polyfill.js - padString = String(padString || " "); - if (sourceString.length > targetLength) { - return sourceString; - } else { - targetLength = targetLength - sourceString.length; - if (targetLength > padString.length) { - padString += padString.repeat(targetLength / padString.length); // append to original to ensure we are longer than needed - } - return padString.slice(0, targetLength) + sourceString; - } - } else { - return (sourceString as any).padStart(targetLength, padString); - } + if (!sourceString) { + return sourceString; + } + + if (!(String.prototype as any).padStart) { + // https://github.com/uxitten/polyfill/blob/master/string.polyfill.js + padString = String(padString || " "); + if (sourceString.length > targetLength) { + return sourceString; + } else { + targetLength = targetLength - sourceString.length; + if (targetLength > padString.length) { + padString += padString.repeat(targetLength / padString.length); // append to original to ensure we are longer than needed + } + return padString.slice(0, targetLength) + sourceString; + } + } else { + return (sourceString as any).padStart(targetLength, padString); + } } export function convertToHex(num: number, width = 0): string { - return padStart(num.toString(16), width, "0"); + return padStart(num.toString(16), width, "0"); } export function generateCPXConfig(): void { - const deviceContext: DeviceContext = DeviceContext.getInstance(); - const cpxJson = { - port: deviceContext.port, - }; - const cpxConfigFilePath: string = path.join( - CPXWorkspace.rootPath, - CPX_CONFIG_FILE - ); - mkdirRecursivelySync(path.dirname(cpxConfigFilePath)); - fs.writeFileSync(cpxConfigFilePath, JSON.stringify(cpxJson, null, 4)); + const deviceContext: DeviceContext = DeviceContext.getInstance(); + const cpxJson = { + port: deviceContext.port, + }; + const cpxConfigFilePath: string = path.join( + CPXWorkspace.rootPath, + CPX_CONFIG_FILE + ); + mkdirRecursivelySync(path.dirname(cpxConfigFilePath)); + fs.writeFileSync(cpxConfigFilePath, JSON.stringify(cpxJson, null, 4)); } export const addVisibleTextEditorCallback = ( - currentPanel: vscode.WebviewPanel, - context: vscode.ExtensionContext + currentPanel: vscode.WebviewPanel, + context: vscode.ExtensionContext ): vscode.Disposable => { - const initialPythonEditors = filterForPythonFiles( - vscode.window.visibleTextEditors - ); - currentPanel.webview.postMessage({ - command: "visible-editors", - state: { activePythonEditors: initialPythonEditors }, - }); - return vscode.window.onDidChangeVisibleTextEditors( - (textEditors: vscode.TextEditor[]) => { - const activePythonEditors = filterForPythonFiles(textEditors); - currentPanel.webview.postMessage({ - command: "visible-editors", - state: { activePythonEditors }, - }); - }, - {}, - context.subscriptions - ); + const initialPythonEditors = filterForPythonFiles( + vscode.window.visibleTextEditors + ); + currentPanel.webview.postMessage({ + command: "visible-editors", + state: { activePythonEditors: initialPythonEditors }, + }); + return vscode.window.onDidChangeVisibleTextEditors( + (textEditors: vscode.TextEditor[]) => { + const activePythonEditors = filterForPythonFiles(textEditors); + currentPanel.webview.postMessage({ + command: "visible-editors", + state: { activePythonEditors }, + }); + }, + {}, + context.subscriptions + ); }; export const filterForPythonFiles = (textEditors: vscode.TextEditor[]) => { - return textEditors - .filter(editor => editor.document.languageId === GLOBAL_ENV_VARS.PYTHON) - .map(editor => editor.document.fileName); + return textEditors + .filter( + (editor) => editor.document.languageId === GLOBAL_ENV_VARS.PYTHON + ) + .map((editor) => editor.document.fileName); }; export const getActiveEditorFromPath = ( - filePath: string + filePath: string ): vscode.TextDocument => { - const activeEditor = vscode.window.visibleTextEditors.find( - (editor: vscode.TextEditor) => editor.document.fileName === filePath - ); - return activeEditor ? activeEditor.document : undefined; + const activeEditor = vscode.window.visibleTextEditors.find( + (editor: vscode.TextEditor) => editor.document.fileName === filePath + ); + return activeEditor ? activeEditor.document : undefined; }; export const getServerPortConfig = (): number => { - // tslint:disable: no-backbone-get-set-outside-model prefer-type-cast - if ( - vscode.workspace - .getConfiguration() - .has(SERVER_INFO.SERVER_PORT_CONFIGURATION) - ) { - return vscode.workspace - .getConfiguration() - .get(SERVER_INFO.SERVER_PORT_CONFIGURATION) as number; - } - return SERVER_INFO.DEFAULT_SERVER_PORT; + // tslint:disable: no-backbone-get-set-outside-model prefer-type-cast + if ( + vscode.workspace + .getConfiguration() + .has(SERVER_INFO.SERVER_PORT_CONFIGURATION) + ) { + return vscode.workspace + .getConfiguration() + .get(SERVER_INFO.SERVER_PORT_CONFIGURATION) as number; + } + return SERVER_INFO.DEFAULT_SERVER_PORT; }; export const checkConfig = (configName: string): boolean => { - return vscode.workspace.getConfiguration().get(configName) === true; + return vscode.workspace.getConfiguration().get(configName) === true; }; export const getConfig = (configName: string): string => { - return vscode.workspace.getConfiguration().get(configName); + return vscode.workspace.getConfiguration().get(configName); }; export const createEscapedPath = (...pieces: string[]) => { - const initialPath: string = path.join(...pieces); + const initialPath: string = path.join(...pieces); - // escape all special characters - // https://stackoverflow.com/questions/1779858/how-do-i-escape-a-string-for-a-shell-command-in-node - return `"` + initialPath.replace(/(["'$`\\])/g, "\\$1") + `"`; + // escape all special characters + // https://stackoverflow.com/questions/1779858/how-do-i-escape-a-string-for-a-shell-command-in-node + return `"` + initialPath.replace(/(["'$`\\])/g, "\\$1") + `"`; }; export const getTelemetryState = () => { - return vscode.workspace - .getConfiguration() - .get("telemetry.enableTelemetry", true); + return vscode.workspace + .getConfiguration() + .get("telemetry.enableTelemetry", true); }; diff --git a/Source/requirements.txt b/Source/requirements.txt index c13eef60b..3a5fdb5a2 100644 --- a/Source/requirements.txt +++ b/Source/requirements.txt @@ -9,4 +9,4 @@ adafruit-circuitpython-fancyled==1.3.3 Pillow==8.1.1 adafruit-circuitpython-bitmap_font==1.1.0 adafruit-circuitpython-display-shapes==1.2.0 -adafruit-circuitpython-neopixel==5.0.0 \ No newline at end of file +adafruit-circuitpython-neopixel==5.0.0 diff --git a/Source/serialMonitor.ts b/Source/serialMonitor.ts index f3685cd58..f5460862c 100644 --- a/Source/serialMonitor.ts +++ b/Source/serialMonitor.ts @@ -11,300 +11,288 @@ import { logToOutputChannel } from "./extension_utils/utils"; import { SerialPortControl } from "./serialPortControl"; export interface ISerialPortDetail { - path: string; - manufacturer: string; - vendorId: string; - productId: string; + path: string; + manufacturer: string; + vendorId: string; + productId: string; } export class SerialMonitor implements vscode.Disposable { - public static DEFAULT_BAUD_RATE: number = 115200; + public static DEFAULT_BAUD_RATE: number = 115200; - public static listBaudRates(): number[] { - return [ - 300, - 1200, - 2400, - 4800, - 9600, - 19200, - 38400, - 57600, - 74880, - 115200, - 230400, - 250000, - ]; - } + public static listBaudRates(): number[] { + return [ + 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 74880, 115200, + 230400, 250000, + ]; + } - public static getInstance(): SerialMonitor { - if (SerialMonitor._serialMonitor === null) { - SerialMonitor._serialMonitor = new SerialMonitor(); - } - return SerialMonitor._serialMonitor; - } + public static getInstance(): SerialMonitor { + if (SerialMonitor._serialMonitor === null) { + SerialMonitor._serialMonitor = new SerialMonitor(); + } + return SerialMonitor._serialMonitor; + } - private static _serialMonitor: SerialMonitor | null = null; + private static _serialMonitor: SerialMonitor | null = null; - private _currentPort!: string; - private _currentBaudRate!: number; - private _outputChannel!: vscode.OutputChannel; - private _serialPortControl: SerialPortControl | null = null; - private _baudRateStatusBar!: vscode.StatusBarItem; - private _openPortStatusBar!: vscode.StatusBarItem; - private _portsStatusBar!: vscode.StatusBarItem; + private _currentPort!: string; + private _currentBaudRate!: number; + private _outputChannel!: vscode.OutputChannel; + private _serialPortControl: SerialPortControl | null = null; + private _baudRateStatusBar!: vscode.StatusBarItem; + private _openPortStatusBar!: vscode.StatusBarItem; + private _portsStatusBar!: vscode.StatusBarItem; - private constructor() { - const deviceContext = DeviceContext.getInstance(); - deviceContext.onDidChange(() => { - if (deviceContext.port) { - if (!this.initialized) { - this.initialize(); - } - this.updatePortListStatus(null); - } - }); - } + private constructor() { + const deviceContext = DeviceContext.getInstance(); + deviceContext.onDidChange(() => { + if (deviceContext.port) { + if (!this.initialized) { + this.initialize(); + } + this.updatePortListStatus(null); + } + }); + } - public initialize() { - const defaultBaudRate: number = SerialMonitor.DEFAULT_BAUD_RATE; - this._outputChannel = vscode.window.createOutputChannel( - CONSTANTS.MISC.SERIAL_MONITOR_NAME - ); - this._currentBaudRate = defaultBaudRate; - this._portsStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.PORT - ); - this._portsStatusBar.command = - "deviceSimulatorExpress.common.selectSerialPort"; - this._portsStatusBar.tooltip = "Select Serial Port"; - this._portsStatusBar.show(); + public initialize() { + const defaultBaudRate: number = SerialMonitor.DEFAULT_BAUD_RATE; + this._outputChannel = vscode.window.createOutputChannel( + CONSTANTS.MISC.SERIAL_MONITOR_NAME + ); + this._currentBaudRate = defaultBaudRate; + this._portsStatusBar = vscode.window.createStatusBarItem( + vscode.StatusBarAlignment.Right, + STATUS_BAR_PRIORITY.PORT + ); + this._portsStatusBar.command = + "deviceSimulatorExpress.common.selectSerialPort"; + this._portsStatusBar.tooltip = "Select Serial Port"; + this._portsStatusBar.show(); - this._openPortStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.OPEN_PORT - ); - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.openSerialMonitor"; - this._openPortStatusBar.text = `$(plug)`; - this._openPortStatusBar.tooltip = "Open Serial Monitor"; - this._openPortStatusBar.show(); + this._openPortStatusBar = vscode.window.createStatusBarItem( + vscode.StatusBarAlignment.Right, + STATUS_BAR_PRIORITY.OPEN_PORT + ); + this._openPortStatusBar.command = + "deviceSimulatorExpress.common.openSerialMonitor"; + this._openPortStatusBar.text = `$(plug)`; + this._openPortStatusBar.tooltip = "Open Serial Monitor"; + this._openPortStatusBar.show(); - this._baudRateStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.BAUD_RATE - ); - this._baudRateStatusBar.command = - "deviceSimulatorExpress.common.changeBaudRate"; - this._baudRateStatusBar.tooltip = "Baud Rate"; - this._baudRateStatusBar.text = defaultBaudRate.toString(); - this.updatePortListStatus(null); - } + this._baudRateStatusBar = vscode.window.createStatusBarItem( + vscode.StatusBarAlignment.Right, + STATUS_BAR_PRIORITY.BAUD_RATE + ); + this._baudRateStatusBar.command = + "deviceSimulatorExpress.common.changeBaudRate"; + this._baudRateStatusBar.tooltip = "Baud Rate"; + this._baudRateStatusBar.text = defaultBaudRate.toString(); + this.updatePortListStatus(null); + } - public async selectSerialPort(vid: string | null, pid: string | null) { - const lists = await SerialPortControl.list(); - if (!lists.length) { - vscode.window.showInformationMessage( - "No serial message is available." - ); - return; - } + public async selectSerialPort(vid: string | null, pid: string | null) { + const lists = await SerialPortControl.list(); + if (!lists.length) { + vscode.window.showInformationMessage( + "No serial message is available." + ); + return; + } - if (vid && pid) { - const valueOfVid = parseInt(vid, 16); - const valueOfPid = parseInt(pid, 16); - const foundPort = lists.find(port => { - if (port.productId && port.vendorId) { - return ( - parseInt(port.productId, 16) === valueOfPid && - parseInt(port.vendorId, 16) === valueOfVid - ); - } - return false; - }); - if ( - foundPort && - !(this._serialPortControl && this._serialPortControl.isActive) - ) { - this.updatePortListStatus(foundPort.path); - } - } else { - const chosen = await vscode.window.showQuickPick( - lists - .map( - (port: ISerialPortDetail): vscode.QuickPickItem => { - return { - description: port.manufacturer, - label: port.path, - }; - } - ) - .sort((a, b): number => { - return a.label === b.label - ? 0 - : a.label > b.label - ? 1 - : -1; - }) as vscode.QuickPickItem[], - { placeHolder: CONSTANTS.MISC.SELECT_PORT_PLACEHOLDER } - ); + if (vid && pid) { + const valueOfVid = parseInt(vid, 16); + const valueOfPid = parseInt(pid, 16); + const foundPort = lists.find((port) => { + if (port.productId && port.vendorId) { + return ( + parseInt(port.productId, 16) === valueOfPid && + parseInt(port.vendorId, 16) === valueOfVid + ); + } + return false; + }); + if ( + foundPort && + !(this._serialPortControl && this._serialPortControl.isActive) + ) { + this.updatePortListStatus(foundPort.path); + } + } else { + const chosen = await vscode.window.showQuickPick( + lists + .map((port: ISerialPortDetail): vscode.QuickPickItem => { + return { + description: port.manufacturer, + label: port.path, + }; + }) + .sort((a, b): number => { + return a.label === b.label + ? 0 + : a.label > b.label + ? 1 + : -1; + }) as vscode.QuickPickItem[], + { placeHolder: CONSTANTS.MISC.SELECT_PORT_PLACEHOLDER } + ); - if (chosen && chosen.label) { - this.updatePortListStatus(chosen.label); - } - } - } + if (chosen && chosen.label) { + this.updatePortListStatus(chosen.label); + } + } + } - public async openSerialMonitor() { - if (!this._currentPort) { - const ans = await vscode.window.showInformationMessage( - CONSTANTS.WARNING.NO_SERIAL_PORT_SELECTED, - DialogResponses.SELECT, - DialogResponses.CANCEL - ); - if (ans === DialogResponses.SELECT) { - await this.selectSerialPort(null, null); - } - if (!this._currentPort) { - return; - } - } + public async openSerialMonitor() { + if (!this._currentPort) { + const ans = await vscode.window.showInformationMessage( + CONSTANTS.WARNING.NO_SERIAL_PORT_SELECTED, + DialogResponses.SELECT, + DialogResponses.CANCEL + ); + if (ans === DialogResponses.SELECT) { + await this.selectSerialPort(null, null); + } + if (!this._currentPort) { + return; + } + } - if (this._serialPortControl) { - if (this._currentPort !== this._serialPortControl.currentPort) { - await this._serialPortControl.changePort(this._currentPort); - } else if (this._serialPortControl.isActive) { - vscode.window.showWarningMessage( - `Serial Monitor is already opened for ${this._currentPort}` - ); - return; - } - } else { - this._serialPortControl = new SerialPortControl( - this._currentPort, - this._currentBaudRate, - this._outputChannel - ); - } + if (this._serialPortControl) { + if (this._currentPort !== this._serialPortControl.currentPort) { + await this._serialPortControl.changePort(this._currentPort); + } else if (this._serialPortControl.isActive) { + vscode.window.showWarningMessage( + `Serial Monitor is already opened for ${this._currentPort}` + ); + return; + } + } else { + this._serialPortControl = new SerialPortControl( + this._currentPort, + this._currentBaudRate, + this._outputChannel + ); + } - if (!this._serialPortControl.currentPort) { - console.error( - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT(this._currentPort) - ); - return; - } + if (!this._serialPortControl.currentPort) { + console.error( + CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT(this._currentPort) + ); + return; + } - try { - await this._serialPortControl.open(); - this.updatePortStatus(true); - } catch (error) { - logToOutputChannel( - outChannel, - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT_DUE_TO( - this._currentPort, - error - ), - true - ); - } - } + try { + await this._serialPortControl.open(); + this.updatePortStatus(true); + } catch (error) { + logToOutputChannel( + outChannel, + CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT_DUE_TO( + this._currentPort, + error + ), + true + ); + } + } - public get initialized(): boolean { - return !!this._outputChannel; - } + public get initialized(): boolean { + return !!this._outputChannel; + } - public dispose() { - if (this._serialPortControl && this._serialPortControl.isActive) { - return this._serialPortControl.stop(); - } - } + public dispose() { + if (this._serialPortControl && this._serialPortControl.isActive) { + return this._serialPortControl.stop(); + } + } - public async changeBaudRate() { - const baudRates = SerialMonitor.listBaudRates(); - const chosen = await vscode.window.showQuickPick( - baudRates.map(baudRate => baudRate.toString()) - ); + public async changeBaudRate() { + const baudRates = SerialMonitor.listBaudRates(); + const chosen = await vscode.window.showQuickPick( + baudRates.map((baudRate) => baudRate.toString()) + ); - if (!chosen) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.NO_RATE_SELECTED, - true - ); - return; - } + if (!chosen) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.NO_RATE_SELECTED, + true + ); + return; + } - if (!parseInt(chosen, 10)) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.INVALID_BAUD_RATE, - true - ); - return; - } + if (!parseInt(chosen, 10)) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.INVALID_BAUD_RATE, + true + ); + return; + } - if (!this._serialPortControl) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.SERIAL_MONITOR_NOT_STARTED, - true - ); - return; - } + if (!this._serialPortControl) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.SERIAL_MONITOR_NOT_STARTED, + true + ); + return; + } - const selectedRate: number = parseInt(chosen, 10); - await this._serialPortControl.changeBaudRate(selectedRate); - this._currentBaudRate = selectedRate; - this._baudRateStatusBar.text = chosen; - } + const selectedRate: number = parseInt(chosen, 10); + await this._serialPortControl.changeBaudRate(selectedRate); + this._currentBaudRate = selectedRate; + this._baudRateStatusBar.text = chosen; + } - public async closeSerialMonitor(port: string, showWarning: boolean = true) { - if (this._serialPortControl) { - if (port && port !== this._serialPortControl.currentPort) { - // Port is not opened - return false; - } - const result = await this._serialPortControl.stop(); - this.updatePortStatus(false); - return result; - } else if (!port && showWarning) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.SERIAL_PORT_NOT_STARTED, - true - ); - return false; - } - } + public async closeSerialMonitor(port: string, showWarning: boolean = true) { + if (this._serialPortControl) { + if (port && port !== this._serialPortControl.currentPort) { + // Port is not opened + return false; + } + const result = await this._serialPortControl.stop(); + this.updatePortStatus(false); + return result; + } else if (!port && showWarning) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.SERIAL_PORT_NOT_STARTED, + true + ); + return false; + } + } - private updatePortStatus(isOpened: boolean) { - if (isOpened) { - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.closeSerialMonitor"; - this._openPortStatusBar.text = `$(x)`; - this._openPortStatusBar.tooltip = "Close Serial Monitor"; - this._baudRateStatusBar.show(); - } else { - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.openSerialMonitor"; - this._openPortStatusBar.text = `$(plug)`; - this._openPortStatusBar.tooltip = "Open Serial Monitor"; - this._baudRateStatusBar.hide(); - } - } + private updatePortStatus(isOpened: boolean) { + if (isOpened) { + this._openPortStatusBar.command = + "deviceSimulatorExpress.common.closeSerialMonitor"; + this._openPortStatusBar.text = `$(x)`; + this._openPortStatusBar.tooltip = "Close Serial Monitor"; + this._baudRateStatusBar.show(); + } else { + this._openPortStatusBar.command = + "deviceSimulatorExpress.common.openSerialMonitor"; + this._openPortStatusBar.text = `$(plug)`; + this._openPortStatusBar.tooltip = "Open Serial Monitor"; + this._baudRateStatusBar.hide(); + } + } - private updatePortListStatus(port: string | null) { - const deviceContext = DeviceContext.getInstance(); - if (port) { - deviceContext.port = port; - } - this._currentPort = deviceContext.port; + private updatePortListStatus(port: string | null) { + const deviceContext = DeviceContext.getInstance(); + if (port) { + deviceContext.port = port; + } + this._currentPort = deviceContext.port; - if (deviceContext.port) { - this._portsStatusBar.text = deviceContext.port; - } else { - this._portsStatusBar.text = ""; + } + } } diff --git a/Source/serialPortControl.ts b/Source/serialPortControl.ts index 64d8d010a..0abcfa03e 100644 --- a/Source/serialPortControl.ts +++ b/Source/serialPortControl.ts @@ -9,188 +9,188 @@ import { CONSTANTS } from "./constants"; import { logToOutputChannel } from "./extension_utils/utils"; interface ISerialPortDetail { - path: string; - manufacturer: string; - vendorId: string; - productId: string; + path: string; + manufacturer: string; + vendorId: string; + productId: string; } export class SerialPortControl { - public static get serialport(): any { - if (!SerialPortControl._serialport) { - SerialPortControl._serialport = require("usb-native").SerialPort; - } - return SerialPortControl._serialport; - } - - public static list(): Promise { - return new Promise((resolve, reject) => { - SerialPortControl.serialport.list().then( - ports => resolve(ports), - err => reject(err) - ); - }); - } - - private static _serialport: any; - - private _currentPort: string; - private _currentBaudRate: number; - private _currentSerialPort: any; - - public constructor( - port: string, - baudRate: number, - private _outputChannel: OutputChannel - ) { - this._currentPort = port; - this._currentBaudRate = baudRate; - } - - public get isActive(): boolean { - return this._currentSerialPort && this._currentSerialPort.isOpen; - } - - public get currentPort(): string { - return this._currentPort; - } - - public open(): Promise { - logToOutputChannel( - this._outputChannel, - CONSTANTS.INFO.OPENING_SERIAL_PORT(this._currentPort) - ); - return new Promise((resolve, reject) => { - if (this._currentSerialPort && this._currentSerialPort.isOpen) { - this._currentSerialPort.close((err: any) => { - if (err) { - return reject(err); - } - this._currentSerialPort = null; - return this.open().then( - () => { - resolve(); - }, - error => { - reject(error); - } - ); - }); - } else { - this._currentSerialPort = new SerialPortControl.serialport( - this._currentPort, - { baudRate: this._currentBaudRate } - ); - this._outputChannel.show(); - this._currentSerialPort.on("open", () => { - this._currentSerialPort.write( - CONSTANTS.MISC.SERIAL_MONITOR_TEST_IF_OPEN + os.EOL, - (err: any) => { - if ( - err && - !( - err.message.indexOf( - CONSTANTS.ERROR.COMPORT_UNKNOWN_ERROR - ) >= 0 - ) - ) { - logToOutputChannel( - this._outputChannel, - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT( - this._currentPort - ) - ); - logToOutputChannel( - this._outputChannel, - CONSTANTS.ERROR.RECONNECT_DEVICE - ); - reject(err); - } else { - logToOutputChannel( - this._outputChannel, - CONSTANTS.INFO.OPENED_SERIAL_PORT( - this._currentPort - ) - ); - resolve(); - } - } - ); - }); - } - - this._currentSerialPort.on("data", (event: any) => { - logToOutputChannel(this._outputChannel, event.toString()); - }); - - this._currentSerialPort.on("error", (error: any) => { - logToOutputChannel(this._outputChannel, error.toString()); - }); - }); - } - - public changePort(newPort: string): Promise { - return new Promise((resolve, reject) => { - if (newPort === this._currentPort) { - resolve(); - return; - } - this._currentPort = newPort; - if (!this._currentSerialPort || !this.isActive) { - resolve(); - return; - } - this._currentSerialPort.close((error: any) => { - if (error) { - reject(error); - } else { - this._currentSerialPort = null; - resolve(); - } - }); - }); - } - - public stop(): Promise { - return new Promise((resolve, reject) => { - if (!this._currentSerialPort || !this.isActive) { - resolve(false); - return; - } - this._currentSerialPort.close((error: any) => { - if (this._outputChannel) { - logToOutputChannel( - this._outputChannel, - CONSTANTS.INFO.CLOSED_SERIAL_PORT(this._currentPort) - ); - } - this._currentSerialPort = null; - if (error) { - reject(error); - } else { - resolve(true); - } - }); - }); - } - - public changeBaudRate(newBaudRate: number): Promise { - return new Promise((resolve, reject) => { - this._currentBaudRate = newBaudRate; - if (!this._currentSerialPort || !this.isActive) { - resolve(); - return; - } - this._currentSerialPort.update( - { baudRate: this._currentBaudRate }, - (error: any) => { - if (error) { - reject(error); - } else { - resolve(); - } - } - ); - }); - } + public static get serialport(): any { + if (!SerialPortControl._serialport) { + SerialPortControl._serialport = require("usb-native").SerialPort; + } + return SerialPortControl._serialport; + } + + public static list(): Promise { + return new Promise((resolve, reject) => { + SerialPortControl.serialport.list().then( + (ports) => resolve(ports), + (err) => reject(err) + ); + }); + } + + private static _serialport: any; + + private _currentPort: string; + private _currentBaudRate: number; + private _currentSerialPort: any; + + public constructor( + port: string, + baudRate: number, + private _outputChannel: OutputChannel + ) { + this._currentPort = port; + this._currentBaudRate = baudRate; + } + + public get isActive(): boolean { + return this._currentSerialPort && this._currentSerialPort.isOpen; + } + + public get currentPort(): string { + return this._currentPort; + } + + public open(): Promise { + logToOutputChannel( + this._outputChannel, + CONSTANTS.INFO.OPENING_SERIAL_PORT(this._currentPort) + ); + return new Promise((resolve, reject) => { + if (this._currentSerialPort && this._currentSerialPort.isOpen) { + this._currentSerialPort.close((err: any) => { + if (err) { + return reject(err); + } + this._currentSerialPort = null; + return this.open().then( + () => { + resolve(); + }, + (error) => { + reject(error); + } + ); + }); + } else { + this._currentSerialPort = new SerialPortControl.serialport( + this._currentPort, + { baudRate: this._currentBaudRate } + ); + this._outputChannel.show(); + this._currentSerialPort.on("open", () => { + this._currentSerialPort.write( + CONSTANTS.MISC.SERIAL_MONITOR_TEST_IF_OPEN + os.EOL, + (err: any) => { + if ( + err && + !( + err.message.indexOf( + CONSTANTS.ERROR.COMPORT_UNKNOWN_ERROR + ) >= 0 + ) + ) { + logToOutputChannel( + this._outputChannel, + CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT( + this._currentPort + ) + ); + logToOutputChannel( + this._outputChannel, + CONSTANTS.ERROR.RECONNECT_DEVICE + ); + reject(err); + } else { + logToOutputChannel( + this._outputChannel, + CONSTANTS.INFO.OPENED_SERIAL_PORT( + this._currentPort + ) + ); + resolve(); + } + } + ); + }); + } + + this._currentSerialPort.on("data", (event: any) => { + logToOutputChannel(this._outputChannel, event.toString()); + }); + + this._currentSerialPort.on("error", (error: any) => { + logToOutputChannel(this._outputChannel, error.toString()); + }); + }); + } + + public changePort(newPort: string): Promise { + return new Promise((resolve, reject) => { + if (newPort === this._currentPort) { + resolve(); + return; + } + this._currentPort = newPort; + if (!this._currentSerialPort || !this.isActive) { + resolve(); + return; + } + this._currentSerialPort.close((error: any) => { + if (error) { + reject(error); + } else { + this._currentSerialPort = null; + resolve(); + } + }); + }); + } + + public stop(): Promise { + return new Promise((resolve, reject) => { + if (!this._currentSerialPort || !this.isActive) { + resolve(false); + return; + } + this._currentSerialPort.close((error: any) => { + if (this._outputChannel) { + logToOutputChannel( + this._outputChannel, + CONSTANTS.INFO.CLOSED_SERIAL_PORT(this._currentPort) + ); + } + this._currentSerialPort = null; + if (error) { + reject(error); + } else { + resolve(true); + } + }); + }); + } + + public changeBaudRate(newBaudRate: number): Promise { + return new Promise((resolve, reject) => { + this._currentBaudRate = newBaudRate; + if (!this._currentSerialPort || !this.isActive) { + resolve(); + return; + } + this._currentSerialPort.update( + { baudRate: this._currentBaudRate }, + (error: any) => { + if (error) { + reject(error); + } else { + resolve(); + } + } + ); + }); + } } diff --git a/Source/service/PopupService.ts b/Source/service/PopupService.ts index d5aadbff4..84d312467 100644 --- a/Source/service/PopupService.ts +++ b/Source/service/PopupService.ts @@ -3,14 +3,14 @@ import * as vscode from "vscode"; import { LATEST_RELEASE_NOTE } from "../latest_release_note"; export class PopupService { - public static openReleaseNote() { - const panel = vscode.window.createWebviewPanel( - "releaseNote", - "Release Note", - vscode.ViewColumn.One, - {} - ); + public static openReleaseNote() { + const panel = vscode.window.createWebviewPanel( + "releaseNote", + "Release Note", + vscode.ViewColumn.One, + {} + ); - panel.webview.html = LATEST_RELEASE_NOTE; - } + panel.webview.html = LATEST_RELEASE_NOTE; + } } diff --git a/Source/service/debuggerCommunicationService.ts b/Source/service/debuggerCommunicationService.ts index b37b1c2ed..1e47024f1 100644 --- a/Source/service/debuggerCommunicationService.ts +++ b/Source/service/debuggerCommunicationService.ts @@ -1,27 +1,27 @@ import { DebuggerCommunicationServer } from "../debuggerCommunicationServer"; export class DebuggerCommunicationService { - private currentDebuggerServer?: DebuggerCommunicationServer; - private previousDebuggerServerToDisconnect?: DebuggerCommunicationServer; + private currentDebuggerServer?: DebuggerCommunicationServer; + private previousDebuggerServerToDisconnect?: DebuggerCommunicationServer; - public setCurrentDebuggerServer(debugServer: DebuggerCommunicationServer) { - this.currentDebuggerServer = debugServer; - } - // Used for restart and stop event - public resetCurrentDebuggerServer() { - if (this.currentDebuggerServer) { - this.currentDebuggerServer.closeConnection(); - } - this.previousDebuggerServerToDisconnect = this.currentDebuggerServer; - this.currentDebuggerServer = undefined; - } - public getCurrentDebuggerServer() { - return this.currentDebuggerServer; - } - // Only used for stop event - public handleStopEvent() { - if (this.previousDebuggerServerToDisconnect) { - this.previousDebuggerServerToDisconnect.disconnectFromPort(); - } - } + public setCurrentDebuggerServer(debugServer: DebuggerCommunicationServer) { + this.currentDebuggerServer = debugServer; + } + // Used for restart and stop event + public resetCurrentDebuggerServer() { + if (this.currentDebuggerServer) { + this.currentDebuggerServer.closeConnection(); + } + this.previousDebuggerServerToDisconnect = this.currentDebuggerServer; + this.currentDebuggerServer = undefined; + } + public getCurrentDebuggerServer() { + return this.currentDebuggerServer; + } + // Only used for stop event + public handleStopEvent() { + if (this.previousDebuggerServerToDisconnect) { + this.previousDebuggerServerToDisconnect.disconnectFromPort(); + } + } } diff --git a/Source/service/deviceSelectionService.ts b/Source/service/deviceSelectionService.ts index 39a8b5988..15f8bc2f2 100644 --- a/Source/service/deviceSelectionService.ts +++ b/Source/service/deviceSelectionService.ts @@ -1,12 +1,12 @@ import { DEFAULT_DEVICE } from "../constants"; export class DeviceSelectionService { - private currentActiveDevice: string = DEFAULT_DEVICE; + private currentActiveDevice: string = DEFAULT_DEVICE; - public getCurrentActiveDevice(): string { - return this.currentActiveDevice; - } - public setCurrentActiveDevice(newActiveDevice: string) { - this.currentActiveDevice = newActiveDevice; - } + public getCurrentActiveDevice(): string { + return this.currentActiveDevice; + } + public setCurrentActiveDevice(newActiveDevice: string) { + this.currentActiveDevice = newActiveDevice; + } } diff --git a/Source/service/fileSelectionService.ts b/Source/service/fileSelectionService.ts index d5b0eea11..5ee5e8ef9 100644 --- a/Source/service/fileSelectionService.ts +++ b/Source/service/fileSelectionService.ts @@ -5,91 +5,91 @@ import { DeviceSelectionService } from "./deviceSelectionService"; import { MessagingService } from "./messagingService"; export class FileSelectionService { - private currentFileAbsPath: string = ""; - private currentTextDocument: vscode.TextDocument; - private messagingService: MessagingService; + private currentFileAbsPath: string = ""; + private currentTextDocument: vscode.TextDocument; + private messagingService: MessagingService; - constructor(messagingService: MessagingService) { - this.messagingService = messagingService; - } + constructor(messagingService: MessagingService) { + this.messagingService = messagingService; + } - public getCurrentFileAbsPath() { - return this.currentFileAbsPath; - } - public getCurrentTextDocument() { - return this.currentTextDocument; - } - public updateCurrentFileFromTextFile = async ( - activeTextDocument: vscode.TextDocument | undefined - ) => { - if (activeTextDocument) { - await this.updateCurrentFileFromEditor({ - document: activeTextDocument, - } as vscode.TextEditor); - } else { - return; - } - }; - public updateCurrentFileFromEditor = async ( - activeTextDocument: vscode.TextEditor | undefined - ) => { - if ( - activeTextDocument && - activeTextDocument.document && - activeTextDocument.document.languageId === "python" - ) { - this.setPathAndSendMessage(activeTextDocument.document.fileName); - this.currentTextDocument = activeTextDocument.document; - } else if (this.currentFileAbsPath === "") { - this.setPathAndSendMessage(this.getActivePythonFile() || ""); - } - if ( - this.currentTextDocument && - this.getActiveEditorFromPath(this.currentTextDocument.fileName) === - undefined - ) { - await vscode.window.showTextDocument( - this.currentTextDocument, - vscode.ViewColumn.One - ); - } - }; - public findCurrentTextDocument() { - if (this.currentFileAbsPath) { - const foundDocument = this.getActiveEditorFromPath( - this.currentFileAbsPath - ); - if (foundDocument !== undefined) { - this.currentTextDocument = foundDocument; - } - } - } + public getCurrentFileAbsPath() { + return this.currentFileAbsPath; + } + public getCurrentTextDocument() { + return this.currentTextDocument; + } + public updateCurrentFileFromTextFile = async ( + activeTextDocument: vscode.TextDocument | undefined + ) => { + if (activeTextDocument) { + await this.updateCurrentFileFromEditor({ + document: activeTextDocument, + } as vscode.TextEditor); + } else { + return; + } + }; + public updateCurrentFileFromEditor = async ( + activeTextDocument: vscode.TextEditor | undefined + ) => { + if ( + activeTextDocument && + activeTextDocument.document && + activeTextDocument.document.languageId === "python" + ) { + this.setPathAndSendMessage(activeTextDocument.document.fileName); + this.currentTextDocument = activeTextDocument.document; + } else if (this.currentFileAbsPath === "") { + this.setPathAndSendMessage(this.getActivePythonFile() || ""); + } + if ( + this.currentTextDocument && + this.getActiveEditorFromPath(this.currentTextDocument.fileName) === + undefined + ) { + await vscode.window.showTextDocument( + this.currentTextDocument, + vscode.ViewColumn.One + ); + } + }; + public findCurrentTextDocument() { + if (this.currentFileAbsPath) { + const foundDocument = this.getActiveEditorFromPath( + this.currentFileAbsPath + ); + if (foundDocument !== undefined) { + this.currentTextDocument = foundDocument; + } + } + } - public setPathAndSendMessage = (newFilePath: string) => { - this.currentFileAbsPath = newFilePath; - this.messagingService.sendMessageToWebview( - VSCODE_MESSAGES_TO_WEBVIEW.CURRENT_FILE, - { - running_file: newFilePath, - } - ); - }; - private getActiveEditorFromPath = ( - filePath: string - ): vscode.TextDocument => { - const activeEditor = vscode.window.visibleTextEditors.find( - (editor: vscode.TextEditor) => editor.document.fileName === filePath - ); - return activeEditor ? activeEditor.document : undefined; - }; - private getActivePythonFile = () => { - const editors: vscode.TextEditor[] = vscode.window.visibleTextEditors; - const activeEditor = editors.find( - editor => editor.document.languageId === LANGUAGE_VARS.PYTHON.ID - ); - if (activeEditor) { - this.currentTextDocument = activeEditor.document; - } - return activeEditor ? activeEditor.document.fileName : ""; - }; + public setPathAndSendMessage = (newFilePath: string) => { + this.currentFileAbsPath = newFilePath; + this.messagingService.sendMessageToWebview( + VSCODE_MESSAGES_TO_WEBVIEW.CURRENT_FILE, + { + running_file: newFilePath, + } + ); + }; + private getActiveEditorFromPath = ( + filePath: string + ): vscode.TextDocument => { + const activeEditor = vscode.window.visibleTextEditors.find( + (editor: vscode.TextEditor) => editor.document.fileName === filePath + ); + return activeEditor ? activeEditor.document : undefined; + }; + private getActivePythonFile = () => { + const editors: vscode.TextEditor[] = vscode.window.visibleTextEditors; + const activeEditor = editors.find( + (editor) => editor.document.languageId === LANGUAGE_VARS.PYTHON.ID + ); + if (activeEditor) { + this.currentTextDocument = activeEditor.document; + } + return activeEditor ? activeEditor.document.fileName : ""; + }; } diff --git a/Source/service/messagingService.ts b/Source/service/messagingService.ts index c702ee268..a10caf3e8 100644 --- a/Source/service/messagingService.ts +++ b/Source/service/messagingService.ts @@ -4,34 +4,35 @@ import * as fs from "fs"; import { VSCODE_MESSAGES_TO_WEBVIEW } from "../view/constants"; import { DeviceSelectionService } from "./deviceSelectionService"; export class MessagingService { - private currentWebviewTarget: Webview | undefined; - private deviceSelectionService: DeviceSelectionService; + private currentWebviewTarget: Webview | undefined; + private deviceSelectionService: DeviceSelectionService; - constructor(deviceSelectionService: DeviceSelectionService) { - this.deviceSelectionService = deviceSelectionService; - } - public setWebview(webview: Webview) { - this.currentWebviewTarget = webview; - } + constructor(deviceSelectionService: DeviceSelectionService) { + this.deviceSelectionService = deviceSelectionService; + } + public setWebview(webview: Webview) { + this.currentWebviewTarget = webview; + } - // Send a message to webview if it exists - public sendMessageToWebview(command: string, stateToSend: Object) { - if (this.currentWebviewTarget) { - this.currentWebviewTarget.postMessage({ - command, - active_device: this.deviceSelectionService.getCurrentActiveDevice(), - state: { ...stateToSend }, - }); - } - } - public sendStartMessage() { - this.currentWebviewTarget.postMessage({ - command: VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE, - }); - } - public sendPauseMessage() { - this.currentWebviewTarget.postMessage({ - command: VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE, - }); - } + // Send a message to webview if it exists + public sendMessageToWebview(command: string, stateToSend: Object) { + if (this.currentWebviewTarget) { + this.currentWebviewTarget.postMessage({ + command, + active_device: + this.deviceSelectionService.getCurrentActiveDevice(), + state: { ...stateToSend }, + }); + } + } + public sendStartMessage() { + this.currentWebviewTarget.postMessage({ + command: VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE, + }); + } + public sendPauseMessage() { + this.currentWebviewTarget.postMessage({ + command: VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE, + }); + } } diff --git a/Source/service/setupService.ts b/Source/service/setupService.ts index f5c80e037..2b0a26760 100644 --- a/Source/service/setupService.ts +++ b/Source/service/setupService.ts @@ -3,574 +3,576 @@ import * as os from "os"; import * as path from "path"; import * as vscode from "vscode"; import { - CONFIG, - CONSTANTS, - DialogResponses, - GLOBAL_ENV_VARS, - HELPER_FILES, - TelemetryEventName, - VERSIONS, + CONFIG, + CONSTANTS, + DialogResponses, + GLOBAL_ENV_VARS, + HELPER_FILES, + TelemetryEventName, + VERSIONS, } from "../constants"; import { - checkConfig, - createEscapedPath, - exec, - getConfig, - getPathToScript, - showPrivacyModal, + checkConfig, + createEscapedPath, + exec, + getConfig, + getPathToScript, + showPrivacyModal, } from "../extension_utils/utils"; import TelemetryAI from "../telemetry/telemetryAI"; export class SetupService { - private telemetryAI: TelemetryAI; - - constructor(telemetryAI: TelemetryAI) { - this.telemetryAI = telemetryAI; - } - - public setupEnv = async ( - context: vscode.ExtensionContext, - needsResponse: boolean = false - ) => { - const originalPythonExecutablePath = await this.getCurrentPythonExecutablePath(); - if (originalPythonExecutablePath === "") { - return; - } - let pythonExecutablePath = originalPythonExecutablePath; - const pythonExecutableName: string = - os.platform() === "win32" - ? HELPER_FILES.PYTHON_EXE - : HELPER_FILES.PYTHON; - - if ( - !(await this.areDependenciesInstalled( - context, - pythonExecutablePath - )) - ) { - // environment needs to install dependencies - if (!(await this.checkIfVenv(context, pythonExecutablePath))) { - const pythonExecutablePathVenv = await this.getPythonVenv( - context, - pythonExecutableName - ); - if (await this.hasVenv(context)) { - // venv in extention exists with wrong dependencies - - if ( - !(await this.areDependenciesInstalled( - context, - pythonExecutablePathVenv - )) - ) { - pythonExecutablePath = await this.installDependenciesWrapper( - context, - pythonExecutablePathVenv, - pythonExecutablePath - ); - } else { - pythonExecutablePath = pythonExecutablePathVenv; - } - } else { - pythonExecutablePath = await this.promptInstallVenv( - context, - originalPythonExecutablePath, - pythonExecutableName - ); - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INSTALL_VENV - ); - } - - if (pythonExecutablePath === pythonExecutablePathVenv) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.UPDATED_TO_EXTENSION_VENV - ); - vscode.workspace - .getConfiguration() - .update(CONFIG.PYTHON_PATH, pythonExecutablePath); - } - } else { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_HAS_VENV - ); - } - if (pythonExecutablePath === originalPythonExecutablePath) { - // going with original interpreter, either because - // already in venv or error in creating custom venv - if (checkConfig(CONFIG.SHOW_DEPENDENCY_INSTALL)) { - await vscode.window - .showInformationMessage( - CONSTANTS.INFO.INSTALL_PYTHON_DEPS, - DialogResponses.INSTALL_NOW, - DialogResponses.DONT_INSTALL - ) - .then( - async ( - installChoice: vscode.MessageItem | undefined - ) => { - if ( - installChoice === - DialogResponses.INSTALL_NOW - ) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL - ); - await this.installDependenciesWrapper( - context, - pythonExecutablePath - ); - } else { - await vscode.window - .showInformationMessage( - CONSTANTS.INFO.ARE_YOU_SURE, - DialogResponses.INSTALL_NOW, - DialogResponses.DONT_INSTALL - ) - .then( - async ( - installChoice2: - | vscode.MessageItem - | undefined - ) => { - if ( - installChoice2 === - DialogResponses.INSTALL_NOW - ) { - await this.installDependenciesWrapper( - context, - pythonExecutablePath - ); - } else { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_NO_DEPS_INSTALLED - ); - } - } - ); - } - } - ); - } - } - } else if (needsResponse) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.ALREADY_SUCCESSFUL_INSTALL - ); - } - - return pythonExecutablePath; - }; - - public getCurrentPythonExecutablePath = async ( - isTryingPython3: boolean = false - ) => { - let originalPythonExecutablePath = ""; - const systemPythonVar = isTryingPython3 - ? GLOBAL_ENV_VARS.PYTHON3 - : GLOBAL_ENV_VARS.PYTHON; - // try to get name from interpreter - try { - originalPythonExecutablePath = getConfig(CONFIG.PYTHON_PATH); - } catch (err) { - originalPythonExecutablePath = systemPythonVar; - } - - if ( - originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON3 || - originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON || - originalPythonExecutablePath === "" - ) { - // catching any instance where the python path needs to be resolved - // from an system variable - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_AUTO_RESOLVE_PYTHON_PATH - ); - try { - const { stdout } = await this.executePythonCommand( - systemPythonVar, - `-c "import sys; print(sys.executable)"` - ); - originalPythonExecutablePath = stdout.trim(); - } catch (err) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_NO_PYTHON_PATH - ); - if (isTryingPython3) { - // if trying python3 failed, that means that BOTH - // python and python3 failed as system variables - // so that means that there is no python - vscode.window - .showErrorMessage( - CONSTANTS.ERROR.NO_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.INSTALL_PYTHON) { - const okAction = () => { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON - ); - open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON - ); - } - }); - // no python installed, cannot get path - return ""; - } else { - // "python" didn't resolve to anything, trying "python3" - return this.getCurrentPythonExecutablePath(true); - } - } - if ( - !(await this.validatePythonVersion( - originalPythonExecutablePath - )) - ) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_VER - ); - if (isTryingPython3) { - // if we're trying python3, it means we already tried python and it - // all doesn't seem to work, but it got this far, so it means that - // their system python3 version is still not above 3.7, but they - // don't have a path selected. - vscode.window - .showInformationMessage( - CONSTANTS.ERROR.INVALID_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON - ) - .then( - (installChoice: vscode.MessageItem | undefined) => { - if ( - installChoice === - DialogResponses.INSTALL_PYTHON - ) { - const okAction = () => { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON - ); - open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO - .THIRD_PARTY_WEBSITE_PYTHON - ); - } - } - ); - return ""; - } else { - // otherwise, we ran the "python" system variable - // and we can try python3 - return this.getCurrentPythonExecutablePath(true); - } - } - } else { - // should only be applicable if the user defined their own path - - // fix path to be absolute - if (!path.isAbsolute(originalPythonExecutablePath)) { - originalPythonExecutablePath = path.join( - vscode.workspace.rootPath, - originalPythonExecutablePath - ); - } - - if (!fs.existsSync(originalPythonExecutablePath)) { - await vscode.window.showErrorMessage( - CONSTANTS.ERROR.BAD_PYTHON_PATH - ); - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_INTERPRETER_PATH - ); - return ""; - } - - if ( - !(await this.validatePythonVersion( - originalPythonExecutablePath - )) - ) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_VER - ); - vscode.window - .showInformationMessage( - CONSTANTS.ERROR.INVALID_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON - ) - .then((installChoice: vscode.MessageItem | undefined) => { - if (installChoice === DialogResponses.INSTALL_PYTHON) { - const okAction = () => { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON - ); - open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON - ); - } - }); - return ""; - } - } - - return originalPythonExecutablePath; - }; - - public isPipInstalled = async (pythonExecutablePath: string) => { - try { - await this.executePythonCommand(pythonExecutablePath, " -m pip"); - return true; - } catch (err) { - vscode.window - .showErrorMessage( - `We found that you may not have Pip installed on your interpreter at ${pythonExecutablePath}, please install it and try again.`, - DialogResponses.INSTALL_PIP - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.INSTALL_PIP) { - const okAction = () => { - open(CONSTANTS.LINKS.DOWNLOAD_PIP); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PIP - ); - } - }); - return false; - } - }; - - public checkIfVenv = async ( - context: vscode.ExtensionContext, - pythonExecutablePath: string - ) => { - const venvCheckerPath: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.CHECK_IF_VENV_PY - ); - const { stdout } = await this.executePythonCommand( - pythonExecutablePath, - `"${venvCheckerPath}"` - ); - return stdout.trim() === "1"; - }; - - public executePythonCommand = async ( - pythonExecutablePath: string, - command: string - ) => { - return exec(`${createEscapedPath(pythonExecutablePath)} ${command}`); - }; - - public validatePythonVersion = async (pythonExecutablePath: string) => { - const { stdout } = await this.executePythonCommand( - pythonExecutablePath, - "--version" - ); - if (stdout < VERSIONS.MIN_PY_VERSION) { - return false; - } else { - return true; - } - }; - - public hasVenv = async (context: vscode.ExtensionContext) => { - const pathToEnv: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR - ); - - return fs.existsSync(pathToEnv); - }; - - public promptInstallVenv = ( - context: vscode.ExtensionContext, - pythonExecutable: string, - pythonExecutableName: string - ) => { - return vscode.window - .showInformationMessage( - CONSTANTS.INFO.INSTALL_PYTHON_VENV, - DialogResponses.YES, - DialogResponses.NO - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.YES) { - return this.installPythonVenv( - context, - pythonExecutable, - pythonExecutableName - ); - } else { - // return pythonExecutable, notifying the caller - // that the user was unwilling to create venv - // and by default, this will trigger the extension to - // try using pythonExecutable - return pythonExecutable; - } - }); - }; - - public getPythonVenv = async ( - context: vscode.ExtensionContext, - pythonExecutableName: string - ) => { - const subFolder = os.platform() === "win32" ? "Scripts" : "bin"; - - return getPathToScript( - context, - path.join(CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR, subFolder), - pythonExecutableName - ); - }; - - public installPythonVenv = async ( - context: vscode.ExtensionContext, - pythonExecutable: string, - pythonExecutableName: string - ) => { - const pathToEnv: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR - ); - - vscode.window.showInformationMessage( - CONSTANTS.INFO.INSTALLING_PYTHON_VENV - ); - - const pythonPath: string = await this.getPythonVenv( - context, - pythonExecutableName - ); - - try { - // make venv - // run command to download dependencies to out/python_libs - await this.executePythonCommand( - pythonExecutable, - `-m venv "${pathToEnv}"` - ); - } catch (err) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_VENV_CREATION_ERR - ); - vscode.window - .showErrorMessage( - `Virtual environment for download could not be completed. Using original interpreter at: ${pythonExecutable}. If you're on Linux, try running "sudo apt-get install python3-venv".`, - DialogResponses.READ_INSTALL_MD - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.READ_INSTALL_MD) { - open(CONSTANTS.LINKS.INSTALL); - } - }); - - console.error(err); - - return pythonExecutable; - } - - return this.installDependenciesWrapper( - context, - pythonPath, - pythonExecutable - ); - }; - - public areDependenciesInstalled = async ( - context: vscode.ExtensionContext, - pythonPath: string - ) => { - const dependencyCheckerPath: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.CHECK_PYTHON_DEPENDENCIES - ); - try { - // python script will throw exception - // if not all dependencies are downloaded - const { stdout } = await this.executePythonCommand( - pythonPath, - `"${dependencyCheckerPath}"` - ); - - // output for debugging purposes - console.info(stdout); - return true; - } catch (err) { - return false; - } - }; - - public installDependencies = async ( - context: vscode.ExtensionContext, - pythonPath: string - ) => { - const requirementsPyInstallPath: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - "install_dependencies.py" - ); - - if (!this.isPipInstalled(pythonPath)) { - this.telemetryAI.trackFeatureUsage(TelemetryEventName.SETUP_NO_PIP); - return false; - } - - try { - const { stdout } = await this.executePythonCommand( - pythonPath, - `"${requirementsPyInstallPath}"` - ); - console.log(`DSE ${stdout}`); - vscode.window.showInformationMessage( - CONSTANTS.INFO.SUCCESSFUL_INSTALL - ); - return true; - } catch (err) { - console.log(`DSE ${err}`); - return false; - } - }; - - public installDependenciesWrapper = async ( - context: vscode.ExtensionContext, - pythonPath: string, - backupPythonPath: string = "" - ) => { - let errMessage = CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR; - if (backupPythonPath !== "") { - errMessage = `${errMessage} Using original interpreter at: ${backupPythonPath}.`; - } - if (!(await this.installDependencies(context, pythonPath))) { - vscode.window - .showErrorMessage( - CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR, - DialogResponses.READ_INSTALL_MD - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.READ_INSTALL_MD) { - open(CONSTANTS.LINKS.INSTALL); - } - }); - - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DEP_INSTALL_FAIL - ); - return backupPythonPath; - } - return pythonPath; - }; + private telemetryAI: TelemetryAI; + + constructor(telemetryAI: TelemetryAI) { + this.telemetryAI = telemetryAI; + } + + public setupEnv = async ( + context: vscode.ExtensionContext, + needsResponse: boolean = false + ) => { + const originalPythonExecutablePath = + await this.getCurrentPythonExecutablePath(); + if (originalPythonExecutablePath === "") { + return; + } + let pythonExecutablePath = originalPythonExecutablePath; + const pythonExecutableName: string = + os.platform() === "win32" + ? HELPER_FILES.PYTHON_EXE + : HELPER_FILES.PYTHON; + + if ( + !(await this.areDependenciesInstalled( + context, + pythonExecutablePath + )) + ) { + // environment needs to install dependencies + if (!(await this.checkIfVenv(context, pythonExecutablePath))) { + const pythonExecutablePathVenv = await this.getPythonVenv( + context, + pythonExecutableName + ); + if (await this.hasVenv(context)) { + // venv in extention exists with wrong dependencies + + if ( + !(await this.areDependenciesInstalled( + context, + pythonExecutablePathVenv + )) + ) { + pythonExecutablePath = + await this.installDependenciesWrapper( + context, + pythonExecutablePathVenv, + pythonExecutablePath + ); + } else { + pythonExecutablePath = pythonExecutablePathVenv; + } + } else { + pythonExecutablePath = await this.promptInstallVenv( + context, + originalPythonExecutablePath, + pythonExecutableName + ); + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INSTALL_VENV + ); + } + + if (pythonExecutablePath === pythonExecutablePathVenv) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.UPDATED_TO_EXTENSION_VENV + ); + vscode.workspace + .getConfiguration() + .update(CONFIG.PYTHON_PATH, pythonExecutablePath); + } + } else { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_HAS_VENV + ); + } + if (pythonExecutablePath === originalPythonExecutablePath) { + // going with original interpreter, either because + // already in venv or error in creating custom venv + if (checkConfig(CONFIG.SHOW_DEPENDENCY_INSTALL)) { + await vscode.window + .showInformationMessage( + CONSTANTS.INFO.INSTALL_PYTHON_DEPS, + DialogResponses.INSTALL_NOW, + DialogResponses.DONT_INSTALL + ) + .then( + async ( + installChoice: vscode.MessageItem | undefined + ) => { + if ( + installChoice === + DialogResponses.INSTALL_NOW + ) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL + ); + await this.installDependenciesWrapper( + context, + pythonExecutablePath + ); + } else { + await vscode.window + .showInformationMessage( + CONSTANTS.INFO.ARE_YOU_SURE, + DialogResponses.INSTALL_NOW, + DialogResponses.DONT_INSTALL + ) + .then( + async ( + installChoice2: + | vscode.MessageItem + | undefined + ) => { + if ( + installChoice2 === + DialogResponses.INSTALL_NOW + ) { + await this.installDependenciesWrapper( + context, + pythonExecutablePath + ); + } else { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_NO_DEPS_INSTALLED + ); + } + } + ); + } + } + ); + } + } + } else if (needsResponse) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.ALREADY_SUCCESSFUL_INSTALL + ); + } + + return pythonExecutablePath; + }; + + public getCurrentPythonExecutablePath = async ( + isTryingPython3: boolean = false + ) => { + let originalPythonExecutablePath = ""; + const systemPythonVar = isTryingPython3 + ? GLOBAL_ENV_VARS.PYTHON3 + : GLOBAL_ENV_VARS.PYTHON; + // try to get name from interpreter + try { + originalPythonExecutablePath = getConfig(CONFIG.PYTHON_PATH); + } catch (err) { + originalPythonExecutablePath = systemPythonVar; + } + + if ( + originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON3 || + originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON || + originalPythonExecutablePath === "" + ) { + // catching any instance where the python path needs to be resolved + // from an system variable + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_AUTO_RESOLVE_PYTHON_PATH + ); + try { + const { stdout } = await this.executePythonCommand( + systemPythonVar, + `-c "import sys; print(sys.executable)"` + ); + originalPythonExecutablePath = stdout.trim(); + } catch (err) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_NO_PYTHON_PATH + ); + if (isTryingPython3) { + // if trying python3 failed, that means that BOTH + // python and python3 failed as system variables + // so that means that there is no python + vscode.window + .showErrorMessage( + CONSTANTS.ERROR.NO_PYTHON_PATH, + DialogResponses.INSTALL_PYTHON + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.INSTALL_PYTHON) { + const okAction = () => { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DOWNLOAD_PYTHON + ); + open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON + ); + } + }); + // no python installed, cannot get path + return ""; + } else { + // "python" didn't resolve to anything, trying "python3" + return this.getCurrentPythonExecutablePath(true); + } + } + if ( + !(await this.validatePythonVersion( + originalPythonExecutablePath + )) + ) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INVALID_PYTHON_VER + ); + if (isTryingPython3) { + // if we're trying python3, it means we already tried python and it + // all doesn't seem to work, but it got this far, so it means that + // their system python3 version is still not above 3.7, but they + // don't have a path selected. + vscode.window + .showInformationMessage( + CONSTANTS.ERROR.INVALID_PYTHON_PATH, + DialogResponses.INSTALL_PYTHON + ) + .then( + (installChoice: vscode.MessageItem | undefined) => { + if ( + installChoice === + DialogResponses.INSTALL_PYTHON + ) { + const okAction = () => { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DOWNLOAD_PYTHON + ); + open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO + .THIRD_PARTY_WEBSITE_PYTHON + ); + } + } + ); + return ""; + } else { + // otherwise, we ran the "python" system variable + // and we can try python3 + return this.getCurrentPythonExecutablePath(true); + } + } + } else { + // should only be applicable if the user defined their own path + + // fix path to be absolute + if (!path.isAbsolute(originalPythonExecutablePath)) { + originalPythonExecutablePath = path.join( + vscode.workspace.rootPath, + originalPythonExecutablePath + ); + } + + if (!fs.existsSync(originalPythonExecutablePath)) { + await vscode.window.showErrorMessage( + CONSTANTS.ERROR.BAD_PYTHON_PATH + ); + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INVALID_PYTHON_INTERPRETER_PATH + ); + return ""; + } + + if ( + !(await this.validatePythonVersion( + originalPythonExecutablePath + )) + ) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INVALID_PYTHON_VER + ); + vscode.window + .showInformationMessage( + CONSTANTS.ERROR.INVALID_PYTHON_PATH, + DialogResponses.INSTALL_PYTHON + ) + .then((installChoice: vscode.MessageItem | undefined) => { + if (installChoice === DialogResponses.INSTALL_PYTHON) { + const okAction = () => { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DOWNLOAD_PYTHON + ); + open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON + ); + } + }); + return ""; + } + } + + return originalPythonExecutablePath; + }; + + public isPipInstalled = async (pythonExecutablePath: string) => { + try { + await this.executePythonCommand(pythonExecutablePath, " -m pip"); + return true; + } catch (err) { + vscode.window + .showErrorMessage( + `We found that you may not have Pip installed on your interpreter at ${pythonExecutablePath}, please install it and try again.`, + DialogResponses.INSTALL_PIP + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.INSTALL_PIP) { + const okAction = () => { + open(CONSTANTS.LINKS.DOWNLOAD_PIP); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PIP + ); + } + }); + return false; + } + }; + + public checkIfVenv = async ( + context: vscode.ExtensionContext, + pythonExecutablePath: string + ) => { + const venvCheckerPath: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.CHECK_IF_VENV_PY + ); + const { stdout } = await this.executePythonCommand( + pythonExecutablePath, + `"${venvCheckerPath}"` + ); + return stdout.trim() === "1"; + }; + + public executePythonCommand = async ( + pythonExecutablePath: string, + command: string + ) => { + return exec(`${createEscapedPath(pythonExecutablePath)} ${command}`); + }; + + public validatePythonVersion = async (pythonExecutablePath: string) => { + const { stdout } = await this.executePythonCommand( + pythonExecutablePath, + "--version" + ); + if (stdout < VERSIONS.MIN_PY_VERSION) { + return false; + } else { + return true; + } + }; + + public hasVenv = async (context: vscode.ExtensionContext) => { + const pathToEnv: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR + ); + + return fs.existsSync(pathToEnv); + }; + + public promptInstallVenv = ( + context: vscode.ExtensionContext, + pythonExecutable: string, + pythonExecutableName: string + ) => { + return vscode.window + .showInformationMessage( + CONSTANTS.INFO.INSTALL_PYTHON_VENV, + DialogResponses.YES, + DialogResponses.NO + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.YES) { + return this.installPythonVenv( + context, + pythonExecutable, + pythonExecutableName + ); + } else { + // return pythonExecutable, notifying the caller + // that the user was unwilling to create venv + // and by default, this will trigger the extension to + // try using pythonExecutable + return pythonExecutable; + } + }); + }; + + public getPythonVenv = async ( + context: vscode.ExtensionContext, + pythonExecutableName: string + ) => { + const subFolder = os.platform() === "win32" ? "Scripts" : "bin"; + + return getPathToScript( + context, + path.join(CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR, subFolder), + pythonExecutableName + ); + }; + + public installPythonVenv = async ( + context: vscode.ExtensionContext, + pythonExecutable: string, + pythonExecutableName: string + ) => { + const pathToEnv: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR + ); + + vscode.window.showInformationMessage( + CONSTANTS.INFO.INSTALLING_PYTHON_VENV + ); + + const pythonPath: string = await this.getPythonVenv( + context, + pythonExecutableName + ); + + try { + // make venv + // run command to download dependencies to out/python_libs + await this.executePythonCommand( + pythonExecutable, + `-m venv "${pathToEnv}"` + ); + } catch (err) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_VENV_CREATION_ERR + ); + vscode.window + .showErrorMessage( + `Virtual environment for download could not be completed. Using original interpreter at: ${pythonExecutable}. If you're on Linux, try running "sudo apt-get install python3-venv".`, + DialogResponses.READ_INSTALL_MD + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.READ_INSTALL_MD) { + open(CONSTANTS.LINKS.INSTALL); + } + }); + + console.error(err); + + return pythonExecutable; + } + + return this.installDependenciesWrapper( + context, + pythonPath, + pythonExecutable + ); + }; + + public areDependenciesInstalled = async ( + context: vscode.ExtensionContext, + pythonPath: string + ) => { + const dependencyCheckerPath: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.CHECK_PYTHON_DEPENDENCIES + ); + try { + // python script will throw exception + // if not all dependencies are downloaded + const { stdout } = await this.executePythonCommand( + pythonPath, + `"${dependencyCheckerPath}"` + ); + + // output for debugging purposes + console.info(stdout); + return true; + } catch (err) { + return false; + } + }; + + public installDependencies = async ( + context: vscode.ExtensionContext, + pythonPath: string + ) => { + const requirementsPyInstallPath: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + "install_dependencies.py" + ); + + if (!this.isPipInstalled(pythonPath)) { + this.telemetryAI.trackFeatureUsage(TelemetryEventName.SETUP_NO_PIP); + return false; + } + + try { + const { stdout } = await this.executePythonCommand( + pythonPath, + `"${requirementsPyInstallPath}"` + ); + console.log(`DSE ${stdout}`); + vscode.window.showInformationMessage( + CONSTANTS.INFO.SUCCESSFUL_INSTALL + ); + return true; + } catch (err) { + console.log(`DSE ${err}`); + return false; + } + }; + + public installDependenciesWrapper = async ( + context: vscode.ExtensionContext, + pythonPath: string, + backupPythonPath: string = "" + ) => { + let errMessage = CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR; + if (backupPythonPath !== "") { + errMessage = `${errMessage} Using original interpreter at: ${backupPythonPath}.`; + } + if (!(await this.installDependencies(context, pythonPath))) { + vscode.window + .showErrorMessage( + CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR, + DialogResponses.READ_INSTALL_MD + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.READ_INSTALL_MD) { + open(CONSTANTS.LINKS.INSTALL); + } + }); + + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DEP_INSTALL_FAIL + ); + return backupPythonPath; + } + return pythonPath; + }; } diff --git a/Source/service/telemetryHandlerService.ts b/Source/service/telemetryHandlerService.ts index f16141f65..e76bea74c 100644 --- a/Source/service/telemetryHandlerService.ts +++ b/Source/service/telemetryHandlerService.ts @@ -6,551 +6,551 @@ import TelemetryAI from "../telemetry/telemetryAI"; import { DeviceSelectionService } from "./deviceSelectionService"; export class TelemetryHandlerService { - private telemetryAI: TelemetryAI; - private deviceSelectionService: DeviceSelectionService; + private telemetryAI: TelemetryAI; + private deviceSelectionService: DeviceSelectionService; - constructor( - telemetryAI: TelemetryAI, - deviceSelectionService: DeviceSelectionService - ) { - this.telemetryAI = telemetryAI; - this.deviceSelectionService = deviceSelectionService; - } + constructor( + telemetryAI: TelemetryAI, + deviceSelectionService: DeviceSelectionService + ) { + this.telemetryAI = telemetryAI; + this.deviceSelectionService = deviceSelectionService; + } - public handleDebuggerTelemetry = () => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_DEBUGGER_INIT_SUCCESS - ); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_DEBUGGER_INIT_SUCCESS - ); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_DEBUGGER_INIT_SUCCESS - ); - break; - default: - break; - } - }; + public handleDebuggerTelemetry = () => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_DEBUGGER_INIT_SUCCESS + ); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_DEBUGGER_INIT_SUCCESS + ); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_DEBUGGER_INIT_SUCCESS + ); + break; + default: + break; + } + }; - public handleDebuggerFailTelemetry = () => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_DEBUGGER_INIT_FAIL - ); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_DEBUGGER_INIT_FAIL - ); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_DEBUGGER_INIT_FAIL - ); - break; - default: - break; - } - }; + public handleDebuggerFailTelemetry = () => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_DEBUGGER_INIT_FAIL + ); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_DEBUGGER_INIT_FAIL + ); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_DEBUGGER_INIT_FAIL + ); + break; + default: + break; + } + }; - public handleButtonPressTelemetry = (buttonState: any) => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.handleCPXButtonPressTelemetry(buttonState); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.handleMicrobitButtonPressTelemetry(buttonState); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.handleClueButtonPressTelemetry(buttonState); - break; - default: - break; - } - }; + public handleButtonPressTelemetry = (buttonState: any) => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.handleCPXButtonPressTelemetry(buttonState); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.handleMicrobitButtonPressTelemetry(buttonState); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.handleClueButtonPressTelemetry(buttonState); + break; + default: + break; + } + }; - public handleGestureTelemetry = (sensorState: any) => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.handleCPXGestureTelemetry(sensorState); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - break; - default: - break; - } - }; + public handleGestureTelemetry = (sensorState: any) => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.handleCPXGestureTelemetry(sensorState); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + break; + default: + break; + } + }; - public handleSensorTelemetry = (sensor: string) => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.handleCPXSensorTelemetry(sensor); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.handleMicrobitSensorTelemetry(sensor); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.handleClueSensorTelemetry(sensor); - break; - default: - break; - } - }; + public handleSensorTelemetry = (sensor: string) => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.handleCPXSensorTelemetry(sensor); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.handleMicrobitSensorTelemetry(sensor); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.handleClueSensorTelemetry(sensor); + break; + default: + break; + } + }; - public handleCPXButtonPressTelemetry = (buttonState: any) => { - if (buttonState.button_a && buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_BUTTON_AB - ); - } else if (buttonState.button_a) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_BUTTON_A - ); - } else if (buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_BUTTON_B - ); - } else if (buttonState.switch) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_SWITCH - ); - } - }; + public handleCPXButtonPressTelemetry = (buttonState: any) => { + if (buttonState.button_a && buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_BUTTON_AB + ); + } else if (buttonState.button_a) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_BUTTON_A + ); + } else if (buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_BUTTON_B + ); + } else if (buttonState.switch) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_SWITCH + ); + } + }; - public handleCPXGestureTelemetry = (sensorState: any) => { - if (sensorState.shake) { - this.handleCPXSensorTelemetry("shake"); - } else if (sensorState.touch) { - this.handleCPXSensorTelemetry("touch"); - } - }; + public handleCPXGestureTelemetry = (sensorState: any) => { + if (sensorState.shake) { + this.handleCPXSensorTelemetry("shake"); + } else if (sensorState.touch) { + this.handleCPXSensorTelemetry("touch"); + } + }; - public handleCPXSensorTelemetry = (sensor: string) => { - switch (sensor) { - case "temperature": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_TEMPERATURE_SENSOR - ); - break; - case "light": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_LIGHT_SENSOR - ); - break; - case "motion_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR - ); - break; - case "shake": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_SHAKE - ); - break; - case "touch": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_CAPACITIVE_TOUCH - ); - break; - } - }; + public handleCPXSensorTelemetry = (sensor: string) => { + switch (sensor) { + case "temperature": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_TEMPERATURE_SENSOR + ); + break; + case "light": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_LIGHT_SENSOR + ); + break; + case "motion_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR + ); + break; + case "shake": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_SHAKE + ); + break; + case "touch": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_CAPACITIVE_TOUCH + ); + break; + } + }; - public handleMicrobitButtonPressTelemetry = (buttonState: any) => { - if (buttonState.button_a && buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_AB - ); - } else if (buttonState.button_a) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_A - ); - } else if (buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_B - ); - } - }; + public handleMicrobitButtonPressTelemetry = (buttonState: any) => { + if (buttonState.button_a && buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_AB + ); + } else if (buttonState.button_a) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_A + ); + } else if (buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_B + ); + } + }; - public handleMicrobitSensorTelemetry = (sensor: string) => { - switch (sensor) { - case "temperature": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_TEMPERATURE_SENSOR - ); - break; - case "light": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_LIGHT_SENSOR - ); - break; - case "motion_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR - ); - break; - case "gesture": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_GESTURE_SENSOR - ); - break; - } - }; + public handleMicrobitSensorTelemetry = (sensor: string) => { + switch (sensor) { + case "temperature": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_TEMPERATURE_SENSOR + ); + break; + case "light": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_LIGHT_SENSOR + ); + break; + case "motion_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR + ); + break; + case "gesture": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_GESTURE_SENSOR + ); + break; + } + }; - public handleClueButtonPressTelemetry = (buttonState: any) => { - if (buttonState.button_a && buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_BUTTON_AB - ); - } else if (buttonState.button_a) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_BUTTON_A - ); - } else if (buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_BUTTON_B - ); - } - }; + public handleClueButtonPressTelemetry = (buttonState: any) => { + if (buttonState.button_a && buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_BUTTON_AB + ); + } else if (buttonState.button_a) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_BUTTON_A + ); + } else if (buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_BUTTON_B + ); + } + }; - public handleClueSensorTelemetry = (sensor: string) => { - switch (sensor) { - case "temperature": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_TEMPERATURE_SENSOR - ); - break; - case "light_r": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "light_g": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "light_b": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "light_c": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "motion_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR - ); - break; - case "gesture": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GESTURE_SENSOR - ); - break; - case "humidity": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_HUMIDITY_SENSOR - ); - break; - case "pressure": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_PRESSURE_SENSOR - ); - break; - case "proximity": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_PROXIMITY_SENSOR - ); - break; - case "gyro_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR - ); - break; - case "gyro_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR - ); - break; - case "gyro_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR - ); - break; - case "magnet_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR - ); - break; - case "magnet_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR - ); - break; - case "magnet_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR - ); - break; - } - }; + public handleClueSensorTelemetry = (sensor: string) => { + switch (sensor) { + case "temperature": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_TEMPERATURE_SENSOR + ); + break; + case "light_r": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR + ); + break; + case "light_g": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR + ); + break; + case "light_b": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR + ); + break; + case "light_c": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR + ); + break; + case "motion_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR + ); + break; + case "gesture": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GESTURE_SENSOR + ); + break; + case "humidity": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_HUMIDITY_SENSOR + ); + break; + case "pressure": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_PRESSURE_SENSOR + ); + break; + case "proximity": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_PROXIMITY_SENSOR + ); + break; + case "gyro_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR + ); + break; + case "gyro_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR + ); + break; + case "gyro_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR + ); + break; + case "magnet_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR + ); + break; + case "magnet_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR + ); + break; + case "magnet_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR + ); + break; + } + }; - public handleNewFileErrorTelemetry = () => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_ERROR_COMMAND_NEW_FILE - ); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_ERROR_COMMAND_NEW_FILE - ); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_ERROR_COMMAND_NEW_FILE - ); - break; - default: - break; - } - }; + public handleNewFileErrorTelemetry = () => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_ERROR_COMMAND_NEW_FILE + ); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_ERROR_COMMAND_NEW_FILE + ); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_ERROR_COMMAND_NEW_FILE + ); + break; + default: + break; + } + }; - public getTelemetryEventsForStartingDeployToDevice = (device: string) => { - let deployTelemetryEvent: string; - let deployPerformanceTelemetryEvent: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - deployTelemetryEvent = - TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; - deployPerformanceTelemetryEvent = - TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - deployTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; - deployPerformanceTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - deployTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; - deployPerformanceTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; - break; - } - return { - deployTelemetryEvent, - deployPerformanceTelemetryEvent, - }; - }; + public getTelemetryEventsForStartingDeployToDevice = (device: string) => { + let deployTelemetryEvent: string; + let deployPerformanceTelemetryEvent: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + deployTelemetryEvent = + TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; + deployPerformanceTelemetryEvent = + TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + deployTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; + deployPerformanceTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + deployTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; + deployPerformanceTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; + break; + } + return { + deployTelemetryEvent, + deployPerformanceTelemetryEvent, + }; + }; - public handleDeployToDeviceErrorTelemetry = ( - data: string, - device: string - ) => { - let telemetryErrorName: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - telemetryErrorName = - TelemetryEventName.CPX_ERROR_PYTHON_DEVICE_PROCESS; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - telemetryErrorName = - TelemetryEventName.MICROBIT_ERROR_PYTHON_DEVICE_PROCESS; - case CONSTANTS.DEVICE_NAME.CLUE: - telemetryErrorName = - TelemetryEventName.CLUE_ERROR_PYTHON_DEVICE_PROCESS; - } - this.telemetryAI.trackFeatureUsage(telemetryErrorName, { - error: `${data}`, - }); - }; + public handleDeployToDeviceErrorTelemetry = ( + data: string, + device: string + ) => { + let telemetryErrorName: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + telemetryErrorName = + TelemetryEventName.CPX_ERROR_PYTHON_DEVICE_PROCESS; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + telemetryErrorName = + TelemetryEventName.MICROBIT_ERROR_PYTHON_DEVICE_PROCESS; + case CONSTANTS.DEVICE_NAME.CLUE: + telemetryErrorName = + TelemetryEventName.CLUE_ERROR_PYTHON_DEVICE_PROCESS; + } + this.telemetryAI.trackFeatureUsage(telemetryErrorName, { + error: `${data}`, + }); + }; - public handleDeployToDeviceFinishedTelemetry = ( - message: any, - device: string - ) => { - let successCommandDeployDevice: string; - let errorCommandDeployWithoutDevice: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - successCommandDeployDevice = - TelemetryEventName.CPX_SUCCESS_COMMAND_DEPLOY_DEVICE; - errorCommandDeployWithoutDevice = - TelemetryEventName.CPX_ERROR_DEPLOY_WITHOUT_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - successCommandDeployDevice = - TelemetryEventName.MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE; - errorCommandDeployWithoutDevice = - TelemetryEventName.MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - successCommandDeployDevice = - TelemetryEventName.CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE; - errorCommandDeployWithoutDevice = - TelemetryEventName.CLUE_ERROR_DEPLOY_WITHOUT_DEVICE; - break; - } + public handleDeployToDeviceFinishedTelemetry = ( + message: any, + device: string + ) => { + let successCommandDeployDevice: string; + let errorCommandDeployWithoutDevice: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + successCommandDeployDevice = + TelemetryEventName.CPX_SUCCESS_COMMAND_DEPLOY_DEVICE; + errorCommandDeployWithoutDevice = + TelemetryEventName.CPX_ERROR_DEPLOY_WITHOUT_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + successCommandDeployDevice = + TelemetryEventName.MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE; + errorCommandDeployWithoutDevice = + TelemetryEventName.MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + successCommandDeployDevice = + TelemetryEventName.CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE; + errorCommandDeployWithoutDevice = + TelemetryEventName.CLUE_ERROR_DEPLOY_WITHOUT_DEVICE; + break; + } - switch (message.type) { - case "complete": - this.telemetryAI.trackFeatureUsage(successCommandDeployDevice); - break; - case "no-device": - this.telemetryAI.trackFeatureUsage( - errorCommandDeployWithoutDevice - ); - if ( - device === CONSTANTS.DEVICE_NAME.CPX || - device === CONSTANTS.DEVICE_NAME.CLUE - ) { - vscode.window - .showErrorMessage( - CONSTANTS.ERROR.NO_DEVICE, - DialogResponses.HELP - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.HELP) { - const okAction = () => { - let helpLink: string; - let helpTelemetryEvent: string; - if (device === CONSTANTS.DEVICE_NAME.CPX) { - helpLink = CONSTANTS.LINKS.CPX_HELP; - helpTelemetryEvent = - TelemetryEventName.CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; - } else if ( - device === CONSTANTS.DEVICE_NAME.CLUE - ) { - helpLink = CONSTANTS.LINKS.CLUE_HELP; - helpTelemetryEvent = - TelemetryEventName.CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; - } - open(helpLink); - this.telemetryAI.trackFeatureUsage( - helpTelemetryEvent - ); - }; - utils.showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT - ); - } - }); - } else if (device === CONSTANTS.DEVICE_NAME.MICROBIT) { - vscode.window.showErrorMessage(CONSTANTS.ERROR.NO_DEVICE); - } - break; - case "low-python-version": - vscode.window.showErrorMessage( - CONSTANTS.ERROR.LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT - ); - break; - default: - console.log( - `Non-state JSON output from the process : ${message}` - ); - break; - } - }; + switch (message.type) { + case "complete": + this.telemetryAI.trackFeatureUsage(successCommandDeployDevice); + break; + case "no-device": + this.telemetryAI.trackFeatureUsage( + errorCommandDeployWithoutDevice + ); + if ( + device === CONSTANTS.DEVICE_NAME.CPX || + device === CONSTANTS.DEVICE_NAME.CLUE + ) { + vscode.window + .showErrorMessage( + CONSTANTS.ERROR.NO_DEVICE, + DialogResponses.HELP + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.HELP) { + const okAction = () => { + let helpLink: string; + let helpTelemetryEvent: string; + if (device === CONSTANTS.DEVICE_NAME.CPX) { + helpLink = CONSTANTS.LINKS.CPX_HELP; + helpTelemetryEvent = + TelemetryEventName.CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; + } else if ( + device === CONSTANTS.DEVICE_NAME.CLUE + ) { + helpLink = CONSTANTS.LINKS.CLUE_HELP; + helpTelemetryEvent = + TelemetryEventName.CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; + } + open(helpLink); + this.telemetryAI.trackFeatureUsage( + helpTelemetryEvent + ); + }; + utils.showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT + ); + } + }); + } else if (device === CONSTANTS.DEVICE_NAME.MICROBIT) { + vscode.window.showErrorMessage(CONSTANTS.ERROR.NO_DEVICE); + } + break; + case "low-python-version": + vscode.window.showErrorMessage( + CONSTANTS.ERROR.LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT + ); + break; + default: + console.log( + `Non-state JSON output from the process : ${message}` + ); + break; + } + }; - public getTelemetryEventsForOpenSimulator = (device: string) => { - let openSimulatorTelemetryEvent: string; - let openSimulatorPerformanceTelemetryEvent: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - openSimulatorTelemetryEvent = - TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; - openSimulatorPerformanceTelemetryEvent = - TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - openSimulatorTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; - openSimulatorPerformanceTelemetryEvent = - TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - openSimulatorTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; - openSimulatorPerformanceTelemetryEvent = - TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; - break; - } - return { - openSimulatorTelemetryEvent, - openSimulatorPerformanceTelemetryEvent, - }; - }; + public getTelemetryEventsForOpenSimulator = (device: string) => { + let openSimulatorTelemetryEvent: string; + let openSimulatorPerformanceTelemetryEvent: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + openSimulatorTelemetryEvent = + TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; + openSimulatorPerformanceTelemetryEvent = + TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + openSimulatorTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; + openSimulatorPerformanceTelemetryEvent = + TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + openSimulatorTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; + openSimulatorPerformanceTelemetryEvent = + TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; + break; + } + return { + openSimulatorTelemetryEvent, + openSimulatorPerformanceTelemetryEvent, + }; + }; - public getTelemetryEventsForNewFile = (device: string) => { - let newFileTelemetryEvent: string; - let newFilePerformanceTelemetryEvent: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - newFileTelemetryEvent = - TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; - newFilePerformanceTelemetryEvent = - TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - newFileTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; - newFilePerformanceTelemetryEvent = - TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - newFileTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; - newFilePerformanceTelemetryEvent = - TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; - break; - } - return { - newFileTelemetryEvent, - newFilePerformanceTelemetryEvent, - }; - }; + public getTelemetryEventsForNewFile = (device: string) => { + let newFileTelemetryEvent: string; + let newFilePerformanceTelemetryEvent: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + newFileTelemetryEvent = + TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; + newFilePerformanceTelemetryEvent = + TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + newFileTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; + newFilePerformanceTelemetryEvent = + TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + newFileTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; + newFilePerformanceTelemetryEvent = + TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; + break; + } + return { + newFileTelemetryEvent, + newFilePerformanceTelemetryEvent, + }; + }; } diff --git a/Source/service/webviewService.ts b/Source/service/webviewService.ts index 2b6add591..01584259b 100644 --- a/Source/service/webviewService.ts +++ b/Source/service/webviewService.ts @@ -6,47 +6,46 @@ import { DeviceSelectionService } from "./deviceSelectionService"; // Manages different type of webview export class WebviewService { - private tutorialPanel: vscode.WebviewPanel | undefined; - private context: vscode.ExtensionContext; - private deviceSelectionService: DeviceSelectionService; + private tutorialPanel: vscode.WebviewPanel | undefined; + private context: vscode.ExtensionContext; + private deviceSelectionService: DeviceSelectionService; - constructor( - context: vscode.ExtensionContext, - deviceSelectionService: DeviceSelectionService - ) { - this.context = context; - this.deviceSelectionService = deviceSelectionService; - } + constructor( + context: vscode.ExtensionContext, + deviceSelectionService: DeviceSelectionService + ) { + this.context = context; + this.deviceSelectionService = deviceSelectionService; + } - public openTutorialPanel() { - if (this.tutorialPanel) { - this.tutorialPanel.reveal(vscode.ViewColumn.Beside); - } else { - this.createTutorialPanel(); - } - } + public openTutorialPanel() { + if (this.tutorialPanel) { + this.tutorialPanel.reveal(vscode.ViewColumn.Beside); + } else { + this.createTutorialPanel(); + } + } - public getWebviewContent( - webviewType: string, - hasDevice: boolean, - panel: vscode.WebviewPanel - ) { - const onDiskPath = vscode.Uri.file( - this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.SIMULATOR) - ); - const scriptSrc = panel.webview.asWebviewUri(onDiskPath); + public getWebviewContent( + webviewType: string, + hasDevice: boolean, + panel: vscode.WebviewPanel + ) { + const onDiskPath = vscode.Uri.file( + this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.SIMULATOR) + ); + const scriptSrc = panel.webview.asWebviewUri(onDiskPath); - const vscodeImportPath = vscode.Uri.file( - this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.VSCODE_API) - ); - const vscodeImportPathSrc = panel.webview.asWebviewUri( - vscodeImportPath - ); + const vscodeImportPath = vscode.Uri.file( + this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.VSCODE_API) + ); + const vscodeImportPathSrc = + panel.webview.asWebviewUri(vscodeImportPath); - const attributeString = this.getAttributeString(webviewType, hasDevice); - const nonce = getNonce(); + const attributeString = this.getAttributeString(webviewType, hasDevice); + const nonce = getNonce(); - return ` + return ` @@ -64,49 +63,49 @@ export class WebviewService { < /html>`; - } + } - private createTutorialPanel() { - this.tutorialPanel = vscode.window.createWebviewPanel( - CONSTANTS.WEBVIEW_TYPE.TUTORIAL, - CONSTANTS.LABEL.WEBVIEW_PANEL, - { preserveFocus: true, viewColumn: vscode.ViewColumn.One }, - { - enableScripts: true, - retainContextWhenHidden: true, - } - ); - this.tutorialPanel.webview.html = this.getWebviewContent( - WEBVIEW_TYPES.GETTING_STARTED, - false, - this.tutorialPanel - ); - this.tutorialPanel.onDidDispose(() => { - this.disposeTutorialPanel(); - }); - } + private createTutorialPanel() { + this.tutorialPanel = vscode.window.createWebviewPanel( + CONSTANTS.WEBVIEW_TYPE.TUTORIAL, + CONSTANTS.LABEL.WEBVIEW_PANEL, + { preserveFocus: true, viewColumn: vscode.ViewColumn.One }, + { + enableScripts: true, + retainContextWhenHidden: true, + } + ); + this.tutorialPanel.webview.html = this.getWebviewContent( + WEBVIEW_TYPES.GETTING_STARTED, + false, + this.tutorialPanel + ); + this.tutorialPanel.onDidDispose(() => { + this.disposeTutorialPanel(); + }); + } - private disposeTutorialPanel() { - this.tutorialPanel = undefined; - } - private getAttributeString(webviewType: string, hasDevice: boolean) { - if (hasDevice) { - return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} ${ - WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE - }=${this.deviceSelectionService.getCurrentActiveDevice()} `; - } else { - return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} `; - } - } + private disposeTutorialPanel() { + this.tutorialPanel = undefined; + } + private getAttributeString(webviewType: string, hasDevice: boolean) { + if (hasDevice) { + return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} ${ + WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE + }=${this.deviceSelectionService.getCurrentActiveDevice()} `; + } else { + return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} `; + } + } } // Nonce generator taken from vscode extension samples found here: // https://github.com/microsoft/vscode-extension-samples/blob/master/custom-editor-sample/src/util.ts function getNonce() { - let text = ""; - const possible = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - for (let i = 0; i < 32; i++) { - text += possible.charAt(Math.floor(Math.random() * possible.length)); - } - return text; + let text = ""; + const possible = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + for (let i = 0; i < 32; i++) { + text += possible.charAt(Math.floor(Math.random() * possible.length)); + } + return text; } diff --git a/Source/simulatorDebugConfigurationProvider.ts b/Source/simulatorDebugConfigurationProvider.ts index 2b6725f22..40d153f6a 100644 --- a/Source/simulatorDebugConfigurationProvider.ts +++ b/Source/simulatorDebugConfigurationProvider.ts @@ -6,79 +6,80 @@ import { CONSTANTS, DialogResponses } from "./constants"; import { getServerPortConfig } from "./extension_utils/utils"; export class SimulatorDebugConfigurationProvider - implements vscode.DebugConfigurationProvider { - public deviceSimulatorExpressDebug: boolean; + implements vscode.DebugConfigurationProvider +{ + public deviceSimulatorExpressDebug: boolean; - constructor(private pathToScript: string) { - this.deviceSimulatorExpressDebug = false; - } + constructor(private pathToScript: string) { + this.deviceSimulatorExpressDebug = false; + } - /** - * Modify the debug configuration just before a debug session is being launched. - */ - public resolveDebugConfiguration( - folder: vscode.WorkspaceFolder | undefined, - config: vscode.DebugConfiguration, - token?: vscode.CancellationToken - ): vscode.ProviderResult { - const activeTextEditor = vscode.window.activeTextEditor; + /** + * Modify the debug configuration just before a debug session is being launched. + */ + public resolveDebugConfiguration( + folder: vscode.WorkspaceFolder | undefined, + config: vscode.DebugConfiguration, + token?: vscode.CancellationToken + ): vscode.ProviderResult { + const activeTextEditor = vscode.window.activeTextEditor; - // Create a configuration if no launch.json exists or if it's empty - if (!config.type && !config.request && !config.name) { - if ( - activeTextEditor && - activeTextEditor.document.languageId === "python" - ) { - config.type = "deviceSimulatorExpress"; - config.request = "launch"; - config.name = "Device Simulator Express Debugger"; - config.console = "integratedTerminal"; - } - } - // Check config type - if (config.type === CONSTANTS.DEBUG_CONFIGURATION_TYPE) { - this.deviceSimulatorExpressDebug = true; - if (activeTextEditor) { - const currentFilePath = activeTextEditor.document.fileName; + // Create a configuration if no launch.json exists or if it's empty + if (!config.type && !config.request && !config.name) { + if ( + activeTextEditor && + activeTextEditor.document.languageId === "python" + ) { + config.type = "deviceSimulatorExpress"; + config.request = "launch"; + config.name = "Device Simulator Express Debugger"; + config.console = "integratedTerminal"; + } + } + // Check config type + if (config.type === CONSTANTS.DEBUG_CONFIGURATION_TYPE) { + this.deviceSimulatorExpressDebug = true; + if (activeTextEditor) { + const currentFilePath = activeTextEditor.document.fileName; - // Check file type and name - if (!(activeTextEditor.document.languageId === "python")) { - return vscode.window - .showErrorMessage( - CONSTANTS.ERROR.INVALID_FILE_EXTENSION_DEBUG - ) - .then(() => { - return undefined; // Abort launch - }); - } - // Set the new configuration type so the python debugger can take over - config.type = "python"; - // Set process_user_code path as program - config.program = this.pathToScript; - // Set user's code path and server's port as args - config.args = [ - currentFilePath, - getServerPortConfig().toString(), - ]; - // Set rules - config.rules = [ - { path: this.pathToScript, include: false }, - { - module: "adafruit_circuitplayground", - include: false, - }, - { module: "playsound", include: false }, - ]; - } - } - // Abort / show error message if can't find process_user_code.py - if (!config.program) { - return vscode.window - .showErrorMessage(CONSTANTS.ERROR.NO_PROGRAM_FOUND_DEBUG) - .then(() => { - return undefined; // Abort launch - }); - } - return config; - } + // Check file type and name + if (!(activeTextEditor.document.languageId === "python")) { + return vscode.window + .showErrorMessage( + CONSTANTS.ERROR.INVALID_FILE_EXTENSION_DEBUG + ) + .then(() => { + return undefined; // Abort launch + }); + } + // Set the new configuration type so the python debugger can take over + config.type = "python"; + // Set process_user_code path as program + config.program = this.pathToScript; + // Set user's code path and server's port as args + config.args = [ + currentFilePath, + getServerPortConfig().toString(), + ]; + // Set rules + config.rules = [ + { path: this.pathToScript, include: false }, + { + module: "adafruit_circuitplayground", + include: false, + }, + { module: "playsound", include: false }, + ]; + } + } + // Abort / show error message if can't find process_user_code.py + if (!config.program) { + return vscode.window + .showErrorMessage(CONSTANTS.ERROR.NO_PROGRAM_FOUND_DEBUG) + .then(() => { + return undefined; // Abort launch + }); + } + return config; + } } diff --git a/Source/telemetry/getPackageInfo.ts b/Source/telemetry/getPackageInfo.ts index cd8d42ab7..6e7044903 100644 --- a/Source/telemetry/getPackageInfo.ts +++ b/Source/telemetry/getPackageInfo.ts @@ -3,55 +3,53 @@ import * as path from "path"; import * as vscode from "vscode"; export interface IPackageJson { - name?: string; - version?: string; - instrumentationKey: string; + name?: string; + version?: string; + instrumentationKey: string; } const getPackagePath = (context: vscode.ExtensionContext) => { - const onDiskPath = vscode.Uri.file( - path.join(context.extensionPath, "package.json") - ); - const packagePath = onDiskPath.with({ scheme: "vscode-resource" }); + const onDiskPath = vscode.Uri.file( + path.join(context.extensionPath, "package.json") + ); + const packagePath = onDiskPath.with({ scheme: "vscode-resource" }); - return packagePath; + return packagePath; }; -export default function getPackageInfo( - context: vscode.ExtensionContext -): { - extensionName: string; - extensionVersion: string; - instrumentationKey: string; +export default function getPackageInfo(context: vscode.ExtensionContext): { + extensionName: string; + extensionVersion: string; + instrumentationKey: string; } { - let packageJson: IPackageJson; - const packagePath = getPackagePath(context); - - try { - packageJson = JSON.parse(fs.readFileSync(packagePath.fsPath, "utf8")); - } catch (error) { - console.error(`Failed to read from package.json: ${error}`); - throw new Error(`Failed to read from package.json: ${error}`); - } - - const extensionName: string | undefined = packageJson.name; - const extensionVersion: string | undefined = packageJson.version; - const instrumentationKey: string | undefined = - packageJson.instrumentationKey; - - if (!extensionName) { - throw new Error( - "Extension's package.json is missing instrumentation key." - ); - } - - if (!extensionVersion) { - throw new Error("Extension's package.json is missing version."); - } - - if (!extensionVersion) { - throw new Error("Extension's package.json is missing version."); - } - - return { extensionName, extensionVersion, instrumentationKey }; + let packageJson: IPackageJson; + const packagePath = getPackagePath(context); + + try { + packageJson = JSON.parse(fs.readFileSync(packagePath.fsPath, "utf8")); + } catch (error) { + console.error(`Failed to read from package.json: ${error}`); + throw new Error(`Failed to read from package.json: ${error}`); + } + + const extensionName: string | undefined = packageJson.name; + const extensionVersion: string | undefined = packageJson.version; + const instrumentationKey: string | undefined = + packageJson.instrumentationKey; + + if (!extensionName) { + throw new Error( + "Extension's package.json is missing instrumentation key." + ); + } + + if (!extensionVersion) { + throw new Error("Extension's package.json is missing version."); + } + + if (!extensionVersion) { + throw new Error("Extension's package.json is missing version."); + } + + return { extensionName, extensionVersion, instrumentationKey }; } diff --git a/Source/telemetry/telemetryAI.ts b/Source/telemetry/telemetryAI.ts index 4dbf5ca41..c0c5ff5ac 100644 --- a/Source/telemetry/telemetryAI.ts +++ b/Source/telemetry/telemetryAI.ts @@ -4,80 +4,76 @@ import getPackageInfo from "./getPackageInfo"; // tslint:disable-next-line:export-name export default class TelemetryAI { - private static telemetryReporter: TelemetryReporter; - private static enableTelemetry: boolean | undefined; + private static telemetryReporter: TelemetryReporter; + private static enableTelemetry: boolean | undefined; - constructor(vscodeContext: vscode.ExtensionContext) { - TelemetryAI.telemetryReporter = this.createTelemetryReporter( - vscodeContext - ); - TelemetryAI.enableTelemetry = vscode.workspace - .getConfiguration() - .get("telemetry.enableTelemetry"); - if (TelemetryAI.enableTelemetry === undefined) { - TelemetryAI.enableTelemetry = true; - } - } + constructor(vscodeContext: vscode.ExtensionContext) { + TelemetryAI.telemetryReporter = + this.createTelemetryReporter(vscodeContext); + TelemetryAI.enableTelemetry = vscode.workspace + .getConfiguration() + .get("telemetry.enableTelemetry"); + if (TelemetryAI.enableTelemetry === undefined) { + TelemetryAI.enableTelemetry = true; + } + } - public getExtensionName(context: vscode.ExtensionContext): string { - const { extensionName } = getPackageInfo(context); - return extensionName; - } + public getExtensionName(context: vscode.ExtensionContext): string { + const { extensionName } = getPackageInfo(context); + return extensionName; + } - public getExtensionVersionNumber(context: vscode.ExtensionContext): string { - const { extensionVersion } = getPackageInfo(context); - return extensionVersion; - } + public getExtensionVersionNumber(context: vscode.ExtensionContext): string { + const { extensionVersion } = getPackageInfo(context); + return extensionVersion; + } - public sendTelemetryIfEnabled( - eventName: string, - properties?: { [key: string]: string }, - measurements?: { [key: string]: number } - ) { - if (TelemetryAI.enableTelemetry) { - TelemetryAI.telemetryReporter.sendTelemetryEvent( - eventName, - properties, - measurements - ); - } - } + public sendTelemetryIfEnabled( + eventName: string, + properties?: { [key: string]: string }, + measurements?: { [key: string]: number } + ) { + if (TelemetryAI.enableTelemetry) { + TelemetryAI.telemetryReporter.sendTelemetryEvent( + eventName, + properties, + measurements + ); + } + } - public trackFeatureUsage( - eventName: string, - eventProperties?: { [key: string]: string } - ) { - this.sendTelemetryIfEnabled(eventName, eventProperties); - } + public trackFeatureUsage( + eventName: string, + eventProperties?: { [key: string]: string } + ) { + this.sendTelemetryIfEnabled(eventName, eventProperties); + } - public runWithLatencyMeasure( - functionToRun: () => void, - eventName: string - ): void { - const numberOfNanosecondsInSecond: number = 1000000000; - const startTime: number = Number(process.hrtime.bigint()); - functionToRun(); - const latency: number = Number(process.hrtime.bigint()) - startTime; - const measurement = { - duration: latency / numberOfNanosecondsInSecond, - }; - this.sendTelemetryIfEnabled(eventName, {}, measurement); - } + public runWithLatencyMeasure( + functionToRun: () => void, + eventName: string + ): void { + const numberOfNanosecondsInSecond: number = 1000000000; + const startTime: number = Number(process.hrtime.bigint()); + functionToRun(); + const latency: number = Number(process.hrtime.bigint()) - startTime; + const measurement = { + duration: latency / numberOfNanosecondsInSecond, + }; + this.sendTelemetryIfEnabled(eventName, {}, measurement); + } - private createTelemetryReporter( - context: vscode.ExtensionContext - ): TelemetryReporter { - const { - extensionName, - extensionVersion, - instrumentationKey, - } = getPackageInfo(context); - const reporter: TelemetryReporter = new TelemetryReporter( - extensionName, - extensionVersion, - instrumentationKey - ); - context.subscriptions.push(reporter); - return reporter; - } + private createTelemetryReporter( + context: vscode.ExtensionContext + ): TelemetryReporter { + const { extensionName, extensionVersion, instrumentationKey } = + getPackageInfo(context); + const reporter: TelemetryReporter = new TelemetryReporter( + extensionName, + extensionVersion, + instrumentationKey + ); + context.subscriptions.push(reporter); + return reporter; + } } diff --git a/Source/test/runTest.ts b/Source/test/runTest.ts index 6d54aa78b..2e15c1ed8 100644 --- a/Source/test/runTest.ts +++ b/Source/test/runTest.ts @@ -3,21 +3,21 @@ import * as path from "path"; import { runTests } from "vscode-test"; async function main() { - try { - // The folder containing the Extension Manifest package.json - // Passed to `--extensionDevelopmentPath` - const extensionDevelopmentPath = path.resolve(__dirname, "../../"); + try { + // The folder containing the Extension Manifest package.json + // Passed to `--extensionDevelopmentPath` + const extensionDevelopmentPath = path.resolve(__dirname, "../../"); - // The path to the extension test script - // Passed to --extensionTestsPath - const extensionTestsPath = path.resolve(__dirname, "./suite/index"); + // The path to the extension test script + // Passed to --extensionTestsPath + const extensionTestsPath = path.resolve(__dirname, "./suite/index"); - // Download VS Code, unzip it and run the integration test - await runTests({ extensionDevelopmentPath, extensionTestsPath }); - } catch (err) { - console.error("Failed to run tests"); - process.exit(1); - } + // Download VS Code, unzip it and run the integration test + await runTests({ extensionDevelopmentPath, extensionTestsPath }); + } catch (err) { + console.error("Failed to run tests"); + process.exit(1); + } } main(); diff --git a/Source/test/suite/index.ts b/Source/test/suite/index.ts index c223a6f0d..4ae41bac6 100644 --- a/Source/test/suite/index.ts +++ b/Source/test/suite/index.ts @@ -16,35 +16,35 @@ import * as path from "path"; // tslint:disable-next-line: export-name export function run(): Promise { - // Create the mocha test - const mocha = new Mocha({ - ui: "tdd", - }); - mocha.useColors(true); + // Create the mocha test + const mocha = new Mocha({ + ui: "tdd", + }); + mocha.useColors(true); - const testsRoot = path.resolve(__dirname, ".."); + const testsRoot = path.resolve(__dirname, ".."); - return new Promise((c, e) => { - glob("**/**.test.js", { cwd: testsRoot }, (err, files) => { - if (err) { - return e(err); - } + return new Promise((c, e) => { + glob("**/**.test.js", { cwd: testsRoot }, (err, files) => { + if (err) { + return e(err); + } - // Add files to the test suite - files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); + // Add files to the test suite + files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f))); - try { - // Run the mocha test - mocha.run(failures => { - if (failures > 0) { - e(new Error(`${failures} tests failed.`)); - } else { - c(); - } - }); - } catch (err) { - e(err); - } - }); - }); + try { + // Run the mocha test + mocha.run((failures) => { + if (failures > 0) { + e(new Error(`${failures} tests failed.`)); + } else { + c(); + } + }); + } catch (err) { + e(err); + } + }); + }); } diff --git a/Source/usbDetector.ts b/Source/usbDetector.ts index 6d28bb9fb..073c99c01 100644 --- a/Source/usbDetector.ts +++ b/Source/usbDetector.ts @@ -12,101 +12,101 @@ import * as utils from "./extension_utils/utils"; import { SerialMonitor } from "./serialMonitor"; export class UsbDetector { - public static getInstance(): UsbDetector { - if (!UsbDetector._instance) { - UsbDetector._instance = new UsbDetector(); - } - return UsbDetector._instance; - } - - private static _instance: UsbDetector; - - private _usbDetector: any; - - private _boardDescriptors: any = null; - - private _extensionRoot: string = null; - - private constructor() {} - - public initialize(extensionRoot: string) { - this._extensionRoot = extensionRoot; - } - - public async startListening() { - const workspaceConfig = vscode.workspace.getConfiguration(); - const enableUSBDetection = workspaceConfig.get( - CONFIG_KEYS.ENABLE_USB_DETECTION - ); - - if (os.platform() === "linux" || !enableUSBDetection) { - return; - } - this._usbDetector = require("usb-native").detector; - - if (!this._usbDetector) { - return; - } - - if (this._extensionRoot === null) { - throw new Error("UsbDetector should be initialized before using."); - } - - this._usbDetector.on("add", async (device: any) => { - if (device.vendorId && device.productId) { - const deviceDescriptor = this.getUsbDeviceDescriptor( - utils.convertToHex(device.vendorId, 4), - utils.convertToHex(device.productId, 4), - this._extensionRoot - ); - - // Not supported device for discovery - if (!deviceDescriptor) { - return; - } - - const boardKey = `${deviceDescriptor.package}:${deviceDescriptor.architecture}:${deviceDescriptor.id}`; - // Log that a board was detected - if (!SerialMonitor.getInstance().initialized) { - SerialMonitor.getInstance().initialize(); - } - } - }); - } - - public stopListening() { - if (this._usbDetector) { - this._usbDetector.stopMonitoring(); - } - } - - private getUsbDeviceDescriptor( - vendorId: string, - productId: string, - extensionRoot: string - ): any { - if (!this._boardDescriptors) { - this._boardDescriptors = []; - const fileContent = fs.readFileSync( - path.join(extensionRoot, "misc", "usbmapping.json"), - "utf8" - ); - const boardIndexes: [] = JSON.parse(fileContent); - boardIndexes.forEach((boardIndex: any) => { - boardIndex.boards.forEach((board: any) => { - board.indexFile = boardIndex.index_file; - }); - this._boardDescriptors = this._boardDescriptors.concat( - boardIndex.boards - ); - }); - } - return this._boardDescriptors.find((obj: any) => { - return ( - obj.vid === vendorId && - (obj.pid === productId || - (obj.pid.indexOf && obj.pid.indexOf(productId) >= 0)) - ); - }); - } + public static getInstance(): UsbDetector { + if (!UsbDetector._instance) { + UsbDetector._instance = new UsbDetector(); + } + return UsbDetector._instance; + } + + private static _instance: UsbDetector; + + private _usbDetector: any; + + private _boardDescriptors: any = null; + + private _extensionRoot: string = null; + + private constructor() {} + + public initialize(extensionRoot: string) { + this._extensionRoot = extensionRoot; + } + + public async startListening() { + const workspaceConfig = vscode.workspace.getConfiguration(); + const enableUSBDetection = workspaceConfig.get( + CONFIG_KEYS.ENABLE_USB_DETECTION + ); + + if (os.platform() === "linux" || !enableUSBDetection) { + return; + } + this._usbDetector = require("usb-native").detector; + + if (!this._usbDetector) { + return; + } + + if (this._extensionRoot === null) { + throw new Error("UsbDetector should be initialized before using."); + } + + this._usbDetector.on("add", async (device: any) => { + if (device.vendorId && device.productId) { + const deviceDescriptor = this.getUsbDeviceDescriptor( + utils.convertToHex(device.vendorId, 4), + utils.convertToHex(device.productId, 4), + this._extensionRoot + ); + + // Not supported device for discovery + if (!deviceDescriptor) { + return; + } + + const boardKey = `${deviceDescriptor.package}:${deviceDescriptor.architecture}:${deviceDescriptor.id}`; + // Log that a board was detected + if (!SerialMonitor.getInstance().initialized) { + SerialMonitor.getInstance().initialize(); + } + } + }); + } + + public stopListening() { + if (this._usbDetector) { + this._usbDetector.stopMonitoring(); + } + } + + private getUsbDeviceDescriptor( + vendorId: string, + productId: string, + extensionRoot: string + ): any { + if (!this._boardDescriptors) { + this._boardDescriptors = []; + const fileContent = fs.readFileSync( + path.join(extensionRoot, "misc", "usbmapping.json"), + "utf8" + ); + const boardIndexes: [] = JSON.parse(fileContent); + boardIndexes.forEach((boardIndex: any) => { + boardIndex.boards.forEach((board: any) => { + board.indexFile = boardIndex.index_file; + }); + this._boardDescriptors = this._boardDescriptors.concat( + boardIndex.boards + ); + }); + } + return this._boardDescriptors.find((obj: any) => { + return ( + obj.vid === vendorId && + (obj.pid === productId || + (obj.pid.indexOf && obj.pid.indexOf(productId) >= 0)) + ); + }); + } } diff --git a/Source/view/App.css b/Source/view/App.css index 413e9fcbc..dd11b283b 100644 --- a/Source/view/App.css +++ b/Source/view/App.css @@ -1,16 +1,16 @@ .App { - text-align: center; - display: flex; - justify-content: space-between; + text-align: center; + display: flex; + justify-content: space-between; } .App-main { - background-color: var(--vscode-editor-background); - padding: 0px 0.75em 0px 0.75em; - min-height: 100vh; - width: 100%; - margin-top: 24px; - margin-bottom: 53px; - max-height: 400px; - overflow: scroll; + background-color: var(--vscode-editor-background); + padding: 0px 0.75em 0px 0.75em; + min-height: 100vh; + width: 100%; + margin-top: 24px; + margin-bottom: 53px; + max-height: 400px; + overflow: scroll; } diff --git a/Source/view/App.spec.tsx b/Source/view/App.spec.tsx index 66d6fc9d5..eb12d412f 100644 --- a/Source/view/App.spec.tsx +++ b/Source/view/App.spec.tsx @@ -5,24 +5,24 @@ import * as testRenderer from "react-test-renderer"; import App from "./App"; describe("App component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/App.tsx b/Source/view/App.tsx index 3e540c8d9..4b530406e 100644 --- a/Source/view/App.tsx +++ b/Source/view/App.tsx @@ -4,98 +4,98 @@ import * as React from "react"; import "./App.css"; import { - DEVICE_LIST_KEY, - VIEW_STATE, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_ATTRIBUTES_KEY, - WEBVIEW_TYPES, + DEVICE_LIST_KEY, + VIEW_STATE, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_ATTRIBUTES_KEY, + WEBVIEW_TYPES, } from "./constants"; import { Device } from "./container/device/Device"; import { ViewStateContext } from "./context"; import { GettingStartedPage } from "./pages/gettingStarted"; interface IState { - currentDevice: string; - viewState: VIEW_STATE; - type?: WEBVIEW_TYPES; + currentDevice: string; + viewState: VIEW_STATE; + type?: WEBVIEW_TYPES; } const defaultState = { - currentDevice: DEVICE_LIST_KEY.CPX, - viewState: VIEW_STATE.RUNNING, - type: undefined, + currentDevice: DEVICE_LIST_KEY.CPX, + viewState: VIEW_STATE.RUNNING, + type: undefined, }; class App extends React.Component<{}, IState> { - constructor() { - super({}); - this.state = defaultState; - } - componentDidMount() { - if (document.currentScript) { - const webviewTypeAttribute = document.currentScript.getAttribute( - WEBVIEW_ATTRIBUTES_KEY.TYPE - ) as WEBVIEW_TYPES; - if (webviewTypeAttribute) { - this.setState({ type: webviewTypeAttribute }); - } - if (webviewTypeAttribute === WEBVIEW_TYPES.SIMULATOR) { - const initialDevice = document.currentScript.getAttribute( - WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE - ); + constructor() { + super({}); + this.state = defaultState; + } + componentDidMount() { + if (document.currentScript) { + const webviewTypeAttribute = document.currentScript.getAttribute( + WEBVIEW_ATTRIBUTES_KEY.TYPE + ) as WEBVIEW_TYPES; + if (webviewTypeAttribute) { + this.setState({ type: webviewTypeAttribute }); + } + if (webviewTypeAttribute === WEBVIEW_TYPES.SIMULATOR) { + const initialDevice = document.currentScript.getAttribute( + WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE + ); - if (initialDevice) { - this.setState({ currentDevice: initialDevice }); - window.addEventListener("message", this.handleMessage); - } - } - } - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } + if (initialDevice) { + this.setState({ currentDevice: initialDevice }); + window.addEventListener("message", this.handleMessage); + } + } + } + } + componentWillUnmount() { + window.removeEventListener("message", this.handleMessage); + } - render() { - return ( -
-
- - {this.loadContent()} - -
-
- ); - } - loadContent = () => { - console.log(this.state.type); - switch (this.state.type) { - case WEBVIEW_TYPES.GETTING_STARTED: - return ; - case WEBVIEW_TYPES.SIMULATOR: - return ( - - ); - } - return; - }; + render() { + return ( +
+
+ + {this.loadContent()} + +
+
+ ); + } + loadContent = () => { + console.log(this.state.type); + switch (this.state.type) { + case WEBVIEW_TYPES.GETTING_STARTED: + return ; + case WEBVIEW_TYPES.SIMULATOR: + return ( + + ); + } + return; + }; - handleMessage = (event: any): void => { - const message = event.data; + handleMessage = (event: any): void => { + const message = event.data; - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE: - if (message.active_device !== this.state.currentDevice) { - this.setState({ currentDevice: message.active_device }); - } - break; - case VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE: - this.setState({ viewState: VIEW_STATE.RUNNING }); - break; - case VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE: - this.setState({ viewState: VIEW_STATE.PAUSE }); - break; - } - }; + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE: + if (message.active_device !== this.state.currentDevice) { + this.setState({ currentDevice: message.active_device }); + } + break; + case VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE: + this.setState({ viewState: VIEW_STATE.RUNNING }); + break; + case VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE: + this.setState({ viewState: VIEW_STATE.PAUSE }); + break; + } + }; } export default App; diff --git a/Source/view/components/Button.tsx b/Source/view/components/Button.tsx index db5034b9d..a7df60dc7 100644 --- a/Source/view/components/Button.tsx +++ b/Source/view/components/Button.tsx @@ -2,33 +2,32 @@ import * as React from "react"; import "../styles/Button.css"; export interface IButtonProps { - label: string; - image: any; - focusable: boolean; - styleLabel: string; - width: number; - onClick: (event: React.MouseEvent) => void; + label: string; + image: any; + focusable: boolean; + styleLabel: string; + width: number; + onClick: (event: React.MouseEvent) => void; } // Functional Component render -const Button: React.FC = props => { - const iconSvg: SVGElement = props.image as SVGElement; - const buttonStyle = { width: props.width }; - const tabIndex = props.focusable ? 0 : -1; +const Button: React.FC = (props) => { + const iconSvg: SVGElement = props.image as SVGElement; + const buttonStyle = { width: props.width }; + const tabIndex = props.focusable ? 0 : -1; - return ( - - ); + return ( + + ); }; export default Button; diff --git a/Source/view/components/Dropdown.tsx b/Source/view/components/Dropdown.tsx index e5506383a..16c55e60b 100644 --- a/Source/view/components/Dropdown.tsx +++ b/Source/view/components/Dropdown.tsx @@ -5,31 +5,30 @@ import * as React from "react"; import "../styles/Dropdown.css"; export interface IDropdownProps { - options: string[]; - // styleLabel: string; - name: string; - onSelect?: (event: React.ChangeEvent) => void; + options: string[]; + // styleLabel: string; + name: string; + onSelect?: (event: React.ChangeEvent) => void; } -export const Dropdown: React.FC = props => { - return ( - - ); +export const Dropdown: React.FC = (props) => { + return ( + + ); }; const renderOptions = (options: string[]) => { - return options.map((name, index) => { - return ( - - ); - }); + return options.map((name, index) => { + return ( + + ); + }); }; diff --git a/Source/view/components/clue/Clue.spec.tsx b/Source/view/components/clue/Clue.spec.tsx index 55d065bce..e9a6e6c7d 100644 --- a/Source/view/components/clue/Clue.spec.tsx +++ b/Source/view/components/clue/Clue.spec.tsx @@ -5,25 +5,25 @@ import * as testRenderer from "react-test-renderer"; import { Clue } from "./Clue"; describe("Clue component", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/components/clue/Clue.tsx b/Source/view/components/clue/Clue.tsx index 552ff54c3..e587a23bc 100644 --- a/Source/view/components/clue/Clue.tsx +++ b/Source/view/components/clue/Clue.tsx @@ -3,10 +3,10 @@ import * as React from "react"; import { - GESTURES_CLUE, - SENSOR_LIST, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, + GESTURES_CLUE, + SENSOR_LIST, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_MESSAGES, } from "../../constants"; import "../../styles/Simulator.css"; import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; @@ -17,142 +17,142 @@ import { ClueSimulator } from "./ClueSimulator"; // Component grouping the functionality for micro:bit functionalities interface IState { - sensors: { [key: string]: number }; - currentSelectedGesture: string; + sensors: { [key: string]: number }; + currentSelectedGesture: string; } const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT_R]: 0, - [SENSOR_LIST.LIGHT_G]: 0, - [SENSOR_LIST.LIGHT_B]: 0, - [SENSOR_LIST.LIGHT_C]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - [SENSOR_LIST.HUMIDITY]: 0, - [SENSOR_LIST.PRESSURE]: 1013, - [SENSOR_LIST.PROXIMITY]: 0, - [SENSOR_LIST.GYRO_X]: 0, - [SENSOR_LIST.GYRO_Y]: 0, - [SENSOR_LIST.GYRO_Z]: 0, - [SENSOR_LIST.MAGNET_X]: 0, - [SENSOR_LIST.MAGNET_Y]: 0, - [SENSOR_LIST.MAGNET_Z]: 0, - }, - currentSelectedGesture: GESTURES_CLUE[0], + sensors: { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT_R]: 0, + [SENSOR_LIST.LIGHT_G]: 0, + [SENSOR_LIST.LIGHT_B]: 0, + [SENSOR_LIST.LIGHT_C]: 0, + [SENSOR_LIST.MOTION_X]: 0, + [SENSOR_LIST.MOTION_Y]: 0, + [SENSOR_LIST.MOTION_Z]: 0, + [SENSOR_LIST.HUMIDITY]: 0, + [SENSOR_LIST.PRESSURE]: 1013, + [SENSOR_LIST.PROXIMITY]: 0, + [SENSOR_LIST.GYRO_X]: 0, + [SENSOR_LIST.GYRO_Y]: 0, + [SENSOR_LIST.GYRO_Z]: 0, + [SENSOR_LIST.MAGNET_X]: 0, + [SENSOR_LIST.MAGNET_Y]: 0, + [SENSOR_LIST.MAGNET_Z]: 0, + }, + currentSelectedGesture: GESTURES_CLUE[0], }; export class Clue extends React.Component<{}, IState> { - state = DEFAULT_STATE; + state = DEFAULT_STATE; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + handleMessage = (event: any): void => { + const message = event.data; - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; - updateGesture = (event: React.ChangeEvent) => { - this.setState({ currentSelectedGesture: event.target.value }); - }; - sendGesture = (isActive: boolean) => { - if (this.state.currentSelectedGesture) { - if (isActive) { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: this.state.currentSelectedGesture, - }); - } else { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: "", - }); - } - } - }; + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.RESET: + this.setState({ ...DEFAULT_STATE }); + break; + } + }; + render() { + return ( + + + + + ); + } + updateSensor = (sensor: SENSOR_LIST, value: number) => { + this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); + }; + updateGesture = (event: React.ChangeEvent) => { + this.setState({ currentSelectedGesture: event.target.value }); + }; + sendGesture = (isActive: boolean) => { + if (this.state.currentSelectedGesture) { + if (isActive) { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: this.state.currentSelectedGesture, + }); + } else { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: "", + }); + } + } + }; } const CLUE_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - label: CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.LEDS, - image: TOOLBAR_SVG.NEO_PIXEL_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.TEMPERATURE, - image: TOOLBAR_SVG.TEMPERATURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.LIGHT, - image: TOOLBAR_SVG.LIGHT_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, - image: TOOLBAR_SVG.MOTION_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.HUMIDITY, - image: TOOLBAR_SVG.HUMIDITY_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.PRESSURE, - image: TOOLBAR_SVG.PRESSURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.PROXIMITY, - image: TOOLBAR_SVG.PROXIMITY_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GESTURE, - image: TOOLBAR_SVG.GESTURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GYROSCOPE, - image: TOOLBAR_SVG.GYROSCOPE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, - image: TOOLBAR_SVG.MAGNET_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GPIO, - image: TOOLBAR_SVG.GPIO_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.SOUND, - image: TOOLBAR_SVG.SOUND_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.SPEAKER, - image: TOOLBAR_SVG.SPEAKER_SVG, - }, + { + label: CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, + image: TOOLBAR_SVG.PUSH_BUTTON_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.LEDS, + image: TOOLBAR_SVG.NEO_PIXEL_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.TEMPERATURE, + image: TOOLBAR_SVG.TEMPERATURE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.LIGHT, + image: TOOLBAR_SVG.LIGHT_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, + image: TOOLBAR_SVG.MOTION_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.HUMIDITY, + image: TOOLBAR_SVG.HUMIDITY_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.PRESSURE, + image: TOOLBAR_SVG.PRESSURE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.PROXIMITY, + image: TOOLBAR_SVG.PROXIMITY_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.GESTURE, + image: TOOLBAR_SVG.GESTURE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.GYROSCOPE, + image: TOOLBAR_SVG.GYROSCOPE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, + image: TOOLBAR_SVG.MAGNET_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.GPIO, + image: TOOLBAR_SVG.GPIO_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.SOUND, + image: TOOLBAR_SVG.SOUND_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.SPEAKER, + image: TOOLBAR_SVG.SPEAKER_SVG, + }, ]; diff --git a/Source/view/components/clue/ClueImage.tsx b/Source/view/components/clue/ClueImage.tsx index b3c3edcf2..7bbecc68e 100644 --- a/Source/view/components/clue/ClueImage.tsx +++ b/Source/view/components/clue/ClueImage.tsx @@ -8,149 +8,149 @@ import { ViewStateContext } from "../../context"; import { ClueSvg, IRefObject } from "./Clue_svg"; interface EventTriggers { - onMouseUp: (event: Event, buttonKey: string) => void; - onMouseDown: (event: Event, buttonKey: string) => void; - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; + onMouseUp: (event: Event, buttonKey: string) => void; + onMouseDown: (event: Event, buttonKey: string) => void; + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; } interface IProps { - eventTriggers: EventTriggers; - displayMessage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; + eventTriggers: EventTriggers; + displayMessage: string; + leds: { + neopixel: number[]; + isRedLedOn: boolean; + isWhiteLedOn: boolean; + }; } export enum BUTTONS_KEYS { - BTN_A = "BTN_A", - BTN_B = "BTN_B", - BTN_AB = "BTN_AB", + BTN_A = "BTN_A", + BTN_B = "BTN_B", + BTN_AB = "BTN_AB", } // Displays the SVG and call necessary svg modification. export class ClueImage extends React.Component { - private svgRef: React.RefObject = React.createRef(); - constructor(props: IProps) { - super(props); - } - componentDidMount() { - const svgElement = this.svgRef.current; - if (svgElement) { - setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); - this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); - } - } - componentDidUpdate() { - if (this.context === VIEW_STATE.PAUSE && this.svgRef.current) { - disableAllButtons(this.svgRef.current.getButtons()); - } else if (this.context === VIEW_STATE.RUNNING && this.svgRef.current) { - setupAllButtons( - this.props.eventTriggers, - this.svgRef.current.getButtons() - ); - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.eventTriggers.onKeyEvent(event, true, event.key); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.eventTriggers.onKeyEvent(event, false, event.key); - }; - render() { - return ( - - ); - } - public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { - const button = this.svgRef.current?.getButtons()[key].current; - if (button) { - button.focus(); - if (isActive) { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.KEYPRESSED - ); - } else { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.DEFAULT - ); - } - button.setAttribute("pressed", `${isActive}`); - button.setAttribute("aria-pressed", `${isActive}`); - } - } + private svgRef: React.RefObject = React.createRef(); + constructor(props: IProps) { + super(props); + } + componentDidMount() { + const svgElement = this.svgRef.current; + if (svgElement) { + setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); + this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); + } + } + componentDidUpdate() { + if (this.context === VIEW_STATE.PAUSE && this.svgRef.current) { + disableAllButtons(this.svgRef.current.getButtons()); + } else if (this.context === VIEW_STATE.RUNNING && this.svgRef.current) { + setupAllButtons( + this.props.eventTriggers, + this.svgRef.current.getButtons() + ); + } + } + componentWillUnmount() { + window.document.removeEventListener("keydown", this.handleKeyDown); + window.document.removeEventListener("keyup", this.handleKeyUp); + } + setupKeyPresses = ( + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void + ) => { + window.document.addEventListener("keydown", this.handleKeyDown); + window.document.addEventListener("keyup", this.handleKeyUp); + }; + handleKeyDown = (event: KeyboardEvent) => { + const keyEvents = [event.key, event.code]; + // Don't listen to keydown events for the run button, restart button and enter key + if ( + !( + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) + ) + ) { + this.props.eventTriggers.onKeyEvent(event, true, event.key); + } + }; + handleKeyUp = (event: KeyboardEvent) => { + this.props.eventTriggers.onKeyEvent(event, false, event.key); + }; + render() { + return ( + + ); + } + public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { + const button = this.svgRef.current?.getButtons()[key].current; + if (button) { + button.focus(); + if (isActive) { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.KEYPRESSED + ); + } else { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.DEFAULT + ); + } + button.setAttribute("pressed", `${isActive}`); + button.setAttribute("aria-pressed", `${isActive}`); + } + } } ClueImage.contextType = ViewStateContext; const setupButton = ( - buttonElement: SVGRectElement, - eventTriggers: EventTriggers, - key: string + buttonElement: SVGRectElement, + eventTriggers: EventTriggers, + key: string ) => { - buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); - buttonElement.onmousedown = e => { - buttonElement.focus(); - eventTriggers.onMouseDown(e, key); - }; - buttonElement.onmouseup = e => { - eventTriggers.onMouseUp(e, key); - }; + buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); + buttonElement.onmousedown = (e) => { + buttonElement.focus(); + eventTriggers.onMouseDown(e, key); + }; + buttonElement.onmouseup = (e) => { + eventTriggers.onMouseUp(e, key); + }; - buttonElement.onkeydown = e => { - // ensure that the keydown is enter, - // or else it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - eventTriggers.onKeyEvent(e, true, key); - } - }; - buttonElement.onkeyup = e => { - eventTriggers.onKeyEvent(e, false, key); - }; + buttonElement.onkeydown = (e) => { + // ensure that the keydown is enter, + // or else it may register shortcuts twice + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + eventTriggers.onKeyEvent(e, true, key); + } + }; + buttonElement.onkeyup = (e) => { + eventTriggers.onKeyEvent(e, false, key); + }; }; const setupAllButtons = ( - eventTriggers: EventTriggers, - buttonRefs: IRefObject + eventTriggers: EventTriggers, + buttonRefs: IRefObject ) => { - for (const [key, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - setupButton(ref.current, eventTriggers, key); - } - } + for (const [key, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + setupButton(ref.current, eventTriggers, key); + } + } }; const disableAllButtons = (buttonRefs: IRefObject) => { - for (const [, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - // to implement - ref.current.onmousedown = null; - ref.current.onmouseup = null; - ref.current.onkeydown = null; - ref.current.onkeyup = null; - ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); - } - } + for (const [, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + // to implement + ref.current.onmousedown = null; + ref.current.onmouseup = null; + ref.current.onkeydown = null; + ref.current.onkeyup = null; + ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); + } + } }; diff --git a/Source/view/components/clue/ClueSimulator.tsx b/Source/view/components/clue/ClueSimulator.tsx index a15f101f8..89323e93e 100644 --- a/Source/view/components/clue/ClueSimulator.tsx +++ b/Source/view/components/clue/ClueSimulator.tsx @@ -1,11 +1,11 @@ import * as React from "react"; import { - AB_BUTTONS_KEYS, - CONSTANTS, - DEFAULT_IMG_CLUE, - DEVICE_LIST_KEY, - VIEW_STATE, - WEBVIEW_MESSAGES, + AB_BUTTONS_KEYS, + CONSTANTS, + DEFAULT_IMG_CLUE, + DEVICE_LIST_KEY, + VIEW_STATE, + WEBVIEW_MESSAGES, } from "../../constants"; import { ViewStateContext } from "../../context"; import "../../styles/Simulator.css"; @@ -17,288 +17,288 @@ import ActionBar from "../simulator/ActionBar"; import { BUTTONS_KEYS, ClueImage } from "./ClueImage"; export const DEFAULT_CLUE_STATE: IClueState = { - buttons: { button_a: false, button_b: false }, - displayMessage: DEFAULT_IMG_CLUE, - leds: { - neopixel: [0, 0, 0], - isRedLedOn: false, - isWhiteLedOn: false, - }, + buttons: { button_a: false, button_b: false }, + displayMessage: DEFAULT_IMG_CLUE, + leds: { + neopixel: [0, 0, 0], + isRedLedOn: false, + isWhiteLedOn: false, + }, }; interface IState { - active_editors: string[]; - running_file?: string; - play_button: boolean; - selected_file: string; - clue: IClueState; - currently_selected_file: string; + active_editors: string[]; + running_file?: string; + play_button: boolean; + selected_file: string; + clue: IClueState; + currently_selected_file: string; } interface IClueState { - buttons: { button_a: boolean; button_b: boolean }; - displayMessage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; + buttons: { button_a: boolean; button_b: boolean }; + displayMessage: string; + leds: { + neopixel: number[]; + isRedLedOn: boolean; + isWhiteLedOn: boolean; + }; } export class ClueSimulator extends React.Component { - private imageRef: React.RefObject = React.createRef(); - constructor() { - super({}); - this.state = { - clue: DEFAULT_CLUE_STATE, - play_button: false, - selected_file: "", - active_editors: [], - running_file: undefined, - currently_selected_file: "", - }; - this.onKeyEvent = this.onKeyEvent.bind(this); - } - handleMessage = (event: any): void => { - const message = event.data; - if (message.active_device !== DEVICE_LIST_KEY.CLUE) { - return; - } - switch (message.command) { - case "reset-state": - this.setState({ - clue: DEFAULT_CLUE_STATE, - play_button: false, - }); - break; - case "set-state": - this.handleStateChangeMessage(message); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - clue: { - ...this.state.clue, - displayMessage: DEFAULT_IMG_CLUE, - }, - }); - break; - case "visible-editors": - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } + private imageRef: React.RefObject = React.createRef(); + constructor() { + super({}); + this.state = { + clue: DEFAULT_CLUE_STATE, + play_button: false, + selected_file: "", + active_editors: [], + running_file: undefined, + currently_selected_file: "", + }; + this.onKeyEvent = this.onKeyEvent.bind(this); + } + handleMessage = (event: any): void => { + const message = event.data; + if (message.active_device !== DEVICE_LIST_KEY.CLUE) { + return; + } + switch (message.command) { + case "reset-state": + this.setState({ + clue: DEFAULT_CLUE_STATE, + play_button: false, + }); + break; + case "set-state": + this.handleStateChangeMessage(message); + break; + case "activate-play": + const newRunningFile = this.state.currently_selected_file; + this.setState({ + play_button: !this.state.play_button, + running_file: newRunningFile, + clue: { + ...this.state.clue, + displayMessage: DEFAULT_IMG_CLUE, + }, + }); + break; + case "visible-editors": + this.setState({ + active_editors: message.state.activePythonEditors, + }); + break; + case "current-file": + if (this.state.play_button) { + this.setState({ + currently_selected_file: message.state.running_file, + }); + } else { + this.setState({ + running_file: message.state.running_file, + currently_selected_file: message.state.running_file, + }); + } - break; - } - }; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } + break; + } + }; + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } + componentWillUnmount() { + window.removeEventListener("message", this.handleMessage); + } - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
+ render() { + const playStopImage = this.state.play_button ? StopLogo : PlayLogo; + const playStopLabel = this.state.play_button ? "stop" : "play"; + return ( +
+
+ {this.state.running_file && this.state.play_button + ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) + : CONSTANTS.FILES_PLACEHOLDER} +
-
- -
- -
- ); - } - protected togglePlayClick = () => { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - }; - protected onSelectFile(event: React.FocusEvent) { - this.setState({ - selected_file: event.currentTarget.value, - }); - } - protected refreshSimulatorClick = () => { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - }; - protected handleButtonClick = (key: string, isActive: boolean) => { - let newButtonState = this.state.clue.buttons; - switch (key) { - case AB_BUTTONS_KEYS.BTN_A: - newButtonState.button_a = isActive; - break; - case AB_BUTTONS_KEYS.BTN_B: - newButtonState.button_b = isActive; - break; - case AB_BUTTONS_KEYS.BTN_AB: - newButtonState = { - button_a: isActive, - button_b: isActive, - }; - break; - } - sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); - this.setState({ - clue: { - ...this.state.clue, - buttons: newButtonState, - }, - }); - }; +
+ +
+ +
+ ); + } + protected togglePlayClick = () => { + const button = + window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || + window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { + selected_file: this.state.selected_file, + state: !this.state.play_button, + }); + }; + protected onSelectFile(event: React.FocusEvent) { + this.setState({ + selected_file: event.currentTarget.value, + }); + } + protected refreshSimulatorClick = () => { + const button = window.document.getElementById( + CONSTANTS.ID_NAME.REFRESH_BUTTON + ); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); + }; + protected handleButtonClick = (key: string, isActive: boolean) => { + let newButtonState = this.state.clue.buttons; + switch (key) { + case AB_BUTTONS_KEYS.BTN_A: + newButtonState.button_a = isActive; + break; + case AB_BUTTONS_KEYS.BTN_B: + newButtonState.button_b = isActive; + break; + case AB_BUTTONS_KEYS.BTN_AB: + newButtonState = { + button_a: isActive, + button_b: isActive, + }; + break; + } + sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); + this.setState({ + clue: { + ...this.state.clue, + buttons: newButtonState, + }, + }); + }; - protected onMouseUp = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, false); - }; + protected onMouseUp = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, false); + }; - protected onMouseDown = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, true); - }; + protected onMouseDown = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, true); + }; - protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { - event.stopPropagation(); - if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(key, active); - if (key === BUTTONS_KEYS.BTN_A) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if (key === BUTTONS_KEYS.BTN_B) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if (key === BUTTONS_KEYS.BTN_AB) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } - } - protected handleStateChangeMessage(message: any) { - if (message.state.display_base64 != null) { - this.setState({ - clue: { - ...this.state.clue, - displayMessage: message.state.display_base64, - }, - }); - } else if (message.state.pixels != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - neopixel: message.state.pixels, - }, - }, - }); - } else if (message.state.white_leds != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - isWhiteLedOn: message.state.white_leds, - }, - }, - }); - } else if (message.state.red_led != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - isRedLedOn: message.state.red_led, - }, - }, - }); - } - } + protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { + event.stopPropagation(); + if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(key, active); + if (key === BUTTONS_KEYS.BTN_A) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active + ); + } else if (key === BUTTONS_KEYS.BTN_B) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active + ); + } else if (key === BUTTONS_KEYS.BTN_AB) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active + ); + } + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active + ); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { + this.togglePlayClick(); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { + this.refreshSimulatorClick(); + } + } + protected handleStateChangeMessage(message: any) { + if (message.state.display_base64 != null) { + this.setState({ + clue: { + ...this.state.clue, + displayMessage: message.state.display_base64, + }, + }); + } else if (message.state.pixels != null) { + this.setState({ + clue: { + ...this.state.clue, + leds: { + ...this.state.clue.leds, + neopixel: message.state.pixels, + }, + }, + }); + } else if (message.state.white_leds != null) { + this.setState({ + clue: { + ...this.state.clue, + leds: { + ...this.state.clue.leds, + isWhiteLedOn: message.state.white_leds, + }, + }, + }); + } else if (message.state.red_led != null) { + this.setState({ + clue: { + ...this.state.clue, + leds: { + ...this.state.clue.leds, + isRedLedOn: message.state.red_led, + }, + }, + }); + } + } } ClueSimulator.contextType = ViewStateContext; diff --git a/Source/view/components/clue/Clue_svg.tsx b/Source/view/components/clue/Clue_svg.tsx index b67b1f0f9..2f09d3321 100644 --- a/Source/view/components/clue/Clue_svg.tsx +++ b/Source/view/components/clue/Clue_svg.tsx @@ -7,1178 +7,1169 @@ import "../../styles/SimulatorSvg.css"; import svg from "../cpx/Svg_utils"; import { DEFAULT_CLUE_STATE } from "./ClueSimulator"; export interface IRefObject { - [key: string]: React.RefObject; + [key: string]: React.RefObject; } interface IProps { - displayImage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; + displayImage: string; + leds: { + neopixel: number[]; + isRedLedOn: boolean; + isWhiteLedOn: boolean; + }; } export class ClueSvg extends React.Component { - private svgRef: React.RefObject = React.createRef(); - private ledsRefs = { - neopixel: React.createRef(), - redLed: React.createRef(), - whiteLeds: [ - React.createRef(), - React.createRef(), - ], - }; - private gradientRefs = { - neopixel: React.createRef(), - whiteLed: React.createRef(), - redLed: React.createRef(), - }; + private svgRef: React.RefObject = React.createRef(); + private ledsRefs = { + neopixel: React.createRef(), + redLed: React.createRef(), + whiteLeds: [ + React.createRef(), + React.createRef(), + ], + }; + private gradientRefs = { + neopixel: React.createRef(), + whiteLed: React.createRef(), + redLed: React.createRef(), + }; - private buttonRefs: IRefObject = { - BTN_A: React.createRef(), - BTN_B: React.createRef(), - BTN_AB: React.createRef(), - }; + private buttonRefs: IRefObject = { + BTN_A: React.createRef(), + BTN_B: React.createRef(), + BTN_AB: React.createRef(), + }; - private displayRef: React.RefObject = React.createRef(); + private displayRef: React.RefObject = React.createRef(); - public getSvgRef(): React.RefObject { - return this.svgRef; - } - public getButtons(): IRefObject { - return this.buttonRefs; - } - public getDisplayRef(): React.RefObject { - return this.displayRef; - } - componentDidMount() { - this.updateSvg(); - } - componentDidUpdate() { - this.updateSvg(); - } + public getSvgRef(): React.RefObject { + return this.svgRef; + } + public getButtons(): IRefObject { + return this.buttonRefs; + } + public getDisplayRef(): React.RefObject { + return this.displayRef; + } + componentDidMount() { + this.updateSvg(); + } + componentDidUpdate() { + this.updateSvg(); + } - render() { - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + render() { + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - A+B - - - + + + + + + + + + + + + + + + + + + + + + + + + + + A+B + + + - - - - - - - LIGHT - - - GESTURE - - - P - - R - - - O - - - XIMI - - - T - - - Y - - - - - - - - - - - - - - Red LED - - - - - Neopixel - - - - -
- ); - } - private updateSvg() { - this.updateDisplay(); - this.updateNeopixel(); - this.updateLeds(); - } + + + + + + + LIGHT + + + GESTURE + + + P + + R + + + O + + + XIMI + + + T + + + Y + + + + + + + + + + + + + + Red LED + + + + + Neopixel + + + + +
+ ); + } + private updateSvg() { + this.updateDisplay(); + this.updateNeopixel(); + this.updateLeds(); + } - private updateDisplay() { - if (this.props.displayImage) { - this.displayRef.current?.setAttribute( - "href", - `data:image/png;base64,${this.props.displayImage}` - ); - } - } + private updateDisplay() { + if (this.props.displayImage) { + this.displayRef.current?.setAttribute( + "href", + `data:image/png;base64,${this.props.displayImage}` + ); + } + } - private updateNeopixel() { - const { neopixel } = this.props.leds; - const rgbColor = `rgb(${neopixel[0] + - (255 - neopixel[0]) * CONSTANTS.LED_TINT_FACTOR}, - ${neopixel[1] + - (255 - neopixel[1]) * CONSTANTS.LED_TINT_FACTOR},${neopixel[2] + - (255 - neopixel[2]) * CONSTANTS.LED_TINT_FACTOR})`; + private updateNeopixel() { + const { neopixel } = this.props.leds; + const rgbColor = `rgb(${ + neopixel[0] + (255 - neopixel[0]) * CONSTANTS.LED_TINT_FACTOR + }, + ${neopixel[1] + (255 - neopixel[1]) * CONSTANTS.LED_TINT_FACTOR},${ + neopixel[2] + (255 - neopixel[2]) * CONSTANTS.LED_TINT_FACTOR + })`; - this.ledsRefs.neopixel.current?.setAttribute("fill", rgbColor); + this.ledsRefs.neopixel.current?.setAttribute("fill", rgbColor); - if (neopixel === DEFAULT_CLUE_STATE.leds.neopixel) { - this.gradientRefs.neopixel.current?.setAttribute( - "stop-opacity", - "0" - ); - } else { - this.gradientRefs.neopixel.current?.setAttribute( - "stop-opacity", - "1" - ); - } - this.gradientRefs.neopixel.current?.setAttribute( - "stop-color", - rgbColor - ); - } - private updateLeds() { - // update white led - const { isWhiteLedOn, isRedLedOn } = this.props.leds; + if (neopixel === DEFAULT_CLUE_STATE.leds.neopixel) { + this.gradientRefs.neopixel.current?.setAttribute( + "stop-opacity", + "0" + ); + } else { + this.gradientRefs.neopixel.current?.setAttribute( + "stop-opacity", + "1" + ); + } + this.gradientRefs.neopixel.current?.setAttribute( + "stop-color", + rgbColor + ); + } + private updateLeds() { + // update white led + const { isWhiteLedOn, isRedLedOn } = this.props.leds; - this.ledsRefs.whiteLeds.map( - (ledRef: React.RefObject) => { - svg.setLed( - isWhiteLedOn, - CLUE_LEDS_COLORS.WHITE_LEDS_OFF, - CLUE_LEDS_COLORS.WHITE_LEDS_ON, - ledRef.current, - this.gradientRefs.whiteLed.current - ); - } - ); - svg.setLed( - isRedLedOn, - CLUE_LEDS_COLORS.RED_LED_OFF, - CLUE_LEDS_COLORS.RED_LED_ON, - this.ledsRefs.redLed.current, - this.gradientRefs.redLed.current - ); - } + this.ledsRefs.whiteLeds.map( + (ledRef: React.RefObject) => { + svg.setLed( + isWhiteLedOn, + CLUE_LEDS_COLORS.WHITE_LEDS_OFF, + CLUE_LEDS_COLORS.WHITE_LEDS_ON, + ledRef.current, + this.gradientRefs.whiteLed.current + ); + } + ); + svg.setLed( + isRedLedOn, + CLUE_LEDS_COLORS.RED_LED_OFF, + CLUE_LEDS_COLORS.RED_LED_ON, + this.ledsRefs.redLed.current, + this.gradientRefs.redLed.current + ); + } } diff --git a/Source/view/components/cpx/Accessibility_utils.ts b/Source/view/components/cpx/Accessibility_utils.ts index afdadb2ac..1ce8d7559 100644 --- a/Source/view/components/cpx/Accessibility_utils.ts +++ b/Source/view/components/cpx/Accessibility_utils.ts @@ -3,24 +3,24 @@ // Helpers designed to help to make a simulator accessible. namespace accessibility { - export function makeFocusable(elem: SVGElement): void { - elem.setAttribute("focusable", "true"); - elem.setAttribute("tabindex", "0"); - } + export function makeFocusable(elem: SVGElement): void { + elem.setAttribute("focusable", "true"); + elem.setAttribute("tabindex", "0"); + } - export function setAria( - elem: Element, - role?: string, - label?: string - ): void { - if (role && !elem.hasAttribute("role")) { - elem.setAttribute("role", role); - } + export function setAria( + elem: Element, + role?: string, + label?: string + ): void { + if (role && !elem.hasAttribute("role")) { + elem.setAttribute("role", role); + } - if (label && !elem.hasAttribute("aria-label")) { - elem.setAttribute("aria-label", label); - } - } + if (label && !elem.hasAttribute("aria-label")) { + elem.setAttribute("aria-label", label); + } + } } export default accessibility; diff --git a/Source/view/components/cpx/Cpx.spec.tsx b/Source/view/components/cpx/Cpx.spec.tsx index 3b5bdfb6a..229140637 100644 --- a/Source/view/components/cpx/Cpx.spec.tsx +++ b/Source/view/components/cpx/Cpx.spec.tsx @@ -5,25 +5,25 @@ import * as testRenderer from "react-test-renderer"; import { Cpx } from "./Cpx"; describe("CPX component", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/components/cpx/Cpx.tsx b/Source/view/components/cpx/Cpx.tsx index 02560623a..2da890fac 100644 --- a/Source/view/components/cpx/Cpx.tsx +++ b/Source/view/components/cpx/Cpx.tsx @@ -10,95 +10,95 @@ import Simulator from "./CpxSimulator"; // Component grouping the functionality for circuit playground express const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - }, + sensors: { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT]: 0, + [SENSOR_LIST.MOTION_X]: 0, + [SENSOR_LIST.MOTION_Y]: 0, + [SENSOR_LIST.MOTION_Z]: 0, + }, }; export class Cpx extends React.Component { - state = DEFAULT_STATE; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } + state = DEFAULT_STATE; + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + handleMessage = (event: any): void => { + const message = event.data; - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.RESET: + this.setState({ ...DEFAULT_STATE }); + break; + } + }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; + render() { + return ( + + + + + ); + } + updateSensor = (sensor: SENSOR_LIST, value: number) => { + this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); + }; } const CPX_TOOLBAR_BUTTONS: Array<{ label: any; image: any }> = [ - { - image: TOOLBAR_SVG.SLIDER_SWITCH_SVG, - label: CPX_TOOLBAR_ICON_ID.SWITCH, - }, - { - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - label: CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, - }, - { - image: TOOLBAR_SVG.RED_LED_SVG, - label: CPX_TOOLBAR_ICON_ID.RED_LED, - }, - { - image: TOOLBAR_SVG.SOUND_SVG, - label: CPX_TOOLBAR_ICON_ID.SOUND, - }, - { - image: TOOLBAR_SVG.TEMPERATURE_SVG, - label: CPX_TOOLBAR_ICON_ID.TEMPERATURE, - }, - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: CPX_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.NEO_PIXEL_SVG, - label: CPX_TOOLBAR_ICON_ID.NEO_PIXEL, - }, - { - image: TOOLBAR_SVG.SPEAKER_SVG, - label: CPX_TOOLBAR_ICON_ID.SPEAKER, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: CPX_TOOLBAR_ICON_ID.MOTION, - }, - { - image: TOOLBAR_SVG.IR_SVG, - label: CPX_TOOLBAR_ICON_ID.IR, - }, - { - image: TOOLBAR_SVG.GPIO_SVG, - label: CPX_TOOLBAR_ICON_ID.GPIO, - }, + { + image: TOOLBAR_SVG.SLIDER_SWITCH_SVG, + label: CPX_TOOLBAR_ICON_ID.SWITCH, + }, + { + image: TOOLBAR_SVG.PUSH_BUTTON_SVG, + label: CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, + }, + { + image: TOOLBAR_SVG.RED_LED_SVG, + label: CPX_TOOLBAR_ICON_ID.RED_LED, + }, + { + image: TOOLBAR_SVG.SOUND_SVG, + label: CPX_TOOLBAR_ICON_ID.SOUND, + }, + { + image: TOOLBAR_SVG.TEMPERATURE_SVG, + label: CPX_TOOLBAR_ICON_ID.TEMPERATURE, + }, + { + image: TOOLBAR_SVG.LIGHT_SVG, + label: CPX_TOOLBAR_ICON_ID.LIGHT, + }, + { + image: TOOLBAR_SVG.NEO_PIXEL_SVG, + label: CPX_TOOLBAR_ICON_ID.NEO_PIXEL, + }, + { + image: TOOLBAR_SVG.SPEAKER_SVG, + label: CPX_TOOLBAR_ICON_ID.SPEAKER, + }, + { + image: TOOLBAR_SVG.MOTION_SVG, + label: CPX_TOOLBAR_ICON_ID.MOTION, + }, + { + image: TOOLBAR_SVG.IR_SVG, + label: CPX_TOOLBAR_ICON_ID.IR, + }, + { + image: TOOLBAR_SVG.GPIO_SVG, + label: CPX_TOOLBAR_ICON_ID.GPIO, + }, ]; diff --git a/Source/view/components/cpx/CpxImage.tsx b/Source/view/components/cpx/CpxImage.tsx index 48aef4e64..b56b7a31c 100644 --- a/Source/view/components/cpx/CpxImage.tsx +++ b/Source/view/components/cpx/CpxImage.tsx @@ -9,398 +9,400 @@ import * as SvgStyle from "./Cpx_svg_style"; import svg from "./Svg_utils"; interface IProps { - pixels: number[][]; - red_led: boolean; - brightness: number; - switch: boolean; - on: boolean; - onKeyEvent: (event: KeyboardEvent, active: boolean) => void; - onMouseUp: (button: HTMLElement, event: Event) => void; - onMouseDown: (button: HTMLElement, event: Event) => void; - onMouseLeave: (button: HTMLElement, event: Event) => void; + pixels: number[][]; + red_led: boolean; + brightness: number; + switch: boolean; + on: boolean; + onKeyEvent: (event: KeyboardEvent, active: boolean) => void; + onMouseUp: (button: HTMLElement, event: Event) => void; + onMouseDown: (button: HTMLElement, event: Event) => void; + onMouseLeave: (button: HTMLElement, event: Event) => void; } export class CpxImage extends React.Component { - componentDidMount() { - const svgElement = window.document.getElementById("cpx_svg"); - if (svgElement) { - initSvgStyle(svgElement, this.props.brightness); - setupButtons(this.props); - setupPins(this.props); - this.setupKeyPresses(this.props.onKeyEvent); - setupSwitch(this.props); - this.updateImage(); - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - componentDidUpdate() { - this.updateImage(); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the switch, run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.S) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.onKeyEvent(event, true); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.onKeyEvent(event, false); - }; - render() { - return CPX_SVG; - } - private updateImage() { - updateNeopixels(this.props); - updateRedLED(this.props.red_led); - updatePowerLED(this.props.on); - updateSwitch(this.props.switch); - } + componentDidMount() { + const svgElement = window.document.getElementById("cpx_svg"); + if (svgElement) { + initSvgStyle(svgElement, this.props.brightness); + setupButtons(this.props); + setupPins(this.props); + this.setupKeyPresses(this.props.onKeyEvent); + setupSwitch(this.props); + this.updateImage(); + } + } + componentWillUnmount() { + window.document.removeEventListener("keydown", this.handleKeyDown); + window.document.removeEventListener("keyup", this.handleKeyUp); + } + componentDidUpdate() { + this.updateImage(); + } + setupKeyPresses = ( + onKeyEvent: (event: KeyboardEvent, active: boolean) => void + ) => { + window.document.addEventListener("keydown", this.handleKeyDown); + window.document.addEventListener("keyup", this.handleKeyUp); + }; + + handleKeyDown = (event: KeyboardEvent) => { + const keyEvents = [event.key, event.code]; + // Don't listen to keydown events for the switch, run button, restart button and enter key + if ( + !( + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.S) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) + ) + ) { + this.props.onKeyEvent(event, true); + } + }; + handleKeyUp = (event: KeyboardEvent) => { + this.props.onKeyEvent(event, false); + }; + render() { + return CPX_SVG; + } + private updateImage() { + updateNeopixels(this.props); + updateRedLED(this.props.red_led); + updatePowerLED(this.props.on); + updateSwitch(this.props.switch); + } } const makeButton = ( - g: SVGElement, - left: number, - top: number, - id: string + g: SVGElement, + left: number, + top: number, + id: string ): { outer: SVGElement; inner: SVGElement } => { - const buttonCornerRadius = SvgStyle.BUTTON_CORNER_RADIUS; - const buttonWidth = SvgStyle.BUTTON_WIDTH; - const buttonCircleRadius = SvgStyle.BUTTON_CIRCLE_RADIUS; - const btng = svg.child(g, "g", { class: "sim-button-group" }); - svg.child(btng, "rect", { - fill: SvgStyle.BUTTON_OUTER, - height: buttonWidth, - id: id + "_OUTER", - rx: buttonCornerRadius, - ry: buttonCornerRadius, - width: buttonWidth, - x: left, - y: top, - }); - - const outer = btng; - const inner = svg.child(btng, "circle", { - id: id + "_INNER", - cx: left + buttonWidth / 2, - cy: top + buttonWidth / 2, - r: buttonCircleRadius, - fill: SvgStyle.BUTTON_NEUTRAL, - }); - - return { outer, inner }; + const buttonCornerRadius = SvgStyle.BUTTON_CORNER_RADIUS; + const buttonWidth = SvgStyle.BUTTON_WIDTH; + const buttonCircleRadius = SvgStyle.BUTTON_CIRCLE_RADIUS; + const btng = svg.child(g, "g", { class: "sim-button-group" }); + svg.child(btng, "rect", { + fill: SvgStyle.BUTTON_OUTER, + height: buttonWidth, + id: id + "_OUTER", + rx: buttonCornerRadius, + ry: buttonCornerRadius, + width: buttonWidth, + x: left, + y: top, + }); + + const outer = btng; + const inner = svg.child(btng, "circle", { + id: id + "_INNER", + cx: left + buttonWidth / 2, + cy: top + buttonWidth / 2, + r: buttonCircleRadius, + fill: SvgStyle.BUTTON_NEUTRAL, + }); + + return { outer, inner }; }; const initSvgStyle = (svgElement: HTMLElement, brightness: number): void => { - const style: SVGStyleElement = svg.child( - svgElement, - "style", - {} - ) as SVGStyleElement; - style.textContent = SvgStyle.SVG_STYLE; - - // Filters for the glow effect (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) - const defs: SVGDefsElement = svg.child( - svgElement, - "defs", - {} - ) as SVGDefsElement; - - const g = svg.createElement("g") as SVGElement; - svgElement.appendChild(g); - - const glow = svg.child(defs, "filter", { - height: "120%", - id: "filterglow", - width: "120%", - x: "-5%", - y: "-5%", - }); - svg.child(glow, "feGaussianBlur", { stdDeviation: "5", result: "glow" }); - const merge = svg.child(glow, "feMerge", {}); - for (let i = 0; i < 3; ++i) { - svg.child(merge, "feMergeNode", { in: "glow" }); - } - - const neopixelglow = svg.child(defs, "filter", { - height: "600%", - id: "neopixelglow", - width: "600%", - x: "-300%", - y: "-300%", - }); - svg.child(neopixelglow, "feGaussianBlur", { - result: "coloredBlur", - stdDeviation: "4.3", - }); - const neopixelmerge = svg.child(neopixelglow, "feMerge", {}); - svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); - svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); - svg.child(neopixelmerge, "feMergeNode", { in: "SourceGraphic" }); - - // Brightness - const neopixelfeComponentTransfer = svg.child( - neopixelglow, - "feComponentTransfer", - {} - ); - svg.child(neopixelfeComponentTransfer, "feFuncR", { - id: "brightnessFilterR", - type: "linear", - slope: brightness, - }); - svg.child(neopixelfeComponentTransfer, "feFuncG", { - id: "brightnessFilterG", - slope: brightness, - type: "linear", - }); - svg.child(neopixelfeComponentTransfer, "feFuncB", { - id: "brightnessFilterB", - slope: brightness, - type: "linear", - }); - - // BTN A+B - const outerBtn = (left: number, top: number, label: string) => { - return makeButton(g, left, top, "BTN_AB"); - }; - - const ab = outerBtn(165, SvgStyle.MB_HEIGHT - 15, "A+B"); - const abtext = svg.child(ab.outer, "text", { - class: "sim-text-outside", - x: SvgStyle.BUTTON_TEXT_BASELINE, - y: SvgStyle.MB_HEIGHT - 18, - }) as SVGTextElement; - abtext.textContent = "A+B"; + const style: SVGStyleElement = svg.child( + svgElement, + "style", + {} + ) as SVGStyleElement; + style.textContent = SvgStyle.SVG_STYLE; + + // Filters for the glow effect (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) + const defs: SVGDefsElement = svg.child( + svgElement, + "defs", + {} + ) as SVGDefsElement; + + const g = svg.createElement("g") as SVGElement; + svgElement.appendChild(g); + + const glow = svg.child(defs, "filter", { + height: "120%", + id: "filterglow", + width: "120%", + x: "-5%", + y: "-5%", + }); + svg.child(glow, "feGaussianBlur", { stdDeviation: "5", result: "glow" }); + const merge = svg.child(glow, "feMerge", {}); + for (let i = 0; i < 3; ++i) { + svg.child(merge, "feMergeNode", { in: "glow" }); + } + + const neopixelglow = svg.child(defs, "filter", { + height: "600%", + id: "neopixelglow", + width: "600%", + x: "-300%", + y: "-300%", + }); + svg.child(neopixelglow, "feGaussianBlur", { + result: "coloredBlur", + stdDeviation: "4.3", + }); + const neopixelmerge = svg.child(neopixelglow, "feMerge", {}); + svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); + svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); + svg.child(neopixelmerge, "feMergeNode", { in: "SourceGraphic" }); + + // Brightness + const neopixelfeComponentTransfer = svg.child( + neopixelglow, + "feComponentTransfer", + {} + ); + svg.child(neopixelfeComponentTransfer, "feFuncR", { + id: "brightnessFilterR", + type: "linear", + slope: brightness, + }); + svg.child(neopixelfeComponentTransfer, "feFuncG", { + id: "brightnessFilterG", + slope: brightness, + type: "linear", + }); + svg.child(neopixelfeComponentTransfer, "feFuncB", { + id: "brightnessFilterB", + slope: brightness, + type: "linear", + }); + + // BTN A+B + const outerBtn = (left: number, top: number, label: string) => { + return makeButton(g, left, top, "BTN_AB"); + }; + + const ab = outerBtn(165, SvgStyle.MB_HEIGHT - 15, "A+B"); + const abtext = svg.child(ab.outer, "text", { + class: "sim-text-outside", + x: SvgStyle.BUTTON_TEXT_BASELINE, + y: SvgStyle.MB_HEIGHT - 18, + }) as SVGTextElement; + abtext.textContent = "A+B"; }; const updateNeopixels = (props: IProps): void => { - for (let i = 0; i < props.pixels.length; i++) { - const led = window.document.getElementById(`NEOPIXEL_${i}`); - if (led) { - setNeopixel(led, props.pixels[i], props.brightness); - } - } + for (let i = 0; i < props.pixels.length; i++) { + const led = window.document.getElementById(`NEOPIXEL_${i}`); + if (led) { + setNeopixel(led, props.pixels[i], props.brightness); + } + } }; const updateRedLED = (propsRedLED: boolean): void => { - const redLED = window.document.getElementById("SERIAL_LED"); - if (redLED) { - redLED.style.fill = propsRedLED - ? SvgStyle.RED_LED_ON - : SvgStyle.RED_LED_OFF; - } + const redLED = window.document.getElementById("SERIAL_LED"); + if (redLED) { + redLED.style.fill = propsRedLED + ? SvgStyle.RED_LED_ON + : SvgStyle.RED_LED_OFF; + } }; const updatePowerLED = (propsPowerLED: boolean): void => { - const powerLED = window.document.getElementById("PWR_LED"); - if (powerLED) { - powerLED.style.fill = propsPowerLED - ? SvgStyle.POWER_LED_ON - : SvgStyle.POWER_LED_OFF; - } + const powerLED = window.document.getElementById("PWR_LED"); + if (powerLED) { + powerLED.style.fill = propsPowerLED + ? SvgStyle.POWER_LED_ON + : SvgStyle.POWER_LED_OFF; + } }; const setNeopixel = ( - led: HTMLElement, - pixValue: number[], - brightness: number + led: HTMLElement, + pixValue: number[], + brightness: number ): void => { - if (isLightOn(pixValue) && brightness > 0) { - // Neopixels style (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) - changeBrightness("brightnessFilterR", brightness); - changeBrightness("brightnessFilterG", brightness); - changeBrightness("brightnessFilterB", brightness); - - let [hue, sat, lum] = SvgStyle.rgbToHsl([ - pixValue[0], - pixValue[1], - pixValue[2], - ]); - const innerLum = Math.max( - lum * SvgStyle.INTENSITY_FACTOR, - SvgStyle.MIN_INNER_LUM - ); - lum = (lum * 90) / 100 + 10; // at least 10% luminosity for the stroke - - led.style.filter = `url(#neopixelglow)`; - led.style.fill = `hsl(${hue}, ${sat}%, ${innerLum}%)`; - led.style.stroke = `hsl(${hue}, ${sat}%, ${Math.min( - lum * 3, - SvgStyle.MAX_STROKE_LUM - )}%)`; - led.style.strokeWidth = `1.5`; - } else { - led.style.fill = SvgStyle.OFF_COLOR; - led.style.filter = `none`; - led.style.stroke = `none`; - } + if (isLightOn(pixValue) && brightness > 0) { + // Neopixels style (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) + changeBrightness("brightnessFilterR", brightness); + changeBrightness("brightnessFilterG", brightness); + changeBrightness("brightnessFilterB", brightness); + + let [hue, sat, lum] = SvgStyle.rgbToHsl([ + pixValue[0], + pixValue[1], + pixValue[2], + ]); + const innerLum = Math.max( + lum * SvgStyle.INTENSITY_FACTOR, + SvgStyle.MIN_INNER_LUM + ); + lum = (lum * 90) / 100 + 10; // at least 10% luminosity for the stroke + + led.style.filter = `url(#neopixelglow)`; + led.style.fill = `hsl(${hue}, ${sat}%, ${innerLum}%)`; + led.style.stroke = `hsl(${hue}, ${sat}%, ${Math.min( + lum * 3, + SvgStyle.MAX_STROKE_LUM + )}%)`; + led.style.strokeWidth = `1.5`; + } else { + led.style.fill = SvgStyle.OFF_COLOR; + led.style.filter = `none`; + led.style.stroke = `none`; + } }; const isLightOn = (pixValue: number[]): boolean => { - return !pixValue.every(val => { - return val === 0; - }); + return !pixValue.every((val) => { + return val === 0; + }); }; const changeBrightness = (filterID: string, brightness: number): void => { - const brightnessFilter: HTMLElement | null = window.document.getElementById( - filterID - ); - if (brightnessFilter) { - brightnessFilter.setAttribute("slope", brightness.toString()); - } + const brightnessFilter: HTMLElement | null = + window.document.getElementById(filterID); + if (brightnessFilter) { + brightnessFilter.setAttribute("slope", brightness.toString()); + } }; const setupButtons = (props: IProps): void => { - const outButtons = ["A_OUTER", "B_OUTER", "AB_OUTER"]; - const inButtons = ["A_INNER", "B_INNER", "AB_INNER"]; - outButtons.forEach(buttonName => { - const button = window.document.getElementById("BTN_" + buttonName); - - if (button) { - setupButton(button, "sim-button-outer", props); - } - }); - inButtons.forEach(buttonName => { - const button = window.document.getElementById("BTN_" + buttonName); - if (button) { - setupButton(button, "sim-button", props); - } - }); + const outButtons = ["A_OUTER", "B_OUTER", "AB_OUTER"]; + const inButtons = ["A_INNER", "B_INNER", "AB_INNER"]; + outButtons.forEach((buttonName) => { + const button = window.document.getElementById("BTN_" + buttonName); + + if (button) { + setupButton(button, "sim-button-outer", props); + } + }); + inButtons.forEach((buttonName) => { + const button = window.document.getElementById("BTN_" + buttonName); + if (button) { + setupButton(button, "sim-button", props); + } + }); }; const setupPins = (props: IProps): void => { - const pins = [ - "PIN_A1", - "PIN_A2", - "PIN_A3", - "PIN_A4", - "PIN_A5", - "PIN_A6", - "PIN_A7", - ]; - pins.forEach(pinName => { - const pin = window.document.getElementById(pinName); - - if (pin) { - const svgPin = (pin as unknown) as SVGElement; - svg.addClass(svgPin, `sim-${pinName}-touch`); - accessibility.makeFocusable(svgPin); - svgPin.onmouseup = e => props.onMouseUp(pin, e); - svgPin.onkeyup = e => props.onKeyEvent(e, false); - svgPin.onmousedown = e => props.onMouseDown(pin, e); - svgPin.onkeydown = e => props.onKeyEvent(e, true); - accessibility.setAria( - svgPin, - "button", - `Touch pin ${pinName.substr(pinName.length - 2)}` - ); - } - }); + const pins = [ + "PIN_A1", + "PIN_A2", + "PIN_A3", + "PIN_A4", + "PIN_A5", + "PIN_A6", + "PIN_A7", + ]; + pins.forEach((pinName) => { + const pin = window.document.getElementById(pinName); + + if (pin) { + const svgPin = pin as unknown as SVGElement; + svg.addClass(svgPin, `sim-${pinName}-touch`); + accessibility.makeFocusable(svgPin); + svgPin.onmouseup = (e) => props.onMouseUp(pin, e); + svgPin.onkeyup = (e) => props.onKeyEvent(e, false); + svgPin.onmousedown = (e) => props.onMouseDown(pin, e); + svgPin.onkeydown = (e) => props.onKeyEvent(e, true); + accessibility.setAria( + svgPin, + "button", + `Touch pin ${pinName.substr(pinName.length - 2)}` + ); + } + }); }; const addButtonLabels = (button: HTMLElement) => { - let label = ""; - if (button.id.match(/AB/) !== null) { - label = "a+b"; - } else if (button.id.match(/A/) !== null) { - label = "a"; - } else if (button.id.match(/B/) !== null) { - label = "b"; - } - accessibility.setAria(button, "button", label); + let label = ""; + if (button.id.match(/AB/) !== null) { + label = "a+b"; + } else if (button.id.match(/A/) !== null) { + label = "a"; + } else if (button.id.match(/B/) !== null) { + label = "b"; + } + accessibility.setAria(button, "button", label); }; const setupButton = (button: HTMLElement, className: string, props: IProps) => { - const svgButton = (button as unknown) as SVGElement; - svg.addClass(svgButton, className); - addButtonLabels(button); - if (className.match(/outer/) !== null) { - accessibility.makeFocusable(svgButton); - } - svgButton.onmousedown = e => props.onMouseDown(button, e); - svgButton.onmouseup = e => props.onMouseUp(button, e); - svgButton.onkeydown = e => { - // ensure that the keydown is enter. - // Or else, if the key is a shortcut instead, - // it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - props.onKeyEvent(e, true); - } - }; - svgButton.onkeyup = e => props.onKeyEvent(e, false); - svgButton.onmouseleave = e => props.onMouseLeave(button, e); + const svgButton = button as unknown as SVGElement; + svg.addClass(svgButton, className); + addButtonLabels(button); + if (className.match(/outer/) !== null) { + accessibility.makeFocusable(svgButton); + } + svgButton.onmousedown = (e) => props.onMouseDown(button, e); + svgButton.onmouseup = (e) => props.onMouseUp(button, e); + svgButton.onkeydown = (e) => { + // ensure that the keydown is enter. + // Or else, if the key is a shortcut instead, + // it may register shortcuts twice + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + props.onKeyEvent(e, true); + } + }; + svgButton.onkeyup = (e) => props.onKeyEvent(e, false); + svgButton.onmouseleave = (e) => props.onMouseLeave(button, e); }; const setupSwitch = (props: IProps): void => { - const switchElement = window.document.getElementById("SWITCH"); - const swInnerElement = window.document.getElementById("SWITCH_INNER"); - const swHousingElement = window.document.getElementById("SWITCH_HOUSING"); - - if (switchElement && swInnerElement && swHousingElement) { - const svgSwitch: SVGElement = (switchElement as unknown) as SVGElement; - const svgSwitchInner: SVGElement = (swInnerElement as unknown) as SVGElement; - const svgSwitchHousing: SVGElement = (swHousingElement as unknown) as SVGElement; - - svg.addClass(svgSwitch, "sim-slide-switch"); - - svgSwitch.onmouseup = e => props.onMouseUp(switchElement, e); - svgSwitchInner.onmouseup = e => props.onMouseUp(swInnerElement, e); - svgSwitchHousing.onmouseup = e => props.onMouseUp(swHousingElement, e); - svgSwitch.onkeyup = e => props.onKeyEvent(e, false); - - accessibility.makeFocusable(svgSwitch); - accessibility.setAria(svgSwitch, "button", "On/Off Switch"); - } + const switchElement = window.document.getElementById("SWITCH"); + const swInnerElement = window.document.getElementById("SWITCH_INNER"); + const swHousingElement = window.document.getElementById("SWITCH_HOUSING"); + + if (switchElement && swInnerElement && swHousingElement) { + const svgSwitch: SVGElement = switchElement as unknown as SVGElement; + const svgSwitchInner: SVGElement = + swInnerElement as unknown as SVGElement; + const svgSwitchHousing: SVGElement = + swHousingElement as unknown as SVGElement; + + svg.addClass(svgSwitch, "sim-slide-switch"); + + svgSwitch.onmouseup = (e) => props.onMouseUp(switchElement, e); + svgSwitchInner.onmouseup = (e) => props.onMouseUp(swInnerElement, e); + svgSwitchHousing.onmouseup = (e) => + props.onMouseUp(swHousingElement, e); + svgSwitch.onkeyup = (e) => props.onKeyEvent(e, false); + + accessibility.makeFocusable(svgSwitch); + accessibility.setAria(svgSwitch, "button", "On/Off Switch"); + } }; export const updateSwitch = (switchState: boolean): void => { - const switchElement = window.document.getElementById("SWITCH"); - const switchInner = (window.document.getElementById( - "SWITCH_INNER" - ) as unknown) as SVGElement; - - if (switchElement && switchInner) { - svg.addClass(switchInner, "sim-slide-switch-inner"); - - if (!switchState) { - svg.addClass(switchInner, "on"); - switchInner.setAttribute("transform", "translate(-5,0)"); - } else { - svg.removeClass(switchInner, "on"); - switchInner.removeAttribute("transform"); - } - switchElement.setAttribute("aria-pressed", switchState.toString()); - } + const switchElement = window.document.getElementById("SWITCH"); + const switchInner = window.document.getElementById( + "SWITCH_INNER" + ) as unknown as SVGElement; + + if (switchElement && switchInner) { + svg.addClass(switchInner, "sim-slide-switch-inner"); + + if (!switchState) { + svg.addClass(switchInner, "on"); + switchInner.setAttribute("transform", "translate(-5,0)"); + } else { + svg.removeClass(switchInner, "on"); + switchInner.removeAttribute("transform"); + } + switchElement.setAttribute("aria-pressed", switchState.toString()); + } }; export const updatePinTouch = (pinState: boolean, id: string): void => { - console.log(`updating ${id} with ${pinState}`); - const pinElement = window.document.getElementById(id); - const pinSvg: SVGElement = (pinElement as unknown) as SVGElement; - - if (pinElement && pinSvg) { - pinElement.setAttribute("aria-pressed", pinState.toString()); - pinState - ? svg.addClass(pinSvg, "pin-pressed") - : svg.removeClass(pinSvg, "pin-pressed"); - } + console.log(`updating ${id} with ${pinState}`); + const pinElement = window.document.getElementById(id); + const pinSvg: SVGElement = pinElement as unknown as SVGElement; + + if (pinElement && pinSvg) { + pinElement.setAttribute("aria-pressed", pinState.toString()); + pinState + ? svg.addClass(pinSvg, "pin-pressed") + : svg.removeClass(pinSvg, "pin-pressed"); + } }; export default CpxImage; diff --git a/Source/view/components/cpx/CpxSimulator.tsx b/Source/view/components/cpx/CpxSimulator.tsx index b0d77f441..7e095043b 100644 --- a/Source/view/components/cpx/CpxSimulator.tsx +++ b/Source/view/components/cpx/CpxSimulator.tsx @@ -13,380 +13,380 @@ import { BUTTON_NEUTRAL, BUTTON_PRESSED } from "./Cpx_svg_style"; import { CpxImage, updatePinTouch, updateSwitch } from "./CpxImage"; interface ICpxState { - pixels: number[][]; - brightness: number; - red_led: boolean; - button_a: boolean; - button_b: boolean; - switch: boolean; - touch: boolean[]; - shake: boolean; + pixels: number[][]; + brightness: number; + red_led: boolean; + button_a: boolean; + button_b: boolean; + switch: boolean; + touch: boolean[]; + shake: boolean; } interface IState { - active_editors: string[]; - running_file: string; - selected_file: string; - cpx: ICpxState; - play_button: boolean; - currently_selected_file: string; + active_editors: string[]; + running_file: string; + selected_file: string; + cpx: ICpxState; + play_button: boolean; + currently_selected_file: string; } const DEFAULT_CPX_STATE: ICpxState = { - brightness: 1.0, - button_a: false, - button_b: false, - pixels: [ - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - ], - red_led: false, - switch: false, - touch: [false, false, false, false, false, false, false], - shake: false, + brightness: 1.0, + button_a: false, + button_b: false, + pixels: [ + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + ], + red_led: false, + switch: false, + touch: [false, false, false, false, false, false, false], + shake: false, }; class Simulator extends React.Component<{}, IState> { - constructor(props: Readonly<{}>) { - super(props); - this.state = { - active_editors: [], - cpx: DEFAULT_CPX_STATE, - play_button: false, - running_file: "", - selected_file: "", - currently_selected_file: "", - }; - - this.handleClick = this.handleClick.bind(this); - this.onKeyEvent = this.onKeyEvent.bind(this); - this.onMouseDown = this.onMouseDown.bind(this); - this.onMouseUp = this.onMouseUp.bind(this); - this.onMouseLeave = this.onMouseLeave.bind(this); - this.togglePlayClick = this.togglePlayClick.bind(this); - this.refreshSimulatorClick = this.refreshSimulatorClick.bind(this); - } - - handleMessage = (event: any): void => { - const message = event.data; // The JSON data our extension sent - if (message.active_device !== DEVICE_LIST_KEY.CPX) { - return; - } - switch (message.command) { - case "reset-state": - console.log("Clearing the state"); - this.setState({ - cpx: DEFAULT_CPX_STATE, - play_button: false, - }); - break; - case "set-state": - console.log( - "Setting the state: " + JSON.stringify(message.state) - ); - this.setState({ - cpx: message.state, - play_button: true, - }); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - }); - break; - case "visible-editors": - console.log( - "Setting active editors", - message.state.activePythonEditors - ); - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - console.log("Setting current file", message.state.running_file); - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } - break; - } - }; - - componentDidMount() { - console.log("Mounted"); - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
-
- -
- -
- ); - } - - protected togglePlayClick() { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - } - - protected refreshSimulatorClick() { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - } - - protected onKeyEvent(event: KeyboardEvent, active: boolean) { - let element; - const target = event.target as SVGElement; - // Guard Clause - if (target === undefined) { - return; - } - - if ([event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER)) { - element = window.document.getElementById(target.id); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_A - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_B - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_AB - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.S) - ) { - element = window.document.getElementById(CONSTANTS.ID_NAME.SWITCH); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } else { - if (event.shiftKey) { - switch (event.code) { - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_ONE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A1 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_TWO: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A2 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_THREE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A3 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FOUR: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A4 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FIVE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A5 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SIX: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A6 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SEVEN: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A7 - ); - break; - } - } - } - if (element) { - event.preventDefault(); - this.handleClick(element, active); - element.focus(); - } - } - protected onMouseDown(button: HTMLElement, event: Event) { - event.preventDefault(); - this.handleClick(button, true); - button.focus(); - } - - protected onMouseUp(button: HTMLElement, event: Event) { - event.preventDefault(); - this.handleClick(button, false); - } - - protected onMouseLeave(button: HTMLElement, event: Event) { - event.preventDefault(); - - if (button.getAttribute("pressed") === "true") { - this.handleClick(button, false); - } - } - - private handleClick(element: HTMLElement, active: boolean) { - let newState; - let message; - if (element.id.includes("BTN")) { - newState = this.handleButtonClick(element, active); - message = "button-press"; - } else if (element.id.includes("SWITCH")) { - newState = this.handleSwitchClick(); - message = "button-press"; - } else if (element.id.includes("PIN")) { - newState = this.handleTouchPinClick(element, active); - message = "sensor-changed"; - } else { - return; - } - - if (newState && message) { - sendMessage(message, newState); - } - } - - private handleButtonClick(button: HTMLElement, active: boolean) { - const ButtonA: boolean = button.id.match(/BTN_A/) !== null; - const ButtonB: boolean = button.id.match(/BTN_B/) !== null; - const ButtonAB: boolean = button.id.match(/BTN_AB/) !== null; - let innerButton; - let newState; - - if (ButtonAB) { - innerButton = window.document.getElementById("BTN_AB_INNER"); - newState = { - button_a: active, - button_b: active, - }; - this.setState({ ...this.state, ...newState }); - } else if (ButtonA) { - innerButton = window.document.getElementById("BTN_A_INNER"); - newState = { - button_a: active, - }; - this.setState({ ...this.state, ...newState }); - } else if (ButtonB) { - innerButton = window.document.getElementById("BTN_B_INNER"); - newState = { - button_b: active, - }; - this.setState({ ...this.state, ...newState }); - } - - if (innerButton) { - innerButton.style.fill = this.getButtonColor(active); - } - - button.setAttribute("pressed", `${active}`); - return newState; - } - - private getButtonColor(pressed: boolean) { - const buttonUps = BUTTON_NEUTRAL; - const buttonDown = BUTTON_PRESSED; - return pressed ? buttonDown : buttonUps; - } - - private handleSwitchClick() { - const switchIsOn = !this.state.cpx.switch; - updateSwitch(switchIsOn); - this.setState({ - ...this.state, - cpx: { ...this.state.cpx, switch: switchIsOn }, - }); - return { switch: switchIsOn }; - } - - private handleTouchPinClick(pin: HTMLElement, active: boolean): any { - let cpxState = this.state.cpx; - const pinIndex = parseInt(pin.id.charAt(pin.id.length - 1)) - 1; - const pinState = cpxState.touch; - pinState[pinIndex] = active; - cpxState = { ...cpxState, touch: pinState }; - this.setState({ ...this.state, ...cpxState }); - updatePinTouch(active, pin.id); - return { touch: pinState }; - } + constructor(props: Readonly<{}>) { + super(props); + this.state = { + active_editors: [], + cpx: DEFAULT_CPX_STATE, + play_button: false, + running_file: "", + selected_file: "", + currently_selected_file: "", + }; + + this.handleClick = this.handleClick.bind(this); + this.onKeyEvent = this.onKeyEvent.bind(this); + this.onMouseDown = this.onMouseDown.bind(this); + this.onMouseUp = this.onMouseUp.bind(this); + this.onMouseLeave = this.onMouseLeave.bind(this); + this.togglePlayClick = this.togglePlayClick.bind(this); + this.refreshSimulatorClick = this.refreshSimulatorClick.bind(this); + } + + handleMessage = (event: any): void => { + const message = event.data; // The JSON data our extension sent + if (message.active_device !== DEVICE_LIST_KEY.CPX) { + return; + } + switch (message.command) { + case "reset-state": + console.log("Clearing the state"); + this.setState({ + cpx: DEFAULT_CPX_STATE, + play_button: false, + }); + break; + case "set-state": + console.log( + "Setting the state: " + JSON.stringify(message.state) + ); + this.setState({ + cpx: message.state, + play_button: true, + }); + break; + case "activate-play": + const newRunningFile = this.state.currently_selected_file; + + this.setState({ + play_button: !this.state.play_button, + running_file: newRunningFile, + }); + break; + case "visible-editors": + console.log( + "Setting active editors", + message.state.activePythonEditors + ); + this.setState({ + active_editors: message.state.activePythonEditors, + }); + break; + case "current-file": + console.log("Setting current file", message.state.running_file); + if (this.state.play_button) { + this.setState({ + currently_selected_file: message.state.running_file, + }); + } else { + this.setState({ + running_file: message.state.running_file, + currently_selected_file: message.state.running_file, + }); + } + break; + } + }; + + componentDidMount() { + console.log("Mounted"); + window.addEventListener("message", this.handleMessage); + } + + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + + render() { + const playStopImage = this.state.play_button ? StopLogo : PlayLogo; + const playStopLabel = this.state.play_button ? "stop" : "play"; + return ( +
+
+ {this.state.running_file && this.state.play_button + ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) + : CONSTANTS.FILES_PLACEHOLDER} +
+
+ +
+ +
+ ); + } + + protected togglePlayClick() { + const button = + window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || + window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { + selected_file: this.state.selected_file, + state: !this.state.play_button, + }); + } + + protected refreshSimulatorClick() { + const button = window.document.getElementById( + CONSTANTS.ID_NAME.REFRESH_BUTTON + ); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); + } + + protected onKeyEvent(event: KeyboardEvent, active: boolean) { + let element; + const target = event.target as SVGElement; + // Guard Clause + if (target === undefined) { + return; + } + + if ([event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER)) { + element = window.document.getElementById(target.id); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) + ) { + element = window.document.getElementById( + CONSTANTS.ID_NAME.BUTTON_A + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) + ) { + element = window.document.getElementById( + CONSTANTS.ID_NAME.BUTTON_B + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) + ) { + element = window.document.getElementById( + CONSTANTS.ID_NAME.BUTTON_AB + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.S) + ) { + element = window.document.getElementById(CONSTANTS.ID_NAME.SWITCH); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { + this.togglePlayClick(); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { + this.refreshSimulatorClick(); + } else { + if (event.shiftKey) { + switch (event.code) { + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_ONE: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A1 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_TWO: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A2 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_THREE: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A3 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FOUR: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A4 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FIVE: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A5 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SIX: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A6 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SEVEN: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A7 + ); + break; + } + } + } + if (element) { + event.preventDefault(); + this.handleClick(element, active); + element.focus(); + } + } + protected onMouseDown(button: HTMLElement, event: Event) { + event.preventDefault(); + this.handleClick(button, true); + button.focus(); + } + + protected onMouseUp(button: HTMLElement, event: Event) { + event.preventDefault(); + this.handleClick(button, false); + } + + protected onMouseLeave(button: HTMLElement, event: Event) { + event.preventDefault(); + + if (button.getAttribute("pressed") === "true") { + this.handleClick(button, false); + } + } + + private handleClick(element: HTMLElement, active: boolean) { + let newState; + let message; + if (element.id.includes("BTN")) { + newState = this.handleButtonClick(element, active); + message = "button-press"; + } else if (element.id.includes("SWITCH")) { + newState = this.handleSwitchClick(); + message = "button-press"; + } else if (element.id.includes("PIN")) { + newState = this.handleTouchPinClick(element, active); + message = "sensor-changed"; + } else { + return; + } + + if (newState && message) { + sendMessage(message, newState); + } + } + + private handleButtonClick(button: HTMLElement, active: boolean) { + const ButtonA: boolean = button.id.match(/BTN_A/) !== null; + const ButtonB: boolean = button.id.match(/BTN_B/) !== null; + const ButtonAB: boolean = button.id.match(/BTN_AB/) !== null; + let innerButton; + let newState; + + if (ButtonAB) { + innerButton = window.document.getElementById("BTN_AB_INNER"); + newState = { + button_a: active, + button_b: active, + }; + this.setState({ ...this.state, ...newState }); + } else if (ButtonA) { + innerButton = window.document.getElementById("BTN_A_INNER"); + newState = { + button_a: active, + }; + this.setState({ ...this.state, ...newState }); + } else if (ButtonB) { + innerButton = window.document.getElementById("BTN_B_INNER"); + newState = { + button_b: active, + }; + this.setState({ ...this.state, ...newState }); + } + + if (innerButton) { + innerButton.style.fill = this.getButtonColor(active); + } + + button.setAttribute("pressed", `${active}`); + return newState; + } + + private getButtonColor(pressed: boolean) { + const buttonUps = BUTTON_NEUTRAL; + const buttonDown = BUTTON_PRESSED; + return pressed ? buttonDown : buttonUps; + } + + private handleSwitchClick() { + const switchIsOn = !this.state.cpx.switch; + updateSwitch(switchIsOn); + this.setState({ + ...this.state, + cpx: { ...this.state.cpx, switch: switchIsOn }, + }); + return { switch: switchIsOn }; + } + + private handleTouchPinClick(pin: HTMLElement, active: boolean): any { + let cpxState = this.state.cpx; + const pinIndex = parseInt(pin.id.charAt(pin.id.length - 1)) - 1; + const pinState = cpxState.touch; + pinState[pinIndex] = active; + cpxState = { ...cpxState, touch: pinState }; + this.setState({ ...this.state, ...cpxState }); + updatePinTouch(active, pin.id); + return { touch: pinState }; + } } export default Simulator; diff --git a/Source/view/components/cpx/Cpx_svg.tsx b/Source/view/components/cpx/Cpx_svg.tsx index 55864d460..0484dfd11 100644 --- a/Source/view/components/cpx/Cpx_svg.tsx +++ b/Source/view/components/cpx/Cpx_svg.tsx @@ -6,2997 +6,2996 @@ import * as React from "react"; export const CPX_SVG = ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); export default CPX_SVG; diff --git a/Source/view/components/cpx/Cpx_svg_style.tsx b/Source/view/components/cpx/Cpx_svg_style.tsx index 4eff14480..c9f9b2c77 100644 --- a/Source/view/components/cpx/Cpx_svg_style.tsx +++ b/Source/view/components/cpx/Cpx_svg_style.tsx @@ -24,45 +24,45 @@ export const POWER_LED_OFF: string = "#FFFFFF"; // Adapted from : https://github.com/microsoft/pxt/blob/master/pxtsim/simlib.ts export function rgbToHsl( - rgb: [number, number, number] + rgb: [number, number, number] ): [number, number, number] { - const [r, g, b] = rgb; - const [r$, g$, b$] = [r / 255, g / 255, b / 255]; - const cMin = Math.min(r$, g$, b$); - const cMax = Math.max(r$, g$, b$); - const cDelta = cMax - cMin; - let h: number = 0, - s: number, - l: number; - const maxAndMin = cMax + cMin; + const [r, g, b] = rgb; + const [r$, g$, b$] = [r / 255, g / 255, b / 255]; + const cMin = Math.min(r$, g$, b$); + const cMax = Math.max(r$, g$, b$); + const cDelta = cMax - cMin; + let h: number = 0, + s: number, + l: number; + const maxAndMin = cMax + cMin; - // Luminosity - l = (maxAndMin / 2) * 100; + // Luminosity + l = (maxAndMin / 2) * 100; - if (cDelta === 0) { - s = 0; - h = 0; - } else { - // Hue - switch (cMax) { - case r$: - h = 60 * (((g$ - b$) / cDelta) % 6); - break; - case g$: - h = 60 * ((b$ - r$) / cDelta + 2); - break; - case b$: - h = 60 * ((r$ - g$) / cDelta + 4); - break; - } + if (cDelta === 0) { + s = 0; + h = 0; + } else { + // Hue + switch (cMax) { + case r$: + h = 60 * (((g$ - b$) / cDelta) % 6); + break; + case g$: + h = 60 * ((b$ - r$) / cDelta + 2); + break; + case b$: + h = 60 * ((r$ - g$) / cDelta + 4); + break; + } - // Saturation - l > 50 - ? (s = 100 * (cDelta / (2 - maxAndMin))) - : (s = 100 * (cDelta / maxAndMin)); - } + // Saturation + l > 50 + ? (s = 100 * (cDelta / (2 - maxAndMin))) + : (s = 100 * (cDelta / maxAndMin)); + } - return [Math.floor(h), Math.floor(s), Math.floor(l)]; + return [Math.floor(h), Math.floor(s), Math.floor(l)]; } export const SVG_STYLE = ` diff --git a/Source/view/components/cpx/Svg_utils.tsx b/Source/view/components/cpx/Svg_utils.tsx index 92836b923..4776c4a0a 100644 --- a/Source/view/components/cpx/Svg_utils.tsx +++ b/Source/view/components/cpx/Svg_utils.tsx @@ -5,94 +5,94 @@ // tslint:disable-next-line: no-namespace namespace svg { - export function addClass(el: SVGElement, cls: string) { - if (el.classList) { - el.classList.add(cls); - } else if (el.className.baseVal.indexOf(cls) < 0) { - el.className.baseVal += " " + cls; - } - } + export function addClass(el: SVGElement, cls: string) { + if (el.classList) { + el.classList.add(cls); + } else if (el.className.baseVal.indexOf(cls) < 0) { + el.className.baseVal += " " + cls; + } + } - export function removeClass(el: SVGElement, cls: string) { - if (el.classList) { - el.classList.remove(cls); - } else { - el.className.baseVal = el.className.baseVal - .replace(cls, "") - .replace(/\s{2,}/, " "); - } - } + export function removeClass(el: SVGElement, cls: string) { + if (el.classList) { + el.classList.remove(cls); + } else { + el.className.baseVal = el.className.baseVal + .replace(cls, "") + .replace(/\s{2,}/, " "); + } + } - export function hydrate(el: SVGElement, props: any) { - for (const k in props) { - if (k == "title") { - svg.title(el, props[k]); - } else { - el.setAttributeNS(null, k, props[k]); - } - } - } + export function hydrate(el: SVGElement, props: any) { + for (const k in props) { + if (k == "title") { + svg.title(el, props[k]); + } else { + el.setAttributeNS(null, k, props[k]); + } + } + } - export function createElement(name: string, props?: any): SVGElement { - const newElement = document.createElementNS( - "http://www.w3.org/2000/svg", - name - ); - if (props) { - svg.hydrate(newElement, props); - } - return newElement; - } + export function createElement(name: string, props?: any): SVGElement { + const newElement = document.createElementNS( + "http://www.w3.org/2000/svg", + name + ); + if (props) { + svg.hydrate(newElement, props); + } + return newElement; + } - export function child( - parent: Element, - name: string, - props?: any - ): SVGElement { - const childElement = svg.createElement(name, props); - parent.appendChild(childElement); - return childElement; - } + export function child( + parent: Element, + name: string, + props?: any + ): SVGElement { + const childElement = svg.createElement(name, props); + parent.appendChild(childElement); + return childElement; + } - export function fill(el: SVGElement, c: string) { - el.style.fill = c; - } + export function fill(el: SVGElement, c: string) { + el.style.fill = c; + } - export function filter(el: SVGElement, c: string) { - el.style.filter = c; - } + export function filter(el: SVGElement, c: string) { + el.style.filter = c; + } - export function fills(els: SVGElement[], c: string) { - els.forEach(el => (el.style.fill = c)); - } + export function fills(els: SVGElement[], c: string) { + els.forEach((el) => (el.style.fill = c)); + } - export function mkTitle(txt: string): SVGTitleElement { - const t = svg.createElement("title") as SVGTitleElement; - t.textContent = txt; - return t; - } + export function mkTitle(txt: string): SVGTitleElement { + const t = svg.createElement("title") as SVGTitleElement; + t.textContent = txt; + return t; + } - export function title(el: SVGElement, txt: string): SVGTitleElement { - const t = mkTitle(txt); - el.appendChild(t); - return t; - } + export function title(el: SVGElement, txt: string): SVGTitleElement { + const t = mkTitle(txt); + el.appendChild(t); + return t; + } - export function setLed( - ledStatus: boolean, - offColor: string, - onColor: string, - ledElement: SVGElement | null, - gradientStopElement: SVGStopElement | null - ) { - if (ledStatus) { - ledElement?.setAttribute("fill", onColor); - gradientStopElement?.setAttribute("stop-opacity", "1"); - } else { - ledElement?.setAttribute("fill", offColor); - gradientStopElement?.setAttribute("stop-opacity", "0"); - } - } + export function setLed( + ledStatus: boolean, + offColor: string, + onColor: string, + ledElement: SVGElement | null, + gradientStopElement: SVGStopElement | null + ) { + if (ledStatus) { + ledElement?.setAttribute("fill", onColor); + gradientStopElement?.setAttribute("stop-opacity", "1"); + } else { + ledElement?.setAttribute("fill", offColor); + gradientStopElement?.setAttribute("stop-opacity", "0"); + } + } } export default svg; diff --git a/Source/view/components/microbit/Microbit.spec.tsx b/Source/view/components/microbit/Microbit.spec.tsx index 386086866..67c62cbc2 100644 --- a/Source/view/components/microbit/Microbit.spec.tsx +++ b/Source/view/components/microbit/Microbit.spec.tsx @@ -5,25 +5,25 @@ import * as testRenderer from "react-test-renderer"; import { Microbit } from "./Microbit"; describe("Microbit component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/components/microbit/Microbit.tsx b/Source/view/components/microbit/Microbit.tsx index e10c0bfb9..bfc78aa28 100644 --- a/Source/view/components/microbit/Microbit.tsx +++ b/Source/view/components/microbit/Microbit.tsx @@ -4,10 +4,10 @@ import * as React from "react"; import { MICROBIT_TOOLBAR_ICON_ID } from "../../components/toolbar/SensorModalUtils"; import { - GESTURES_MICROBIT, - SENSOR_LIST, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, + GESTURES_MICROBIT, + SENSOR_LIST, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_MESSAGES, } from "../../constants"; import "../../styles/Simulator.css"; import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; @@ -17,114 +17,114 @@ import { MicrobitSimulator } from "./MicrobitSimulator"; // Component grouping the functionality for micro:bit functionalities interface IState { - sensors: { [key: string]: number }; - currentSelectedGesture?: string; + sensors: { [key: string]: number }; + currentSelectedGesture?: string; } const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - }, - currentSelectedGesture: GESTURES_MICROBIT[0], + sensors: { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT]: 0, + [SENSOR_LIST.MOTION_X]: 0, + [SENSOR_LIST.MOTION_Y]: 0, + [SENSOR_LIST.MOTION_Z]: 0, + }, + currentSelectedGesture: GESTURES_MICROBIT[0], }; export class Microbit extends React.Component<{}, IState> { - state = DEFAULT_STATE; + state = DEFAULT_STATE; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + handleMessage = (event: any): void => { + const message = event.data; - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; - updateGesture = (event: React.ChangeEvent) => { - this.setState({ currentSelectedGesture: event.target.value }); - }; - sendGesture = (isActive: boolean) => { - if (this.state.currentSelectedGesture) { - if (isActive) { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: this.state.currentSelectedGesture, - }); - } else { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: "", - }); - } - } - }; + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.RESET: + this.setState({ ...DEFAULT_STATE }); + break; + } + }; + render() { + return ( + + + + + ); + } + updateSensor = (sensor: SENSOR_LIST, value: number) => { + this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); + }; + updateGesture = (event: React.ChangeEvent) => { + this.setState({ currentSelectedGesture: event.target.value }); + }; + sendGesture = (isActive: boolean) => { + if (this.state.currentSelectedGesture) { + if (isActive) { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: this.state.currentSelectedGesture, + }); + } else { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: "", + }); + } + } + }; } const MICROBIT_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, - }, - { - image: TOOLBAR_SVG.RED_LED_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LEDS, - }, - { - image: TOOLBAR_SVG.TEMPERATURE_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, - }, - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - }, - { - image: TOOLBAR_SVG.GESTURE_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.GESTURE, - }, - { - image: TOOLBAR_SVG.GPIO_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.GPIO, - }, - { - image: TOOLBAR_SVG.COMPASS_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.COMPASS, - }, - { - image: TOOLBAR_SVG.SPEAKER_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.SOUND, - }, - { - image: TOOLBAR_SVG.WIRELESS_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.WIRELESS, - }, + { + image: TOOLBAR_SVG.PUSH_BUTTON_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, + }, + { + image: TOOLBAR_SVG.RED_LED_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.LEDS, + }, + { + image: TOOLBAR_SVG.TEMPERATURE_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, + }, + { + image: TOOLBAR_SVG.LIGHT_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, + }, + { + image: TOOLBAR_SVG.MOTION_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, + }, + { + image: TOOLBAR_SVG.GESTURE_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.GESTURE, + }, + { + image: TOOLBAR_SVG.GPIO_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.GPIO, + }, + { + image: TOOLBAR_SVG.COMPASS_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.COMPASS, + }, + { + image: TOOLBAR_SVG.SPEAKER_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.SOUND, + }, + { + image: TOOLBAR_SVG.WIRELESS_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.WIRELESS, + }, ]; diff --git a/Source/view/components/microbit/MicrobitImage.tsx b/Source/view/components/microbit/MicrobitImage.tsx index c9e95216a..18515a425 100644 --- a/Source/view/components/microbit/MicrobitImage.tsx +++ b/Source/view/components/microbit/MicrobitImage.tsx @@ -8,159 +8,159 @@ import { ViewStateContext } from "../../context"; import { IRefObject, MicrobitSvg } from "./Microbit_svg"; interface EventTriggers { - onMouseUp: (event: Event, buttonKey: string) => void; - onMouseDown: (event: Event, buttonKey: string) => void; - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; + onMouseUp: (event: Event, buttonKey: string) => void; + onMouseDown: (event: Event, buttonKey: string) => void; + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; } interface IProps { - eventTriggers: EventTriggers; - leds: number[][]; + eventTriggers: EventTriggers; + leds: number[][]; } export enum BUTTONS_KEYS { - BTN_A = "BTN_A", - BTN_B = "BTN_B", - BTN_AB = "BTN_AB", + BTN_A = "BTN_A", + BTN_B = "BTN_B", + BTN_AB = "BTN_AB", } // Displays the SVG and call necessary svg modification. export class MicrobitImage extends React.Component { - private svgRef: React.RefObject = React.createRef(); - constructor(props: IProps) { - super(props); - } - componentDidMount() { - const svgElement = this.svgRef.current; - if (svgElement) { - updateAllLeds(this.props.leds, svgElement.getLeds()); - setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); - this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); - } - } - componentDidUpdate() { - if (this.svgRef.current) { - updateAllLeds(this.props.leds, this.svgRef.current.getLeds()); - if (this.context === VIEW_STATE.PAUSE) { - disableAllButtons(this.svgRef.current.getButtons()); - } else if (this.context === VIEW_STATE.RUNNING) { - setupAllButtons( - this.props.eventTriggers, - this.svgRef.current.getButtons() - ); - } - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.eventTriggers.onKeyEvent(event, true, event.key); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.eventTriggers.onKeyEvent(event, false, event.key); - }; - render() { - return ; - } - public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { - const button = this.svgRef.current?.getButtons()[key].current; - if (button) { - button.focus(); - if (isActive) { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.KEYPRESSED - ); - } else { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.DEFAULT - ); - } - button.setAttribute("pressed", `${isActive}`); - button.setAttribute("aria-pressed", `${isActive}`); - } - } + private svgRef: React.RefObject = React.createRef(); + constructor(props: IProps) { + super(props); + } + componentDidMount() { + const svgElement = this.svgRef.current; + if (svgElement) { + updateAllLeds(this.props.leds, svgElement.getLeds()); + setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); + this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); + } + } + componentDidUpdate() { + if (this.svgRef.current) { + updateAllLeds(this.props.leds, this.svgRef.current.getLeds()); + if (this.context === VIEW_STATE.PAUSE) { + disableAllButtons(this.svgRef.current.getButtons()); + } else if (this.context === VIEW_STATE.RUNNING) { + setupAllButtons( + this.props.eventTriggers, + this.svgRef.current.getButtons() + ); + } + } + } + componentWillUnmount() { + window.document.removeEventListener("keydown", this.handleKeyDown); + window.document.removeEventListener("keyup", this.handleKeyUp); + } + setupKeyPresses = ( + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void + ) => { + window.document.addEventListener("keydown", this.handleKeyDown); + window.document.addEventListener("keyup", this.handleKeyUp); + }; + handleKeyDown = (event: KeyboardEvent) => { + const keyEvents = [event.key, event.code]; + // Don't listen to keydown events for the run button, restart button and enter key + if ( + !( + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) + ) + ) { + this.props.eventTriggers.onKeyEvent(event, true, event.key); + } + }; + handleKeyUp = (event: KeyboardEvent) => { + this.props.eventTriggers.onKeyEvent(event, false, event.key); + }; + render() { + return ; + } + public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { + const button = this.svgRef.current?.getButtons()[key].current; + if (button) { + button.focus(); + if (isActive) { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.KEYPRESSED + ); + } else { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.DEFAULT + ); + } + button.setAttribute("pressed", `${isActive}`); + button.setAttribute("aria-pressed", `${isActive}`); + } + } } MicrobitImage.contextType = ViewStateContext; const setupButton = ( - buttonElement: SVGRectElement, - eventTriggers: EventTriggers, - key: string + buttonElement: SVGRectElement, + eventTriggers: EventTriggers, + key: string ) => { - buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); + buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); - buttonElement.onmousedown = e => { - buttonElement.focus(); - eventTriggers.onMouseDown(e, key); - }; - buttonElement.onmouseup = e => { - eventTriggers.onMouseUp(e, key); - }; + buttonElement.onmousedown = (e) => { + buttonElement.focus(); + eventTriggers.onMouseDown(e, key); + }; + buttonElement.onmouseup = (e) => { + eventTriggers.onMouseUp(e, key); + }; - buttonElement.onkeydown = e => { - // ensure that the keydown is enter, - // or else it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - eventTriggers.onKeyEvent(e, true, key); - } - }; - buttonElement.onkeyup = e => { - eventTriggers.onKeyEvent(e, false, key); - }; + buttonElement.onkeydown = (e) => { + // ensure that the keydown is enter, + // or else it may register shortcuts twice + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + eventTriggers.onKeyEvent(e, true, key); + } + }; + buttonElement.onkeyup = (e) => { + eventTriggers.onKeyEvent(e, false, key); + }; }; const setupAllButtons = ( - eventTriggers: EventTriggers, - buttonRefs: IRefObject + eventTriggers: EventTriggers, + buttonRefs: IRefObject ) => { - for (const [key, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - setupButton(ref.current, eventTriggers, key); - } - } + for (const [key, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + setupButton(ref.current, eventTriggers, key); + } + } }; const disableAllButtons = (buttonRefs: IRefObject) => { - for (const [, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - // to implement - ref.current.onmousedown = null; - ref.current.onmouseup = null; - ref.current.onkeydown = null; - ref.current.onkeyup = null; - ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); - } - } + for (const [, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + // to implement + ref.current.onmousedown = null; + ref.current.onmouseup = null; + ref.current.onkeydown = null; + ref.current.onkeyup = null; + ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); + } + } }; const updateAllLeds = ( - leds: number[][], - ledRefs: Array>> + leds: number[][], + ledRefs: Array>> ) => { - for (let j = 0; j < leds.length; j++) { - for (let i = 0; i < leds[0].length; i++) { - const ledElement = ledRefs[j][i].current; - if (ledElement) { - setupLed(ledElement, leds[i][j]); - } - } - } + for (let j = 0; j < leds.length; j++) { + for (let i = 0; i < leds[0].length; i++) { + const ledElement = ledRefs[j][i].current; + if (ledElement) { + setupLed(ledElement, leds[i][j]); + } + } + } }; const setupLed = (ledElement: SVGRectElement, brightness: number) => { - ledElement.style.opacity = (brightness / 10).toString(); + ledElement.style.opacity = (brightness / 10).toString(); }; diff --git a/Source/view/components/microbit/MicrobitSimulator.tsx b/Source/view/components/microbit/MicrobitSimulator.tsx index 467efcaaa..3ef219459 100644 --- a/Source/view/components/microbit/MicrobitSimulator.tsx +++ b/Source/view/components/microbit/MicrobitSimulator.tsx @@ -1,10 +1,10 @@ import * as React from "react"; import { - AB_BUTTONS_KEYS, - CONSTANTS, - DEVICE_LIST_KEY, - VIEW_STATE, - WEBVIEW_MESSAGES, + AB_BUTTONS_KEYS, + CONSTANTS, + DEVICE_LIST_KEY, + VIEW_STATE, + WEBVIEW_MESSAGES, } from "../../constants"; import { ViewStateContext } from "../../context"; import PlayLogo from "../../svgs/play_svg"; @@ -14,246 +14,246 @@ import ActionBar from "../simulator/ActionBar"; import { BUTTONS_KEYS, MicrobitImage } from "./MicrobitImage"; const DEFAULT_MICROBIT_STATE: IMicrobitState = { - leds: [ - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - ], - buttons: { button_a: false, button_b: false }, + leds: [ + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + ], + buttons: { button_a: false, button_b: false }, }; interface IState { - active_editors: string[]; - running_file?: string; - currently_selected_file: string; - play_button: boolean; - selected_file: string; - microbit: IMicrobitState; - sendGesture?: (isActive: boolean) => void; + active_editors: string[]; + running_file?: string; + currently_selected_file: string; + play_button: boolean; + selected_file: string; + microbit: IMicrobitState; + sendGesture?: (isActive: boolean) => void; } interface IMicrobitState { - leds: number[][]; - buttons: { button_a: boolean; button_b: boolean }; + leds: number[][]; + buttons: { button_a: boolean; button_b: boolean }; } export class MicrobitSimulator extends React.Component { - private imageRef: React.RefObject = React.createRef(); - constructor() { - super({}); - this.state = { - microbit: DEFAULT_MICROBIT_STATE, - play_button: false, - selected_file: "", - active_editors: [], - running_file: undefined, - currently_selected_file: "", - }; - this.onKeyEvent = this.onKeyEvent.bind(this); - } - handleMessage = (event: any): void => { - const message = event.data; + private imageRef: React.RefObject = React.createRef(); + constructor() { + super({}); + this.state = { + microbit: DEFAULT_MICROBIT_STATE, + play_button: false, + selected_file: "", + active_editors: [], + running_file: undefined, + currently_selected_file: "", + }; + this.onKeyEvent = this.onKeyEvent.bind(this); + } + handleMessage = (event: any): void => { + const message = event.data; - if (message.active_device !== DEVICE_LIST_KEY.MICROBIT) { - return; - } + if (message.active_device !== DEVICE_LIST_KEY.MICROBIT) { + return; + } - switch (message.command) { - case "reset-state": - this.setState({ - microbit: DEFAULT_MICROBIT_STATE, - play_button: false, - }); - break; - case "set-state": - this.setState({ - microbit: { - ...this.state.microbit, - leds: message.state.leds, - }, - }); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - }); - break; - case "visible-editors": - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } + switch (message.command) { + case "reset-state": + this.setState({ + microbit: DEFAULT_MICROBIT_STATE, + play_button: false, + }); + break; + case "set-state": + this.setState({ + microbit: { + ...this.state.microbit, + leds: message.state.leds, + }, + }); + break; + case "activate-play": + const newRunningFile = this.state.currently_selected_file; + this.setState({ + play_button: !this.state.play_button, + running_file: newRunningFile, + }); + break; + case "visible-editors": + this.setState({ + active_editors: message.state.activePythonEditors, + }); + break; + case "current-file": + if (this.state.play_button) { + this.setState({ + currently_selected_file: message.state.running_file, + }); + } else { + this.setState({ + running_file: message.state.running_file, + currently_selected_file: message.state.running_file, + }); + } - break; - } - }; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } + break; + } + }; + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } + componentWillUnmount() { + window.removeEventListener("message", this.handleMessage); + } - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
-
- -
- -
- ); - } + render() { + const playStopImage = this.state.play_button ? StopLogo : PlayLogo; + const playStopLabel = this.state.play_button ? "stop" : "play"; + return ( +
+
+ {this.state.running_file && this.state.play_button + ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) + : CONSTANTS.FILES_PLACEHOLDER} +
+
+ +
+ +
+ ); + } - protected togglePlayClick = () => { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - }; + protected togglePlayClick = () => { + const button = + window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || + window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { + selected_file: this.state.selected_file, + state: !this.state.play_button, + }); + }; - protected refreshSimulatorClick = () => { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - }; - protected handleButtonClick = (key: string, isActive: boolean) => { - let newButtonState = this.state.microbit.buttons; - switch (key) { - case AB_BUTTONS_KEYS.BTN_A: - newButtonState.button_a = isActive; - break; - case AB_BUTTONS_KEYS.BTN_B: - newButtonState.button_b = isActive; - break; - case AB_BUTTONS_KEYS.BTN_AB: - newButtonState = { - button_a: isActive, - button_b: isActive, - }; - break; - } - sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); - this.setState({ - microbit: { - ...this.state.microbit, - buttons: newButtonState, - }, - }); - }; + protected refreshSimulatorClick = () => { + const button = window.document.getElementById( + CONSTANTS.ID_NAME.REFRESH_BUTTON + ); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); + }; + protected handleButtonClick = (key: string, isActive: boolean) => { + let newButtonState = this.state.microbit.buttons; + switch (key) { + case AB_BUTTONS_KEYS.BTN_A: + newButtonState.button_a = isActive; + break; + case AB_BUTTONS_KEYS.BTN_B: + newButtonState.button_b = isActive; + break; + case AB_BUTTONS_KEYS.BTN_AB: + newButtonState = { + button_a: isActive, + button_b: isActive, + }; + break; + } + sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); + this.setState({ + microbit: { + ...this.state.microbit, + buttons: newButtonState, + }, + }); + }; - protected onMouseUp = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, false); - }; + protected onMouseUp = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, false); + }; - protected onMouseDown = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, true); - }; + protected onMouseDown = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, true); + }; - protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { - event.stopPropagation(); - if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(key, active); - if (key === BUTTONS_KEYS.BTN_A) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if (key === BUTTONS_KEYS.BTN_B) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if (key === BUTTONS_KEYS.BTN_AB) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); + protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { + event.stopPropagation(); + if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(key, active); + if (key === BUTTONS_KEYS.BTN_A) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active + ); + } else if (key === BUTTONS_KEYS.BTN_B) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active + ); + } else if (key === BUTTONS_KEYS.BTN_AB) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active + ); + } + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } - } + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active + ); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { + this.togglePlayClick(); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { + this.refreshSimulatorClick(); + } + } } MicrobitSimulator.contextType = ViewStateContext; diff --git a/Source/view/components/microbit/Microbit_svg.tsx b/Source/view/components/microbit/Microbit_svg.tsx index 22854c38f..fd2ea1ca5 100644 --- a/Source/view/components/microbit/Microbit_svg.tsx +++ b/Source/view/components/microbit/Microbit_svg.tsx @@ -7,1884 +7,1803 @@ import * as React from "react"; import "../../styles/SimulatorSvg.css"; export interface IRefObject { - [key: string]: React.RefObject; + [key: string]: React.RefObject; } /* tslint:disable */ const N_LED_COLUMN = 5; const N_LED_ROW = 5; export class MicrobitSvg extends React.Component { - constructor(props: Readonly<{}>) { - super(props); - for (let j = 0; j < N_LED_ROW; j++) { - const led_row: React.RefObject[] = []; - for (let i = 0; i < N_LED_COLUMN; i++) { - led_row.push(React.createRef()); - } - this.ledRefs.push(led_row); - } - } - private svgRef: React.RefObject = React.createRef(); + constructor(props: Readonly<{}>) { + super(props); + for (let j = 0; j < N_LED_ROW; j++) { + const led_row: React.RefObject[] = []; + for (let i = 0; i < N_LED_COLUMN; i++) { + led_row.push(React.createRef()); + } + this.ledRefs.push(led_row); + } + } + private svgRef: React.RefObject = React.createRef(); - private buttonRefs: IRefObject = { - BTN_A: React.createRef(), - BTN_B: React.createRef(), - BTN_AB: React.createRef(), - }; + private buttonRefs: IRefObject = { + BTN_A: React.createRef(), + BTN_B: React.createRef(), + BTN_AB: React.createRef(), + }; - private ledRefs: React.RefObject[][] = []; - public getSvgRef(): React.RefObject { - return this.svgRef; - } - public getButtons(): IRefObject { - return this.buttonRefs; - } - public getLeds(): React.RefObject[][] { - return this.ledRefs; - } + private ledRefs: React.RefObject[][] = []; + public getSvgRef(): React.RefObject { + return this.svgRef; + } + public getButtons(): IRefObject { + return this.buttonRefs; + } + public getLeds(): React.RefObject[][] { + return this.ledRefs; + } - render() { - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (0,0) - - - - (1,0) - - - - (2,0) - - - - (3,0) - - - - (4,0) - - - - (0,1) - - - - (1,1) - - - - (2,1) - - - - (3,1) - - - - (4,1) - - - - (0,2) - - - - (1,2) - - - - (2,2) - - - - (3,2) - - - - (4,2) - - - - (0,3) - - - - (1,3) - - - - (2,3) - - - - (3,3) - - - - (4,3) - - - - (0,4) - - - - (1,4) - - - - (2,4) - - - - (3,4) - - - - (4,4) - - - - - - - - - - P0, ANALOG IN - - - P1, ANALOG IN - - - P2, ANALOG IN - - - P3, ANALOG IN, LED Col 1 - - - P4, ANALOG IN, LED Col 2 - - - P5, BUTTON A - - - P6, LED Col 9 - - - P7, LED Col 8 - - - P8 - - - P9, LED Col 7 - - - P10, ANALOG IN, LED Col 3 - - - P11, BUTTON B - - - P12, RESERVED ACCESSIBILITY - - - P13, SPI - SCK - - - P14, SPI - MISO - - - P15, SPI - MOSI - - - P16, SPI - Chip Select - - - P17, +3v3 - - - P18, +3v3 - - - P19, I2C - SCL - - - P20, I2C - SDA - - - GND - - - GND - - - +3v3 - - - GND - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - - - - - - - - - - - - - - -
- ); - } + render() { + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (0,0) + + + + (1,0) + + + + (2,0) + + + + (3,0) + + + + (4,0) + + + + (0,1) + + + + (1,1) + + + + (2,1) + + + + (3,1) + + + + (4,1) + + + + (0,2) + + + + (1,2) + + + + (2,2) + + + + (3,2) + + + + (4,2) + + + + (0,3) + + + + (1,3) + + + + (2,3) + + + + (3,3) + + + + (4,3) + + + + (0,4) + + + + (1,4) + + + + (2,4) + + + + (3,4) + + + + (4,4) + + + + + + + + + + P0, ANALOG IN + + + P1, ANALOG IN + + + P2, ANALOG IN + + + P3, ANALOG IN, LED Col 1 + + + P4, ANALOG IN, LED Col 2 + + + P5, BUTTON A + + + P6, LED Col 9 + + + P7, LED Col 8 + + + P8 + + + P9, LED Col 7 + + + P10, ANALOG IN, LED Col 3 + + + P11, BUTTON B + + + P12, RESERVED ACCESSIBILITY + + + P13, SPI - SCK + + + P14, SPI - MISO + + + P15, SPI - MOSI + + + P16, SPI - Chip Select + + + P17, +3v3 + + + P18, +3v3 + + + P19, I2C - SCL + + + P20, I2C - SDA + + + GND + + + GND + + + +3v3 + + + GND + + + + + + + + + + + + + + + + + + + + + + A+B + + + + + + + + + + + + + + + + + + + + + + + +
+ ); + } } diff --git a/Source/view/components/simulator/ActionBar.tsx b/Source/view/components/simulator/ActionBar.tsx index b760817b8..151d3758a 100644 --- a/Source/view/components/simulator/ActionBar.tsx +++ b/Source/view/components/simulator/ActionBar.tsx @@ -7,42 +7,38 @@ import RefreshLogo from "../../svgs/refresh_svg"; import Button from "../Button"; interface IProps { - onTogglePlay: (event: React.MouseEvent) => void; - onToggleRefresh: (event: React.MouseEvent) => void; - playStopImage: JSX.Element; - playStopLabel: string; + onTogglePlay: (event: React.MouseEvent) => void; + onToggleRefresh: (event: React.MouseEvent) => void; + playStopImage: JSX.Element; + playStopLabel: string; } // Component including the actions done on the Simulator (play/stop, refresh) class ActionBar extends React.Component { - public render() { - const { - onTogglePlay, - onToggleRefresh, - playStopImage, - playStopLabel, - } = this.props; - return ( -
-
- ); - } + public render() { + const { onTogglePlay, onToggleRefresh, playStopImage, playStopLabel } = + this.props; + return ( +
+
+ ); + } } export default ActionBar; diff --git a/Source/view/components/toolbar/GenericSliderComponent.tsx b/Source/view/components/toolbar/GenericSliderComponent.tsx index 747721075..cc46a7930 100644 --- a/Source/view/components/toolbar/GenericSliderComponent.tsx +++ b/Source/view/components/toolbar/GenericSliderComponent.tsx @@ -4,38 +4,38 @@ import { ISensorProps, ISliderProps } from "../../viewUtils"; import InputSlider from "./InputSlider"; interface IProps { - axisProperties: ISensorProps; - axisValues: { - // key is accessed with axisLabel - [key: string]: number; - }; - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void; + axisProperties: ISensorProps; + axisValues: { + // key is accessed with axisLabel + [key: string]: number; + }; + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void; } -export const GenericSliderComponent: React.FC = props => { - return ( -
- {props.axisProperties.sliderProps.map( - (sliderProperties: ISliderProps, index: number) => { - return ( - - -
-
- ); - } - )} -
- ); +export const GenericSliderComponent: React.FC = (props) => { + return ( +
+ {props.axisProperties.sliderProps.map( + (sliderProperties: ISliderProps, index: number) => { + return ( + + +
+
+ ); + } + )} +
+ ); }; diff --git a/Source/view/components/toolbar/Gesture.tsx b/Source/view/components/toolbar/Gesture.tsx index 4cf941f13..cad53ea8b 100644 --- a/Source/view/components/toolbar/Gesture.tsx +++ b/Source/view/components/toolbar/Gesture.tsx @@ -5,67 +5,66 @@ import SensorButton from "./SensorButton"; const GESTURE_BUTTON_MESSAGE = "Send Gesture"; interface IProps { - gestures: string[]; - onSelectGestures?: (event: React.ChangeEvent) => void; - onSendGesture?: (isActive: boolean) => void; + gestures: string[]; + onSelectGestures?: (event: React.ChangeEvent) => void; + onSendGesture?: (isActive: boolean) => void; } export class Gesture extends React.Component { - private sensorButtonRef: React.RefObject = React.createRef(); - render() { - return ( -
- - { - if (this.props.onSendGesture) { - this.props.onSendGesture(true); - } - }} - onMouseUp={() => { - if (this.props.onSendGesture) { - this.props.onSendGesture(false); - } - }} - onKeyDown={this.handleOnKeyDown} - onKeyUp={this.handleOnKeyUp} - type="gesture" - /> -
- ); - } - private handleOnKeyDown = (e: React.KeyboardEvent) => { - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - this.sensorButtonRef!.current!.setButtonClass(true); - if (this.props.onSendGesture) { - this.props.onSendGesture(true); - } - } - }; + private sensorButtonRef: React.RefObject = React.createRef(); + render() { + return ( +
+ + { + if (this.props.onSendGesture) { + this.props.onSendGesture(true); + } + }} + onMouseUp={() => { + if (this.props.onSendGesture) { + this.props.onSendGesture(false); + } + }} + onKeyDown={this.handleOnKeyDown} + onKeyUp={this.handleOnKeyUp} + type="gesture" + /> +
+ ); + } + private handleOnKeyDown = (e: React.KeyboardEvent) => { + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + this.sensorButtonRef!.current!.setButtonClass(true); + if (this.props.onSendGesture) { + this.props.onSendGesture(true); + } + } + }; - private handleOnKeyUp = ( - e: React.KeyboardEvent, - onSendGesture?: (isActive: boolean) => void - ) => { - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - this.sensorButtonRef!.current!.setButtonClass(false); + private handleOnKeyUp = ( + e: React.KeyboardEvent, + onSendGesture?: (isActive: boolean) => void + ) => { + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + this.sensorButtonRef!.current!.setButtonClass(false); - if (this.props.onSendGesture) { - this.props.onSendGesture(false); - } - } - }; + if (this.props.onSendGesture) { + this.props.onSendGesture(false); + } + } + }; } diff --git a/Source/view/components/toolbar/InputSlider.tsx b/Source/view/components/toolbar/InputSlider.tsx index adfbcef60..db78f58d3 100644 --- a/Source/view/components/toolbar/InputSlider.tsx +++ b/Source/view/components/toolbar/InputSlider.tsx @@ -9,122 +9,122 @@ import { sendMessage } from "../../utils/MessageUtils"; import { ISliderProps } from "../../viewUtils"; class InputSlider extends React.Component { - constructor(props: ISliderProps) { - super(props); - this.state = { - value: this.props.value, - }; + constructor(props: ISliderProps) { + super(props); + this.state = { + value: this.props.value, + }; - this.handleOnChange = this.handleOnChange.bind(this); - this.validateRange = this.validateRange.bind(this); - } + this.handleOnChange = this.handleOnChange.bind(this); + this.validateRange = this.validateRange.bind(this); + } - render() { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; + render() { + const isInputDisabled = this.context === VIEW_STATE.PAUSE; - const nbDecimals = - this.props.step.toString().split(".")[1]?.length || 0; - return ( -
- {this.props.axisLabel} - 0 ? 1 : 0}}[0-9]{0,${nbDecimals}}$`} - onKeyUp={this.handleOnChange} - style={{ width: this.getMaximumBoxWidth() + "ch" }} - aria-label={`${this.props.type} sensor input ${this.props.axisLabel}`} - /> - - - {this.props.minValue} - {this.props.maxValue} - - - - {this.props.minLabel} - {this.props.maxLabel} - - -
- ); - } + const nbDecimals = + this.props.step.toString().split(".")[1]?.length || 0; + return ( +
+ {this.props.axisLabel} + 0 ? 1 : 0}}[0-9]{0,${nbDecimals}}$`} + onKeyUp={this.handleOnChange} + style={{ width: this.getMaximumBoxWidth() + "ch" }} + aria-label={`${this.props.type} sensor input ${this.props.axisLabel}`} + /> + + + {this.props.minValue} + {this.props.maxValue} + + + + {this.props.minLabel} + {this.props.maxLabel} + + +
+ ); + } - private getMaximumBoxWidth = () => { - return ( - Math.max( - this.props.minValue.toString().length, - this.props.maxValue.toString().length - ) + 2 - ); - }; + private getMaximumBoxWidth = () => { + return ( + Math.max( + this.props.minValue.toString().length, + this.props.maxValue.toString().length + ) + 2 + ); + }; - private handleOnChange = (event: any) => { - const validatedValue = this.validateRange(this.updateValue(event)); - const newSensorState = this.writeMessage(validatedValue); - if (newSensorState) { - sendMessage(WEBVIEW_MESSAGES.SENSOR_CHANGED, newSensorState); - } - }; + private handleOnChange = (event: any) => { + const validatedValue = this.validateRange(this.updateValue(event)); + const newSensorState = this.writeMessage(validatedValue); + if (newSensorState) { + sendMessage(WEBVIEW_MESSAGES.SENSOR_CHANGED, newSensorState); + } + }; - private writeMessage = (valueTowrite: number) => { - let value = valueTowrite; - if (value > this.props.maxValue || value < this.props.minValue) { - value = parseInt(this.state.value, 10); - } + private writeMessage = (valueTowrite: number) => { + let value = valueTowrite; + if (value > this.props.maxValue || value < this.props.minValue) { + value = parseInt(this.state.value, 10); + } - return this.props.type && this.state.value !== undefined - ? { [this.props.type]: value } - : undefined; - }; + return this.props.type && this.state.value !== undefined + ? { [this.props.type]: value } + : undefined; + }; - private updateValue = (event: any) => { - const newValue = event.target.validity.valid - ? event.target.value - : this.state.value; - if (this.props.onUpdateValue) { - this.props.onUpdateValue(this.props.type as SENSOR_LIST, newValue); - } - return newValue; - }; + private updateValue = (event: any) => { + const newValue = event.target.validity.valid + ? event.target.value + : this.state.value; + if (this.props.onUpdateValue) { + this.props.onUpdateValue(this.props.type as SENSOR_LIST, newValue); + } + return newValue; + }; - private sendTelemetry = () => { - sendMessage(WEBVIEW_MESSAGES.SLIDER_TELEMETRY, this.props.type); - }; + private sendTelemetry = () => { + sendMessage(WEBVIEW_MESSAGES.SLIDER_TELEMETRY, this.props.type); + }; - private validateRange = (valueString: string) => { - let valueInt = parseFloat(valueString); - if (valueInt < this.props.minValue) { - valueInt = this.props.minValue; - this.setState({ value: valueInt }); - } else if (valueInt > this.props.maxValue) { - valueInt = this.props.maxValue; - this.setState({ value: valueInt }); - } - return valueInt; - }; + private validateRange = (valueString: string) => { + let valueInt = parseFloat(valueString); + if (valueInt < this.props.minValue) { + valueInt = this.props.minValue; + this.setState({ value: valueInt }); + } else if (valueInt > this.props.maxValue) { + valueInt = this.props.maxValue; + this.setState({ value: valueInt }); + } + return valueInt; + }; } InputSlider.contextType = ViewStateContext; diff --git a/Source/view/components/toolbar/SensorButton.tsx b/Source/view/components/toolbar/SensorButton.tsx index b50759bd4..efd22eb96 100644 --- a/Source/view/components/toolbar/SensorButton.tsx +++ b/Source/view/components/toolbar/SensorButton.tsx @@ -8,39 +8,38 @@ import "../../styles/SensorButton.css"; import { ISensorButtonProps } from "../../viewUtils"; class SensorButton extends React.Component { - private buttonRef: React.RefObject = React.createRef(); + private buttonRef: React.RefObject = React.createRef(); - public setButtonClass = (isActive: boolean) => { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; + public setButtonClass = (isActive: boolean) => { + const isInputDisabled = this.context === VIEW_STATE.PAUSE; - if (isActive && !isInputDisabled) { - this.buttonRef.current?.setAttribute( - "class", - "sensor-button active-button" - ); - } else if (this.buttonRef.current) { - this.buttonRef!.current!.setAttribute("class", "sensor-button"); - } - }; - render() { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; + if (isActive && !isInputDisabled) { + this.buttonRef.current?.setAttribute( + "class", + "sensor-button active-button" + ); + } else if (this.buttonRef.current) { + this.buttonRef!.current!.setAttribute("class", "sensor-button"); + } + }; + render() { + const isInputDisabled = this.context === VIEW_STATE.PAUSE; - return ( - - ); - } + return ( + + ); + } } SensorButton.contextType = ViewStateContext; export default SensorButton; diff --git a/Source/view/components/toolbar/SensorModalUtils.tsx b/Source/view/components/toolbar/SensorModalUtils.tsx index c7ea53f85..57a491960 100644 --- a/Source/view/components/toolbar/SensorModalUtils.tsx +++ b/Source/view/components/toolbar/SensorModalUtils.tsx @@ -8,169 +8,167 @@ import * as CPX_MODAL from "./cpx/CpxModalContent"; import * as MICROBIT_MODAL from "./microbit/MicrobitModalContent"; export const TRY_IT_MAKE_CODE = ( - + ); export const FEATURE_REQUEST_ON_GITHUB = ( - + ); export const TOOLBAR_ICON_LABEL = { - GPIO: "GPIO", - IR: "IR", - LEFT_EDGE: "left-edge", - LIGHT: "Light sensor", - MOTION: "Motion Sensor", - NEO_PIXEL: "Neo Pixels", - PUSH_BUTTON: "Push Button", - RED_LED: "Red LED", - RIGHT_EDGE: "right-edge", - SOUND: "Sound Sensor", - SPEAKER: "Speaker", - SWITCH: "Switch", - TAG_INPUT: "Tag Input", - TAG_OUTPUT: "Tag Output", - TEMPERATURE: "Temperature Sensor", - WIRELESS: "Bluetooth and Radio", + GPIO: "GPIO", + IR: "IR", + LEFT_EDGE: "left-edge", + LIGHT: "Light sensor", + MOTION: "Motion Sensor", + NEO_PIXEL: "Neo Pixels", + PUSH_BUTTON: "Push Button", + RED_LED: "Red LED", + RIGHT_EDGE: "right-edge", + SOUND: "Sound Sensor", + SPEAKER: "Speaker", + SWITCH: "Switch", + TAG_INPUT: "Tag Input", + TAG_OUTPUT: "Tag Output", + TEMPERATURE: "Temperature Sensor", + WIRELESS: "Bluetooth and Radio", }; export const CPX_TOOLBAR_ICON_ID = { - GPIO: "toolbar-gpio", - IR: "toolbar-ir-sensor", - LEFT_EDGE: "left-edge", - LIGHT: "toolbar-light-sensor", - MOTION: "toolbar-motion-sensor", - NEO_PIXEL: "toolbar-neo-pixels", - PUSH_BUTTON: "toolbar-a-b-push", - RED_LED: "toolbar-red-led", - RIGHT_EDGE: "right-edge", - SOUND: "toolbar-sound-sensor", - SPEAKER: "toolbar-speaker", - SWITCH: "toolbar-slider-switch", - TEMPERATURE: "toolbar-temperature-sensor", + GPIO: "toolbar-gpio", + IR: "toolbar-ir-sensor", + LEFT_EDGE: "left-edge", + LIGHT: "toolbar-light-sensor", + MOTION: "toolbar-motion-sensor", + NEO_PIXEL: "toolbar-neo-pixels", + PUSH_BUTTON: "toolbar-a-b-push", + RED_LED: "toolbar-red-led", + RIGHT_EDGE: "right-edge", + SOUND: "toolbar-sound-sensor", + SPEAKER: "toolbar-speaker", + SWITCH: "toolbar-slider-switch", + TEMPERATURE: "toolbar-temperature-sensor", }; export const MICROBIT_TOOLBAR_ICON_ID = { - TEMPERATURE: "toolbar-microbit-temperature-sensor", - LIGHT: "toolbar-microbit-light-sensor", - ACCELEROMETER: "toolbar-accelerometer-sensor", - LEDS: "toolbar-microbit-led", - PUSH_BUTTON: "toolbar-microbit-a-b-push", - GPIO: "toolbar-gpio", - SOUND: "toolbar-microbit-sound", - WIRELESS: "toolbar-microbit-wireless", - GESTURE: "toolbar-microbit-gesture-sensor", - COMPASS: "toolbar-microbit-compass-sensor", + TEMPERATURE: "toolbar-microbit-temperature-sensor", + LIGHT: "toolbar-microbit-light-sensor", + ACCELEROMETER: "toolbar-accelerometer-sensor", + LEDS: "toolbar-microbit-led", + PUSH_BUTTON: "toolbar-microbit-a-b-push", + GPIO: "toolbar-gpio", + SOUND: "toolbar-microbit-sound", + WIRELESS: "toolbar-microbit-wireless", + GESTURE: "toolbar-microbit-gesture-sensor", + COMPASS: "toolbar-microbit-compass-sensor", }; export const CLUE_TOOLBAR_ICON_ID = { - TEMPERATURE: "toolbar-clue-temperature-sensor", - LIGHT: "toolbar-clue-light-sensor", - ACCELEROMETER: "toolbar-clue-accelerometer-sensor", - LEDS: "toolbar-clue-led", - PUSH_BUTTON: "toolbar-clue-a-b-push", - GPIO: "toolbar-clue-gpio", - SPEAKER: "toolbar-speaker", - SOUND: "toolbar-clue-sound-sensor", - PRESSURE: "toolbar-clue-pressure-sensor", - HUMIDITY: "toolbar-clue-humidity-sensor", - GESTURE: "toolbar-clue-gesture-sensor", - PROXIMITY: "toolbar-clue-proximity-sensor", - BLUETOOTH: "toolbar-clue-bluetooth", - MAGNETOSCOPE: "toolbar-clue-magnet-sensor", - GYROSCOPE: "toolbar-clue-gyroscope-sensor", + TEMPERATURE: "toolbar-clue-temperature-sensor", + LIGHT: "toolbar-clue-light-sensor", + ACCELEROMETER: "toolbar-clue-accelerometer-sensor", + LEDS: "toolbar-clue-led", + PUSH_BUTTON: "toolbar-clue-a-b-push", + GPIO: "toolbar-clue-gpio", + SPEAKER: "toolbar-speaker", + SOUND: "toolbar-clue-sound-sensor", + PRESSURE: "toolbar-clue-pressure-sensor", + HUMIDITY: "toolbar-clue-humidity-sensor", + GESTURE: "toolbar-clue-gesture-sensor", + PROXIMITY: "toolbar-clue-proximity-sensor", + BLUETOOTH: "toolbar-clue-bluetooth", + MAGNETOSCOPE: "toolbar-clue-magnet-sensor", + GYROSCOPE: "toolbar-clue-gyroscope-sensor", }; export interface IModalContent { - components: any; - descriptionText: string; - descriptionTitle: string; - id: string; - tagInput: any; - tagOutput: any; - tryItDescription: string; + components: any; + descriptionText: string; + descriptionTitle: string; + id: string; + tagInput: any; + tagOutput: any; + tryItDescription: string; } export const DEFAULT_MODAL_CONTENT: IModalContent = { - descriptionTitle: "default", - tagInput: undefined, - tagOutput: undefined, - descriptionText: "none", - tryItDescription: "none", - components: undefined, - id: "none", + descriptionTitle: "default", + tagInput: undefined, + tagOutput: undefined, + descriptionText: "none", + tryItDescription: "none", + components: undefined, + id: "none", }; export const LABEL_TO_MODAL_CONTENT_CONSTRUCTOR = new Map([ - [CPX_TOOLBAR_ICON_ID.GPIO, CPX_MODAL.GPIO_CONTENT], - [CPX_TOOLBAR_ICON_ID.IR, CPX_MODAL.IR_CONTENT], - [CPX_TOOLBAR_ICON_ID.LIGHT, CPX_MODAL.LIGHT_CONTENT], - [CPX_TOOLBAR_ICON_ID.MOTION, CPX_MODAL.MOTION_CONTENT], - [CPX_TOOLBAR_ICON_ID.NEO_PIXEL, CPX_MODAL.NEOP_CONTENT], - [CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, CPX_MODAL.PUSHB_CONTENT], - [CPX_TOOLBAR_ICON_ID.RED_LED, CPX_MODAL.RED_LED_CONTENT], - [CPX_TOOLBAR_ICON_ID.SOUND, CPX_MODAL.SOUND_CONTENT], - [CPX_TOOLBAR_ICON_ID.SPEAKER, CPX_MODAL.SPEAKER_CONTENT], - [CPX_TOOLBAR_ICON_ID.SWITCH, CPX_MODAL.SWITCH_CONTENT], - [CPX_TOOLBAR_ICON_ID.TEMPERATURE, CPX_MODAL.TEMPERATURE_CONTENT], - [ - MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - MICROBIT_MODAL.ACCELEROMETER_CONTENT, - ], - [MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, MICROBIT_MODAL.TEMPERATURE_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.LIGHT, MICROBIT_MODAL.LIGHT_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.LEDS, MICROBIT_MODAL.LED_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, MICROBIT_MODAL.BUTTON_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.GPIO, MICROBIT_MODAL.GPIO_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.SOUND, MICROBIT_MODAL.SOUND_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.WIRELESS, MICROBIT_MODAL.WIRELESS_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], - [CLUE_TOOLBAR_ICON_ID.TEMPERATURE, CLUE_MODAL.TEMPERATURE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, CLUE_MODAL.BUTTON_CONTENT], - [CLUE_TOOLBAR_ICON_ID.GPIO, CLUE_MODAL.GPIO_CONTENT], - [CLUE_TOOLBAR_ICON_ID.LIGHT, CLUE_MODAL.LIGHT_CONTENT], - [CLUE_TOOLBAR_ICON_ID.LEDS, CLUE_MODAL.LED_CONTENT], - [CLUE_TOOLBAR_ICON_ID.SOUND, CLUE_MODAL.SOUND_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PRESSURE, CLUE_MODAL.PRESSURE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.HUMIDITY, CLUE_MODAL.HUMIDITY_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PROXIMITY, CLUE_MODAL.PROXIMITY_CONTENT], - [CLUE_TOOLBAR_ICON_ID.BLUETOOTH, CLUE_MODAL.BLUETOOTH_CONTENT], - [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.SPEAKER, CLUE_MODAL.SPEAKER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.GYROSCOPE, CLUE_MODAL.GYROSCOPE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, CLUE_MODAL.MAGNETOSCOPE_CONTENT], + [CPX_TOOLBAR_ICON_ID.GPIO, CPX_MODAL.GPIO_CONTENT], + [CPX_TOOLBAR_ICON_ID.IR, CPX_MODAL.IR_CONTENT], + [CPX_TOOLBAR_ICON_ID.LIGHT, CPX_MODAL.LIGHT_CONTENT], + [CPX_TOOLBAR_ICON_ID.MOTION, CPX_MODAL.MOTION_CONTENT], + [CPX_TOOLBAR_ICON_ID.NEO_PIXEL, CPX_MODAL.NEOP_CONTENT], + [CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, CPX_MODAL.PUSHB_CONTENT], + [CPX_TOOLBAR_ICON_ID.RED_LED, CPX_MODAL.RED_LED_CONTENT], + [CPX_TOOLBAR_ICON_ID.SOUND, CPX_MODAL.SOUND_CONTENT], + [CPX_TOOLBAR_ICON_ID.SPEAKER, CPX_MODAL.SPEAKER_CONTENT], + [CPX_TOOLBAR_ICON_ID.SWITCH, CPX_MODAL.SWITCH_CONTENT], + [CPX_TOOLBAR_ICON_ID.TEMPERATURE, CPX_MODAL.TEMPERATURE_CONTENT], + [ + MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, + MICROBIT_MODAL.ACCELEROMETER_CONTENT, + ], + [MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, MICROBIT_MODAL.TEMPERATURE_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.LIGHT, MICROBIT_MODAL.LIGHT_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.LEDS, MICROBIT_MODAL.LED_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, MICROBIT_MODAL.BUTTON_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.GPIO, MICROBIT_MODAL.GPIO_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.SOUND, MICROBIT_MODAL.SOUND_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.WIRELESS, MICROBIT_MODAL.WIRELESS_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], + [CLUE_TOOLBAR_ICON_ID.TEMPERATURE, CLUE_MODAL.TEMPERATURE_CONTENT], + [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], + [CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, CLUE_MODAL.BUTTON_CONTENT], + [CLUE_TOOLBAR_ICON_ID.GPIO, CLUE_MODAL.GPIO_CONTENT], + [CLUE_TOOLBAR_ICON_ID.LIGHT, CLUE_MODAL.LIGHT_CONTENT], + [CLUE_TOOLBAR_ICON_ID.LEDS, CLUE_MODAL.LED_CONTENT], + [CLUE_TOOLBAR_ICON_ID.SOUND, CLUE_MODAL.SOUND_CONTENT], + [CLUE_TOOLBAR_ICON_ID.PRESSURE, CLUE_MODAL.PRESSURE_CONTENT], + [CLUE_TOOLBAR_ICON_ID.HUMIDITY, CLUE_MODAL.HUMIDITY_CONTENT], + [CLUE_TOOLBAR_ICON_ID.PROXIMITY, CLUE_MODAL.PROXIMITY_CONTENT], + [CLUE_TOOLBAR_ICON_ID.BLUETOOTH, CLUE_MODAL.BLUETOOTH_CONTENT], + [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], + [CLUE_TOOLBAR_ICON_ID.SPEAKER, CLUE_MODAL.SPEAKER_CONTENT], + [CLUE_TOOLBAR_ICON_ID.GYROSCOPE, CLUE_MODAL.GYROSCOPE_CONTENT], + [CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, CLUE_MODAL.MAGNETOSCOPE_CONTENT], ]); export const getModalContent = ( - label: string, - onUpdateValue: (onUpdateValue: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number }, - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void + label: string, + onUpdateValue: (onUpdateValue: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, + onSelectGestures?: (event: React.ChangeEvent) => void, + sendGesture?: (isActive: boolean) => void ) => { - if (label === CLUE_TOOLBAR_ICON_ID.GESTURE) { - return CLUE_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); - } else if (label === MICROBIT_TOOLBAR_ICON_ID.GESTURE) { - return MICROBIT_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); - } - const modalContentConstructor = LABEL_TO_MODAL_CONTENT_CONSTRUCTOR.get( - label - ); - if (modalContentConstructor) { - return modalContentConstructor(onUpdateValue, sensorValues); - } else { - return; - } + if (label === CLUE_TOOLBAR_ICON_ID.GESTURE) { + return CLUE_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); + } else if (label === MICROBIT_TOOLBAR_ICON_ID.GESTURE) { + return MICROBIT_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); + } + const modalContentConstructor = + LABEL_TO_MODAL_CONTENT_CONSTRUCTOR.get(label); + if (modalContentConstructor) { + return modalContentConstructor(onUpdateValue, sensorValues); + } else { + return; + } }; diff --git a/Source/view/components/toolbar/ToolBar.tsx b/Source/view/components/toolbar/ToolBar.tsx index a2a3ee1a2..9bdd48ae5 100644 --- a/Source/view/components/toolbar/ToolBar.tsx +++ b/Source/view/components/toolbar/ToolBar.tsx @@ -5,217 +5,215 @@ import { Callout, TooltipHost } from "office-ui-fabric-react"; import { IconButton } from "office-ui-fabric-react"; import * as React from "react"; import { - FormattedMessage, - injectIntl, - WrappedComponentProps, + FormattedMessage, + injectIntl, + WrappedComponentProps, } from "react-intl"; import { SENSOR_LIST } from "../../constants"; import "../../styles/ToolBar.css"; import Button from "../Button"; import { - DEFAULT_MODAL_CONTENT, - getModalContent, - IModalContent, + DEFAULT_MODAL_CONTENT, + getModalContent, + IModalContent, } from "./SensorModalUtils"; interface IToolbarState { - currentOpenedId: string; - showModal: boolean; - isDescriptionVisible: boolean; + currentOpenedId: string; + showModal: boolean; + isDescriptionVisible: boolean; } interface IProps extends WrappedComponentProps { - buttonList: Array<{ - label: any; - image: any; - }>; - onUpdateSensor: (sensor: SENSOR_LIST, value: number) => void; - sensorValues: { [key: string]: number }; - onSelectGesture?: (event: React.ChangeEvent) => void; - sendGesture?: (isActive: boolean) => void; + buttonList: Array<{ + label: any; + image: any; + }>; + onUpdateSensor: (sensor: SENSOR_LIST, value: number) => void; + sensorValues: { [key: string]: number }; + onSelectGesture?: (event: React.ChangeEvent) => void; + sendGesture?: (isActive: boolean) => void; } class ToolBar extends React.Component { - private readonly TOOLBAR_BUTTON_WIDTH: number = 32; - - constructor(props: IProps) { - super(props); - initializeIcons(); - this.state = { - currentOpenedId: "", - isDescriptionVisible: false, - showModal: false, - }; - } - - public render() { - const { buttonList } = this.props; - return ( -
-
-
- {buttonList.map( - (currrentButton: any, index: number) => { - return ( - ( - - ), - }} - key={index} - > -
- {this.getIconModal()} -
-
- ); - } - - private handleOnClick = ( - event: React.MouseEvent, - label: string - ) => { - if ( - !this.state.showModal && - this.state.currentOpenedId === "" && - this.state.currentOpenedId !== label - ) { - this.openModal(label); - } else { - this.closeCurrentModal(); - if (this.state.currentOpenedId !== label) { - this.openModal(label); - } - } - }; - - private changePressedState(id: string, pressed: boolean) { - const elt = window.document.getElementById(`${id}-button`); - if (elt) { - pressed - ? elt.classList.add("button-pressed") - : elt.classList.remove("button-pressed"); - } - } - private closeCurrentModal = () => { - this.changePressedState(this.state.currentOpenedId, false); - this.setState({ - currentOpenedId: "", - showModal: false, - }); - }; - - private openModal = (label: string) => { - this.setState({ - currentOpenedId: label, - showModal: true, - }); - this.changePressedState(label, true); - }; - - private onShowDescriptionClicked = (): void => { - this.setState({ - isDescriptionVisible: !this.state.isDescriptionVisible, - }); - }; - - private onDescriptionDismiss = (): void => { - this.setState({ - isDescriptionVisible: false, - }); - }; - - private getIconModal() { - if ( - !this.state.showModal || - !getModalContent( - this.state.currentOpenedId, - this.props.onUpdateSensor, - this.props.sensorValues, - this.props.onSelectGesture, - this.props.sendGesture - ) - ) { - return null; - } - - const content = getModalContent( - this.state.currentOpenedId, - this.props.onUpdateSensor, - this.props.sensorValues, - this.props.onSelectGesture, - this.props.sendGesture - ) as IModalContent; - - const components = content - ? content.components - : DEFAULT_MODAL_CONTENT.components; - - return ( -
-
- - - {content.tagInput} - {content.tagOutput} - - -
-
- {this.state.isDescriptionVisible && ( - -
- -
-
- )} -
-
- - - -
- -
{components}
-
-
- ); - } + private readonly TOOLBAR_BUTTON_WIDTH: number = 32; + + constructor(props: IProps) { + super(props); + initializeIcons(); + this.state = { + currentOpenedId: "", + isDescriptionVisible: false, + showModal: false, + }; + } + + public render() { + const { buttonList } = this.props; + return ( +
+
+
+ {buttonList.map( + (currrentButton: any, index: number) => { + return ( + ( + + ), + }} + key={index}> +
+ {this.getIconModal()} +
+
+ ); + } + + private handleOnClick = ( + event: React.MouseEvent, + label: string + ) => { + if ( + !this.state.showModal && + this.state.currentOpenedId === "" && + this.state.currentOpenedId !== label + ) { + this.openModal(label); + } else { + this.closeCurrentModal(); + if (this.state.currentOpenedId !== label) { + this.openModal(label); + } + } + }; + + private changePressedState(id: string, pressed: boolean) { + const elt = window.document.getElementById(`${id}-button`); + if (elt) { + pressed + ? elt.classList.add("button-pressed") + : elt.classList.remove("button-pressed"); + } + } + private closeCurrentModal = () => { + this.changePressedState(this.state.currentOpenedId, false); + this.setState({ + currentOpenedId: "", + showModal: false, + }); + }; + + private openModal = (label: string) => { + this.setState({ + currentOpenedId: label, + showModal: true, + }); + this.changePressedState(label, true); + }; + + private onShowDescriptionClicked = (): void => { + this.setState({ + isDescriptionVisible: !this.state.isDescriptionVisible, + }); + }; + + private onDescriptionDismiss = (): void => { + this.setState({ + isDescriptionVisible: false, + }); + }; + + private getIconModal() { + if ( + !this.state.showModal || + !getModalContent( + this.state.currentOpenedId, + this.props.onUpdateSensor, + this.props.sensorValues, + this.props.onSelectGesture, + this.props.sendGesture + ) + ) { + return null; + } + + const content = getModalContent( + this.state.currentOpenedId, + this.props.onUpdateSensor, + this.props.sensorValues, + this.props.onSelectGesture, + this.props.sendGesture + ) as IModalContent; + + const components = content + ? content.components + : DEFAULT_MODAL_CONTENT.components; + + return ( +
+
+ + + {content.tagInput} + {content.tagOutput} + + +
+
+ {this.state.isDescriptionVisible && ( + +
+ +
+
+ )} +
+
+ + + +
+ +
{components}
+
+
+ ); + } } export default injectIntl(ToolBar); diff --git a/Source/view/components/toolbar/Toolbar.spec.tsx b/Source/view/components/toolbar/Toolbar.spec.tsx index 7598ff1c0..cc939e108 100644 --- a/Source/view/components/toolbar/Toolbar.spec.tsx +++ b/Source/view/components/toolbar/Toolbar.spec.tsx @@ -8,50 +8,50 @@ import { MICROBIT_TOOLBAR_ICON_ID } from "./SensorModalUtils"; import Toolbar from "./ToolBar"; const MOCK_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - }, + { + image: TOOLBAR_SVG.LIGHT_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, + }, + { + image: TOOLBAR_SVG.MOTION_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, + }, ]; const mockUpdateSensors = () => { - return; + return; }; const mockInitialValues = { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT]: 0, }; describe("Toolbar component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/components/toolbar/clue/ClueModalContent.tsx b/Source/view/components/toolbar/clue/ClueModalContent.tsx index b4fc4a136..34a56b1d0 100644 --- a/Source/view/components/toolbar/clue/ClueModalContent.tsx +++ b/Source/view/components/toolbar/clue/ClueModalContent.tsx @@ -8,311 +8,311 @@ import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; import * as SENSOR_PROPERTIES from "./ClueSensorProperties"; export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-clue-temperature-sensor.description", - descriptionTitle: "toolbar-clue-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-temperature-sensor.tryItDescription", - }; + const temperatureSensorValues = { + T: sensorValues[SENSOR_LIST.TEMPERATURE], + }; + return { + components: [ + , + ], + descriptionText: "toolbar-clue-temperature-sensor.description", + descriptionTitle: "toolbar-clue-temperature-sensor.title", + id: "temperature", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-temperature-sensor.tryItDescription", + }; }; export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-gpio.description", - tryItDescription: "toolbar-clue-gpio.tryItDescription", - components: undefined, - id: "GPIO", - }; + return { + descriptionTitle: "toolbar-clue-gpio.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-gpio.description", + tryItDescription: "toolbar-clue-gpio.tryItDescription", + components: undefined, + id: "GPIO", + }; }; export const ACCELEROMETER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const accelerometerSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-accelerometer-sensor.description", - descriptionTitle: "toolbar-clue-accelerometer-sensor.title", - id: "accelerometer", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-accelerometer-sensor.tryItDescription", - }; + const accelerometerSensorValues = { + X: sensorValues[SENSOR_LIST.MOTION_X], + Y: sensorValues[SENSOR_LIST.MOTION_Y], + Z: sensorValues[SENSOR_LIST.MOTION_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-accelerometer-sensor.description", + descriptionTitle: "toolbar-clue-accelerometer-sensor.title", + id: "accelerometer", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-accelerometer-sensor.tryItDescription", + }; }; export const GYROSCOPE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const gyroSensorValues = { - X: sensorValues[SENSOR_LIST.GYRO_X], - Y: sensorValues[SENSOR_LIST.GYRO_Y], - Z: sensorValues[SENSOR_LIST.GYRO_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-gyroscope-sensor.description", - descriptionTitle: "toolbar-clue-gyroscope-sensor.title", - id: "gyroscope", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-gyroscope-sensor.tryItDescription", - }; + const gyroSensorValues = { + X: sensorValues[SENSOR_LIST.GYRO_X], + Y: sensorValues[SENSOR_LIST.GYRO_Y], + Z: sensorValues[SENSOR_LIST.GYRO_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-gyroscope-sensor.description", + descriptionTitle: "toolbar-clue-gyroscope-sensor.title", + id: "gyroscope", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-gyroscope-sensor.tryItDescription", + }; }; export const MAGNETOSCOPE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const magnetSensorValues = { - X: sensorValues[SENSOR_LIST.MAGNET_X], - Y: sensorValues[SENSOR_LIST.MAGNET_Y], - Z: sensorValues[SENSOR_LIST.MAGNET_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-magnet-sensor.description", - descriptionTitle: "toolbar-clue-magnet-sensor.title", - id: "magnetoscope", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-magnet-sensor.tryItDescription", - }; + const magnetSensorValues = { + X: sensorValues[SENSOR_LIST.MAGNET_X], + Y: sensorValues[SENSOR_LIST.MAGNET_Y], + Z: sensorValues[SENSOR_LIST.MAGNET_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-magnet-sensor.description", + descriptionTitle: "toolbar-clue-magnet-sensor.title", + id: "magnetoscope", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-magnet-sensor.tryItDescription", + }; }; export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const lightSensorValues = { - R: sensorValues[SENSOR_LIST.LIGHT_R], - G: sensorValues[SENSOR_LIST.LIGHT_G], - B: sensorValues[SENSOR_LIST.LIGHT_B], - C: sensorValues[SENSOR_LIST.LIGHT_C], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-light-sensor.description", - descriptionTitle: "toolbar-clue-light-sensor.title", - id: "light_sensor", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-light-sensor.tryItDescription", - }; + const lightSensorValues = { + R: sensorValues[SENSOR_LIST.LIGHT_R], + G: sensorValues[SENSOR_LIST.LIGHT_G], + B: sensorValues[SENSOR_LIST.LIGHT_B], + C: sensorValues[SENSOR_LIST.LIGHT_C], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-light-sensor.description", + descriptionTitle: "toolbar-clue-light-sensor.title", + id: "light_sensor", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-light-sensor.tryItDescription", + }; }; export const HUMIDITY_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const humiditySensorValues = { - H: sensorValues[SENSOR_LIST.HUMIDITY], - }; - return { - descriptionTitle: "toolbar-clue-humidity-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-humidity-sensor.description", - tryItDescription: "toolbar-clue-humidity-sensor.tryItDescription", - components: [ - , - ], - id: "humidity_sensor", - }; + const humiditySensorValues = { + H: sensorValues[SENSOR_LIST.HUMIDITY], + }; + return { + descriptionTitle: "toolbar-clue-humidity-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-humidity-sensor.description", + tryItDescription: "toolbar-clue-humidity-sensor.tryItDescription", + components: [ + , + ], + id: "humidity_sensor", + }; }; export const GESTURE_CONTENT = ( - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void + onSelectGestures?: (event: React.ChangeEvent) => void, + sendGesture?: (isActive: boolean) => void ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-gesture-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-gesture-sensor.description", - tryItDescription: "toolbar-clue-gesture-sensor.tryItDescription", - components: [ - , - ], - id: "gesture_sensor", - }; + return { + descriptionTitle: "toolbar-clue-gesture-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-gesture-sensor.description", + tryItDescription: "toolbar-clue-gesture-sensor.tryItDescription", + components: [ + , + ], + id: "gesture_sensor", + }; }; export const PROXIMITY_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const proximitySensorValues = { - P: sensorValues[SENSOR_LIST.PROXIMITY], - }; - return { - descriptionTitle: "toolbar-clue-proximity-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-proximity-sensor.description", - tryItDescription: "toolbar-clue-proximity-sensor.tryItDescription", - components: [ - , - ], - id: "proximity_sensor", - }; + const proximitySensorValues = { + P: sensorValues[SENSOR_LIST.PROXIMITY], + }; + return { + descriptionTitle: "toolbar-clue-proximity-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-proximity-sensor.description", + tryItDescription: "toolbar-clue-proximity-sensor.tryItDescription", + components: [ + , + ], + id: "proximity_sensor", + }; }; export const PRESSURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const pressureSensorValues = { - P: sensorValues[SENSOR_LIST.PRESSURE], - }; - return { - descriptionTitle: "toolbar-clue-pressure-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-pressure-sensor.description", - tryItDescription: "toolbar-clue-pressure-sensor.tryItDescription", - components: [ - , - ], - id: "pressure_sensor", - }; + const pressureSensorValues = { + P: sensorValues[SENSOR_LIST.PRESSURE], + }; + return { + descriptionTitle: "toolbar-clue-pressure-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-pressure-sensor.description", + tryItDescription: "toolbar-clue-pressure-sensor.tryItDescription", + components: [ + , + ], + id: "pressure_sensor", + }; }; export const BUTTON_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-a-b-push.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-clue-a-b-push.description", - tryItDescription: "toolbar-clue-a-b-push.tryItDescription", - components: undefined, - id: "microbit_button", - }; + return { + descriptionTitle: "toolbar-clue-a-b-push.title", + tagInput: undefined, + tagOutput: TAG_INPUT_SVG, + descriptionText: "toolbar-clue-a-b-push.description", + tryItDescription: "toolbar-clue-a-b-push.tryItDescription", + components: undefined, + id: "microbit_button", + }; }; export const BLUETOOTH_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-bluetooth.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-clue-bluetooth.description", - tryItDescription: "toolbar-clue-bluetooth.tryItDescription", - components: undefined, - id: "bluetooth", - }; + return { + descriptionTitle: "toolbar-clue-bluetooth.title", + tagInput: undefined, + tagOutput: TAG_INPUT_SVG, + descriptionText: "toolbar-clue-bluetooth.description", + tryItDescription: "toolbar-clue-bluetooth.tryItDescription", + components: undefined, + id: "bluetooth", + }; }; export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-sound-sensor.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-sound-sensor.description", - tryItDescription: "toolbar-clue-sound-sensor.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "sound_sensor", - }; + return { + descriptionTitle: "toolbar-clue-sound-sensor.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-sound-sensor.description", + tryItDescription: "toolbar-clue-sound-sensor.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "sound_sensor", + }; }; export const LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-led.description", - tryItDescription: "toolbar-clue-led.tryItDescription", - components: undefined, - id: "clue_neopixel", - }; + return { + descriptionTitle: "toolbar-clue-led.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-led.description", + tryItDescription: "toolbar-clue-led.tryItDescription", + components: undefined, + id: "clue_neopixel", + }; }; export const SPEAKER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-speaker.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-speaker.description", - tryItDescription: "toolbar-speaker.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "speaker", - }; + return { + descriptionTitle: "toolbar-speaker.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-speaker.description", + tryItDescription: "toolbar-speaker.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "speaker", + }; }; diff --git a/Source/view/components/toolbar/clue/ClueSensorProperties.tsx b/Source/view/components/toolbar/clue/ClueSensorProperties.tsx index f8194eeb3..ad40283f8 100644 --- a/Source/view/components/toolbar/clue/ClueSensorProperties.tsx +++ b/Source/view/components/toolbar/clue/ClueSensorProperties.tsx @@ -2,215 +2,215 @@ import { SENSOR_LIST } from "../../../constants"; import { ISensorProps, ISliderProps } from "../../../viewUtils"; const CLUE_SLIDER_R: ISliderProps = { - axisLabel: "R", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_R, - step: 1, + axisLabel: "R", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_R, + step: 1, }; const CLUE_SLIDER_G: ISliderProps = { - axisLabel: "G", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_G, - step: 1, + axisLabel: "G", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_G, + step: 1, }; const CLUE_SLIDER_B: ISliderProps = { - axisLabel: "B", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_B, - step: 1, + axisLabel: "B", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_B, + step: 1, }; const CLUE_SLIDER_C: ISliderProps = { - axisLabel: "C", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_C, - step: 1, + axisLabel: "C", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_C, + step: 1, }; export const CLUE_LIGHT_PROPERTIES: ISensorProps = { - LABEL: "Light Sensor", - sliderProps: [CLUE_SLIDER_R, CLUE_SLIDER_G, CLUE_SLIDER_B, CLUE_SLIDER_C], - unitLabel: "Lux", + LABEL: "Light Sensor", + sliderProps: [CLUE_SLIDER_R, CLUE_SLIDER_G, CLUE_SLIDER_B, CLUE_SLIDER_C], + unitLabel: "Lux", }; // Range for magnet found here https://www.adafruit.com/product/4479 const CLUE_MAGNET_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_X, - step: 0.1, + axisLabel: "X", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.MAGNET_X, + step: 0.1, }; const CLUE_MAGNET_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_Y, - step: 0.1, + axisLabel: "Y", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.MAGNET_Y, + step: 0.1, }; const CLUE_MAGNET_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_Z, - step: 0.1, + axisLabel: "Z", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.MAGNET_Z, + step: 0.1, }; export const CLUE_MAGNET_PROPERTIES: ISensorProps = { - LABEL: "Magnetoscope", - sliderProps: [CLUE_MAGNET_X, CLUE_MAGNET_Y, CLUE_MAGNET_Z], - unitLabel: "μT", + LABEL: "Magnetoscope", + sliderProps: [CLUE_MAGNET_X, CLUE_MAGNET_Y, CLUE_MAGNET_Z], + unitLabel: "μT", }; const CLUE_GYRO_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_X, - step: 0.1, + axisLabel: "X", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.GYRO_X, + step: 0.1, }; const CLUE_GYRO_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_Y, - step: 0.1, + axisLabel: "Y", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.GYRO_Y, + step: 0.1, }; const CLUE_GYRO_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_Z, - step: 0.1, + axisLabel: "Z", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.GYRO_Z, + step: 0.1, }; export const CLUE_GYRO_PROPERTIES: ISensorProps = { - LABEL: "Gyroscope", - sliderProps: [CLUE_GYRO_X, CLUE_GYRO_Y, CLUE_GYRO_Z], - unitLabel: "deg/s", + LABEL: "Gyroscope", + sliderProps: [CLUE_GYRO_X, CLUE_GYRO_Y, CLUE_GYRO_Z], + unitLabel: "deg/s", }; export const CLUE_HUMIDITY_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "H", - maxLabel: "Max", - maxValue: 100, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.HUMIDITY, - step: 0.1, - }, - ], - unitLabel: "%", + LABEL: "Humidity Sensor", + sliderProps: [ + { + axisLabel: "H", + maxLabel: "Max", + maxValue: 100, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.HUMIDITY, + step: 0.1, + }, + ], + unitLabel: "%", }; export const CLUE__PROXIMITY_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "P", - maxLabel: "Max", - maxValue: 255, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.PROXIMITY, - step: 1, - }, - ], - unitLabel: "", + LABEL: "Humidity Sensor", + sliderProps: [ + { + axisLabel: "P", + maxLabel: "Max", + maxValue: 255, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.PROXIMITY, + step: 1, + }, + ], + unitLabel: "", }; export const CLUE_PRESSURE_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "P", - maxLabel: "Max", - maxValue: 1100, - minLabel: "Min", - minValue: 800, - type: SENSOR_LIST.PRESSURE, - step: 0.1, - }, - ], - unitLabel: "hPa", + LABEL: "Humidity Sensor", + sliderProps: [ + { + axisLabel: "P", + maxLabel: "Max", + maxValue: 1100, + minLabel: "Min", + minValue: 800, + type: SENSOR_LIST.PRESSURE, + step: 0.1, + }, + ], + unitLabel: "hPa", }; const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 1023, - minLabel: "Left", - minValue: -1023, - type: SENSOR_LIST.MOTION_X, - step: 0.1, + axisLabel: "X", + maxLabel: "Right", + maxValue: 1023, + minLabel: "Left", + minValue: -1023, + type: SENSOR_LIST.MOTION_X, + step: 0.1, }; const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 1023, - minLabel: "Back", - minValue: -1023, - type: SENSOR_LIST.MOTION_Y, - step: 0.1, + axisLabel: "Y", + maxLabel: "Front", + maxValue: 1023, + minLabel: "Back", + minValue: -1023, + type: SENSOR_LIST.MOTION_Y, + step: 0.1, }; const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 1023, - minLabel: "Up", - minValue: -1023, - type: SENSOR_LIST.MOTION_Z, - step: 0.1, + axisLabel: "Z", + maxLabel: "Down", + maxValue: 1023, + minLabel: "Up", + minValue: -1023, + type: SENSOR_LIST.MOTION_Z, + step: 0.1, }; export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "m/s2", + LABEL: "Motion sensor", + sliderProps: [ + MOTION_SLIDER_PROPS_X, + MOTION_SLIDER_PROPS_Y, + MOTION_SLIDER_PROPS_Z, + ], + unitLabel: "m/s2", }; const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 0.1, + axisLabel: "T", + maxLabel: "Hot", + maxValue: 125, + minLabel: "Cold", + minValue: -55, + type: SENSOR_LIST.TEMPERATURE, + step: 0.1, }; export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", + LABEL: "Temperature sensor", + sliderProps: [TEMPERATURE_SLIDER_PROPS], + unitLabel: "°C", }; diff --git a/Source/view/components/toolbar/cpx/CpxModalContent.tsx b/Source/view/components/toolbar/cpx/CpxModalContent.tsx index 55166eb2a..669a059ea 100644 --- a/Source/view/components/toolbar/cpx/CpxModalContent.tsx +++ b/Source/view/components/toolbar/cpx/CpxModalContent.tsx @@ -4,195 +4,195 @@ import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; import { GenericSliderComponent } from "../GenericSliderComponent"; import { - FEATURE_REQUEST_ON_GITHUB, - IModalContent, - TRY_IT_MAKE_CODE, + FEATURE_REQUEST_ON_GITHUB, + IModalContent, + TRY_IT_MAKE_CODE, } from "../SensorModalUtils"; import * as SENSOR_PROPERTIES from "./CpxSensorProperties"; export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-gpio.description", - tryItDescription: "toolbar-gpio.tryItDescription", - components: undefined, - id: "GPIO", - }; + return { + descriptionTitle: "toolbar-gpio.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-gpio.description", + tryItDescription: "toolbar-gpio.tryItDescription", + components: undefined, + id: "GPIO", + }; }; export const IR_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-ir-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-ir-sensor.description", - tryItDescription: "toolbar-ir-sensor.tryItDescription", - components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], - id: "IR", - }; + return { + descriptionTitle: "toolbar-ir-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-ir-sensor.description", + tryItDescription: "toolbar-ir-sensor.tryItDescription", + components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], + id: "IR", + }; }; export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const lightSensorValues = { - L: sensorValues[SENSOR_LIST.LIGHT], - }; - return { - descriptionTitle: "toolbar-light-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-light-sensor.description", - tryItDescription: "toolbar-light-sensor.tryItDescription", - components: [ - , - ], - id: "light_sensor", - }; + const lightSensorValues = { + L: sensorValues[SENSOR_LIST.LIGHT], + }; + return { + descriptionTitle: "toolbar-light-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-light-sensor.description", + tryItDescription: "toolbar-light-sensor.tryItDescription", + components: [ + , + ], + id: "light_sensor", + }; }; export const MOTION_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const motionSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - descriptionTitle: "toolbar-motion-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-motion-sensor.description", - tryItDescription: "toolbar-motion-sensor.tryItDescription", - components: [ - , - TRY_IT_MAKE_CODE, - FEATURE_REQUEST_ON_GITHUB, - ], - id: "motion_sensor", - }; + const motionSensorValues = { + X: sensorValues[SENSOR_LIST.MOTION_X], + Y: sensorValues[SENSOR_LIST.MOTION_Y], + Z: sensorValues[SENSOR_LIST.MOTION_Z], + }; + return { + descriptionTitle: "toolbar-motion-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-motion-sensor.description", + tryItDescription: "toolbar-motion-sensor.tryItDescription", + components: [ + , + TRY_IT_MAKE_CODE, + FEATURE_REQUEST_ON_GITHUB, + ], + id: "motion_sensor", + }; }; export const NEOP_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-neo-pixels.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-neo-pixels.description", - tryItDescription: "toolbar-neo-pixels.tryItDescription", - components: undefined, - id: "neon_pixel", - }; + return { + descriptionTitle: "toolbar-neo-pixels.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-neo-pixels.description", + tryItDescription: "toolbar-neo-pixels.tryItDescription", + components: undefined, + id: "neon_pixel", + }; }; export const PUSHB_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-a-b-push.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-a-b-push.description", - tryItDescription: "toolbar-a-b-push.tryItDescription", - components: undefined, - id: "push_btn", - }; + return { + descriptionTitle: "toolbar-a-b-push.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-a-b-push.description", + tryItDescription: "toolbar-a-b-push.tryItDescription", + components: undefined, + id: "push_btn", + }; }; export const RED_LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-red-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-red-led.description", - tryItDescription: "toolbar-red-led.tryItDescription", - components: undefined, - id: "red_LED", - }; + return { + descriptionTitle: "toolbar-red-led.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-red-led.description", + tryItDescription: "toolbar-red-led.tryItDescription", + components: undefined, + id: "red_LED", + }; }; export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-sound-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-sound-sensor.description", - tryItDescription: "toolbar-sound-sensor.tryItDescription", - components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], - id: "sound_sensor", - }; + return { + descriptionTitle: "toolbar-sound-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-sound-sensor.description", + tryItDescription: "toolbar-sound-sensor.tryItDescription", + components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], + id: "sound_sensor", + }; }; export const SWITCH_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-slider-switch.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-slider-switch.description", - tryItDescription: "toolbar-slider-switch.tryItDescription", - components: undefined, - id: "slider_switch", - }; + return { + descriptionTitle: "toolbar-slider-switch.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-slider-switch.description", + tryItDescription: "toolbar-slider-switch.tryItDescription", + components: undefined, + id: "slider_switch", + }; }; export const SPEAKER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-speaker.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-speaker.description", - tryItDescription: "toolbar-speaker.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "speaker", - }; + return { + descriptionTitle: "toolbar-speaker.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-speaker.description", + tryItDescription: "toolbar-speaker.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "speaker", + }; }; export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-temperature-sensor.description", - descriptionTitle: "toolbar-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-temperature-sensor.tryItDescription", - }; + const temperatureSensorValues = { + T: sensorValues[SENSOR_LIST.TEMPERATURE], + }; + return { + components: [ + , + ], + descriptionText: "toolbar-temperature-sensor.description", + descriptionTitle: "toolbar-temperature-sensor.title", + id: "temperature", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-temperature-sensor.tryItDescription", + }; }; diff --git a/Source/view/components/toolbar/cpx/CpxSensorProperties.tsx b/Source/view/components/toolbar/cpx/CpxSensorProperties.tsx index f91f91469..478eb36c0 100644 --- a/Source/view/components/toolbar/cpx/CpxSensorProperties.tsx +++ b/Source/view/components/toolbar/cpx/CpxSensorProperties.tsx @@ -2,70 +2,70 @@ import { SENSOR_LIST } from "../../../constants"; import { ISensorProps, ISliderProps } from "../../../viewUtils"; const LIGHT_SLIDER_PROPS: ISliderProps = { - maxValue: 320, - minValue: 0, - minLabel: "Dark", - maxLabel: "Bright", - type: "light", - axisLabel: "L", - step: 1, + maxValue: 320, + minValue: 0, + minLabel: "Dark", + maxLabel: "Bright", + type: "light", + axisLabel: "L", + step: 1, }; export const LIGHT_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Light sensor", - sliderProps: [LIGHT_SLIDER_PROPS], - unitLabel: "Lux", + LABEL: "Light sensor", + sliderProps: [LIGHT_SLIDER_PROPS], + unitLabel: "Lux", }; const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 0.1, + axisLabel: "T", + maxLabel: "Hot", + maxValue: 125, + minLabel: "Cold", + minValue: -55, + type: SENSOR_LIST.TEMPERATURE, + step: 0.1, }; export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", + LABEL: "Temperature sensor", + sliderProps: [TEMPERATURE_SLIDER_PROPS], + unitLabel: "°C", }; const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 78, - minLabel: "Left", - minValue: -78, - type: SENSOR_LIST.MOTION_X, - step: 1, + axisLabel: "X", + maxLabel: "Right", + maxValue: 78, + minLabel: "Left", + minValue: -78, + type: SENSOR_LIST.MOTION_X, + step: 1, }; const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 78, - minLabel: "Back", - minValue: -78, - type: SENSOR_LIST.MOTION_Y, - step: 1, + axisLabel: "Y", + maxLabel: "Front", + maxValue: 78, + minLabel: "Back", + minValue: -78, + type: SENSOR_LIST.MOTION_Y, + step: 1, }; const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 78, - minLabel: "Up", - minValue: -78, - type: SENSOR_LIST.MOTION_Z, - step: 1, + axisLabel: "Z", + maxLabel: "Down", + maxValue: 78, + minLabel: "Up", + minValue: -78, + type: SENSOR_LIST.MOTION_Z, + step: 1, }; export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "Lux", + LABEL: "Motion sensor", + sliderProps: [ + MOTION_SLIDER_PROPS_X, + MOTION_SLIDER_PROPS_Y, + MOTION_SLIDER_PROPS_Z, + ], + unitLabel: "Lux", }; diff --git a/Source/view/components/toolbar/microbit/MicrobitModalContent.tsx b/Source/view/components/toolbar/microbit/MicrobitModalContent.tsx index c53cf5554..c0ffe7b5b 100644 --- a/Source/view/components/toolbar/microbit/MicrobitModalContent.tsx +++ b/Source/view/components/toolbar/microbit/MicrobitModalContent.tsx @@ -8,180 +8,180 @@ import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; import * as SENSOR_PROPERTIES from "./MicrobitSensorProperties"; export const ACCELEROMETER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - // this object will be accessed with the axis label - const accelerometerSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-accelerometer-sensor.description", - descriptionTitle: "toolbar-accelerometer-sensor.title", - id: "accelerometer", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-accelerometer-sensor.tryItDescription", - }; + // this object will be accessed with the axis label + const accelerometerSensorValues = { + X: sensorValues[SENSOR_LIST.MOTION_X], + Y: sensorValues[SENSOR_LIST.MOTION_Y], + Z: sensorValues[SENSOR_LIST.MOTION_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-accelerometer-sensor.description", + descriptionTitle: "toolbar-accelerometer-sensor.title", + id: "accelerometer", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-accelerometer-sensor.tryItDescription", + }; }; export const LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-led.description", - tryItDescription: "toolbar-microbit-led.tryItDescription", - components: undefined, - id: "microbit_LED", - }; + return { + descriptionTitle: "toolbar-microbit-led.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-led.description", + tryItDescription: "toolbar-microbit-led.tryItDescription", + components: undefined, + id: "microbit_LED", + }; }; export const BUTTON_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-a-b-push.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-microbit-a-b-push.description", - tryItDescription: "toolbar-microbit-a-b-push.tryItDescription", - components: undefined, - id: "microbit_button", - }; + return { + descriptionTitle: "toolbar-microbit-a-b-push.title", + tagInput: undefined, + tagOutput: TAG_INPUT_SVG, + descriptionText: "toolbar-microbit-a-b-push.description", + tryItDescription: "toolbar-microbit-a-b-push.tryItDescription", + components: undefined, + id: "microbit_button", + }; }; export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-sound.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-sound.description", - tryItDescription: "toolbar-microbit-sound.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_sound", - }; + return { + descriptionTitle: "toolbar-microbit-sound.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-sound.description", + tryItDescription: "toolbar-microbit-sound.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_sound", + }; }; export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-gpio.description", - tryItDescription: "toolbar-microbit-gpio.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_gpio", - }; + return { + descriptionTitle: "toolbar-microbit-gpio.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-gpio.description", + tryItDescription: "toolbar-microbit-gpio.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_gpio", + }; }; export const COMPASS_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-compass-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-compass-sensor.description", - tryItDescription: "toolbar-microbit-compass-sensor.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_compass", - }; + return { + descriptionTitle: "toolbar-microbit-compass-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-compass-sensor.description", + tryItDescription: "toolbar-microbit-compass-sensor.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_compass", + }; }; export const WIRELESS_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-wireless.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-wireless.description", - tryItDescription: "toolbar-microbit-wireless.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_wireless", - }; + return { + descriptionTitle: "toolbar-microbit-wireless.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-wireless.description", + tryItDescription: "toolbar-microbit-wireless.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_wireless", + }; }; export const GESTURE_CONTENT = ( - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void + onSelectGestures?: (event: React.ChangeEvent) => void, + sendGesture?: (isActive: boolean) => void ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-gesture-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-microbit-gesture-sensor.description", - tryItDescription: "toolbar-microbit-gesture-sensor.tryItDescription", - components: [ - , - ], - id: "gesture_sensor", - }; + return { + descriptionTitle: "toolbar-microbit-gesture-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-microbit-gesture-sensor.description", + tryItDescription: "toolbar-microbit-gesture-sensor.tryItDescription", + components: [ + , + ], + id: "gesture_sensor", + }; }; export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const lightSensorValues = { - L: sensorValues[SENSOR_LIST.LIGHT], - }; - return { - descriptionTitle: "toolbar-light-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-light-sensor.description", - tryItDescription: "toolbar-light-sensor.tryItDescription", - components: [ - , - ], - id: "light_sensor", - }; + const lightSensorValues = { + L: sensorValues[SENSOR_LIST.LIGHT], + }; + return { + descriptionTitle: "toolbar-light-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-light-sensor.description", + tryItDescription: "toolbar-light-sensor.tryItDescription", + components: [ + , + ], + id: "light_sensor", + }; }; export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-temperature-sensor.description", - descriptionTitle: "toolbar-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-temperature-sensor.tryItDescription", - }; + const temperatureSensorValues = { + T: sensorValues[SENSOR_LIST.TEMPERATURE], + }; + return { + components: [ + , + ], + descriptionText: "toolbar-temperature-sensor.description", + descriptionTitle: "toolbar-temperature-sensor.title", + id: "temperature", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-temperature-sensor.tryItDescription", + }; }; diff --git a/Source/view/components/toolbar/microbit/MicrobitSensorProperties.tsx b/Source/view/components/toolbar/microbit/MicrobitSensorProperties.tsx index c32b00477..4a8974625 100644 --- a/Source/view/components/toolbar/microbit/MicrobitSensorProperties.tsx +++ b/Source/view/components/toolbar/microbit/MicrobitSensorProperties.tsx @@ -2,73 +2,73 @@ import { SENSOR_LIST } from "../../../constants"; import { ISensorProps, ISliderProps } from "../../../viewUtils"; const LIGHT_SLIDER_PROPS: ISliderProps = { - maxValue: 255, - minValue: 0, - minLabel: "Dark", - maxLabel: "Bright", - type: "light", - axisLabel: "L", - step: 1, + maxValue: 255, + minValue: 0, + minLabel: "Dark", + maxLabel: "Bright", + type: "light", + axisLabel: "L", + step: 1, }; export const LIGHT_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Light sensor", - sliderProps: [LIGHT_SLIDER_PROPS], - unitLabel: "Lux", + LABEL: "Light sensor", + sliderProps: [LIGHT_SLIDER_PROPS], + unitLabel: "Lux", }; const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 1023, - minLabel: "Left", - minValue: -1023, - type: SENSOR_LIST.MOTION_X, - step: 1, + axisLabel: "X", + maxLabel: "Right", + maxValue: 1023, + minLabel: "Left", + minValue: -1023, + type: SENSOR_LIST.MOTION_X, + step: 1, }; const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 1023, - minLabel: "Back", - minValue: -1023, - type: SENSOR_LIST.MOTION_Y, - step: 1, + axisLabel: "Y", + maxLabel: "Front", + maxValue: 1023, + minLabel: "Back", + minValue: -1023, + type: SENSOR_LIST.MOTION_Y, + step: 1, }; const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 1023, - minLabel: "Up", - minValue: -1023, - type: SENSOR_LIST.MOTION_Z, - step: 1, + axisLabel: "Z", + maxLabel: "Down", + maxValue: 1023, + minLabel: "Up", + minValue: -1023, + type: SENSOR_LIST.MOTION_Z, + step: 1, }; export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "m/s2", + LABEL: "Motion sensor", + sliderProps: [ + MOTION_SLIDER_PROPS_X, + MOTION_SLIDER_PROPS_Y, + MOTION_SLIDER_PROPS_Z, + ], + unitLabel: "m/s2", }; const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 1, + axisLabel: "T", + maxLabel: "Hot", + maxValue: 125, + minLabel: "Cold", + minValue: -55, + type: SENSOR_LIST.TEMPERATURE, + step: 1, }; export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", + LABEL: "Temperature sensor", + sliderProps: [TEMPERATURE_SLIDER_PROPS], + unitLabel: "°C", }; diff --git a/Source/view/constants.ts b/Source/view/constants.ts index 56dda92af..2503ff43c 100644 --- a/Source/view/constants.ts +++ b/Source/view/constants.ts @@ -3,150 +3,150 @@ // Key events export const CONSTANTS = { - CURRENTLY_RUNNING: (file: string) => { - return `Currently running: ${file}`; - }, - DEVICE_NAME: { - CPX: "CPX", - MICROBIT: "micro:bit", - }, - ID_NAME: { - BUTTON_A: "BTN_A_OUTER", - BUTTON_AB: "BTN_AB_OUTER", - BUTTON_B: "BTN_B_OUTER", - PIN_A1: "PIN_A1", - PIN_A2: "PIN_A2", - PIN_A3: "PIN_A3", - PIN_A4: "PIN_A4", - PIN_A5: "PIN_A5", - PIN_A6: "PIN_A6", - PIN_A7: "PIN_A7", - PLAY_BUTTON: "play-button", - REFRESH_BUTTON: "refresh-button", - STOP_BUTTON: "stop-button", - SWITCH: "SWITCH", - }, - KEYBOARD_KEYS: { - A: "KeyA", - B: "KeyB", - C: "KeyC", - CAPITAL_R: "R", - CAPITAL_F: "F", - ENTER: "Enter", - S: "KeyS", - NUMERIC_ONE: "Digit1", - NUMERIC_TWO: "Digit2", - NUMERIC_THREE: "Digit3", - NUMERIC_FOUR: "Digit4", - NUMERIC_FIVE: "Digit5", - NUMERIC_SIX: "Digit6", - NUMERIC_SEVEN: "Digit7", - }, - FILES_PLACEHOLDER: - "The simulator will run the .py file you have focused on.", - SIMULATOR_BUTTON_WIDTH: 60, - TOOLBAR_INFO: `Explore what's on the board:`, - LED_TINT_FACTOR: 0.5, + CURRENTLY_RUNNING: (file: string) => { + return `Currently running: ${file}`; + }, + DEVICE_NAME: { + CPX: "CPX", + MICROBIT: "micro:bit", + }, + ID_NAME: { + BUTTON_A: "BTN_A_OUTER", + BUTTON_AB: "BTN_AB_OUTER", + BUTTON_B: "BTN_B_OUTER", + PIN_A1: "PIN_A1", + PIN_A2: "PIN_A2", + PIN_A3: "PIN_A3", + PIN_A4: "PIN_A4", + PIN_A5: "PIN_A5", + PIN_A6: "PIN_A6", + PIN_A7: "PIN_A7", + PLAY_BUTTON: "play-button", + REFRESH_BUTTON: "refresh-button", + STOP_BUTTON: "stop-button", + SWITCH: "SWITCH", + }, + KEYBOARD_KEYS: { + A: "KeyA", + B: "KeyB", + C: "KeyC", + CAPITAL_R: "R", + CAPITAL_F: "F", + ENTER: "Enter", + S: "KeyS", + NUMERIC_ONE: "Digit1", + NUMERIC_TWO: "Digit2", + NUMERIC_THREE: "Digit3", + NUMERIC_FOUR: "Digit4", + NUMERIC_FIVE: "Digit5", + NUMERIC_SIX: "Digit6", + NUMERIC_SEVEN: "Digit7", + }, + FILES_PLACEHOLDER: + "The simulator will run the .py file you have focused on.", + SIMULATOR_BUTTON_WIDTH: 60, + TOOLBAR_INFO: `Explore what's on the board:`, + LED_TINT_FACTOR: 0.5, }; export const AB_BUTTONS_KEYS = { - BTN_A: "BTN_A", - BTN_B: "BTN_B", - BTN_AB: "BTN_AB", + BTN_A: "BTN_A", + BTN_B: "BTN_B", + BTN_AB: "BTN_AB", }; export const BUTTON_CLASSNAME = { - ACTIVE: "sim-button-group", - DEACTIVATED: "sim-button-group-deactivated", + ACTIVE: "sim-button-group", + DEACTIVATED: "sim-button-group-deactivated", }; export const BUTTON_STYLING_CLASSES = { - DEFAULT: "sim-button-outer", - KEYPRESSED: "sim-button-key-press", + DEFAULT: "sim-button-outer", + KEYPRESSED: "sim-button-key-press", }; export const CLUE_LEDS_COLORS = { - WHITE_LEDS_OFF: "#ffde00", - WHITE_LEDS_ON: "white", - RED_LED_OFF: "#808080", - RED_LED_ON: "red", + WHITE_LEDS_OFF: "#ffde00", + WHITE_LEDS_ON: "white", + RED_LED_OFF: "#808080", + RED_LED_ON: "red", }; export enum DEVICE_LIST_KEY { - CPX = "CPX", - MICROBIT = "micro:bit", - CLUE = "CLUE", + CPX = "CPX", + MICROBIT = "micro:bit", + CLUE = "CLUE", } // Pauses on Debug mode alter the state of the view export enum VIEW_STATE { - PAUSE = "debug-pause", - RUNNING = "running", + PAUSE = "debug-pause", + RUNNING = "running", } // export enum WEBVIEW_MESSAGES { - SWITCH_DEVICE = "switch-device", - REFRESH_SIMULATOR = "refresh-simulator", - TOGGLE_PLAY_STOP = "toggle-play-stop", - BUTTON_PRESS = "button-press", - SENSOR_CHANGED = "sensor-changed", - GESTURE = "gesture", - SLIDER_TELEMETRY = "slider-telemetry", + SWITCH_DEVICE = "switch-device", + REFRESH_SIMULATOR = "refresh-simulator", + TOGGLE_PLAY_STOP = "toggle-play-stop", + BUTTON_PRESS = "button-press", + SENSOR_CHANGED = "sensor-changed", + GESTURE = "gesture", + SLIDER_TELEMETRY = "slider-telemetry", } export enum VSCODE_MESSAGES_TO_WEBVIEW { - SET_DEVICE = "set-device", - PAUSE_DEVICE = "pause-device", - RUN_DEVICE = "run-device", - RESET = "reset-state", - CURRENT_FILE = "current-file", - SET_STATE = "set-state", + SET_DEVICE = "set-device", + PAUSE_DEVICE = "pause-device", + RUN_DEVICE = "run-device", + RESET = "reset-state", + CURRENT_FILE = "current-file", + SET_STATE = "set-state", } export enum DEBUG_COMMANDS { - STACK_TRACE = "stackTrace", - CONTINUE = "continue", - DISCONNECT = "disconnect", + STACK_TRACE = "stackTrace", + CONTINUE = "continue", + DISCONNECT = "disconnect", } export enum SENSOR_LIST { - TEMPERATURE = "temperature", - LIGHT = "light", - ACCELEROMETER = "accelerometer", - MOTION_X = "motion_x", - MOTION_Y = "motion_y", - MOTION_Z = "motion_z", - LIGHT_R = "light_r", - LIGHT_G = "light_g", - LIGHT_B = "light_b", - LIGHT_C = "light_c", - HUMIDITY = "humidity", - PRESSURE = "pressure", - PROXIMITY = "proximity", - MAGNET_X = "magnet_x", - MAGNET_Y = "magnet_y", - MAGNET_Z = "magnet_z", - GYRO_X = "gyro_x", - GYRO_Y = "gyro_y", - GYRO_Z = "gyro_z", + TEMPERATURE = "temperature", + LIGHT = "light", + ACCELEROMETER = "accelerometer", + MOTION_X = "motion_x", + MOTION_Y = "motion_y", + MOTION_Z = "motion_z", + LIGHT_R = "light_r", + LIGHT_G = "light_g", + LIGHT_B = "light_b", + LIGHT_C = "light_c", + HUMIDITY = "humidity", + PRESSURE = "pressure", + PROXIMITY = "proximity", + MAGNET_X = "magnet_x", + MAGNET_Y = "magnet_y", + MAGNET_Z = "magnet_z", + GYRO_X = "gyro_x", + GYRO_Y = "gyro_y", + GYRO_Z = "gyro_z", } export const GESTURES_MICROBIT = [ - "shake", - "up", - "down", - "left", - "right", - "face up", - "face down", - "freefall", - "3g", - "6g", - "8g", + "shake", + "up", + "down", + "left", + "right", + "face up", + "face down", + "freefall", + "3g", + "6g", + "8g", ]; export const GESTURES_CLUE = ["up", "down", "left", "right", "shake"]; export enum WEBVIEW_ATTRIBUTES_KEY { - INITIAL_DEVICE = "initial_device", - TYPE = "webview_type", + INITIAL_DEVICE = "initial_device", + TYPE = "webview_type", } export enum WEBVIEW_TYPES { - SIMULATOR = "simulator", - GETTING_STARTED = "getting_started", + SIMULATOR = "simulator", + GETTING_STARTED = "getting_started", } export const DEFAULT_IMG_CLUE = `/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAEBAQEBAQEBA QEBAQEBAQICAQEBAQMCAgICAwMEBAMDAwMEBAYFBAQFBAMDBQcFBQYGBgYGBAUHBwcGBwYGBgb/2wBDAQEBAQEBAQMCAgMGBAMEB diff --git a/Source/view/container/device/Device.spec.tsx b/Source/view/container/device/Device.spec.tsx index 0423721ef..5271bcdfa 100644 --- a/Source/view/container/device/Device.spec.tsx +++ b/Source/view/container/device/Device.spec.tsx @@ -6,25 +6,25 @@ import { DEVICE_LIST_KEY } from "../../constants"; import { Device } from "./Device"; describe("Device component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/container/device/Device.tsx b/Source/view/container/device/Device.tsx index dd30d2dc6..41705059e 100644 --- a/Source/view/container/device/Device.tsx +++ b/Source/view/container/device/Device.tsx @@ -8,35 +8,35 @@ import { Microbit } from "../../components/microbit/Microbit"; import { DEVICE_LIST_KEY } from "../../constants"; interface IProps { - currentSelectedDevice: string; + currentSelectedDevice: string; } // Container to switch between multiple devices export class Device extends React.Component { - constructor(props: IProps) { - super(props); - } - render() { - const { currentSelectedDevice } = this.props; + constructor(props: IProps) { + super(props); + } + render() { + const { currentSelectedDevice } = this.props; - return ( -
- - {loadSelectedDevice(currentSelectedDevice)} - -
- ); - } + return ( +
+ + {loadSelectedDevice(currentSelectedDevice)} + +
+ ); + } } const loadSelectedDevice = (currentSelectedDevice: string) => { - switch (currentSelectedDevice) { - case DEVICE_LIST_KEY.CPX: - return ; - case DEVICE_LIST_KEY.MICROBIT: - return ; - case DEVICE_LIST_KEY.CLUE: - return ; - default: - return null; - } + switch (currentSelectedDevice) { + case DEVICE_LIST_KEY.CPX: + return ; + case DEVICE_LIST_KEY.MICROBIT: + return ; + case DEVICE_LIST_KEY.CLUE: + return ; + default: + return null; + } }; diff --git a/Source/view/index.css b/Source/view/index.css index 918c31f9e..3801bbf26 100644 --- a/Source/view/index.css +++ b/Source/view/index.css @@ -1,13 +1,13 @@ @import url("https://fonts.googleapis.com/css?family=Joti+One"); body { - margin: 0; - padding: 0; - font-family: sans-serif; + margin: 0; + padding: 0; + font-family: sans-serif; } html, body { - overflow: hidden; - height: 100%; + overflow: hidden; + height: 100%; } diff --git a/Source/view/index.tsx b/Source/view/index.tsx index 32e7400b1..2d9c941b6 100644 --- a/Source/view/index.tsx +++ b/Source/view/index.tsx @@ -12,11 +12,11 @@ const messageEn = require("./translations/en.json"); const locale = "en"; const message = { - en: messageEn, + en: messageEn, }; ReactDOM.render( - - - , - document.getElementById("root") + + + , + document.getElementById("root") ); diff --git a/Source/view/pages/gettingStarted.css b/Source/view/pages/gettingStarted.css index ae6d20b4f..29a072207 100644 --- a/Source/view/pages/gettingStarted.css +++ b/Source/view/pages/gettingStarted.css @@ -1,56 +1,56 @@ .inv { - display: none; + display: none; } .codeText { - overflow-x: auto; - white-space: pre-wrap; - word-wrap: break-word; + overflow-x: auto; + white-space: pre-wrap; + word-wrap: break-word; } li:not(:last-child) { - margin-bottom: 6px; + margin-bottom: 6px; } .normalFontWeight { - font-weight: normal; + font-weight: normal; } .deviceSelector { - width: 250px; - border: 1px solid var(--vscode-dropdown-border); - background-color: var(--vscode-dropdown-background); - color: var(--vscode-dropdown-foreground); - margin: 0 0 5px; - padding: 8px; - border-radius: 5px; - font-size: 12px; - padding-right: 30px; + width: 250px; + border: 1px solid var(--vscode-dropdown-border); + background-color: var(--vscode-dropdown-background); + color: var(--vscode-dropdown-foreground); + margin: 0 0 5px; + padding: 8px; + border-radius: 5px; + font-size: 12px; + padding-right: 30px; } .deviceSelector optgroup { - background-color: var(--vscode-dropdown-listBackground); - color: var(--vscode-dropdown-foreground); + background-color: var(--vscode-dropdown-listBackground); + color: var(--vscode-dropdown-foreground); } .deviceSelector option { - background-color: var(--vscode-dropdown-listBackground); - color: var(--vscode-dropdown-foreground); + background-color: var(--vscode-dropdown-listBackground); + color: var(--vscode-dropdown-foreground); } .codeBox { - display: block; - width: 90%; - margin: 10px; - padding: 15px; - text-align: left; - background: none; - border: 1px solid grey; - border-radius: 4px; - background-color: var(--vscode-textCodeBlock-background); + display: block; + width: 90%; + margin: 10px; + padding: 15px; + text-align: left; + background: none; + border: 1px solid grey; + border-radius: 4px; + background-color: var(--vscode-textCodeBlock-background); } .container { - text-align: left; - padding: 0 10px 20px 10px; + text-align: left; + padding: 0 10px 20px 10px; } diff --git a/Source/view/pages/gettingStarted.spec.tsx b/Source/view/pages/gettingStarted.spec.tsx index 12554fdfb..c45e2e6d1 100644 --- a/Source/view/pages/gettingStarted.spec.tsx +++ b/Source/view/pages/gettingStarted.spec.tsx @@ -5,25 +5,25 @@ import * as testRenderer from "react-test-renderer"; import { GettingStartedPage } from "./gettingStarted"; describe("GettingStartedPage component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/styles/Button.css b/Source/view/styles/Button.css index c30ed1360..993bd4937 100644 --- a/Source/view/styles/Button.css +++ b/Source/view/styles/Button.css @@ -1,50 +1,50 @@ .button { - height: 32px; - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-debugToolBar-background); + height: 32px; + background: var(--vscode-debugToolBar-background); + border-color: var(--vscode-debugToolBar-background); } .button-icon { - fill: var(--vscode-badgeForegroundOverride); + fill: var(--vscode-badgeForegroundOverride); } .button-rectangle { - stroke: var(--vscode-badgeForegroundOverride); + stroke: var(--vscode-badgeForegroundOverride); } .play-button { - border-radius: 8px 0px 0px 8px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-radius: 8px 0px 0px 8px; + border-color: var(--vscode-highContrastButtonBorderOverride-color); } .refresh-button { - border-radius: 0px 8px 8px 0px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-radius: 0px 8px 8px 0px; + border-color: var(--vscode-highContrastButtonBorderOverride-color); } .button:focus, .button:hover { - background-color: var(--vscode-terminal-selectionBackground); + background-color: var(--vscode-terminal-selectionBackground); } .button:active { - background-color: var(--vscode-editor-selectionHighlightBackground); + background-color: var(--vscode-editor-selectionHighlightBackground); } .toolbar-button { - border: none; + border: none; } .toolbar-button:hover { - outline: none; + outline: none; } .edge-button { - pointer-events: none; - border: none; + pointer-events: none; + border: none; } .button-pressed { - background-color: var(--vscode-button-background); - outline: none; + background-color: var(--vscode-button-background); + outline: none; } diff --git a/Source/view/styles/Dropdown.css b/Source/view/styles/Dropdown.css index b69b14c74..b617665a9 100644 --- a/Source/view/styles/Dropdown.css +++ b/Source/view/styles/Dropdown.css @@ -1,24 +1,24 @@ .dropdown { - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-foreground); - border-radius: 2px; - box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.22); - color: var(--vscode-foreground); - height: 32px; - width: 100%; + background: var(--vscode-debugToolBar-background); + border-color: var(--vscode-foreground); + border-radius: 2px; + box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.22); + color: var(--vscode-foreground); + height: 32px; + width: 100%; } select.dropdown:hover, select.dropdown:focus, select.dropdown:active { - outline: 1px solid var(--vscode-button-background); + outline: 1px solid var(--vscode-button-background); } option { - height: 32px; - background: var(--vscode-debugToolBar-background); - outline: 0; - align-items: center; - font-size: 14px; - color: var(--vscode-foreground); + height: 32px; + background: var(--vscode-debugToolBar-background); + outline: 0; + align-items: center; + font-size: 14px; + color: var(--vscode-foreground); } diff --git a/Source/view/styles/InputSlider.css b/Source/view/styles/InputSlider.css index b51dae8f3..0adcd1340 100644 --- a/Source/view/styles/InputSlider.css +++ b/Source/view/styles/InputSlider.css @@ -1,103 +1,103 @@ :root { - --slider-gray-color: #cccccc; - --slider-width: 240px; + --slider-gray-color: #cccccc; + --slider-width: 240px; } .inputSlider { - height: 48px; - margin-bottom: 60px; - display: table-cell; + height: 48px; + margin-bottom: 60px; + display: table-cell; } .sliderValue { - -webkit-appearance: none; - text-align: center; - width: 48px; - height: 32px; - background-color: var(--vscode-editor-background); - margin-right: 15px; - margin-top: auto; - margin-bottom: auto; - margin-left: 5px; - color: var(--badgeForegroundOverride); - border-radius: 2px; - font-size: 16px; - font-weight: bold; - border-width: 1px; - border-radius: 2px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); + -webkit-appearance: none; + text-align: center; + width: 48px; + height: 32px; + background-color: var(--vscode-editor-background); + margin-right: 15px; + margin-top: auto; + margin-bottom: auto; + margin-left: 5px; + color: var(--badgeForegroundOverride); + border-radius: 2px; + font-size: 16px; + font-weight: bold; + border-width: 1px; + border-radius: 2px; + border-color: var(--vscode-highContrastButtonBorderOverride-color); } .slider { - -webkit-appearance: none; - background-color: var(--slider-gray-color); - height: 1px; - width: var(--slider-width); - vertical-align: middle; + -webkit-appearance: none; + background-color: var(--slider-gray-color); + height: 1px; + width: var(--slider-width); + vertical-align: middle; } .slider::-webkit-slider-thumb { - -webkit-appearance: none; - appearance: none; - width: 16px; - height: 16px; - border-radius: 50%; - background: var(--vscode-textLink-activeForeground); - cursor: pointer; + -webkit-appearance: none; + appearance: none; + width: 16px; + height: 16px; + border-radius: 50%; + background: var(--vscode-textLink-activeForeground); + cursor: pointer; } .slider::-webkit-slider-runnable-track:focus, .inputSlider:focus, .slider:focus { - outline: none; + outline: none; } .sliderValue:focus, .sliderValue:hover { - -webkit-appearance: none; - color: var(--vscode-textLink-activeForeground); - outline: 1px solid var(--vscode-textLink-activeForeground); + -webkit-appearance: none; + color: var(--vscode-textLink-activeForeground); + outline: 1px solid var(--vscode-textLink-activeForeground); } .maxLabel, .minLabel { - display: inline-block; - position: absolute; - vertical-align: top; + display: inline-block; + position: absolute; + vertical-align: top; } .maxLabel { - right: 0; + right: 0; } .minLabel { - left: 0; + left: 0; } .sliderArea, .sliderValue { - display: inline-block; - vertical-align: middle; + display: inline-block; + vertical-align: middle; } .sliderArea { - width: var(--slider-width); - height: 49px; + width: var(--slider-width); + height: 49px; } .downLabelArea { - width: var(--slider-width); - height: 15px; - margin-top: 10px; - position: relative; - font-size: 14px; + width: var(--slider-width); + height: 15px; + margin-top: 10px; + position: relative; + font-size: 14px; } .upLabelArea { - width: var(--slider-width); - height: 15px; - margin-bottom: 10px; - position: relative; - font-weight: bolder; - font-size: 16px; + width: var(--slider-width); + height: 15px; + margin-bottom: 10px; + position: relative; + font-weight: bolder; + font-size: 16px; } .slider, .upLabelArea, .downLabelArea { - display: block; + display: block; } diff --git a/Source/view/styles/LightSensorBar.css b/Source/view/styles/LightSensorBar.css index 5d0abac42..ec70e6765 100644 --- a/Source/view/styles/LightSensorBar.css +++ b/Source/view/styles/LightSensorBar.css @@ -1,20 +1,20 @@ .title { - font-size: 14px; - text-align: left; - font-weight: bold; + font-size: 14px; + text-align: left; + font-weight: bold; } .header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; + -webkit-appearance: none; + height: 30px; + margin-bottom: 2px; } .lightSensorBar { - -webkit-appearance: none; - margin-top: 10px; - width: 400px; - margin-left: auto; - margin-right: auto; - padding-bottom: 16px; + -webkit-appearance: none; + margin-top: 10px; + width: 400px; + margin-left: auto; + margin-right: auto; + padding-bottom: 16px; } diff --git a/Source/view/styles/MotionSensorBar.css b/Source/view/styles/MotionSensorBar.css index 8ea39c23c..5d68da3c9 100644 --- a/Source/view/styles/MotionSensorBar.css +++ b/Source/view/styles/MotionSensorBar.css @@ -1,20 +1,20 @@ .title { - font-size: 14px; - text-align: left; + font-size: 14px; + text-align: left; } .header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; + -webkit-appearance: none; + height: 30px; + margin-bottom: 2px; } .MotionSensorBar { - width: 100%; - margin-left: auto; - margin-right: auto; + width: 100%; + margin-left: auto; + margin-right: auto; } .sensor-button-container { - padding: 10px 0; + padding: 10px 0; } diff --git a/Source/view/styles/SensorButton.css b/Source/view/styles/SensorButton.css index 21241eca2..75c322083 100644 --- a/Source/view/styles/SensorButton.css +++ b/Source/view/styles/SensorButton.css @@ -1,29 +1,29 @@ .sensor-button { - color: var(--vscode-badgeForegroundOverride); - text-align: center; - background-color: var(--vscode-button-background); - width: 100%; - height: 32px; - font-weight: bolder; - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - padding: 4px; + color: var(--vscode-badgeForegroundOverride); + text-align: center; + background-color: var(--vscode-button-background); + width: 100%; + height: 32px; + font-weight: bolder; + border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-width: 1px; + border-style: solid; + padding: 4px; } .sensor-button:focus, .sensor-button:active { - outline-width: thick; - outline-offset: 4px; - outline: 2px solid var(--vscode-focusBorder); - background-color: var(--vscode-button-hoverBackground); + outline-width: thick; + outline-offset: 4px; + outline: 2px solid var(--vscode-focusBorder); + background-color: var(--vscode-button-hoverBackground); } .sensor-button:active, .active-button { - opacity: 0.5; + opacity: 0.5; } .sensor-button:hover { - background-color: var(--vscode-button-hoverBackground); + background-color: var(--vscode-button-hoverBackground); } diff --git a/Source/view/styles/Simulator.css b/Source/view/styles/Simulator.css index 016cc8855..ea7979248 100644 --- a/Source/view/styles/Simulator.css +++ b/Source/view/styles/Simulator.css @@ -1,83 +1,83 @@ .simulator { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - max-width: 700px; - max-height: 700px; - margin-left: auto; - margin-right: auto; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + max-width: 700px; + max-height: 700px; + margin-left: auto; + margin-right: auto; } .buttons { - display: flex; - flex-direction: row; - padding-top: 20px; - justify-content: center; + display: flex; + flex-direction: row; + padding-top: 20px; + justify-content: center; } .file-selector { - padding: 20px; - width: 80%; - height: 30px; - border: 1px solid var(--vscode-debugToolBar-background); - border-radius: 3px; + padding: 20px; + width: 80%; + height: 30px; + border: 1px solid var(--vscode-debugToolBar-background); + border-radius: 3px; } .shake-pressed { - /* Start the shake animation and make the animation last for 0.5 seconds */ - animation: shake 0.5s; + /* Start the shake animation and make the animation last for 0.5 seconds */ + animation: shake 0.5s; - /* When the animation is finished, start again */ - animation-iteration-count: infinite; + /* When the animation is finished, start again */ + animation-iteration-count: infinite; } @keyframes shake { - 0% { - transform: translate(1px, 1px) rotate(0deg); - } - 10% { - transform: translate(-1px, -2px) rotate(-1deg); - } - 20% { - transform: translate(-3px, 0px) rotate(1deg); - } - 30% { - transform: translate(3px, 2px) rotate(0deg); - } - 40% { - transform: translate(1px, -1px) rotate(1deg); - } - 50% { - transform: translate(-1px, 2px) rotate(-1deg); - } - 60% { - transform: translate(-3px, 1px) rotate(0deg); - } - 70% { - transform: translate(3px, 1px) rotate(-1deg); - } - 80% { - transform: translate(-1px, -1px) rotate(1deg); - } - 90% { - transform: translate(1px, 2px) rotate(0deg); - } - 100% { - transform: translate(1px, -2px) rotate(-1deg); - } + 0% { + transform: translate(1px, 1px) rotate(0deg); + } + 10% { + transform: translate(-1px, -2px) rotate(-1deg); + } + 20% { + transform: translate(-3px, 0px) rotate(1deg); + } + 30% { + transform: translate(3px, 2px) rotate(0deg); + } + 40% { + transform: translate(1px, -1px) rotate(1deg); + } + 50% { + transform: translate(-1px, 2px) rotate(-1deg); + } + 60% { + transform: translate(-3px, 1px) rotate(0deg); + } + 70% { + transform: translate(3px, 1px) rotate(-1deg); + } + 80% { + transform: translate(-1px, -1px) rotate(1deg); + } + 90% { + transform: translate(1px, 2px) rotate(0deg); + } + 100% { + transform: translate(1px, -2px) rotate(-1deg); + } } .microbit-container { - max-width: 350px; - padding: 20px; + max-width: 350px; + padding: 20px; } .clue-container { - width: 100%; - max-width: 500px; - padding: 20px; + width: 100%; + max-width: 500px; + padding: 20px; } .cpx-container { - width: 100%; - padding-top: 10px; + width: 100%; + padding-top: 10px; } diff --git a/Source/view/styles/SimulatorSvg.css b/Source/view/styles/SimulatorSvg.css index 10d839893..523411c2f 100644 --- a/Source/view/styles/SimulatorSvg.css +++ b/Source/view/styles/SimulatorSvg.css @@ -1,115 +1,115 @@ .microbit-svg { - padding: 0 0 0 10px; + padding: 0 0 0 10px; } svg.sim { - box-sizing: border-box; - width: 100%; - height: 100%; - display: block; + box-sizing: border-box; + width: 100%; + height: 100%; + display: block; } svg.sim.grayscale { - -moz-filter: grayscale(1); - -webkit-filter: grayscale(1); - filter: grayscale(1); + -moz-filter: grayscale(1); + -webkit-filter: grayscale(1); + filter: grayscale(1); } .sim-button-group { - cursor: pointer; + cursor: pointer; } .sim-button { - pointer-events: none; - fill: "rgb(17, 17, 17)"; + pointer-events: none; + fill: "rgb(17, 17, 17)"; } .sim-button-group > .sim-button:active { - fill: orange; + fill: orange; } .sim-text-outside { - font-size: 25px; - fill: var(--vscode-foreground); + font-size: 25px; + fill: var(--vscode-foreground); } .sim-board, .sim-display, sim-button { - fill: #111; + fill: #111; } .sim-button-group > .sim-button-outer:hover { - stroke: orange; - stroke-width: 4px; + stroke: orange; + stroke-width: 4px; } .sim-button-group > .sim-button-outer:active { - fill: orange; + fill: orange; } .sim-button-outer { - fill: #7e7272; + fill: #7e7272; } .sim-button-key-press { - fill: orange; + fill: orange; } .sim-button-nut { - fill: #704a4a; - pointer-events: none; + fill: #704a4a; + pointer-events: none; } .sim-systemled { - fill: #333; - stroke: #555; - stroke-width: 1px; + fill: #333; + stroke: #555; + stroke-width: 1px; } .sim-light-level-button { - stroke: #fff; - stroke-width: 3px; + stroke: #fff; + stroke-width: 3px; } .sim-antenna { - stroke: #555; - stroke-width: 2px; + stroke: #555; + stroke-width: 2px; } .sim-text { - font-family: "Lucida Console", Monaco, monospace; - font-size: 25px; - fill: #fff; - pointer-events: none; + font-family: "Lucida Console", Monaco, monospace; + font-size: 25px; + fill: #fff; + pointer-events: none; } .sim-text-pin { - font-family: "Lucida Console", Monaco, monospace; - font-size: 20px; - fill: #fff; - pointer-events: none; + font-family: "Lucida Console", Monaco, monospace; + font-size: 20px; + fill: #fff; + pointer-events: none; } .sim-thermometer { - stroke: #aaa; - stroke-width: 3px; + stroke: #aaa; + stroke-width: 3px; } /* animations */ .sim-flash { - animation-name: sim-flash-animation; - animation-duration: 0.1s; + animation-name: sim-flash-animation; + animation-duration: 0.1s; } @keyframes sim-flash-animation { - from { - fill: yellow; - } - to { - fill: default; - } + from { + fill: yellow; + } + to { + fill: default; + } } .sim-flash-stroke { - animation-name: sim-flash-stroke-animation; - animation-duration: 0.4s; - animation-timing-function: ease-in; + animation-name: sim-flash-stroke-animation; + animation-duration: 0.4s; + animation-timing-function: ease-in; } @keyframes sim-flash-stroke-animation { - from { - stroke: yellow; - } - to { - stroke: default; - } + from { + stroke: yellow; + } + to { + stroke: default; + } } /* wireframe */ .sim-wireframe * { - fill: none; - stroke: black; + fill: none; + stroke: black; } .sim-wireframe .sim-display, .sim-wireframe .sim-led, @@ -120,29 +120,29 @@ sim-button { .sim-wireframe .sim-button-label, .sim-wireframe .sim-button, .sim-wireframe .sim-text-pin { - visibility: hidden; + visibility: hidden; } .sim-wireframe .sim-label { - stroke: none; - fill: #777; + stroke: none; + fill: #777; } .sim-label, .sim-button-label { - fill: #000; + fill: #000; } .sim-wireframe .sim-board { - stroke-width: 2px; + stroke-width: 2px; } *:focus { - outline: none; + outline: none; } .sim-button-group:focus { - stroke: #4d90fe; - stroke-width: 4px; + stroke: #4d90fe; + stroke-width: 4px; } .sim-button-group:focus { - stroke: #4d90fe; - stroke-width: 4px; + stroke: #4d90fe; + stroke-width: 4px; } *:focus .sim-button-outer, .sim-pin:focus, @@ -151,27 +151,27 @@ sim-button { .no-drag, .sim-text, .sim-text-pin { - user-drag: none; - user-select: none; - -moz-user-select: none; - -webkit-user-drag: none; - -webkit-user-select: none; - -ms-user-select: none; + user-drag: none; + user-select: none; + -moz-user-select: none; + -webkit-user-drag: none; + -webkit-user-select: none; + -ms-user-select: none; } .sim-button { - stroke: none; + stroke: none; } .sim-button:active { - stroke: none; + stroke: none; } .cls-1 { - fill: #097054; + fill: #097054; } .cls-1, .cls-14, .cls-23, .cls-9 { - stroke: #000; + stroke: #000; } .cls-1, .cls-11, @@ -185,15 +185,15 @@ sim-button { .cls-5, .cls-6, .cls-9 { - stroke-miterlimit: 10; + stroke-miterlimit: 10; } .cls-1, .cls-23 { - stroke-width: 1.99px; + stroke-width: 1.99px; } .cls-18, .cls-2 { - fill: #fff; + fill: #fff; } .cls-11, .cls-12, @@ -205,7 +205,7 @@ sim-button { .cls-6, .cls-7, .cls-8 { - fill: none; + fill: none; } .cls-11, .cls-12, @@ -216,10 +216,10 @@ sim-button { .cls-6, .cls-7, .cls-8 { - stroke: #fff; + stroke: #fff; } .cls-3 { - stroke-width: 2px; + stroke-width: 2px; } .cls-12, .cls-17, @@ -228,63 +228,65 @@ sim-button { .cls-6, .cls-7, .cls-8 { - stroke-linecap: round; + stroke-linecap: round; } .cls-4, .cls-7 { - stroke-width: 1.63px; + stroke-width: 1.63px; } .cls-5 { - stroke-width: 1.41px; + stroke-width: 1.41px; } .cls-6 { - stroke-width: 1.6px; + stroke-width: 1.6px; } .cls-7, .cls-8 { - stroke-linejoin: round; + stroke-linejoin: round; } .cls-8 { - stroke-width: 1.63px; + stroke-width: 1.63px; } .cls-10, .cls-9 { - fill: #7e7272; + fill: #7e7272; } .cls-22, .cls-9 { - stroke-width: 1.5px; + stroke-width: 1.5px; } .cls-12 { - stroke-width: 1.71px; + stroke-width: 1.71px; } .cls-14 { - stroke-width: 0.25px; + stroke-width: 0.25px; } .cls-17 { - stroke-width: 2.02px; + stroke-width: 2.02px; } .cls-18 { - font-size: 7px; - font-family: SegoeUI-Bold, Segoe UI; - font-weight: 700; - letter-spacing: -0.02em; + font-size: 7px; + font-family: + SegoeUI-Bold, + Segoe UI; + font-weight: 700; + letter-spacing: -0.02em; } .cls-19 { - letter-spacing: -0.03em; + letter-spacing: -0.03em; } .cls-20 { - letter-spacing: -0.05em; + letter-spacing: -0.05em; } .cls-21 { - letter-spacing: 0em; + letter-spacing: 0em; } .cls-22 { - stroke: #7e7272; + stroke: #7e7272; } .sim-text-outside-clue { - font-size: 14px; - fill: var(--vscode-foreground); + font-size: 14px; + fill: var(--vscode-foreground); } diff --git a/Source/view/styles/TemperatureSensorBar.css b/Source/view/styles/TemperatureSensorBar.css index dfab0b7cd..e52920b20 100644 --- a/Source/view/styles/TemperatureSensorBar.css +++ b/Source/view/styles/TemperatureSensorBar.css @@ -1,18 +1,18 @@ .title { - font-size: 14px; - text-align: left; - font-weight: bold; + font-size: 14px; + text-align: left; + font-weight: bold; } .header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; + -webkit-appearance: none; + height: 30px; + margin-bottom: 2px; } .temperatureSensorBar { - margin-top: 10px; - width: 440px; - margin-left: auto; - margin-right: auto; - padding-bottom: 16px; + margin-top: 10px; + width: 440px; + margin-left: auto; + margin-right: auto; + padding-bottom: 16px; } diff --git a/Source/view/styles/ToolBar.css b/Source/view/styles/ToolBar.css index faca0569c..f85843e90 100644 --- a/Source/view/styles/ToolBar.css +++ b/Source/view/styles/ToolBar.css @@ -1,182 +1,182 @@ .toolbar-parent { - background: var(--vscode-debugToolBar-background); - width: fit-content; - border-radius: 2px; - height: fit-content; - margin-left: auto; - margin-right: auto; - margin-top: 24px; - margin-bottom: 50px; + background: var(--vscode-debugToolBar-background); + width: fit-content; + border-radius: 2px; + height: fit-content; + margin-left: auto; + margin-right: auto; + margin-top: 24px; + margin-bottom: 50px; } .toolbar { - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - display: flex; - flex-direction: column; - align-content: center; - align-items: center; + box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); + border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-width: 1px; + border-style: solid; + display: flex; + flex-direction: column; + align-content: center; + align-items: center; } .toolbar-icon { - min-width: 360px; - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - padding: 0px 8px 0px 8px; + min-width: 360px; + box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); + border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-width: 1px; + border-style: solid; + padding: 0px 8px 0px 8px; } .tag, .title { - display: inline; + display: inline; } .sensor_modal { - vertical-align: middle; - width: 360px; - overflow-y: visible; - overflow-x: hidden; - position: relative; - height: fit-content; - padding-left: 16px; - box-shadow: none; - margin-left: 1px; + vertical-align: middle; + width: 360px; + overflow-y: visible; + overflow-x: hidden; + position: relative; + height: fit-content; + padding-left: 16px; + box-shadow: none; + margin-left: 1px; } .title { - -webkit-appearance: none; - font-size: 16px; - font-weight: bolder; - color: var(--vscode-badgeForegroundOverride); - text-align: left; - margin-right: 40px; - position: absolute; - left: 0; - padding-left: inherit; - width: 320px; + -webkit-appearance: none; + font-size: 16px; + font-weight: bolder; + color: var(--vscode-badgeForegroundOverride); + text-align: left; + margin-right: 40px; + position: absolute; + left: 0; + padding-left: inherit; + width: 320px; } .info-icon { - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - color: var(--vscode-badgeForegroundOverride); - border-width: 1px; - border-style: solid; - padding: 0px 4px; - float: right; - left: 25px; - margin-top: -10px; + background: var(--vscode-debugToolBar-background); + border-color: var(--vscode-highContrastButtonBorderOverride-color); + color: var(--vscode-badgeForegroundOverride); + border-width: 1px; + border-style: solid; + padding: 0px 4px; + float: right; + left: 25px; + margin-top: -10px; } .info-icon:hover { - background-color: var(--vscode-terminal-selectionBackground); - color: var(--vscode-badgeForegroundOverride); + background-color: var(--vscode-terminal-selectionBackground); + color: var(--vscode-badgeForegroundOverride); } .info-icon:active { - background-color: var(--vscode-editor-selectionHighlightBackground); - color: var(--vscode-badgeForegroundOverride); + background-color: var(--vscode-editor-selectionHighlightBackground); + color: var(--vscode-badgeForegroundOverride); } .tag { - position: absolute; - left: 200px; + position: absolute; + left: 200px; } .description-callout { - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - padding: "210px 214px 214px 210px"; - border: 2px solid var(--vscode-highContrastButtonBorderOverride-color); + box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); + padding: "210px 214px 214px 210px"; + border: 2px solid var(--vscode-highContrastButtonBorderOverride-color); } .description-callout .ms-Callout-beak { - background-color: var(--vscode-debugToolBar-background); + background-color: var(--vscode-debugToolBar-background); } .description-callout .ms-Callout-main { - background-color: var(--vscode-debugToolBar-background); - overflow-x: hidden; - overflow-y: auto; - margin: -1px; + background-color: var(--vscode-debugToolBar-background); + overflow-x: hidden; + overflow-y: auto; + margin: -1px; } .try-it-description { - -webkit-appearance: none; - font-size: 14px; - background: var(--vscode-debugToolBar-background); - word-wrap: break-word; - width: 320px; - height: "100%"; - margin-top: 15px; - text-align: left; - line-height: 17px; - font-weight: 100; + -webkit-appearance: none; + font-size: 14px; + background: var(--vscode-debugToolBar-background); + word-wrap: break-word; + width: 320px; + height: "100%"; + margin-top: 15px; + text-align: left; + line-height: 17px; + font-weight: 100; } .description { - -webkit-appearance: none; - color: var(--vscode-badgeForegroundOverride); - font-size: 14px; - word-wrap: break-word; - width: 320px; - height: "100%"; - text-align: left; - font-weight: 400; - padding: 10px 0px 10px 10px; - margin: 10px; - overflow-y: hidden; + -webkit-appearance: none; + color: var(--vscode-badgeForegroundOverride); + font-size: 14px; + word-wrap: break-word; + width: 320px; + height: "100%"; + text-align: left; + font-weight: 400; + padding: 10px 0px 10px 10px; + margin: 10px; + overflow-y: hidden; } .title_group { - margin-top: 20px; - width: fit-content; - padding-left: 16px; + margin-top: 20px; + width: fit-content; + padding-left: 16px; } .try_area { - position: relative; - padding-bottom: 30px; - text-align: left; - line-height: 17px; - font-weight: 100; - opacity: 90%; - font-size: 14px; - word-wrap: break-word; - padding-right: 10px; + position: relative; + padding-bottom: 30px; + text-align: left; + line-height: 17px; + font-weight: 100; + opacity: 90%; + font-size: 14px; + word-wrap: break-word; + padding-right: 10px; } .link-parent { - padding-top: 12px; - -webkit-appearance: none; - color: var(--vscode-textLink-foreground); - text-align: right; - text-decoration: none; - font-weight: bold; + padding-top: 12px; + -webkit-appearance: none; + color: var(--vscode-textLink-foreground); + text-align: right; + text-decoration: none; + font-weight: bold; } .link-parent:hover { - -webkit-appearance: none; - color: var(--vscode-textLink-activeForeground); - text-decoration: none; + -webkit-appearance: none; + color: var(--vscode-textLink-activeForeground); + text-decoration: none; } .link { - -webkit-appearance: none; - text-decoration: none; + -webkit-appearance: none; + text-decoration: none; } .gesture-container { - display: "flex"; - justify-content: "space-between"; - flex-direction: "column"; - align-items: "center"; - height: 750; - padding-top: 10px; + display: "flex"; + justify-content: "space-between"; + flex-direction: "column"; + align-items: "center"; + height: 750; + padding-top: 10px; } .generic-slider-component { - padding-top: 10px; + padding-top: 10px; } diff --git a/Source/view/svgs/arrow_right_svg.tsx b/Source/view/svgs/arrow_right_svg.tsx index 7eead7979..538c52229 100644 --- a/Source/view/svgs/arrow_right_svg.tsx +++ b/Source/view/svgs/arrow_right_svg.tsx @@ -1,21 +1,20 @@ import * as React from "react"; export const ARROW_RIGHT_SVG = ( - - - + + + ); export default ARROW_RIGHT_SVG; diff --git a/Source/view/svgs/close_svg.tsx b/Source/view/svgs/close_svg.tsx index ac05bedfc..b591fa868 100644 --- a/Source/view/svgs/close_svg.tsx +++ b/Source/view/svgs/close_svg.tsx @@ -1,26 +1,25 @@ import * as React from "react"; export const CLOSE_SVG = ( - - - - + + + + ); export default CLOSE_SVG; diff --git a/Source/view/svgs/play_svg.tsx b/Source/view/svgs/play_svg.tsx index 0da21aa9d..8c1317ee1 100644 --- a/Source/view/svgs/play_svg.tsx +++ b/Source/view/svgs/play_svg.tsx @@ -1,19 +1,18 @@ import * as React from "react"; export const PLAY_SVG = ( - - - + + + ); export default PLAY_SVG; diff --git a/Source/view/svgs/refresh_svg.tsx b/Source/view/svgs/refresh_svg.tsx index 340ad03f8..4df58cd59 100644 --- a/Source/view/svgs/refresh_svg.tsx +++ b/Source/view/svgs/refresh_svg.tsx @@ -2,20 +2,19 @@ import * as React from "react"; import "../styles/Button.css"; export const REFRESH_SVG = ( - - - + + + ); export default REFRESH_SVG; diff --git a/Source/view/svgs/stop_svg.tsx b/Source/view/svgs/stop_svg.tsx index a89175f66..f6a628fa3 100644 --- a/Source/view/svgs/stop_svg.tsx +++ b/Source/view/svgs/stop_svg.tsx @@ -1,21 +1,20 @@ import * as React from "react"; export const STOP_SVG = ( - - - + + + ); export default STOP_SVG; diff --git a/Source/view/svgs/tag_input_svg.tsx b/Source/view/svgs/tag_input_svg.tsx index 13a507504..8e346d140 100644 --- a/Source/view/svgs/tag_input_svg.tsx +++ b/Source/view/svgs/tag_input_svg.tsx @@ -1,27 +1,26 @@ import * as React from "react"; export const TAG_INPUT_SVG = ( - - - - + + + + ); export default TAG_INPUT_SVG; diff --git a/Source/view/svgs/tag_output_svg.tsx b/Source/view/svgs/tag_output_svg.tsx index 745175db5..157dca014 100644 --- a/Source/view/svgs/tag_output_svg.tsx +++ b/Source/view/svgs/tag_output_svg.tsx @@ -1,26 +1,25 @@ import * as React from "react"; export const TAG_OUTPUT_SVG = ( - - - - + + + + ); export default TAG_OUTPUT_SVG; diff --git a/Source/view/svgs/toolbar_svg.tsx b/Source/view/svgs/toolbar_svg.tsx index 52de70b86..701725550 100644 --- a/Source/view/svgs/toolbar_svg.tsx +++ b/Source/view/svgs/toolbar_svg.tsx @@ -3,738 +3,693 @@ import { TOOLBAR_ICON_LABEL } from "../components/toolbar/SensorModalUtils"; import "../styles/Button.css"; export const LEFT_EDGE_SVG = ( - - - - - - - - - - + + + + + + + + + + ); export const RIGHT_EDGE_SVG = ( - - - - - - - - - - + + + + + + + + + + ); export const GPIO_SVG = ( - - Created with Sketch. - - - - - - + + Created with Sketch. + + + + + + ); export const IR_SVG = ( - - Created with Sketch. - - - - - - - - + + Created with Sketch. + + + + + + + + ); export const LIGHT_SVG = ( - - - - - - - - - - - + + + + + + + + + + + ); export const MOTION_SVG = ( - - - - - - - - - - - + + + + + + + + + + + ); export const NEO_PIXEL_SVG = ( - - Created with Sketch. - - - - - - - - - - - - - - - + + Created with Sketch. + + + + + + + + + + + + + + + ); export const PUSH_BUTTON_SVG = ( - - Created with Sketch. - - - - - - - - - + + Created with Sketch. + + + + + + + + + ); export const RED_LED_SVG = ( - - Created with Sketch. - - - - - - - - - + + Created with Sketch. + + + + + + + + + ); export const SLIDER_SWITCH_SVG = ( - - Created with Sketch. - - - - - - - - - + + Created with Sketch. + + + + + + + + + ); export const SOUND_SVG = ( - - Created with Sketch. - - - - - - - - - - - + + Created with Sketch. + + + + + + + + + + + ); export const SPEAKER_SVG = ( - - Created with Sketch. - - - - - - - - + + Created with Sketch. + + + + + + + + ); export const TEMPERATURE_SVG = ( - - - - - - - - - + + + + + + + + + ); export const WIRELESS_SVG = ( - - - - - - - - - + + + + + + + + + ); export default LEFT_EDGE_SVG; export const GESTURE_SVG = ( - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + ); export const HUMIDITY_SVG = ( - - - - + + + - - - - - - - - - + /> + + + ); export const PRESSURE_SVG = ( - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + ); export const PROXIMITY_SVG = ( - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + ); export const MAGNET_SVG = ( - - - + + - - + /> + + ); export const GYROSCOPE_SVG = ( - - - + + + - - - - - - - - - + + + + + + + + + ); export const COMPASS_SVG = ( - - - - - + + + + + ); diff --git a/Source/view/translations/en.json b/Source/view/translations/en.json index c5e6ebed9..6583386d6 100644 --- a/Source/view/translations/en.json +++ b/Source/view/translations/en.json @@ -1,112 +1,112 @@ { - "toolbar-gpio.description": "8 GPIOs on the device! Pin A1 - A7 can also be used as capacitive touch sensors, and A0 is a true analog output pin.", - "toolbar-gpio.title": "GPIO", - "toolbar-gpio.tryItDescription": "Use your mouse to interact with the pin A1 - A7 or use your keyboard SHIFT + ”1” - “7”.", - "toolbar-ir-sensor.description": "Allows you to send commands to the device with a remote control, or even send messages between multiple devices! You can also do very simple proximity sensing since it reads the reflected light.", - "toolbar-ir-sensor.title": "IR Transmit & Receiver", - "toolbar-ir-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-light-sensor.description": "An analog light sensor can be used to detect ambient light, with similar spectral response to the human eye.", - "toolbar-light-sensor.title": "Light Sensor", - "toolbar-light-sensor.tryItDescription": "Change the brightness detected by the sensor here!", - "toolbar-motion-sensor.description": "Detects acceleration in X, Y and Z orientations. It can also detect 'tap' and 'double tap' strikes on the board and when the board is shaken.", - "toolbar-motion-sensor.title": "Motion Sensor", - "toolbar-motion-sensor.tryItDescription": "Change the acceleration here and click or click on the button to simulate a shake. The tap feature is not supported by the Device Simulator Express. If you would like to see the 'tap' feature implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-neo-pixels.description": "The 10 full color RGB LEDs surrounding the outer edge of the boards can be set to any color. Great for beautiful lighting effects!", - "toolbar-neo-pixels.title": "NeoPixels", - "toolbar-neo-pixels.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-a-b-push.description": "Two push buttons A and B are connected to digital pin #4 (Left) and #5 (Right) each.", - "toolbar-a-b-push.title": "Push Buttons", - "toolbar-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-red-led.description": "This Red LED is connected to the digital #13 GPIO pin. It can be very handy when you want an indicator LED.", - "toolbar-red-led.title": "Red LED", - "toolbar-red-led.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-sound-sensor.description": "A digital microphone can detect audio volume and even perform basic FFT functions but cannot read it like an analog voltage.", - "toolbar-sound-sensor.title": "Sound Sensor", - "toolbar-sound-sensor.tryItDescription": "If you would like to see the sound sensor implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-slider-switch.description": "This slide switch returns True or False depending on whether it's ON or OFF and can be used as a toggle switch in your code!", - "toolbar-slider-switch.title": "Slider Switch", - "toolbar-slider-switch.tryItDescription": "Click it with your mouse or press 'S' on your keyboard to switch it ON and OFF!", - "toolbar-speaker.description": "This speaker can play a .wav file and different tones and also has a class D amplifier that is connected to an output A0 pin built in! You can turn it off using the shutdown control on pin #11 on the physical device.", - "toolbar-speaker.title": "Speaker", - "toolbar-speaker.tryItDescription": "Right now the tones are not supported on the simulator. If you would like to see tones implemented, please +1 the feature addition issue on GitHub! Regardless, you can play it on your device!", - "toolbar-temperature-sensor.description": "This sensor uses an NTC thermistor to sense temperature an calculate it with the analog voltage on analog pin #A9.", - "toolbar-temperature-sensor.title": "Temperature Sensor", - "toolbar-temperature-sensor.tryItDescription": "You can set the temperature in degrees Celsius.", - "toolbar-accelerometer-sensor.title": "Accelerometer", - "toolbar-accelerometer-sensor.description": "An accelerometer measures the acceleration of your micro:bit; this component senses when the micro:bit is moved.", - "toolbar-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", - "toolbar-microbit-light-sensor.title": "Light Sensor", - "toolbar-microbit-temperature-sensor.title": "Temperature Sensor", - "toolbar-microbit-led.title": "LEDs", - "toolbar-microbit-led.description": "The microbit has 25 LEDs for you to play with. The LEDs have 9 levels of brightness.", - "toolbar-microbit-led.tryItDescription": "Run your code and see the LEDs light up!", - "toolbar-microbit-a-b-push.title": "Buttons", - "toolbar-microbit-a-b-push.description": "There are two buttons on the front of the micro:bit (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", - "toolbar-microbit-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-microbit-sound.title": "Sound", - "toolbar-microbit-sound.description": "Your BBC micro:bit can be programmed to make a wide variety of sounds - from single notes, tones and beats to your own musical compositions.", - "toolbar-microbit-sound.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-gpio.title": "GPIO (Pins)", - "toolbar-microbit-gpio.description": "On the bottom edge of your BBC micro:bit there are 25 gold strips, called pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", - "toolbar-microbit-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-wireless.title": "Bluetooth & Radio", - "toolbar-microbit-wireless.description": "micro:bits can use radio waves and bluetooth services to communicate with each other.", + "toolbar-gpio.description": "8 GPIOs on the device! Pin A1 - A7 can also be used as capacitive touch sensors, and A0 is a true analog output pin.", + "toolbar-gpio.title": "GPIO", + "toolbar-gpio.tryItDescription": "Use your mouse to interact with the pin A1 - A7 or use your keyboard SHIFT + ”1” - “7”.", + "toolbar-ir-sensor.description": "Allows you to send commands to the device with a remote control, or even send messages between multiple devices! You can also do very simple proximity sensing since it reads the reflected light.", + "toolbar-ir-sensor.title": "IR Transmit & Receiver", + "toolbar-ir-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-light-sensor.description": "An analog light sensor can be used to detect ambient light, with similar spectral response to the human eye.", + "toolbar-light-sensor.title": "Light Sensor", + "toolbar-light-sensor.tryItDescription": "Change the brightness detected by the sensor here!", + "toolbar-motion-sensor.description": "Detects acceleration in X, Y and Z orientations. It can also detect 'tap' and 'double tap' strikes on the board and when the board is shaken.", + "toolbar-motion-sensor.title": "Motion Sensor", + "toolbar-motion-sensor.tryItDescription": "Change the acceleration here and click or click on the button to simulate a shake. The tap feature is not supported by the Device Simulator Express. If you would like to see the 'tap' feature implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-neo-pixels.description": "The 10 full color RGB LEDs surrounding the outer edge of the boards can be set to any color. Great for beautiful lighting effects!", + "toolbar-neo-pixels.title": "NeoPixels", + "toolbar-neo-pixels.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-a-b-push.description": "Two push buttons A and B are connected to digital pin #4 (Left) and #5 (Right) each.", + "toolbar-a-b-push.title": "Push Buttons", + "toolbar-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", + "toolbar-red-led.description": "This Red LED is connected to the digital #13 GPIO pin. It can be very handy when you want an indicator LED.", + "toolbar-red-led.title": "Red LED", + "toolbar-red-led.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-sound-sensor.description": "A digital microphone can detect audio volume and even perform basic FFT functions but cannot read it like an analog voltage.", + "toolbar-sound-sensor.title": "Sound Sensor", + "toolbar-sound-sensor.tryItDescription": "If you would like to see the sound sensor implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-slider-switch.description": "This slide switch returns True or False depending on whether it's ON or OFF and can be used as a toggle switch in your code!", + "toolbar-slider-switch.title": "Slider Switch", + "toolbar-slider-switch.tryItDescription": "Click it with your mouse or press 'S' on your keyboard to switch it ON and OFF!", + "toolbar-speaker.description": "This speaker can play a .wav file and different tones and also has a class D amplifier that is connected to an output A0 pin built in! You can turn it off using the shutdown control on pin #11 on the physical device.", + "toolbar-speaker.title": "Speaker", + "toolbar-speaker.tryItDescription": "Right now the tones are not supported on the simulator. If you would like to see tones implemented, please +1 the feature addition issue on GitHub! Regardless, you can play it on your device!", + "toolbar-temperature-sensor.description": "This sensor uses an NTC thermistor to sense temperature an calculate it with the analog voltage on analog pin #A9.", + "toolbar-temperature-sensor.title": "Temperature Sensor", + "toolbar-temperature-sensor.tryItDescription": "You can set the temperature in degrees Celsius.", + "toolbar-accelerometer-sensor.title": "Accelerometer", + "toolbar-accelerometer-sensor.description": "An accelerometer measures the acceleration of your micro:bit; this component senses when the micro:bit is moved.", + "toolbar-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", + "toolbar-microbit-light-sensor.title": "Light Sensor", + "toolbar-microbit-temperature-sensor.title": "Temperature Sensor", + "toolbar-microbit-led.title": "LEDs", + "toolbar-microbit-led.description": "The microbit has 25 LEDs for you to play with. The LEDs have 9 levels of brightness.", + "toolbar-microbit-led.tryItDescription": "Run your code and see the LEDs light up!", + "toolbar-microbit-a-b-push.title": "Buttons", + "toolbar-microbit-a-b-push.description": "There are two buttons on the front of the micro:bit (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", + "toolbar-microbit-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", + "toolbar-microbit-sound.title": "Sound", + "toolbar-microbit-sound.description": "Your BBC micro:bit can be programmed to make a wide variety of sounds - from single notes, tones and beats to your own musical compositions.", + "toolbar-microbit-sound.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-microbit-gpio.title": "GPIO (Pins)", + "toolbar-microbit-gpio.description": "On the bottom edge of your BBC micro:bit there are 25 gold strips, called pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", + "toolbar-microbit-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-microbit-wireless.title": "Bluetooth & Radio", + "toolbar-microbit-wireless.description": "micro:bits can use radio waves and bluetooth services to communicate with each other.", - "toolbar-microbit-wireless.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-gesture-sensor.title": "Gesture", - "toolbar-microbit-gesture-sensor.description": "If you move your BBC micro:bit in a certain way (as a gesture) then the micro:bit is able to detect this. It can recognize the following gestures: up, down, left, right, face up, face down, freefall, 3g, 6g, 8g, and shake.", + "toolbar-microbit-wireless.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-microbit-gesture-sensor.title": "Gesture", + "toolbar-microbit-gesture-sensor.description": "If you move your BBC micro:bit in a certain way (as a gesture) then the micro:bit is able to detect this. It can recognize the following gestures: up, down, left, right, face up, face down, freefall, 3g, 6g, 8g, and shake.", - "toolbar-microbit-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", - "toolbar-microbit-compass-sensor.title": "Compass", - "toolbar-microbit-compass-sensor.description": "A digital compass is an input sensor that detects magnetic fields. Your BBC micro:bit has an inbuilt compass that can detect the direction in which it is facing.", - "toolbar-microbit-compass-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-temperature-sensor.title": "Temperature", - "toolbar-clue-temperature-sensor.description": "CLUE uses the BMP280 sensor, an environmental sensor with temperature. This precision sensor from Bosch is the best low-cost, precision sensing solution for measuring temperature with ±1.0°C accuracy.", + "toolbar-microbit-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", + "toolbar-microbit-compass-sensor.title": "Compass", + "toolbar-microbit-compass-sensor.description": "A digital compass is an input sensor that detects magnetic fields. Your BBC micro:bit has an inbuilt compass that can detect the direction in which it is facing.", + "toolbar-microbit-compass-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", + "toolbar-clue-temperature-sensor.title": "Temperature", + "toolbar-clue-temperature-sensor.description": "CLUE uses the BMP280 sensor, an environmental sensor with temperature. This precision sensor from Bosch is the best low-cost, precision sensing solution for measuring temperature with ±1.0°C accuracy.", - "toolbar-clue-temperature-sensor.tryItDescription": "You can simulate the temperature in your code!", + "toolbar-clue-temperature-sensor.tryItDescription": "You can simulate the temperature in your code!", - "toolbar-clue-light-sensor.title": "Light/Color Sensor", - "toolbar-clue-light-sensor.description": "The light sensor uses APDS9960 and is able to return the red, blue, green and clear light.", - "toolbar-clue-light-sensor.tryItDescription": "You can set the color values of the light detected.", - "toolbar-clue-accelerometer-sensor.title": "Accelerometer", - "toolbar-clue-accelerometer-sensor.description": " The 3-axis accelerometer, can tell you which direction is down towards the Earth (by measuring gravity) or how fast the board is accelerating in 3D space.", - "toolbar-clue-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", - "toolbar-clue-led.title": "Neopixel", - "toolbar-clue-led.description": "The CLUE has one full RGB LED (NeoPixel) on the back of the device.", + "toolbar-clue-light-sensor.title": "Light/Color Sensor", + "toolbar-clue-light-sensor.description": "The light sensor uses APDS9960 and is able to return the red, blue, green and clear light.", + "toolbar-clue-light-sensor.tryItDescription": "You can set the color values of the light detected.", + "toolbar-clue-accelerometer-sensor.title": "Accelerometer", + "toolbar-clue-accelerometer-sensor.description": " The 3-axis accelerometer, can tell you which direction is down towards the Earth (by measuring gravity) or how fast the board is accelerating in 3D space.", + "toolbar-clue-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", + "toolbar-clue-led.title": "Neopixel", + "toolbar-clue-led.description": "The CLUE has one full RGB LED (NeoPixel) on the back of the device.", - "toolbar-clue-led.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-clue-a-b-push.title": "Buttons", - "toolbar-clue-a-b-push.description": "There are two buttons on the front of the CLUE (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", - "toolbar-clue-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-clue-gpio.title": "Input/Output (GPIO)", - "toolbar-clue-gpio.description": "On the bottom edge of your CLUE, you have 25 pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", - "toolbar-clue-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-sound-sensor.title": "Sound", - "toolbar-clue-sound-sensor.description": "The CLUE uses a PDM MEMS microphone. PDM is a little like 1-bit PWM. You clock the mic with a 1 MHz - 3 MHz clock rate, and on the data line you'll get a square wave out that syncs with the clock.", - "toolbar-clue-sound-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-pressure-sensor.title": "Pressure", - "toolbar-clue-pressure-sensor.description": "CLUE uses the BMP280 sensor for barometric pressure. Because pressure changes with altitude, you can also use it as an altimeter with ±1 meter accuracy.", + "toolbar-clue-led.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-clue-a-b-push.title": "Buttons", + "toolbar-clue-a-b-push.description": "There are two buttons on the front of the CLUE (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", + "toolbar-clue-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", + "toolbar-clue-gpio.title": "Input/Output (GPIO)", + "toolbar-clue-gpio.description": "On the bottom edge of your CLUE, you have 25 pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", + "toolbar-clue-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", + "toolbar-clue-sound-sensor.title": "Sound", + "toolbar-clue-sound-sensor.description": "The CLUE uses a PDM MEMS microphone. PDM is a little like 1-bit PWM. You clock the mic with a 1 MHz - 3 MHz clock rate, and on the data line you'll get a square wave out that syncs with the clock.", + "toolbar-clue-sound-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", + "toolbar-clue-pressure-sensor.title": "Pressure", + "toolbar-clue-pressure-sensor.description": "CLUE uses the BMP280 sensor for barometric pressure. Because pressure changes with altitude, you can also use it as an altimeter with ±1 meter accuracy.", - "toolbar-clue-pressure-sensor.tryItDescription": "You can set the pressure here in hectoPascals (hPa).", - "toolbar-clue-humidity-sensor.title": "Humidity", - "toolbar-clue-humidity-sensor.description": "The SHT30-D sensor has an excellent ±2% relative humidity and ±0.5°C accuracy for most uses.", - "toolbar-clue-humidity-sensor.tryItDescription": "You can set the humidity in percentage (%) here.", - "toolbar-clue-gesture-sensor.title": "Gesture", - "toolbar-clue-gesture-sensor.description": "The gesture sensor can detect directional gestures (left to right, right to left, up to down, down to up), but in theory more complicated gestures like zig-zag, clockwise or counterclockwise circle, near to far, etc. could also be detected with additional code. ", - "toolbar-clue-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", - "toolbar-clue-proximity-sensor.title": "Proximity", - "toolbar-clue-proximity-sensor.description": "The proximity sensor uses APDS9960 and is able to return how close an object is to the front of the sensor. This is a number from 0 to 255 where the higher the number the closer an object is to the sensor. You won't be able to translate this into an absolute value in units like inches or millimeters, you can only see how it changes relative to other values.", + "toolbar-clue-pressure-sensor.tryItDescription": "You can set the pressure here in hectoPascals (hPa).", + "toolbar-clue-humidity-sensor.title": "Humidity", + "toolbar-clue-humidity-sensor.description": "The SHT30-D sensor has an excellent ±2% relative humidity and ±0.5°C accuracy for most uses.", + "toolbar-clue-humidity-sensor.tryItDescription": "You can set the humidity in percentage (%) here.", + "toolbar-clue-gesture-sensor.title": "Gesture", + "toolbar-clue-gesture-sensor.description": "The gesture sensor can detect directional gestures (left to right, right to left, up to down, down to up), but in theory more complicated gestures like zig-zag, clockwise or counterclockwise circle, near to far, etc. could also be detected with additional code. ", + "toolbar-clue-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", + "toolbar-clue-proximity-sensor.title": "Proximity", + "toolbar-clue-proximity-sensor.description": "The proximity sensor uses APDS9960 and is able to return how close an object is to the front of the sensor. This is a number from 0 to 255 where the higher the number the closer an object is to the sensor. You won't be able to translate this into an absolute value in units like inches or millimeters, you can only see how it changes relative to other values.", - "toolbar-clue-proximity-sensor.tryItDescription": "Set relative proximity to the sensor in values from 0 - 255, where 0 means very close and 255 means very far.", + "toolbar-clue-proximity-sensor.tryItDescription": "Set relative proximity to the sensor in values from 0 - 255, where 0 means very close and 255 means very far.", - "toolbar-clue-bluetooth.title": "Bluetooth", - "toolbar-clue-bluetooth.description": "You can transmit data over Bluetooth to a computer or mobile device for data plotting and logging, or save it to the built in storage.", - "toolbar-clue-bluetooth.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! ", - "toolbar-clue-speaker.description": "The CLUE has a buzzer/speaker for playing tones and beeps.", - "toolbar-clue-magnet-sensor.title": "Magnetometer", - "toolbar-clue-magnet-sensor.description": "Sense the magnetic fields that surround us with this handy triple-axis magnetometer (compass) module. Magnetometers can sense where the strongest magnetic force is coming from, generally used to detect magnetic north, but can also be used for measuring magnetic fields.", - "toolbar-clue-magnet-sensor.tryItDescription": "You can set the magnetic field value in microTeslas (uT).", - "toolbar-clue-gyroscope-sensor.title": "Gyroscope", - "toolbar-clue-gyroscope-sensor.description": "The 3-axis gyroscope that can measure spin and twist users LSM6DS33.", - "toolbar-clue-gyroscope-sensor.tryItDescription": "Set the angular velocity in degrees/second." + "toolbar-clue-bluetooth.title": "Bluetooth", + "toolbar-clue-bluetooth.description": "You can transmit data over Bluetooth to a computer or mobile device for data plotting and logging, or save it to the built in storage.", + "toolbar-clue-bluetooth.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! ", + "toolbar-clue-speaker.description": "The CLUE has a buzzer/speaker for playing tones and beeps.", + "toolbar-clue-magnet-sensor.title": "Magnetometer", + "toolbar-clue-magnet-sensor.description": "Sense the magnetic fields that surround us with this handy triple-axis magnetometer (compass) module. Magnetometers can sense where the strongest magnetic force is coming from, generally used to detect magnetic north, but can also be used for measuring magnetic fields.", + "toolbar-clue-magnet-sensor.tryItDescription": "You can set the magnetic field value in microTeslas (uT).", + "toolbar-clue-gyroscope-sensor.title": "Gyroscope", + "toolbar-clue-gyroscope-sensor.description": "The 3-axis gyroscope that can measure spin and twist users LSM6DS33.", + "toolbar-clue-gyroscope-sensor.tryItDescription": "Set the angular velocity in degrees/second." } diff --git a/Source/view/tsconfig.json b/Source/view/tsconfig.json index 28c6454e0..3bb77287f 100644 --- a/Source/view/tsconfig.json +++ b/Source/view/tsconfig.json @@ -1,19 +1,19 @@ { - "compilerOptions": { - "module": "esnext", - "moduleResolution": "node", - "target": "es6", - "outDir": "out", - "lib": ["es6", "dom"], - "jsx": "react", - "sourceMap": true, - "rootDir": "..", - "strict": true, - "noUnusedLocals": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "experimentalDecorators": true - }, - "exclude": ["node_modules"], - "include": ["./index.tsx"] + "compilerOptions": { + "module": "esnext", + "moduleResolution": "node", + "target": "es6", + "outDir": "out", + "lib": ["es6", "dom"], + "jsx": "react", + "sourceMap": true, + "rootDir": "..", + "strict": true, + "noUnusedLocals": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "experimentalDecorators": true + }, + "exclude": ["node_modules"], + "include": ["./index.tsx"] } diff --git a/Source/view/utils/MessageUtils.tsx b/Source/view/utils/MessageUtils.tsx index a9fcf9c75..18adf5031 100644 --- a/Source/view/utils/MessageUtils.tsx +++ b/Source/view/utils/MessageUtils.tsx @@ -1,12 +1,12 @@ interface vscode { - postMessage(message: any): void; + postMessage(message: any): void; } declare const vscode: vscode; export const sendMessage = ( - type: string, - state: TState + type: string, + state: TState ) => { - vscode.postMessage({ command: type, text: state }); + vscode.postMessage({ command: type, text: state }); }; diff --git a/Source/view/viewUtils.tsx b/Source/view/viewUtils.tsx index 1335d039f..a210b8021 100644 --- a/Source/view/viewUtils.tsx +++ b/Source/view/viewUtils.tsx @@ -3,29 +3,29 @@ import { SENSOR_LIST } from "./constants"; // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. export interface ISliderProps { - minValue: number; - maxValue: number; - maxLabel: string; - minLabel: string; - type: string | SENSOR_LIST; - axisLabel: string; - value?: number; - onUpdateValue?: (sensor: SENSOR_LIST, value: number) => void; - step: number; + minValue: number; + maxValue: number; + maxLabel: string; + minLabel: string; + type: string | SENSOR_LIST; + axisLabel: string; + value?: number; + onUpdateValue?: (sensor: SENSOR_LIST, value: number) => void; + step: number; } export interface ISensorButtonProps { - label: string; - type: string; - onMouseUp?: (event: React.PointerEvent) => void; - onMouseDown?: (event: React.PointerEvent) => void; - onKeyUp?: (event: React.KeyboardEvent) => void; - onKeyDown?: (event: React.KeyboardEvent) => void; + label: string; + type: string; + onMouseUp?: (event: React.PointerEvent) => void; + onMouseDown?: (event: React.PointerEvent) => void; + onKeyUp?: (event: React.KeyboardEvent) => void; + onKeyDown?: (event: React.KeyboardEvent) => void; } export interface ISensorProps { - LABEL: string; - sliderProps: ISliderProps[]; - unitLabel: string; + LABEL: string; + sliderProps: ISliderProps[]; + unitLabel: string; } export const X_SLIDER_INDEX = 0; diff --git a/assets/dark-theme/open-simulator.svg b/assets/dark-theme/open-simulator.svg index 7dc10846a..6bcdc492a 100644 --- a/assets/dark-theme/open-simulator.svg +++ b/assets/dark-theme/open-simulator.svg @@ -1,4 +1,8 @@ - - + + diff --git a/assets/dark-theme/run-on-simulator.svg b/assets/dark-theme/run-on-simulator.svg index 410f09dbd..0582773e9 100644 --- a/assets/dark-theme/run-on-simulator.svg +++ b/assets/dark-theme/run-on-simulator.svg @@ -1,4 +1,8 @@ - - + + diff --git a/assets/dark-theme/save-to-board.svg b/assets/dark-theme/save-to-board.svg index bba02a9e8..c8647fbd6 100644 --- a/assets/dark-theme/save-to-board.svg +++ b/assets/dark-theme/save-to-board.svg @@ -1,4 +1,8 @@ - - + + diff --git a/assets/light-theme/open-simulator.svg b/assets/light-theme/open-simulator.svg index 8e0745d02..ae17edbe8 100644 --- a/assets/light-theme/open-simulator.svg +++ b/assets/light-theme/open-simulator.svg @@ -1,4 +1,8 @@ - - + + diff --git a/assets/light-theme/run-on-simulator.svg b/assets/light-theme/run-on-simulator.svg index e04612cfa..a85fb4c52 100644 --- a/assets/light-theme/run-on-simulator.svg +++ b/assets/light-theme/run-on-simulator.svg @@ -1,4 +1,8 @@ - - + + diff --git a/assets/light-theme/save-to-board.svg b/assets/light-theme/save-to-board.svg index 307c0b1ea..0798693d0 100644 --- a/assets/light-theme/save-to-board.svg +++ b/assets/light-theme/save-to-board.svg @@ -1,4 +1,8 @@ - - + + diff --git a/docs/developers-setup.md b/docs/developers-setup.md index a31842a89..bbd33ebe4 100644 --- a/docs/developers-setup.md +++ b/docs/developers-setup.md @@ -2,36 +2,47 @@ ## Dependencies -- Node +- Node - - Download link : https://nodejs.org/en/download/ + - Download link : https://nodejs.org/en/download/ -- Python 3.7.4 (or latest) +- Python 3.7.4 (or latest) -- Download link : https://www.python.org/downloads/ -- **NOTE :** Make sure Python is in your path under an environment variable named `python` or `python3.7` (during installation or insert it manually afterwards) -- **NOTE :** Make sure pip is added to your environment variables as well - (for example it could be found at : `c:\users\<...>\appdata\local\programs\python\python37\lib\site-packages\pip`) -- Run in a console `python -m pip install --upgrade pip` - -* Python Modules - - **Note:** On extension activation, you will be prompted with a popup asking if you want the modules to be automatically installed for you. The following python modules should be downloaded when you select "yes" on the prompt message. - - pywin32 **(on Windows only)** - - On Windows, you need to use the following command in the console to manually install pywin32: `pip install pywin32` - - *playsound* - - *pytest* - - *python-socketio* - - *requests* - - *applicationinsights* +- Download link : https://www.python.org/downloads/ +- **NOTE :** Make sure Python is in your path under an environment variable + named `python` or `python3.7` (during installation or insert it manually + afterwards) +- **NOTE :** Make sure pip is added to your environment variables as well (for + example it could be found at : + `c:\users\<...>\appdata\local\programs\python\python37\lib\site-packages\pip`) +- Run in a console `python -m pip install --upgrade pip` - *italics*: used in simulation mode only -* VS Code +* Python Modules -* Python extension for VS Code (download from VS Code market place) + - **Note:** On extension activation, you will be prompted with a popup + asking if you want the modules to be automatically installed for you. + The following python modules should be downloaded when you select "yes" + on the prompt message. + + - pywin32 **(on Windows only)** + - On Windows, you need to use the following command in the console + to manually install pywin32: `pip install pywin32` + - _playsound_ + - _pytest_ + - _python-socketio_ + - _requests_ + - _applicationinsights_ + + _italics_: used in simulation mode only + +* VS Code + +* Python extension for VS Code (download from VS Code market place) ## Steps to Get Started Running the Extension Locally -1. Make sure you have all the dependencies installed (Node, Python, Playsound, VS Code, Python VS Code extension) +1. Make sure you have all the dependencies installed (Node, Python, Playsound, + VS Code, Python VS Code extension) 2. Open the repository @@ -41,38 +52,56 @@ 5. Run the command : `npm run compile` -6. Start running the extension locally by pressing F5 or going to VS Code Debug menu and select 'Start debugging' +6. Start running the extension locally by pressing F5 or going to VS Code Debug + menu and select 'Start debugging' ## Testing -- To run unit tests, run the command: `npm run test` in the root level directory. - - You will need Pytest installed for the Python tests to run correctly -- To run just the python tests, run the command: `pytest src` or `python -m pytest src` in the root level directory. +- To run unit tests, run the command: `npm run test` in the root level + directory. + - You will need Pytest installed for the Python tests to run correctly +- To run just the python tests, run the command: `pytest src` or + `python -m pytest src` in the root level directory. ## Notes on how to use it -- [Documentation to use the Extension](/docs/how-to-use.md) -- Debugging the extension opens a new VS Code window with the local build of the extension -- From the original VS Code window (opened in our repository) you can see outputs in the Debug Console -- In the new VS Code window, you can access the commands provided by the extension from the Commands Palette (Ctrl+Shift+P) - listed as 'Device Simulator Express : ...' -- If you change some files you'll need to run the 'npm run compile' command again and restart debugging +- [Documentation to use the Extension](/docs/how-to-use.md) +- Debugging the extension opens a new VS Code window with the local build of + the extension +- From the original VS Code window (opened in our repository) you can see + outputs in the Debug Console +- In the new VS Code window, you can access the commands provided by the + extension from the Commands Palette (Ctrl+Shift+P) listed as 'Device + Simulator Express : ...' +- If you change some files you'll need to run the 'npm run compile' command + again and restart debugging ## Formatting -- We use prettier to format the Typescript and CSS files, and we use black to format the Python files. - - You will need to install them, if they are not installed already. This can be done by running the command: `npm install prettier` and `pip install black` respectively. -- To check that your files are formatted correctly, run the command: `npm run check`. -- To format your files correctly, run the command: `npm run format`. +- We use prettier to format the Typescript and CSS files, and we use black to + format the Python files. + - You will need to install them, if they are not installed already. This + can be done by running the command: `npm install prettier` and + `pip install black` respectively. +- To check that your files are formatted correctly, run the command: + `npm run check`. +- To format your files correctly, run the command: `npm run format`. ## Repository Structure (important files) -- src - - `adafruit_circuitplayground` : our mock library - - `extension.ts` : our extension code - - `process_user_code.py` : the file containing the code ran by the Python process spawned by the extension, responsible for running the user's code - - `view` : React side - - `components/` - - `cpx/` and `Simulator.tsx` : contain the React components and objects to display and handle the simulator webview - - `toolbar/` : contains the React components used in the toolbar and the modal. - - `translation/en.json`: contains the constants that should be localized. To internationalize the extension you can add additional files with constants sharing the same id found in _en.json_, but with the translated values. +- src + - `adafruit_circuitplayground` : our mock library + - `extension.ts` : our extension code + - `process_user_code.py` : the file containing the code ran by the Python + process spawned by the extension, responsible for running the user's + code + - `view` : React side + - `components/` + - `cpx/` and `Simulator.tsx` : contain the React components and + objects to display and handle the simulator webview + - `toolbar/` : contains the React components used in the toolbar and + the modal. + - `translation/en.json`: contains the constants that should be + localized. To internationalize the extension you can add additional + files with constants sharing the same id found in _en.json_, but + with the translated values. diff --git a/docs/how-to-use.md b/docs/how-to-use.md index d94b4987c..b79e12b00 100644 --- a/docs/how-to-use.md +++ b/docs/how-to-use.md @@ -2,92 +2,126 @@ Commands are accessible through : -- **The command palette** (`Ctrl+Shift+P` or `View->Command Palette`) and type 'Device Simulator Express : `command_name`' -- **The extension buttons** available on the top right of the Text Editor Panel when you have a Python file open (1) +- **The command palette** (`Ctrl+Shift+P` or `View->Command Palette`) and type + 'Device Simulator Express : `command_name`' +- **The extension buttons** available on the top right of the Text Editor + Panel when you have a Python file open (1) ## Available commands -- **Open Simulator** : opens the webview of the simulator. +- **Open Simulator** : opens the webview of the simulator. -- **New File** : opens an unsaved file to help you and a code snippet that you can save and play around with. - _(**Note :** will open the simulator webview if it's not open yet)_. +- **New File** : opens an unsaved file to help you and a code snippet that you + can save and play around with. + _(**Note :** will open the simulator webview if it's not open yet)_. -- **Run Simulator** : runs the code you have opened in the simulator (make sure you've clicked on a valid code file). - _(**Note :** will open the simulator webview if it's not open yet)_. +- **Run Simulator** : runs the code you have opened in the simulator (make + sure you've clicked on a valid code file). + _(**Note :** will open the simulator webview if it's not open yet)_. -- **Deploy to Device** : saves the code to the connected device. - _(**Note :** For the Circuit Playground Express, the board needs to be correctly formatted to a `CIRCUITPY` drive first. If that's not the case check [Installing CircuitPython](https://learn.adafruit.com/welcome-to-circuitpython/installing-circuitpython) to correctly format it)_. +- **Deploy to Device** : saves the code to the connected device. + _(**Note :** For the Circuit Playground Express, the board needs to be + correctly formatted to a `CIRCUITPY` drive first. If that's not the case + check + [Installing CircuitPython](https://learn.adafruit.com/welcome-to-circuitpython/installing-circuitpython) + to correctly format it)_. -* **Select Serial Port** : selects the serial port of the board you want the serial monitor to interact with. (2) - _(**Note :** USB detection must be enabled in the extension settings.)_ +* **Select Serial Port** : selects the serial port of the board you want the + serial monitor to interact with. (2) _(**Note :** USB detection must be + enabled in the extension settings.)_ -* **Open Serial Monitor** : opens the serial monitor. (2) - _(**Note :** A serial port must have been selected already)_. +* **Open Serial Monitor** : opens the serial monitor. (2) + _(**Note :** A serial port must have been selected already)_. -* **Change Baud Rate** : changes the baud rate of the serial monitor. (2) +* **Change Baud Rate** : changes the baud rate of the serial monitor. (2) -* **Close Serial Montitor** : closes the serial monitor. (2) +* **Close Serial Montitor** : closes the serial monitor. (2) ## Available features -- We currently support the [Adafruit Circuit Playground Express board](https://www.adafruit.com/product/3333) -- Access to auto-completion and Python error flagging -- Output panel for the simulator -- Deploy to the physical device (if correctly formatted) -- Debugger for the simulator -- Serial Monitor (available on Windows and Mac only) -- Device's features : - - NeoPixels - - Buttons (A & B) - - Playing .wav files - - Red LED - - Switch - - Green LED - - Light sensor - - Motion sensors - - Acceleration detection - - Board shake detection - - Temperature sensor - - Touch sensors +- We currently support the + [Adafruit Circuit Playground Express board](https://www.adafruit.com/product/3333) +- Access to auto-completion and Python error flagging +- Output panel for the simulator +- Deploy to the physical device (if correctly formatted) +- Debugger for the simulator +- Serial Monitor (available on Windows and Mac only) +- Device's features : + - NeoPixels + - Buttons (A & B) + - Playing .wav files + - Red LED + - Switch + - Green LED + - Light sensor + - Motion sensors + - Acceleration detection + - Board shake detection + - Temperature sensor + - Touch sensors ## Not supported yet -- Auto-detect/format the device -- Device's features - - Sound sensor - - Tones -- Sound detection (3) -- IR transmitter (3) -- Motion sensors - - Tap detection +- Auto-detect/format the device +- Device's features + - Sound sensor + - Tones +- Sound detection (3) +- IR transmitter (3) +- Motion sensors + - Tap detection ## Device Simulator Express configuration -Here are the settings you can change in the Device Simulator Express configuration: +Here are the settings you can change in the Device Simulator Express +configuration: -- **Debugger Server Port:** allows you to change the port used to communicate with the debugger. Default value is _5577_. (4) +- **Debugger Server Port:** allows you to change the port used to communicate + with the debugger. Default value is _5577_. (4) -- **Enable USB Detection:** when disabled, prevents the serial monitor from listening to messages from the serial port. +- **Enable USB Detection:** when disabled, prevents the serial monitor from + listening to messages from the serial port. -- **Show Device Icon In Editor Title Menu:** allows you to choose whether the _`Deploy to Device`_ button should be in the editor title. +- **Show Device Icon In Editor Title Menu:** allows you to choose whether the + _`Deploy to Device`_ button should be in the editor title. -- **Show Open Icon In Editor Title Menu:** allows you to choose whether the _`Open Simulator`_ button should be in the editor title. +- **Show Open Icon In Editor Title Menu:** allows you to choose whether the + _`Open Simulator`_ button should be in the editor title. -- **Show Simulator Icon In Editor Title Menu:** allows you to choose whether the _`Run Simulator`_ button should be in the editor title. +- **Show Simulator Icon In Editor Title Menu:** allows you to choose whether + the _`Run Simulator`_ button should be in the editor title. -- **Show Dependency Install:** allows you to choose whether you want to be prompted to install the Python dependencies. +- **Show Dependency Install:** allows you to choose whether you want to be + prompted to install the Python dependencies. ## Troubleshooting Tips -- The first time you install the extension, you'll need to execute the `run` command at least once in order to access auto-completion. -- While running a code file, if you get an error saying it can't find the file, make sure you've clicked on a valid Python code file before running it. -- To open the output panel again after closing it go to VS Code menu : `View->Output`. -- For the Circuit Playground Express, if you try to deploy to the device while it's plugged in but you still get an error saying it cannot find the board, make sure your Circuit Playground Express is formatted correctly and that its name matches `CIRCUITPY`. -- If you can't get the Simulator communication working while debugging, try to open you `Settings` and check the port used under `'Device Simulator Express: Debugger Server Port'`. You can either change it (usually ports above 5000 could work) or try to free it, then start debugging again. +- The first time you install the extension, you'll need to execute the `run` + command at least once in order to access auto-completion. +- While running a code file, if you get an error saying it can't find the + file, make sure you've clicked on a valid Python code file before running + it. +- To open the output panel again after closing it go to VS Code menu : + `View->Output`. +- For the Circuit Playground Express, if you try to deploy to the device while + it's plugged in but you still get an error saying it cannot find the board, + make sure your Circuit Playground Express is formatted correctly and that + its name matches `CIRCUITPY`. +- If you can't get the Simulator communication working while debugging, try to + open you `Settings` and check the port used under + `'Device Simulator Express: Debugger Server Port'`. You can either change it + (usually ports above 5000 could work) or try to free it, then start + debugging again. ### Notes (1) Can be changed in settings. -(2) To use the Serial Monitor commands, you'll need to open a folder because this saves the configuration file for the serial communication. You can still use the rest of the extension without opening a folder. -(3) Sensors currently not supported by the official adafruit_circuit_playground.express library (v2.1.2). -(4) The regular communication is using the stdout and stdin of the Python process. But when you debug your code, it will communicate over sockets on port 5577. This is the default port that you can change in your `Settings` : `'Device Simulator Express: Debugger Server Port'`. +(2) To use the Serial Monitor commands, you'll need to open a folder because +this saves the configuration file for the serial communication. You can still +use the rest of the extension without opening a folder. +(3) Sensors currently not supported by the official +adafruit_circuit_playground.express library (v2.1.2). +(4) The regular communication is using the stdout and stdin of the Python +process. But when you debug your code, it will communicate over sockets on +port 5577. This is the default port that you can change in your `Settings` : +`'Device Simulator Express: Debugger Server Port'`. diff --git a/docs/install.md b/docs/install.md index 8a8421d6e..da5e79780 100644 --- a/docs/install.md +++ b/docs/install.md @@ -7,33 +7,48 @@ 2. Click on the latest release 3. At the bottom of the page download the .vsix file 4. To install the .vsix file : - - Go to the directory where the downloaded vsix file is and run in a command console: `code --install-extension ` - - Or in VS Code, go to the extension tab (a), in menu (b) select 'Install from VSIX' (c) and search the file you downloaded - ![VSIX Install Instructions](./vsix-install-instructions.png) + - Go to the directory where the downloaded vsix file is and run in a command + console: `code --install-extension ` + - Or in VS Code, go to the extension tab (a), in menu (b) select 'Install + from VSIX' (c) and search the file you downloaded + ![VSIX Install Instructions](./vsix-install-instructions.png) ## Prerequisites _Note: You need to install all the dependencies in order to use the extension._ -- [VS Code](https://code.visualstudio.com/Download) -- [Node](https://nodejs.org/en/download/) -- [Python 3.7.4](https://www.python.org/downloads/) - - **Warning :** Make sure you've included `python` (or `python3.7`) and `pip` to your `PATH` in your **environment variables**. - _(Note: the easiest way to do it might be when you install Python, you can select the "Add to PATH" option directly. Otherwise you can search how to insert it manually, but make sure that when you type `python` (or `python3.7`) in a terminal, the command is recognized.)_ -- [Python VS Code extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python) - - **Note:** This extension is installed automatically from the marketplace when you install our extension - -* Python Modules - - **Note:** On extension activation, you will be prompted with a popup asking if you want the modules to be automatically installed for you. The following python modules should be downloaded when you select "yes" on the prompt message. **If modules are not installed correctly, please use the "pip install" commands listed below.** - - pywin32 **(on Windows only)**: `pip install pywin32` - - On Windows, you need to use the above command in the console to manually install pywin32. - - *playsound*: `pip install playsound` - - *pytest*: `pip install pytest` - - *python-socketio*: `pip install python-socketio` - - *requests*: `pip install requests` - - *applicationinsights*: `pip install applicationinsights` - - *italics*: used in simulation mode only +- [VS Code](https://code.visualstudio.com/Download) +- [Node](https://nodejs.org/en/download/) +- [Python 3.7.4](https://www.python.org/downloads/) + - **Warning :** Make sure you've included `python` (or `python3.7`) and + `pip` to your `PATH` in your **environment variables**. + _(Note: the easiest way to do it might be when you install Python, you + can select the "Add to PATH" option directly. Otherwise you can search + how to insert it manually, but make sure that when you type `python` (or + `python3.7`) in a terminal, the command is recognized.)_ +- [Python VS Code extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python) + - **Note:** This extension is installed automatically from the marketplace + when you install our extension + +* Python Modules + + - **Note:** On extension activation, you will be prompted with a popup + asking if you want the modules to be automatically installed for you. + The following python modules should be downloaded when you select "yes" + on the prompt message. **If modules are not installed correctly, please + use the "pip install" commands listed below.** + + - pywin32 **(on Windows only)**: `pip install pywin32` + - On Windows, you need to use the above command in the console to + manually install pywin32. + - _playsound_: `pip install playsound` + - _pytest_: `pip install pytest` + - _python-socketio_: `pip install python-socketio` + - _requests_: `pip install requests` + - _applicationinsights_: `pip install applicationinsights` + + _italics_: used in simulation mode only + ## How to use the Extension -- [How to use the Extension](/docs/how-to-use.md) +- [How to use the Extension](/docs/how-to-use.md) diff --git a/docs/telemetry.md b/docs/telemetry.md index e9a22941e..5af450692 100644 --- a/docs/telemetry.md +++ b/docs/telemetry.md @@ -1,17 +1,21 @@ # Device Simulator Express Telemetry -The Device Simulator Express logs usage data and diagnostics telemetry through [Application Insights](https://azure.microsoft.com/en-us/services/monitor/). +The Device Simulator Express logs usage data and diagnostics telemetry through +[Application Insights](https://azure.microsoft.com/en-us/services/monitor/). ## Telemetry Gathered This extension collects basic diagnostics telemetry and usage data: -- **Diagnostics telemetry**: performance of extension commands and success / error rate -- **Usage telemetry**: user usage of extension commands and API calls +- **Diagnostics telemetry**: performance of extension commands and success / + error rate +- **Usage telemetry**: user usage of extension commands and API calls ## Usage Telemetry -Through the Application Insights API, telemetry events are collected on The Device Simulator Express extension usage. The follow table describes the Telemetry events we collect: +Through the Application Insights API, telemetry events are collected on The +Device Simulator Express extension usage. The follow table describes the +Telemetry events we collect: | **Property** | **Note** | | :--------------------: | --------------------------------------------------------------------------------------------- | diff --git a/gulpfile.js b/gulpfile.js index 65b6b47a2..379ab375a 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -23,123 +23,123 @@ const outDest = "out"; const languages = [{ folderName: "en", id: "en" }]; gulp.task("clean", () => { - return del( - [ - "out/*", - "package.nls.*.json", - "../../dist/*0.0.0-UNTRACKEDVERSION.vsix", - ], - { force: true } - ); + return del( + [ + "out/*", + "package.nls.*.json", + "../../dist/*0.0.0-UNTRACKEDVERSION.vsix", + ], + { force: true } + ); }); const pythonToMove = [ - "./src/adafruit_circuitplayground/*.*", - "./src/clue/*.*", - "./src/clue/!(test)/**/*", - "./src/base_circuitpython/**/*", - "./src/micropython/*.*", - "./src/micropython/microbit/*.*", - "./src/micropython/microbit/!(test)/**/*", - "./src/*.py", - "./src/common/*.py", - "./src/dev-requirements.txt", - "./src/requirements.txt", - "./src/templates/*.*" + "./src/adafruit_circuitplayground/*.*", + "./src/clue/*.*", + "./src/clue/!(test)/**/*", + "./src/base_circuitpython/**/*", + "./src/micropython/*.*", + "./src/micropython/microbit/*.*", + "./src/micropython/microbit/!(test)/**/*", + "./src/*.py", + "./src/common/*.py", + "./src/dev-requirements.txt", + "./src/requirements.txt", + "./src/templates/*.*", ]; gulp.task("python-compile", () => { - // the base option sets the relative root for the set of files, - // preserving the folder structure - return gulp.src(pythonToMove, { base: "./src/" }).pipe(gulp.dest("out")); + // the base option sets the relative root for the set of files, + // preserving the folder structure + return gulp.src(pythonToMove, { base: "./src/" }).pipe(gulp.dest("out")); }); gulp.task("internal-compile", () => { - return compile(false); + return compile(false); }); gulp.task("internal-nls-compile", () => { - return compile(true); + return compile(true); }); gulp.task("add-locales", () => { - return gulp - .src(["package.nls.json"]) - .pipe(nls.createAdditionalLanguageFiles(languages, "locales")) - .pipe(gulp.dest(".")); + return gulp + .src(["package.nls.json"]) + .pipe(nls.createAdditionalLanguageFiles(languages, "locales")) + .pipe(gulp.dest(".")); }); gulp.task("vsce:publish", () => { - return vsce.publish(); + return vsce.publish(); }); gulp.task("vsce:package", () => { - return vsce.createVSIX({ - packagePath: - "../../dist/deviceSimulatorExpress-0.0.0-UNTRACKEDVERSION.vsix", - }); + return vsce.createVSIX({ + packagePath: + "../../dist/deviceSimulatorExpress-0.0.0-UNTRACKEDVERSION.vsix", + }); }); gulp.task( - "compile", - gulp.series("clean", "internal-compile", "python-compile", callback => { - callback(); - }) + "compile", + gulp.series("clean", "internal-compile", "python-compile", (callback) => { + callback(); + }) ); gulp.task( - "build", - gulp.series( - "clean", - "internal-nls-compile", - "python-compile", - "add-locales", - callback => { - callback(); - } - ) + "build", + gulp.series( + "clean", + "internal-nls-compile", + "python-compile", + "add-locales", + (callback) => { + callback(); + } + ) ); gulp.task( - "publish", - gulp.series("compile", "vsce:publish", callback => { - callback(); - }) + "publish", + gulp.series("compile", "vsce:publish", (callback) => { + callback(); + }) ); gulp.task( - "package", - gulp.series("compile", "vsce:package", callback => { - callback(); - }) + "package", + gulp.series("compile", "vsce:package", (callback) => { + callback(); + }) ); //---- internal function compile(buildNls) { - var r = tsProject - .src() - .pipe(sourcemaps.init()) - .pipe(tsProject()) - .js.pipe(buildNls ? nls.rewriteLocalizeCalls() : es.through()) - .pipe( - buildNls - ? nls.createAdditionalLanguageFiles(languages, "locales", "out") - : es.through() - ); - - if (inlineMap && inlineSource) { - r = r.pipe(sourcemaps.write()); - } else { - r = r.pipe( - sourcemaps.write("../out", { - // no inlined source - includeContent: inlineSource, - // Return relative source map root directories per file. - sourceRoot: "../src", - }) - ); - } - - return r.pipe(gulp.dest(outDest)); + var r = tsProject + .src() + .pipe(sourcemaps.init()) + .pipe(tsProject()) + .js.pipe(buildNls ? nls.rewriteLocalizeCalls() : es.through()) + .pipe( + buildNls + ? nls.createAdditionalLanguageFiles(languages, "locales", "out") + : es.through() + ); + + if (inlineMap && inlineSource) { + r = r.pipe(sourcemaps.write()); + } else { + r = r.pipe( + sourcemaps.write("../out", { + // no inlined source + includeContent: inlineSource, + // Return relative source map root directories per file. + sourceRoot: "../src", + }) + ); + } + + return r.pipe(gulp.dest(outDest)); } diff --git a/jest.config.js b/jest.config.js index 3d7f4f549..c4371f1b0 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,28 +1,25 @@ module.exports = { - // The root of your source code, typically /src - // `` is a token Jest substitutes - roots: ["/src"], - - // Jest transformations -- this adds support for TypeScript - // using ts-jest - transform: { - '^.+\\.tsx?$': 'ts-jest', - ".+\\.(css|styl|less|sass|scss)$": "jest-transform-css" - }, - - // Runs special logic, such as cleaning up components - // when using React Testing Library and adds special - // extended assertions to Jest - setupFilesAfterEnv: [ - "@testing-library/jest-dom/extend-expect" - ], + // The root of your source code, typically /src + // `` is a token Jest substitutes + roots: ["/src"], - // Test spec file resolution pattern - // Matches parent folder `__tests__` and filename - // should contain `test` or `spec`. - testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$", - - // Module file extensions for importing - moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], - - }; \ No newline at end of file + // Jest transformations -- this adds support for TypeScript + // using ts-jest + transform: { + "^.+\\.tsx?$": "ts-jest", + ".+\\.(css|styl|less|sass|scss)$": "jest-transform-css", + }, + + // Runs special logic, such as cleaning up components + // when using React Testing Library and adds special + // extended assertions to Jest + setupFilesAfterEnv: ["@testing-library/jest-dom/extend-expect"], + + // Test spec file resolution pattern + // Matches parent folder `__tests__` and filename + // should contain `test` or `spec`. + testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$", + + // Module file extensions for importing + moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], +}; diff --git a/locales/en/out/constants.i18n.json b/locales/en/out/constants.i18n.json index d6df54300..079866bfc 100644 --- a/locales/en/out/constants.i18n.json +++ b/locales/en/out/constants.i18n.json @@ -1,45 +1,45 @@ { - "dialogResponses.agreeAndRun": "Agree and Run", - "dialogResponses.acceptPrivacy": "Got it", - "dialogResponses.cancel": "Cancel", - "dialogResponses.select": "Select", - "dialogResponses.dontShowAgain": "Don't Show Again", - "dialogResponses.exampleCode": "Example Code on GitHub", - "dialogResponses.help": "I need help", - "dialogResponses.installPython": "Install from python.org", - "dialogResponses.installNow": "Install Now", - "dialogResponses.dontInstall": "Don't Install", - "dialogResponses.tutorials": "Tutorials on Adafruit", - "dialogResponses.readInstall": "Read installation docs", - "error.debuggerServerInitFailed": "Warning : The Debugger Server cannot be opened. Please try to free the port {0} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.", - "error.debuggingSessionInProgress": "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n", - "error.noDevice": "No plugged in boards detected. Please double check if your board is connected and/or properly formatted", - "error.noFileToRun": "\n[ERROR] We can't find the .py file to run. Open up a new .py file, or browse through some examples\n", - "error.noFileToDeploy": "\n[ERROR] We can't find a Python file to deploy to your device.\n", - "error.noFolderCreated": "In order to use the Serial Monitor, you need to open a folder and reload VS Code.", - "error.noProgramFoundDebug": "Cannot find a program to debug.", - "error.noPythonPath": "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again.", - "error.stderr": "\n[ERROR] {0} \n", - "error.unexpectedMessage": "Webview sent an unexpected message", - "info.deployDevice": "\n[INFO] Deploying code to the device...\n", - "info.deploySimulator": "\n[INFO] Deploying code to the simulator...\n", - "info.deploySuccess": "\n[INFO] Code successfully deployed\n", - "info.extensionActivated": "Congratulations, your extension Adafruit_Simulator is now active!", - "info.firstTimeWebview": "To reopen the simulator select the command \"Open Simulator\" from command palette.", - "info.installPythonDependencies": "Do you want us to try and install this extensions dependencies for you?", - "error.invalidFileExtensionDebug": "The file you tried to run isn\\'t a Python file.", - "info.newFile": "New to Python or the Circuit Playground Express? We are here to help!", - "info.noDeviceChosenToDeployTo": "\n[INFO] No device was selected to deploy to.\n", - "info.noDeviceChosenToSimulateTo": "\n[INFO] No device was selected to simulate.\n", - "info.noDeviceChosenForNewFile": "\n[INFO] No device was selected to open a template file for.\n", - "info.redirect": "You are being redirected.", - "info.runningCode": "Running user code", - "info.privacyStatement": "Privacy Statement", - "info.successfulInstall": "Successfully installed Python dependencies.", - "info.thirdPartyWebsite": "By clicking \"Agree and Proceed\" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit's privacy policy", - "info.welcomeOutputTab": "Welcome to the Device Simulator Express output tab!\n\n", - "label.webviewPanel": "Device Simulator Express", - "name": "Device Simulator Express", + "dialogResponses.agreeAndRun": "Agree and Run", + "dialogResponses.acceptPrivacy": "Got it", + "dialogResponses.cancel": "Cancel", + "dialogResponses.select": "Select", + "dialogResponses.dontShowAgain": "Don't Show Again", + "dialogResponses.exampleCode": "Example Code on GitHub", + "dialogResponses.help": "I need help", + "dialogResponses.installPython": "Install from python.org", + "dialogResponses.installNow": "Install Now", + "dialogResponses.dontInstall": "Don't Install", + "dialogResponses.tutorials": "Tutorials on Adafruit", + "dialogResponses.readInstall": "Read installation docs", + "error.debuggerServerInitFailed": "Warning : The Debugger Server cannot be opened. Please try to free the port {0} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.", + "error.debuggingSessionInProgress": "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n", + "error.noDevice": "No plugged in boards detected. Please double check if your board is connected and/or properly formatted", + "error.noFileToRun": "\n[ERROR] We can't find the .py file to run. Open up a new .py file, or browse through some examples\n", + "error.noFileToDeploy": "\n[ERROR] We can't find a Python file to deploy to your device.\n", + "error.noFolderCreated": "In order to use the Serial Monitor, you need to open a folder and reload VS Code.", + "error.noProgramFoundDebug": "Cannot find a program to debug.", + "error.noPythonPath": "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again.", + "error.stderr": "\n[ERROR] {0} \n", + "error.unexpectedMessage": "Webview sent an unexpected message", + "info.deployDevice": "\n[INFO] Deploying code to the device...\n", + "info.deploySimulator": "\n[INFO] Deploying code to the simulator...\n", + "info.deploySuccess": "\n[INFO] Code successfully deployed\n", + "info.extensionActivated": "Congratulations, your extension Adafruit_Simulator is now active!", + "info.firstTimeWebview": "To reopen the simulator select the command \"Open Simulator\" from command palette.", + "info.installPythonDependencies": "Do you want us to try and install this extensions dependencies for you?", + "error.invalidFileExtensionDebug": "The file you tried to run isn\\'t a Python file.", + "info.newFile": "New to Python or the Circuit Playground Express? We are here to help!", + "info.noDeviceChosenToDeployTo": "\n[INFO] No device was selected to deploy to.\n", + "info.noDeviceChosenToSimulateTo": "\n[INFO] No device was selected to simulate.\n", + "info.noDeviceChosenForNewFile": "\n[INFO] No device was selected to open a template file for.\n", + "info.redirect": "You are being redirected.", + "info.runningCode": "Running user code", + "info.privacyStatement": "Privacy Statement", + "info.successfulInstall": "Successfully installed Python dependencies.", + "info.thirdPartyWebsite": "By clicking \"Agree and Proceed\" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit's privacy policy", + "info.welcomeOutputTab": "Welcome to the Device Simulator Express output tab!\n\n", + "label.webviewPanel": "Device Simulator Express", + "name": "Device Simulator Express", - "warning.agreeAndRun": "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk." + "warning.agreeAndRun": "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk." } diff --git a/locales/en/package.i18n.json b/locales/en/package.i18n.json index 4f34f2536..c2a23bf24 100644 --- a/locales/en/package.i18n.json +++ b/locales/en/package.i18n.json @@ -1,17 +1,17 @@ { - "deviceSimulatorExpressExtension.commands.common.installDependencies": "Install Extension Dependencies", - "deviceSimulatorExpressExtension.commands.common.label": "Device Simulator Express", - "deviceSimulatorExpressExtension.commands.common.runSimulator": "Run Simulator", - "deviceSimulatorExpressExtension.commands.common.gettingStarted": "Getting Started", - "deviceSimulatorExpressExtension.commands.common.changeBaudRate": "Change Baud Rate", - "deviceSimulatorExpressExtension.commands.common.closeSerialMonitor": "Close Serial Monitor", - "deviceSimulatorExpressExtension.commands.common.openSerialMonitor": "Open Serial Monitor", - "deviceSimulatorExpressExtension.commands.common.selectSerialPort": "Select Serial Port", - "deviceSimulatorExpressExtension.commands.common.deployToDevice": "Deploy to Device", - "deviceSimulatorExpressExtension.commands.common.openSimulator": "Open Simulator", - "deviceSimulatorExpressExtension.commands.common.newFile": "New File", - "deviceSimulatorExpressExtension.configuration.title": "Device Simulator Express configuration", - "deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange": "When you change the Python interpreter, the Device Simulator Express will automatically configure itself for the required dependencies.", - "deviceSimulatorExpressExtension.configuration.properties.debuggerPort": "The port the Server will listen on for communication with the debugger.", - "deviceSimulatorExpressExtension.configuration.properties.dependencyChecker": "Whether or not to ask if we can download dependencies. If unchecked, the extension will default to never download dependencies, except when automatically creating a virtual environment in the extension files." -} \ No newline at end of file + "deviceSimulatorExpressExtension.commands.common.installDependencies": "Install Extension Dependencies", + "deviceSimulatorExpressExtension.commands.common.label": "Device Simulator Express", + "deviceSimulatorExpressExtension.commands.common.runSimulator": "Run Simulator", + "deviceSimulatorExpressExtension.commands.common.gettingStarted": "Getting Started", + "deviceSimulatorExpressExtension.commands.common.changeBaudRate": "Change Baud Rate", + "deviceSimulatorExpressExtension.commands.common.closeSerialMonitor": "Close Serial Monitor", + "deviceSimulatorExpressExtension.commands.common.openSerialMonitor": "Open Serial Monitor", + "deviceSimulatorExpressExtension.commands.common.selectSerialPort": "Select Serial Port", + "deviceSimulatorExpressExtension.commands.common.deployToDevice": "Deploy to Device", + "deviceSimulatorExpressExtension.commands.common.openSimulator": "Open Simulator", + "deviceSimulatorExpressExtension.commands.common.newFile": "New File", + "deviceSimulatorExpressExtension.configuration.title": "Device Simulator Express configuration", + "deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange": "When you change the Python interpreter, the Device Simulator Express will automatically configure itself for the required dependencies.", + "deviceSimulatorExpressExtension.configuration.properties.debuggerPort": "The port the Server will listen on for communication with the debugger.", + "deviceSimulatorExpressExtension.configuration.properties.dependencyChecker": "Whether or not to ask if we can download dependencies. If unchecked, the extension will default to never download dependencies, except when automatically creating a virtual environment in the extension files." +} diff --git a/misc/usbmapping.json b/misc/usbmapping.json index e3d9519a5..584bd236a 100644 --- a/misc/usbmapping.json +++ b/misc/usbmapping.json @@ -1,18 +1,15 @@ [ - { - "index_file": "https://adafruit.github.io/arduino-board-index/package_adafruit_index.json", - "boards": [ - { - "vid": "239a", - "pid": [ - "8019" - ], - "name": "Adafruit Circuit Playground Express", - "package": "adafruit", - "architecture": "samd", - "id": "cpx" - } - - ] - } -] \ No newline at end of file + { + "index_file": "https://adafruit.github.io/arduino-board-index/package_adafruit_index.json", + "boards": [ + { + "vid": "239a", + "pid": ["8019"], + "name": "Adafruit Circuit Playground Express", + "package": "adafruit", + "architecture": "samd", + "id": "cpx" + } + ] + } +] diff --git a/package.json b/package.json index 48386ce14..c6abfac62 100644 --- a/package.json +++ b/package.json @@ -1,336 +1,336 @@ { - "name": "__EXTENSIONNAME__", - "displayName": "__DISPLAYNAME__", - "version": "0.0.1", - "private": "false", - "description": "__DESCRIPTION__", - "categories": [ - "Other" - ], - "keywords": [ - "python", - "CircuitPython", - "Adafruit", - "microbit", - "MicroPython" - ], - "homepage": "https://github.com/CodeEditorLand/CodeEditorLand#readme", - "bugs": { - "url": "https://github.com/CodeEditorLand/CodeEditorLand/issues" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/CodeEditorLand/CodeEditorLand.git" - }, - "license": "MIT", - "author": { - "name": "Nikola Hristov", - "email": "nikola@nikolahristov.tech", - "url": "https://nikolahristov.tech" - }, - "publisher": "playform", - "type": "module", - "main": "./out/extension.js", - "scripts": { - "start": "webpack-dev-server", - "vscode:prepublish": "npm run compile", - "build": "gulp build", - "clean": "gulp clean", - "compile": "npm-run-all compile:*", - "compile:extension": "gulp compile", - "compile:views": "webpack --mode development", - "watch": "npm-run-all -p watch:*", - "watch:extension": "tsc --watch", - "watch:views": "webpack --watch --mode development", - "pretest": "npm run compile", - "test": "npm-run-all test:*", - "test:extension-tests": "node ./out/test/runTest.js", - "test:ts": "jest", - "test:api-tests": "pytest src", - "lint": "npm-run-all lint:*", - "lint:ts": "tslint -c tslint.json src/**/*.{ts,tsx}", - "lint:python": "pylint src", - "format": "npm-run-all format:*", - "format:ts": "prettier --config .prettierrc.yaml --write src/**/*.{css,ts,tsx}", - "format:python": "black src", - "check": "npm-run-all check:*", - "check:ts": "prettier --config .prettierrc.yaml --check src/**/*.{css,ts,tsx}", - "check:python": "black src --check", - "package": "vsce package", - "prepublishOnly": "TypeScriptESBuild Source/**/*.ts" - }, - "contributes": { - "breakpoints": [ - { - "language": "python" - } - ], - "colors": [ - { - "id": "highContrastButtonBorderOverride.color", - "description": "Color for the high contrast border updated", - "defaults": { - "dark": "debugToolBar.background", - "light": "debugToolBar.background", - "highContrast": "#6FC3DF" - } - }, - { - "id": "badgeForegroundOverride", - "description": "Color that fixes the issue with midnight blue ", - "defaults": { - "dark": "#FFFFFF", - "light": "badge.foreground", - "highContrast": "#FFFFFF" - } - } - ], - "commands": [ - { - "command": "deviceSimulatorExpress.common.installDependencies", - "title": "%deviceSimulatorExpressExtension.commands.common.installDependencies%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.changeBaudRate", - "title": "%deviceSimulatorExpressExtension.commands.common.changeBaudRate%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.closeSerialMonitor", - "title": "%deviceSimulatorExpressExtension.commands.common.closeSerialMonitor%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.openSerialMonitor", - "title": "%deviceSimulatorExpressExtension.commands.common.openSerialMonitor%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.selectSerialPort", - "title": "%deviceSimulatorExpressExtension.commands.common.selectSerialPort%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.runSimulator", - "title": "%deviceSimulatorExpressExtension.commands.common.runSimulator%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.gettingStarted", - "title": "%deviceSimulatorExpressExtension.commands.common.gettingStarted%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.deployToDevice", - "title": "%deviceSimulatorExpressExtension.commands.common.deployToDevice%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.newFile", - "title": "%deviceSimulatorExpressExtension.commands.common.newFile%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.openSimulator", - "title": "%deviceSimulatorExpressExtension.commands.common.openSimulator%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - } - ], - "configuration": { - "type": "object", - "title": "%deviceSimulatorExpressExtension.configuration.title%", - "properties": { - "deviceSimulatorExpress.configNewEnvironmentUponSwitch": { - "type": "boolean", - "default": false, - "description": "%deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange%", - "scope": "resource" - }, - "deviceSimulatorExpress.enableUSBDetection": { - "type": "boolean", - "default": true - }, - "deviceSimulatorExpress.showDependencyInstall": { - "type": "boolean", - "default": true, - "description": "%deviceSimulatorExpressExtension.configuration.properties.dependencyChecker%", - "scope": "resource" - }, - "deviceSimulatorExpress.showNewFilePopup": { - "type": "boolean", - "default": true, - "scope": "resource" - }, - "deviceSimulatorExpress.debuggerServerPort": { - "type": "number", - "default": 5577, - "description": "%deviceSimulatorExpressExtension.configuration.properties.debuggerPort%", - "scope": "resource" - } - } - }, - "debuggers": [ - { - "type": "deviceSimulatorExpress", - "label": "Device Simulator Express Debugger", - "languages": [ - "python" - ], - "configurationAttributes": { - "launch": { - "properties": { - "program": { - "type": "string", - "description": "Absolute path to the code file.", - "default": "${file}" - }, - "stopOnEntry": { - "type": "boolean", - "description": "Automatically stop after launch.", - "default": true - }, - "console": { - "enum": [ - "internalConsole", - "integratedTerminal", - "externalTerminal" - ], - "description": "Where to launch the debug target: internal console, integrated terminal, or external terminal.", - "default": "integratedTerminal" - }, - "args": { - "type": "array", - "description": "Command line arguments passed to the program.", - "default": [], - "items": { - "filePath": "string", - "serverPort": "string" - } - }, - "rules": { - "type": "array", - "description": "Debugger rules.", - "default": [], - "items": { - "path": "string", - "include": "boolean" - } - } - } - } - }, - "initialConfigurations": [ - { - "type": "deviceSimulatorExpress", - "request": "launch", - "name": "Device Simulator Express Debugger", - "console": "integratedTerminal" - } - ], - "configurationSnippets": [ - { - "label": "Device Simulator Express Debugger : Launch", - "description": "Device Simulator Express Debugger - A configuration for debugging a python code file for the Device Simulator Express simulator.", - "body": { - "type": "deviceSimulatorExpress", - "request": "launch", - "name": "Device Simulator Express Debugger", - "console": "integratedTerminal" - } - } - ] - } - ] - }, - "activationEvents": [ - "onCommand:deviceSimulatorExpress.common.installDependencies", - "onCommand:deviceSimulatorExpress.common.openSerialMonitor", - "onCommand:deviceSimulatorExpress.common.runSimulator", - "onCommand:deviceSimulatorExpress.common.selectSerialPort", - "onCommand:deviceSimulatorExpress.common.gettingStarted", - "onCommand:deviceSimulatorExpress.common.deployToDevice", - "onCommand:deviceSimulatorExpress.common.newFile", - "onCommand:deviceSimulatorExpress.common.openSimulator", - "onDebug" - ], - "dependencies": { - "@babel/preset-typescript": "7.23.2", - "@testing-library/jest-dom": "6.1.4", - "@testing-library/react": "14.0.0", - "@types/jest": "29.5.6", - "@types/open": "6.1.0", - "@types/react-test-renderer": "18.0.5", - "@types/socket.io": "3.0.1", - "babel-jest": "29.7.0", - "compare-versions": "6.1.0", - "eventemitter2": "6.4.9", - "glob": "10.3.10", - "jest": "29.7.0", - "jest-transform-css": "6.0.1", - "office-ui-fabric-react": "7.204.0", - "open": "9.1.0", - "os": "0.1.2", - "react": "18.2.0", - "react-dom": "18.2.0", - "react-intl": "6.5.1", - "react-test-renderer": "18.2.0", - "socket.io": "4.7.2", - "svg-inline-react": "3.2.1", - "ts-jest": "29.1.1", - "usb-native": "6.0.0", - "util": "0.12.5", - "vscode-extension-telemetry": "0.1.1", - "vscode-nls": "5.2.0" - }, - "devDependencies": { - "@types/glob": "8.1.0", - "@types/node": "20.8.9", - "@types/react": "18.2.33", - "@types/react-dom": "18.2.14", - "@types/vscode": "1.83.1", - "css-loader": "6.8.1", - "del": "7.1.0", - "event-stream": "4.0.1", - "gulp": "4.0.2", - "gulp-cli": "2.3.0", - "gulp-filter": "8.0.0", - "gulp-sourcemaps": "3.0.0", - "gulp-typescript": "5.0.1", - "less": "4.2.0", - "less-loader": "11.1.3", - "mocha": "10.2.0", - "npm-run-all": "4.1.5", - "prettier": "3.0.3", - "react-scripts": "5.0.1", - "style-loader": "3.3.3", - "ts-import-plugin": "3.0.0", - "ts-loader": "9.5.0", - "tslint": "5.20.1", - "tslint-config-prettier": "1.18.0", - "tslint-microsoft-contrib": "6.1.0", - "tslint-react": "4.1.0", - "tslint-react-hooks": "2.2.2", - "typescript": "5.2.2", - "typescript-esbuild": "0.3.1", - "typescript-react-intl": "0.4.1", - "version-from-git": "1.1.1", - "vsce": "1.47.0", - "vscode-nls-dev": "4.0.4", - "vscode-test": "1.0.0", - "webpack": "5.89.0", - "webpack-cli": "5.1.4" - }, - "extensionDependencies": [ - "ms-python.python" - ], - "engines": { - "vscode": "1.43.0" - }, - "publishConfig": { - "access": "public" - }, - "icon": "assets/icon.png", - "preview": true, - "instrumentationKey": "__AIKEY__" + "name": "__EXTENSIONNAME__", + "displayName": "__DISPLAYNAME__", + "version": "0.0.1", + "private": "false", + "description": "__DESCRIPTION__", + "categories": [ + "Other" + ], + "keywords": [ + "python", + "CircuitPython", + "Adafruit", + "microbit", + "MicroPython" + ], + "homepage": "https://github.com/CodeEditorLand/CodeEditorLand#readme", + "bugs": { + "url": "https://github.com/CodeEditorLand/CodeEditorLand/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/CodeEditorLand/CodeEditorLand.git" + }, + "license": "MIT", + "author": { + "name": "Nikola Hristov", + "email": "nikola@nikolahristov.tech", + "url": "https://nikolahristov.tech" + }, + "publisher": "playform", + "type": "module", + "main": "./out/extension.js", + "scripts": { + "start": "webpack-dev-server", + "vscode:prepublish": "npm run compile", + "build": "gulp build", + "clean": "gulp clean", + "compile": "npm-run-all compile:*", + "compile:extension": "gulp compile", + "compile:views": "webpack --mode development", + "watch": "npm-run-all -p watch:*", + "watch:extension": "tsc --watch", + "watch:views": "webpack --watch --mode development", + "pretest": "npm run compile", + "test": "npm-run-all test:*", + "test:extension-tests": "node ./out/test/runTest.js", + "test:ts": "jest", + "test:api-tests": "pytest src", + "lint": "npm-run-all lint:*", + "lint:ts": "tslint -c tslint.json src/**/*.{ts,tsx}", + "lint:python": "pylint src", + "format": "npm-run-all format:*", + "format:ts": "prettier --config .prettierrc.yaml --write src/**/*.{css,ts,tsx}", + "format:python": "black src", + "check": "npm-run-all check:*", + "check:ts": "prettier --config .prettierrc.yaml --check src/**/*.{css,ts,tsx}", + "check:python": "black src --check", + "package": "vsce package", + "prepublishOnly": "TypeScriptESBuild 'Source/**/*.ts'" + }, + "contributes": { + "breakpoints": [ + { + "language": "python" + } + ], + "colors": [ + { + "id": "highContrastButtonBorderOverride.color", + "description": "Color for the high contrast border updated", + "defaults": { + "dark": "debugToolBar.background", + "light": "debugToolBar.background", + "highContrast": "#6FC3DF" + } + }, + { + "id": "badgeForegroundOverride", + "description": "Color that fixes the issue with midnight blue ", + "defaults": { + "dark": "#FFFFFF", + "light": "badge.foreground", + "highContrast": "#FFFFFF" + } + } + ], + "commands": [ + { + "command": "deviceSimulatorExpress.common.installDependencies", + "title": "%deviceSimulatorExpressExtension.commands.common.installDependencies%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.changeBaudRate", + "title": "%deviceSimulatorExpressExtension.commands.common.changeBaudRate%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.closeSerialMonitor", + "title": "%deviceSimulatorExpressExtension.commands.common.closeSerialMonitor%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.openSerialMonitor", + "title": "%deviceSimulatorExpressExtension.commands.common.openSerialMonitor%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.selectSerialPort", + "title": "%deviceSimulatorExpressExtension.commands.common.selectSerialPort%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.runSimulator", + "title": "%deviceSimulatorExpressExtension.commands.common.runSimulator%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.gettingStarted", + "title": "%deviceSimulatorExpressExtension.commands.common.gettingStarted%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.deployToDevice", + "title": "%deviceSimulatorExpressExtension.commands.common.deployToDevice%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.newFile", + "title": "%deviceSimulatorExpressExtension.commands.common.newFile%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.openSimulator", + "title": "%deviceSimulatorExpressExtension.commands.common.openSimulator%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + } + ], + "configuration": { + "type": "object", + "title": "%deviceSimulatorExpressExtension.configuration.title%", + "properties": { + "deviceSimulatorExpress.configNewEnvironmentUponSwitch": { + "type": "boolean", + "default": false, + "description": "%deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange%", + "scope": "resource" + }, + "deviceSimulatorExpress.enableUSBDetection": { + "type": "boolean", + "default": true + }, + "deviceSimulatorExpress.showDependencyInstall": { + "type": "boolean", + "default": true, + "description": "%deviceSimulatorExpressExtension.configuration.properties.dependencyChecker%", + "scope": "resource" + }, + "deviceSimulatorExpress.showNewFilePopup": { + "type": "boolean", + "default": true, + "scope": "resource" + }, + "deviceSimulatorExpress.debuggerServerPort": { + "type": "number", + "default": 5577, + "description": "%deviceSimulatorExpressExtension.configuration.properties.debuggerPort%", + "scope": "resource" + } + } + }, + "debuggers": [ + { + "type": "deviceSimulatorExpress", + "label": "Device Simulator Express Debugger", + "languages": [ + "python" + ], + "configurationAttributes": { + "launch": { + "properties": { + "program": { + "type": "string", + "description": "Absolute path to the code file.", + "default": "${file}" + }, + "stopOnEntry": { + "type": "boolean", + "description": "Automatically stop after launch.", + "default": true + }, + "console": { + "enum": [ + "internalConsole", + "integratedTerminal", + "externalTerminal" + ], + "description": "Where to launch the debug target: internal console, integrated terminal, or external terminal.", + "default": "integratedTerminal" + }, + "args": { + "type": "array", + "description": "Command line arguments passed to the program.", + "default": [], + "items": { + "filePath": "string", + "serverPort": "string" + } + }, + "rules": { + "type": "array", + "description": "Debugger rules.", + "default": [], + "items": { + "path": "string", + "include": "boolean" + } + } + } + } + }, + "initialConfigurations": [ + { + "type": "deviceSimulatorExpress", + "request": "launch", + "name": "Device Simulator Express Debugger", + "console": "integratedTerminal" + } + ], + "configurationSnippets": [ + { + "label": "Device Simulator Express Debugger : Launch", + "description": "Device Simulator Express Debugger - A configuration for debugging a python code file for the Device Simulator Express simulator.", + "body": { + "type": "deviceSimulatorExpress", + "request": "launch", + "name": "Device Simulator Express Debugger", + "console": "integratedTerminal" + } + } + ] + } + ] + }, + "activationEvents": [ + "onCommand:deviceSimulatorExpress.common.installDependencies", + "onCommand:deviceSimulatorExpress.common.openSerialMonitor", + "onCommand:deviceSimulatorExpress.common.runSimulator", + "onCommand:deviceSimulatorExpress.common.selectSerialPort", + "onCommand:deviceSimulatorExpress.common.gettingStarted", + "onCommand:deviceSimulatorExpress.common.deployToDevice", + "onCommand:deviceSimulatorExpress.common.newFile", + "onCommand:deviceSimulatorExpress.common.openSimulator", + "onDebug" + ], + "dependencies": { + "@babel/preset-typescript": "7.23.2", + "@testing-library/jest-dom": "6.1.4", + "@testing-library/react": "14.0.0", + "@types/jest": "29.5.6", + "@types/open": "6.1.0", + "@types/react-test-renderer": "18.0.5", + "@types/socket.io": "3.0.1", + "babel-jest": "29.7.0", + "compare-versions": "6.1.0", + "eventemitter2": "6.4.9", + "glob": "10.3.10", + "jest": "29.7.0", + "jest-transform-css": "6.0.1", + "office-ui-fabric-react": "7.204.0", + "open": "9.1.0", + "os": "0.1.2", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-intl": "6.5.1", + "react-test-renderer": "18.2.0", + "socket.io": "4.7.2", + "svg-inline-react": "3.2.1", + "ts-jest": "29.1.1", + "usb-native": "6.0.0", + "util": "0.12.5", + "vscode-extension-telemetry": "0.1.1", + "vscode-nls": "5.2.0" + }, + "devDependencies": { + "@types/glob": "8.1.0", + "@types/node": "20.8.9", + "@types/react": "18.2.33", + "@types/react-dom": "18.2.14", + "@types/vscode": "1.83.1", + "css-loader": "6.8.1", + "del": "7.1.0", + "event-stream": "4.0.1", + "gulp": "4.0.2", + "gulp-cli": "2.3.0", + "gulp-filter": "8.0.0", + "gulp-sourcemaps": "3.0.0", + "gulp-typescript": "5.0.1", + "less": "4.2.0", + "less-loader": "11.1.3", + "mocha": "10.2.0", + "npm-run-all": "4.1.5", + "prettier": "3.0.3", + "react-scripts": "5.0.1", + "style-loader": "3.3.3", + "ts-import-plugin": "3.0.0", + "ts-loader": "9.5.0", + "tslint": "5.20.1", + "tslint-config-prettier": "1.18.0", + "tslint-microsoft-contrib": "6.1.0", + "tslint-react": "4.1.0", + "tslint-react-hooks": "2.2.2", + "typescript": "5.2.2", + "typescript-esbuild": "0.3.1", + "typescript-react-intl": "0.4.1", + "version-from-git": "1.1.1", + "vsce": "1.47.0", + "vscode-nls-dev": "4.0.4", + "vscode-test": "1.0.0", + "webpack": "5.89.0", + "webpack-cli": "5.1.4" + }, + "extensionDependencies": [ + "ms-python.python" + ], + "engines": { + "vscode": "1.43.0" + }, + "publishConfig": { + "access": "public" + }, + "icon": "assets/icon.png", + "preview": true, + "instrumentationKey": "__AIKEY__" } diff --git a/package.nls.json b/package.nls.json index e662c005a..56d7a34ed 100644 --- a/package.nls.json +++ b/package.nls.json @@ -1,17 +1,17 @@ { - "deviceSimulatorExpressExtension.commands.common.installDependencies": "Install Extension Dependencies", - "deviceSimulatorExpressExtension.commands.common.label": "Device Simulator Express", - "deviceSimulatorExpressExtension.commands.common.runSimulator": "Run Simulator", - "deviceSimulatorExpressExtension.commands.common.gettingStarted": "Getting Started", - "deviceSimulatorExpressExtension.commands.common.changeBaudRate": "Change Baud Rate", - "deviceSimulatorExpressExtension.commands.common.closeSerialMonitor": "Close Serial Monitor", - "deviceSimulatorExpressExtension.commands.common.openSerialMonitor": "Open Serial Monitor", - "deviceSimulatorExpressExtension.commands.common.selectSerialPort": "Select Serial Port", - "deviceSimulatorExpressExtension.commands.common.deployToDevice": "Deploy to Device", - "deviceSimulatorExpressExtension.commands.common.openSimulator": "Open Simulator", - "deviceSimulatorExpressExtension.commands.common.newFile": "New File", - "deviceSimulatorExpressExtension.configuration.title": "Device Simulator Express configuration", - "deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange": "When you change the Python interpreter, the Device Simulator Express will automatically configure itself for the required dependencies.", - "deviceSimulatorExpressExtension.configuration.properties.debuggerPort": "The port the Server will listen on for communication with the debugger.", - "deviceSimulatorExpressExtension.configuration.properties.dependencyChecker": "Whether or not to ask for dependency downloads. If unchecked, the extension will default to never download dependencies, except when automatically creating a virtual environment in the extension files." -} \ No newline at end of file + "deviceSimulatorExpressExtension.commands.common.installDependencies": "Install Extension Dependencies", + "deviceSimulatorExpressExtension.commands.common.label": "Device Simulator Express", + "deviceSimulatorExpressExtension.commands.common.runSimulator": "Run Simulator", + "deviceSimulatorExpressExtension.commands.common.gettingStarted": "Getting Started", + "deviceSimulatorExpressExtension.commands.common.changeBaudRate": "Change Baud Rate", + "deviceSimulatorExpressExtension.commands.common.closeSerialMonitor": "Close Serial Monitor", + "deviceSimulatorExpressExtension.commands.common.openSerialMonitor": "Open Serial Monitor", + "deviceSimulatorExpressExtension.commands.common.selectSerialPort": "Select Serial Port", + "deviceSimulatorExpressExtension.commands.common.deployToDevice": "Deploy to Device", + "deviceSimulatorExpressExtension.commands.common.openSimulator": "Open Simulator", + "deviceSimulatorExpressExtension.commands.common.newFile": "New File", + "deviceSimulatorExpressExtension.configuration.title": "Device Simulator Express configuration", + "deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange": "When you change the Python interpreter, the Device Simulator Express will automatically configure itself for the required dependencies.", + "deviceSimulatorExpressExtension.configuration.properties.debuggerPort": "The port the Server will listen on for communication with the debugger.", + "deviceSimulatorExpressExtension.configuration.properties.dependencyChecker": "Whether or not to ask for dependency downloads. If unchecked, the extension will default to never download dependencies, except when automatically creating a virtual environment in the extension files." +} diff --git a/tsconfig.json b/tsconfig.json index 8fd7e5501..8aa229a90 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,13 +1,13 @@ { - "compilerOptions": { - "module": "commonjs", - "target": "es6", - "outDir": "out", - "lib": ["es6", "dom"], - "sourceMap": true, - "rootDir": "src", - "jsx": "react", - "alwaysStrict": true - }, - "exclude": ["node_modules", ".vscode-test"] + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "outDir": "out", + "lib": ["es6", "dom"], + "sourceMap": true, + "rootDir": "src", + "jsx": "react", + "alwaysStrict": true + }, + "exclude": ["node_modules", ".vscode-test"] } diff --git a/tslint.json b/tslint.json index 534279116..1a4aa8078 100644 --- a/tslint.json +++ b/tslint.json @@ -1,34 +1,34 @@ { - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": [ - "tslint:latest", - "tslint-react", - "tslint-config-prettier", - "tslint-react-hooks", - "tslint-microsoft-contrib/latest" - ], - "rules": { - "no-implicit-dependencies": [true, "dev"], - "no-string-throw": true, - "no-unused-expression": true, - "no-duplicate-variable": true, - "no-empty": false, - "no-relative-imports": false, - "max-func-body-length": false, - "curly": true, - "class-name": true, - "triple-equals": true, - "object-literal-sort-keys": true, - "react-hooks-nesting": "error", - "ordered-imports": true, - "import-name": false, - "member-access": false, - "no-console": false, - "jsx-boolean-value": false, - "no-unnecessary-semicolons": false, - "no-http-string": false, - "export-name": false, - "interface-name": false - }, - "defaultSeverity": "warning" + "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], + "extends": [ + "tslint:latest", + "tslint-react", + "tslint-config-prettier", + "tslint-react-hooks", + "tslint-microsoft-contrib/latest" + ], + "rules": { + "no-implicit-dependencies": [true, "dev"], + "no-string-throw": true, + "no-unused-expression": true, + "no-duplicate-variable": true, + "no-empty": false, + "no-relative-imports": false, + "max-func-body-length": false, + "curly": true, + "class-name": true, + "triple-equals": true, + "object-literal-sort-keys": true, + "react-hooks-nesting": "error", + "ordered-imports": true, + "import-name": false, + "member-access": false, + "no-console": false, + "jsx-boolean-value": false, + "no-unnecessary-semicolons": false, + "no-http-string": false, + "export-name": false, + "interface-name": false + }, + "defaultSeverity": "warning" } diff --git a/webpack.config.js b/webpack.config.js index 82aae8c6e..95533509a 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -2,85 +2,85 @@ const path = require("path"); const tsImportPlugin = require("ts-import-plugin"); module.exports = { - entry: { - simulator: "./src/view/index.tsx" - }, - output: { - path: path.resolve(__dirname, "out"), - filename: "[name].js" - }, - devServer: { - historyApiFallback: true - }, - devtool: "source-map", - resolve: { - extensions: [".js", ".ts", ".tsx", ".json"] - }, - module: { - rules: [ - { - test: /\.(ts|tsx)$/, - loader: "ts-loader", - options: { - getCustomTransformers: () => ({ - before: [ - tsImportPlugin({ - libraryName: "antd", - libraryDirectory: "es", - style: true - }) - ] - }) - } - }, - { - test: /\.less$/, - use: [ - { - loader: "style-loader" - }, - { - loader: "css-loader", - options: { - importLoaders: 1, - sourceMap: true - } - }, - { - loader: "less-loader", - options: { - javascriptEnabled: true, - sourceMap: true, - modifyVars: { - "@body-background": "var(--background-color)" - } - } - } - ] - }, - { - test: /\.css$/, - use: [ - { - loader: "style-loader" - }, - { - loader: "css-loader" - } - ] - }, - { - test: /\.svg$/, - loader: "svg-inline" - } - ] - } - // When importing a module whose path matches one of the following, just - // assume a corresponding global variable exists and use that instead. - // This is important because it allows us to avoid bundling all of our - // dependencies, which allows browsers to cache those libraries between builds. - // externals: { - // react: "React", - // "react-dom": "ReactDOM" - // } + entry: { + simulator: "./src/view/index.tsx", + }, + output: { + path: path.resolve(__dirname, "out"), + filename: "[name].js", + }, + devServer: { + historyApiFallback: true, + }, + devtool: "source-map", + resolve: { + extensions: [".js", ".ts", ".tsx", ".json"], + }, + module: { + rules: [ + { + test: /\.(ts|tsx)$/, + loader: "ts-loader", + options: { + getCustomTransformers: () => ({ + before: [ + tsImportPlugin({ + libraryName: "antd", + libraryDirectory: "es", + style: true, + }), + ], + }), + }, + }, + { + test: /\.less$/, + use: [ + { + loader: "style-loader", + }, + { + loader: "css-loader", + options: { + importLoaders: 1, + sourceMap: true, + }, + }, + { + loader: "less-loader", + options: { + javascriptEnabled: true, + sourceMap: true, + modifyVars: { + "@body-background": "var(--background-color)", + }, + }, + }, + ], + }, + { + test: /\.css$/, + use: [ + { + loader: "style-loader", + }, + { + loader: "css-loader", + }, + ], + }, + { + test: /\.svg$/, + loader: "svg-inline", + }, + ], + }, + // When importing a module whose path matches one of the following, just + // assume a corresponding global variable exists and use that instead. + // This is important because it allows us to avoid bundling all of our + // dependencies, which allows browsers to cache those libraries between builds. + // externals: { + // react: "React", + // "react-dom": "ReactDOM" + // } }; From be2e4c5693cbca3afd98c1da3670beefe8d6e0bf Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Thu, 9 Nov 2023 15:07:12 +0200 Subject: [PATCH 07/64] squash! --- .github/CODEOWNERS | 3 -- .github/PULL_REQUEST_TEMPLATE.md | 33 -------------------- .github/workflows/ci.yml | 52 -------------------------------- 3 files changed, 88 deletions(-) delete mode 100644 .github/CODEOWNERS delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/ci.yml diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 7bd16fe97..000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,3 +0,0 @@ -# At least one of the code owners below will be required on each PR: - -* @markAtMicrosoft @smmatte @adclements @abmahdy @iennae @nasadigital @isadorasophia @sagarmanchanda diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index ef9bbe450..000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,33 +0,0 @@ -# Description: - -Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. - -## Type of change - -Please delete options that are not relevant. - -- [ ] Bug fix (non-breaking change which fixes an issue) -- [ ] New feature (non-breaking change which adds functionality) -- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) -- [ ] This change requires a documentation update - -# Limitations: - -Please describe limitations of this PR - -# Testing: - -Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration - -- [ ] Test A -- [ ] Test B - -# Checklist: - -- [ ] My code follows the style guidelines of this project -- [ ] My code has been formatted with `npm run format` and passes the checks in `npm run check` -- [ ] I have performed a self-review of my own code -- [ ] I have commented my code, particularly in hard-to-understand areas -- [ ] I have made corresponding changes to the documentation -- [ ] My changes generate no new warnings -- [ ] Any dependent changes have been merged and published in downstream modules diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 93eb4fa78..000000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,52 +0,0 @@ -# This workflow will do a clean install of node dependencies, python dependencies, build the source code and run tests - -name: CI - -on: - push: - branches: [ dev, staging ] - pull_request: - branches: [ dev, staging ] - -jobs: - build-and-test: - - runs-on: ${{ matrix.os }} - - strategy: - fail-fast: false - matrix: - os: [macos-latest, windows-latest, ubuntu-18.04] - node-version: [10.x] - - steps: - - uses: actions/checkout@v2 - - name: Install Linux dependencies - if: matrix.os == 'ubuntu-18.04' - run: | - sudo apt-get update - sudo apt-get install g++-multilib - sudo apt-get install -y build-essential - sudo apt-get install libudev-dev - - name: Use Node.js ${{ matrix.node-version }} and install npm dependencies - uses: actions/setup-node@v2 - with: - node-version: ${{ matrix.node-version }} - - run: npm install - - name: Setup Python environment - uses: actions/setup-python@v2 - with: - python-version: 3.x - - run: | - python -m pip install --upgrade pip - pip install -r ./src/dev-requirements.txt - - name: Use npm to compile, format-check and test - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - run: npm run compile - - run: npm run check - - name: Run tests - uses: GabrielBB/xvfb-action@v1.0 - with: - run: npm run test From 108df4d3aaa4e1ecd9714cfbfc78a48cd2d50ad5 Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Thu, 9 Nov 2023 19:54:06 +0200 Subject: [PATCH 08/64] squash! --- .gitignore | 10 +- .prettierrc.yaml | 2 +- CODING_STANDARDS.md | 33 +- CONTRIBUTING.md | 24 +- LICENSE | 46 +- PRIVACY.md | 34 +- README.md | 782 +- SECURITY.md | 5 +- docs/developers-setup.md | 119 +- docs/how-to-use.md | 148 +- docs/install.md | 61 +- docs/telemetry.md | 12 +- misc/usbmapping.json | 31 +- package-lock.json | 32342 ---------------- package.json | 650 +- package.nls.json | 32 +- src/base_circuitpython/__init__.py | 16 +- src/base_circuitpython/board.py | 256 +- src/base_circuitpython/digitalio.py | 34 +- src/base_circuitpython/fontio.py | 28 +- src/base_circuitpython/neopixel_write.py | 110 +- src/base_circuitpython/pulseio.py | 32 +- src/base_circuitpython/terminal_handler.py | 216 +- src/base_circuitpython/terminalio.py | 30 +- .../test/test_terminal_handler.py | 122 +- src/check_if_venv.py | 22 +- src/clue/__init__.py | 2 +- src/clue/adafruit_clue.py | 1704 +- src/clue/adafruit_display_text/label.py | 560 +- src/clue/adafruit_slideshow.py | 814 +- src/clue/test/test_adafruit_clue.py | 386 +- src/clue/test/test_adafruit_display_shapes.py | 162 +- src/clue/test/test_adafruit_display_text.py | 130 +- src/clue/test/test_adafruit_slideshow.py | 200 +- src/clue/test/test_helpers.py | 64 +- src/common/constants.py | 24 +- src/common/telemetry_events.py | 130 +- src/constants.ts | 1014 +- src/cpxWorkspace.ts | 36 +- src/debugger/debugAdapter.ts | 84 +- src/debugger/debugAdapterFactory.ts | 50 +- src/debuggerCommunicationServer.ts | 235 +- src/dev-requirements.txt | 2 +- src/deviceContext.ts | 274 +- src/extension.ts | 2080 +- src/extension_utils/utils.ts | 300 +- src/install_dependencies.py | 18 +- src/micropython/music.py | 218 +- src/micropython/radio.py | 360 +- src/micropython/speech.py | 122 +- src/micropython/utime.py | 264 +- src/requirements.txt | 2 +- src/serialMonitor.ts | 522 +- src/serialPortControl.ts | 362 +- src/service/PopupService.ts | 32 +- src/service/debuggerCommunicationService.ts | 54 +- src/service/deviceSelectionService.ts | 24 +- src/service/fileSelectionService.ts | 190 +- src/service/messagingService.ts | 57 +- src/service/setupService.ts | 1154 +- src/service/telemetryHandlerService.ts | 1054 +- src/service/webviewService.ts | 147 +- src/simulatorDebugConfigurationProvider.ts | 143 +- src/telemetry/getPackageInfo.ts | 86 +- src/telemetry/telemetryAI.ts | 134 +- src/templates/clue_template.py | 32 +- src/templates/cpx_template.py | 32 +- src/templates/microbit_template.py | 22 +- src/test/runTest.ts | 26 +- src/test/suite/index.ts | 54 +- src/usbDetector.ts | 194 +- src/view/App.css | 22 +- src/view/App.spec.tsx | 40 +- src/view/App.tsx | 152 +- src/view/components/Button.tsx | 45 +- src/view/components/Dropdown.tsx | 43 +- src/view/components/clue/Clue.spec.tsx | 58 +- src/view/components/clue/Clue.tsx | 316 +- src/view/components/clue/ClueImage.tsx | 312 +- src/view/components/clue/ClueSimulator.tsx | 550 +- src/view/components/clue/Clue_svg.tsx | 2359 +- .../components/cpx/Accessibility_utils.ts | 32 +- src/view/components/cpx/Cpx.spec.tsx | 58 +- src/view/components/cpx/Cpx.tsx | 208 +- src/view/components/cpx/CpxImage.tsx | 688 +- src/view/components/cpx/CpxSimulator.tsx | 730 +- src/view/components/cpx/Cpx_svg.tsx | 5981 ++- src/view/components/cpx/Cpx_svg_style.tsx | 68 +- src/view/components/cpx/Svg_utils.tsx | 156 +- .../components/microbit/Microbit.spec.tsx | 58 +- src/view/components/microbit/Microbit.tsx | 260 +- .../components/microbit/MicrobitImage.tsx | 332 +- .../components/microbit/MicrobitSimulator.tsx | 518 +- src/view/components/microbit/Microbit_svg.tsx | 3699 +- src/view/components/simulator/ActionBar.tsx | 60 +- .../toolbar/GenericSliderComponent.tsx | 82 +- src/view/components/toolbar/Gesture.tsx | 141 +- src/view/components/toolbar/InputSlider.tsx | 212 +- src/view/components/toolbar/SensorButton.tsx | 59 +- .../components/toolbar/SensorModalUtils.tsx | 274 +- src/view/components/toolbar/ToolBar.tsx | 392 +- src/view/components/toolbar/Toolbar.spec.tsx | 114 +- .../toolbar/clue/ClueModalContent.tsx | 636 +- .../toolbar/clue/ClueSensorProperties.tsx | 432 +- .../toolbar/cpx/CpxModalContent.tsx | 310 +- .../toolbar/cpx/CpxSensorProperties.tsx | 96 +- .../toolbar/microbit/MicrobitModalContent.tsx | 374 +- .../microbit/MicrobitSensorProperties.tsx | 96 +- src/view/constants.ts | 220 +- src/view/container/device/Device.spec.tsx | 60 +- src/view/container/device/Device.tsx | 48 +- src/view/index.css | 10 +- src/view/index.tsx | 10 +- src/view/pages/gettingStarted.css | 112 +- src/view/pages/gettingStarted.spec.tsx | 58 +- src/view/pages/gettingStarted.tsx | 562 +- src/view/styles/Button.css | 34 +- src/view/styles/Dropdown.css | 28 +- src/view/styles/InputSlider.css | 116 +- src/view/styles/LightSensorBar.css | 24 +- src/view/styles/MotionSensorBar.css | 18 +- src/view/styles/SensorButton.css | 32 +- src/view/styles/Simulator.css | 122 +- src/view/styles/SimulatorSvg.css | 582 +- src/view/styles/TemperatureSensorBar.css | 22 +- src/view/styles/ToolBar.css | 232 +- src/view/svgs/arrow_right_svg.tsx | 29 +- src/view/svgs/close_svg.tsx | 39 +- src/view/svgs/play_svg.tsx | 25 +- src/view/svgs/refresh_svg.tsx | 27 +- src/view/svgs/stop_svg.tsx | 29 +- src/view/svgs/tag_input_svg.tsx | 41 +- src/view/svgs/tag_output_svg.tsx | 39 +- src/view/svgs/toolbar_svg.tsx | 1289 +- src/view/translations/en.json | 224 +- src/view/tsconfig.json | 34 +- src/view/utils/MessageUtils.tsx | 24 +- src/view/viewUtils.tsx | 36 +- tsconfig.json | 22 +- tslint.json | 64 +- webpack.config.js | 162 +- 141 files changed, 20392 insertions(+), 52696 deletions(-) delete mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index 7bc1e7ff6..5b1da70a4 100644 --- a/.gitignore +++ b/.gitignore @@ -5,14 +5,14 @@ # Compiled JS code out/ -!locales/**/out/ +!locales/**/out/ package.nls.*.json # virtual environment venv/ # testing -.vscode-test +.vscode-test # User-specific files *.suo @@ -232,7 +232,7 @@ ClientBin/ *.publishsettings orleans.codegen.cs -# Including strong name files can present a security risk +# Including strong name files can present a security risk # (https://github.com/github/gitignore/pull/2483#issue-259490424) #*.snk @@ -328,7 +328,7 @@ __pycache__/ # OpenCover UI analysis results OpenCover/ -# Azure Stream Analytics local run output +# Azure Stream Analytics local run output ASALocalRun/ # MSBuild Binary and Structured Log @@ -337,5 +337,5 @@ ASALocalRun/ # NVidia Nsight GPU debugger configuration file *.nvuser -# MFractors (Xamarin productivity tool) working folder +# MFractors (Xamarin productivity tool) working folder .mfractor/ diff --git a/.prettierrc.yaml b/.prettierrc.yaml index 5379f1e00..e5e52b837 100644 --- a/.prettierrc.yaml +++ b/.prettierrc.yaml @@ -2,4 +2,4 @@ trailingComma: "es5" tabWidth: 4 semi: true endOfLine: auto -printWidth: 80 \ No newline at end of file +printWidth: 80 diff --git a/CODING_STANDARDS.md b/CODING_STANDARDS.md index 629e68791..a19ef621b 100644 --- a/CODING_STANDARDS.md +++ b/CODING_STANDARDS.md @@ -2,24 +2,31 @@ ## Coding guidelines for TypeScript -- The following standards are inspired from [Coding guidelines for TypeScript](https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines) (which you should follow when something is not specified in this document, although any pre-existing practices in a file being edited trump either style guide). +- The following standards are inspired from + [Coding guidelines for TypeScript](https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines) + (which you should follow when something is not specified in this document, + although any pre-existing practices in a file being edited trump either + style guide). ### Names - Use `PascalCase` for type names. -- Use `I` as a prefix for interface names only when an interface is implemented by a class. +- Use `I` as a prefix for interface names only when an interface is + implemented by a class. - Use `PascalCase` for enum values. - Use `camelCase` for function names. - Use `camelCase` for property names and local variables. -- Do not use `_` as a prefix for private properties (unless used as backing properties). +- Do not use `_` as a prefix for private properties (unless used as backing + properties). - Use whole words in names when possible. ### Types -- Do not export types/functions unless you need to share it across multiple components. +- Do not export types/functions unless you need to share it across multiple + components. - Do not introduce new types/values to the global namespace. -- Shared types should be defined in `types.ts`. - Within a file, type definitions should come first. +- Shared types should be defined in `types.ts`. Within a file, type + definitions should come first. ### null and undefined @@ -37,16 +44,21 @@ Use single quotes for strings. ### Imports - Use ES6 module imports. -- Do not use bare `import *`; all imports should either explicitly pull in an object or import an entire module, otherwise you're implicitly polluting the global namespace and making it difficult to figure out from code examination where a name originates from. +- Do not use bare `import *`; all imports should either explicitly pull in an + object or import an entire module, otherwise you're implicitly polluting the + global namespace and making it difficult to figure out from code examination + where a name originates from. ### Style - Use `prettier` to format `TypeScript` and `JavaScript` code. - Use arrow functions over anonymous function expressions. -- Always surround loop and conditional bodies with curly braces. Statements on the same line are allowed to omit braces. +- Always surround loop and conditional bodies with curly braces. Statements on + the same line are allowed to omit braces. - Open curly braces always go on the same line as whatever necessitates them. - Parenthesized constructs should have no surrounding whitespace. -- A single space follows commas, colons, and semicolons in those constructs. For example: +- A single space follows commas, colons, and semicolons in those constructs. + For example: - `for (var i = 0, n = str.length; i < 10; i++) { }` - `if (x < 10) { }` @@ -58,4 +70,5 @@ Use single quotes for strings. ## Coding Standards for Python -Please follow the [Google Python Style Guide](https://google.github.io/styleguide/pyguide.html). +Please follow the +[Google Python Style Guide](https://google.github.io/styleguide/pyguide.html). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c282e9a1a..f0c1cf0b4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,14 +1,18 @@ # Contributing -This project welcomes contributions and suggestions. Most contributions require you to -agree to a Contributor License Agreement (CLA) declaring that you have the right to, -and actually do, grant us the rights to use your contribution. For details, visit -https://cla.microsoft.com. +This project welcomes contributions and suggestions. Most contributions require +you to agree to a Contributor License Agreement (CLA) declaring that you have +the right to, and actually do, grant us the rights to use your contribution. For +details, visit https://cla.microsoft.com. -When you submit a pull request, a CLA-bot will automatically determine whether you need -to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the -instructions provided by the bot. You will only need to do this once across all repositories using our CLA. +When you submit a pull request, a CLA-bot will automatically determine whether +you need to provide a CLA and decorate the PR appropriately (e.g., label, +comment). Simply follow the instructions provided by the bot. You will only need +to do this once across all repositories using our CLA. -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). -For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) -or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. \ No newline at end of file +This project has adopted the +[Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). +For more information see the +[Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or +contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any +additional questions or comments. diff --git a/LICENSE b/LICENSE index 1a7e30ed5..1c80a7489 100644 --- a/LICENSE +++ b/LICENSE @@ -1,23 +1,23 @@ - Project Device Simulator Express - - Copyright (c) Microsoft Corporation. All rights reserved. - - MIT License - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. + Project Device Simulator Express + + Copyright (c) Microsoft Corporation. All rights reserved. + + MIT License + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. diff --git a/PRIVACY.md b/PRIVACY.md index c97adaf9a..7ca7ec04b 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -2,21 +2,31 @@ ## Data Collection -The software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft's privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704​​​​​​​. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices. +The software may collect information about you and your use of the software and +send it to Microsoft. Microsoft may use this information to provide services and +improve our products and services. You may turn off the telemetry as described +in the repository. There are also some features in the software that may enable +you and Microsoft to collect data from users of your applications. If you use +these features, you must comply with applicable law, including providing +appropriate notices to users of your applications together with a copy of +Microsoft's privacy statement. Our privacy statement is located at +https://go.microsoft.com/fwlink/?LinkID=824704​​​​​​​. You can learn more about +data collection and use in the help documentation and our privacy statement. +Your use of the software operates as your consent to these practices. ## Disable Telemetry -The Microsoft Device Simulator Express Extension for Visual Studio Code collects usage -data and sends it to Microsoft to help improve our products and -services. Read our -[privacy statement](https://privacy.microsoft.com/privacystatement) to -learn more. This extension respects the `telemetry.enableTelemetry` -setting which you can learn more about at +The Microsoft Device Simulator Express Extension for Visual Studio Code collects +usage data and sends it to Microsoft to help improve our products and services. +Read our [privacy statement](https://privacy.microsoft.com/privacystatement) to +learn more. This extension respects the `telemetry.enableTelemetry` setting +which you can learn more about at https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting. To disable telemetry, follow these steps: -1) Open **File** (Open **Code** on macOS) -2) Select **Preferences** -3) Select **Settings** -4) Search for `telemetry` -5) Uncheck the **Telemetry: Enable Telemetry** setting \ No newline at end of file + +1. Open **File** (Open **Code** on macOS) +2. Select **Preferences** +3. Select **Settings** +4. Search for `telemetry` +5. Uncheck the **Telemetry: Enable Telemetry** setting diff --git a/README.md b/README.md index fd019ee59..78f01934d 100644 --- a/README.md +++ b/README.md @@ -1,349 +1,433 @@ -# ⚠️ NOTE: this extension is no longer maintained! ⚠️ - -Please see the [deprecation notice](https://github.com/microsoft/vscode-python-devicesimulator/wiki/Deprecation-of-the-extension) for details. - -# Device Simulator Express, a Microsoft Garage project - -Make without limit! Device Simulator Express, a Microsoft Garage project, allows you to code microcontrollers without the hardware on hand! You can program your Adafruit Circuit Playground Express (CPX), your BBC micro:bit or the Adafruit CLUE! Test and debug your code on the device simulator and see the same -result when you plug in your actual microcontroller. Curious about the output of the device, the serial -monitor allows you to observe the device output. - -## Table of Contents - - [Devices we support](#devices-we-support) - - [Prerequisites](#prerequisites) - - [Adafruit Circuit Playground Express (CPX) Simulator](#adafruit-circuit-playground-express-cpx-simulator) - - [Features](#features) - - [Useful Links](#useful-links) - - [Keyboard Shortcuts](#keyboard-shortcuts) - - [BBC micro:bit Simulator](#bbc-microbit-simulator) - - [Features](#features-1) - - [Useful Links](#useful-links-1) - - [Keyboard Shortcuts](#keyboard-shortcuts-1) - - [Adafruit CLUE Simulator](#adafruit-clue-simulator) - - [Features](#features-2) - - [Useful Links](#useful-links-2) - - [Keyboard Shortcuts](#keyboard-shortcuts-2) - - [How to use](#how-to-use) - - [Commands](#commands) - - [Contribute](#contribute) - - [Provide feedback](#provide-feedback) - - [Privacy and Telemetry Notice](#privacy-and-telemetry-notice) - - [Third Party Notice](#third-party-notice) - - [Troubleshooting Tips](#troubleshooting-tips) - - [License](#license) - - [Notes](#notes) - -## Devices we support - -- [**Adafruit Circuit Playground Express (CPX)**](#adafruit-circuit-playground-express-cpx-simulator) - - [CircuitPlayground Express](#adafruit-circuit-playground-express-cpx-simulator) - -- [**BBC micro:bit**](#bbc-microbit-simulator) - - [bbc micro:bit](#bbc-microbit-simulator) - -- [**Adafruit CLUE**](#adafruit-clue-simulator) - - [Adafruit CLUE](#adafruit-clue-simulator) - -## Build Status - -| Branch | Build Status | -| :------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| dev | [![Build Status](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_apis/build/status/Adafruit/Pacifica-CI?branchName=dev)](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_build/latest?definitionId=304&branchName=dev) | -| staging | [![Build Status](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_apis/build/status/Adafruit/Pacifica-CI?branchName=staging)](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_build/latest?definitionId=304&branchName=staging) | -| master | [![Build Status](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_apis/build/status/Adafruit/Pacifica-CI?branchName=master)](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_build/latest?definitionId=304&branchName=master) | - -## Prerequisites - -The following dependencies are required to install before launching Device Simulator Express. -You will be prompted to install the Python dependencies during the first use. - -- _**[Visual Studio Code](https://code.visualstudio.com/)**_ -- _**[Python 3.7+](https://www.python.org/downloads/)**_: Make sure you've added Python and pip to your PATH in your environment variables. (1) -- _**[Python VS Code extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python)**_: This will be installed automatically from the marketplace when you install Device Simulator Express. - -## Adafruit Circuit Playground Express (CPX) Simulator - -### Features - -- IntelliSense and syntax highlighting for CircuitPython code for the CPX library -- Template file generation -- Integrated Python Debugging for the Simulator -- Serial monitor (available on Windows and Mac only) -- Output panel for the simulator -- Deploy CircuitPython code to the physical device. -- Simulation of the CPX device, including: - - Green LED - - Red LED - - Push Buttons A and B - - Slider Switch - - Speaker: Play .wav file - - 10 NeoPixels - - Light sensor - - Motion sensors - - Acceleration detection - - Device shake detection - - Temperature sensor - - 7 Capacitive Touch sensors - -The simulator supports most of the sensors on CPX except **IR transmitter & Receiver**, **Sound Sensor (microphone)**, **Speaker (Play Tone)** and the **"tap" on Motion Sensor**. -The code related to these sensors can still run on the actual CPX board and be deployed using Device Simulator Express. -As we only support CPX library now, other libraries (i.e. simpleio) can’t run on the simulator. But they will work on the actual device! - -### Useful Links - -- Tutorials and Example Code for Adafruit CPX: - - [Adafruit CPX library tutorial](https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library) - - [Adafruit CPX Examples on GitHub](https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples) - - [Adafruit CPX Guided Tour (Intro for the Hardware)](https://learn.adafruit.com/adafruit-circuit-playground-express/guided-tour) -- Format Adafruit CPX device: - - [Tutorial for formatting Adafruit CPX for CircuitPython](https://learn.adafruit.com/welcome-to-circuitpython/installing-circuitpython) - - [Download Firmware .uf2 file](https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart) - - [Download the latest version of the Adafruit CPX library](https://learn.adafruit.com/welcome-to-circuitpython/circuitpython-libraries) - -### Keyboard Shortcuts - -In Device Simulator Express, you can use keyboard to interact with the device: - -- Push Button: A for Button A, B for Button B, C for Buttons A & B -- Capacitive Touch Sensor: Shift + 1 ~ 7 for GPIO pins A1 - A7 -- Slider Switch: Shift + S -- Refresh the simulator: Shift + R -- Run the simulator: Shift + F - -## BBC micro:bit Simulator - -### Features - -- IntelliSense and syntax highlighting for MicroPython code for the micro:bit library -- Template file generation -- Integrated Python Debugging for the Simulator -- Deploy MicroPython code to the physical device -- Serial monitor (available on Windows and Mac only) -- Simulation of the micro:bit device, including: - - 25 LEDs - - Push Buttons A and B - - Light sensor - - Motion sensors - - Acceleration detection including gesture detection - - Temperature sensor - -### Useful Links - -- Tutorials and Example Code for BBC micro:bit: - - [MicroPython documentation](https://microbit-micropython.readthedocs.io/en/latest/) - - [BBC micro:bit examples on the official micro:bit website](https://microbit.org/projects/make-it-code-it/?filters=python) - -### Keyboard Shortcuts - -- Push Button: A for Button A, B for Button B, C for Buttons A & B -- Refresh the simulator: Shift + R -- Run the simulator: Shift + F - -## Adafruit CLUE Simulator - -### Features - -- IntelliSense and syntax highlighting for CircuitPython code for the following drivers and libraries: - - `adafruit_clue` - - `adafruit_slideshow` - - `adafruit_display_shapes` - - `adafruit_display_text` - - `adafruit_bitmap_font` - - `adafruit_fancyled` - - `neopixel` - - `displayio` -- Template file generation -- Integrated Python Debugging for the Simulator -- Deploy CircuitPython code to the physical device -- Serial monitor (available on Windows and Mac only) -- Simulation of the CLUE device, including: - - 240x240 color screen - - Push Buttons A and B - - Sensors for: - - Temperature - - Light - - Color - - Acceleration - - Humidity - - Pressure - - Proximity - - Gestures - - Gyro - - Magnetic Field - -### Useful Links - -- Tutorials and Example Code for Adafruit CLUE: - - [Adafruit CLUE Overview](https://learn.adafruit.com/adafruit-clue) - - [Adafruit CLUE Examples on GitHub](https://github.com/adafruit/Adafruit_CircuitPython_CLUE/tree/master/examples) - -### Keyboard Shortcuts - -- Push Button: A for Button A, B for Button B, C for Buttons A & B -- Refresh the simulator: Shift + R -- Run the simulator: Shift + F - -## How to use - -To use Device Simulator Express, install the extension from the marketplace and reload VS Code. - -To access many of the commands, you need to open the command palette. This can be done with Ctrl + Shift + P for Windows and Linux / Cmd + Shift + P for Mac. It can also be accessed from the toolbar by going to `View -> Command Palette`. - -### I. Take a look at the "Device Simulator Express: Getting Started" Command. - -1. Type in `"Device Simulator Express: Getting Started"` in the command palette (Ctrl + Shift + P / Cmd + Shift + P to open the command palette). -2. Choose the the device you want to play with from the dropdown. -3. Read, copy and learn some of the things you can do with the simulator! - -Getting Started - -### II. Start with the "Device Simulator Express: New File" Command. - -1. Type in `"Device Simulator Express: New File"` in the command palette (Ctrl + Shift + P / Cmd + Shift + P to open the command palette). -2. Select the device you want to use. -3. Name and save your file somewhere, and we’re good to go! -4. Start with some examples: you can find examples files and tutorials inside the comments at the top of the file. - -"New File" animation - -### III. Start from an existing Python file. - -1. Open the folder or your .py file in Visual Studio Code. -2. Run `Device Simulator Express: Open Simulator` from the command palette or icon in the editor toolbar. -3. Select the device you want to use. - -### IV. Run your code on the simulator. - -1. Run `Run Simulator` from the command palette or use the `Play` button on the simulator webview. - -How to run the simulator animation - -### V. Deploy your code to the physical device - -Before deploying the Python code to your CPX device, you need to format your device by following these tutorials: - -- _For the CPX_: - - - Download the firmware with the .uf2 file (link: https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart). - - Download the lastest versions of the cpx libraries (link: https://learn.adafruit.com/welcome-to-circuitpython/circuitpython-libraries). - -- _For the micro:bit_: - - - Download the firmware with the .hex file (link: https://microbit.org/get-started/user-guide/firmware/). - -- _For the CLUE_: - - Download the latest versions of the cpx libraries and follow the instructions here (link:https://learn.adafruit.com/adafruit-clue/circuitpython). - -1. Plug in your device (make sure it’s formatted properly already). -2. Run the command `"Device Simulator Express: Deploy to Device"`. - -Deploy to Device - -### VI. Use the Serial Monitor for your device (available on Windows and Mac only) - -1. Plug in your device (make sure it’s formatted properly already). -2. Run the command `"Device Simulator Express: Open Serial Monitor"`. -3. Select your baud rate for the serial port. -4. The `print()` statements in your code will show in the output console. - -### VII. Debug your project on the simulator - -1. Add breakpoints in your code -2. Press F5 to enter the debugging mode, and you can start debugging line by line! - -### Commands - -Device Simulator Express provides several commands in the Command Palette (F1 or Ctrl + Shift + P / Cmd + Shift + P for Mac OS) for working with \*.py files: - -- `Device Simulator Express: Getting Started`: Opens a page in VS Code that helps users get started with the extension. Here, users can browse through code that they can use to play with the simulators. -- `Device Simulator Express: Run Simulator`: Runs Python code on the simulator. -- `Device Simulator Express: New File`: Opens an unsaved .py file with template code, also opens the simulator for the selected device. -- `Device Simulator Express: Open Simulator`: Opens the simulator in the simulator window for the selected device -- `Device Simulator Express: Deploy to Device`: Copies the current file to the selected device. -- `Device Simulator Express: Open Serial Monitor`: Opens the serial monitor in the integrated output window. -- `Device Simulator Express: Close Serial Monitor`: Stops the serial monitor and releases the serial port. -- `Device Simulator Express: Change Baud Rate`: Changes the baud rate of the selected serial port. For Adafruit CPX, the default baud rate is 115200. -- `Device Simulator Express: Select Serial Port`: Changes the current serial port. - -## Contribute - -[See here for steps to run the extension locally.](https://github.com/microsoft/vscode-python-devicesimulator/blob/dev/docs/developers-setup.md) - -## Provide feedback - -To add a review for our extension, please do so on the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-python.devicesimulatorexpress) - -To report issues, provide feedback or requests, please use this link: [Provide Feedback](https://github.com/microsoft/vscode-python-devicesimulator/issues). -We would love to hear from you about your experience to keep improving our project. - -## Privacy and Telemetry Notice - -### Data Collection - -The software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft's privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices. - -### Disable Telemetry - -The Microsoft Device Simulator Express Extension for Visual Studio Code collects usage -data and sends it to Microsoft to help improve our products and -services. Read our -[privacy statement](https://privacy.microsoft.com/privacystatement) to -learn more. This extension respects the `telemetry.enableTelemetry` -setting which you can learn more about at -https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting. - -To disable telemetry, follow these steps: - -1. Open **File** (Open **Code** on macOS) -2. Select **Preferences** -3. Select **Settings** -4. Search for `telemetry` -5. Uncheck the **Telemetry: Enable Telemetry** setting - -## Third Party Notice - -A `ThirdPartyNotices.txt` file is provided in the extension's source code listing the appropriate third-party notices. - -## Troubleshooting Tips - -- The first time you install the extension, you'll need to execute the `run` command at least once in order to access auto-completion. -- While running a code file, if you get an error saying it can't find the file, make sure you've clicked on a valid Python code file before running it. -- To open the output panel again after closing it go to VS Code menu: `View -> Output`. -- If you try to deploy to the CPX while it's plugged in but you still get an error saying it cannot find the board, make sure your device is formatted correctly and that its name matches `CIRCUITPY`. -- If you can't get the Simulator communication working while debugging, try to open your `Settings` and check the port used under `"Device Simulator Express: Debugger Server Port"`. You can either change it (usually ports above 5000 should work) or try to free it, then start debugging again. -- When you are using the serial monitor, if you get some unusual error messages, unplug the device and reload the VS Code windows. -- If you're using Ubuntu and having some problems with setting up the environment, try reviewing [this article's](https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-local-programming-environment-on-ubuntu-16-04) "Step 1" section on how to set up Python 3 on Ubuntu 16.04. Then, ensure that you've run `sudo apt-get install -y python3-venv` to allow for virtual environment creation. - -## License - - Device Simulator Express, a Microsoft Garage project - - Copyright (c) Microsoft Corporation. All rights reserved. - - MIT License - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - -## Notes - -1. Make sure that when you type _python_ in a terminal, the command is recognized and you have the correct version. The easiest way to do it is to select the "Add to PATH" option directly when you install Python. Otherwise you can search how to insert it manually. -2. You can choose to see the prompt or not by changing the extension configurations. +# ⚠️ NOTE: this extension is no longer maintained! ⚠️ + +Please see the +[deprecation notice](https://github.com/microsoft/vscode-python-devicesimulator/wiki/Deprecation-of-the-extension) +for details. + +# Device Simulator Express, a Microsoft Garage project + +Make without limit! Device Simulator Express, a Microsoft Garage project, allows +you to code microcontrollers without the hardware on hand! You can program your +Adafruit Circuit Playground Express (CPX), your BBC micro:bit or the Adafruit +CLUE! Test and debug your code on the device simulator and see the same result +when you plug in your actual microcontroller. Curious about the output of the +device, the serial monitor allows you to observe the device output. + +## Table of Contents + +- [Devices we support](#devices-we-support) +- [Prerequisites](#prerequisites) +- [Adafruit Circuit Playground Express (CPX) Simulator](#adafruit-circuit-playground-express-cpx-simulator) + - [Features](#features) + - [Useful Links](#useful-links) + - [Keyboard Shortcuts](#keyboard-shortcuts) +- [BBC micro:bit Simulator](#bbc-microbit-simulator) + - [Features](#features-1) + - [Useful Links](#useful-links-1) + - [Keyboard Shortcuts](#keyboard-shortcuts-1) +- [Adafruit CLUE Simulator](#adafruit-clue-simulator) + - [Features](#features-2) + - [Useful Links](#useful-links-2) + - [Keyboard Shortcuts](#keyboard-shortcuts-2) +- [How to use](#how-to-use) + - [Commands](#commands) +- [Contribute](#contribute) +- [Provide feedback](#provide-feedback) +- [Privacy and Telemetry Notice](#privacy-and-telemetry-notice) +- [Third Party Notice](#third-party-notice) +- [Troubleshooting Tips](#troubleshooting-tips) +- [License](#license) +- [Notes](#notes) + +## Devices we support + +- [**Adafruit Circuit Playground Express (CPX)**](#adafruit-circuit-playground-express-cpx-simulator) + + [CircuitPlayground Express](#adafruit-circuit-playground-express-cpx-simulator) + +- [**BBC micro:bit**](#bbc-microbit-simulator) + + [bbc micro:bit](#bbc-microbit-simulator) + +- [**Adafruit CLUE**](#adafruit-clue-simulator) + + [Adafruit CLUE](#adafruit-clue-simulator) + +## Build Status + +| Branch | Build Status | +| :------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| dev | [![Build Status](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_apis/build/status/Adafruit/Pacifica-CI?branchName=dev)](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_build/latest?definitionId=304&branchName=dev) | +| staging | [![Build Status](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_apis/build/status/Adafruit/Pacifica-CI?branchName=staging)](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_build/latest?definitionId=304&branchName=staging) | +| master | [![Build Status](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_apis/build/status/Adafruit/Pacifica-CI?branchName=master)](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_build/latest?definitionId=304&branchName=master) | + +## Prerequisites + +The following dependencies are required to install before launching Device +Simulator Express. +You will be prompted to install the Python dependencies during the first use. + +- _**[Visual Studio Code](https://code.visualstudio.com/)**_ +- _**[Python 3.7+](https://www.python.org/downloads/)**_: Make sure you've + added Python and pip to your PATH in your environment variables. (1) +- _**[Python VS Code extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python)**_: + This will be installed automatically from the marketplace when you install + Device Simulator Express. + +## Adafruit Circuit Playground Express (CPX) Simulator + +### Features + +- IntelliSense and syntax highlighting for CircuitPython code for the CPX + library +- Template file generation +- Integrated Python Debugging for the Simulator +- Serial monitor (available on Windows and Mac only) +- Output panel for the simulator +- Deploy CircuitPython code to the physical device. +- Simulation of the CPX device, including: + - Green LED + - Red LED + - Push Buttons A and B + - Slider Switch + - Speaker: Play .wav file + - 10 NeoPixels + - Light sensor + - Motion sensors + - Acceleration detection + - Device shake detection + - Temperature sensor + - 7 Capacitive Touch sensors + +The simulator supports most of the sensors on CPX except **IR transmitter & +Receiver**, **Sound Sensor (microphone)**, **Speaker (Play Tone)** and the +**"tap" on Motion Sensor**. The code related to these sensors can still run on +the actual CPX board and be deployed using Device Simulator Express. +As we only support CPX library now, other libraries (i.e. simpleio) can’t run on +the simulator. But they will work on the actual device! + +### Useful Links + +- Tutorials and Example Code for Adafruit CPX: + - [Adafruit CPX library tutorial](https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library) + - [Adafruit CPX Examples on GitHub](https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples) + - [Adafruit CPX Guided Tour (Intro for the Hardware)](https://learn.adafruit.com/adafruit-circuit-playground-express/guided-tour) +- Format Adafruit CPX device: + - [Tutorial for formatting Adafruit CPX for CircuitPython](https://learn.adafruit.com/welcome-to-circuitpython/installing-circuitpython) + - [Download Firmware .uf2 file](https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart) + - [Download the latest version of the Adafruit CPX library](https://learn.adafruit.com/welcome-to-circuitpython/circuitpython-libraries) + +### Keyboard Shortcuts + +In Device Simulator Express, you can use keyboard to interact with the device: + +- Push Button: A for Button A, B for Button B, + C for Buttons A & B +- Capacitive Touch Sensor: Shift + 1 ~ 7 for + GPIO pins A1 - A7 +- Slider Switch: Shift + S +- Refresh the simulator: Shift + R +- Run the simulator: Shift + F + +## BBC micro:bit Simulator + +### Features + +- IntelliSense and syntax highlighting for MicroPython code for the micro:bit + library +- Template file generation +- Integrated Python Debugging for the Simulator +- Deploy MicroPython code to the physical device +- Serial monitor (available on Windows and Mac only) +- Simulation of the micro:bit device, including: + - 25 LEDs + - Push Buttons A and B + - Light sensor + - Motion sensors + - Acceleration detection including gesture detection + - Temperature sensor + +### Useful Links + +- Tutorials and Example Code for BBC micro:bit: + - [MicroPython documentation](https://microbit-micropython.readthedocs.io/en/latest/) + - [BBC micro:bit examples on the official micro:bit website](https://microbit.org/projects/make-it-code-it/?filters=python) + +### Keyboard Shortcuts + +- Push Button: A for Button A, B for Button B, + C for Buttons A & B +- Refresh the simulator: Shift + R +- Run the simulator: Shift + F + +## Adafruit CLUE Simulator + +### Features + +- IntelliSense and syntax highlighting for CircuitPython code for the + following drivers and libraries: + - `adafruit_clue` + - `adafruit_slideshow` + - `adafruit_display_shapes` + - `adafruit_display_text` + - `adafruit_bitmap_font` + - `adafruit_fancyled` + - `neopixel` + - `displayio` +- Template file generation +- Integrated Python Debugging for the Simulator +- Deploy CircuitPython code to the physical device +- Serial monitor (available on Windows and Mac only) +- Simulation of the CLUE device, including: + - 240x240 color screen + - Push Buttons A and B + - Sensors for: + - Temperature + - Light + - Color + - Acceleration + - Humidity + - Pressure + - Proximity + - Gestures + - Gyro + - Magnetic Field + +### Useful Links + +- Tutorials and Example Code for Adafruit CLUE: + - [Adafruit CLUE Overview](https://learn.adafruit.com/adafruit-clue) + - [Adafruit CLUE Examples on GitHub](https://github.com/adafruit/Adafruit_CircuitPython_CLUE/tree/master/examples) + +### Keyboard Shortcuts + +- Push Button: A for Button A, B for Button B, + C for Buttons A & B +- Refresh the simulator: Shift + R +- Run the simulator: Shift + F + +## How to use + +To use Device Simulator Express, install the extension from the marketplace and +reload VS Code. + +To access many of the commands, you need to open the command palette. This can +be done with Ctrl + Shift + P for Windows and +Linux / Cmd + Shift + P for Mac. It can also be +accessed from the toolbar by going to `View -> Command Palette`. + +### I. Take a look at the "Device Simulator Express: Getting Started" Command. + +1. Type in `"Device Simulator Express: Getting Started"` in the command palette + (Ctrl + Shift + P / Cmd + + Shift + P to open the command palette). +2. Choose the the device you want to play with from the dropdown. +3. Read, copy and learn some of the things you can do with the simulator! + +Getting Started + +### II. Start with the "Device Simulator Express: New File" Command. + +1. Type in `"Device Simulator Express: New File"` in the command palette + (Ctrl + Shift + P / Cmd + + Shift + P to open the command palette). +2. Select the device you want to use. +3. Name and save your file somewhere, and we’re good to go! +4. Start with some examples: you can find examples files and tutorials inside + the comments at the top of the file. + +"New File" animation + +### III. Start from an existing Python file. + +1. Open the folder or your .py file in Visual Studio Code. +2. Run `Device Simulator Express: Open Simulator` from the command palette or + icon in the editor toolbar. +3. Select the device you want to use. + +### IV. Run your code on the simulator. + +1. Run `Run Simulator` from the command palette or use the `Play` button on the + simulator webview. + +How to run the simulator animation + +### V. Deploy your code to the physical device + +Before deploying the Python code to your CPX device, you need to format your +device by following these tutorials: + +- _For the CPX_: + + - Download the firmware with the .uf2 file (link: + https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart). + - Download the lastest versions of the cpx libraries (link: + https://learn.adafruit.com/welcome-to-circuitpython/circuitpython-libraries). + +- _For the micro:bit_: + + - Download the firmware with the .hex file (link: + https://microbit.org/get-started/user-guide/firmware/). + +- _For the CLUE_: + - Download the latest versions of the cpx libraries and follow the + instructions here + (link:https://learn.adafruit.com/adafruit-clue/circuitpython). + +1. Plug in your device (make sure it’s formatted properly already). +2. Run the command `"Device Simulator Express: Deploy to Device"`. + +Deploy to Device + +### VI. Use the Serial Monitor for your device (available on Windows and Mac only) + +1. Plug in your device (make sure it’s formatted properly already). +2. Run the command `"Device Simulator Express: Open Serial Monitor"`. +3. Select your baud rate for the serial port. +4. The `print()` statements in your code will show in the output console. + +### VII. Debug your project on the simulator + +1. Add breakpoints in your code +2. Press F5 to enter the debugging mode, and you can start debugging line by + line! + +### Commands + +Device Simulator Express provides several commands in the Command Palette +(F1 or Ctrl + Shift + P / +Cmd + Shift + P for Mac OS) for working with +\*.py files: + +- `Device Simulator Express: Getting Started`: Opens a page in VS Code that + helps users get started with the extension. Here, users can browse through + code that they can use to play with the simulators. +- `Device Simulator Express: Run Simulator`: Runs Python code on the + simulator. +- `Device Simulator Express: New File`: Opens an unsaved .py file with + template code, also opens the simulator for the selected device. +- `Device Simulator Express: Open Simulator`: Opens the simulator in the + simulator window for the selected device +- `Device Simulator Express: Deploy to Device`: Copies the current file to the + selected device. +- `Device Simulator Express: Open Serial Monitor`: Opens the serial monitor in + the integrated output window. +- `Device Simulator Express: Close Serial Monitor`: Stops the serial monitor + and releases the serial port. +- `Device Simulator Express: Change Baud Rate`: Changes the baud rate of the + selected serial port. For Adafruit CPX, the default baud rate is 115200. +- `Device Simulator Express: Select Serial Port`: Changes the current serial + port. + +## Contribute + +[See here for steps to run the extension locally.](https://github.com/microsoft/vscode-python-devicesimulator/blob/dev/docs/developers-setup.md) + +## Provide feedback + +To add a review for our extension, please do so on the +[Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-python.devicesimulatorexpress) + +To report issues, provide feedback or requests, please use this link: +[Provide Feedback](https://github.com/microsoft/vscode-python-devicesimulator/issues). +We would love to hear from you about your experience to keep improving our +project. + +## Privacy and Telemetry Notice + +### Data Collection + +The software may collect information about you and your use of the software and +send it to Microsoft. Microsoft may use this information to provide services and +improve our products and services. You may turn off the telemetry as described +in the repository. There are also some features in the software that may enable +you and Microsoft to collect data from users of your applications. If you use +these features, you must comply with applicable law, including providing +appropriate notices to users of your applications together with a copy of +Microsoft's privacy statement. Our privacy statement is located at +https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data +collection and use in the help documentation and our privacy statement. Your use +of the software operates as your consent to these practices. + +### Disable Telemetry + +The Microsoft Device Simulator Express Extension for Visual Studio Code collects +usage data and sends it to Microsoft to help improve our products and services. +Read our [privacy statement](https://privacy.microsoft.com/privacystatement) to +learn more. This extension respects the `telemetry.enableTelemetry` setting +which you can learn more about at +https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting. + +To disable telemetry, follow these steps: + +1. Open **File** (Open **Code** on macOS) +2. Select **Preferences** +3. Select **Settings** +4. Search for `telemetry` +5. Uncheck the **Telemetry: Enable Telemetry** setting + +## Third Party Notice + +A `ThirdPartyNotices.txt` file is provided in the extension's source code +listing the appropriate third-party notices. + +## Troubleshooting Tips + +- The first time you install the extension, you'll need to execute the `run` + command at least once in order to access auto-completion. +- While running a code file, if you get an error saying it can't find the + file, make sure you've clicked on a valid Python code file before running + it. +- To open the output panel again after closing it go to VS Code menu: + `View -> Output`. +- If you try to deploy to the CPX while it's plugged in but you still get an + error saying it cannot find the board, make sure your device is formatted + correctly and that its name matches `CIRCUITPY`. +- If you can't get the Simulator communication working while debugging, try to + open your `Settings` and check the port used under + `"Device Simulator Express: Debugger Server Port"`. You can either change it + (usually ports above 5000 should work) or try to free it, then start + debugging again. +- When you are using the serial monitor, if you get some unusual error + messages, unplug the device and reload the VS Code windows. +- If you're using Ubuntu and having some problems with setting up the + environment, try reviewing + [this article's](https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-local-programming-environment-on-ubuntu-16-04) + "Step 1" section on how to set up Python 3 on Ubuntu 16.04. Then, ensure + that you've run `sudo apt-get install -y python3-venv` to allow for virtual + environment creation. + +## License + + Device Simulator Express, a Microsoft Garage project + + Copyright (c) Microsoft Corporation. All rights reserved. + + MIT License + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +## Notes + +1. Make sure that when you type _python_ in a terminal, the command is + recognized and you have the correct version. The easiest way to do it is to + select the "Add to PATH" option directly when you install Python. Otherwise + you can search how to insert it manually. +2. You can choose to see the prompt or not by changing the extension + configurations. diff --git a/SECURITY.md b/SECURITY.md index 034e84803..d906fed6e 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -16,6 +16,5 @@ currently being supported with security updates. Use this section to tell people how to report a vulnerability. -Tell them where to go, how often they can expect to get an update on a -reported vulnerability, what to expect if the vulnerability is accepted or -declined, etc. +Tell them where to go, how often they can expect to get an update on a reported +vulnerability, what to expect if the vulnerability is accepted or declined, etc. diff --git a/docs/developers-setup.md b/docs/developers-setup.md index a31842a89..bbd33ebe4 100644 --- a/docs/developers-setup.md +++ b/docs/developers-setup.md @@ -2,36 +2,47 @@ ## Dependencies -- Node +- Node - - Download link : https://nodejs.org/en/download/ + - Download link : https://nodejs.org/en/download/ -- Python 3.7.4 (or latest) +- Python 3.7.4 (or latest) -- Download link : https://www.python.org/downloads/ -- **NOTE :** Make sure Python is in your path under an environment variable named `python` or `python3.7` (during installation or insert it manually afterwards) -- **NOTE :** Make sure pip is added to your environment variables as well - (for example it could be found at : `c:\users\<...>\appdata\local\programs\python\python37\lib\site-packages\pip`) -- Run in a console `python -m pip install --upgrade pip` - -* Python Modules - - **Note:** On extension activation, you will be prompted with a popup asking if you want the modules to be automatically installed for you. The following python modules should be downloaded when you select "yes" on the prompt message. - - pywin32 **(on Windows only)** - - On Windows, you need to use the following command in the console to manually install pywin32: `pip install pywin32` - - *playsound* - - *pytest* - - *python-socketio* - - *requests* - - *applicationinsights* +- Download link : https://www.python.org/downloads/ +- **NOTE :** Make sure Python is in your path under an environment variable + named `python` or `python3.7` (during installation or insert it manually + afterwards) +- **NOTE :** Make sure pip is added to your environment variables as well (for + example it could be found at : + `c:\users\<...>\appdata\local\programs\python\python37\lib\site-packages\pip`) +- Run in a console `python -m pip install --upgrade pip` - *italics*: used in simulation mode only -* VS Code +* Python Modules -* Python extension for VS Code (download from VS Code market place) + - **Note:** On extension activation, you will be prompted with a popup + asking if you want the modules to be automatically installed for you. + The following python modules should be downloaded when you select "yes" + on the prompt message. + + - pywin32 **(on Windows only)** + - On Windows, you need to use the following command in the console + to manually install pywin32: `pip install pywin32` + - _playsound_ + - _pytest_ + - _python-socketio_ + - _requests_ + - _applicationinsights_ + + _italics_: used in simulation mode only + +* VS Code + +* Python extension for VS Code (download from VS Code market place) ## Steps to Get Started Running the Extension Locally -1. Make sure you have all the dependencies installed (Node, Python, Playsound, VS Code, Python VS Code extension) +1. Make sure you have all the dependencies installed (Node, Python, Playsound, + VS Code, Python VS Code extension) 2. Open the repository @@ -41,38 +52,56 @@ 5. Run the command : `npm run compile` -6. Start running the extension locally by pressing F5 or going to VS Code Debug menu and select 'Start debugging' +6. Start running the extension locally by pressing F5 or going to VS Code Debug + menu and select 'Start debugging' ## Testing -- To run unit tests, run the command: `npm run test` in the root level directory. - - You will need Pytest installed for the Python tests to run correctly -- To run just the python tests, run the command: `pytest src` or `python -m pytest src` in the root level directory. +- To run unit tests, run the command: `npm run test` in the root level + directory. + - You will need Pytest installed for the Python tests to run correctly +- To run just the python tests, run the command: `pytest src` or + `python -m pytest src` in the root level directory. ## Notes on how to use it -- [Documentation to use the Extension](/docs/how-to-use.md) -- Debugging the extension opens a new VS Code window with the local build of the extension -- From the original VS Code window (opened in our repository) you can see outputs in the Debug Console -- In the new VS Code window, you can access the commands provided by the extension from the Commands Palette (Ctrl+Shift+P) - listed as 'Device Simulator Express : ...' -- If you change some files you'll need to run the 'npm run compile' command again and restart debugging +- [Documentation to use the Extension](/docs/how-to-use.md) +- Debugging the extension opens a new VS Code window with the local build of + the extension +- From the original VS Code window (opened in our repository) you can see + outputs in the Debug Console +- In the new VS Code window, you can access the commands provided by the + extension from the Commands Palette (Ctrl+Shift+P) listed as 'Device + Simulator Express : ...' +- If you change some files you'll need to run the 'npm run compile' command + again and restart debugging ## Formatting -- We use prettier to format the Typescript and CSS files, and we use black to format the Python files. - - You will need to install them, if they are not installed already. This can be done by running the command: `npm install prettier` and `pip install black` respectively. -- To check that your files are formatted correctly, run the command: `npm run check`. -- To format your files correctly, run the command: `npm run format`. +- We use prettier to format the Typescript and CSS files, and we use black to + format the Python files. + - You will need to install them, if they are not installed already. This + can be done by running the command: `npm install prettier` and + `pip install black` respectively. +- To check that your files are formatted correctly, run the command: + `npm run check`. +- To format your files correctly, run the command: `npm run format`. ## Repository Structure (important files) -- src - - `adafruit_circuitplayground` : our mock library - - `extension.ts` : our extension code - - `process_user_code.py` : the file containing the code ran by the Python process spawned by the extension, responsible for running the user's code - - `view` : React side - - `components/` - - `cpx/` and `Simulator.tsx` : contain the React components and objects to display and handle the simulator webview - - `toolbar/` : contains the React components used in the toolbar and the modal. - - `translation/en.json`: contains the constants that should be localized. To internationalize the extension you can add additional files with constants sharing the same id found in _en.json_, but with the translated values. +- src + - `adafruit_circuitplayground` : our mock library + - `extension.ts` : our extension code + - `process_user_code.py` : the file containing the code ran by the Python + process spawned by the extension, responsible for running the user's + code + - `view` : React side + - `components/` + - `cpx/` and `Simulator.tsx` : contain the React components and + objects to display and handle the simulator webview + - `toolbar/` : contains the React components used in the toolbar and + the modal. + - `translation/en.json`: contains the constants that should be + localized. To internationalize the extension you can add additional + files with constants sharing the same id found in _en.json_, but + with the translated values. diff --git a/docs/how-to-use.md b/docs/how-to-use.md index d94b4987c..b79e12b00 100644 --- a/docs/how-to-use.md +++ b/docs/how-to-use.md @@ -2,92 +2,126 @@ Commands are accessible through : -- **The command palette** (`Ctrl+Shift+P` or `View->Command Palette`) and type 'Device Simulator Express : `command_name`' -- **The extension buttons** available on the top right of the Text Editor Panel when you have a Python file open (1) +- **The command palette** (`Ctrl+Shift+P` or `View->Command Palette`) and type + 'Device Simulator Express : `command_name`' +- **The extension buttons** available on the top right of the Text Editor + Panel when you have a Python file open (1) ## Available commands -- **Open Simulator** : opens the webview of the simulator. +- **Open Simulator** : opens the webview of the simulator. -- **New File** : opens an unsaved file to help you and a code snippet that you can save and play around with. - _(**Note :** will open the simulator webview if it's not open yet)_. +- **New File** : opens an unsaved file to help you and a code snippet that you + can save and play around with. + _(**Note :** will open the simulator webview if it's not open yet)_. -- **Run Simulator** : runs the code you have opened in the simulator (make sure you've clicked on a valid code file). - _(**Note :** will open the simulator webview if it's not open yet)_. +- **Run Simulator** : runs the code you have opened in the simulator (make + sure you've clicked on a valid code file). + _(**Note :** will open the simulator webview if it's not open yet)_. -- **Deploy to Device** : saves the code to the connected device. - _(**Note :** For the Circuit Playground Express, the board needs to be correctly formatted to a `CIRCUITPY` drive first. If that's not the case check [Installing CircuitPython](https://learn.adafruit.com/welcome-to-circuitpython/installing-circuitpython) to correctly format it)_. +- **Deploy to Device** : saves the code to the connected device. + _(**Note :** For the Circuit Playground Express, the board needs to be + correctly formatted to a `CIRCUITPY` drive first. If that's not the case + check + [Installing CircuitPython](https://learn.adafruit.com/welcome-to-circuitpython/installing-circuitpython) + to correctly format it)_. -* **Select Serial Port** : selects the serial port of the board you want the serial monitor to interact with. (2) - _(**Note :** USB detection must be enabled in the extension settings.)_ +* **Select Serial Port** : selects the serial port of the board you want the + serial monitor to interact with. (2) _(**Note :** USB detection must be + enabled in the extension settings.)_ -* **Open Serial Monitor** : opens the serial monitor. (2) - _(**Note :** A serial port must have been selected already)_. +* **Open Serial Monitor** : opens the serial monitor. (2) + _(**Note :** A serial port must have been selected already)_. -* **Change Baud Rate** : changes the baud rate of the serial monitor. (2) +* **Change Baud Rate** : changes the baud rate of the serial monitor. (2) -* **Close Serial Montitor** : closes the serial monitor. (2) +* **Close Serial Montitor** : closes the serial monitor. (2) ## Available features -- We currently support the [Adafruit Circuit Playground Express board](https://www.adafruit.com/product/3333) -- Access to auto-completion and Python error flagging -- Output panel for the simulator -- Deploy to the physical device (if correctly formatted) -- Debugger for the simulator -- Serial Monitor (available on Windows and Mac only) -- Device's features : - - NeoPixels - - Buttons (A & B) - - Playing .wav files - - Red LED - - Switch - - Green LED - - Light sensor - - Motion sensors - - Acceleration detection - - Board shake detection - - Temperature sensor - - Touch sensors +- We currently support the + [Adafruit Circuit Playground Express board](https://www.adafruit.com/product/3333) +- Access to auto-completion and Python error flagging +- Output panel for the simulator +- Deploy to the physical device (if correctly formatted) +- Debugger for the simulator +- Serial Monitor (available on Windows and Mac only) +- Device's features : + - NeoPixels + - Buttons (A & B) + - Playing .wav files + - Red LED + - Switch + - Green LED + - Light sensor + - Motion sensors + - Acceleration detection + - Board shake detection + - Temperature sensor + - Touch sensors ## Not supported yet -- Auto-detect/format the device -- Device's features - - Sound sensor - - Tones -- Sound detection (3) -- IR transmitter (3) -- Motion sensors - - Tap detection +- Auto-detect/format the device +- Device's features + - Sound sensor + - Tones +- Sound detection (3) +- IR transmitter (3) +- Motion sensors + - Tap detection ## Device Simulator Express configuration -Here are the settings you can change in the Device Simulator Express configuration: +Here are the settings you can change in the Device Simulator Express +configuration: -- **Debugger Server Port:** allows you to change the port used to communicate with the debugger. Default value is _5577_. (4) +- **Debugger Server Port:** allows you to change the port used to communicate + with the debugger. Default value is _5577_. (4) -- **Enable USB Detection:** when disabled, prevents the serial monitor from listening to messages from the serial port. +- **Enable USB Detection:** when disabled, prevents the serial monitor from + listening to messages from the serial port. -- **Show Device Icon In Editor Title Menu:** allows you to choose whether the _`Deploy to Device`_ button should be in the editor title. +- **Show Device Icon In Editor Title Menu:** allows you to choose whether the + _`Deploy to Device`_ button should be in the editor title. -- **Show Open Icon In Editor Title Menu:** allows you to choose whether the _`Open Simulator`_ button should be in the editor title. +- **Show Open Icon In Editor Title Menu:** allows you to choose whether the + _`Open Simulator`_ button should be in the editor title. -- **Show Simulator Icon In Editor Title Menu:** allows you to choose whether the _`Run Simulator`_ button should be in the editor title. +- **Show Simulator Icon In Editor Title Menu:** allows you to choose whether + the _`Run Simulator`_ button should be in the editor title. -- **Show Dependency Install:** allows you to choose whether you want to be prompted to install the Python dependencies. +- **Show Dependency Install:** allows you to choose whether you want to be + prompted to install the Python dependencies. ## Troubleshooting Tips -- The first time you install the extension, you'll need to execute the `run` command at least once in order to access auto-completion. -- While running a code file, if you get an error saying it can't find the file, make sure you've clicked on a valid Python code file before running it. -- To open the output panel again after closing it go to VS Code menu : `View->Output`. -- For the Circuit Playground Express, if you try to deploy to the device while it's plugged in but you still get an error saying it cannot find the board, make sure your Circuit Playground Express is formatted correctly and that its name matches `CIRCUITPY`. -- If you can't get the Simulator communication working while debugging, try to open you `Settings` and check the port used under `'Device Simulator Express: Debugger Server Port'`. You can either change it (usually ports above 5000 could work) or try to free it, then start debugging again. +- The first time you install the extension, you'll need to execute the `run` + command at least once in order to access auto-completion. +- While running a code file, if you get an error saying it can't find the + file, make sure you've clicked on a valid Python code file before running + it. +- To open the output panel again after closing it go to VS Code menu : + `View->Output`. +- For the Circuit Playground Express, if you try to deploy to the device while + it's plugged in but you still get an error saying it cannot find the board, + make sure your Circuit Playground Express is formatted correctly and that + its name matches `CIRCUITPY`. +- If you can't get the Simulator communication working while debugging, try to + open you `Settings` and check the port used under + `'Device Simulator Express: Debugger Server Port'`. You can either change it + (usually ports above 5000 could work) or try to free it, then start + debugging again. ### Notes (1) Can be changed in settings. -(2) To use the Serial Monitor commands, you'll need to open a folder because this saves the configuration file for the serial communication. You can still use the rest of the extension without opening a folder. -(3) Sensors currently not supported by the official adafruit_circuit_playground.express library (v2.1.2). -(4) The regular communication is using the stdout and stdin of the Python process. But when you debug your code, it will communicate over sockets on port 5577. This is the default port that you can change in your `Settings` : `'Device Simulator Express: Debugger Server Port'`. +(2) To use the Serial Monitor commands, you'll need to open a folder because +this saves the configuration file for the serial communication. You can still +use the rest of the extension without opening a folder. +(3) Sensors currently not supported by the official +adafruit_circuit_playground.express library (v2.1.2). +(4) The regular communication is using the stdout and stdin of the Python +process. But when you debug your code, it will communicate over sockets on +port 5577. This is the default port that you can change in your `Settings` : +`'Device Simulator Express: Debugger Server Port'`. diff --git a/docs/install.md b/docs/install.md index 8a8421d6e..da5e79780 100644 --- a/docs/install.md +++ b/docs/install.md @@ -7,33 +7,48 @@ 2. Click on the latest release 3. At the bottom of the page download the .vsix file 4. To install the .vsix file : - - Go to the directory where the downloaded vsix file is and run in a command console: `code --install-extension ` - - Or in VS Code, go to the extension tab (a), in menu (b) select 'Install from VSIX' (c) and search the file you downloaded - ![VSIX Install Instructions](./vsix-install-instructions.png) + - Go to the directory where the downloaded vsix file is and run in a command + console: `code --install-extension ` + - Or in VS Code, go to the extension tab (a), in menu (b) select 'Install + from VSIX' (c) and search the file you downloaded + ![VSIX Install Instructions](./vsix-install-instructions.png) ## Prerequisites _Note: You need to install all the dependencies in order to use the extension._ -- [VS Code](https://code.visualstudio.com/Download) -- [Node](https://nodejs.org/en/download/) -- [Python 3.7.4](https://www.python.org/downloads/) - - **Warning :** Make sure you've included `python` (or `python3.7`) and `pip` to your `PATH` in your **environment variables**. - _(Note: the easiest way to do it might be when you install Python, you can select the "Add to PATH" option directly. Otherwise you can search how to insert it manually, but make sure that when you type `python` (or `python3.7`) in a terminal, the command is recognized.)_ -- [Python VS Code extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python) - - **Note:** This extension is installed automatically from the marketplace when you install our extension - -* Python Modules - - **Note:** On extension activation, you will be prompted with a popup asking if you want the modules to be automatically installed for you. The following python modules should be downloaded when you select "yes" on the prompt message. **If modules are not installed correctly, please use the "pip install" commands listed below.** - - pywin32 **(on Windows only)**: `pip install pywin32` - - On Windows, you need to use the above command in the console to manually install pywin32. - - *playsound*: `pip install playsound` - - *pytest*: `pip install pytest` - - *python-socketio*: `pip install python-socketio` - - *requests*: `pip install requests` - - *applicationinsights*: `pip install applicationinsights` - - *italics*: used in simulation mode only +- [VS Code](https://code.visualstudio.com/Download) +- [Node](https://nodejs.org/en/download/) +- [Python 3.7.4](https://www.python.org/downloads/) + - **Warning :** Make sure you've included `python` (or `python3.7`) and + `pip` to your `PATH` in your **environment variables**. + _(Note: the easiest way to do it might be when you install Python, you + can select the "Add to PATH" option directly. Otherwise you can search + how to insert it manually, but make sure that when you type `python` (or + `python3.7`) in a terminal, the command is recognized.)_ +- [Python VS Code extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python) + - **Note:** This extension is installed automatically from the marketplace + when you install our extension + +* Python Modules + + - **Note:** On extension activation, you will be prompted with a popup + asking if you want the modules to be automatically installed for you. + The following python modules should be downloaded when you select "yes" + on the prompt message. **If modules are not installed correctly, please + use the "pip install" commands listed below.** + + - pywin32 **(on Windows only)**: `pip install pywin32` + - On Windows, you need to use the above command in the console to + manually install pywin32. + - _playsound_: `pip install playsound` + - _pytest_: `pip install pytest` + - _python-socketio_: `pip install python-socketio` + - _requests_: `pip install requests` + - _applicationinsights_: `pip install applicationinsights` + + _italics_: used in simulation mode only + ## How to use the Extension -- [How to use the Extension](/docs/how-to-use.md) +- [How to use the Extension](/docs/how-to-use.md) diff --git a/docs/telemetry.md b/docs/telemetry.md index e9a22941e..5af450692 100644 --- a/docs/telemetry.md +++ b/docs/telemetry.md @@ -1,17 +1,21 @@ # Device Simulator Express Telemetry -The Device Simulator Express logs usage data and diagnostics telemetry through [Application Insights](https://azure.microsoft.com/en-us/services/monitor/). +The Device Simulator Express logs usage data and diagnostics telemetry through +[Application Insights](https://azure.microsoft.com/en-us/services/monitor/). ## Telemetry Gathered This extension collects basic diagnostics telemetry and usage data: -- **Diagnostics telemetry**: performance of extension commands and success / error rate -- **Usage telemetry**: user usage of extension commands and API calls +- **Diagnostics telemetry**: performance of extension commands and success / + error rate +- **Usage telemetry**: user usage of extension commands and API calls ## Usage Telemetry -Through the Application Insights API, telemetry events are collected on The Device Simulator Express extension usage. The follow table describes the Telemetry events we collect: +Through the Application Insights API, telemetry events are collected on The +Device Simulator Express extension usage. The follow table describes the +Telemetry events we collect: | **Property** | **Note** | | :--------------------: | --------------------------------------------------------------------------------------------- | diff --git a/misc/usbmapping.json b/misc/usbmapping.json index e3d9519a5..584bd236a 100644 --- a/misc/usbmapping.json +++ b/misc/usbmapping.json @@ -1,18 +1,15 @@ [ - { - "index_file": "https://adafruit.github.io/arduino-board-index/package_adafruit_index.json", - "boards": [ - { - "vid": "239a", - "pid": [ - "8019" - ], - "name": "Adafruit Circuit Playground Express", - "package": "adafruit", - "architecture": "samd", - "id": "cpx" - } - - ] - } -] \ No newline at end of file + { + "index_file": "https://adafruit.github.io/arduino-board-index/package_adafruit_index.json", + "boards": [ + { + "vid": "239a", + "pid": ["8019"], + "name": "Adafruit Circuit Playground Express", + "package": "adafruit", + "architecture": "samd", + "id": "cpx" + } + ] + } +] diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 83024d259..000000000 --- a/package-lock.json +++ /dev/null @@ -1,32342 +0,0 @@ -{ - "name": "__EXTENSIONNAME__", - "version": "0.0.0-UNTRACKEDVERSION", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/compat-data": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.5.tgz", - "integrity": "sha512-jWYUqQX/ObOhG1UiEkbH5SANsE/8oKXiQWjj7p7xgj9Zmnt//aUvyz4dBkK0HNsS8/cbyC5NmmH87VekW+mXFg==", - "dev": true, - "requires": { - "browserslist": "^4.8.5", - "invariant": "^2.2.4", - "semver": "^5.5.0" - } - }, - "@babel/core": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.3.tgz", - "integrity": "sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.0", - "@babel/helpers": "^7.4.3", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "convert-source-map": "^1.1.0", - "debug": "^4.1.0", - "json5": "^2.1.0", - "lodash": "^4.17.11", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", - "requires": { - "@babel/types": "^7.4.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", - "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", - "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-builder-react-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz", - "integrity": "sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "esutils": "^2.0.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-call-delegate": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz", - "integrity": "sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz", - "integrity": "sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.8.4", - "browserslist": "^4.8.5", - "invariant": "^2.2.4", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz", - "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz", - "integrity": "sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==", - "dev": true, - "requires": { - "@babel/helper-regex": "^7.8.3", - "regexpu-core": "^4.6.0" - }, - "dependencies": { - "regexpu-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", - "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.1.0", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" - } - }, - "regjsgen": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", - "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", - "dev": true - }, - "regjsparser": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.3.tgz", - "integrity": "sha512-8uZvYbnfAtEm9Ab8NTb3hdLwL4g/LQzEYP7Xs27T96abJCCE2d6r3cPZPQEsLKy0vRSGVNG+/zVGtLr86HQduA==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } - } - } - }, - "@babel/helper-define-map": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", - "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/types": "^7.8.3", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", - "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", - "dev": true, - "requires": { - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", - "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-module-imports": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", - "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-module-transforms": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz", - "integrity": "sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-simple-access": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==" - }, - "@babel/helper-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", - "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", - "dev": true, - "requires": { - "lodash": "^4.17.13" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", - "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-wrap-function": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-replace-supers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", - "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-simple-access": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", - "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@babel/helper-wrap-function": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", - "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helpers": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz", - "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", - "requires": { - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==" - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", - "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3", - "@babel/plugin-syntax-async-generators": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz", - "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-decorators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz", - "integrity": "sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-decorators": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", - "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", - "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", - "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - } - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz", - "integrity": "sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz", - "integrity": "sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - } - } - }, - "@babel/plugin-syntax-decorators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz", - "integrity": "sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-flow": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz", - "integrity": "sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz", - "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", - "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", - "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz", - "integrity": "sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - } - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", - "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", - "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", - "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", - "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-classes": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz", - "integrity": "sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-define-map": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", - "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz", - "integrity": "sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", - "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", - "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", - "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.8.3.tgz", - "integrity": "sha512-g/6WTWG/xbdd2exBBzMfygjX/zw4eyNC4X8pRaq7aRHRoDUCzAIu3kGYIXviOv8BjCuWm8vDBwjHcjiRNgXrPA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-flow": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz", - "integrity": "sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", - "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/plugin-transform-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", - "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", - "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz", - "integrity": "sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz", - "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-simple-access": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz", - "integrity": "sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.8.3", - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz", - "integrity": "sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", - "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", - "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", - "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz", - "integrity": "sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA==", - "dev": true, - "requires": { - "@babel/helper-call-delegate": "^7.8.3", - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", - "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-constant-elements": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.8.3.tgz", - "integrity": "sha512-glrzN2U+egwRfkNFtL34xIBYTxbbUF2qJTP8HD3qETBBqzAWSeNB821X0GjU06+dNpq/UyCIjI72FmGE5NNkQQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", - "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz", - "integrity": "sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g==", - "dev": true, - "requires": { - "@babel/helper-builder-react-jsx": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz", - "integrity": "sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz", - "integrity": "sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz", - "integrity": "sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA==", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.0" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", - "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz", - "integrity": "sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "resolve": "^1.8.1", - "semver": "^5.5.1" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", - "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", - "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", - "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-regex": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", - "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", - "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.3.tgz", - "integrity": "sha512-Ebj230AxcrKGZPKIp4g4TdQLrqX95TobLUWKd/CwG7X1XHUH1ZpkpFvXuXqWbtGRWb7uuEWNlrl681wsOArAdQ==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-typescript": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz", - "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==", - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - }, - "@babel/helper-replace-supers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", - "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", - "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/preset-env": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.4.tgz", - "integrity": "sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.8.4", - "@babel/helper-compilation-targets": "^7.8.4", - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-proposal-async-generator-functions": "^7.8.3", - "@babel/plugin-proposal-dynamic-import": "^7.8.3", - "@babel/plugin-proposal-json-strings": "^7.8.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.8.3", - "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", - "@babel/plugin-proposal-optional-chaining": "^7.8.3", - "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.8.3", - "@babel/plugin-transform-async-to-generator": "^7.8.3", - "@babel/plugin-transform-block-scoped-functions": "^7.8.3", - "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/plugin-transform-classes": "^7.8.3", - "@babel/plugin-transform-computed-properties": "^7.8.3", - "@babel/plugin-transform-destructuring": "^7.8.3", - "@babel/plugin-transform-dotall-regex": "^7.8.3", - "@babel/plugin-transform-duplicate-keys": "^7.8.3", - "@babel/plugin-transform-exponentiation-operator": "^7.8.3", - "@babel/plugin-transform-for-of": "^7.8.4", - "@babel/plugin-transform-function-name": "^7.8.3", - "@babel/plugin-transform-literals": "^7.8.3", - "@babel/plugin-transform-member-expression-literals": "^7.8.3", - "@babel/plugin-transform-modules-amd": "^7.8.3", - "@babel/plugin-transform-modules-commonjs": "^7.8.3", - "@babel/plugin-transform-modules-systemjs": "^7.8.3", - "@babel/plugin-transform-modules-umd": "^7.8.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", - "@babel/plugin-transform-new-target": "^7.8.3", - "@babel/plugin-transform-object-super": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.8.4", - "@babel/plugin-transform-property-literals": "^7.8.3", - "@babel/plugin-transform-regenerator": "^7.8.3", - "@babel/plugin-transform-reserved-words": "^7.8.3", - "@babel/plugin-transform-shorthand-properties": "^7.8.3", - "@babel/plugin-transform-spread": "^7.8.3", - "@babel/plugin-transform-sticky-regex": "^7.8.3", - "@babel/plugin-transform-template-literals": "^7.8.3", - "@babel/plugin-transform-typeof-symbol": "^7.8.4", - "@babel/plugin-transform-unicode-regex": "^7.8.3", - "@babel/types": "^7.8.3", - "browserslist": "^4.8.5", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/preset-react": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.8.3.tgz", - "integrity": "sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-transform-react-display-name": "^7.8.3", - "@babel/plugin-transform-react-jsx": "^7.8.3", - "@babel/plugin-transform-react-jsx-self": "^7.8.3", - "@babel/plugin-transform-react-jsx-source": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/preset-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.8.3.tgz", - "integrity": "sha512-qee5LgPGui9zQ0jR1TeU5/fP9L+ovoArklEqY12ek8P/wV5ZeM/VYSQYwICeoT6FfpJTekG9Ilay5PhwsOpMHA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-transform-typescript": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - } - } - }, - "@babel/runtime": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz", - "integrity": "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" - }, - "@cnakazawa/watch": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", - "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, - "@csstools/convert-colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", - "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", - "dev": true - }, - "@csstools/normalize.css": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", - "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==", - "dev": true - }, - "@fluentui/react-focus": { - "version": "7.1.13", - "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-7.1.13.tgz", - "integrity": "sha512-voY84/vRkcZGUHSwrPO6eEplc0EGKRGf06ov826NdzMq8s2BXoG2JMMdFNclFppQsCtcXOCPmfzwGHShJvGu5g==", - "requires": { - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/set-version": "^7.0.9", - "@uifabric/styling": "^7.11.2", - "@uifabric/utilities": "^7.15.5", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@formatjs/intl-relativetimeformat": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-2.8.0.tgz", - "integrity": "sha512-5T3m5hJSxXrbwtnFHyYBSbTjOXPXu+4NJ0MUu1LAf4fPEdd+pJZfWKuMJSWgFQPVMbLYq9NLvDWQda3hVe99sg==" - }, - "@gulp-sourcemaps/identity-map": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz", - "integrity": "sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==", - "dev": true, - "requires": { - "acorn": "^5.0.3", - "css": "^2.2.1", - "normalize-path": "^2.1.1", - "source-map": "^0.6.0", - "through2": "^2.0.3" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - } - } - }, - "@gulp-sourcemaps/map-sources": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", - "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", - "dev": true, - "requires": { - "normalize-path": "^2.0.1", - "through2": "^2.0.3" - } - }, - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", - "dev": true - }, - "@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", - "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", - "dev": true - }, - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "dev": true - }, - "@hapi/joi": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", - "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", - "dev": true, - "requires": { - "@hapi/address": "2.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/topo": "3.x.x" - } - }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", - "dev": true, - "requires": { - "@hapi/hoek": "^8.3.0" - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", - "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==" - }, - "@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", - "dev": true, - "requires": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@jest/core": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.1.0.tgz", - "integrity": "sha512-iz05+NmwCmZRzMXvMo6KFipW7nzhbpEawrKrkkdJzgytavPse0biEnCNr2wRlyCsp3SmKaEY+SGv7YWYQnIdig==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/reporters": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-changed-files": "^25.1.0", - "jest-config": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-resolve-dependencies": "^25.1.0", - "jest-runner": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "jest-watcher": "^25.1.0", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "realpath-native": "^1.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "requires": { - "type-fest": "^0.8.1" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "jest-watcher": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.1.0.tgz", - "integrity": "sha512-Q9eZ7pyaIr6xfU24OeTg4z1fUqBF/4MP6J801lyQfg7CsnZ/TCzAPvCfckKdL5dlBBEKBeHV0AdyjFZ5eWj4ig==", - "requires": { - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "string-length": "^3.1.0" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - } - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "@jest/environment": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.1.0.tgz", - "integrity": "sha512-cTpUtsjU4cum53VqBDlcW0E4KbQF03Cn0jckGPW/5rrE9tb+porD3+hhLtHAwhthsqfyF+bizyodTlsRA++sHg==", - "requires": { - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/fake-timers": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.1.0.tgz", - "integrity": "sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ==", - "requires": { - "@jest/types": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "lolex": "^5.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", - "requires": { - "@jest/types": "^25.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "@jest/fake-timers": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - } - } - }, - "@jest/reporters": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.1.0.tgz", - "integrity": "sha512-ORLT7hq2acJQa8N+NKfs68ZtHFnJPxsGqmofxW7v7urVhzJvpKZG9M7FAcgh9Ee1ZbCteMrirHA3m5JfBtAaDg==", - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.0", - "jest-haste-map": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", - "node-notifier": "^6.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^3.1.0", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^4.0.1" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "istanbul-lib-instrument": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz", - "integrity": "sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ==", - "requires": { - "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", - "source-map": "^0.6.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - } - } - }, - "@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", - "dev": true, - "requires": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - } - } - }, - "@jest/test-sequencer": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.1.0.tgz", - "integrity": "sha512-WgZLRgVr2b4l/7ED1J1RJQBOharxS11EFhmwDqknpknE0Pm87HLZVS2Asuuw+HQdfQvm2aXL2FvvBLxOD1D0iw==", - "requires": { - "@jest/test-result": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-runner": "^25.1.0", - "jest-runtime": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/transform": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.1.0.tgz", - "integrity": "sha512-4ktrQ2TPREVeM+KxB4zskAT84SnmG1vaz4S+51aTefyqn3zocZUnliLLm5Fsl85I3p/kFPN4CRp1RElIfXGegQ==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^25.1.0", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^3.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-util": "^25.1.0", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "istanbul-lib-instrument": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz", - "integrity": "sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ==", - "requires": { - "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "write-file-atomic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", - "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - } - } - }, - "@jest/types": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.1.0.tgz", - "integrity": "sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - }, - "dependencies": { - "@types/yargs": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.1.tgz", - "integrity": "sha512-sYlwNU7zYi6eZbMzFvG6eHD7VsEvFdoDtlD7eI1JTg7YNnuguzmiGsc6MPSq5l8n+h21AsNof0je+9sgOe4+dg==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@microsoft/load-themed-styles": { - "version": "1.10.43", - "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.43.tgz", - "integrity": "sha512-9RUeBMXPHbT/qHTRIQi9oQs3bw5JkQGBQ8ayjycq95q+1OUI9jBJPiJi2d8btpGdJWisVb3ZXxRsUx5u6f5dRA==" - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, - "@serialport/binding-abstract": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/binding-abstract/-/binding-abstract-8.0.6.tgz", - "integrity": "sha512-1swwUVoRyQ9ubxrkJ8JPppykohUpTAP4jkGr36e9NjbVocSPfqeX6tFZFwl/IdUlwJwxGdbKDqq7FvXniCQUMw==", - "requires": { - "debug": "^4.1.1" - } - }, - "@serialport/binding-mock": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/binding-mock/-/binding-mock-8.0.6.tgz", - "integrity": "sha512-BIbY5/PsDDo0QWDNCCxDgpowAdks+aZR8BOsEtK2GoASTTcJCy1fBwPIfH870o7rnbH901wY3C+yuTfdOvSO9A==", - "requires": { - "@serialport/binding-abstract": "^8.0.6", - "debug": "^4.1.1" - } - }, - "@serialport/bindings": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/@serialport/bindings/-/bindings-8.0.7.tgz", - "integrity": "sha512-IqudDL8ne2Y2S0W5fKA6wdgHCIA2e2OIaPVYhGy6duE6legNHFY+05CLicHAyAeTocXmHU7rVNxzVQrOG5tM4g==", - "requires": { - "@serialport/binding-abstract": "^8.0.6", - "@serialport/parser-readline": "^8.0.6", - "bindings": "^1.5.0", - "debug": "^4.1.1", - "nan": "^2.14.0", - "prebuild-install": "^5.3.0" - } - }, - "@serialport/parser-byte-length": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-byte-length/-/parser-byte-length-8.0.6.tgz", - "integrity": "sha512-92mrFxFEvq3gRvSM7ANK/jfbmHslz91a5oYJy/nbSn4H/MCRXjxR2YOkQgVXuN+zLt+iyDoW3pcOP4Sc1nWdqQ==" - }, - "@serialport/parser-cctalk": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-cctalk/-/parser-cctalk-8.0.6.tgz", - "integrity": "sha512-pqtCYQPgxnxHygiXUPCfgX7sEx+fdR/ObjpscidynEULUq2fFrC5kBkrxRbTfHRtTaU2ii9DyjFq0JVRCbhI0Q==" - }, - "@serialport/parser-delimiter": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-8.0.6.tgz", - "integrity": "sha512-ogKOcPisPMlVtirkuDu3SFTF0+xT0ijxoH7XjpZiYL41EVi367MwuCnEmXG+dEKKnF0j9EPqOyD2LGSJxaFmhQ==" - }, - "@serialport/parser-readline": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-8.0.6.tgz", - "integrity": "sha512-OYBT2mpczh9QUI3MTw8j0A0tIlPVjpVipvuVnjRkYwxrxPeq04RaLFhaDpuRzua5rTKMt89c1y3btYeoDXMjAA==", - "requires": { - "@serialport/parser-delimiter": "^8.0.6" - } - }, - "@serialport/parser-ready": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-ready/-/parser-ready-8.0.6.tgz", - "integrity": "sha512-xcEqv4rc119WR5JzAuu8UeJOlAwET2PTdNb6aIrrLlmTxhvuBbuRFcsnF3BpH9jUL30Kh7a6QiNXIwVG+WR/1Q==" - }, - "@serialport/parser-regex": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-regex/-/parser-regex-8.0.6.tgz", - "integrity": "sha512-J8KY75Azz5ZyExmyM5YfUxbXOWBkZCytKgCCmZ966ttwZS0bUZOuoCaZj2Zp4VILJAiLuxHoqc0foi67Fri5+g==" - }, - "@serialport/stream": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-8.0.6.tgz", - "integrity": "sha512-ym1PwM0rwLrj90vRBB66I1hwMXbuMw9wGTxqns75U3N/tuNFOH85mxXaYVF2TpI66aM849NoI1jMm50fl9equg==", - "requires": { - "debug": "^4.1.1" - } - }, - "@sheerun/mutationobserver-shim": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz", - "integrity": "sha512-vTCdPp/T/Q3oSqwHmZ5Kpa9oI7iLtGl3RQaA/NyLHikvcrPxACkkKVr/XzkSPJWXHRhKGzVvb0urJsbMlRxi1Q==" - }, - "@sinonjs/commons": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.0.tgz", - "integrity": "sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg==", - "requires": { - "type-detect": "4.0.8" - } - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==", - "dev": true - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==", - "dev": true - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", - "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==", - "dev": true - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", - "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==", - "dev": true - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz", - "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==", - "dev": true - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", - "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==", - "dev": true - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", - "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==", - "dev": true - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", - "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==", - "dev": true - }, - "@svgr/babel-preset": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz", - "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", - "dev": true, - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", - "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3", - "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", - "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", - "@svgr/babel-plugin-transform-svg-component": "^4.2.0" - } - }, - "@svgr/core": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz", - "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", - "dev": true, - "requires": { - "@svgr/plugin-jsx": "^4.3.3", - "camelcase": "^5.3.1", - "cosmiconfig": "^5.2.1" - } - }, - "@svgr/hast-util-to-babel-ast": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", - "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@svgr/plugin-jsx": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz", - "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", - "dev": true, - "requires": { - "@babel/core": "^7.4.5", - "@svgr/babel-preset": "^4.3.3", - "@svgr/hast-util-to-babel-ast": "^4.3.2", - "svg-parser": "^2.0.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@svgr/plugin-svgo": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", - "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", - "dev": true, - "requires": { - "cosmiconfig": "^5.2.1", - "merge-deep": "^3.0.2", - "svgo": "^1.2.2" - } - }, - "@svgr/webpack": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz", - "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==", - "dev": true, - "requires": { - "@babel/core": "^7.4.5", - "@babel/plugin-transform-react-constant-elements": "^7.0.0", - "@babel/preset-env": "^7.4.5", - "@babel/preset-react": "^7.0.0", - "@svgr/core": "^4.3.3", - "@svgr/plugin-jsx": "^4.3.3", - "@svgr/plugin-svgo": "^4.3.1", - "loader-utils": "^1.2.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@testing-library/dom": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-6.11.0.tgz", - "integrity": "sha512-Pkx9LMIGshyNbfmecjt18rrAp/ayMqGH674jYER0SXj0iG9xZc+zWRjk2Pg9JgPBDvwI//xGrI/oOQkAi4YEew==", - "requires": { - "@babel/runtime": "^7.6.2", - "@sheerun/mutationobserver-shim": "^0.3.2", - "@types/testing-library__dom": "^6.0.0", - "aria-query": "3.0.0", - "pretty-format": "^24.9.0", - "wait-for-expect": "^3.0.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "requires": { - "regenerator-runtime": "^0.13.2" - } - } - } - }, - "@testing-library/jest-dom": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.0.2.tgz", - "integrity": "sha512-Pl3si4eH88+5wlVz6NjecLfeO7PjTbbgWKwVZXUtBfrGuJLjGdUUo+O92XRu/59wft8HAmwvXHeMWpqWTg2Uwg==", - "requires": { - "@babel/runtime": "^7.5.1", - "@types/testing-library__jest-dom": "^5.0.0", - "chalk": "^2.4.1", - "css": "^2.2.3", - "css.escape": "^1.5.1", - "jest-diff": "^24.0.0", - "jest-matcher-utils": "^24.0.0", - "lodash": "^4.17.11", - "pretty-format": "^24.0.0", - "redent": "^3.0.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@testing-library/react": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-9.4.0.tgz", - "integrity": "sha512-XdhDWkI4GktUPsz0AYyeQ8M9qS/JFie06kcSnUVcpgOwFjAu9vhwR83qBl+lw9yZWkbECjL8Hd+n5hH6C0oWqg==", - "requires": { - "@babel/runtime": "^7.7.6", - "@testing-library/dom": "^6.11.0", - "@types/testing-library__react": "^9.1.2" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "requires": { - "regenerator-runtime": "^0.13.2" - } - } - } - }, - "@types/babel__core": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", - "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.8.tgz", - "integrity": "sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw==", - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" - }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true - }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", - "dev": true, - "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", - "requires": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, - "@types/invariant": { - "version": "2.2.30", - "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.30.tgz", - "integrity": "sha512-98fB+yo7imSD2F7PF7GIpELNgtLNgo5wjivu0W5V4jx+KVVJxo6p/qN4zdzSTBWy4/sN3pPyXwnhRSD28QX+ag==" - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==" - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-dXvuABY9nM1xgsXlOtLQXJKdacxZJd7AtvLsKZ/0b57ruMXDKCOXAC/M75GbllQX6o1pcZ5hAG4JzYy7Z/wM2w==", - "requires": { - "jest-diff": "^24.3.0" - } - }, - "@types/json-schema": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", - "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/node": { - "version": "10.14.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.7.tgz", - "integrity": "sha512-on4MmIDgHXiuJDELPk1NFaKVUxxCFr37tm8E9yN6rAiF5Pzp/9bBfBHkoexqRiY+hk/Z04EJU9kKEb59YqJ82A==" - }, - "@types/open": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/open/-/open-6.1.0.tgz", - "integrity": "sha512-sdB0OltczakZfdn5DYg3ZbHoQeYtU8Vbo4dys0U98gikn++M4gGDI02dzEWXPMP5uXGSjGx9GnK/yLlJMfGjlg==", - "requires": { - "@types/node": "*" - } - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" - }, - "@types/q": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", - "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", - "dev": true - }, - "@types/react": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.8.6.tgz", - "integrity": "sha512-bN9qDjEMltmHrl0PZRI4IF2AbB7V5UlRfG+OOduckVnRQ4VzXVSzy/1eLAh778IEqhTnW0mmgL9yShfinNverA==", - "requires": { - "@types/prop-types": "*", - "csstype": "^2.2.0" - } - }, - "@types/react-dom": { - "version": "16.8.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.8.4.tgz", - "integrity": "sha512-eIRpEW73DCzPIMaNBDP5pPIpK1KXyZwNgfxiVagb5iGiz6da+9A5hslSX6GAQKdO7SayVCS/Fr2kjqprgAvkfA==", - "requires": { - "@types/react": "*" - } - }, - "@types/react-test-renderer": { - "version": "16.9.2", - "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-16.9.2.tgz", - "integrity": "sha512-4eJr1JFLIAlWhzDkBCkhrOIWOvOxcCAfQh+jiKg7l/nNZcCIL2MHl2dZhogIFKyHzedVWHaVP1Yydq/Ruu4agw==", - "requires": { - "@types/react": "*" - } - }, - "@types/socket.io": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/socket.io/-/socket.io-2.1.2.tgz", - "integrity": "sha512-Ind+4qMNfQ62llyB4IMs1D8znMEBsMKohZBPqfBUIXqLQ9bdtWIbNTBWwtdcBWJKnokMZGcmWOOKslatni5vtA==", - "requires": { - "@types/node": "*" - } - }, - "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" - }, - "@types/testing-library__dom": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/@types/testing-library__dom/-/testing-library__dom-6.11.1.tgz", - "integrity": "sha512-ImChHtQqmjwraRLqBC2sgSQFtczeFvBmBcfhTYZn/3KwXbyD07LQykEQ0xJo7QHc1GbVvf7pRyGaIe6PkCdxEw==", - "requires": { - "pretty-format": "^24.3.0" - } - }, - "@types/testing-library__jest-dom": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.0.0.tgz", - "integrity": "sha512-Pm+2mvqs9sND247oMVJbu3QmPUqMzBuJbY5uHHYQdl9MXq5hwWkTbesw1sPIky52Y0sHksWAZnVvGLbdyFSyrA==", - "requires": { - "@types/jest": "*" - } - }, - "@types/testing-library__react": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@types/testing-library__react/-/testing-library__react-9.1.2.tgz", - "integrity": "sha512-CYaMqrswQ+cJACy268jsLAw355DZtPZGt3Jwmmotlcu8O/tkoXBI6AeZ84oZBJsIsesozPKzWzmv/0TIU+1E9Q==", - "requires": { - "@types/react-dom": "*", - "@types/testing-library__dom": "*" - } - }, - "@types/vscode": { - "version": "1.45.1", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.45.1.tgz", - "integrity": "sha512-0NO9qrrEJBO8FsqHCrFMgR2suKnwCsKBWvRSb2OzH5gs4i3QO5AhEMQYrSzDbU/wLPt7N617/rN9lPY213gmwg==", - "dev": true - }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" - }, - "@typescript-eslint/eslint-plugin": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.20.0.tgz", - "integrity": "sha512-cimIdVDV3MakiGJqMXw51Xci6oEDEoPkvh8ggJe2IIzcc0fYqAxOXN6Vbeanahz6dLZq64W+40iUEc9g32FLDQ==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "2.20.0", - "eslint-utils": "^1.4.3", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.20.0.tgz", - "integrity": "sha512-fEBy9xYrwG9hfBLFEwGW2lKwDRTmYzH3DwTmYbT+SMycmxAoPl0eGretnBFj/s+NfYBG63w/5c3lsvqqz5mYag==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.20.0", - "eslint-scope": "^5.0.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - } - } - }, - "@typescript-eslint/parser": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.20.0.tgz", - "integrity": "sha512-o8qsKaosLh2qhMZiHNtaHKTHyCHc3Triq6aMnwnWj7budm3xAY9owSZzV1uon5T9cWmJRJGzTFa90aex4m77Lw==", - "dev": true, - "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.20.0", - "@typescript-eslint/typescript-estree": "2.20.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.20.0.tgz", - "integrity": "sha512-WlFk8QtI8pPaE7JGQGxU7nGcnk1ccKAJkhbVookv94ZcAef3m6oCE/jEDL6dGte3JcD7reKrA0o55XhBRiVT3A==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^6.3.0", - "tsutils": "^3.17.1" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@uifabric/foundation": { - "version": "7.5.25", - "resolved": "https://registry.npmjs.org/@uifabric/foundation/-/foundation-7.5.25.tgz", - "integrity": "sha512-5PcqVMjXG1or7GrZHCWQ1SRNcCUV6lPm7OoAi1AKtVrSEi69g56VjJCJ7sqc/Q587ehDN6LqK9RhLc2IhQVO+Q==", - "requires": { - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/set-version": "^7.0.9", - "@uifabric/styling": "^7.11.2", - "@uifabric/utilities": "^7.15.5", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/icons": { - "version": "7.3.24", - "resolved": "https://registry.npmjs.org/@uifabric/icons/-/icons-7.3.24.tgz", - "integrity": "sha512-0CkTEgY8xwvNs+zUQcvWKLnuYxudjJfPI016385bqizE9dkCMyAfXer/7sgyrp6FjxNUrHGyQUKvdVoT3zSNYA==", - "requires": { - "@uifabric/set-version": "^7.0.9", - "@uifabric/styling": "^7.11.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/merge-styles": { - "version": "7.8.11", - "resolved": "https://registry.npmjs.org/@uifabric/merge-styles/-/merge-styles-7.8.11.tgz", - "integrity": "sha512-U1gYewj/j6ZGBSXD84Ekp+En4N5hH79TsK9hWJq2wKJKK3h0MKmY50WyFKWIL2/kS+wM7zIR6irK0xY+mfjB2g==", - "requires": { - "@uifabric/set-version": "^7.0.9", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/react-hooks": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@uifabric/react-hooks/-/react-hooks-7.1.2.tgz", - "integrity": "sha512-gFsjCeh+g0rZYSx13WIJcA2HLxNKiY4RQsxLuOq1cMsBgiUGix8ofMPd3S5ys+qfVdl+XwoqlV/25PgvIRrpUA==", - "requires": { - "@uifabric/set-version": "^7.0.9", - "@uifabric/utilities": "^7.15.5", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/set-version": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@uifabric/set-version/-/set-version-7.0.9.tgz", - "integrity": "sha512-YJL6WLBlFKDJcLSw1ihqW5PTFi2XMoluEvwGd2qtzp2IVbHvdbk7uIdWuTALo3dFNNqWPN8shSNUdHVATE/1jQ==", - "requires": { - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/styling": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-7.11.2.tgz", - "integrity": "sha512-0so6oM6d0WOogDiOxT5bbfOrkGEvhrmRukSrgr1mY/3tkQ3gue/XW4yus0fNi7H9R8wZa2rIPQaUcZBW3Hrc0g==", - "requires": { - "@microsoft/load-themed-styles": "^1.10.26", - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/set-version": "^7.0.9", - "@uifabric/utilities": "^7.15.5", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/utilities": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-7.15.5.tgz", - "integrity": "sha512-cjnhT7tTvHNXt0rvuajk5s/RQtSWFh2JfRhbmS7dTGfg3vNieoHg2EiNt+ulzKXxtdkFriXoFHRSNkTuV4/L9w==", - "requires": { - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/set-version": "^7.0.9", - "prop-types": "^15.7.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==" - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" - }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", - "dev": true - }, - "acorn-globals": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", - "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" - } - } - }, - "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", - "dev": true - }, - "acorn-walk": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", - "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==" - }, - "address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", - "dev": true - }, - "adjust-sourcemap-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", - "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", - "dev": true, - "requires": { - "assert": "1.4.1", - "camelcase": "5.0.0", - "loader-utils": "1.2.3", - "object-path": "0.11.4", - "regex-parser": "2.2.10" - }, - "dependencies": { - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - } - }, - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", - "dev": true - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "dev": true, - "requires": { - "buffer-equal": "^1.0.0" - } - }, - "applicationinsights": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-1.0.8.tgz", - "integrity": "sha512-KzOOGdphOS/lXWMFZe5440LUdFbrLpMvh2SaRxn7BmiI550KAoSb2gIhiq6kJZ9Ir3AxRRztjhzif+e5P5IXIg==", - "requires": { - "diagnostic-channel": "0.2.0", - "diagnostic-channel-publishers": "0.2.1", - "zone.js": "0.7.6" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", - "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - } - }, - "arity-n": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", - "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" - }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "dev": true, - "requires": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", - "dev": true, - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", - "dev": true - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", - "dev": true - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", - "dev": true, - "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", - "dev": true - }, - "async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "dev": true, - "requires": { - "async-done": "^1.2.2" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "autoprefixer": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz", - "integrity": "sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==", - "dev": true, - "requires": { - "browserslist": "^4.8.3", - "caniuse-lite": "^1.0.30001020", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.26", - "postcss-value-parser": "^4.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-value-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", - "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" - }, - "axobject-query": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz", - "integrity": "sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ==", - "dev": true - }, - "azure-devops-node-api": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-7.2.0.tgz", - "integrity": "sha512-pMfGJ6gAQ7LRKTHgiRF+8iaUUeGAI0c8puLaqHLc7B8AR7W6GJLozK9RFeUHFjEGybC9/EB3r67WPd7e46zQ8w==", - "dev": true, - "requires": { - "os": "0.1.1", - "tunnel": "0.0.4", - "typed-rest-client": "1.2.0", - "underscore": "1.8.3" - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - } - } - }, - "babel-eslint": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", - "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "babel-extract-comments": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", - "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", - "dev": true, - "requires": { - "babylon": "^6.18.0" - } - }, - "babel-jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.1.0.tgz", - "integrity": "sha512-tz0VxUhhOE2y+g8R2oFrO/2VtVjA1lkJeavlhExuRBg3LdNJY9gwQ+Vcvqt9+cqy71MCTJhewvTB7Qtnnr9SWg==", - "requires": { - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^25.1.0", - "chalk": "^3.0.0", - "slash": "^3.0.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@jest/transform": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.1.0.tgz", - "integrity": "sha512-4ktrQ2TPREVeM+KxB4zskAT84SnmG1vaz4S+51aTefyqn3zocZUnliLLm5Fsl85I3p/kFPN4CRp1RElIfXGegQ==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^25.1.0", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^3.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-util": "^25.1.0", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": true - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "istanbul-lib-instrument": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz", - "integrity": "sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ==", - "requires": { - "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "jest-haste-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.1.0.tgz", - "integrity": "sha512-/2oYINIdnQZAqyWSn1GTku571aAfs8NxzSErGek65Iu5o8JYb+113bZysRMcC/pjE5v9w0Yz+ldbj9NxrFyPyw==", - "requires": { - "@jest/types": "^25.1.0", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.3", - "jest-serializer": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-regex-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.1.0.tgz", - "integrity": "sha512-9lShaDmDpqwg+xAd73zHydKrBbbrIi08Kk9YryBEBybQFg/lBWR/2BDjjiSE7KIppM9C5+c03XiDaZ+m4Pgs1w==" - }, - "jest-serializer": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.1.0.tgz", - "integrity": "sha512-20Wkq5j7o84kssBwvyuJ7Xhn7hdPeTXndnwIblKDR2/sy1SUm6rWWiG9kSCgJPIfkDScJCIsTtOKdlzfIHOfKA==" - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "write-file-atomic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", - "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - } - } - }, - "babel-loader": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", - "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", - "dev": true, - "requires": { - "find-cache-dir": "^2.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1", - "pify": "^4.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", - "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-istanbul": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.3.0", - "test-exclude": "^5.2.3" - } - }, - "babel-plugin-jest-hoist": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.1.0.tgz", - "integrity": "sha512-oIsopO41vW4YFZ9yNYoLQATnnN46lp+MZ6H4VvPKFkcc2/fkl3CfE/NZZSmnEIEsJRmJAgkVEK0R7Zbl50CpTw==", - "requires": { - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "babel-plugin-named-asset-import": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz", - "integrity": "sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA==", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" - } - }, - "babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", - "dev": true - }, - "babel-preset-jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.1.0.tgz", - "integrity": "sha512-eCGn64olaqwUMaugXsTtGAM2I0QTahjEtnRu0ql8Ie+gDWAc1N6wqN0k2NilnyTunM69Pad7gJY7LOtwLimoFQ==", - "requires": { - "@babel/plugin-syntax-bigint": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^25.1.0" - } - }, - "babel-preset-react-app": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.1.1.tgz", - "integrity": "sha512-YkWP2UwY//TLltNlEBRngDOrYhvSLb+CA330G7T9M5UhGEMWe+JK/8IXJc5p2fDTSfSiETf+PY0+PYXFMix81Q==", - "dev": true, - "requires": { - "@babel/core": "7.8.4", - "@babel/plugin-proposal-class-properties": "7.8.3", - "@babel/plugin-proposal-decorators": "7.8.3", - "@babel/plugin-proposal-numeric-separator": "7.8.3", - "@babel/plugin-transform-flow-strip-types": "7.8.3", - "@babel/plugin-transform-react-display-name": "7.8.3", - "@babel/plugin-transform-runtime": "7.8.3", - "@babel/preset-env": "7.8.4", - "@babel/preset-react": "7.8.3", - "@babel/preset-typescript": "7.8.3", - "@babel/runtime": "7.8.4", - "babel-plugin-macros": "2.8.0", - "babel-plugin-transform-react-remove-prop-types": "0.4.24" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", - "dev": true, - "requires": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" - } - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bl": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", - "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" - }, - "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==" - }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" - } - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.8.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.7.tgz", - "integrity": "sha512-gFOnZNYBHrEyUML0xr5NJ6edFaaKbTFX9S9kQHlYfCP0Rit/boRIz4G+Avq6/4haEKJXdGGUnoolx+5MWW2BoA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001027", - "electron-to-chromium": "^1.3.349", - "node-releases": "^1.1.49" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", - "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "cacache": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", - "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", - "dev": true, - "requires": { - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "minipass": "^3.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^7.0.0", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camel-case": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", - "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", - "dev": true, - "requires": { - "pascal-case": "^3.1.1", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001028", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001028.tgz", - "integrity": "sha512-Vnrq+XMSHpT7E+LWoIYhs3Sne8h9lx9YJV3acH3THNCwU/9zV93/ta4xVfzTtnqd3rvnuVpVjE3DFqf56tr3aQ==", - "dev": true - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "requires": { - "rsvp": "^4.8.4" - } - }, - "case-sensitive-paths-webpack-plugin": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", - "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "cheerio": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", - "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", - "dev": true, - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.1", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - }, - "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, - "requires": { - "@types/node": "*" - } - } - } - }, - "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - } - } - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-deep": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", - "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", - "dev": true, - "requires": { - "for-own": "^0.1.3", - "is-plain-object": "^2.0.1", - "kind-of": "^3.0.2", - "lazy-cache": "^1.0.3", - "shallow-clone": "^0.1.2" - } - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "collect-v8-coverage": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.0.tgz", - "integrity": "sha512-VKIhJgvk8E1W28m5avZ2Gv2Ruv5YiF56ug2oclvaG9md69BuZImMG2sk9g7QNKLUbtYAKQjXjYxbYZVUlMMKmQ==" - }, - "collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "dev": true, - "requires": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", - "dev": true, - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "compare-versions": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.5.1.tgz", - "integrity": "sha512-9fGPIB7C6AyM18CJJBHt5EnCZDG3oiTJYy0NjfIAGjKpzv0tkxWko7TNQHF5ymqm7IH03tqmeuBxtvD+Izh6mg==" - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" - }, - "compose-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", - "dev": true, - "requires": { - "arity-n": "^1.0.4" - } - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - }, - "dependencies": { - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", - "dev": true - } - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "confusing-browser-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", - "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", - "dev": true - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", - "dev": true, - "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" - } - }, - "core-js": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", - "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", - "dev": true - }, - "core-js-compat": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", - "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", - "dev": true, - "requires": { - "browserslist": "^4.8.3", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - } - }, - "css-blank-pseudo": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", - "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "dev": true, - "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-has-pseudo": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", - "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^5.0.0-rc.4" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-loader": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", - "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash": "^4.17.11", - "postcss": "^6.0.23", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - } - }, - "css-modules-loader-core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz", - "integrity": "sha1-WQhmgpShvs0mGuCkziGwtVHyHRY=", - "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.1", - "postcss-modules-extract-imports": "1.1.0", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz", - "integrity": "sha1-AA29H47vIXqjaLmiEsX8QLKo8/I=", - "requires": { - "chalk": "^1.1.3", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-modules-extract-imports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", - "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", - "requires": { - "postcss": "^6.0.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "css-prefers-color-scheme": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", - "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - }, - "dependencies": { - "css-what": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", - "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", - "dev": true - } - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "css-selector-tokenizer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", - "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", - "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" - } - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dev": true, - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "dev": true - }, - "css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" - }, - "cssdb": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", - "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==", - "dev": true - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" - }, - "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", - "dev": true, - "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", - "postcss-unique-selectors": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "dev": true - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "dev": true - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", - "dev": true - }, - "csso": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", - "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", - "dev": true, - "requires": { - "css-tree": "1.0.0-alpha.37" - } - }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", - "dev": true, - "requires": { - "cssom": "0.3.x" - } - }, - "csstype": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.8.tgz", - "integrity": "sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA==" - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - }, - "dependencies": { - "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "debug-fabulous": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz", - "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==", - "dev": true, - "requires": { - "debug": "3.X", - "memoizee": "0.4.X", - "object-assign": "4.X" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "requires": { - "mimic-response": "^2.0.0" - } - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", - "dev": true, - "requires": { - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - } - }, - "default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" - }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true - }, - "detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "dev": true, - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "diagnostic-channel": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz", - "integrity": "sha1-zJmvlhLCP7H/8TYSxy8sv6qNWhc=", - "requires": { - "semver": "^5.3.0" - } - }, - "diagnostic-channel-publishers": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.2.1.tgz", - "integrity": "sha1-ji1geottef6IC1SLxYzGvrKIxPM=" - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "diff-sequences": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==" - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "requires": { - "webidl-conversions": "^4.0.2" - } - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz", - "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==", - "dev": true, - "requires": { - "no-case": "^3.0.3", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", - "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "dev": true - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.355", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.355.tgz", - "integrity": "sha512-zKO/wS+2ChI/jz9WAo647xSW8t2RmgRLFdbUb/77cORkUTargO+SCj4ctTHjBn2VeNFrsLgDT7IuDVrd3F8mLQ==", - "dev": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "requires": { - "once": "^1.4.0" - } - }, - "engine.io": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", - "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", - "requires": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "~7.4.2" - }, - "dependencies": { - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" - }, - "ws": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", - "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==" - } - } - }, - "engine.io-client": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.1.tgz", - "integrity": "sha512-oVu9kBkGbcggulyVF0kz6BV3ganqUeqXvD79WOFKa+11oK692w1NyFkuEj4xrkFRpZhn92QOqTk4RQq5LiBXbQ==", - "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "ws": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", - "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==" - } - } - }, - "engine.io-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", - "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.4", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", - "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.50", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz", - "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "^1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escodegen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", - "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", - "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" - } - } - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "eslint-config-react-app": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.0.tgz", - "integrity": "sha512-WrHjoGpKr1kLLiWDD81tme9jMM0hk5cMxasLSdyno6DdPt+IfLOrDJBVo6jN7tn4y1nzhs43TmUaZWO6Sf0blw==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.9" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", - "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-loader": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.3.tgz", - "integrity": "sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw==", - "dev": true, - "requires": { - "fs-extra": "^8.1.0", - "loader-fs-cache": "^1.0.2", - "loader-utils": "^1.2.3", - "object-hash": "^2.0.1", - "schema-utils": "^2.6.1" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz", - "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - } - } - }, - "eslint-plugin-flowtype": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz", - "integrity": "sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "eslint-plugin-import": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.0.tgz", - "integrity": "sha512-NK42oA0mUc8Ngn4kONOPsPB1XhbUvNHqF+g307dPV28aknPoiNnKLFd9em4nkswwepdF5ouieqv5Th/63U7YJQ==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.1", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.0", - "read-pkg-up": "^2.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", - "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.4.5", - "aria-query": "^3.0.0", - "array-includes": "^3.0.3", - "ast-types-flow": "^0.0.7", - "axobject-query": "^2.0.2", - "damerau-levenshtein": "^1.0.4", - "emoji-regex": "^7.0.2", - "has": "^1.0.3", - "jsx-ast-utils": "^2.2.1" - } - }, - "eslint-plugin-react": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.18.0.tgz", - "integrity": "sha512-p+PGoGeV4SaZRDsXqdj9OWcOrOpZn8gXoGPcIQTzo2IDMbAKhNDnME9myZWqO3Ic4R3YmwAZ1lDjWl2R2hMUVQ==", - "dev": true, - "requires": { - "array-includes": "^3.1.1", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.2.3", - "object.entries": "^1.1.1", - "object.fromentries": "^2.0.2", - "object.values": "^1.1.1", - "prop-types": "^15.7.2", - "resolve": "^1.14.2" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "object.entries": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", - "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-plugin-react-hooks": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", - "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==", - "dev": true - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - }, - "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", - "dev": true, - "requires": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", - "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "event-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", - "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "from": "^0.1.7", - "map-stream": "0.0.7", - "pause-stream": "^0.0.11", - "split": "^1.0.1", - "stream-combiner": "^0.2.2", - "through": "^2.3.8" - } - }, - "eventemitter2": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", - "integrity": "sha1-YZegldX7a1folC9v1+qtY6CclFI=" - }, - "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", - "dev": true - }, - "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", - "dev": true - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "exec-sh": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", - "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==" - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "expect": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.1.0.tgz", - "integrity": "sha512-wqHzuoapQkhc3OKPlrpetsfueuEiMf3iWh0R8+duCu9PIjXoP7HgD5aeypwTnXUAjC8aMsiVDaWwlbJ1RlQ38g==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-styles": "^4.0.0", - "jest-get-type": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-regex-util": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "diff-sequences": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", - "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-diff": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", - "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-matcher-utils": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", - "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", - "requires": { - "chalk": "^3.0.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fb-watchman": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", - "requires": { - "bser": "^2.0.0" - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "file-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", - "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.5.0" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "filesize": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz", - "integrity": "sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg==", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, - "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "dev": true, - "requires": { - "is-buffer": "~2.0.3" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", - "dev": true - }, - "flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", - "dev": true - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", - "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", - "dev": true, - "requires": { - "debug": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "fork-ts-checker-webpack-plugin": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz", - "integrity": "sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ==", - "dev": true, - "requires": { - "babel-code-frame": "^6.22.0", - "chalk": "^2.4.1", - "chokidar": "^3.3.0", - "micromatch": "^3.1.10", - "minimatch": "^3.0.4", - "semver": "^5.6.0", - "tapable": "^1.0.0", - "worker-rpc": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", - "dev": true, - "requires": { - "picomatch": "^2.0.7" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - } - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": false, - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": false, - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": false, - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "debug": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": false, - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": false, - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "resolved": false, - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": false, - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": false, - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": false, - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": false, - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": false, - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": false, - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.3.5", - "resolved": false, - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "resolved": false, - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": false, - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.0", - "resolved": false, - "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", - "dev": true, - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "resolved": false, - "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": false, - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "resolved": false, - "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": false, - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": false, - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": false, - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": false, - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": false, - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": false, - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": false, - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": false, - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": false, - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.0", - "resolved": false, - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": false, - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "resolved": false, - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": false, - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.0.3", - "resolved": false, - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true, - "optional": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "generic-names": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-1.0.3.tgz", - "integrity": "sha1-LXhqEhruUIh2eWk56OO/+DbCCRc=", - "requires": { - "loader-utils": "^0.2.16" - }, - "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - } - } - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "git-rev-sync": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/git-rev-sync/-/git-rev-sync-1.12.0.tgz", - "integrity": "sha1-RGhAbH5sO6TPRYeZnhrbKNnRr1U=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "graceful-fs": "4.1.11", - "shelljs": "0.7.7" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - } - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "glob-watcher": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", - "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "object.defaults": "^1.1.0" - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - }, - "dependencies": { - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - } - } - }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" - }, - "gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", - "dev": true, - "requires": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" - } - }, - "gulp-cli": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", - "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.1.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.0.1", - "yargs": "^7.1.0" - }, - "dependencies": { - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", - "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "object.assign": "^4.1.0" - } - } - } - }, - "gulp-filter": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz", - "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=", - "dev": true, - "requires": { - "multimatch": "^2.0.0", - "plugin-error": "^0.1.2", - "streamfilter": "^1.0.5" - } - }, - "gulp-sourcemaps": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz", - "integrity": "sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg==", - "dev": true, - "requires": { - "@gulp-sourcemaps/identity-map": "1.X", - "@gulp-sourcemaps/map-sources": "1.X", - "acorn": "5.X", - "convert-source-map": "1.X", - "css": "2.X", - "debug-fabulous": "1.X", - "detect-newline": "2.X", - "graceful-fs": "4.X", - "source-map": "~0.6.0", - "strip-bom-string": "1.X", - "through2": "2.X" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - } - } - }, - "gulp-typescript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-5.0.1.tgz", - "integrity": "sha512-YuMMlylyJtUSHG1/wuSVTrZp60k1dMEFKYOvDf7OvbAJWrDtxxD4oZon4ancdWwzjj30ztiidhe4VXJniF0pIQ==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.5", - "plugin-error": "^1.0.1", - "source-map": "^0.7.3", - "through2": "^3.0.0", - "vinyl": "^2.1.0", - "vinyl-fs": "^3.0.3" - }, - "dependencies": { - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - }, - "dependencies": { - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - } - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", - "dev": true, - "requires": { - "readable-stream": "2 || 3" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - } - }, - "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "handle-thing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "harmony-reflect": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", - "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", - "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", - "requires": { - "react-is": "^16.7.0" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "requires": { - "whatwg-encoding": "^1.0.1" - } - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true - }, - "html-escaper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", - "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==" - }, - "html-minifier-terser": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.0.4.tgz", - "integrity": "sha512-fHwmKQ+GzhlqdxEtwrqLT7MSuheiA+rif5/dZgbz3GjoMXJzcRzy1L9NXoiiyxrnap+q5guSiv8Tz5lrh9g42g==", - "dev": true, - "requires": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", - "he": "^1.2.0", - "param-case": "^3.0.3", - "relateurl": "^0.2.7", - "terser": "^4.6.3" - }, - "dependencies": { - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - } - } - }, - "html-webpack-plugin": { - "version": "4.0.0-beta.11", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz", - "integrity": "sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg==", - "dev": true, - "requires": { - "html-minifier-terser": "^5.0.1", - "loader-utils": "^1.2.3", - "lodash": "^4.17.15", - "pretty-error": "^2.1.1", - "tapable": "^1.1.3", - "util.promisify": "1.0.0" - } - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "dev": true, - "requires": { - "agent-base": "4", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "dev": true, - "requires": { - "postcss": "^6.0.1" - } - }, - "identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", - "dev": true, - "requires": { - "harmony-reflect": "^1.4.6" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true - }, - "immer": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", - "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==", - "dev": true - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "requires": { - "resolve-from": "^3.0.0" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "inquirer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", - "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "intl-format-cache": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/intl-format-cache/-/intl-format-cache-4.1.13.tgz", - "integrity": "sha512-d/1NI8ctPZsPJU3G6k0pIuydnebeck7hG+wIHJOJUJm3eZ2+3bcZCD34o/Mc18M5ZiEZei02xsMtp8g1IQc23A==" - }, - "intl-locales-supported": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/intl-locales-supported/-/intl-locales-supported-1.4.5.tgz", - "integrity": "sha512-D7oriM5x46rd7kNlSW0f9noIBegFr3ReIM6xlMpwH4lfIPD/zvBelPlCjR10IK16boGJG9lKccOvRAM8wzpbrA==" - }, - "intl-messageformat": { - "version": "6.1.9", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-6.1.9.tgz", - "integrity": "sha512-vnPujdP+gpWK/+GxWUo3nWRfrUj67/NAZoBNAyCvZ0fnfWh5jvIkKNr5ZZYewdZ7J3cEFLU6hYYgWztiCEFZGg==", - "requires": { - "intl-format-cache": "^4.1.13", - "intl-messageformat-parser": "^3.0.7" - } - }, - "intl-messageformat-parser": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-3.0.7.tgz", - "integrity": "sha512-L16VbbV3NFaiZV65XwOIH9fBe52TS2EkOR0k8Y4ratsgTE7KPEbcUCUrz/iEQwJo7BcWY4ohkZbeYZRgAiPR1Q==" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" - }, - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", - "dev": true - }, - "is": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", - "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", - "dev": true - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" - }, - "is-docker": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", - "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" - }, - "is-generator-function": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", - "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.1.0.tgz", - "integrity": "sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "requires": { - "has": "^1.0.1" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "dev": true - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "dev": true, - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - } - } - }, - "istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A==", - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-25.1.0.tgz", - "integrity": "sha512-FV6jEruneBhokkt9MQk0WUFoNTwnF76CLXtwNMfsc0um0TlB/LG2yxUd0KqaFjEJ9laQmVWQWS0sG/t2GsuI0w==", - "requires": { - "@jest/core": "^25.1.0", - "import-local": "^3.0.2", - "jest-cli": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "jest-cli": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.1.0.tgz", - "integrity": "sha512-p+aOfczzzKdo3AsLJlhs8J5EW6ffVidfSZZxXedJ0mHPBOln1DccqFmGCoO8JWd4xRycfmwy1eoQkMsF8oekPg==", - "requires": { - "@jest/core": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^15.0.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.1.0.tgz", - "integrity": "sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg==", - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^16.1.0" - } - } - } - }, - "jest-changed-files": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.1.0.tgz", - "integrity": "sha512-bdL1aHjIVy3HaBO3eEQeemGttsq1BDlHgWcOjEOIAcga7OOEGWHD2WSu8HhL7I1F0mFFyci8VKU4tRNk+qtwDA==", - "requires": { - "@jest/types": "^25.1.0", - "execa": "^3.2.0", - "throat": "^5.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "jest-config": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.1.0.tgz", - "integrity": "sha512-tLmsg4SZ5H7tuhBC5bOja0HEblM0coS3Wy5LTCb2C8ZV6eWLewHyK+3qSq9Bi29zmWQ7ojdCd3pxpx4l4d2uGw==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^25.1.0", - "@jest/types": "^25.1.0", - "babel-jest": "^25.1.0", - "chalk": "^3.0.0", - "glob": "^7.1.1", - "jest-environment-jsdom": "^25.1.0", - "jest-environment-node": "^25.1.0", - "jest-get-type": "^25.1.0", - "jest-jasmine2": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "micromatch": "^4.0.2", - "pretty-format": "^25.1.0", - "realpath-native": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", - "requires": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-docblock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.1.0.tgz", - "integrity": "sha512-370P/mh1wzoef6hUKiaMcsPtIapY25suP6JqM70V9RJvdKLrV4GaGbfUseUVk4FZJw4oTZ1qSCJNdrClKt5JQA==", - "requires": { - "detect-newline": "^3.0.0" - }, - "dependencies": { - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" - } - } - }, - "jest-each": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.1.0.tgz", - "integrity": "sha512-R9EL8xWzoPySJ5wa0DXFTj7NrzKpRD40Jy+zQDp3Qr/2QmevJgkN9GqioCGtAJ2bW9P/MQRznQHQQhoeAyra7A==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "jest-get-type": "^25.1.0", - "jest-util": "^25.1.0", - "pretty-format": "^25.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-environment-jsdom": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.1.0.tgz", - "integrity": "sha512-ILb4wdrwPAOHX6W82GGDUiaXSSOE274ciuov0lztOIymTChKFtC02ddyicRRCdZlB5YSrv3vzr1Z5xjpEe1OHQ==", - "requires": { - "@jest/environment": "^25.1.0", - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "jsdom": "^15.1.1" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/fake-timers": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.1.0.tgz", - "integrity": "sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ==", - "requires": { - "@jest/types": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "lolex": "^5.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", - "requires": { - "@jest/types": "^25.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-environment-jsdom-fourteen": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-1.0.1.tgz", - "integrity": "sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q==", - "dev": true, - "requires": { - "@jest/environment": "^24.3.0", - "@jest/fake-timers": "^24.3.0", - "@jest/types": "^24.3.0", - "jest-mock": "^24.0.0", - "jest-util": "^24.0.0", - "jsdom": "^14.1.0" - }, - "dependencies": { - "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", - "dev": true, - "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" - } - }, - "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - } - }, - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, - "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", - "dev": true - }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jsdom": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz", - "integrity": "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^6.0.4", - "acorn-globals": "^4.3.0", - "array-equal": "^1.0.0", - "cssom": "^0.3.4", - "cssstyle": "^1.1.1", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.0", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.1.3", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.5.0", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^6.1.2", - "xml-name-validator": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "jest-environment-node": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.1.0.tgz", - "integrity": "sha512-U9kFWTtAPvhgYY5upnH9rq8qZkj6mYLup5l1caAjjx9uNnkLHN2xgZy5mo4SyLdmrh/EtB9UPpKFShvfQHD0Iw==", - "requires": { - "@jest/environment": "^25.1.0", - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/fake-timers": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.1.0.tgz", - "integrity": "sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ==", - "requires": { - "@jest/types": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "lolex": "^5.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", - "requires": { - "@jest/types": "^25.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" - }, - "jest-haste-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.1.0.tgz", - "integrity": "sha512-/2oYINIdnQZAqyWSn1GTku571aAfs8NxzSErGek65Iu5o8JYb+113bZysRMcC/pjE5v9w0Yz+ldbj9NxrFyPyw==", - "requires": { - "@jest/types": "^25.1.0", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.3", - "jest-serializer": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": true - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-jasmine2": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.1.0.tgz", - "integrity": "sha512-GdncRq7jJ7sNIQ+dnXvpKO2MyP6j3naNK41DTTjEAhLEdpImaDA9zSAZwDhijjSF/D7cf4O5fdyUApGBZleaEg==", - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^25.1.0", - "@jest/source-map": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "co": "^4.6.0", - "expect": "^25.1.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "pretty-format": "^25.1.0", - "throat": "^5.0.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "diff-sequences": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", - "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-diff": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", - "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-matcher-utils": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", - "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", - "requires": { - "chalk": "^3.0.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-leak-detector": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.1.0.tgz", - "integrity": "sha512-3xRI264dnhGaMHRvkFyEKpDeaRzcEBhyNrOG5oT8xPxOyUAblIAQnpiR3QXu4wDor47MDTiHbiFcbypdLcLW5w==", - "requires": { - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - } - } - }, - "jest-matcher-utils": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", - "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", - "requires": { - "chalk": "^2.0.1", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", - "stack-utils": "^1.0.1" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-mock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - } - } - }, - "jest-pnp-resolver": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", - "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==" - }, - "jest-regex-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.1.0.tgz", - "integrity": "sha512-9lShaDmDpqwg+xAd73zHydKrBbbrIi08Kk9YryBEBybQFg/lBWR/2BDjjiSE7KIppM9C5+c03XiDaZ+m4Pgs1w==" - }, - "jest-resolve": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", - "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.1.0.tgz", - "integrity": "sha512-Cu/Je38GSsccNy4I2vL12ZnBlD170x2Oh1devzuM9TLH5rrnLW1x51lN8kpZLYTvzx9j+77Y5pqBaTqfdzVzrw==", - "requires": { - "@jest/types": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-snapshot": "^25.1.0" - } - }, - "jest-runner": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.1.0.tgz", - "integrity": "sha512-su3O5fy0ehwgt+e8Wy7A8CaxxAOCMzL4gUBftSs0Ip32S0epxyZPDov9Znvkl1nhVOJNf4UwAsnqfc3plfQH9w==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-config": "^25.1.0", - "jest-docblock": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-jasmine2": "^25.1.0", - "jest-leak-detector": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-runtime": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.1.0.tgz", - "integrity": "sha512-mpPYYEdbExKBIBB16ryF6FLZTc1Rbk9Nx0ryIpIMiDDkOeGa0jQOKVI/QeGvVGlunKKm62ywcioeFVzIbK03bA==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/source-map": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.3", - "jest-config": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "realpath-native": "^1.1.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.0.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@types/yargs": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.1.tgz", - "integrity": "sha512-sYlwNU7zYi6eZbMzFvG6eHD7VsEvFdoDtlD7eI1JTg7YNnuguzmiGsc6MPSq5l8n+h21AsNof0je+9sgOe4+dg==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", - "requires": { - "@jest/types": "^25.1.0" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.1.0.tgz", - "integrity": "sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg==", - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^16.1.0" - } - } - } - }, - "jest-serializer": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.1.0.tgz", - "integrity": "sha512-20Wkq5j7o84kssBwvyuJ7Xhn7hdPeTXndnwIblKDR2/sy1SUm6rWWiG9kSCgJPIfkDScJCIsTtOKdlzfIHOfKA==" - }, - "jest-snapshot": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.1.0.tgz", - "integrity": "sha512-xZ73dFYN8b/+X2hKLXz4VpBZGIAn7muD/DAg+pXtDzDGw3iIV10jM7WiHqhCcpDZfGiKEj7/2HXAEPtHTj0P2A==", - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "expect": "^25.1.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^25.1.0", - "semver": "^7.1.1" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "diff-sequences": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", - "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-diff": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", - "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-matcher-utils": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", - "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", - "requires": { - "chalk": "^3.0.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "semver": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.1.tgz", - "integrity": "sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-transform-css": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jest-transform-css/-/jest-transform-css-2.0.0.tgz", - "integrity": "sha512-KV5pD27qUltAVj0mZEVvqd+Ahe+WNPOVWKA1BRpIhBJ5OeUUOM46ivAznJrC5B1JrVNbMzWjPxnKl6QTsAAT3Q==", - "requires": { - "common-tags": "1.8.0", - "cosmiconfig": "5.0.6", - "cross-spawn": "6.0.5", - "postcss-load-config": "2.0.0", - "postcss-modules": "1.3.2", - "style-inject": "0.3.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.6.tgz", - "integrity": "sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ==", - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0" - } - } - } - }, - "jest-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", - "dev": true, - "requires": { - "@jest/console": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/source-map": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-validate": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.1.0.tgz", - "integrity": "sha512-kGbZq1f02/zVO2+t1KQGSVoCTERc5XeObLwITqC6BTRH3Adv7NZdYqCpKIZLUgpLXf2yISzQ465qOZpul8abXA==", - "requires": { - "@jest/types": "^25.1.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "jest-get-type": "^25.1.0", - "leven": "^3.1.0", - "pretty-format": "^25.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-watch-typeahead": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz", - "integrity": "sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.1", - "jest-regex-util": "^24.9.0", - "jest-watcher": "^24.3.0", - "slash": "^3.0.0", - "string-length": "^3.1.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", - "dev": true, - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-watcher": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", - "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", - "dev": true, - "requires": { - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "jest-util": "^24.9.0", - "string-length": "^2.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsdom": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", - "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", - "requires": { - "abab": "^2.0.0", - "acorn": "^7.1.0", - "acorn-globals": "^4.3.2", - "array-equal": "^1.0.0", - "cssom": "^0.4.1", - "cssstyle": "^2.0.0", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.1", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.2.0", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^7.0.0", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" - }, - "cssstyle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", - "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - } - } - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" - }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jsx-ast-utils": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", - "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "object.assign": "^4.1.0" - } - }, - "just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", - "dev": true - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - } - } - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" - }, - "last-call-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", - "dev": true, - "requires": { - "lodash": "^4.17.5", - "webpack-sources": "^1.1.0" - } - }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "dev": true, - "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "dev": true, - "requires": { - "flush-write-stream": "^1.0.2" - } - }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", - "dev": true - }, - "less": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", - "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", - "dev": true, - "requires": { - "clone": "^2.1.2", - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "mime": "^1.4.1", - "mkdirp": "^0.5.0", - "promise": "^7.1.1", - "request": "^2.83.0", - "source-map": "~0.6.0" - } - }, - "less-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", - "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "loader-utils": "^1.1.0", - "pify": "^3.0.0" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "dev": true, - "requires": { - "leven": "^3.1.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - }, - "dependencies": { - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - } - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "linkify-it": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.1.0.tgz", - "integrity": "sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg==", - "dev": true, - "requires": { - "uc.micro": "^1.0.1" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "loader-fs-cache": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz", - "integrity": "sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw==", - "dev": true, - "requires": { - "find-cache-dir": "^0.1.1", - "mkdirp": "0.5.1" - }, - "dependencies": { - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "^1.0.0" - } - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" - }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "loglevel": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", - "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==", - "dev": true - }, - "lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", - "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", - "dev": true, - "requires": { - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "dev": true, - "requires": { - "es5-ext": "~0.10.2" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==" - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "requires": { - "tmpl": "1.0.x" - } - }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", - "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "entities": "~1.1.1", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - } - }, - "matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "dev": true, - "requires": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - } - } - }, - "memoizee": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", - "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.45", - "es6-weak-map": "^2.0.2", - "event-emitter": "^0.3.5", - "is-promise": "^2.1", - "lru-queue": "0.1", - "next-tick": "1", - "timers-ext": "^0.1.5" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true - }, - "merge-deep": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", - "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "clone-deep": "^0.2.4", - "kind-of": "^3.0.2" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", - "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "microevent.ts": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", - "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "requires": { - "mime-db": "1.40.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" - }, - "min-indent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz", - "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=" - }, - "mini-css-extract-plugin": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", - "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "minipass": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", - "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", - "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mixin-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", - "dev": true, - "requires": { - "for-in": "^0.1.3", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-in": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", - "dev": true - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, - "mocha": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.1.4.tgz", - "integrity": "sha512-PN8CIy4RXsIoxoFJzS4QNnCH4psUCPWc4/rPrst/ecSJJbLBkubMiyGCP2Kj/9YnWbotFqAoeXyXMucj7gwCFg==", - "dev": true, - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.2.2", - "yargs-parser": "13.0.0", - "yargs-unparser": "1.5.0" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" - } - }, - "yargs-parser": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", - "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" - } - }, - "mute-stdout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "no-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", - "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", - "dev": true, - "requires": { - "lower-case": "^2.0.1", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "node-abi": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.15.0.tgz", - "integrity": "sha512-FeLpTS0F39U7hHZU1srAK4Vx+5AHNVOTP+hxBNQknR/54laTHSFIJkDWDqiquY1LeLUgTfPN7sLPhMubx0PLAg==", - "requires": { - "semver": "^5.4.1" - } - }, - "node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" - }, - "node-libs-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", - "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - } - } - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" - }, - "node-notifier": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", - "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.1.1", - "semver": "^6.3.0", - "shellwords": "^0.1.1", - "which": "^1.3.1" - }, - "dependencies": { - "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", - "optional": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "optional": true - } - } - }, - "node-releases": { - "version": "1.1.49", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.49.tgz", - "integrity": "sha512-xH8t0LS0disN0mtRCh+eByxFPie+msJUBL/lJDBuap53QGiYPa9joh83K4pCZgWJ+2L4b9h88vCVdXQ60NO2bg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "noop-logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, - "now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "dev": true, - "requires": { - "once": "^1.3.2" - } - }, - "npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "object-hash": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", - "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==", - "dev": true - }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true - }, - "object-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", - "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object-path": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", - "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "object.entries": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", - "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "object.fromentries": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", - "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } - }, - "object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "office-ui-fabric-react": { - "version": "7.105.12", - "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-7.105.12.tgz", - "integrity": "sha512-PUmhth8szgLzR6xoN4HkPA0aIahpYr6/sU5oPob5zPRXB2JrhOCnCL9lFsL7/xU0lCFf/OAdoH+ARvF8DcAa0w==", - "requires": { - "@fluentui/react-focus": "^7.1.13", - "@microsoft/load-themed-styles": "^1.10.26", - "@uifabric/foundation": "^7.5.25", - "@uifabric/icons": "^7.3.24", - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/react-hooks": "^7.1.2", - "@uifabric/set-version": "^7.0.9", - "@uifabric/styling": "^7.11.2", - "@uifabric/utilities": "^7.15.5", - "prop-types": "^15.7.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "on-error-resume-next": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-error-resume-next/-/on-error-resume-next-1.1.0.tgz", - "integrity": "sha512-XhWMbmKV0+W95yLJjT1Z9zdkKiPUjDn63YYsji1pdvKqaa7pq4coeHaHEXPsa36SFlffOyOlPK/0rn6Njfb+LA==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "requires": { - "is-wsl": "^1.1.0" - } - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "optimize-css-assets-webpack-plugin": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", - "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", - "dev": true, - "requires": { - "cssnano": "^4.1.10", - "last-call-webpack-plugin": "^3.0.0" - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz", - "integrity": "sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M=" - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-each-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", - "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", - "dev": true - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", - "dev": true - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "param-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz", - "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==", - "dev": true, - "requires": { - "dot-case": "^3.0.3", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - } - } - }, - "parse-asn1": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", - "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parse-semver": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", - "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=", - "dev": true, - "requires": { - "semver": "^5.1.0" - } - }, - "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" - }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascal-case": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", - "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", - "dev": true, - "requires": { - "no-case": "^3.0.3", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "~2.3" - } - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "picomatch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", - "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==" - }, - "pidtree": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", - "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - } - } - }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" - }, - "pnp-webpack-plugin": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.0.tgz", - "integrity": "sha512-ZcMGn/xF/fCOq+9kWMP9vVVxjIkMCja72oy3lziR7UHy0hHFZ57iVpQ71OtveVbmzeCmphBg8pxNdk/hlK99aQ==", - "dev": true, - "requires": { - "ts-pnp": "^1.1.2" - } - }, - "portfinder": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", - "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.1" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-attribute-case-insensitive": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", - "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^6.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-browser-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", - "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", - "dev": true, - "requires": { - "postcss": "^7" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-calc": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", - "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", - "dev": true, - "requires": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", - "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-functional-notation": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", - "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-gray": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", - "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-hex-alpha": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", - "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", - "dev": true, - "requires": { - "postcss": "^7.0.14", - "postcss-values-parser": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-mod-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", - "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-rebeccapurple": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", - "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-custom-media": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", - "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-custom-properties": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", - "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", - "dev": true, - "requires": { - "postcss": "^7.0.17", - "postcss-values-parser": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-custom-selectors": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", - "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-dir-pseudo-class": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", - "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-double-position-gradients": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", - "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", - "dev": true, - "requires": { - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-env-function": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", - "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-flexbugs-fixes": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz", - "integrity": "sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-focus-visible": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", - "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-focus-within": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", - "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-font-variant": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz", - "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-gap-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", - "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-image-set-function": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", - "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-initial": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", - "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", - "dev": true, - "requires": { - "lodash.template": "^4.5.0", - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-lab-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", - "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", - "requires": { - "cosmiconfig": "^4.0.0", - "import-cwd": "^2.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" - } - } - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-logical": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", - "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-media-minmax": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", - "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", - "dev": true, - "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-1.3.2.tgz", - "integrity": "sha512-QujH5ZpPtr1fBWTKDa43Hx45gm7p19aEtHaAtkMCBZZiB/D5za2wXSMtAf94tDUZHF3F5KZcTXISUNqgEQRiDw==", - "requires": { - "css-modules-loader-core": "^1.1.0", - "generic-names": "^1.0.3", - "lodash.camelcase": "^4.3.0", - "postcss": "^7.0.1", - "string-hash": "^1.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.26.tgz", - "integrity": "sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", - "dev": true, - "requires": { - "postcss": "^6.0.1" - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - } - }, - "postcss-nesting": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", - "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", - "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", - "dev": true, - "requires": { - "@csstools/normalize.css": "^10.1.0", - "browserslist": "^4.6.2", - "postcss": "^7.0.17", - "postcss-browser-comments": "^3.0.0", - "sanitize.css": "^10.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", - "dev": true, - "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", - "dev": true, - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-overflow-shorthand": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", - "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-page-break": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", - "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-place": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", - "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-preset-env": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", - "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", - "dev": true, - "requires": { - "autoprefixer": "^9.6.1", - "browserslist": "^4.6.4", - "caniuse-lite": "^1.0.30000981", - "css-blank-pseudo": "^0.1.4", - "css-has-pseudo": "^0.10.0", - "css-prefers-color-scheme": "^3.1.1", - "cssdb": "^4.4.0", - "postcss": "^7.0.17", - "postcss-attribute-case-insensitive": "^4.0.1", - "postcss-color-functional-notation": "^2.0.1", - "postcss-color-gray": "^5.0.0", - "postcss-color-hex-alpha": "^5.0.3", - "postcss-color-mod-function": "^3.0.3", - "postcss-color-rebeccapurple": "^4.0.1", - "postcss-custom-media": "^7.0.8", - "postcss-custom-properties": "^8.0.11", - "postcss-custom-selectors": "^5.1.2", - "postcss-dir-pseudo-class": "^5.0.0", - "postcss-double-position-gradients": "^1.0.0", - "postcss-env-function": "^2.0.2", - "postcss-focus-visible": "^4.0.0", - "postcss-focus-within": "^3.0.0", - "postcss-font-variant": "^4.0.0", - "postcss-gap-properties": "^2.0.0", - "postcss-image-set-function": "^3.0.1", - "postcss-initial": "^3.0.0", - "postcss-lab-function": "^2.0.1", - "postcss-logical": "^3.0.0", - "postcss-media-minmax": "^4.0.0", - "postcss-nesting": "^7.0.0", - "postcss-overflow-shorthand": "^2.0.0", - "postcss-page-break": "^2.0.0", - "postcss-place": "^4.0.1", - "postcss-pseudo-class-any-link": "^6.0.0", - "postcss-replace-overflow-wrap": "^3.0.0", - "postcss-selector-matches": "^4.0.0", - "postcss-selector-not": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-pseudo-class-any-link": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", - "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-replace-overflow-wrap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", - "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-safe-parser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz", - "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-selector-matches": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", - "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-selector-not": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz", - "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "dependencies": { - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - } - } - }, - "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", - "dev": true, - "requires": { - "is-svg": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "prebuild-install": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.3.tgz", - "integrity": "sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==", - "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.7.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true - }, - "pretty-bytes": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", - "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==", - "dev": true - }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "dev": true, - "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" - } - }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", - "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/yargs": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.6.tgz", - "integrity": "sha512-IkltIncDQWv6fcAvnHtJ6KtkmY/vtR3bViOaCzpj/A3yNhlfZAgxNe6AEQD1cQrkYD+YsKVo08DSxvNKEsD7BA==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - } - } - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "optional": true, - "requires": { - "asap": "~2.0.3" - } - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "prompts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz", - "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==", - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.3" - } - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "psl": { - "version": "1.1.32", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.32.tgz", - "integrity": "sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==" - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", - "dev": true - }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dev": true, - "requires": { - "performance-now": "^2.1.0" - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "react": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", - "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - } - }, - "react-app-polyfill": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz", - "integrity": "sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g==", - "dev": true, - "requires": { - "core-js": "^3.5.0", - "object-assign": "^4.1.1", - "promise": "^8.0.3", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.3", - "whatwg-fetch": "^3.0.0" - }, - "dependencies": { - "promise": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.3.tgz", - "integrity": "sha512-HeRDUL1RJiLhyA0/grn+PTShlBAcLuh/1BJGtrvjwbvRDCTLLMEz9rOGCV+R3vHY4MixIuoMEd9Yq/XvsTPcjw==", - "dev": true, - "requires": { - "asap": "~2.0.6" - } - }, - "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", - "dev": true - } - } - }, - "react-dev-utils": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.2.0.tgz", - "integrity": "sha512-MwrvQW2TFjLblhqpDNeqCXHBkz3G5vc7k4wntgutAJZX4ia3o07eGKo6uYGhUOeJ0hfOxcpJFNFk7+4XCc1S8g==", - "dev": true, - "requires": { - "@babel/code-frame": "7.8.3", - "address": "1.1.2", - "browserslist": "4.8.6", - "chalk": "2.4.2", - "cross-spawn": "7.0.1", - "detect-port-alt": "1.1.6", - "escape-string-regexp": "2.0.0", - "filesize": "6.0.1", - "find-up": "4.1.0", - "fork-ts-checker-webpack-plugin": "3.1.1", - "global-modules": "2.0.0", - "globby": "8.0.2", - "gzip-size": "5.1.1", - "immer": "1.10.0", - "inquirer": "7.0.4", - "is-root": "2.1.0", - "loader-utils": "1.2.3", - "open": "^7.0.2", - "pkg-up": "3.1.0", - "react-error-overlay": "^6.0.6", - "recursive-readdir": "2.2.2", - "shell-quote": "1.7.2", - "strip-ansi": "6.0.0", - "text-table": "0.2.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "browserslist": { - "version": "4.8.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.6.tgz", - "integrity": "sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001023", - "electron-to-chromium": "^1.3.341", - "node-releases": "^1.1.47" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } - } - }, - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "open": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.2.tgz", - "integrity": "sha512-70E/pFTPr7nZ9nLDPNTcj3IVqnNvKuP4VsBmoKV9YGTnChe0mlS3C4qM7qKarhZ8rGaHKLfo+vBTHXDp6ZSyLQ==", - "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "react-dom": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", - "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.18.0" - } - }, - "react-error-overlay": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.6.tgz", - "integrity": "sha512-Yzpno3enVzSrSCnnljmr4b/2KUQSMZaPuqmS26t9k4nW7uwJk6STWmH9heNjPuvqUTO3jOSPkHoKgO4+Dw7uIw==", - "dev": true - }, - "react-intl": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-3.1.9.tgz", - "integrity": "sha512-mQxhcFsYsj7O+k2Gsf1p+QaGhEdr+g7v5hYaa88dqar1m1xdWldEJjZ4JK/waHTp4zhVPoco4NQ1JdPkhs8HkA==", - "requires": { - "@formatjs/intl-relativetimeformat": "^2.6.3", - "@types/hoist-non-react-statics": "^3.3.1", - "@types/invariant": "^2.2.30", - "hoist-non-react-statics": "^3.3.0", - "intl-format-cache": "^4.1.10", - "intl-locales-supported": "^1.4.5", - "intl-messageformat": "^6.1.6", - "intl-messageformat-parser": "^3.0.7", - "invariant": "^2.1.1", - "shallow-equal": "^1.1.0" - } - }, - "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==" - }, - "react-scripts": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.0.tgz", - "integrity": "sha512-pBqaAroFoHnFAkuX+uSK9Th1uEh2GYdGY2IG1I9/7HmuEf+ls3lLCk1p2GFYRSrLMz6ieQR/SyN6TLIGK3hKRg==", - "dev": true, - "requires": { - "@babel/core": "7.8.4", - "@svgr/webpack": "4.3.3", - "@typescript-eslint/eslint-plugin": "^2.10.0", - "@typescript-eslint/parser": "^2.10.0", - "babel-eslint": "10.0.3", - "babel-jest": "^24.9.0", - "babel-loader": "8.0.6", - "babel-plugin-named-asset-import": "^0.3.6", - "babel-preset-react-app": "^9.1.1", - "camelcase": "^5.3.1", - "case-sensitive-paths-webpack-plugin": "2.3.0", - "css-loader": "3.4.2", - "dotenv": "8.2.0", - "dotenv-expand": "5.1.0", - "eslint": "^6.6.0", - "eslint-config-react-app": "^5.2.0", - "eslint-loader": "3.0.3", - "eslint-plugin-flowtype": "4.6.0", - "eslint-plugin-import": "2.20.0", - "eslint-plugin-jsx-a11y": "6.2.3", - "eslint-plugin-react": "7.18.0", - "eslint-plugin-react-hooks": "^1.6.1", - "file-loader": "4.3.0", - "fs-extra": "^8.1.0", - "fsevents": "2.1.2", - "html-webpack-plugin": "4.0.0-beta.11", - "identity-obj-proxy": "3.0.0", - "jest": "24.9.0", - "jest-environment-jsdom-fourteen": "1.0.1", - "jest-resolve": "24.9.0", - "jest-watch-typeahead": "0.4.2", - "mini-css-extract-plugin": "0.9.0", - "optimize-css-assets-webpack-plugin": "5.0.3", - "pnp-webpack-plugin": "1.6.0", - "postcss-flexbugs-fixes": "4.1.0", - "postcss-loader": "3.0.0", - "postcss-normalize": "8.0.1", - "postcss-preset-env": "6.7.0", - "postcss-safe-parser": "4.0.1", - "react-app-polyfill": "^1.0.6", - "react-dev-utils": "^10.2.0", - "resolve": "1.15.0", - "resolve-url-loader": "3.1.1", - "sass-loader": "8.0.2", - "semver": "6.3.0", - "style-loader": "0.23.1", - "terser-webpack-plugin": "2.3.4", - "ts-pnp": "1.1.5", - "url-loader": "2.3.0", - "webpack": "4.41.5", - "webpack-dev-server": "3.10.2", - "webpack-manifest-plugin": "2.2.0", - "workbox-webpack-plugin": "4.3.1" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@jest/core": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", - "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/reporters": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.9.0", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-resolve-dependencies": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "jest-watcher": "^24.9.0", - "micromatch": "^3.1.10", - "p-each-series": "^1.0.0", - "realpath-native": "^1.1.0", - "rimraf": "^2.5.4", - "slash": "^2.0.0", - "strip-ansi": "^5.0.0" - } - }, - "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", - "dev": true, - "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" - } - }, - "@jest/reporters": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", - "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^2.0.2", - "istanbul-lib-instrument": "^3.0.1", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.2.6", - "jest-haste-map": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "node-notifier": "^5.4.2", - "slash": "^2.0.0", - "source-map": "^0.6.0", - "string-length": "^2.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@jest/test-sequencer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", - "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", - "dev": true, - "requires": { - "@jest/test-result": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0" - } - }, - "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - }, - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "babel-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", - "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", - "dev": true, - "requires": { - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.9.0", - "chalk": "^2.4.2", - "slash": "^2.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", - "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", - "dev": true, - "requires": { - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", - "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", - "dev": true, - "requires": { - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "css-loader": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", - "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.23", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.1.1", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.0.2", - "schema-utils": "^2.6.0" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "expect": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", - "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "ansi-styles": "^3.2.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.9.0" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "find-cache-dir": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", - "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.0", - "pkg-dir": "^4.1.0" - }, - "dependencies": { - "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - } - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "dev": true, - "optional": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0" - } - }, - "jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", - "dev": true, - "requires": { - "import-local": "^2.0.0", - "jest-cli": "^24.9.0" - }, - "dependencies": { - "jest-cli": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", - "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", - "dev": true, - "requires": { - "@jest/core": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "import-local": "^2.0.0", - "is-ci": "^2.0.0", - "jest-config": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^13.3.0" - } - } - } - }, - "jest-changed-files": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", - "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "execa": "^1.0.0", - "throat": "^4.0.0" - } - }, - "jest-config": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", - "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.9.0", - "@jest/types": "^24.9.0", - "babel-jest": "^24.9.0", - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^24.9.0", - "jest-environment-node": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "micromatch": "^3.1.10", - "pretty-format": "^24.9.0", - "realpath-native": "^1.1.0" - } - }, - "jest-docblock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", - "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", - "dev": true, - "requires": { - "detect-newline": "^2.1.0" - } - }, - "jest-each": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", - "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-environment-jsdom": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", - "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0", - "jsdom": "^11.5.1" - } - }, - "jest-environment-node": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", - "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0" - } - }, - "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, - "dependencies": { - "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": false, - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": false, - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.3", - "resolved": false, - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": false, - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "resolved": false, - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": false, - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": false, - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": false, - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": false, - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": false, - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": false, - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "resolved": false, - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": false, - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": false, - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": false, - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "resolved": false, - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": false, - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": false, - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.2", - "resolved": false, - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "optional": true - }, - "needle": { - "version": "2.4.0", - "resolved": false, - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "resolved": false, - "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": false, - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.7", - "resolved": false, - "integrity": "sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": false, - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": false, - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": false, - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": false, - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": false, - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": false, - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": false, - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": false, - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": false, - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "resolved": false, - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": false, - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "resolved": false, - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": false, - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "resolved": false, - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "optional": true - } - } - } - } - }, - "jest-jasmine2": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", - "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^24.9.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0", - "throat": "^4.0.0" - } - }, - "jest-leak-detector": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", - "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", - "dev": true, - "requires": { - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, - "jest-resolve-dependencies": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", - "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.9.0" - } - }, - "jest-runner": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", - "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.4.2", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-leak-detector": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "source-map-support": "^0.5.6", - "throat": "^4.0.0" - } - }, - "jest-runtime": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", - "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "strip-bom": "^3.0.0", - "yargs": "^13.3.0" - } - }, - "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", - "dev": true - }, - "jest-snapshot": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", - "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "expect": "^24.9.0", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^24.9.0", - "semver": "^6.2.0" - } - }, - "jest-validate": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", - "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "camelcase": "^5.3.1", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "leven": "^3.1.0", - "pretty-format": "^24.9.0" - } - }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", - "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - } - }, - "node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", - "dev": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "p-each-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", - "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", - "dev": true, - "requires": { - "p-reduce": "^1.0.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "postcss-modules-local-by-default": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", - "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", - "dev": true, - "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.16", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.0" - } - }, - "postcss-modules-scope": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz", - "integrity": "sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - } - }, - "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", - "dev": true, - "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" - } - }, - "postcss-value-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", - "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "resolve": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", - "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "terser-webpack-plugin": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.4.tgz", - "integrity": "sha512-Nv96Nws2R2nrFOpbzF6IxRDpIkkIfmhvOws+IqMvYdFLO7o6wAILWFKONFgaYy8+T4LVz77DQW0f7wOeDEAjrg==", - "dev": true, - "requires": { - "cacache": "^13.0.1", - "find-cache-dir": "^3.2.0", - "jest-worker": "^25.1.0", - "p-limit": "^2.2.2", - "schema-utils": "^2.6.4", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.4.3", - "webpack-sources": "^1.4.3" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "webpack": { - "version": "4.41.5", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", - "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.0", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - }, - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - } - } - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "react-test-renderer": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.12.0.tgz", - "integrity": "sha512-Vj/teSqt2oayaWxkbhQ6gKis+t5JrknXfPVo+aIJ8QwYAqMPH77uptOdrlphyxl8eQI/rtkOYg86i/UWkpFu0w==", - "requires": { - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "react-is": "^16.8.6", - "scheduler": "^0.18.0" - }, - "dependencies": { - "scheduler": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", - "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - } - } - }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "dev": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", - "requires": { - "util.promisify": "^1.0.0" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", - "dev": true, - "requires": { - "minimatch": "3.0.4" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" - }, - "regenerate-unicode-properties": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", - "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" - }, - "regenerator-transform": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", - "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", - "dev": true, - "requires": { - "private": "^0.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regex-parser": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", - "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "regexpp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", - "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", - "dev": true - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "~0.5.0" - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - } - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dev": true, - "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "renderkid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", - "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", - "dev": true, - "requires": { - "css-select": "^1.1.0", - "dom-converter": "^0.2", - "htmlparser2": "^3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" - }, - "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - } - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", - "requires": { - "lodash": "^4.17.11" - } - }, - "request-promise-native": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", - "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", - "requires": { - "request-promise-core": "1.1.2", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", - "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "dependencies": { - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - } - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - }, - "resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "dev": true, - "requires": { - "value-or-function": "^3.0.0" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "resolve-url-loader": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz", - "integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==", - "dev": true, - "requires": { - "adjust-sourcemap-loader": "2.0.0", - "camelcase": "5.3.1", - "compose-function": "3.0.3", - "convert-source-map": "1.7.0", - "es6-iterator": "2.0.3", - "loader-utils": "1.2.3", - "postcss": "7.0.21", - "rework": "1.0.1", - "rework-visit": "1.0.0", - "source-map": "0.6.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "dev": true, - "requires": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - }, - "dependencies": { - "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", - "dev": true - } - } - }, - "rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", - "dev": true - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, - "rimraf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", - "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rsvp": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.4.tgz", - "integrity": "sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA==" - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - } - }, - "sanitize.css": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", - "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==", - "dev": true - }, - "sass-loader": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", - "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "loader-utils": "^1.2.3", - "neo-async": "^2.6.1", - "schema-utils": "^2.6.1", - "semver": "^6.3.0" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "saxes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.9.tgz", - "integrity": "sha512-FZeKhJglhJHk7eWG5YM0z46VHmI3KJpMBAQm3xa9meDvd+wevB5GuBB0wc0exPInZiBBHqi00DbS8AcvCGCFMw==", - "requires": { - "xmlchars": "^1.3.1" - } - }, - "scheduler": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", - "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", - "dev": true, - "requires": { - "node-forge": "0.9.0" - } - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" - }, - "semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", - "dev": true, - "requires": { - "sver-compat": "^1.5.0" - } - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - } - } - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, - "serialport": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/serialport/-/serialport-8.0.7.tgz", - "integrity": "sha512-R9bfNebs2dblYf5sD/Aaa7j8+siP4X7TGT02lqHM9DF5fyjlrPGXmsLw9+LKOz1AvjGjkxf2NzBVnDpqRX7clQ==", - "requires": { - "@serialport/binding-mock": "^8.0.6", - "@serialport/bindings": "^8.0.7", - "@serialport/parser-byte-length": "^8.0.6", - "@serialport/parser-cctalk": "^8.0.6", - "@serialport/parser-delimiter": "^8.0.6", - "@serialport/parser-readline": "^8.0.6", - "@serialport/parser-ready": "^8.0.6", - "@serialport/parser-regex": "^8.0.6", - "@serialport/stream": "^8.0.6", - "debug": "^4.1.1" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-clone": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", - "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", - "dev": true, - "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^2.0.1", - "lazy-cache": "^0.2.3", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", - "dev": true, - "requires": { - "is-buffer": "^1.0.2" - } - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", - "dev": true - } - } - }, - "shallow-equal": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.0.tgz", - "integrity": "sha512-Z21pVxR4cXsfwpMKMhCEIO1PCi5sp7KEp+CmOpBQ+E8GpHwKOw2sEzk7sgblM3d/j4z4gakoWEoPcjK0VJQogA==" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "dev": true, - "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } - }, - "shelljs": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.7.tgz", - "integrity": "sha1-svXHfvlxSPS09uImguELuoZnz/E=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" - }, - "simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - } - } - }, - "sisteransi": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", - "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==" - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - } - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - } - }, - "socket.io": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.0.tgz", - "integrity": "sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ==", - "requires": { - "debug": "~4.1.0", - "engine.io": "~3.5.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.4.0", - "socket.io-parser": "~3.4.0" - } - }, - "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" - }, - "socket.io-client": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", - "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "engine.io-client": "~3.5.0", - "has-binary2": "~1.0.2", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "socket.io-parser": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", - "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", - "requires": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" - } - } - } - }, - "socket.io-parser": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", - "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", - "requires": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - } - } - }, - "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", - "dev": true, - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" - } - }, - "sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", - "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", - "dev": true, - "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", - "dev": true - }, - "spdy": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", - "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", - "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "minipass": "^3.1.1" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - }, - "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==" - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", - "dev": true - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "streamfilter": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz", - "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=" - }, - "string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", - "dev": true, - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string.prototype.padend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", - "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.4.3", - "function-bind": "^1.0.2" - } - }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dev": true, - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "dependencies": { - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", - "dev": true - }, - "strip-comments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", - "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", - "dev": true, - "requires": { - "babel-extract-comments": "^1.0.0", - "babel-plugin-transform-object-rest-spread": "^6.26.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "style-inject": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", - "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==" - }, - "style-loader": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.21.0.tgz", - "integrity": "sha512-T+UNsAcl3Yg+BsPKs1vd22Fr8sVT+CJMtzqc6LEw9bbJZb43lm9GoeIfUcDEefBSWC0BhYbcdupV1GtI4DGzxg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^0.4.5" - }, - "dependencies": { - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "supports-hyperlinks": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.0.0.tgz", - "integrity": "sha512-bFhn0MQ8qefLyJ3K7PpHiPUTuTVPWw6RXfaMeV6xgJLXtBbszyboz1bvGTVv4R0YpQm2DqlXXn0fFHhxUHVE5w==", - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "dev": true, - "requires": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "svg-inline-react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/svg-inline-react/-/svg-inline-react-3.1.0.tgz", - "integrity": "sha512-c39AIRQOUXLMD8fQ2rHmK1GOSO3tVuZk61bAXqIT05uhhm3z4VtQFITQSwyhL0WA2uxoJAIhPd2YV0CYQOolSA==", - "requires": { - "prop-types": "^15.5.0" - } - }, - "svg-parser": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.3.tgz", - "integrity": "sha512-fnCWiifNhK8i2Z7b9R5tbNahpxrRdAaQbnoxKlT2KrSCj9Kq/yBSgulCRgBJRhy1dPnSY5slg5ehPUnzpEcHlg==", - "dev": true - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "symbol-tree": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "tar-fs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", - "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", - "requires": { - "chownr": "^1.1.1", - "mkdirp": "^0.5.1", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - } - }, - "tar-stream": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", - "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", - "requires": { - "bl": "^4.0.1", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "dependencies": { - "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "requires": { - "type-fest": "^0.8.1" - } - } - } - }, - "terser": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - }, - "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "terser": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } - } - }, - "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "dev": true, - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "dev": true, - "requires": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" - }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - } - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "dev": true, - "requires": { - "through2": "^2.0.3" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "requires": { - "punycode": "^2.1.0" - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - }, - "ts-import-plugin": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/ts-import-plugin/-/ts-import-plugin-1.5.5.tgz", - "integrity": "sha512-i0ULERaX+vycmASUeJFbAqx+KeMBAH+iFaSim+U9t05DxK+ZGpMCHT18zTRzTEh1dA6OWsHzVZmHgFKh5UTKUA==", - "dev": true, - "requires": { - "tslib": "^1.9.2" - } - }, - "ts-jest": { - "version": "25.0.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-25.0.0.tgz", - "integrity": "sha512-F+hZg3j7XYOFpXJteXb4lnqy7vQzTmpTmX7AJT6pvSGeZejyXj1Lk0ArpnrEPOpv6Zu/NugHc5W7FINngC9WZQ==", - "requires": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "mkdirp": "0.x", - "resolve": "1.x", - "semver": "^5.5", - "yargs-parser": "10.x" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "ts-loader": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-4.5.0.tgz", - "integrity": "sha512-ihgVaSmgrX4crGV4n7yuoHPoCHbDzj9aepCZR9TgIx4SgJ9gdnB6xLHgUBb7bsFM/f0K6x9iXa65KY/Fu1Klkw==", - "dev": true, - "requires": { - "chalk": "^2.3.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^1.0.2", - "micromatch": "^3.1.4", - "semver": "^5.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "ts-pnp": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.5.tgz", - "integrity": "sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA==", - "dev": true - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - }, - "tslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz", - "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^3.2.0", - "glob": "^7.1.1", - "js-yaml": "^3.13.0", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tslint-config-prettier": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz", - "integrity": "sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==", - "dev": true - }, - "tslint-microsoft-contrib": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-6.2.0.tgz", - "integrity": "sha512-6tfi/2tHqV/3CL77pULBcK+foty11Rr0idRDxKnteTaKm6gWF9qmaCNU17HVssOuwlYNyOmd9Jsmjd+1t3a3qw==", - "dev": true, - "requires": { - "tsutils": "^2.27.2 <2.29.0" - }, - "dependencies": { - "tsutils": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz", - "integrity": "sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tslint-react": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/tslint-react/-/tslint-react-3.6.0.tgz", - "integrity": "sha512-AIv1QcsSnj7e9pFir6cJ6vIncTqxfqeFF3Lzh8SuuBljueYzEAtByuB6zMaD27BL0xhMEqsZ9s5eHuCONydjBw==", - "dev": true, - "requires": { - "tsutils": "^2.13.1" - }, - "dependencies": { - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tslint-react-hooks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslint-react-hooks/-/tslint-react-hooks-2.1.0.tgz", - "integrity": "sha512-ccjyguEHGEU5rXikLDaQ6kT1AVo3C0HV8gi2MIJc7SbYAXjbzJkpbs4IXulgfqdEY1T6RnNSuGhyXg+2jTm5Bg==", - "dev": true - }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", - "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/type/-/type-1.0.1.tgz", - "integrity": "sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw==", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typed-rest-client": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.2.0.tgz", - "integrity": "sha512-FrUshzZ1yxH8YwGR29PWWnfksLEILbWJydU7zfIRkyH7kAEzB62uMAl2WY6EyolWpLpVHeJGgQm45/MaruaHpw==", - "dev": true, - "requires": { - "tunnel": "0.0.4", - "underscore": "1.8.3" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", - "dev": true - }, - "typescript-react-intl": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/typescript-react-intl/-/typescript-react-intl-0.4.0.tgz", - "integrity": "sha512-sCQN2YdWSaWNAK9bBezmqZStswfh0MMWQnIlBOn+iFBN4fE1m36fv1zqUaw33jTbQUjIaZ4N+NFbMfS/cnyIew==", - "dev": true, - "requires": { - "typescript": "^2.6.2" - }, - "dependencies": { - "typescript": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", - "dev": true - } - } - }, - "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true - }, - "undertaker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", - "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - } - }, - "undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", - "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", - "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "dev": true, - "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } - } - }, - "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-join": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", - "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=", - "dev": true - }, - "url-loader": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", - "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "mime": "^2.4.4", - "schema-utils": "^2.5.0" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } - } - }, - "url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "usb-detection": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/usb-detection/-/usb-detection-4.7.0.tgz", - "integrity": "sha512-HE9y5uYfA2ebVo64BrIB0OVNaVKZ2oWkadpTItCi4YQXyZ9vD0705iqQ3B7Rz8xevcrW/RNg/85E2o2JoPFmsQ==", - "requires": { - "bindings": "^1.3.0", - "eventemitter2": "^5.0.1", - "nan": "^2.13.2", - "prebuild-install": "^5.1.0" - } - }, - "usb-native": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/usb-native/-/usb-native-5.0.1.tgz", - "integrity": "sha512-FuKUVJmzgo7I6jclH0fCLuQLuOTg3jzzDvQwFgFWJM5Qe1L09snrl84adFCNvE/LGbCCCa4XjLuGGIgB7+zGQA==", - "requires": { - "fs-extra": "^8.1.0", - "serialport": "^8.0.7", - "usb-detection": "^4.7.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "util": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.1.tgz", - "integrity": "sha512-MREAtYOp+GTt9/+kwf00IYoHZyjM8VU4aVrkzUlejyqaIjd2GztVl5V9hGXKlvBKE3gENn/FMfHE5v6hElXGcQ==", - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "object.entries": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - }, - "v8-compile-cache": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", - "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", - "dev": true - }, - "v8-to-istanbul": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.0.1.tgz", - "integrity": "sha512-x0yZvZAkjJwdD3fPiJzYP37aod0ati4LlmD2RmpKjqewjKAov/u/ytZ8ViIZb07cN4cePKzl9ijiUi7C1LQ8hQ==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } - } - }, - "v8flags": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", - "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "version-from-git": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/version-from-git/-/version-from-git-1.1.1.tgz", - "integrity": "sha512-R8kAZ+EFJcqG5HGrfjk7bSBAWKB3AE/Dnh21llvNg6CWJIPJAKsYNLR7lvYrCwu33A3TU4UljPLpp577UxgL3w==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "commander": "^2.15.1", - "cross-spawn": "^6.0.5", - "git-rev-sync": "^1.12.0", - "on-error-resume-next": "^1.0.0", - "semver": "^5.5.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - } - }, - "vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "dev": true, - "requires": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "vsce": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.62.0.tgz", - "integrity": "sha512-KXtPBsdC0K27hmDksINyjoRl9BiuTB+ntmoJEDbbO3GIc+L3wfOclaSy8iYqddnpSA33YDkhKzKXhT0JGzrG/A==", - "dev": true, - "requires": { - "azure-devops-node-api": "^7.2.0", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.1", - "commander": "^2.8.1", - "denodeify": "^1.2.1", - "glob": "^7.0.6", - "lodash": "^4.17.10", - "markdown-it": "^8.3.1", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "osenv": "^0.1.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "semver": "^5.1.0", - "tmp": "0.0.29", - "typed-rest-client": "1.2.0", - "url-join": "^1.1.0", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tmp": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", - "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.1" - } - } - } - }, - "vscode-extension-telemetry": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.1.1.tgz", - "integrity": "sha512-TkKKG/B/J94DP5qf6xWB4YaqlhWDg6zbbqVx7Bz//stLQNnfE9XS1xm3f6fl24c5+bnEK0/wHgMgZYKIKxPeUA==", - "requires": { - "applicationinsights": "1.0.8" - } - }, - "vscode-nls": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.1.tgz", - "integrity": "sha512-4R+2UoUUU/LdnMnFjePxfLqNhBS8lrAFyX7pjb2ud/lqDkrUavFUTcG7wR0HBZFakae0Q6KLBFjMS6W93F403A==" - }, - "vscode-nls-dev": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/vscode-nls-dev/-/vscode-nls-dev-3.3.1.tgz", - "integrity": "sha512-fug18D7CXb8pv8JoQ0D0JmZaIYDQoKLiyZxkAy5P8Cln/FwlNsdzwQILDph62EdGY5pvsJ2Jd1T5qgHAExe/tg==", - "dev": true, - "requires": { - "ansi-colors": "^3.2.3", - "clone": "^2.1.1", - "event-stream": "^3.3.4", - "fancy-log": "^1.3.3", - "glob": "^7.1.2", - "iconv-lite": "^0.4.19", - "is": "^3.2.1", - "source-map": "^0.6.1", - "typescript": "^2.6.2", - "vinyl": "^2.1.0", - "xml2js": "^0.4.19", - "yargs": "^13.2.4" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "event-stream": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.5.tgz", - "integrity": "sha512-vyibDcu5JL20Me1fP734QBH/kenBGLZap2n0+XXM7mvuUPzJ20Ydqj1aKcIeMdri1p+PU+4yAKugjN8KCVst+g==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "from": "^0.1.7", - "map-stream": "0.0.7", - "pause-stream": "^0.0.11", - "split": "^1.0.1", - "stream-combiner": "^0.2.2", - "through": "^2.3.8" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "typescript": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "vscode-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.0.0.tgz", - "integrity": "sha512-RnZUhxEXYCozHtBAQwX/UISlw0JPqlv1I9LLl4++vcPDIvjs2Zfz2Inp8haxixS1sOTftHJ9kiecrwWF9S3taQ==", - "dev": true, - "requires": { - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1" - } - }, - "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", - "requires": { - "browser-process-hrtime": "^0.1.2" - } - }, - "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", - "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" - } - }, - "wait-for-expect": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-3.0.1.tgz", - "integrity": "sha512-3Ha7lu+zshEG/CeHdcpmQsZnnZpPj/UsG3DuKO8FskjuDbkx3jE3845H+CuwZjA2YWYDfKMU2KhnCaXMLd3wVw==" - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "requires": { - "makeerror": "1.0.x" - } - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "dev": true, - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - }, - "webpack": { - "version": "4.32.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.32.2.tgz", - "integrity": "sha512-F+H2Aa1TprTQrpodRAWUMJn7A8MgDx82yQiNvYMaj3d1nv3HetKU0oqEulL9huj8enirKi8KvEXQ3QtuHF89Zg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.0.5", - "acorn-dynamic-import": "^4.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^1.0.0", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - } - } - }, - "webpack-cli": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.2.tgz", - "integrity": "sha512-FLkobnaJJ+03j5eplxlI0TUxhGCOdfewspIGuvDVtpOlrAuKMFC57K42Ukxqs1tn8947/PM6tP95gQc0DCzRYA==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.0", - "findup-sync": "^2.0.0", - "global-modules": "^1.0.0", - "import-local": "^2.0.0", - "interpret": "^1.1.0", - "loader-utils": "^1.1.0", - "supports-color": "^5.5.0", - "v8-compile-cache": "^2.0.2", - "yargs": "^12.0.5" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", - "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", - "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - }, - "dependencies": { - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - } - } - }, - "webpack-dev-server": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.2.tgz", - "integrity": "sha512-pxZKPYb+n77UN8u9YxXT4IaIrGcNtijh/mi8TXbErHmczw0DtPnMTTjHj+eNjkqLOaAZM/qD7V59j/qJsEiaZA==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.2.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.6", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.25", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "0.3.19", - "sockjs-client": "1.4.0", - "spdy": "^4.0.1", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "12.0.5" - }, - "dependencies": { - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "webpack-manifest-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", - "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", - "dev": true, - "requires": { - "fs-extra": "^7.0.0", - "lodash": ">=3.5 <5", - "object.entries": "^1.1.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.4.0 <0.4.11", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==", - "dev": true - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - }, - "workbox-background-sync": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz", - "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-broadcast-update": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz", - "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-build": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-4.3.1.tgz", - "integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.3.4", - "@hapi/joi": "^15.0.0", - "common-tags": "^1.8.0", - "fs-extra": "^4.0.2", - "glob": "^7.1.3", - "lodash.template": "^4.4.0", - "pretty-bytes": "^5.1.0", - "stringify-object": "^3.3.0", - "strip-comments": "^1.0.2", - "workbox-background-sync": "^4.3.1", - "workbox-broadcast-update": "^4.3.1", - "workbox-cacheable-response": "^4.3.1", - "workbox-core": "^4.3.1", - "workbox-expiration": "^4.3.1", - "workbox-google-analytics": "^4.3.1", - "workbox-navigation-preload": "^4.3.1", - "workbox-precaching": "^4.3.1", - "workbox-range-requests": "^4.3.1", - "workbox-routing": "^4.3.1", - "workbox-strategies": "^4.3.1", - "workbox-streams": "^4.3.1", - "workbox-sw": "^4.3.1", - "workbox-window": "^4.3.1" - }, - "dependencies": { - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "workbox-cacheable-response": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz", - "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-core": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", - "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==", - "dev": true - }, - "workbox-expiration": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz", - "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-google-analytics": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz", - "integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==", - "dev": true, - "requires": { - "workbox-background-sync": "^4.3.1", - "workbox-core": "^4.3.1", - "workbox-routing": "^4.3.1", - "workbox-strategies": "^4.3.1" - } - }, - "workbox-navigation-preload": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz", - "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-precaching": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz", - "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-range-requests": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz", - "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-routing": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz", - "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-strategies": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz", - "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-streams": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-4.3.1.tgz", - "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-sw": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz", - "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==", - "dev": true - }, - "workbox-webpack-plugin": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz", - "integrity": "sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.0.0", - "json-stable-stringify": "^1.0.1", - "workbox-build": "^4.3.1" - } - }, - "workbox-window": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-4.3.1.tgz", - "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "worker-rpc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", - "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", - "dev": true, - "requires": { - "microevent.ts": "~0.1.1" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "ws": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.1.tgz", - "integrity": "sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A==" - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true - }, - "xmlchars": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-1.3.1.tgz", - "integrity": "sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw==" - }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true - }, - "yaml": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz", - "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.6.3" - } - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - }, - "dependencies": { - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "yargs-parser": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", - "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yargs-unparser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", - "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", - "dev": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.11", - "yargs": "^12.0.5" - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3" - } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" - }, - "zone.js": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.7.6.tgz", - "integrity": "sha1-+7w50+AmHQmG8boGMG6zrrDSIAk=" - } - } -} diff --git a/package.json b/package.json index c3d9e093d..ee9f30f49 100644 --- a/package.json +++ b/package.json @@ -1,327 +1,327 @@ { - "name": "__EXTENSIONNAME__", - "displayName": "__DISPLAYNAME__", - "description": "__DESCRIPTION__", - "version": "0.0.0-UNTRACKEDVERSION", - "publisher": "__PUBLISHER__", - "instrumentationKey": "__AIKEY__", - "icon": "assets/icon.png", - "engines": { - "vscode": "^1.43.0" - }, - "categories": [ - "Other" - ], - "preview": true, - "license": "MIT", - "homepage": "https://github.com/microsoft/vscode-python-devicesimulator", - "repository": { - "type": "git", - "url": "https://github.com/microsoft/vscode-python-devicesimulator" - }, - "bugs": { - "url": "https://github.com/microsoft/vscode-python-devicesimulator/issues" - }, - "keywords": [ - "python", - "CircuitPython", - "Adafruit", - "microbit", - "MicroPython" - ], - "activationEvents": [ - "onCommand:deviceSimulatorExpress.common.installDependencies", - "onCommand:deviceSimulatorExpress.common.openSerialMonitor", - "onCommand:deviceSimulatorExpress.common.runSimulator", - "onCommand:deviceSimulatorExpress.common.selectSerialPort", - "onCommand:deviceSimulatorExpress.common.gettingStarted", - "onCommand:deviceSimulatorExpress.common.deployToDevice", - "onCommand:deviceSimulatorExpress.common.newFile", - "onCommand:deviceSimulatorExpress.common.openSimulator", - "onDebug" - ], - "main": "./out/extension.js", - "contributes": { - "commands": [ - { - "command": "deviceSimulatorExpress.common.installDependencies", - "title": "%deviceSimulatorExpressExtension.commands.common.installDependencies%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.changeBaudRate", - "title": "%deviceSimulatorExpressExtension.commands.common.changeBaudRate%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.closeSerialMonitor", - "title": "%deviceSimulatorExpressExtension.commands.common.closeSerialMonitor%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.openSerialMonitor", - "title": "%deviceSimulatorExpressExtension.commands.common.openSerialMonitor%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.selectSerialPort", - "title": "%deviceSimulatorExpressExtension.commands.common.selectSerialPort%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.runSimulator", - "title": "%deviceSimulatorExpressExtension.commands.common.runSimulator%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.gettingStarted", - "title": "%deviceSimulatorExpressExtension.commands.common.gettingStarted%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.deployToDevice", - "title": "%deviceSimulatorExpressExtension.commands.common.deployToDevice%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.newFile", - "title": "%deviceSimulatorExpressExtension.commands.common.newFile%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.openSimulator", - "title": "%deviceSimulatorExpressExtension.commands.common.openSimulator%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - } - ], - "colors": [ - { - "id": "highContrastButtonBorderOverride.color", - "description": "Color for the high contrast border updated", - "defaults": { - "dark": "debugToolBar.background", - "light": "debugToolBar.background", - "highContrast": "#6FC3DF" - } - }, - { - "id": "badgeForegroundOverride", - "description": "Color that fixes the issue with midnight blue ", - "defaults": { - "dark": "#FFFFFF", - "light": "badge.foreground", - "highContrast": "#FFFFFF" - } - } - ], - "configuration": { - "type": "object", - "title": "%deviceSimulatorExpressExtension.configuration.title%", - "properties": { - "deviceSimulatorExpress.configNewEnvironmentUponSwitch": { - "type": "boolean", - "default": false, - "description": "%deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange%", - "scope": "resource" - }, - "deviceSimulatorExpress.enableUSBDetection": { - "type": "boolean", - "default": true - }, - "deviceSimulatorExpress.showDependencyInstall": { - "type": "boolean", - "default": true, - "description": "%deviceSimulatorExpressExtension.configuration.properties.dependencyChecker%", - "scope": "resource" - }, - "deviceSimulatorExpress.showNewFilePopup": { - "type": "boolean", - "default": true, - "scope": "resource" - }, - "deviceSimulatorExpress.debuggerServerPort": { - "type": "number", - "default": 5577, - "description": "%deviceSimulatorExpressExtension.configuration.properties.debuggerPort%", - "scope": "resource" - } - } - }, - "breakpoints": [ - { - "language": "python" - } - ], - "debuggers": [ - { - "type": "deviceSimulatorExpress", - "label": "Device Simulator Express Debugger", - "languages": [ - "python" - ], - "configurationAttributes": { - "launch": { - "properties": { - "program": { - "type": "string", - "description": "Absolute path to the code file.", - "default": "${file}" - }, - "stopOnEntry": { - "type": "boolean", - "description": "Automatically stop after launch.", - "default": true - }, - "console": { - "enum": [ - "internalConsole", - "integratedTerminal", - "externalTerminal" - ], - "description": "Where to launch the debug target: internal console, integrated terminal, or external terminal.", - "default": "integratedTerminal" - }, - "args": { - "type": "array", - "description": "Command line arguments passed to the program.", - "default": [], - "items": { - "filePath": "string", - "serverPort": "string" - } - }, - "rules": { - "type": "array", - "description": "Debugger rules.", - "default": [], - "items": { - "path": "string", - "include": "boolean" - } - } - } - } - }, - "initialConfigurations": [ - { - "type": "deviceSimulatorExpress", - "request": "launch", - "name": "Device Simulator Express Debugger", - "console": "integratedTerminal" - } - ], - "configurationSnippets": [ - { - "label": "Device Simulator Express Debugger : Launch", - "description": "Device Simulator Express Debugger - A configuration for debugging a python code file for the Device Simulator Express simulator.", - "body": { - "type": "deviceSimulatorExpress", - "request": "launch", - "name": "Device Simulator Express Debugger", - "console": "integratedTerminal" - } - } - ] - } - ] - }, - "scripts": { - "start": "webpack-dev-server", - "vscode:prepublish": "npm run compile", - "build": "gulp build", - "clean": "gulp clean", - "compile": "npm-run-all compile:*", - "compile:extension": "gulp compile", - "compile:views": "webpack --mode development", - "watch": "npm-run-all -p watch:*", - "watch:extension": "tsc --watch", - "watch:views": "webpack --watch --mode development", - "pretest": "npm run compile", - "test": "npm-run-all test:*", - "test:extension-tests": "node ./out/test/runTest.js", - "test:ts": "jest", - "test:api-tests": "pytest src", - "lint": "npm-run-all lint:*", - "lint:ts": "tslint -c tslint.json src/**/*.{ts,tsx}", - "lint:python": "pylint src", - "format": "npm-run-all format:*", - "format:ts": "prettier --config .prettierrc.yaml --write src/**/*.{css,ts,tsx}", - "format:python": "black src", - "check": "npm-run-all check:*", - "check:ts": "prettier --config .prettierrc.yaml --check src/**/*.{css,ts,tsx}", - "check:python": "black src --check", - "package": "vsce package" - }, - "devDependencies": { - "@types/glob": "^7.1.1", - "@types/node": "^10.12.21", - "@types/react": "16.8.6", - "@types/react-dom": "16.8.4", - "@types/vscode": "^1.45.1", - "css-loader": "^1.0.0", - "del": "^4.0.0", - "event-stream": "^4.0.1", - "gulp": "^4.0.2", - "gulp-cli": "^2.1.0", - "gulp-filter": "^5.1.0", - "gulp-sourcemaps": "^2.6.5", - "gulp-typescript": "^5.0.1", - "less": "^3.7.0", - "less-loader": "^4.1.0", - "mocha": "^6.1.4", - "npm-run-all": "^4.1.3", - "prettier": "^1.19.1", - "react-scripts": "^3.4.0", - "style-loader": "^0.21.0", - "ts-import-plugin": "^1.5.4", - "ts-loader": "^4.4.2", - "tslint": "^5.12.1", - "tslint-config-prettier": "^1.18.0", - "tslint-microsoft-contrib": "^6.1.0", - "tslint-react": "^3.6.0", - "tslint-react-hooks": "^2.0.0", - "typescript": "^3.8.3", - "typescript-react-intl": "^0.4.0", - "version-from-git": "^1.1.1", - "vsce": "^1.47.0", - "vscode-nls-dev": "^3.2.6", - "vscode-test": "^1.0.0", - "webpack": "^4.15.1", - "webpack-cli": "^3.0.8" - }, - "dependencies": { - "@babel/preset-typescript": "^7.8.3", - "@testing-library/jest-dom": "^5.0.2", - "@testing-library/react": "^9.4.0", - "@types/jest": "^24.9.0", - "@types/open": "^6.1.0", - "@types/react-test-renderer": "^16.9.0", - "@types/socket.io": "^2.1.2", - "babel-jest": "^25.1.0", - "compare-versions": "^3.5.1", - "eventemitter2": "^5.0.1", - "glob": "^7.1.4", - "jest": "^25.1.0", - "jest-transform-css": "^2.0.0", - "office-ui-fabric-react": "^7.105.12", - "open": "^6.4.0", - "os": "^0.1.1", - "react": "^16.9.0", - "react-dom": "^16.9.0", - "react-intl": "^3.1.9", - "react-test-renderer": "^16.9.0", - "socket.io": "^2.4.0", - "svg-inline-react": "^3.1.0", - "ts-jest": "^25.0.0", - "usb-native": "^5.0.1", - "util": "^0.12.1", - "vscode-extension-telemetry": "^0.1.1", - "vscode-nls": "^4.1.0" - }, - "eslintConfig": { - "extends": "react-app" - }, - "extensionDependencies": [ - "ms-python.python" - ] + "name": "__EXTENSIONNAME__", + "displayName": "__DISPLAYNAME__", + "version": "0.0.0-UNTRACKEDVERSION", + "description": "__DESCRIPTION__", + "categories": [ + "Other" + ], + "keywords": [ + "python", + "CircuitPython", + "Adafruit", + "microbit", + "MicroPython" + ], + "homepage": "https://github.com/microsoft/vscode-python-devicesimulator", + "bugs": { + "url": "https://github.com/microsoft/vscode-python-devicesimulator/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode-python-devicesimulator" + }, + "license": "MIT", + "publisher": "__PUBLISHER__", + "main": "./out/extension.js", + "scripts": { + "start": "webpack-dev-server", + "vscode:prepublish": "npm run compile", + "build": "gulp build", + "clean": "gulp clean", + "compile": "npm-run-all compile:*", + "compile:extension": "gulp compile", + "compile:views": "webpack --mode development", + "watch": "npm-run-all -p watch:*", + "watch:extension": "tsc --watch", + "watch:views": "webpack --watch --mode development", + "pretest": "npm run compile", + "test": "npm-run-all test:*", + "test:extension-tests": "node ./out/test/runTest.js", + "test:ts": "jest", + "test:api-tests": "pytest src", + "lint": "npm-run-all lint:*", + "lint:ts": "tslint -c tslint.json src/**/*.{ts,tsx}", + "lint:python": "pylint src", + "format": "npm-run-all format:*", + "format:ts": "prettier --config .prettierrc.yaml --write src/**/*.{css,ts,tsx}", + "format:python": "black src", + "check": "npm-run-all check:*", + "check:ts": "prettier --config .prettierrc.yaml --check src/**/*.{css,ts,tsx}", + "check:python": "black src --check", + "package": "vsce package" + }, + "contributes": { + "breakpoints": [ + { + "language": "python" + } + ], + "colors": [ + { + "id": "highContrastButtonBorderOverride.color", + "description": "Color for the high contrast border updated", + "defaults": { + "dark": "debugToolBar.background", + "light": "debugToolBar.background", + "highContrast": "#6FC3DF" + } + }, + { + "id": "badgeForegroundOverride", + "description": "Color that fixes the issue with midnight blue ", + "defaults": { + "dark": "#FFFFFF", + "light": "badge.foreground", + "highContrast": "#FFFFFF" + } + } + ], + "commands": [ + { + "command": "deviceSimulatorExpress.common.installDependencies", + "title": "%deviceSimulatorExpressExtension.commands.common.installDependencies%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.changeBaudRate", + "title": "%deviceSimulatorExpressExtension.commands.common.changeBaudRate%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.closeSerialMonitor", + "title": "%deviceSimulatorExpressExtension.commands.common.closeSerialMonitor%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.openSerialMonitor", + "title": "%deviceSimulatorExpressExtension.commands.common.openSerialMonitor%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.selectSerialPort", + "title": "%deviceSimulatorExpressExtension.commands.common.selectSerialPort%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.runSimulator", + "title": "%deviceSimulatorExpressExtension.commands.common.runSimulator%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.gettingStarted", + "title": "%deviceSimulatorExpressExtension.commands.common.gettingStarted%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.deployToDevice", + "title": "%deviceSimulatorExpressExtension.commands.common.deployToDevice%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.newFile", + "title": "%deviceSimulatorExpressExtension.commands.common.newFile%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.openSimulator", + "title": "%deviceSimulatorExpressExtension.commands.common.openSimulator%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + } + ], + "configuration": { + "type": "object", + "title": "%deviceSimulatorExpressExtension.configuration.title%", + "properties": { + "deviceSimulatorExpress.configNewEnvironmentUponSwitch": { + "type": "boolean", + "default": false, + "description": "%deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange%", + "scope": "resource" + }, + "deviceSimulatorExpress.enableUSBDetection": { + "type": "boolean", + "default": true + }, + "deviceSimulatorExpress.showDependencyInstall": { + "type": "boolean", + "default": true, + "description": "%deviceSimulatorExpressExtension.configuration.properties.dependencyChecker%", + "scope": "resource" + }, + "deviceSimulatorExpress.showNewFilePopup": { + "type": "boolean", + "default": true, + "scope": "resource" + }, + "deviceSimulatorExpress.debuggerServerPort": { + "type": "number", + "default": 5577, + "description": "%deviceSimulatorExpressExtension.configuration.properties.debuggerPort%", + "scope": "resource" + } + } + }, + "debuggers": [ + { + "type": "deviceSimulatorExpress", + "label": "Device Simulator Express Debugger", + "languages": [ + "python" + ], + "configurationAttributes": { + "launch": { + "properties": { + "program": { + "type": "string", + "description": "Absolute path to the code file.", + "default": "${file}" + }, + "stopOnEntry": { + "type": "boolean", + "description": "Automatically stop after launch.", + "default": true + }, + "console": { + "enum": [ + "internalConsole", + "integratedTerminal", + "externalTerminal" + ], + "description": "Where to launch the debug target: internal console, integrated terminal, or external terminal.", + "default": "integratedTerminal" + }, + "args": { + "type": "array", + "description": "Command line arguments passed to the program.", + "default": [], + "items": { + "filePath": "string", + "serverPort": "string" + } + }, + "rules": { + "type": "array", + "description": "Debugger rules.", + "default": [], + "items": { + "path": "string", + "include": "boolean" + } + } + } + } + }, + "initialConfigurations": [ + { + "type": "deviceSimulatorExpress", + "request": "launch", + "name": "Device Simulator Express Debugger", + "console": "integratedTerminal" + } + ], + "configurationSnippets": [ + { + "label": "Device Simulator Express Debugger : Launch", + "description": "Device Simulator Express Debugger - A configuration for debugging a python code file for the Device Simulator Express simulator.", + "body": { + "type": "deviceSimulatorExpress", + "request": "launch", + "name": "Device Simulator Express Debugger", + "console": "integratedTerminal" + } + } + ] + } + ] + }, + "activationEvents": [ + "onCommand:deviceSimulatorExpress.common.installDependencies", + "onCommand:deviceSimulatorExpress.common.openSerialMonitor", + "onCommand:deviceSimulatorExpress.common.runSimulator", + "onCommand:deviceSimulatorExpress.common.selectSerialPort", + "onCommand:deviceSimulatorExpress.common.gettingStarted", + "onCommand:deviceSimulatorExpress.common.deployToDevice", + "onCommand:deviceSimulatorExpress.common.newFile", + "onCommand:deviceSimulatorExpress.common.openSimulator", + "onDebug" + ], + "eslintConfig": { + "extends": "react-app" + }, + "dependencies": { + "@babel/preset-typescript": "7.23.3", + "@testing-library/jest-dom": "6.1.4", + "@testing-library/react": "14.1.0", + "@types/jest": "29.5.8", + "@types/open": "6.1.0", + "@types/react-test-renderer": "18.0.6", + "@types/socket.io": "3.0.1", + "babel-jest": "29.7.0", + "compare-versions": "6.1.0", + "eventemitter2": "6.4.9", + "glob": "10.3.10", + "jest": "29.7.0", + "jest-transform-css": "6.0.1", + "office-ui-fabric-react": "7.204.0", + "open": "9.1.0", + "os": "0.1.2", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-intl": "6.5.2", + "react-test-renderer": "18.2.0", + "socket.io": "4.7.2", + "svg-inline-react": "3.2.1", + "ts-jest": "29.1.1", + "usb-native": "6.0.0", + "util": "0.12.5", + "vscode-extension-telemetry": "0.1.1", + "vscode-nls": "5.2.0" + }, + "devDependencies": { + "@types/glob": "8.1.0", + "@types/node": "20.9.0", + "@types/react": "18.2.37", + "@types/react-dom": "18.2.15", + "@types/vscode": "1.84.1", + "css-loader": "6.8.1", + "del": "7.1.0", + "event-stream": "4.0.1", + "gulp": "4.0.2", + "gulp-cli": "2.3.0", + "gulp-filter": "9.0.0", + "gulp-sourcemaps": "3.0.0", + "gulp-typescript": "5.0.1", + "less": "4.2.0", + "less-loader": "11.1.3", + "mocha": "10.2.0", + "npm-run-all": "4.1.5", + "prettier": "3.0.3", + "react-scripts": "5.0.1", + "style-loader": "3.3.3", + "ts-import-plugin": "3.0.0", + "ts-loader": "9.5.0", + "tslint": "5.20.1", + "tslint-config-prettier": "1.18.0", + "tslint-microsoft-contrib": "6.1.0", + "tslint-react": "4.1.0", + "tslint-react-hooks": "2.2.2", + "typescript": "5.2.2", + "typescript-react-intl": "0.4.1", + "version-from-git": "1.1.1", + "vsce": "1.47.0", + "vscode-nls-dev": "4.0.4", + "vscode-test": "1.0.0", + "webpack": "5.89.0", + "webpack-cli": "5.1.4" + }, + "extensionDependencies": [ + "ms-python.python" + ], + "engines": { + "vscode": "1.43.0" + }, + "icon": "assets/icon.png", + "preview": true, + "instrumentationKey": "__AIKEY__" } diff --git a/package.nls.json b/package.nls.json index e662c005a..56d7a34ed 100644 --- a/package.nls.json +++ b/package.nls.json @@ -1,17 +1,17 @@ { - "deviceSimulatorExpressExtension.commands.common.installDependencies": "Install Extension Dependencies", - "deviceSimulatorExpressExtension.commands.common.label": "Device Simulator Express", - "deviceSimulatorExpressExtension.commands.common.runSimulator": "Run Simulator", - "deviceSimulatorExpressExtension.commands.common.gettingStarted": "Getting Started", - "deviceSimulatorExpressExtension.commands.common.changeBaudRate": "Change Baud Rate", - "deviceSimulatorExpressExtension.commands.common.closeSerialMonitor": "Close Serial Monitor", - "deviceSimulatorExpressExtension.commands.common.openSerialMonitor": "Open Serial Monitor", - "deviceSimulatorExpressExtension.commands.common.selectSerialPort": "Select Serial Port", - "deviceSimulatorExpressExtension.commands.common.deployToDevice": "Deploy to Device", - "deviceSimulatorExpressExtension.commands.common.openSimulator": "Open Simulator", - "deviceSimulatorExpressExtension.commands.common.newFile": "New File", - "deviceSimulatorExpressExtension.configuration.title": "Device Simulator Express configuration", - "deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange": "When you change the Python interpreter, the Device Simulator Express will automatically configure itself for the required dependencies.", - "deviceSimulatorExpressExtension.configuration.properties.debuggerPort": "The port the Server will listen on for communication with the debugger.", - "deviceSimulatorExpressExtension.configuration.properties.dependencyChecker": "Whether or not to ask for dependency downloads. If unchecked, the extension will default to never download dependencies, except when automatically creating a virtual environment in the extension files." -} \ No newline at end of file + "deviceSimulatorExpressExtension.commands.common.installDependencies": "Install Extension Dependencies", + "deviceSimulatorExpressExtension.commands.common.label": "Device Simulator Express", + "deviceSimulatorExpressExtension.commands.common.runSimulator": "Run Simulator", + "deviceSimulatorExpressExtension.commands.common.gettingStarted": "Getting Started", + "deviceSimulatorExpressExtension.commands.common.changeBaudRate": "Change Baud Rate", + "deviceSimulatorExpressExtension.commands.common.closeSerialMonitor": "Close Serial Monitor", + "deviceSimulatorExpressExtension.commands.common.openSerialMonitor": "Open Serial Monitor", + "deviceSimulatorExpressExtension.commands.common.selectSerialPort": "Select Serial Port", + "deviceSimulatorExpressExtension.commands.common.deployToDevice": "Deploy to Device", + "deviceSimulatorExpressExtension.commands.common.openSimulator": "Open Simulator", + "deviceSimulatorExpressExtension.commands.common.newFile": "New File", + "deviceSimulatorExpressExtension.configuration.title": "Device Simulator Express configuration", + "deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange": "When you change the Python interpreter, the Device Simulator Express will automatically configure itself for the required dependencies.", + "deviceSimulatorExpressExtension.configuration.properties.debuggerPort": "The port the Server will listen on for communication with the debugger.", + "deviceSimulatorExpressExtension.configuration.properties.dependencyChecker": "Whether or not to ask for dependency downloads. If unchecked, the extension will default to never download dependencies, except when automatically creating a virtual environment in the extension files." +} diff --git a/src/base_circuitpython/__init__.py b/src/base_circuitpython/__init__.py index 398a3936b..719319efe 100644 --- a/src/base_circuitpython/__init__.py +++ b/src/base_circuitpython/__init__.py @@ -1,8 +1,8 @@ -import pathlib -import os -import sys - -abs_path = pathlib.Path(__file__).parent.absolute() -clue_path = os.path.join(abs_path, "../clue") -sys.path.insert(0, os.path.join(abs_path)) -sys.path.insert(0, os.path.join(clue_path)) +import pathlib +import os +import sys + +abs_path = pathlib.Path(__file__).parent.absolute() +clue_path = os.path.join(abs_path, "../clue") +sys.path.insert(0, os.path.join(abs_path)) +sys.path.insert(0, os.path.join(clue_path)) diff --git a/src/base_circuitpython/board.py b/src/base_circuitpython/board.py index 8bef9ed4f..5b01da9f6 100644 --- a/src/base_circuitpython/board.py +++ b/src/base_circuitpython/board.py @@ -1,128 +1,128 @@ -# dummy class for references to board display to work -# https://learn.adafruit.com/arduino-to-circuitpython/the-board-module - - -import terminal_handler - - -class __Display: - def __init__(self): - self.active_group = None - self.terminal = terminal_handler.Terminal() - - def show(self, group=None): - if group != self.active_group: - self.active_group = group - - if group == None: - self.terminal._Terminal__draw() - return - - # if the group has no attribute called - # "draw", then it is liable for updating itself - # when it calls show - if hasattr(group, "_Group__draw"): - group._Group__draw() - - -DISPLAY = __Display() - -# default pin for neopixel, -# shows that this could -# refer to the CPX -# or CLUE neopixel pin -NEOPIXEL = "D00" - -# ETC PINS WITHIN THE CLUE THAT MAY BE REFERENCED -# found by runing print(dir(board)) on clue -A0 = 0 -A1 = 0 -A2 = 0 -A3 = 0 -A4 = 0 -A5 = 0 -A6 = 0 -A7 = 0 - -ACCELEROMETER_GYRO_INTERRUPT = 0 - -BUTTON_A = 0 -BUTTON_B = 0 - -D0 = 0 -D1 = 0 -D2 = 0 -D3 = 0 -D4 = 0 -D5 = 0 -D6 = 0 -D7 = 0 -D8 = 0 -D9 = 0 -D10 = 0 -D11 = 0 -D12 = 0 -D13 = 0 -D14 = 0 -D15 = 0 -D16 = 0 -D17 = 0 -D18 = 0 -D19 = 0 -D20 = 0 - -I2C = 0 - -L = 0 - -MICROPHONE_CLOCK = 0 -MICROPHONE_DATA = 0 - -MISO = 0 -MOSI = 0 - -P0 = 0 -P1 = 0 -P2 = 0 -P3 = 0 -P4 = 0 -P5 = 0 -P6 = 0 -P7 = 0 -P8 = 0 -P9 = 0 -P10 = 0 -P11 = 0 -P12 = 0 -P13 = 0 -P14 = 0 -P15 = 0 -P16 = 0 -P17 = 0 -P18 = 0 -P19 = 0 -P20 = 0 - -PROXIMITY_LIGHT_INTERRUPT = 0 - -RX = 0 -SCK = 0 -SCL = 0 -SDA = 0 - -SPEAKER = 0 - -SPI = 0 - -TFT_BACKLIGHT = 0 -TFT_CS = 0 -TFT_DC = 0 -TFT_MOSI = 0 -TFT_RESET = 0 -TFT_SCK = 0 - -TX = 0 - -UART = 0 - -WHITE_LEDS = 0 +# dummy class for references to board display to work +# https://learn.adafruit.com/arduino-to-circuitpython/the-board-module + + +import terminal_handler + + +class __Display: + def __init__(self): + self.active_group = None + self.terminal = terminal_handler.Terminal() + + def show(self, group=None): + if group != self.active_group: + self.active_group = group + + if group == None: + self.terminal._Terminal__draw() + return + + # if the group has no attribute called + # "draw", then it is liable for updating itself + # when it calls show + if hasattr(group, "_Group__draw"): + group._Group__draw() + + +DISPLAY = __Display() + +# default pin for neopixel, +# shows that this could +# refer to the CPX +# or CLUE neopixel pin +NEOPIXEL = "D00" + +# ETC PINS WITHIN THE CLUE THAT MAY BE REFERENCED +# found by runing print(dir(board)) on clue +A0 = 0 +A1 = 0 +A2 = 0 +A3 = 0 +A4 = 0 +A5 = 0 +A6 = 0 +A7 = 0 + +ACCELEROMETER_GYRO_INTERRUPT = 0 + +BUTTON_A = 0 +BUTTON_B = 0 + +D0 = 0 +D1 = 0 +D2 = 0 +D3 = 0 +D4 = 0 +D5 = 0 +D6 = 0 +D7 = 0 +D8 = 0 +D9 = 0 +D10 = 0 +D11 = 0 +D12 = 0 +D13 = 0 +D14 = 0 +D15 = 0 +D16 = 0 +D17 = 0 +D18 = 0 +D19 = 0 +D20 = 0 + +I2C = 0 + +L = 0 + +MICROPHONE_CLOCK = 0 +MICROPHONE_DATA = 0 + +MISO = 0 +MOSI = 0 + +P0 = 0 +P1 = 0 +P2 = 0 +P3 = 0 +P4 = 0 +P5 = 0 +P6 = 0 +P7 = 0 +P8 = 0 +P9 = 0 +P10 = 0 +P11 = 0 +P12 = 0 +P13 = 0 +P14 = 0 +P15 = 0 +P16 = 0 +P17 = 0 +P18 = 0 +P19 = 0 +P20 = 0 + +PROXIMITY_LIGHT_INTERRUPT = 0 + +RX = 0 +SCK = 0 +SCL = 0 +SDA = 0 + +SPEAKER = 0 + +SPI = 0 + +TFT_BACKLIGHT = 0 +TFT_CS = 0 +TFT_DC = 0 +TFT_MOSI = 0 +TFT_RESET = 0 +TFT_SCK = 0 + +TX = 0 + +UART = 0 + +WHITE_LEDS = 0 diff --git a/src/base_circuitpython/digitalio.py b/src/base_circuitpython/digitalio.py index 604db72c3..8d755be82 100644 --- a/src/base_circuitpython/digitalio.py +++ b/src/base_circuitpython/digitalio.py @@ -1,17 +1,17 @@ -# dummy class for neopixel library to work - -# original implementation docs for digitalio: -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/digitalio/__init__.html - - -class DigitalInOut: - def __init__(self, pin): - self.pin = pin - pass - - def deinit(self): - pass - - -class Direction: - OUTPUT = 0 +# dummy class for neopixel library to work + +# original implementation docs for digitalio: +# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/digitalio/__init__.html + + +class DigitalInOut: + def __init__(self, pin): + self.pin = pin + pass + + def deinit(self): + pass + + +class Direction: + OUTPUT = 0 diff --git a/src/base_circuitpython/fontio.py b/src/base_circuitpython/fontio.py index 3c7e567bd..95efb9690 100644 --- a/src/base_circuitpython/fontio.py +++ b/src/base_circuitpython/fontio.py @@ -1,14 +1,14 @@ -# dummy library for adafruit_bitmap_font to work - -# original implementation docs for fontio: -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/fontio/__init__.html - -# file taken from adafruit_bitmap_font's examples: -# https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font/blob/master/test/fontio.py -import collections -import displayio - -Glyph = collections.namedtuple( - "Glyph", - ["bitmap", "tile_index", "width", "height", "dx", "dy", "shift_x", "shift_y"], -) +# dummy library for adafruit_bitmap_font to work + +# original implementation docs for fontio: +# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/fontio/__init__.html + +# file taken from adafruit_bitmap_font's examples: +# https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font/blob/master/test/fontio.py +import collections +import displayio + +Glyph = collections.namedtuple( + "Glyph", + ["bitmap", "tile_index", "width", "height", "dx", "dy", "shift_x", "shift_y"], +) diff --git a/src/base_circuitpython/neopixel_write.py b/src/base_circuitpython/neopixel_write.py index 341215f35..d30cda7c0 100644 --- a/src/base_circuitpython/neopixel_write.py +++ b/src/base_circuitpython/neopixel_write.py @@ -1,55 +1,55 @@ -# overriden neopixel_write library to write to frontend - -# original implementation docs for neopixel_write: -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/neopixel_write/__init__.html - - -import pathlib -import sys -import os - -import common -from adafruit_circuitplayground import cp -import base_cp_constants as CONSTANTS - - -def neopixel_write(gpio, buf): - """Write buf out on the given DigitalInOut.""" - - if len(tuple(buf)) > 0: - # if we are explicitly given - # the clue pin, that means that - # the clue is definitely the active device - # because the constructor for the - # clue is what calls neopixel - # with the clue pin argument - if gpio.pin != CONSTANTS.CLUE_PIN: - send_cpx(buf) - send_clue(buf) - - -def send_clue(buf): - sendable_json = {CONSTANTS.PIXELS: tuple(buf)} - if common.utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - sendable_json, CONSTANTS.CLUE - ) - else: - common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) - - -def send_cpx(buf): - buf_list = list(buf) - ret_list = [] - temp_list = [] - for idx, elem in enumerate(buf_list): - if idx % 3 == 0 and idx != 0: - ret_list.append(tuple(temp_list)) - temp_list = [] - temp_list.append(elem) - - if len(temp_list) == 3: - ret_list.append(tuple(temp_list)) - - max_index = min(len(ret_list), 10) - cp.pixels[0:max_index] = ret_list[0:max_index] +# overriden neopixel_write library to write to frontend + +# original implementation docs for neopixel_write: +# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/neopixel_write/__init__.html + + +import pathlib +import sys +import os + +import common +from adafruit_circuitplayground import cp +import base_cp_constants as CONSTANTS + + +def neopixel_write(gpio, buf): + """Write buf out on the given DigitalInOut.""" + + if len(tuple(buf)) > 0: + # if we are explicitly given + # the clue pin, that means that + # the clue is definitely the active device + # because the constructor for the + # clue is what calls neopixel + # with the clue pin argument + if gpio.pin != CONSTANTS.CLUE_PIN: + send_cpx(buf) + send_clue(buf) + + +def send_clue(buf): + sendable_json = {CONSTANTS.PIXELS: tuple(buf)} + if common.utils.debug_mode: + common.debugger_communication_client.debug_send_to_simulator( + sendable_json, CONSTANTS.CLUE + ) + else: + common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) + + +def send_cpx(buf): + buf_list = list(buf) + ret_list = [] + temp_list = [] + for idx, elem in enumerate(buf_list): + if idx % 3 == 0 and idx != 0: + ret_list.append(tuple(temp_list)) + temp_list = [] + temp_list.append(elem) + + if len(temp_list) == 3: + ret_list.append(tuple(temp_list)) + + max_index = min(len(ret_list), 10) + cp.pixels[0:max_index] = ret_list[0:max_index] diff --git a/src/base_circuitpython/pulseio.py b/src/base_circuitpython/pulseio.py index f69a45836..2e29b699c 100644 --- a/src/base_circuitpython/pulseio.py +++ b/src/base_circuitpython/pulseio.py @@ -1,16 +1,16 @@ -from common import utils - - -class PulseIn: - def __init__(self, pin, maxlen=2, *, idle_state=False): - utils.print_for_unimplemented_functions(PulseIn.__init__.__qualname__) - - -class PulseOut: - def __init__(self, carrier): - utils.print_for_unimplemented_functions(PulseOut.__init__.__qualname__) - - -class PWMOut: - def __init__(self, pin, *, duty_cycle=0, frequency=500, variable_frequency=False): - utils.print_for_unimplemented_functions(PWMOut.__init__.__qualname__) +from common import utils + + +class PulseIn: + def __init__(self, pin, maxlen=2, *, idle_state=False): + utils.print_for_unimplemented_functions(PulseIn.__init__.__qualname__) + + +class PulseOut: + def __init__(self, carrier): + utils.print_for_unimplemented_functions(PulseOut.__init__.__qualname__) + + +class PWMOut: + def __init__(self, pin, *, duty_cycle=0, frequency=500, variable_frequency=False): + utils.print_for_unimplemented_functions(PWMOut.__init__.__qualname__) diff --git a/src/base_circuitpython/terminal_handler.py b/src/base_circuitpython/terminal_handler.py index 83130f0b0..d00b5c495 100644 --- a/src/base_circuitpython/terminal_handler.py +++ b/src/base_circuitpython/terminal_handler.py @@ -1,108 +1,108 @@ -from PIL import Image -import threading -import os -import base64 -from io import BytesIO -import time -import collections -import pathlib - -from common import utils -import board -import base_cp_constants as CONSTANTS -import displayio -import terminalio - - -class Terminal: - def __init__(self): - self.__output_values = collections.deque() - self.__lock = threading.Lock() - self.__abs_path = pathlib.Path(__file__).parent.absolute() - self.__base_img = Image.open( - os.path.join(self.__abs_path, CONSTANTS.IMG_DIR_NAME, CONSTANTS.BLINKA_BMP) - ) - - def __create_newline(self, str_list): - self.__lock.acquire() - for string in str_list: - self.__output_values.appendleft(string) - - over = len(self.__output_values) - CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX - - # max CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX items in output_values - if over > 0: - for i in range(over): - self.__output_values.pop() - - self.__lock.release() - - def __draw(self, no_verif=False): - - import adafruit_display_text.label - - # no need to check the active group within the Group class - # since the caller of draw already did - splash = displayio.Group( - max_size=20, check_active_group_ref=False, auto_write=False - ) - - self.__lock.acquire() - - # since the text starts from the bottom, - # we need to find an offset if there are empty spots - - # handling of output_values already ensures that there are - # max CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX items in output_values deque - num_empty_slots = CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX - len( - self.__output_values - ) - curr_y = CONSTANTS.CLUE_TERMINAL_Y_OFFSET + ( - CONSTANTS.CLUE_TERMINAL_LINE_HEIGHT * num_empty_slots - ) - for output_val in reversed(self.__output_values): - if len(output_val): - text_area = adafruit_display_text.label.Label( - terminalio.FONT, text=output_val, line_spacing=1.25 - ) - - text_area.y = curr_y - text_area.x = CONSTANTS.CLUE_TERMINAL_X_OFFSET - splash.append(text_area) - - curr_y += CONSTANTS.CLUE_TERMINAL_LINE_HEIGHT - - self.__lock.release() - - splash._Group__draw(img=self.__base_img.copy()) - - def add_str_to_terminal(self, curr_display_string=""): - - line_break_amt = CONSTANTS.CLUE_TERMINAL_LINE_BREAK_AMT - - # characters until forced newline - newline_expected_val = line_break_amt - out_str = "" - new_strs = [] - for idx, d in enumerate(curr_display_string): - # handle custom or forced newline - if d == "\n" or newline_expected_val == 0: - new_strs.append(out_str) - out_str = "" - newline_expected_val = line_break_amt - - # if it was a custom newline, no longer need to - # process the character - if d == "\n": - continue - else: - newline_expected_val -= 1 - out_str += d - new_strs.append(out_str) - - self.__create_newline(new_strs) - - # only go ahead to draw the screen - # if the terminal is actively on the screen - if board.DISPLAY.active_group == None: - self.__draw() +from PIL import Image +import threading +import os +import base64 +from io import BytesIO +import time +import collections +import pathlib + +from common import utils +import board +import base_cp_constants as CONSTANTS +import displayio +import terminalio + + +class Terminal: + def __init__(self): + self.__output_values = collections.deque() + self.__lock = threading.Lock() + self.__abs_path = pathlib.Path(__file__).parent.absolute() + self.__base_img = Image.open( + os.path.join(self.__abs_path, CONSTANTS.IMG_DIR_NAME, CONSTANTS.BLINKA_BMP) + ) + + def __create_newline(self, str_list): + self.__lock.acquire() + for string in str_list: + self.__output_values.appendleft(string) + + over = len(self.__output_values) - CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX + + # max CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX items in output_values + if over > 0: + for i in range(over): + self.__output_values.pop() + + self.__lock.release() + + def __draw(self, no_verif=False): + + import adafruit_display_text.label + + # no need to check the active group within the Group class + # since the caller of draw already did + splash = displayio.Group( + max_size=20, check_active_group_ref=False, auto_write=False + ) + + self.__lock.acquire() + + # since the text starts from the bottom, + # we need to find an offset if there are empty spots + + # handling of output_values already ensures that there are + # max CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX items in output_values deque + num_empty_slots = CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX - len( + self.__output_values + ) + curr_y = CONSTANTS.CLUE_TERMINAL_Y_OFFSET + ( + CONSTANTS.CLUE_TERMINAL_LINE_HEIGHT * num_empty_slots + ) + for output_val in reversed(self.__output_values): + if len(output_val): + text_area = adafruit_display_text.label.Label( + terminalio.FONT, text=output_val, line_spacing=1.25 + ) + + text_area.y = curr_y + text_area.x = CONSTANTS.CLUE_TERMINAL_X_OFFSET + splash.append(text_area) + + curr_y += CONSTANTS.CLUE_TERMINAL_LINE_HEIGHT + + self.__lock.release() + + splash._Group__draw(img=self.__base_img.copy()) + + def add_str_to_terminal(self, curr_display_string=""): + + line_break_amt = CONSTANTS.CLUE_TERMINAL_LINE_BREAK_AMT + + # characters until forced newline + newline_expected_val = line_break_amt + out_str = "" + new_strs = [] + for idx, d in enumerate(curr_display_string): + # handle custom or forced newline + if d == "\n" or newline_expected_val == 0: + new_strs.append(out_str) + out_str = "" + newline_expected_val = line_break_amt + + # if it was a custom newline, no longer need to + # process the character + if d == "\n": + continue + else: + newline_expected_val -= 1 + out_str += d + new_strs.append(out_str) + + self.__create_newline(new_strs) + + # only go ahead to draw the screen + # if the terminal is actively on the screen + if board.DISPLAY.active_group == None: + self.__draw() diff --git a/src/base_circuitpython/terminalio.py b/src/base_circuitpython/terminalio.py index 58abb7fc4..ba6ca6159 100644 --- a/src/base_circuitpython/terminalio.py +++ b/src/base_circuitpython/terminalio.py @@ -1,15 +1,15 @@ -# overriden terminalio library, which uses -# adafruit_bitmap_font to load the default font - -# original implementation docs for terminalio: -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/terminalio/__init__.html - -from adafruit_bitmap_font import bitmap_font # pylint: disable=wrong-import-position - -import os -import pathlib - -abs_path = pathlib.Path(__file__).parent.absolute() - -# load default font -FONT = bitmap_font.load_font(os.path.join(abs_path, "fonts", "ter-u12n.bdf")) +# overriden terminalio library, which uses +# adafruit_bitmap_font to load the default font + +# original implementation docs for terminalio: +# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/terminalio/__init__.html + +from adafruit_bitmap_font import bitmap_font # pylint: disable=wrong-import-position + +import os +import pathlib + +abs_path = pathlib.Path(__file__).parent.absolute() + +# load default font +FONT = bitmap_font.load_font(os.path.join(abs_path, "fonts", "ter-u12n.bdf")) diff --git a/src/base_circuitpython/test/test_terminal_handler.py b/src/base_circuitpython/test/test_terminal_handler.py index 22a8986af..cb9f97338 100644 --- a/src/base_circuitpython/test/test_terminal_handler.py +++ b/src/base_circuitpython/test/test_terminal_handler.py @@ -1,61 +1,61 @@ -import pytest - -import base_circuitpython.terminal_handler -from common import utils -from unittest import mock - - -class TestTerminal(object): - def setup_method(self): - - utils.send_to_simulator = mock.Mock() - - @pytest.mark.parametrize( - "str_vals", - [ - (["potato", "Lorem ipsum"]), - ([""]), - ([".......", "123456", "", "test"]), - (["123456789 123456789 123456789 1234567"]), - ], - ) - def test_single_line(self, str_vals): - self.terminal = base_circuitpython.terminal_handler.Terminal() - for s in str_vals: - self.terminal.add_str_to_terminal(s) - - result = list(self.terminal._Terminal__output_values) - result.reverse() - - # output should just be the reversed version since all lines - # don't have newline or exceed 37 characters - assert str_vals == result - - @pytest.mark.parametrize( - "str_vals, expected", - [ - ( - ["\nCode done running. Waiting for reload."], - [".", "Code done running. Waiting for reload", ""], - ), - ( - ["TESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTEST"], - ["ESTTESTTEST", "TESTTESTTESTTESTTESTTESTTESTTESTTESTT"], - ), - ( - ["\nCode done running. Waiting for reload.", "........."], - [".........", ".", "Code done running. Waiting for reload", ""], - ), - ( - ["TEST TEST TEST TEST TEST ", "..."], - ["...", " ", "TEST TEST TEST TEST TEST "], - ), - ], - ) - def test_multiline(self, str_vals, expected): - self.terminal = base_circuitpython.terminal_handler.Terminal() - for s in str_vals: - self.terminal.add_str_to_terminal(s) - - result = list(self.terminal._Terminal__output_values) - assert result == expected +import pytest + +import base_circuitpython.terminal_handler +from common import utils +from unittest import mock + + +class TestTerminal(object): + def setup_method(self): + + utils.send_to_simulator = mock.Mock() + + @pytest.mark.parametrize( + "str_vals", + [ + (["potato", "Lorem ipsum"]), + ([""]), + ([".......", "123456", "", "test"]), + (["123456789 123456789 123456789 1234567"]), + ], + ) + def test_single_line(self, str_vals): + self.terminal = base_circuitpython.terminal_handler.Terminal() + for s in str_vals: + self.terminal.add_str_to_terminal(s) + + result = list(self.terminal._Terminal__output_values) + result.reverse() + + # output should just be the reversed version since all lines + # don't have newline or exceed 37 characters + assert str_vals == result + + @pytest.mark.parametrize( + "str_vals, expected", + [ + ( + ["\nCode done running. Waiting for reload."], + [".", "Code done running. Waiting for reload", ""], + ), + ( + ["TESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTEST"], + ["ESTTESTTEST", "TESTTESTTESTTESTTESTTESTTESTTESTTESTT"], + ), + ( + ["\nCode done running. Waiting for reload.", "........."], + [".........", ".", "Code done running. Waiting for reload", ""], + ), + ( + ["TEST TEST TEST TEST TEST ", "..."], + ["...", " ", "TEST TEST TEST TEST TEST "], + ), + ], + ) + def test_multiline(self, str_vals, expected): + self.terminal = base_circuitpython.terminal_handler.Terminal() + for s in str_vals: + self.terminal.add_str_to_terminal(s) + + result = list(self.terminal._Terminal__output_values) + assert result == expected diff --git a/src/check_if_venv.py b/src/check_if_venv.py index 45fd3dd2b..6055fa258 100644 --- a/src/check_if_venv.py +++ b/src/check_if_venv.py @@ -1,11 +1,11 @@ -# from https://stackoverflow.com/questions/1871549/determine-if-python-is-running-inside-virtualenv -import sys - -isVenv = hasattr(sys, "real_prefix") or ( - hasattr(sys, "base_prefix") and sys.base_prefix != sys.prefix -) - -# prints result for frontend to read -# 1 -> is a venv -# 0 -> is NOT a venv -print(int(isVenv)) +# from https://stackoverflow.com/questions/1871549/determine-if-python-is-running-inside-virtualenv +import sys + +isVenv = hasattr(sys, "real_prefix") or ( + hasattr(sys, "base_prefix") and sys.base_prefix != sys.prefix +) + +# prints result for frontend to read +# 1 -> is a venv +# 0 -> is NOT a venv +print(int(isVenv)) diff --git a/src/clue/__init__.py b/src/clue/__init__.py index c34e9688b..43f8ed82b 100644 --- a/src/clue/__init__.py +++ b/src/clue/__init__.py @@ -1 +1 @@ -import base_circuitpython +import base_circuitpython diff --git a/src/clue/adafruit_clue.py b/src/clue/adafruit_clue.py index 059573021..e7a578d11 100644 --- a/src/clue/adafruit_clue.py +++ b/src/clue/adafruit_clue.py @@ -1,852 +1,852 @@ -# The MIT License (MIT) -# -# Copyright (c) 2020 Kattni Rembor for Adafruit Industries -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -""" -`adafruit_clue` -================================================================================ - -A high level library representing all the features of the Adafruit CLUE. - - -* Author(s): Kattni Rembor - -Implementation Notes --------------------- - -**Hardware:** - -.. "* `Adafruit CLUE - nRF52840 Express with Bluetooth LE `_" - -**Software and Dependencies:** - -* Adafruit CircuitPython firmware for the supported boards: - https://github.com/adafruit/circuitpython/releases - - * Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice - * Adafruit's Register library: https://github.com/adafruit/Adafruit_CircuitPython_Register - * Adafruit's LSM6DS CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_LSM6DS - * Adafruit's LIS3MDL CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_LIS3MDL - * Adafruit's APDS9960 CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_APDS9960 - * Adafruit's BMP280 CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_BMP280 - * Adafruit's SHT31D CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_SHT31D - * Adafruit's NeoPixel CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_NeoPixel -""" - -import common -from base_circuitpython import base_cp_constants as CONSTANTS -import neopixel -import time -import array -import math -from PIL import Image -import pathlib -import sys -import os -import board - -abs_path = pathlib.Path(__file__).parent.absolute() -sys.path.insert(0, os.path.join(abs_path)) - -# REVISED VERSION OF THE ADAFRUIT CLUE LIBRARY FOR DSX - -__version__ = "0.0.0-auto.0" -__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_CLUE.git" - - -class _ClueSimpleTextDisplay: - """Easily display lines of text on CLUE display.""" - - def __init__( - self, - title=None, - title_color=0xFFFFFF, - title_scale=1, # pylint: disable=too-many-arguments - text_scale=1, - font=None, - colors=None, - ): - import displayio - import terminalio - from adafruit_display_text import label - - if not colors: - colors = ( - Clue.VIOLET, - Clue.GREEN, - Clue.RED, - Clue.CYAN, - Clue.ORANGE, - Clue.BLUE, - Clue.MAGENTA, - Clue.SKY, - Clue.YELLOW, - Clue.PURPLE, - ) - - self._display = board.DISPLAY - self._colors = colors - self._label = label - self._font = terminalio.FONT - if font: - self._font = font - self.text_scale = text_scale - self.text_group = displayio.Group(max_size=20, scale=self.text_scale) - if title: - # Fail gracefully if title is longer than 60 characters. - if len(title) > 60: - raise ValueError("Title must be 60 characters or less.") - - title = label.Label( - self._font, - text=title, - max_glyphs=60, - color=title_color, - scale=title_scale, - ) - title.x = 0 - title.y = 8 * self.text_scale - self._y = title.y + 18 * self.text_scale - - self.text_group.append(title) - else: - self._y = 3 * self.text_scale - - self._lines = [] - for num in range(1): - self._lines.append(self.add_text_line(color=colors[num % len(colors)])) - - def __getitem__(self, item): - """Fetch the Nth text line Group""" - if len(self._lines) - 1 < item: - for _ in range(item - (len(self._lines) - 1)): - self._lines.append( - self.add_text_line(color=self._colors[item % len(self._colors)]) - ) - return self._lines[item] - - def add_text_line(self, color=0xFFFFFF): - """Adds a line on the display of the specified color and returns the label object.""" - text_label = self._label.Label(self._font, text="", max_glyphs=45, color=color) - text_label.x = 0 - text_label.y = self._y - self._y = text_label.y + 13 * self.text_scale - self.text_group.append(text_label) - - return text_label - - def show(self): - """Call show() to display the data list.""" - self._display.show(self.text_group) - - def show_terminal(self): - """Revert to terminalio screen.""" - self._display.show(None) - - -class Clue: # pylint: disable=too-many-instance-attributes, too-many-public-methods - """Represents a single CLUE.""" - - # Color variables available for import. - RED = (255, 0, 0) - YELLOW = (255, 255, 0) - ORANGE = (255, 150, 0) - GREEN = (0, 255, 0) - TEAL = (0, 255, 120) - CYAN = (0, 255, 255) - BLUE = (0, 0, 255) - PURPLE = (180, 0, 255) - MAGENTA = (255, 0, 150) - WHITE = (255, 255, 255) - BLACK = (0, 0, 0) - - GOLD = (255, 222, 30) - PINK = (242, 90, 255) - AQUA = (50, 255, 255) - JADE = (0, 255, 40) - AMBER = (255, 100, 0) - VIOLET = (255, 0, 255) - SKY = (0, 180, 255) - - RAINBOW = (RED, ORANGE, YELLOW, GREEN, BLUE, PURPLE) - - def __init__(self): - self.__state = {} - self.__state[CONSTANTS.CLUE_STATE.BUTTON_A] = False - self.__state[CONSTANTS.CLUE_STATE.BUTTON_B] = False - self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS] = set() - self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE] = 1013.25 - self.__state[CONSTANTS.CLUE_STATE.TEMPERATURE] = 0 - self.__state[CONSTANTS.CLUE_STATE.PROXIMITY] = 0 - self.__state[CONSTANTS.CLUE_STATE.GESTURE] = "" - self.__state[CONSTANTS.CLUE_STATE.HUMIDITY] = 0 - self.__state[CONSTANTS.CLUE_STATE.PRESSURE] = 1013 - self.__state[CONSTANTS.CLUE_STATE.PIXEL] = neopixel.NeoPixel( - pin=CONSTANTS.CLUE_PIN, n=1, pixel_order=neopixel.RGB - ) - # Accelerometer - self.__state[CONSTANTS.CLUE_STATE.MOTION_X] = 0 - self.__state[CONSTANTS.CLUE_STATE.MOTION_Y] = 0 - self.__state[CONSTANTS.CLUE_STATE.MOTION_Z] = 0 - # Light/color sensor - self.__state[CONSTANTS.CLUE_STATE.LIGHT_R] = 0 - self.__state[CONSTANTS.CLUE_STATE.LIGHT_G] = 0 - self.__state[CONSTANTS.CLUE_STATE.LIGHT_B] = 0 - self.__state[CONSTANTS.CLUE_STATE.LIGHT_C] = 0 - # Magnetometer - self.__state[CONSTANTS.CLUE_STATE.MAGNET_X] = 0 - self.__state[CONSTANTS.CLUE_STATE.MAGNET_Y] = 0 - self.__state[CONSTANTS.CLUE_STATE.MAGNET_Z] = 0 - # Gyroscope - self.__state[CONSTANTS.CLUE_STATE.GYRO_X] = 0 - self.__state[CONSTANTS.CLUE_STATE.GYRO_Y] = 0 - self.__state[CONSTANTS.CLUE_STATE.GYRO_Z] = 0 - # LEDs - self.__state[CONSTANTS.CLUE_STATE.RED_LED] = False - self.__state[CONSTANTS.CLUE_STATE.WHITE_LEDS] = False - - self.button_mapping = { - CONSTANTS.CLUE_STATE.BUTTON_A: "A", - CONSTANTS.CLUE_STATE.BUTTON_B: "B", - } - self.display = board.DISPLAY - - @property - def button_a(self): - """``True`` when Button A is pressed. ``False`` if not. - This example prints when button A is pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.button_a: - print("Button A pressed") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_BUTTON_A - ) - return self.__state[CONSTANTS.CLUE_STATE.BUTTON_A] - - @property - def button_b(self): - """``True`` when Button B is pressed. ``False`` if not. - This example prints when button B is pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.button_b: - print("Button B pressed") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_BUTTON_B - ) - return self.__state[CONSTANTS.CLUE_STATE.BUTTON_B] - - @property - def were_pressed(self): - """Returns a set of the buttons that have been pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print(clue.were_pressed) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_WERE_PRESSED - ) - ret = self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS].copy() - self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS].clear() - return ret - - @property - def acceleration(self): - """Obtain acceleration data from the x, y and z axes. - This example prints the values. Try moving the board to see how the printed values change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Accel: {:.2f} {:.2f} {:.2f}".format(*clue.acceleration)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_ACCELERATION - ) - return ( - self.__state[CONSTANTS.CLUE_STATE.MOTION_X], - self.__state[CONSTANTS.CLUE_STATE.MOTION_Y], - self.__state[CONSTANTS.CLUE_STATE.MOTION_Z], - ) - - def shake(self, shake_threshold=30, avg_count=10, total_delay=0.1): - """Detect when the accelerometer is shaken. Optional parameters: - :param shake_threshold: Increase or decrease to change shake sensitivity. This - requires a minimum value of 10. 10 is the total - acceleration if the board is not moving, therefore - anything less than 10 will erroneously report a constant - shake detected. (Default 30) - :param avg_count: The number of readings taken and used for the average - acceleration. (Default 10) - :param total_delay: The total time in seconds it takes to obtain avg_count - readings from acceleration. (Default 0.1) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SHAKE - ) - is_shaken = self.__state[CONSTANTS.CLUE_STATE.GESTURE] == CONSTANTS.SHAKE - return is_shaken - - @property - def color(self): - """The red, green, blue, and clear light values. (r, g, b, c) - This example prints the values. Try holding something up to the sensor to see the values - change. Works best with white LEDs enabled. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Color: R: {} G: {} B: {} C: {}".format(*clue.color)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_COLOR - ) - return ( - self.__state[CONSTANTS.CLUE_STATE.LIGHT_R], - self.__state[CONSTANTS.CLUE_STATE.LIGHT_G], - self.__state[CONSTANTS.CLUE_STATE.LIGHT_B], - self.__state[CONSTANTS.CLUE_STATE.LIGHT_C], - ) - - @property - def temperature(self): - """The temperature in degrees Celsius. - This example prints the value. Try touching the sensor to see the value change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - print("Temperature: {:.1f}C".format(clue.temperature)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TEMPERATURE - ) - return self.__state[CONSTANTS.CLUE_STATE.TEMPERATURE] - - @property - def magnetic(self): - """Obtain x, y, z magnetic values in microteslas. - This example prints the values. Try moving the board to see how the printed values change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Magnetic: {:.3f} {:.3f} {:.3f}".format(*clue.magnetic)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_MAGNETIC - ) - return ( - self.__state[CONSTANTS.CLUE_STATE.MAGNET_X], - self.__state[CONSTANTS.CLUE_STATE.MAGNET_Y], - self.__state[CONSTANTS.CLUE_STATE.MAGNET_Z], - ) - - @property - def proximity(self): - """A relative proximity to the sensor in values from 0 - 255. - This example prints the value. Try moving your hand towards and away from the front of the - board to see how the printed values change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Proximity: {}".format(clue.proximity)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_PROXIMITY - ) - return self.__state[CONSTANTS.CLUE_STATE.PROXIMITY] - - @property - def gyro(self): - """Obtain x, y, z angular velocity values in degrees/second. - This example prints the values. Try moving the board to see how the printed values change. - print("Gyro: {:.2f} {:.2f} {:.2f}".format(*clue.gyro)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_GYRO - ) - return ( - self.__state[CONSTANTS.CLUE_STATE.GYRO_X], - self.__state[CONSTANTS.CLUE_STATE.GYRO_Y], - self.__state[CONSTANTS.CLUE_STATE.GYRO_Z], - ) - - @property - def gesture(self): - """A gesture code if gesture is detected. Shows ``0`` if no gesture detected. - ``1`` if an UP gesture is detected, ``2`` if DOWN, ``3`` if LEFT, and ``4`` if RIGHT. - This example prints the gesture values. Try moving your hand up, down, left or right over - the sensor to see the value change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Gesture: {}".format(clue.gesture)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_GESTURE - ) - gesture_mapping = {"": 0, "up": 1, "down": 2, "left": 3, "right": 4} - return gesture_mapping.get(self.__state[CONSTANTS.CLUE_STATE.GESTURE], 0) - - @property - def humidity(self): - """The measured relative humidity in percent. - This example prints the value. Try breathing on the sensor to see the values change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Humidity: {:.1f}%".format(clue.humidity)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_HUMIDITY - ) - return self.__state[CONSTANTS.CLUE_STATE.HUMIDITY] - - @property - def pressure(self): - """The barometric pressure in hectoPascals. - This example prints the value. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - print("Pressure: {:.3f}hPa".format(clue.pressure)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_PRESSURE - ) - return self.__state[CONSTANTS.CLUE_STATE.PRESSURE] - - @property - def altitude(self): - """The altitude in meters based on the sea level pressure at your location. You must set - ``sea_level_pressure`` to receive an accurate reading. - This example prints the value. Try moving the board vertically to see the value change. - .. code-block:: python - from adafruit_clue import clue - clue.sea_level_pressure = 1015 - print("Altitude: {:.1f}m".format(clue.altitude)) - """ - # National Oceanic and Atmospheric Administration (NOAA) formula for converting atmospheric pressure to pressure altitude. - OUTSIDE_MULTIPLER_CONSTANT = 44330 - POWER_CONSTANT = 0.1903 - WHOLE_CONSTANT = 1 - - altitude = OUTSIDE_MULTIPLER_CONSTANT * ( - WHOLE_CONSTANT - - math.pow( - self.__state[CONSTANTS.CLUE_STATE.PRESSURE] - / self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE], - POWER_CONSTANT, - ) - ) - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_ALTITUDE - ) - return altitude - - @property - def sea_level_pressure(self): - """Set to the pressure at sea level at your location, before reading altitude for - the most accurate altitude measurement. - This example prints the value. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - clue.sea_level_pressure = 1015 - print("Pressure: {:.3f}hPa".format(clue.pressure)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SEA_LEVEL_PRESSURE - ) - return self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE] - - @sea_level_pressure.setter - def sea_level_pressure(self, value): - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SEA_LEVEL_PRESSURE - ) - self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE] = value - - @property - def pixel(self): - """The NeoPixel RGB LED. - This example turns the NeoPixel purple. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - clue.pixel.fill((255, 0, 255)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_PIXEL - ) - return self.__state[CONSTANTS.CLUE_STATE.PIXEL] - - @property - def touch_0(self): - """Not Implemented! - - Detect touch on capacitive touch pad 0. - .. image :: ../docs/_static/pad_0.jpg - :alt: Pad 0 - This example prints when pad 0 is touched. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.touch_0: - print("Touched pad 0") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TOUCH - ) - common.utils.print_for_unimplemented_functions("touch_0") - - @property - def touch_1(self): - """Not Implemented! - - Detect touch on capacitive touch pad 1. - .. image :: ../docs/_static/pad_1.jpg - :alt: Pad 1 - This example prints when pad 1 is touched. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.touch_1: - print("Touched pad 1") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TOUCH - ) - common.utils.print_for_unimplemented_functions("touch_1") - - @property - def touch_2(self): - """Not Implemented! - - Detect touch on capacitive touch pad 2. - .. image :: ../docs/_static/pad_2.jpg - :alt: Pad 2 - This example prints when pad 2 is touched. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.touch_2: - print("Touched pad 2") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TOUCH - ) - common.utils.print_for_unimplemented_functions("touch_2") - - @property - def white_leds(self): - """The red led next to the USB plug labeled LED. - .. image :: ../docs/_static/white_leds.jpg - :alt: White LEDs - This example turns on the white LEDs. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - clue.white_leds = True - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_WHITE_LEDS - ) - return self.__state[CONSTANTS.CLUE_STATE.WHITE_LEDS] - - @white_leds.setter - def white_leds(self, value): - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_WHITE_LEDS - ) - self.__set_leds(CONSTANTS.CLUE_STATE.WHITE_LEDS, value) - - @property - def red_led(self): - """The red led next to the USB plug labeled LED. - .. image :: ../docs/_static/red_led.jpg - :alt: Red LED - This example turns on the red LED. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - clue.red_led = True - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_RED_LED - ) - return self.__state[CONSTANTS.CLUE_STATE.RED_LED] - - @red_led.setter - def red_led(self, value): - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_RED_LED - ) - self.__set_leds(CONSTANTS.CLUE_STATE.RED_LED, value) - - def play_tone(self, frequency, duration): - """ Not Implemented! - Produce a tone using the speaker. Try changing frequency to change - the pitch of the tone. - :param int frequency: The frequency of the tone in Hz - :param float duration: The duration of the tone in seconds - .. image :: ../docs/_static/speaker.jpg - :alt: Speaker - This example plays a 880 Hz tone for a duration of 1 second. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - clue.play_tone(880, 1) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions(Clue.play_tone.__name__) - - def start_tone(self, frequency): - """ Not Implemented! - Produce a tone using the speaker. Try changing frequency to change - the pitch of the tone. - :param int frequency: The frequency of the tone in Hz - .. image :: ../docs/_static/speaker.jpg - :alt: Speaker - This example plays a 523Hz tone when button A is pressed and a 587Hz tone when button B is - pressed, only while the buttons are being pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.button_a: - clue.start_tone(523) - elif clue.button_b: - clue.start_tone(587) - else: - clue.stop_tone() - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions(Clue.start_tone.__name__) - - def stop_tone(self): - """ Not Implemented! - Use with start_tone to stop the tone produced. - .. image :: ../docs/_static/speaker.jpg - :alt: Speaker - This example plays a 523Hz tone when button A is pressed and a 587Hz tone when button B is - pressed, only while the buttons are being pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.button_a: - clue.start_tone(523) - elif clue.button_b: - clue.start_tone(587) - else: - clue.stop_tone() - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions(Clue.stop_tone.__name__) - - @property - def sound_level(self): - """Not Implemented! - Obtain the sound level from the microphone (sound sensor). - .. image :: ../docs/_static/microphone.jpg - :alt: Microphone (sound sensor) - This example prints the sound levels. Try clapping or blowing on - the microphone to see the levels change. - .. code-block:: python - from adafruit_clue import clue - while True: - print(clue.sound_level) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions("sound_level") - - def loud_sound(self, sound_threshold=200): - """Not Implemented! - Utilise a loud sound as an input. - :param int sound_threshold: Threshold sound level must exceed to return true (Default: 200) - .. image :: ../docs/_static/microphone.jpg - :alt: Microphone (sound sensor) - This example turns the NeoPixel LED blue each time you make a loud sound. - Try clapping or blowing onto the microphone to trigger it. - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.loud_sound(): - clue.pixel.fill((0, 50, 0)) - else: - clue.pixel.fill(0) - You may find that the code is not responding how you would like. - If this is the case, you can change the loud sound threshold to - make it more or less responsive. Setting it to a higher number - means it will take a louder sound to trigger. Setting it to a - lower number will take a quieter sound to trigger. The following - example shows the threshold being set to a higher number than - the default. - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.loud_sound(sound_threshold=300): - clue.pixel.fill((0, 50, 0)) - else: - clue.pixel.fill(0) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions(Clue.loud_sound.__name__) - - @staticmethod - def simple_text_display( - title=None, - title_color=(255, 255, 255), - title_scale=1, # pylint: disable=too-many-arguments - text_scale=1, - font=None, - colors=None, - ): - """Display lines of text on the CLUE display. Lines of text are created in order as shown - in the example below. If you skip a number, the line will be shown blank on the display, - e.g. if you include ``[0]`` and ``[2]``, the second line on the display will be empty, and - the text specified for lines 0 and 2 will be displayed on the first and third line. - Remember, Python begins counting at 0, so the first line on the display is 0 in the code. - - Setup occurs before the loop. For data to be dynamically updated on the display, you must - include the data call in the loop by using ``.text =``. For example, if setup is saved as - ``clue_data = display_clue_data()`` then ``clue_data[0].text = clue.proximity`` must be - inside the ``while True:`` loop for the proximity data displayed to update as the - values change. You must call ``show()`` at the end of the list for anything to display. - See example below for usage. - - :param str title: The title displayed above the data. Set ``title="Title text"`` to provide - a title. Defaults to None. - :param title_color: The color of the title. Not necessary if no title is provided. Defaults - to white (255, 255, 255). - :param int title_scale: Scale the size of the title. Not necessary if no title is provided. - Defaults to 1. - :param int text_scale: Scale the size of the data lines. Scales the title as well. - Defaults to 1. - :param str font: The font to use to display the title and data. Defaults to built in - ``terminalio.FONT``. - :param colors: A list of colors for the lines of data on the display. If you provide a - single color, all lines will be that color. Otherwise it will cycle through - the list you provide if the list is less than the number of lines displayed. - Default colors are used if ``colors`` is not set. For example, if creating - two lines of data, ``colors=((255, 255, 255), (255, 0, 0))`` would set the - first line white and the second line red, and if you created four lines of - data with the same setup, it would alternate white and red. - - .. image :: ../docs/_static/display_clue_data.jpg - :alt: Display Clue Data demo - - This example displays three lines with acceleration, gyro and magnetic data on the display. - Remember to call ``show()`` after the list to update the display. - - .. code-block:: python - - from adafruit_clue import clue - - clue_data = clue.simple_text_display(title="CLUE Sensor Data!", title_scale=2) - - while True: - clue_data[0].text = "Acceleration: {:.2f} {:.2f} {:.2f}".format(*clue.acceleration) - clue_data[1].text = "Gyro: {:.2f} {:.2f} {:.2f}".format(*clue.gyro) - clue_data[2].text = "Magnetic: {:.3f} {:.3f} {:.3f}".format(*clue.magnetic) - clue_data.show() - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TEXT_DISPLAY - ) - return _ClueSimpleTextDisplay( - title=title, - title_color=title_color, - title_scale=title_scale, - text_scale=text_scale, - font=font, - colors=colors, - ) - - def update_state(self, new_state): - for event in new_state.keys(): - if event in CONSTANTS.EXPECTED_INPUT_BUTTONS: - self.__update_button(event, new_state.get(event)) - elif event in CONSTANTS.ALL_EXPECTED_INPUT_EVENTS: - if self.__state[event] != new_state[event]: - self.__state[event] = new_state.get(event) - - # helpers - def __update_button(self, button, value): - if value: - self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS].add( - self.button_mapping[button] - ) - self.__state[button] = value - - def __set_leds(self, led, value): - value = bool(value) - self.__state[led] = value - sendable_json = {led: value} - if common.utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - sendable_json, CONSTANTS.CLUE - ) - else: - common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) - - -clue = Clue() # pylint: disable=invalid-name -"""Object that is automatically created on import. - - To use, simply import it from the module: - - .. code-block:: python - - from adafruit_clue import clue -""" +# The MIT License (MIT) +# +# Copyright (c) 2020 Kattni Rembor for Adafruit Industries +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +""" +`adafruit_clue` +================================================================================ + +A high level library representing all the features of the Adafruit CLUE. + + +* Author(s): Kattni Rembor + +Implementation Notes +-------------------- + +**Hardware:** + +.. "* `Adafruit CLUE - nRF52840 Express with Bluetooth LE `_" + +**Software and Dependencies:** + +* Adafruit CircuitPython firmware for the supported boards: + https://github.com/adafruit/circuitpython/releases + + * Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice + * Adafruit's Register library: https://github.com/adafruit/Adafruit_CircuitPython_Register + * Adafruit's LSM6DS CircuitPython Library: + https://github.com/adafruit/Adafruit_CircuitPython_LSM6DS + * Adafruit's LIS3MDL CircuitPython Library: + https://github.com/adafruit/Adafruit_CircuitPython_LIS3MDL + * Adafruit's APDS9960 CircuitPython Library: + https://github.com/adafruit/Adafruit_CircuitPython_APDS9960 + * Adafruit's BMP280 CircuitPython Library: + https://github.com/adafruit/Adafruit_CircuitPython_BMP280 + * Adafruit's SHT31D CircuitPython Library: + https://github.com/adafruit/Adafruit_CircuitPython_SHT31D + * Adafruit's NeoPixel CircuitPython Library: + https://github.com/adafruit/Adafruit_CircuitPython_NeoPixel +""" + +import common +from base_circuitpython import base_cp_constants as CONSTANTS +import neopixel +import time +import array +import math +from PIL import Image +import pathlib +import sys +import os +import board + +abs_path = pathlib.Path(__file__).parent.absolute() +sys.path.insert(0, os.path.join(abs_path)) + +# REVISED VERSION OF THE ADAFRUIT CLUE LIBRARY FOR DSX + +__version__ = "0.0.0-auto.0" +__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_CLUE.git" + + +class _ClueSimpleTextDisplay: + """Easily display lines of text on CLUE display.""" + + def __init__( + self, + title=None, + title_color=0xFFFFFF, + title_scale=1, # pylint: disable=too-many-arguments + text_scale=1, + font=None, + colors=None, + ): + import displayio + import terminalio + from adafruit_display_text import label + + if not colors: + colors = ( + Clue.VIOLET, + Clue.GREEN, + Clue.RED, + Clue.CYAN, + Clue.ORANGE, + Clue.BLUE, + Clue.MAGENTA, + Clue.SKY, + Clue.YELLOW, + Clue.PURPLE, + ) + + self._display = board.DISPLAY + self._colors = colors + self._label = label + self._font = terminalio.FONT + if font: + self._font = font + self.text_scale = text_scale + self.text_group = displayio.Group(max_size=20, scale=self.text_scale) + if title: + # Fail gracefully if title is longer than 60 characters. + if len(title) > 60: + raise ValueError("Title must be 60 characters or less.") + + title = label.Label( + self._font, + text=title, + max_glyphs=60, + color=title_color, + scale=title_scale, + ) + title.x = 0 + title.y = 8 * self.text_scale + self._y = title.y + 18 * self.text_scale + + self.text_group.append(title) + else: + self._y = 3 * self.text_scale + + self._lines = [] + for num in range(1): + self._lines.append(self.add_text_line(color=colors[num % len(colors)])) + + def __getitem__(self, item): + """Fetch the Nth text line Group""" + if len(self._lines) - 1 < item: + for _ in range(item - (len(self._lines) - 1)): + self._lines.append( + self.add_text_line(color=self._colors[item % len(self._colors)]) + ) + return self._lines[item] + + def add_text_line(self, color=0xFFFFFF): + """Adds a line on the display of the specified color and returns the label object.""" + text_label = self._label.Label(self._font, text="", max_glyphs=45, color=color) + text_label.x = 0 + text_label.y = self._y + self._y = text_label.y + 13 * self.text_scale + self.text_group.append(text_label) + + return text_label + + def show(self): + """Call show() to display the data list.""" + self._display.show(self.text_group) + + def show_terminal(self): + """Revert to terminalio screen.""" + self._display.show(None) + + +class Clue: # pylint: disable=too-many-instance-attributes, too-many-public-methods + """Represents a single CLUE.""" + + # Color variables available for import. + RED = (255, 0, 0) + YELLOW = (255, 255, 0) + ORANGE = (255, 150, 0) + GREEN = (0, 255, 0) + TEAL = (0, 255, 120) + CYAN = (0, 255, 255) + BLUE = (0, 0, 255) + PURPLE = (180, 0, 255) + MAGENTA = (255, 0, 150) + WHITE = (255, 255, 255) + BLACK = (0, 0, 0) + + GOLD = (255, 222, 30) + PINK = (242, 90, 255) + AQUA = (50, 255, 255) + JADE = (0, 255, 40) + AMBER = (255, 100, 0) + VIOLET = (255, 0, 255) + SKY = (0, 180, 255) + + RAINBOW = (RED, ORANGE, YELLOW, GREEN, BLUE, PURPLE) + + def __init__(self): + self.__state = {} + self.__state[CONSTANTS.CLUE_STATE.BUTTON_A] = False + self.__state[CONSTANTS.CLUE_STATE.BUTTON_B] = False + self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS] = set() + self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE] = 1013.25 + self.__state[CONSTANTS.CLUE_STATE.TEMPERATURE] = 0 + self.__state[CONSTANTS.CLUE_STATE.PROXIMITY] = 0 + self.__state[CONSTANTS.CLUE_STATE.GESTURE] = "" + self.__state[CONSTANTS.CLUE_STATE.HUMIDITY] = 0 + self.__state[CONSTANTS.CLUE_STATE.PRESSURE] = 1013 + self.__state[CONSTANTS.CLUE_STATE.PIXEL] = neopixel.NeoPixel( + pin=CONSTANTS.CLUE_PIN, n=1, pixel_order=neopixel.RGB + ) + # Accelerometer + self.__state[CONSTANTS.CLUE_STATE.MOTION_X] = 0 + self.__state[CONSTANTS.CLUE_STATE.MOTION_Y] = 0 + self.__state[CONSTANTS.CLUE_STATE.MOTION_Z] = 0 + # Light/color sensor + self.__state[CONSTANTS.CLUE_STATE.LIGHT_R] = 0 + self.__state[CONSTANTS.CLUE_STATE.LIGHT_G] = 0 + self.__state[CONSTANTS.CLUE_STATE.LIGHT_B] = 0 + self.__state[CONSTANTS.CLUE_STATE.LIGHT_C] = 0 + # Magnetometer + self.__state[CONSTANTS.CLUE_STATE.MAGNET_X] = 0 + self.__state[CONSTANTS.CLUE_STATE.MAGNET_Y] = 0 + self.__state[CONSTANTS.CLUE_STATE.MAGNET_Z] = 0 + # Gyroscope + self.__state[CONSTANTS.CLUE_STATE.GYRO_X] = 0 + self.__state[CONSTANTS.CLUE_STATE.GYRO_Y] = 0 + self.__state[CONSTANTS.CLUE_STATE.GYRO_Z] = 0 + # LEDs + self.__state[CONSTANTS.CLUE_STATE.RED_LED] = False + self.__state[CONSTANTS.CLUE_STATE.WHITE_LEDS] = False + + self.button_mapping = { + CONSTANTS.CLUE_STATE.BUTTON_A: "A", + CONSTANTS.CLUE_STATE.BUTTON_B: "B", + } + self.display = board.DISPLAY + + @property + def button_a(self): + """``True`` when Button A is pressed. ``False`` if not. + This example prints when button A is pressed. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + if clue.button_a: + print("Button A pressed") + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_BUTTON_A + ) + return self.__state[CONSTANTS.CLUE_STATE.BUTTON_A] + + @property + def button_b(self): + """``True`` when Button B is pressed. ``False`` if not. + This example prints when button B is pressed. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + if clue.button_b: + print("Button B pressed") + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_BUTTON_B + ) + return self.__state[CONSTANTS.CLUE_STATE.BUTTON_B] + + @property + def were_pressed(self): + """Returns a set of the buttons that have been pressed. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + print(clue.were_pressed) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_WERE_PRESSED + ) + ret = self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS].copy() + self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS].clear() + return ret + + @property + def acceleration(self): + """Obtain acceleration data from the x, y and z axes. + This example prints the values. Try moving the board to see how the printed values change. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + print("Accel: {:.2f} {:.2f} {:.2f}".format(*clue.acceleration)) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_ACCELERATION + ) + return ( + self.__state[CONSTANTS.CLUE_STATE.MOTION_X], + self.__state[CONSTANTS.CLUE_STATE.MOTION_Y], + self.__state[CONSTANTS.CLUE_STATE.MOTION_Z], + ) + + def shake(self, shake_threshold=30, avg_count=10, total_delay=0.1): + """Detect when the accelerometer is shaken. Optional parameters: + :param shake_threshold: Increase or decrease to change shake sensitivity. This + requires a minimum value of 10. 10 is the total + acceleration if the board is not moving, therefore + anything less than 10 will erroneously report a constant + shake detected. (Default 30) + :param avg_count: The number of readings taken and used for the average + acceleration. (Default 10) + :param total_delay: The total time in seconds it takes to obtain avg_count + readings from acceleration. (Default 0.1) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_SHAKE + ) + is_shaken = self.__state[CONSTANTS.CLUE_STATE.GESTURE] == CONSTANTS.SHAKE + return is_shaken + + @property + def color(self): + """The red, green, blue, and clear light values. (r, g, b, c) + This example prints the values. Try holding something up to the sensor to see the values + change. Works best with white LEDs enabled. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + print("Color: R: {} G: {} B: {} C: {}".format(*clue.color)) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_COLOR + ) + return ( + self.__state[CONSTANTS.CLUE_STATE.LIGHT_R], + self.__state[CONSTANTS.CLUE_STATE.LIGHT_G], + self.__state[CONSTANTS.CLUE_STATE.LIGHT_B], + self.__state[CONSTANTS.CLUE_STATE.LIGHT_C], + ) + + @property + def temperature(self): + """The temperature in degrees Celsius. + This example prints the value. Try touching the sensor to see the value change. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + print("Temperature: {:.1f}C".format(clue.temperature)) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_TEMPERATURE + ) + return self.__state[CONSTANTS.CLUE_STATE.TEMPERATURE] + + @property + def magnetic(self): + """Obtain x, y, z magnetic values in microteslas. + This example prints the values. Try moving the board to see how the printed values change. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + print("Magnetic: {:.3f} {:.3f} {:.3f}".format(*clue.magnetic)) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_MAGNETIC + ) + return ( + self.__state[CONSTANTS.CLUE_STATE.MAGNET_X], + self.__state[CONSTANTS.CLUE_STATE.MAGNET_Y], + self.__state[CONSTANTS.CLUE_STATE.MAGNET_Z], + ) + + @property + def proximity(self): + """A relative proximity to the sensor in values from 0 - 255. + This example prints the value. Try moving your hand towards and away from the front of the + board to see how the printed values change. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + print("Proximity: {}".format(clue.proximity)) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_PROXIMITY + ) + return self.__state[CONSTANTS.CLUE_STATE.PROXIMITY] + + @property + def gyro(self): + """Obtain x, y, z angular velocity values in degrees/second. + This example prints the values. Try moving the board to see how the printed values change. + print("Gyro: {:.2f} {:.2f} {:.2f}".format(*clue.gyro)) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_GYRO + ) + return ( + self.__state[CONSTANTS.CLUE_STATE.GYRO_X], + self.__state[CONSTANTS.CLUE_STATE.GYRO_Y], + self.__state[CONSTANTS.CLUE_STATE.GYRO_Z], + ) + + @property + def gesture(self): + """A gesture code if gesture is detected. Shows ``0`` if no gesture detected. + ``1`` if an UP gesture is detected, ``2`` if DOWN, ``3`` if LEFT, and ``4`` if RIGHT. + This example prints the gesture values. Try moving your hand up, down, left or right over + the sensor to see the value change. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + print("Gesture: {}".format(clue.gesture)) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_GESTURE + ) + gesture_mapping = {"": 0, "up": 1, "down": 2, "left": 3, "right": 4} + return gesture_mapping.get(self.__state[CONSTANTS.CLUE_STATE.GESTURE], 0) + + @property + def humidity(self): + """The measured relative humidity in percent. + This example prints the value. Try breathing on the sensor to see the values change. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + print("Humidity: {:.1f}%".format(clue.humidity)) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_HUMIDITY + ) + return self.__state[CONSTANTS.CLUE_STATE.HUMIDITY] + + @property + def pressure(self): + """The barometric pressure in hectoPascals. + This example prints the value. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + print("Pressure: {:.3f}hPa".format(clue.pressure)) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_PRESSURE + ) + return self.__state[CONSTANTS.CLUE_STATE.PRESSURE] + + @property + def altitude(self): + """The altitude in meters based on the sea level pressure at your location. You must set + ``sea_level_pressure`` to receive an accurate reading. + This example prints the value. Try moving the board vertically to see the value change. + .. code-block:: python + from adafruit_clue import clue + clue.sea_level_pressure = 1015 + print("Altitude: {:.1f}m".format(clue.altitude)) + """ + # National Oceanic and Atmospheric Administration (NOAA) formula for converting atmospheric pressure to pressure altitude. + OUTSIDE_MULTIPLER_CONSTANT = 44330 + POWER_CONSTANT = 0.1903 + WHOLE_CONSTANT = 1 + + altitude = OUTSIDE_MULTIPLER_CONSTANT * ( + WHOLE_CONSTANT + - math.pow( + self.__state[CONSTANTS.CLUE_STATE.PRESSURE] + / self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE], + POWER_CONSTANT, + ) + ) + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_ALTITUDE + ) + return altitude + + @property + def sea_level_pressure(self): + """Set to the pressure at sea level at your location, before reading altitude for + the most accurate altitude measurement. + This example prints the value. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + clue.sea_level_pressure = 1015 + print("Pressure: {:.3f}hPa".format(clue.pressure)) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_SEA_LEVEL_PRESSURE + ) + return self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE] + + @sea_level_pressure.setter + def sea_level_pressure(self, value): + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_SEA_LEVEL_PRESSURE + ) + self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE] = value + + @property + def pixel(self): + """The NeoPixel RGB LED. + This example turns the NeoPixel purple. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + clue.pixel.fill((255, 0, 255)) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_PIXEL + ) + return self.__state[CONSTANTS.CLUE_STATE.PIXEL] + + @property + def touch_0(self): + """Not Implemented! + + Detect touch on capacitive touch pad 0. + .. image :: ../docs/_static/pad_0.jpg + :alt: Pad 0 + This example prints when pad 0 is touched. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + if clue.touch_0: + print("Touched pad 0") + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_TOUCH + ) + common.utils.print_for_unimplemented_functions("touch_0") + + @property + def touch_1(self): + """Not Implemented! + + Detect touch on capacitive touch pad 1. + .. image :: ../docs/_static/pad_1.jpg + :alt: Pad 1 + This example prints when pad 1 is touched. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + if clue.touch_1: + print("Touched pad 1") + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_TOUCH + ) + common.utils.print_for_unimplemented_functions("touch_1") + + @property + def touch_2(self): + """Not Implemented! + + Detect touch on capacitive touch pad 2. + .. image :: ../docs/_static/pad_2.jpg + :alt: Pad 2 + This example prints when pad 2 is touched. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + if clue.touch_2: + print("Touched pad 2") + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_TOUCH + ) + common.utils.print_for_unimplemented_functions("touch_2") + + @property + def white_leds(self): + """The red led next to the USB plug labeled LED. + .. image :: ../docs/_static/white_leds.jpg + :alt: White LEDs + This example turns on the white LEDs. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + clue.white_leds = True + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_WHITE_LEDS + ) + return self.__state[CONSTANTS.CLUE_STATE.WHITE_LEDS] + + @white_leds.setter + def white_leds(self, value): + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_WHITE_LEDS + ) + self.__set_leds(CONSTANTS.CLUE_STATE.WHITE_LEDS, value) + + @property + def red_led(self): + """The red led next to the USB plug labeled LED. + .. image :: ../docs/_static/red_led.jpg + :alt: Red LED + This example turns on the red LED. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + clue.red_led = True + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_RED_LED + ) + return self.__state[CONSTANTS.CLUE_STATE.RED_LED] + + @red_led.setter + def red_led(self, value): + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_RED_LED + ) + self.__set_leds(CONSTANTS.CLUE_STATE.RED_LED, value) + + def play_tone(self, frequency, duration): + """ Not Implemented! + Produce a tone using the speaker. Try changing frequency to change + the pitch of the tone. + :param int frequency: The frequency of the tone in Hz + :param float duration: The duration of the tone in seconds + .. image :: ../docs/_static/speaker.jpg + :alt: Speaker + This example plays a 880 Hz tone for a duration of 1 second. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + clue.play_tone(880, 1) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_SOUND + ) + common.utils.print_for_unimplemented_functions(Clue.play_tone.__name__) + + def start_tone(self, frequency): + """ Not Implemented! + Produce a tone using the speaker. Try changing frequency to change + the pitch of the tone. + :param int frequency: The frequency of the tone in Hz + .. image :: ../docs/_static/speaker.jpg + :alt: Speaker + This example plays a 523Hz tone when button A is pressed and a 587Hz tone when button B is + pressed, only while the buttons are being pressed. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + if clue.button_a: + clue.start_tone(523) + elif clue.button_b: + clue.start_tone(587) + else: + clue.stop_tone() + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_SOUND + ) + common.utils.print_for_unimplemented_functions(Clue.start_tone.__name__) + + def stop_tone(self): + """ Not Implemented! + Use with start_tone to stop the tone produced. + .. image :: ../docs/_static/speaker.jpg + :alt: Speaker + This example plays a 523Hz tone when button A is pressed and a 587Hz tone when button B is + pressed, only while the buttons are being pressed. + To use with the CLUE: + .. code-block:: python + from adafruit_clue import clue + while True: + if clue.button_a: + clue.start_tone(523) + elif clue.button_b: + clue.start_tone(587) + else: + clue.stop_tone() + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_SOUND + ) + common.utils.print_for_unimplemented_functions(Clue.stop_tone.__name__) + + @property + def sound_level(self): + """Not Implemented! + Obtain the sound level from the microphone (sound sensor). + .. image :: ../docs/_static/microphone.jpg + :alt: Microphone (sound sensor) + This example prints the sound levels. Try clapping or blowing on + the microphone to see the levels change. + .. code-block:: python + from adafruit_clue import clue + while True: + print(clue.sound_level) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_SOUND + ) + common.utils.print_for_unimplemented_functions("sound_level") + + def loud_sound(self, sound_threshold=200): + """Not Implemented! + Utilise a loud sound as an input. + :param int sound_threshold: Threshold sound level must exceed to return true (Default: 200) + .. image :: ../docs/_static/microphone.jpg + :alt: Microphone (sound sensor) + This example turns the NeoPixel LED blue each time you make a loud sound. + Try clapping or blowing onto the microphone to trigger it. + .. code-block:: python + from adafruit_clue import clue + while True: + if clue.loud_sound(): + clue.pixel.fill((0, 50, 0)) + else: + clue.pixel.fill(0) + You may find that the code is not responding how you would like. + If this is the case, you can change the loud sound threshold to + make it more or less responsive. Setting it to a higher number + means it will take a louder sound to trigger. Setting it to a + lower number will take a quieter sound to trigger. The following + example shows the threshold being set to a higher number than + the default. + .. code-block:: python + from adafruit_clue import clue + while True: + if clue.loud_sound(sound_threshold=300): + clue.pixel.fill((0, 50, 0)) + else: + clue.pixel.fill(0) + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_SOUND + ) + common.utils.print_for_unimplemented_functions(Clue.loud_sound.__name__) + + @staticmethod + def simple_text_display( + title=None, + title_color=(255, 255, 255), + title_scale=1, # pylint: disable=too-many-arguments + text_scale=1, + font=None, + colors=None, + ): + """Display lines of text on the CLUE display. Lines of text are created in order as shown + in the example below. If you skip a number, the line will be shown blank on the display, + e.g. if you include ``[0]`` and ``[2]``, the second line on the display will be empty, and + the text specified for lines 0 and 2 will be displayed on the first and third line. + Remember, Python begins counting at 0, so the first line on the display is 0 in the code. + + Setup occurs before the loop. For data to be dynamically updated on the display, you must + include the data call in the loop by using ``.text =``. For example, if setup is saved as + ``clue_data = display_clue_data()`` then ``clue_data[0].text = clue.proximity`` must be + inside the ``while True:`` loop for the proximity data displayed to update as the + values change. You must call ``show()`` at the end of the list for anything to display. + See example below for usage. + + :param str title: The title displayed above the data. Set ``title="Title text"`` to provide + a title. Defaults to None. + :param title_color: The color of the title. Not necessary if no title is provided. Defaults + to white (255, 255, 255). + :param int title_scale: Scale the size of the title. Not necessary if no title is provided. + Defaults to 1. + :param int text_scale: Scale the size of the data lines. Scales the title as well. + Defaults to 1. + :param str font: The font to use to display the title and data. Defaults to built in + ``terminalio.FONT``. + :param colors: A list of colors for the lines of data on the display. If you provide a + single color, all lines will be that color. Otherwise it will cycle through + the list you provide if the list is less than the number of lines displayed. + Default colors are used if ``colors`` is not set. For example, if creating + two lines of data, ``colors=((255, 255, 255), (255, 0, 0))`` would set the + first line white and the second line red, and if you created four lines of + data with the same setup, it would alternate white and red. + + .. image :: ../docs/_static/display_clue_data.jpg + :alt: Display Clue Data demo + + This example displays three lines with acceleration, gyro and magnetic data on the display. + Remember to call ``show()`` after the list to update the display. + + .. code-block:: python + + from adafruit_clue import clue + + clue_data = clue.simple_text_display(title="CLUE Sensor Data!", title_scale=2) + + while True: + clue_data[0].text = "Acceleration: {:.2f} {:.2f} {:.2f}".format(*clue.acceleration) + clue_data[1].text = "Gyro: {:.2f} {:.2f} {:.2f}".format(*clue.gyro) + clue_data[2].text = "Magnetic: {:.3f} {:.3f} {:.3f}".format(*clue.magnetic) + clue_data.show() + """ + common.telemetry.telemetry_py.send_telemetry( + common.telemetry_events.TelemetryEvent.CLUE_API_TEXT_DISPLAY + ) + return _ClueSimpleTextDisplay( + title=title, + title_color=title_color, + title_scale=title_scale, + text_scale=text_scale, + font=font, + colors=colors, + ) + + def update_state(self, new_state): + for event in new_state.keys(): + if event in CONSTANTS.EXPECTED_INPUT_BUTTONS: + self.__update_button(event, new_state.get(event)) + elif event in CONSTANTS.ALL_EXPECTED_INPUT_EVENTS: + if self.__state[event] != new_state[event]: + self.__state[event] = new_state.get(event) + + # helpers + def __update_button(self, button, value): + if value: + self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS].add( + self.button_mapping[button] + ) + self.__state[button] = value + + def __set_leds(self, led, value): + value = bool(value) + self.__state[led] = value + sendable_json = {led: value} + if common.utils.debug_mode: + common.debugger_communication_client.debug_send_to_simulator( + sendable_json, CONSTANTS.CLUE + ) + else: + common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) + + +clue = Clue() # pylint: disable=invalid-name +"""Object that is automatically created on import. + + To use, simply import it from the module: + + .. code-block:: python + + from adafruit_clue import clue +""" diff --git a/src/clue/adafruit_display_text/label.py b/src/clue/adafruit_display_text/label.py index f7bab0b7f..9cfff6842 100644 --- a/src/clue/adafruit_display_text/label.py +++ b/src/clue/adafruit_display_text/label.py @@ -1,280 +1,280 @@ -# The MIT License (MIT) -# -# Copyright (c) 2019 Scott Shawcroft for Adafruit Industries LLC -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -""" -`adafruit_display_text.label` -==================================================== - -Displays text labels using CircuitPython's displayio. - -* Author(s): Scott Shawcroft - -Implementation Notes --------------------- - -**Hardware:** - -**Software and Dependencies:** - -* Adafruit CircuitPython firmware for the supported boards: - https://github.com/adafruit/circuitpython/releases - -""" - -import displayio - -__version__ = "0.0.0-auto.0" -__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git" - - -class Label(displayio.Group): - """A label displaying a string of text. The origin point set by ``x`` and ``y`` - properties will be the left edge of the bounding box, and in the center of a M - glyph (if its one line), or the (number of lines * linespacing + M)/2. That is, - it will try to have it be center-left as close as possible. - - :param Font font: A font class that has ``get_bounding_box`` and ``get_glyph``. - Must include a capital M for measuring character size. - :param str text: Text to display - :param int max_glyphs: The largest quantity of glyphs we will display - :param int color: Color of all text in RGB hex - :param double line_spacing: Line spacing of text to display""" - - def __init__( - self, - font, - *, - x=0, - y=0, - text=None, - max_glyphs=None, - color=0xFFFFFF, - background_color=None, - line_spacing=1.25, - **kwargs - ): - if not max_glyphs and not text: - raise RuntimeError("Please provide a max size, or initial text") - if not max_glyphs: - max_glyphs = len(text) - super().__init__(max_size=max_glyphs, auto_write=False, **kwargs) - self.width = max_glyphs - self.font = font - self._text = None - self._anchor_point = (0, 0) - self.x = x - self.y = y - - self.palette = displayio.Palette(2) - if background_color is not None: - self.palette[0] = background_color - self.palette.make_opaque(0) - self._transparent_background = False - else: - self.palette[0] = 0 - self.palette.make_transparent(0) - self._transparent_background = True - self.palette[1] = color - - bounds = self.font.get_bounding_box() - self.height = bounds[1] - self._line_spacing = line_spacing - self._boundingbox = None - - if text is not None: - self._update_text(str(text)) - - def _update_text(self, new_text): # pylint: disable=too-many-locals - x = 0 - y = 0 - i = 0 - old_c = 0 - y_offset = int( - ( - self.font.get_glyph(ord("M")).height - - new_text.count("\n") * self.height * self.line_spacing - ) - / 2 - ) - # print("y offset from baseline", y_offset) - left = right = top = bottom = 0 - for character in new_text: - if character == "\n": - y += int(self.height * self._line_spacing) - x = 0 - continue - glyph = self.font.get_glyph(ord(character)) - if not glyph: - continue - right = max(right, x + glyph.width) - if y == 0: # first line, find the Ascender height - top = min(top, -glyph.height + y_offset) - bottom = max(bottom, y - glyph.dy + y_offset) - position_y = y - glyph.height - glyph.dy + y_offset - position_x = x + glyph.dx - if ( - not self._text - or old_c >= len(self._text) - or character != self._text[old_c] - ): - try: - face = displayio.TileGrid( - glyph.bitmap, - pixel_shader=self.palette, - default_tile=glyph.tile_index, - tile_width=glyph.width, - tile_height=glyph.height, - position=(position_x, position_y), - ) - except TypeError: - face = displayio.TileGrid( - glyph.bitmap, - pixel_shader=self.palette, - default_tile=glyph.tile_index, - tile_width=glyph.width, - tile_height=glyph.height, - x=position_x, - y=position_y, - ) - if i < len(self): - self[i] = face - else: - self.append(face) - elif self._text and character == self._text[old_c]: - try: - self[i].position = (position_x, position_y) - except AttributeError: - self[i].x = position_x - self[i].y = position_y - - x += glyph.shift_x - - # TODO skip this for control sequences or non-printables. - i += 1 - old_c += 1 - # skip all non-prinables in the old string - while ( - self._text - and old_c < len(self._text) - and ( - self._text[old_c] == "\n" - or not self.font.get_glyph(ord(self._text[old_c])) - ) - ): - old_c += 1 - # Remove the rest - while len(self) > i: - self.pop() - self._text = new_text - self._boundingbox = (left, top, left + right, bottom - top) - - @property - def bounding_box(self): - """An (x, y, w, h) tuple that completely covers all glyphs. The - first two numbers are offset from the x, y origin of this group""" - return tuple(self._boundingbox) - - @property - def line_spacing(self): - """The amount of space between lines of text, in multiples of the font's - bounding-box height. (E.g. 1.0 is the bounding-box height)""" - return self._line_spacing - - @line_spacing.setter - def line_spacing(self, spacing): - if self._line_spacing != spacing: - self._line_spacing = spacing - self._Group__trigger_draw() - - @property - def color(self): - """Color of the text as an RGB hex number.""" - return self.palette[1] - - @color.setter - def color(self, new_color): - self.palette[1] = new_color - self._Group__trigger_draw() - - @property - def background_color(self): - """Color of the background as an RGB hex number.""" - if not self._transparent_background: - return self.palette[0] - return None - - @background_color.setter - def background_color(self, new_color): - if new_color is not None: - self.palette[0] = new_color - self.palette.make_opaque(0) - self._transparent_background = False - else: - self.palette[0] = 0 - self.palette.make_transparent(0) - self._transparent_background = True - - self._Group__trigger_draw() - - @property - def text(self): - """Text to display.""" - return self._text - - @text.setter - def text(self, new_text): - # APR 2, 2O2O -> - # Added manual trigger to update text since - # on-screen text updating is a lot faster this way. - - # Previously, the group was set to auto_write=True - # and each letter in the group was individually - # drawn and sent to the front-end display. - if new_text != self._text: - self._update_text(str(new_text)) - self._Group__trigger_draw() - - @property - def anchor_point(self): - """Point that anchored_position moves relative to. - Tuple with decimal percentage of width and height. - (E.g. (0,0) is top left, (1.0, 0.5): is middle right.)""" - return self._anchor_point - - @anchor_point.setter - def anchor_point(self, new_anchor_point): - if self._anchor_point != new_anchor_point: - self._Group__trigger_draw() - - @property - def anchored_position(self): - """Position relative to the anchor_point. Tuple containing x,y - pixel coordinates.""" - return ( - self.x - self._boundingbox[2] * self._anchor_point[0], - self.y - self._boundingbox[3] * self._anchor_point[1], - ) - - @anchored_position.setter - def anchored_position(self, new_position): - self.x = int(new_position[0] - (self._boundingbox[2] * self._anchor_point[0])) - self.y = int(new_position[1] - (self._boundingbox[3] * self._anchor_point[1])) - self._Group__trigger_draw() +# The MIT License (MIT) +# +# Copyright (c) 2019 Scott Shawcroft for Adafruit Industries LLC +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +""" +`adafruit_display_text.label` +==================================================== + +Displays text labels using CircuitPython's displayio. + +* Author(s): Scott Shawcroft + +Implementation Notes +-------------------- + +**Hardware:** + +**Software and Dependencies:** + +* Adafruit CircuitPython firmware for the supported boards: + https://github.com/adafruit/circuitpython/releases + +""" + +import displayio + +__version__ = "0.0.0-auto.0" +__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git" + + +class Label(displayio.Group): + """A label displaying a string of text. The origin point set by ``x`` and ``y`` + properties will be the left edge of the bounding box, and in the center of a M + glyph (if its one line), or the (number of lines * linespacing + M)/2. That is, + it will try to have it be center-left as close as possible. + + :param Font font: A font class that has ``get_bounding_box`` and ``get_glyph``. + Must include a capital M for measuring character size. + :param str text: Text to display + :param int max_glyphs: The largest quantity of glyphs we will display + :param int color: Color of all text in RGB hex + :param double line_spacing: Line spacing of text to display""" + + def __init__( + self, + font, + *, + x=0, + y=0, + text=None, + max_glyphs=None, + color=0xFFFFFF, + background_color=None, + line_spacing=1.25, + **kwargs + ): + if not max_glyphs and not text: + raise RuntimeError("Please provide a max size, or initial text") + if not max_glyphs: + max_glyphs = len(text) + super().__init__(max_size=max_glyphs, auto_write=False, **kwargs) + self.width = max_glyphs + self.font = font + self._text = None + self._anchor_point = (0, 0) + self.x = x + self.y = y + + self.palette = displayio.Palette(2) + if background_color is not None: + self.palette[0] = background_color + self.palette.make_opaque(0) + self._transparent_background = False + else: + self.palette[0] = 0 + self.palette.make_transparent(0) + self._transparent_background = True + self.palette[1] = color + + bounds = self.font.get_bounding_box() + self.height = bounds[1] + self._line_spacing = line_spacing + self._boundingbox = None + + if text is not None: + self._update_text(str(text)) + + def _update_text(self, new_text): # pylint: disable=too-many-locals + x = 0 + y = 0 + i = 0 + old_c = 0 + y_offset = int( + ( + self.font.get_glyph(ord("M")).height + - new_text.count("\n") * self.height * self.line_spacing + ) + / 2 + ) + # print("y offset from baseline", y_offset) + left = right = top = bottom = 0 + for character in new_text: + if character == "\n": + y += int(self.height * self._line_spacing) + x = 0 + continue + glyph = self.font.get_glyph(ord(character)) + if not glyph: + continue + right = max(right, x + glyph.width) + if y == 0: # first line, find the Ascender height + top = min(top, -glyph.height + y_offset) + bottom = max(bottom, y - glyph.dy + y_offset) + position_y = y - glyph.height - glyph.dy + y_offset + position_x = x + glyph.dx + if ( + not self._text + or old_c >= len(self._text) + or character != self._text[old_c] + ): + try: + face = displayio.TileGrid( + glyph.bitmap, + pixel_shader=self.palette, + default_tile=glyph.tile_index, + tile_width=glyph.width, + tile_height=glyph.height, + position=(position_x, position_y), + ) + except TypeError: + face = displayio.TileGrid( + glyph.bitmap, + pixel_shader=self.palette, + default_tile=glyph.tile_index, + tile_width=glyph.width, + tile_height=glyph.height, + x=position_x, + y=position_y, + ) + if i < len(self): + self[i] = face + else: + self.append(face) + elif self._text and character == self._text[old_c]: + try: + self[i].position = (position_x, position_y) + except AttributeError: + self[i].x = position_x + self[i].y = position_y + + x += glyph.shift_x + + # TODO skip this for control sequences or non-printables. + i += 1 + old_c += 1 + # skip all non-prinables in the old string + while ( + self._text + and old_c < len(self._text) + and ( + self._text[old_c] == "\n" + or not self.font.get_glyph(ord(self._text[old_c])) + ) + ): + old_c += 1 + # Remove the rest + while len(self) > i: + self.pop() + self._text = new_text + self._boundingbox = (left, top, left + right, bottom - top) + + @property + def bounding_box(self): + """An (x, y, w, h) tuple that completely covers all glyphs. The + first two numbers are offset from the x, y origin of this group""" + return tuple(self._boundingbox) + + @property + def line_spacing(self): + """The amount of space between lines of text, in multiples of the font's + bounding-box height. (E.g. 1.0 is the bounding-box height)""" + return self._line_spacing + + @line_spacing.setter + def line_spacing(self, spacing): + if self._line_spacing != spacing: + self._line_spacing = spacing + self._Group__trigger_draw() + + @property + def color(self): + """Color of the text as an RGB hex number.""" + return self.palette[1] + + @color.setter + def color(self, new_color): + self.palette[1] = new_color + self._Group__trigger_draw() + + @property + def background_color(self): + """Color of the background as an RGB hex number.""" + if not self._transparent_background: + return self.palette[0] + return None + + @background_color.setter + def background_color(self, new_color): + if new_color is not None: + self.palette[0] = new_color + self.palette.make_opaque(0) + self._transparent_background = False + else: + self.palette[0] = 0 + self.palette.make_transparent(0) + self._transparent_background = True + + self._Group__trigger_draw() + + @property + def text(self): + """Text to display.""" + return self._text + + @text.setter + def text(self, new_text): + # APR 2, 2O2O -> + # Added manual trigger to update text since + # on-screen text updating is a lot faster this way. + + # Previously, the group was set to auto_write=True + # and each letter in the group was individually + # drawn and sent to the front-end display. + if new_text != self._text: + self._update_text(str(new_text)) + self._Group__trigger_draw() + + @property + def anchor_point(self): + """Point that anchored_position moves relative to. + Tuple with decimal percentage of width and height. + (E.g. (0,0) is top left, (1.0, 0.5): is middle right.)""" + return self._anchor_point + + @anchor_point.setter + def anchor_point(self, new_anchor_point): + if self._anchor_point != new_anchor_point: + self._Group__trigger_draw() + + @property + def anchored_position(self): + """Position relative to the anchor_point. Tuple containing x,y + pixel coordinates.""" + return ( + self.x - self._boundingbox[2] * self._anchor_point[0], + self.y - self._boundingbox[3] * self._anchor_point[1], + ) + + @anchored_position.setter + def anchored_position(self, new_position): + self.x = int(new_position[0] - (self._boundingbox[2] * self._anchor_point[0])) + self.y = int(new_position[1] - (self._boundingbox[3] * self._anchor_point[1])) + self._Group__trigger_draw() diff --git a/src/clue/adafruit_slideshow.py b/src/clue/adafruit_slideshow.py index aa1fb6b65..1e2662a92 100644 --- a/src/clue/adafruit_slideshow.py +++ b/src/clue/adafruit_slideshow.py @@ -1,407 +1,407 @@ -from PIL import Image - -import os -import base64 -from io import BytesIO -from base_circuitpython import base_cp_constants as CONSTANTS -import time -from random import shuffle -import common -import board - -# taken from adafruit -# https://github.com/adafruit/Adafruit_CircuitPython_Slideshow/blob/master/adafruit_slideshow.py - - -class PlayBackOrder: - """Defines possible slideshow playback orders.""" - - # pylint: disable=too-few-public-methods - ALPHABETICAL = 0 - """Orders by alphabetical sort of filenames""" - - RANDOM = 1 - """Randomly shuffles the images""" - # pylint: enable=too-few-public-methods - - -class PlayBackDirection: - """Defines possible slideshow playback directions.""" - - # pylint: disable=too-few-public-methods - BACKWARD = -1 - """The next image is before the current image. When alphabetically sorted, this is towards A.""" - - FORWARD = 1 - """The next image is after the current image. When alphabetically sorted, this is towards Z.""" - # pylint: enable=too-few-public-methods - - -# custom -class SlideShow: - """ - Class for displaying a slideshow of .bmp images on displays. - :param str folder: Specify the folder containing the image files, in quotes. Default is - the root directory, ``"/"``. - :param PlayBackOrder order: The order in which the images display. You can choose random - (``RANDOM``) or alphabetical (``ALPHABETICAL``). Default is - ``ALPHABETICAL``. - :param bool loop: Specify whether to loop the images or play through the list once. `True` - if slideshow will continue to loop, ``False`` if it will play only once. - Default is ``True``. - :param int dwell: The number of seconds each image displays, in seconds. Default is 3. - :param bool fade_effect: Specify whether to include the fade effect between images. ``True`` - tells the code to fade the backlight up and down between image display - transitions. ``False`` maintains max brightness on the backlight between - image transitions. Default is ``True``. - :param bool auto_advance: Specify whether to automatically advance after dwell seconds. ``True`` - if slideshow should auto play, ``False`` if you want to control advancement - manually. Default is ``True``. - :param PlayBackDirection direction: The playback direction. - Example code for Hallowing Express. With this example, the slideshow will play through once - in alphabetical order: - .. code-block:: python - from adafruit_slideshow import PlayBackOrder, SlideShow - import board - import pulseio - slideshow = SlideShow(board.DISPLAY, pulseio.PWMOut(board.TFT_BACKLIGHT), folder="/", - loop=False, order=PlayBackOrder.ALPHABETICAL) - while slideshow.update(): - pass - Example code for Hallowing Express. Sets ``dwell`` to 0 seconds, turns ``auto_advance`` off, - and uses capacitive touch to advance backwards and forwards through the images and to control - the brightness level of the backlight: - .. code-block:: python - from adafruit_slideshow import PlayBackOrder, SlideShow, PlayBackDirection - import touchio - import board - import pulseio - forward_button = touchio.TouchIn(board.TOUCH4) - back_button = touchio.TouchIn(board.TOUCH1) - brightness_up = touchio.TouchIn(board.TOUCH3) - brightness_down = touchio.TouchIn(board.TOUCH2) - slideshow = SlideShow(board.DISPLAY, pulseio.PWMOut(board.TFT_BACKLIGHT), folder="/", - auto_advance=False, dwell=0) - while True: - if forward_button.value: - slideshow.direction = PlayBackDirection.FORWARD - slideshow.advance() - if back_button.value: - slideshow.direction = PlayBackDirection.BACKWARD - slideshow.advance() - if brightness_up.value: - slideshow.brightness += 0.001 - elif brightness_down.value: - slideshow.brightness -= 0.001 - """ - - def __init__( - self, - display, - backlight_pwm=None, - *, - folder=".", - order=PlayBackOrder.ALPHABETICAL, - loop=True, - dwell=3, - fade_effect=True, - auto_advance=True, - direction=PlayBackDirection.FORWARD, - ): - self._BASE_DWELL = 0.3 - self._BASE_DWELL_DARK = 0.7 - self._NO_FADE_TRANSITION_INCREMENTS = 18 - - self.auto_advance = auto_advance - """Enable auto-advance based on dwell time. Set to ``False`` to manually control.""" - - self.loop = loop - """Specifies whether to loop through the images continuously or play through the list once. - ``True`` will continue to loop, ``False`` will play only once.""" - - self.fade_effect = fade_effect - """Whether to include the fade effect between images. ``True`` tells the code to fade the - backlight up and down between image display transitions. ``False`` maintains max - brightness on the backlight between image transitions.""" - - self.dwell = self._BASE_DWELL + dwell - """The number of seconds each image displays, in seconds.""" - - self.direction = direction - """Specify the playback direction. Default is ``PlayBackDirection.FORWARD``. Can also be - ``PlayBackDirection.BACKWARD``.""" - - self.advance = self.__advance_with_fade - """Displays the next image. Returns True when a new image was displayed, False otherwise. - """ - - self.fade_frames = 8 - - # assign new advance method if fade is disabled - if not fade_effect: - self.advance = self.__advance_no_fade - - self._img_start = None - - self.brightness = 1.0 - - # blank screen for start - self._curr_img_handle = Image.new( - "RGBA", (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - - # if path is relative, this makes sure that - # it's relative to the users's code file - abs_path_parent_dir = os.path.abspath( - os.path.join(common.utils.abs_path_to_user_file, os.pardir) - ) - abs_path_folder = os.path.normpath(os.path.join(abs_path_parent_dir, folder)) - - self.folder = abs_path_folder - - # get files within specified directory - self.dirs = os.listdir(self.folder) - - self._order = order - self._curr_img = "" - self._current_image_index = None - - # load images into main queue - self.__load_images() - - display.show(self) - # show the first working image - self.advance() - - common.telemetry.telemetry_py.send_telemetry( - common.telemetry.TelemetryEvent.CLUE_API_SLIDESHOW - ) - - @property - def current_image_name(self): - """Returns the current image name.""" - return self._curr_img - - @property - def order(self): - """Specifies the order in which the images are displayed. Options are random (``RANDOM``) or - alphabetical (``ALPHABETICAL``). Default is ``RANDOM``.""" - return self._order - - @order.setter - def order(self, order): - if order not in [PlayBackOrder.ALPHABETICAL, PlayBackOrder.RANDOM]: - raise ValueError("Order must be either 'RANDOM' or 'ALPHABETICAL'") - - self._order = order - self.__load_images() - - @property - def brightness(self): - """Brightness of the backlight when an image is displaying. Clamps to 0 to 1.0""" - return self._brightness - - @brightness.setter - def brightness(self, brightness): - if brightness < 0: - brightness = 0 - elif brightness > 1.0: - brightness = 1.0 - self._brightness = brightness - - def update(self): - """Updates the slideshow to the next image.""" - now = time.monotonic() - if not self.auto_advance or now - self._img_start < self.dwell: - return True - - return self.advance() - - def __get_next_img(self): - - if self.direction == PlayBackDirection.FORWARD: - if self._current_image_index == None: - self._current_image_index = 0 - else: - self._current_image_index += 1 - - if self._current_image_index >= len(self.dir_imgs): - - if self.loop: - self._current_image_index = 0 - self.__load_images() - else: - self._current_image_index = len(self.dir_imgs) - 10 - return "" - - else: - if self._current_image_index == None: - self._current_image_index = len(self.dir_imgs) - 1 - else: - self._current_image_index -= 1 - - if self._current_image_index < 0: - if self.loop: - self._current_image_index = len(self.dir_imgs) - 1 - self.__load_images() - else: - self._current_image_index = 0 - return "" - - img = self.dir_imgs[self._current_image_index] - return img - - def __load_images(self): - self.dir_imgs = [] - for d in self.dirs: - try: - new_path = os.path.join(self.folder, d) - - # only add bmp imgs - if os.path.splitext(new_path)[-1] == CONSTANTS.BMP_IMG_ENDING: - self.dir_imgs.append(new_path) - except Image.UnidentifiedImageError as e: - continue - - if not len(self.dir_imgs): - raise RuntimeError(CONSTANTS.NO_VALID_IMGS_ERR) - - if self._order == PlayBackOrder.RANDOM: - shuffle(self.dir_imgs) - else: - self.dir_imgs.sort() - - def __advance_with_fade(self): - if board.DISPLAY.active_group != self: - return - - old_img = self._curr_img_handle - advance_sucessful = False - - while not advance_sucessful: - new_path = self.__get_next_img() - if new_path == "": - self._img_start = time.monotonic() - return False - - try: - new_img = Image.open(new_path) - - new_img = new_img.convert("RGBA") - new_img.putalpha(255) - - new_img = new_img.crop( - (0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - - if new_img.size[0] < 240 or new_img.size[1] < 240: - black_overlay = Image.new( - "RGBA", - CONSTANTS.SCREEN_HEIGHT_WIDTH, - CONSTANTS.SCREEN_HEIGHT_WIDTH, - ) - black_overlay.paste(new_img) - new_img = black_overlay - - black_overlay = Image.new("RGBA", new_img.size) - advance_sucessful = True - except Image.UnidentifiedImageError as e: - pass - - # fade out old photo - for i in range(self.fade_frames, -1, -1): - sendable_img = Image.blend( - black_overlay, old_img, i * self.brightness / self.fade_frames - ) - self.__send(sendable_img) - - time.sleep(self._BASE_DWELL_DARK) - - # fade in new photo - for i in range(self.fade_frames + 1): - sendable_img = Image.blend( - black_overlay, new_img, i * self.brightness / self.fade_frames - ) - self.__send(sendable_img) - - self._curr_img_handle = new_img - self._curr_img = new_path - self._img_start = time.monotonic() - return True - - def __advance_no_fade(self): - if board.DISPLAY.active_group != self: - return - - old_img = self._curr_img_handle - - advance_sucessful = False - - while not advance_sucessful: - new_path = self.__get_next_img() - if new_path == "": - self._img_start = time.monotonic() - return False - - try: - new_img = Image.open(new_path) - - new_img = new_img.crop( - (0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - - if ( - new_img.size[0] < CONSTANTS.SCREEN_HEIGHT_WIDTH - or new_img.size[1] < CONSTANTS.SCREEN_HEIGHT_WIDTH - ): - black_overlay = Image.new( - "RGBA", - CONSTANTS.SCREEN_HEIGHT_WIDTH, - CONSTANTS.SCREEN_HEIGHT_WIDTH, - ) - black_overlay.paste(new_img) - new_img = black_overlay - - self._curr_img = new_path - - new_img = new_img.convert("RGBA") - new_img.putalpha(255) - advance_sucessful = True - except Image.UnidentifiedImageError as e: - pass - - if self.brightness < 1.0: - black_overlay = Image.new("RGBA", new_img.size) - new_img = Image.blend(black_overlay, new_img, self.brightness) - - # gradually scroll new img over old img - for i in range(self._NO_FADE_TRANSITION_INCREMENTS + 1): - curr_y = ( - i * CONSTANTS.SCREEN_HEIGHT_WIDTH / self._NO_FADE_TRANSITION_INCREMENTS - ) - img_piece = new_img.crop((0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, curr_y)) - old_img.paste(img_piece) - self.__send(old_img) - - self._curr_img_handle = new_img - self._curr_img = new_path - self._img_start = time.monotonic() - return True - - def __send(self, img): - # sends current bmp_img to the frontend - buffered = BytesIO() - img.save(buffered, format=CONSTANTS.BMP_IMG) - byte_base64 = base64.b64encode(buffered.getvalue()) - - # only send the base_64 string contents - img_str = str(byte_base64)[2:-1] - - sendable_json = {CONSTANTS.BASE_64: img_str} - - if common.utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - sendable_json, CONSTANTS.CLUE - ) - else: - common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) +from PIL import Image + +import os +import base64 +from io import BytesIO +from base_circuitpython import base_cp_constants as CONSTANTS +import time +from random import shuffle +import common +import board + +# taken from adafruit +# https://github.com/adafruit/Adafruit_CircuitPython_Slideshow/blob/master/adafruit_slideshow.py + + +class PlayBackOrder: + """Defines possible slideshow playback orders.""" + + # pylint: disable=too-few-public-methods + ALPHABETICAL = 0 + """Orders by alphabetical sort of filenames""" + + RANDOM = 1 + """Randomly shuffles the images""" + # pylint: enable=too-few-public-methods + + +class PlayBackDirection: + """Defines possible slideshow playback directions.""" + + # pylint: disable=too-few-public-methods + BACKWARD = -1 + """The next image is before the current image. When alphabetically sorted, this is towards A.""" + + FORWARD = 1 + """The next image is after the current image. When alphabetically sorted, this is towards Z.""" + # pylint: enable=too-few-public-methods + + +# custom +class SlideShow: + """ + Class for displaying a slideshow of .bmp images on displays. + :param str folder: Specify the folder containing the image files, in quotes. Default is + the root directory, ``"/"``. + :param PlayBackOrder order: The order in which the images display. You can choose random + (``RANDOM``) or alphabetical (``ALPHABETICAL``). Default is + ``ALPHABETICAL``. + :param bool loop: Specify whether to loop the images or play through the list once. `True` + if slideshow will continue to loop, ``False`` if it will play only once. + Default is ``True``. + :param int dwell: The number of seconds each image displays, in seconds. Default is 3. + :param bool fade_effect: Specify whether to include the fade effect between images. ``True`` + tells the code to fade the backlight up and down between image display + transitions. ``False`` maintains max brightness on the backlight between + image transitions. Default is ``True``. + :param bool auto_advance: Specify whether to automatically advance after dwell seconds. ``True`` + if slideshow should auto play, ``False`` if you want to control advancement + manually. Default is ``True``. + :param PlayBackDirection direction: The playback direction. + Example code for Hallowing Express. With this example, the slideshow will play through once + in alphabetical order: + .. code-block:: python + from adafruit_slideshow import PlayBackOrder, SlideShow + import board + import pulseio + slideshow = SlideShow(board.DISPLAY, pulseio.PWMOut(board.TFT_BACKLIGHT), folder="/", + loop=False, order=PlayBackOrder.ALPHABETICAL) + while slideshow.update(): + pass + Example code for Hallowing Express. Sets ``dwell`` to 0 seconds, turns ``auto_advance`` off, + and uses capacitive touch to advance backwards and forwards through the images and to control + the brightness level of the backlight: + .. code-block:: python + from adafruit_slideshow import PlayBackOrder, SlideShow, PlayBackDirection + import touchio + import board + import pulseio + forward_button = touchio.TouchIn(board.TOUCH4) + back_button = touchio.TouchIn(board.TOUCH1) + brightness_up = touchio.TouchIn(board.TOUCH3) + brightness_down = touchio.TouchIn(board.TOUCH2) + slideshow = SlideShow(board.DISPLAY, pulseio.PWMOut(board.TFT_BACKLIGHT), folder="/", + auto_advance=False, dwell=0) + while True: + if forward_button.value: + slideshow.direction = PlayBackDirection.FORWARD + slideshow.advance() + if back_button.value: + slideshow.direction = PlayBackDirection.BACKWARD + slideshow.advance() + if brightness_up.value: + slideshow.brightness += 0.001 + elif brightness_down.value: + slideshow.brightness -= 0.001 + """ + + def __init__( + self, + display, + backlight_pwm=None, + *, + folder=".", + order=PlayBackOrder.ALPHABETICAL, + loop=True, + dwell=3, + fade_effect=True, + auto_advance=True, + direction=PlayBackDirection.FORWARD, + ): + self._BASE_DWELL = 0.3 + self._BASE_DWELL_DARK = 0.7 + self._NO_FADE_TRANSITION_INCREMENTS = 18 + + self.auto_advance = auto_advance + """Enable auto-advance based on dwell time. Set to ``False`` to manually control.""" + + self.loop = loop + """Specifies whether to loop through the images continuously or play through the list once. + ``True`` will continue to loop, ``False`` will play only once.""" + + self.fade_effect = fade_effect + """Whether to include the fade effect between images. ``True`` tells the code to fade the + backlight up and down between image display transitions. ``False`` maintains max + brightness on the backlight between image transitions.""" + + self.dwell = self._BASE_DWELL + dwell + """The number of seconds each image displays, in seconds.""" + + self.direction = direction + """Specify the playback direction. Default is ``PlayBackDirection.FORWARD``. Can also be + ``PlayBackDirection.BACKWARD``.""" + + self.advance = self.__advance_with_fade + """Displays the next image. Returns True when a new image was displayed, False otherwise. + """ + + self.fade_frames = 8 + + # assign new advance method if fade is disabled + if not fade_effect: + self.advance = self.__advance_no_fade + + self._img_start = None + + self.brightness = 1.0 + + # blank screen for start + self._curr_img_handle = Image.new( + "RGBA", (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) + ) + + # if path is relative, this makes sure that + # it's relative to the users's code file + abs_path_parent_dir = os.path.abspath( + os.path.join(common.utils.abs_path_to_user_file, os.pardir) + ) + abs_path_folder = os.path.normpath(os.path.join(abs_path_parent_dir, folder)) + + self.folder = abs_path_folder + + # get files within specified directory + self.dirs = os.listdir(self.folder) + + self._order = order + self._curr_img = "" + self._current_image_index = None + + # load images into main queue + self.__load_images() + + display.show(self) + # show the first working image + self.advance() + + common.telemetry.telemetry_py.send_telemetry( + common.telemetry.TelemetryEvent.CLUE_API_SLIDESHOW + ) + + @property + def current_image_name(self): + """Returns the current image name.""" + return self._curr_img + + @property + def order(self): + """Specifies the order in which the images are displayed. Options are random (``RANDOM``) or + alphabetical (``ALPHABETICAL``). Default is ``RANDOM``.""" + return self._order + + @order.setter + def order(self, order): + if order not in [PlayBackOrder.ALPHABETICAL, PlayBackOrder.RANDOM]: + raise ValueError("Order must be either 'RANDOM' or 'ALPHABETICAL'") + + self._order = order + self.__load_images() + + @property + def brightness(self): + """Brightness of the backlight when an image is displaying. Clamps to 0 to 1.0""" + return self._brightness + + @brightness.setter + def brightness(self, brightness): + if brightness < 0: + brightness = 0 + elif brightness > 1.0: + brightness = 1.0 + self._brightness = brightness + + def update(self): + """Updates the slideshow to the next image.""" + now = time.monotonic() + if not self.auto_advance or now - self._img_start < self.dwell: + return True + + return self.advance() + + def __get_next_img(self): + + if self.direction == PlayBackDirection.FORWARD: + if self._current_image_index == None: + self._current_image_index = 0 + else: + self._current_image_index += 1 + + if self._current_image_index >= len(self.dir_imgs): + + if self.loop: + self._current_image_index = 0 + self.__load_images() + else: + self._current_image_index = len(self.dir_imgs) - 10 + return "" + + else: + if self._current_image_index == None: + self._current_image_index = len(self.dir_imgs) - 1 + else: + self._current_image_index -= 1 + + if self._current_image_index < 0: + if self.loop: + self._current_image_index = len(self.dir_imgs) - 1 + self.__load_images() + else: + self._current_image_index = 0 + return "" + + img = self.dir_imgs[self._current_image_index] + return img + + def __load_images(self): + self.dir_imgs = [] + for d in self.dirs: + try: + new_path = os.path.join(self.folder, d) + + # only add bmp imgs + if os.path.splitext(new_path)[-1] == CONSTANTS.BMP_IMG_ENDING: + self.dir_imgs.append(new_path) + except Image.UnidentifiedImageError as e: + continue + + if not len(self.dir_imgs): + raise RuntimeError(CONSTANTS.NO_VALID_IMGS_ERR) + + if self._order == PlayBackOrder.RANDOM: + shuffle(self.dir_imgs) + else: + self.dir_imgs.sort() + + def __advance_with_fade(self): + if board.DISPLAY.active_group != self: + return + + old_img = self._curr_img_handle + advance_sucessful = False + + while not advance_sucessful: + new_path = self.__get_next_img() + if new_path == "": + self._img_start = time.monotonic() + return False + + try: + new_img = Image.open(new_path) + + new_img = new_img.convert("RGBA") + new_img.putalpha(255) + + new_img = new_img.crop( + (0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) + ) + + if new_img.size[0] < 240 or new_img.size[1] < 240: + black_overlay = Image.new( + "RGBA", + CONSTANTS.SCREEN_HEIGHT_WIDTH, + CONSTANTS.SCREEN_HEIGHT_WIDTH, + ) + black_overlay.paste(new_img) + new_img = black_overlay + + black_overlay = Image.new("RGBA", new_img.size) + advance_sucessful = True + except Image.UnidentifiedImageError as e: + pass + + # fade out old photo + for i in range(self.fade_frames, -1, -1): + sendable_img = Image.blend( + black_overlay, old_img, i * self.brightness / self.fade_frames + ) + self.__send(sendable_img) + + time.sleep(self._BASE_DWELL_DARK) + + # fade in new photo + for i in range(self.fade_frames + 1): + sendable_img = Image.blend( + black_overlay, new_img, i * self.brightness / self.fade_frames + ) + self.__send(sendable_img) + + self._curr_img_handle = new_img + self._curr_img = new_path + self._img_start = time.monotonic() + return True + + def __advance_no_fade(self): + if board.DISPLAY.active_group != self: + return + + old_img = self._curr_img_handle + + advance_sucessful = False + + while not advance_sucessful: + new_path = self.__get_next_img() + if new_path == "": + self._img_start = time.monotonic() + return False + + try: + new_img = Image.open(new_path) + + new_img = new_img.crop( + (0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) + ) + + if ( + new_img.size[0] < CONSTANTS.SCREEN_HEIGHT_WIDTH + or new_img.size[1] < CONSTANTS.SCREEN_HEIGHT_WIDTH + ): + black_overlay = Image.new( + "RGBA", + CONSTANTS.SCREEN_HEIGHT_WIDTH, + CONSTANTS.SCREEN_HEIGHT_WIDTH, + ) + black_overlay.paste(new_img) + new_img = black_overlay + + self._curr_img = new_path + + new_img = new_img.convert("RGBA") + new_img.putalpha(255) + advance_sucessful = True + except Image.UnidentifiedImageError as e: + pass + + if self.brightness < 1.0: + black_overlay = Image.new("RGBA", new_img.size) + new_img = Image.blend(black_overlay, new_img, self.brightness) + + # gradually scroll new img over old img + for i in range(self._NO_FADE_TRANSITION_INCREMENTS + 1): + curr_y = ( + i * CONSTANTS.SCREEN_HEIGHT_WIDTH / self._NO_FADE_TRANSITION_INCREMENTS + ) + img_piece = new_img.crop((0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, curr_y)) + old_img.paste(img_piece) + self.__send(old_img) + + self._curr_img_handle = new_img + self._curr_img = new_path + self._img_start = time.monotonic() + return True + + def __send(self, img): + # sends current bmp_img to the frontend + buffered = BytesIO() + img.save(buffered, format=CONSTANTS.BMP_IMG) + byte_base64 = base64.b64encode(buffered.getvalue()) + + # only send the base_64 string contents + img_str = str(byte_base64)[2:-1] + + sendable_json = {CONSTANTS.BASE_64: img_str} + + if common.utils.debug_mode: + common.debugger_communication_client.debug_send_to_simulator( + sendable_json, CONSTANTS.CLUE + ) + else: + common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) diff --git a/src/clue/test/test_adafruit_clue.py b/src/clue/test/test_adafruit_clue.py index 0d7204205..d9a88d731 100644 --- a/src/clue/test/test_adafruit_clue.py +++ b/src/clue/test/test_adafruit_clue.py @@ -1,193 +1,193 @@ -import pytest - -import os -import pathlib -from PIL import Image - -from unittest import mock -from unittest.mock import MagicMock, patch - -from common import utils - -import displayio -import terminalio - -from ..adafruit_clue import clue -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS - - -class TestAdafruitClue(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - - self.main_img = Image.new( - "RGBA", - (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), - (0, 0, 0, 0), - ) - - utils.send_to_simulator = mock.Mock() - - def test_clue_display_text(self): - img = Image.open( - os.path.join(self.abs_path, CONSTANTS.IMG_DIR_NAME, f"test_clue_text_1.bmp") - ) - - img.putalpha(255) - expected = img.load() - clue_data = clue.simple_text_display(title="LET'S TEST!", title_scale=2) - - clue_data.text_group._Group__show = self.__send_helper - clue_data.text_group._Group__check_active_group_ref = False - - clue_data[0].text = "Lorem ipsum" - clue_data[1].text = "dolor sit amet, consectetur " - clue_data[2].text = "adipiscing:" - - clue_data[4].text = "e" - clue_data[5].text = "sed do eiusmod" - clue_data[6].text = "tempor incididunt\nut labore" - clue_data[7].text = "ut labore" - - clue_data[10].text = "et dolore" - clue_data[11].text = "magna" - clue_data[12].text = "aliqua\ntestest" - clue_data[13].text = "Ut enim ad" - clue_data[14].text = "Excepteur sint" - clue_data.show() - helper._Helper__test_image_equality(self.main_img.load(), expected) - - def __send_helper(self, image): - self.main_img = image - - def test_buttons(self): - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_A, True) - assert clue.button_a - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_A, False) - assert not clue.button_a - - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_B, True) - assert clue.button_b - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_B, False) - assert not clue.button_b - - assert clue.were_pressed == set(["A", "B"]) - assert clue.were_pressed == set() - - @pytest.mark.parametrize( - "mock_x, mock_y, mock_z", [(1, 2, 3), (0, 0, 0), (4, 6, 100)] - ) - def test_acceleration(self, mock_x, mock_y, mock_z): - clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_X] = mock_x - clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_Y] = mock_y - clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_Z] = mock_z - assert clue.acceleration == (mock_x, mock_y, mock_z) - - @pytest.mark.parametrize( - "mock_color_r, mock_color_g,mock_color_b,mock_color_c", - [(1, 2, 3, 4), (255, 255, 255, 255), (120, 140, 160, 180)], - ) - def test_color(self, mock_color_r, mock_color_g, mock_color_b, mock_color_c): - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_R] = mock_color_r - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_G] = mock_color_g - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_B] = mock_color_b - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_C] = mock_color_c - assert clue.color == (mock_color_r, mock_color_g, mock_color_b, mock_color_c) - - @pytest.mark.parametrize("mock_temperature", [-10, 0, 10]) - def test_temperature(self, mock_temperature): - clue._Clue__state[CONSTANTS.CLUE_STATE.TEMPERATURE] = mock_temperature - assert clue.temperature == mock_temperature - - @pytest.mark.parametrize( - "mock_magnetic_x, mock_magnetic_y, mock_magnetic_z", - [(1, 2, 3), (100, 150, 200), (10, 5, 15)], - ) - def test_magnetic(self, mock_magnetic_x, mock_magnetic_y, mock_magnetic_z): - clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_X] = mock_magnetic_x - clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_Y] = mock_magnetic_y - clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_Z] = mock_magnetic_z - assert clue.magnetic == (mock_magnetic_x, mock_magnetic_y, mock_magnetic_z,) - - @pytest.mark.parametrize("mock_distance", (0, 10, 250, 255)) - def test_proximity(self, mock_distance): - clue._Clue__state[CONSTANTS.CLUE_STATE.PROXIMITY] = mock_distance - assert clue.proximity == mock_distance - - @pytest.mark.parametrize( - "mock_gyro_x, mock_gyro_y, mock_gyro_z", - [(1, 2, 3), (100, 150, 200), (10, 5, 15)], - ) - def test_gyro(self, mock_gyro_x, mock_gyro_y, mock_gyro_z): - clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_X] = mock_gyro_x - clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_Y] = mock_gyro_y - clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_Z] = mock_gyro_z - assert clue.gyro == (mock_gyro_x, mock_gyro_y, mock_gyro_z) - - @pytest.mark.parametrize( - "gesture_word, gesture_number", - [("", 0), ("up", 1), ("down", 2), ("left", 3), ("right", 4)], - ) - def test_gesture(self, gesture_word, gesture_number): - clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = gesture_word - assert clue.gesture == gesture_number - - def test_shake(self): - NONE = "none" - SHAKE = "shake" - clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = SHAKE - assert clue.shake() - clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = NONE - assert not clue.shake() - - @pytest.mark.parametrize("mock_humidity", [0, 10, 50, 100]) - def test_humidity(self, mock_humidity): - clue._Clue__state[CONSTANTS.CLUE_STATE.HUMIDITY] = mock_humidity - assert clue.humidity == mock_humidity - - @pytest.mark.parametrize("mock_pressure", [0, 10, 50, 100]) - def test_pressure(self, mock_pressure): - clue._Clue__state[CONSTANTS.CLUE_STATE.PRESSURE] = mock_pressure - assert clue.pressure == mock_pressure - - @pytest.mark.parametrize( - "mock_pressure, mock_sea_level_pressure, expected_altitude", - [ - (1000, 1015, 125.42255615546036), - (1030, 1015, -123.93061640175468), - (1020, 1013, -58.13176263932101), - ], - ) - def test_altitude(self, mock_pressure, mock_sea_level_pressure, expected_altitude): - clue.sea_level_pressure = mock_sea_level_pressure - clue._Clue__state[CONSTANTS.CLUE_STATE.PRESSURE] = mock_pressure - assert expected_altitude == pytest.approx(clue.altitude) - - @pytest.mark.parametrize("mock_sea_level_pressure", [1040, 1015, 1013]) - def test_sea_level_pressure(self, mock_sea_level_pressure): - clue.sea_level_pressure = mock_sea_level_pressure - assert mock_sea_level_pressure == clue.sea_level_pressure - - @pytest.mark.parametrize( - "mock_color", [(255, 0, 0), (255, 255, 255), (123, 123, 123)] - ) - def test_pixel(self, mock_color): - clue.pixel.fill(mock_color) - assert clue.pixel[0] == mock_color - - @pytest.mark.parametrize( - "value, expected", - [(True, True), (False, False), (1, True), ("a", True), (0, False), ("", False)], - ) - def test_red_led(self, value, expected): - clue.red_led = value - assert clue.red_led == expected - - @pytest.mark.parametrize( - "value, expected", - [(True, True), (False, False), (1, True), ("a", True), (0, False), ("", False)], - ) - def test_white_leds(self, value, expected): - clue.white_leds = value - assert clue.white_leds == expected +import pytest + +import os +import pathlib +from PIL import Image + +from unittest import mock +from unittest.mock import MagicMock, patch + +from common import utils + +import displayio +import terminalio + +from ..adafruit_clue import clue +from .test_helpers import helper +from base_circuitpython import base_cp_constants as CONSTANTS + + +class TestAdafruitClue(object): + def setup_method(self): + self.abs_path = pathlib.Path(__file__).parent.absolute() + + self.main_img = Image.new( + "RGBA", + (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), + (0, 0, 0, 0), + ) + + utils.send_to_simulator = mock.Mock() + + def test_clue_display_text(self): + img = Image.open( + os.path.join(self.abs_path, CONSTANTS.IMG_DIR_NAME, f"test_clue_text_1.bmp") + ) + + img.putalpha(255) + expected = img.load() + clue_data = clue.simple_text_display(title="LET'S TEST!", title_scale=2) + + clue_data.text_group._Group__show = self.__send_helper + clue_data.text_group._Group__check_active_group_ref = False + + clue_data[0].text = "Lorem ipsum" + clue_data[1].text = "dolor sit amet, consectetur " + clue_data[2].text = "adipiscing:" + + clue_data[4].text = "e" + clue_data[5].text = "sed do eiusmod" + clue_data[6].text = "tempor incididunt\nut labore" + clue_data[7].text = "ut labore" + + clue_data[10].text = "et dolore" + clue_data[11].text = "magna" + clue_data[12].text = "aliqua\ntestest" + clue_data[13].text = "Ut enim ad" + clue_data[14].text = "Excepteur sint" + clue_data.show() + helper._Helper__test_image_equality(self.main_img.load(), expected) + + def __send_helper(self, image): + self.main_img = image + + def test_buttons(self): + clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_A, True) + assert clue.button_a + clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_A, False) + assert not clue.button_a + + clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_B, True) + assert clue.button_b + clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_B, False) + assert not clue.button_b + + assert clue.were_pressed == set(["A", "B"]) + assert clue.were_pressed == set() + + @pytest.mark.parametrize( + "mock_x, mock_y, mock_z", [(1, 2, 3), (0, 0, 0), (4, 6, 100)] + ) + def test_acceleration(self, mock_x, mock_y, mock_z): + clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_X] = mock_x + clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_Y] = mock_y + clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_Z] = mock_z + assert clue.acceleration == (mock_x, mock_y, mock_z) + + @pytest.mark.parametrize( + "mock_color_r, mock_color_g,mock_color_b,mock_color_c", + [(1, 2, 3, 4), (255, 255, 255, 255), (120, 140, 160, 180)], + ) + def test_color(self, mock_color_r, mock_color_g, mock_color_b, mock_color_c): + clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_R] = mock_color_r + clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_G] = mock_color_g + clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_B] = mock_color_b + clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_C] = mock_color_c + assert clue.color == (mock_color_r, mock_color_g, mock_color_b, mock_color_c) + + @pytest.mark.parametrize("mock_temperature", [-10, 0, 10]) + def test_temperature(self, mock_temperature): + clue._Clue__state[CONSTANTS.CLUE_STATE.TEMPERATURE] = mock_temperature + assert clue.temperature == mock_temperature + + @pytest.mark.parametrize( + "mock_magnetic_x, mock_magnetic_y, mock_magnetic_z", + [(1, 2, 3), (100, 150, 200), (10, 5, 15)], + ) + def test_magnetic(self, mock_magnetic_x, mock_magnetic_y, mock_magnetic_z): + clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_X] = mock_magnetic_x + clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_Y] = mock_magnetic_y + clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_Z] = mock_magnetic_z + assert clue.magnetic == (mock_magnetic_x, mock_magnetic_y, mock_magnetic_z,) + + @pytest.mark.parametrize("mock_distance", (0, 10, 250, 255)) + def test_proximity(self, mock_distance): + clue._Clue__state[CONSTANTS.CLUE_STATE.PROXIMITY] = mock_distance + assert clue.proximity == mock_distance + + @pytest.mark.parametrize( + "mock_gyro_x, mock_gyro_y, mock_gyro_z", + [(1, 2, 3), (100, 150, 200), (10, 5, 15)], + ) + def test_gyro(self, mock_gyro_x, mock_gyro_y, mock_gyro_z): + clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_X] = mock_gyro_x + clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_Y] = mock_gyro_y + clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_Z] = mock_gyro_z + assert clue.gyro == (mock_gyro_x, mock_gyro_y, mock_gyro_z) + + @pytest.mark.parametrize( + "gesture_word, gesture_number", + [("", 0), ("up", 1), ("down", 2), ("left", 3), ("right", 4)], + ) + def test_gesture(self, gesture_word, gesture_number): + clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = gesture_word + assert clue.gesture == gesture_number + + def test_shake(self): + NONE = "none" + SHAKE = "shake" + clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = SHAKE + assert clue.shake() + clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = NONE + assert not clue.shake() + + @pytest.mark.parametrize("mock_humidity", [0, 10, 50, 100]) + def test_humidity(self, mock_humidity): + clue._Clue__state[CONSTANTS.CLUE_STATE.HUMIDITY] = mock_humidity + assert clue.humidity == mock_humidity + + @pytest.mark.parametrize("mock_pressure", [0, 10, 50, 100]) + def test_pressure(self, mock_pressure): + clue._Clue__state[CONSTANTS.CLUE_STATE.PRESSURE] = mock_pressure + assert clue.pressure == mock_pressure + + @pytest.mark.parametrize( + "mock_pressure, mock_sea_level_pressure, expected_altitude", + [ + (1000, 1015, 125.42255615546036), + (1030, 1015, -123.93061640175468), + (1020, 1013, -58.13176263932101), + ], + ) + def test_altitude(self, mock_pressure, mock_sea_level_pressure, expected_altitude): + clue.sea_level_pressure = mock_sea_level_pressure + clue._Clue__state[CONSTANTS.CLUE_STATE.PRESSURE] = mock_pressure + assert expected_altitude == pytest.approx(clue.altitude) + + @pytest.mark.parametrize("mock_sea_level_pressure", [1040, 1015, 1013]) + def test_sea_level_pressure(self, mock_sea_level_pressure): + clue.sea_level_pressure = mock_sea_level_pressure + assert mock_sea_level_pressure == clue.sea_level_pressure + + @pytest.mark.parametrize( + "mock_color", [(255, 0, 0), (255, 255, 255), (123, 123, 123)] + ) + def test_pixel(self, mock_color): + clue.pixel.fill(mock_color) + assert clue.pixel[0] == mock_color + + @pytest.mark.parametrize( + "value, expected", + [(True, True), (False, False), (1, True), ("a", True), (0, False), ("", False)], + ) + def test_red_led(self, value, expected): + clue.red_led = value + assert clue.red_led == expected + + @pytest.mark.parametrize( + "value, expected", + [(True, True), (False, False), (1, True), ("a", True), (0, False), ("", False)], + ) + def test_white_leds(self, value, expected): + clue.white_leds = value + assert clue.white_leds == expected diff --git a/src/clue/test/test_adafruit_display_shapes.py b/src/clue/test/test_adafruit_display_shapes.py index 8c1c3c303..7be1c982f 100644 --- a/src/clue/test/test_adafruit_display_shapes.py +++ b/src/clue/test/test_adafruit_display_shapes.py @@ -1,81 +1,81 @@ -import pytest -import pathlib -import os - -import displayio - -from PIL import Image -from unittest import mock - -from common import utils - - -from adafruit_display_shapes.rect import Rect -from adafruit_display_shapes.circle import Circle -from adafruit_display_shapes.roundrect import RoundRect - -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS -import board - - -class TestAdafruitDisplayShapes(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - - utils.send_to_simulator = mock.Mock() - self.main_img = Image.new( - "RGBA", - (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), - (0, 0, 0, 0), - ) - - def test_shapes(self): - - expected_images = [] - for i in range(5): - img = Image.open( - os.path.join( - self.abs_path, - CONSTANTS.IMG_DIR_NAME, - f"test_image_shapes_{i+1}.bmp", - ) - ) - - img.putalpha(255) - expected_images.append(img.load()) - - # TAKEN FROM ADAFRUIT'S DISPLAY SHAPES LIBRARY - # https://github.com/ladyada/Adafruit_CircuitPython_Display_Shapes/blob/master/examples/display_shapes_simpletest.py - splash = displayio.Group(max_size=10) - splash._Group__show = self.__send_helper - board.DISPLAY.show(splash) - color_bitmap = displayio.Bitmap(320, 240, 1) - color_palette = displayio.Palette(1) - color_palette[0] = 0xFFFFFF - bg_sprite = displayio.TileGrid( - color_bitmap, x=0, y=0, pixel_shader=color_palette - ) - splash.append(bg_sprite) - helper._Helper__test_image_equality(self.main_img.load(), expected_images[0]) - - rect = Rect(80, 20, 41, 41, fill=0x00FF00) - splash.append(rect) - helper._Helper__test_image_equality(self.main_img.load(), expected_images[1]) - circle = Circle(100, 100, 20, fill=0x00FF00, outline=0xFF00FF) - splash.append(circle) - - helper._Helper__test_image_equality(self.main_img.load(), expected_images[2]) - - rect2 = Rect(50, 100, 61, 81, outline=0x0, stroke=3) - splash.append(rect2) - - helper._Helper__test_image_equality(self.main_img.load(), expected_images[3]) - - roundrect = RoundRect(10, 10, 61, 81, 10, fill=0x0, outline=0xFF00FF, stroke=6) - splash.append(roundrect) - - helper._Helper__test_image_equality(self.main_img.load(), expected_images[4]) - - def __send_helper(self, image): - self.main_img = image +import pytest +import pathlib +import os + +import displayio + +from PIL import Image +from unittest import mock + +from common import utils + + +from adafruit_display_shapes.rect import Rect +from adafruit_display_shapes.circle import Circle +from adafruit_display_shapes.roundrect import RoundRect + +from .test_helpers import helper +from base_circuitpython import base_cp_constants as CONSTANTS +import board + + +class TestAdafruitDisplayShapes(object): + def setup_method(self): + self.abs_path = pathlib.Path(__file__).parent.absolute() + + utils.send_to_simulator = mock.Mock() + self.main_img = Image.new( + "RGBA", + (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), + (0, 0, 0, 0), + ) + + def test_shapes(self): + + expected_images = [] + for i in range(5): + img = Image.open( + os.path.join( + self.abs_path, + CONSTANTS.IMG_DIR_NAME, + f"test_image_shapes_{i+1}.bmp", + ) + ) + + img.putalpha(255) + expected_images.append(img.load()) + + # TAKEN FROM ADAFRUIT'S DISPLAY SHAPES LIBRARY + # https://github.com/ladyada/Adafruit_CircuitPython_Display_Shapes/blob/master/examples/display_shapes_simpletest.py + splash = displayio.Group(max_size=10) + splash._Group__show = self.__send_helper + board.DISPLAY.show(splash) + color_bitmap = displayio.Bitmap(320, 240, 1) + color_palette = displayio.Palette(1) + color_palette[0] = 0xFFFFFF + bg_sprite = displayio.TileGrid( + color_bitmap, x=0, y=0, pixel_shader=color_palette + ) + splash.append(bg_sprite) + helper._Helper__test_image_equality(self.main_img.load(), expected_images[0]) + + rect = Rect(80, 20, 41, 41, fill=0x00FF00) + splash.append(rect) + helper._Helper__test_image_equality(self.main_img.load(), expected_images[1]) + circle = Circle(100, 100, 20, fill=0x00FF00, outline=0xFF00FF) + splash.append(circle) + + helper._Helper__test_image_equality(self.main_img.load(), expected_images[2]) + + rect2 = Rect(50, 100, 61, 81, outline=0x0, stroke=3) + splash.append(rect2) + + helper._Helper__test_image_equality(self.main_img.load(), expected_images[3]) + + roundrect = RoundRect(10, 10, 61, 81, 10, fill=0x0, outline=0xFF00FF, stroke=6) + splash.append(roundrect) + + helper._Helper__test_image_equality(self.main_img.load(), expected_images[4]) + + def __send_helper(self, image): + self.main_img = image diff --git a/src/clue/test/test_adafruit_display_text.py b/src/clue/test/test_adafruit_display_text.py index 922230275..f73ae3cd0 100644 --- a/src/clue/test/test_adafruit_display_text.py +++ b/src/clue/test/test_adafruit_display_text.py @@ -1,65 +1,65 @@ -import pytest - -import os -import sys -import pathlib -from PIL import Image -from unittest import mock - -from common import utils - -import displayio -import terminalio - -from adafruit_display_text import label - -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS - -# to keep track of test # to find right expected bmp -test_count = 0 - - -class TestAdafruitDisplayText(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - # Create a new black (default) image - utils.send_to_simulator = mock.Mock() - - @pytest.mark.parametrize( - "text, x,y, scale, color", - [ - ("Hello World", 1, 10, 4, (0, 22, 103)), - ("WWWWwwwmMMmmm", 30, 6, 1, (190, 173, 222)), - ("wOooo00ooo", 104, 49, 9, 0xEFEFEF), - ("!!!\n yay!", 100, 100, 5, (200, 200, 255)), - ], - ) - def test_display_text(self, text, x, y, scale, color): - global test_count - - expected_image = Image.open( - os.path.join( - self.abs_path, - CONSTANTS.IMG_DIR_NAME, - f"test_display_text_{test_count+1}.bmp", - ) - ) - expected_image.convert("RGBA") - expected_image.putalpha(255) - loaded_img = expected_image.load() - - text_area = label.Label( - terminalio.FONT, - text=text, - scale=scale, - color=color, - check_active_group_ref=False, - ) - text_area.x = x - text_area.y = y - - main_img = text_area._Group__draw() - - helper._Helper__test_image_equality(main_img.load(), loaded_img) - test_count += 1 +import pytest + +import os +import sys +import pathlib +from PIL import Image +from unittest import mock + +from common import utils + +import displayio +import terminalio + +from adafruit_display_text import label + +from .test_helpers import helper +from base_circuitpython import base_cp_constants as CONSTANTS + +# to keep track of test # to find right expected bmp +test_count = 0 + + +class TestAdafruitDisplayText(object): + def setup_method(self): + self.abs_path = pathlib.Path(__file__).parent.absolute() + # Create a new black (default) image + utils.send_to_simulator = mock.Mock() + + @pytest.mark.parametrize( + "text, x,y, scale, color", + [ + ("Hello World", 1, 10, 4, (0, 22, 103)), + ("WWWWwwwmMMmmm", 30, 6, 1, (190, 173, 222)), + ("wOooo00ooo", 104, 49, 9, 0xEFEFEF), + ("!!!\n yay!", 100, 100, 5, (200, 200, 255)), + ], + ) + def test_display_text(self, text, x, y, scale, color): + global test_count + + expected_image = Image.open( + os.path.join( + self.abs_path, + CONSTANTS.IMG_DIR_NAME, + f"test_display_text_{test_count+1}.bmp", + ) + ) + expected_image.convert("RGBA") + expected_image.putalpha(255) + loaded_img = expected_image.load() + + text_area = label.Label( + terminalio.FONT, + text=text, + scale=scale, + color=color, + check_active_group_ref=False, + ) + text_area.x = x + text_area.y = y + + main_img = text_area._Group__draw() + + helper._Helper__test_image_equality(main_img.load(), loaded_img) + test_count += 1 diff --git a/src/clue/test/test_adafruit_slideshow.py b/src/clue/test/test_adafruit_slideshow.py index 1f966b15a..b82c953d0 100644 --- a/src/clue/test/test_adafruit_slideshow.py +++ b/src/clue/test/test_adafruit_slideshow.py @@ -1,100 +1,100 @@ -from ..adafruit_slideshow import SlideShow, PlayBackDirection, PlayBackOrder -import board -import pathlib -import os - -from PIL import Image -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS - -from unittest import mock - -from common import utils - - -class TestAdafruitSlideShow(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - - # Create a new black (default) image - self.main_img = Image.new( - "RGBA", - (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), - (0, 0, 0, 0), - ) - - utils.send_to_simulator = mock.Mock() - - def test_slideshow(self): - - pic_dir = os.path.join(self.abs_path, "slideshow_pics") - slideshow_images = [] - for i in range(8): - img = Image.open(os.path.join(pic_dir, f"pic_{i+1}.bmp")) - img = img.convert("RGBA") - img.putalpha(255) - - img = img.crop( - (0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - - if img.size[0] < 240 or img.size[1] < 240: - black_overlay = Image.new( - "RGBA", - CONSTANTS.SCREEN_HEIGHT_WIDTH, - CONSTANTS.SCREEN_HEIGHT_WIDTH, - ) - black_overlay.paste(img) - img = black_overlay - - slideshow_images.append(img) - - # Create the slideshow object that plays through once alphabetically. - slideshow = SlideShow( - board.DISPLAY, - dwell=3, - folder=pic_dir, - loop=True, - fade_effect=True, - auto_advance=True, - order=PlayBackOrder.ALPHABETICAL, - direction=PlayBackDirection.FORWARD, - ) - - slideshow._SlideShow__send = self.__send_helper - - # first image's appear time is unstable,since it fades/scrolls in - # can only predict following ones... - - for i in range(1, 8): - slideshow.advance() - helper._Helper__test_image_equality( - self.main_img.load(), slideshow_images[i].load() - ) - - # Create the slideshow object that plays through once backwards. - slideshow2 = SlideShow( - board.DISPLAY, - dwell=3, - folder=pic_dir, - loop=True, - fade_effect=False, - auto_advance=True, - order=PlayBackOrder.ALPHABETICAL, - direction=PlayBackDirection.BACKWARD, - ) - - slideshow2._SlideShow__send = self.__send_helper - - helper._Helper__test_image_equality( - self.main_img.load(), slideshow_images[7].load() - ) - - for i in range(6, -1, -1): - slideshow2.advance() - helper._Helper__test_image_equality( - self.main_img.load(), slideshow_images[i].load() - ) - - def __send_helper(self, image): - self.main_img = image +from ..adafruit_slideshow import SlideShow, PlayBackDirection, PlayBackOrder +import board +import pathlib +import os + +from PIL import Image +from .test_helpers import helper +from base_circuitpython import base_cp_constants as CONSTANTS + +from unittest import mock + +from common import utils + + +class TestAdafruitSlideShow(object): + def setup_method(self): + self.abs_path = pathlib.Path(__file__).parent.absolute() + + # Create a new black (default) image + self.main_img = Image.new( + "RGBA", + (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), + (0, 0, 0, 0), + ) + + utils.send_to_simulator = mock.Mock() + + def test_slideshow(self): + + pic_dir = os.path.join(self.abs_path, "slideshow_pics") + slideshow_images = [] + for i in range(8): + img = Image.open(os.path.join(pic_dir, f"pic_{i+1}.bmp")) + img = img.convert("RGBA") + img.putalpha(255) + + img = img.crop( + (0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) + ) + + if img.size[0] < 240 or img.size[1] < 240: + black_overlay = Image.new( + "RGBA", + CONSTANTS.SCREEN_HEIGHT_WIDTH, + CONSTANTS.SCREEN_HEIGHT_WIDTH, + ) + black_overlay.paste(img) + img = black_overlay + + slideshow_images.append(img) + + # Create the slideshow object that plays through once alphabetically. + slideshow = SlideShow( + board.DISPLAY, + dwell=3, + folder=pic_dir, + loop=True, + fade_effect=True, + auto_advance=True, + order=PlayBackOrder.ALPHABETICAL, + direction=PlayBackDirection.FORWARD, + ) + + slideshow._SlideShow__send = self.__send_helper + + # first image's appear time is unstable,since it fades/scrolls in + # can only predict following ones... + + for i in range(1, 8): + slideshow.advance() + helper._Helper__test_image_equality( + self.main_img.load(), slideshow_images[i].load() + ) + + # Create the slideshow object that plays through once backwards. + slideshow2 = SlideShow( + board.DISPLAY, + dwell=3, + folder=pic_dir, + loop=True, + fade_effect=False, + auto_advance=True, + order=PlayBackOrder.ALPHABETICAL, + direction=PlayBackDirection.BACKWARD, + ) + + slideshow2._SlideShow__send = self.__send_helper + + helper._Helper__test_image_equality( + self.main_img.load(), slideshow_images[7].load() + ) + + for i in range(6, -1, -1): + slideshow2.advance() + helper._Helper__test_image_equality( + self.main_img.load(), slideshow_images[i].load() + ) + + def __send_helper(self, image): + self.main_img = image diff --git a/src/clue/test/test_helpers.py b/src/clue/test/test_helpers.py index 429965aaf..ef8c7caf2 100644 --- a/src/clue/test/test_helpers.py +++ b/src/clue/test/test_helpers.py @@ -1,32 +1,32 @@ -from base_circuitpython import base_cp_constants as CONSTANTS - - -class Helper: - def __test_image_equality(self, image_1, image_2): - for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - pixel_1 = image_1[j, i] - pixel_2 = image_2[j, i] - - if not isinstance(pixel_1, tuple): - pixel_1 = self.hex2rgba(pixel_1) - - if not isinstance(pixel_2, tuple): - pixel_2 = self.hex2rgba(pixel_2) - assert pixel_1[0:3] == pixel_2[0:3] - - def hex2rgba(self, curr_colour): - - ret_list = [] - - for i in range(3, -1, -1): - val = (curr_colour >> (2 ** (i + 1))) & 255 - if val == 0: - ret_list.append(0) - else: - ret_list.append(val) - - return tuple(ret_list) - - -helper = Helper() +from base_circuitpython import base_cp_constants as CONSTANTS + + +class Helper: + def __test_image_equality(self, image_1, image_2): + for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): + for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): + pixel_1 = image_1[j, i] + pixel_2 = image_2[j, i] + + if not isinstance(pixel_1, tuple): + pixel_1 = self.hex2rgba(pixel_1) + + if not isinstance(pixel_2, tuple): + pixel_2 = self.hex2rgba(pixel_2) + assert pixel_1[0:3] == pixel_2[0:3] + + def hex2rgba(self, curr_colour): + + ret_list = [] + + for i in range(3, -1, -1): + val = (curr_colour >> (2 ** (i + 1))) & 255 + if val == 0: + ret_list.append(0) + else: + ret_list.append(val) + + return tuple(ret_list) + + +helper = Helper() diff --git a/src/common/constants.py b/src/common/constants.py index c0592c7db..8495f421d 100644 --- a/src/common/constants.py +++ b/src/common/constants.py @@ -1,12 +1,12 @@ -MAC_OS = "darwin" - -ERROR_SENDING_EVENT = "Error trying to send event to the process : " - -ACTIVE_DEVICE_FIELD = "active_device" -STATE_FIELD = "state" - -CONNECTION_ATTEMPTS = 10 -TIME_DELAY = 0.03 -DEFAULT_PORT = "5577" - -MICROPYTHON_LIBRARY_NAME = "micropython" +MAC_OS = "darwin" + +ERROR_SENDING_EVENT = "Error trying to send event to the process : " + +ACTIVE_DEVICE_FIELD = "active_device" +STATE_FIELD = "state" + +CONNECTION_ATTEMPTS = 10 +TIME_DELAY = 0.03 +DEFAULT_PORT = "5577" + +MICROPYTHON_LIBRARY_NAME = "micropython" diff --git a/src/common/telemetry_events.py b/src/common/telemetry_events.py index a140c823b..a0155529e 100644 --- a/src/common/telemetry_events.py +++ b/src/common/telemetry_events.py @@ -1,65 +1,65 @@ -import enum - - -class TelemetryEvent(enum.Enum): - CPX_API_ACCELERATION = "CPX.API.ACCELERATION" - CPX_API_BUTTON_A = "CPX.API.BUTTON.A" - CPX_API_BUTTON_B = "CPX.API.BUTTON.B" - CPX_API_SWITCH = "CPX.API.SWITCH" - CPX_API_TEMPERATURE = "CPX.API.TEMPERATURE" - CPX_API_BRIGHTNESS = "CPX.API.BRIGHTNESS" - CPX_API_LIGHT = "CPX.API.LIGHT" - CPX_API_TOUCH = "CPX.API.TOUCH" - CPX_API_SHAKE = "CPX.API.SHAKE" - CPX_API_TAPPED = "CPX.API.TAPPED" - CPX_API_PLAY_FILE = "CPX.API.PLAY.FILE" - CPX_API_PLAY_TONE = "CPX.API.PLAY.TONE" - CPX_API_START_TONE = "CPX.API.START.TONE" - CPX_API_STOP_TONE = "CPX.API.STOP.TONE" - CPX_API_DETECT_TAPS = "CPX.API.DETECT.TAPS" - CPX_API_ADJUST_THRESHOLD = "CPX.API.ADJUST.THRESHOLD" - CPX_API_RED_LED = "CPX.API.RED.LED" - CPX_API_PIXELS = "CPX.API.PIXELS" - MICROBIT_API_TEMPERATURE = "MICROBIT.API.TEMPERATURE" - MICROBIT_API_ACCELEROMETER = "MICROBIT.API.ACCELEROMETER" - MICROBIT_API_GESTURE = "MICROBIT.API.GESTURE" - MICROBIT_API_DISPLAY_SCROLL = "MICROBIT.API.DISPLAY.SCROLL" - MICROBIT_API_DISPLAY_SHOW = "MICROBIT.API.DISPLAY.SHOW" - MICROBIT_API_DISPLAY_OTHER = "MICROBIT.API.DISPLAY_OTHER" - MICROBIT_API_LIGHT_LEVEL = "MICROBIT.API.LIGHT.LEVEL" - MICROBIT_API_IMAGE_CREATION = "MICROBIT.API.IMAGE.CREATION" - MICROBIT_API_IMAGE_OTHER = "MICROBIT.API.IMAGE.OTHER" - MICROBIT_API_IMAGE_STATIC = "MICROBIT.API.IMAGE.STATIC" - MICROBIT_API_BUTTON = "MICROBIT.API.BUTTON" - MICROBIT_API_COMPASS = "MICROBIT.API.COMPASS" - MICROBIT_API_I2C = "MICROBIT.API.I2C" - MICROBIT_API_SPI = "MICROBIT.API.SPI" - MICROBIT_API_AUDIO = "MICROBIT.API.AUDIO" - MICROBIT_API_MUSIC = "MICROBIT.API.MUSIC" - MICROBIT_API_NEOPIXEL = "MICROBIT.API.NEOPIXEL" - MICROBIT_API_RADIO = "MICROBIT.API.RADIO" - MICROBIT_API_SPEECH = "MICROBIT.API.SPEECH" - MICROBIT_API_UTIME = "MICROBIT.API.UTIME" - CLUE_API_ACCELERATION = "CLUE.API.ACCELERATION" - CLUE_API_BUTTON_A = "CLUE.API.BUTTON.A" - CLUE_API_BUTTON_B = "CLUE.API.BUTTON.B" - CLUE_API_WERE_PRESSED = "CLUE.API.WERE.PRESSED" - CLUE_API_SHAKE = "CLUE.API.SHAKE" - CLUE_API_COLOR = "CLUE.API.COLOR" - CLUE_API_TEMPERATURE = "CLUE.API.TEMPERATURE" - CLUE_API_MAGNETIC = "CLUE.API.MAGNETIC" - CLUE_API_PROXIMITY = "CLUE.API.PROXIMITY" - CLUE_API_GYRO = "CLUE.API.GYRO" - CLUE_API_GESTURE = "CLUE.API.GESTURE" - CLUE_API_HUMIDITY = "CLUE.API.HUMIDITY" - CLUE_API_PRESSURE = "CLUE.API.PRESSURE" - CLUE_API_ALTITUDE = "CLUE.API.ALTITUDE" - CLUE_API_SEA_LEVEL_PRESSURE = "CLUE.API.SEA.LEVEL.PRESSURE" - CLUE_API_PIXEL = "CLUE.API.PIXEL" - CLUE_API_TOUCH = "CLUE.API.TOUCH" - CLUE_API_WHITE_LEDS = "CLUE.API.WHITE.LEDS" - CLUE_API_RED_LED = "CLUE.API.RED.LED" - CLUE_API_SOUND = "CLUE.API.SOUND" - CLUE_API_TEXT_DISPLAY = "CLUE.API.TEXT.DISPLAY" - CLUE_API_SLIDESHOW = "CLUE.API.SLIDESHOW" - CLUE_API_TILE_GRID = "CLUE.API.TILE.GRID" +import enum + + +class TelemetryEvent(enum.Enum): + CPX_API_ACCELERATION = "CPX.API.ACCELERATION" + CPX_API_BUTTON_A = "CPX.API.BUTTON.A" + CPX_API_BUTTON_B = "CPX.API.BUTTON.B" + CPX_API_SWITCH = "CPX.API.SWITCH" + CPX_API_TEMPERATURE = "CPX.API.TEMPERATURE" + CPX_API_BRIGHTNESS = "CPX.API.BRIGHTNESS" + CPX_API_LIGHT = "CPX.API.LIGHT" + CPX_API_TOUCH = "CPX.API.TOUCH" + CPX_API_SHAKE = "CPX.API.SHAKE" + CPX_API_TAPPED = "CPX.API.TAPPED" + CPX_API_PLAY_FILE = "CPX.API.PLAY.FILE" + CPX_API_PLAY_TONE = "CPX.API.PLAY.TONE" + CPX_API_START_TONE = "CPX.API.START.TONE" + CPX_API_STOP_TONE = "CPX.API.STOP.TONE" + CPX_API_DETECT_TAPS = "CPX.API.DETECT.TAPS" + CPX_API_ADJUST_THRESHOLD = "CPX.API.ADJUST.THRESHOLD" + CPX_API_RED_LED = "CPX.API.RED.LED" + CPX_API_PIXELS = "CPX.API.PIXELS" + MICROBIT_API_TEMPERATURE = "MICROBIT.API.TEMPERATURE" + MICROBIT_API_ACCELEROMETER = "MICROBIT.API.ACCELEROMETER" + MICROBIT_API_GESTURE = "MICROBIT.API.GESTURE" + MICROBIT_API_DISPLAY_SCROLL = "MICROBIT.API.DISPLAY.SCROLL" + MICROBIT_API_DISPLAY_SHOW = "MICROBIT.API.DISPLAY.SHOW" + MICROBIT_API_DISPLAY_OTHER = "MICROBIT.API.DISPLAY_OTHER" + MICROBIT_API_LIGHT_LEVEL = "MICROBIT.API.LIGHT.LEVEL" + MICROBIT_API_IMAGE_CREATION = "MICROBIT.API.IMAGE.CREATION" + MICROBIT_API_IMAGE_OTHER = "MICROBIT.API.IMAGE.OTHER" + MICROBIT_API_IMAGE_STATIC = "MICROBIT.API.IMAGE.STATIC" + MICROBIT_API_BUTTON = "MICROBIT.API.BUTTON" + MICROBIT_API_COMPASS = "MICROBIT.API.COMPASS" + MICROBIT_API_I2C = "MICROBIT.API.I2C" + MICROBIT_API_SPI = "MICROBIT.API.SPI" + MICROBIT_API_AUDIO = "MICROBIT.API.AUDIO" + MICROBIT_API_MUSIC = "MICROBIT.API.MUSIC" + MICROBIT_API_NEOPIXEL = "MICROBIT.API.NEOPIXEL" + MICROBIT_API_RADIO = "MICROBIT.API.RADIO" + MICROBIT_API_SPEECH = "MICROBIT.API.SPEECH" + MICROBIT_API_UTIME = "MICROBIT.API.UTIME" + CLUE_API_ACCELERATION = "CLUE.API.ACCELERATION" + CLUE_API_BUTTON_A = "CLUE.API.BUTTON.A" + CLUE_API_BUTTON_B = "CLUE.API.BUTTON.B" + CLUE_API_WERE_PRESSED = "CLUE.API.WERE.PRESSED" + CLUE_API_SHAKE = "CLUE.API.SHAKE" + CLUE_API_COLOR = "CLUE.API.COLOR" + CLUE_API_TEMPERATURE = "CLUE.API.TEMPERATURE" + CLUE_API_MAGNETIC = "CLUE.API.MAGNETIC" + CLUE_API_PROXIMITY = "CLUE.API.PROXIMITY" + CLUE_API_GYRO = "CLUE.API.GYRO" + CLUE_API_GESTURE = "CLUE.API.GESTURE" + CLUE_API_HUMIDITY = "CLUE.API.HUMIDITY" + CLUE_API_PRESSURE = "CLUE.API.PRESSURE" + CLUE_API_ALTITUDE = "CLUE.API.ALTITUDE" + CLUE_API_SEA_LEVEL_PRESSURE = "CLUE.API.SEA.LEVEL.PRESSURE" + CLUE_API_PIXEL = "CLUE.API.PIXEL" + CLUE_API_TOUCH = "CLUE.API.TOUCH" + CLUE_API_WHITE_LEDS = "CLUE.API.WHITE.LEDS" + CLUE_API_RED_LED = "CLUE.API.RED.LED" + CLUE_API_SOUND = "CLUE.API.SOUND" + CLUE_API_TEXT_DISPLAY = "CLUE.API.TEXT.DISPLAY" + CLUE_API_SLIDESHOW = "CLUE.API.SLIDESHOW" + CLUE_API_TILE_GRID = "CLUE.API.TILE.GRID" diff --git a/src/constants.ts b/src/constants.ts index b14d875f0..fe702c639 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -7,549 +7,549 @@ import * as nls from "vscode-nls"; // Debugger Server export const SERVER_INFO = { - DEFAULT_SERVER_PORT: 5577, - ERROR_CODE_INIT_SERVER: "ERROR_INIT_SERVER", - SERVER_PORT_CONFIGURATION: "deviceSimulatorExpress.debuggerServerPort", + DEFAULT_SERVER_PORT: 5577, + ERROR_CODE_INIT_SERVER: "ERROR_INIT_SERVER", + SERVER_PORT_CONFIGURATION: "deviceSimulatorExpress.debuggerServerPort", }; const localize: nls.LocalizeFunc = nls.config({ - messageFormat: nls.MessageFormat.file, + messageFormat: nls.MessageFormat.file, })(); export const CONFIG = { - CONFIG_ENV_ON_SWITCH: - "deviceSimulatorExpress.configNewEnvironmentUponSwitch", - PYTHON_PATH: "python.pythonPath", - SHOW_DEPENDENCY_INSTALL: "deviceSimulatorExpress.showDependencyInstall", - SHOW_NEW_FILE_POPUP: "deviceSimulatorExpress.showNewFilePopup", + CONFIG_ENV_ON_SWITCH: + "deviceSimulatorExpress.configNewEnvironmentUponSwitch", + PYTHON_PATH: "python.pythonPath", + SHOW_DEPENDENCY_INSTALL: "deviceSimulatorExpress.showDependencyInstall", + SHOW_NEW_FILE_POPUP: "deviceSimulatorExpress.showNewFilePopup", }; export const CONSTANTS = { - WEBVIEW_TYPE: { - SIMULATOR: "simulator", - TUTORIAL: "tutorial", - }, - DEBUG_CONFIGURATION_TYPE: "deviceSimulatorExpress", - DEVICE_NAME: { - CPX: "CPX", - MICROBIT: "micro:bit", - CLUE: "CLUE", - }, - DEVICE_NAME_FORMAL: { - CPX: "Circuit Playground Express", - MICROBIT: "micro:bit", - CLUE: "CLUE", - }, - SCRIPT_PATH: { - SIMULATOR: "out/simulator.js", - VSCODE_API: "out/vscode_import.js", - }, - ERROR: { - BAD_PYTHON_PATH: - 'Your interpreter is not pointing to a valid Python executable. Please select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application', - COMPORT_UNKNOWN_ERROR: - "Writing to COM port (GetOverlappedResult): Unknown error code 121", - CPX_FILE_ERROR: localize( - "error.cpxFileFormat", - "The cpx.json file format is not correct." - ), - DEBUGGER_SERVER_INIT_FAILED: (port: number) => { - return localize( - "error.debuggerServerInitFailed", - `Warning : The Debugger Server cannot be opened. Please try to free the port ${port} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.` - ); - }, - DEBUGGING_SESSION_IN_PROGESS: localize( - "error.debuggingSessionInProgress", - "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n" - ), - DEPENDENCY_DOWNLOAD_ERROR: - "Dependency download could not be completed. Functionality may be limited. Please review the installation docs.", - - FAILED_TO_OPEN_SERIAL_PORT: (port: string): string => { - return localize( - "error.failedToOpenSerialPort", - `[ERROR] Failed to open serial port ${port}.` - ); - }, - FAILED_TO_OPEN_SERIAL_PORT_DUE_TO: (port: string, error: any) => { - return localize( - "error.failedToOpenSerialPortDueTo", - `[ERROR] Failed to open serial port ${port} due to error: ${error}. \n` - ); - }, - INSTALLATION_ERROR: localize( - "error.installationError", - "Installation Error" - ), - - INVALID_FILE_EXTENSION_DEBUG: localize( - "error.invalidFileExtensionDebug", - "The file you tried to run isn't a Python file." - ), - INVALID_PYTHON_PATH: localize( - "error.invalidPythonPath", - 'We found that your selected Python interpreter version is too low to run the extension. Please upgrade to version 3.7+ or select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application.' - ), - LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT: localize( - "error.lowPythonVersionForMicrobitDeployment", - "To deploy your code to the micro:bit, you must be using Python 3.3+" - ), - NO_DEVICE: localize( - "error.noDevice", - "The device is not detected. Please double check if your board is connected and/or properly formatted" - ), - NO_FILE_TO_RUN: localize( - "error.noFileToRun", - '[ERROR] We can\'t find a Python file to run. Please make sure you select or open a new ".py" code file, or use the "New File" command to get started and see useful links.\n' - ), - NO_FILE_TO_DEPLOY: localize( - "error.noFileToDeploy", - "[ERROR] We can't find a Python file to deploy to your device.\n" - ), - NO_FOLDER_OPENED: localize( - "error.noFolderCreated", - "In order to use the Serial Monitor, you need to open a folder and reload VS Code." - ), - NO_PROGRAM_FOUND_DEBUG: localize( - "error.noProgramFoundDebug", - "Cannot find a program to debug." - ), - NO_PYTHON_PATH: localize( - "error.noPythonPath", - "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again." - ), - RECONNECT_DEVICE: localize( - "error.reconnectDevice", - "Please disconnect your Circuit Playground Express and try again." - ), - STDERR: (data: string) => { - return localize("error.stderr", `\n[ERROR] ${data} \n`); - }, - UNEXPECTED_MESSAGE: localize( - "error.unexpectedMessage", - "Webview sent an unexpected message" - ), - }, - FILESYSTEM: { - BASE_CIRCUITPYTHON: "base_circuitpython", - CLUE: "clue", - PYTHON_VENV_DIR: "venv", - MICROPYTHON_DIRECTORY: "micropython", - OUTPUT_DIRECTORY: "out", - }, - INFO: { - ALREADY_SUCCESSFUL_INSTALL: localize( - "info.successfulInstall", - "Your current configuration is already successfully set up for the Device Simulator Expresss." - ), - ARE_YOU_SURE: localize( - "info.areYouSure", - "Are you sure you don't want to install the dependencies? The extension can't run without installing them." - ), - CLOSED_SERIAL_PORT: (port: string) => { - return localize( - "info.closedSerialPort", - `[DONE] Closed the serial port - ${port} \n` - ); - }, - COMPLETED_MESSAGE: "Completed", - CPX_JSON_ALREADY_GENERATED: localize( - "info.cpxJsonAlreadyGenerated", - "cpx.json has already been generated." - ), - DEPLOY_DEVICE: localize( - "info.deployDevice", - "\n[INFO] Deploying code to the device...\n" - ), - DEPLOY_SIMULATOR: localize( - "info.deploySimulator", - "\n[INFO] Deploying code to the simulator...\n" - ), - DEPLOY_SUCCESS: localize( - "info.deploySuccess", - "\n[INFO] Code successfully copied! Your device should be loading and ready to go shortly.\n" - ), - EXTENSION_ACTIVATED: localize( - "info.extensionActivated", - "Congratulations, your extension Device Simulator Express is now active!" - ), - FILE_SELECTED: (filePath: string) => { - return localize( - "info.fileSelected", - `[INFO] File selected : ${filePath} \n` - ); - }, - FIRST_TIME_WEBVIEW: localize( - "info.firstTimeWebview", - 'To reopen the simulator select the command "Open Simulator" from command palette.' - ), - INSTALLING_PYTHON_VENV: localize( - "info.installingPythonVenv", - "A virtual environment is currently being created. The required Python packages will be installed. You will be prompted a message telling you when the installation is done." - ), - INSTALL_PYTHON_DEPS: localize( - "info.installPythonDependencies", - "Do you want us to try and install this extension's dependencies on your selected Python interpreter for you?" - ), - INSTALL_PYTHON_VENV: localize( - "info.installPythonVenv", - "Do you want us to try and install this extension's dependencies via virtual environment for you?" - ), - NEW_FILE: localize( - "info.newFile", - "New to Python or the Circuit Playground Express? We are here to help!" - ), - NO_DEVICE_CHOSEN_TO_DEPLOY_TO: localize( - "info.noDeviceChosenToDeployTo", - "\n[INFO] No device was selected to deploy to.\n" - ), - NO_DEVICE_CHOSEN_TO_SIMULATE_TO: localize( - "info.noDeviceChosenToSimulateTo", - "\n[INFO] No device was selected to simulate.\n" - ), - NO_DEVICE_CHOSEN_FOR_NEW_FILE: localize( - "info.noDeviceChosenForNewFile", - "\n[INFO] No device was selected to open a template file for.\n" - ), - OPENED_SERIAL_PORT: (port: string) => { - return localize( - "info.openedSerialPort", - `[INFO] Opened the serial port - ${port} \n` - ); - }, - OPENING_SERIAL_PORT: (port: string) => { - return localize( - "info.openingSerialPort", - `[STARTING] Opening the serial port - ${port} \n` - ); - }, - PLEASE_OPEN_FOLDER: localize( - "info.pleaseOpenFolder", - "Please open a folder first." - ), - REDIRECT: localize("info.redirect", "You are being redirected."), - RUNNING_CODE: localize("info.runningCode", "Running user code"), - SUCCESSFUL_INSTALL: localize( - "info.successfulInstall", - "Successfully set up the Python environment." - ), - THIRD_PARTY_WEBSITE_ADAFRUIT: localize( - "info.thirdPartyWebsiteAdafruit", - 'By clicking "Agree and Proceed" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit\'s privacy policy' - ), - THIRD_PARTY_WEBSITE_PIP: localize( - "info.thirdPartyWebsitePip", - 'By clicking "Agree and Proceed" you will be redirected to pip.pypa.io, a third party website not managed by Microsoft. Please note that your activity on pip.pypa.io is subject to PyPA\'s privacy policy' - ), - THIRD_PARTY_WEBSITE_PYTHON: localize( - "info.thirdPartyWebsitePython", - 'By clicking "Agree and Proceed" you will be redirected to python.org, a third party website not managed by Microsoft. Please note that your activity on python.org is subject to Python\'s privacy policy' - ), - UPDATED_TO_EXTENSION_VENV: localize( - "info.updatedToExtensionsVenv", - "Automatically updated interpreter to point to extension's virtual environment." - ), - WELCOME_OUTPUT_TAB: localize( - "info.welcomeOutputTab", - "Welcome to the Device Simulator Express output tab!\n\n" - ), - }, - LABEL: { - WEBVIEW_PANEL: localize( - "label.webviewPanel", - "Device Simulator Express" - ), - }, - LINKS: { - DOWNLOAD_PIP: "https://pip.pypa.io/en/stable/installing/", - DOWNLOAD_PYTHON: "https://www.python.org/downloads/", - EXAMPLE_CODE: - "https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples", - CPX_HELP: - "https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart", - CLUE_HELP: "https://learn.adafruit.com/adafruit-clue/circuitpython", - INSTALL: - "https://github.com/microsoft/vscode-python-devicesimulator/blob/dev/docs/install.md", - PRIVACY: "https://www.adafruit.com/privacy", - TUTORIALS: - "https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library", - }, - MISC: { - SELECT_PORT_PLACEHOLDER: localize( - "misc.selectPortPlaceholder", - "Select a serial port" - ), - SERIAL_MONITOR_NAME: localize( - "misc.serialMonitorName", - "Device Simulator Express Serial Monitor" - ), - SERIAL_MONITOR_TEST_IF_OPEN: localize( - "misc.testIfPortOpen", - "Test if serial port is open" - ), - }, - NAME: localize("name", "Device Simulator Express"), - TEMPLATE: { - CPX: "cpx_template.py", - MICROBIT: "microbit_template.py", - CLUE: "clue_template.py", - }, - WARNING: { - ACCEPT_AND_RUN: localize( - "warning.agreeAndRun", - "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk." - ), - INVALID_BAUD_RATE: localize( - "warning.invalidBaudRate", - "Invalid baud rate, keep baud rate unchanged." - ), - NO_RATE_SELECTED: localize( - "warning.noRateSelected", - "No rate is selected, keep baud rate unchanged." - ), - NO_SERIAL_PORT_SELECTED: localize( - "warning.noSerialPortSelected", - "No serial port was selected, please select a serial port first" - ), - SERIAL_MONITOR_ALREADY_OPENED: (port: string) => { - return localize( - "warning.serialMonitorAlreadyOpened", - `Serial monitor is already opened for ${port} \n` - ); - }, - SERIAL_MONITOR_NOT_STARTED: localize( - "warning.serialMonitorNotStarted", - "Serial monitor has not been started." - ), - SERIAL_PORT_NOT_STARTED: localize( - "warning.serialPortNotStarted", - "Serial port has not been started.\n" - ), - }, + WEBVIEW_TYPE: { + SIMULATOR: "simulator", + TUTORIAL: "tutorial", + }, + DEBUG_CONFIGURATION_TYPE: "deviceSimulatorExpress", + DEVICE_NAME: { + CPX: "CPX", + MICROBIT: "micro:bit", + CLUE: "CLUE", + }, + DEVICE_NAME_FORMAL: { + CPX: "Circuit Playground Express", + MICROBIT: "micro:bit", + CLUE: "CLUE", + }, + SCRIPT_PATH: { + SIMULATOR: "out/simulator.js", + VSCODE_API: "out/vscode_import.js", + }, + ERROR: { + BAD_PYTHON_PATH: + 'Your interpreter is not pointing to a valid Python executable. Please select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application', + COMPORT_UNKNOWN_ERROR: + "Writing to COM port (GetOverlappedResult): Unknown error code 121", + CPX_FILE_ERROR: localize( + "error.cpxFileFormat", + "The cpx.json file format is not correct." + ), + DEBUGGER_SERVER_INIT_FAILED: (port: number) => { + return localize( + "error.debuggerServerInitFailed", + `Warning : The Debugger Server cannot be opened. Please try to free the port ${port} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.` + ); + }, + DEBUGGING_SESSION_IN_PROGESS: localize( + "error.debuggingSessionInProgress", + "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n" + ), + DEPENDENCY_DOWNLOAD_ERROR: + "Dependency download could not be completed. Functionality may be limited. Please review the installation docs.", + + FAILED_TO_OPEN_SERIAL_PORT: (port: string): string => { + return localize( + "error.failedToOpenSerialPort", + `[ERROR] Failed to open serial port ${port}.` + ); + }, + FAILED_TO_OPEN_SERIAL_PORT_DUE_TO: (port: string, error: any) => { + return localize( + "error.failedToOpenSerialPortDueTo", + `[ERROR] Failed to open serial port ${port} due to error: ${error}. \n` + ); + }, + INSTALLATION_ERROR: localize( + "error.installationError", + "Installation Error" + ), + + INVALID_FILE_EXTENSION_DEBUG: localize( + "error.invalidFileExtensionDebug", + "The file you tried to run isn't a Python file." + ), + INVALID_PYTHON_PATH: localize( + "error.invalidPythonPath", + 'We found that your selected Python interpreter version is too low to run the extension. Please upgrade to version 3.7+ or select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application.' + ), + LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT: localize( + "error.lowPythonVersionForMicrobitDeployment", + "To deploy your code to the micro:bit, you must be using Python 3.3+" + ), + NO_DEVICE: localize( + "error.noDevice", + "The device is not detected. Please double check if your board is connected and/or properly formatted" + ), + NO_FILE_TO_RUN: localize( + "error.noFileToRun", + '[ERROR] We can\'t find a Python file to run. Please make sure you select or open a new ".py" code file, or use the "New File" command to get started and see useful links.\n' + ), + NO_FILE_TO_DEPLOY: localize( + "error.noFileToDeploy", + "[ERROR] We can't find a Python file to deploy to your device.\n" + ), + NO_FOLDER_OPENED: localize( + "error.noFolderCreated", + "In order to use the Serial Monitor, you need to open a folder and reload VS Code." + ), + NO_PROGRAM_FOUND_DEBUG: localize( + "error.noProgramFoundDebug", + "Cannot find a program to debug." + ), + NO_PYTHON_PATH: localize( + "error.noPythonPath", + "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again." + ), + RECONNECT_DEVICE: localize( + "error.reconnectDevice", + "Please disconnect your Circuit Playground Express and try again." + ), + STDERR: (data: string) => { + return localize("error.stderr", `\n[ERROR] ${data} \n`); + }, + UNEXPECTED_MESSAGE: localize( + "error.unexpectedMessage", + "Webview sent an unexpected message" + ), + }, + FILESYSTEM: { + BASE_CIRCUITPYTHON: "base_circuitpython", + CLUE: "clue", + PYTHON_VENV_DIR: "venv", + MICROPYTHON_DIRECTORY: "micropython", + OUTPUT_DIRECTORY: "out", + }, + INFO: { + ALREADY_SUCCESSFUL_INSTALL: localize( + "info.successfulInstall", + "Your current configuration is already successfully set up for the Device Simulator Expresss." + ), + ARE_YOU_SURE: localize( + "info.areYouSure", + "Are you sure you don't want to install the dependencies? The extension can't run without installing them." + ), + CLOSED_SERIAL_PORT: (port: string) => { + return localize( + "info.closedSerialPort", + `[DONE] Closed the serial port - ${port} \n` + ); + }, + COMPLETED_MESSAGE: "Completed", + CPX_JSON_ALREADY_GENERATED: localize( + "info.cpxJsonAlreadyGenerated", + "cpx.json has already been generated." + ), + DEPLOY_DEVICE: localize( + "info.deployDevice", + "\n[INFO] Deploying code to the device...\n" + ), + DEPLOY_SIMULATOR: localize( + "info.deploySimulator", + "\n[INFO] Deploying code to the simulator...\n" + ), + DEPLOY_SUCCESS: localize( + "info.deploySuccess", + "\n[INFO] Code successfully copied! Your device should be loading and ready to go shortly.\n" + ), + EXTENSION_ACTIVATED: localize( + "info.extensionActivated", + "Congratulations, your extension Device Simulator Express is now active!" + ), + FILE_SELECTED: (filePath: string) => { + return localize( + "info.fileSelected", + `[INFO] File selected : ${filePath} \n` + ); + }, + FIRST_TIME_WEBVIEW: localize( + "info.firstTimeWebview", + 'To reopen the simulator select the command "Open Simulator" from command palette.' + ), + INSTALLING_PYTHON_VENV: localize( + "info.installingPythonVenv", + "A virtual environment is currently being created. The required Python packages will be installed. You will be prompted a message telling you when the installation is done." + ), + INSTALL_PYTHON_DEPS: localize( + "info.installPythonDependencies", + "Do you want us to try and install this extension's dependencies on your selected Python interpreter for you?" + ), + INSTALL_PYTHON_VENV: localize( + "info.installPythonVenv", + "Do you want us to try and install this extension's dependencies via virtual environment for you?" + ), + NEW_FILE: localize( + "info.newFile", + "New to Python or the Circuit Playground Express? We are here to help!" + ), + NO_DEVICE_CHOSEN_TO_DEPLOY_TO: localize( + "info.noDeviceChosenToDeployTo", + "\n[INFO] No device was selected to deploy to.\n" + ), + NO_DEVICE_CHOSEN_TO_SIMULATE_TO: localize( + "info.noDeviceChosenToSimulateTo", + "\n[INFO] No device was selected to simulate.\n" + ), + NO_DEVICE_CHOSEN_FOR_NEW_FILE: localize( + "info.noDeviceChosenForNewFile", + "\n[INFO] No device was selected to open a template file for.\n" + ), + OPENED_SERIAL_PORT: (port: string) => { + return localize( + "info.openedSerialPort", + `[INFO] Opened the serial port - ${port} \n` + ); + }, + OPENING_SERIAL_PORT: (port: string) => { + return localize( + "info.openingSerialPort", + `[STARTING] Opening the serial port - ${port} \n` + ); + }, + PLEASE_OPEN_FOLDER: localize( + "info.pleaseOpenFolder", + "Please open a folder first." + ), + REDIRECT: localize("info.redirect", "You are being redirected."), + RUNNING_CODE: localize("info.runningCode", "Running user code"), + SUCCESSFUL_INSTALL: localize( + "info.successfulInstall", + "Successfully set up the Python environment." + ), + THIRD_PARTY_WEBSITE_ADAFRUIT: localize( + "info.thirdPartyWebsiteAdafruit", + 'By clicking "Agree and Proceed" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit\'s privacy policy' + ), + THIRD_PARTY_WEBSITE_PIP: localize( + "info.thirdPartyWebsitePip", + 'By clicking "Agree and Proceed" you will be redirected to pip.pypa.io, a third party website not managed by Microsoft. Please note that your activity on pip.pypa.io is subject to PyPA\'s privacy policy' + ), + THIRD_PARTY_WEBSITE_PYTHON: localize( + "info.thirdPartyWebsitePython", + 'By clicking "Agree and Proceed" you will be redirected to python.org, a third party website not managed by Microsoft. Please note that your activity on python.org is subject to Python\'s privacy policy' + ), + UPDATED_TO_EXTENSION_VENV: localize( + "info.updatedToExtensionsVenv", + "Automatically updated interpreter to point to extension's virtual environment." + ), + WELCOME_OUTPUT_TAB: localize( + "info.welcomeOutputTab", + "Welcome to the Device Simulator Express output tab!\n\n" + ), + }, + LABEL: { + WEBVIEW_PANEL: localize( + "label.webviewPanel", + "Device Simulator Express" + ), + }, + LINKS: { + DOWNLOAD_PIP: "https://pip.pypa.io/en/stable/installing/", + DOWNLOAD_PYTHON: "https://www.python.org/downloads/", + EXAMPLE_CODE: + "https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples", + CPX_HELP: + "https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart", + CLUE_HELP: "https://learn.adafruit.com/adafruit-clue/circuitpython", + INSTALL: + "https://github.com/microsoft/vscode-python-devicesimulator/blob/dev/docs/install.md", + PRIVACY: "https://www.adafruit.com/privacy", + TUTORIALS: + "https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library", + }, + MISC: { + SELECT_PORT_PLACEHOLDER: localize( + "misc.selectPortPlaceholder", + "Select a serial port" + ), + SERIAL_MONITOR_NAME: localize( + "misc.serialMonitorName", + "Device Simulator Express Serial Monitor" + ), + SERIAL_MONITOR_TEST_IF_OPEN: localize( + "misc.testIfPortOpen", + "Test if serial port is open" + ), + }, + NAME: localize("name", "Device Simulator Express"), + TEMPLATE: { + CPX: "cpx_template.py", + MICROBIT: "microbit_template.py", + CLUE: "clue_template.py", + }, + WARNING: { + ACCEPT_AND_RUN: localize( + "warning.agreeAndRun", + "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk." + ), + INVALID_BAUD_RATE: localize( + "warning.invalidBaudRate", + "Invalid baud rate, keep baud rate unchanged." + ), + NO_RATE_SELECTED: localize( + "warning.noRateSelected", + "No rate is selected, keep baud rate unchanged." + ), + NO_SERIAL_PORT_SELECTED: localize( + "warning.noSerialPortSelected", + "No serial port was selected, please select a serial port first" + ), + SERIAL_MONITOR_ALREADY_OPENED: (port: string) => { + return localize( + "warning.serialMonitorAlreadyOpened", + `Serial monitor is already opened for ${port} \n` + ); + }, + SERIAL_MONITOR_NOT_STARTED: localize( + "warning.serialMonitorNotStarted", + "Serial monitor has not been started." + ), + SERIAL_PORT_NOT_STARTED: localize( + "warning.serialPortNotStarted", + "Serial port has not been started.\n" + ), + }, }; export enum CONFIG_KEYS { - ENABLE_USB_DETECTION = "deviceSimulatorExpress.enableUSBDetection", + ENABLE_USB_DETECTION = "deviceSimulatorExpress.enableUSBDetection", } export enum TelemetryEventName { - FAILED_TO_OPEN_SIMULATOR = "SIMULATOR.FAILED_TO_OPEN", - - // Debugger - CPX_DEBUGGER_INIT_SUCCESS = "CPX.DEBUGGER.INIT.SUCCESS", - CPX_DEBUGGER_INIT_FAIL = "CPX.DEBUGGER.INIT.FAIL", - MICROBIT_DEBUGGER_INIT_SUCCESS = "MICROBIT.DEBUGGER.INIT.SUCCESS", - MICROBIT_DEBUGGER_INIT_FAIL = "MICROBIT.DEBUGGER.INIT.FAIL", - CLUE_DEBUGGER_INIT_SUCCESS = "CLUE.DEBUGGER.INIT.SUCCESS", - CLUE_DEBUGGER_INIT_FAIL = "CLUE.DEBUGGER.INIT.FAIL", - - // Extension commands - COMMAND_RUN_SIMULATOR_BUTTON = "COMMAND.RUN.SIMULATOR_BUTTON", - COMMAND_RUN_PALETTE = "COMMAND.RUN.PALETTE", - COMMAND_INSTALL_EXTENSION_DEPENDENCIES = "COMMAND.INSTALL.EXTENSION.DEPENDENCIES", - COMMAND_SERIAL_MONITOR_CHOOSE_PORT = "COMMAND.SERIAL_MONITOR.CHOOSE_PORT", - COMMAND_SERIAL_MONITOR_OPEN = "COMMAND.SERIAL_MONITOR.OPEN", - COMMAND_SERIAL_MONITOR_BAUD_RATE = "COMMAND.SERIAL_MONITOR.BAUD_RATE", - COMMAND_SERIAL_MONITOR_CLOSE = "COMMAND.SERIAL_MONITOR.CLOSE", - COMMAND_GETTING_STARTED = "COMMAND.GETTING_STARTED", - - CPX_COMMAND_DEPLOY_DEVICE = "CPX.COMMAND.DEPLOY.DEVICE", - CPX_COMMAND_NEW_FILE = "CPX.COMMAND.NEW.FILE.CPX", - CPX_COMMAND_OPEN_SIMULATOR = "CPX.COMMAND.OPEN.SIMULATOR", - - MICROBIT_COMMAND_DEPLOY_DEVICE = "MICROBIT.COMMAND.DEPLOY.DEVICE", - MICROBIT_COMMAND_NEW_FILE = "MICROBIT.COMMAND.NEW.FILE", - MICROBIT_COMMAND_OPEN_SIMULATOR = "MICROBIT.COMMAND.OPEN.SIMULATOR", - - CLUE_COMMAND_DEPLOY_DEVICE = "CLUE.COMMAND.DEPLOY.DEVICE", - CLUE_COMMAND_NEW_FILE = "CLUE.COMMAND.NEW.FILE.CPX", - CLUE_COMMAND_OPEN_SIMULATOR = "CLUE.COMMAND.OPEN.SIMULATOR", - - // Simulator interaction - CPX_SIMULATOR_BUTTON_A = "CPX.SIMULATOR.BUTTON.A", - CPX_SIMULATOR_BUTTON_B = "CPX.SIMULATOR.BUTTON.B", - CPX_SIMULATOR_BUTTON_AB = "CPX.SIMULATOR.BUTTON.AB", - CPX_SIMULATOR_SWITCH = "CPX.SIMULATOR.SWITCH", - - MICROBIT_SIMULATOR_BUTTON_A = "MICROBIT.SIMULATOR.BUTTON.A", - MICROBIT_SIMULATOR_BUTTON_B = "MICROBIT.SIMULATOR.BUTTON.B", - MICROBIT_SIMULATOR_BUTTON_AB = "MICROBIT.SIMULATOR.BUTTON.AB", - - CLUE_SIMULATOR_BUTTON_A = "CLUE.SIMULATOR.BUTTON.A", - CLUE_SIMULATOR_BUTTON_B = "CLUE.SIMULATOR.BUTTON.B", - CLUE_SIMULATOR_BUTTON_AB = "CLUE.SIMULATOR.BUTTON.AB", - - // Sensors - CPX_SIMULATOR_TEMPERATURE_SENSOR = "CPX.SIMULATOR.TEMPERATURE", - CPX_SIMULATOR_LIGHT_SENSOR = "CPX.SIMULATOR.LIGHT", - CPX_SIMULATOR_MOTION_SENSOR = "CPX.SIMULATOR.MOTION", - CPX_SIMULATOR_SHAKE = "CPX.SIMULATOR.SHAKE", - CPX_SIMULATOR_CAPACITIVE_TOUCH = "CPX.SIMULATOR.CAPACITIVE.TOUCH", - - MICROBIT_SIMULATOR_TEMPERATURE_SENSOR = "MICROBIT.SIMULATOR.TEMPERATURE", - MICROBIT_SIMULATOR_LIGHT_SENSOR = "MICROBIT.SIMULATOR.LIGHT", - MICROBIT_SIMULATOR_MOTION_SENSOR = "MICROBIT.SIMULATOR.MOTION", - MICROBIT_SIMULATOR_GESTURE_SENSOR = "MICROBIT.SIMULATOR.GESTURE", - - CLUE_SIMULATOR_TEMPERATURE_SENSOR = "CLUE.SIMULATOR.TEMPERATURE", - CLUE_SIMULATOR_LIGHT_SENSOR = "CLUE.SIMULATOR.LIGHT", - CLUE_SIMULATOR_MOTION_SENSOR = "CLUE.SIMULATOR.MOTION", - CLUE_SIMULATOR_GESTURE_SENSOR = "CLUE.SIMULATOR.GESTURE", - CLUE_SIMULATOR_PRESSURE_SENSOR = "CLUE.SIMULATOR.PRESSURE", - CLUE_SIMULATOR_PROXIMITY_SENSOR = "CLUE.SIMULATOR.PROXIMITY", - CLUE_SIMULATOR_HUMIDITY_SENSOR = "CLUE.SIMULATOR.HUMIDITY", - CLUE_SIMULATOR_GYRO_SENSOR = "CLUE.SIMULATOR.GYRO", - CLUE_SIMULATOR_MAGNET_SENSOR = "CLUE.SIMULATOR.MAGNET", - - // Pop-up dialog - CPX_CLICK_DIALOG_DONT_SHOW = "CPX.CLICK.DIALOG.DONT.SHOW", - CPX_CLICK_DIALOG_EXAMPLE_CODE = "CPX.CLICK.DIALOG.EXAMPLE.CODE", - CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CPX.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", - CPX_CLICK_DIALOG_TUTORIALS = "CPX.CLICK.DIALOG.TUTORIALS", - - CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CLUE.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", - - ERROR_PYTHON_PROCESS = "ERROR.PYTHON.PROCESS", - - CPX_ERROR_COMMAND_NEW_FILE = "CPX.ERROR.COMMAND.NEW.FILE", - CPX_ERROR_DEPLOY_WITHOUT_DEVICE = "CPX.ERROR.DEPLOY.WITHOUT.DEVICE", - CPX_ERROR_PYTHON_DEVICE_PROCESS = "CPX.ERROR.PYTHON.DEVICE.PROCESS", - CPX_SUCCESS_COMMAND_DEPLOY_DEVICE = "CPX.SUCCESS.COMMAND.DEPLOY.DEVICE", - - MICROBIT_ERROR_COMMAND_NEW_FILE = "MICROBIT.ERROR.COMMAND.NEW.FILE", - MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE = "MICROBIT.ERROR.DEPLOY.WITHOUT.DEVICE", - MICROBIT_ERROR_PYTHON_DEVICE_PROCESS = "MICROBIT.ERROR.PYTHON.DEVICE.PROCESS", - MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE = "MICROBIT.SUCCESS.COMMAND.DEPLOY.DEVICE", - - CLUE_ERROR_COMMAND_NEW_FILE = "CLUE.ERROR.COMMAND.NEW.FILE", - CLUE_ERROR_DEPLOY_WITHOUT_DEVICE = "CLUE.ERROR.DEPLOY.WITHOUT.DEVICE", - CLUE_ERROR_PYTHON_DEVICE_PROCESS = "CLUE.ERROR.PYTHON.DEVICE.PROCESS", - CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE = "CLUE.SUCCESS.COMMAND.DEPLOY.DEVICE", - - // Performance - CPX_PERFORMANCE_DEPLOY_DEVICE = "CPX.PERFORMANCE.DEPLOY.DEVICE", - CPX_PERFORMANCE_NEW_FILE = "CPX.PERFORMANCE.NEW.FILE", - CPX_PERFORMANCE_OPEN_SIMULATOR = "CPX.PERFORMANCE.OPEN.SIMULATOR", - - MICROBIT_PERFORMANCE_DEPLOY_DEVICE = "MICROBIT.PERFORMANCE.DEPLOY.DEVICE", - MICROBIT_PERFORMANCE_NEW_FILE = "MICROBIT.PERFORMANCE.NEW.FILE", - MICROBIT_PERFORMANCE_OPEN_SIMULATOR = "MICROBIT.PERFORMANCE.OPEN.SIMULATOR", - - CLUE_PERFORMANCE_DEPLOY_DEVICE = "CLUE.PERFORMANCE.DEPLOY.DEVICE", - CLUE_PERFORMANCE_NEW_FILE = "CLUE.PERFORMANCE.NEW.FILE", - CLUE_PERFORMANCE_OPEN_SIMULATOR = "CLUE.PERFORMANCE.OPEN.SIMULATOR", - - // Venv options - SETUP_VENV_CREATION_ERR = "SETUP.VENV.CREATION.ERR", - SETUP_NO_PIP = "SETUP.NO.PIP", - SETUP_DEP_INSTALL_FAIL = "SETUP.DEP.INSTALL.FAIL", - SETUP_AUTO_RESOLVE_PYTHON_PATH = "SETUP.AUTO.RESOLVE.PYTHON.PATH", - SETUP_NO_PYTHON_PATH = "SETUP.NO.PYTHON.PATH", - SETUP_DOWNLOAD_PYTHON = "SETUP.DOWNLOAD.PYTHON", - SETUP_INVALID_PYTHON_INTERPRETER_PATH = "SETUP.INVALID.PYTHON.INTERPRETER.PATH", - SETUP_INVALID_PYTHON_VER = "SETUP.INVALID.PYTHON.VER", - SETUP_INSTALL_VENV = "SETUP.INSTALL.VENV", - SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL = "SETUP.ORIGINAL.INTERPRETER.DEP.INSTALL", - SETUP_HAS_VENV = "SETUP.HAS.VENV", - SETUP_NO_DEPS_INSTALLED = "SETUP.NO.DEPS.INSTALLED", + FAILED_TO_OPEN_SIMULATOR = "SIMULATOR.FAILED_TO_OPEN", + + // Debugger + CPX_DEBUGGER_INIT_SUCCESS = "CPX.DEBUGGER.INIT.SUCCESS", + CPX_DEBUGGER_INIT_FAIL = "CPX.DEBUGGER.INIT.FAIL", + MICROBIT_DEBUGGER_INIT_SUCCESS = "MICROBIT.DEBUGGER.INIT.SUCCESS", + MICROBIT_DEBUGGER_INIT_FAIL = "MICROBIT.DEBUGGER.INIT.FAIL", + CLUE_DEBUGGER_INIT_SUCCESS = "CLUE.DEBUGGER.INIT.SUCCESS", + CLUE_DEBUGGER_INIT_FAIL = "CLUE.DEBUGGER.INIT.FAIL", + + // Extension commands + COMMAND_RUN_SIMULATOR_BUTTON = "COMMAND.RUN.SIMULATOR_BUTTON", + COMMAND_RUN_PALETTE = "COMMAND.RUN.PALETTE", + COMMAND_INSTALL_EXTENSION_DEPENDENCIES = "COMMAND.INSTALL.EXTENSION.DEPENDENCIES", + COMMAND_SERIAL_MONITOR_CHOOSE_PORT = "COMMAND.SERIAL_MONITOR.CHOOSE_PORT", + COMMAND_SERIAL_MONITOR_OPEN = "COMMAND.SERIAL_MONITOR.OPEN", + COMMAND_SERIAL_MONITOR_BAUD_RATE = "COMMAND.SERIAL_MONITOR.BAUD_RATE", + COMMAND_SERIAL_MONITOR_CLOSE = "COMMAND.SERIAL_MONITOR.CLOSE", + COMMAND_GETTING_STARTED = "COMMAND.GETTING_STARTED", + + CPX_COMMAND_DEPLOY_DEVICE = "CPX.COMMAND.DEPLOY.DEVICE", + CPX_COMMAND_NEW_FILE = "CPX.COMMAND.NEW.FILE.CPX", + CPX_COMMAND_OPEN_SIMULATOR = "CPX.COMMAND.OPEN.SIMULATOR", + + MICROBIT_COMMAND_DEPLOY_DEVICE = "MICROBIT.COMMAND.DEPLOY.DEVICE", + MICROBIT_COMMAND_NEW_FILE = "MICROBIT.COMMAND.NEW.FILE", + MICROBIT_COMMAND_OPEN_SIMULATOR = "MICROBIT.COMMAND.OPEN.SIMULATOR", + + CLUE_COMMAND_DEPLOY_DEVICE = "CLUE.COMMAND.DEPLOY.DEVICE", + CLUE_COMMAND_NEW_FILE = "CLUE.COMMAND.NEW.FILE.CPX", + CLUE_COMMAND_OPEN_SIMULATOR = "CLUE.COMMAND.OPEN.SIMULATOR", + + // Simulator interaction + CPX_SIMULATOR_BUTTON_A = "CPX.SIMULATOR.BUTTON.A", + CPX_SIMULATOR_BUTTON_B = "CPX.SIMULATOR.BUTTON.B", + CPX_SIMULATOR_BUTTON_AB = "CPX.SIMULATOR.BUTTON.AB", + CPX_SIMULATOR_SWITCH = "CPX.SIMULATOR.SWITCH", + + MICROBIT_SIMULATOR_BUTTON_A = "MICROBIT.SIMULATOR.BUTTON.A", + MICROBIT_SIMULATOR_BUTTON_B = "MICROBIT.SIMULATOR.BUTTON.B", + MICROBIT_SIMULATOR_BUTTON_AB = "MICROBIT.SIMULATOR.BUTTON.AB", + + CLUE_SIMULATOR_BUTTON_A = "CLUE.SIMULATOR.BUTTON.A", + CLUE_SIMULATOR_BUTTON_B = "CLUE.SIMULATOR.BUTTON.B", + CLUE_SIMULATOR_BUTTON_AB = "CLUE.SIMULATOR.BUTTON.AB", + + // Sensors + CPX_SIMULATOR_TEMPERATURE_SENSOR = "CPX.SIMULATOR.TEMPERATURE", + CPX_SIMULATOR_LIGHT_SENSOR = "CPX.SIMULATOR.LIGHT", + CPX_SIMULATOR_MOTION_SENSOR = "CPX.SIMULATOR.MOTION", + CPX_SIMULATOR_SHAKE = "CPX.SIMULATOR.SHAKE", + CPX_SIMULATOR_CAPACITIVE_TOUCH = "CPX.SIMULATOR.CAPACITIVE.TOUCH", + + MICROBIT_SIMULATOR_TEMPERATURE_SENSOR = "MICROBIT.SIMULATOR.TEMPERATURE", + MICROBIT_SIMULATOR_LIGHT_SENSOR = "MICROBIT.SIMULATOR.LIGHT", + MICROBIT_SIMULATOR_MOTION_SENSOR = "MICROBIT.SIMULATOR.MOTION", + MICROBIT_SIMULATOR_GESTURE_SENSOR = "MICROBIT.SIMULATOR.GESTURE", + + CLUE_SIMULATOR_TEMPERATURE_SENSOR = "CLUE.SIMULATOR.TEMPERATURE", + CLUE_SIMULATOR_LIGHT_SENSOR = "CLUE.SIMULATOR.LIGHT", + CLUE_SIMULATOR_MOTION_SENSOR = "CLUE.SIMULATOR.MOTION", + CLUE_SIMULATOR_GESTURE_SENSOR = "CLUE.SIMULATOR.GESTURE", + CLUE_SIMULATOR_PRESSURE_SENSOR = "CLUE.SIMULATOR.PRESSURE", + CLUE_SIMULATOR_PROXIMITY_SENSOR = "CLUE.SIMULATOR.PROXIMITY", + CLUE_SIMULATOR_HUMIDITY_SENSOR = "CLUE.SIMULATOR.HUMIDITY", + CLUE_SIMULATOR_GYRO_SENSOR = "CLUE.SIMULATOR.GYRO", + CLUE_SIMULATOR_MAGNET_SENSOR = "CLUE.SIMULATOR.MAGNET", + + // Pop-up dialog + CPX_CLICK_DIALOG_DONT_SHOW = "CPX.CLICK.DIALOG.DONT.SHOW", + CPX_CLICK_DIALOG_EXAMPLE_CODE = "CPX.CLICK.DIALOG.EXAMPLE.CODE", + CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CPX.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", + CPX_CLICK_DIALOG_TUTORIALS = "CPX.CLICK.DIALOG.TUTORIALS", + + CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CLUE.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", + + ERROR_PYTHON_PROCESS = "ERROR.PYTHON.PROCESS", + + CPX_ERROR_COMMAND_NEW_FILE = "CPX.ERROR.COMMAND.NEW.FILE", + CPX_ERROR_DEPLOY_WITHOUT_DEVICE = "CPX.ERROR.DEPLOY.WITHOUT.DEVICE", + CPX_ERROR_PYTHON_DEVICE_PROCESS = "CPX.ERROR.PYTHON.DEVICE.PROCESS", + CPX_SUCCESS_COMMAND_DEPLOY_DEVICE = "CPX.SUCCESS.COMMAND.DEPLOY.DEVICE", + + MICROBIT_ERROR_COMMAND_NEW_FILE = "MICROBIT.ERROR.COMMAND.NEW.FILE", + MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE = "MICROBIT.ERROR.DEPLOY.WITHOUT.DEVICE", + MICROBIT_ERROR_PYTHON_DEVICE_PROCESS = "MICROBIT.ERROR.PYTHON.DEVICE.PROCESS", + MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE = "MICROBIT.SUCCESS.COMMAND.DEPLOY.DEVICE", + + CLUE_ERROR_COMMAND_NEW_FILE = "CLUE.ERROR.COMMAND.NEW.FILE", + CLUE_ERROR_DEPLOY_WITHOUT_DEVICE = "CLUE.ERROR.DEPLOY.WITHOUT.DEVICE", + CLUE_ERROR_PYTHON_DEVICE_PROCESS = "CLUE.ERROR.PYTHON.DEVICE.PROCESS", + CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE = "CLUE.SUCCESS.COMMAND.DEPLOY.DEVICE", + + // Performance + CPX_PERFORMANCE_DEPLOY_DEVICE = "CPX.PERFORMANCE.DEPLOY.DEVICE", + CPX_PERFORMANCE_NEW_FILE = "CPX.PERFORMANCE.NEW.FILE", + CPX_PERFORMANCE_OPEN_SIMULATOR = "CPX.PERFORMANCE.OPEN.SIMULATOR", + + MICROBIT_PERFORMANCE_DEPLOY_DEVICE = "MICROBIT.PERFORMANCE.DEPLOY.DEVICE", + MICROBIT_PERFORMANCE_NEW_FILE = "MICROBIT.PERFORMANCE.NEW.FILE", + MICROBIT_PERFORMANCE_OPEN_SIMULATOR = "MICROBIT.PERFORMANCE.OPEN.SIMULATOR", + + CLUE_PERFORMANCE_DEPLOY_DEVICE = "CLUE.PERFORMANCE.DEPLOY.DEVICE", + CLUE_PERFORMANCE_NEW_FILE = "CLUE.PERFORMANCE.NEW.FILE", + CLUE_PERFORMANCE_OPEN_SIMULATOR = "CLUE.PERFORMANCE.OPEN.SIMULATOR", + + // Venv options + SETUP_VENV_CREATION_ERR = "SETUP.VENV.CREATION.ERR", + SETUP_NO_PIP = "SETUP.NO.PIP", + SETUP_DEP_INSTALL_FAIL = "SETUP.DEP.INSTALL.FAIL", + SETUP_AUTO_RESOLVE_PYTHON_PATH = "SETUP.AUTO.RESOLVE.PYTHON.PATH", + SETUP_NO_PYTHON_PATH = "SETUP.NO.PYTHON.PATH", + SETUP_DOWNLOAD_PYTHON = "SETUP.DOWNLOAD.PYTHON", + SETUP_INVALID_PYTHON_INTERPRETER_PATH = "SETUP.INVALID.PYTHON.INTERPRETER.PATH", + SETUP_INVALID_PYTHON_VER = "SETUP.INVALID.PYTHON.VER", + SETUP_INSTALL_VENV = "SETUP.INSTALL.VENV", + SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL = "SETUP.ORIGINAL.INTERPRETER.DEP.INSTALL", + SETUP_HAS_VENV = "SETUP.HAS.VENV", + SETUP_NO_DEPS_INSTALLED = "SETUP.NO.DEPS.INSTALLED", } export const DEFAULT_DEVICE = CONSTANTS.DEVICE_NAME.CPX; // tslint:disable-next-line: no-namespace export namespace DialogResponses { - export const ACCEPT_AND_RUN: MessageItem = { - title: localize("dialogResponses.agreeAndRun", "Agree and Run"), - }; - export const AGREE_AND_PROCEED: MessageItem = { - title: localize("dialogResponses.agreeAndProceed", "Agree and Proceed"), - }; - export const CANCEL: MessageItem = { - title: localize("dialogResponses.cancel", "Cancel"), - }; - export const SELECT: MessageItem = { - title: localize("dialogResponses.select", "Select"), - }; - export const HELP: MessageItem = { - title: localize("dialogResponses.help", "I need help"), - }; - export const DONT_SHOW: MessageItem = { - title: localize("dialogResponses.dontShowAgain", "Don't Show Again"), - }; - export const NO: MessageItem = { - title: localize("dialogResponses.No", "No"), - }; - export const INSTALL_NOW: MessageItem = { - title: localize("dialogResponses.installNow", "Install Now"), - }; - export const DONT_INSTALL: MessageItem = { - title: localize("dialogResponses.dontInstall", "Don't Install"), - }; - export const PRIVACY_STATEMENT: MessageItem = { - title: localize("info.privacyStatement", "Privacy Statement"), - }; - export const TUTORIALS: MessageItem = { - title: localize("dialogResponses.tutorials", "Tutorials on Adafruit"), - }; - export const EXAMPLE_CODE: MessageItem = { - title: localize( - "dialogResponses.exampleCode", - "Example Code on GitHub" - ), - }; - export const MESSAGE_UNDERSTOOD: MessageItem = { - title: localize("dialogResponses.messageUnderstood", "Got It"), - }; - export const INSTALL_PIP: MessageItem = { - title: localize( - "dialogResponses.installPip", - "Install from Pip's webpage" - ), - }; - export const INSTALL_PYTHON: MessageItem = { - title: localize( - "dialogResponses.installPython", - "Install from python.org" - ), - }; - export const YES: MessageItem = { - title: localize("dialogResponses.Yes", "Yes"), - }; - export const READ_INSTALL_MD: MessageItem = { - title: localize( - "dialogResponses.readInstall", - "Read installation docs" - ), - }; + export const ACCEPT_AND_RUN: MessageItem = { + title: localize("dialogResponses.agreeAndRun", "Agree and Run"), + }; + export const AGREE_AND_PROCEED: MessageItem = { + title: localize("dialogResponses.agreeAndProceed", "Agree and Proceed"), + }; + export const CANCEL: MessageItem = { + title: localize("dialogResponses.cancel", "Cancel"), + }; + export const SELECT: MessageItem = { + title: localize("dialogResponses.select", "Select"), + }; + export const HELP: MessageItem = { + title: localize("dialogResponses.help", "I need help"), + }; + export const DONT_SHOW: MessageItem = { + title: localize("dialogResponses.dontShowAgain", "Don't Show Again"), + }; + export const NO: MessageItem = { + title: localize("dialogResponses.No", "No"), + }; + export const INSTALL_NOW: MessageItem = { + title: localize("dialogResponses.installNow", "Install Now"), + }; + export const DONT_INSTALL: MessageItem = { + title: localize("dialogResponses.dontInstall", "Don't Install"), + }; + export const PRIVACY_STATEMENT: MessageItem = { + title: localize("info.privacyStatement", "Privacy Statement"), + }; + export const TUTORIALS: MessageItem = { + title: localize("dialogResponses.tutorials", "Tutorials on Adafruit"), + }; + export const EXAMPLE_CODE: MessageItem = { + title: localize( + "dialogResponses.exampleCode", + "Example Code on GitHub" + ), + }; + export const MESSAGE_UNDERSTOOD: MessageItem = { + title: localize("dialogResponses.messageUnderstood", "Got It"), + }; + export const INSTALL_PIP: MessageItem = { + title: localize( + "dialogResponses.installPip", + "Install from Pip's webpage" + ), + }; + export const INSTALL_PYTHON: MessageItem = { + title: localize( + "dialogResponses.installPython", + "Install from python.org" + ), + }; + export const YES: MessageItem = { + title: localize("dialogResponses.Yes", "Yes"), + }; + export const READ_INSTALL_MD: MessageItem = { + title: localize( + "dialogResponses.readInstall", + "Read installation docs" + ), + }; } export const CPX_CONFIG_FILE = path.join(".vscode", "cpx.json"); export const STATUS_BAR_PRIORITY = { - PORT: 20, - OPEN_PORT: 30, - BAUD_RATE: 40, + PORT: 20, + OPEN_PORT: 30, + BAUD_RATE: 40, }; export const VERSIONS = { - MIN_PY_VERSION: "Python 3.7.0", + MIN_PY_VERSION: "Python 3.7.0", }; export const HELPER_FILES = { - CHECK_IF_VENV_PY: "check_if_venv.py", - CHECK_PYTHON_DEPENDENCIES: "check_python_dependencies.py", - DEVICE_PY: "device.py", - PROCESS_USER_CODE_PY: "process_user_code.py", - PYTHON_EXE: "python.exe", - PYTHON: "python", + CHECK_IF_VENV_PY: "check_if_venv.py", + CHECK_PYTHON_DEPENDENCIES: "check_python_dependencies.py", + DEVICE_PY: "device.py", + PROCESS_USER_CODE_PY: "process_user_code.py", + PYTHON_EXE: "python.exe", + PYTHON: "python", }; export const GLOBAL_ENV_VARS = { - PYTHON: "python", - PYTHON3: "python3", + PYTHON: "python", + PYTHON3: "python3", }; export const LANGUAGE_VARS = { - PYTHON: { ID: "python", FILE_ENDS: ".py" }, + PYTHON: { ID: "python", FILE_ENDS: ".py" }, }; export default CONSTANTS; diff --git a/src/cpxWorkspace.ts b/src/cpxWorkspace.ts index 47239a79a..cec9a6289 100644 --- a/src/cpxWorkspace.ts +++ b/src/cpxWorkspace.ts @@ -3,24 +3,24 @@ import * as path from "path"; import * as vscode from "vscode"; export class CPXWorkspace { - static get rootPath(): string | undefined { - const workspaceFolders = vscode.workspace.workspaceFolders; - if (!workspaceFolders || workspaceFolders.length === 0) { - return undefined; - } + static get rootPath(): string | undefined { + const workspaceFolders = vscode.workspace.workspaceFolders; + if (!workspaceFolders || workspaceFolders.length === 0) { + return undefined; + } - for (const workspaceFolder of workspaceFolders) { - const workspaceFolderPath = workspaceFolder.uri.fsPath; - const cpxConfigPath = path.join( - workspaceFolderPath, - ".vscode", - "cpx.json" - ); - if (fs.existsSync(cpxConfigPath)) { - return workspaceFolderPath; - } - } + for (const workspaceFolder of workspaceFolders) { + const workspaceFolderPath = workspaceFolder.uri.fsPath; + const cpxConfigPath = path.join( + workspaceFolderPath, + ".vscode", + "cpx.json" + ); + if (fs.existsSync(cpxConfigPath)) { + return workspaceFolderPath; + } + } - return workspaceFolders[0].uri.fsPath; - } + return workspaceFolders[0].uri.fsPath; + } } diff --git a/src/debugger/debugAdapter.ts b/src/debugger/debugAdapter.ts index 59a78482e..9dd7c1dfb 100644 --- a/src/debugger/debugAdapter.ts +++ b/src/debugger/debugAdapter.ts @@ -4,46 +4,46 @@ import { MessagingService } from "../service/messagingService"; import { DEBUG_COMMANDS } from "../view/constants"; export class DebugAdapter implements DebugAdapterTracker { - private readonly console: DebugConsole | undefined; - private readonly messagingService: MessagingService; - private debugCommunicationService: DebuggerCommunicationService; - constructor( - debugSession: DebugSession, - messagingService: MessagingService, - debugCommunicationService: DebuggerCommunicationService - ) { - this.console = debugSession.configuration.console; - this.messagingService = messagingService; - this.debugCommunicationService = debugCommunicationService; - } - onWillStartSession() { - // To Implement - } - onWillReceiveMessage(message: any): void { - if (message.command) { - // Only send pertinent debug messages - switch (message.command) { - case DEBUG_COMMANDS.CONTINUE: - this.messagingService.sendStartMessage(); - break; - case DEBUG_COMMANDS.STACK_TRACE: - this.messagingService.sendPauseMessage(); - break; - case DEBUG_COMMANDS.DISCONNECT: - // Triggered on stop event for debugger - if (!message.arguments.restart) { - this.debugCommunicationService.handleStopEvent(); - } - break; - } - } - } - // A debugger error should unlock the webview - onError() { - this.messagingService.sendStartMessage(); - } - // Device is always running when exiting debugging mode - onExit() { - this.messagingService.sendStartMessage(); - } + private readonly console: DebugConsole | undefined; + private readonly messagingService: MessagingService; + private debugCommunicationService: DebuggerCommunicationService; + constructor( + debugSession: DebugSession, + messagingService: MessagingService, + debugCommunicationService: DebuggerCommunicationService + ) { + this.console = debugSession.configuration.console; + this.messagingService = messagingService; + this.debugCommunicationService = debugCommunicationService; + } + onWillStartSession() { + // To Implement + } + onWillReceiveMessage(message: any): void { + if (message.command) { + // Only send pertinent debug messages + switch (message.command) { + case DEBUG_COMMANDS.CONTINUE: + this.messagingService.sendStartMessage(); + break; + case DEBUG_COMMANDS.STACK_TRACE: + this.messagingService.sendPauseMessage(); + break; + case DEBUG_COMMANDS.DISCONNECT: + // Triggered on stop event for debugger + if (!message.arguments.restart) { + this.debugCommunicationService.handleStopEvent(); + } + break; + } + } + } + // A debugger error should unlock the webview + onError() { + this.messagingService.sendStartMessage(); + } + // Device is always running when exiting debugging mode + onExit() { + this.messagingService.sendStartMessage(); + } } diff --git a/src/debugger/debugAdapterFactory.ts b/src/debugger/debugAdapterFactory.ts index 5b0e2b401..8bec8cfc8 100644 --- a/src/debugger/debugAdapterFactory.ts +++ b/src/debugger/debugAdapterFactory.ts @@ -1,33 +1,33 @@ import { - DebugAdapterTracker, - DebugAdapterTrackerFactory, - DebugSession, - ProviderResult, + DebugAdapterTracker, + DebugAdapterTrackerFactory, + DebugSession, + ProviderResult, } from "vscode"; import { DebuggerCommunicationService } from "../service/debuggerCommunicationService"; import { MessagingService } from "../service/messagingService"; import { DebugAdapter } from "./debugAdapter"; export class DebugAdapterFactory implements DebugAdapterTrackerFactory { - private debugSession: DebugSession; - private messagingService: MessagingService; - private debugCommunicationService: DebuggerCommunicationService; - constructor( - debugSession: DebugSession, - messagingService: MessagingService, - debugCommunicationService: DebuggerCommunicationService - ) { - this.debugSession = debugSession; - this.messagingService = messagingService; - this.debugCommunicationService = debugCommunicationService; - } - public createDebugAdapterTracker( - session: DebugSession - ): ProviderResult { - return new DebugAdapter( - session, - this.messagingService, - this.debugCommunicationService - ); - } + private debugSession: DebugSession; + private messagingService: MessagingService; + private debugCommunicationService: DebuggerCommunicationService; + constructor( + debugSession: DebugSession, + messagingService: MessagingService, + debugCommunicationService: DebuggerCommunicationService + ) { + this.debugSession = debugSession; + this.messagingService = messagingService; + this.debugCommunicationService = debugCommunicationService; + } + public createDebugAdapterTracker( + session: DebugSession + ): ProviderResult { + return new DebugAdapter( + session, + this.messagingService, + this.debugCommunicationService + ); + } } diff --git a/src/debuggerCommunicationServer.ts b/src/debuggerCommunicationServer.ts index 0fa4a65cc..3deeff1c4 100644 --- a/src/debuggerCommunicationServer.ts +++ b/src/debuggerCommunicationServer.ts @@ -8,133 +8,134 @@ import { SERVER_INFO } from "./constants"; import { DeviceSelectionService } from "./service/deviceSelectionService"; export const DEBUGGER_MESSAGES = { - EMITTER: { - INPUT_CHANGED: "input_changed", - RECEIVED_STATE: "received_state", - DISCONNECT: "process_disconnect", - }, - LISTENER: { - UPDATE_STATE: "updateState", - RECEIVED_STATE: "receivedState", - DISCONNECT: "disconnect", - }, + EMITTER: { + INPUT_CHANGED: "input_changed", + RECEIVED_STATE: "received_state", + DISCONNECT: "process_disconnect", + }, + LISTENER: { + UPDATE_STATE: "updateState", + RECEIVED_STATE: "receivedState", + DISCONNECT: "disconnect", + }, }; export class DebuggerCommunicationServer { - private port: number; - private serverHttp: http.Server; - private serverIo: socketio.Server; - private simulatorWebview: WebviewPanel | undefined; - private deviceSelectionService: DeviceSelectionService; - private isPendingResponse = false; - private pendingCallbacks: Function[] = []; + private port: number; + private serverHttp: http.Server; + private serverIo: socketio.Server; + private simulatorWebview: WebviewPanel | undefined; + private deviceSelectionService: DeviceSelectionService; + private isPendingResponse = false; + private pendingCallbacks: Function[] = []; - constructor( - webviewPanel: WebviewPanel | undefined, - port = SERVER_INFO.DEFAULT_SERVER_PORT, - deviceSelectionService: DeviceSelectionService - ) { - this.port = port; - this.serverHttp = new http.Server(); - this.initHttpServer(); + constructor( + webviewPanel: WebviewPanel | undefined, + port = SERVER_INFO.DEFAULT_SERVER_PORT, + deviceSelectionService: DeviceSelectionService + ) { + this.port = port; + this.serverHttp = new http.Server(); + this.initHttpServer(); - this.serverIo = socketio(this.serverHttp); - this.simulatorWebview = webviewPanel; - this.initEventsHandlers(); - console.info(`Server running on port ${this.port}`); + this.serverIo = socketio(this.serverHttp); + this.simulatorWebview = webviewPanel; + this.initEventsHandlers(); + console.info(`Server running on port ${this.port}`); - this.deviceSelectionService = deviceSelectionService; - } + this.deviceSelectionService = deviceSelectionService; + } - // send the message to start closing the connection - public closeConnection(): void { - this.sendDisconnectEvent(); - } + // send the message to start closing the connection + public closeConnection(): void { + this.sendDisconnectEvent(); + } - public setWebview(webviewPanel: WebviewPanel | undefined) { - this.simulatorWebview = webviewPanel; - } - // Events are pushed when the previous processed event is over - public emitInputChanged(newState: string): void { - if (this.isPendingResponse) { - this.pendingCallbacks.push(() => { - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, - newState - ); - }); - } else { - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, - newState - ); - this.isPendingResponse = true; - } - } - public disconnectFromPort() { - this.serverIo.close(); - this.serverHttp.close(); - } - private sendDisconnectEvent() { - this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); - } + public setWebview(webviewPanel: WebviewPanel | undefined) { + this.simulatorWebview = webviewPanel; + } + // Events are pushed when the previous processed event is over + public emitInputChanged(newState: string): void { + if (this.isPendingResponse) { + this.pendingCallbacks.push(() => { + this.serverIo.emit( + DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, + newState + ); + }); + } else { + this.serverIo.emit( + DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, + newState + ); + this.isPendingResponse = true; + } + } + public disconnectFromPort() { + this.serverIo.close(); + this.serverHttp.close(); + } + private sendDisconnectEvent() { + this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); + } - private initHttpServer(): void { - this.serverHttp.listen(this.port); - if (!this.serverHttp.listening) { - throw new Error(SERVER_INFO.ERROR_CODE_INIT_SERVER); - } - } + private initHttpServer(): void { + this.serverHttp.listen(this.port); + if (!this.serverHttp.listening) { + throw new Error(SERVER_INFO.ERROR_CODE_INIT_SERVER); + } + } - private initEventsHandlers(): void { - this.serverIo.on("connection", (socket: any) => { - socket.on(DEBUGGER_MESSAGES.LISTENER.UPDATE_STATE, (data: any) => { - this.handleState(data); - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.RECEIVED_STATE, - {} - ); - }); - socket.on(DEBUGGER_MESSAGES.LISTENER.RECEIVED_STATE, () => { - if (this.pendingCallbacks.length > 0) { - const currentCall = this.pendingCallbacks.shift(); - currentCall(); - this.isPendingResponse = true; - } else { - this.isPendingResponse = false; - } - }); + private initEventsHandlers(): void { + this.serverIo.on("connection", (socket: any) => { + socket.on(DEBUGGER_MESSAGES.LISTENER.UPDATE_STATE, (data: any) => { + this.handleState(data); + this.serverIo.emit( + DEBUGGER_MESSAGES.EMITTER.RECEIVED_STATE, + {} + ); + }); + socket.on(DEBUGGER_MESSAGES.LISTENER.RECEIVED_STATE, () => { + if (this.pendingCallbacks.length > 0) { + const currentCall = this.pendingCallbacks.shift(); + currentCall(); + this.isPendingResponse = true; + } else { + this.isPendingResponse = false; + } + }); - socket.on(DEBUGGER_MESSAGES.LISTENER.DISCONNECT, () => { - this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); - if (this.simulatorWebview) { - this.simulatorWebview.webview.postMessage({ - command: "reset-state", - }); - } - }); - }); - } + socket.on(DEBUGGER_MESSAGES.LISTENER.DISCONNECT, () => { + this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); + if (this.simulatorWebview) { + this.simulatorWebview.webview.postMessage({ + command: "reset-state", + }); + } + }); + }); + } - private handleState(data: any): void { - try { - const messageToWebview = JSON.parse(data); - if (messageToWebview.type === "state") { - const messageState = JSON.parse(messageToWebview.data); - if ( - this.simulatorWebview && - messageState.device_name === - this.deviceSelectionService.getCurrentActiveDevice() - ) { - this.simulatorWebview.webview.postMessage({ - active_device: this.deviceSelectionService.getCurrentActiveDevice(), - command: "set-state", - state: messageState, - }); - } - } - } catch (err) { - console.error(`Error: Non-JSON output from the process : ${data}`); - } - } + private handleState(data: any): void { + try { + const messageToWebview = JSON.parse(data); + if (messageToWebview.type === "state") { + const messageState = JSON.parse(messageToWebview.data); + if ( + this.simulatorWebview && + messageState.device_name === + this.deviceSelectionService.getCurrentActiveDevice() + ) { + this.simulatorWebview.webview.postMessage({ + active_device: + this.deviceSelectionService.getCurrentActiveDevice(), + command: "set-state", + state: messageState, + }); + } + } + } catch (err) { + console.error(`Error: Non-JSON output from the process : ${data}`); + } + } } diff --git a/src/dev-requirements.txt b/src/dev-requirements.txt index 26f334b51..6b117ff69 100644 --- a/src/dev-requirements.txt +++ b/src/dev-requirements.txt @@ -1,3 +1,3 @@ -r ./requirements.txt black==19.10b0 -pytest==5.0.1 \ No newline at end of file +pytest==5.0.1 diff --git a/src/deviceContext.ts b/src/deviceContext.ts index a4f0afd2e..9144ef23b 100644 --- a/src/deviceContext.ts +++ b/src/deviceContext.ts @@ -11,141 +11,141 @@ import { CPXWorkspace } from "./cpxWorkspace"; import * as utils from "./extension_utils/utils"; export class DeviceContext implements vscode.Disposable { - public static getInstance(): DeviceContext { - return DeviceContext._deviceContext; - } - - private static _deviceContext: DeviceContext = new DeviceContext(); - - private _onDidChange = new vscode.EventEmitter(); - private _watcher: vscode.FileSystemWatcher; - private _vscodeWatcher: vscode.FileSystemWatcher; - private _port!: string; - - private constructor() { - if (vscode.workspace && CPXWorkspace.rootPath) { - this._watcher = vscode.workspace.createFileSystemWatcher( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ); - this._vscodeWatcher = vscode.workspace.createFileSystemWatcher( - path.join(CPXWorkspace.rootPath, ".vscode"), - true, - true, - false - ); - - // Reloads the config into the code if the cpx config file has changed - this._watcher.onDidCreate(() => this.loadContext()); - this._watcher.onDidChange(() => this.loadContext()); - this._watcher.onDidDelete(() => this.loadContext()); - - this._vscodeWatcher.onDidDelete(() => this.loadContext()); - } - } - - public loadContext(): Thenable { - return vscode.workspace.findFiles(CPX_CONFIG_FILE, null, 1).then( - files => { - let cpxConfigJson: any = {}; - if (files && files.length > 0) { - const configFile = files[0]; - cpxConfigJson = utils.tryParseJSON( - fs.readFileSync(configFile.fsPath, "utf8") - ); - if (cpxConfigJson) { - this._port = cpxConfigJson.port; - this._onDidChange.fire(); - } else { - console.error(CONSTANTS.ERROR.CPX_FILE_ERROR); - } - } else { - this._port = null; - this._onDidChange.fire(); - } - return this; - }, - reason => { - this._port = null; - this._onDidChange.fire(); - return this; - } - ); - } - - public saveContext() { - if (!CPXWorkspace.rootPath) { - return; - } - const cpxConfigFile = path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE); - let cpxConfigJson: any = {}; - if (utils.fileExistsSync(cpxConfigFile)) { - cpxConfigJson = utils.tryParseJSON( - fs.readFileSync(cpxConfigFile, "utf8") - ); - } - if (!cpxConfigJson) { - // log and notify user error - return; - } - cpxConfigJson.port = this.port; - - utils.mkdirRecursivelySync(path.dirname(cpxConfigFile)); - fs.writeFileSync( - cpxConfigFile, - JSON.stringify( - cpxConfigJson, - (key, value) => { - if (value === null) { - return undefined; - } - return value; - }, - 4 - ) - ); - } - - public dispose() { - if (this._watcher) { - this._watcher.dispose(); - } - - if (this._vscodeWatcher) { - this._vscodeWatcher.dispose(); - } - } - - public async initialize() { - if ( - CPXWorkspace.rootPath && - utils.fileExistsSync( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ) - ) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.CPX_JSON_ALREADY_GENERATED - ); - return; - } else { - if (!CPXWorkspace.rootPath) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.PLEASE_OPEN_FOLDER - ); - return; - } - } - } - - public get onDidChange(): vscode.Event { - return this._onDidChange.event; - } - - public get port() { - return this._port; - } - - public set port(value: string) { - this._port = value; - this.saveContext(); - } + public static getInstance(): DeviceContext { + return DeviceContext._deviceContext; + } + + private static _deviceContext: DeviceContext = new DeviceContext(); + + private _onDidChange = new vscode.EventEmitter(); + private _watcher: vscode.FileSystemWatcher; + private _vscodeWatcher: vscode.FileSystemWatcher; + private _port!: string; + + private constructor() { + if (vscode.workspace && CPXWorkspace.rootPath) { + this._watcher = vscode.workspace.createFileSystemWatcher( + path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) + ); + this._vscodeWatcher = vscode.workspace.createFileSystemWatcher( + path.join(CPXWorkspace.rootPath, ".vscode"), + true, + true, + false + ); + + // Reloads the config into the code if the cpx config file has changed + this._watcher.onDidCreate(() => this.loadContext()); + this._watcher.onDidChange(() => this.loadContext()); + this._watcher.onDidDelete(() => this.loadContext()); + + this._vscodeWatcher.onDidDelete(() => this.loadContext()); + } + } + + public loadContext(): Thenable { + return vscode.workspace.findFiles(CPX_CONFIG_FILE, null, 1).then( + (files) => { + let cpxConfigJson: any = {}; + if (files && files.length > 0) { + const configFile = files[0]; + cpxConfigJson = utils.tryParseJSON( + fs.readFileSync(configFile.fsPath, "utf8") + ); + if (cpxConfigJson) { + this._port = cpxConfigJson.port; + this._onDidChange.fire(); + } else { + console.error(CONSTANTS.ERROR.CPX_FILE_ERROR); + } + } else { + this._port = null; + this._onDidChange.fire(); + } + return this; + }, + (reason) => { + this._port = null; + this._onDidChange.fire(); + return this; + } + ); + } + + public saveContext() { + if (!CPXWorkspace.rootPath) { + return; + } + const cpxConfigFile = path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE); + let cpxConfigJson: any = {}; + if (utils.fileExistsSync(cpxConfigFile)) { + cpxConfigJson = utils.tryParseJSON( + fs.readFileSync(cpxConfigFile, "utf8") + ); + } + if (!cpxConfigJson) { + // log and notify user error + return; + } + cpxConfigJson.port = this.port; + + utils.mkdirRecursivelySync(path.dirname(cpxConfigFile)); + fs.writeFileSync( + cpxConfigFile, + JSON.stringify( + cpxConfigJson, + (key, value) => { + if (value === null) { + return undefined; + } + return value; + }, + 4 + ) + ); + } + + public dispose() { + if (this._watcher) { + this._watcher.dispose(); + } + + if (this._vscodeWatcher) { + this._vscodeWatcher.dispose(); + } + } + + public async initialize() { + if ( + CPXWorkspace.rootPath && + utils.fileExistsSync( + path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) + ) + ) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.CPX_JSON_ALREADY_GENERATED + ); + return; + } else { + if (!CPXWorkspace.rootPath) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.PLEASE_OPEN_FOLDER + ); + return; + } + } + } + + public get onDidChange(): vscode.Event { + return this._onDidChange.event; + } + + public get port() { + return this._port; + } + + public set port(value: string) { + this._port = value; + this.saveContext(); + } } diff --git a/src/extension.ts b/src/extension.ts index 5940217dc..d73a05b05 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -7,15 +7,15 @@ import * as open from "open"; import * as path from "path"; import * as vscode from "vscode"; import { - CONFIG, - CONSTANTS, - CPX_CONFIG_FILE, - DialogResponses, - GLOBAL_ENV_VARS, - HELPER_FILES, - LANGUAGE_VARS, - SERVER_INFO, - TelemetryEventName, + CONFIG, + CONSTANTS, + CPX_CONFIG_FILE, + DialogResponses, + GLOBAL_ENV_VARS, + HELPER_FILES, + LANGUAGE_VARS, + SERVER_INFO, + TelemetryEventName, } from "./constants"; import { CPXWorkspace } from "./cpxWorkspace"; import { DebugAdapterFactory } from "./debugger/debugAdapterFactory"; @@ -35,9 +35,9 @@ import getPackageInfo from "./telemetry/getPackageInfo"; import TelemetryAI from "./telemetry/telemetryAI"; import { UsbDetector } from "./usbDetector"; import { - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, - WEBVIEW_TYPES, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_MESSAGES, + WEBVIEW_TYPES, } from "./view/constants"; let telemetryAI: TelemetryAI; @@ -59,1043 +59,1055 @@ let pythonProcessDataBuffer: string[]; export let outChannel: vscode.OutputChannel | undefined; const sendCurrentDeviceMessage = (currentPanel: vscode.WebviewPanel) => { - if (currentPanel) { - currentPanel.webview.postMessage({ - command: VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE, - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } + if (currentPanel) { + currentPanel.webview.postMessage({ + command: VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE, + active_device: deviceSelectionService.getCurrentActiveDevice(), + }); + } }; // Extension activation export async function activate(context: vscode.ExtensionContext) { - telemetryAI = new TelemetryAI(context); - setupService = new SetupService(telemetryAI); - let currentPanel: vscode.WebviewPanel | undefined; - let childProcess: cp.ChildProcess | undefined; - let messageListener: vscode.Disposable; - let activeEditorListener: vscode.Disposable; - const webviewService = new WebviewService(context, deviceSelectionService); - const telemetryHandlerService = new TelemetryHandlerService( - telemetryAI, - deviceSelectionService - ); - const formalNameToNickNameMapping = { - [CONSTANTS.DEVICE_NAME_FORMAL.CPX]: CONSTANTS.DEVICE_NAME.CPX, - [CONSTANTS.DEVICE_NAME_FORMAL.MICROBIT]: CONSTANTS.DEVICE_NAME.MICROBIT, - [CONSTANTS.DEVICE_NAME_FORMAL.CLUE]: CONSTANTS.DEVICE_NAME.CLUE, - }; - - // Add our library path to settings.json for autocomplete functionality - updatePythonExtraPaths(); - - // ignore import errors so that adafruit_circuitplayground library - // doesn't trigger lint errors - updatePylintArgs(context); - - pythonExecutablePath = await setupService.setupEnv(context); - - try { - utils.generateCPXConfig(); - configFileCreated = true; - } catch (err) { - console.info("Failed to create the CPX config file."); - configFileCreated = false; - } - - if (pythonExecutablePath === "") { - return; - } - - if (outChannel === undefined) { - outChannel = vscode.window.createOutputChannel(CONSTANTS.NAME); - utils.logToOutputChannel(outChannel, CONSTANTS.INFO.WELCOME_OUTPUT_TAB); - } - - vscode.workspace.onDidSaveTextDocument( - async (document: vscode.TextDocument) => { - await fileSelectionService.updateCurrentFileFromTextFile(document); - } - ); - - const currVersionReleaseName = - "release_note_" + getPackageInfo(context).extensionVersion; - const viewedReleaseNote = context.globalState.get( - currVersionReleaseName, - false - ); - - if (!viewedReleaseNote) { - PopupService.openReleaseNote(); - context.globalState.update(currVersionReleaseName, true); - } - - const openWebview = () => { - if (currentPanel && currentPanel.webview) { - messagingService.setWebview(currentPanel.webview); - currentPanel.webview.html = webviewService.getWebviewContent( - WEBVIEW_TYPES.SIMULATOR, - true, - currentPanel - ); - currentPanel.reveal(vscode.ViewColumn.Beside); - } else { - currentPanel = vscode.window.createWebviewPanel( - CONSTANTS.WEBVIEW_TYPE.SIMULATOR, - CONSTANTS.LABEL.WEBVIEW_PANEL, - { preserveFocus: true, viewColumn: vscode.ViewColumn.Beside }, - { - // Only allow the webview to access resources in our extension's media directory - localResourceRoots: [ - vscode.Uri.file( - path.join( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY - ) - ), - ], - enableScripts: true, - } - ); - - currentPanel.webview.html = webviewService.getWebviewContent( - WEBVIEW_TYPES.SIMULATOR, - true, - currentPanel - ); - messagingService.setWebview(currentPanel.webview); - - if (messageListener !== undefined) { - messageListener.dispose(); - const index = context.subscriptions.indexOf(messageListener); - if (index > -1) { - context.subscriptions.splice(index, 1); - } - } - - if (activeEditorListener !== undefined) { - activeEditorListener.dispose(); - const index = context.subscriptions.indexOf( - activeEditorListener - ); - if (index > -1) { - context.subscriptions.splice(index, 1); - } - } - - if (currentPanel) { - // Handle messages from webview - messageListener = currentPanel.webview.onDidReceiveMessage( - message => { - const messageJson = JSON.stringify({ - active_device: deviceSelectionService.getCurrentActiveDevice(), - state: message.text, - }); - switch (message.command) { - case WEBVIEW_MESSAGES.BUTTON_PRESS: - // Send input to the Python process - telemetryHandlerService.handleButtonPressTelemetry( - message.text - ); - console.log(`About to write ${messageJson} \n`); - if ( - inDebugMode && - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .emitInputChanged(messageJson); - } else if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - break; - case WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP: - console.log(`Play button ${messageJson} \n`); - if (message.text.state as boolean) { - fileSelectionService.setPathAndSendMessage( - message.text.selected_file - ); - fileSelectionService.findCurrentTextDocument(); - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_RUN_SIMULATOR_BUTTON - ); - runSimulatorCommand(); - } else { - killProcessIfRunning(); - } - - if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - - break; - case WEBVIEW_MESSAGES.GESTURE: - case WEBVIEW_MESSAGES.SENSOR_CHANGED: - telemetryHandlerService.handleGestureTelemetry( - message.text - ); - console.log(`Sensor changed ${messageJson} \n`); - if ( - inDebugMode && - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .emitInputChanged(messageJson); - } else if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - break; - case WEBVIEW_MESSAGES.REFRESH_SIMULATOR: - console.log("Refresh button"); - runSimulatorCommand(); - break; - case WEBVIEW_MESSAGES.SLIDER_TELEMETRY: - telemetryHandlerService.handleSensorTelemetry( - message.text - ); - break; - case WEBVIEW_MESSAGES.SWITCH_DEVICE: - deviceSelectionService.setCurrentActiveDevice( - message.text.active_device - ); - killProcessIfRunning(); - break; - default: - vscode.window.showInformationMessage( - CONSTANTS.ERROR.UNEXPECTED_MESSAGE - ); - break; - } - }, - undefined, - context.subscriptions - ); - - activeEditorListener = utils.addVisibleTextEditorCallback( - currentPanel, - context - ); - } - - currentPanel.onDidDispose( - () => { - currentPanel = undefined; - if ( - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .setWebview(undefined); - } - killProcessIfRunning(); - if (firstTimeClosed) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.FIRST_TIME_WEBVIEW - ); - firstTimeClosed = false; - } - }, - undefined, - context.subscriptions - ); - } - sendCurrentDeviceMessage(currentPanel); - }; - - // Open Simulator on the webview - const openSimulator: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.openSimulator", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_SIMULATE_TO, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - deviceSelectionService.setCurrentActiveDevice(device); - const telemetryEvents = telemetryHandlerService.getTelemetryEventsForOpenSimulator( - device - ); - telemetryAI.trackFeatureUsage( - telemetryEvents.openSimulatorTelemetryEvent - ); - telemetryAI.runWithLatencyMeasure( - openWebview, - telemetryEvents.openSimulatorPerformanceTelemetryEvent - ); - } - ); - - const gettingStartedOpen: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.gettingStarted", - () => { - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_GETTING_STARTED - ); - webviewService.openTutorialPanel(); - } - ); - - const openTemplateFile = (template: string) => { - const fileName = template; - const filePath = - __dirname + path.sep + "templates" + path.sep + fileName; - const file = fs.readFileSync(filePath, "utf8"); - const showNewFilePopup: boolean = vscode.workspace - .getConfiguration() - .get(CONFIG.SHOW_NEW_FILE_POPUP); - - if (showNewFilePopup && template === CONSTANTS.TEMPLATE.CPX) { - vscode.window - .showInformationMessage( - CONSTANTS.INFO.NEW_FILE, - DialogResponses.DONT_SHOW, - DialogResponses.EXAMPLE_CODE, - DialogResponses.TUTORIALS - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.DONT_SHOW) { - vscode.workspace - .getConfiguration() - .update(CONFIG.SHOW_NEW_FILE_POPUP, false); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_DONT_SHOW - ); - } else if (selection === DialogResponses.EXAMPLE_CODE) { - open(CONSTANTS.LINKS.EXAMPLE_CODE); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_EXAMPLE_CODE - ); - } else if (selection === DialogResponses.TUTORIALS) { - const okAction = () => { - open(CONSTANTS.LINKS.TUTORIALS); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_TUTORIALS - ); - }; - utils.showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT - ); - } - }); - } - - // tslint:disable-next-line: ban-comma-operator - vscode.workspace - .openTextDocument({ - content: file, - language: LANGUAGE_VARS.PYTHON.ID, - }) - .then((template: vscode.TextDocument) => { - vscode.window.showTextDocument(template, 1, false).then(() => { - openWebview(); - }); - }), - // tslint:disable-next-line: no-unused-expression - (error: any) => { - telemetryHandlerService.handleNewFileErrorTelemetry(); - console.error(`Failed to open a new text document: ${error}`); - }; - }; - - const newFile: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.newFile", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_FOR_NEW_FILE, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - deviceSelectionService.setCurrentActiveDevice(device); - - const deviceToTemplateMapping = { - [CONSTANTS.DEVICE_NAME.CPX]: CONSTANTS.TEMPLATE.CPX, - [CONSTANTS.DEVICE_NAME.MICROBIT]: CONSTANTS.TEMPLATE.MICROBIT, - [CONSTANTS.DEVICE_NAME.CLUE]: CONSTANTS.TEMPLATE.CLUE, - }; - const templateFile = deviceToTemplateMapping[device]; - - const telemetryEvents = telemetryHandlerService.getTelemetryEventsForNewFile( - device - ); - - telemetryAI.trackFeatureUsage( - telemetryEvents.newFileTelemetryEvent - ); - telemetryAI.runWithLatencyMeasure( - () => openTemplateFile(templateFile), - telemetryEvents.newFilePerformanceTelemetryEvent - ); - } - ); - - const installDependencies: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.installDependencies", - async () => { - pythonExecutablePath = await setupService.setupEnv(context, true); - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_INSTALL_EXTENSION_DEPENDENCIES - ); - } - ); - - const killProcessIfRunning = () => { - if (childProcess !== undefined) { - if (currentPanel) { - currentPanel.webview.postMessage({ - command: "reset-state", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } - // TODO: We need to check the process was correctly killed - childProcess.kill(); - childProcess = undefined; - } - }; - - const runSimulatorCommand = async () => { - pythonProcessDataBuffer = []; - // Prevent running new code if a debug session is active - if (inDebugMode) { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.DEBUGGING_SESSION_IN_PROGESS - ); - return; - } - if (shouldShowRunCodePopup) { - const shouldExitCommand = await vscode.window - .showWarningMessage( - CONSTANTS.WARNING.ACCEPT_AND_RUN, - DialogResponses.ACCEPT_AND_RUN, - DialogResponses.CANCEL - ) - .then((selection: vscode.MessageItem | undefined) => { - let hasAccepted = true; - if (selection === DialogResponses.ACCEPT_AND_RUN) { - shouldShowRunCodePopup = false; - hasAccepted = false; - } - return hasAccepted; - }); - // Don't run users code if they don't accept - if (shouldExitCommand) { - return; - } - } - - openWebview(); - - if (!currentPanel) { - return; - } - - console.info(CONSTANTS.INFO.RUNNING_CODE); - - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_SIMULATOR, - true - ); - - killProcessIfRunning(); - - await fileSelectionService.updateCurrentFileFromEditor( - vscode.window.activeTextEditor - ); - - if (fileSelectionService.getCurrentFileAbsPath() === "") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_RUN, - true - ); - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FILE_TO_RUN, - DialogResponses.MESSAGE_UNDERSTOOD - ); - } else { - // Save on run - await fileSelectionService.getCurrentTextDocument().save(); - - if ( - !fileSelectionService - .getCurrentTextDocument() - .fileName.endsWith(LANGUAGE_VARS.PYTHON.FILE_ENDS) - ) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_RUN, - true - ); - return; - } - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.FILE_SELECTED( - fileSelectionService.getCurrentFileAbsPath() - ) - ); - - // Activate the run webview button - currentPanel.webview.postMessage({ - command: "activate-play", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - const args = [ - utils.getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.PROCESS_USER_CODE_PY - ), - fileSelectionService.getCurrentFileAbsPath(), - JSON.stringify({ enable_telemetry: utils.getTelemetryState() }), - ]; - childProcess = cp.spawn(pythonExecutablePath, args); - - let dataFromTheProcess = ""; - let oldMessage = ""; - - // Data received from Python process - childProcess.stdout.on("data", data => { - dataFromTheProcess = data.toString(); - if (currentPanel) { - // NOTE: parts of the flow regarding pythonProcessDataBuffer - // are needed for the CLUE simulator to properly receive - // base_64 strings on UNIX systems. - - // added any incomplete data to beginning - const processedData = pythonProcessDataBuffer - .join("") - .concat(dataFromTheProcess); - pythonProcessDataBuffer = []; - - // Process the data from the process and send one state at a time - processedData.split("\0").forEach(message => { - if ( - currentPanel && - message.length > 0 && - message !== oldMessage - ) { - oldMessage = message; - let messageToWebview; - // Check the message is a JSON - try { - messageToWebview = JSON.parse(message); - // Check the JSON is a state - switch (messageToWebview.type) { - case "state": - const messageData = JSON.parse( - messageToWebview.data - ); - if ( - messageData.device_name === - deviceSelectionService.getCurrentActiveDevice() - ) { - messagingService.sendMessageToWebview( - VSCODE_MESSAGES_TO_WEBVIEW.SET_STATE, - messageData - ); - } - break; - - case "print": - console.log( - `Process print statement output = ${messageToWebview.data}` - ); - utils.logToOutputChannel( - outChannel, - `[PRINT] ${messageToWebview.data}` - ); - break; - - default: - console.log( - `Non-state JSON output from the process : ${messageToWebview}` - ); - break; - } - } catch (err) { - if (err instanceof SyntaxError) { - // if not a JSON string, it is incomplete - // add to beginning of next strings - pythonProcessDataBuffer.push(message); - } else { - console.log( - `Errored output: ${messageToWebview}` - ); - } - } - } - }); - } - }); - - // Std error output - childProcess.stderr.on("data", data => { - console.error( - `Error from the Python process through stderr: ${data}` - ); - telemetryAI.trackFeatureUsage( - TelemetryEventName.ERROR_PYTHON_PROCESS - ); - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.STDERR(data), - true - ); - if (currentPanel) { - currentPanel.webview.postMessage({ - active_device: deviceSelectionService.getCurrentActiveDevice(), - command: "reset-state", - }); - } - }); - - // When the process is done - childProcess.on("end", (code: number) => { - console.info(`Command execution exited with code: ${code}`); - }); - } - }; - - // Send message to the webview - const runSimulator: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.runSimulator", - () => { - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_RUN_PALETTE - ); - runSimulatorCommand(); - } - ); - - const deployCode = async (device: string) => { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_DEVICE, - true - ); - - await fileSelectionService.updateCurrentFileFromEditor( - vscode.window.activeTextEditor - ); - - if (fileSelectionService.getCurrentFileAbsPath() === "") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, - true - ); - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, - DialogResponses.MESSAGE_UNDERSTOOD - ); - } else { - await fileSelectionService.getCurrentTextDocument().save(); - - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.FILE_SELECTED( - fileSelectionService.getCurrentFileAbsPath() - ) - ); - - const deviceProcess = cp.spawn(pythonExecutablePath, [ - utils.getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.DEVICE_PY - ), - device, - fileSelectionService.getCurrentFileAbsPath(), - ]); - - let dataFromTheProcess = ""; - - // Data received from Python process - deviceProcess.stdout.on("data", data => { - dataFromTheProcess = data.toString(); - - let messageToWebview; - try { - messageToWebview = JSON.parse(dataFromTheProcess); - if (messageToWebview.type === "complete") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_SUCCESS, - true - ); - } - telemetryHandlerService.handleDeployToDeviceFinishedTelemetry( - messageToWebview, - device - ); - } catch (err) { - console.log( - `Non-JSON output from the process : ${dataFromTheProcess}` - ); - } - }); - - // Std error output - deviceProcess.stderr.on("data", data => { - telemetryHandlerService.handleDeployToDeviceErrorTelemetry( - data, - device - ); - console.error( - `Error from the Python device process through stderr: ${data}` - ); - utils.logToOutputChannel( - outChannel, - `[ERROR] ${data} \n`, - true - ); - }); - - // When the process is done - deviceProcess.on("end", (code: number) => { - console.info(`Command execution exited with code: ${code}`); - }); - } - }; - - const deployToDevice: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.deployToDevice", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_DEPLOY_TO, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - - const telemetryEvents = telemetryHandlerService.getTelemetryEventsForStartingDeployToDevice( - device - ); - - telemetryAI.trackFeatureUsage(telemetryEvents.deployTelemetryEvent); - telemetryAI.runWithLatencyMeasure(() => { - deployCode(device); - }, telemetryEvents.deployPerformanceTelemetryEvent); - } - ); - - let serialMonitor: SerialMonitor | undefined; - if (configFileCreated) { - serialMonitor = SerialMonitor.getInstance(); - context.subscriptions.push(serialMonitor); - } - - const selectSerialPort: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.selectSerialPort", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.selectSerialPort(null, null); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CHOOSE_PORT); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const openSerialMonitor: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.openSerialMonitor", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure( - serialMonitor.openSerialMonitor.bind(serialMonitor), - TelemetryEventName.COMMAND_SERIAL_MONITOR_OPEN - ); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const changeBaudRate: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.changeBaudRate", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure( - serialMonitor.changeBaudRate.bind(serialMonitor), - TelemetryEventName.COMMAND_SERIAL_MONITOR_BAUD_RATE - ); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const closeSerialMonitor: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.closeSerialMonitor", - (port, showWarning = true) => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.closeSerialMonitor(port, showWarning); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const showReleaseNote = vscode.commands.registerCommand( - "deviceSimulatorExpress.", - (port, showWarning = true) => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.closeSerialMonitor(port, showWarning); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - UsbDetector.getInstance().initialize(context.extensionPath); - UsbDetector.getInstance().startListening(); - - if ( - CPXWorkspace.rootPath && - (utils.fileExistsSync( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ) || - vscode.window.activeTextEditor) - ) { - (() => { - if (!SerialMonitor.getInstance().initialized) { - SerialMonitor.getInstance().initialize(); - } - })(); - } - - // Debugger configuration - const simulatorDebugConfiguration = new SimulatorDebugConfigurationProvider( - utils.getPathToScript(context, "out/", "debug_user_code.py") - ); - - const debugAdapterFactory = new DebugAdapterFactory( - vscode.debug.activeDebugSession, - messagingService, - debuggerCommunicationService - ); - vscode.debug.registerDebugAdapterTrackerFactory( - LANGUAGE_VARS.PYTHON.ID, - debugAdapterFactory - ); - // On Debug Session Start: Init comunication - const debugSessionsStarted = vscode.debug.onDidStartDebugSession(() => { - if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { - // Reinitialize process - killProcessIfRunning(); - inDebugMode = true; - - try { - // Shut down existing server on debug restart - if (debuggerCommunicationService.getCurrentDebuggerServer()) { - debuggerCommunicationService.resetCurrentDebuggerServer(); - } - - debuggerCommunicationService.setCurrentDebuggerServer( - new DebuggerCommunicationServer( - currentPanel, - utils.getServerPortConfig(), - deviceSelectionService - ) - ); - - telemetryHandlerService.handleDebuggerTelemetry(); - - openWebview(); - if (currentPanel) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .setWebview(currentPanel); - currentPanel.webview.postMessage({ - active_device: deviceSelectionService.getCurrentActiveDevice(), - command: "activate-play", - }); - } - } catch (err) { - if (err.message === SERVER_INFO.ERROR_CODE_INIT_SERVER) { - console.error( - `Error trying to init the server on port ${utils.getServerPortConfig()}` - ); - - telemetryHandlerService.handleDebuggerFailTelemetry(); - - vscode.window.showErrorMessage( - CONSTANTS.ERROR.DEBUGGER_SERVER_INIT_FAILED( - utils.getServerPortConfig() - ) - ); - } - } - } - }); - - // On Debug Session Stop: Stop communiation - const debugSessionStopped = vscode.debug.onDidTerminateDebugSession(() => { - if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { - inDebugMode = false; - simulatorDebugConfiguration.deviceSimulatorExpressDebug = false; - if (debuggerCommunicationService.getCurrentDebuggerServer()) { - debuggerCommunicationService.resetCurrentDebuggerServer(); - } - if (currentPanel) { - currentPanel.webview.postMessage({ - command: "reset-state", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } - } - }); - - const configsChanged = vscode.workspace.onDidChangeConfiguration( - async () => { - if (utils.checkConfig(CONFIG.CONFIG_ENV_ON_SWITCH)) { - pythonExecutablePath = await setupService.setupEnv(context); - } - } - ); - - context.subscriptions.push( - installDependencies, - runSimulator, - changeBaudRate, - closeSerialMonitor, - deployToDevice, - newFile, - openSimulator, - openSerialMonitor, - selectSerialPort, - gettingStartedOpen, - vscode.debug.registerDebugConfigurationProvider( - CONSTANTS.DEBUG_CONFIGURATION_TYPE, - simulatorDebugConfiguration - ), - debugSessionsStarted, - debugSessionStopped, - configsChanged - ); + telemetryAI = new TelemetryAI(context); + setupService = new SetupService(telemetryAI); + let currentPanel: vscode.WebviewPanel | undefined; + let childProcess: cp.ChildProcess | undefined; + let messageListener: vscode.Disposable; + let activeEditorListener: vscode.Disposable; + const webviewService = new WebviewService(context, deviceSelectionService); + const telemetryHandlerService = new TelemetryHandlerService( + telemetryAI, + deviceSelectionService + ); + const formalNameToNickNameMapping = { + [CONSTANTS.DEVICE_NAME_FORMAL.CPX]: CONSTANTS.DEVICE_NAME.CPX, + [CONSTANTS.DEVICE_NAME_FORMAL.MICROBIT]: CONSTANTS.DEVICE_NAME.MICROBIT, + [CONSTANTS.DEVICE_NAME_FORMAL.CLUE]: CONSTANTS.DEVICE_NAME.CLUE, + }; + + // Add our library path to settings.json for autocomplete functionality + updatePythonExtraPaths(); + + // ignore import errors so that adafruit_circuitplayground library + // doesn't trigger lint errors + updatePylintArgs(context); + + pythonExecutablePath = await setupService.setupEnv(context); + + try { + utils.generateCPXConfig(); + configFileCreated = true; + } catch (err) { + console.info("Failed to create the CPX config file."); + configFileCreated = false; + } + + if (pythonExecutablePath === "") { + return; + } + + if (outChannel === undefined) { + outChannel = vscode.window.createOutputChannel(CONSTANTS.NAME); + utils.logToOutputChannel(outChannel, CONSTANTS.INFO.WELCOME_OUTPUT_TAB); + } + + vscode.workspace.onDidSaveTextDocument( + async (document: vscode.TextDocument) => { + await fileSelectionService.updateCurrentFileFromTextFile(document); + } + ); + + const currVersionReleaseName = + "release_note_" + getPackageInfo(context).extensionVersion; + const viewedReleaseNote = context.globalState.get( + currVersionReleaseName, + false + ); + + if (!viewedReleaseNote) { + PopupService.openReleaseNote(); + context.globalState.update(currVersionReleaseName, true); + } + + const openWebview = () => { + if (currentPanel && currentPanel.webview) { + messagingService.setWebview(currentPanel.webview); + currentPanel.webview.html = webviewService.getWebviewContent( + WEBVIEW_TYPES.SIMULATOR, + true, + currentPanel + ); + currentPanel.reveal(vscode.ViewColumn.Beside); + } else { + currentPanel = vscode.window.createWebviewPanel( + CONSTANTS.WEBVIEW_TYPE.SIMULATOR, + CONSTANTS.LABEL.WEBVIEW_PANEL, + { preserveFocus: true, viewColumn: vscode.ViewColumn.Beside }, + { + // Only allow the webview to access resources in our extension's media directory + localResourceRoots: [ + vscode.Uri.file( + path.join( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY + ) + ), + ], + enableScripts: true, + } + ); + + currentPanel.webview.html = webviewService.getWebviewContent( + WEBVIEW_TYPES.SIMULATOR, + true, + currentPanel + ); + messagingService.setWebview(currentPanel.webview); + + if (messageListener !== undefined) { + messageListener.dispose(); + const index = context.subscriptions.indexOf(messageListener); + if (index > -1) { + context.subscriptions.splice(index, 1); + } + } + + if (activeEditorListener !== undefined) { + activeEditorListener.dispose(); + const index = + context.subscriptions.indexOf(activeEditorListener); + if (index > -1) { + context.subscriptions.splice(index, 1); + } + } + + if (currentPanel) { + // Handle messages from webview + messageListener = currentPanel.webview.onDidReceiveMessage( + (message) => { + const messageJson = JSON.stringify({ + active_device: + deviceSelectionService.getCurrentActiveDevice(), + state: message.text, + }); + switch (message.command) { + case WEBVIEW_MESSAGES.BUTTON_PRESS: + // Send input to the Python process + telemetryHandlerService.handleButtonPressTelemetry( + message.text + ); + console.log(`About to write ${messageJson} \n`); + if ( + inDebugMode && + debuggerCommunicationService.getCurrentDebuggerServer() + ) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .emitInputChanged(messageJson); + } else if (childProcess) { + childProcess.stdin.write( + messageJson + "\n" + ); + } + break; + case WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP: + console.log(`Play button ${messageJson} \n`); + if (message.text.state as boolean) { + fileSelectionService.setPathAndSendMessage( + message.text.selected_file + ); + fileSelectionService.findCurrentTextDocument(); + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_RUN_SIMULATOR_BUTTON + ); + runSimulatorCommand(); + } else { + killProcessIfRunning(); + } + + if (childProcess) { + childProcess.stdin.write( + messageJson + "\n" + ); + } + + break; + case WEBVIEW_MESSAGES.GESTURE: + case WEBVIEW_MESSAGES.SENSOR_CHANGED: + telemetryHandlerService.handleGestureTelemetry( + message.text + ); + console.log(`Sensor changed ${messageJson} \n`); + if ( + inDebugMode && + debuggerCommunicationService.getCurrentDebuggerServer() + ) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .emitInputChanged(messageJson); + } else if (childProcess) { + childProcess.stdin.write( + messageJson + "\n" + ); + } + break; + case WEBVIEW_MESSAGES.REFRESH_SIMULATOR: + console.log("Refresh button"); + runSimulatorCommand(); + break; + case WEBVIEW_MESSAGES.SLIDER_TELEMETRY: + telemetryHandlerService.handleSensorTelemetry( + message.text + ); + break; + case WEBVIEW_MESSAGES.SWITCH_DEVICE: + deviceSelectionService.setCurrentActiveDevice( + message.text.active_device + ); + killProcessIfRunning(); + break; + default: + vscode.window.showInformationMessage( + CONSTANTS.ERROR.UNEXPECTED_MESSAGE + ); + break; + } + }, + undefined, + context.subscriptions + ); + + activeEditorListener = utils.addVisibleTextEditorCallback( + currentPanel, + context + ); + } + + currentPanel.onDidDispose( + () => { + currentPanel = undefined; + if ( + debuggerCommunicationService.getCurrentDebuggerServer() + ) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .setWebview(undefined); + } + killProcessIfRunning(); + if (firstTimeClosed) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.FIRST_TIME_WEBVIEW + ); + firstTimeClosed = false; + } + }, + undefined, + context.subscriptions + ); + } + sendCurrentDeviceMessage(currentPanel); + }; + + // Open Simulator on the webview + const openSimulator: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.openSimulator", + async () => { + const chosen_device = await vscode.window.showQuickPick( + Object.values(CONSTANTS.DEVICE_NAME_FORMAL) + ); + + if (!chosen_device) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_SIMULATE_TO, + true + ); + return; + } + + const device = formalNameToNickNameMapping[chosen_device]; + deviceSelectionService.setCurrentActiveDevice(device); + const telemetryEvents = + telemetryHandlerService.getTelemetryEventsForOpenSimulator( + device + ); + telemetryAI.trackFeatureUsage( + telemetryEvents.openSimulatorTelemetryEvent + ); + telemetryAI.runWithLatencyMeasure( + openWebview, + telemetryEvents.openSimulatorPerformanceTelemetryEvent + ); + } + ); + + const gettingStartedOpen: vscode.Disposable = + vscode.commands.registerCommand( + "deviceSimulatorExpress.common.gettingStarted", + () => { + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_GETTING_STARTED + ); + webviewService.openTutorialPanel(); + } + ); + + const openTemplateFile = (template: string) => { + const fileName = template; + const filePath = + __dirname + path.sep + "templates" + path.sep + fileName; + const file = fs.readFileSync(filePath, "utf8"); + const showNewFilePopup: boolean = vscode.workspace + .getConfiguration() + .get(CONFIG.SHOW_NEW_FILE_POPUP); + + if (showNewFilePopup && template === CONSTANTS.TEMPLATE.CPX) { + vscode.window + .showInformationMessage( + CONSTANTS.INFO.NEW_FILE, + DialogResponses.DONT_SHOW, + DialogResponses.EXAMPLE_CODE, + DialogResponses.TUTORIALS + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.DONT_SHOW) { + vscode.workspace + .getConfiguration() + .update(CONFIG.SHOW_NEW_FILE_POPUP, false); + telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_CLICK_DIALOG_DONT_SHOW + ); + } else if (selection === DialogResponses.EXAMPLE_CODE) { + open(CONSTANTS.LINKS.EXAMPLE_CODE); + telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_CLICK_DIALOG_EXAMPLE_CODE + ); + } else if (selection === DialogResponses.TUTORIALS) { + const okAction = () => { + open(CONSTANTS.LINKS.TUTORIALS); + telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_CLICK_DIALOG_TUTORIALS + ); + }; + utils.showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT + ); + } + }); + } + + // tslint:disable-next-line: ban-comma-operator + vscode.workspace + .openTextDocument({ + content: file, + language: LANGUAGE_VARS.PYTHON.ID, + }) + .then((template: vscode.TextDocument) => { + vscode.window.showTextDocument(template, 1, false).then(() => { + openWebview(); + }); + }), + // tslint:disable-next-line: no-unused-expression + (error: any) => { + telemetryHandlerService.handleNewFileErrorTelemetry(); + console.error(`Failed to open a new text document: ${error}`); + }; + }; + + const newFile: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.newFile", + async () => { + const chosen_device = await vscode.window.showQuickPick( + Object.values(CONSTANTS.DEVICE_NAME_FORMAL) + ); + + if (!chosen_device) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.NO_DEVICE_CHOSEN_FOR_NEW_FILE, + true + ); + return; + } + + const device = formalNameToNickNameMapping[chosen_device]; + deviceSelectionService.setCurrentActiveDevice(device); + + const deviceToTemplateMapping = { + [CONSTANTS.DEVICE_NAME.CPX]: CONSTANTS.TEMPLATE.CPX, + [CONSTANTS.DEVICE_NAME.MICROBIT]: CONSTANTS.TEMPLATE.MICROBIT, + [CONSTANTS.DEVICE_NAME.CLUE]: CONSTANTS.TEMPLATE.CLUE, + }; + const templateFile = deviceToTemplateMapping[device]; + + const telemetryEvents = + telemetryHandlerService.getTelemetryEventsForNewFile(device); + + telemetryAI.trackFeatureUsage( + telemetryEvents.newFileTelemetryEvent + ); + telemetryAI.runWithLatencyMeasure( + () => openTemplateFile(templateFile), + telemetryEvents.newFilePerformanceTelemetryEvent + ); + } + ); + + const installDependencies: vscode.Disposable = + vscode.commands.registerCommand( + "deviceSimulatorExpress.common.installDependencies", + async () => { + pythonExecutablePath = await setupService.setupEnv( + context, + true + ); + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_INSTALL_EXTENSION_DEPENDENCIES + ); + } + ); + + const killProcessIfRunning = () => { + if (childProcess !== undefined) { + if (currentPanel) { + currentPanel.webview.postMessage({ + command: "reset-state", + active_device: + deviceSelectionService.getCurrentActiveDevice(), + }); + } + // TODO: We need to check the process was correctly killed + childProcess.kill(); + childProcess = undefined; + } + }; + + const runSimulatorCommand = async () => { + pythonProcessDataBuffer = []; + // Prevent running new code if a debug session is active + if (inDebugMode) { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.DEBUGGING_SESSION_IN_PROGESS + ); + return; + } + if (shouldShowRunCodePopup) { + const shouldExitCommand = await vscode.window + .showWarningMessage( + CONSTANTS.WARNING.ACCEPT_AND_RUN, + DialogResponses.ACCEPT_AND_RUN, + DialogResponses.CANCEL + ) + .then((selection: vscode.MessageItem | undefined) => { + let hasAccepted = true; + if (selection === DialogResponses.ACCEPT_AND_RUN) { + shouldShowRunCodePopup = false; + hasAccepted = false; + } + return hasAccepted; + }); + // Don't run users code if they don't accept + if (shouldExitCommand) { + return; + } + } + + openWebview(); + + if (!currentPanel) { + return; + } + + console.info(CONSTANTS.INFO.RUNNING_CODE); + + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.DEPLOY_SIMULATOR, + true + ); + + killProcessIfRunning(); + + await fileSelectionService.updateCurrentFileFromEditor( + vscode.window.activeTextEditor + ); + + if (fileSelectionService.getCurrentFileAbsPath() === "") { + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.NO_FILE_TO_RUN, + true + ); + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FILE_TO_RUN, + DialogResponses.MESSAGE_UNDERSTOOD + ); + } else { + // Save on run + await fileSelectionService.getCurrentTextDocument().save(); + + if ( + !fileSelectionService + .getCurrentTextDocument() + .fileName.endsWith(LANGUAGE_VARS.PYTHON.FILE_ENDS) + ) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.NO_FILE_TO_RUN, + true + ); + return; + } + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.FILE_SELECTED( + fileSelectionService.getCurrentFileAbsPath() + ) + ); + + // Activate the run webview button + currentPanel.webview.postMessage({ + command: "activate-play", + active_device: deviceSelectionService.getCurrentActiveDevice(), + }); + const args = [ + utils.getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.PROCESS_USER_CODE_PY + ), + fileSelectionService.getCurrentFileAbsPath(), + JSON.stringify({ enable_telemetry: utils.getTelemetryState() }), + ]; + childProcess = cp.spawn(pythonExecutablePath, args); + + let dataFromTheProcess = ""; + let oldMessage = ""; + + // Data received from Python process + childProcess.stdout.on("data", (data) => { + dataFromTheProcess = data.toString(); + if (currentPanel) { + // NOTE: parts of the flow regarding pythonProcessDataBuffer + // are needed for the CLUE simulator to properly receive + // base_64 strings on UNIX systems. + + // added any incomplete data to beginning + const processedData = pythonProcessDataBuffer + .join("") + .concat(dataFromTheProcess); + pythonProcessDataBuffer = []; + + // Process the data from the process and send one state at a time + processedData.split("\0").forEach((message) => { + if ( + currentPanel && + message.length > 0 && + message !== oldMessage + ) { + oldMessage = message; + let messageToWebview; + // Check the message is a JSON + try { + messageToWebview = JSON.parse(message); + // Check the JSON is a state + switch (messageToWebview.type) { + case "state": + const messageData = JSON.parse( + messageToWebview.data + ); + if ( + messageData.device_name === + deviceSelectionService.getCurrentActiveDevice() + ) { + messagingService.sendMessageToWebview( + VSCODE_MESSAGES_TO_WEBVIEW.SET_STATE, + messageData + ); + } + break; + + case "print": + console.log( + `Process print statement output = ${messageToWebview.data}` + ); + utils.logToOutputChannel( + outChannel, + `[PRINT] ${messageToWebview.data}` + ); + break; + + default: + console.log( + `Non-state JSON output from the process : ${messageToWebview}` + ); + break; + } + } catch (err) { + if (err instanceof SyntaxError) { + // if not a JSON string, it is incomplete + // add to beginning of next strings + pythonProcessDataBuffer.push(message); + } else { + console.log( + `Errored output: ${messageToWebview}` + ); + } + } + } + }); + } + }); + + // Std error output + childProcess.stderr.on("data", (data) => { + console.error( + `Error from the Python process through stderr: ${data}` + ); + telemetryAI.trackFeatureUsage( + TelemetryEventName.ERROR_PYTHON_PROCESS + ); + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.STDERR(data), + true + ); + if (currentPanel) { + currentPanel.webview.postMessage({ + active_device: + deviceSelectionService.getCurrentActiveDevice(), + command: "reset-state", + }); + } + }); + + // When the process is done + childProcess.on("end", (code: number) => { + console.info(`Command execution exited with code: ${code}`); + }); + } + }; + + // Send message to the webview + const runSimulator: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.runSimulator", + () => { + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_RUN_PALETTE + ); + runSimulatorCommand(); + } + ); + + const deployCode = async (device: string) => { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.DEPLOY_DEVICE, + true + ); + + await fileSelectionService.updateCurrentFileFromEditor( + vscode.window.activeTextEditor + ); + + if (fileSelectionService.getCurrentFileAbsPath() === "") { + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, + true + ); + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, + DialogResponses.MESSAGE_UNDERSTOOD + ); + } else { + await fileSelectionService.getCurrentTextDocument().save(); + + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.FILE_SELECTED( + fileSelectionService.getCurrentFileAbsPath() + ) + ); + + const deviceProcess = cp.spawn(pythonExecutablePath, [ + utils.getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.DEVICE_PY + ), + device, + fileSelectionService.getCurrentFileAbsPath(), + ]); + + let dataFromTheProcess = ""; + + // Data received from Python process + deviceProcess.stdout.on("data", (data) => { + dataFromTheProcess = data.toString(); + + let messageToWebview; + try { + messageToWebview = JSON.parse(dataFromTheProcess); + if (messageToWebview.type === "complete") { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.DEPLOY_SUCCESS, + true + ); + } + telemetryHandlerService.handleDeployToDeviceFinishedTelemetry( + messageToWebview, + device + ); + } catch (err) { + console.log( + `Non-JSON output from the process : ${dataFromTheProcess}` + ); + } + }); + + // Std error output + deviceProcess.stderr.on("data", (data) => { + telemetryHandlerService.handleDeployToDeviceErrorTelemetry( + data, + device + ); + console.error( + `Error from the Python device process through stderr: ${data}` + ); + utils.logToOutputChannel( + outChannel, + `[ERROR] ${data} \n`, + true + ); + }); + + // When the process is done + deviceProcess.on("end", (code: number) => { + console.info(`Command execution exited with code: ${code}`); + }); + } + }; + + const deployToDevice: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.deployToDevice", + async () => { + const chosen_device = await vscode.window.showQuickPick( + Object.values(CONSTANTS.DEVICE_NAME_FORMAL) + ); + + if (!chosen_device) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_DEPLOY_TO, + true + ); + return; + } + + const device = formalNameToNickNameMapping[chosen_device]; + + const telemetryEvents = + telemetryHandlerService.getTelemetryEventsForStartingDeployToDevice( + device + ); + + telemetryAI.trackFeatureUsage(telemetryEvents.deployTelemetryEvent); + telemetryAI.runWithLatencyMeasure(() => { + deployCode(device); + }, telemetryEvents.deployPerformanceTelemetryEvent); + } + ); + + let serialMonitor: SerialMonitor | undefined; + if (configFileCreated) { + serialMonitor = SerialMonitor.getInstance(); + context.subscriptions.push(serialMonitor); + } + + const selectSerialPort: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.selectSerialPort", + () => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure(() => { + serialMonitor.selectSerialPort(null, null); + }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CHOOSE_PORT); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + const openSerialMonitor: vscode.Disposable = + vscode.commands.registerCommand( + "deviceSimulatorExpress.common.openSerialMonitor", + () => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure( + serialMonitor.openSerialMonitor.bind(serialMonitor), + TelemetryEventName.COMMAND_SERIAL_MONITOR_OPEN + ); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + const changeBaudRate: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.changeBaudRate", + () => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure( + serialMonitor.changeBaudRate.bind(serialMonitor), + TelemetryEventName.COMMAND_SERIAL_MONITOR_BAUD_RATE + ); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + const closeSerialMonitor: vscode.Disposable = + vscode.commands.registerCommand( + "deviceSimulatorExpress.common.closeSerialMonitor", + (port, showWarning = true) => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure(() => { + serialMonitor.closeSerialMonitor(port, showWarning); + }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + const showReleaseNote = vscode.commands.registerCommand( + "deviceSimulatorExpress.", + (port, showWarning = true) => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure(() => { + serialMonitor.closeSerialMonitor(port, showWarning); + }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + UsbDetector.getInstance().initialize(context.extensionPath); + UsbDetector.getInstance().startListening(); + + if ( + CPXWorkspace.rootPath && + (utils.fileExistsSync( + path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) + ) || + vscode.window.activeTextEditor) + ) { + (() => { + if (!SerialMonitor.getInstance().initialized) { + SerialMonitor.getInstance().initialize(); + } + })(); + } + + // Debugger configuration + const simulatorDebugConfiguration = new SimulatorDebugConfigurationProvider( + utils.getPathToScript(context, "out/", "debug_user_code.py") + ); + + const debugAdapterFactory = new DebugAdapterFactory( + vscode.debug.activeDebugSession, + messagingService, + debuggerCommunicationService + ); + vscode.debug.registerDebugAdapterTrackerFactory( + LANGUAGE_VARS.PYTHON.ID, + debugAdapterFactory + ); + // On Debug Session Start: Init comunication + const debugSessionsStarted = vscode.debug.onDidStartDebugSession(() => { + if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { + // Reinitialize process + killProcessIfRunning(); + inDebugMode = true; + + try { + // Shut down existing server on debug restart + if (debuggerCommunicationService.getCurrentDebuggerServer()) { + debuggerCommunicationService.resetCurrentDebuggerServer(); + } + + debuggerCommunicationService.setCurrentDebuggerServer( + new DebuggerCommunicationServer( + currentPanel, + utils.getServerPortConfig(), + deviceSelectionService + ) + ); + + telemetryHandlerService.handleDebuggerTelemetry(); + + openWebview(); + if (currentPanel) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .setWebview(currentPanel); + currentPanel.webview.postMessage({ + active_device: + deviceSelectionService.getCurrentActiveDevice(), + command: "activate-play", + }); + } + } catch (err) { + if (err.message === SERVER_INFO.ERROR_CODE_INIT_SERVER) { + console.error( + `Error trying to init the server on port ${utils.getServerPortConfig()}` + ); + + telemetryHandlerService.handleDebuggerFailTelemetry(); + + vscode.window.showErrorMessage( + CONSTANTS.ERROR.DEBUGGER_SERVER_INIT_FAILED( + utils.getServerPortConfig() + ) + ); + } + } + } + }); + + // On Debug Session Stop: Stop communiation + const debugSessionStopped = vscode.debug.onDidTerminateDebugSession(() => { + if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { + inDebugMode = false; + simulatorDebugConfiguration.deviceSimulatorExpressDebug = false; + if (debuggerCommunicationService.getCurrentDebuggerServer()) { + debuggerCommunicationService.resetCurrentDebuggerServer(); + } + if (currentPanel) { + currentPanel.webview.postMessage({ + command: "reset-state", + active_device: + deviceSelectionService.getCurrentActiveDevice(), + }); + } + } + }); + + const configsChanged = vscode.workspace.onDidChangeConfiguration( + async () => { + if (utils.checkConfig(CONFIG.CONFIG_ENV_ON_SWITCH)) { + pythonExecutablePath = await setupService.setupEnv(context); + } + } + ); + + context.subscriptions.push( + installDependencies, + runSimulator, + changeBaudRate, + closeSerialMonitor, + deployToDevice, + newFile, + openSimulator, + openSerialMonitor, + selectSerialPort, + gettingStartedOpen, + vscode.debug.registerDebugConfigurationProvider( + CONSTANTS.DEBUG_CONFIGURATION_TYPE, + simulatorDebugConfiguration + ), + debugSessionsStarted, + debugSessionStopped, + configsChanged + ); } const updatePythonExtraPaths = () => { - updateConfigLists( - "python.autoComplete.extraPaths", - [ - __dirname, - path.join(__dirname, CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY), - path.join(__dirname, CONSTANTS.FILESYSTEM.CLUE), - path.join(__dirname, CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON), - ], - vscode.ConfigurationTarget.Global - ); + updateConfigLists( + "python.autoComplete.extraPaths", + [ + __dirname, + path.join(__dirname, CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY), + path.join(__dirname, CONSTANTS.FILESYSTEM.CLUE), + path.join(__dirname, CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON), + ], + vscode.ConfigurationTarget.Global + ); }; const updatePylintArgs = (context: vscode.ExtensionContext) => { - const outPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY - ); - const micropythonPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY - ); - - const cluePath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.CLUE - ); - - const baseCircuitPythonPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON - ); - // update pylint args to extend system path - // to include python libs local to extention - updateConfigLists( - "python.linting.pylintArgs", - [ - "--init-hook", - `import sys; sys.path.extend([\"${outPath}\",\"${micropythonPath}\",\"${cluePath}\",\"${baseCircuitPythonPath}\"])`, - ], - vscode.ConfigurationTarget.Workspace - ); + const outPath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY + ); + const micropythonPath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY + ); + + const cluePath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + CONSTANTS.FILESYSTEM.CLUE + ); + + const baseCircuitPythonPath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON + ); + // update pylint args to extend system path + // to include python libs local to extention + updateConfigLists( + "python.linting.pylintArgs", + [ + "--init-hook", + `import sys; sys.path.extend([\"${outPath}\",\"${micropythonPath}\",\"${cluePath}\",\"${baseCircuitPythonPath}\"])`, + ], + vscode.ConfigurationTarget.Workspace + ); }; const updateConfigLists = ( - section: string, - newItems: string[], - scope: vscode.ConfigurationTarget + section: string, + newItems: string[], + scope: vscode.ConfigurationTarget ) => { - // function for adding elements to configuration arrays - const currentExtraItems: string[] = - vscode.workspace.getConfiguration().get(section) || []; - const extraItemsSet: Set = new Set( - currentExtraItems.concat(newItems) - ); - - vscode.workspace - .getConfiguration() - .update(section, Array.from(extraItemsSet), scope); + // function for adding elements to configuration arrays + const currentExtraItems: string[] = + vscode.workspace.getConfiguration().get(section) || []; + const extraItemsSet: Set = new Set( + currentExtraItems.concat(newItems) + ); + + vscode.workspace + .getConfiguration() + .update(section, Array.from(extraItemsSet), scope); }; // this method is called when your extension is deactivated export async function deactivate() { - const monitor: SerialMonitor = SerialMonitor.getInstance(); - await monitor.closeSerialMonitor(null, false); - UsbDetector.getInstance().stopListening(); + const monitor: SerialMonitor = SerialMonitor.getInstance(); + await monitor.closeSerialMonitor(null, false); + UsbDetector.getInstance().stopListening(); } diff --git a/src/extension_utils/utils.ts b/src/extension_utils/utils.ts index b7be3b71c..e276605a5 100644 --- a/src/extension_utils/utils.ts +++ b/src/extension_utils/utils.ts @@ -7,11 +7,11 @@ import * as path from "path"; import * as util from "util"; import * as vscode from "vscode"; import { - CONSTANTS, - CPX_CONFIG_FILE, - DialogResponses, - GLOBAL_ENV_VARS, - SERVER_INFO, + CONSTANTS, + CPX_CONFIG_FILE, + DialogResponses, + GLOBAL_ENV_VARS, + SERVER_INFO, } from "../constants"; import { CPXWorkspace } from "../cpxWorkspace"; import { DeviceContext } from "../deviceContext"; @@ -19,94 +19,94 @@ import { DeviceContext } from "../deviceContext"; export const exec = util.promisify(cp.exec); const errorChannel = vscode.window.createOutputChannel( - CONSTANTS.ERROR.INSTALLATION_ERROR + CONSTANTS.ERROR.INSTALLATION_ERROR ); // tslint:disable-next-line: export-name export const getPathToScript = ( - context: vscode.ExtensionContext, - folderName: string, - fileName: string = "" + context: vscode.ExtensionContext, + folderName: string, + fileName: string = "" ) => { - const onDiskPath = vscode.Uri.file( - path.join(context.extensionPath, folderName, fileName) - ); - const scriptPath = onDiskPath.with({ scheme: "vscode-resource" }); - return scriptPath.fsPath; + const onDiskPath = vscode.Uri.file( + path.join(context.extensionPath, folderName, fileName) + ); + const scriptPath = onDiskPath.with({ scheme: "vscode-resource" }); + return scriptPath.fsPath; }; export const showPrivacyModal = ( - okAction: () => void, - thirdPartyDisclaimer: string + okAction: () => void, + thirdPartyDisclaimer: string ) => { - vscode.window - .showInformationMessage( - `${thirdPartyDisclaimer}: ${CONSTANTS.LINKS.PRIVACY}`, - DialogResponses.AGREE_AND_PROCEED, - DialogResponses.CANCEL - ) - .then((privacySelection: vscode.MessageItem | undefined) => { - if (privacySelection === DialogResponses.AGREE_AND_PROCEED) { - okAction(); - } else if (privacySelection === DialogResponses.CANCEL) { - // do nothing - } - }); + vscode.window + .showInformationMessage( + `${thirdPartyDisclaimer}: ${CONSTANTS.LINKS.PRIVACY}`, + DialogResponses.AGREE_AND_PROCEED, + DialogResponses.CANCEL + ) + .then((privacySelection: vscode.MessageItem | undefined) => { + if (privacySelection === DialogResponses.AGREE_AND_PROCEED) { + okAction(); + } else if (privacySelection === DialogResponses.CANCEL) { + // do nothing + } + }); }; export const logToOutputChannel = ( - outChannel: vscode.OutputChannel | undefined, - message: string, - show: boolean = false + outChannel: vscode.OutputChannel | undefined, + message: string, + show: boolean = false ): void => { - if (outChannel) { - if (show) { - outChannel.show(true); - } - outChannel.append(message); - } + if (outChannel) { + if (show) { + outChannel.show(true); + } + outChannel.append(message); + } }; export function tryParseJSON(jsonString: string): any | boolean { - try { - const jsonObj = JSON.parse(jsonString); - if (jsonObj && typeof jsonObj === "object") { - return jsonObj; - } - } catch (exception) {} - - return false; + try { + const jsonObj = JSON.parse(jsonString); + if (jsonObj && typeof jsonObj === "object") { + return jsonObj; + } + } catch (exception) {} + + return false; } export function fileExistsSync(filePath: string): boolean { - try { - return fs.statSync(filePath).isFile(); - } catch (error) { - return false; - } + try { + return fs.statSync(filePath).isFile(); + } catch (error) { + return false; + } } export function mkdirRecursivelySync(dirPath: string): void { - if (directoryExistsSync(dirPath)) { - return; - } - const dirname = path.dirname(dirPath); - if (path.normalize(dirname) === path.normalize(dirPath)) { - fs.mkdirSync(dirPath); - } else if (directoryExistsSync(dirname)) { - fs.mkdirSync(dirPath); - } else { - mkdirRecursivelySync(dirname); - fs.mkdirSync(dirPath); - } + if (directoryExistsSync(dirPath)) { + return; + } + const dirname = path.dirname(dirPath); + if (path.normalize(dirname) === path.normalize(dirPath)) { + fs.mkdirSync(dirPath); + } else if (directoryExistsSync(dirname)) { + fs.mkdirSync(dirPath); + } else { + mkdirRecursivelySync(dirname); + fs.mkdirSync(dirPath); + } } export function directoryExistsSync(dirPath: string): boolean { - try { - return fs.statSync(dirPath).isDirectory(); - } catch (e) { - return false; - } + try { + return fs.statSync(dirPath).isDirectory(); + } catch (e) { + return false; + } } /** @@ -115,119 +115,121 @@ export function directoryExistsSync(dirPath: string): boolean { * The padding is applied from the start (left) of the current string. */ export function padStart( - sourceString: string, - targetLength: number, - padString?: string + sourceString: string, + targetLength: number, + padString?: string ): string { - if (!sourceString) { - return sourceString; - } - - if (!(String.prototype as any).padStart) { - // https://github.com/uxitten/polyfill/blob/master/string.polyfill.js - padString = String(padString || " "); - if (sourceString.length > targetLength) { - return sourceString; - } else { - targetLength = targetLength - sourceString.length; - if (targetLength > padString.length) { - padString += padString.repeat(targetLength / padString.length); // append to original to ensure we are longer than needed - } - return padString.slice(0, targetLength) + sourceString; - } - } else { - return (sourceString as any).padStart(targetLength, padString); - } + if (!sourceString) { + return sourceString; + } + + if (!(String.prototype as any).padStart) { + // https://github.com/uxitten/polyfill/blob/master/string.polyfill.js + padString = String(padString || " "); + if (sourceString.length > targetLength) { + return sourceString; + } else { + targetLength = targetLength - sourceString.length; + if (targetLength > padString.length) { + padString += padString.repeat(targetLength / padString.length); // append to original to ensure we are longer than needed + } + return padString.slice(0, targetLength) + sourceString; + } + } else { + return (sourceString as any).padStart(targetLength, padString); + } } export function convertToHex(num: number, width = 0): string { - return padStart(num.toString(16), width, "0"); + return padStart(num.toString(16), width, "0"); } export function generateCPXConfig(): void { - const deviceContext: DeviceContext = DeviceContext.getInstance(); - const cpxJson = { - port: deviceContext.port, - }; - const cpxConfigFilePath: string = path.join( - CPXWorkspace.rootPath, - CPX_CONFIG_FILE - ); - mkdirRecursivelySync(path.dirname(cpxConfigFilePath)); - fs.writeFileSync(cpxConfigFilePath, JSON.stringify(cpxJson, null, 4)); + const deviceContext: DeviceContext = DeviceContext.getInstance(); + const cpxJson = { + port: deviceContext.port, + }; + const cpxConfigFilePath: string = path.join( + CPXWorkspace.rootPath, + CPX_CONFIG_FILE + ); + mkdirRecursivelySync(path.dirname(cpxConfigFilePath)); + fs.writeFileSync(cpxConfigFilePath, JSON.stringify(cpxJson, null, 4)); } export const addVisibleTextEditorCallback = ( - currentPanel: vscode.WebviewPanel, - context: vscode.ExtensionContext + currentPanel: vscode.WebviewPanel, + context: vscode.ExtensionContext ): vscode.Disposable => { - const initialPythonEditors = filterForPythonFiles( - vscode.window.visibleTextEditors - ); - currentPanel.webview.postMessage({ - command: "visible-editors", - state: { activePythonEditors: initialPythonEditors }, - }); - return vscode.window.onDidChangeVisibleTextEditors( - (textEditors: vscode.TextEditor[]) => { - const activePythonEditors = filterForPythonFiles(textEditors); - currentPanel.webview.postMessage({ - command: "visible-editors", - state: { activePythonEditors }, - }); - }, - {}, - context.subscriptions - ); + const initialPythonEditors = filterForPythonFiles( + vscode.window.visibleTextEditors + ); + currentPanel.webview.postMessage({ + command: "visible-editors", + state: { activePythonEditors: initialPythonEditors }, + }); + return vscode.window.onDidChangeVisibleTextEditors( + (textEditors: vscode.TextEditor[]) => { + const activePythonEditors = filterForPythonFiles(textEditors); + currentPanel.webview.postMessage({ + command: "visible-editors", + state: { activePythonEditors }, + }); + }, + {}, + context.subscriptions + ); }; export const filterForPythonFiles = (textEditors: vscode.TextEditor[]) => { - return textEditors - .filter(editor => editor.document.languageId === GLOBAL_ENV_VARS.PYTHON) - .map(editor => editor.document.fileName); + return textEditors + .filter( + (editor) => editor.document.languageId === GLOBAL_ENV_VARS.PYTHON + ) + .map((editor) => editor.document.fileName); }; export const getActiveEditorFromPath = ( - filePath: string + filePath: string ): vscode.TextDocument => { - const activeEditor = vscode.window.visibleTextEditors.find( - (editor: vscode.TextEditor) => editor.document.fileName === filePath - ); - return activeEditor ? activeEditor.document : undefined; + const activeEditor = vscode.window.visibleTextEditors.find( + (editor: vscode.TextEditor) => editor.document.fileName === filePath + ); + return activeEditor ? activeEditor.document : undefined; }; export const getServerPortConfig = (): number => { - // tslint:disable: no-backbone-get-set-outside-model prefer-type-cast - if ( - vscode.workspace - .getConfiguration() - .has(SERVER_INFO.SERVER_PORT_CONFIGURATION) - ) { - return vscode.workspace - .getConfiguration() - .get(SERVER_INFO.SERVER_PORT_CONFIGURATION) as number; - } - return SERVER_INFO.DEFAULT_SERVER_PORT; + // tslint:disable: no-backbone-get-set-outside-model prefer-type-cast + if ( + vscode.workspace + .getConfiguration() + .has(SERVER_INFO.SERVER_PORT_CONFIGURATION) + ) { + return vscode.workspace + .getConfiguration() + .get(SERVER_INFO.SERVER_PORT_CONFIGURATION) as number; + } + return SERVER_INFO.DEFAULT_SERVER_PORT; }; export const checkConfig = (configName: string): boolean => { - return vscode.workspace.getConfiguration().get(configName) === true; + return vscode.workspace.getConfiguration().get(configName) === true; }; export const getConfig = (configName: string): string => { - return vscode.workspace.getConfiguration().get(configName); + return vscode.workspace.getConfiguration().get(configName); }; export const createEscapedPath = (...pieces: string[]) => { - const initialPath: string = path.join(...pieces); + const initialPath: string = path.join(...pieces); - // escape all special characters - // https://stackoverflow.com/questions/1779858/how-do-i-escape-a-string-for-a-shell-command-in-node - return `"` + initialPath.replace(/(["'$`\\])/g, "\\$1") + `"`; + // escape all special characters + // https://stackoverflow.com/questions/1779858/how-do-i-escape-a-string-for-a-shell-command-in-node + return `"` + initialPath.replace(/(["'$`\\])/g, "\\$1") + `"`; }; export const getTelemetryState = () => { - return vscode.workspace - .getConfiguration() - .get("telemetry.enableTelemetry", true); + return vscode.workspace + .getConfiguration() + .get("telemetry.enableTelemetry", true); }; diff --git a/src/install_dependencies.py b/src/install_dependencies.py index 00fe81d37..84aeb1d32 100644 --- a/src/install_dependencies.py +++ b/src/install_dependencies.py @@ -1,9 +1,9 @@ -import subprocess -import sys -import pathlib -import os - -os.chdir(str(pathlib.Path(__file__).parent.parent.absolute())) -subprocess.check_call( - [sys.executable, "-m", "pip", "install", "-r", "./out/requirements.txt"] -) +import subprocess +import sys +import pathlib +import os + +os.chdir(str(pathlib.Path(__file__).parent.parent.absolute())) +subprocess.check_call( + [sys.executable, "-m", "pip", "install", "-r", "./out/requirements.txt"] +) diff --git a/src/micropython/music.py b/src/micropython/music.py index ad25816a6..cff300710 100644 --- a/src/micropython/music.py +++ b/src/micropython/music.py @@ -1,109 +1,109 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/music.html. - - -def set_tempo(ticks=4, bpm=120): - """ - This function is not implemented in the simulator. - - Sets the approximate tempo for playback. - - A number of ticks (expressed as an integer) constitute a beat. Each beat is to be played at a certain frequency per minute (expressed as the more familiar BPM - beats per minute - also as an integer). - - Suggested default values allow the following useful behaviour: - - * ``music.set_tempo()`` - reset the tempo to default of ticks = 4, bpm = 120 - * ``music.set_tempo(ticks=8)`` - change the "definition" of a beat - * ``music.set_tempo(bpm=180)`` - just change the tempo - - To work out the length of a tick in milliseconds is very simple arithmetic: ``60000/bpm/ticks_per_beat`` . For the default values that's ``60000/120/4 = 125 milliseconds`` or ``1 beat = 500 milliseconds``. - """ - utils.print_for_unimplemented_functions(set_tempo.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def get_tempo(): - """ - This function is not implemented in the simulator. - - Gets the current tempo as a tuple of integers: ``(ticks, bpm)``. - """ - utils.print_for_unimplemented_functions(get_tempo.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def play(music, pin="microbit.pin0", wait=True, loop=False): - """ - This function is not implemented in the simulator. - - Plays ``music`` containing the musical DSL defined above. - - If ``music`` is a string it is expected to be a single note such as, - ``'c1:4'``. - - If ``music`` is specified as a list of notes (as defined in the section on - the musical DSL, above) then they are played one after the other to perform - a melody. - - In both cases, the ``duration`` and ``octave`` values are reset to - their defaults before the music (whatever it may be) is played. - - An optional argument to specify the output pin can be used to override the - default of ``microbit.pin0``. - - If ``wait`` is set to ``True``, this function is blocking. - - If ``loop`` is set to ``True``, the tune repeats until ``stop`` is called - (see below) or the blocking call is interrupted. - """ - utils.print_for_unimplemented_functions(play.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def pitch(frequency, duration=-1, pin="microbit.pin0", wait=True): - """ - This function is not implemented in the simulator. - - Plays a pitch at the integer frequency given for the specified number of - milliseconds. For example, if the frequency is set to 440 and the length to - 1000 then we hear a standard concert A for one second. - - Note that you can only play one pitch on one pin at any one time. - - If ``wait`` is set to ``True``, this function is blocking. - - If ``duration`` is negative the pitch is played continuously until either the - blocking call is interrupted or, in the case of a background call, a new - frequency is set or ``stop`` is called (see below). - """ - utils.print_for_unimplemented_functions(pitch.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def stop(pin="microbit.pin0"): - """ - This function is not implemented in the simulator. - - Stops all music playback on a given pin, eg. ``music.stop(pin1)``. - If no pin is given, eg. ``music.stop()`` pin0 is assumed. - """ - utils.print_for_unimplemented_functions(stop.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def reset(): - """ - This function is not implemented in the simulator. - - Resets the state of the following attributes in the following way: - - * ``ticks = 4`` - * ``bpm = 120`` - * ``duration = 4`` - * ``octave = 4`` - """ - utils.print_for_unimplemented_functions(reset.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) +from common import utils +from common.telemetry import telemetry_py +from common.telemetry_events import TelemetryEvent + +# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/music.html. + + +def set_tempo(ticks=4, bpm=120): + """ + This function is not implemented in the simulator. + + Sets the approximate tempo for playback. + + A number of ticks (expressed as an integer) constitute a beat. Each beat is to be played at a certain frequency per minute (expressed as the more familiar BPM - beats per minute - also as an integer). + + Suggested default values allow the following useful behaviour: + + * ``music.set_tempo()`` - reset the tempo to default of ticks = 4, bpm = 120 + * ``music.set_tempo(ticks=8)`` - change the "definition" of a beat + * ``music.set_tempo(bpm=180)`` - just change the tempo + + To work out the length of a tick in milliseconds is very simple arithmetic: ``60000/bpm/ticks_per_beat`` . For the default values that's ``60000/120/4 = 125 milliseconds`` or ``1 beat = 500 milliseconds``. + """ + utils.print_for_unimplemented_functions(set_tempo.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) + + +def get_tempo(): + """ + This function is not implemented in the simulator. + + Gets the current tempo as a tuple of integers: ``(ticks, bpm)``. + """ + utils.print_for_unimplemented_functions(get_tempo.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) + + +def play(music, pin="microbit.pin0", wait=True, loop=False): + """ + This function is not implemented in the simulator. + + Plays ``music`` containing the musical DSL defined above. + + If ``music`` is a string it is expected to be a single note such as, + ``'c1:4'``. + + If ``music`` is specified as a list of notes (as defined in the section on + the musical DSL, above) then they are played one after the other to perform + a melody. + + In both cases, the ``duration`` and ``octave`` values are reset to + their defaults before the music (whatever it may be) is played. + + An optional argument to specify the output pin can be used to override the + default of ``microbit.pin0``. + + If ``wait`` is set to ``True``, this function is blocking. + + If ``loop`` is set to ``True``, the tune repeats until ``stop`` is called + (see below) or the blocking call is interrupted. + """ + utils.print_for_unimplemented_functions(play.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) + + +def pitch(frequency, duration=-1, pin="microbit.pin0", wait=True): + """ + This function is not implemented in the simulator. + + Plays a pitch at the integer frequency given for the specified number of + milliseconds. For example, if the frequency is set to 440 and the length to + 1000 then we hear a standard concert A for one second. + + Note that you can only play one pitch on one pin at any one time. + + If ``wait`` is set to ``True``, this function is blocking. + + If ``duration`` is negative the pitch is played continuously until either the + blocking call is interrupted or, in the case of a background call, a new + frequency is set or ``stop`` is called (see below). + """ + utils.print_for_unimplemented_functions(pitch.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) + + +def stop(pin="microbit.pin0"): + """ + This function is not implemented in the simulator. + + Stops all music playback on a given pin, eg. ``music.stop(pin1)``. + If no pin is given, eg. ``music.stop()`` pin0 is assumed. + """ + utils.print_for_unimplemented_functions(stop.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) + + +def reset(): + """ + This function is not implemented in the simulator. + + Resets the state of the following attributes in the following way: + + * ``ticks = 4`` + * ``bpm = 120`` + * ``duration = 4`` + * ``octave = 4`` + """ + utils.print_for_unimplemented_functions(reset.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) diff --git a/src/micropython/radio.py b/src/micropython/radio.py index ac6d24fe3..971f13720 100644 --- a/src/micropython/radio.py +++ b/src/micropython/radio.py @@ -1,180 +1,180 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/radio.html. - -RATE_250KBIT = "" - -RATE_1MBIT = "" - -RATE_2MBIT = "" - - -def on(): - """ - This function is not implemented in the simulator. - - Turns the radio on. This needs to be explicitly called since the radio - draws power and takes up memory that you may otherwise need. - """ - utils.print_for_unimplemented_functions(on.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def off(): - """ - This function is not implemented in the simulator. - - Turns off the radio, thus saving power and memory - """ - utils.print_for_unimplemented_functions(off.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def config(**kwargs): - """ - This function is not implemented in the simulator. - - Configures various keyword based settings relating to the radio. The - available settings and their sensible default values are listed below. - - The ``length`` (default=32) defines the maximum length, in bytes, of a - message sent via the radio. It can be up to 251 bytes long (254 - 3 bytes - for S0, LENGTH and S1 preamble). - - The ``queue`` (default=3) specifies the number of messages that can be - stored on the incoming message queue. If there are no spaces left on the - queue for incoming messages, then the incoming message is dropped. - - The ``channel`` (default=7) can be an integer value from 0 to 83 - (inclusive) that defines an arbitrary "channel" to which the radio is - tuned. Messages will be sent via this channel and only messages received - via this channel will be put onto the incoming message queue. Each step is - 1MHz wide, based at 2400MHz. - - The ``power`` (default=6) is an integer value from 0 to 7 (inclusive) to - indicate the strength of signal used when broadcasting a message. The - higher the value the stronger the signal, but the more power is consumed - by the device. The numbering translates to positions in the following list - of dBm (decibel milliwatt) values: -30, -20, -16, -12, -8, -4, 0, 4. - - The ``address`` (default=0x75626974) is an arbitrary name, expressed as a - 32-bit address, that's used to filter incoming packets at the hardware - level, keeping only those that match the address you set. The default used - by other micro:bit related platforms is the default setting used here. - - The ``group`` (default=0) is an 8-bit value (0-255) used with the - ``address`` when filtering messages. Conceptually, "address" is like a - house/office address and "group" is like the person at that address to - which you want to send your message. - - The ``data_rate`` (default=radio.RATE_1MBIT) indicates the speed at which - data throughput takes place. Can be one of the following contants defined - in the ``radio`` module : ``RATE_250KBIT``, ``RATE_1MBIT`` or - ``RATE_2MBIT``. - - If ``config`` is not called then the defaults described above are assumed. - """ - utils.print_for_unimplemented_functions(config.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def reset(): - """ - This function is not implemented in the simulator. - - Reset the settings to their default values (as listed in the documentation - for the ``config`` function above). - """ - utils.print_for_unimplemented_functions(reset.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def send_bytes(message): - """ - This function is not implemented in the simulator. - - Sends a message containing bytes. - """ - utils.print_for_unimplemented_functions(send_bytes.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def receive_bytes(): - """ - This function is not implemented in the simulator. - - Receive the next incoming message on the message queue. Returns ``None`` if - there are no pending messages. Messages are returned as bytes. - """ - utils.print_for_unimplemented_functions(receive_bytes.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def receive_bytes_into(buffer): - """ - This function is not implemented in the simulator. - - Receive the next incoming message on the message queue. Copies the message - into ``buffer``, trimming the end of the message if necessary. - Returns ``None`` if there are no pending messages, otherwise it returns the length - of the message (which might be more than the length of the buffer). - """ - utils.print_for_unimplemented_functions(receive_bytes_into.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def send(message): - """ - This function is not implemented in the simulator. - - Sends a message containing bytes. - """ - utils.print_for_unimplemented_functions(send.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def receive(): - """ - This function is not implemented in the simulator. - - Works in exactly the same way as ``receive_bytes`` but returns - whatever was sent. - - Currently, it's equivalent to ``str(receive_bytes(), 'utf8')`` but with a - check that the the first three bytes are ``b'\x01\x00\x01'`` (to make it - compatible with other platforms that may target the micro:bit). It strips - the prepended bytes before converting to a string. - - A ``ValueError`` exception is raised if conversion to string fails. - """ - utils.print_for_unimplemented_functions(receive.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def receive_full(): - """ - This function is not implemented in the simulator. - - Returns a tuple containing three values representing the next incoming - message on the message queue. If there are no pending messages then - ``None`` is returned. - - The three values in the tuple represent: - - * the next incoming message on the message queue as bytes. - * the RSSI (signal strength): a value between 0 (strongest) and -255 (weakest) as measured in dBm. - * a microsecond timestamp: the value returned by ``time.ticks_us()`` when the message was received. - - For example:: - - details = radio.receive_full() - if details: - msg, rssi, timestamp = details - - This function is useful for providing information needed for triangulation - and/or triliteration with other micro:bit devices. - """ - utils.print_for_unimplemented_functions(receive_full.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) +from common import utils +from common.telemetry import telemetry_py +from common.telemetry_events import TelemetryEvent + +# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/radio.html. + +RATE_250KBIT = "" + +RATE_1MBIT = "" + +RATE_2MBIT = "" + + +def on(): + """ + This function is not implemented in the simulator. + + Turns the radio on. This needs to be explicitly called since the radio + draws power and takes up memory that you may otherwise need. + """ + utils.print_for_unimplemented_functions(on.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) + + +def off(): + """ + This function is not implemented in the simulator. + + Turns off the radio, thus saving power and memory + """ + utils.print_for_unimplemented_functions(off.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) + + +def config(**kwargs): + """ + This function is not implemented in the simulator. + + Configures various keyword based settings relating to the radio. The + available settings and their sensible default values are listed below. + + The ``length`` (default=32) defines the maximum length, in bytes, of a + message sent via the radio. It can be up to 251 bytes long (254 - 3 bytes + for S0, LENGTH and S1 preamble). + + The ``queue`` (default=3) specifies the number of messages that can be + stored on the incoming message queue. If there are no spaces left on the + queue for incoming messages, then the incoming message is dropped. + + The ``channel`` (default=7) can be an integer value from 0 to 83 + (inclusive) that defines an arbitrary "channel" to which the radio is + tuned. Messages will be sent via this channel and only messages received + via this channel will be put onto the incoming message queue. Each step is + 1MHz wide, based at 2400MHz. + + The ``power`` (default=6) is an integer value from 0 to 7 (inclusive) to + indicate the strength of signal used when broadcasting a message. The + higher the value the stronger the signal, but the more power is consumed + by the device. The numbering translates to positions in the following list + of dBm (decibel milliwatt) values: -30, -20, -16, -12, -8, -4, 0, 4. + + The ``address`` (default=0x75626974) is an arbitrary name, expressed as a + 32-bit address, that's used to filter incoming packets at the hardware + level, keeping only those that match the address you set. The default used + by other micro:bit related platforms is the default setting used here. + + The ``group`` (default=0) is an 8-bit value (0-255) used with the + ``address`` when filtering messages. Conceptually, "address" is like a + house/office address and "group" is like the person at that address to + which you want to send your message. + + The ``data_rate`` (default=radio.RATE_1MBIT) indicates the speed at which + data throughput takes place. Can be one of the following contants defined + in the ``radio`` module : ``RATE_250KBIT``, ``RATE_1MBIT`` or + ``RATE_2MBIT``. + + If ``config`` is not called then the defaults described above are assumed. + """ + utils.print_for_unimplemented_functions(config.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) + + +def reset(): + """ + This function is not implemented in the simulator. + + Reset the settings to their default values (as listed in the documentation + for the ``config`` function above). + """ + utils.print_for_unimplemented_functions(reset.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) + + +def send_bytes(message): + """ + This function is not implemented in the simulator. + + Sends a message containing bytes. + """ + utils.print_for_unimplemented_functions(send_bytes.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) + + +def receive_bytes(): + """ + This function is not implemented in the simulator. + + Receive the next incoming message on the message queue. Returns ``None`` if + there are no pending messages. Messages are returned as bytes. + """ + utils.print_for_unimplemented_functions(receive_bytes.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) + + +def receive_bytes_into(buffer): + """ + This function is not implemented in the simulator. + + Receive the next incoming message on the message queue. Copies the message + into ``buffer``, trimming the end of the message if necessary. + Returns ``None`` if there are no pending messages, otherwise it returns the length + of the message (which might be more than the length of the buffer). + """ + utils.print_for_unimplemented_functions(receive_bytes_into.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) + + +def send(message): + """ + This function is not implemented in the simulator. + + Sends a message containing bytes. + """ + utils.print_for_unimplemented_functions(send.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) + + +def receive(): + """ + This function is not implemented in the simulator. + + Works in exactly the same way as ``receive_bytes`` but returns + whatever was sent. + + Currently, it's equivalent to ``str(receive_bytes(), 'utf8')`` but with a + check that the the first three bytes are ``b'\x01\x00\x01'`` (to make it + compatible with other platforms that may target the micro:bit). It strips + the prepended bytes before converting to a string. + + A ``ValueError`` exception is raised if conversion to string fails. + """ + utils.print_for_unimplemented_functions(receive.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) + + +def receive_full(): + """ + This function is not implemented in the simulator. + + Returns a tuple containing three values representing the next incoming + message on the message queue. If there are no pending messages then + ``None`` is returned. + + The three values in the tuple represent: + + * the next incoming message on the message queue as bytes. + * the RSSI (signal strength): a value between 0 (strongest) and -255 (weakest) as measured in dBm. + * a microsecond timestamp: the value returned by ``time.ticks_us()`` when the message was received. + + For example:: + + details = radio.receive_full() + if details: + msg, rssi, timestamp = details + + This function is useful for providing information needed for triangulation + and/or triliteration with other micro:bit devices. + """ + utils.print_for_unimplemented_functions(receive_full.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) diff --git a/src/micropython/speech.py b/src/micropython/speech.py index e92458a96..0fef5c6fb 100644 --- a/src/micropython/speech.py +++ b/src/micropython/speech.py @@ -1,61 +1,61 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/speech.html. - - -def translate(words): - """ - This function is not implemented in the simulator. - - Given English words in the string ``words``, return a string containing - a best guess at the appropriate phonemes to pronounce. The output is - generated from this - `text to phoneme translation table `_. - - This function should be used to generate a first approximation of phonemes - that can be further hand-edited to improve accuracy, inflection and - emphasis. - """ - utils.print_for_unimplemented_functions(translate.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) - - -def pronounce(phonemes, pitch=64, speed=72, mouth=128, throat=128): - """ - This function is not implemented in the simulator. - - Pronounce the phonemes in the string ``phonemes``. See below for details of - how to use phonemes to finely control the output of the speech synthesiser. - Override the optional pitch, speed, mouth and throat settings to change the - timbre (quality) of the voice. - """ - utils.print_for_unimplemented_functions(pronounce.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) - - -def say(words, pitch=64, speed=72, mouth=128, throat=128): - """ - This function is not implemented in the simulator. - - Say the English words in the string ``words``. The result is semi-accurate - for English. Override the optional pitch, speed, mouth and throat - settings to change the timbre (quality) of the voice. This is a short-hand - equivalent of: ``speech.pronounce(speech.translate(words))`` - """ - utils.print_for_unimplemented_functions(say.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) - - -def sing(phonemes, pitch=64, speed=72, mouth=128, throat=128): - """ - This function is not implemented in the simulator. - - Sing the phonemes contained in the string ``phonemes``. Changing the pitch - and duration of the note is described below. Override the optional pitch, - speed, mouth and throat settings to change the timbre (quality) of the - voice. - """ - utils.print_for_unimplemented_functions(sing.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) +from common import utils +from common.telemetry import telemetry_py +from common.telemetry_events import TelemetryEvent + +# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/speech.html. + + +def translate(words): + """ + This function is not implemented in the simulator. + + Given English words in the string ``words``, return a string containing + a best guess at the appropriate phonemes to pronounce. The output is + generated from this + `text to phoneme translation table `_. + + This function should be used to generate a first approximation of phonemes + that can be further hand-edited to improve accuracy, inflection and + emphasis. + """ + utils.print_for_unimplemented_functions(translate.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) + + +def pronounce(phonemes, pitch=64, speed=72, mouth=128, throat=128): + """ + This function is not implemented in the simulator. + + Pronounce the phonemes in the string ``phonemes``. See below for details of + how to use phonemes to finely control the output of the speech synthesiser. + Override the optional pitch, speed, mouth and throat settings to change the + timbre (quality) of the voice. + """ + utils.print_for_unimplemented_functions(pronounce.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) + + +def say(words, pitch=64, speed=72, mouth=128, throat=128): + """ + This function is not implemented in the simulator. + + Say the English words in the string ``words``. The result is semi-accurate + for English. Override the optional pitch, speed, mouth and throat + settings to change the timbre (quality) of the voice. This is a short-hand + equivalent of: ``speech.pronounce(speech.translate(words))`` + """ + utils.print_for_unimplemented_functions(say.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) + + +def sing(phonemes, pitch=64, speed=72, mouth=128, throat=128): + """ + This function is not implemented in the simulator. + + Sing the phonemes contained in the string ``phonemes``. Changing the pitch + and duration of the note is described below. Override the optional pitch, + speed, mouth and throat settings to change the timbre (quality) of the + voice. + """ + utils.print_for_unimplemented_functions(sing.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) diff --git a/src/micropython/utime.py b/src/micropython/utime.py index 9ae5ee4df..4caee2d9b 100644 --- a/src/micropython/utime.py +++ b/src/micropython/utime.py @@ -1,132 +1,132 @@ -import time - -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/utime.html. - - -def sleep(seconds): - """ - Sleep for the given number of seconds. You can use a floating-point number - to sleep for a fractional number of seconds, or use the - :func:`utime.sleep_ms()` and :func:`utime.sleep_us()` functions. - """ - time.sleep(seconds) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def sleep_ms(ms): - """ - Delay for given number of milliseconds, should be positive or 0. - """ - time.sleep(ms / 1000) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def sleep_us(us): - """ - Delay for given number of microseconds, should be positive or 0. - """ - time.sleep(us / 1000000) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def ticks_ms(): - """ - This function is not implemented in the simulator. - - Returns an increasing millisecond counter with an arbitrary reference point, - that wraps around after some value. - """ - utils.print_for_unimplemented_functions(ticks_ms.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def ticks_us(): - """ - This function is not implemented in the simulator. - - Just like :func:`utime.ticks_ms()` above, but in microseconds. - """ - utils.print_for_unimplemented_functions(ticks_us.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def ticks_add(ticks, delta): - """ - This function is not implemented in the simulator. - - Offset ticks value by a given number, which can be either positive or - negative. Given a ticks value, this function allows to calculate ticks - value delta ticks before or after it, following modular-arithmetic - definition of tick values. - - Example: - - .. code-block:: python - - # Find out what ticks value there was 100ms ago - print(ticks_add(time.ticks_ms(), -100)) - - # Calculate deadline for operation and test for it - deadline = ticks_add(time.ticks_ms(), 200) - while ticks_diff(deadline, time.ticks_ms()) > 0: - do_a_little_of_something() - - # Find out TICKS_MAX used by this port - print(ticks_add(0, -1)) - """ - utils.print_for_unimplemented_functions(ticks_add.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def ticks_diff(ticks1, ticks2): - """ - This function is not implemented in the simulator. - - Measure ticks difference between values returned from - :func:`utime.ticks_ms()` or :func:`ticks_us()` functions, as a signed value - which may wrap around. - - The argument order is the same as for subtraction operator, - ``ticks_diff(ticks1, ticks2)`` has the same meaning as ``ticks1 - ticks2``. - - :func:`utime.ticks_diff()` is designed to accommodate various usage - patterns, among them: - - Polling with timeout. In this case, the order of events is known, and you - will deal only with positive results of :func:`utime.ticks_diff()`: - - .. code-block:: python - - # Wait for GPIO pin to be asserted, but at most 500us - start = time.ticks_us() - while pin.value() == 0: - if time.ticks_diff(time.ticks_us(), start) > 500: - raise TimeoutError - - - Scheduling events. In this case, :func:`utime.ticks_diff()` result may be - negative if an event is overdue: - - - .. code-block:: python - - # This code snippet is not optimized - now = time.ticks_ms() - scheduled_time = task.scheduled_time() - if ticks_diff(scheduled_time, now) > 0: - print("Too early, let's nap") - sleep_ms(ticks_diff(scheduled_time, now)) - task.run() - elif ticks_diff(scheduled_time, now) == 0: - print("Right at time!") - task.run() - elif ticks_diff(scheduled_time, now) < 0: - print("Oops, running late, tell task to run faster!") - task.run(run_faster=true) - """ - utils.print_for_unimplemented_functions(ticks_diff.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) +import time + +from common import utils +from common.telemetry import telemetry_py +from common.telemetry_events import TelemetryEvent + +# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/utime.html. + + +def sleep(seconds): + """ + Sleep for the given number of seconds. You can use a floating-point number + to sleep for a fractional number of seconds, or use the + :func:`utime.sleep_ms()` and :func:`utime.sleep_us()` functions. + """ + time.sleep(seconds) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) + + +def sleep_ms(ms): + """ + Delay for given number of milliseconds, should be positive or 0. + """ + time.sleep(ms / 1000) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) + + +def sleep_us(us): + """ + Delay for given number of microseconds, should be positive or 0. + """ + time.sleep(us / 1000000) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) + + +def ticks_ms(): + """ + This function is not implemented in the simulator. + + Returns an increasing millisecond counter with an arbitrary reference point, + that wraps around after some value. + """ + utils.print_for_unimplemented_functions(ticks_ms.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) + + +def ticks_us(): + """ + This function is not implemented in the simulator. + + Just like :func:`utime.ticks_ms()` above, but in microseconds. + """ + utils.print_for_unimplemented_functions(ticks_us.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) + + +def ticks_add(ticks, delta): + """ + This function is not implemented in the simulator. + + Offset ticks value by a given number, which can be either positive or + negative. Given a ticks value, this function allows to calculate ticks + value delta ticks before or after it, following modular-arithmetic + definition of tick values. + + Example: + + .. code-block:: python + + # Find out what ticks value there was 100ms ago + print(ticks_add(time.ticks_ms(), -100)) + + # Calculate deadline for operation and test for it + deadline = ticks_add(time.ticks_ms(), 200) + while ticks_diff(deadline, time.ticks_ms()) > 0: + do_a_little_of_something() + + # Find out TICKS_MAX used by this port + print(ticks_add(0, -1)) + """ + utils.print_for_unimplemented_functions(ticks_add.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) + + +def ticks_diff(ticks1, ticks2): + """ + This function is not implemented in the simulator. + + Measure ticks difference between values returned from + :func:`utime.ticks_ms()` or :func:`ticks_us()` functions, as a signed value + which may wrap around. + + The argument order is the same as for subtraction operator, + ``ticks_diff(ticks1, ticks2)`` has the same meaning as ``ticks1 - ticks2``. + + :func:`utime.ticks_diff()` is designed to accommodate various usage + patterns, among them: + + Polling with timeout. In this case, the order of events is known, and you + will deal only with positive results of :func:`utime.ticks_diff()`: + + .. code-block:: python + + # Wait for GPIO pin to be asserted, but at most 500us + start = time.ticks_us() + while pin.value() == 0: + if time.ticks_diff(time.ticks_us(), start) > 500: + raise TimeoutError + + + Scheduling events. In this case, :func:`utime.ticks_diff()` result may be + negative if an event is overdue: + + + .. code-block:: python + + # This code snippet is not optimized + now = time.ticks_ms() + scheduled_time = task.scheduled_time() + if ticks_diff(scheduled_time, now) > 0: + print("Too early, let's nap") + sleep_ms(ticks_diff(scheduled_time, now)) + task.run() + elif ticks_diff(scheduled_time, now) == 0: + print("Right at time!") + task.run() + elif ticks_diff(scheduled_time, now) < 0: + print("Oops, running late, tell task to run faster!") + task.run(run_faster=true) + """ + utils.print_for_unimplemented_functions(ticks_diff.__name__) + telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) diff --git a/src/requirements.txt b/src/requirements.txt index c13eef60b..3a5fdb5a2 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -9,4 +9,4 @@ adafruit-circuitpython-fancyled==1.3.3 Pillow==8.1.1 adafruit-circuitpython-bitmap_font==1.1.0 adafruit-circuitpython-display-shapes==1.2.0 -adafruit-circuitpython-neopixel==5.0.0 \ No newline at end of file +adafruit-circuitpython-neopixel==5.0.0 diff --git a/src/serialMonitor.ts b/src/serialMonitor.ts index f3685cd58..f5460862c 100644 --- a/src/serialMonitor.ts +++ b/src/serialMonitor.ts @@ -11,300 +11,288 @@ import { logToOutputChannel } from "./extension_utils/utils"; import { SerialPortControl } from "./serialPortControl"; export interface ISerialPortDetail { - path: string; - manufacturer: string; - vendorId: string; - productId: string; + path: string; + manufacturer: string; + vendorId: string; + productId: string; } export class SerialMonitor implements vscode.Disposable { - public static DEFAULT_BAUD_RATE: number = 115200; + public static DEFAULT_BAUD_RATE: number = 115200; - public static listBaudRates(): number[] { - return [ - 300, - 1200, - 2400, - 4800, - 9600, - 19200, - 38400, - 57600, - 74880, - 115200, - 230400, - 250000, - ]; - } + public static listBaudRates(): number[] { + return [ + 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 74880, 115200, + 230400, 250000, + ]; + } - public static getInstance(): SerialMonitor { - if (SerialMonitor._serialMonitor === null) { - SerialMonitor._serialMonitor = new SerialMonitor(); - } - return SerialMonitor._serialMonitor; - } + public static getInstance(): SerialMonitor { + if (SerialMonitor._serialMonitor === null) { + SerialMonitor._serialMonitor = new SerialMonitor(); + } + return SerialMonitor._serialMonitor; + } - private static _serialMonitor: SerialMonitor | null = null; + private static _serialMonitor: SerialMonitor | null = null; - private _currentPort!: string; - private _currentBaudRate!: number; - private _outputChannel!: vscode.OutputChannel; - private _serialPortControl: SerialPortControl | null = null; - private _baudRateStatusBar!: vscode.StatusBarItem; - private _openPortStatusBar!: vscode.StatusBarItem; - private _portsStatusBar!: vscode.StatusBarItem; + private _currentPort!: string; + private _currentBaudRate!: number; + private _outputChannel!: vscode.OutputChannel; + private _serialPortControl: SerialPortControl | null = null; + private _baudRateStatusBar!: vscode.StatusBarItem; + private _openPortStatusBar!: vscode.StatusBarItem; + private _portsStatusBar!: vscode.StatusBarItem; - private constructor() { - const deviceContext = DeviceContext.getInstance(); - deviceContext.onDidChange(() => { - if (deviceContext.port) { - if (!this.initialized) { - this.initialize(); - } - this.updatePortListStatus(null); - } - }); - } + private constructor() { + const deviceContext = DeviceContext.getInstance(); + deviceContext.onDidChange(() => { + if (deviceContext.port) { + if (!this.initialized) { + this.initialize(); + } + this.updatePortListStatus(null); + } + }); + } - public initialize() { - const defaultBaudRate: number = SerialMonitor.DEFAULT_BAUD_RATE; - this._outputChannel = vscode.window.createOutputChannel( - CONSTANTS.MISC.SERIAL_MONITOR_NAME - ); - this._currentBaudRate = defaultBaudRate; - this._portsStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.PORT - ); - this._portsStatusBar.command = - "deviceSimulatorExpress.common.selectSerialPort"; - this._portsStatusBar.tooltip = "Select Serial Port"; - this._portsStatusBar.show(); + public initialize() { + const defaultBaudRate: number = SerialMonitor.DEFAULT_BAUD_RATE; + this._outputChannel = vscode.window.createOutputChannel( + CONSTANTS.MISC.SERIAL_MONITOR_NAME + ); + this._currentBaudRate = defaultBaudRate; + this._portsStatusBar = vscode.window.createStatusBarItem( + vscode.StatusBarAlignment.Right, + STATUS_BAR_PRIORITY.PORT + ); + this._portsStatusBar.command = + "deviceSimulatorExpress.common.selectSerialPort"; + this._portsStatusBar.tooltip = "Select Serial Port"; + this._portsStatusBar.show(); - this._openPortStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.OPEN_PORT - ); - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.openSerialMonitor"; - this._openPortStatusBar.text = `$(plug)`; - this._openPortStatusBar.tooltip = "Open Serial Monitor"; - this._openPortStatusBar.show(); + this._openPortStatusBar = vscode.window.createStatusBarItem( + vscode.StatusBarAlignment.Right, + STATUS_BAR_PRIORITY.OPEN_PORT + ); + this._openPortStatusBar.command = + "deviceSimulatorExpress.common.openSerialMonitor"; + this._openPortStatusBar.text = `$(plug)`; + this._openPortStatusBar.tooltip = "Open Serial Monitor"; + this._openPortStatusBar.show(); - this._baudRateStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.BAUD_RATE - ); - this._baudRateStatusBar.command = - "deviceSimulatorExpress.common.changeBaudRate"; - this._baudRateStatusBar.tooltip = "Baud Rate"; - this._baudRateStatusBar.text = defaultBaudRate.toString(); - this.updatePortListStatus(null); - } + this._baudRateStatusBar = vscode.window.createStatusBarItem( + vscode.StatusBarAlignment.Right, + STATUS_BAR_PRIORITY.BAUD_RATE + ); + this._baudRateStatusBar.command = + "deviceSimulatorExpress.common.changeBaudRate"; + this._baudRateStatusBar.tooltip = "Baud Rate"; + this._baudRateStatusBar.text = defaultBaudRate.toString(); + this.updatePortListStatus(null); + } - public async selectSerialPort(vid: string | null, pid: string | null) { - const lists = await SerialPortControl.list(); - if (!lists.length) { - vscode.window.showInformationMessage( - "No serial message is available." - ); - return; - } + public async selectSerialPort(vid: string | null, pid: string | null) { + const lists = await SerialPortControl.list(); + if (!lists.length) { + vscode.window.showInformationMessage( + "No serial message is available." + ); + return; + } - if (vid && pid) { - const valueOfVid = parseInt(vid, 16); - const valueOfPid = parseInt(pid, 16); - const foundPort = lists.find(port => { - if (port.productId && port.vendorId) { - return ( - parseInt(port.productId, 16) === valueOfPid && - parseInt(port.vendorId, 16) === valueOfVid - ); - } - return false; - }); - if ( - foundPort && - !(this._serialPortControl && this._serialPortControl.isActive) - ) { - this.updatePortListStatus(foundPort.path); - } - } else { - const chosen = await vscode.window.showQuickPick( - lists - .map( - (port: ISerialPortDetail): vscode.QuickPickItem => { - return { - description: port.manufacturer, - label: port.path, - }; - } - ) - .sort((a, b): number => { - return a.label === b.label - ? 0 - : a.label > b.label - ? 1 - : -1; - }) as vscode.QuickPickItem[], - { placeHolder: CONSTANTS.MISC.SELECT_PORT_PLACEHOLDER } - ); + if (vid && pid) { + const valueOfVid = parseInt(vid, 16); + const valueOfPid = parseInt(pid, 16); + const foundPort = lists.find((port) => { + if (port.productId && port.vendorId) { + return ( + parseInt(port.productId, 16) === valueOfPid && + parseInt(port.vendorId, 16) === valueOfVid + ); + } + return false; + }); + if ( + foundPort && + !(this._serialPortControl && this._serialPortControl.isActive) + ) { + this.updatePortListStatus(foundPort.path); + } + } else { + const chosen = await vscode.window.showQuickPick( + lists + .map((port: ISerialPortDetail): vscode.QuickPickItem => { + return { + description: port.manufacturer, + label: port.path, + }; + }) + .sort((a, b): number => { + return a.label === b.label + ? 0 + : a.label > b.label + ? 1 + : -1; + }) as vscode.QuickPickItem[], + { placeHolder: CONSTANTS.MISC.SELECT_PORT_PLACEHOLDER } + ); - if (chosen && chosen.label) { - this.updatePortListStatus(chosen.label); - } - } - } + if (chosen && chosen.label) { + this.updatePortListStatus(chosen.label); + } + } + } - public async openSerialMonitor() { - if (!this._currentPort) { - const ans = await vscode.window.showInformationMessage( - CONSTANTS.WARNING.NO_SERIAL_PORT_SELECTED, - DialogResponses.SELECT, - DialogResponses.CANCEL - ); - if (ans === DialogResponses.SELECT) { - await this.selectSerialPort(null, null); - } - if (!this._currentPort) { - return; - } - } + public async openSerialMonitor() { + if (!this._currentPort) { + const ans = await vscode.window.showInformationMessage( + CONSTANTS.WARNING.NO_SERIAL_PORT_SELECTED, + DialogResponses.SELECT, + DialogResponses.CANCEL + ); + if (ans === DialogResponses.SELECT) { + await this.selectSerialPort(null, null); + } + if (!this._currentPort) { + return; + } + } - if (this._serialPortControl) { - if (this._currentPort !== this._serialPortControl.currentPort) { - await this._serialPortControl.changePort(this._currentPort); - } else if (this._serialPortControl.isActive) { - vscode.window.showWarningMessage( - `Serial Monitor is already opened for ${this._currentPort}` - ); - return; - } - } else { - this._serialPortControl = new SerialPortControl( - this._currentPort, - this._currentBaudRate, - this._outputChannel - ); - } + if (this._serialPortControl) { + if (this._currentPort !== this._serialPortControl.currentPort) { + await this._serialPortControl.changePort(this._currentPort); + } else if (this._serialPortControl.isActive) { + vscode.window.showWarningMessage( + `Serial Monitor is already opened for ${this._currentPort}` + ); + return; + } + } else { + this._serialPortControl = new SerialPortControl( + this._currentPort, + this._currentBaudRate, + this._outputChannel + ); + } - if (!this._serialPortControl.currentPort) { - console.error( - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT(this._currentPort) - ); - return; - } + if (!this._serialPortControl.currentPort) { + console.error( + CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT(this._currentPort) + ); + return; + } - try { - await this._serialPortControl.open(); - this.updatePortStatus(true); - } catch (error) { - logToOutputChannel( - outChannel, - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT_DUE_TO( - this._currentPort, - error - ), - true - ); - } - } + try { + await this._serialPortControl.open(); + this.updatePortStatus(true); + } catch (error) { + logToOutputChannel( + outChannel, + CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT_DUE_TO( + this._currentPort, + error + ), + true + ); + } + } - public get initialized(): boolean { - return !!this._outputChannel; - } + public get initialized(): boolean { + return !!this._outputChannel; + } - public dispose() { - if (this._serialPortControl && this._serialPortControl.isActive) { - return this._serialPortControl.stop(); - } - } + public dispose() { + if (this._serialPortControl && this._serialPortControl.isActive) { + return this._serialPortControl.stop(); + } + } - public async changeBaudRate() { - const baudRates = SerialMonitor.listBaudRates(); - const chosen = await vscode.window.showQuickPick( - baudRates.map(baudRate => baudRate.toString()) - ); + public async changeBaudRate() { + const baudRates = SerialMonitor.listBaudRates(); + const chosen = await vscode.window.showQuickPick( + baudRates.map((baudRate) => baudRate.toString()) + ); - if (!chosen) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.NO_RATE_SELECTED, - true - ); - return; - } + if (!chosen) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.NO_RATE_SELECTED, + true + ); + return; + } - if (!parseInt(chosen, 10)) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.INVALID_BAUD_RATE, - true - ); - return; - } + if (!parseInt(chosen, 10)) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.INVALID_BAUD_RATE, + true + ); + return; + } - if (!this._serialPortControl) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.SERIAL_MONITOR_NOT_STARTED, - true - ); - return; - } + if (!this._serialPortControl) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.SERIAL_MONITOR_NOT_STARTED, + true + ); + return; + } - const selectedRate: number = parseInt(chosen, 10); - await this._serialPortControl.changeBaudRate(selectedRate); - this._currentBaudRate = selectedRate; - this._baudRateStatusBar.text = chosen; - } + const selectedRate: number = parseInt(chosen, 10); + await this._serialPortControl.changeBaudRate(selectedRate); + this._currentBaudRate = selectedRate; + this._baudRateStatusBar.text = chosen; + } - public async closeSerialMonitor(port: string, showWarning: boolean = true) { - if (this._serialPortControl) { - if (port && port !== this._serialPortControl.currentPort) { - // Port is not opened - return false; - } - const result = await this._serialPortControl.stop(); - this.updatePortStatus(false); - return result; - } else if (!port && showWarning) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.SERIAL_PORT_NOT_STARTED, - true - ); - return false; - } - } + public async closeSerialMonitor(port: string, showWarning: boolean = true) { + if (this._serialPortControl) { + if (port && port !== this._serialPortControl.currentPort) { + // Port is not opened + return false; + } + const result = await this._serialPortControl.stop(); + this.updatePortStatus(false); + return result; + } else if (!port && showWarning) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.SERIAL_PORT_NOT_STARTED, + true + ); + return false; + } + } - private updatePortStatus(isOpened: boolean) { - if (isOpened) { - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.closeSerialMonitor"; - this._openPortStatusBar.text = `$(x)`; - this._openPortStatusBar.tooltip = "Close Serial Monitor"; - this._baudRateStatusBar.show(); - } else { - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.openSerialMonitor"; - this._openPortStatusBar.text = `$(plug)`; - this._openPortStatusBar.tooltip = "Open Serial Monitor"; - this._baudRateStatusBar.hide(); - } - } + private updatePortStatus(isOpened: boolean) { + if (isOpened) { + this._openPortStatusBar.command = + "deviceSimulatorExpress.common.closeSerialMonitor"; + this._openPortStatusBar.text = `$(x)`; + this._openPortStatusBar.tooltip = "Close Serial Monitor"; + this._baudRateStatusBar.show(); + } else { + this._openPortStatusBar.command = + "deviceSimulatorExpress.common.openSerialMonitor"; + this._openPortStatusBar.text = `$(plug)`; + this._openPortStatusBar.tooltip = "Open Serial Monitor"; + this._baudRateStatusBar.hide(); + } + } - private updatePortListStatus(port: string | null) { - const deviceContext = DeviceContext.getInstance(); - if (port) { - deviceContext.port = port; - } - this._currentPort = deviceContext.port; + private updatePortListStatus(port: string | null) { + const deviceContext = DeviceContext.getInstance(); + if (port) { + deviceContext.port = port; + } + this._currentPort = deviceContext.port; - if (deviceContext.port) { - this._portsStatusBar.text = deviceContext.port; - } else { - this._portsStatusBar.text = ""; + } + } } diff --git a/src/serialPortControl.ts b/src/serialPortControl.ts index 64d8d010a..0abcfa03e 100644 --- a/src/serialPortControl.ts +++ b/src/serialPortControl.ts @@ -9,188 +9,188 @@ import { CONSTANTS } from "./constants"; import { logToOutputChannel } from "./extension_utils/utils"; interface ISerialPortDetail { - path: string; - manufacturer: string; - vendorId: string; - productId: string; + path: string; + manufacturer: string; + vendorId: string; + productId: string; } export class SerialPortControl { - public static get serialport(): any { - if (!SerialPortControl._serialport) { - SerialPortControl._serialport = require("usb-native").SerialPort; - } - return SerialPortControl._serialport; - } - - public static list(): Promise { - return new Promise((resolve, reject) => { - SerialPortControl.serialport.list().then( - ports => resolve(ports), - err => reject(err) - ); - }); - } - - private static _serialport: any; - - private _currentPort: string; - private _currentBaudRate: number; - private _currentSerialPort: any; - - public constructor( - port: string, - baudRate: number, - private _outputChannel: OutputChannel - ) { - this._currentPort = port; - this._currentBaudRate = baudRate; - } - - public get isActive(): boolean { - return this._currentSerialPort && this._currentSerialPort.isOpen; - } - - public get currentPort(): string { - return this._currentPort; - } - - public open(): Promise { - logToOutputChannel( - this._outputChannel, - CONSTANTS.INFO.OPENING_SERIAL_PORT(this._currentPort) - ); - return new Promise((resolve, reject) => { - if (this._currentSerialPort && this._currentSerialPort.isOpen) { - this._currentSerialPort.close((err: any) => { - if (err) { - return reject(err); - } - this._currentSerialPort = null; - return this.open().then( - () => { - resolve(); - }, - error => { - reject(error); - } - ); - }); - } else { - this._currentSerialPort = new SerialPortControl.serialport( - this._currentPort, - { baudRate: this._currentBaudRate } - ); - this._outputChannel.show(); - this._currentSerialPort.on("open", () => { - this._currentSerialPort.write( - CONSTANTS.MISC.SERIAL_MONITOR_TEST_IF_OPEN + os.EOL, - (err: any) => { - if ( - err && - !( - err.message.indexOf( - CONSTANTS.ERROR.COMPORT_UNKNOWN_ERROR - ) >= 0 - ) - ) { - logToOutputChannel( - this._outputChannel, - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT( - this._currentPort - ) - ); - logToOutputChannel( - this._outputChannel, - CONSTANTS.ERROR.RECONNECT_DEVICE - ); - reject(err); - } else { - logToOutputChannel( - this._outputChannel, - CONSTANTS.INFO.OPENED_SERIAL_PORT( - this._currentPort - ) - ); - resolve(); - } - } - ); - }); - } - - this._currentSerialPort.on("data", (event: any) => { - logToOutputChannel(this._outputChannel, event.toString()); - }); - - this._currentSerialPort.on("error", (error: any) => { - logToOutputChannel(this._outputChannel, error.toString()); - }); - }); - } - - public changePort(newPort: string): Promise { - return new Promise((resolve, reject) => { - if (newPort === this._currentPort) { - resolve(); - return; - } - this._currentPort = newPort; - if (!this._currentSerialPort || !this.isActive) { - resolve(); - return; - } - this._currentSerialPort.close((error: any) => { - if (error) { - reject(error); - } else { - this._currentSerialPort = null; - resolve(); - } - }); - }); - } - - public stop(): Promise { - return new Promise((resolve, reject) => { - if (!this._currentSerialPort || !this.isActive) { - resolve(false); - return; - } - this._currentSerialPort.close((error: any) => { - if (this._outputChannel) { - logToOutputChannel( - this._outputChannel, - CONSTANTS.INFO.CLOSED_SERIAL_PORT(this._currentPort) - ); - } - this._currentSerialPort = null; - if (error) { - reject(error); - } else { - resolve(true); - } - }); - }); - } - - public changeBaudRate(newBaudRate: number): Promise { - return new Promise((resolve, reject) => { - this._currentBaudRate = newBaudRate; - if (!this._currentSerialPort || !this.isActive) { - resolve(); - return; - } - this._currentSerialPort.update( - { baudRate: this._currentBaudRate }, - (error: any) => { - if (error) { - reject(error); - } else { - resolve(); - } - } - ); - }); - } + public static get serialport(): any { + if (!SerialPortControl._serialport) { + SerialPortControl._serialport = require("usb-native").SerialPort; + } + return SerialPortControl._serialport; + } + + public static list(): Promise { + return new Promise((resolve, reject) => { + SerialPortControl.serialport.list().then( + (ports) => resolve(ports), + (err) => reject(err) + ); + }); + } + + private static _serialport: any; + + private _currentPort: string; + private _currentBaudRate: number; + private _currentSerialPort: any; + + public constructor( + port: string, + baudRate: number, + private _outputChannel: OutputChannel + ) { + this._currentPort = port; + this._currentBaudRate = baudRate; + } + + public get isActive(): boolean { + return this._currentSerialPort && this._currentSerialPort.isOpen; + } + + public get currentPort(): string { + return this._currentPort; + } + + public open(): Promise { + logToOutputChannel( + this._outputChannel, + CONSTANTS.INFO.OPENING_SERIAL_PORT(this._currentPort) + ); + return new Promise((resolve, reject) => { + if (this._currentSerialPort && this._currentSerialPort.isOpen) { + this._currentSerialPort.close((err: any) => { + if (err) { + return reject(err); + } + this._currentSerialPort = null; + return this.open().then( + () => { + resolve(); + }, + (error) => { + reject(error); + } + ); + }); + } else { + this._currentSerialPort = new SerialPortControl.serialport( + this._currentPort, + { baudRate: this._currentBaudRate } + ); + this._outputChannel.show(); + this._currentSerialPort.on("open", () => { + this._currentSerialPort.write( + CONSTANTS.MISC.SERIAL_MONITOR_TEST_IF_OPEN + os.EOL, + (err: any) => { + if ( + err && + !( + err.message.indexOf( + CONSTANTS.ERROR.COMPORT_UNKNOWN_ERROR + ) >= 0 + ) + ) { + logToOutputChannel( + this._outputChannel, + CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT( + this._currentPort + ) + ); + logToOutputChannel( + this._outputChannel, + CONSTANTS.ERROR.RECONNECT_DEVICE + ); + reject(err); + } else { + logToOutputChannel( + this._outputChannel, + CONSTANTS.INFO.OPENED_SERIAL_PORT( + this._currentPort + ) + ); + resolve(); + } + } + ); + }); + } + + this._currentSerialPort.on("data", (event: any) => { + logToOutputChannel(this._outputChannel, event.toString()); + }); + + this._currentSerialPort.on("error", (error: any) => { + logToOutputChannel(this._outputChannel, error.toString()); + }); + }); + } + + public changePort(newPort: string): Promise { + return new Promise((resolve, reject) => { + if (newPort === this._currentPort) { + resolve(); + return; + } + this._currentPort = newPort; + if (!this._currentSerialPort || !this.isActive) { + resolve(); + return; + } + this._currentSerialPort.close((error: any) => { + if (error) { + reject(error); + } else { + this._currentSerialPort = null; + resolve(); + } + }); + }); + } + + public stop(): Promise { + return new Promise((resolve, reject) => { + if (!this._currentSerialPort || !this.isActive) { + resolve(false); + return; + } + this._currentSerialPort.close((error: any) => { + if (this._outputChannel) { + logToOutputChannel( + this._outputChannel, + CONSTANTS.INFO.CLOSED_SERIAL_PORT(this._currentPort) + ); + } + this._currentSerialPort = null; + if (error) { + reject(error); + } else { + resolve(true); + } + }); + }); + } + + public changeBaudRate(newBaudRate: number): Promise { + return new Promise((resolve, reject) => { + this._currentBaudRate = newBaudRate; + if (!this._currentSerialPort || !this.isActive) { + resolve(); + return; + } + this._currentSerialPort.update( + { baudRate: this._currentBaudRate }, + (error: any) => { + if (error) { + reject(error); + } else { + resolve(); + } + } + ); + }); + } } diff --git a/src/service/PopupService.ts b/src/service/PopupService.ts index 9bff8ba5b..84d312467 100644 --- a/src/service/PopupService.ts +++ b/src/service/PopupService.ts @@ -1,16 +1,16 @@ -// import { Webview } from "vscode"; -import * as vscode from "vscode"; -import { LATEST_RELEASE_NOTE } from "../latest_release_note"; - -export class PopupService { - public static openReleaseNote() { - const panel = vscode.window.createWebviewPanel( - "releaseNote", - "Release Note", - vscode.ViewColumn.One, - {} - ); - - panel.webview.html = LATEST_RELEASE_NOTE; - } -} +// import { Webview } from "vscode"; +import * as vscode from "vscode"; +import { LATEST_RELEASE_NOTE } from "../latest_release_note"; + +export class PopupService { + public static openReleaseNote() { + const panel = vscode.window.createWebviewPanel( + "releaseNote", + "Release Note", + vscode.ViewColumn.One, + {} + ); + + panel.webview.html = LATEST_RELEASE_NOTE; + } +} diff --git a/src/service/debuggerCommunicationService.ts b/src/service/debuggerCommunicationService.ts index 9a8c1d6f0..1e47024f1 100644 --- a/src/service/debuggerCommunicationService.ts +++ b/src/service/debuggerCommunicationService.ts @@ -1,27 +1,27 @@ -import { DebuggerCommunicationServer } from "../debuggerCommunicationServer"; - -export class DebuggerCommunicationService { - private currentDebuggerServer?: DebuggerCommunicationServer; - private previousDebuggerServerToDisconnect?: DebuggerCommunicationServer; - - public setCurrentDebuggerServer(debugServer: DebuggerCommunicationServer) { - this.currentDebuggerServer = debugServer; - } - // Used for restart and stop event - public resetCurrentDebuggerServer() { - if (this.currentDebuggerServer) { - this.currentDebuggerServer.closeConnection(); - } - this.previousDebuggerServerToDisconnect = this.currentDebuggerServer; - this.currentDebuggerServer = undefined; - } - public getCurrentDebuggerServer() { - return this.currentDebuggerServer; - } - // Only used for stop event - public handleStopEvent() { - if (this.previousDebuggerServerToDisconnect) { - this.previousDebuggerServerToDisconnect.disconnectFromPort(); - } - } -} +import { DebuggerCommunicationServer } from "../debuggerCommunicationServer"; + +export class DebuggerCommunicationService { + private currentDebuggerServer?: DebuggerCommunicationServer; + private previousDebuggerServerToDisconnect?: DebuggerCommunicationServer; + + public setCurrentDebuggerServer(debugServer: DebuggerCommunicationServer) { + this.currentDebuggerServer = debugServer; + } + // Used for restart and stop event + public resetCurrentDebuggerServer() { + if (this.currentDebuggerServer) { + this.currentDebuggerServer.closeConnection(); + } + this.previousDebuggerServerToDisconnect = this.currentDebuggerServer; + this.currentDebuggerServer = undefined; + } + public getCurrentDebuggerServer() { + return this.currentDebuggerServer; + } + // Only used for stop event + public handleStopEvent() { + if (this.previousDebuggerServerToDisconnect) { + this.previousDebuggerServerToDisconnect.disconnectFromPort(); + } + } +} diff --git a/src/service/deviceSelectionService.ts b/src/service/deviceSelectionService.ts index fd37ab6ed..15f8bc2f2 100644 --- a/src/service/deviceSelectionService.ts +++ b/src/service/deviceSelectionService.ts @@ -1,12 +1,12 @@ -import { DEFAULT_DEVICE } from "../constants"; - -export class DeviceSelectionService { - private currentActiveDevice: string = DEFAULT_DEVICE; - - public getCurrentActiveDevice(): string { - return this.currentActiveDevice; - } - public setCurrentActiveDevice(newActiveDevice: string) { - this.currentActiveDevice = newActiveDevice; - } -} +import { DEFAULT_DEVICE } from "../constants"; + +export class DeviceSelectionService { + private currentActiveDevice: string = DEFAULT_DEVICE; + + public getCurrentActiveDevice(): string { + return this.currentActiveDevice; + } + public setCurrentActiveDevice(newActiveDevice: string) { + this.currentActiveDevice = newActiveDevice; + } +} diff --git a/src/service/fileSelectionService.ts b/src/service/fileSelectionService.ts index 11f901ed9..5ee5e8ef9 100644 --- a/src/service/fileSelectionService.ts +++ b/src/service/fileSelectionService.ts @@ -1,95 +1,95 @@ -import * as vscode from "vscode"; -import { LANGUAGE_VARS } from "../constants"; -import { VSCODE_MESSAGES_TO_WEBVIEW } from "../view/constants"; -import { DeviceSelectionService } from "./deviceSelectionService"; -import { MessagingService } from "./messagingService"; - -export class FileSelectionService { - private currentFileAbsPath: string = ""; - private currentTextDocument: vscode.TextDocument; - private messagingService: MessagingService; - - constructor(messagingService: MessagingService) { - this.messagingService = messagingService; - } - - public getCurrentFileAbsPath() { - return this.currentFileAbsPath; - } - public getCurrentTextDocument() { - return this.currentTextDocument; - } - public updateCurrentFileFromTextFile = async ( - activeTextDocument: vscode.TextDocument | undefined - ) => { - if (activeTextDocument) { - await this.updateCurrentFileFromEditor({ - document: activeTextDocument, - } as vscode.TextEditor); - } else { - return; - } - }; - public updateCurrentFileFromEditor = async ( - activeTextDocument: vscode.TextEditor | undefined - ) => { - if ( - activeTextDocument && - activeTextDocument.document && - activeTextDocument.document.languageId === "python" - ) { - this.setPathAndSendMessage(activeTextDocument.document.fileName); - this.currentTextDocument = activeTextDocument.document; - } else if (this.currentFileAbsPath === "") { - this.setPathAndSendMessage(this.getActivePythonFile() || ""); - } - if ( - this.currentTextDocument && - this.getActiveEditorFromPath(this.currentTextDocument.fileName) === - undefined - ) { - await vscode.window.showTextDocument( - this.currentTextDocument, - vscode.ViewColumn.One - ); - } - }; - public findCurrentTextDocument() { - if (this.currentFileAbsPath) { - const foundDocument = this.getActiveEditorFromPath( - this.currentFileAbsPath - ); - if (foundDocument !== undefined) { - this.currentTextDocument = foundDocument; - } - } - } - - public setPathAndSendMessage = (newFilePath: string) => { - this.currentFileAbsPath = newFilePath; - this.messagingService.sendMessageToWebview( - VSCODE_MESSAGES_TO_WEBVIEW.CURRENT_FILE, - { - running_file: newFilePath, - } - ); - }; - private getActiveEditorFromPath = ( - filePath: string - ): vscode.TextDocument => { - const activeEditor = vscode.window.visibleTextEditors.find( - (editor: vscode.TextEditor) => editor.document.fileName === filePath - ); - return activeEditor ? activeEditor.document : undefined; - }; - private getActivePythonFile = () => { - const editors: vscode.TextEditor[] = vscode.window.visibleTextEditors; - const activeEditor = editors.find( - editor => editor.document.languageId === LANGUAGE_VARS.PYTHON.ID - ); - if (activeEditor) { - this.currentTextDocument = activeEditor.document; - } - return activeEditor ? activeEditor.document.fileName : ""; - }; -} +import * as vscode from "vscode"; +import { LANGUAGE_VARS } from "../constants"; +import { VSCODE_MESSAGES_TO_WEBVIEW } from "../view/constants"; +import { DeviceSelectionService } from "./deviceSelectionService"; +import { MessagingService } from "./messagingService"; + +export class FileSelectionService { + private currentFileAbsPath: string = ""; + private currentTextDocument: vscode.TextDocument; + private messagingService: MessagingService; + + constructor(messagingService: MessagingService) { + this.messagingService = messagingService; + } + + public getCurrentFileAbsPath() { + return this.currentFileAbsPath; + } + public getCurrentTextDocument() { + return this.currentTextDocument; + } + public updateCurrentFileFromTextFile = async ( + activeTextDocument: vscode.TextDocument | undefined + ) => { + if (activeTextDocument) { + await this.updateCurrentFileFromEditor({ + document: activeTextDocument, + } as vscode.TextEditor); + } else { + return; + } + }; + public updateCurrentFileFromEditor = async ( + activeTextDocument: vscode.TextEditor | undefined + ) => { + if ( + activeTextDocument && + activeTextDocument.document && + activeTextDocument.document.languageId === "python" + ) { + this.setPathAndSendMessage(activeTextDocument.document.fileName); + this.currentTextDocument = activeTextDocument.document; + } else if (this.currentFileAbsPath === "") { + this.setPathAndSendMessage(this.getActivePythonFile() || ""); + } + if ( + this.currentTextDocument && + this.getActiveEditorFromPath(this.currentTextDocument.fileName) === + undefined + ) { + await vscode.window.showTextDocument( + this.currentTextDocument, + vscode.ViewColumn.One + ); + } + }; + public findCurrentTextDocument() { + if (this.currentFileAbsPath) { + const foundDocument = this.getActiveEditorFromPath( + this.currentFileAbsPath + ); + if (foundDocument !== undefined) { + this.currentTextDocument = foundDocument; + } + } + } + + public setPathAndSendMessage = (newFilePath: string) => { + this.currentFileAbsPath = newFilePath; + this.messagingService.sendMessageToWebview( + VSCODE_MESSAGES_TO_WEBVIEW.CURRENT_FILE, + { + running_file: newFilePath, + } + ); + }; + private getActiveEditorFromPath = ( + filePath: string + ): vscode.TextDocument => { + const activeEditor = vscode.window.visibleTextEditors.find( + (editor: vscode.TextEditor) => editor.document.fileName === filePath + ); + return activeEditor ? activeEditor.document : undefined; + }; + private getActivePythonFile = () => { + const editors: vscode.TextEditor[] = vscode.window.visibleTextEditors; + const activeEditor = editors.find( + (editor) => editor.document.languageId === LANGUAGE_VARS.PYTHON.ID + ); + if (activeEditor) { + this.currentTextDocument = activeEditor.document; + } + return activeEditor ? activeEditor.document.fileName : ""; + }; +} diff --git a/src/service/messagingService.ts b/src/service/messagingService.ts index c702ee268..a10caf3e8 100644 --- a/src/service/messagingService.ts +++ b/src/service/messagingService.ts @@ -4,34 +4,35 @@ import * as fs from "fs"; import { VSCODE_MESSAGES_TO_WEBVIEW } from "../view/constants"; import { DeviceSelectionService } from "./deviceSelectionService"; export class MessagingService { - private currentWebviewTarget: Webview | undefined; - private deviceSelectionService: DeviceSelectionService; + private currentWebviewTarget: Webview | undefined; + private deviceSelectionService: DeviceSelectionService; - constructor(deviceSelectionService: DeviceSelectionService) { - this.deviceSelectionService = deviceSelectionService; - } - public setWebview(webview: Webview) { - this.currentWebviewTarget = webview; - } + constructor(deviceSelectionService: DeviceSelectionService) { + this.deviceSelectionService = deviceSelectionService; + } + public setWebview(webview: Webview) { + this.currentWebviewTarget = webview; + } - // Send a message to webview if it exists - public sendMessageToWebview(command: string, stateToSend: Object) { - if (this.currentWebviewTarget) { - this.currentWebviewTarget.postMessage({ - command, - active_device: this.deviceSelectionService.getCurrentActiveDevice(), - state: { ...stateToSend }, - }); - } - } - public sendStartMessage() { - this.currentWebviewTarget.postMessage({ - command: VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE, - }); - } - public sendPauseMessage() { - this.currentWebviewTarget.postMessage({ - command: VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE, - }); - } + // Send a message to webview if it exists + public sendMessageToWebview(command: string, stateToSend: Object) { + if (this.currentWebviewTarget) { + this.currentWebviewTarget.postMessage({ + command, + active_device: + this.deviceSelectionService.getCurrentActiveDevice(), + state: { ...stateToSend }, + }); + } + } + public sendStartMessage() { + this.currentWebviewTarget.postMessage({ + command: VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE, + }); + } + public sendPauseMessage() { + this.currentWebviewTarget.postMessage({ + command: VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE, + }); + } } diff --git a/src/service/setupService.ts b/src/service/setupService.ts index 04c757a72..2b0a26760 100644 --- a/src/service/setupService.ts +++ b/src/service/setupService.ts @@ -1,576 +1,578 @@ -import * as fs from "fs"; -import * as os from "os"; -import * as path from "path"; -import * as vscode from "vscode"; -import { - CONFIG, - CONSTANTS, - DialogResponses, - GLOBAL_ENV_VARS, - HELPER_FILES, - TelemetryEventName, - VERSIONS, -} from "../constants"; -import { - checkConfig, - createEscapedPath, - exec, - getConfig, - getPathToScript, - showPrivacyModal, -} from "../extension_utils/utils"; -import TelemetryAI from "../telemetry/telemetryAI"; - -export class SetupService { - private telemetryAI: TelemetryAI; - - constructor(telemetryAI: TelemetryAI) { - this.telemetryAI = telemetryAI; - } - - public setupEnv = async ( - context: vscode.ExtensionContext, - needsResponse: boolean = false - ) => { - const originalPythonExecutablePath = await this.getCurrentPythonExecutablePath(); - if (originalPythonExecutablePath === "") { - return; - } - let pythonExecutablePath = originalPythonExecutablePath; - const pythonExecutableName: string = - os.platform() === "win32" - ? HELPER_FILES.PYTHON_EXE - : HELPER_FILES.PYTHON; - - if ( - !(await this.areDependenciesInstalled( - context, - pythonExecutablePath - )) - ) { - // environment needs to install dependencies - if (!(await this.checkIfVenv(context, pythonExecutablePath))) { - const pythonExecutablePathVenv = await this.getPythonVenv( - context, - pythonExecutableName - ); - if (await this.hasVenv(context)) { - // venv in extention exists with wrong dependencies - - if ( - !(await this.areDependenciesInstalled( - context, - pythonExecutablePathVenv - )) - ) { - pythonExecutablePath = await this.installDependenciesWrapper( - context, - pythonExecutablePathVenv, - pythonExecutablePath - ); - } else { - pythonExecutablePath = pythonExecutablePathVenv; - } - } else { - pythonExecutablePath = await this.promptInstallVenv( - context, - originalPythonExecutablePath, - pythonExecutableName - ); - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INSTALL_VENV - ); - } - - if (pythonExecutablePath === pythonExecutablePathVenv) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.UPDATED_TO_EXTENSION_VENV - ); - vscode.workspace - .getConfiguration() - .update(CONFIG.PYTHON_PATH, pythonExecutablePath); - } - } else { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_HAS_VENV - ); - } - if (pythonExecutablePath === originalPythonExecutablePath) { - // going with original interpreter, either because - // already in venv or error in creating custom venv - if (checkConfig(CONFIG.SHOW_DEPENDENCY_INSTALL)) { - await vscode.window - .showInformationMessage( - CONSTANTS.INFO.INSTALL_PYTHON_DEPS, - DialogResponses.INSTALL_NOW, - DialogResponses.DONT_INSTALL - ) - .then( - async ( - installChoice: vscode.MessageItem | undefined - ) => { - if ( - installChoice === - DialogResponses.INSTALL_NOW - ) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL - ); - await this.installDependenciesWrapper( - context, - pythonExecutablePath - ); - } else { - await vscode.window - .showInformationMessage( - CONSTANTS.INFO.ARE_YOU_SURE, - DialogResponses.INSTALL_NOW, - DialogResponses.DONT_INSTALL - ) - .then( - async ( - installChoice2: - | vscode.MessageItem - | undefined - ) => { - if ( - installChoice2 === - DialogResponses.INSTALL_NOW - ) { - await this.installDependenciesWrapper( - context, - pythonExecutablePath - ); - } else { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_NO_DEPS_INSTALLED - ); - } - } - ); - } - } - ); - } - } - } else if (needsResponse) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.ALREADY_SUCCESSFUL_INSTALL - ); - } - - return pythonExecutablePath; - }; - - public getCurrentPythonExecutablePath = async ( - isTryingPython3: boolean = false - ) => { - let originalPythonExecutablePath = ""; - const systemPythonVar = isTryingPython3 - ? GLOBAL_ENV_VARS.PYTHON3 - : GLOBAL_ENV_VARS.PYTHON; - // try to get name from interpreter - try { - originalPythonExecutablePath = getConfig(CONFIG.PYTHON_PATH); - } catch (err) { - originalPythonExecutablePath = systemPythonVar; - } - - if ( - originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON3 || - originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON || - originalPythonExecutablePath === "" - ) { - // catching any instance where the python path needs to be resolved - // from an system variable - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_AUTO_RESOLVE_PYTHON_PATH - ); - try { - const { stdout } = await this.executePythonCommand( - systemPythonVar, - `-c "import sys; print(sys.executable)"` - ); - originalPythonExecutablePath = stdout.trim(); - } catch (err) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_NO_PYTHON_PATH - ); - if (isTryingPython3) { - // if trying python3 failed, that means that BOTH - // python and python3 failed as system variables - // so that means that there is no python - vscode.window - .showErrorMessage( - CONSTANTS.ERROR.NO_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.INSTALL_PYTHON) { - const okAction = () => { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON - ); - open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON - ); - } - }); - // no python installed, cannot get path - return ""; - } else { - // "python" didn't resolve to anything, trying "python3" - return this.getCurrentPythonExecutablePath(true); - } - } - if ( - !(await this.validatePythonVersion( - originalPythonExecutablePath - )) - ) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_VER - ); - if (isTryingPython3) { - // if we're trying python3, it means we already tried python and it - // all doesn't seem to work, but it got this far, so it means that - // their system python3 version is still not above 3.7, but they - // don't have a path selected. - vscode.window - .showInformationMessage( - CONSTANTS.ERROR.INVALID_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON - ) - .then( - (installChoice: vscode.MessageItem | undefined) => { - if ( - installChoice === - DialogResponses.INSTALL_PYTHON - ) { - const okAction = () => { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON - ); - open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO - .THIRD_PARTY_WEBSITE_PYTHON - ); - } - } - ); - return ""; - } else { - // otherwise, we ran the "python" system variable - // and we can try python3 - return this.getCurrentPythonExecutablePath(true); - } - } - } else { - // should only be applicable if the user defined their own path - - // fix path to be absolute - if (!path.isAbsolute(originalPythonExecutablePath)) { - originalPythonExecutablePath = path.join( - vscode.workspace.rootPath, - originalPythonExecutablePath - ); - } - - if (!fs.existsSync(originalPythonExecutablePath)) { - await vscode.window.showErrorMessage( - CONSTANTS.ERROR.BAD_PYTHON_PATH - ); - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_INTERPRETER_PATH - ); - return ""; - } - - if ( - !(await this.validatePythonVersion( - originalPythonExecutablePath - )) - ) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_VER - ); - vscode.window - .showInformationMessage( - CONSTANTS.ERROR.INVALID_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON - ) - .then((installChoice: vscode.MessageItem | undefined) => { - if (installChoice === DialogResponses.INSTALL_PYTHON) { - const okAction = () => { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON - ); - open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON - ); - } - }); - return ""; - } - } - - return originalPythonExecutablePath; - }; - - public isPipInstalled = async (pythonExecutablePath: string) => { - try { - await this.executePythonCommand(pythonExecutablePath, " -m pip"); - return true; - } catch (err) { - vscode.window - .showErrorMessage( - `We found that you may not have Pip installed on your interpreter at ${pythonExecutablePath}, please install it and try again.`, - DialogResponses.INSTALL_PIP - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.INSTALL_PIP) { - const okAction = () => { - open(CONSTANTS.LINKS.DOWNLOAD_PIP); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PIP - ); - } - }); - return false; - } - }; - - public checkIfVenv = async ( - context: vscode.ExtensionContext, - pythonExecutablePath: string - ) => { - const venvCheckerPath: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.CHECK_IF_VENV_PY - ); - const { stdout } = await this.executePythonCommand( - pythonExecutablePath, - `"${venvCheckerPath}"` - ); - return stdout.trim() === "1"; - }; - - public executePythonCommand = async ( - pythonExecutablePath: string, - command: string - ) => { - return exec(`${createEscapedPath(pythonExecutablePath)} ${command}`); - }; - - public validatePythonVersion = async (pythonExecutablePath: string) => { - const { stdout } = await this.executePythonCommand( - pythonExecutablePath, - "--version" - ); - if (stdout < VERSIONS.MIN_PY_VERSION) { - return false; - } else { - return true; - } - }; - - public hasVenv = async (context: vscode.ExtensionContext) => { - const pathToEnv: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR - ); - - return fs.existsSync(pathToEnv); - }; - - public promptInstallVenv = ( - context: vscode.ExtensionContext, - pythonExecutable: string, - pythonExecutableName: string - ) => { - return vscode.window - .showInformationMessage( - CONSTANTS.INFO.INSTALL_PYTHON_VENV, - DialogResponses.YES, - DialogResponses.NO - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.YES) { - return this.installPythonVenv( - context, - pythonExecutable, - pythonExecutableName - ); - } else { - // return pythonExecutable, notifying the caller - // that the user was unwilling to create venv - // and by default, this will trigger the extension to - // try using pythonExecutable - return pythonExecutable; - } - }); - }; - - public getPythonVenv = async ( - context: vscode.ExtensionContext, - pythonExecutableName: string - ) => { - const subFolder = os.platform() === "win32" ? "Scripts" : "bin"; - - return getPathToScript( - context, - path.join(CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR, subFolder), - pythonExecutableName - ); - }; - - public installPythonVenv = async ( - context: vscode.ExtensionContext, - pythonExecutable: string, - pythonExecutableName: string - ) => { - const pathToEnv: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR - ); - - vscode.window.showInformationMessage( - CONSTANTS.INFO.INSTALLING_PYTHON_VENV - ); - - const pythonPath: string = await this.getPythonVenv( - context, - pythonExecutableName - ); - - try { - // make venv - // run command to download dependencies to out/python_libs - await this.executePythonCommand( - pythonExecutable, - `-m venv "${pathToEnv}"` - ); - } catch (err) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_VENV_CREATION_ERR - ); - vscode.window - .showErrorMessage( - `Virtual environment for download could not be completed. Using original interpreter at: ${pythonExecutable}. If you're on Linux, try running "sudo apt-get install python3-venv".`, - DialogResponses.READ_INSTALL_MD - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.READ_INSTALL_MD) { - open(CONSTANTS.LINKS.INSTALL); - } - }); - - console.error(err); - - return pythonExecutable; - } - - return this.installDependenciesWrapper( - context, - pythonPath, - pythonExecutable - ); - }; - - public areDependenciesInstalled = async ( - context: vscode.ExtensionContext, - pythonPath: string - ) => { - const dependencyCheckerPath: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.CHECK_PYTHON_DEPENDENCIES - ); - try { - // python script will throw exception - // if not all dependencies are downloaded - const { stdout } = await this.executePythonCommand( - pythonPath, - `"${dependencyCheckerPath}"` - ); - - // output for debugging purposes - console.info(stdout); - return true; - } catch (err) { - return false; - } - }; - - public installDependencies = async ( - context: vscode.ExtensionContext, - pythonPath: string - ) => { - const requirementsPyInstallPath: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - "install_dependencies.py" - ); - - if (!this.isPipInstalled(pythonPath)) { - this.telemetryAI.trackFeatureUsage(TelemetryEventName.SETUP_NO_PIP); - return false; - } - - try { - const { stdout } = await this.executePythonCommand( - pythonPath, - `"${requirementsPyInstallPath}"` - ); - console.log(`DSE ${stdout}`); - vscode.window.showInformationMessage( - CONSTANTS.INFO.SUCCESSFUL_INSTALL - ); - return true; - } catch (err) { - console.log(`DSE ${err}`); - return false; - } - }; - - public installDependenciesWrapper = async ( - context: vscode.ExtensionContext, - pythonPath: string, - backupPythonPath: string = "" - ) => { - let errMessage = CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR; - if (backupPythonPath !== "") { - errMessage = `${errMessage} Using original interpreter at: ${backupPythonPath}.`; - } - if (!(await this.installDependencies(context, pythonPath))) { - vscode.window - .showErrorMessage( - CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR, - DialogResponses.READ_INSTALL_MD - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.READ_INSTALL_MD) { - open(CONSTANTS.LINKS.INSTALL); - } - }); - - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DEP_INSTALL_FAIL - ); - return backupPythonPath; - } - return pythonPath; - }; -} +import * as fs from "fs"; +import * as os from "os"; +import * as path from "path"; +import * as vscode from "vscode"; +import { + CONFIG, + CONSTANTS, + DialogResponses, + GLOBAL_ENV_VARS, + HELPER_FILES, + TelemetryEventName, + VERSIONS, +} from "../constants"; +import { + checkConfig, + createEscapedPath, + exec, + getConfig, + getPathToScript, + showPrivacyModal, +} from "../extension_utils/utils"; +import TelemetryAI from "../telemetry/telemetryAI"; + +export class SetupService { + private telemetryAI: TelemetryAI; + + constructor(telemetryAI: TelemetryAI) { + this.telemetryAI = telemetryAI; + } + + public setupEnv = async ( + context: vscode.ExtensionContext, + needsResponse: boolean = false + ) => { + const originalPythonExecutablePath = + await this.getCurrentPythonExecutablePath(); + if (originalPythonExecutablePath === "") { + return; + } + let pythonExecutablePath = originalPythonExecutablePath; + const pythonExecutableName: string = + os.platform() === "win32" + ? HELPER_FILES.PYTHON_EXE + : HELPER_FILES.PYTHON; + + if ( + !(await this.areDependenciesInstalled( + context, + pythonExecutablePath + )) + ) { + // environment needs to install dependencies + if (!(await this.checkIfVenv(context, pythonExecutablePath))) { + const pythonExecutablePathVenv = await this.getPythonVenv( + context, + pythonExecutableName + ); + if (await this.hasVenv(context)) { + // venv in extention exists with wrong dependencies + + if ( + !(await this.areDependenciesInstalled( + context, + pythonExecutablePathVenv + )) + ) { + pythonExecutablePath = + await this.installDependenciesWrapper( + context, + pythonExecutablePathVenv, + pythonExecutablePath + ); + } else { + pythonExecutablePath = pythonExecutablePathVenv; + } + } else { + pythonExecutablePath = await this.promptInstallVenv( + context, + originalPythonExecutablePath, + pythonExecutableName + ); + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INSTALL_VENV + ); + } + + if (pythonExecutablePath === pythonExecutablePathVenv) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.UPDATED_TO_EXTENSION_VENV + ); + vscode.workspace + .getConfiguration() + .update(CONFIG.PYTHON_PATH, pythonExecutablePath); + } + } else { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_HAS_VENV + ); + } + if (pythonExecutablePath === originalPythonExecutablePath) { + // going with original interpreter, either because + // already in venv or error in creating custom venv + if (checkConfig(CONFIG.SHOW_DEPENDENCY_INSTALL)) { + await vscode.window + .showInformationMessage( + CONSTANTS.INFO.INSTALL_PYTHON_DEPS, + DialogResponses.INSTALL_NOW, + DialogResponses.DONT_INSTALL + ) + .then( + async ( + installChoice: vscode.MessageItem | undefined + ) => { + if ( + installChoice === + DialogResponses.INSTALL_NOW + ) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL + ); + await this.installDependenciesWrapper( + context, + pythonExecutablePath + ); + } else { + await vscode.window + .showInformationMessage( + CONSTANTS.INFO.ARE_YOU_SURE, + DialogResponses.INSTALL_NOW, + DialogResponses.DONT_INSTALL + ) + .then( + async ( + installChoice2: + | vscode.MessageItem + | undefined + ) => { + if ( + installChoice2 === + DialogResponses.INSTALL_NOW + ) { + await this.installDependenciesWrapper( + context, + pythonExecutablePath + ); + } else { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_NO_DEPS_INSTALLED + ); + } + } + ); + } + } + ); + } + } + } else if (needsResponse) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.ALREADY_SUCCESSFUL_INSTALL + ); + } + + return pythonExecutablePath; + }; + + public getCurrentPythonExecutablePath = async ( + isTryingPython3: boolean = false + ) => { + let originalPythonExecutablePath = ""; + const systemPythonVar = isTryingPython3 + ? GLOBAL_ENV_VARS.PYTHON3 + : GLOBAL_ENV_VARS.PYTHON; + // try to get name from interpreter + try { + originalPythonExecutablePath = getConfig(CONFIG.PYTHON_PATH); + } catch (err) { + originalPythonExecutablePath = systemPythonVar; + } + + if ( + originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON3 || + originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON || + originalPythonExecutablePath === "" + ) { + // catching any instance where the python path needs to be resolved + // from an system variable + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_AUTO_RESOLVE_PYTHON_PATH + ); + try { + const { stdout } = await this.executePythonCommand( + systemPythonVar, + `-c "import sys; print(sys.executable)"` + ); + originalPythonExecutablePath = stdout.trim(); + } catch (err) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_NO_PYTHON_PATH + ); + if (isTryingPython3) { + // if trying python3 failed, that means that BOTH + // python and python3 failed as system variables + // so that means that there is no python + vscode.window + .showErrorMessage( + CONSTANTS.ERROR.NO_PYTHON_PATH, + DialogResponses.INSTALL_PYTHON + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.INSTALL_PYTHON) { + const okAction = () => { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DOWNLOAD_PYTHON + ); + open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON + ); + } + }); + // no python installed, cannot get path + return ""; + } else { + // "python" didn't resolve to anything, trying "python3" + return this.getCurrentPythonExecutablePath(true); + } + } + if ( + !(await this.validatePythonVersion( + originalPythonExecutablePath + )) + ) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INVALID_PYTHON_VER + ); + if (isTryingPython3) { + // if we're trying python3, it means we already tried python and it + // all doesn't seem to work, but it got this far, so it means that + // their system python3 version is still not above 3.7, but they + // don't have a path selected. + vscode.window + .showInformationMessage( + CONSTANTS.ERROR.INVALID_PYTHON_PATH, + DialogResponses.INSTALL_PYTHON + ) + .then( + (installChoice: vscode.MessageItem | undefined) => { + if ( + installChoice === + DialogResponses.INSTALL_PYTHON + ) { + const okAction = () => { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DOWNLOAD_PYTHON + ); + open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO + .THIRD_PARTY_WEBSITE_PYTHON + ); + } + } + ); + return ""; + } else { + // otherwise, we ran the "python" system variable + // and we can try python3 + return this.getCurrentPythonExecutablePath(true); + } + } + } else { + // should only be applicable if the user defined their own path + + // fix path to be absolute + if (!path.isAbsolute(originalPythonExecutablePath)) { + originalPythonExecutablePath = path.join( + vscode.workspace.rootPath, + originalPythonExecutablePath + ); + } + + if (!fs.existsSync(originalPythonExecutablePath)) { + await vscode.window.showErrorMessage( + CONSTANTS.ERROR.BAD_PYTHON_PATH + ); + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INVALID_PYTHON_INTERPRETER_PATH + ); + return ""; + } + + if ( + !(await this.validatePythonVersion( + originalPythonExecutablePath + )) + ) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INVALID_PYTHON_VER + ); + vscode.window + .showInformationMessage( + CONSTANTS.ERROR.INVALID_PYTHON_PATH, + DialogResponses.INSTALL_PYTHON + ) + .then((installChoice: vscode.MessageItem | undefined) => { + if (installChoice === DialogResponses.INSTALL_PYTHON) { + const okAction = () => { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DOWNLOAD_PYTHON + ); + open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON + ); + } + }); + return ""; + } + } + + return originalPythonExecutablePath; + }; + + public isPipInstalled = async (pythonExecutablePath: string) => { + try { + await this.executePythonCommand(pythonExecutablePath, " -m pip"); + return true; + } catch (err) { + vscode.window + .showErrorMessage( + `We found that you may not have Pip installed on your interpreter at ${pythonExecutablePath}, please install it and try again.`, + DialogResponses.INSTALL_PIP + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.INSTALL_PIP) { + const okAction = () => { + open(CONSTANTS.LINKS.DOWNLOAD_PIP); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PIP + ); + } + }); + return false; + } + }; + + public checkIfVenv = async ( + context: vscode.ExtensionContext, + pythonExecutablePath: string + ) => { + const venvCheckerPath: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.CHECK_IF_VENV_PY + ); + const { stdout } = await this.executePythonCommand( + pythonExecutablePath, + `"${venvCheckerPath}"` + ); + return stdout.trim() === "1"; + }; + + public executePythonCommand = async ( + pythonExecutablePath: string, + command: string + ) => { + return exec(`${createEscapedPath(pythonExecutablePath)} ${command}`); + }; + + public validatePythonVersion = async (pythonExecutablePath: string) => { + const { stdout } = await this.executePythonCommand( + pythonExecutablePath, + "--version" + ); + if (stdout < VERSIONS.MIN_PY_VERSION) { + return false; + } else { + return true; + } + }; + + public hasVenv = async (context: vscode.ExtensionContext) => { + const pathToEnv: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR + ); + + return fs.existsSync(pathToEnv); + }; + + public promptInstallVenv = ( + context: vscode.ExtensionContext, + pythonExecutable: string, + pythonExecutableName: string + ) => { + return vscode.window + .showInformationMessage( + CONSTANTS.INFO.INSTALL_PYTHON_VENV, + DialogResponses.YES, + DialogResponses.NO + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.YES) { + return this.installPythonVenv( + context, + pythonExecutable, + pythonExecutableName + ); + } else { + // return pythonExecutable, notifying the caller + // that the user was unwilling to create venv + // and by default, this will trigger the extension to + // try using pythonExecutable + return pythonExecutable; + } + }); + }; + + public getPythonVenv = async ( + context: vscode.ExtensionContext, + pythonExecutableName: string + ) => { + const subFolder = os.platform() === "win32" ? "Scripts" : "bin"; + + return getPathToScript( + context, + path.join(CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR, subFolder), + pythonExecutableName + ); + }; + + public installPythonVenv = async ( + context: vscode.ExtensionContext, + pythonExecutable: string, + pythonExecutableName: string + ) => { + const pathToEnv: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR + ); + + vscode.window.showInformationMessage( + CONSTANTS.INFO.INSTALLING_PYTHON_VENV + ); + + const pythonPath: string = await this.getPythonVenv( + context, + pythonExecutableName + ); + + try { + // make venv + // run command to download dependencies to out/python_libs + await this.executePythonCommand( + pythonExecutable, + `-m venv "${pathToEnv}"` + ); + } catch (err) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_VENV_CREATION_ERR + ); + vscode.window + .showErrorMessage( + `Virtual environment for download could not be completed. Using original interpreter at: ${pythonExecutable}. If you're on Linux, try running "sudo apt-get install python3-venv".`, + DialogResponses.READ_INSTALL_MD + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.READ_INSTALL_MD) { + open(CONSTANTS.LINKS.INSTALL); + } + }); + + console.error(err); + + return pythonExecutable; + } + + return this.installDependenciesWrapper( + context, + pythonPath, + pythonExecutable + ); + }; + + public areDependenciesInstalled = async ( + context: vscode.ExtensionContext, + pythonPath: string + ) => { + const dependencyCheckerPath: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.CHECK_PYTHON_DEPENDENCIES + ); + try { + // python script will throw exception + // if not all dependencies are downloaded + const { stdout } = await this.executePythonCommand( + pythonPath, + `"${dependencyCheckerPath}"` + ); + + // output for debugging purposes + console.info(stdout); + return true; + } catch (err) { + return false; + } + }; + + public installDependencies = async ( + context: vscode.ExtensionContext, + pythonPath: string + ) => { + const requirementsPyInstallPath: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + "install_dependencies.py" + ); + + if (!this.isPipInstalled(pythonPath)) { + this.telemetryAI.trackFeatureUsage(TelemetryEventName.SETUP_NO_PIP); + return false; + } + + try { + const { stdout } = await this.executePythonCommand( + pythonPath, + `"${requirementsPyInstallPath}"` + ); + console.log(`DSE ${stdout}`); + vscode.window.showInformationMessage( + CONSTANTS.INFO.SUCCESSFUL_INSTALL + ); + return true; + } catch (err) { + console.log(`DSE ${err}`); + return false; + } + }; + + public installDependenciesWrapper = async ( + context: vscode.ExtensionContext, + pythonPath: string, + backupPythonPath: string = "" + ) => { + let errMessage = CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR; + if (backupPythonPath !== "") { + errMessage = `${errMessage} Using original interpreter at: ${backupPythonPath}.`; + } + if (!(await this.installDependencies(context, pythonPath))) { + vscode.window + .showErrorMessage( + CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR, + DialogResponses.READ_INSTALL_MD + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.READ_INSTALL_MD) { + open(CONSTANTS.LINKS.INSTALL); + } + }); + + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DEP_INSTALL_FAIL + ); + return backupPythonPath; + } + return pythonPath; + }; +} diff --git a/src/service/telemetryHandlerService.ts b/src/service/telemetryHandlerService.ts index f16141f65..e76bea74c 100644 --- a/src/service/telemetryHandlerService.ts +++ b/src/service/telemetryHandlerService.ts @@ -6,551 +6,551 @@ import TelemetryAI from "../telemetry/telemetryAI"; import { DeviceSelectionService } from "./deviceSelectionService"; export class TelemetryHandlerService { - private telemetryAI: TelemetryAI; - private deviceSelectionService: DeviceSelectionService; + private telemetryAI: TelemetryAI; + private deviceSelectionService: DeviceSelectionService; - constructor( - telemetryAI: TelemetryAI, - deviceSelectionService: DeviceSelectionService - ) { - this.telemetryAI = telemetryAI; - this.deviceSelectionService = deviceSelectionService; - } + constructor( + telemetryAI: TelemetryAI, + deviceSelectionService: DeviceSelectionService + ) { + this.telemetryAI = telemetryAI; + this.deviceSelectionService = deviceSelectionService; + } - public handleDebuggerTelemetry = () => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_DEBUGGER_INIT_SUCCESS - ); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_DEBUGGER_INIT_SUCCESS - ); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_DEBUGGER_INIT_SUCCESS - ); - break; - default: - break; - } - }; + public handleDebuggerTelemetry = () => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_DEBUGGER_INIT_SUCCESS + ); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_DEBUGGER_INIT_SUCCESS + ); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_DEBUGGER_INIT_SUCCESS + ); + break; + default: + break; + } + }; - public handleDebuggerFailTelemetry = () => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_DEBUGGER_INIT_FAIL - ); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_DEBUGGER_INIT_FAIL - ); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_DEBUGGER_INIT_FAIL - ); - break; - default: - break; - } - }; + public handleDebuggerFailTelemetry = () => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_DEBUGGER_INIT_FAIL + ); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_DEBUGGER_INIT_FAIL + ); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_DEBUGGER_INIT_FAIL + ); + break; + default: + break; + } + }; - public handleButtonPressTelemetry = (buttonState: any) => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.handleCPXButtonPressTelemetry(buttonState); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.handleMicrobitButtonPressTelemetry(buttonState); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.handleClueButtonPressTelemetry(buttonState); - break; - default: - break; - } - }; + public handleButtonPressTelemetry = (buttonState: any) => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.handleCPXButtonPressTelemetry(buttonState); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.handleMicrobitButtonPressTelemetry(buttonState); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.handleClueButtonPressTelemetry(buttonState); + break; + default: + break; + } + }; - public handleGestureTelemetry = (sensorState: any) => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.handleCPXGestureTelemetry(sensorState); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - break; - default: - break; - } - }; + public handleGestureTelemetry = (sensorState: any) => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.handleCPXGestureTelemetry(sensorState); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + break; + default: + break; + } + }; - public handleSensorTelemetry = (sensor: string) => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.handleCPXSensorTelemetry(sensor); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.handleMicrobitSensorTelemetry(sensor); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.handleClueSensorTelemetry(sensor); - break; - default: - break; - } - }; + public handleSensorTelemetry = (sensor: string) => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.handleCPXSensorTelemetry(sensor); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.handleMicrobitSensorTelemetry(sensor); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.handleClueSensorTelemetry(sensor); + break; + default: + break; + } + }; - public handleCPXButtonPressTelemetry = (buttonState: any) => { - if (buttonState.button_a && buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_BUTTON_AB - ); - } else if (buttonState.button_a) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_BUTTON_A - ); - } else if (buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_BUTTON_B - ); - } else if (buttonState.switch) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_SWITCH - ); - } - }; + public handleCPXButtonPressTelemetry = (buttonState: any) => { + if (buttonState.button_a && buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_BUTTON_AB + ); + } else if (buttonState.button_a) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_BUTTON_A + ); + } else if (buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_BUTTON_B + ); + } else if (buttonState.switch) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_SWITCH + ); + } + }; - public handleCPXGestureTelemetry = (sensorState: any) => { - if (sensorState.shake) { - this.handleCPXSensorTelemetry("shake"); - } else if (sensorState.touch) { - this.handleCPXSensorTelemetry("touch"); - } - }; + public handleCPXGestureTelemetry = (sensorState: any) => { + if (sensorState.shake) { + this.handleCPXSensorTelemetry("shake"); + } else if (sensorState.touch) { + this.handleCPXSensorTelemetry("touch"); + } + }; - public handleCPXSensorTelemetry = (sensor: string) => { - switch (sensor) { - case "temperature": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_TEMPERATURE_SENSOR - ); - break; - case "light": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_LIGHT_SENSOR - ); - break; - case "motion_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR - ); - break; - case "shake": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_SHAKE - ); - break; - case "touch": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_CAPACITIVE_TOUCH - ); - break; - } - }; + public handleCPXSensorTelemetry = (sensor: string) => { + switch (sensor) { + case "temperature": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_TEMPERATURE_SENSOR + ); + break; + case "light": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_LIGHT_SENSOR + ); + break; + case "motion_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR + ); + break; + case "shake": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_SHAKE + ); + break; + case "touch": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_CAPACITIVE_TOUCH + ); + break; + } + }; - public handleMicrobitButtonPressTelemetry = (buttonState: any) => { - if (buttonState.button_a && buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_AB - ); - } else if (buttonState.button_a) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_A - ); - } else if (buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_B - ); - } - }; + public handleMicrobitButtonPressTelemetry = (buttonState: any) => { + if (buttonState.button_a && buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_AB + ); + } else if (buttonState.button_a) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_A + ); + } else if (buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_B + ); + } + }; - public handleMicrobitSensorTelemetry = (sensor: string) => { - switch (sensor) { - case "temperature": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_TEMPERATURE_SENSOR - ); - break; - case "light": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_LIGHT_SENSOR - ); - break; - case "motion_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR - ); - break; - case "gesture": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_GESTURE_SENSOR - ); - break; - } - }; + public handleMicrobitSensorTelemetry = (sensor: string) => { + switch (sensor) { + case "temperature": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_TEMPERATURE_SENSOR + ); + break; + case "light": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_LIGHT_SENSOR + ); + break; + case "motion_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR + ); + break; + case "gesture": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_GESTURE_SENSOR + ); + break; + } + }; - public handleClueButtonPressTelemetry = (buttonState: any) => { - if (buttonState.button_a && buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_BUTTON_AB - ); - } else if (buttonState.button_a) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_BUTTON_A - ); - } else if (buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_BUTTON_B - ); - } - }; + public handleClueButtonPressTelemetry = (buttonState: any) => { + if (buttonState.button_a && buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_BUTTON_AB + ); + } else if (buttonState.button_a) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_BUTTON_A + ); + } else if (buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_BUTTON_B + ); + } + }; - public handleClueSensorTelemetry = (sensor: string) => { - switch (sensor) { - case "temperature": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_TEMPERATURE_SENSOR - ); - break; - case "light_r": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "light_g": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "light_b": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "light_c": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "motion_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR - ); - break; - case "gesture": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GESTURE_SENSOR - ); - break; - case "humidity": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_HUMIDITY_SENSOR - ); - break; - case "pressure": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_PRESSURE_SENSOR - ); - break; - case "proximity": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_PROXIMITY_SENSOR - ); - break; - case "gyro_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR - ); - break; - case "gyro_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR - ); - break; - case "gyro_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR - ); - break; - case "magnet_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR - ); - break; - case "magnet_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR - ); - break; - case "magnet_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR - ); - break; - } - }; + public handleClueSensorTelemetry = (sensor: string) => { + switch (sensor) { + case "temperature": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_TEMPERATURE_SENSOR + ); + break; + case "light_r": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR + ); + break; + case "light_g": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR + ); + break; + case "light_b": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR + ); + break; + case "light_c": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR + ); + break; + case "motion_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR + ); + break; + case "gesture": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GESTURE_SENSOR + ); + break; + case "humidity": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_HUMIDITY_SENSOR + ); + break; + case "pressure": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_PRESSURE_SENSOR + ); + break; + case "proximity": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_PROXIMITY_SENSOR + ); + break; + case "gyro_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR + ); + break; + case "gyro_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR + ); + break; + case "gyro_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR + ); + break; + case "magnet_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR + ); + break; + case "magnet_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR + ); + break; + case "magnet_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR + ); + break; + } + }; - public handleNewFileErrorTelemetry = () => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_ERROR_COMMAND_NEW_FILE - ); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_ERROR_COMMAND_NEW_FILE - ); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_ERROR_COMMAND_NEW_FILE - ); - break; - default: - break; - } - }; + public handleNewFileErrorTelemetry = () => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_ERROR_COMMAND_NEW_FILE + ); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_ERROR_COMMAND_NEW_FILE + ); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_ERROR_COMMAND_NEW_FILE + ); + break; + default: + break; + } + }; - public getTelemetryEventsForStartingDeployToDevice = (device: string) => { - let deployTelemetryEvent: string; - let deployPerformanceTelemetryEvent: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - deployTelemetryEvent = - TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; - deployPerformanceTelemetryEvent = - TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - deployTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; - deployPerformanceTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - deployTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; - deployPerformanceTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; - break; - } - return { - deployTelemetryEvent, - deployPerformanceTelemetryEvent, - }; - }; + public getTelemetryEventsForStartingDeployToDevice = (device: string) => { + let deployTelemetryEvent: string; + let deployPerformanceTelemetryEvent: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + deployTelemetryEvent = + TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; + deployPerformanceTelemetryEvent = + TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + deployTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; + deployPerformanceTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + deployTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; + deployPerformanceTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; + break; + } + return { + deployTelemetryEvent, + deployPerformanceTelemetryEvent, + }; + }; - public handleDeployToDeviceErrorTelemetry = ( - data: string, - device: string - ) => { - let telemetryErrorName: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - telemetryErrorName = - TelemetryEventName.CPX_ERROR_PYTHON_DEVICE_PROCESS; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - telemetryErrorName = - TelemetryEventName.MICROBIT_ERROR_PYTHON_DEVICE_PROCESS; - case CONSTANTS.DEVICE_NAME.CLUE: - telemetryErrorName = - TelemetryEventName.CLUE_ERROR_PYTHON_DEVICE_PROCESS; - } - this.telemetryAI.trackFeatureUsage(telemetryErrorName, { - error: `${data}`, - }); - }; + public handleDeployToDeviceErrorTelemetry = ( + data: string, + device: string + ) => { + let telemetryErrorName: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + telemetryErrorName = + TelemetryEventName.CPX_ERROR_PYTHON_DEVICE_PROCESS; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + telemetryErrorName = + TelemetryEventName.MICROBIT_ERROR_PYTHON_DEVICE_PROCESS; + case CONSTANTS.DEVICE_NAME.CLUE: + telemetryErrorName = + TelemetryEventName.CLUE_ERROR_PYTHON_DEVICE_PROCESS; + } + this.telemetryAI.trackFeatureUsage(telemetryErrorName, { + error: `${data}`, + }); + }; - public handleDeployToDeviceFinishedTelemetry = ( - message: any, - device: string - ) => { - let successCommandDeployDevice: string; - let errorCommandDeployWithoutDevice: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - successCommandDeployDevice = - TelemetryEventName.CPX_SUCCESS_COMMAND_DEPLOY_DEVICE; - errorCommandDeployWithoutDevice = - TelemetryEventName.CPX_ERROR_DEPLOY_WITHOUT_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - successCommandDeployDevice = - TelemetryEventName.MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE; - errorCommandDeployWithoutDevice = - TelemetryEventName.MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - successCommandDeployDevice = - TelemetryEventName.CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE; - errorCommandDeployWithoutDevice = - TelemetryEventName.CLUE_ERROR_DEPLOY_WITHOUT_DEVICE; - break; - } + public handleDeployToDeviceFinishedTelemetry = ( + message: any, + device: string + ) => { + let successCommandDeployDevice: string; + let errorCommandDeployWithoutDevice: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + successCommandDeployDevice = + TelemetryEventName.CPX_SUCCESS_COMMAND_DEPLOY_DEVICE; + errorCommandDeployWithoutDevice = + TelemetryEventName.CPX_ERROR_DEPLOY_WITHOUT_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + successCommandDeployDevice = + TelemetryEventName.MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE; + errorCommandDeployWithoutDevice = + TelemetryEventName.MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + successCommandDeployDevice = + TelemetryEventName.CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE; + errorCommandDeployWithoutDevice = + TelemetryEventName.CLUE_ERROR_DEPLOY_WITHOUT_DEVICE; + break; + } - switch (message.type) { - case "complete": - this.telemetryAI.trackFeatureUsage(successCommandDeployDevice); - break; - case "no-device": - this.telemetryAI.trackFeatureUsage( - errorCommandDeployWithoutDevice - ); - if ( - device === CONSTANTS.DEVICE_NAME.CPX || - device === CONSTANTS.DEVICE_NAME.CLUE - ) { - vscode.window - .showErrorMessage( - CONSTANTS.ERROR.NO_DEVICE, - DialogResponses.HELP - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.HELP) { - const okAction = () => { - let helpLink: string; - let helpTelemetryEvent: string; - if (device === CONSTANTS.DEVICE_NAME.CPX) { - helpLink = CONSTANTS.LINKS.CPX_HELP; - helpTelemetryEvent = - TelemetryEventName.CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; - } else if ( - device === CONSTANTS.DEVICE_NAME.CLUE - ) { - helpLink = CONSTANTS.LINKS.CLUE_HELP; - helpTelemetryEvent = - TelemetryEventName.CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; - } - open(helpLink); - this.telemetryAI.trackFeatureUsage( - helpTelemetryEvent - ); - }; - utils.showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT - ); - } - }); - } else if (device === CONSTANTS.DEVICE_NAME.MICROBIT) { - vscode.window.showErrorMessage(CONSTANTS.ERROR.NO_DEVICE); - } - break; - case "low-python-version": - vscode.window.showErrorMessage( - CONSTANTS.ERROR.LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT - ); - break; - default: - console.log( - `Non-state JSON output from the process : ${message}` - ); - break; - } - }; + switch (message.type) { + case "complete": + this.telemetryAI.trackFeatureUsage(successCommandDeployDevice); + break; + case "no-device": + this.telemetryAI.trackFeatureUsage( + errorCommandDeployWithoutDevice + ); + if ( + device === CONSTANTS.DEVICE_NAME.CPX || + device === CONSTANTS.DEVICE_NAME.CLUE + ) { + vscode.window + .showErrorMessage( + CONSTANTS.ERROR.NO_DEVICE, + DialogResponses.HELP + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.HELP) { + const okAction = () => { + let helpLink: string; + let helpTelemetryEvent: string; + if (device === CONSTANTS.DEVICE_NAME.CPX) { + helpLink = CONSTANTS.LINKS.CPX_HELP; + helpTelemetryEvent = + TelemetryEventName.CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; + } else if ( + device === CONSTANTS.DEVICE_NAME.CLUE + ) { + helpLink = CONSTANTS.LINKS.CLUE_HELP; + helpTelemetryEvent = + TelemetryEventName.CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; + } + open(helpLink); + this.telemetryAI.trackFeatureUsage( + helpTelemetryEvent + ); + }; + utils.showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT + ); + } + }); + } else if (device === CONSTANTS.DEVICE_NAME.MICROBIT) { + vscode.window.showErrorMessage(CONSTANTS.ERROR.NO_DEVICE); + } + break; + case "low-python-version": + vscode.window.showErrorMessage( + CONSTANTS.ERROR.LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT + ); + break; + default: + console.log( + `Non-state JSON output from the process : ${message}` + ); + break; + } + }; - public getTelemetryEventsForOpenSimulator = (device: string) => { - let openSimulatorTelemetryEvent: string; - let openSimulatorPerformanceTelemetryEvent: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - openSimulatorTelemetryEvent = - TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; - openSimulatorPerformanceTelemetryEvent = - TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - openSimulatorTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; - openSimulatorPerformanceTelemetryEvent = - TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - openSimulatorTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; - openSimulatorPerformanceTelemetryEvent = - TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; - break; - } - return { - openSimulatorTelemetryEvent, - openSimulatorPerformanceTelemetryEvent, - }; - }; + public getTelemetryEventsForOpenSimulator = (device: string) => { + let openSimulatorTelemetryEvent: string; + let openSimulatorPerformanceTelemetryEvent: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + openSimulatorTelemetryEvent = + TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; + openSimulatorPerformanceTelemetryEvent = + TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + openSimulatorTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; + openSimulatorPerformanceTelemetryEvent = + TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + openSimulatorTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; + openSimulatorPerformanceTelemetryEvent = + TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; + break; + } + return { + openSimulatorTelemetryEvent, + openSimulatorPerformanceTelemetryEvent, + }; + }; - public getTelemetryEventsForNewFile = (device: string) => { - let newFileTelemetryEvent: string; - let newFilePerformanceTelemetryEvent: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - newFileTelemetryEvent = - TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; - newFilePerformanceTelemetryEvent = - TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - newFileTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; - newFilePerformanceTelemetryEvent = - TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - newFileTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; - newFilePerformanceTelemetryEvent = - TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; - break; - } - return { - newFileTelemetryEvent, - newFilePerformanceTelemetryEvent, - }; - }; + public getTelemetryEventsForNewFile = (device: string) => { + let newFileTelemetryEvent: string; + let newFilePerformanceTelemetryEvent: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + newFileTelemetryEvent = + TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; + newFilePerformanceTelemetryEvent = + TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + newFileTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; + newFilePerformanceTelemetryEvent = + TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + newFileTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; + newFilePerformanceTelemetryEvent = + TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; + break; + } + return { + newFileTelemetryEvent, + newFilePerformanceTelemetryEvent, + }; + }; } diff --git a/src/service/webviewService.ts b/src/service/webviewService.ts index 2b6add591..01584259b 100644 --- a/src/service/webviewService.ts +++ b/src/service/webviewService.ts @@ -6,47 +6,46 @@ import { DeviceSelectionService } from "./deviceSelectionService"; // Manages different type of webview export class WebviewService { - private tutorialPanel: vscode.WebviewPanel | undefined; - private context: vscode.ExtensionContext; - private deviceSelectionService: DeviceSelectionService; + private tutorialPanel: vscode.WebviewPanel | undefined; + private context: vscode.ExtensionContext; + private deviceSelectionService: DeviceSelectionService; - constructor( - context: vscode.ExtensionContext, - deviceSelectionService: DeviceSelectionService - ) { - this.context = context; - this.deviceSelectionService = deviceSelectionService; - } + constructor( + context: vscode.ExtensionContext, + deviceSelectionService: DeviceSelectionService + ) { + this.context = context; + this.deviceSelectionService = deviceSelectionService; + } - public openTutorialPanel() { - if (this.tutorialPanel) { - this.tutorialPanel.reveal(vscode.ViewColumn.Beside); - } else { - this.createTutorialPanel(); - } - } + public openTutorialPanel() { + if (this.tutorialPanel) { + this.tutorialPanel.reveal(vscode.ViewColumn.Beside); + } else { + this.createTutorialPanel(); + } + } - public getWebviewContent( - webviewType: string, - hasDevice: boolean, - panel: vscode.WebviewPanel - ) { - const onDiskPath = vscode.Uri.file( - this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.SIMULATOR) - ); - const scriptSrc = panel.webview.asWebviewUri(onDiskPath); + public getWebviewContent( + webviewType: string, + hasDevice: boolean, + panel: vscode.WebviewPanel + ) { + const onDiskPath = vscode.Uri.file( + this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.SIMULATOR) + ); + const scriptSrc = panel.webview.asWebviewUri(onDiskPath); - const vscodeImportPath = vscode.Uri.file( - this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.VSCODE_API) - ); - const vscodeImportPathSrc = panel.webview.asWebviewUri( - vscodeImportPath - ); + const vscodeImportPath = vscode.Uri.file( + this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.VSCODE_API) + ); + const vscodeImportPathSrc = + panel.webview.asWebviewUri(vscodeImportPath); - const attributeString = this.getAttributeString(webviewType, hasDevice); - const nonce = getNonce(); + const attributeString = this.getAttributeString(webviewType, hasDevice); + const nonce = getNonce(); - return ` + return ` @@ -64,49 +63,49 @@ export class WebviewService { < /html>`; - } + } - private createTutorialPanel() { - this.tutorialPanel = vscode.window.createWebviewPanel( - CONSTANTS.WEBVIEW_TYPE.TUTORIAL, - CONSTANTS.LABEL.WEBVIEW_PANEL, - { preserveFocus: true, viewColumn: vscode.ViewColumn.One }, - { - enableScripts: true, - retainContextWhenHidden: true, - } - ); - this.tutorialPanel.webview.html = this.getWebviewContent( - WEBVIEW_TYPES.GETTING_STARTED, - false, - this.tutorialPanel - ); - this.tutorialPanel.onDidDispose(() => { - this.disposeTutorialPanel(); - }); - } + private createTutorialPanel() { + this.tutorialPanel = vscode.window.createWebviewPanel( + CONSTANTS.WEBVIEW_TYPE.TUTORIAL, + CONSTANTS.LABEL.WEBVIEW_PANEL, + { preserveFocus: true, viewColumn: vscode.ViewColumn.One }, + { + enableScripts: true, + retainContextWhenHidden: true, + } + ); + this.tutorialPanel.webview.html = this.getWebviewContent( + WEBVIEW_TYPES.GETTING_STARTED, + false, + this.tutorialPanel + ); + this.tutorialPanel.onDidDispose(() => { + this.disposeTutorialPanel(); + }); + } - private disposeTutorialPanel() { - this.tutorialPanel = undefined; - } - private getAttributeString(webviewType: string, hasDevice: boolean) { - if (hasDevice) { - return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} ${ - WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE - }=${this.deviceSelectionService.getCurrentActiveDevice()} `; - } else { - return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} `; - } - } + private disposeTutorialPanel() { + this.tutorialPanel = undefined; + } + private getAttributeString(webviewType: string, hasDevice: boolean) { + if (hasDevice) { + return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} ${ + WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE + }=${this.deviceSelectionService.getCurrentActiveDevice()} `; + } else { + return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} `; + } + } } // Nonce generator taken from vscode extension samples found here: // https://github.com/microsoft/vscode-extension-samples/blob/master/custom-editor-sample/src/util.ts function getNonce() { - let text = ""; - const possible = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - for (let i = 0; i < 32; i++) { - text += possible.charAt(Math.floor(Math.random() * possible.length)); - } - return text; + let text = ""; + const possible = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + for (let i = 0; i < 32; i++) { + text += possible.charAt(Math.floor(Math.random() * possible.length)); + } + return text; } diff --git a/src/simulatorDebugConfigurationProvider.ts b/src/simulatorDebugConfigurationProvider.ts index 2b6725f22..40d153f6a 100644 --- a/src/simulatorDebugConfigurationProvider.ts +++ b/src/simulatorDebugConfigurationProvider.ts @@ -6,79 +6,80 @@ import { CONSTANTS, DialogResponses } from "./constants"; import { getServerPortConfig } from "./extension_utils/utils"; export class SimulatorDebugConfigurationProvider - implements vscode.DebugConfigurationProvider { - public deviceSimulatorExpressDebug: boolean; + implements vscode.DebugConfigurationProvider +{ + public deviceSimulatorExpressDebug: boolean; - constructor(private pathToScript: string) { - this.deviceSimulatorExpressDebug = false; - } + constructor(private pathToScript: string) { + this.deviceSimulatorExpressDebug = false; + } - /** - * Modify the debug configuration just before a debug session is being launched. - */ - public resolveDebugConfiguration( - folder: vscode.WorkspaceFolder | undefined, - config: vscode.DebugConfiguration, - token?: vscode.CancellationToken - ): vscode.ProviderResult { - const activeTextEditor = vscode.window.activeTextEditor; + /** + * Modify the debug configuration just before a debug session is being launched. + */ + public resolveDebugConfiguration( + folder: vscode.WorkspaceFolder | undefined, + config: vscode.DebugConfiguration, + token?: vscode.CancellationToken + ): vscode.ProviderResult { + const activeTextEditor = vscode.window.activeTextEditor; - // Create a configuration if no launch.json exists or if it's empty - if (!config.type && !config.request && !config.name) { - if ( - activeTextEditor && - activeTextEditor.document.languageId === "python" - ) { - config.type = "deviceSimulatorExpress"; - config.request = "launch"; - config.name = "Device Simulator Express Debugger"; - config.console = "integratedTerminal"; - } - } - // Check config type - if (config.type === CONSTANTS.DEBUG_CONFIGURATION_TYPE) { - this.deviceSimulatorExpressDebug = true; - if (activeTextEditor) { - const currentFilePath = activeTextEditor.document.fileName; + // Create a configuration if no launch.json exists or if it's empty + if (!config.type && !config.request && !config.name) { + if ( + activeTextEditor && + activeTextEditor.document.languageId === "python" + ) { + config.type = "deviceSimulatorExpress"; + config.request = "launch"; + config.name = "Device Simulator Express Debugger"; + config.console = "integratedTerminal"; + } + } + // Check config type + if (config.type === CONSTANTS.DEBUG_CONFIGURATION_TYPE) { + this.deviceSimulatorExpressDebug = true; + if (activeTextEditor) { + const currentFilePath = activeTextEditor.document.fileName; - // Check file type and name - if (!(activeTextEditor.document.languageId === "python")) { - return vscode.window - .showErrorMessage( - CONSTANTS.ERROR.INVALID_FILE_EXTENSION_DEBUG - ) - .then(() => { - return undefined; // Abort launch - }); - } - // Set the new configuration type so the python debugger can take over - config.type = "python"; - // Set process_user_code path as program - config.program = this.pathToScript; - // Set user's code path and server's port as args - config.args = [ - currentFilePath, - getServerPortConfig().toString(), - ]; - // Set rules - config.rules = [ - { path: this.pathToScript, include: false }, - { - module: "adafruit_circuitplayground", - include: false, - }, - { module: "playsound", include: false }, - ]; - } - } - // Abort / show error message if can't find process_user_code.py - if (!config.program) { - return vscode.window - .showErrorMessage(CONSTANTS.ERROR.NO_PROGRAM_FOUND_DEBUG) - .then(() => { - return undefined; // Abort launch - }); - } - return config; - } + // Check file type and name + if (!(activeTextEditor.document.languageId === "python")) { + return vscode.window + .showErrorMessage( + CONSTANTS.ERROR.INVALID_FILE_EXTENSION_DEBUG + ) + .then(() => { + return undefined; // Abort launch + }); + } + // Set the new configuration type so the python debugger can take over + config.type = "python"; + // Set process_user_code path as program + config.program = this.pathToScript; + // Set user's code path and server's port as args + config.args = [ + currentFilePath, + getServerPortConfig().toString(), + ]; + // Set rules + config.rules = [ + { path: this.pathToScript, include: false }, + { + module: "adafruit_circuitplayground", + include: false, + }, + { module: "playsound", include: false }, + ]; + } + } + // Abort / show error message if can't find process_user_code.py + if (!config.program) { + return vscode.window + .showErrorMessage(CONSTANTS.ERROR.NO_PROGRAM_FOUND_DEBUG) + .then(() => { + return undefined; // Abort launch + }); + } + return config; + } } diff --git a/src/telemetry/getPackageInfo.ts b/src/telemetry/getPackageInfo.ts index cd8d42ab7..6e7044903 100644 --- a/src/telemetry/getPackageInfo.ts +++ b/src/telemetry/getPackageInfo.ts @@ -3,55 +3,53 @@ import * as path from "path"; import * as vscode from "vscode"; export interface IPackageJson { - name?: string; - version?: string; - instrumentationKey: string; + name?: string; + version?: string; + instrumentationKey: string; } const getPackagePath = (context: vscode.ExtensionContext) => { - const onDiskPath = vscode.Uri.file( - path.join(context.extensionPath, "package.json") - ); - const packagePath = onDiskPath.with({ scheme: "vscode-resource" }); + const onDiskPath = vscode.Uri.file( + path.join(context.extensionPath, "package.json") + ); + const packagePath = onDiskPath.with({ scheme: "vscode-resource" }); - return packagePath; + return packagePath; }; -export default function getPackageInfo( - context: vscode.ExtensionContext -): { - extensionName: string; - extensionVersion: string; - instrumentationKey: string; +export default function getPackageInfo(context: vscode.ExtensionContext): { + extensionName: string; + extensionVersion: string; + instrumentationKey: string; } { - let packageJson: IPackageJson; - const packagePath = getPackagePath(context); - - try { - packageJson = JSON.parse(fs.readFileSync(packagePath.fsPath, "utf8")); - } catch (error) { - console.error(`Failed to read from package.json: ${error}`); - throw new Error(`Failed to read from package.json: ${error}`); - } - - const extensionName: string | undefined = packageJson.name; - const extensionVersion: string | undefined = packageJson.version; - const instrumentationKey: string | undefined = - packageJson.instrumentationKey; - - if (!extensionName) { - throw new Error( - "Extension's package.json is missing instrumentation key." - ); - } - - if (!extensionVersion) { - throw new Error("Extension's package.json is missing version."); - } - - if (!extensionVersion) { - throw new Error("Extension's package.json is missing version."); - } - - return { extensionName, extensionVersion, instrumentationKey }; + let packageJson: IPackageJson; + const packagePath = getPackagePath(context); + + try { + packageJson = JSON.parse(fs.readFileSync(packagePath.fsPath, "utf8")); + } catch (error) { + console.error(`Failed to read from package.json: ${error}`); + throw new Error(`Failed to read from package.json: ${error}`); + } + + const extensionName: string | undefined = packageJson.name; + const extensionVersion: string | undefined = packageJson.version; + const instrumentationKey: string | undefined = + packageJson.instrumentationKey; + + if (!extensionName) { + throw new Error( + "Extension's package.json is missing instrumentation key." + ); + } + + if (!extensionVersion) { + throw new Error("Extension's package.json is missing version."); + } + + if (!extensionVersion) { + throw new Error("Extension's package.json is missing version."); + } + + return { extensionName, extensionVersion, instrumentationKey }; } diff --git a/src/telemetry/telemetryAI.ts b/src/telemetry/telemetryAI.ts index 4dbf5ca41..c0c5ff5ac 100644 --- a/src/telemetry/telemetryAI.ts +++ b/src/telemetry/telemetryAI.ts @@ -4,80 +4,76 @@ import getPackageInfo from "./getPackageInfo"; // tslint:disable-next-line:export-name export default class TelemetryAI { - private static telemetryReporter: TelemetryReporter; - private static enableTelemetry: boolean | undefined; + private static telemetryReporter: TelemetryReporter; + private static enableTelemetry: boolean | undefined; - constructor(vscodeContext: vscode.ExtensionContext) { - TelemetryAI.telemetryReporter = this.createTelemetryReporter( - vscodeContext - ); - TelemetryAI.enableTelemetry = vscode.workspace - .getConfiguration() - .get("telemetry.enableTelemetry"); - if (TelemetryAI.enableTelemetry === undefined) { - TelemetryAI.enableTelemetry = true; - } - } + constructor(vscodeContext: vscode.ExtensionContext) { + TelemetryAI.telemetryReporter = + this.createTelemetryReporter(vscodeContext); + TelemetryAI.enableTelemetry = vscode.workspace + .getConfiguration() + .get("telemetry.enableTelemetry"); + if (TelemetryAI.enableTelemetry === undefined) { + TelemetryAI.enableTelemetry = true; + } + } - public getExtensionName(context: vscode.ExtensionContext): string { - const { extensionName } = getPackageInfo(context); - return extensionName; - } + public getExtensionName(context: vscode.ExtensionContext): string { + const { extensionName } = getPackageInfo(context); + return extensionName; + } - public getExtensionVersionNumber(context: vscode.ExtensionContext): string { - const { extensionVersion } = getPackageInfo(context); - return extensionVersion; - } + public getExtensionVersionNumber(context: vscode.ExtensionContext): string { + const { extensionVersion } = getPackageInfo(context); + return extensionVersion; + } - public sendTelemetryIfEnabled( - eventName: string, - properties?: { [key: string]: string }, - measurements?: { [key: string]: number } - ) { - if (TelemetryAI.enableTelemetry) { - TelemetryAI.telemetryReporter.sendTelemetryEvent( - eventName, - properties, - measurements - ); - } - } + public sendTelemetryIfEnabled( + eventName: string, + properties?: { [key: string]: string }, + measurements?: { [key: string]: number } + ) { + if (TelemetryAI.enableTelemetry) { + TelemetryAI.telemetryReporter.sendTelemetryEvent( + eventName, + properties, + measurements + ); + } + } - public trackFeatureUsage( - eventName: string, - eventProperties?: { [key: string]: string } - ) { - this.sendTelemetryIfEnabled(eventName, eventProperties); - } + public trackFeatureUsage( + eventName: string, + eventProperties?: { [key: string]: string } + ) { + this.sendTelemetryIfEnabled(eventName, eventProperties); + } - public runWithLatencyMeasure( - functionToRun: () => void, - eventName: string - ): void { - const numberOfNanosecondsInSecond: number = 1000000000; - const startTime: number = Number(process.hrtime.bigint()); - functionToRun(); - const latency: number = Number(process.hrtime.bigint()) - startTime; - const measurement = { - duration: latency / numberOfNanosecondsInSecond, - }; - this.sendTelemetryIfEnabled(eventName, {}, measurement); - } + public runWithLatencyMeasure( + functionToRun: () => void, + eventName: string + ): void { + const numberOfNanosecondsInSecond: number = 1000000000; + const startTime: number = Number(process.hrtime.bigint()); + functionToRun(); + const latency: number = Number(process.hrtime.bigint()) - startTime; + const measurement = { + duration: latency / numberOfNanosecondsInSecond, + }; + this.sendTelemetryIfEnabled(eventName, {}, measurement); + } - private createTelemetryReporter( - context: vscode.ExtensionContext - ): TelemetryReporter { - const { - extensionName, - extensionVersion, - instrumentationKey, - } = getPackageInfo(context); - const reporter: TelemetryReporter = new TelemetryReporter( - extensionName, - extensionVersion, - instrumentationKey - ); - context.subscriptions.push(reporter); - return reporter; - } + private createTelemetryReporter( + context: vscode.ExtensionContext + ): TelemetryReporter { + const { extensionName, extensionVersion, instrumentationKey } = + getPackageInfo(context); + const reporter: TelemetryReporter = new TelemetryReporter( + extensionName, + extensionVersion, + instrumentationKey + ); + context.subscriptions.push(reporter); + return reporter; + } } diff --git a/src/templates/clue_template.py b/src/templates/clue_template.py index 40719f439..489f21666 100644 --- a/src/templates/clue_template.py +++ b/src/templates/clue_template.py @@ -1,16 +1,16 @@ -""" -To get started, check out the "Device Simulator Express: Getting Started" command in the command pallete, which you can access with `CMD + SHIFT + P` For Mac and `CTRL + SHIFT + P` for Windows and Linux. - -To learn more about the CLUE and CircuitPython, check this link out: -https://learn.adafruit.com/adafruit-clue/circuitpython - -Find example code for CPX on: -https://blog.adafruit.com/2020/02/12/three-fun-sensor-packed-projects-to-try-on-your-clue-adafruitlearningsystem-adafruit-circuitpython-adafruit/ -""" - -from adafruit_clue import clue - -clue_data = clue.simple_text_display(title="Hello World", title_scale=3) - -while True: - clue_data.show() +""" +To get started, check out the "Device Simulator Express: Getting Started" command in the command pallete, which you can access with `CMD + SHIFT + P` For Mac and `CTRL + SHIFT + P` for Windows and Linux. + +To learn more about the CLUE and CircuitPython, check this link out: +https://learn.adafruit.com/adafruit-clue/circuitpython + +Find example code for CPX on: +https://blog.adafruit.com/2020/02/12/three-fun-sensor-packed-projects-to-try-on-your-clue-adafruitlearningsystem-adafruit-circuitpython-adafruit/ +""" + +from adafruit_clue import clue + +clue_data = clue.simple_text_display(title="Hello World", title_scale=3) + +while True: + clue_data.show() diff --git a/src/templates/cpx_template.py b/src/templates/cpx_template.py index 830b9a8e1..2efc6ba41 100644 --- a/src/templates/cpx_template.py +++ b/src/templates/cpx_template.py @@ -1,16 +1,16 @@ -""" -To get started, check out the "Device Simulator Express: Getting Started" command in the command pallete, which you can access with `CMD + SHIFT + P` For Mac and `CTRL + SHIFT + P` for Windows and Linux. - -Getting started with CPX and CircuitPython intro on: -https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library - -Find example code for CPX on: -https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples -""" - -# import CPX library -from adafruit_circuitplayground import cp - -while True: - # start your code here - pass +""" +To get started, check out the "Device Simulator Express: Getting Started" command in the command pallete, which you can access with `CMD + SHIFT + P` For Mac and `CTRL + SHIFT + P` for Windows and Linux. + +Getting started with CPX and CircuitPython intro on: +https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library + +Find example code for CPX on: +https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples +""" + +# import CPX library +from adafruit_circuitplayground import cp + +while True: + # start your code here + pass diff --git a/src/templates/microbit_template.py b/src/templates/microbit_template.py index 3c1cfbb8e..35751174d 100644 --- a/src/templates/microbit_template.py +++ b/src/templates/microbit_template.py @@ -1,11 +1,11 @@ -""" -To get started, check out the "Device Simulator Express: Getting Started" command in the command pallete, which you can access with `CMD + SHIFT + P` For Mac and `CTRL + SHIFT + P` for Windows and Linux. - -Get started with micro:bit and MicroPython on: -https://microbit-micropython.readthedocs.io/en/latest/. -""" - -from microbit import * - -while True: - display.scroll("Hello World!") +""" +To get started, check out the "Device Simulator Express: Getting Started" command in the command pallete, which you can access with `CMD + SHIFT + P` For Mac and `CTRL + SHIFT + P` for Windows and Linux. + +Get started with micro:bit and MicroPython on: +https://microbit-micropython.readthedocs.io/en/latest/. +""" + +from microbit import * + +while True: + display.scroll("Hello World!") diff --git a/src/test/runTest.ts b/src/test/runTest.ts index 6d54aa78b..2e15c1ed8 100644 --- a/src/test/runTest.ts +++ b/src/test/runTest.ts @@ -3,21 +3,21 @@ import * as path from "path"; import { runTests } from "vscode-test"; async function main() { - try { - // The folder containing the Extension Manifest package.json - // Passed to `--extensionDevelopmentPath` - const extensionDevelopmentPath = path.resolve(__dirname, "../../"); + try { + // The folder containing the Extension Manifest package.json + // Passed to `--extensionDevelopmentPath` + const extensionDevelopmentPath = path.resolve(__dirname, "../../"); - // The path to the extension test script - // Passed to --extensionTestsPath - const extensionTestsPath = path.resolve(__dirname, "./suite/index"); + // The path to the extension test script + // Passed to --extensionTestsPath + const extensionTestsPath = path.resolve(__dirname, "./suite/index"); - // Download VS Code, unzip it and run the integration test - await runTests({ extensionDevelopmentPath, extensionTestsPath }); - } catch (err) { - console.error("Failed to run tests"); - process.exit(1); - } + // Download VS Code, unzip it and run the integration test + await runTests({ extensionDevelopmentPath, extensionTestsPath }); + } catch (err) { + console.error("Failed to run tests"); + process.exit(1); + } } main(); diff --git a/src/test/suite/index.ts b/src/test/suite/index.ts index c223a6f0d..4ae41bac6 100644 --- a/src/test/suite/index.ts +++ b/src/test/suite/index.ts @@ -16,35 +16,35 @@ import * as path from "path"; // tslint:disable-next-line: export-name export function run(): Promise { - // Create the mocha test - const mocha = new Mocha({ - ui: "tdd", - }); - mocha.useColors(true); + // Create the mocha test + const mocha = new Mocha({ + ui: "tdd", + }); + mocha.useColors(true); - const testsRoot = path.resolve(__dirname, ".."); + const testsRoot = path.resolve(__dirname, ".."); - return new Promise((c, e) => { - glob("**/**.test.js", { cwd: testsRoot }, (err, files) => { - if (err) { - return e(err); - } + return new Promise((c, e) => { + glob("**/**.test.js", { cwd: testsRoot }, (err, files) => { + if (err) { + return e(err); + } - // Add files to the test suite - files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); + // Add files to the test suite + files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f))); - try { - // Run the mocha test - mocha.run(failures => { - if (failures > 0) { - e(new Error(`${failures} tests failed.`)); - } else { - c(); - } - }); - } catch (err) { - e(err); - } - }); - }); + try { + // Run the mocha test + mocha.run((failures) => { + if (failures > 0) { + e(new Error(`${failures} tests failed.`)); + } else { + c(); + } + }); + } catch (err) { + e(err); + } + }); + }); } diff --git a/src/usbDetector.ts b/src/usbDetector.ts index 6d28bb9fb..073c99c01 100644 --- a/src/usbDetector.ts +++ b/src/usbDetector.ts @@ -12,101 +12,101 @@ import * as utils from "./extension_utils/utils"; import { SerialMonitor } from "./serialMonitor"; export class UsbDetector { - public static getInstance(): UsbDetector { - if (!UsbDetector._instance) { - UsbDetector._instance = new UsbDetector(); - } - return UsbDetector._instance; - } - - private static _instance: UsbDetector; - - private _usbDetector: any; - - private _boardDescriptors: any = null; - - private _extensionRoot: string = null; - - private constructor() {} - - public initialize(extensionRoot: string) { - this._extensionRoot = extensionRoot; - } - - public async startListening() { - const workspaceConfig = vscode.workspace.getConfiguration(); - const enableUSBDetection = workspaceConfig.get( - CONFIG_KEYS.ENABLE_USB_DETECTION - ); - - if (os.platform() === "linux" || !enableUSBDetection) { - return; - } - this._usbDetector = require("usb-native").detector; - - if (!this._usbDetector) { - return; - } - - if (this._extensionRoot === null) { - throw new Error("UsbDetector should be initialized before using."); - } - - this._usbDetector.on("add", async (device: any) => { - if (device.vendorId && device.productId) { - const deviceDescriptor = this.getUsbDeviceDescriptor( - utils.convertToHex(device.vendorId, 4), - utils.convertToHex(device.productId, 4), - this._extensionRoot - ); - - // Not supported device for discovery - if (!deviceDescriptor) { - return; - } - - const boardKey = `${deviceDescriptor.package}:${deviceDescriptor.architecture}:${deviceDescriptor.id}`; - // Log that a board was detected - if (!SerialMonitor.getInstance().initialized) { - SerialMonitor.getInstance().initialize(); - } - } - }); - } - - public stopListening() { - if (this._usbDetector) { - this._usbDetector.stopMonitoring(); - } - } - - private getUsbDeviceDescriptor( - vendorId: string, - productId: string, - extensionRoot: string - ): any { - if (!this._boardDescriptors) { - this._boardDescriptors = []; - const fileContent = fs.readFileSync( - path.join(extensionRoot, "misc", "usbmapping.json"), - "utf8" - ); - const boardIndexes: [] = JSON.parse(fileContent); - boardIndexes.forEach((boardIndex: any) => { - boardIndex.boards.forEach((board: any) => { - board.indexFile = boardIndex.index_file; - }); - this._boardDescriptors = this._boardDescriptors.concat( - boardIndex.boards - ); - }); - } - return this._boardDescriptors.find((obj: any) => { - return ( - obj.vid === vendorId && - (obj.pid === productId || - (obj.pid.indexOf && obj.pid.indexOf(productId) >= 0)) - ); - }); - } + public static getInstance(): UsbDetector { + if (!UsbDetector._instance) { + UsbDetector._instance = new UsbDetector(); + } + return UsbDetector._instance; + } + + private static _instance: UsbDetector; + + private _usbDetector: any; + + private _boardDescriptors: any = null; + + private _extensionRoot: string = null; + + private constructor() {} + + public initialize(extensionRoot: string) { + this._extensionRoot = extensionRoot; + } + + public async startListening() { + const workspaceConfig = vscode.workspace.getConfiguration(); + const enableUSBDetection = workspaceConfig.get( + CONFIG_KEYS.ENABLE_USB_DETECTION + ); + + if (os.platform() === "linux" || !enableUSBDetection) { + return; + } + this._usbDetector = require("usb-native").detector; + + if (!this._usbDetector) { + return; + } + + if (this._extensionRoot === null) { + throw new Error("UsbDetector should be initialized before using."); + } + + this._usbDetector.on("add", async (device: any) => { + if (device.vendorId && device.productId) { + const deviceDescriptor = this.getUsbDeviceDescriptor( + utils.convertToHex(device.vendorId, 4), + utils.convertToHex(device.productId, 4), + this._extensionRoot + ); + + // Not supported device for discovery + if (!deviceDescriptor) { + return; + } + + const boardKey = `${deviceDescriptor.package}:${deviceDescriptor.architecture}:${deviceDescriptor.id}`; + // Log that a board was detected + if (!SerialMonitor.getInstance().initialized) { + SerialMonitor.getInstance().initialize(); + } + } + }); + } + + public stopListening() { + if (this._usbDetector) { + this._usbDetector.stopMonitoring(); + } + } + + private getUsbDeviceDescriptor( + vendorId: string, + productId: string, + extensionRoot: string + ): any { + if (!this._boardDescriptors) { + this._boardDescriptors = []; + const fileContent = fs.readFileSync( + path.join(extensionRoot, "misc", "usbmapping.json"), + "utf8" + ); + const boardIndexes: [] = JSON.parse(fileContent); + boardIndexes.forEach((boardIndex: any) => { + boardIndex.boards.forEach((board: any) => { + board.indexFile = boardIndex.index_file; + }); + this._boardDescriptors = this._boardDescriptors.concat( + boardIndex.boards + ); + }); + } + return this._boardDescriptors.find((obj: any) => { + return ( + obj.vid === vendorId && + (obj.pid === productId || + (obj.pid.indexOf && obj.pid.indexOf(productId) >= 0)) + ); + }); + } } diff --git a/src/view/App.css b/src/view/App.css index 413e9fcbc..dd11b283b 100644 --- a/src/view/App.css +++ b/src/view/App.css @@ -1,16 +1,16 @@ .App { - text-align: center; - display: flex; - justify-content: space-between; + text-align: center; + display: flex; + justify-content: space-between; } .App-main { - background-color: var(--vscode-editor-background); - padding: 0px 0.75em 0px 0.75em; - min-height: 100vh; - width: 100%; - margin-top: 24px; - margin-bottom: 53px; - max-height: 400px; - overflow: scroll; + background-color: var(--vscode-editor-background); + padding: 0px 0.75em 0px 0.75em; + min-height: 100vh; + width: 100%; + margin-top: 24px; + margin-bottom: 53px; + max-height: 400px; + overflow: scroll; } diff --git a/src/view/App.spec.tsx b/src/view/App.spec.tsx index 66d6fc9d5..eb12d412f 100644 --- a/src/view/App.spec.tsx +++ b/src/view/App.spec.tsx @@ -5,24 +5,24 @@ import * as testRenderer from "react-test-renderer"; import App from "./App"; describe("App component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/src/view/App.tsx b/src/view/App.tsx index 3e540c8d9..4b530406e 100644 --- a/src/view/App.tsx +++ b/src/view/App.tsx @@ -4,98 +4,98 @@ import * as React from "react"; import "./App.css"; import { - DEVICE_LIST_KEY, - VIEW_STATE, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_ATTRIBUTES_KEY, - WEBVIEW_TYPES, + DEVICE_LIST_KEY, + VIEW_STATE, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_ATTRIBUTES_KEY, + WEBVIEW_TYPES, } from "./constants"; import { Device } from "./container/device/Device"; import { ViewStateContext } from "./context"; import { GettingStartedPage } from "./pages/gettingStarted"; interface IState { - currentDevice: string; - viewState: VIEW_STATE; - type?: WEBVIEW_TYPES; + currentDevice: string; + viewState: VIEW_STATE; + type?: WEBVIEW_TYPES; } const defaultState = { - currentDevice: DEVICE_LIST_KEY.CPX, - viewState: VIEW_STATE.RUNNING, - type: undefined, + currentDevice: DEVICE_LIST_KEY.CPX, + viewState: VIEW_STATE.RUNNING, + type: undefined, }; class App extends React.Component<{}, IState> { - constructor() { - super({}); - this.state = defaultState; - } - componentDidMount() { - if (document.currentScript) { - const webviewTypeAttribute = document.currentScript.getAttribute( - WEBVIEW_ATTRIBUTES_KEY.TYPE - ) as WEBVIEW_TYPES; - if (webviewTypeAttribute) { - this.setState({ type: webviewTypeAttribute }); - } - if (webviewTypeAttribute === WEBVIEW_TYPES.SIMULATOR) { - const initialDevice = document.currentScript.getAttribute( - WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE - ); + constructor() { + super({}); + this.state = defaultState; + } + componentDidMount() { + if (document.currentScript) { + const webviewTypeAttribute = document.currentScript.getAttribute( + WEBVIEW_ATTRIBUTES_KEY.TYPE + ) as WEBVIEW_TYPES; + if (webviewTypeAttribute) { + this.setState({ type: webviewTypeAttribute }); + } + if (webviewTypeAttribute === WEBVIEW_TYPES.SIMULATOR) { + const initialDevice = document.currentScript.getAttribute( + WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE + ); - if (initialDevice) { - this.setState({ currentDevice: initialDevice }); - window.addEventListener("message", this.handleMessage); - } - } - } - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } + if (initialDevice) { + this.setState({ currentDevice: initialDevice }); + window.addEventListener("message", this.handleMessage); + } + } + } + } + componentWillUnmount() { + window.removeEventListener("message", this.handleMessage); + } - render() { - return ( -
-
- - {this.loadContent()} - -
-
- ); - } - loadContent = () => { - console.log(this.state.type); - switch (this.state.type) { - case WEBVIEW_TYPES.GETTING_STARTED: - return ; - case WEBVIEW_TYPES.SIMULATOR: - return ( - - ); - } - return; - }; + render() { + return ( +
+
+ + {this.loadContent()} + +
+
+ ); + } + loadContent = () => { + console.log(this.state.type); + switch (this.state.type) { + case WEBVIEW_TYPES.GETTING_STARTED: + return ; + case WEBVIEW_TYPES.SIMULATOR: + return ( + + ); + } + return; + }; - handleMessage = (event: any): void => { - const message = event.data; + handleMessage = (event: any): void => { + const message = event.data; - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE: - if (message.active_device !== this.state.currentDevice) { - this.setState({ currentDevice: message.active_device }); - } - break; - case VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE: - this.setState({ viewState: VIEW_STATE.RUNNING }); - break; - case VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE: - this.setState({ viewState: VIEW_STATE.PAUSE }); - break; - } - }; + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE: + if (message.active_device !== this.state.currentDevice) { + this.setState({ currentDevice: message.active_device }); + } + break; + case VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE: + this.setState({ viewState: VIEW_STATE.RUNNING }); + break; + case VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE: + this.setState({ viewState: VIEW_STATE.PAUSE }); + break; + } + }; } export default App; diff --git a/src/view/components/Button.tsx b/src/view/components/Button.tsx index db5034b9d..a7df60dc7 100644 --- a/src/view/components/Button.tsx +++ b/src/view/components/Button.tsx @@ -2,33 +2,32 @@ import * as React from "react"; import "../styles/Button.css"; export interface IButtonProps { - label: string; - image: any; - focusable: boolean; - styleLabel: string; - width: number; - onClick: (event: React.MouseEvent) => void; + label: string; + image: any; + focusable: boolean; + styleLabel: string; + width: number; + onClick: (event: React.MouseEvent) => void; } // Functional Component render -const Button: React.FC = props => { - const iconSvg: SVGElement = props.image as SVGElement; - const buttonStyle = { width: props.width }; - const tabIndex = props.focusable ? 0 : -1; +const Button: React.FC = (props) => { + const iconSvg: SVGElement = props.image as SVGElement; + const buttonStyle = { width: props.width }; + const tabIndex = props.focusable ? 0 : -1; - return ( - - ); + return ( + + ); }; export default Button; diff --git a/src/view/components/Dropdown.tsx b/src/view/components/Dropdown.tsx index e5506383a..16c55e60b 100644 --- a/src/view/components/Dropdown.tsx +++ b/src/view/components/Dropdown.tsx @@ -5,31 +5,30 @@ import * as React from "react"; import "../styles/Dropdown.css"; export interface IDropdownProps { - options: string[]; - // styleLabel: string; - name: string; - onSelect?: (event: React.ChangeEvent) => void; + options: string[]; + // styleLabel: string; + name: string; + onSelect?: (event: React.ChangeEvent) => void; } -export const Dropdown: React.FC = props => { - return ( - - ); +export const Dropdown: React.FC = (props) => { + return ( + + ); }; const renderOptions = (options: string[]) => { - return options.map((name, index) => { - return ( - - ); - }); + return options.map((name, index) => { + return ( + + ); + }); }; diff --git a/src/view/components/clue/Clue.spec.tsx b/src/view/components/clue/Clue.spec.tsx index c69b4ebe7..e9a6e6c7d 100644 --- a/src/view/components/clue/Clue.spec.tsx +++ b/src/view/components/clue/Clue.spec.tsx @@ -1,29 +1,29 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { Clue } from "./Clue"; - -describe("Clue component", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); +import * as React from "react"; +import * as ReactDOM from "react-dom"; +import { IntlProvider } from "react-intl"; +import * as testRenderer from "react-test-renderer"; +import { Clue } from "./Clue"; + +describe("Clue component", () => { + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); + + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); +}); diff --git a/src/view/components/clue/Clue.tsx b/src/view/components/clue/Clue.tsx index 546f136ee..e587a23bc 100644 --- a/src/view/components/clue/Clue.tsx +++ b/src/view/components/clue/Clue.tsx @@ -1,158 +1,158 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { - GESTURES_CLUE, - SENSOR_LIST, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, -} from "../../constants"; -import "../../styles/Simulator.css"; -import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; -import { sendMessage } from "../../utils/MessageUtils"; -import { CLUE_TOOLBAR_ICON_ID } from "../toolbar/SensorModalUtils"; -import ToolBar from "../toolbar/ToolBar"; -import { ClueSimulator } from "./ClueSimulator"; - -// Component grouping the functionality for micro:bit functionalities -interface IState { - sensors: { [key: string]: number }; - currentSelectedGesture: string; -} -const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT_R]: 0, - [SENSOR_LIST.LIGHT_G]: 0, - [SENSOR_LIST.LIGHT_B]: 0, - [SENSOR_LIST.LIGHT_C]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - [SENSOR_LIST.HUMIDITY]: 0, - [SENSOR_LIST.PRESSURE]: 1013, - [SENSOR_LIST.PROXIMITY]: 0, - [SENSOR_LIST.GYRO_X]: 0, - [SENSOR_LIST.GYRO_Y]: 0, - [SENSOR_LIST.GYRO_Z]: 0, - [SENSOR_LIST.MAGNET_X]: 0, - [SENSOR_LIST.MAGNET_Y]: 0, - [SENSOR_LIST.MAGNET_Z]: 0, - }, - currentSelectedGesture: GESTURES_CLUE[0], -}; - -export class Clue extends React.Component<{}, IState> { - state = DEFAULT_STATE; - - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; - - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; - updateGesture = (event: React.ChangeEvent) => { - this.setState({ currentSelectedGesture: event.target.value }); - }; - sendGesture = (isActive: boolean) => { - if (this.state.currentSelectedGesture) { - if (isActive) { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: this.state.currentSelectedGesture, - }); - } else { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: "", - }); - } - } - }; -} - -const CLUE_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - label: CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.LEDS, - image: TOOLBAR_SVG.NEO_PIXEL_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.TEMPERATURE, - image: TOOLBAR_SVG.TEMPERATURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.LIGHT, - image: TOOLBAR_SVG.LIGHT_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, - image: TOOLBAR_SVG.MOTION_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.HUMIDITY, - image: TOOLBAR_SVG.HUMIDITY_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.PRESSURE, - image: TOOLBAR_SVG.PRESSURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.PROXIMITY, - image: TOOLBAR_SVG.PROXIMITY_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GESTURE, - image: TOOLBAR_SVG.GESTURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GYROSCOPE, - image: TOOLBAR_SVG.GYROSCOPE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, - image: TOOLBAR_SVG.MAGNET_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GPIO, - image: TOOLBAR_SVG.GPIO_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.SOUND, - image: TOOLBAR_SVG.SOUND_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.SPEAKER, - image: TOOLBAR_SVG.SPEAKER_SVG, - }, -]; +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import * as React from "react"; +import { + GESTURES_CLUE, + SENSOR_LIST, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_MESSAGES, +} from "../../constants"; +import "../../styles/Simulator.css"; +import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; +import { sendMessage } from "../../utils/MessageUtils"; +import { CLUE_TOOLBAR_ICON_ID } from "../toolbar/SensorModalUtils"; +import ToolBar from "../toolbar/ToolBar"; +import { ClueSimulator } from "./ClueSimulator"; + +// Component grouping the functionality for micro:bit functionalities +interface IState { + sensors: { [key: string]: number }; + currentSelectedGesture: string; +} +const DEFAULT_STATE = { + sensors: { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT_R]: 0, + [SENSOR_LIST.LIGHT_G]: 0, + [SENSOR_LIST.LIGHT_B]: 0, + [SENSOR_LIST.LIGHT_C]: 0, + [SENSOR_LIST.MOTION_X]: 0, + [SENSOR_LIST.MOTION_Y]: 0, + [SENSOR_LIST.MOTION_Z]: 0, + [SENSOR_LIST.HUMIDITY]: 0, + [SENSOR_LIST.PRESSURE]: 1013, + [SENSOR_LIST.PROXIMITY]: 0, + [SENSOR_LIST.GYRO_X]: 0, + [SENSOR_LIST.GYRO_Y]: 0, + [SENSOR_LIST.GYRO_Z]: 0, + [SENSOR_LIST.MAGNET_X]: 0, + [SENSOR_LIST.MAGNET_Y]: 0, + [SENSOR_LIST.MAGNET_Z]: 0, + }, + currentSelectedGesture: GESTURES_CLUE[0], +}; + +export class Clue extends React.Component<{}, IState> { + state = DEFAULT_STATE; + + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } + + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + handleMessage = (event: any): void => { + const message = event.data; + + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.RESET: + this.setState({ ...DEFAULT_STATE }); + break; + } + }; + render() { + return ( + + + + + ); + } + updateSensor = (sensor: SENSOR_LIST, value: number) => { + this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); + }; + updateGesture = (event: React.ChangeEvent) => { + this.setState({ currentSelectedGesture: event.target.value }); + }; + sendGesture = (isActive: boolean) => { + if (this.state.currentSelectedGesture) { + if (isActive) { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: this.state.currentSelectedGesture, + }); + } else { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: "", + }); + } + } + }; +} + +const CLUE_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ + { + label: CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, + image: TOOLBAR_SVG.PUSH_BUTTON_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.LEDS, + image: TOOLBAR_SVG.NEO_PIXEL_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.TEMPERATURE, + image: TOOLBAR_SVG.TEMPERATURE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.LIGHT, + image: TOOLBAR_SVG.LIGHT_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, + image: TOOLBAR_SVG.MOTION_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.HUMIDITY, + image: TOOLBAR_SVG.HUMIDITY_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.PRESSURE, + image: TOOLBAR_SVG.PRESSURE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.PROXIMITY, + image: TOOLBAR_SVG.PROXIMITY_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.GESTURE, + image: TOOLBAR_SVG.GESTURE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.GYROSCOPE, + image: TOOLBAR_SVG.GYROSCOPE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, + image: TOOLBAR_SVG.MAGNET_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.GPIO, + image: TOOLBAR_SVG.GPIO_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.SOUND, + image: TOOLBAR_SVG.SOUND_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.SPEAKER, + image: TOOLBAR_SVG.SPEAKER_SVG, + }, +]; diff --git a/src/view/components/clue/ClueImage.tsx b/src/view/components/clue/ClueImage.tsx index 85694d4e0..7bbecc68e 100644 --- a/src/view/components/clue/ClueImage.tsx +++ b/src/view/components/clue/ClueImage.tsx @@ -1,156 +1,156 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { BUTTON_CLASSNAME, VIEW_STATE } from "../../constants"; -import CONSTANTS, { BUTTON_STYLING_CLASSES } from "../../constants"; -import { ViewStateContext } from "../../context"; -import { ClueSvg, IRefObject } from "./Clue_svg"; - -interface EventTriggers { - onMouseUp: (event: Event, buttonKey: string) => void; - onMouseDown: (event: Event, buttonKey: string) => void; - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; -} -interface IProps { - eventTriggers: EventTriggers; - displayMessage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; -} - -export enum BUTTONS_KEYS { - BTN_A = "BTN_A", - BTN_B = "BTN_B", - BTN_AB = "BTN_AB", -} -// Displays the SVG and call necessary svg modification. -export class ClueImage extends React.Component { - private svgRef: React.RefObject = React.createRef(); - constructor(props: IProps) { - super(props); - } - componentDidMount() { - const svgElement = this.svgRef.current; - if (svgElement) { - setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); - this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); - } - } - componentDidUpdate() { - if (this.context === VIEW_STATE.PAUSE && this.svgRef.current) { - disableAllButtons(this.svgRef.current.getButtons()); - } else if (this.context === VIEW_STATE.RUNNING && this.svgRef.current) { - setupAllButtons( - this.props.eventTriggers, - this.svgRef.current.getButtons() - ); - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.eventTriggers.onKeyEvent(event, true, event.key); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.eventTriggers.onKeyEvent(event, false, event.key); - }; - render() { - return ( - - ); - } - public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { - const button = this.svgRef.current?.getButtons()[key].current; - if (button) { - button.focus(); - if (isActive) { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.KEYPRESSED - ); - } else { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.DEFAULT - ); - } - button.setAttribute("pressed", `${isActive}`); - button.setAttribute("aria-pressed", `${isActive}`); - } - } -} - -ClueImage.contextType = ViewStateContext; -const setupButton = ( - buttonElement: SVGRectElement, - eventTriggers: EventTriggers, - key: string -) => { - buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); - buttonElement.onmousedown = e => { - buttonElement.focus(); - eventTriggers.onMouseDown(e, key); - }; - buttonElement.onmouseup = e => { - eventTriggers.onMouseUp(e, key); - }; - - buttonElement.onkeydown = e => { - // ensure that the keydown is enter, - // or else it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - eventTriggers.onKeyEvent(e, true, key); - } - }; - buttonElement.onkeyup = e => { - eventTriggers.onKeyEvent(e, false, key); - }; -}; -const setupAllButtons = ( - eventTriggers: EventTriggers, - buttonRefs: IRefObject -) => { - for (const [key, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - setupButton(ref.current, eventTriggers, key); - } - } -}; -const disableAllButtons = (buttonRefs: IRefObject) => { - for (const [, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - // to implement - ref.current.onmousedown = null; - ref.current.onmouseup = null; - ref.current.onkeydown = null; - ref.current.onkeyup = null; - ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); - } - } -}; +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import * as React from "react"; +import { BUTTON_CLASSNAME, VIEW_STATE } from "../../constants"; +import CONSTANTS, { BUTTON_STYLING_CLASSES } from "../../constants"; +import { ViewStateContext } from "../../context"; +import { ClueSvg, IRefObject } from "./Clue_svg"; + +interface EventTriggers { + onMouseUp: (event: Event, buttonKey: string) => void; + onMouseDown: (event: Event, buttonKey: string) => void; + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; +} +interface IProps { + eventTriggers: EventTriggers; + displayMessage: string; + leds: { + neopixel: number[]; + isRedLedOn: boolean; + isWhiteLedOn: boolean; + }; +} + +export enum BUTTONS_KEYS { + BTN_A = "BTN_A", + BTN_B = "BTN_B", + BTN_AB = "BTN_AB", +} +// Displays the SVG and call necessary svg modification. +export class ClueImage extends React.Component { + private svgRef: React.RefObject = React.createRef(); + constructor(props: IProps) { + super(props); + } + componentDidMount() { + const svgElement = this.svgRef.current; + if (svgElement) { + setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); + this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); + } + } + componentDidUpdate() { + if (this.context === VIEW_STATE.PAUSE && this.svgRef.current) { + disableAllButtons(this.svgRef.current.getButtons()); + } else if (this.context === VIEW_STATE.RUNNING && this.svgRef.current) { + setupAllButtons( + this.props.eventTriggers, + this.svgRef.current.getButtons() + ); + } + } + componentWillUnmount() { + window.document.removeEventListener("keydown", this.handleKeyDown); + window.document.removeEventListener("keyup", this.handleKeyUp); + } + setupKeyPresses = ( + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void + ) => { + window.document.addEventListener("keydown", this.handleKeyDown); + window.document.addEventListener("keyup", this.handleKeyUp); + }; + handleKeyDown = (event: KeyboardEvent) => { + const keyEvents = [event.key, event.code]; + // Don't listen to keydown events for the run button, restart button and enter key + if ( + !( + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) + ) + ) { + this.props.eventTriggers.onKeyEvent(event, true, event.key); + } + }; + handleKeyUp = (event: KeyboardEvent) => { + this.props.eventTriggers.onKeyEvent(event, false, event.key); + }; + render() { + return ( + + ); + } + public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { + const button = this.svgRef.current?.getButtons()[key].current; + if (button) { + button.focus(); + if (isActive) { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.KEYPRESSED + ); + } else { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.DEFAULT + ); + } + button.setAttribute("pressed", `${isActive}`); + button.setAttribute("aria-pressed", `${isActive}`); + } + } +} + +ClueImage.contextType = ViewStateContext; +const setupButton = ( + buttonElement: SVGRectElement, + eventTriggers: EventTriggers, + key: string +) => { + buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); + buttonElement.onmousedown = (e) => { + buttonElement.focus(); + eventTriggers.onMouseDown(e, key); + }; + buttonElement.onmouseup = (e) => { + eventTriggers.onMouseUp(e, key); + }; + + buttonElement.onkeydown = (e) => { + // ensure that the keydown is enter, + // or else it may register shortcuts twice + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + eventTriggers.onKeyEvent(e, true, key); + } + }; + buttonElement.onkeyup = (e) => { + eventTriggers.onKeyEvent(e, false, key); + }; +}; +const setupAllButtons = ( + eventTriggers: EventTriggers, + buttonRefs: IRefObject +) => { + for (const [key, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + setupButton(ref.current, eventTriggers, key); + } + } +}; +const disableAllButtons = (buttonRefs: IRefObject) => { + for (const [, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + // to implement + ref.current.onmousedown = null; + ref.current.onmouseup = null; + ref.current.onkeydown = null; + ref.current.onkeyup = null; + ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); + } + } +}; diff --git a/src/view/components/clue/ClueSimulator.tsx b/src/view/components/clue/ClueSimulator.tsx index a15f101f8..89323e93e 100644 --- a/src/view/components/clue/ClueSimulator.tsx +++ b/src/view/components/clue/ClueSimulator.tsx @@ -1,11 +1,11 @@ import * as React from "react"; import { - AB_BUTTONS_KEYS, - CONSTANTS, - DEFAULT_IMG_CLUE, - DEVICE_LIST_KEY, - VIEW_STATE, - WEBVIEW_MESSAGES, + AB_BUTTONS_KEYS, + CONSTANTS, + DEFAULT_IMG_CLUE, + DEVICE_LIST_KEY, + VIEW_STATE, + WEBVIEW_MESSAGES, } from "../../constants"; import { ViewStateContext } from "../../context"; import "../../styles/Simulator.css"; @@ -17,288 +17,288 @@ import ActionBar from "../simulator/ActionBar"; import { BUTTONS_KEYS, ClueImage } from "./ClueImage"; export const DEFAULT_CLUE_STATE: IClueState = { - buttons: { button_a: false, button_b: false }, - displayMessage: DEFAULT_IMG_CLUE, - leds: { - neopixel: [0, 0, 0], - isRedLedOn: false, - isWhiteLedOn: false, - }, + buttons: { button_a: false, button_b: false }, + displayMessage: DEFAULT_IMG_CLUE, + leds: { + neopixel: [0, 0, 0], + isRedLedOn: false, + isWhiteLedOn: false, + }, }; interface IState { - active_editors: string[]; - running_file?: string; - play_button: boolean; - selected_file: string; - clue: IClueState; - currently_selected_file: string; + active_editors: string[]; + running_file?: string; + play_button: boolean; + selected_file: string; + clue: IClueState; + currently_selected_file: string; } interface IClueState { - buttons: { button_a: boolean; button_b: boolean }; - displayMessage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; + buttons: { button_a: boolean; button_b: boolean }; + displayMessage: string; + leds: { + neopixel: number[]; + isRedLedOn: boolean; + isWhiteLedOn: boolean; + }; } export class ClueSimulator extends React.Component { - private imageRef: React.RefObject = React.createRef(); - constructor() { - super({}); - this.state = { - clue: DEFAULT_CLUE_STATE, - play_button: false, - selected_file: "", - active_editors: [], - running_file: undefined, - currently_selected_file: "", - }; - this.onKeyEvent = this.onKeyEvent.bind(this); - } - handleMessage = (event: any): void => { - const message = event.data; - if (message.active_device !== DEVICE_LIST_KEY.CLUE) { - return; - } - switch (message.command) { - case "reset-state": - this.setState({ - clue: DEFAULT_CLUE_STATE, - play_button: false, - }); - break; - case "set-state": - this.handleStateChangeMessage(message); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - clue: { - ...this.state.clue, - displayMessage: DEFAULT_IMG_CLUE, - }, - }); - break; - case "visible-editors": - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } + private imageRef: React.RefObject = React.createRef(); + constructor() { + super({}); + this.state = { + clue: DEFAULT_CLUE_STATE, + play_button: false, + selected_file: "", + active_editors: [], + running_file: undefined, + currently_selected_file: "", + }; + this.onKeyEvent = this.onKeyEvent.bind(this); + } + handleMessage = (event: any): void => { + const message = event.data; + if (message.active_device !== DEVICE_LIST_KEY.CLUE) { + return; + } + switch (message.command) { + case "reset-state": + this.setState({ + clue: DEFAULT_CLUE_STATE, + play_button: false, + }); + break; + case "set-state": + this.handleStateChangeMessage(message); + break; + case "activate-play": + const newRunningFile = this.state.currently_selected_file; + this.setState({ + play_button: !this.state.play_button, + running_file: newRunningFile, + clue: { + ...this.state.clue, + displayMessage: DEFAULT_IMG_CLUE, + }, + }); + break; + case "visible-editors": + this.setState({ + active_editors: message.state.activePythonEditors, + }); + break; + case "current-file": + if (this.state.play_button) { + this.setState({ + currently_selected_file: message.state.running_file, + }); + } else { + this.setState({ + running_file: message.state.running_file, + currently_selected_file: message.state.running_file, + }); + } - break; - } - }; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } + break; + } + }; + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } + componentWillUnmount() { + window.removeEventListener("message", this.handleMessage); + } - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
+ render() { + const playStopImage = this.state.play_button ? StopLogo : PlayLogo; + const playStopLabel = this.state.play_button ? "stop" : "play"; + return ( +
+
+ {this.state.running_file && this.state.play_button + ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) + : CONSTANTS.FILES_PLACEHOLDER} +
-
- -
- -
- ); - } - protected togglePlayClick = () => { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - }; - protected onSelectFile(event: React.FocusEvent) { - this.setState({ - selected_file: event.currentTarget.value, - }); - } - protected refreshSimulatorClick = () => { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - }; - protected handleButtonClick = (key: string, isActive: boolean) => { - let newButtonState = this.state.clue.buttons; - switch (key) { - case AB_BUTTONS_KEYS.BTN_A: - newButtonState.button_a = isActive; - break; - case AB_BUTTONS_KEYS.BTN_B: - newButtonState.button_b = isActive; - break; - case AB_BUTTONS_KEYS.BTN_AB: - newButtonState = { - button_a: isActive, - button_b: isActive, - }; - break; - } - sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); - this.setState({ - clue: { - ...this.state.clue, - buttons: newButtonState, - }, - }); - }; +
+ +
+ +
+ ); + } + protected togglePlayClick = () => { + const button = + window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || + window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { + selected_file: this.state.selected_file, + state: !this.state.play_button, + }); + }; + protected onSelectFile(event: React.FocusEvent) { + this.setState({ + selected_file: event.currentTarget.value, + }); + } + protected refreshSimulatorClick = () => { + const button = window.document.getElementById( + CONSTANTS.ID_NAME.REFRESH_BUTTON + ); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); + }; + protected handleButtonClick = (key: string, isActive: boolean) => { + let newButtonState = this.state.clue.buttons; + switch (key) { + case AB_BUTTONS_KEYS.BTN_A: + newButtonState.button_a = isActive; + break; + case AB_BUTTONS_KEYS.BTN_B: + newButtonState.button_b = isActive; + break; + case AB_BUTTONS_KEYS.BTN_AB: + newButtonState = { + button_a: isActive, + button_b: isActive, + }; + break; + } + sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); + this.setState({ + clue: { + ...this.state.clue, + buttons: newButtonState, + }, + }); + }; - protected onMouseUp = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, false); - }; + protected onMouseUp = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, false); + }; - protected onMouseDown = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, true); - }; + protected onMouseDown = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, true); + }; - protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { - event.stopPropagation(); - if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(key, active); - if (key === BUTTONS_KEYS.BTN_A) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if (key === BUTTONS_KEYS.BTN_B) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if (key === BUTTONS_KEYS.BTN_AB) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } - } - protected handleStateChangeMessage(message: any) { - if (message.state.display_base64 != null) { - this.setState({ - clue: { - ...this.state.clue, - displayMessage: message.state.display_base64, - }, - }); - } else if (message.state.pixels != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - neopixel: message.state.pixels, - }, - }, - }); - } else if (message.state.white_leds != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - isWhiteLedOn: message.state.white_leds, - }, - }, - }); - } else if (message.state.red_led != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - isRedLedOn: message.state.red_led, - }, - }, - }); - } - } + protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { + event.stopPropagation(); + if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(key, active); + if (key === BUTTONS_KEYS.BTN_A) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active + ); + } else if (key === BUTTONS_KEYS.BTN_B) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active + ); + } else if (key === BUTTONS_KEYS.BTN_AB) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active + ); + } + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active + ); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { + this.togglePlayClick(); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { + this.refreshSimulatorClick(); + } + } + protected handleStateChangeMessage(message: any) { + if (message.state.display_base64 != null) { + this.setState({ + clue: { + ...this.state.clue, + displayMessage: message.state.display_base64, + }, + }); + } else if (message.state.pixels != null) { + this.setState({ + clue: { + ...this.state.clue, + leds: { + ...this.state.clue.leds, + neopixel: message.state.pixels, + }, + }, + }); + } else if (message.state.white_leds != null) { + this.setState({ + clue: { + ...this.state.clue, + leds: { + ...this.state.clue.leds, + isWhiteLedOn: message.state.white_leds, + }, + }, + }); + } else if (message.state.red_led != null) { + this.setState({ + clue: { + ...this.state.clue, + leds: { + ...this.state.clue.leds, + isRedLedOn: message.state.red_led, + }, + }, + }); + } + } } ClueSimulator.contextType = ViewStateContext; diff --git a/src/view/components/clue/Clue_svg.tsx b/src/view/components/clue/Clue_svg.tsx index bcbf4e6d2..2f09d3321 100644 --- a/src/view/components/clue/Clue_svg.tsx +++ b/src/view/components/clue/Clue_svg.tsx @@ -1,1184 +1,1175 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { CLUE_LEDS_COLORS, CONSTANTS } from "../../constants"; -import "../../styles/SimulatorSvg.css"; -import svg from "../cpx/Svg_utils"; -import { DEFAULT_CLUE_STATE } from "./ClueSimulator"; -export interface IRefObject { - [key: string]: React.RefObject; -} -interface IProps { - displayImage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; -} -export class ClueSvg extends React.Component { - private svgRef: React.RefObject = React.createRef(); - private ledsRefs = { - neopixel: React.createRef(), - redLed: React.createRef(), - whiteLeds: [ - React.createRef(), - React.createRef(), - ], - }; - private gradientRefs = { - neopixel: React.createRef(), - whiteLed: React.createRef(), - redLed: React.createRef(), - }; - - private buttonRefs: IRefObject = { - BTN_A: React.createRef(), - BTN_B: React.createRef(), - BTN_AB: React.createRef(), - }; - - private displayRef: React.RefObject = React.createRef(); - - public getSvgRef(): React.RefObject { - return this.svgRef; - } - public getButtons(): IRefObject { - return this.buttonRefs; - } - public getDisplayRef(): React.RefObject { - return this.displayRef; - } - componentDidMount() { - this.updateSvg(); - } - componentDidUpdate() { - this.updateSvg(); - } - - render() { - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - - LIGHT - - - GESTURE - - - P - - R - - - O - - - XIMI - - - T - - - Y - - - - - - - - - - - - - - Red LED - - - - - Neopixel - - - - -
- ); - } - private updateSvg() { - this.updateDisplay(); - this.updateNeopixel(); - this.updateLeds(); - } - - private updateDisplay() { - if (this.props.displayImage) { - this.displayRef.current?.setAttribute( - "href", - `data:image/png;base64,${this.props.displayImage}` - ); - } - } - - private updateNeopixel() { - const { neopixel } = this.props.leds; - const rgbColor = `rgb(${neopixel[0] + - (255 - neopixel[0]) * CONSTANTS.LED_TINT_FACTOR}, - ${neopixel[1] + - (255 - neopixel[1]) * CONSTANTS.LED_TINT_FACTOR},${neopixel[2] + - (255 - neopixel[2]) * CONSTANTS.LED_TINT_FACTOR})`; - - this.ledsRefs.neopixel.current?.setAttribute("fill", rgbColor); - - if (neopixel === DEFAULT_CLUE_STATE.leds.neopixel) { - this.gradientRefs.neopixel.current?.setAttribute( - "stop-opacity", - "0" - ); - } else { - this.gradientRefs.neopixel.current?.setAttribute( - "stop-opacity", - "1" - ); - } - this.gradientRefs.neopixel.current?.setAttribute( - "stop-color", - rgbColor - ); - } - private updateLeds() { - // update white led - const { isWhiteLedOn, isRedLedOn } = this.props.leds; - - this.ledsRefs.whiteLeds.map( - (ledRef: React.RefObject) => { - svg.setLed( - isWhiteLedOn, - CLUE_LEDS_COLORS.WHITE_LEDS_OFF, - CLUE_LEDS_COLORS.WHITE_LEDS_ON, - ledRef.current, - this.gradientRefs.whiteLed.current - ); - } - ); - svg.setLed( - isRedLedOn, - CLUE_LEDS_COLORS.RED_LED_OFF, - CLUE_LEDS_COLORS.RED_LED_ON, - this.ledsRefs.redLed.current, - this.gradientRefs.redLed.current - ); - } -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import * as React from "react"; +import { CLUE_LEDS_COLORS, CONSTANTS } from "../../constants"; +import "../../styles/SimulatorSvg.css"; +import svg from "../cpx/Svg_utils"; +import { DEFAULT_CLUE_STATE } from "./ClueSimulator"; +export interface IRefObject { + [key: string]: React.RefObject; +} +interface IProps { + displayImage: string; + leds: { + neopixel: number[]; + isRedLedOn: boolean; + isWhiteLedOn: boolean; + }; +} +export class ClueSvg extends React.Component { + private svgRef: React.RefObject = React.createRef(); + private ledsRefs = { + neopixel: React.createRef(), + redLed: React.createRef(), + whiteLeds: [ + React.createRef(), + React.createRef(), + ], + }; + private gradientRefs = { + neopixel: React.createRef(), + whiteLed: React.createRef(), + redLed: React.createRef(), + }; + + private buttonRefs: IRefObject = { + BTN_A: React.createRef(), + BTN_B: React.createRef(), + BTN_AB: React.createRef(), + }; + + private displayRef: React.RefObject = React.createRef(); + + public getSvgRef(): React.RefObject { + return this.svgRef; + } + public getButtons(): IRefObject { + return this.buttonRefs; + } + public getDisplayRef(): React.RefObject { + return this.displayRef; + } + componentDidMount() { + this.updateSvg(); + } + componentDidUpdate() { + this.updateSvg(); + } + + render() { + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A+B + + + + + + + + + + + LIGHT + + + GESTURE + + + P + + R + + + O + + + XIMI + + + T + + + Y + + + + + + + + + + + + + + Red LED + + + + + Neopixel + + + + +
+ ); + } + private updateSvg() { + this.updateDisplay(); + this.updateNeopixel(); + this.updateLeds(); + } + + private updateDisplay() { + if (this.props.displayImage) { + this.displayRef.current?.setAttribute( + "href", + `data:image/png;base64,${this.props.displayImage}` + ); + } + } + + private updateNeopixel() { + const { neopixel } = this.props.leds; + const rgbColor = `rgb(${ + neopixel[0] + (255 - neopixel[0]) * CONSTANTS.LED_TINT_FACTOR + }, + ${neopixel[1] + (255 - neopixel[1]) * CONSTANTS.LED_TINT_FACTOR},${ + neopixel[2] + (255 - neopixel[2]) * CONSTANTS.LED_TINT_FACTOR + })`; + + this.ledsRefs.neopixel.current?.setAttribute("fill", rgbColor); + + if (neopixel === DEFAULT_CLUE_STATE.leds.neopixel) { + this.gradientRefs.neopixel.current?.setAttribute( + "stop-opacity", + "0" + ); + } else { + this.gradientRefs.neopixel.current?.setAttribute( + "stop-opacity", + "1" + ); + } + this.gradientRefs.neopixel.current?.setAttribute( + "stop-color", + rgbColor + ); + } + private updateLeds() { + // update white led + const { isWhiteLedOn, isRedLedOn } = this.props.leds; + + this.ledsRefs.whiteLeds.map( + (ledRef: React.RefObject) => { + svg.setLed( + isWhiteLedOn, + CLUE_LEDS_COLORS.WHITE_LEDS_OFF, + CLUE_LEDS_COLORS.WHITE_LEDS_ON, + ledRef.current, + this.gradientRefs.whiteLed.current + ); + } + ); + svg.setLed( + isRedLedOn, + CLUE_LEDS_COLORS.RED_LED_OFF, + CLUE_LEDS_COLORS.RED_LED_ON, + this.ledsRefs.redLed.current, + this.gradientRefs.redLed.current + ); + } +} diff --git a/src/view/components/cpx/Accessibility_utils.ts b/src/view/components/cpx/Accessibility_utils.ts index afdadb2ac..1ce8d7559 100644 --- a/src/view/components/cpx/Accessibility_utils.ts +++ b/src/view/components/cpx/Accessibility_utils.ts @@ -3,24 +3,24 @@ // Helpers designed to help to make a simulator accessible. namespace accessibility { - export function makeFocusable(elem: SVGElement): void { - elem.setAttribute("focusable", "true"); - elem.setAttribute("tabindex", "0"); - } + export function makeFocusable(elem: SVGElement): void { + elem.setAttribute("focusable", "true"); + elem.setAttribute("tabindex", "0"); + } - export function setAria( - elem: Element, - role?: string, - label?: string - ): void { - if (role && !elem.hasAttribute("role")) { - elem.setAttribute("role", role); - } + export function setAria( + elem: Element, + role?: string, + label?: string + ): void { + if (role && !elem.hasAttribute("role")) { + elem.setAttribute("role", role); + } - if (label && !elem.hasAttribute("aria-label")) { - elem.setAttribute("aria-label", label); - } - } + if (label && !elem.hasAttribute("aria-label")) { + elem.setAttribute("aria-label", label); + } + } } export default accessibility; diff --git a/src/view/components/cpx/Cpx.spec.tsx b/src/view/components/cpx/Cpx.spec.tsx index 24c53d551..229140637 100644 --- a/src/view/components/cpx/Cpx.spec.tsx +++ b/src/view/components/cpx/Cpx.spec.tsx @@ -1,29 +1,29 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { Cpx } from "./Cpx"; - -describe("CPX component", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); +import * as React from "react"; +import * as ReactDOM from "react-dom"; +import { IntlProvider } from "react-intl"; +import * as testRenderer from "react-test-renderer"; +import { Cpx } from "./Cpx"; + +describe("CPX component", () => { + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); + + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); +}); diff --git a/src/view/components/cpx/Cpx.tsx b/src/view/components/cpx/Cpx.tsx index d91728fba..2da890fac 100644 --- a/src/view/components/cpx/Cpx.tsx +++ b/src/view/components/cpx/Cpx.tsx @@ -1,104 +1,104 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { CPX_TOOLBAR_ICON_ID } from "../../components/toolbar/SensorModalUtils"; -import ToolBar from "../../components/toolbar/ToolBar"; -import { SENSOR_LIST, VSCODE_MESSAGES_TO_WEBVIEW } from "../../constants"; -import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; -import Simulator from "./CpxSimulator"; - -// Component grouping the functionality for circuit playground express -const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - }, -}; - -export class Cpx extends React.Component { - state = DEFAULT_STATE; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; - - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; -} - -const CPX_TOOLBAR_BUTTONS: Array<{ label: any; image: any }> = [ - { - image: TOOLBAR_SVG.SLIDER_SWITCH_SVG, - label: CPX_TOOLBAR_ICON_ID.SWITCH, - }, - { - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - label: CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, - }, - { - image: TOOLBAR_SVG.RED_LED_SVG, - label: CPX_TOOLBAR_ICON_ID.RED_LED, - }, - { - image: TOOLBAR_SVG.SOUND_SVG, - label: CPX_TOOLBAR_ICON_ID.SOUND, - }, - { - image: TOOLBAR_SVG.TEMPERATURE_SVG, - label: CPX_TOOLBAR_ICON_ID.TEMPERATURE, - }, - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: CPX_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.NEO_PIXEL_SVG, - label: CPX_TOOLBAR_ICON_ID.NEO_PIXEL, - }, - { - image: TOOLBAR_SVG.SPEAKER_SVG, - label: CPX_TOOLBAR_ICON_ID.SPEAKER, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: CPX_TOOLBAR_ICON_ID.MOTION, - }, - { - image: TOOLBAR_SVG.IR_SVG, - label: CPX_TOOLBAR_ICON_ID.IR, - }, - { - image: TOOLBAR_SVG.GPIO_SVG, - label: CPX_TOOLBAR_ICON_ID.GPIO, - }, -]; +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import * as React from "react"; +import { CPX_TOOLBAR_ICON_ID } from "../../components/toolbar/SensorModalUtils"; +import ToolBar from "../../components/toolbar/ToolBar"; +import { SENSOR_LIST, VSCODE_MESSAGES_TO_WEBVIEW } from "../../constants"; +import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; +import Simulator from "./CpxSimulator"; + +// Component grouping the functionality for circuit playground express +const DEFAULT_STATE = { + sensors: { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT]: 0, + [SENSOR_LIST.MOTION_X]: 0, + [SENSOR_LIST.MOTION_Y]: 0, + [SENSOR_LIST.MOTION_Z]: 0, + }, +}; + +export class Cpx extends React.Component { + state = DEFAULT_STATE; + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } + + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + handleMessage = (event: any): void => { + const message = event.data; + + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.RESET: + this.setState({ ...DEFAULT_STATE }); + break; + } + }; + + render() { + return ( + + + + + ); + } + updateSensor = (sensor: SENSOR_LIST, value: number) => { + this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); + }; +} + +const CPX_TOOLBAR_BUTTONS: Array<{ label: any; image: any }> = [ + { + image: TOOLBAR_SVG.SLIDER_SWITCH_SVG, + label: CPX_TOOLBAR_ICON_ID.SWITCH, + }, + { + image: TOOLBAR_SVG.PUSH_BUTTON_SVG, + label: CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, + }, + { + image: TOOLBAR_SVG.RED_LED_SVG, + label: CPX_TOOLBAR_ICON_ID.RED_LED, + }, + { + image: TOOLBAR_SVG.SOUND_SVG, + label: CPX_TOOLBAR_ICON_ID.SOUND, + }, + { + image: TOOLBAR_SVG.TEMPERATURE_SVG, + label: CPX_TOOLBAR_ICON_ID.TEMPERATURE, + }, + { + image: TOOLBAR_SVG.LIGHT_SVG, + label: CPX_TOOLBAR_ICON_ID.LIGHT, + }, + { + image: TOOLBAR_SVG.NEO_PIXEL_SVG, + label: CPX_TOOLBAR_ICON_ID.NEO_PIXEL, + }, + { + image: TOOLBAR_SVG.SPEAKER_SVG, + label: CPX_TOOLBAR_ICON_ID.SPEAKER, + }, + { + image: TOOLBAR_SVG.MOTION_SVG, + label: CPX_TOOLBAR_ICON_ID.MOTION, + }, + { + image: TOOLBAR_SVG.IR_SVG, + label: CPX_TOOLBAR_ICON_ID.IR, + }, + { + image: TOOLBAR_SVG.GPIO_SVG, + label: CPX_TOOLBAR_ICON_ID.GPIO, + }, +]; diff --git a/src/view/components/cpx/CpxImage.tsx b/src/view/components/cpx/CpxImage.tsx index 48aef4e64..b56b7a31c 100644 --- a/src/view/components/cpx/CpxImage.tsx +++ b/src/view/components/cpx/CpxImage.tsx @@ -9,398 +9,400 @@ import * as SvgStyle from "./Cpx_svg_style"; import svg from "./Svg_utils"; interface IProps { - pixels: number[][]; - red_led: boolean; - brightness: number; - switch: boolean; - on: boolean; - onKeyEvent: (event: KeyboardEvent, active: boolean) => void; - onMouseUp: (button: HTMLElement, event: Event) => void; - onMouseDown: (button: HTMLElement, event: Event) => void; - onMouseLeave: (button: HTMLElement, event: Event) => void; + pixels: number[][]; + red_led: boolean; + brightness: number; + switch: boolean; + on: boolean; + onKeyEvent: (event: KeyboardEvent, active: boolean) => void; + onMouseUp: (button: HTMLElement, event: Event) => void; + onMouseDown: (button: HTMLElement, event: Event) => void; + onMouseLeave: (button: HTMLElement, event: Event) => void; } export class CpxImage extends React.Component { - componentDidMount() { - const svgElement = window.document.getElementById("cpx_svg"); - if (svgElement) { - initSvgStyle(svgElement, this.props.brightness); - setupButtons(this.props); - setupPins(this.props); - this.setupKeyPresses(this.props.onKeyEvent); - setupSwitch(this.props); - this.updateImage(); - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - componentDidUpdate() { - this.updateImage(); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the switch, run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.S) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.onKeyEvent(event, true); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.onKeyEvent(event, false); - }; - render() { - return CPX_SVG; - } - private updateImage() { - updateNeopixels(this.props); - updateRedLED(this.props.red_led); - updatePowerLED(this.props.on); - updateSwitch(this.props.switch); - } + componentDidMount() { + const svgElement = window.document.getElementById("cpx_svg"); + if (svgElement) { + initSvgStyle(svgElement, this.props.brightness); + setupButtons(this.props); + setupPins(this.props); + this.setupKeyPresses(this.props.onKeyEvent); + setupSwitch(this.props); + this.updateImage(); + } + } + componentWillUnmount() { + window.document.removeEventListener("keydown", this.handleKeyDown); + window.document.removeEventListener("keyup", this.handleKeyUp); + } + componentDidUpdate() { + this.updateImage(); + } + setupKeyPresses = ( + onKeyEvent: (event: KeyboardEvent, active: boolean) => void + ) => { + window.document.addEventListener("keydown", this.handleKeyDown); + window.document.addEventListener("keyup", this.handleKeyUp); + }; + + handleKeyDown = (event: KeyboardEvent) => { + const keyEvents = [event.key, event.code]; + // Don't listen to keydown events for the switch, run button, restart button and enter key + if ( + !( + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.S) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) + ) + ) { + this.props.onKeyEvent(event, true); + } + }; + handleKeyUp = (event: KeyboardEvent) => { + this.props.onKeyEvent(event, false); + }; + render() { + return CPX_SVG; + } + private updateImage() { + updateNeopixels(this.props); + updateRedLED(this.props.red_led); + updatePowerLED(this.props.on); + updateSwitch(this.props.switch); + } } const makeButton = ( - g: SVGElement, - left: number, - top: number, - id: string + g: SVGElement, + left: number, + top: number, + id: string ): { outer: SVGElement; inner: SVGElement } => { - const buttonCornerRadius = SvgStyle.BUTTON_CORNER_RADIUS; - const buttonWidth = SvgStyle.BUTTON_WIDTH; - const buttonCircleRadius = SvgStyle.BUTTON_CIRCLE_RADIUS; - const btng = svg.child(g, "g", { class: "sim-button-group" }); - svg.child(btng, "rect", { - fill: SvgStyle.BUTTON_OUTER, - height: buttonWidth, - id: id + "_OUTER", - rx: buttonCornerRadius, - ry: buttonCornerRadius, - width: buttonWidth, - x: left, - y: top, - }); - - const outer = btng; - const inner = svg.child(btng, "circle", { - id: id + "_INNER", - cx: left + buttonWidth / 2, - cy: top + buttonWidth / 2, - r: buttonCircleRadius, - fill: SvgStyle.BUTTON_NEUTRAL, - }); - - return { outer, inner }; + const buttonCornerRadius = SvgStyle.BUTTON_CORNER_RADIUS; + const buttonWidth = SvgStyle.BUTTON_WIDTH; + const buttonCircleRadius = SvgStyle.BUTTON_CIRCLE_RADIUS; + const btng = svg.child(g, "g", { class: "sim-button-group" }); + svg.child(btng, "rect", { + fill: SvgStyle.BUTTON_OUTER, + height: buttonWidth, + id: id + "_OUTER", + rx: buttonCornerRadius, + ry: buttonCornerRadius, + width: buttonWidth, + x: left, + y: top, + }); + + const outer = btng; + const inner = svg.child(btng, "circle", { + id: id + "_INNER", + cx: left + buttonWidth / 2, + cy: top + buttonWidth / 2, + r: buttonCircleRadius, + fill: SvgStyle.BUTTON_NEUTRAL, + }); + + return { outer, inner }; }; const initSvgStyle = (svgElement: HTMLElement, brightness: number): void => { - const style: SVGStyleElement = svg.child( - svgElement, - "style", - {} - ) as SVGStyleElement; - style.textContent = SvgStyle.SVG_STYLE; - - // Filters for the glow effect (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) - const defs: SVGDefsElement = svg.child( - svgElement, - "defs", - {} - ) as SVGDefsElement; - - const g = svg.createElement("g") as SVGElement; - svgElement.appendChild(g); - - const glow = svg.child(defs, "filter", { - height: "120%", - id: "filterglow", - width: "120%", - x: "-5%", - y: "-5%", - }); - svg.child(glow, "feGaussianBlur", { stdDeviation: "5", result: "glow" }); - const merge = svg.child(glow, "feMerge", {}); - for (let i = 0; i < 3; ++i) { - svg.child(merge, "feMergeNode", { in: "glow" }); - } - - const neopixelglow = svg.child(defs, "filter", { - height: "600%", - id: "neopixelglow", - width: "600%", - x: "-300%", - y: "-300%", - }); - svg.child(neopixelglow, "feGaussianBlur", { - result: "coloredBlur", - stdDeviation: "4.3", - }); - const neopixelmerge = svg.child(neopixelglow, "feMerge", {}); - svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); - svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); - svg.child(neopixelmerge, "feMergeNode", { in: "SourceGraphic" }); - - // Brightness - const neopixelfeComponentTransfer = svg.child( - neopixelglow, - "feComponentTransfer", - {} - ); - svg.child(neopixelfeComponentTransfer, "feFuncR", { - id: "brightnessFilterR", - type: "linear", - slope: brightness, - }); - svg.child(neopixelfeComponentTransfer, "feFuncG", { - id: "brightnessFilterG", - slope: brightness, - type: "linear", - }); - svg.child(neopixelfeComponentTransfer, "feFuncB", { - id: "brightnessFilterB", - slope: brightness, - type: "linear", - }); - - // BTN A+B - const outerBtn = (left: number, top: number, label: string) => { - return makeButton(g, left, top, "BTN_AB"); - }; - - const ab = outerBtn(165, SvgStyle.MB_HEIGHT - 15, "A+B"); - const abtext = svg.child(ab.outer, "text", { - class: "sim-text-outside", - x: SvgStyle.BUTTON_TEXT_BASELINE, - y: SvgStyle.MB_HEIGHT - 18, - }) as SVGTextElement; - abtext.textContent = "A+B"; + const style: SVGStyleElement = svg.child( + svgElement, + "style", + {} + ) as SVGStyleElement; + style.textContent = SvgStyle.SVG_STYLE; + + // Filters for the glow effect (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) + const defs: SVGDefsElement = svg.child( + svgElement, + "defs", + {} + ) as SVGDefsElement; + + const g = svg.createElement("g") as SVGElement; + svgElement.appendChild(g); + + const glow = svg.child(defs, "filter", { + height: "120%", + id: "filterglow", + width: "120%", + x: "-5%", + y: "-5%", + }); + svg.child(glow, "feGaussianBlur", { stdDeviation: "5", result: "glow" }); + const merge = svg.child(glow, "feMerge", {}); + for (let i = 0; i < 3; ++i) { + svg.child(merge, "feMergeNode", { in: "glow" }); + } + + const neopixelglow = svg.child(defs, "filter", { + height: "600%", + id: "neopixelglow", + width: "600%", + x: "-300%", + y: "-300%", + }); + svg.child(neopixelglow, "feGaussianBlur", { + result: "coloredBlur", + stdDeviation: "4.3", + }); + const neopixelmerge = svg.child(neopixelglow, "feMerge", {}); + svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); + svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); + svg.child(neopixelmerge, "feMergeNode", { in: "SourceGraphic" }); + + // Brightness + const neopixelfeComponentTransfer = svg.child( + neopixelglow, + "feComponentTransfer", + {} + ); + svg.child(neopixelfeComponentTransfer, "feFuncR", { + id: "brightnessFilterR", + type: "linear", + slope: brightness, + }); + svg.child(neopixelfeComponentTransfer, "feFuncG", { + id: "brightnessFilterG", + slope: brightness, + type: "linear", + }); + svg.child(neopixelfeComponentTransfer, "feFuncB", { + id: "brightnessFilterB", + slope: brightness, + type: "linear", + }); + + // BTN A+B + const outerBtn = (left: number, top: number, label: string) => { + return makeButton(g, left, top, "BTN_AB"); + }; + + const ab = outerBtn(165, SvgStyle.MB_HEIGHT - 15, "A+B"); + const abtext = svg.child(ab.outer, "text", { + class: "sim-text-outside", + x: SvgStyle.BUTTON_TEXT_BASELINE, + y: SvgStyle.MB_HEIGHT - 18, + }) as SVGTextElement; + abtext.textContent = "A+B"; }; const updateNeopixels = (props: IProps): void => { - for (let i = 0; i < props.pixels.length; i++) { - const led = window.document.getElementById(`NEOPIXEL_${i}`); - if (led) { - setNeopixel(led, props.pixels[i], props.brightness); - } - } + for (let i = 0; i < props.pixels.length; i++) { + const led = window.document.getElementById(`NEOPIXEL_${i}`); + if (led) { + setNeopixel(led, props.pixels[i], props.brightness); + } + } }; const updateRedLED = (propsRedLED: boolean): void => { - const redLED = window.document.getElementById("SERIAL_LED"); - if (redLED) { - redLED.style.fill = propsRedLED - ? SvgStyle.RED_LED_ON - : SvgStyle.RED_LED_OFF; - } + const redLED = window.document.getElementById("SERIAL_LED"); + if (redLED) { + redLED.style.fill = propsRedLED + ? SvgStyle.RED_LED_ON + : SvgStyle.RED_LED_OFF; + } }; const updatePowerLED = (propsPowerLED: boolean): void => { - const powerLED = window.document.getElementById("PWR_LED"); - if (powerLED) { - powerLED.style.fill = propsPowerLED - ? SvgStyle.POWER_LED_ON - : SvgStyle.POWER_LED_OFF; - } + const powerLED = window.document.getElementById("PWR_LED"); + if (powerLED) { + powerLED.style.fill = propsPowerLED + ? SvgStyle.POWER_LED_ON + : SvgStyle.POWER_LED_OFF; + } }; const setNeopixel = ( - led: HTMLElement, - pixValue: number[], - brightness: number + led: HTMLElement, + pixValue: number[], + brightness: number ): void => { - if (isLightOn(pixValue) && brightness > 0) { - // Neopixels style (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) - changeBrightness("brightnessFilterR", brightness); - changeBrightness("brightnessFilterG", brightness); - changeBrightness("brightnessFilterB", brightness); - - let [hue, sat, lum] = SvgStyle.rgbToHsl([ - pixValue[0], - pixValue[1], - pixValue[2], - ]); - const innerLum = Math.max( - lum * SvgStyle.INTENSITY_FACTOR, - SvgStyle.MIN_INNER_LUM - ); - lum = (lum * 90) / 100 + 10; // at least 10% luminosity for the stroke - - led.style.filter = `url(#neopixelglow)`; - led.style.fill = `hsl(${hue}, ${sat}%, ${innerLum}%)`; - led.style.stroke = `hsl(${hue}, ${sat}%, ${Math.min( - lum * 3, - SvgStyle.MAX_STROKE_LUM - )}%)`; - led.style.strokeWidth = `1.5`; - } else { - led.style.fill = SvgStyle.OFF_COLOR; - led.style.filter = `none`; - led.style.stroke = `none`; - } + if (isLightOn(pixValue) && brightness > 0) { + // Neopixels style (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) + changeBrightness("brightnessFilterR", brightness); + changeBrightness("brightnessFilterG", brightness); + changeBrightness("brightnessFilterB", brightness); + + let [hue, sat, lum] = SvgStyle.rgbToHsl([ + pixValue[0], + pixValue[1], + pixValue[2], + ]); + const innerLum = Math.max( + lum * SvgStyle.INTENSITY_FACTOR, + SvgStyle.MIN_INNER_LUM + ); + lum = (lum * 90) / 100 + 10; // at least 10% luminosity for the stroke + + led.style.filter = `url(#neopixelglow)`; + led.style.fill = `hsl(${hue}, ${sat}%, ${innerLum}%)`; + led.style.stroke = `hsl(${hue}, ${sat}%, ${Math.min( + lum * 3, + SvgStyle.MAX_STROKE_LUM + )}%)`; + led.style.strokeWidth = `1.5`; + } else { + led.style.fill = SvgStyle.OFF_COLOR; + led.style.filter = `none`; + led.style.stroke = `none`; + } }; const isLightOn = (pixValue: number[]): boolean => { - return !pixValue.every(val => { - return val === 0; - }); + return !pixValue.every((val) => { + return val === 0; + }); }; const changeBrightness = (filterID: string, brightness: number): void => { - const brightnessFilter: HTMLElement | null = window.document.getElementById( - filterID - ); - if (brightnessFilter) { - brightnessFilter.setAttribute("slope", brightness.toString()); - } + const brightnessFilter: HTMLElement | null = + window.document.getElementById(filterID); + if (brightnessFilter) { + brightnessFilter.setAttribute("slope", brightness.toString()); + } }; const setupButtons = (props: IProps): void => { - const outButtons = ["A_OUTER", "B_OUTER", "AB_OUTER"]; - const inButtons = ["A_INNER", "B_INNER", "AB_INNER"]; - outButtons.forEach(buttonName => { - const button = window.document.getElementById("BTN_" + buttonName); - - if (button) { - setupButton(button, "sim-button-outer", props); - } - }); - inButtons.forEach(buttonName => { - const button = window.document.getElementById("BTN_" + buttonName); - if (button) { - setupButton(button, "sim-button", props); - } - }); + const outButtons = ["A_OUTER", "B_OUTER", "AB_OUTER"]; + const inButtons = ["A_INNER", "B_INNER", "AB_INNER"]; + outButtons.forEach((buttonName) => { + const button = window.document.getElementById("BTN_" + buttonName); + + if (button) { + setupButton(button, "sim-button-outer", props); + } + }); + inButtons.forEach((buttonName) => { + const button = window.document.getElementById("BTN_" + buttonName); + if (button) { + setupButton(button, "sim-button", props); + } + }); }; const setupPins = (props: IProps): void => { - const pins = [ - "PIN_A1", - "PIN_A2", - "PIN_A3", - "PIN_A4", - "PIN_A5", - "PIN_A6", - "PIN_A7", - ]; - pins.forEach(pinName => { - const pin = window.document.getElementById(pinName); - - if (pin) { - const svgPin = (pin as unknown) as SVGElement; - svg.addClass(svgPin, `sim-${pinName}-touch`); - accessibility.makeFocusable(svgPin); - svgPin.onmouseup = e => props.onMouseUp(pin, e); - svgPin.onkeyup = e => props.onKeyEvent(e, false); - svgPin.onmousedown = e => props.onMouseDown(pin, e); - svgPin.onkeydown = e => props.onKeyEvent(e, true); - accessibility.setAria( - svgPin, - "button", - `Touch pin ${pinName.substr(pinName.length - 2)}` - ); - } - }); + const pins = [ + "PIN_A1", + "PIN_A2", + "PIN_A3", + "PIN_A4", + "PIN_A5", + "PIN_A6", + "PIN_A7", + ]; + pins.forEach((pinName) => { + const pin = window.document.getElementById(pinName); + + if (pin) { + const svgPin = pin as unknown as SVGElement; + svg.addClass(svgPin, `sim-${pinName}-touch`); + accessibility.makeFocusable(svgPin); + svgPin.onmouseup = (e) => props.onMouseUp(pin, e); + svgPin.onkeyup = (e) => props.onKeyEvent(e, false); + svgPin.onmousedown = (e) => props.onMouseDown(pin, e); + svgPin.onkeydown = (e) => props.onKeyEvent(e, true); + accessibility.setAria( + svgPin, + "button", + `Touch pin ${pinName.substr(pinName.length - 2)}` + ); + } + }); }; const addButtonLabels = (button: HTMLElement) => { - let label = ""; - if (button.id.match(/AB/) !== null) { - label = "a+b"; - } else if (button.id.match(/A/) !== null) { - label = "a"; - } else if (button.id.match(/B/) !== null) { - label = "b"; - } - accessibility.setAria(button, "button", label); + let label = ""; + if (button.id.match(/AB/) !== null) { + label = "a+b"; + } else if (button.id.match(/A/) !== null) { + label = "a"; + } else if (button.id.match(/B/) !== null) { + label = "b"; + } + accessibility.setAria(button, "button", label); }; const setupButton = (button: HTMLElement, className: string, props: IProps) => { - const svgButton = (button as unknown) as SVGElement; - svg.addClass(svgButton, className); - addButtonLabels(button); - if (className.match(/outer/) !== null) { - accessibility.makeFocusable(svgButton); - } - svgButton.onmousedown = e => props.onMouseDown(button, e); - svgButton.onmouseup = e => props.onMouseUp(button, e); - svgButton.onkeydown = e => { - // ensure that the keydown is enter. - // Or else, if the key is a shortcut instead, - // it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - props.onKeyEvent(e, true); - } - }; - svgButton.onkeyup = e => props.onKeyEvent(e, false); - svgButton.onmouseleave = e => props.onMouseLeave(button, e); + const svgButton = button as unknown as SVGElement; + svg.addClass(svgButton, className); + addButtonLabels(button); + if (className.match(/outer/) !== null) { + accessibility.makeFocusable(svgButton); + } + svgButton.onmousedown = (e) => props.onMouseDown(button, e); + svgButton.onmouseup = (e) => props.onMouseUp(button, e); + svgButton.onkeydown = (e) => { + // ensure that the keydown is enter. + // Or else, if the key is a shortcut instead, + // it may register shortcuts twice + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + props.onKeyEvent(e, true); + } + }; + svgButton.onkeyup = (e) => props.onKeyEvent(e, false); + svgButton.onmouseleave = (e) => props.onMouseLeave(button, e); }; const setupSwitch = (props: IProps): void => { - const switchElement = window.document.getElementById("SWITCH"); - const swInnerElement = window.document.getElementById("SWITCH_INNER"); - const swHousingElement = window.document.getElementById("SWITCH_HOUSING"); - - if (switchElement && swInnerElement && swHousingElement) { - const svgSwitch: SVGElement = (switchElement as unknown) as SVGElement; - const svgSwitchInner: SVGElement = (swInnerElement as unknown) as SVGElement; - const svgSwitchHousing: SVGElement = (swHousingElement as unknown) as SVGElement; - - svg.addClass(svgSwitch, "sim-slide-switch"); - - svgSwitch.onmouseup = e => props.onMouseUp(switchElement, e); - svgSwitchInner.onmouseup = e => props.onMouseUp(swInnerElement, e); - svgSwitchHousing.onmouseup = e => props.onMouseUp(swHousingElement, e); - svgSwitch.onkeyup = e => props.onKeyEvent(e, false); - - accessibility.makeFocusable(svgSwitch); - accessibility.setAria(svgSwitch, "button", "On/Off Switch"); - } + const switchElement = window.document.getElementById("SWITCH"); + const swInnerElement = window.document.getElementById("SWITCH_INNER"); + const swHousingElement = window.document.getElementById("SWITCH_HOUSING"); + + if (switchElement && swInnerElement && swHousingElement) { + const svgSwitch: SVGElement = switchElement as unknown as SVGElement; + const svgSwitchInner: SVGElement = + swInnerElement as unknown as SVGElement; + const svgSwitchHousing: SVGElement = + swHousingElement as unknown as SVGElement; + + svg.addClass(svgSwitch, "sim-slide-switch"); + + svgSwitch.onmouseup = (e) => props.onMouseUp(switchElement, e); + svgSwitchInner.onmouseup = (e) => props.onMouseUp(swInnerElement, e); + svgSwitchHousing.onmouseup = (e) => + props.onMouseUp(swHousingElement, e); + svgSwitch.onkeyup = (e) => props.onKeyEvent(e, false); + + accessibility.makeFocusable(svgSwitch); + accessibility.setAria(svgSwitch, "button", "On/Off Switch"); + } }; export const updateSwitch = (switchState: boolean): void => { - const switchElement = window.document.getElementById("SWITCH"); - const switchInner = (window.document.getElementById( - "SWITCH_INNER" - ) as unknown) as SVGElement; - - if (switchElement && switchInner) { - svg.addClass(switchInner, "sim-slide-switch-inner"); - - if (!switchState) { - svg.addClass(switchInner, "on"); - switchInner.setAttribute("transform", "translate(-5,0)"); - } else { - svg.removeClass(switchInner, "on"); - switchInner.removeAttribute("transform"); - } - switchElement.setAttribute("aria-pressed", switchState.toString()); - } + const switchElement = window.document.getElementById("SWITCH"); + const switchInner = window.document.getElementById( + "SWITCH_INNER" + ) as unknown as SVGElement; + + if (switchElement && switchInner) { + svg.addClass(switchInner, "sim-slide-switch-inner"); + + if (!switchState) { + svg.addClass(switchInner, "on"); + switchInner.setAttribute("transform", "translate(-5,0)"); + } else { + svg.removeClass(switchInner, "on"); + switchInner.removeAttribute("transform"); + } + switchElement.setAttribute("aria-pressed", switchState.toString()); + } }; export const updatePinTouch = (pinState: boolean, id: string): void => { - console.log(`updating ${id} with ${pinState}`); - const pinElement = window.document.getElementById(id); - const pinSvg: SVGElement = (pinElement as unknown) as SVGElement; - - if (pinElement && pinSvg) { - pinElement.setAttribute("aria-pressed", pinState.toString()); - pinState - ? svg.addClass(pinSvg, "pin-pressed") - : svg.removeClass(pinSvg, "pin-pressed"); - } + console.log(`updating ${id} with ${pinState}`); + const pinElement = window.document.getElementById(id); + const pinSvg: SVGElement = pinElement as unknown as SVGElement; + + if (pinElement && pinSvg) { + pinElement.setAttribute("aria-pressed", pinState.toString()); + pinState + ? svg.addClass(pinSvg, "pin-pressed") + : svg.removeClass(pinSvg, "pin-pressed"); + } }; export default CpxImage; diff --git a/src/view/components/cpx/CpxSimulator.tsx b/src/view/components/cpx/CpxSimulator.tsx index b0d77f441..7e095043b 100644 --- a/src/view/components/cpx/CpxSimulator.tsx +++ b/src/view/components/cpx/CpxSimulator.tsx @@ -13,380 +13,380 @@ import { BUTTON_NEUTRAL, BUTTON_PRESSED } from "./Cpx_svg_style"; import { CpxImage, updatePinTouch, updateSwitch } from "./CpxImage"; interface ICpxState { - pixels: number[][]; - brightness: number; - red_led: boolean; - button_a: boolean; - button_b: boolean; - switch: boolean; - touch: boolean[]; - shake: boolean; + pixels: number[][]; + brightness: number; + red_led: boolean; + button_a: boolean; + button_b: boolean; + switch: boolean; + touch: boolean[]; + shake: boolean; } interface IState { - active_editors: string[]; - running_file: string; - selected_file: string; - cpx: ICpxState; - play_button: boolean; - currently_selected_file: string; + active_editors: string[]; + running_file: string; + selected_file: string; + cpx: ICpxState; + play_button: boolean; + currently_selected_file: string; } const DEFAULT_CPX_STATE: ICpxState = { - brightness: 1.0, - button_a: false, - button_b: false, - pixels: [ - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - ], - red_led: false, - switch: false, - touch: [false, false, false, false, false, false, false], - shake: false, + brightness: 1.0, + button_a: false, + button_b: false, + pixels: [ + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + ], + red_led: false, + switch: false, + touch: [false, false, false, false, false, false, false], + shake: false, }; class Simulator extends React.Component<{}, IState> { - constructor(props: Readonly<{}>) { - super(props); - this.state = { - active_editors: [], - cpx: DEFAULT_CPX_STATE, - play_button: false, - running_file: "", - selected_file: "", - currently_selected_file: "", - }; - - this.handleClick = this.handleClick.bind(this); - this.onKeyEvent = this.onKeyEvent.bind(this); - this.onMouseDown = this.onMouseDown.bind(this); - this.onMouseUp = this.onMouseUp.bind(this); - this.onMouseLeave = this.onMouseLeave.bind(this); - this.togglePlayClick = this.togglePlayClick.bind(this); - this.refreshSimulatorClick = this.refreshSimulatorClick.bind(this); - } - - handleMessage = (event: any): void => { - const message = event.data; // The JSON data our extension sent - if (message.active_device !== DEVICE_LIST_KEY.CPX) { - return; - } - switch (message.command) { - case "reset-state": - console.log("Clearing the state"); - this.setState({ - cpx: DEFAULT_CPX_STATE, - play_button: false, - }); - break; - case "set-state": - console.log( - "Setting the state: " + JSON.stringify(message.state) - ); - this.setState({ - cpx: message.state, - play_button: true, - }); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - }); - break; - case "visible-editors": - console.log( - "Setting active editors", - message.state.activePythonEditors - ); - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - console.log("Setting current file", message.state.running_file); - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } - break; - } - }; - - componentDidMount() { - console.log("Mounted"); - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
-
- -
- -
- ); - } - - protected togglePlayClick() { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - } - - protected refreshSimulatorClick() { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - } - - protected onKeyEvent(event: KeyboardEvent, active: boolean) { - let element; - const target = event.target as SVGElement; - // Guard Clause - if (target === undefined) { - return; - } - - if ([event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER)) { - element = window.document.getElementById(target.id); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_A - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_B - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_AB - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.S) - ) { - element = window.document.getElementById(CONSTANTS.ID_NAME.SWITCH); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } else { - if (event.shiftKey) { - switch (event.code) { - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_ONE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A1 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_TWO: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A2 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_THREE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A3 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FOUR: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A4 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FIVE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A5 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SIX: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A6 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SEVEN: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A7 - ); - break; - } - } - } - if (element) { - event.preventDefault(); - this.handleClick(element, active); - element.focus(); - } - } - protected onMouseDown(button: HTMLElement, event: Event) { - event.preventDefault(); - this.handleClick(button, true); - button.focus(); - } - - protected onMouseUp(button: HTMLElement, event: Event) { - event.preventDefault(); - this.handleClick(button, false); - } - - protected onMouseLeave(button: HTMLElement, event: Event) { - event.preventDefault(); - - if (button.getAttribute("pressed") === "true") { - this.handleClick(button, false); - } - } - - private handleClick(element: HTMLElement, active: boolean) { - let newState; - let message; - if (element.id.includes("BTN")) { - newState = this.handleButtonClick(element, active); - message = "button-press"; - } else if (element.id.includes("SWITCH")) { - newState = this.handleSwitchClick(); - message = "button-press"; - } else if (element.id.includes("PIN")) { - newState = this.handleTouchPinClick(element, active); - message = "sensor-changed"; - } else { - return; - } - - if (newState && message) { - sendMessage(message, newState); - } - } - - private handleButtonClick(button: HTMLElement, active: boolean) { - const ButtonA: boolean = button.id.match(/BTN_A/) !== null; - const ButtonB: boolean = button.id.match(/BTN_B/) !== null; - const ButtonAB: boolean = button.id.match(/BTN_AB/) !== null; - let innerButton; - let newState; - - if (ButtonAB) { - innerButton = window.document.getElementById("BTN_AB_INNER"); - newState = { - button_a: active, - button_b: active, - }; - this.setState({ ...this.state, ...newState }); - } else if (ButtonA) { - innerButton = window.document.getElementById("BTN_A_INNER"); - newState = { - button_a: active, - }; - this.setState({ ...this.state, ...newState }); - } else if (ButtonB) { - innerButton = window.document.getElementById("BTN_B_INNER"); - newState = { - button_b: active, - }; - this.setState({ ...this.state, ...newState }); - } - - if (innerButton) { - innerButton.style.fill = this.getButtonColor(active); - } - - button.setAttribute("pressed", `${active}`); - return newState; - } - - private getButtonColor(pressed: boolean) { - const buttonUps = BUTTON_NEUTRAL; - const buttonDown = BUTTON_PRESSED; - return pressed ? buttonDown : buttonUps; - } - - private handleSwitchClick() { - const switchIsOn = !this.state.cpx.switch; - updateSwitch(switchIsOn); - this.setState({ - ...this.state, - cpx: { ...this.state.cpx, switch: switchIsOn }, - }); - return { switch: switchIsOn }; - } - - private handleTouchPinClick(pin: HTMLElement, active: boolean): any { - let cpxState = this.state.cpx; - const pinIndex = parseInt(pin.id.charAt(pin.id.length - 1)) - 1; - const pinState = cpxState.touch; - pinState[pinIndex] = active; - cpxState = { ...cpxState, touch: pinState }; - this.setState({ ...this.state, ...cpxState }); - updatePinTouch(active, pin.id); - return { touch: pinState }; - } + constructor(props: Readonly<{}>) { + super(props); + this.state = { + active_editors: [], + cpx: DEFAULT_CPX_STATE, + play_button: false, + running_file: "", + selected_file: "", + currently_selected_file: "", + }; + + this.handleClick = this.handleClick.bind(this); + this.onKeyEvent = this.onKeyEvent.bind(this); + this.onMouseDown = this.onMouseDown.bind(this); + this.onMouseUp = this.onMouseUp.bind(this); + this.onMouseLeave = this.onMouseLeave.bind(this); + this.togglePlayClick = this.togglePlayClick.bind(this); + this.refreshSimulatorClick = this.refreshSimulatorClick.bind(this); + } + + handleMessage = (event: any): void => { + const message = event.data; // The JSON data our extension sent + if (message.active_device !== DEVICE_LIST_KEY.CPX) { + return; + } + switch (message.command) { + case "reset-state": + console.log("Clearing the state"); + this.setState({ + cpx: DEFAULT_CPX_STATE, + play_button: false, + }); + break; + case "set-state": + console.log( + "Setting the state: " + JSON.stringify(message.state) + ); + this.setState({ + cpx: message.state, + play_button: true, + }); + break; + case "activate-play": + const newRunningFile = this.state.currently_selected_file; + + this.setState({ + play_button: !this.state.play_button, + running_file: newRunningFile, + }); + break; + case "visible-editors": + console.log( + "Setting active editors", + message.state.activePythonEditors + ); + this.setState({ + active_editors: message.state.activePythonEditors, + }); + break; + case "current-file": + console.log("Setting current file", message.state.running_file); + if (this.state.play_button) { + this.setState({ + currently_selected_file: message.state.running_file, + }); + } else { + this.setState({ + running_file: message.state.running_file, + currently_selected_file: message.state.running_file, + }); + } + break; + } + }; + + componentDidMount() { + console.log("Mounted"); + window.addEventListener("message", this.handleMessage); + } + + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + + render() { + const playStopImage = this.state.play_button ? StopLogo : PlayLogo; + const playStopLabel = this.state.play_button ? "stop" : "play"; + return ( +
+
+ {this.state.running_file && this.state.play_button + ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) + : CONSTANTS.FILES_PLACEHOLDER} +
+
+ +
+ +
+ ); + } + + protected togglePlayClick() { + const button = + window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || + window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { + selected_file: this.state.selected_file, + state: !this.state.play_button, + }); + } + + protected refreshSimulatorClick() { + const button = window.document.getElementById( + CONSTANTS.ID_NAME.REFRESH_BUTTON + ); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); + } + + protected onKeyEvent(event: KeyboardEvent, active: boolean) { + let element; + const target = event.target as SVGElement; + // Guard Clause + if (target === undefined) { + return; + } + + if ([event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER)) { + element = window.document.getElementById(target.id); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) + ) { + element = window.document.getElementById( + CONSTANTS.ID_NAME.BUTTON_A + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) + ) { + element = window.document.getElementById( + CONSTANTS.ID_NAME.BUTTON_B + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) + ) { + element = window.document.getElementById( + CONSTANTS.ID_NAME.BUTTON_AB + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.S) + ) { + element = window.document.getElementById(CONSTANTS.ID_NAME.SWITCH); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { + this.togglePlayClick(); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { + this.refreshSimulatorClick(); + } else { + if (event.shiftKey) { + switch (event.code) { + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_ONE: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A1 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_TWO: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A2 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_THREE: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A3 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FOUR: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A4 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FIVE: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A5 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SIX: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A6 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SEVEN: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A7 + ); + break; + } + } + } + if (element) { + event.preventDefault(); + this.handleClick(element, active); + element.focus(); + } + } + protected onMouseDown(button: HTMLElement, event: Event) { + event.preventDefault(); + this.handleClick(button, true); + button.focus(); + } + + protected onMouseUp(button: HTMLElement, event: Event) { + event.preventDefault(); + this.handleClick(button, false); + } + + protected onMouseLeave(button: HTMLElement, event: Event) { + event.preventDefault(); + + if (button.getAttribute("pressed") === "true") { + this.handleClick(button, false); + } + } + + private handleClick(element: HTMLElement, active: boolean) { + let newState; + let message; + if (element.id.includes("BTN")) { + newState = this.handleButtonClick(element, active); + message = "button-press"; + } else if (element.id.includes("SWITCH")) { + newState = this.handleSwitchClick(); + message = "button-press"; + } else if (element.id.includes("PIN")) { + newState = this.handleTouchPinClick(element, active); + message = "sensor-changed"; + } else { + return; + } + + if (newState && message) { + sendMessage(message, newState); + } + } + + private handleButtonClick(button: HTMLElement, active: boolean) { + const ButtonA: boolean = button.id.match(/BTN_A/) !== null; + const ButtonB: boolean = button.id.match(/BTN_B/) !== null; + const ButtonAB: boolean = button.id.match(/BTN_AB/) !== null; + let innerButton; + let newState; + + if (ButtonAB) { + innerButton = window.document.getElementById("BTN_AB_INNER"); + newState = { + button_a: active, + button_b: active, + }; + this.setState({ ...this.state, ...newState }); + } else if (ButtonA) { + innerButton = window.document.getElementById("BTN_A_INNER"); + newState = { + button_a: active, + }; + this.setState({ ...this.state, ...newState }); + } else if (ButtonB) { + innerButton = window.document.getElementById("BTN_B_INNER"); + newState = { + button_b: active, + }; + this.setState({ ...this.state, ...newState }); + } + + if (innerButton) { + innerButton.style.fill = this.getButtonColor(active); + } + + button.setAttribute("pressed", `${active}`); + return newState; + } + + private getButtonColor(pressed: boolean) { + const buttonUps = BUTTON_NEUTRAL; + const buttonDown = BUTTON_PRESSED; + return pressed ? buttonDown : buttonUps; + } + + private handleSwitchClick() { + const switchIsOn = !this.state.cpx.switch; + updateSwitch(switchIsOn); + this.setState({ + ...this.state, + cpx: { ...this.state.cpx, switch: switchIsOn }, + }); + return { switch: switchIsOn }; + } + + private handleTouchPinClick(pin: HTMLElement, active: boolean): any { + let cpxState = this.state.cpx; + const pinIndex = parseInt(pin.id.charAt(pin.id.length - 1)) - 1; + const pinState = cpxState.touch; + pinState[pinIndex] = active; + cpxState = { ...cpxState, touch: pinState }; + this.setState({ ...this.state, ...cpxState }); + updatePinTouch(active, pin.id); + return { touch: pinState }; + } } export default Simulator; diff --git a/src/view/components/cpx/Cpx_svg.tsx b/src/view/components/cpx/Cpx_svg.tsx index 55864d460..0484dfd11 100644 --- a/src/view/components/cpx/Cpx_svg.tsx +++ b/src/view/components/cpx/Cpx_svg.tsx @@ -6,2997 +6,2996 @@ import * as React from "react"; export const CPX_SVG = ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); export default CPX_SVG; diff --git a/src/view/components/cpx/Cpx_svg_style.tsx b/src/view/components/cpx/Cpx_svg_style.tsx index 4eff14480..c9f9b2c77 100644 --- a/src/view/components/cpx/Cpx_svg_style.tsx +++ b/src/view/components/cpx/Cpx_svg_style.tsx @@ -24,45 +24,45 @@ export const POWER_LED_OFF: string = "#FFFFFF"; // Adapted from : https://github.com/microsoft/pxt/blob/master/pxtsim/simlib.ts export function rgbToHsl( - rgb: [number, number, number] + rgb: [number, number, number] ): [number, number, number] { - const [r, g, b] = rgb; - const [r$, g$, b$] = [r / 255, g / 255, b / 255]; - const cMin = Math.min(r$, g$, b$); - const cMax = Math.max(r$, g$, b$); - const cDelta = cMax - cMin; - let h: number = 0, - s: number, - l: number; - const maxAndMin = cMax + cMin; + const [r, g, b] = rgb; + const [r$, g$, b$] = [r / 255, g / 255, b / 255]; + const cMin = Math.min(r$, g$, b$); + const cMax = Math.max(r$, g$, b$); + const cDelta = cMax - cMin; + let h: number = 0, + s: number, + l: number; + const maxAndMin = cMax + cMin; - // Luminosity - l = (maxAndMin / 2) * 100; + // Luminosity + l = (maxAndMin / 2) * 100; - if (cDelta === 0) { - s = 0; - h = 0; - } else { - // Hue - switch (cMax) { - case r$: - h = 60 * (((g$ - b$) / cDelta) % 6); - break; - case g$: - h = 60 * ((b$ - r$) / cDelta + 2); - break; - case b$: - h = 60 * ((r$ - g$) / cDelta + 4); - break; - } + if (cDelta === 0) { + s = 0; + h = 0; + } else { + // Hue + switch (cMax) { + case r$: + h = 60 * (((g$ - b$) / cDelta) % 6); + break; + case g$: + h = 60 * ((b$ - r$) / cDelta + 2); + break; + case b$: + h = 60 * ((r$ - g$) / cDelta + 4); + break; + } - // Saturation - l > 50 - ? (s = 100 * (cDelta / (2 - maxAndMin))) - : (s = 100 * (cDelta / maxAndMin)); - } + // Saturation + l > 50 + ? (s = 100 * (cDelta / (2 - maxAndMin))) + : (s = 100 * (cDelta / maxAndMin)); + } - return [Math.floor(h), Math.floor(s), Math.floor(l)]; + return [Math.floor(h), Math.floor(s), Math.floor(l)]; } export const SVG_STYLE = ` diff --git a/src/view/components/cpx/Svg_utils.tsx b/src/view/components/cpx/Svg_utils.tsx index 92836b923..4776c4a0a 100644 --- a/src/view/components/cpx/Svg_utils.tsx +++ b/src/view/components/cpx/Svg_utils.tsx @@ -5,94 +5,94 @@ // tslint:disable-next-line: no-namespace namespace svg { - export function addClass(el: SVGElement, cls: string) { - if (el.classList) { - el.classList.add(cls); - } else if (el.className.baseVal.indexOf(cls) < 0) { - el.className.baseVal += " " + cls; - } - } + export function addClass(el: SVGElement, cls: string) { + if (el.classList) { + el.classList.add(cls); + } else if (el.className.baseVal.indexOf(cls) < 0) { + el.className.baseVal += " " + cls; + } + } - export function removeClass(el: SVGElement, cls: string) { - if (el.classList) { - el.classList.remove(cls); - } else { - el.className.baseVal = el.className.baseVal - .replace(cls, "") - .replace(/\s{2,}/, " "); - } - } + export function removeClass(el: SVGElement, cls: string) { + if (el.classList) { + el.classList.remove(cls); + } else { + el.className.baseVal = el.className.baseVal + .replace(cls, "") + .replace(/\s{2,}/, " "); + } + } - export function hydrate(el: SVGElement, props: any) { - for (const k in props) { - if (k == "title") { - svg.title(el, props[k]); - } else { - el.setAttributeNS(null, k, props[k]); - } - } - } + export function hydrate(el: SVGElement, props: any) { + for (const k in props) { + if (k == "title") { + svg.title(el, props[k]); + } else { + el.setAttributeNS(null, k, props[k]); + } + } + } - export function createElement(name: string, props?: any): SVGElement { - const newElement = document.createElementNS( - "http://www.w3.org/2000/svg", - name - ); - if (props) { - svg.hydrate(newElement, props); - } - return newElement; - } + export function createElement(name: string, props?: any): SVGElement { + const newElement = document.createElementNS( + "http://www.w3.org/2000/svg", + name + ); + if (props) { + svg.hydrate(newElement, props); + } + return newElement; + } - export function child( - parent: Element, - name: string, - props?: any - ): SVGElement { - const childElement = svg.createElement(name, props); - parent.appendChild(childElement); - return childElement; - } + export function child( + parent: Element, + name: string, + props?: any + ): SVGElement { + const childElement = svg.createElement(name, props); + parent.appendChild(childElement); + return childElement; + } - export function fill(el: SVGElement, c: string) { - el.style.fill = c; - } + export function fill(el: SVGElement, c: string) { + el.style.fill = c; + } - export function filter(el: SVGElement, c: string) { - el.style.filter = c; - } + export function filter(el: SVGElement, c: string) { + el.style.filter = c; + } - export function fills(els: SVGElement[], c: string) { - els.forEach(el => (el.style.fill = c)); - } + export function fills(els: SVGElement[], c: string) { + els.forEach((el) => (el.style.fill = c)); + } - export function mkTitle(txt: string): SVGTitleElement { - const t = svg.createElement("title") as SVGTitleElement; - t.textContent = txt; - return t; - } + export function mkTitle(txt: string): SVGTitleElement { + const t = svg.createElement("title") as SVGTitleElement; + t.textContent = txt; + return t; + } - export function title(el: SVGElement, txt: string): SVGTitleElement { - const t = mkTitle(txt); - el.appendChild(t); - return t; - } + export function title(el: SVGElement, txt: string): SVGTitleElement { + const t = mkTitle(txt); + el.appendChild(t); + return t; + } - export function setLed( - ledStatus: boolean, - offColor: string, - onColor: string, - ledElement: SVGElement | null, - gradientStopElement: SVGStopElement | null - ) { - if (ledStatus) { - ledElement?.setAttribute("fill", onColor); - gradientStopElement?.setAttribute("stop-opacity", "1"); - } else { - ledElement?.setAttribute("fill", offColor); - gradientStopElement?.setAttribute("stop-opacity", "0"); - } - } + export function setLed( + ledStatus: boolean, + offColor: string, + onColor: string, + ledElement: SVGElement | null, + gradientStopElement: SVGStopElement | null + ) { + if (ledStatus) { + ledElement?.setAttribute("fill", onColor); + gradientStopElement?.setAttribute("stop-opacity", "1"); + } else { + ledElement?.setAttribute("fill", offColor); + gradientStopElement?.setAttribute("stop-opacity", "0"); + } + } } export default svg; diff --git a/src/view/components/microbit/Microbit.spec.tsx b/src/view/components/microbit/Microbit.spec.tsx index e948a1988..67c62cbc2 100644 --- a/src/view/components/microbit/Microbit.spec.tsx +++ b/src/view/components/microbit/Microbit.spec.tsx @@ -1,29 +1,29 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { Microbit } from "./Microbit"; - -describe("Microbit component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); +import * as React from "react"; +import * as ReactDOM from "react-dom"; +import { IntlProvider } from "react-intl"; +import * as testRenderer from "react-test-renderer"; +import { Microbit } from "./Microbit"; + +describe("Microbit component ", () => { + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); + + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); +}); diff --git a/src/view/components/microbit/Microbit.tsx b/src/view/components/microbit/Microbit.tsx index b85565e67..bfc78aa28 100644 --- a/src/view/components/microbit/Microbit.tsx +++ b/src/view/components/microbit/Microbit.tsx @@ -1,130 +1,130 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { MICROBIT_TOOLBAR_ICON_ID } from "../../components/toolbar/SensorModalUtils"; -import { - GESTURES_MICROBIT, - SENSOR_LIST, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, -} from "../../constants"; -import "../../styles/Simulator.css"; -import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; -import { sendMessage } from "../../utils/MessageUtils"; -import ToolBar from "../toolbar/ToolBar"; -import { MicrobitSimulator } from "./MicrobitSimulator"; - -// Component grouping the functionality for micro:bit functionalities -interface IState { - sensors: { [key: string]: number }; - currentSelectedGesture?: string; -} -const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - }, - currentSelectedGesture: GESTURES_MICROBIT[0], -}; - -export class Microbit extends React.Component<{}, IState> { - state = DEFAULT_STATE; - - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; - - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; - updateGesture = (event: React.ChangeEvent) => { - this.setState({ currentSelectedGesture: event.target.value }); - }; - sendGesture = (isActive: boolean) => { - if (this.state.currentSelectedGesture) { - if (isActive) { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: this.state.currentSelectedGesture, - }); - } else { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: "", - }); - } - } - }; -} - -const MICROBIT_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, - }, - { - image: TOOLBAR_SVG.RED_LED_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LEDS, - }, - { - image: TOOLBAR_SVG.TEMPERATURE_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, - }, - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - }, - { - image: TOOLBAR_SVG.GESTURE_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.GESTURE, - }, - { - image: TOOLBAR_SVG.GPIO_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.GPIO, - }, - { - image: TOOLBAR_SVG.COMPASS_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.COMPASS, - }, - { - image: TOOLBAR_SVG.SPEAKER_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.SOUND, - }, - { - image: TOOLBAR_SVG.WIRELESS_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.WIRELESS, - }, -]; +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import * as React from "react"; +import { MICROBIT_TOOLBAR_ICON_ID } from "../../components/toolbar/SensorModalUtils"; +import { + GESTURES_MICROBIT, + SENSOR_LIST, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_MESSAGES, +} from "../../constants"; +import "../../styles/Simulator.css"; +import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; +import { sendMessage } from "../../utils/MessageUtils"; +import ToolBar from "../toolbar/ToolBar"; +import { MicrobitSimulator } from "./MicrobitSimulator"; + +// Component grouping the functionality for micro:bit functionalities +interface IState { + sensors: { [key: string]: number }; + currentSelectedGesture?: string; +} +const DEFAULT_STATE = { + sensors: { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT]: 0, + [SENSOR_LIST.MOTION_X]: 0, + [SENSOR_LIST.MOTION_Y]: 0, + [SENSOR_LIST.MOTION_Z]: 0, + }, + currentSelectedGesture: GESTURES_MICROBIT[0], +}; + +export class Microbit extends React.Component<{}, IState> { + state = DEFAULT_STATE; + + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } + + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + handleMessage = (event: any): void => { + const message = event.data; + + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.RESET: + this.setState({ ...DEFAULT_STATE }); + break; + } + }; + render() { + return ( + + + + + ); + } + updateSensor = (sensor: SENSOR_LIST, value: number) => { + this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); + }; + updateGesture = (event: React.ChangeEvent) => { + this.setState({ currentSelectedGesture: event.target.value }); + }; + sendGesture = (isActive: boolean) => { + if (this.state.currentSelectedGesture) { + if (isActive) { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: this.state.currentSelectedGesture, + }); + } else { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: "", + }); + } + } + }; +} + +const MICROBIT_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ + { + image: TOOLBAR_SVG.PUSH_BUTTON_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, + }, + { + image: TOOLBAR_SVG.RED_LED_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.LEDS, + }, + { + image: TOOLBAR_SVG.TEMPERATURE_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, + }, + { + image: TOOLBAR_SVG.LIGHT_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, + }, + { + image: TOOLBAR_SVG.MOTION_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, + }, + { + image: TOOLBAR_SVG.GESTURE_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.GESTURE, + }, + { + image: TOOLBAR_SVG.GPIO_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.GPIO, + }, + { + image: TOOLBAR_SVG.COMPASS_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.COMPASS, + }, + { + image: TOOLBAR_SVG.SPEAKER_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.SOUND, + }, + { + image: TOOLBAR_SVG.WIRELESS_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.WIRELESS, + }, +]; diff --git a/src/view/components/microbit/MicrobitImage.tsx b/src/view/components/microbit/MicrobitImage.tsx index a216dceef..18515a425 100644 --- a/src/view/components/microbit/MicrobitImage.tsx +++ b/src/view/components/microbit/MicrobitImage.tsx @@ -1,166 +1,166 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { BUTTON_CLASSNAME, VIEW_STATE } from "../../constants"; -import CONSTANTS, { BUTTON_STYLING_CLASSES } from "../../constants"; -import { ViewStateContext } from "../../context"; -import { IRefObject, MicrobitSvg } from "./Microbit_svg"; - -interface EventTriggers { - onMouseUp: (event: Event, buttonKey: string) => void; - onMouseDown: (event: Event, buttonKey: string) => void; - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; -} -interface IProps { - eventTriggers: EventTriggers; - leds: number[][]; -} - -export enum BUTTONS_KEYS { - BTN_A = "BTN_A", - BTN_B = "BTN_B", - BTN_AB = "BTN_AB", -} -// Displays the SVG and call necessary svg modification. -export class MicrobitImage extends React.Component { - private svgRef: React.RefObject = React.createRef(); - constructor(props: IProps) { - super(props); - } - componentDidMount() { - const svgElement = this.svgRef.current; - if (svgElement) { - updateAllLeds(this.props.leds, svgElement.getLeds()); - setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); - this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); - } - } - componentDidUpdate() { - if (this.svgRef.current) { - updateAllLeds(this.props.leds, this.svgRef.current.getLeds()); - if (this.context === VIEW_STATE.PAUSE) { - disableAllButtons(this.svgRef.current.getButtons()); - } else if (this.context === VIEW_STATE.RUNNING) { - setupAllButtons( - this.props.eventTriggers, - this.svgRef.current.getButtons() - ); - } - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.eventTriggers.onKeyEvent(event, true, event.key); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.eventTriggers.onKeyEvent(event, false, event.key); - }; - render() { - return ; - } - public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { - const button = this.svgRef.current?.getButtons()[key].current; - if (button) { - button.focus(); - if (isActive) { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.KEYPRESSED - ); - } else { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.DEFAULT - ); - } - button.setAttribute("pressed", `${isActive}`); - button.setAttribute("aria-pressed", `${isActive}`); - } - } -} - -MicrobitImage.contextType = ViewStateContext; -const setupButton = ( - buttonElement: SVGRectElement, - eventTriggers: EventTriggers, - key: string -) => { - buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); - - buttonElement.onmousedown = e => { - buttonElement.focus(); - eventTriggers.onMouseDown(e, key); - }; - buttonElement.onmouseup = e => { - eventTriggers.onMouseUp(e, key); - }; - - buttonElement.onkeydown = e => { - // ensure that the keydown is enter, - // or else it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - eventTriggers.onKeyEvent(e, true, key); - } - }; - buttonElement.onkeyup = e => { - eventTriggers.onKeyEvent(e, false, key); - }; -}; -const setupAllButtons = ( - eventTriggers: EventTriggers, - buttonRefs: IRefObject -) => { - for (const [key, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - setupButton(ref.current, eventTriggers, key); - } - } -}; -const disableAllButtons = (buttonRefs: IRefObject) => { - for (const [, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - // to implement - ref.current.onmousedown = null; - ref.current.onmouseup = null; - ref.current.onkeydown = null; - ref.current.onkeyup = null; - ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); - } - } -}; -const updateAllLeds = ( - leds: number[][], - ledRefs: Array>> -) => { - for (let j = 0; j < leds.length; j++) { - for (let i = 0; i < leds[0].length; i++) { - const ledElement = ledRefs[j][i].current; - if (ledElement) { - setupLed(ledElement, leds[i][j]); - } - } - } -}; -const setupLed = (ledElement: SVGRectElement, brightness: number) => { - ledElement.style.opacity = (brightness / 10).toString(); -}; +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import * as React from "react"; +import { BUTTON_CLASSNAME, VIEW_STATE } from "../../constants"; +import CONSTANTS, { BUTTON_STYLING_CLASSES } from "../../constants"; +import { ViewStateContext } from "../../context"; +import { IRefObject, MicrobitSvg } from "./Microbit_svg"; + +interface EventTriggers { + onMouseUp: (event: Event, buttonKey: string) => void; + onMouseDown: (event: Event, buttonKey: string) => void; + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; +} +interface IProps { + eventTriggers: EventTriggers; + leds: number[][]; +} + +export enum BUTTONS_KEYS { + BTN_A = "BTN_A", + BTN_B = "BTN_B", + BTN_AB = "BTN_AB", +} +// Displays the SVG and call necessary svg modification. +export class MicrobitImage extends React.Component { + private svgRef: React.RefObject = React.createRef(); + constructor(props: IProps) { + super(props); + } + componentDidMount() { + const svgElement = this.svgRef.current; + if (svgElement) { + updateAllLeds(this.props.leds, svgElement.getLeds()); + setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); + this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); + } + } + componentDidUpdate() { + if (this.svgRef.current) { + updateAllLeds(this.props.leds, this.svgRef.current.getLeds()); + if (this.context === VIEW_STATE.PAUSE) { + disableAllButtons(this.svgRef.current.getButtons()); + } else if (this.context === VIEW_STATE.RUNNING) { + setupAllButtons( + this.props.eventTriggers, + this.svgRef.current.getButtons() + ); + } + } + } + componentWillUnmount() { + window.document.removeEventListener("keydown", this.handleKeyDown); + window.document.removeEventListener("keyup", this.handleKeyUp); + } + setupKeyPresses = ( + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void + ) => { + window.document.addEventListener("keydown", this.handleKeyDown); + window.document.addEventListener("keyup", this.handleKeyUp); + }; + handleKeyDown = (event: KeyboardEvent) => { + const keyEvents = [event.key, event.code]; + // Don't listen to keydown events for the run button, restart button and enter key + if ( + !( + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) + ) + ) { + this.props.eventTriggers.onKeyEvent(event, true, event.key); + } + }; + handleKeyUp = (event: KeyboardEvent) => { + this.props.eventTriggers.onKeyEvent(event, false, event.key); + }; + render() { + return ; + } + public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { + const button = this.svgRef.current?.getButtons()[key].current; + if (button) { + button.focus(); + if (isActive) { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.KEYPRESSED + ); + } else { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.DEFAULT + ); + } + button.setAttribute("pressed", `${isActive}`); + button.setAttribute("aria-pressed", `${isActive}`); + } + } +} + +MicrobitImage.contextType = ViewStateContext; +const setupButton = ( + buttonElement: SVGRectElement, + eventTriggers: EventTriggers, + key: string +) => { + buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); + + buttonElement.onmousedown = (e) => { + buttonElement.focus(); + eventTriggers.onMouseDown(e, key); + }; + buttonElement.onmouseup = (e) => { + eventTriggers.onMouseUp(e, key); + }; + + buttonElement.onkeydown = (e) => { + // ensure that the keydown is enter, + // or else it may register shortcuts twice + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + eventTriggers.onKeyEvent(e, true, key); + } + }; + buttonElement.onkeyup = (e) => { + eventTriggers.onKeyEvent(e, false, key); + }; +}; +const setupAllButtons = ( + eventTriggers: EventTriggers, + buttonRefs: IRefObject +) => { + for (const [key, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + setupButton(ref.current, eventTriggers, key); + } + } +}; +const disableAllButtons = (buttonRefs: IRefObject) => { + for (const [, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + // to implement + ref.current.onmousedown = null; + ref.current.onmouseup = null; + ref.current.onkeydown = null; + ref.current.onkeyup = null; + ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); + } + } +}; +const updateAllLeds = ( + leds: number[][], + ledRefs: Array>> +) => { + for (let j = 0; j < leds.length; j++) { + for (let i = 0; i < leds[0].length; i++) { + const ledElement = ledRefs[j][i].current; + if (ledElement) { + setupLed(ledElement, leds[i][j]); + } + } + } +}; +const setupLed = (ledElement: SVGRectElement, brightness: number) => { + ledElement.style.opacity = (brightness / 10).toString(); +}; diff --git a/src/view/components/microbit/MicrobitSimulator.tsx b/src/view/components/microbit/MicrobitSimulator.tsx index d3507710c..3ef219459 100644 --- a/src/view/components/microbit/MicrobitSimulator.tsx +++ b/src/view/components/microbit/MicrobitSimulator.tsx @@ -1,259 +1,259 @@ -import * as React from "react"; -import { - AB_BUTTONS_KEYS, - CONSTANTS, - DEVICE_LIST_KEY, - VIEW_STATE, - WEBVIEW_MESSAGES, -} from "../../constants"; -import { ViewStateContext } from "../../context"; -import PlayLogo from "../../svgs/play_svg"; -import StopLogo from "../../svgs/stop_svg"; -import { sendMessage } from "../../utils/MessageUtils"; -import ActionBar from "../simulator/ActionBar"; -import { BUTTONS_KEYS, MicrobitImage } from "./MicrobitImage"; - -const DEFAULT_MICROBIT_STATE: IMicrobitState = { - leds: [ - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - ], - buttons: { button_a: false, button_b: false }, -}; - -interface IState { - active_editors: string[]; - running_file?: string; - currently_selected_file: string; - play_button: boolean; - selected_file: string; - microbit: IMicrobitState; - sendGesture?: (isActive: boolean) => void; -} - -interface IMicrobitState { - leds: number[][]; - buttons: { button_a: boolean; button_b: boolean }; -} -export class MicrobitSimulator extends React.Component { - private imageRef: React.RefObject = React.createRef(); - constructor() { - super({}); - this.state = { - microbit: DEFAULT_MICROBIT_STATE, - play_button: false, - selected_file: "", - active_editors: [], - running_file: undefined, - currently_selected_file: "", - }; - this.onKeyEvent = this.onKeyEvent.bind(this); - } - handleMessage = (event: any): void => { - const message = event.data; - - if (message.active_device !== DEVICE_LIST_KEY.MICROBIT) { - return; - } - - switch (message.command) { - case "reset-state": - this.setState({ - microbit: DEFAULT_MICROBIT_STATE, - play_button: false, - }); - break; - case "set-state": - this.setState({ - microbit: { - ...this.state.microbit, - leds: message.state.leds, - }, - }); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - }); - break; - case "visible-editors": - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } - - break; - } - }; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } - - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
-
- -
- -
- ); - } - - protected togglePlayClick = () => { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - }; - - protected refreshSimulatorClick = () => { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - }; - protected handleButtonClick = (key: string, isActive: boolean) => { - let newButtonState = this.state.microbit.buttons; - switch (key) { - case AB_BUTTONS_KEYS.BTN_A: - newButtonState.button_a = isActive; - break; - case AB_BUTTONS_KEYS.BTN_B: - newButtonState.button_b = isActive; - break; - case AB_BUTTONS_KEYS.BTN_AB: - newButtonState = { - button_a: isActive, - button_b: isActive, - }; - break; - } - sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); - this.setState({ - microbit: { - ...this.state.microbit, - buttons: newButtonState, - }, - }); - }; - - protected onMouseUp = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, false); - }; - - protected onMouseDown = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, true); - }; - - protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { - event.stopPropagation(); - if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(key, active); - if (key === BUTTONS_KEYS.BTN_A) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if (key === BUTTONS_KEYS.BTN_B) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if (key === BUTTONS_KEYS.BTN_AB) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); - - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); - - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); - - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } - } -} -MicrobitSimulator.contextType = ViewStateContext; +import * as React from "react"; +import { + AB_BUTTONS_KEYS, + CONSTANTS, + DEVICE_LIST_KEY, + VIEW_STATE, + WEBVIEW_MESSAGES, +} from "../../constants"; +import { ViewStateContext } from "../../context"; +import PlayLogo from "../../svgs/play_svg"; +import StopLogo from "../../svgs/stop_svg"; +import { sendMessage } from "../../utils/MessageUtils"; +import ActionBar from "../simulator/ActionBar"; +import { BUTTONS_KEYS, MicrobitImage } from "./MicrobitImage"; + +const DEFAULT_MICROBIT_STATE: IMicrobitState = { + leds: [ + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + ], + buttons: { button_a: false, button_b: false }, +}; + +interface IState { + active_editors: string[]; + running_file?: string; + currently_selected_file: string; + play_button: boolean; + selected_file: string; + microbit: IMicrobitState; + sendGesture?: (isActive: boolean) => void; +} + +interface IMicrobitState { + leds: number[][]; + buttons: { button_a: boolean; button_b: boolean }; +} +export class MicrobitSimulator extends React.Component { + private imageRef: React.RefObject = React.createRef(); + constructor() { + super({}); + this.state = { + microbit: DEFAULT_MICROBIT_STATE, + play_button: false, + selected_file: "", + active_editors: [], + running_file: undefined, + currently_selected_file: "", + }; + this.onKeyEvent = this.onKeyEvent.bind(this); + } + handleMessage = (event: any): void => { + const message = event.data; + + if (message.active_device !== DEVICE_LIST_KEY.MICROBIT) { + return; + } + + switch (message.command) { + case "reset-state": + this.setState({ + microbit: DEFAULT_MICROBIT_STATE, + play_button: false, + }); + break; + case "set-state": + this.setState({ + microbit: { + ...this.state.microbit, + leds: message.state.leds, + }, + }); + break; + case "activate-play": + const newRunningFile = this.state.currently_selected_file; + this.setState({ + play_button: !this.state.play_button, + running_file: newRunningFile, + }); + break; + case "visible-editors": + this.setState({ + active_editors: message.state.activePythonEditors, + }); + break; + case "current-file": + if (this.state.play_button) { + this.setState({ + currently_selected_file: message.state.running_file, + }); + } else { + this.setState({ + running_file: message.state.running_file, + currently_selected_file: message.state.running_file, + }); + } + + break; + } + }; + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } + componentWillUnmount() { + window.removeEventListener("message", this.handleMessage); + } + + render() { + const playStopImage = this.state.play_button ? StopLogo : PlayLogo; + const playStopLabel = this.state.play_button ? "stop" : "play"; + return ( +
+
+ {this.state.running_file && this.state.play_button + ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) + : CONSTANTS.FILES_PLACEHOLDER} +
+
+ +
+ +
+ ); + } + + protected togglePlayClick = () => { + const button = + window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || + window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { + selected_file: this.state.selected_file, + state: !this.state.play_button, + }); + }; + + protected refreshSimulatorClick = () => { + const button = window.document.getElementById( + CONSTANTS.ID_NAME.REFRESH_BUTTON + ); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); + }; + protected handleButtonClick = (key: string, isActive: boolean) => { + let newButtonState = this.state.microbit.buttons; + switch (key) { + case AB_BUTTONS_KEYS.BTN_A: + newButtonState.button_a = isActive; + break; + case AB_BUTTONS_KEYS.BTN_B: + newButtonState.button_b = isActive; + break; + case AB_BUTTONS_KEYS.BTN_AB: + newButtonState = { + button_a: isActive, + button_b: isActive, + }; + break; + } + sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); + this.setState({ + microbit: { + ...this.state.microbit, + buttons: newButtonState, + }, + }); + }; + + protected onMouseUp = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, false); + }; + + protected onMouseDown = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, true); + }; + + protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { + event.stopPropagation(); + if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(key, active); + if (key === BUTTONS_KEYS.BTN_A) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active + ); + } else if (key === BUTTONS_KEYS.BTN_B) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active + ); + } else if (key === BUTTONS_KEYS.BTN_AB) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active + ); + } + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); + + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); + + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); + + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active + ); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { + this.togglePlayClick(); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { + this.refreshSimulatorClick(); + } + } +} +MicrobitSimulator.contextType = ViewStateContext; diff --git a/src/view/components/microbit/Microbit_svg.tsx b/src/view/components/microbit/Microbit_svg.tsx index c3d95fdbb..fd2ea1ca5 100644 --- a/src/view/components/microbit/Microbit_svg.tsx +++ b/src/view/components/microbit/Microbit_svg.tsx @@ -1,1890 +1,1809 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Adapted from : https://makecode.microbit.org/#editor - -import * as React from "react"; -import "../../styles/SimulatorSvg.css"; - -export interface IRefObject { - [key: string]: React.RefObject; -} -/* tslint:disable */ - -const N_LED_COLUMN = 5; -const N_LED_ROW = 5; -export class MicrobitSvg extends React.Component { - constructor(props: Readonly<{}>) { - super(props); - for (let j = 0; j < N_LED_ROW; j++) { - const led_row: React.RefObject[] = []; - for (let i = 0; i < N_LED_COLUMN; i++) { - led_row.push(React.createRef()); - } - this.ledRefs.push(led_row); - } - } - private svgRef: React.RefObject = React.createRef(); - - private buttonRefs: IRefObject = { - BTN_A: React.createRef(), - BTN_B: React.createRef(), - BTN_AB: React.createRef(), - }; - - private ledRefs: React.RefObject[][] = []; - public getSvgRef(): React.RefObject { - return this.svgRef; - } - public getButtons(): IRefObject { - return this.buttonRefs; - } - public getLeds(): React.RefObject[][] { - return this.ledRefs; - } - - render() { - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (0,0) - - - - (1,0) - - - - (2,0) - - - - (3,0) - - - - (4,0) - - - - (0,1) - - - - (1,1) - - - - (2,1) - - - - (3,1) - - - - (4,1) - - - - (0,2) - - - - (1,2) - - - - (2,2) - - - - (3,2) - - - - (4,2) - - - - (0,3) - - - - (1,3) - - - - (2,3) - - - - (3,3) - - - - (4,3) - - - - (0,4) - - - - (1,4) - - - - (2,4) - - - - (3,4) - - - - (4,4) - - - - - - - - - - P0, ANALOG IN - - - P1, ANALOG IN - - - P2, ANALOG IN - - - P3, ANALOG IN, LED Col 1 - - - P4, ANALOG IN, LED Col 2 - - - P5, BUTTON A - - - P6, LED Col 9 - - - P7, LED Col 8 - - - P8 - - - P9, LED Col 7 - - - P10, ANALOG IN, LED Col 3 - - - P11, BUTTON B - - - P12, RESERVED ACCESSIBILITY - - - P13, SPI - SCK - - - P14, SPI - MISO - - - P15, SPI - MOSI - - - P16, SPI - Chip Select - - - P17, +3v3 - - - P18, +3v3 - - - P19, I2C - SCL - - - P20, I2C - SDA - - - GND - - - GND - - - +3v3 - - - GND - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - - - - - - - - - - - - - - -
- ); - } -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +// Adapted from : https://makecode.microbit.org/#editor + +import * as React from "react"; +import "../../styles/SimulatorSvg.css"; + +export interface IRefObject { + [key: string]: React.RefObject; +} +/* tslint:disable */ + +const N_LED_COLUMN = 5; +const N_LED_ROW = 5; +export class MicrobitSvg extends React.Component { + constructor(props: Readonly<{}>) { + super(props); + for (let j = 0; j < N_LED_ROW; j++) { + const led_row: React.RefObject[] = []; + for (let i = 0; i < N_LED_COLUMN; i++) { + led_row.push(React.createRef()); + } + this.ledRefs.push(led_row); + } + } + private svgRef: React.RefObject = React.createRef(); + + private buttonRefs: IRefObject = { + BTN_A: React.createRef(), + BTN_B: React.createRef(), + BTN_AB: React.createRef(), + }; + + private ledRefs: React.RefObject[][] = []; + public getSvgRef(): React.RefObject { + return this.svgRef; + } + public getButtons(): IRefObject { + return this.buttonRefs; + } + public getLeds(): React.RefObject[][] { + return this.ledRefs; + } + + render() { + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (0,0) + + + + (1,0) + + + + (2,0) + + + + (3,0) + + + + (4,0) + + + + (0,1) + + + + (1,1) + + + + (2,1) + + + + (3,1) + + + + (4,1) + + + + (0,2) + + + + (1,2) + + + + (2,2) + + + + (3,2) + + + + (4,2) + + + + (0,3) + + + + (1,3) + + + + (2,3) + + + + (3,3) + + + + (4,3) + + + + (0,4) + + + + (1,4) + + + + (2,4) + + + + (3,4) + + + + (4,4) + + + + + + + + + + P0, ANALOG IN + + + P1, ANALOG IN + + + P2, ANALOG IN + + + P3, ANALOG IN, LED Col 1 + + + P4, ANALOG IN, LED Col 2 + + + P5, BUTTON A + + + P6, LED Col 9 + + + P7, LED Col 8 + + + P8 + + + P9, LED Col 7 + + + P10, ANALOG IN, LED Col 3 + + + P11, BUTTON B + + + P12, RESERVED ACCESSIBILITY + + + P13, SPI - SCK + + + P14, SPI - MISO + + + P15, SPI - MOSI + + + P16, SPI - Chip Select + + + P17, +3v3 + + + P18, +3v3 + + + P19, I2C - SCL + + + P20, I2C - SDA + + + GND + + + GND + + + +3v3 + + + GND + + + + + + + + + + + + + + + + + + + + + + A+B + + + + + + + + + + + + + + + + + + + + + + + +
+ ); + } +} diff --git a/src/view/components/simulator/ActionBar.tsx b/src/view/components/simulator/ActionBar.tsx index b760817b8..151d3758a 100644 --- a/src/view/components/simulator/ActionBar.tsx +++ b/src/view/components/simulator/ActionBar.tsx @@ -7,42 +7,38 @@ import RefreshLogo from "../../svgs/refresh_svg"; import Button from "../Button"; interface IProps { - onTogglePlay: (event: React.MouseEvent) => void; - onToggleRefresh: (event: React.MouseEvent) => void; - playStopImage: JSX.Element; - playStopLabel: string; + onTogglePlay: (event: React.MouseEvent) => void; + onToggleRefresh: (event: React.MouseEvent) => void; + playStopImage: JSX.Element; + playStopLabel: string; } // Component including the actions done on the Simulator (play/stop, refresh) class ActionBar extends React.Component { - public render() { - const { - onTogglePlay, - onToggleRefresh, - playStopImage, - playStopLabel, - } = this.props; - return ( -
-
- ); - } + public render() { + const { onTogglePlay, onToggleRefresh, playStopImage, playStopLabel } = + this.props; + return ( +
+
+ ); + } } export default ActionBar; diff --git a/src/view/components/toolbar/GenericSliderComponent.tsx b/src/view/components/toolbar/GenericSliderComponent.tsx index 273896621..cc46a7930 100644 --- a/src/view/components/toolbar/GenericSliderComponent.tsx +++ b/src/view/components/toolbar/GenericSliderComponent.tsx @@ -1,41 +1,41 @@ -import * as React from "react"; -import { SENSOR_LIST } from "../../constants"; -import { ISensorProps, ISliderProps } from "../../viewUtils"; -import InputSlider from "./InputSlider"; - -interface IProps { - axisProperties: ISensorProps; - axisValues: { - // key is accessed with axisLabel - [key: string]: number; - }; - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void; -} -export const GenericSliderComponent: React.FC = props => { - return ( -
- {props.axisProperties.sliderProps.map( - (sliderProperties: ISliderProps, index: number) => { - return ( - - -
-
- ); - } - )} -
- ); -}; +import * as React from "react"; +import { SENSOR_LIST } from "../../constants"; +import { ISensorProps, ISliderProps } from "../../viewUtils"; +import InputSlider from "./InputSlider"; + +interface IProps { + axisProperties: ISensorProps; + axisValues: { + // key is accessed with axisLabel + [key: string]: number; + }; + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void; +} +export const GenericSliderComponent: React.FC = (props) => { + return ( +
+ {props.axisProperties.sliderProps.map( + (sliderProperties: ISliderProps, index: number) => { + return ( + + +
+
+ ); + } + )} +
+ ); +}; diff --git a/src/view/components/toolbar/Gesture.tsx b/src/view/components/toolbar/Gesture.tsx index a89a3bd5c..cad53ea8b 100644 --- a/src/view/components/toolbar/Gesture.tsx +++ b/src/view/components/toolbar/Gesture.tsx @@ -1,71 +1,70 @@ -import * as React from "react"; -import { CONSTANTS } from "../../constants"; -import { Dropdown } from "../Dropdown"; -import SensorButton from "./SensorButton"; - -const GESTURE_BUTTON_MESSAGE = "Send Gesture"; -interface IProps { - gestures: string[]; - onSelectGestures?: (event: React.ChangeEvent) => void; - onSendGesture?: (isActive: boolean) => void; -} -export class Gesture extends React.Component { - private sensorButtonRef: React.RefObject = React.createRef(); - render() { - return ( -
- - { - if (this.props.onSendGesture) { - this.props.onSendGesture(true); - } - }} - onMouseUp={() => { - if (this.props.onSendGesture) { - this.props.onSendGesture(false); - } - }} - onKeyDown={this.handleOnKeyDown} - onKeyUp={this.handleOnKeyUp} - type="gesture" - /> -
- ); - } - private handleOnKeyDown = (e: React.KeyboardEvent) => { - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - this.sensorButtonRef!.current!.setButtonClass(true); - if (this.props.onSendGesture) { - this.props.onSendGesture(true); - } - } - }; - - private handleOnKeyUp = ( - e: React.KeyboardEvent, - onSendGesture?: (isActive: boolean) => void - ) => { - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - this.sensorButtonRef!.current!.setButtonClass(false); - - if (this.props.onSendGesture) { - this.props.onSendGesture(false); - } - } - }; -} +import * as React from "react"; +import { CONSTANTS } from "../../constants"; +import { Dropdown } from "../Dropdown"; +import SensorButton from "./SensorButton"; + +const GESTURE_BUTTON_MESSAGE = "Send Gesture"; +interface IProps { + gestures: string[]; + onSelectGestures?: (event: React.ChangeEvent) => void; + onSendGesture?: (isActive: boolean) => void; +} +export class Gesture extends React.Component { + private sensorButtonRef: React.RefObject = React.createRef(); + render() { + return ( +
+ + { + if (this.props.onSendGesture) { + this.props.onSendGesture(true); + } + }} + onMouseUp={() => { + if (this.props.onSendGesture) { + this.props.onSendGesture(false); + } + }} + onKeyDown={this.handleOnKeyDown} + onKeyUp={this.handleOnKeyUp} + type="gesture" + /> +
+ ); + } + private handleOnKeyDown = (e: React.KeyboardEvent) => { + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + this.sensorButtonRef!.current!.setButtonClass(true); + if (this.props.onSendGesture) { + this.props.onSendGesture(true); + } + } + }; + + private handleOnKeyUp = ( + e: React.KeyboardEvent, + onSendGesture?: (isActive: boolean) => void + ) => { + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + this.sensorButtonRef!.current!.setButtonClass(false); + + if (this.props.onSendGesture) { + this.props.onSendGesture(false); + } + } + }; +} diff --git a/src/view/components/toolbar/InputSlider.tsx b/src/view/components/toolbar/InputSlider.tsx index adfbcef60..db78f58d3 100644 --- a/src/view/components/toolbar/InputSlider.tsx +++ b/src/view/components/toolbar/InputSlider.tsx @@ -9,122 +9,122 @@ import { sendMessage } from "../../utils/MessageUtils"; import { ISliderProps } from "../../viewUtils"; class InputSlider extends React.Component { - constructor(props: ISliderProps) { - super(props); - this.state = { - value: this.props.value, - }; + constructor(props: ISliderProps) { + super(props); + this.state = { + value: this.props.value, + }; - this.handleOnChange = this.handleOnChange.bind(this); - this.validateRange = this.validateRange.bind(this); - } + this.handleOnChange = this.handleOnChange.bind(this); + this.validateRange = this.validateRange.bind(this); + } - render() { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; + render() { + const isInputDisabled = this.context === VIEW_STATE.PAUSE; - const nbDecimals = - this.props.step.toString().split(".")[1]?.length || 0; - return ( -
- {this.props.axisLabel} - 0 ? 1 : 0}}[0-9]{0,${nbDecimals}}$`} - onKeyUp={this.handleOnChange} - style={{ width: this.getMaximumBoxWidth() + "ch" }} - aria-label={`${this.props.type} sensor input ${this.props.axisLabel}`} - /> - - - {this.props.minValue} - {this.props.maxValue} - - - - {this.props.minLabel} - {this.props.maxLabel} - - -
- ); - } + const nbDecimals = + this.props.step.toString().split(".")[1]?.length || 0; + return ( +
+ {this.props.axisLabel} + 0 ? 1 : 0}}[0-9]{0,${nbDecimals}}$`} + onKeyUp={this.handleOnChange} + style={{ width: this.getMaximumBoxWidth() + "ch" }} + aria-label={`${this.props.type} sensor input ${this.props.axisLabel}`} + /> + + + {this.props.minValue} + {this.props.maxValue} + + + + {this.props.minLabel} + {this.props.maxLabel} + + +
+ ); + } - private getMaximumBoxWidth = () => { - return ( - Math.max( - this.props.minValue.toString().length, - this.props.maxValue.toString().length - ) + 2 - ); - }; + private getMaximumBoxWidth = () => { + return ( + Math.max( + this.props.minValue.toString().length, + this.props.maxValue.toString().length + ) + 2 + ); + }; - private handleOnChange = (event: any) => { - const validatedValue = this.validateRange(this.updateValue(event)); - const newSensorState = this.writeMessage(validatedValue); - if (newSensorState) { - sendMessage(WEBVIEW_MESSAGES.SENSOR_CHANGED, newSensorState); - } - }; + private handleOnChange = (event: any) => { + const validatedValue = this.validateRange(this.updateValue(event)); + const newSensorState = this.writeMessage(validatedValue); + if (newSensorState) { + sendMessage(WEBVIEW_MESSAGES.SENSOR_CHANGED, newSensorState); + } + }; - private writeMessage = (valueTowrite: number) => { - let value = valueTowrite; - if (value > this.props.maxValue || value < this.props.minValue) { - value = parseInt(this.state.value, 10); - } + private writeMessage = (valueTowrite: number) => { + let value = valueTowrite; + if (value > this.props.maxValue || value < this.props.minValue) { + value = parseInt(this.state.value, 10); + } - return this.props.type && this.state.value !== undefined - ? { [this.props.type]: value } - : undefined; - }; + return this.props.type && this.state.value !== undefined + ? { [this.props.type]: value } + : undefined; + }; - private updateValue = (event: any) => { - const newValue = event.target.validity.valid - ? event.target.value - : this.state.value; - if (this.props.onUpdateValue) { - this.props.onUpdateValue(this.props.type as SENSOR_LIST, newValue); - } - return newValue; - }; + private updateValue = (event: any) => { + const newValue = event.target.validity.valid + ? event.target.value + : this.state.value; + if (this.props.onUpdateValue) { + this.props.onUpdateValue(this.props.type as SENSOR_LIST, newValue); + } + return newValue; + }; - private sendTelemetry = () => { - sendMessage(WEBVIEW_MESSAGES.SLIDER_TELEMETRY, this.props.type); - }; + private sendTelemetry = () => { + sendMessage(WEBVIEW_MESSAGES.SLIDER_TELEMETRY, this.props.type); + }; - private validateRange = (valueString: string) => { - let valueInt = parseFloat(valueString); - if (valueInt < this.props.minValue) { - valueInt = this.props.minValue; - this.setState({ value: valueInt }); - } else if (valueInt > this.props.maxValue) { - valueInt = this.props.maxValue; - this.setState({ value: valueInt }); - } - return valueInt; - }; + private validateRange = (valueString: string) => { + let valueInt = parseFloat(valueString); + if (valueInt < this.props.minValue) { + valueInt = this.props.minValue; + this.setState({ value: valueInt }); + } else if (valueInt > this.props.maxValue) { + valueInt = this.props.maxValue; + this.setState({ value: valueInt }); + } + return valueInt; + }; } InputSlider.contextType = ViewStateContext; diff --git a/src/view/components/toolbar/SensorButton.tsx b/src/view/components/toolbar/SensorButton.tsx index b50759bd4..efd22eb96 100644 --- a/src/view/components/toolbar/SensorButton.tsx +++ b/src/view/components/toolbar/SensorButton.tsx @@ -8,39 +8,38 @@ import "../../styles/SensorButton.css"; import { ISensorButtonProps } from "../../viewUtils"; class SensorButton extends React.Component { - private buttonRef: React.RefObject = React.createRef(); + private buttonRef: React.RefObject = React.createRef(); - public setButtonClass = (isActive: boolean) => { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; + public setButtonClass = (isActive: boolean) => { + const isInputDisabled = this.context === VIEW_STATE.PAUSE; - if (isActive && !isInputDisabled) { - this.buttonRef.current?.setAttribute( - "class", - "sensor-button active-button" - ); - } else if (this.buttonRef.current) { - this.buttonRef!.current!.setAttribute("class", "sensor-button"); - } - }; - render() { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; + if (isActive && !isInputDisabled) { + this.buttonRef.current?.setAttribute( + "class", + "sensor-button active-button" + ); + } else if (this.buttonRef.current) { + this.buttonRef!.current!.setAttribute("class", "sensor-button"); + } + }; + render() { + const isInputDisabled = this.context === VIEW_STATE.PAUSE; - return ( - - ); - } + return ( + + ); + } } SensorButton.contextType = ViewStateContext; export default SensorButton; diff --git a/src/view/components/toolbar/SensorModalUtils.tsx b/src/view/components/toolbar/SensorModalUtils.tsx index c7ea53f85..57a491960 100644 --- a/src/view/components/toolbar/SensorModalUtils.tsx +++ b/src/view/components/toolbar/SensorModalUtils.tsx @@ -8,169 +8,167 @@ import * as CPX_MODAL from "./cpx/CpxModalContent"; import * as MICROBIT_MODAL from "./microbit/MicrobitModalContent"; export const TRY_IT_MAKE_CODE = ( - + ); export const FEATURE_REQUEST_ON_GITHUB = ( - + ); export const TOOLBAR_ICON_LABEL = { - GPIO: "GPIO", - IR: "IR", - LEFT_EDGE: "left-edge", - LIGHT: "Light sensor", - MOTION: "Motion Sensor", - NEO_PIXEL: "Neo Pixels", - PUSH_BUTTON: "Push Button", - RED_LED: "Red LED", - RIGHT_EDGE: "right-edge", - SOUND: "Sound Sensor", - SPEAKER: "Speaker", - SWITCH: "Switch", - TAG_INPUT: "Tag Input", - TAG_OUTPUT: "Tag Output", - TEMPERATURE: "Temperature Sensor", - WIRELESS: "Bluetooth and Radio", + GPIO: "GPIO", + IR: "IR", + LEFT_EDGE: "left-edge", + LIGHT: "Light sensor", + MOTION: "Motion Sensor", + NEO_PIXEL: "Neo Pixels", + PUSH_BUTTON: "Push Button", + RED_LED: "Red LED", + RIGHT_EDGE: "right-edge", + SOUND: "Sound Sensor", + SPEAKER: "Speaker", + SWITCH: "Switch", + TAG_INPUT: "Tag Input", + TAG_OUTPUT: "Tag Output", + TEMPERATURE: "Temperature Sensor", + WIRELESS: "Bluetooth and Radio", }; export const CPX_TOOLBAR_ICON_ID = { - GPIO: "toolbar-gpio", - IR: "toolbar-ir-sensor", - LEFT_EDGE: "left-edge", - LIGHT: "toolbar-light-sensor", - MOTION: "toolbar-motion-sensor", - NEO_PIXEL: "toolbar-neo-pixels", - PUSH_BUTTON: "toolbar-a-b-push", - RED_LED: "toolbar-red-led", - RIGHT_EDGE: "right-edge", - SOUND: "toolbar-sound-sensor", - SPEAKER: "toolbar-speaker", - SWITCH: "toolbar-slider-switch", - TEMPERATURE: "toolbar-temperature-sensor", + GPIO: "toolbar-gpio", + IR: "toolbar-ir-sensor", + LEFT_EDGE: "left-edge", + LIGHT: "toolbar-light-sensor", + MOTION: "toolbar-motion-sensor", + NEO_PIXEL: "toolbar-neo-pixels", + PUSH_BUTTON: "toolbar-a-b-push", + RED_LED: "toolbar-red-led", + RIGHT_EDGE: "right-edge", + SOUND: "toolbar-sound-sensor", + SPEAKER: "toolbar-speaker", + SWITCH: "toolbar-slider-switch", + TEMPERATURE: "toolbar-temperature-sensor", }; export const MICROBIT_TOOLBAR_ICON_ID = { - TEMPERATURE: "toolbar-microbit-temperature-sensor", - LIGHT: "toolbar-microbit-light-sensor", - ACCELEROMETER: "toolbar-accelerometer-sensor", - LEDS: "toolbar-microbit-led", - PUSH_BUTTON: "toolbar-microbit-a-b-push", - GPIO: "toolbar-gpio", - SOUND: "toolbar-microbit-sound", - WIRELESS: "toolbar-microbit-wireless", - GESTURE: "toolbar-microbit-gesture-sensor", - COMPASS: "toolbar-microbit-compass-sensor", + TEMPERATURE: "toolbar-microbit-temperature-sensor", + LIGHT: "toolbar-microbit-light-sensor", + ACCELEROMETER: "toolbar-accelerometer-sensor", + LEDS: "toolbar-microbit-led", + PUSH_BUTTON: "toolbar-microbit-a-b-push", + GPIO: "toolbar-gpio", + SOUND: "toolbar-microbit-sound", + WIRELESS: "toolbar-microbit-wireless", + GESTURE: "toolbar-microbit-gesture-sensor", + COMPASS: "toolbar-microbit-compass-sensor", }; export const CLUE_TOOLBAR_ICON_ID = { - TEMPERATURE: "toolbar-clue-temperature-sensor", - LIGHT: "toolbar-clue-light-sensor", - ACCELEROMETER: "toolbar-clue-accelerometer-sensor", - LEDS: "toolbar-clue-led", - PUSH_BUTTON: "toolbar-clue-a-b-push", - GPIO: "toolbar-clue-gpio", - SPEAKER: "toolbar-speaker", - SOUND: "toolbar-clue-sound-sensor", - PRESSURE: "toolbar-clue-pressure-sensor", - HUMIDITY: "toolbar-clue-humidity-sensor", - GESTURE: "toolbar-clue-gesture-sensor", - PROXIMITY: "toolbar-clue-proximity-sensor", - BLUETOOTH: "toolbar-clue-bluetooth", - MAGNETOSCOPE: "toolbar-clue-magnet-sensor", - GYROSCOPE: "toolbar-clue-gyroscope-sensor", + TEMPERATURE: "toolbar-clue-temperature-sensor", + LIGHT: "toolbar-clue-light-sensor", + ACCELEROMETER: "toolbar-clue-accelerometer-sensor", + LEDS: "toolbar-clue-led", + PUSH_BUTTON: "toolbar-clue-a-b-push", + GPIO: "toolbar-clue-gpio", + SPEAKER: "toolbar-speaker", + SOUND: "toolbar-clue-sound-sensor", + PRESSURE: "toolbar-clue-pressure-sensor", + HUMIDITY: "toolbar-clue-humidity-sensor", + GESTURE: "toolbar-clue-gesture-sensor", + PROXIMITY: "toolbar-clue-proximity-sensor", + BLUETOOTH: "toolbar-clue-bluetooth", + MAGNETOSCOPE: "toolbar-clue-magnet-sensor", + GYROSCOPE: "toolbar-clue-gyroscope-sensor", }; export interface IModalContent { - components: any; - descriptionText: string; - descriptionTitle: string; - id: string; - tagInput: any; - tagOutput: any; - tryItDescription: string; + components: any; + descriptionText: string; + descriptionTitle: string; + id: string; + tagInput: any; + tagOutput: any; + tryItDescription: string; } export const DEFAULT_MODAL_CONTENT: IModalContent = { - descriptionTitle: "default", - tagInput: undefined, - tagOutput: undefined, - descriptionText: "none", - tryItDescription: "none", - components: undefined, - id: "none", + descriptionTitle: "default", + tagInput: undefined, + tagOutput: undefined, + descriptionText: "none", + tryItDescription: "none", + components: undefined, + id: "none", }; export const LABEL_TO_MODAL_CONTENT_CONSTRUCTOR = new Map([ - [CPX_TOOLBAR_ICON_ID.GPIO, CPX_MODAL.GPIO_CONTENT], - [CPX_TOOLBAR_ICON_ID.IR, CPX_MODAL.IR_CONTENT], - [CPX_TOOLBAR_ICON_ID.LIGHT, CPX_MODAL.LIGHT_CONTENT], - [CPX_TOOLBAR_ICON_ID.MOTION, CPX_MODAL.MOTION_CONTENT], - [CPX_TOOLBAR_ICON_ID.NEO_PIXEL, CPX_MODAL.NEOP_CONTENT], - [CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, CPX_MODAL.PUSHB_CONTENT], - [CPX_TOOLBAR_ICON_ID.RED_LED, CPX_MODAL.RED_LED_CONTENT], - [CPX_TOOLBAR_ICON_ID.SOUND, CPX_MODAL.SOUND_CONTENT], - [CPX_TOOLBAR_ICON_ID.SPEAKER, CPX_MODAL.SPEAKER_CONTENT], - [CPX_TOOLBAR_ICON_ID.SWITCH, CPX_MODAL.SWITCH_CONTENT], - [CPX_TOOLBAR_ICON_ID.TEMPERATURE, CPX_MODAL.TEMPERATURE_CONTENT], - [ - MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - MICROBIT_MODAL.ACCELEROMETER_CONTENT, - ], - [MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, MICROBIT_MODAL.TEMPERATURE_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.LIGHT, MICROBIT_MODAL.LIGHT_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.LEDS, MICROBIT_MODAL.LED_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, MICROBIT_MODAL.BUTTON_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.GPIO, MICROBIT_MODAL.GPIO_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.SOUND, MICROBIT_MODAL.SOUND_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.WIRELESS, MICROBIT_MODAL.WIRELESS_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], - [CLUE_TOOLBAR_ICON_ID.TEMPERATURE, CLUE_MODAL.TEMPERATURE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, CLUE_MODAL.BUTTON_CONTENT], - [CLUE_TOOLBAR_ICON_ID.GPIO, CLUE_MODAL.GPIO_CONTENT], - [CLUE_TOOLBAR_ICON_ID.LIGHT, CLUE_MODAL.LIGHT_CONTENT], - [CLUE_TOOLBAR_ICON_ID.LEDS, CLUE_MODAL.LED_CONTENT], - [CLUE_TOOLBAR_ICON_ID.SOUND, CLUE_MODAL.SOUND_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PRESSURE, CLUE_MODAL.PRESSURE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.HUMIDITY, CLUE_MODAL.HUMIDITY_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PROXIMITY, CLUE_MODAL.PROXIMITY_CONTENT], - [CLUE_TOOLBAR_ICON_ID.BLUETOOTH, CLUE_MODAL.BLUETOOTH_CONTENT], - [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.SPEAKER, CLUE_MODAL.SPEAKER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.GYROSCOPE, CLUE_MODAL.GYROSCOPE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, CLUE_MODAL.MAGNETOSCOPE_CONTENT], + [CPX_TOOLBAR_ICON_ID.GPIO, CPX_MODAL.GPIO_CONTENT], + [CPX_TOOLBAR_ICON_ID.IR, CPX_MODAL.IR_CONTENT], + [CPX_TOOLBAR_ICON_ID.LIGHT, CPX_MODAL.LIGHT_CONTENT], + [CPX_TOOLBAR_ICON_ID.MOTION, CPX_MODAL.MOTION_CONTENT], + [CPX_TOOLBAR_ICON_ID.NEO_PIXEL, CPX_MODAL.NEOP_CONTENT], + [CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, CPX_MODAL.PUSHB_CONTENT], + [CPX_TOOLBAR_ICON_ID.RED_LED, CPX_MODAL.RED_LED_CONTENT], + [CPX_TOOLBAR_ICON_ID.SOUND, CPX_MODAL.SOUND_CONTENT], + [CPX_TOOLBAR_ICON_ID.SPEAKER, CPX_MODAL.SPEAKER_CONTENT], + [CPX_TOOLBAR_ICON_ID.SWITCH, CPX_MODAL.SWITCH_CONTENT], + [CPX_TOOLBAR_ICON_ID.TEMPERATURE, CPX_MODAL.TEMPERATURE_CONTENT], + [ + MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, + MICROBIT_MODAL.ACCELEROMETER_CONTENT, + ], + [MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, MICROBIT_MODAL.TEMPERATURE_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.LIGHT, MICROBIT_MODAL.LIGHT_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.LEDS, MICROBIT_MODAL.LED_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, MICROBIT_MODAL.BUTTON_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.GPIO, MICROBIT_MODAL.GPIO_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.SOUND, MICROBIT_MODAL.SOUND_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.WIRELESS, MICROBIT_MODAL.WIRELESS_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], + [CLUE_TOOLBAR_ICON_ID.TEMPERATURE, CLUE_MODAL.TEMPERATURE_CONTENT], + [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], + [CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, CLUE_MODAL.BUTTON_CONTENT], + [CLUE_TOOLBAR_ICON_ID.GPIO, CLUE_MODAL.GPIO_CONTENT], + [CLUE_TOOLBAR_ICON_ID.LIGHT, CLUE_MODAL.LIGHT_CONTENT], + [CLUE_TOOLBAR_ICON_ID.LEDS, CLUE_MODAL.LED_CONTENT], + [CLUE_TOOLBAR_ICON_ID.SOUND, CLUE_MODAL.SOUND_CONTENT], + [CLUE_TOOLBAR_ICON_ID.PRESSURE, CLUE_MODAL.PRESSURE_CONTENT], + [CLUE_TOOLBAR_ICON_ID.HUMIDITY, CLUE_MODAL.HUMIDITY_CONTENT], + [CLUE_TOOLBAR_ICON_ID.PROXIMITY, CLUE_MODAL.PROXIMITY_CONTENT], + [CLUE_TOOLBAR_ICON_ID.BLUETOOTH, CLUE_MODAL.BLUETOOTH_CONTENT], + [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], + [CLUE_TOOLBAR_ICON_ID.SPEAKER, CLUE_MODAL.SPEAKER_CONTENT], + [CLUE_TOOLBAR_ICON_ID.GYROSCOPE, CLUE_MODAL.GYROSCOPE_CONTENT], + [CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, CLUE_MODAL.MAGNETOSCOPE_CONTENT], ]); export const getModalContent = ( - label: string, - onUpdateValue: (onUpdateValue: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number }, - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void + label: string, + onUpdateValue: (onUpdateValue: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, + onSelectGestures?: (event: React.ChangeEvent) => void, + sendGesture?: (isActive: boolean) => void ) => { - if (label === CLUE_TOOLBAR_ICON_ID.GESTURE) { - return CLUE_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); - } else if (label === MICROBIT_TOOLBAR_ICON_ID.GESTURE) { - return MICROBIT_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); - } - const modalContentConstructor = LABEL_TO_MODAL_CONTENT_CONSTRUCTOR.get( - label - ); - if (modalContentConstructor) { - return modalContentConstructor(onUpdateValue, sensorValues); - } else { - return; - } + if (label === CLUE_TOOLBAR_ICON_ID.GESTURE) { + return CLUE_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); + } else if (label === MICROBIT_TOOLBAR_ICON_ID.GESTURE) { + return MICROBIT_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); + } + const modalContentConstructor = + LABEL_TO_MODAL_CONTENT_CONSTRUCTOR.get(label); + if (modalContentConstructor) { + return modalContentConstructor(onUpdateValue, sensorValues); + } else { + return; + } }; diff --git a/src/view/components/toolbar/ToolBar.tsx b/src/view/components/toolbar/ToolBar.tsx index a2a3ee1a2..9bdd48ae5 100644 --- a/src/view/components/toolbar/ToolBar.tsx +++ b/src/view/components/toolbar/ToolBar.tsx @@ -5,217 +5,215 @@ import { Callout, TooltipHost } from "office-ui-fabric-react"; import { IconButton } from "office-ui-fabric-react"; import * as React from "react"; import { - FormattedMessage, - injectIntl, - WrappedComponentProps, + FormattedMessage, + injectIntl, + WrappedComponentProps, } from "react-intl"; import { SENSOR_LIST } from "../../constants"; import "../../styles/ToolBar.css"; import Button from "../Button"; import { - DEFAULT_MODAL_CONTENT, - getModalContent, - IModalContent, + DEFAULT_MODAL_CONTENT, + getModalContent, + IModalContent, } from "./SensorModalUtils"; interface IToolbarState { - currentOpenedId: string; - showModal: boolean; - isDescriptionVisible: boolean; + currentOpenedId: string; + showModal: boolean; + isDescriptionVisible: boolean; } interface IProps extends WrappedComponentProps { - buttonList: Array<{ - label: any; - image: any; - }>; - onUpdateSensor: (sensor: SENSOR_LIST, value: number) => void; - sensorValues: { [key: string]: number }; - onSelectGesture?: (event: React.ChangeEvent) => void; - sendGesture?: (isActive: boolean) => void; + buttonList: Array<{ + label: any; + image: any; + }>; + onUpdateSensor: (sensor: SENSOR_LIST, value: number) => void; + sensorValues: { [key: string]: number }; + onSelectGesture?: (event: React.ChangeEvent) => void; + sendGesture?: (isActive: boolean) => void; } class ToolBar extends React.Component { - private readonly TOOLBAR_BUTTON_WIDTH: number = 32; - - constructor(props: IProps) { - super(props); - initializeIcons(); - this.state = { - currentOpenedId: "", - isDescriptionVisible: false, - showModal: false, - }; - } - - public render() { - const { buttonList } = this.props; - return ( -
-
-
- {buttonList.map( - (currrentButton: any, index: number) => { - return ( - ( - - ), - }} - key={index} - > -
- {this.getIconModal()} -
-
- ); - } - - private handleOnClick = ( - event: React.MouseEvent, - label: string - ) => { - if ( - !this.state.showModal && - this.state.currentOpenedId === "" && - this.state.currentOpenedId !== label - ) { - this.openModal(label); - } else { - this.closeCurrentModal(); - if (this.state.currentOpenedId !== label) { - this.openModal(label); - } - } - }; - - private changePressedState(id: string, pressed: boolean) { - const elt = window.document.getElementById(`${id}-button`); - if (elt) { - pressed - ? elt.classList.add("button-pressed") - : elt.classList.remove("button-pressed"); - } - } - private closeCurrentModal = () => { - this.changePressedState(this.state.currentOpenedId, false); - this.setState({ - currentOpenedId: "", - showModal: false, - }); - }; - - private openModal = (label: string) => { - this.setState({ - currentOpenedId: label, - showModal: true, - }); - this.changePressedState(label, true); - }; - - private onShowDescriptionClicked = (): void => { - this.setState({ - isDescriptionVisible: !this.state.isDescriptionVisible, - }); - }; - - private onDescriptionDismiss = (): void => { - this.setState({ - isDescriptionVisible: false, - }); - }; - - private getIconModal() { - if ( - !this.state.showModal || - !getModalContent( - this.state.currentOpenedId, - this.props.onUpdateSensor, - this.props.sensorValues, - this.props.onSelectGesture, - this.props.sendGesture - ) - ) { - return null; - } - - const content = getModalContent( - this.state.currentOpenedId, - this.props.onUpdateSensor, - this.props.sensorValues, - this.props.onSelectGesture, - this.props.sendGesture - ) as IModalContent; - - const components = content - ? content.components - : DEFAULT_MODAL_CONTENT.components; - - return ( -
-
- - - {content.tagInput} - {content.tagOutput} - - -
-
- {this.state.isDescriptionVisible && ( - -
- -
-
- )} -
-
- - - -
- -
{components}
-
-
- ); - } + private readonly TOOLBAR_BUTTON_WIDTH: number = 32; + + constructor(props: IProps) { + super(props); + initializeIcons(); + this.state = { + currentOpenedId: "", + isDescriptionVisible: false, + showModal: false, + }; + } + + public render() { + const { buttonList } = this.props; + return ( +
+
+
+ {buttonList.map( + (currrentButton: any, index: number) => { + return ( + ( + + ), + }} + key={index}> +
+ {this.getIconModal()} +
+
+ ); + } + + private handleOnClick = ( + event: React.MouseEvent, + label: string + ) => { + if ( + !this.state.showModal && + this.state.currentOpenedId === "" && + this.state.currentOpenedId !== label + ) { + this.openModal(label); + } else { + this.closeCurrentModal(); + if (this.state.currentOpenedId !== label) { + this.openModal(label); + } + } + }; + + private changePressedState(id: string, pressed: boolean) { + const elt = window.document.getElementById(`${id}-button`); + if (elt) { + pressed + ? elt.classList.add("button-pressed") + : elt.classList.remove("button-pressed"); + } + } + private closeCurrentModal = () => { + this.changePressedState(this.state.currentOpenedId, false); + this.setState({ + currentOpenedId: "", + showModal: false, + }); + }; + + private openModal = (label: string) => { + this.setState({ + currentOpenedId: label, + showModal: true, + }); + this.changePressedState(label, true); + }; + + private onShowDescriptionClicked = (): void => { + this.setState({ + isDescriptionVisible: !this.state.isDescriptionVisible, + }); + }; + + private onDescriptionDismiss = (): void => { + this.setState({ + isDescriptionVisible: false, + }); + }; + + private getIconModal() { + if ( + !this.state.showModal || + !getModalContent( + this.state.currentOpenedId, + this.props.onUpdateSensor, + this.props.sensorValues, + this.props.onSelectGesture, + this.props.sendGesture + ) + ) { + return null; + } + + const content = getModalContent( + this.state.currentOpenedId, + this.props.onUpdateSensor, + this.props.sensorValues, + this.props.onSelectGesture, + this.props.sendGesture + ) as IModalContent; + + const components = content + ? content.components + : DEFAULT_MODAL_CONTENT.components; + + return ( +
+
+ + + {content.tagInput} + {content.tagOutput} + + +
+
+ {this.state.isDescriptionVisible && ( + +
+ +
+
+ )} +
+
+ + + +
+ +
{components}
+
+
+ ); + } } export default injectIntl(ToolBar); diff --git a/src/view/components/toolbar/Toolbar.spec.tsx b/src/view/components/toolbar/Toolbar.spec.tsx index bd122082e..cc939e108 100644 --- a/src/view/components/toolbar/Toolbar.spec.tsx +++ b/src/view/components/toolbar/Toolbar.spec.tsx @@ -1,57 +1,57 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { SENSOR_LIST } from "../../constants"; -import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; -import { MICROBIT_TOOLBAR_ICON_ID } from "./SensorModalUtils"; -import Toolbar from "./ToolBar"; - -const MOCK_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - }, -]; -const mockUpdateSensors = () => { - return; -}; -const mockInitialValues = { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, -}; -describe("Toolbar component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); +import * as React from "react"; +import * as ReactDOM from "react-dom"; +import { IntlProvider } from "react-intl"; +import * as testRenderer from "react-test-renderer"; +import { SENSOR_LIST } from "../../constants"; +import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; +import { MICROBIT_TOOLBAR_ICON_ID } from "./SensorModalUtils"; +import Toolbar from "./ToolBar"; + +const MOCK_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ + { + image: TOOLBAR_SVG.LIGHT_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, + }, + { + image: TOOLBAR_SVG.MOTION_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, + }, +]; +const mockUpdateSensors = () => { + return; +}; +const mockInitialValues = { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT]: 0, +}; +describe("Toolbar component ", () => { + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); + + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); +}); diff --git a/src/view/components/toolbar/clue/ClueModalContent.tsx b/src/view/components/toolbar/clue/ClueModalContent.tsx index 250e61388..34a56b1d0 100644 --- a/src/view/components/toolbar/clue/ClueModalContent.tsx +++ b/src/view/components/toolbar/clue/ClueModalContent.tsx @@ -1,318 +1,318 @@ -import * as React from "react"; -import { GESTURES_CLUE, SENSOR_LIST } from "../../../constants"; -import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; -import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; -import { GenericSliderComponent } from "../GenericSliderComponent"; -import { Gesture } from "../Gesture"; -import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; -import * as SENSOR_PROPERTIES from "./ClueSensorProperties"; - -export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-clue-temperature-sensor.description", - descriptionTitle: "toolbar-clue-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-temperature-sensor.tryItDescription", - }; -}; - -export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-gpio.description", - tryItDescription: "toolbar-clue-gpio.tryItDescription", - components: undefined, - id: "GPIO", - }; -}; - -export const ACCELEROMETER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const accelerometerSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-accelerometer-sensor.description", - descriptionTitle: "toolbar-clue-accelerometer-sensor.title", - id: "accelerometer", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-accelerometer-sensor.tryItDescription", - }; -}; -export const GYROSCOPE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const gyroSensorValues = { - X: sensorValues[SENSOR_LIST.GYRO_X], - Y: sensorValues[SENSOR_LIST.GYRO_Y], - Z: sensorValues[SENSOR_LIST.GYRO_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-gyroscope-sensor.description", - descriptionTitle: "toolbar-clue-gyroscope-sensor.title", - id: "gyroscope", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-gyroscope-sensor.tryItDescription", - }; -}; -export const MAGNETOSCOPE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const magnetSensorValues = { - X: sensorValues[SENSOR_LIST.MAGNET_X], - Y: sensorValues[SENSOR_LIST.MAGNET_Y], - Z: sensorValues[SENSOR_LIST.MAGNET_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-magnet-sensor.description", - descriptionTitle: "toolbar-clue-magnet-sensor.title", - id: "magnetoscope", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-magnet-sensor.tryItDescription", - }; -}; - -export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const lightSensorValues = { - R: sensorValues[SENSOR_LIST.LIGHT_R], - G: sensorValues[SENSOR_LIST.LIGHT_G], - B: sensorValues[SENSOR_LIST.LIGHT_B], - C: sensorValues[SENSOR_LIST.LIGHT_C], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-light-sensor.description", - descriptionTitle: "toolbar-clue-light-sensor.title", - id: "light_sensor", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-light-sensor.tryItDescription", - }; -}; - -export const HUMIDITY_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const humiditySensorValues = { - H: sensorValues[SENSOR_LIST.HUMIDITY], - }; - return { - descriptionTitle: "toolbar-clue-humidity-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-humidity-sensor.description", - tryItDescription: "toolbar-clue-humidity-sensor.tryItDescription", - components: [ - , - ], - id: "humidity_sensor", - }; -}; - -export const GESTURE_CONTENT = ( - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-gesture-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-gesture-sensor.description", - tryItDescription: "toolbar-clue-gesture-sensor.tryItDescription", - components: [ - , - ], - id: "gesture_sensor", - }; -}; - -export const PROXIMITY_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const proximitySensorValues = { - P: sensorValues[SENSOR_LIST.PROXIMITY], - }; - return { - descriptionTitle: "toolbar-clue-proximity-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-proximity-sensor.description", - tryItDescription: "toolbar-clue-proximity-sensor.tryItDescription", - components: [ - , - ], - id: "proximity_sensor", - }; -}; - -export const PRESSURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const pressureSensorValues = { - P: sensorValues[SENSOR_LIST.PRESSURE], - }; - return { - descriptionTitle: "toolbar-clue-pressure-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-pressure-sensor.description", - tryItDescription: "toolbar-clue-pressure-sensor.tryItDescription", - components: [ - , - ], - id: "pressure_sensor", - }; -}; - -export const BUTTON_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-a-b-push.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-clue-a-b-push.description", - tryItDescription: "toolbar-clue-a-b-push.tryItDescription", - components: undefined, - id: "microbit_button", - }; -}; - -export const BLUETOOTH_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-bluetooth.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-clue-bluetooth.description", - tryItDescription: "toolbar-clue-bluetooth.tryItDescription", - components: undefined, - id: "bluetooth", - }; -}; - -export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-sound-sensor.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-sound-sensor.description", - tryItDescription: "toolbar-clue-sound-sensor.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "sound_sensor", - }; -}; - -export const LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-led.description", - tryItDescription: "toolbar-clue-led.tryItDescription", - components: undefined, - id: "clue_neopixel", - }; -}; - -export const SPEAKER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-speaker.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-speaker.description", - tryItDescription: "toolbar-speaker.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "speaker", - }; -}; +import * as React from "react"; +import { GESTURES_CLUE, SENSOR_LIST } from "../../../constants"; +import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; +import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; +import { GenericSliderComponent } from "../GenericSliderComponent"; +import { Gesture } from "../Gesture"; +import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; +import * as SENSOR_PROPERTIES from "./ClueSensorProperties"; + +export const TEMPERATURE_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + const temperatureSensorValues = { + T: sensorValues[SENSOR_LIST.TEMPERATURE], + }; + return { + components: [ + , + ], + descriptionText: "toolbar-clue-temperature-sensor.description", + descriptionTitle: "toolbar-clue-temperature-sensor.title", + id: "temperature", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-temperature-sensor.tryItDescription", + }; +}; + +export const GPIO_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-clue-gpio.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-gpio.description", + tryItDescription: "toolbar-clue-gpio.tryItDescription", + components: undefined, + id: "GPIO", + }; +}; + +export const ACCELEROMETER_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + const accelerometerSensorValues = { + X: sensorValues[SENSOR_LIST.MOTION_X], + Y: sensorValues[SENSOR_LIST.MOTION_Y], + Z: sensorValues[SENSOR_LIST.MOTION_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-accelerometer-sensor.description", + descriptionTitle: "toolbar-clue-accelerometer-sensor.title", + id: "accelerometer", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-accelerometer-sensor.tryItDescription", + }; +}; +export const GYROSCOPE_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + const gyroSensorValues = { + X: sensorValues[SENSOR_LIST.GYRO_X], + Y: sensorValues[SENSOR_LIST.GYRO_Y], + Z: sensorValues[SENSOR_LIST.GYRO_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-gyroscope-sensor.description", + descriptionTitle: "toolbar-clue-gyroscope-sensor.title", + id: "gyroscope", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-gyroscope-sensor.tryItDescription", + }; +}; +export const MAGNETOSCOPE_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + const magnetSensorValues = { + X: sensorValues[SENSOR_LIST.MAGNET_X], + Y: sensorValues[SENSOR_LIST.MAGNET_Y], + Z: sensorValues[SENSOR_LIST.MAGNET_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-magnet-sensor.description", + descriptionTitle: "toolbar-clue-magnet-sensor.title", + id: "magnetoscope", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-magnet-sensor.tryItDescription", + }; +}; + +export const LIGHT_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + const lightSensorValues = { + R: sensorValues[SENSOR_LIST.LIGHT_R], + G: sensorValues[SENSOR_LIST.LIGHT_G], + B: sensorValues[SENSOR_LIST.LIGHT_B], + C: sensorValues[SENSOR_LIST.LIGHT_C], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-light-sensor.description", + descriptionTitle: "toolbar-clue-light-sensor.title", + id: "light_sensor", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-light-sensor.tryItDescription", + }; +}; + +export const HUMIDITY_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + const humiditySensorValues = { + H: sensorValues[SENSOR_LIST.HUMIDITY], + }; + return { + descriptionTitle: "toolbar-clue-humidity-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-humidity-sensor.description", + tryItDescription: "toolbar-clue-humidity-sensor.tryItDescription", + components: [ + , + ], + id: "humidity_sensor", + }; +}; + +export const GESTURE_CONTENT = ( + onSelectGestures?: (event: React.ChangeEvent) => void, + sendGesture?: (isActive: boolean) => void +): IModalContent => { + return { + descriptionTitle: "toolbar-clue-gesture-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-gesture-sensor.description", + tryItDescription: "toolbar-clue-gesture-sensor.tryItDescription", + components: [ + , + ], + id: "gesture_sensor", + }; +}; + +export const PROXIMITY_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + const proximitySensorValues = { + P: sensorValues[SENSOR_LIST.PROXIMITY], + }; + return { + descriptionTitle: "toolbar-clue-proximity-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-proximity-sensor.description", + tryItDescription: "toolbar-clue-proximity-sensor.tryItDescription", + components: [ + , + ], + id: "proximity_sensor", + }; +}; + +export const PRESSURE_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + const pressureSensorValues = { + P: sensorValues[SENSOR_LIST.PRESSURE], + }; + return { + descriptionTitle: "toolbar-clue-pressure-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-pressure-sensor.description", + tryItDescription: "toolbar-clue-pressure-sensor.tryItDescription", + components: [ + , + ], + id: "pressure_sensor", + }; +}; + +export const BUTTON_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-clue-a-b-push.title", + tagInput: undefined, + tagOutput: TAG_INPUT_SVG, + descriptionText: "toolbar-clue-a-b-push.description", + tryItDescription: "toolbar-clue-a-b-push.tryItDescription", + components: undefined, + id: "microbit_button", + }; +}; + +export const BLUETOOTH_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-clue-bluetooth.title", + tagInput: undefined, + tagOutput: TAG_INPUT_SVG, + descriptionText: "toolbar-clue-bluetooth.description", + tryItDescription: "toolbar-clue-bluetooth.tryItDescription", + components: undefined, + id: "bluetooth", + }; +}; + +export const SOUND_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-clue-sound-sensor.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-sound-sensor.description", + tryItDescription: "toolbar-clue-sound-sensor.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "sound_sensor", + }; +}; + +export const LED_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-clue-led.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-led.description", + tryItDescription: "toolbar-clue-led.tryItDescription", + components: undefined, + id: "clue_neopixel", + }; +}; + +export const SPEAKER_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-speaker.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-speaker.description", + tryItDescription: "toolbar-speaker.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "speaker", + }; +}; diff --git a/src/view/components/toolbar/clue/ClueSensorProperties.tsx b/src/view/components/toolbar/clue/ClueSensorProperties.tsx index ccb8d8e1b..ad40283f8 100644 --- a/src/view/components/toolbar/clue/ClueSensorProperties.tsx +++ b/src/view/components/toolbar/clue/ClueSensorProperties.tsx @@ -1,216 +1,216 @@ -import { SENSOR_LIST } from "../../../constants"; -import { ISensorProps, ISliderProps } from "../../../viewUtils"; - -const CLUE_SLIDER_R: ISliderProps = { - axisLabel: "R", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_R, - step: 1, -}; - -const CLUE_SLIDER_G: ISliderProps = { - axisLabel: "G", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_G, - step: 1, -}; - -const CLUE_SLIDER_B: ISliderProps = { - axisLabel: "B", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_B, - step: 1, -}; -const CLUE_SLIDER_C: ISliderProps = { - axisLabel: "C", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_C, - step: 1, -}; - -export const CLUE_LIGHT_PROPERTIES: ISensorProps = { - LABEL: "Light Sensor", - sliderProps: [CLUE_SLIDER_R, CLUE_SLIDER_G, CLUE_SLIDER_B, CLUE_SLIDER_C], - unitLabel: "Lux", -}; - -// Range for magnet found here https://www.adafruit.com/product/4479 -const CLUE_MAGNET_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_X, - step: 0.1, -}; -const CLUE_MAGNET_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_Y, - step: 0.1, -}; -const CLUE_MAGNET_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_Z, - step: 0.1, -}; - -export const CLUE_MAGNET_PROPERTIES: ISensorProps = { - LABEL: "Magnetoscope", - sliderProps: [CLUE_MAGNET_X, CLUE_MAGNET_Y, CLUE_MAGNET_Z], - unitLabel: "μT", -}; -const CLUE_GYRO_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_X, - step: 0.1, -}; -const CLUE_GYRO_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_Y, - step: 0.1, -}; -const CLUE_GYRO_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_Z, - step: 0.1, -}; - -export const CLUE_GYRO_PROPERTIES: ISensorProps = { - LABEL: "Gyroscope", - sliderProps: [CLUE_GYRO_X, CLUE_GYRO_Y, CLUE_GYRO_Z], - unitLabel: "deg/s", -}; - -export const CLUE_HUMIDITY_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "H", - maxLabel: "Max", - maxValue: 100, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.HUMIDITY, - step: 0.1, - }, - ], - unitLabel: "%", -}; -export const CLUE__PROXIMITY_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "P", - maxLabel: "Max", - maxValue: 255, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.PROXIMITY, - step: 1, - }, - ], - unitLabel: "", -}; -export const CLUE_PRESSURE_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "P", - maxLabel: "Max", - maxValue: 1100, - minLabel: "Min", - minValue: 800, - type: SENSOR_LIST.PRESSURE, - step: 0.1, - }, - ], - unitLabel: "hPa", -}; -const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 1023, - minLabel: "Left", - minValue: -1023, - type: SENSOR_LIST.MOTION_X, - step: 0.1, -}; - -const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 1023, - minLabel: "Back", - minValue: -1023, - type: SENSOR_LIST.MOTION_Y, - step: 0.1, -}; - -const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 1023, - minLabel: "Up", - minValue: -1023, - type: SENSOR_LIST.MOTION_Z, - step: 0.1, -}; - -export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "m/s2", -}; - -const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 0.1, -}; - -export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", -}; +import { SENSOR_LIST } from "../../../constants"; +import { ISensorProps, ISliderProps } from "../../../viewUtils"; + +const CLUE_SLIDER_R: ISliderProps = { + axisLabel: "R", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_R, + step: 1, +}; + +const CLUE_SLIDER_G: ISliderProps = { + axisLabel: "G", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_G, + step: 1, +}; + +const CLUE_SLIDER_B: ISliderProps = { + axisLabel: "B", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_B, + step: 1, +}; +const CLUE_SLIDER_C: ISliderProps = { + axisLabel: "C", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_C, + step: 1, +}; + +export const CLUE_LIGHT_PROPERTIES: ISensorProps = { + LABEL: "Light Sensor", + sliderProps: [CLUE_SLIDER_R, CLUE_SLIDER_G, CLUE_SLIDER_B, CLUE_SLIDER_C], + unitLabel: "Lux", +}; + +// Range for magnet found here https://www.adafruit.com/product/4479 +const CLUE_MAGNET_X: ISliderProps = { + axisLabel: "X", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.MAGNET_X, + step: 0.1, +}; +const CLUE_MAGNET_Y: ISliderProps = { + axisLabel: "Y", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.MAGNET_Y, + step: 0.1, +}; +const CLUE_MAGNET_Z: ISliderProps = { + axisLabel: "Z", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.MAGNET_Z, + step: 0.1, +}; + +export const CLUE_MAGNET_PROPERTIES: ISensorProps = { + LABEL: "Magnetoscope", + sliderProps: [CLUE_MAGNET_X, CLUE_MAGNET_Y, CLUE_MAGNET_Z], + unitLabel: "μT", +}; +const CLUE_GYRO_X: ISliderProps = { + axisLabel: "X", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.GYRO_X, + step: 0.1, +}; +const CLUE_GYRO_Y: ISliderProps = { + axisLabel: "Y", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.GYRO_Y, + step: 0.1, +}; +const CLUE_GYRO_Z: ISliderProps = { + axisLabel: "Z", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.GYRO_Z, + step: 0.1, +}; + +export const CLUE_GYRO_PROPERTIES: ISensorProps = { + LABEL: "Gyroscope", + sliderProps: [CLUE_GYRO_X, CLUE_GYRO_Y, CLUE_GYRO_Z], + unitLabel: "deg/s", +}; + +export const CLUE_HUMIDITY_PROPERTIES: ISensorProps = { + LABEL: "Humidity Sensor", + sliderProps: [ + { + axisLabel: "H", + maxLabel: "Max", + maxValue: 100, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.HUMIDITY, + step: 0.1, + }, + ], + unitLabel: "%", +}; +export const CLUE__PROXIMITY_PROPERTIES: ISensorProps = { + LABEL: "Humidity Sensor", + sliderProps: [ + { + axisLabel: "P", + maxLabel: "Max", + maxValue: 255, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.PROXIMITY, + step: 1, + }, + ], + unitLabel: "", +}; +export const CLUE_PRESSURE_PROPERTIES: ISensorProps = { + LABEL: "Humidity Sensor", + sliderProps: [ + { + axisLabel: "P", + maxLabel: "Max", + maxValue: 1100, + minLabel: "Min", + minValue: 800, + type: SENSOR_LIST.PRESSURE, + step: 0.1, + }, + ], + unitLabel: "hPa", +}; +const MOTION_SLIDER_PROPS_X: ISliderProps = { + axisLabel: "X", + maxLabel: "Right", + maxValue: 1023, + minLabel: "Left", + minValue: -1023, + type: SENSOR_LIST.MOTION_X, + step: 0.1, +}; + +const MOTION_SLIDER_PROPS_Y: ISliderProps = { + axisLabel: "Y", + maxLabel: "Front", + maxValue: 1023, + minLabel: "Back", + minValue: -1023, + type: SENSOR_LIST.MOTION_Y, + step: 0.1, +}; + +const MOTION_SLIDER_PROPS_Z: ISliderProps = { + axisLabel: "Z", + maxLabel: "Down", + maxValue: 1023, + minLabel: "Up", + minValue: -1023, + type: SENSOR_LIST.MOTION_Z, + step: 0.1, +}; + +export const MOTION_SENSOR_PROPERTIES: ISensorProps = { + LABEL: "Motion sensor", + sliderProps: [ + MOTION_SLIDER_PROPS_X, + MOTION_SLIDER_PROPS_Y, + MOTION_SLIDER_PROPS_Z, + ], + unitLabel: "m/s2", +}; + +const TEMPERATURE_SLIDER_PROPS: ISliderProps = { + axisLabel: "T", + maxLabel: "Hot", + maxValue: 125, + minLabel: "Cold", + minValue: -55, + type: SENSOR_LIST.TEMPERATURE, + step: 0.1, +}; + +export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { + LABEL: "Temperature sensor", + sliderProps: [TEMPERATURE_SLIDER_PROPS], + unitLabel: "°C", +}; diff --git a/src/view/components/toolbar/cpx/CpxModalContent.tsx b/src/view/components/toolbar/cpx/CpxModalContent.tsx index 55166eb2a..669a059ea 100644 --- a/src/view/components/toolbar/cpx/CpxModalContent.tsx +++ b/src/view/components/toolbar/cpx/CpxModalContent.tsx @@ -4,195 +4,195 @@ import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; import { GenericSliderComponent } from "../GenericSliderComponent"; import { - FEATURE_REQUEST_ON_GITHUB, - IModalContent, - TRY_IT_MAKE_CODE, + FEATURE_REQUEST_ON_GITHUB, + IModalContent, + TRY_IT_MAKE_CODE, } from "../SensorModalUtils"; import * as SENSOR_PROPERTIES from "./CpxSensorProperties"; export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-gpio.description", - tryItDescription: "toolbar-gpio.tryItDescription", - components: undefined, - id: "GPIO", - }; + return { + descriptionTitle: "toolbar-gpio.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-gpio.description", + tryItDescription: "toolbar-gpio.tryItDescription", + components: undefined, + id: "GPIO", + }; }; export const IR_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-ir-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-ir-sensor.description", - tryItDescription: "toolbar-ir-sensor.tryItDescription", - components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], - id: "IR", - }; + return { + descriptionTitle: "toolbar-ir-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-ir-sensor.description", + tryItDescription: "toolbar-ir-sensor.tryItDescription", + components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], + id: "IR", + }; }; export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const lightSensorValues = { - L: sensorValues[SENSOR_LIST.LIGHT], - }; - return { - descriptionTitle: "toolbar-light-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-light-sensor.description", - tryItDescription: "toolbar-light-sensor.tryItDescription", - components: [ - , - ], - id: "light_sensor", - }; + const lightSensorValues = { + L: sensorValues[SENSOR_LIST.LIGHT], + }; + return { + descriptionTitle: "toolbar-light-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-light-sensor.description", + tryItDescription: "toolbar-light-sensor.tryItDescription", + components: [ + , + ], + id: "light_sensor", + }; }; export const MOTION_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const motionSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - descriptionTitle: "toolbar-motion-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-motion-sensor.description", - tryItDescription: "toolbar-motion-sensor.tryItDescription", - components: [ - , - TRY_IT_MAKE_CODE, - FEATURE_REQUEST_ON_GITHUB, - ], - id: "motion_sensor", - }; + const motionSensorValues = { + X: sensorValues[SENSOR_LIST.MOTION_X], + Y: sensorValues[SENSOR_LIST.MOTION_Y], + Z: sensorValues[SENSOR_LIST.MOTION_Z], + }; + return { + descriptionTitle: "toolbar-motion-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-motion-sensor.description", + tryItDescription: "toolbar-motion-sensor.tryItDescription", + components: [ + , + TRY_IT_MAKE_CODE, + FEATURE_REQUEST_ON_GITHUB, + ], + id: "motion_sensor", + }; }; export const NEOP_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-neo-pixels.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-neo-pixels.description", - tryItDescription: "toolbar-neo-pixels.tryItDescription", - components: undefined, - id: "neon_pixel", - }; + return { + descriptionTitle: "toolbar-neo-pixels.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-neo-pixels.description", + tryItDescription: "toolbar-neo-pixels.tryItDescription", + components: undefined, + id: "neon_pixel", + }; }; export const PUSHB_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-a-b-push.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-a-b-push.description", - tryItDescription: "toolbar-a-b-push.tryItDescription", - components: undefined, - id: "push_btn", - }; + return { + descriptionTitle: "toolbar-a-b-push.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-a-b-push.description", + tryItDescription: "toolbar-a-b-push.tryItDescription", + components: undefined, + id: "push_btn", + }; }; export const RED_LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-red-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-red-led.description", - tryItDescription: "toolbar-red-led.tryItDescription", - components: undefined, - id: "red_LED", - }; + return { + descriptionTitle: "toolbar-red-led.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-red-led.description", + tryItDescription: "toolbar-red-led.tryItDescription", + components: undefined, + id: "red_LED", + }; }; export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-sound-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-sound-sensor.description", - tryItDescription: "toolbar-sound-sensor.tryItDescription", - components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], - id: "sound_sensor", - }; + return { + descriptionTitle: "toolbar-sound-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-sound-sensor.description", + tryItDescription: "toolbar-sound-sensor.tryItDescription", + components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], + id: "sound_sensor", + }; }; export const SWITCH_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-slider-switch.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-slider-switch.description", - tryItDescription: "toolbar-slider-switch.tryItDescription", - components: undefined, - id: "slider_switch", - }; + return { + descriptionTitle: "toolbar-slider-switch.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-slider-switch.description", + tryItDescription: "toolbar-slider-switch.tryItDescription", + components: undefined, + id: "slider_switch", + }; }; export const SPEAKER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-speaker.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-speaker.description", - tryItDescription: "toolbar-speaker.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "speaker", - }; + return { + descriptionTitle: "toolbar-speaker.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-speaker.description", + tryItDescription: "toolbar-speaker.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "speaker", + }; }; export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-temperature-sensor.description", - descriptionTitle: "toolbar-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-temperature-sensor.tryItDescription", - }; + const temperatureSensorValues = { + T: sensorValues[SENSOR_LIST.TEMPERATURE], + }; + return { + components: [ + , + ], + descriptionText: "toolbar-temperature-sensor.description", + descriptionTitle: "toolbar-temperature-sensor.title", + id: "temperature", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-temperature-sensor.tryItDescription", + }; }; diff --git a/src/view/components/toolbar/cpx/CpxSensorProperties.tsx b/src/view/components/toolbar/cpx/CpxSensorProperties.tsx index f91f91469..478eb36c0 100644 --- a/src/view/components/toolbar/cpx/CpxSensorProperties.tsx +++ b/src/view/components/toolbar/cpx/CpxSensorProperties.tsx @@ -2,70 +2,70 @@ import { SENSOR_LIST } from "../../../constants"; import { ISensorProps, ISliderProps } from "../../../viewUtils"; const LIGHT_SLIDER_PROPS: ISliderProps = { - maxValue: 320, - minValue: 0, - minLabel: "Dark", - maxLabel: "Bright", - type: "light", - axisLabel: "L", - step: 1, + maxValue: 320, + minValue: 0, + minLabel: "Dark", + maxLabel: "Bright", + type: "light", + axisLabel: "L", + step: 1, }; export const LIGHT_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Light sensor", - sliderProps: [LIGHT_SLIDER_PROPS], - unitLabel: "Lux", + LABEL: "Light sensor", + sliderProps: [LIGHT_SLIDER_PROPS], + unitLabel: "Lux", }; const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 0.1, + axisLabel: "T", + maxLabel: "Hot", + maxValue: 125, + minLabel: "Cold", + minValue: -55, + type: SENSOR_LIST.TEMPERATURE, + step: 0.1, }; export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", + LABEL: "Temperature sensor", + sliderProps: [TEMPERATURE_SLIDER_PROPS], + unitLabel: "°C", }; const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 78, - minLabel: "Left", - minValue: -78, - type: SENSOR_LIST.MOTION_X, - step: 1, + axisLabel: "X", + maxLabel: "Right", + maxValue: 78, + minLabel: "Left", + minValue: -78, + type: SENSOR_LIST.MOTION_X, + step: 1, }; const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 78, - minLabel: "Back", - minValue: -78, - type: SENSOR_LIST.MOTION_Y, - step: 1, + axisLabel: "Y", + maxLabel: "Front", + maxValue: 78, + minLabel: "Back", + minValue: -78, + type: SENSOR_LIST.MOTION_Y, + step: 1, }; const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 78, - minLabel: "Up", - minValue: -78, - type: SENSOR_LIST.MOTION_Z, - step: 1, + axisLabel: "Z", + maxLabel: "Down", + maxValue: 78, + minLabel: "Up", + minValue: -78, + type: SENSOR_LIST.MOTION_Z, + step: 1, }; export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "Lux", + LABEL: "Motion sensor", + sliderProps: [ + MOTION_SLIDER_PROPS_X, + MOTION_SLIDER_PROPS_Y, + MOTION_SLIDER_PROPS_Z, + ], + unitLabel: "Lux", }; diff --git a/src/view/components/toolbar/microbit/MicrobitModalContent.tsx b/src/view/components/toolbar/microbit/MicrobitModalContent.tsx index 6d4ae76ef..c0ffe7b5b 100644 --- a/src/view/components/toolbar/microbit/MicrobitModalContent.tsx +++ b/src/view/components/toolbar/microbit/MicrobitModalContent.tsx @@ -1,187 +1,187 @@ -import * as React from "react"; -import { GESTURES_MICROBIT, SENSOR_LIST } from "../../../constants"; -import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; -import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; -import { GenericSliderComponent } from "../GenericSliderComponent"; -import { Gesture } from "../Gesture"; -import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; -import * as SENSOR_PROPERTIES from "./MicrobitSensorProperties"; - -export const ACCELEROMETER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - // this object will be accessed with the axis label - const accelerometerSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-accelerometer-sensor.description", - descriptionTitle: "toolbar-accelerometer-sensor.title", - id: "accelerometer", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-accelerometer-sensor.tryItDescription", - }; -}; -export const LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-led.description", - tryItDescription: "toolbar-microbit-led.tryItDescription", - components: undefined, - id: "microbit_LED", - }; -}; - -export const BUTTON_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-a-b-push.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-microbit-a-b-push.description", - tryItDescription: "toolbar-microbit-a-b-push.tryItDescription", - components: undefined, - id: "microbit_button", - }; -}; -export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-sound.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-sound.description", - tryItDescription: "toolbar-microbit-sound.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_sound", - }; -}; -export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-gpio.description", - tryItDescription: "toolbar-microbit-gpio.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_gpio", - }; -}; -export const COMPASS_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-compass-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-compass-sensor.description", - tryItDescription: "toolbar-microbit-compass-sensor.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_compass", - }; -}; -export const WIRELESS_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-wireless.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-wireless.description", - tryItDescription: "toolbar-microbit-wireless.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_wireless", - }; -}; -export const GESTURE_CONTENT = ( - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-gesture-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-microbit-gesture-sensor.description", - tryItDescription: "toolbar-microbit-gesture-sensor.tryItDescription", - components: [ - , - ], - id: "gesture_sensor", - }; -}; -export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const lightSensorValues = { - L: sensorValues[SENSOR_LIST.LIGHT], - }; - return { - descriptionTitle: "toolbar-light-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-light-sensor.description", - tryItDescription: "toolbar-light-sensor.tryItDescription", - components: [ - , - ], - id: "light_sensor", - }; -}; - -export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-temperature-sensor.description", - descriptionTitle: "toolbar-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-temperature-sensor.tryItDescription", - }; -}; +import * as React from "react"; +import { GESTURES_MICROBIT, SENSOR_LIST } from "../../../constants"; +import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; +import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; +import { GenericSliderComponent } from "../GenericSliderComponent"; +import { Gesture } from "../Gesture"; +import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; +import * as SENSOR_PROPERTIES from "./MicrobitSensorProperties"; + +export const ACCELEROMETER_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + // this object will be accessed with the axis label + const accelerometerSensorValues = { + X: sensorValues[SENSOR_LIST.MOTION_X], + Y: sensorValues[SENSOR_LIST.MOTION_Y], + Z: sensorValues[SENSOR_LIST.MOTION_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-accelerometer-sensor.description", + descriptionTitle: "toolbar-accelerometer-sensor.title", + id: "accelerometer", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-accelerometer-sensor.tryItDescription", + }; +}; +export const LED_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-microbit-led.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-led.description", + tryItDescription: "toolbar-microbit-led.tryItDescription", + components: undefined, + id: "microbit_LED", + }; +}; + +export const BUTTON_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-microbit-a-b-push.title", + tagInput: undefined, + tagOutput: TAG_INPUT_SVG, + descriptionText: "toolbar-microbit-a-b-push.description", + tryItDescription: "toolbar-microbit-a-b-push.tryItDescription", + components: undefined, + id: "microbit_button", + }; +}; +export const SOUND_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-microbit-sound.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-sound.description", + tryItDescription: "toolbar-microbit-sound.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_sound", + }; +}; +export const GPIO_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-microbit-gpio.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-gpio.description", + tryItDescription: "toolbar-microbit-gpio.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_gpio", + }; +}; +export const COMPASS_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-microbit-compass-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-compass-sensor.description", + tryItDescription: "toolbar-microbit-compass-sensor.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_compass", + }; +}; +export const WIRELESS_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + return { + descriptionTitle: "toolbar-microbit-wireless.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-wireless.description", + tryItDescription: "toolbar-microbit-wireless.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_wireless", + }; +}; +export const GESTURE_CONTENT = ( + onSelectGestures?: (event: React.ChangeEvent) => void, + sendGesture?: (isActive: boolean) => void +): IModalContent => { + return { + descriptionTitle: "toolbar-microbit-gesture-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-microbit-gesture-sensor.description", + tryItDescription: "toolbar-microbit-gesture-sensor.tryItDescription", + components: [ + , + ], + id: "gesture_sensor", + }; +}; +export const LIGHT_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + const lightSensorValues = { + L: sensorValues[SENSOR_LIST.LIGHT], + }; + return { + descriptionTitle: "toolbar-light-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-light-sensor.description", + tryItDescription: "toolbar-light-sensor.tryItDescription", + components: [ + , + ], + id: "light_sensor", + }; +}; + +export const TEMPERATURE_CONTENT = ( + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } +): IModalContent => { + const temperatureSensorValues = { + T: sensorValues[SENSOR_LIST.TEMPERATURE], + }; + return { + components: [ + , + ], + descriptionText: "toolbar-temperature-sensor.description", + descriptionTitle: "toolbar-temperature-sensor.title", + id: "temperature", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-temperature-sensor.tryItDescription", + }; +}; diff --git a/src/view/components/toolbar/microbit/MicrobitSensorProperties.tsx b/src/view/components/toolbar/microbit/MicrobitSensorProperties.tsx index c32b00477..4a8974625 100644 --- a/src/view/components/toolbar/microbit/MicrobitSensorProperties.tsx +++ b/src/view/components/toolbar/microbit/MicrobitSensorProperties.tsx @@ -2,73 +2,73 @@ import { SENSOR_LIST } from "../../../constants"; import { ISensorProps, ISliderProps } from "../../../viewUtils"; const LIGHT_SLIDER_PROPS: ISliderProps = { - maxValue: 255, - minValue: 0, - minLabel: "Dark", - maxLabel: "Bright", - type: "light", - axisLabel: "L", - step: 1, + maxValue: 255, + minValue: 0, + minLabel: "Dark", + maxLabel: "Bright", + type: "light", + axisLabel: "L", + step: 1, }; export const LIGHT_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Light sensor", - sliderProps: [LIGHT_SLIDER_PROPS], - unitLabel: "Lux", + LABEL: "Light sensor", + sliderProps: [LIGHT_SLIDER_PROPS], + unitLabel: "Lux", }; const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 1023, - minLabel: "Left", - minValue: -1023, - type: SENSOR_LIST.MOTION_X, - step: 1, + axisLabel: "X", + maxLabel: "Right", + maxValue: 1023, + minLabel: "Left", + minValue: -1023, + type: SENSOR_LIST.MOTION_X, + step: 1, }; const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 1023, - minLabel: "Back", - minValue: -1023, - type: SENSOR_LIST.MOTION_Y, - step: 1, + axisLabel: "Y", + maxLabel: "Front", + maxValue: 1023, + minLabel: "Back", + minValue: -1023, + type: SENSOR_LIST.MOTION_Y, + step: 1, }; const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 1023, - minLabel: "Up", - minValue: -1023, - type: SENSOR_LIST.MOTION_Z, - step: 1, + axisLabel: "Z", + maxLabel: "Down", + maxValue: 1023, + minLabel: "Up", + minValue: -1023, + type: SENSOR_LIST.MOTION_Z, + step: 1, }; export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "m/s2", + LABEL: "Motion sensor", + sliderProps: [ + MOTION_SLIDER_PROPS_X, + MOTION_SLIDER_PROPS_Y, + MOTION_SLIDER_PROPS_Z, + ], + unitLabel: "m/s2", }; const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 1, + axisLabel: "T", + maxLabel: "Hot", + maxValue: 125, + minLabel: "Cold", + minValue: -55, + type: SENSOR_LIST.TEMPERATURE, + step: 1, }; export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", + LABEL: "Temperature sensor", + sliderProps: [TEMPERATURE_SLIDER_PROPS], + unitLabel: "°C", }; diff --git a/src/view/constants.ts b/src/view/constants.ts index 56dda92af..2503ff43c 100644 --- a/src/view/constants.ts +++ b/src/view/constants.ts @@ -3,150 +3,150 @@ // Key events export const CONSTANTS = { - CURRENTLY_RUNNING: (file: string) => { - return `Currently running: ${file}`; - }, - DEVICE_NAME: { - CPX: "CPX", - MICROBIT: "micro:bit", - }, - ID_NAME: { - BUTTON_A: "BTN_A_OUTER", - BUTTON_AB: "BTN_AB_OUTER", - BUTTON_B: "BTN_B_OUTER", - PIN_A1: "PIN_A1", - PIN_A2: "PIN_A2", - PIN_A3: "PIN_A3", - PIN_A4: "PIN_A4", - PIN_A5: "PIN_A5", - PIN_A6: "PIN_A6", - PIN_A7: "PIN_A7", - PLAY_BUTTON: "play-button", - REFRESH_BUTTON: "refresh-button", - STOP_BUTTON: "stop-button", - SWITCH: "SWITCH", - }, - KEYBOARD_KEYS: { - A: "KeyA", - B: "KeyB", - C: "KeyC", - CAPITAL_R: "R", - CAPITAL_F: "F", - ENTER: "Enter", - S: "KeyS", - NUMERIC_ONE: "Digit1", - NUMERIC_TWO: "Digit2", - NUMERIC_THREE: "Digit3", - NUMERIC_FOUR: "Digit4", - NUMERIC_FIVE: "Digit5", - NUMERIC_SIX: "Digit6", - NUMERIC_SEVEN: "Digit7", - }, - FILES_PLACEHOLDER: - "The simulator will run the .py file you have focused on.", - SIMULATOR_BUTTON_WIDTH: 60, - TOOLBAR_INFO: `Explore what's on the board:`, - LED_TINT_FACTOR: 0.5, + CURRENTLY_RUNNING: (file: string) => { + return `Currently running: ${file}`; + }, + DEVICE_NAME: { + CPX: "CPX", + MICROBIT: "micro:bit", + }, + ID_NAME: { + BUTTON_A: "BTN_A_OUTER", + BUTTON_AB: "BTN_AB_OUTER", + BUTTON_B: "BTN_B_OUTER", + PIN_A1: "PIN_A1", + PIN_A2: "PIN_A2", + PIN_A3: "PIN_A3", + PIN_A4: "PIN_A4", + PIN_A5: "PIN_A5", + PIN_A6: "PIN_A6", + PIN_A7: "PIN_A7", + PLAY_BUTTON: "play-button", + REFRESH_BUTTON: "refresh-button", + STOP_BUTTON: "stop-button", + SWITCH: "SWITCH", + }, + KEYBOARD_KEYS: { + A: "KeyA", + B: "KeyB", + C: "KeyC", + CAPITAL_R: "R", + CAPITAL_F: "F", + ENTER: "Enter", + S: "KeyS", + NUMERIC_ONE: "Digit1", + NUMERIC_TWO: "Digit2", + NUMERIC_THREE: "Digit3", + NUMERIC_FOUR: "Digit4", + NUMERIC_FIVE: "Digit5", + NUMERIC_SIX: "Digit6", + NUMERIC_SEVEN: "Digit7", + }, + FILES_PLACEHOLDER: + "The simulator will run the .py file you have focused on.", + SIMULATOR_BUTTON_WIDTH: 60, + TOOLBAR_INFO: `Explore what's on the board:`, + LED_TINT_FACTOR: 0.5, }; export const AB_BUTTONS_KEYS = { - BTN_A: "BTN_A", - BTN_B: "BTN_B", - BTN_AB: "BTN_AB", + BTN_A: "BTN_A", + BTN_B: "BTN_B", + BTN_AB: "BTN_AB", }; export const BUTTON_CLASSNAME = { - ACTIVE: "sim-button-group", - DEACTIVATED: "sim-button-group-deactivated", + ACTIVE: "sim-button-group", + DEACTIVATED: "sim-button-group-deactivated", }; export const BUTTON_STYLING_CLASSES = { - DEFAULT: "sim-button-outer", - KEYPRESSED: "sim-button-key-press", + DEFAULT: "sim-button-outer", + KEYPRESSED: "sim-button-key-press", }; export const CLUE_LEDS_COLORS = { - WHITE_LEDS_OFF: "#ffde00", - WHITE_LEDS_ON: "white", - RED_LED_OFF: "#808080", - RED_LED_ON: "red", + WHITE_LEDS_OFF: "#ffde00", + WHITE_LEDS_ON: "white", + RED_LED_OFF: "#808080", + RED_LED_ON: "red", }; export enum DEVICE_LIST_KEY { - CPX = "CPX", - MICROBIT = "micro:bit", - CLUE = "CLUE", + CPX = "CPX", + MICROBIT = "micro:bit", + CLUE = "CLUE", } // Pauses on Debug mode alter the state of the view export enum VIEW_STATE { - PAUSE = "debug-pause", - RUNNING = "running", + PAUSE = "debug-pause", + RUNNING = "running", } // export enum WEBVIEW_MESSAGES { - SWITCH_DEVICE = "switch-device", - REFRESH_SIMULATOR = "refresh-simulator", - TOGGLE_PLAY_STOP = "toggle-play-stop", - BUTTON_PRESS = "button-press", - SENSOR_CHANGED = "sensor-changed", - GESTURE = "gesture", - SLIDER_TELEMETRY = "slider-telemetry", + SWITCH_DEVICE = "switch-device", + REFRESH_SIMULATOR = "refresh-simulator", + TOGGLE_PLAY_STOP = "toggle-play-stop", + BUTTON_PRESS = "button-press", + SENSOR_CHANGED = "sensor-changed", + GESTURE = "gesture", + SLIDER_TELEMETRY = "slider-telemetry", } export enum VSCODE_MESSAGES_TO_WEBVIEW { - SET_DEVICE = "set-device", - PAUSE_DEVICE = "pause-device", - RUN_DEVICE = "run-device", - RESET = "reset-state", - CURRENT_FILE = "current-file", - SET_STATE = "set-state", + SET_DEVICE = "set-device", + PAUSE_DEVICE = "pause-device", + RUN_DEVICE = "run-device", + RESET = "reset-state", + CURRENT_FILE = "current-file", + SET_STATE = "set-state", } export enum DEBUG_COMMANDS { - STACK_TRACE = "stackTrace", - CONTINUE = "continue", - DISCONNECT = "disconnect", + STACK_TRACE = "stackTrace", + CONTINUE = "continue", + DISCONNECT = "disconnect", } export enum SENSOR_LIST { - TEMPERATURE = "temperature", - LIGHT = "light", - ACCELEROMETER = "accelerometer", - MOTION_X = "motion_x", - MOTION_Y = "motion_y", - MOTION_Z = "motion_z", - LIGHT_R = "light_r", - LIGHT_G = "light_g", - LIGHT_B = "light_b", - LIGHT_C = "light_c", - HUMIDITY = "humidity", - PRESSURE = "pressure", - PROXIMITY = "proximity", - MAGNET_X = "magnet_x", - MAGNET_Y = "magnet_y", - MAGNET_Z = "magnet_z", - GYRO_X = "gyro_x", - GYRO_Y = "gyro_y", - GYRO_Z = "gyro_z", + TEMPERATURE = "temperature", + LIGHT = "light", + ACCELEROMETER = "accelerometer", + MOTION_X = "motion_x", + MOTION_Y = "motion_y", + MOTION_Z = "motion_z", + LIGHT_R = "light_r", + LIGHT_G = "light_g", + LIGHT_B = "light_b", + LIGHT_C = "light_c", + HUMIDITY = "humidity", + PRESSURE = "pressure", + PROXIMITY = "proximity", + MAGNET_X = "magnet_x", + MAGNET_Y = "magnet_y", + MAGNET_Z = "magnet_z", + GYRO_X = "gyro_x", + GYRO_Y = "gyro_y", + GYRO_Z = "gyro_z", } export const GESTURES_MICROBIT = [ - "shake", - "up", - "down", - "left", - "right", - "face up", - "face down", - "freefall", - "3g", - "6g", - "8g", + "shake", + "up", + "down", + "left", + "right", + "face up", + "face down", + "freefall", + "3g", + "6g", + "8g", ]; export const GESTURES_CLUE = ["up", "down", "left", "right", "shake"]; export enum WEBVIEW_ATTRIBUTES_KEY { - INITIAL_DEVICE = "initial_device", - TYPE = "webview_type", + INITIAL_DEVICE = "initial_device", + TYPE = "webview_type", } export enum WEBVIEW_TYPES { - SIMULATOR = "simulator", - GETTING_STARTED = "getting_started", + SIMULATOR = "simulator", + GETTING_STARTED = "getting_started", } export const DEFAULT_IMG_CLUE = `/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAEBAQEBAQEBA QEBAQEBAQICAQEBAQMCAgICAwMEBAMDAwMEBAYFBAQFBAMDBQcFBQYGBgYGBAUHBwcGBwYGBgb/2wBDAQEBAQEBAQMCAgMGBAMEB diff --git a/src/view/container/device/Device.spec.tsx b/src/view/container/device/Device.spec.tsx index 491d4e2a5..5271bcdfa 100644 --- a/src/view/container/device/Device.spec.tsx +++ b/src/view/container/device/Device.spec.tsx @@ -1,30 +1,30 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { DEVICE_LIST_KEY } from "../../constants"; -import { Device } from "./Device"; - -describe("Device component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); +import * as React from "react"; +import * as ReactDOM from "react-dom"; +import { IntlProvider } from "react-intl"; +import * as testRenderer from "react-test-renderer"; +import { DEVICE_LIST_KEY } from "../../constants"; +import { Device } from "./Device"; + +describe("Device component ", () => { + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); + + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); +}); diff --git a/src/view/container/device/Device.tsx b/src/view/container/device/Device.tsx index dd30d2dc6..41705059e 100644 --- a/src/view/container/device/Device.tsx +++ b/src/view/container/device/Device.tsx @@ -8,35 +8,35 @@ import { Microbit } from "../../components/microbit/Microbit"; import { DEVICE_LIST_KEY } from "../../constants"; interface IProps { - currentSelectedDevice: string; + currentSelectedDevice: string; } // Container to switch between multiple devices export class Device extends React.Component { - constructor(props: IProps) { - super(props); - } - render() { - const { currentSelectedDevice } = this.props; + constructor(props: IProps) { + super(props); + } + render() { + const { currentSelectedDevice } = this.props; - return ( -
- - {loadSelectedDevice(currentSelectedDevice)} - -
- ); - } + return ( +
+ + {loadSelectedDevice(currentSelectedDevice)} + +
+ ); + } } const loadSelectedDevice = (currentSelectedDevice: string) => { - switch (currentSelectedDevice) { - case DEVICE_LIST_KEY.CPX: - return ; - case DEVICE_LIST_KEY.MICROBIT: - return ; - case DEVICE_LIST_KEY.CLUE: - return ; - default: - return null; - } + switch (currentSelectedDevice) { + case DEVICE_LIST_KEY.CPX: + return ; + case DEVICE_LIST_KEY.MICROBIT: + return ; + case DEVICE_LIST_KEY.CLUE: + return ; + default: + return null; + } }; diff --git a/src/view/index.css b/src/view/index.css index 918c31f9e..3801bbf26 100644 --- a/src/view/index.css +++ b/src/view/index.css @@ -1,13 +1,13 @@ @import url("https://fonts.googleapis.com/css?family=Joti+One"); body { - margin: 0; - padding: 0; - font-family: sans-serif; + margin: 0; + padding: 0; + font-family: sans-serif; } html, body { - overflow: hidden; - height: 100%; + overflow: hidden; + height: 100%; } diff --git a/src/view/index.tsx b/src/view/index.tsx index 32e7400b1..2d9c941b6 100644 --- a/src/view/index.tsx +++ b/src/view/index.tsx @@ -12,11 +12,11 @@ const messageEn = require("./translations/en.json"); const locale = "en"; const message = { - en: messageEn, + en: messageEn, }; ReactDOM.render( - - - , - document.getElementById("root") + + + , + document.getElementById("root") ); diff --git a/src/view/pages/gettingStarted.css b/src/view/pages/gettingStarted.css index d312598b1..29a072207 100644 --- a/src/view/pages/gettingStarted.css +++ b/src/view/pages/gettingStarted.css @@ -1,56 +1,56 @@ -.inv { - display: none; -} - -.codeText { - overflow-x: auto; - white-space: pre-wrap; - word-wrap: break-word; -} - -li:not(:last-child) { - margin-bottom: 6px; -} - -.normalFontWeight { - font-weight: normal; -} - -.deviceSelector { - width: 250px; - border: 1px solid var(--vscode-dropdown-border); - background-color: var(--vscode-dropdown-background); - color: var(--vscode-dropdown-foreground); - margin: 0 0 5px; - padding: 8px; - border-radius: 5px; - font-size: 12px; - padding-right: 30px; -} - -.deviceSelector optgroup { - background-color: var(--vscode-dropdown-listBackground); - color: var(--vscode-dropdown-foreground); -} - -.deviceSelector option { - background-color: var(--vscode-dropdown-listBackground); - color: var(--vscode-dropdown-foreground); -} - -.codeBox { - display: block; - width: 90%; - margin: 10px; - padding: 15px; - text-align: left; - background: none; - border: 1px solid grey; - border-radius: 4px; - background-color: var(--vscode-textCodeBlock-background); -} - -.container { - text-align: left; - padding: 0 10px 20px 10px; -} +.inv { + display: none; +} + +.codeText { + overflow-x: auto; + white-space: pre-wrap; + word-wrap: break-word; +} + +li:not(:last-child) { + margin-bottom: 6px; +} + +.normalFontWeight { + font-weight: normal; +} + +.deviceSelector { + width: 250px; + border: 1px solid var(--vscode-dropdown-border); + background-color: var(--vscode-dropdown-background); + color: var(--vscode-dropdown-foreground); + margin: 0 0 5px; + padding: 8px; + border-radius: 5px; + font-size: 12px; + padding-right: 30px; +} + +.deviceSelector optgroup { + background-color: var(--vscode-dropdown-listBackground); + color: var(--vscode-dropdown-foreground); +} + +.deviceSelector option { + background-color: var(--vscode-dropdown-listBackground); + color: var(--vscode-dropdown-foreground); +} + +.codeBox { + display: block; + width: 90%; + margin: 10px; + padding: 15px; + text-align: left; + background: none; + border: 1px solid grey; + border-radius: 4px; + background-color: var(--vscode-textCodeBlock-background); +} + +.container { + text-align: left; + padding: 0 10px 20px 10px; +} diff --git a/src/view/pages/gettingStarted.spec.tsx b/src/view/pages/gettingStarted.spec.tsx index 278d5ed4b..c45e2e6d1 100644 --- a/src/view/pages/gettingStarted.spec.tsx +++ b/src/view/pages/gettingStarted.spec.tsx @@ -1,29 +1,29 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { GettingStartedPage } from "./gettingStarted"; - -describe("GettingStartedPage component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); +import * as React from "react"; +import * as ReactDOM from "react-dom"; +import { IntlProvider } from "react-intl"; +import * as testRenderer from "react-test-renderer"; +import { GettingStartedPage } from "./gettingStarted"; + +describe("GettingStartedPage component ", () => { + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); + + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); +}); diff --git a/src/view/pages/gettingStarted.tsx b/src/view/pages/gettingStarted.tsx index 2477594e7..c58be7145 100644 --- a/src/view/pages/gettingStarted.tsx +++ b/src/view/pages/gettingStarted.tsx @@ -1,281 +1,281 @@ -import * as React from "react"; -import "./gettingStarted.css"; - -export class GettingStartedPage extends React.Component { - private selectRef: React.RefObject = React.createRef(); - - componentDidMount() { - this.selectRef.current?.addEventListener("change", (event: any) => { - const visibleElement = document.querySelector(".visibleElement"); - const target = document.getElementById(event!.target!.value); - if (visibleElement !== null) { - visibleElement.className = "inv"; - } - if (target !== null) { - target.className = "visibleElement"; - } - }); - } - - render() { - return ( - -
-

Getting started

- -

- Copy these snippets of code to a .py file and run the - simulator -

- {/* prettier-ignore */} -
-

Tutorial for Circuit Playground Express

-

- > Import the Circuit Playground library to use it (This is required) -

- -
from adafruit_circuitplayground import cp
-
-

> Turn on the little red LED

- -
while True:
-
    cp.red_led = True
-
-

> Turn up red LED when button A is clicked

- -
while True:
-
    if cp.button_a:
-
        cp.red_led = True
-
-

> Light up the first neopixel blue

- -
cp.pixels[0] = (0, 0, 255)
-
-

And much more! These links have more tutorials:

-

- - Getting started with CPX and CircuitPython - -

-

- - More example code - -

-

Keyboard Shortcuts

-
    -
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • -
  • Refresh the simulator: Shift + R
  • -
  • Run the simulator: Shift + F
  • -
-
- {/* prettier-ignore */} -
-

Tutorial for micro:bit

-

- > Import the micro:bit library to use it (This is - required) -

- -
from microbit import *
-
-

- > Light up your micro:bit with love by showing a - heart -

- -
display.show(Image.HEART)
-
-

- > Use your micro:bit to tell the world how you’re - feeling -

- -
while True:
-
    if button_a.is_pressed():
-
        display.show(Image.HAPPY)
-
    if button_b.is_pressed():
-
        display.show(Image.SAD)
-
-

> Read then display the temperature

- -
while True:
-
    temp = temperature()
-
    display.show(temp)
-
-

- > Display your name with the scroll functionality -

- -
while True:
-
    display.show("Your name")
-
-

And much more! These links have more tutorials:

-

- - Microbit Tutorials - -

-

- - Microbit official documentation - -

-

Keyboard Shortcuts

-
    -
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • -
  • Refresh the simulator: Shift + R
  • -
  • Run the simulator: Shift + F
  • -
-
- {/* prettier-ignore */} -
-

Tutorial for CLUE

-

- > Import the the main CLUE library (This is - required) -

- -
from adafruit_clue import clue
-
-

- > Display text on the CLUE and change the text when - a button is pressed -

- -
-                                clue_data = clue.simple_text_display(title="CLUE!")
-                            
-
while True:
-
    clue_data[1].text = "Hello World!"
-
    if clue.button_a:
-
        clue_data[5].text = "A is pressed!"
-
    else:
-
        clue_data[5].text = "A is not pressed!"
-
    clue_data.show()
-
-

> Create a slide show on the CLUE

-

- Make sure there are bitmap (.bmp) pictures of your choice in the same directory - as the code file. -

- -
import board
-
from adafruit_slideshow import SlideShow
-
 
-
slideshow = SlideShow(clue.display, auto_advance=True, dwell=3, fade_effect=True)
-                            
-
while slideshow.update():
-
    pass
-
-

> Light up the neopixel green

- -
clue.pixel.fill(clue.GREEN)
-
-

> Display sensor data on the CLUE

- -
clue_data = clue.simple_text_display(title="CLUE Sensor Data!", title_scale=2)
-
while True:
-
    clue_data[0].text = "Acceleration: {"{}"} {"{}"} {"{}"}".format(*clue.acceleration)
-
    clue_data[1].text = "Gyro: {"{}"} {"{}"} {"{}"}".format(*clue.gyro)
-
    clue_data[2].text = "Magnetic: {"{}"} {"{}"} {"{}"}".format(*clue.magnetic)
-
    clue_data[3].text = "Pressure: {"{}"}hPa".format(clue.pressure)
-
    clue_data[4].text = "Altitude: {"{}"}m".format(clue.altitude)
-
    clue_data[5].text = "Temperature: {"{}"}C".format(clue.temperature)
-
    clue_data[6].text = "Humidity: {"{}"}%".format(clue.humidity)
-
    clue_data[7].text = "Proximity: {"{}"}".format(clue.proximity)
-
    clue_data[8].text = "Gesture: {"{}"}".format(clue.gesture)
-
    clue_data[9].text = "Color: R: {"{}"} G: {"{}"} B: {"{}"} C: {"{}"}".format(*clue.color)
-
    clue_data[10].text = "Button A: {"{}"}".format(clue.button_a)
-
    clue_data[11].text = "Button B: {"{}"}".format(clue.button_b)
-
    clue_data.show()
-
-

> Draw a blue rectangle on the screen

- -
import board
-
import displayio
-
from adafruit_display_shapes.rect import Rect
-
 
-
splash = displayio.Group(max_size=20)
-
board.DISPLAY.show(splash)
-
 
-
rect = Rect(80, 20, 41, 41, fill=0x0000FF)
-
splash.append(rect)
-
-

And much more! These links have more tutorials:

-

- - Getting started with CLUE and CircuitPython - -

-

- - More example code - -

-

Keyboard Shortcuts

-
    -
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • -
  • Refresh the simulator: Shift + R
  • -
  • Run the simulator: Shift + F
  • -
  • Capacitive Touch Sensor: Shift + 1 ~ 7 for GPIO pins A1 - A7
  • -
  • Slider Switch: Shift + S
  • -
-
- {/* prettier-ignore */} -
-

Tutorial for using the debugger

-

- > Enter debug mode -

-

Press F5 or go to Run -> Start Debugging

- Start debugging -

- > Set a breakpoint or multiple breakpoints -

-

Stopping at a breakpoint pauses the program at that particular place.

-

Use the debug toolbar or the shortcuts below

- Debugger Toolbar -
    -
  • F5 to continue / pause
  • -
  • F10 to step over (execute current statement and all functions that it calls and stop before the next statement)
  • -
  • F11 to step into (stop at first statement of first function called from first line)
  • -
  • Shift + F11 to step out (run current function to end)
  • -
  • Ctrl + Shift + F11 to restart
  • -
  • Shift + F5 to stop
  • -
- debugging experience -

- > Observe the device's state on the "Variables" tab on the left when stopped at a breakpoint -

- Debugger Variables -

And much more! These links have more tutorials:

-

- - Learn more about debugging in VS Code - -

-
-
-
- ); - } -} +import * as React from "react"; +import "./gettingStarted.css"; + +export class GettingStartedPage extends React.Component { + private selectRef: React.RefObject = React.createRef(); + + componentDidMount() { + this.selectRef.current?.addEventListener("change", (event: any) => { + const visibleElement = document.querySelector(".visibleElement"); + const target = document.getElementById(event!.target!.value); + if (visibleElement !== null) { + visibleElement.className = "inv"; + } + if (target !== null) { + target.className = "visibleElement"; + } + }); + } + + render() { + return ( + +
+

Getting started

+ +

+ Copy these snippets of code to a .py file and run the + simulator +

+ {/* prettier-ignore */} +
+

Tutorial for Circuit Playground Express

+

+ > Import the Circuit Playground library to use it (This is required) +

+ +
from adafruit_circuitplayground import cp
+
+

> Turn on the little red LED

+ +
while True:
+
    cp.red_led = True
+
+

> Turn up red LED when button A is clicked

+ +
while True:
+
    if cp.button_a:
+
        cp.red_led = True
+
+

> Light up the first neopixel blue

+ +
cp.pixels[0] = (0, 0, 255)
+
+

And much more! These links have more tutorials:

+

+ + Getting started with CPX and CircuitPython + +

+

+ + More example code + +

+

Keyboard Shortcuts

+
    +
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • +
  • Refresh the simulator: Shift + R
  • +
  • Run the simulator: Shift + F
  • +
+
+ {/* prettier-ignore */} +
+

Tutorial for micro:bit

+

+ > Import the micro:bit library to use it (This is + required) +

+ +
from microbit import *
+
+

+ > Light up your micro:bit with love by showing a + heart +

+ +
display.show(Image.HEART)
+
+

+ > Use your micro:bit to tell the world how you’re + feeling +

+ +
while True:
+
    if button_a.is_pressed():
+
        display.show(Image.HAPPY)
+
    if button_b.is_pressed():
+
        display.show(Image.SAD)
+
+

> Read then display the temperature

+ +
while True:
+
    temp = temperature()
+
    display.show(temp)
+
+

+ > Display your name with the scroll functionality +

+ +
while True:
+
    display.show("Your name")
+
+

And much more! These links have more tutorials:

+

+ + Microbit Tutorials + +

+

+ + Microbit official documentation + +

+

Keyboard Shortcuts

+
    +
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • +
  • Refresh the simulator: Shift + R
  • +
  • Run the simulator: Shift + F
  • +
+
+ {/* prettier-ignore */} +
+

Tutorial for CLUE

+

+ > Import the the main CLUE library (This is + required) +

+ +
from adafruit_clue import clue
+
+

+ > Display text on the CLUE and change the text when + a button is pressed +

+ +
+                                clue_data = clue.simple_text_display(title="CLUE!")
+                            
+
while True:
+
    clue_data[1].text = "Hello World!"
+
    if clue.button_a:
+
        clue_data[5].text = "A is pressed!"
+
    else:
+
        clue_data[5].text = "A is not pressed!"
+
    clue_data.show()
+
+

> Create a slide show on the CLUE

+

+ Make sure there are bitmap (.bmp) pictures of your choice in the same directory + as the code file. +

+ +
import board
+
from adafruit_slideshow import SlideShow
+
 
+
slideshow = SlideShow(clue.display, auto_advance=True, dwell=3, fade_effect=True)
+                            
+
while slideshow.update():
+
    pass
+
+

> Light up the neopixel green

+ +
clue.pixel.fill(clue.GREEN)
+
+

> Display sensor data on the CLUE

+ +
clue_data = clue.simple_text_display(title="CLUE Sensor Data!", title_scale=2)
+
while True:
+
    clue_data[0].text = "Acceleration: {"{}"} {"{}"} {"{}"}".format(*clue.acceleration)
+
    clue_data[1].text = "Gyro: {"{}"} {"{}"} {"{}"}".format(*clue.gyro)
+
    clue_data[2].text = "Magnetic: {"{}"} {"{}"} {"{}"}".format(*clue.magnetic)
+
    clue_data[3].text = "Pressure: {"{}"}hPa".format(clue.pressure)
+
    clue_data[4].text = "Altitude: {"{}"}m".format(clue.altitude)
+
    clue_data[5].text = "Temperature: {"{}"}C".format(clue.temperature)
+
    clue_data[6].text = "Humidity: {"{}"}%".format(clue.humidity)
+
    clue_data[7].text = "Proximity: {"{}"}".format(clue.proximity)
+
    clue_data[8].text = "Gesture: {"{}"}".format(clue.gesture)
+
    clue_data[9].text = "Color: R: {"{}"} G: {"{}"} B: {"{}"} C: {"{}"}".format(*clue.color)
+
    clue_data[10].text = "Button A: {"{}"}".format(clue.button_a)
+
    clue_data[11].text = "Button B: {"{}"}".format(clue.button_b)
+
    clue_data.show()
+
+

> Draw a blue rectangle on the screen

+ +
import board
+
import displayio
+
from adafruit_display_shapes.rect import Rect
+
 
+
splash = displayio.Group(max_size=20)
+
board.DISPLAY.show(splash)
+
 
+
rect = Rect(80, 20, 41, 41, fill=0x0000FF)
+
splash.append(rect)
+
+

And much more! These links have more tutorials:

+

+ + Getting started with CLUE and CircuitPython + +

+

+ + More example code + +

+

Keyboard Shortcuts

+
    +
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • +
  • Refresh the simulator: Shift + R
  • +
  • Run the simulator: Shift + F
  • +
  • Capacitive Touch Sensor: Shift + 1 ~ 7 for GPIO pins A1 - A7
  • +
  • Slider Switch: Shift + S
  • +
+
+ {/* prettier-ignore */} +
+

Tutorial for using the debugger

+

+ > Enter debug mode +

+

Press F5 or go to Run -> Start Debugging

+ Start debugging +

+ > Set a breakpoint or multiple breakpoints +

+

Stopping at a breakpoint pauses the program at that particular place.

+

Use the debug toolbar or the shortcuts below

+ Debugger Toolbar +
    +
  • F5 to continue / pause
  • +
  • F10 to step over (execute current statement and all functions that it calls and stop before the next statement)
  • +
  • F11 to step into (stop at first statement of first function called from first line)
  • +
  • Shift + F11 to step out (run current function to end)
  • +
  • Ctrl + Shift + F11 to restart
  • +
  • Shift + F5 to stop
  • +
+ debugging experience +

+ > Observe the device's state on the "Variables" tab on the left when stopped at a breakpoint +

+ Debugger Variables +

And much more! These links have more tutorials:

+

+ + Learn more about debugging in VS Code + +

+
+
+
+ ); + } +} diff --git a/src/view/styles/Button.css b/src/view/styles/Button.css index c30ed1360..993bd4937 100644 --- a/src/view/styles/Button.css +++ b/src/view/styles/Button.css @@ -1,50 +1,50 @@ .button { - height: 32px; - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-debugToolBar-background); + height: 32px; + background: var(--vscode-debugToolBar-background); + border-color: var(--vscode-debugToolBar-background); } .button-icon { - fill: var(--vscode-badgeForegroundOverride); + fill: var(--vscode-badgeForegroundOverride); } .button-rectangle { - stroke: var(--vscode-badgeForegroundOverride); + stroke: var(--vscode-badgeForegroundOverride); } .play-button { - border-radius: 8px 0px 0px 8px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-radius: 8px 0px 0px 8px; + border-color: var(--vscode-highContrastButtonBorderOverride-color); } .refresh-button { - border-radius: 0px 8px 8px 0px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-radius: 0px 8px 8px 0px; + border-color: var(--vscode-highContrastButtonBorderOverride-color); } .button:focus, .button:hover { - background-color: var(--vscode-terminal-selectionBackground); + background-color: var(--vscode-terminal-selectionBackground); } .button:active { - background-color: var(--vscode-editor-selectionHighlightBackground); + background-color: var(--vscode-editor-selectionHighlightBackground); } .toolbar-button { - border: none; + border: none; } .toolbar-button:hover { - outline: none; + outline: none; } .edge-button { - pointer-events: none; - border: none; + pointer-events: none; + border: none; } .button-pressed { - background-color: var(--vscode-button-background); - outline: none; + background-color: var(--vscode-button-background); + outline: none; } diff --git a/src/view/styles/Dropdown.css b/src/view/styles/Dropdown.css index b69b14c74..b617665a9 100644 --- a/src/view/styles/Dropdown.css +++ b/src/view/styles/Dropdown.css @@ -1,24 +1,24 @@ .dropdown { - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-foreground); - border-radius: 2px; - box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.22); - color: var(--vscode-foreground); - height: 32px; - width: 100%; + background: var(--vscode-debugToolBar-background); + border-color: var(--vscode-foreground); + border-radius: 2px; + box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.22); + color: var(--vscode-foreground); + height: 32px; + width: 100%; } select.dropdown:hover, select.dropdown:focus, select.dropdown:active { - outline: 1px solid var(--vscode-button-background); + outline: 1px solid var(--vscode-button-background); } option { - height: 32px; - background: var(--vscode-debugToolBar-background); - outline: 0; - align-items: center; - font-size: 14px; - color: var(--vscode-foreground); + height: 32px; + background: var(--vscode-debugToolBar-background); + outline: 0; + align-items: center; + font-size: 14px; + color: var(--vscode-foreground); } diff --git a/src/view/styles/InputSlider.css b/src/view/styles/InputSlider.css index b51dae8f3..0adcd1340 100644 --- a/src/view/styles/InputSlider.css +++ b/src/view/styles/InputSlider.css @@ -1,103 +1,103 @@ :root { - --slider-gray-color: #cccccc; - --slider-width: 240px; + --slider-gray-color: #cccccc; + --slider-width: 240px; } .inputSlider { - height: 48px; - margin-bottom: 60px; - display: table-cell; + height: 48px; + margin-bottom: 60px; + display: table-cell; } .sliderValue { - -webkit-appearance: none; - text-align: center; - width: 48px; - height: 32px; - background-color: var(--vscode-editor-background); - margin-right: 15px; - margin-top: auto; - margin-bottom: auto; - margin-left: 5px; - color: var(--badgeForegroundOverride); - border-radius: 2px; - font-size: 16px; - font-weight: bold; - border-width: 1px; - border-radius: 2px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); + -webkit-appearance: none; + text-align: center; + width: 48px; + height: 32px; + background-color: var(--vscode-editor-background); + margin-right: 15px; + margin-top: auto; + margin-bottom: auto; + margin-left: 5px; + color: var(--badgeForegroundOverride); + border-radius: 2px; + font-size: 16px; + font-weight: bold; + border-width: 1px; + border-radius: 2px; + border-color: var(--vscode-highContrastButtonBorderOverride-color); } .slider { - -webkit-appearance: none; - background-color: var(--slider-gray-color); - height: 1px; - width: var(--slider-width); - vertical-align: middle; + -webkit-appearance: none; + background-color: var(--slider-gray-color); + height: 1px; + width: var(--slider-width); + vertical-align: middle; } .slider::-webkit-slider-thumb { - -webkit-appearance: none; - appearance: none; - width: 16px; - height: 16px; - border-radius: 50%; - background: var(--vscode-textLink-activeForeground); - cursor: pointer; + -webkit-appearance: none; + appearance: none; + width: 16px; + height: 16px; + border-radius: 50%; + background: var(--vscode-textLink-activeForeground); + cursor: pointer; } .slider::-webkit-slider-runnable-track:focus, .inputSlider:focus, .slider:focus { - outline: none; + outline: none; } .sliderValue:focus, .sliderValue:hover { - -webkit-appearance: none; - color: var(--vscode-textLink-activeForeground); - outline: 1px solid var(--vscode-textLink-activeForeground); + -webkit-appearance: none; + color: var(--vscode-textLink-activeForeground); + outline: 1px solid var(--vscode-textLink-activeForeground); } .maxLabel, .minLabel { - display: inline-block; - position: absolute; - vertical-align: top; + display: inline-block; + position: absolute; + vertical-align: top; } .maxLabel { - right: 0; + right: 0; } .minLabel { - left: 0; + left: 0; } .sliderArea, .sliderValue { - display: inline-block; - vertical-align: middle; + display: inline-block; + vertical-align: middle; } .sliderArea { - width: var(--slider-width); - height: 49px; + width: var(--slider-width); + height: 49px; } .downLabelArea { - width: var(--slider-width); - height: 15px; - margin-top: 10px; - position: relative; - font-size: 14px; + width: var(--slider-width); + height: 15px; + margin-top: 10px; + position: relative; + font-size: 14px; } .upLabelArea { - width: var(--slider-width); - height: 15px; - margin-bottom: 10px; - position: relative; - font-weight: bolder; - font-size: 16px; + width: var(--slider-width); + height: 15px; + margin-bottom: 10px; + position: relative; + font-weight: bolder; + font-size: 16px; } .slider, .upLabelArea, .downLabelArea { - display: block; + display: block; } diff --git a/src/view/styles/LightSensorBar.css b/src/view/styles/LightSensorBar.css index 5d0abac42..ec70e6765 100644 --- a/src/view/styles/LightSensorBar.css +++ b/src/view/styles/LightSensorBar.css @@ -1,20 +1,20 @@ .title { - font-size: 14px; - text-align: left; - font-weight: bold; + font-size: 14px; + text-align: left; + font-weight: bold; } .header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; + -webkit-appearance: none; + height: 30px; + margin-bottom: 2px; } .lightSensorBar { - -webkit-appearance: none; - margin-top: 10px; - width: 400px; - margin-left: auto; - margin-right: auto; - padding-bottom: 16px; + -webkit-appearance: none; + margin-top: 10px; + width: 400px; + margin-left: auto; + margin-right: auto; + padding-bottom: 16px; } diff --git a/src/view/styles/MotionSensorBar.css b/src/view/styles/MotionSensorBar.css index 8ea39c23c..5d68da3c9 100644 --- a/src/view/styles/MotionSensorBar.css +++ b/src/view/styles/MotionSensorBar.css @@ -1,20 +1,20 @@ .title { - font-size: 14px; - text-align: left; + font-size: 14px; + text-align: left; } .header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; + -webkit-appearance: none; + height: 30px; + margin-bottom: 2px; } .MotionSensorBar { - width: 100%; - margin-left: auto; - margin-right: auto; + width: 100%; + margin-left: auto; + margin-right: auto; } .sensor-button-container { - padding: 10px 0; + padding: 10px 0; } diff --git a/src/view/styles/SensorButton.css b/src/view/styles/SensorButton.css index 21241eca2..75c322083 100644 --- a/src/view/styles/SensorButton.css +++ b/src/view/styles/SensorButton.css @@ -1,29 +1,29 @@ .sensor-button { - color: var(--vscode-badgeForegroundOverride); - text-align: center; - background-color: var(--vscode-button-background); - width: 100%; - height: 32px; - font-weight: bolder; - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - padding: 4px; + color: var(--vscode-badgeForegroundOverride); + text-align: center; + background-color: var(--vscode-button-background); + width: 100%; + height: 32px; + font-weight: bolder; + border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-width: 1px; + border-style: solid; + padding: 4px; } .sensor-button:focus, .sensor-button:active { - outline-width: thick; - outline-offset: 4px; - outline: 2px solid var(--vscode-focusBorder); - background-color: var(--vscode-button-hoverBackground); + outline-width: thick; + outline-offset: 4px; + outline: 2px solid var(--vscode-focusBorder); + background-color: var(--vscode-button-hoverBackground); } .sensor-button:active, .active-button { - opacity: 0.5; + opacity: 0.5; } .sensor-button:hover { - background-color: var(--vscode-button-hoverBackground); + background-color: var(--vscode-button-hoverBackground); } diff --git a/src/view/styles/Simulator.css b/src/view/styles/Simulator.css index 016cc8855..ea7979248 100644 --- a/src/view/styles/Simulator.css +++ b/src/view/styles/Simulator.css @@ -1,83 +1,83 @@ .simulator { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - max-width: 700px; - max-height: 700px; - margin-left: auto; - margin-right: auto; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + max-width: 700px; + max-height: 700px; + margin-left: auto; + margin-right: auto; } .buttons { - display: flex; - flex-direction: row; - padding-top: 20px; - justify-content: center; + display: flex; + flex-direction: row; + padding-top: 20px; + justify-content: center; } .file-selector { - padding: 20px; - width: 80%; - height: 30px; - border: 1px solid var(--vscode-debugToolBar-background); - border-radius: 3px; + padding: 20px; + width: 80%; + height: 30px; + border: 1px solid var(--vscode-debugToolBar-background); + border-radius: 3px; } .shake-pressed { - /* Start the shake animation and make the animation last for 0.5 seconds */ - animation: shake 0.5s; + /* Start the shake animation and make the animation last for 0.5 seconds */ + animation: shake 0.5s; - /* When the animation is finished, start again */ - animation-iteration-count: infinite; + /* When the animation is finished, start again */ + animation-iteration-count: infinite; } @keyframes shake { - 0% { - transform: translate(1px, 1px) rotate(0deg); - } - 10% { - transform: translate(-1px, -2px) rotate(-1deg); - } - 20% { - transform: translate(-3px, 0px) rotate(1deg); - } - 30% { - transform: translate(3px, 2px) rotate(0deg); - } - 40% { - transform: translate(1px, -1px) rotate(1deg); - } - 50% { - transform: translate(-1px, 2px) rotate(-1deg); - } - 60% { - transform: translate(-3px, 1px) rotate(0deg); - } - 70% { - transform: translate(3px, 1px) rotate(-1deg); - } - 80% { - transform: translate(-1px, -1px) rotate(1deg); - } - 90% { - transform: translate(1px, 2px) rotate(0deg); - } - 100% { - transform: translate(1px, -2px) rotate(-1deg); - } + 0% { + transform: translate(1px, 1px) rotate(0deg); + } + 10% { + transform: translate(-1px, -2px) rotate(-1deg); + } + 20% { + transform: translate(-3px, 0px) rotate(1deg); + } + 30% { + transform: translate(3px, 2px) rotate(0deg); + } + 40% { + transform: translate(1px, -1px) rotate(1deg); + } + 50% { + transform: translate(-1px, 2px) rotate(-1deg); + } + 60% { + transform: translate(-3px, 1px) rotate(0deg); + } + 70% { + transform: translate(3px, 1px) rotate(-1deg); + } + 80% { + transform: translate(-1px, -1px) rotate(1deg); + } + 90% { + transform: translate(1px, 2px) rotate(0deg); + } + 100% { + transform: translate(1px, -2px) rotate(-1deg); + } } .microbit-container { - max-width: 350px; - padding: 20px; + max-width: 350px; + padding: 20px; } .clue-container { - width: 100%; - max-width: 500px; - padding: 20px; + width: 100%; + max-width: 500px; + padding: 20px; } .cpx-container { - width: 100%; - padding-top: 10px; + width: 100%; + padding-top: 10px; } diff --git a/src/view/styles/SimulatorSvg.css b/src/view/styles/SimulatorSvg.css index c9266c4a3..523411c2f 100644 --- a/src/view/styles/SimulatorSvg.css +++ b/src/view/styles/SimulatorSvg.css @@ -1,290 +1,292 @@ -.microbit-svg { - padding: 0 0 0 10px; -} -svg.sim { - box-sizing: border-box; - width: 100%; - height: 100%; - display: block; -} -svg.sim.grayscale { - -moz-filter: grayscale(1); - -webkit-filter: grayscale(1); - filter: grayscale(1); -} -.sim-button-group { - cursor: pointer; -} -.sim-button { - pointer-events: none; - fill: "rgb(17, 17, 17)"; -} -.sim-button-group > .sim-button:active { - fill: orange; -} -.sim-text-outside { - font-size: 25px; - fill: var(--vscode-foreground); -} -.sim-board, -.sim-display, -sim-button { - fill: #111; -} -.sim-button-group > .sim-button-outer:hover { - stroke: orange; - stroke-width: 4px; -} -.sim-button-group > .sim-button-outer:active { - fill: orange; -} -.sim-button-outer { - fill: #7e7272; -} - -.sim-button-key-press { - fill: orange; -} - -.sim-button-nut { - fill: #704a4a; - pointer-events: none; -} - -.sim-systemled { - fill: #333; - stroke: #555; - stroke-width: 1px; -} -.sim-light-level-button { - stroke: #fff; - stroke-width: 3px; -} -.sim-antenna { - stroke: #555; - stroke-width: 2px; -} -.sim-text { - font-family: "Lucida Console", Monaco, monospace; - font-size: 25px; - fill: #fff; - pointer-events: none; -} -.sim-text-pin { - font-family: "Lucida Console", Monaco, monospace; - font-size: 20px; - fill: #fff; - pointer-events: none; -} -.sim-thermometer { - stroke: #aaa; - stroke-width: 3px; -} -/* animations */ -.sim-flash { - animation-name: sim-flash-animation; - animation-duration: 0.1s; -} -@keyframes sim-flash-animation { - from { - fill: yellow; - } - to { - fill: default; - } -} -.sim-flash-stroke { - animation-name: sim-flash-stroke-animation; - animation-duration: 0.4s; - animation-timing-function: ease-in; -} -@keyframes sim-flash-stroke-animation { - from { - stroke: yellow; - } - to { - stroke: default; - } -} -/* wireframe */ -.sim-wireframe * { - fill: none; - stroke: black; -} -.sim-wireframe .sim-display, -.sim-wireframe .sim-led, -.sim-wireframe .sim-led-back, -.sim-wireframe .sim-head, -.sim-wireframe .sim-theme, -.sim-wireframe .sim-button-group, -.sim-wireframe .sim-button-label, -.sim-wireframe .sim-button, -.sim-wireframe .sim-text-pin { - visibility: hidden; -} -.sim-wireframe .sim-label { - stroke: none; - fill: #777; -} -.sim-label, -.sim-button-label { - fill: #000; -} -.sim-wireframe .sim-board { - stroke-width: 2px; -} -*:focus { - outline: none; -} -.sim-button-group:focus { - stroke: #4d90fe; - stroke-width: 4px; -} -.sim-button-group:focus { - stroke: #4d90fe; - stroke-width: 4px; -} -*:focus .sim-button-outer, -.sim-pin:focus, -.sim-thermometer:focus, -.sim-shake:focus, -.no-drag, -.sim-text, -.sim-text-pin { - user-drag: none; - user-select: none; - -moz-user-select: none; - -webkit-user-drag: none; - -webkit-user-select: none; - -ms-user-select: none; -} -.sim-button { - stroke: none; -} -.sim-button:active { - stroke: none; -} -.cls-1 { - fill: #097054; -} -.cls-1, -.cls-14, -.cls-23, -.cls-9 { - stroke: #000; -} -.cls-1, -.cls-11, -.cls-12, -.cls-14, -.cls-17, -.cls-22, -.cls-23, -.cls-3, -.cls-4, -.cls-5, -.cls-6, -.cls-9 { - stroke-miterlimit: 10; -} -.cls-1, -.cls-23 { - stroke-width: 1.99px; -} -.cls-18, -.cls-2 { - fill: #fff; -} -.cls-11, -.cls-12, -.cls-17, -.cls-23, -.cls-3, -.cls-4, -.cls-5, -.cls-6, -.cls-7, -.cls-8 { - fill: none; -} -.cls-11, -.cls-12, -.cls-17, -.cls-3, -.cls-4, -.cls-5, -.cls-6, -.cls-7, -.cls-8 { - stroke: #fff; -} -.cls-3 { - stroke-width: 2px; -} -.cls-12, -.cls-17, -.cls-4, -.cls-5, -.cls-6, -.cls-7, -.cls-8 { - stroke-linecap: round; -} -.cls-4, -.cls-7 { - stroke-width: 1.63px; -} -.cls-5 { - stroke-width: 1.41px; -} -.cls-6 { - stroke-width: 1.6px; -} -.cls-7, -.cls-8 { - stroke-linejoin: round; -} -.cls-8 { - stroke-width: 1.63px; -} -.cls-10, -.cls-9 { - fill: #7e7272; -} -.cls-22, -.cls-9 { - stroke-width: 1.5px; -} -.cls-12 { - stroke-width: 1.71px; -} - -.cls-14 { - stroke-width: 0.25px; -} - -.cls-17 { - stroke-width: 2.02px; -} -.cls-18 { - font-size: 7px; - font-family: SegoeUI-Bold, Segoe UI; - font-weight: 700; - letter-spacing: -0.02em; -} -.cls-19 { - letter-spacing: -0.03em; -} -.cls-20 { - letter-spacing: -0.05em; -} -.cls-21 { - letter-spacing: 0em; -} -.cls-22 { - stroke: #7e7272; -} -.sim-text-outside-clue { - font-size: 14px; - fill: var(--vscode-foreground); -} +.microbit-svg { + padding: 0 0 0 10px; +} +svg.sim { + box-sizing: border-box; + width: 100%; + height: 100%; + display: block; +} +svg.sim.grayscale { + -moz-filter: grayscale(1); + -webkit-filter: grayscale(1); + filter: grayscale(1); +} +.sim-button-group { + cursor: pointer; +} +.sim-button { + pointer-events: none; + fill: "rgb(17, 17, 17)"; +} +.sim-button-group > .sim-button:active { + fill: orange; +} +.sim-text-outside { + font-size: 25px; + fill: var(--vscode-foreground); +} +.sim-board, +.sim-display, +sim-button { + fill: #111; +} +.sim-button-group > .sim-button-outer:hover { + stroke: orange; + stroke-width: 4px; +} +.sim-button-group > .sim-button-outer:active { + fill: orange; +} +.sim-button-outer { + fill: #7e7272; +} + +.sim-button-key-press { + fill: orange; +} + +.sim-button-nut { + fill: #704a4a; + pointer-events: none; +} + +.sim-systemled { + fill: #333; + stroke: #555; + stroke-width: 1px; +} +.sim-light-level-button { + stroke: #fff; + stroke-width: 3px; +} +.sim-antenna { + stroke: #555; + stroke-width: 2px; +} +.sim-text { + font-family: "Lucida Console", Monaco, monospace; + font-size: 25px; + fill: #fff; + pointer-events: none; +} +.sim-text-pin { + font-family: "Lucida Console", Monaco, monospace; + font-size: 20px; + fill: #fff; + pointer-events: none; +} +.sim-thermometer { + stroke: #aaa; + stroke-width: 3px; +} +/* animations */ +.sim-flash { + animation-name: sim-flash-animation; + animation-duration: 0.1s; +} +@keyframes sim-flash-animation { + from { + fill: yellow; + } + to { + fill: default; + } +} +.sim-flash-stroke { + animation-name: sim-flash-stroke-animation; + animation-duration: 0.4s; + animation-timing-function: ease-in; +} +@keyframes sim-flash-stroke-animation { + from { + stroke: yellow; + } + to { + stroke: default; + } +} +/* wireframe */ +.sim-wireframe * { + fill: none; + stroke: black; +} +.sim-wireframe .sim-display, +.sim-wireframe .sim-led, +.sim-wireframe .sim-led-back, +.sim-wireframe .sim-head, +.sim-wireframe .sim-theme, +.sim-wireframe .sim-button-group, +.sim-wireframe .sim-button-label, +.sim-wireframe .sim-button, +.sim-wireframe .sim-text-pin { + visibility: hidden; +} +.sim-wireframe .sim-label { + stroke: none; + fill: #777; +} +.sim-label, +.sim-button-label { + fill: #000; +} +.sim-wireframe .sim-board { + stroke-width: 2px; +} +*:focus { + outline: none; +} +.sim-button-group:focus { + stroke: #4d90fe; + stroke-width: 4px; +} +.sim-button-group:focus { + stroke: #4d90fe; + stroke-width: 4px; +} +*:focus .sim-button-outer, +.sim-pin:focus, +.sim-thermometer:focus, +.sim-shake:focus, +.no-drag, +.sim-text, +.sim-text-pin { + user-drag: none; + user-select: none; + -moz-user-select: none; + -webkit-user-drag: none; + -webkit-user-select: none; + -ms-user-select: none; +} +.sim-button { + stroke: none; +} +.sim-button:active { + stroke: none; +} +.cls-1 { + fill: #097054; +} +.cls-1, +.cls-14, +.cls-23, +.cls-9 { + stroke: #000; +} +.cls-1, +.cls-11, +.cls-12, +.cls-14, +.cls-17, +.cls-22, +.cls-23, +.cls-3, +.cls-4, +.cls-5, +.cls-6, +.cls-9 { + stroke-miterlimit: 10; +} +.cls-1, +.cls-23 { + stroke-width: 1.99px; +} +.cls-18, +.cls-2 { + fill: #fff; +} +.cls-11, +.cls-12, +.cls-17, +.cls-23, +.cls-3, +.cls-4, +.cls-5, +.cls-6, +.cls-7, +.cls-8 { + fill: none; +} +.cls-11, +.cls-12, +.cls-17, +.cls-3, +.cls-4, +.cls-5, +.cls-6, +.cls-7, +.cls-8 { + stroke: #fff; +} +.cls-3 { + stroke-width: 2px; +} +.cls-12, +.cls-17, +.cls-4, +.cls-5, +.cls-6, +.cls-7, +.cls-8 { + stroke-linecap: round; +} +.cls-4, +.cls-7 { + stroke-width: 1.63px; +} +.cls-5 { + stroke-width: 1.41px; +} +.cls-6 { + stroke-width: 1.6px; +} +.cls-7, +.cls-8 { + stroke-linejoin: round; +} +.cls-8 { + stroke-width: 1.63px; +} +.cls-10, +.cls-9 { + fill: #7e7272; +} +.cls-22, +.cls-9 { + stroke-width: 1.5px; +} +.cls-12 { + stroke-width: 1.71px; +} + +.cls-14 { + stroke-width: 0.25px; +} + +.cls-17 { + stroke-width: 2.02px; +} +.cls-18 { + font-size: 7px; + font-family: + SegoeUI-Bold, + Segoe UI; + font-weight: 700; + letter-spacing: -0.02em; +} +.cls-19 { + letter-spacing: -0.03em; +} +.cls-20 { + letter-spacing: -0.05em; +} +.cls-21 { + letter-spacing: 0em; +} +.cls-22 { + stroke: #7e7272; +} +.sim-text-outside-clue { + font-size: 14px; + fill: var(--vscode-foreground); +} diff --git a/src/view/styles/TemperatureSensorBar.css b/src/view/styles/TemperatureSensorBar.css index dfab0b7cd..e52920b20 100644 --- a/src/view/styles/TemperatureSensorBar.css +++ b/src/view/styles/TemperatureSensorBar.css @@ -1,18 +1,18 @@ .title { - font-size: 14px; - text-align: left; - font-weight: bold; + font-size: 14px; + text-align: left; + font-weight: bold; } .header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; + -webkit-appearance: none; + height: 30px; + margin-bottom: 2px; } .temperatureSensorBar { - margin-top: 10px; - width: 440px; - margin-left: auto; - margin-right: auto; - padding-bottom: 16px; + margin-top: 10px; + width: 440px; + margin-left: auto; + margin-right: auto; + padding-bottom: 16px; } diff --git a/src/view/styles/ToolBar.css b/src/view/styles/ToolBar.css index faca0569c..f85843e90 100644 --- a/src/view/styles/ToolBar.css +++ b/src/view/styles/ToolBar.css @@ -1,182 +1,182 @@ .toolbar-parent { - background: var(--vscode-debugToolBar-background); - width: fit-content; - border-radius: 2px; - height: fit-content; - margin-left: auto; - margin-right: auto; - margin-top: 24px; - margin-bottom: 50px; + background: var(--vscode-debugToolBar-background); + width: fit-content; + border-radius: 2px; + height: fit-content; + margin-left: auto; + margin-right: auto; + margin-top: 24px; + margin-bottom: 50px; } .toolbar { - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - display: flex; - flex-direction: column; - align-content: center; - align-items: center; + box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); + border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-width: 1px; + border-style: solid; + display: flex; + flex-direction: column; + align-content: center; + align-items: center; } .toolbar-icon { - min-width: 360px; - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - padding: 0px 8px 0px 8px; + min-width: 360px; + box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); + border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-width: 1px; + border-style: solid; + padding: 0px 8px 0px 8px; } .tag, .title { - display: inline; + display: inline; } .sensor_modal { - vertical-align: middle; - width: 360px; - overflow-y: visible; - overflow-x: hidden; - position: relative; - height: fit-content; - padding-left: 16px; - box-shadow: none; - margin-left: 1px; + vertical-align: middle; + width: 360px; + overflow-y: visible; + overflow-x: hidden; + position: relative; + height: fit-content; + padding-left: 16px; + box-shadow: none; + margin-left: 1px; } .title { - -webkit-appearance: none; - font-size: 16px; - font-weight: bolder; - color: var(--vscode-badgeForegroundOverride); - text-align: left; - margin-right: 40px; - position: absolute; - left: 0; - padding-left: inherit; - width: 320px; + -webkit-appearance: none; + font-size: 16px; + font-weight: bolder; + color: var(--vscode-badgeForegroundOverride); + text-align: left; + margin-right: 40px; + position: absolute; + left: 0; + padding-left: inherit; + width: 320px; } .info-icon { - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - color: var(--vscode-badgeForegroundOverride); - border-width: 1px; - border-style: solid; - padding: 0px 4px; - float: right; - left: 25px; - margin-top: -10px; + background: var(--vscode-debugToolBar-background); + border-color: var(--vscode-highContrastButtonBorderOverride-color); + color: var(--vscode-badgeForegroundOverride); + border-width: 1px; + border-style: solid; + padding: 0px 4px; + float: right; + left: 25px; + margin-top: -10px; } .info-icon:hover { - background-color: var(--vscode-terminal-selectionBackground); - color: var(--vscode-badgeForegroundOverride); + background-color: var(--vscode-terminal-selectionBackground); + color: var(--vscode-badgeForegroundOverride); } .info-icon:active { - background-color: var(--vscode-editor-selectionHighlightBackground); - color: var(--vscode-badgeForegroundOverride); + background-color: var(--vscode-editor-selectionHighlightBackground); + color: var(--vscode-badgeForegroundOverride); } .tag { - position: absolute; - left: 200px; + position: absolute; + left: 200px; } .description-callout { - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - padding: "210px 214px 214px 210px"; - border: 2px solid var(--vscode-highContrastButtonBorderOverride-color); + box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); + padding: "210px 214px 214px 210px"; + border: 2px solid var(--vscode-highContrastButtonBorderOverride-color); } .description-callout .ms-Callout-beak { - background-color: var(--vscode-debugToolBar-background); + background-color: var(--vscode-debugToolBar-background); } .description-callout .ms-Callout-main { - background-color: var(--vscode-debugToolBar-background); - overflow-x: hidden; - overflow-y: auto; - margin: -1px; + background-color: var(--vscode-debugToolBar-background); + overflow-x: hidden; + overflow-y: auto; + margin: -1px; } .try-it-description { - -webkit-appearance: none; - font-size: 14px; - background: var(--vscode-debugToolBar-background); - word-wrap: break-word; - width: 320px; - height: "100%"; - margin-top: 15px; - text-align: left; - line-height: 17px; - font-weight: 100; + -webkit-appearance: none; + font-size: 14px; + background: var(--vscode-debugToolBar-background); + word-wrap: break-word; + width: 320px; + height: "100%"; + margin-top: 15px; + text-align: left; + line-height: 17px; + font-weight: 100; } .description { - -webkit-appearance: none; - color: var(--vscode-badgeForegroundOverride); - font-size: 14px; - word-wrap: break-word; - width: 320px; - height: "100%"; - text-align: left; - font-weight: 400; - padding: 10px 0px 10px 10px; - margin: 10px; - overflow-y: hidden; + -webkit-appearance: none; + color: var(--vscode-badgeForegroundOverride); + font-size: 14px; + word-wrap: break-word; + width: 320px; + height: "100%"; + text-align: left; + font-weight: 400; + padding: 10px 0px 10px 10px; + margin: 10px; + overflow-y: hidden; } .title_group { - margin-top: 20px; - width: fit-content; - padding-left: 16px; + margin-top: 20px; + width: fit-content; + padding-left: 16px; } .try_area { - position: relative; - padding-bottom: 30px; - text-align: left; - line-height: 17px; - font-weight: 100; - opacity: 90%; - font-size: 14px; - word-wrap: break-word; - padding-right: 10px; + position: relative; + padding-bottom: 30px; + text-align: left; + line-height: 17px; + font-weight: 100; + opacity: 90%; + font-size: 14px; + word-wrap: break-word; + padding-right: 10px; } .link-parent { - padding-top: 12px; - -webkit-appearance: none; - color: var(--vscode-textLink-foreground); - text-align: right; - text-decoration: none; - font-weight: bold; + padding-top: 12px; + -webkit-appearance: none; + color: var(--vscode-textLink-foreground); + text-align: right; + text-decoration: none; + font-weight: bold; } .link-parent:hover { - -webkit-appearance: none; - color: var(--vscode-textLink-activeForeground); - text-decoration: none; + -webkit-appearance: none; + color: var(--vscode-textLink-activeForeground); + text-decoration: none; } .link { - -webkit-appearance: none; - text-decoration: none; + -webkit-appearance: none; + text-decoration: none; } .gesture-container { - display: "flex"; - justify-content: "space-between"; - flex-direction: "column"; - align-items: "center"; - height: 750; - padding-top: 10px; + display: "flex"; + justify-content: "space-between"; + flex-direction: "column"; + align-items: "center"; + height: 750; + padding-top: 10px; } .generic-slider-component { - padding-top: 10px; + padding-top: 10px; } diff --git a/src/view/svgs/arrow_right_svg.tsx b/src/view/svgs/arrow_right_svg.tsx index 7eead7979..538c52229 100644 --- a/src/view/svgs/arrow_right_svg.tsx +++ b/src/view/svgs/arrow_right_svg.tsx @@ -1,21 +1,20 @@ import * as React from "react"; export const ARROW_RIGHT_SVG = ( - - - + + + ); export default ARROW_RIGHT_SVG; diff --git a/src/view/svgs/close_svg.tsx b/src/view/svgs/close_svg.tsx index ac05bedfc..b591fa868 100644 --- a/src/view/svgs/close_svg.tsx +++ b/src/view/svgs/close_svg.tsx @@ -1,26 +1,25 @@ import * as React from "react"; export const CLOSE_SVG = ( - - - - + + + + ); export default CLOSE_SVG; diff --git a/src/view/svgs/play_svg.tsx b/src/view/svgs/play_svg.tsx index 0da21aa9d..8c1317ee1 100644 --- a/src/view/svgs/play_svg.tsx +++ b/src/view/svgs/play_svg.tsx @@ -1,19 +1,18 @@ import * as React from "react"; export const PLAY_SVG = ( - - - + + + ); export default PLAY_SVG; diff --git a/src/view/svgs/refresh_svg.tsx b/src/view/svgs/refresh_svg.tsx index 340ad03f8..4df58cd59 100644 --- a/src/view/svgs/refresh_svg.tsx +++ b/src/view/svgs/refresh_svg.tsx @@ -2,20 +2,19 @@ import * as React from "react"; import "../styles/Button.css"; export const REFRESH_SVG = ( - - - + + + ); export default REFRESH_SVG; diff --git a/src/view/svgs/stop_svg.tsx b/src/view/svgs/stop_svg.tsx index a89175f66..f6a628fa3 100644 --- a/src/view/svgs/stop_svg.tsx +++ b/src/view/svgs/stop_svg.tsx @@ -1,21 +1,20 @@ import * as React from "react"; export const STOP_SVG = ( - - - + + + ); export default STOP_SVG; diff --git a/src/view/svgs/tag_input_svg.tsx b/src/view/svgs/tag_input_svg.tsx index 13a507504..8e346d140 100644 --- a/src/view/svgs/tag_input_svg.tsx +++ b/src/view/svgs/tag_input_svg.tsx @@ -1,27 +1,26 @@ import * as React from "react"; export const TAG_INPUT_SVG = ( - - - - + + + + ); export default TAG_INPUT_SVG; diff --git a/src/view/svgs/tag_output_svg.tsx b/src/view/svgs/tag_output_svg.tsx index 745175db5..157dca014 100644 --- a/src/view/svgs/tag_output_svg.tsx +++ b/src/view/svgs/tag_output_svg.tsx @@ -1,26 +1,25 @@ import * as React from "react"; export const TAG_OUTPUT_SVG = ( - - - - + + + + ); export default TAG_OUTPUT_SVG; diff --git a/src/view/svgs/toolbar_svg.tsx b/src/view/svgs/toolbar_svg.tsx index 52de70b86..701725550 100644 --- a/src/view/svgs/toolbar_svg.tsx +++ b/src/view/svgs/toolbar_svg.tsx @@ -3,738 +3,693 @@ import { TOOLBAR_ICON_LABEL } from "../components/toolbar/SensorModalUtils"; import "../styles/Button.css"; export const LEFT_EDGE_SVG = ( - - - - - - - - - - + + + + + + + + + + ); export const RIGHT_EDGE_SVG = ( - - - - - - - - - - + + + + + + + + + + ); export const GPIO_SVG = ( - - Created with Sketch. - - - - - - + + Created with Sketch. + + + + + + ); export const IR_SVG = ( - - Created with Sketch. - - - - - - - - + + Created with Sketch. + + + + + + + + ); export const LIGHT_SVG = ( - - - - - - - - - - - + + + + + + + + + + + ); export const MOTION_SVG = ( - - - - - - - - - - - + + + + + + + + + + + ); export const NEO_PIXEL_SVG = ( - - Created with Sketch. - - - - - - - - - - - - - - - + + Created with Sketch. + + + + + + + + + + + + + + + ); export const PUSH_BUTTON_SVG = ( - - Created with Sketch. - - - - - - - - - + + Created with Sketch. + + + + + + + + + ); export const RED_LED_SVG = ( - - Created with Sketch. - - - - - - - - - + + Created with Sketch. + + + + + + + + + ); export const SLIDER_SWITCH_SVG = ( - - Created with Sketch. - - - - - - - - - + + Created with Sketch. + + + + + + + + + ); export const SOUND_SVG = ( - - Created with Sketch. - - - - - - - - - - - + + Created with Sketch. + + + + + + + + + + + ); export const SPEAKER_SVG = ( - - Created with Sketch. - - - - - - - - + + Created with Sketch. + + + + + + + + ); export const TEMPERATURE_SVG = ( - - - - - - - - - + + + + + + + + + ); export const WIRELESS_SVG = ( - - - - - - - - - + + + + + + + + + ); export default LEFT_EDGE_SVG; export const GESTURE_SVG = ( - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + ); export const HUMIDITY_SVG = ( - - - - + + + - - - - - - - - - + /> + + + ); export const PRESSURE_SVG = ( - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + ); export const PROXIMITY_SVG = ( - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + ); export const MAGNET_SVG = ( - - - + + - - + /> + + ); export const GYROSCOPE_SVG = ( - - - + + + - - - - - - - - - + + + + + + + + + ); export const COMPASS_SVG = ( - - - - - + + + + + ); diff --git a/src/view/translations/en.json b/src/view/translations/en.json index 0a873c763..6583386d6 100644 --- a/src/view/translations/en.json +++ b/src/view/translations/en.json @@ -1,112 +1,112 @@ -{ - "toolbar-gpio.description": "8 GPIOs on the device! Pin A1 - A7 can also be used as capacitive touch sensors, and A0 is a true analog output pin.", - "toolbar-gpio.title": "GPIO", - "toolbar-gpio.tryItDescription": "Use your mouse to interact with the pin A1 - A7 or use your keyboard SHIFT + ”1” - “7”.", - "toolbar-ir-sensor.description": "Allows you to send commands to the device with a remote control, or even send messages between multiple devices! You can also do very simple proximity sensing since it reads the reflected light.", - "toolbar-ir-sensor.title": "IR Transmit & Receiver", - "toolbar-ir-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-light-sensor.description": "An analog light sensor can be used to detect ambient light, with similar spectral response to the human eye.", - "toolbar-light-sensor.title": "Light Sensor", - "toolbar-light-sensor.tryItDescription": "Change the brightness detected by the sensor here!", - "toolbar-motion-sensor.description": "Detects acceleration in X, Y and Z orientations. It can also detect 'tap' and 'double tap' strikes on the board and when the board is shaken.", - "toolbar-motion-sensor.title": "Motion Sensor", - "toolbar-motion-sensor.tryItDescription": "Change the acceleration here and click or click on the button to simulate a shake. The tap feature is not supported by the Device Simulator Express. If you would like to see the 'tap' feature implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-neo-pixels.description": "The 10 full color RGB LEDs surrounding the outer edge of the boards can be set to any color. Great for beautiful lighting effects!", - "toolbar-neo-pixels.title": "NeoPixels", - "toolbar-neo-pixels.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-a-b-push.description": "Two push buttons A and B are connected to digital pin #4 (Left) and #5 (Right) each.", - "toolbar-a-b-push.title": "Push Buttons", - "toolbar-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-red-led.description": "This Red LED is connected to the digital #13 GPIO pin. It can be very handy when you want an indicator LED.", - "toolbar-red-led.title": "Red LED", - "toolbar-red-led.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-sound-sensor.description": "A digital microphone can detect audio volume and even perform basic FFT functions but cannot read it like an analog voltage.", - "toolbar-sound-sensor.title": "Sound Sensor", - "toolbar-sound-sensor.tryItDescription": "If you would like to see the sound sensor implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-slider-switch.description": "This slide switch returns True or False depending on whether it's ON or OFF and can be used as a toggle switch in your code!", - "toolbar-slider-switch.title": "Slider Switch", - "toolbar-slider-switch.tryItDescription": "Click it with your mouse or press 'S' on your keyboard to switch it ON and OFF!", - "toolbar-speaker.description": "This speaker can play a .wav file and different tones and also has a class D amplifier that is connected to an output A0 pin built in! You can turn it off using the shutdown control on pin #11 on the physical device.", - "toolbar-speaker.title": "Speaker", - "toolbar-speaker.tryItDescription": "Right now the tones are not supported on the simulator. If you would like to see tones implemented, please +1 the feature addition issue on GitHub! Regardless, you can play it on your device!", - "toolbar-temperature-sensor.description": "This sensor uses an NTC thermistor to sense temperature an calculate it with the analog voltage on analog pin #A9.", - "toolbar-temperature-sensor.title": "Temperature Sensor", - "toolbar-temperature-sensor.tryItDescription": "You can set the temperature in degrees Celsius.", - "toolbar-accelerometer-sensor.title": "Accelerometer", - "toolbar-accelerometer-sensor.description": "An accelerometer measures the acceleration of your micro:bit; this component senses when the micro:bit is moved.", - "toolbar-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", - "toolbar-microbit-light-sensor.title": "Light Sensor", - "toolbar-microbit-temperature-sensor.title": "Temperature Sensor", - "toolbar-microbit-led.title": "LEDs", - "toolbar-microbit-led.description": "The microbit has 25 LEDs for you to play with. The LEDs have 9 levels of brightness.", - "toolbar-microbit-led.tryItDescription": "Run your code and see the LEDs light up!", - "toolbar-microbit-a-b-push.title": "Buttons", - "toolbar-microbit-a-b-push.description": "There are two buttons on the front of the micro:bit (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", - "toolbar-microbit-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-microbit-sound.title": "Sound", - "toolbar-microbit-sound.description": "Your BBC micro:bit can be programmed to make a wide variety of sounds - from single notes, tones and beats to your own musical compositions.", - "toolbar-microbit-sound.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-gpio.title": "GPIO (Pins)", - "toolbar-microbit-gpio.description": "On the bottom edge of your BBC micro:bit there are 25 gold strips, called pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", - "toolbar-microbit-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-wireless.title": "Bluetooth & Radio", - "toolbar-microbit-wireless.description": "micro:bits can use radio waves and bluetooth services to communicate with each other.", - - "toolbar-microbit-wireless.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-gesture-sensor.title": "Gesture", - "toolbar-microbit-gesture-sensor.description": "If you move your BBC micro:bit in a certain way (as a gesture) then the micro:bit is able to detect this. It can recognize the following gestures: up, down, left, right, face up, face down, freefall, 3g, 6g, 8g, and shake.", - - "toolbar-microbit-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", - "toolbar-microbit-compass-sensor.title": "Compass", - "toolbar-microbit-compass-sensor.description": "A digital compass is an input sensor that detects magnetic fields. Your BBC micro:bit has an inbuilt compass that can detect the direction in which it is facing.", - "toolbar-microbit-compass-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-temperature-sensor.title": "Temperature", - "toolbar-clue-temperature-sensor.description": "CLUE uses the BMP280 sensor, an environmental sensor with temperature. This precision sensor from Bosch is the best low-cost, precision sensing solution for measuring temperature with ±1.0°C accuracy.", - - "toolbar-clue-temperature-sensor.tryItDescription": "You can simulate the temperature in your code!", - - "toolbar-clue-light-sensor.title": "Light/Color Sensor", - "toolbar-clue-light-sensor.description": "The light sensor uses APDS9960 and is able to return the red, blue, green and clear light.", - "toolbar-clue-light-sensor.tryItDescription": "You can set the color values of the light detected.", - "toolbar-clue-accelerometer-sensor.title": "Accelerometer", - "toolbar-clue-accelerometer-sensor.description": " The 3-axis accelerometer, can tell you which direction is down towards the Earth (by measuring gravity) or how fast the board is accelerating in 3D space.", - "toolbar-clue-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", - "toolbar-clue-led.title": "Neopixel", - "toolbar-clue-led.description": "The CLUE has one full RGB LED (NeoPixel) on the back of the device.", - - "toolbar-clue-led.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-clue-a-b-push.title": "Buttons", - "toolbar-clue-a-b-push.description": "There are two buttons on the front of the CLUE (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", - "toolbar-clue-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-clue-gpio.title": "Input/Output (GPIO)", - "toolbar-clue-gpio.description": "On the bottom edge of your CLUE, you have 25 pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", - "toolbar-clue-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-sound-sensor.title": "Sound", - "toolbar-clue-sound-sensor.description": "The CLUE uses a PDM MEMS microphone. PDM is a little like 1-bit PWM. You clock the mic with a 1 MHz - 3 MHz clock rate, and on the data line you'll get a square wave out that syncs with the clock.", - "toolbar-clue-sound-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-pressure-sensor.title": "Pressure", - "toolbar-clue-pressure-sensor.description": "CLUE uses the BMP280 sensor for barometric pressure. Because pressure changes with altitude, you can also use it as an altimeter with ±1 meter accuracy.", - - "toolbar-clue-pressure-sensor.tryItDescription": "You can set the pressure here in hectoPascals (hPa).", - "toolbar-clue-humidity-sensor.title": "Humidity", - "toolbar-clue-humidity-sensor.description": "The SHT30-D sensor has an excellent ±2% relative humidity and ±0.5°C accuracy for most uses.", - "toolbar-clue-humidity-sensor.tryItDescription": "You can set the humidity in percentage (%) here.", - "toolbar-clue-gesture-sensor.title": "Gesture", - "toolbar-clue-gesture-sensor.description": "The gesture sensor can detect directional gestures (left to right, right to left, up to down, down to up), but in theory more complicated gestures like zig-zag, clockwise or counterclockwise circle, near to far, etc. could also be detected with additional code. ", - "toolbar-clue-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", - "toolbar-clue-proximity-sensor.title": "Proximity", - "toolbar-clue-proximity-sensor.description": "The proximity sensor uses APDS9960 and is able to return how close an object is to the front of the sensor. This is a number from 0 to 255 where the higher the number the closer an object is to the sensor. You won't be able to translate this into an absolute value in units like inches or millimeters, you can only see how it changes relative to other values.", - - "toolbar-clue-proximity-sensor.tryItDescription": "Set relative proximity to the sensor in values from 0 - 255, where 0 means very close and 255 means very far.", - - "toolbar-clue-bluetooth.title": "Bluetooth", - "toolbar-clue-bluetooth.description": "You can transmit data over Bluetooth to a computer or mobile device for data plotting and logging, or save it to the built in storage.", - "toolbar-clue-bluetooth.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! ", - "toolbar-clue-speaker.description": "The CLUE has a buzzer/speaker for playing tones and beeps.", - "toolbar-clue-magnet-sensor.title": "Magnetometer", - "toolbar-clue-magnet-sensor.description": "Sense the magnetic fields that surround us with this handy triple-axis magnetometer (compass) module. Magnetometers can sense where the strongest magnetic force is coming from, generally used to detect magnetic north, but can also be used for measuring magnetic fields.", - "toolbar-clue-magnet-sensor.tryItDescription": "You can set the magnetic field value in microTeslas (uT).", - "toolbar-clue-gyroscope-sensor.title": "Gyroscope", - "toolbar-clue-gyroscope-sensor.description": "The 3-axis gyroscope that can measure spin and twist users LSM6DS33.", - "toolbar-clue-gyroscope-sensor.tryItDescription": "Set the angular velocity in degrees/second." -} +{ + "toolbar-gpio.description": "8 GPIOs on the device! Pin A1 - A7 can also be used as capacitive touch sensors, and A0 is a true analog output pin.", + "toolbar-gpio.title": "GPIO", + "toolbar-gpio.tryItDescription": "Use your mouse to interact with the pin A1 - A7 or use your keyboard SHIFT + ”1” - “7”.", + "toolbar-ir-sensor.description": "Allows you to send commands to the device with a remote control, or even send messages between multiple devices! You can also do very simple proximity sensing since it reads the reflected light.", + "toolbar-ir-sensor.title": "IR Transmit & Receiver", + "toolbar-ir-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-light-sensor.description": "An analog light sensor can be used to detect ambient light, with similar spectral response to the human eye.", + "toolbar-light-sensor.title": "Light Sensor", + "toolbar-light-sensor.tryItDescription": "Change the brightness detected by the sensor here!", + "toolbar-motion-sensor.description": "Detects acceleration in X, Y and Z orientations. It can also detect 'tap' and 'double tap' strikes on the board and when the board is shaken.", + "toolbar-motion-sensor.title": "Motion Sensor", + "toolbar-motion-sensor.tryItDescription": "Change the acceleration here and click or click on the button to simulate a shake. The tap feature is not supported by the Device Simulator Express. If you would like to see the 'tap' feature implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-neo-pixels.description": "The 10 full color RGB LEDs surrounding the outer edge of the boards can be set to any color. Great for beautiful lighting effects!", + "toolbar-neo-pixels.title": "NeoPixels", + "toolbar-neo-pixels.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-a-b-push.description": "Two push buttons A and B are connected to digital pin #4 (Left) and #5 (Right) each.", + "toolbar-a-b-push.title": "Push Buttons", + "toolbar-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", + "toolbar-red-led.description": "This Red LED is connected to the digital #13 GPIO pin. It can be very handy when you want an indicator LED.", + "toolbar-red-led.title": "Red LED", + "toolbar-red-led.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-sound-sensor.description": "A digital microphone can detect audio volume and even perform basic FFT functions but cannot read it like an analog voltage.", + "toolbar-sound-sensor.title": "Sound Sensor", + "toolbar-sound-sensor.tryItDescription": "If you would like to see the sound sensor implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-slider-switch.description": "This slide switch returns True or False depending on whether it's ON or OFF and can be used as a toggle switch in your code!", + "toolbar-slider-switch.title": "Slider Switch", + "toolbar-slider-switch.tryItDescription": "Click it with your mouse or press 'S' on your keyboard to switch it ON and OFF!", + "toolbar-speaker.description": "This speaker can play a .wav file and different tones and also has a class D amplifier that is connected to an output A0 pin built in! You can turn it off using the shutdown control on pin #11 on the physical device.", + "toolbar-speaker.title": "Speaker", + "toolbar-speaker.tryItDescription": "Right now the tones are not supported on the simulator. If you would like to see tones implemented, please +1 the feature addition issue on GitHub! Regardless, you can play it on your device!", + "toolbar-temperature-sensor.description": "This sensor uses an NTC thermistor to sense temperature an calculate it with the analog voltage on analog pin #A9.", + "toolbar-temperature-sensor.title": "Temperature Sensor", + "toolbar-temperature-sensor.tryItDescription": "You can set the temperature in degrees Celsius.", + "toolbar-accelerometer-sensor.title": "Accelerometer", + "toolbar-accelerometer-sensor.description": "An accelerometer measures the acceleration of your micro:bit; this component senses when the micro:bit is moved.", + "toolbar-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", + "toolbar-microbit-light-sensor.title": "Light Sensor", + "toolbar-microbit-temperature-sensor.title": "Temperature Sensor", + "toolbar-microbit-led.title": "LEDs", + "toolbar-microbit-led.description": "The microbit has 25 LEDs for you to play with. The LEDs have 9 levels of brightness.", + "toolbar-microbit-led.tryItDescription": "Run your code and see the LEDs light up!", + "toolbar-microbit-a-b-push.title": "Buttons", + "toolbar-microbit-a-b-push.description": "There are two buttons on the front of the micro:bit (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", + "toolbar-microbit-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", + "toolbar-microbit-sound.title": "Sound", + "toolbar-microbit-sound.description": "Your BBC micro:bit can be programmed to make a wide variety of sounds - from single notes, tones and beats to your own musical compositions.", + "toolbar-microbit-sound.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-microbit-gpio.title": "GPIO (Pins)", + "toolbar-microbit-gpio.description": "On the bottom edge of your BBC micro:bit there are 25 gold strips, called pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", + "toolbar-microbit-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-microbit-wireless.title": "Bluetooth & Radio", + "toolbar-microbit-wireless.description": "micro:bits can use radio waves and bluetooth services to communicate with each other.", + + "toolbar-microbit-wireless.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-microbit-gesture-sensor.title": "Gesture", + "toolbar-microbit-gesture-sensor.description": "If you move your BBC micro:bit in a certain way (as a gesture) then the micro:bit is able to detect this. It can recognize the following gestures: up, down, left, right, face up, face down, freefall, 3g, 6g, 8g, and shake.", + + "toolbar-microbit-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", + "toolbar-microbit-compass-sensor.title": "Compass", + "toolbar-microbit-compass-sensor.description": "A digital compass is an input sensor that detects magnetic fields. Your BBC micro:bit has an inbuilt compass that can detect the direction in which it is facing.", + "toolbar-microbit-compass-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", + "toolbar-clue-temperature-sensor.title": "Temperature", + "toolbar-clue-temperature-sensor.description": "CLUE uses the BMP280 sensor, an environmental sensor with temperature. This precision sensor from Bosch is the best low-cost, precision sensing solution for measuring temperature with ±1.0°C accuracy.", + + "toolbar-clue-temperature-sensor.tryItDescription": "You can simulate the temperature in your code!", + + "toolbar-clue-light-sensor.title": "Light/Color Sensor", + "toolbar-clue-light-sensor.description": "The light sensor uses APDS9960 and is able to return the red, blue, green and clear light.", + "toolbar-clue-light-sensor.tryItDescription": "You can set the color values of the light detected.", + "toolbar-clue-accelerometer-sensor.title": "Accelerometer", + "toolbar-clue-accelerometer-sensor.description": " The 3-axis accelerometer, can tell you which direction is down towards the Earth (by measuring gravity) or how fast the board is accelerating in 3D space.", + "toolbar-clue-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", + "toolbar-clue-led.title": "Neopixel", + "toolbar-clue-led.description": "The CLUE has one full RGB LED (NeoPixel) on the back of the device.", + + "toolbar-clue-led.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-clue-a-b-push.title": "Buttons", + "toolbar-clue-a-b-push.description": "There are two buttons on the front of the CLUE (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", + "toolbar-clue-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", + "toolbar-clue-gpio.title": "Input/Output (GPIO)", + "toolbar-clue-gpio.description": "On the bottom edge of your CLUE, you have 25 pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", + "toolbar-clue-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", + "toolbar-clue-sound-sensor.title": "Sound", + "toolbar-clue-sound-sensor.description": "The CLUE uses a PDM MEMS microphone. PDM is a little like 1-bit PWM. You clock the mic with a 1 MHz - 3 MHz clock rate, and on the data line you'll get a square wave out that syncs with the clock.", + "toolbar-clue-sound-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", + "toolbar-clue-pressure-sensor.title": "Pressure", + "toolbar-clue-pressure-sensor.description": "CLUE uses the BMP280 sensor for barometric pressure. Because pressure changes with altitude, you can also use it as an altimeter with ±1 meter accuracy.", + + "toolbar-clue-pressure-sensor.tryItDescription": "You can set the pressure here in hectoPascals (hPa).", + "toolbar-clue-humidity-sensor.title": "Humidity", + "toolbar-clue-humidity-sensor.description": "The SHT30-D sensor has an excellent ±2% relative humidity and ±0.5°C accuracy for most uses.", + "toolbar-clue-humidity-sensor.tryItDescription": "You can set the humidity in percentage (%) here.", + "toolbar-clue-gesture-sensor.title": "Gesture", + "toolbar-clue-gesture-sensor.description": "The gesture sensor can detect directional gestures (left to right, right to left, up to down, down to up), but in theory more complicated gestures like zig-zag, clockwise or counterclockwise circle, near to far, etc. could also be detected with additional code. ", + "toolbar-clue-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", + "toolbar-clue-proximity-sensor.title": "Proximity", + "toolbar-clue-proximity-sensor.description": "The proximity sensor uses APDS9960 and is able to return how close an object is to the front of the sensor. This is a number from 0 to 255 where the higher the number the closer an object is to the sensor. You won't be able to translate this into an absolute value in units like inches or millimeters, you can only see how it changes relative to other values.", + + "toolbar-clue-proximity-sensor.tryItDescription": "Set relative proximity to the sensor in values from 0 - 255, where 0 means very close and 255 means very far.", + + "toolbar-clue-bluetooth.title": "Bluetooth", + "toolbar-clue-bluetooth.description": "You can transmit data over Bluetooth to a computer or mobile device for data plotting and logging, or save it to the built in storage.", + "toolbar-clue-bluetooth.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! ", + "toolbar-clue-speaker.description": "The CLUE has a buzzer/speaker for playing tones and beeps.", + "toolbar-clue-magnet-sensor.title": "Magnetometer", + "toolbar-clue-magnet-sensor.description": "Sense the magnetic fields that surround us with this handy triple-axis magnetometer (compass) module. Magnetometers can sense where the strongest magnetic force is coming from, generally used to detect magnetic north, but can also be used for measuring magnetic fields.", + "toolbar-clue-magnet-sensor.tryItDescription": "You can set the magnetic field value in microTeslas (uT).", + "toolbar-clue-gyroscope-sensor.title": "Gyroscope", + "toolbar-clue-gyroscope-sensor.description": "The 3-axis gyroscope that can measure spin and twist users LSM6DS33.", + "toolbar-clue-gyroscope-sensor.tryItDescription": "Set the angular velocity in degrees/second." +} diff --git a/src/view/tsconfig.json b/src/view/tsconfig.json index 28c6454e0..3bb77287f 100644 --- a/src/view/tsconfig.json +++ b/src/view/tsconfig.json @@ -1,19 +1,19 @@ { - "compilerOptions": { - "module": "esnext", - "moduleResolution": "node", - "target": "es6", - "outDir": "out", - "lib": ["es6", "dom"], - "jsx": "react", - "sourceMap": true, - "rootDir": "..", - "strict": true, - "noUnusedLocals": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "experimentalDecorators": true - }, - "exclude": ["node_modules"], - "include": ["./index.tsx"] + "compilerOptions": { + "module": "esnext", + "moduleResolution": "node", + "target": "es6", + "outDir": "out", + "lib": ["es6", "dom"], + "jsx": "react", + "sourceMap": true, + "rootDir": "..", + "strict": true, + "noUnusedLocals": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "experimentalDecorators": true + }, + "exclude": ["node_modules"], + "include": ["./index.tsx"] } diff --git a/src/view/utils/MessageUtils.tsx b/src/view/utils/MessageUtils.tsx index 41e093455..18adf5031 100644 --- a/src/view/utils/MessageUtils.tsx +++ b/src/view/utils/MessageUtils.tsx @@ -1,12 +1,12 @@ -interface vscode { - postMessage(message: any): void; -} - -declare const vscode: vscode; - -export const sendMessage = ( - type: string, - state: TState -) => { - vscode.postMessage({ command: type, text: state }); -}; +interface vscode { + postMessage(message: any): void; +} + +declare const vscode: vscode; + +export const sendMessage = ( + type: string, + state: TState +) => { + vscode.postMessage({ command: type, text: state }); +}; diff --git a/src/view/viewUtils.tsx b/src/view/viewUtils.tsx index 1335d039f..a210b8021 100644 --- a/src/view/viewUtils.tsx +++ b/src/view/viewUtils.tsx @@ -3,29 +3,29 @@ import { SENSOR_LIST } from "./constants"; // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. export interface ISliderProps { - minValue: number; - maxValue: number; - maxLabel: string; - minLabel: string; - type: string | SENSOR_LIST; - axisLabel: string; - value?: number; - onUpdateValue?: (sensor: SENSOR_LIST, value: number) => void; - step: number; + minValue: number; + maxValue: number; + maxLabel: string; + minLabel: string; + type: string | SENSOR_LIST; + axisLabel: string; + value?: number; + onUpdateValue?: (sensor: SENSOR_LIST, value: number) => void; + step: number; } export interface ISensorButtonProps { - label: string; - type: string; - onMouseUp?: (event: React.PointerEvent) => void; - onMouseDown?: (event: React.PointerEvent) => void; - onKeyUp?: (event: React.KeyboardEvent) => void; - onKeyDown?: (event: React.KeyboardEvent) => void; + label: string; + type: string; + onMouseUp?: (event: React.PointerEvent) => void; + onMouseDown?: (event: React.PointerEvent) => void; + onKeyUp?: (event: React.KeyboardEvent) => void; + onKeyDown?: (event: React.KeyboardEvent) => void; } export interface ISensorProps { - LABEL: string; - sliderProps: ISliderProps[]; - unitLabel: string; + LABEL: string; + sliderProps: ISliderProps[]; + unitLabel: string; } export const X_SLIDER_INDEX = 0; diff --git a/tsconfig.json b/tsconfig.json index 8fd7e5501..8aa229a90 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,13 +1,13 @@ { - "compilerOptions": { - "module": "commonjs", - "target": "es6", - "outDir": "out", - "lib": ["es6", "dom"], - "sourceMap": true, - "rootDir": "src", - "jsx": "react", - "alwaysStrict": true - }, - "exclude": ["node_modules", ".vscode-test"] + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "outDir": "out", + "lib": ["es6", "dom"], + "sourceMap": true, + "rootDir": "src", + "jsx": "react", + "alwaysStrict": true + }, + "exclude": ["node_modules", ".vscode-test"] } diff --git a/tslint.json b/tslint.json index 534279116..1a4aa8078 100644 --- a/tslint.json +++ b/tslint.json @@ -1,34 +1,34 @@ { - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": [ - "tslint:latest", - "tslint-react", - "tslint-config-prettier", - "tslint-react-hooks", - "tslint-microsoft-contrib/latest" - ], - "rules": { - "no-implicit-dependencies": [true, "dev"], - "no-string-throw": true, - "no-unused-expression": true, - "no-duplicate-variable": true, - "no-empty": false, - "no-relative-imports": false, - "max-func-body-length": false, - "curly": true, - "class-name": true, - "triple-equals": true, - "object-literal-sort-keys": true, - "react-hooks-nesting": "error", - "ordered-imports": true, - "import-name": false, - "member-access": false, - "no-console": false, - "jsx-boolean-value": false, - "no-unnecessary-semicolons": false, - "no-http-string": false, - "export-name": false, - "interface-name": false - }, - "defaultSeverity": "warning" + "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], + "extends": [ + "tslint:latest", + "tslint-react", + "tslint-config-prettier", + "tslint-react-hooks", + "tslint-microsoft-contrib/latest" + ], + "rules": { + "no-implicit-dependencies": [true, "dev"], + "no-string-throw": true, + "no-unused-expression": true, + "no-duplicate-variable": true, + "no-empty": false, + "no-relative-imports": false, + "max-func-body-length": false, + "curly": true, + "class-name": true, + "triple-equals": true, + "object-literal-sort-keys": true, + "react-hooks-nesting": "error", + "ordered-imports": true, + "import-name": false, + "member-access": false, + "no-console": false, + "jsx-boolean-value": false, + "no-unnecessary-semicolons": false, + "no-http-string": false, + "export-name": false, + "interface-name": false + }, + "defaultSeverity": "warning" } diff --git a/webpack.config.js b/webpack.config.js index 82aae8c6e..95533509a 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -2,85 +2,85 @@ const path = require("path"); const tsImportPlugin = require("ts-import-plugin"); module.exports = { - entry: { - simulator: "./src/view/index.tsx" - }, - output: { - path: path.resolve(__dirname, "out"), - filename: "[name].js" - }, - devServer: { - historyApiFallback: true - }, - devtool: "source-map", - resolve: { - extensions: [".js", ".ts", ".tsx", ".json"] - }, - module: { - rules: [ - { - test: /\.(ts|tsx)$/, - loader: "ts-loader", - options: { - getCustomTransformers: () => ({ - before: [ - tsImportPlugin({ - libraryName: "antd", - libraryDirectory: "es", - style: true - }) - ] - }) - } - }, - { - test: /\.less$/, - use: [ - { - loader: "style-loader" - }, - { - loader: "css-loader", - options: { - importLoaders: 1, - sourceMap: true - } - }, - { - loader: "less-loader", - options: { - javascriptEnabled: true, - sourceMap: true, - modifyVars: { - "@body-background": "var(--background-color)" - } - } - } - ] - }, - { - test: /\.css$/, - use: [ - { - loader: "style-loader" - }, - { - loader: "css-loader" - } - ] - }, - { - test: /\.svg$/, - loader: "svg-inline" - } - ] - } - // When importing a module whose path matches one of the following, just - // assume a corresponding global variable exists and use that instead. - // This is important because it allows us to avoid bundling all of our - // dependencies, which allows browsers to cache those libraries between builds. - // externals: { - // react: "React", - // "react-dom": "ReactDOM" - // } + entry: { + simulator: "./src/view/index.tsx", + }, + output: { + path: path.resolve(__dirname, "out"), + filename: "[name].js", + }, + devServer: { + historyApiFallback: true, + }, + devtool: "source-map", + resolve: { + extensions: [".js", ".ts", ".tsx", ".json"], + }, + module: { + rules: [ + { + test: /\.(ts|tsx)$/, + loader: "ts-loader", + options: { + getCustomTransformers: () => ({ + before: [ + tsImportPlugin({ + libraryName: "antd", + libraryDirectory: "es", + style: true, + }), + ], + }), + }, + }, + { + test: /\.less$/, + use: [ + { + loader: "style-loader", + }, + { + loader: "css-loader", + options: { + importLoaders: 1, + sourceMap: true, + }, + }, + { + loader: "less-loader", + options: { + javascriptEnabled: true, + sourceMap: true, + modifyVars: { + "@body-background": "var(--background-color)", + }, + }, + }, + ], + }, + { + test: /\.css$/, + use: [ + { + loader: "style-loader", + }, + { + loader: "css-loader", + }, + ], + }, + { + test: /\.svg$/, + loader: "svg-inline", + }, + ], + }, + // When importing a module whose path matches one of the following, just + // assume a corresponding global variable exists and use that instead. + // This is important because it allows us to avoid bundling all of our + // dependencies, which allows browsers to cache those libraries between builds. + // externals: { + // react: "React", + // "react-dom": "ReactDOM" + // } }; From 17273ccf3f10933dac9aea7c4e90bbb86c0901dd Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Tue, 14 Nov 2023 22:42:19 +0200 Subject: [PATCH 09/64] squash! --- Source/constants.ts | 1014 +- Source/cpxWorkspace.ts | 36 +- Source/debugger/debugAdapter.ts | 84 +- Source/debugger/debugAdapterFactory.ts | 50 +- Source/debuggerCommunicationServer.ts | 235 +- Source/dev-requirements.txt | 2 +- Source/deviceContext.ts | 274 +- Source/extension.ts | 2080 +- Source/extension_utils/utils.ts | 300 +- Source/requirements.txt | 2 +- Source/serialMonitor.ts | 522 +- Source/serialPortControl.ts | 362 +- Source/service/PopupService.ts | 18 +- .../service/debuggerCommunicationService.ts | 44 +- Source/service/deviceSelectionService.ts | 14 +- Source/service/fileSelectionService.ts | 168 +- Source/service/messagingService.ts | 57 +- Source/service/setupService.ts | 1130 +- Source/service/telemetryHandlerService.ts | 1054 +- Source/service/webviewService.ts | 147 +- Source/simulatorDebugConfigurationProvider.ts | 143 +- Source/telemetry/getPackageInfo.ts | 86 +- Source/telemetry/telemetryAI.ts | 134 +- Source/test/runTest.ts | 26 +- Source/test/suite/index.ts | 54 +- Source/usbDetector.ts | 194 +- Source/view/App.css | 22 +- Source/view/App.spec.tsx | 40 +- Source/view/App.tsx | 152 +- Source/view/components/Button.tsx | 45 +- Source/view/components/Dropdown.tsx | 43 +- Source/view/components/clue/Clue.spec.tsx | 40 +- Source/view/components/clue/Clue.tsx | 262 +- Source/view/components/clue/ClueImage.tsx | 252 +- Source/view/components/clue/ClueSimulator.tsx | 550 +- Source/view/components/clue/Clue_svg.tsx | 2309 +- .../components/cpx/Accessibility_utils.ts | 32 +- Source/view/components/cpx/Cpx.spec.tsx | 40 +- Source/view/components/cpx/Cpx.tsx | 164 +- Source/view/components/cpx/CpxImage.tsx | 688 +- Source/view/components/cpx/CpxSimulator.tsx | 730 +- Source/view/components/cpx/Cpx_svg.tsx | 5981 ++-- Source/view/components/cpx/Cpx_svg_style.tsx | 68 +- Source/view/components/cpx/Svg_utils.tsx | 156 +- .../components/microbit/Microbit.spec.tsx | 40 +- Source/view/components/microbit/Microbit.tsx | 206 +- .../components/microbit/MicrobitImage.tsx | 260 +- .../components/microbit/MicrobitSimulator.tsx | 452 +- .../view/components/microbit/Microbit_svg.tsx | 3661 +-- .../view/components/simulator/ActionBar.tsx | 60 +- .../toolbar/GenericSliderComponent.tsx | 66 +- Source/view/components/toolbar/Gesture.tsx | 117 +- .../view/components/toolbar/InputSlider.tsx | 212 +- .../view/components/toolbar/SensorButton.tsx | 59 +- .../components/toolbar/SensorModalUtils.tsx | 274 +- Source/view/components/toolbar/ToolBar.tsx | 392 +- .../view/components/toolbar/Toolbar.spec.tsx | 78 +- .../toolbar/clue/ClueModalContent.tsx | 504 +- .../toolbar/clue/ClueSensorProperties.tsx | 312 +- .../toolbar/cpx/CpxModalContent.tsx | 310 +- .../toolbar/cpx/CpxSensorProperties.tsx | 96 +- .../toolbar/microbit/MicrobitModalContent.tsx | 292 +- .../microbit/MicrobitSensorProperties.tsx | 96 +- Source/view/constants.ts | 220 +- Source/view/container/device/Device.spec.tsx | 40 +- Source/view/container/device/Device.tsx | 48 +- Source/view/index.css | 10 +- Source/view/index.tsx | 10 +- Source/view/pages/gettingStarted.css | 60 +- Source/view/pages/gettingStarted.spec.tsx | 40 +- Source/view/styles/Button.css | 34 +- Source/view/styles/Dropdown.css | 28 +- Source/view/styles/InputSlider.css | 116 +- Source/view/styles/LightSensorBar.css | 24 +- Source/view/styles/MotionSensorBar.css | 18 +- Source/view/styles/SensorButton.css | 32 +- Source/view/styles/Simulator.css | 122 +- Source/view/styles/SimulatorSvg.css | 212 +- Source/view/styles/TemperatureSensorBar.css | 22 +- Source/view/styles/ToolBar.css | 232 +- Source/view/svgs/arrow_right_svg.tsx | 29 +- Source/view/svgs/close_svg.tsx | 39 +- Source/view/svgs/play_svg.tsx | 25 +- Source/view/svgs/refresh_svg.tsx | 27 +- Source/view/svgs/stop_svg.tsx | 29 +- Source/view/svgs/tag_input_svg.tsx | 41 +- Source/view/svgs/tag_output_svg.tsx | 39 +- Source/view/svgs/toolbar_svg.tsx | 1289 +- Source/view/translations/en.json | 204 +- Source/view/tsconfig.json | 34 +- Source/view/utils/MessageUtils.tsx | 8 +- Source/view/viewUtils.tsx | 36 +- src/adafruit_circuitplayground/__init__.py | 4 - src/adafruit_circuitplayground/constants.py | 78 - src/adafruit_circuitplayground/express.py | 215 - .../locale/en/LC_MESSAGES/express.po | 26 - .../locale/express.pot | 26 - src/adafruit_circuitplayground/pixel.py | 133 - .../test/__init__.py | 0 .../test/sample.mp4 | Bin 1055736 -> 0 bytes .../test/sample.wav | Bin 210158 -> 0 bytes .../test/test_express.py | 115 - .../test/test_pixel.py | 117 - src/base_circuitpython/__init__.py | 8 - src/base_circuitpython/base_cp_constants.py | 82 - src/base_circuitpython/board.py | 128 - src/base_circuitpython/digitalio.py | 17 - src/base_circuitpython/displayio/__init__.py | 11 - src/base_circuitpython/displayio/bitmap.py | 105 - .../displayio/color_type.py | 12 - src/base_circuitpython/displayio/constants.py | 12 - src/base_circuitpython/displayio/group.py | 354 - src/base_circuitpython/displayio/palette.py | 81 - .../displayio/test/__init__.py | 0 .../displayio/test/img/group_test_result.bmp | Bin 172854 -> 0 bytes .../displayio/test/test_bitmap.py | 44 - .../displayio/test/test_group.py | 174 - .../displayio/test/test_palette.py | 31 - .../displayio/test/test_tile_grid.py | 173 - src/base_circuitpython/displayio/tile_grid.py | 280 - src/base_circuitpython/fontio.py | 14 - src/base_circuitpython/fonts/ter-u12n.bdf | 25240 ---------------- src/base_circuitpython/img/blinka.bmp | Bin 172856 -> 0 bytes src/base_circuitpython/neopixel_write.py | 55 - src/base_circuitpython/pulseio.py | 16 - src/base_circuitpython/terminal_handler.py | 108 - src/base_circuitpython/terminalio.py | 15 - src/base_circuitpython/test/__init__.py | 0 .../test/test_terminal_handler.py | 61 - src/check_if_venv.py | 11 - src/check_python_dependencies.py | 36 - src/clue/__init__.py | 1 - src/clue/adafruit_clue.py | 852 - src/clue/adafruit_display_text/label.py | 280 - src/clue/adafruit_slideshow.py | 407 - src/clue/test/__init__.py | 0 src/clue/test/img/test_clue_text_1.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_display_text_1.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_display_text_2.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_display_text_3.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_display_text_4.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_image_shapes_1.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_image_shapes_2.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_image_shapes_3.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_image_shapes_4.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_image_shapes_5.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_image_text_1.bmp | Bin 230454 -> 0 bytes src/clue/test/img/test_image_text_2.bmp | Bin 230454 -> 0 bytes src/clue/test/img/test_image_text_3.bmp | Bin 230454 -> 0 bytes src/clue/test/img/test_image_text_4.bmp | Bin 230454 -> 0 bytes src/clue/test/slideshow_pics/pic_1.bmp | Bin 113974 -> 0 bytes src/clue/test/slideshow_pics/pic_2.bmp | Bin 113974 -> 0 bytes src/clue/test/slideshow_pics/pic_3.bmp | Bin 330726 -> 0 bytes src/clue/test/slideshow_pics/pic_4.bmp | Bin 327414 -> 0 bytes src/clue/test/slideshow_pics/pic_5.bmp | Bin 225622 -> 0 bytes src/clue/test/slideshow_pics/pic_6.bmp | Bin 115818 -> 0 bytes src/clue/test/slideshow_pics/pic_7.bmp | Bin 93510 -> 0 bytes src/clue/test/slideshow_pics/pic_8.bmp | Bin 193734 -> 0 bytes src/clue/test/test_adafruit_clue.py | 193 - src/clue/test/test_adafruit_display_shapes.py | 81 - src/clue/test/test_adafruit_display_text.py | 65 - src/clue/test/test_adafruit_slideshow.py | 100 - src/clue/test/test_helpers.py | 32 - src/common/__init__.py | 0 src/common/constants.py | 12 - src/common/debugger_communication_client.py | 104 - src/common/telemetry.py | 35 - src/common/telemetry_events.py | 65 - src/common/test/__init__.py | 0 .../test_debugger_communication_client.py | 193 - src/common/test/test_utils.py | 32 - src/common/utils.py | 67 - src/constants.ts | 555 - src/cpxWorkspace.ts | 26 - src/debug_user_code.py | 95 - src/debugger/debugAdapter.ts | 49 - src/debugger/debugAdapterFactory.ts | 33 - src/debuggerCommunicationServer.ts | 140 - src/dev-requirements.txt | 3 - src/device.py | 121 - src/deviceContext.ts | 151 - src/extension.ts | 1101 - src/extension_utils/utils.ts | 233 - src/install_dependencies.py | 9 - src/latest_release_note.ts | 38 - src/micropython/__init__.py | 0 src/micropython/audio.py | 39 - src/micropython/microbit/__init__.py | 52 - .../microbit/__model/accelerometer.py | 136 - src/micropython/microbit/__model/button.py | 59 - src/micropython/microbit/__model/compass.py | 88 - src/micropython/microbit/__model/constants.py | 169 - src/micropython/microbit/__model/display.py | 369 - src/micropython/microbit/__model/i2c.py | 51 - src/micropython/microbit/__model/image.py | 539 - .../microbit/__model/microbit_model.py | 98 - .../microbit/__model/producer_property.py | 3 - src/micropython/microbit/__model/spi.py | 66 - src/micropython/microbit/test/__init__.py | 0 .../microbit/test/test_accelerometer.py | 104 - src/micropython/microbit/test/test_button.py | 46 - src/micropython/microbit/test/test_display.py | 185 - src/micropython/microbit/test/test_image.py | 283 - src/micropython/microbit/test/test_init.py | 45 - .../microbit/test/test_microbit_model.py | 48 - src/micropython/music.py | 109 - src/micropython/radio.py | 180 - src/micropython/speech.py | 61 - src/micropython/utime.py | 132 - src/process_user_code.py | 152 - src/python_constants.py | 55 - src/requirements.txt | 12 - src/serialMonitor.ts | 310 - src/serialPortControl.ts | 196 - src/service/PopupService.ts | 16 - src/service/debuggerCommunicationService.ts | 27 - src/service/deviceSelectionService.ts | 12 - src/service/fileSelectionService.ts | 95 - src/service/messagingService.ts | 37 - src/service/setupService.ts | 576 - src/service/telemetryHandlerService.ts | 556 - src/service/webviewService.ts | 112 - src/simulatorDebugConfigurationProvider.ts | 84 - src/telemetry/getPackageInfo.ts | 57 - src/telemetry/telemetryAI.ts | 83 - src/templates/clue_template.py | 16 - src/templates/cpx_template.py | 16 - src/templates/microbit_template.py | 11 - src/test/runTest.ts | 23 - src/test/suite/index.ts | 50 - src/usbDetector.ts | 112 - src/view/App.css | 16 - src/view/App.spec.tsx | 28 - src/view/App.tsx | 101 - src/view/__snapshots__/App.spec.tsx.snap | 11 - src/view/components/Button.tsx | 34 - src/view/components/Dropdown.tsx | 35 - src/view/components/clue/Clue.spec.tsx | 29 - src/view/components/clue/Clue.tsx | 158 - src/view/components/clue/ClueImage.tsx | 156 - src/view/components/clue/ClueSimulator.tsx | 304 - src/view/components/clue/Clue_svg.tsx | 1184 - .../clue/__snapshots__/Clue.spec.tsx.snap | 2202 -- .../components/cpx/Accessibility_utils.ts | 26 - src/view/components/cpx/Cpx.spec.tsx | 29 - src/view/components/cpx/Cpx.tsx | 104 - src/view/components/cpx/CpxImage.tsx | 406 - src/view/components/cpx/CpxSimulator.tsx | 392 - src/view/components/cpx/Cpx_svg.tsx | 3002 -- src/view/components/cpx/Cpx_svg_style.tsx | 302 - src/view/components/cpx/Svg_utils.tsx | 98 - .../cpx/__snapshots__/Cpx.spec.tsx.snap | 4666 --- .../components/microbit/Microbit.spec.tsx | 29 - src/view/components/microbit/Microbit.tsx | 130 - .../components/microbit/MicrobitImage.tsx | 166 - .../components/microbit/MicrobitSimulator.tsx | 259 - src/view/components/microbit/Microbit_svg.tsx | 1890 -- .../__snapshots__/Microbit.spec.tsx.snap | 3238 -- src/view/components/simulator/ActionBar.tsx | 48 - .../toolbar/GenericSliderComponent.tsx | 41 - src/view/components/toolbar/Gesture.tsx | 71 - src/view/components/toolbar/InputSlider.tsx | 131 - src/view/components/toolbar/SensorButton.tsx | 46 - .../components/toolbar/SensorModalUtils.tsx | 176 - src/view/components/toolbar/ToolBar.tsx | 221 - src/view/components/toolbar/Toolbar.spec.tsx | 57 - .../__snapshots__/Toolbar.spec.tsx.snap | 143 - .../toolbar/clue/ClueModalContent.tsx | 318 - .../toolbar/clue/ClueSensorProperties.tsx | 216 - .../toolbar/cpx/CpxModalContent.tsx | 198 - .../toolbar/cpx/CpxSensorProperties.tsx | 71 - .../toolbar/microbit/MicrobitModalContent.tsx | 187 - .../microbit/MicrobitSensorProperties.tsx | 74 - src/view/constants.ts | 238 - src/view/container/device/Device.spec.tsx | 30 - src/view/container/device/Device.tsx | 42 - .../device/__snapshots__/Device.spec.tsx.snap | 3240 -- src/view/context.ts | 6 - src/view/index.css | 13 - src/view/index.tsx | 22 - .../gettingStarted.spec.tsx.snap | 901 - src/view/pages/gettingStarted.css | 56 - src/view/pages/gettingStarted.spec.tsx | 29 - src/view/pages/gettingStarted.tsx | 281 - .../debugger/debugger_vars.png | Bin 44993 -> 0 bytes .../debugger/debugging.gif | Bin 652131 -> 0 bytes .../debugger/start_debugging.jpg | Bin 51011 -> 0 bytes .../debugger/toolbar.png | Bin 4635 -> 0 bytes src/view/react-app-env.d.ts | 1 - src/view/styles/Button.css | 50 - src/view/styles/Dropdown.css | 24 - src/view/styles/InputSlider.css | 103 - src/view/styles/LightSensorBar.css | 20 - src/view/styles/MotionSensorBar.css | 20 - src/view/styles/SensorButton.css | 29 - src/view/styles/Simulator.css | 83 - src/view/styles/SimulatorSvg.css | 290 - src/view/styles/TemperatureSensorBar.css | 18 - src/view/styles/ToolBar.css | 182 - src/view/svgs/arrow_right_svg.tsx | 21 - src/view/svgs/close_svg.tsx | 26 - src/view/svgs/play_svg.tsx | 19 - src/view/svgs/refresh_svg.tsx | 21 - src/view/svgs/stop_svg.tsx | 21 - src/view/svgs/tag_input_svg.tsx | 27 - src/view/svgs/tag_output_svg.tsx | 26 - src/view/svgs/toolbar_svg.tsx | 740 - src/view/translations/en.json | 112 - src/view/tsconfig.json | 19 - src/view/utils/MessageUtils.tsx | 12 - src/view/viewUtils.tsx | 33 - src/vscode_import.ts | 3 - 312 files changed, 15255 insertions(+), 81180 deletions(-) delete mode 100644 src/adafruit_circuitplayground/__init__.py delete mode 100644 src/adafruit_circuitplayground/constants.py delete mode 100644 src/adafruit_circuitplayground/express.py delete mode 100644 src/adafruit_circuitplayground/locale/en/LC_MESSAGES/express.po delete mode 100644 src/adafruit_circuitplayground/locale/express.pot delete mode 100644 src/adafruit_circuitplayground/pixel.py delete mode 100644 src/adafruit_circuitplayground/test/__init__.py delete mode 100644 src/adafruit_circuitplayground/test/sample.mp4 delete mode 100644 src/adafruit_circuitplayground/test/sample.wav delete mode 100644 src/adafruit_circuitplayground/test/test_express.py delete mode 100644 src/adafruit_circuitplayground/test/test_pixel.py delete mode 100644 src/base_circuitpython/__init__.py delete mode 100644 src/base_circuitpython/base_cp_constants.py delete mode 100644 src/base_circuitpython/board.py delete mode 100644 src/base_circuitpython/digitalio.py delete mode 100644 src/base_circuitpython/displayio/__init__.py delete mode 100644 src/base_circuitpython/displayio/bitmap.py delete mode 100644 src/base_circuitpython/displayio/color_type.py delete mode 100644 src/base_circuitpython/displayio/constants.py delete mode 100644 src/base_circuitpython/displayio/group.py delete mode 100644 src/base_circuitpython/displayio/palette.py delete mode 100644 src/base_circuitpython/displayio/test/__init__.py delete mode 100644 src/base_circuitpython/displayio/test/img/group_test_result.bmp delete mode 100644 src/base_circuitpython/displayio/test/test_bitmap.py delete mode 100644 src/base_circuitpython/displayio/test/test_group.py delete mode 100644 src/base_circuitpython/displayio/test/test_palette.py delete mode 100644 src/base_circuitpython/displayio/test/test_tile_grid.py delete mode 100644 src/base_circuitpython/displayio/tile_grid.py delete mode 100644 src/base_circuitpython/fontio.py delete mode 100644 src/base_circuitpython/fonts/ter-u12n.bdf delete mode 100644 src/base_circuitpython/img/blinka.bmp delete mode 100644 src/base_circuitpython/neopixel_write.py delete mode 100644 src/base_circuitpython/pulseio.py delete mode 100644 src/base_circuitpython/terminal_handler.py delete mode 100644 src/base_circuitpython/terminalio.py delete mode 100644 src/base_circuitpython/test/__init__.py delete mode 100644 src/base_circuitpython/test/test_terminal_handler.py delete mode 100644 src/check_if_venv.py delete mode 100644 src/check_python_dependencies.py delete mode 100644 src/clue/__init__.py delete mode 100644 src/clue/adafruit_clue.py delete mode 100644 src/clue/adafruit_display_text/label.py delete mode 100644 src/clue/adafruit_slideshow.py delete mode 100644 src/clue/test/__init__.py delete mode 100644 src/clue/test/img/test_clue_text_1.bmp delete mode 100644 src/clue/test/img/test_display_text_1.bmp delete mode 100644 src/clue/test/img/test_display_text_2.bmp delete mode 100644 src/clue/test/img/test_display_text_3.bmp delete mode 100644 src/clue/test/img/test_display_text_4.bmp delete mode 100644 src/clue/test/img/test_image_shapes_1.bmp delete mode 100644 src/clue/test/img/test_image_shapes_2.bmp delete mode 100644 src/clue/test/img/test_image_shapes_3.bmp delete mode 100644 src/clue/test/img/test_image_shapes_4.bmp delete mode 100644 src/clue/test/img/test_image_shapes_5.bmp delete mode 100644 src/clue/test/img/test_image_text_1.bmp delete mode 100644 src/clue/test/img/test_image_text_2.bmp delete mode 100644 src/clue/test/img/test_image_text_3.bmp delete mode 100644 src/clue/test/img/test_image_text_4.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_1.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_2.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_3.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_4.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_5.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_6.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_7.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_8.bmp delete mode 100644 src/clue/test/test_adafruit_clue.py delete mode 100644 src/clue/test/test_adafruit_display_shapes.py delete mode 100644 src/clue/test/test_adafruit_display_text.py delete mode 100644 src/clue/test/test_adafruit_slideshow.py delete mode 100644 src/clue/test/test_helpers.py delete mode 100644 src/common/__init__.py delete mode 100644 src/common/constants.py delete mode 100644 src/common/debugger_communication_client.py delete mode 100644 src/common/telemetry.py delete mode 100644 src/common/telemetry_events.py delete mode 100644 src/common/test/__init__.py delete mode 100644 src/common/test/test_debugger_communication_client.py delete mode 100644 src/common/test/test_utils.py delete mode 100644 src/common/utils.py delete mode 100644 src/constants.ts delete mode 100644 src/cpxWorkspace.ts delete mode 100644 src/debug_user_code.py delete mode 100644 src/debugger/debugAdapter.ts delete mode 100644 src/debugger/debugAdapterFactory.ts delete mode 100644 src/debuggerCommunicationServer.ts delete mode 100644 src/dev-requirements.txt delete mode 100644 src/device.py delete mode 100644 src/deviceContext.ts delete mode 100644 src/extension.ts delete mode 100644 src/extension_utils/utils.ts delete mode 100644 src/install_dependencies.py delete mode 100644 src/latest_release_note.ts delete mode 100644 src/micropython/__init__.py delete mode 100644 src/micropython/audio.py delete mode 100644 src/micropython/microbit/__init__.py delete mode 100644 src/micropython/microbit/__model/accelerometer.py delete mode 100644 src/micropython/microbit/__model/button.py delete mode 100644 src/micropython/microbit/__model/compass.py delete mode 100644 src/micropython/microbit/__model/constants.py delete mode 100644 src/micropython/microbit/__model/display.py delete mode 100644 src/micropython/microbit/__model/i2c.py delete mode 100644 src/micropython/microbit/__model/image.py delete mode 100644 src/micropython/microbit/__model/microbit_model.py delete mode 100644 src/micropython/microbit/__model/producer_property.py delete mode 100644 src/micropython/microbit/__model/spi.py delete mode 100644 src/micropython/microbit/test/__init__.py delete mode 100644 src/micropython/microbit/test/test_accelerometer.py delete mode 100644 src/micropython/microbit/test/test_button.py delete mode 100644 src/micropython/microbit/test/test_display.py delete mode 100644 src/micropython/microbit/test/test_image.py delete mode 100644 src/micropython/microbit/test/test_init.py delete mode 100644 src/micropython/microbit/test/test_microbit_model.py delete mode 100644 src/micropython/music.py delete mode 100644 src/micropython/radio.py delete mode 100644 src/micropython/speech.py delete mode 100644 src/micropython/utime.py delete mode 100644 src/process_user_code.py delete mode 100644 src/python_constants.py delete mode 100644 src/requirements.txt delete mode 100644 src/serialMonitor.ts delete mode 100644 src/serialPortControl.ts delete mode 100644 src/service/PopupService.ts delete mode 100644 src/service/debuggerCommunicationService.ts delete mode 100644 src/service/deviceSelectionService.ts delete mode 100644 src/service/fileSelectionService.ts delete mode 100644 src/service/messagingService.ts delete mode 100644 src/service/setupService.ts delete mode 100644 src/service/telemetryHandlerService.ts delete mode 100644 src/service/webviewService.ts delete mode 100644 src/simulatorDebugConfigurationProvider.ts delete mode 100644 src/telemetry/getPackageInfo.ts delete mode 100644 src/telemetry/telemetryAI.ts delete mode 100644 src/templates/clue_template.py delete mode 100644 src/templates/cpx_template.py delete mode 100644 src/templates/microbit_template.py delete mode 100644 src/test/runTest.ts delete mode 100644 src/test/suite/index.ts delete mode 100644 src/usbDetector.ts delete mode 100644 src/view/App.css delete mode 100644 src/view/App.spec.tsx delete mode 100644 src/view/App.tsx delete mode 100644 src/view/__snapshots__/App.spec.tsx.snap delete mode 100644 src/view/components/Button.tsx delete mode 100644 src/view/components/Dropdown.tsx delete mode 100644 src/view/components/clue/Clue.spec.tsx delete mode 100644 src/view/components/clue/Clue.tsx delete mode 100644 src/view/components/clue/ClueImage.tsx delete mode 100644 src/view/components/clue/ClueSimulator.tsx delete mode 100644 src/view/components/clue/Clue_svg.tsx delete mode 100644 src/view/components/clue/__snapshots__/Clue.spec.tsx.snap delete mode 100644 src/view/components/cpx/Accessibility_utils.ts delete mode 100644 src/view/components/cpx/Cpx.spec.tsx delete mode 100644 src/view/components/cpx/Cpx.tsx delete mode 100644 src/view/components/cpx/CpxImage.tsx delete mode 100644 src/view/components/cpx/CpxSimulator.tsx delete mode 100644 src/view/components/cpx/Cpx_svg.tsx delete mode 100644 src/view/components/cpx/Cpx_svg_style.tsx delete mode 100644 src/view/components/cpx/Svg_utils.tsx delete mode 100644 src/view/components/cpx/__snapshots__/Cpx.spec.tsx.snap delete mode 100644 src/view/components/microbit/Microbit.spec.tsx delete mode 100644 src/view/components/microbit/Microbit.tsx delete mode 100644 src/view/components/microbit/MicrobitImage.tsx delete mode 100644 src/view/components/microbit/MicrobitSimulator.tsx delete mode 100644 src/view/components/microbit/Microbit_svg.tsx delete mode 100644 src/view/components/microbit/__snapshots__/Microbit.spec.tsx.snap delete mode 100644 src/view/components/simulator/ActionBar.tsx delete mode 100644 src/view/components/toolbar/GenericSliderComponent.tsx delete mode 100644 src/view/components/toolbar/Gesture.tsx delete mode 100644 src/view/components/toolbar/InputSlider.tsx delete mode 100644 src/view/components/toolbar/SensorButton.tsx delete mode 100644 src/view/components/toolbar/SensorModalUtils.tsx delete mode 100644 src/view/components/toolbar/ToolBar.tsx delete mode 100644 src/view/components/toolbar/Toolbar.spec.tsx delete mode 100644 src/view/components/toolbar/__snapshots__/Toolbar.spec.tsx.snap delete mode 100644 src/view/components/toolbar/clue/ClueModalContent.tsx delete mode 100644 src/view/components/toolbar/clue/ClueSensorProperties.tsx delete mode 100644 src/view/components/toolbar/cpx/CpxModalContent.tsx delete mode 100644 src/view/components/toolbar/cpx/CpxSensorProperties.tsx delete mode 100644 src/view/components/toolbar/microbit/MicrobitModalContent.tsx delete mode 100644 src/view/components/toolbar/microbit/MicrobitSensorProperties.tsx delete mode 100644 src/view/constants.ts delete mode 100644 src/view/container/device/Device.spec.tsx delete mode 100644 src/view/container/device/Device.tsx delete mode 100644 src/view/container/device/__snapshots__/Device.spec.tsx.snap delete mode 100644 src/view/context.ts delete mode 100644 src/view/index.css delete mode 100644 src/view/index.tsx delete mode 100644 src/view/pages/__snapshots__/gettingStarted.spec.tsx.snap delete mode 100644 src/view/pages/gettingStarted.css delete mode 100644 src/view/pages/gettingStarted.spec.tsx delete mode 100644 src/view/pages/gettingStarted.tsx delete mode 100644 src/view/pages/gettingStartedPictures/debugger/debugger_vars.png delete mode 100644 src/view/pages/gettingStartedPictures/debugger/debugging.gif delete mode 100644 src/view/pages/gettingStartedPictures/debugger/start_debugging.jpg delete mode 100644 src/view/pages/gettingStartedPictures/debugger/toolbar.png delete mode 100644 src/view/react-app-env.d.ts delete mode 100644 src/view/styles/Button.css delete mode 100644 src/view/styles/Dropdown.css delete mode 100644 src/view/styles/InputSlider.css delete mode 100644 src/view/styles/LightSensorBar.css delete mode 100644 src/view/styles/MotionSensorBar.css delete mode 100644 src/view/styles/SensorButton.css delete mode 100644 src/view/styles/Simulator.css delete mode 100644 src/view/styles/SimulatorSvg.css delete mode 100644 src/view/styles/TemperatureSensorBar.css delete mode 100644 src/view/styles/ToolBar.css delete mode 100644 src/view/svgs/arrow_right_svg.tsx delete mode 100644 src/view/svgs/close_svg.tsx delete mode 100644 src/view/svgs/play_svg.tsx delete mode 100644 src/view/svgs/refresh_svg.tsx delete mode 100644 src/view/svgs/stop_svg.tsx delete mode 100644 src/view/svgs/tag_input_svg.tsx delete mode 100644 src/view/svgs/tag_output_svg.tsx delete mode 100644 src/view/svgs/toolbar_svg.tsx delete mode 100644 src/view/translations/en.json delete mode 100644 src/view/tsconfig.json delete mode 100644 src/view/utils/MessageUtils.tsx delete mode 100644 src/view/viewUtils.tsx delete mode 100644 src/vscode_import.ts diff --git a/Source/constants.ts b/Source/constants.ts index fe702c639..b14d875f0 100644 --- a/Source/constants.ts +++ b/Source/constants.ts @@ -7,549 +7,549 @@ import * as nls from "vscode-nls"; // Debugger Server export const SERVER_INFO = { - DEFAULT_SERVER_PORT: 5577, - ERROR_CODE_INIT_SERVER: "ERROR_INIT_SERVER", - SERVER_PORT_CONFIGURATION: "deviceSimulatorExpress.debuggerServerPort", + DEFAULT_SERVER_PORT: 5577, + ERROR_CODE_INIT_SERVER: "ERROR_INIT_SERVER", + SERVER_PORT_CONFIGURATION: "deviceSimulatorExpress.debuggerServerPort", }; const localize: nls.LocalizeFunc = nls.config({ - messageFormat: nls.MessageFormat.file, + messageFormat: nls.MessageFormat.file, })(); export const CONFIG = { - CONFIG_ENV_ON_SWITCH: - "deviceSimulatorExpress.configNewEnvironmentUponSwitch", - PYTHON_PATH: "python.pythonPath", - SHOW_DEPENDENCY_INSTALL: "deviceSimulatorExpress.showDependencyInstall", - SHOW_NEW_FILE_POPUP: "deviceSimulatorExpress.showNewFilePopup", + CONFIG_ENV_ON_SWITCH: + "deviceSimulatorExpress.configNewEnvironmentUponSwitch", + PYTHON_PATH: "python.pythonPath", + SHOW_DEPENDENCY_INSTALL: "deviceSimulatorExpress.showDependencyInstall", + SHOW_NEW_FILE_POPUP: "deviceSimulatorExpress.showNewFilePopup", }; export const CONSTANTS = { - WEBVIEW_TYPE: { - SIMULATOR: "simulator", - TUTORIAL: "tutorial", - }, - DEBUG_CONFIGURATION_TYPE: "deviceSimulatorExpress", - DEVICE_NAME: { - CPX: "CPX", - MICROBIT: "micro:bit", - CLUE: "CLUE", - }, - DEVICE_NAME_FORMAL: { - CPX: "Circuit Playground Express", - MICROBIT: "micro:bit", - CLUE: "CLUE", - }, - SCRIPT_PATH: { - SIMULATOR: "out/simulator.js", - VSCODE_API: "out/vscode_import.js", - }, - ERROR: { - BAD_PYTHON_PATH: - 'Your interpreter is not pointing to a valid Python executable. Please select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application', - COMPORT_UNKNOWN_ERROR: - "Writing to COM port (GetOverlappedResult): Unknown error code 121", - CPX_FILE_ERROR: localize( - "error.cpxFileFormat", - "The cpx.json file format is not correct." - ), - DEBUGGER_SERVER_INIT_FAILED: (port: number) => { - return localize( - "error.debuggerServerInitFailed", - `Warning : The Debugger Server cannot be opened. Please try to free the port ${port} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.` - ); - }, - DEBUGGING_SESSION_IN_PROGESS: localize( - "error.debuggingSessionInProgress", - "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n" - ), - DEPENDENCY_DOWNLOAD_ERROR: - "Dependency download could not be completed. Functionality may be limited. Please review the installation docs.", - - FAILED_TO_OPEN_SERIAL_PORT: (port: string): string => { - return localize( - "error.failedToOpenSerialPort", - `[ERROR] Failed to open serial port ${port}.` - ); - }, - FAILED_TO_OPEN_SERIAL_PORT_DUE_TO: (port: string, error: any) => { - return localize( - "error.failedToOpenSerialPortDueTo", - `[ERROR] Failed to open serial port ${port} due to error: ${error}. \n` - ); - }, - INSTALLATION_ERROR: localize( - "error.installationError", - "Installation Error" - ), - - INVALID_FILE_EXTENSION_DEBUG: localize( - "error.invalidFileExtensionDebug", - "The file you tried to run isn't a Python file." - ), - INVALID_PYTHON_PATH: localize( - "error.invalidPythonPath", - 'We found that your selected Python interpreter version is too low to run the extension. Please upgrade to version 3.7+ or select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application.' - ), - LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT: localize( - "error.lowPythonVersionForMicrobitDeployment", - "To deploy your code to the micro:bit, you must be using Python 3.3+" - ), - NO_DEVICE: localize( - "error.noDevice", - "The device is not detected. Please double check if your board is connected and/or properly formatted" - ), - NO_FILE_TO_RUN: localize( - "error.noFileToRun", - '[ERROR] We can\'t find a Python file to run. Please make sure you select or open a new ".py" code file, or use the "New File" command to get started and see useful links.\n' - ), - NO_FILE_TO_DEPLOY: localize( - "error.noFileToDeploy", - "[ERROR] We can't find a Python file to deploy to your device.\n" - ), - NO_FOLDER_OPENED: localize( - "error.noFolderCreated", - "In order to use the Serial Monitor, you need to open a folder and reload VS Code." - ), - NO_PROGRAM_FOUND_DEBUG: localize( - "error.noProgramFoundDebug", - "Cannot find a program to debug." - ), - NO_PYTHON_PATH: localize( - "error.noPythonPath", - "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again." - ), - RECONNECT_DEVICE: localize( - "error.reconnectDevice", - "Please disconnect your Circuit Playground Express and try again." - ), - STDERR: (data: string) => { - return localize("error.stderr", `\n[ERROR] ${data} \n`); - }, - UNEXPECTED_MESSAGE: localize( - "error.unexpectedMessage", - "Webview sent an unexpected message" - ), - }, - FILESYSTEM: { - BASE_CIRCUITPYTHON: "base_circuitpython", - CLUE: "clue", - PYTHON_VENV_DIR: "venv", - MICROPYTHON_DIRECTORY: "micropython", - OUTPUT_DIRECTORY: "out", - }, - INFO: { - ALREADY_SUCCESSFUL_INSTALL: localize( - "info.successfulInstall", - "Your current configuration is already successfully set up for the Device Simulator Expresss." - ), - ARE_YOU_SURE: localize( - "info.areYouSure", - "Are you sure you don't want to install the dependencies? The extension can't run without installing them." - ), - CLOSED_SERIAL_PORT: (port: string) => { - return localize( - "info.closedSerialPort", - `[DONE] Closed the serial port - ${port} \n` - ); - }, - COMPLETED_MESSAGE: "Completed", - CPX_JSON_ALREADY_GENERATED: localize( - "info.cpxJsonAlreadyGenerated", - "cpx.json has already been generated." - ), - DEPLOY_DEVICE: localize( - "info.deployDevice", - "\n[INFO] Deploying code to the device...\n" - ), - DEPLOY_SIMULATOR: localize( - "info.deploySimulator", - "\n[INFO] Deploying code to the simulator...\n" - ), - DEPLOY_SUCCESS: localize( - "info.deploySuccess", - "\n[INFO] Code successfully copied! Your device should be loading and ready to go shortly.\n" - ), - EXTENSION_ACTIVATED: localize( - "info.extensionActivated", - "Congratulations, your extension Device Simulator Express is now active!" - ), - FILE_SELECTED: (filePath: string) => { - return localize( - "info.fileSelected", - `[INFO] File selected : ${filePath} \n` - ); - }, - FIRST_TIME_WEBVIEW: localize( - "info.firstTimeWebview", - 'To reopen the simulator select the command "Open Simulator" from command palette.' - ), - INSTALLING_PYTHON_VENV: localize( - "info.installingPythonVenv", - "A virtual environment is currently being created. The required Python packages will be installed. You will be prompted a message telling you when the installation is done." - ), - INSTALL_PYTHON_DEPS: localize( - "info.installPythonDependencies", - "Do you want us to try and install this extension's dependencies on your selected Python interpreter for you?" - ), - INSTALL_PYTHON_VENV: localize( - "info.installPythonVenv", - "Do you want us to try and install this extension's dependencies via virtual environment for you?" - ), - NEW_FILE: localize( - "info.newFile", - "New to Python or the Circuit Playground Express? We are here to help!" - ), - NO_DEVICE_CHOSEN_TO_DEPLOY_TO: localize( - "info.noDeviceChosenToDeployTo", - "\n[INFO] No device was selected to deploy to.\n" - ), - NO_DEVICE_CHOSEN_TO_SIMULATE_TO: localize( - "info.noDeviceChosenToSimulateTo", - "\n[INFO] No device was selected to simulate.\n" - ), - NO_DEVICE_CHOSEN_FOR_NEW_FILE: localize( - "info.noDeviceChosenForNewFile", - "\n[INFO] No device was selected to open a template file for.\n" - ), - OPENED_SERIAL_PORT: (port: string) => { - return localize( - "info.openedSerialPort", - `[INFO] Opened the serial port - ${port} \n` - ); - }, - OPENING_SERIAL_PORT: (port: string) => { - return localize( - "info.openingSerialPort", - `[STARTING] Opening the serial port - ${port} \n` - ); - }, - PLEASE_OPEN_FOLDER: localize( - "info.pleaseOpenFolder", - "Please open a folder first." - ), - REDIRECT: localize("info.redirect", "You are being redirected."), - RUNNING_CODE: localize("info.runningCode", "Running user code"), - SUCCESSFUL_INSTALL: localize( - "info.successfulInstall", - "Successfully set up the Python environment." - ), - THIRD_PARTY_WEBSITE_ADAFRUIT: localize( - "info.thirdPartyWebsiteAdafruit", - 'By clicking "Agree and Proceed" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit\'s privacy policy' - ), - THIRD_PARTY_WEBSITE_PIP: localize( - "info.thirdPartyWebsitePip", - 'By clicking "Agree and Proceed" you will be redirected to pip.pypa.io, a third party website not managed by Microsoft. Please note that your activity on pip.pypa.io is subject to PyPA\'s privacy policy' - ), - THIRD_PARTY_WEBSITE_PYTHON: localize( - "info.thirdPartyWebsitePython", - 'By clicking "Agree and Proceed" you will be redirected to python.org, a third party website not managed by Microsoft. Please note that your activity on python.org is subject to Python\'s privacy policy' - ), - UPDATED_TO_EXTENSION_VENV: localize( - "info.updatedToExtensionsVenv", - "Automatically updated interpreter to point to extension's virtual environment." - ), - WELCOME_OUTPUT_TAB: localize( - "info.welcomeOutputTab", - "Welcome to the Device Simulator Express output tab!\n\n" - ), - }, - LABEL: { - WEBVIEW_PANEL: localize( - "label.webviewPanel", - "Device Simulator Express" - ), - }, - LINKS: { - DOWNLOAD_PIP: "https://pip.pypa.io/en/stable/installing/", - DOWNLOAD_PYTHON: "https://www.python.org/downloads/", - EXAMPLE_CODE: - "https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples", - CPX_HELP: - "https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart", - CLUE_HELP: "https://learn.adafruit.com/adafruit-clue/circuitpython", - INSTALL: - "https://github.com/microsoft/vscode-python-devicesimulator/blob/dev/docs/install.md", - PRIVACY: "https://www.adafruit.com/privacy", - TUTORIALS: - "https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library", - }, - MISC: { - SELECT_PORT_PLACEHOLDER: localize( - "misc.selectPortPlaceholder", - "Select a serial port" - ), - SERIAL_MONITOR_NAME: localize( - "misc.serialMonitorName", - "Device Simulator Express Serial Monitor" - ), - SERIAL_MONITOR_TEST_IF_OPEN: localize( - "misc.testIfPortOpen", - "Test if serial port is open" - ), - }, - NAME: localize("name", "Device Simulator Express"), - TEMPLATE: { - CPX: "cpx_template.py", - MICROBIT: "microbit_template.py", - CLUE: "clue_template.py", - }, - WARNING: { - ACCEPT_AND_RUN: localize( - "warning.agreeAndRun", - "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk." - ), - INVALID_BAUD_RATE: localize( - "warning.invalidBaudRate", - "Invalid baud rate, keep baud rate unchanged." - ), - NO_RATE_SELECTED: localize( - "warning.noRateSelected", - "No rate is selected, keep baud rate unchanged." - ), - NO_SERIAL_PORT_SELECTED: localize( - "warning.noSerialPortSelected", - "No serial port was selected, please select a serial port first" - ), - SERIAL_MONITOR_ALREADY_OPENED: (port: string) => { - return localize( - "warning.serialMonitorAlreadyOpened", - `Serial monitor is already opened for ${port} \n` - ); - }, - SERIAL_MONITOR_NOT_STARTED: localize( - "warning.serialMonitorNotStarted", - "Serial monitor has not been started." - ), - SERIAL_PORT_NOT_STARTED: localize( - "warning.serialPortNotStarted", - "Serial port has not been started.\n" - ), - }, + WEBVIEW_TYPE: { + SIMULATOR: "simulator", + TUTORIAL: "tutorial", + }, + DEBUG_CONFIGURATION_TYPE: "deviceSimulatorExpress", + DEVICE_NAME: { + CPX: "CPX", + MICROBIT: "micro:bit", + CLUE: "CLUE", + }, + DEVICE_NAME_FORMAL: { + CPX: "Circuit Playground Express", + MICROBIT: "micro:bit", + CLUE: "CLUE", + }, + SCRIPT_PATH: { + SIMULATOR: "out/simulator.js", + VSCODE_API: "out/vscode_import.js", + }, + ERROR: { + BAD_PYTHON_PATH: + 'Your interpreter is not pointing to a valid Python executable. Please select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application', + COMPORT_UNKNOWN_ERROR: + "Writing to COM port (GetOverlappedResult): Unknown error code 121", + CPX_FILE_ERROR: localize( + "error.cpxFileFormat", + "The cpx.json file format is not correct." + ), + DEBUGGER_SERVER_INIT_FAILED: (port: number) => { + return localize( + "error.debuggerServerInitFailed", + `Warning : The Debugger Server cannot be opened. Please try to free the port ${port} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.` + ); + }, + DEBUGGING_SESSION_IN_PROGESS: localize( + "error.debuggingSessionInProgress", + "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n" + ), + DEPENDENCY_DOWNLOAD_ERROR: + "Dependency download could not be completed. Functionality may be limited. Please review the installation docs.", + + FAILED_TO_OPEN_SERIAL_PORT: (port: string): string => { + return localize( + "error.failedToOpenSerialPort", + `[ERROR] Failed to open serial port ${port}.` + ); + }, + FAILED_TO_OPEN_SERIAL_PORT_DUE_TO: (port: string, error: any) => { + return localize( + "error.failedToOpenSerialPortDueTo", + `[ERROR] Failed to open serial port ${port} due to error: ${error}. \n` + ); + }, + INSTALLATION_ERROR: localize( + "error.installationError", + "Installation Error" + ), + + INVALID_FILE_EXTENSION_DEBUG: localize( + "error.invalidFileExtensionDebug", + "The file you tried to run isn't a Python file." + ), + INVALID_PYTHON_PATH: localize( + "error.invalidPythonPath", + 'We found that your selected Python interpreter version is too low to run the extension. Please upgrade to version 3.7+ or select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application.' + ), + LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT: localize( + "error.lowPythonVersionForMicrobitDeployment", + "To deploy your code to the micro:bit, you must be using Python 3.3+" + ), + NO_DEVICE: localize( + "error.noDevice", + "The device is not detected. Please double check if your board is connected and/or properly formatted" + ), + NO_FILE_TO_RUN: localize( + "error.noFileToRun", + '[ERROR] We can\'t find a Python file to run. Please make sure you select or open a new ".py" code file, or use the "New File" command to get started and see useful links.\n' + ), + NO_FILE_TO_DEPLOY: localize( + "error.noFileToDeploy", + "[ERROR] We can't find a Python file to deploy to your device.\n" + ), + NO_FOLDER_OPENED: localize( + "error.noFolderCreated", + "In order to use the Serial Monitor, you need to open a folder and reload VS Code." + ), + NO_PROGRAM_FOUND_DEBUG: localize( + "error.noProgramFoundDebug", + "Cannot find a program to debug." + ), + NO_PYTHON_PATH: localize( + "error.noPythonPath", + "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again." + ), + RECONNECT_DEVICE: localize( + "error.reconnectDevice", + "Please disconnect your Circuit Playground Express and try again." + ), + STDERR: (data: string) => { + return localize("error.stderr", `\n[ERROR] ${data} \n`); + }, + UNEXPECTED_MESSAGE: localize( + "error.unexpectedMessage", + "Webview sent an unexpected message" + ), + }, + FILESYSTEM: { + BASE_CIRCUITPYTHON: "base_circuitpython", + CLUE: "clue", + PYTHON_VENV_DIR: "venv", + MICROPYTHON_DIRECTORY: "micropython", + OUTPUT_DIRECTORY: "out", + }, + INFO: { + ALREADY_SUCCESSFUL_INSTALL: localize( + "info.successfulInstall", + "Your current configuration is already successfully set up for the Device Simulator Expresss." + ), + ARE_YOU_SURE: localize( + "info.areYouSure", + "Are you sure you don't want to install the dependencies? The extension can't run without installing them." + ), + CLOSED_SERIAL_PORT: (port: string) => { + return localize( + "info.closedSerialPort", + `[DONE] Closed the serial port - ${port} \n` + ); + }, + COMPLETED_MESSAGE: "Completed", + CPX_JSON_ALREADY_GENERATED: localize( + "info.cpxJsonAlreadyGenerated", + "cpx.json has already been generated." + ), + DEPLOY_DEVICE: localize( + "info.deployDevice", + "\n[INFO] Deploying code to the device...\n" + ), + DEPLOY_SIMULATOR: localize( + "info.deploySimulator", + "\n[INFO] Deploying code to the simulator...\n" + ), + DEPLOY_SUCCESS: localize( + "info.deploySuccess", + "\n[INFO] Code successfully copied! Your device should be loading and ready to go shortly.\n" + ), + EXTENSION_ACTIVATED: localize( + "info.extensionActivated", + "Congratulations, your extension Device Simulator Express is now active!" + ), + FILE_SELECTED: (filePath: string) => { + return localize( + "info.fileSelected", + `[INFO] File selected : ${filePath} \n` + ); + }, + FIRST_TIME_WEBVIEW: localize( + "info.firstTimeWebview", + 'To reopen the simulator select the command "Open Simulator" from command palette.' + ), + INSTALLING_PYTHON_VENV: localize( + "info.installingPythonVenv", + "A virtual environment is currently being created. The required Python packages will be installed. You will be prompted a message telling you when the installation is done." + ), + INSTALL_PYTHON_DEPS: localize( + "info.installPythonDependencies", + "Do you want us to try and install this extension's dependencies on your selected Python interpreter for you?" + ), + INSTALL_PYTHON_VENV: localize( + "info.installPythonVenv", + "Do you want us to try and install this extension's dependencies via virtual environment for you?" + ), + NEW_FILE: localize( + "info.newFile", + "New to Python or the Circuit Playground Express? We are here to help!" + ), + NO_DEVICE_CHOSEN_TO_DEPLOY_TO: localize( + "info.noDeviceChosenToDeployTo", + "\n[INFO] No device was selected to deploy to.\n" + ), + NO_DEVICE_CHOSEN_TO_SIMULATE_TO: localize( + "info.noDeviceChosenToSimulateTo", + "\n[INFO] No device was selected to simulate.\n" + ), + NO_DEVICE_CHOSEN_FOR_NEW_FILE: localize( + "info.noDeviceChosenForNewFile", + "\n[INFO] No device was selected to open a template file for.\n" + ), + OPENED_SERIAL_PORT: (port: string) => { + return localize( + "info.openedSerialPort", + `[INFO] Opened the serial port - ${port} \n` + ); + }, + OPENING_SERIAL_PORT: (port: string) => { + return localize( + "info.openingSerialPort", + `[STARTING] Opening the serial port - ${port} \n` + ); + }, + PLEASE_OPEN_FOLDER: localize( + "info.pleaseOpenFolder", + "Please open a folder first." + ), + REDIRECT: localize("info.redirect", "You are being redirected."), + RUNNING_CODE: localize("info.runningCode", "Running user code"), + SUCCESSFUL_INSTALL: localize( + "info.successfulInstall", + "Successfully set up the Python environment." + ), + THIRD_PARTY_WEBSITE_ADAFRUIT: localize( + "info.thirdPartyWebsiteAdafruit", + 'By clicking "Agree and Proceed" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit\'s privacy policy' + ), + THIRD_PARTY_WEBSITE_PIP: localize( + "info.thirdPartyWebsitePip", + 'By clicking "Agree and Proceed" you will be redirected to pip.pypa.io, a third party website not managed by Microsoft. Please note that your activity on pip.pypa.io is subject to PyPA\'s privacy policy' + ), + THIRD_PARTY_WEBSITE_PYTHON: localize( + "info.thirdPartyWebsitePython", + 'By clicking "Agree and Proceed" you will be redirected to python.org, a third party website not managed by Microsoft. Please note that your activity on python.org is subject to Python\'s privacy policy' + ), + UPDATED_TO_EXTENSION_VENV: localize( + "info.updatedToExtensionsVenv", + "Automatically updated interpreter to point to extension's virtual environment." + ), + WELCOME_OUTPUT_TAB: localize( + "info.welcomeOutputTab", + "Welcome to the Device Simulator Express output tab!\n\n" + ), + }, + LABEL: { + WEBVIEW_PANEL: localize( + "label.webviewPanel", + "Device Simulator Express" + ), + }, + LINKS: { + DOWNLOAD_PIP: "https://pip.pypa.io/en/stable/installing/", + DOWNLOAD_PYTHON: "https://www.python.org/downloads/", + EXAMPLE_CODE: + "https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples", + CPX_HELP: + "https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart", + CLUE_HELP: "https://learn.adafruit.com/adafruit-clue/circuitpython", + INSTALL: + "https://github.com/microsoft/vscode-python-devicesimulator/blob/dev/docs/install.md", + PRIVACY: "https://www.adafruit.com/privacy", + TUTORIALS: + "https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library", + }, + MISC: { + SELECT_PORT_PLACEHOLDER: localize( + "misc.selectPortPlaceholder", + "Select a serial port" + ), + SERIAL_MONITOR_NAME: localize( + "misc.serialMonitorName", + "Device Simulator Express Serial Monitor" + ), + SERIAL_MONITOR_TEST_IF_OPEN: localize( + "misc.testIfPortOpen", + "Test if serial port is open" + ), + }, + NAME: localize("name", "Device Simulator Express"), + TEMPLATE: { + CPX: "cpx_template.py", + MICROBIT: "microbit_template.py", + CLUE: "clue_template.py", + }, + WARNING: { + ACCEPT_AND_RUN: localize( + "warning.agreeAndRun", + "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk." + ), + INVALID_BAUD_RATE: localize( + "warning.invalidBaudRate", + "Invalid baud rate, keep baud rate unchanged." + ), + NO_RATE_SELECTED: localize( + "warning.noRateSelected", + "No rate is selected, keep baud rate unchanged." + ), + NO_SERIAL_PORT_SELECTED: localize( + "warning.noSerialPortSelected", + "No serial port was selected, please select a serial port first" + ), + SERIAL_MONITOR_ALREADY_OPENED: (port: string) => { + return localize( + "warning.serialMonitorAlreadyOpened", + `Serial monitor is already opened for ${port} \n` + ); + }, + SERIAL_MONITOR_NOT_STARTED: localize( + "warning.serialMonitorNotStarted", + "Serial monitor has not been started." + ), + SERIAL_PORT_NOT_STARTED: localize( + "warning.serialPortNotStarted", + "Serial port has not been started.\n" + ), + }, }; export enum CONFIG_KEYS { - ENABLE_USB_DETECTION = "deviceSimulatorExpress.enableUSBDetection", + ENABLE_USB_DETECTION = "deviceSimulatorExpress.enableUSBDetection", } export enum TelemetryEventName { - FAILED_TO_OPEN_SIMULATOR = "SIMULATOR.FAILED_TO_OPEN", - - // Debugger - CPX_DEBUGGER_INIT_SUCCESS = "CPX.DEBUGGER.INIT.SUCCESS", - CPX_DEBUGGER_INIT_FAIL = "CPX.DEBUGGER.INIT.FAIL", - MICROBIT_DEBUGGER_INIT_SUCCESS = "MICROBIT.DEBUGGER.INIT.SUCCESS", - MICROBIT_DEBUGGER_INIT_FAIL = "MICROBIT.DEBUGGER.INIT.FAIL", - CLUE_DEBUGGER_INIT_SUCCESS = "CLUE.DEBUGGER.INIT.SUCCESS", - CLUE_DEBUGGER_INIT_FAIL = "CLUE.DEBUGGER.INIT.FAIL", - - // Extension commands - COMMAND_RUN_SIMULATOR_BUTTON = "COMMAND.RUN.SIMULATOR_BUTTON", - COMMAND_RUN_PALETTE = "COMMAND.RUN.PALETTE", - COMMAND_INSTALL_EXTENSION_DEPENDENCIES = "COMMAND.INSTALL.EXTENSION.DEPENDENCIES", - COMMAND_SERIAL_MONITOR_CHOOSE_PORT = "COMMAND.SERIAL_MONITOR.CHOOSE_PORT", - COMMAND_SERIAL_MONITOR_OPEN = "COMMAND.SERIAL_MONITOR.OPEN", - COMMAND_SERIAL_MONITOR_BAUD_RATE = "COMMAND.SERIAL_MONITOR.BAUD_RATE", - COMMAND_SERIAL_MONITOR_CLOSE = "COMMAND.SERIAL_MONITOR.CLOSE", - COMMAND_GETTING_STARTED = "COMMAND.GETTING_STARTED", - - CPX_COMMAND_DEPLOY_DEVICE = "CPX.COMMAND.DEPLOY.DEVICE", - CPX_COMMAND_NEW_FILE = "CPX.COMMAND.NEW.FILE.CPX", - CPX_COMMAND_OPEN_SIMULATOR = "CPX.COMMAND.OPEN.SIMULATOR", - - MICROBIT_COMMAND_DEPLOY_DEVICE = "MICROBIT.COMMAND.DEPLOY.DEVICE", - MICROBIT_COMMAND_NEW_FILE = "MICROBIT.COMMAND.NEW.FILE", - MICROBIT_COMMAND_OPEN_SIMULATOR = "MICROBIT.COMMAND.OPEN.SIMULATOR", - - CLUE_COMMAND_DEPLOY_DEVICE = "CLUE.COMMAND.DEPLOY.DEVICE", - CLUE_COMMAND_NEW_FILE = "CLUE.COMMAND.NEW.FILE.CPX", - CLUE_COMMAND_OPEN_SIMULATOR = "CLUE.COMMAND.OPEN.SIMULATOR", - - // Simulator interaction - CPX_SIMULATOR_BUTTON_A = "CPX.SIMULATOR.BUTTON.A", - CPX_SIMULATOR_BUTTON_B = "CPX.SIMULATOR.BUTTON.B", - CPX_SIMULATOR_BUTTON_AB = "CPX.SIMULATOR.BUTTON.AB", - CPX_SIMULATOR_SWITCH = "CPX.SIMULATOR.SWITCH", - - MICROBIT_SIMULATOR_BUTTON_A = "MICROBIT.SIMULATOR.BUTTON.A", - MICROBIT_SIMULATOR_BUTTON_B = "MICROBIT.SIMULATOR.BUTTON.B", - MICROBIT_SIMULATOR_BUTTON_AB = "MICROBIT.SIMULATOR.BUTTON.AB", - - CLUE_SIMULATOR_BUTTON_A = "CLUE.SIMULATOR.BUTTON.A", - CLUE_SIMULATOR_BUTTON_B = "CLUE.SIMULATOR.BUTTON.B", - CLUE_SIMULATOR_BUTTON_AB = "CLUE.SIMULATOR.BUTTON.AB", - - // Sensors - CPX_SIMULATOR_TEMPERATURE_SENSOR = "CPX.SIMULATOR.TEMPERATURE", - CPX_SIMULATOR_LIGHT_SENSOR = "CPX.SIMULATOR.LIGHT", - CPX_SIMULATOR_MOTION_SENSOR = "CPX.SIMULATOR.MOTION", - CPX_SIMULATOR_SHAKE = "CPX.SIMULATOR.SHAKE", - CPX_SIMULATOR_CAPACITIVE_TOUCH = "CPX.SIMULATOR.CAPACITIVE.TOUCH", - - MICROBIT_SIMULATOR_TEMPERATURE_SENSOR = "MICROBIT.SIMULATOR.TEMPERATURE", - MICROBIT_SIMULATOR_LIGHT_SENSOR = "MICROBIT.SIMULATOR.LIGHT", - MICROBIT_SIMULATOR_MOTION_SENSOR = "MICROBIT.SIMULATOR.MOTION", - MICROBIT_SIMULATOR_GESTURE_SENSOR = "MICROBIT.SIMULATOR.GESTURE", - - CLUE_SIMULATOR_TEMPERATURE_SENSOR = "CLUE.SIMULATOR.TEMPERATURE", - CLUE_SIMULATOR_LIGHT_SENSOR = "CLUE.SIMULATOR.LIGHT", - CLUE_SIMULATOR_MOTION_SENSOR = "CLUE.SIMULATOR.MOTION", - CLUE_SIMULATOR_GESTURE_SENSOR = "CLUE.SIMULATOR.GESTURE", - CLUE_SIMULATOR_PRESSURE_SENSOR = "CLUE.SIMULATOR.PRESSURE", - CLUE_SIMULATOR_PROXIMITY_SENSOR = "CLUE.SIMULATOR.PROXIMITY", - CLUE_SIMULATOR_HUMIDITY_SENSOR = "CLUE.SIMULATOR.HUMIDITY", - CLUE_SIMULATOR_GYRO_SENSOR = "CLUE.SIMULATOR.GYRO", - CLUE_SIMULATOR_MAGNET_SENSOR = "CLUE.SIMULATOR.MAGNET", - - // Pop-up dialog - CPX_CLICK_DIALOG_DONT_SHOW = "CPX.CLICK.DIALOG.DONT.SHOW", - CPX_CLICK_DIALOG_EXAMPLE_CODE = "CPX.CLICK.DIALOG.EXAMPLE.CODE", - CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CPX.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", - CPX_CLICK_DIALOG_TUTORIALS = "CPX.CLICK.DIALOG.TUTORIALS", - - CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CLUE.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", - - ERROR_PYTHON_PROCESS = "ERROR.PYTHON.PROCESS", - - CPX_ERROR_COMMAND_NEW_FILE = "CPX.ERROR.COMMAND.NEW.FILE", - CPX_ERROR_DEPLOY_WITHOUT_DEVICE = "CPX.ERROR.DEPLOY.WITHOUT.DEVICE", - CPX_ERROR_PYTHON_DEVICE_PROCESS = "CPX.ERROR.PYTHON.DEVICE.PROCESS", - CPX_SUCCESS_COMMAND_DEPLOY_DEVICE = "CPX.SUCCESS.COMMAND.DEPLOY.DEVICE", - - MICROBIT_ERROR_COMMAND_NEW_FILE = "MICROBIT.ERROR.COMMAND.NEW.FILE", - MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE = "MICROBIT.ERROR.DEPLOY.WITHOUT.DEVICE", - MICROBIT_ERROR_PYTHON_DEVICE_PROCESS = "MICROBIT.ERROR.PYTHON.DEVICE.PROCESS", - MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE = "MICROBIT.SUCCESS.COMMAND.DEPLOY.DEVICE", - - CLUE_ERROR_COMMAND_NEW_FILE = "CLUE.ERROR.COMMAND.NEW.FILE", - CLUE_ERROR_DEPLOY_WITHOUT_DEVICE = "CLUE.ERROR.DEPLOY.WITHOUT.DEVICE", - CLUE_ERROR_PYTHON_DEVICE_PROCESS = "CLUE.ERROR.PYTHON.DEVICE.PROCESS", - CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE = "CLUE.SUCCESS.COMMAND.DEPLOY.DEVICE", - - // Performance - CPX_PERFORMANCE_DEPLOY_DEVICE = "CPX.PERFORMANCE.DEPLOY.DEVICE", - CPX_PERFORMANCE_NEW_FILE = "CPX.PERFORMANCE.NEW.FILE", - CPX_PERFORMANCE_OPEN_SIMULATOR = "CPX.PERFORMANCE.OPEN.SIMULATOR", - - MICROBIT_PERFORMANCE_DEPLOY_DEVICE = "MICROBIT.PERFORMANCE.DEPLOY.DEVICE", - MICROBIT_PERFORMANCE_NEW_FILE = "MICROBIT.PERFORMANCE.NEW.FILE", - MICROBIT_PERFORMANCE_OPEN_SIMULATOR = "MICROBIT.PERFORMANCE.OPEN.SIMULATOR", - - CLUE_PERFORMANCE_DEPLOY_DEVICE = "CLUE.PERFORMANCE.DEPLOY.DEVICE", - CLUE_PERFORMANCE_NEW_FILE = "CLUE.PERFORMANCE.NEW.FILE", - CLUE_PERFORMANCE_OPEN_SIMULATOR = "CLUE.PERFORMANCE.OPEN.SIMULATOR", - - // Venv options - SETUP_VENV_CREATION_ERR = "SETUP.VENV.CREATION.ERR", - SETUP_NO_PIP = "SETUP.NO.PIP", - SETUP_DEP_INSTALL_FAIL = "SETUP.DEP.INSTALL.FAIL", - SETUP_AUTO_RESOLVE_PYTHON_PATH = "SETUP.AUTO.RESOLVE.PYTHON.PATH", - SETUP_NO_PYTHON_PATH = "SETUP.NO.PYTHON.PATH", - SETUP_DOWNLOAD_PYTHON = "SETUP.DOWNLOAD.PYTHON", - SETUP_INVALID_PYTHON_INTERPRETER_PATH = "SETUP.INVALID.PYTHON.INTERPRETER.PATH", - SETUP_INVALID_PYTHON_VER = "SETUP.INVALID.PYTHON.VER", - SETUP_INSTALL_VENV = "SETUP.INSTALL.VENV", - SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL = "SETUP.ORIGINAL.INTERPRETER.DEP.INSTALL", - SETUP_HAS_VENV = "SETUP.HAS.VENV", - SETUP_NO_DEPS_INSTALLED = "SETUP.NO.DEPS.INSTALLED", + FAILED_TO_OPEN_SIMULATOR = "SIMULATOR.FAILED_TO_OPEN", + + // Debugger + CPX_DEBUGGER_INIT_SUCCESS = "CPX.DEBUGGER.INIT.SUCCESS", + CPX_DEBUGGER_INIT_FAIL = "CPX.DEBUGGER.INIT.FAIL", + MICROBIT_DEBUGGER_INIT_SUCCESS = "MICROBIT.DEBUGGER.INIT.SUCCESS", + MICROBIT_DEBUGGER_INIT_FAIL = "MICROBIT.DEBUGGER.INIT.FAIL", + CLUE_DEBUGGER_INIT_SUCCESS = "CLUE.DEBUGGER.INIT.SUCCESS", + CLUE_DEBUGGER_INIT_FAIL = "CLUE.DEBUGGER.INIT.FAIL", + + // Extension commands + COMMAND_RUN_SIMULATOR_BUTTON = "COMMAND.RUN.SIMULATOR_BUTTON", + COMMAND_RUN_PALETTE = "COMMAND.RUN.PALETTE", + COMMAND_INSTALL_EXTENSION_DEPENDENCIES = "COMMAND.INSTALL.EXTENSION.DEPENDENCIES", + COMMAND_SERIAL_MONITOR_CHOOSE_PORT = "COMMAND.SERIAL_MONITOR.CHOOSE_PORT", + COMMAND_SERIAL_MONITOR_OPEN = "COMMAND.SERIAL_MONITOR.OPEN", + COMMAND_SERIAL_MONITOR_BAUD_RATE = "COMMAND.SERIAL_MONITOR.BAUD_RATE", + COMMAND_SERIAL_MONITOR_CLOSE = "COMMAND.SERIAL_MONITOR.CLOSE", + COMMAND_GETTING_STARTED = "COMMAND.GETTING_STARTED", + + CPX_COMMAND_DEPLOY_DEVICE = "CPX.COMMAND.DEPLOY.DEVICE", + CPX_COMMAND_NEW_FILE = "CPX.COMMAND.NEW.FILE.CPX", + CPX_COMMAND_OPEN_SIMULATOR = "CPX.COMMAND.OPEN.SIMULATOR", + + MICROBIT_COMMAND_DEPLOY_DEVICE = "MICROBIT.COMMAND.DEPLOY.DEVICE", + MICROBIT_COMMAND_NEW_FILE = "MICROBIT.COMMAND.NEW.FILE", + MICROBIT_COMMAND_OPEN_SIMULATOR = "MICROBIT.COMMAND.OPEN.SIMULATOR", + + CLUE_COMMAND_DEPLOY_DEVICE = "CLUE.COMMAND.DEPLOY.DEVICE", + CLUE_COMMAND_NEW_FILE = "CLUE.COMMAND.NEW.FILE.CPX", + CLUE_COMMAND_OPEN_SIMULATOR = "CLUE.COMMAND.OPEN.SIMULATOR", + + // Simulator interaction + CPX_SIMULATOR_BUTTON_A = "CPX.SIMULATOR.BUTTON.A", + CPX_SIMULATOR_BUTTON_B = "CPX.SIMULATOR.BUTTON.B", + CPX_SIMULATOR_BUTTON_AB = "CPX.SIMULATOR.BUTTON.AB", + CPX_SIMULATOR_SWITCH = "CPX.SIMULATOR.SWITCH", + + MICROBIT_SIMULATOR_BUTTON_A = "MICROBIT.SIMULATOR.BUTTON.A", + MICROBIT_SIMULATOR_BUTTON_B = "MICROBIT.SIMULATOR.BUTTON.B", + MICROBIT_SIMULATOR_BUTTON_AB = "MICROBIT.SIMULATOR.BUTTON.AB", + + CLUE_SIMULATOR_BUTTON_A = "CLUE.SIMULATOR.BUTTON.A", + CLUE_SIMULATOR_BUTTON_B = "CLUE.SIMULATOR.BUTTON.B", + CLUE_SIMULATOR_BUTTON_AB = "CLUE.SIMULATOR.BUTTON.AB", + + // Sensors + CPX_SIMULATOR_TEMPERATURE_SENSOR = "CPX.SIMULATOR.TEMPERATURE", + CPX_SIMULATOR_LIGHT_SENSOR = "CPX.SIMULATOR.LIGHT", + CPX_SIMULATOR_MOTION_SENSOR = "CPX.SIMULATOR.MOTION", + CPX_SIMULATOR_SHAKE = "CPX.SIMULATOR.SHAKE", + CPX_SIMULATOR_CAPACITIVE_TOUCH = "CPX.SIMULATOR.CAPACITIVE.TOUCH", + + MICROBIT_SIMULATOR_TEMPERATURE_SENSOR = "MICROBIT.SIMULATOR.TEMPERATURE", + MICROBIT_SIMULATOR_LIGHT_SENSOR = "MICROBIT.SIMULATOR.LIGHT", + MICROBIT_SIMULATOR_MOTION_SENSOR = "MICROBIT.SIMULATOR.MOTION", + MICROBIT_SIMULATOR_GESTURE_SENSOR = "MICROBIT.SIMULATOR.GESTURE", + + CLUE_SIMULATOR_TEMPERATURE_SENSOR = "CLUE.SIMULATOR.TEMPERATURE", + CLUE_SIMULATOR_LIGHT_SENSOR = "CLUE.SIMULATOR.LIGHT", + CLUE_SIMULATOR_MOTION_SENSOR = "CLUE.SIMULATOR.MOTION", + CLUE_SIMULATOR_GESTURE_SENSOR = "CLUE.SIMULATOR.GESTURE", + CLUE_SIMULATOR_PRESSURE_SENSOR = "CLUE.SIMULATOR.PRESSURE", + CLUE_SIMULATOR_PROXIMITY_SENSOR = "CLUE.SIMULATOR.PROXIMITY", + CLUE_SIMULATOR_HUMIDITY_SENSOR = "CLUE.SIMULATOR.HUMIDITY", + CLUE_SIMULATOR_GYRO_SENSOR = "CLUE.SIMULATOR.GYRO", + CLUE_SIMULATOR_MAGNET_SENSOR = "CLUE.SIMULATOR.MAGNET", + + // Pop-up dialog + CPX_CLICK_DIALOG_DONT_SHOW = "CPX.CLICK.DIALOG.DONT.SHOW", + CPX_CLICK_DIALOG_EXAMPLE_CODE = "CPX.CLICK.DIALOG.EXAMPLE.CODE", + CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CPX.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", + CPX_CLICK_DIALOG_TUTORIALS = "CPX.CLICK.DIALOG.TUTORIALS", + + CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CLUE.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", + + ERROR_PYTHON_PROCESS = "ERROR.PYTHON.PROCESS", + + CPX_ERROR_COMMAND_NEW_FILE = "CPX.ERROR.COMMAND.NEW.FILE", + CPX_ERROR_DEPLOY_WITHOUT_DEVICE = "CPX.ERROR.DEPLOY.WITHOUT.DEVICE", + CPX_ERROR_PYTHON_DEVICE_PROCESS = "CPX.ERROR.PYTHON.DEVICE.PROCESS", + CPX_SUCCESS_COMMAND_DEPLOY_DEVICE = "CPX.SUCCESS.COMMAND.DEPLOY.DEVICE", + + MICROBIT_ERROR_COMMAND_NEW_FILE = "MICROBIT.ERROR.COMMAND.NEW.FILE", + MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE = "MICROBIT.ERROR.DEPLOY.WITHOUT.DEVICE", + MICROBIT_ERROR_PYTHON_DEVICE_PROCESS = "MICROBIT.ERROR.PYTHON.DEVICE.PROCESS", + MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE = "MICROBIT.SUCCESS.COMMAND.DEPLOY.DEVICE", + + CLUE_ERROR_COMMAND_NEW_FILE = "CLUE.ERROR.COMMAND.NEW.FILE", + CLUE_ERROR_DEPLOY_WITHOUT_DEVICE = "CLUE.ERROR.DEPLOY.WITHOUT.DEVICE", + CLUE_ERROR_PYTHON_DEVICE_PROCESS = "CLUE.ERROR.PYTHON.DEVICE.PROCESS", + CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE = "CLUE.SUCCESS.COMMAND.DEPLOY.DEVICE", + + // Performance + CPX_PERFORMANCE_DEPLOY_DEVICE = "CPX.PERFORMANCE.DEPLOY.DEVICE", + CPX_PERFORMANCE_NEW_FILE = "CPX.PERFORMANCE.NEW.FILE", + CPX_PERFORMANCE_OPEN_SIMULATOR = "CPX.PERFORMANCE.OPEN.SIMULATOR", + + MICROBIT_PERFORMANCE_DEPLOY_DEVICE = "MICROBIT.PERFORMANCE.DEPLOY.DEVICE", + MICROBIT_PERFORMANCE_NEW_FILE = "MICROBIT.PERFORMANCE.NEW.FILE", + MICROBIT_PERFORMANCE_OPEN_SIMULATOR = "MICROBIT.PERFORMANCE.OPEN.SIMULATOR", + + CLUE_PERFORMANCE_DEPLOY_DEVICE = "CLUE.PERFORMANCE.DEPLOY.DEVICE", + CLUE_PERFORMANCE_NEW_FILE = "CLUE.PERFORMANCE.NEW.FILE", + CLUE_PERFORMANCE_OPEN_SIMULATOR = "CLUE.PERFORMANCE.OPEN.SIMULATOR", + + // Venv options + SETUP_VENV_CREATION_ERR = "SETUP.VENV.CREATION.ERR", + SETUP_NO_PIP = "SETUP.NO.PIP", + SETUP_DEP_INSTALL_FAIL = "SETUP.DEP.INSTALL.FAIL", + SETUP_AUTO_RESOLVE_PYTHON_PATH = "SETUP.AUTO.RESOLVE.PYTHON.PATH", + SETUP_NO_PYTHON_PATH = "SETUP.NO.PYTHON.PATH", + SETUP_DOWNLOAD_PYTHON = "SETUP.DOWNLOAD.PYTHON", + SETUP_INVALID_PYTHON_INTERPRETER_PATH = "SETUP.INVALID.PYTHON.INTERPRETER.PATH", + SETUP_INVALID_PYTHON_VER = "SETUP.INVALID.PYTHON.VER", + SETUP_INSTALL_VENV = "SETUP.INSTALL.VENV", + SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL = "SETUP.ORIGINAL.INTERPRETER.DEP.INSTALL", + SETUP_HAS_VENV = "SETUP.HAS.VENV", + SETUP_NO_DEPS_INSTALLED = "SETUP.NO.DEPS.INSTALLED", } export const DEFAULT_DEVICE = CONSTANTS.DEVICE_NAME.CPX; // tslint:disable-next-line: no-namespace export namespace DialogResponses { - export const ACCEPT_AND_RUN: MessageItem = { - title: localize("dialogResponses.agreeAndRun", "Agree and Run"), - }; - export const AGREE_AND_PROCEED: MessageItem = { - title: localize("dialogResponses.agreeAndProceed", "Agree and Proceed"), - }; - export const CANCEL: MessageItem = { - title: localize("dialogResponses.cancel", "Cancel"), - }; - export const SELECT: MessageItem = { - title: localize("dialogResponses.select", "Select"), - }; - export const HELP: MessageItem = { - title: localize("dialogResponses.help", "I need help"), - }; - export const DONT_SHOW: MessageItem = { - title: localize("dialogResponses.dontShowAgain", "Don't Show Again"), - }; - export const NO: MessageItem = { - title: localize("dialogResponses.No", "No"), - }; - export const INSTALL_NOW: MessageItem = { - title: localize("dialogResponses.installNow", "Install Now"), - }; - export const DONT_INSTALL: MessageItem = { - title: localize("dialogResponses.dontInstall", "Don't Install"), - }; - export const PRIVACY_STATEMENT: MessageItem = { - title: localize("info.privacyStatement", "Privacy Statement"), - }; - export const TUTORIALS: MessageItem = { - title: localize("dialogResponses.tutorials", "Tutorials on Adafruit"), - }; - export const EXAMPLE_CODE: MessageItem = { - title: localize( - "dialogResponses.exampleCode", - "Example Code on GitHub" - ), - }; - export const MESSAGE_UNDERSTOOD: MessageItem = { - title: localize("dialogResponses.messageUnderstood", "Got It"), - }; - export const INSTALL_PIP: MessageItem = { - title: localize( - "dialogResponses.installPip", - "Install from Pip's webpage" - ), - }; - export const INSTALL_PYTHON: MessageItem = { - title: localize( - "dialogResponses.installPython", - "Install from python.org" - ), - }; - export const YES: MessageItem = { - title: localize("dialogResponses.Yes", "Yes"), - }; - export const READ_INSTALL_MD: MessageItem = { - title: localize( - "dialogResponses.readInstall", - "Read installation docs" - ), - }; + export const ACCEPT_AND_RUN: MessageItem = { + title: localize("dialogResponses.agreeAndRun", "Agree and Run"), + }; + export const AGREE_AND_PROCEED: MessageItem = { + title: localize("dialogResponses.agreeAndProceed", "Agree and Proceed"), + }; + export const CANCEL: MessageItem = { + title: localize("dialogResponses.cancel", "Cancel"), + }; + export const SELECT: MessageItem = { + title: localize("dialogResponses.select", "Select"), + }; + export const HELP: MessageItem = { + title: localize("dialogResponses.help", "I need help"), + }; + export const DONT_SHOW: MessageItem = { + title: localize("dialogResponses.dontShowAgain", "Don't Show Again"), + }; + export const NO: MessageItem = { + title: localize("dialogResponses.No", "No"), + }; + export const INSTALL_NOW: MessageItem = { + title: localize("dialogResponses.installNow", "Install Now"), + }; + export const DONT_INSTALL: MessageItem = { + title: localize("dialogResponses.dontInstall", "Don't Install"), + }; + export const PRIVACY_STATEMENT: MessageItem = { + title: localize("info.privacyStatement", "Privacy Statement"), + }; + export const TUTORIALS: MessageItem = { + title: localize("dialogResponses.tutorials", "Tutorials on Adafruit"), + }; + export const EXAMPLE_CODE: MessageItem = { + title: localize( + "dialogResponses.exampleCode", + "Example Code on GitHub" + ), + }; + export const MESSAGE_UNDERSTOOD: MessageItem = { + title: localize("dialogResponses.messageUnderstood", "Got It"), + }; + export const INSTALL_PIP: MessageItem = { + title: localize( + "dialogResponses.installPip", + "Install from Pip's webpage" + ), + }; + export const INSTALL_PYTHON: MessageItem = { + title: localize( + "dialogResponses.installPython", + "Install from python.org" + ), + }; + export const YES: MessageItem = { + title: localize("dialogResponses.Yes", "Yes"), + }; + export const READ_INSTALL_MD: MessageItem = { + title: localize( + "dialogResponses.readInstall", + "Read installation docs" + ), + }; } export const CPX_CONFIG_FILE = path.join(".vscode", "cpx.json"); export const STATUS_BAR_PRIORITY = { - PORT: 20, - OPEN_PORT: 30, - BAUD_RATE: 40, + PORT: 20, + OPEN_PORT: 30, + BAUD_RATE: 40, }; export const VERSIONS = { - MIN_PY_VERSION: "Python 3.7.0", + MIN_PY_VERSION: "Python 3.7.0", }; export const HELPER_FILES = { - CHECK_IF_VENV_PY: "check_if_venv.py", - CHECK_PYTHON_DEPENDENCIES: "check_python_dependencies.py", - DEVICE_PY: "device.py", - PROCESS_USER_CODE_PY: "process_user_code.py", - PYTHON_EXE: "python.exe", - PYTHON: "python", + CHECK_IF_VENV_PY: "check_if_venv.py", + CHECK_PYTHON_DEPENDENCIES: "check_python_dependencies.py", + DEVICE_PY: "device.py", + PROCESS_USER_CODE_PY: "process_user_code.py", + PYTHON_EXE: "python.exe", + PYTHON: "python", }; export const GLOBAL_ENV_VARS = { - PYTHON: "python", - PYTHON3: "python3", + PYTHON: "python", + PYTHON3: "python3", }; export const LANGUAGE_VARS = { - PYTHON: { ID: "python", FILE_ENDS: ".py" }, + PYTHON: { ID: "python", FILE_ENDS: ".py" }, }; export default CONSTANTS; diff --git a/Source/cpxWorkspace.ts b/Source/cpxWorkspace.ts index cec9a6289..47239a79a 100644 --- a/Source/cpxWorkspace.ts +++ b/Source/cpxWorkspace.ts @@ -3,24 +3,24 @@ import * as path from "path"; import * as vscode from "vscode"; export class CPXWorkspace { - static get rootPath(): string | undefined { - const workspaceFolders = vscode.workspace.workspaceFolders; - if (!workspaceFolders || workspaceFolders.length === 0) { - return undefined; - } + static get rootPath(): string | undefined { + const workspaceFolders = vscode.workspace.workspaceFolders; + if (!workspaceFolders || workspaceFolders.length === 0) { + return undefined; + } - for (const workspaceFolder of workspaceFolders) { - const workspaceFolderPath = workspaceFolder.uri.fsPath; - const cpxConfigPath = path.join( - workspaceFolderPath, - ".vscode", - "cpx.json" - ); - if (fs.existsSync(cpxConfigPath)) { - return workspaceFolderPath; - } - } + for (const workspaceFolder of workspaceFolders) { + const workspaceFolderPath = workspaceFolder.uri.fsPath; + const cpxConfigPath = path.join( + workspaceFolderPath, + ".vscode", + "cpx.json" + ); + if (fs.existsSync(cpxConfigPath)) { + return workspaceFolderPath; + } + } - return workspaceFolders[0].uri.fsPath; - } + return workspaceFolders[0].uri.fsPath; + } } diff --git a/Source/debugger/debugAdapter.ts b/Source/debugger/debugAdapter.ts index 9dd7c1dfb..59a78482e 100644 --- a/Source/debugger/debugAdapter.ts +++ b/Source/debugger/debugAdapter.ts @@ -4,46 +4,46 @@ import { MessagingService } from "../service/messagingService"; import { DEBUG_COMMANDS } from "../view/constants"; export class DebugAdapter implements DebugAdapterTracker { - private readonly console: DebugConsole | undefined; - private readonly messagingService: MessagingService; - private debugCommunicationService: DebuggerCommunicationService; - constructor( - debugSession: DebugSession, - messagingService: MessagingService, - debugCommunicationService: DebuggerCommunicationService - ) { - this.console = debugSession.configuration.console; - this.messagingService = messagingService; - this.debugCommunicationService = debugCommunicationService; - } - onWillStartSession() { - // To Implement - } - onWillReceiveMessage(message: any): void { - if (message.command) { - // Only send pertinent debug messages - switch (message.command) { - case DEBUG_COMMANDS.CONTINUE: - this.messagingService.sendStartMessage(); - break; - case DEBUG_COMMANDS.STACK_TRACE: - this.messagingService.sendPauseMessage(); - break; - case DEBUG_COMMANDS.DISCONNECT: - // Triggered on stop event for debugger - if (!message.arguments.restart) { - this.debugCommunicationService.handleStopEvent(); - } - break; - } - } - } - // A debugger error should unlock the webview - onError() { - this.messagingService.sendStartMessage(); - } - // Device is always running when exiting debugging mode - onExit() { - this.messagingService.sendStartMessage(); - } + private readonly console: DebugConsole | undefined; + private readonly messagingService: MessagingService; + private debugCommunicationService: DebuggerCommunicationService; + constructor( + debugSession: DebugSession, + messagingService: MessagingService, + debugCommunicationService: DebuggerCommunicationService + ) { + this.console = debugSession.configuration.console; + this.messagingService = messagingService; + this.debugCommunicationService = debugCommunicationService; + } + onWillStartSession() { + // To Implement + } + onWillReceiveMessage(message: any): void { + if (message.command) { + // Only send pertinent debug messages + switch (message.command) { + case DEBUG_COMMANDS.CONTINUE: + this.messagingService.sendStartMessage(); + break; + case DEBUG_COMMANDS.STACK_TRACE: + this.messagingService.sendPauseMessage(); + break; + case DEBUG_COMMANDS.DISCONNECT: + // Triggered on stop event for debugger + if (!message.arguments.restart) { + this.debugCommunicationService.handleStopEvent(); + } + break; + } + } + } + // A debugger error should unlock the webview + onError() { + this.messagingService.sendStartMessage(); + } + // Device is always running when exiting debugging mode + onExit() { + this.messagingService.sendStartMessage(); + } } diff --git a/Source/debugger/debugAdapterFactory.ts b/Source/debugger/debugAdapterFactory.ts index 8bec8cfc8..5b0e2b401 100644 --- a/Source/debugger/debugAdapterFactory.ts +++ b/Source/debugger/debugAdapterFactory.ts @@ -1,33 +1,33 @@ import { - DebugAdapterTracker, - DebugAdapterTrackerFactory, - DebugSession, - ProviderResult, + DebugAdapterTracker, + DebugAdapterTrackerFactory, + DebugSession, + ProviderResult, } from "vscode"; import { DebuggerCommunicationService } from "../service/debuggerCommunicationService"; import { MessagingService } from "../service/messagingService"; import { DebugAdapter } from "./debugAdapter"; export class DebugAdapterFactory implements DebugAdapterTrackerFactory { - private debugSession: DebugSession; - private messagingService: MessagingService; - private debugCommunicationService: DebuggerCommunicationService; - constructor( - debugSession: DebugSession, - messagingService: MessagingService, - debugCommunicationService: DebuggerCommunicationService - ) { - this.debugSession = debugSession; - this.messagingService = messagingService; - this.debugCommunicationService = debugCommunicationService; - } - public createDebugAdapterTracker( - session: DebugSession - ): ProviderResult { - return new DebugAdapter( - session, - this.messagingService, - this.debugCommunicationService - ); - } + private debugSession: DebugSession; + private messagingService: MessagingService; + private debugCommunicationService: DebuggerCommunicationService; + constructor( + debugSession: DebugSession, + messagingService: MessagingService, + debugCommunicationService: DebuggerCommunicationService + ) { + this.debugSession = debugSession; + this.messagingService = messagingService; + this.debugCommunicationService = debugCommunicationService; + } + public createDebugAdapterTracker( + session: DebugSession + ): ProviderResult { + return new DebugAdapter( + session, + this.messagingService, + this.debugCommunicationService + ); + } } diff --git a/Source/debuggerCommunicationServer.ts b/Source/debuggerCommunicationServer.ts index 3deeff1c4..0fa4a65cc 100644 --- a/Source/debuggerCommunicationServer.ts +++ b/Source/debuggerCommunicationServer.ts @@ -8,134 +8,133 @@ import { SERVER_INFO } from "./constants"; import { DeviceSelectionService } from "./service/deviceSelectionService"; export const DEBUGGER_MESSAGES = { - EMITTER: { - INPUT_CHANGED: "input_changed", - RECEIVED_STATE: "received_state", - DISCONNECT: "process_disconnect", - }, - LISTENER: { - UPDATE_STATE: "updateState", - RECEIVED_STATE: "receivedState", - DISCONNECT: "disconnect", - }, + EMITTER: { + INPUT_CHANGED: "input_changed", + RECEIVED_STATE: "received_state", + DISCONNECT: "process_disconnect", + }, + LISTENER: { + UPDATE_STATE: "updateState", + RECEIVED_STATE: "receivedState", + DISCONNECT: "disconnect", + }, }; export class DebuggerCommunicationServer { - private port: number; - private serverHttp: http.Server; - private serverIo: socketio.Server; - private simulatorWebview: WebviewPanel | undefined; - private deviceSelectionService: DeviceSelectionService; - private isPendingResponse = false; - private pendingCallbacks: Function[] = []; + private port: number; + private serverHttp: http.Server; + private serverIo: socketio.Server; + private simulatorWebview: WebviewPanel | undefined; + private deviceSelectionService: DeviceSelectionService; + private isPendingResponse = false; + private pendingCallbacks: Function[] = []; - constructor( - webviewPanel: WebviewPanel | undefined, - port = SERVER_INFO.DEFAULT_SERVER_PORT, - deviceSelectionService: DeviceSelectionService - ) { - this.port = port; - this.serverHttp = new http.Server(); - this.initHttpServer(); + constructor( + webviewPanel: WebviewPanel | undefined, + port = SERVER_INFO.DEFAULT_SERVER_PORT, + deviceSelectionService: DeviceSelectionService + ) { + this.port = port; + this.serverHttp = new http.Server(); + this.initHttpServer(); - this.serverIo = socketio(this.serverHttp); - this.simulatorWebview = webviewPanel; - this.initEventsHandlers(); - console.info(`Server running on port ${this.port}`); + this.serverIo = socketio(this.serverHttp); + this.simulatorWebview = webviewPanel; + this.initEventsHandlers(); + console.info(`Server running on port ${this.port}`); - this.deviceSelectionService = deviceSelectionService; - } + this.deviceSelectionService = deviceSelectionService; + } - // send the message to start closing the connection - public closeConnection(): void { - this.sendDisconnectEvent(); - } + // send the message to start closing the connection + public closeConnection(): void { + this.sendDisconnectEvent(); + } - public setWebview(webviewPanel: WebviewPanel | undefined) { - this.simulatorWebview = webviewPanel; - } - // Events are pushed when the previous processed event is over - public emitInputChanged(newState: string): void { - if (this.isPendingResponse) { - this.pendingCallbacks.push(() => { - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, - newState - ); - }); - } else { - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, - newState - ); - this.isPendingResponse = true; - } - } - public disconnectFromPort() { - this.serverIo.close(); - this.serverHttp.close(); - } - private sendDisconnectEvent() { - this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); - } + public setWebview(webviewPanel: WebviewPanel | undefined) { + this.simulatorWebview = webviewPanel; + } + // Events are pushed when the previous processed event is over + public emitInputChanged(newState: string): void { + if (this.isPendingResponse) { + this.pendingCallbacks.push(() => { + this.serverIo.emit( + DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, + newState + ); + }); + } else { + this.serverIo.emit( + DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, + newState + ); + this.isPendingResponse = true; + } + } + public disconnectFromPort() { + this.serverIo.close(); + this.serverHttp.close(); + } + private sendDisconnectEvent() { + this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); + } - private initHttpServer(): void { - this.serverHttp.listen(this.port); - if (!this.serverHttp.listening) { - throw new Error(SERVER_INFO.ERROR_CODE_INIT_SERVER); - } - } + private initHttpServer(): void { + this.serverHttp.listen(this.port); + if (!this.serverHttp.listening) { + throw new Error(SERVER_INFO.ERROR_CODE_INIT_SERVER); + } + } - private initEventsHandlers(): void { - this.serverIo.on("connection", (socket: any) => { - socket.on(DEBUGGER_MESSAGES.LISTENER.UPDATE_STATE, (data: any) => { - this.handleState(data); - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.RECEIVED_STATE, - {} - ); - }); - socket.on(DEBUGGER_MESSAGES.LISTENER.RECEIVED_STATE, () => { - if (this.pendingCallbacks.length > 0) { - const currentCall = this.pendingCallbacks.shift(); - currentCall(); - this.isPendingResponse = true; - } else { - this.isPendingResponse = false; - } - }); + private initEventsHandlers(): void { + this.serverIo.on("connection", (socket: any) => { + socket.on(DEBUGGER_MESSAGES.LISTENER.UPDATE_STATE, (data: any) => { + this.handleState(data); + this.serverIo.emit( + DEBUGGER_MESSAGES.EMITTER.RECEIVED_STATE, + {} + ); + }); + socket.on(DEBUGGER_MESSAGES.LISTENER.RECEIVED_STATE, () => { + if (this.pendingCallbacks.length > 0) { + const currentCall = this.pendingCallbacks.shift(); + currentCall(); + this.isPendingResponse = true; + } else { + this.isPendingResponse = false; + } + }); - socket.on(DEBUGGER_MESSAGES.LISTENER.DISCONNECT, () => { - this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); - if (this.simulatorWebview) { - this.simulatorWebview.webview.postMessage({ - command: "reset-state", - }); - } - }); - }); - } + socket.on(DEBUGGER_MESSAGES.LISTENER.DISCONNECT, () => { + this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); + if (this.simulatorWebview) { + this.simulatorWebview.webview.postMessage({ + command: "reset-state", + }); + } + }); + }); + } - private handleState(data: any): void { - try { - const messageToWebview = JSON.parse(data); - if (messageToWebview.type === "state") { - const messageState = JSON.parse(messageToWebview.data); - if ( - this.simulatorWebview && - messageState.device_name === - this.deviceSelectionService.getCurrentActiveDevice() - ) { - this.simulatorWebview.webview.postMessage({ - active_device: - this.deviceSelectionService.getCurrentActiveDevice(), - command: "set-state", - state: messageState, - }); - } - } - } catch (err) { - console.error(`Error: Non-JSON output from the process : ${data}`); - } - } + private handleState(data: any): void { + try { + const messageToWebview = JSON.parse(data); + if (messageToWebview.type === "state") { + const messageState = JSON.parse(messageToWebview.data); + if ( + this.simulatorWebview && + messageState.device_name === + this.deviceSelectionService.getCurrentActiveDevice() + ) { + this.simulatorWebview.webview.postMessage({ + active_device: this.deviceSelectionService.getCurrentActiveDevice(), + command: "set-state", + state: messageState, + }); + } + } + } catch (err) { + console.error(`Error: Non-JSON output from the process : ${data}`); + } + } } diff --git a/Source/dev-requirements.txt b/Source/dev-requirements.txt index 6b117ff69..26f334b51 100644 --- a/Source/dev-requirements.txt +++ b/Source/dev-requirements.txt @@ -1,3 +1,3 @@ -r ./requirements.txt black==19.10b0 -pytest==5.0.1 +pytest==5.0.1 \ No newline at end of file diff --git a/Source/deviceContext.ts b/Source/deviceContext.ts index 9144ef23b..a4f0afd2e 100644 --- a/Source/deviceContext.ts +++ b/Source/deviceContext.ts @@ -11,141 +11,141 @@ import { CPXWorkspace } from "./cpxWorkspace"; import * as utils from "./extension_utils/utils"; export class DeviceContext implements vscode.Disposable { - public static getInstance(): DeviceContext { - return DeviceContext._deviceContext; - } - - private static _deviceContext: DeviceContext = new DeviceContext(); - - private _onDidChange = new vscode.EventEmitter(); - private _watcher: vscode.FileSystemWatcher; - private _vscodeWatcher: vscode.FileSystemWatcher; - private _port!: string; - - private constructor() { - if (vscode.workspace && CPXWorkspace.rootPath) { - this._watcher = vscode.workspace.createFileSystemWatcher( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ); - this._vscodeWatcher = vscode.workspace.createFileSystemWatcher( - path.join(CPXWorkspace.rootPath, ".vscode"), - true, - true, - false - ); - - // Reloads the config into the code if the cpx config file has changed - this._watcher.onDidCreate(() => this.loadContext()); - this._watcher.onDidChange(() => this.loadContext()); - this._watcher.onDidDelete(() => this.loadContext()); - - this._vscodeWatcher.onDidDelete(() => this.loadContext()); - } - } - - public loadContext(): Thenable { - return vscode.workspace.findFiles(CPX_CONFIG_FILE, null, 1).then( - (files) => { - let cpxConfigJson: any = {}; - if (files && files.length > 0) { - const configFile = files[0]; - cpxConfigJson = utils.tryParseJSON( - fs.readFileSync(configFile.fsPath, "utf8") - ); - if (cpxConfigJson) { - this._port = cpxConfigJson.port; - this._onDidChange.fire(); - } else { - console.error(CONSTANTS.ERROR.CPX_FILE_ERROR); - } - } else { - this._port = null; - this._onDidChange.fire(); - } - return this; - }, - (reason) => { - this._port = null; - this._onDidChange.fire(); - return this; - } - ); - } - - public saveContext() { - if (!CPXWorkspace.rootPath) { - return; - } - const cpxConfigFile = path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE); - let cpxConfigJson: any = {}; - if (utils.fileExistsSync(cpxConfigFile)) { - cpxConfigJson = utils.tryParseJSON( - fs.readFileSync(cpxConfigFile, "utf8") - ); - } - if (!cpxConfigJson) { - // log and notify user error - return; - } - cpxConfigJson.port = this.port; - - utils.mkdirRecursivelySync(path.dirname(cpxConfigFile)); - fs.writeFileSync( - cpxConfigFile, - JSON.stringify( - cpxConfigJson, - (key, value) => { - if (value === null) { - return undefined; - } - return value; - }, - 4 - ) - ); - } - - public dispose() { - if (this._watcher) { - this._watcher.dispose(); - } - - if (this._vscodeWatcher) { - this._vscodeWatcher.dispose(); - } - } - - public async initialize() { - if ( - CPXWorkspace.rootPath && - utils.fileExistsSync( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ) - ) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.CPX_JSON_ALREADY_GENERATED - ); - return; - } else { - if (!CPXWorkspace.rootPath) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.PLEASE_OPEN_FOLDER - ); - return; - } - } - } - - public get onDidChange(): vscode.Event { - return this._onDidChange.event; - } - - public get port() { - return this._port; - } - - public set port(value: string) { - this._port = value; - this.saveContext(); - } + public static getInstance(): DeviceContext { + return DeviceContext._deviceContext; + } + + private static _deviceContext: DeviceContext = new DeviceContext(); + + private _onDidChange = new vscode.EventEmitter(); + private _watcher: vscode.FileSystemWatcher; + private _vscodeWatcher: vscode.FileSystemWatcher; + private _port!: string; + + private constructor() { + if (vscode.workspace && CPXWorkspace.rootPath) { + this._watcher = vscode.workspace.createFileSystemWatcher( + path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) + ); + this._vscodeWatcher = vscode.workspace.createFileSystemWatcher( + path.join(CPXWorkspace.rootPath, ".vscode"), + true, + true, + false + ); + + // Reloads the config into the code if the cpx config file has changed + this._watcher.onDidCreate(() => this.loadContext()); + this._watcher.onDidChange(() => this.loadContext()); + this._watcher.onDidDelete(() => this.loadContext()); + + this._vscodeWatcher.onDidDelete(() => this.loadContext()); + } + } + + public loadContext(): Thenable { + return vscode.workspace.findFiles(CPX_CONFIG_FILE, null, 1).then( + files => { + let cpxConfigJson: any = {}; + if (files && files.length > 0) { + const configFile = files[0]; + cpxConfigJson = utils.tryParseJSON( + fs.readFileSync(configFile.fsPath, "utf8") + ); + if (cpxConfigJson) { + this._port = cpxConfigJson.port; + this._onDidChange.fire(); + } else { + console.error(CONSTANTS.ERROR.CPX_FILE_ERROR); + } + } else { + this._port = null; + this._onDidChange.fire(); + } + return this; + }, + reason => { + this._port = null; + this._onDidChange.fire(); + return this; + } + ); + } + + public saveContext() { + if (!CPXWorkspace.rootPath) { + return; + } + const cpxConfigFile = path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE); + let cpxConfigJson: any = {}; + if (utils.fileExistsSync(cpxConfigFile)) { + cpxConfigJson = utils.tryParseJSON( + fs.readFileSync(cpxConfigFile, "utf8") + ); + } + if (!cpxConfigJson) { + // log and notify user error + return; + } + cpxConfigJson.port = this.port; + + utils.mkdirRecursivelySync(path.dirname(cpxConfigFile)); + fs.writeFileSync( + cpxConfigFile, + JSON.stringify( + cpxConfigJson, + (key, value) => { + if (value === null) { + return undefined; + } + return value; + }, + 4 + ) + ); + } + + public dispose() { + if (this._watcher) { + this._watcher.dispose(); + } + + if (this._vscodeWatcher) { + this._vscodeWatcher.dispose(); + } + } + + public async initialize() { + if ( + CPXWorkspace.rootPath && + utils.fileExistsSync( + path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) + ) + ) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.CPX_JSON_ALREADY_GENERATED + ); + return; + } else { + if (!CPXWorkspace.rootPath) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.PLEASE_OPEN_FOLDER + ); + return; + } + } + } + + public get onDidChange(): vscode.Event { + return this._onDidChange.event; + } + + public get port() { + return this._port; + } + + public set port(value: string) { + this._port = value; + this.saveContext(); + } } diff --git a/Source/extension.ts b/Source/extension.ts index d73a05b05..5940217dc 100644 --- a/Source/extension.ts +++ b/Source/extension.ts @@ -7,15 +7,15 @@ import * as open from "open"; import * as path from "path"; import * as vscode from "vscode"; import { - CONFIG, - CONSTANTS, - CPX_CONFIG_FILE, - DialogResponses, - GLOBAL_ENV_VARS, - HELPER_FILES, - LANGUAGE_VARS, - SERVER_INFO, - TelemetryEventName, + CONFIG, + CONSTANTS, + CPX_CONFIG_FILE, + DialogResponses, + GLOBAL_ENV_VARS, + HELPER_FILES, + LANGUAGE_VARS, + SERVER_INFO, + TelemetryEventName, } from "./constants"; import { CPXWorkspace } from "./cpxWorkspace"; import { DebugAdapterFactory } from "./debugger/debugAdapterFactory"; @@ -35,9 +35,9 @@ import getPackageInfo from "./telemetry/getPackageInfo"; import TelemetryAI from "./telemetry/telemetryAI"; import { UsbDetector } from "./usbDetector"; import { - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, - WEBVIEW_TYPES, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_MESSAGES, + WEBVIEW_TYPES, } from "./view/constants"; let telemetryAI: TelemetryAI; @@ -59,1055 +59,1043 @@ let pythonProcessDataBuffer: string[]; export let outChannel: vscode.OutputChannel | undefined; const sendCurrentDeviceMessage = (currentPanel: vscode.WebviewPanel) => { - if (currentPanel) { - currentPanel.webview.postMessage({ - command: VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE, - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } + if (currentPanel) { + currentPanel.webview.postMessage({ + command: VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE, + active_device: deviceSelectionService.getCurrentActiveDevice(), + }); + } }; // Extension activation export async function activate(context: vscode.ExtensionContext) { - telemetryAI = new TelemetryAI(context); - setupService = new SetupService(telemetryAI); - let currentPanel: vscode.WebviewPanel | undefined; - let childProcess: cp.ChildProcess | undefined; - let messageListener: vscode.Disposable; - let activeEditorListener: vscode.Disposable; - const webviewService = new WebviewService(context, deviceSelectionService); - const telemetryHandlerService = new TelemetryHandlerService( - telemetryAI, - deviceSelectionService - ); - const formalNameToNickNameMapping = { - [CONSTANTS.DEVICE_NAME_FORMAL.CPX]: CONSTANTS.DEVICE_NAME.CPX, - [CONSTANTS.DEVICE_NAME_FORMAL.MICROBIT]: CONSTANTS.DEVICE_NAME.MICROBIT, - [CONSTANTS.DEVICE_NAME_FORMAL.CLUE]: CONSTANTS.DEVICE_NAME.CLUE, - }; - - // Add our library path to settings.json for autocomplete functionality - updatePythonExtraPaths(); - - // ignore import errors so that adafruit_circuitplayground library - // doesn't trigger lint errors - updatePylintArgs(context); - - pythonExecutablePath = await setupService.setupEnv(context); - - try { - utils.generateCPXConfig(); - configFileCreated = true; - } catch (err) { - console.info("Failed to create the CPX config file."); - configFileCreated = false; - } - - if (pythonExecutablePath === "") { - return; - } - - if (outChannel === undefined) { - outChannel = vscode.window.createOutputChannel(CONSTANTS.NAME); - utils.logToOutputChannel(outChannel, CONSTANTS.INFO.WELCOME_OUTPUT_TAB); - } - - vscode.workspace.onDidSaveTextDocument( - async (document: vscode.TextDocument) => { - await fileSelectionService.updateCurrentFileFromTextFile(document); - } - ); - - const currVersionReleaseName = - "release_note_" + getPackageInfo(context).extensionVersion; - const viewedReleaseNote = context.globalState.get( - currVersionReleaseName, - false - ); - - if (!viewedReleaseNote) { - PopupService.openReleaseNote(); - context.globalState.update(currVersionReleaseName, true); - } - - const openWebview = () => { - if (currentPanel && currentPanel.webview) { - messagingService.setWebview(currentPanel.webview); - currentPanel.webview.html = webviewService.getWebviewContent( - WEBVIEW_TYPES.SIMULATOR, - true, - currentPanel - ); - currentPanel.reveal(vscode.ViewColumn.Beside); - } else { - currentPanel = vscode.window.createWebviewPanel( - CONSTANTS.WEBVIEW_TYPE.SIMULATOR, - CONSTANTS.LABEL.WEBVIEW_PANEL, - { preserveFocus: true, viewColumn: vscode.ViewColumn.Beside }, - { - // Only allow the webview to access resources in our extension's media directory - localResourceRoots: [ - vscode.Uri.file( - path.join( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY - ) - ), - ], - enableScripts: true, - } - ); - - currentPanel.webview.html = webviewService.getWebviewContent( - WEBVIEW_TYPES.SIMULATOR, - true, - currentPanel - ); - messagingService.setWebview(currentPanel.webview); - - if (messageListener !== undefined) { - messageListener.dispose(); - const index = context.subscriptions.indexOf(messageListener); - if (index > -1) { - context.subscriptions.splice(index, 1); - } - } - - if (activeEditorListener !== undefined) { - activeEditorListener.dispose(); - const index = - context.subscriptions.indexOf(activeEditorListener); - if (index > -1) { - context.subscriptions.splice(index, 1); - } - } - - if (currentPanel) { - // Handle messages from webview - messageListener = currentPanel.webview.onDidReceiveMessage( - (message) => { - const messageJson = JSON.stringify({ - active_device: - deviceSelectionService.getCurrentActiveDevice(), - state: message.text, - }); - switch (message.command) { - case WEBVIEW_MESSAGES.BUTTON_PRESS: - // Send input to the Python process - telemetryHandlerService.handleButtonPressTelemetry( - message.text - ); - console.log(`About to write ${messageJson} \n`); - if ( - inDebugMode && - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .emitInputChanged(messageJson); - } else if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - break; - case WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP: - console.log(`Play button ${messageJson} \n`); - if (message.text.state as boolean) { - fileSelectionService.setPathAndSendMessage( - message.text.selected_file - ); - fileSelectionService.findCurrentTextDocument(); - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_RUN_SIMULATOR_BUTTON - ); - runSimulatorCommand(); - } else { - killProcessIfRunning(); - } - - if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - - break; - case WEBVIEW_MESSAGES.GESTURE: - case WEBVIEW_MESSAGES.SENSOR_CHANGED: - telemetryHandlerService.handleGestureTelemetry( - message.text - ); - console.log(`Sensor changed ${messageJson} \n`); - if ( - inDebugMode && - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .emitInputChanged(messageJson); - } else if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - break; - case WEBVIEW_MESSAGES.REFRESH_SIMULATOR: - console.log("Refresh button"); - runSimulatorCommand(); - break; - case WEBVIEW_MESSAGES.SLIDER_TELEMETRY: - telemetryHandlerService.handleSensorTelemetry( - message.text - ); - break; - case WEBVIEW_MESSAGES.SWITCH_DEVICE: - deviceSelectionService.setCurrentActiveDevice( - message.text.active_device - ); - killProcessIfRunning(); - break; - default: - vscode.window.showInformationMessage( - CONSTANTS.ERROR.UNEXPECTED_MESSAGE - ); - break; - } - }, - undefined, - context.subscriptions - ); - - activeEditorListener = utils.addVisibleTextEditorCallback( - currentPanel, - context - ); - } - - currentPanel.onDidDispose( - () => { - currentPanel = undefined; - if ( - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .setWebview(undefined); - } - killProcessIfRunning(); - if (firstTimeClosed) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.FIRST_TIME_WEBVIEW - ); - firstTimeClosed = false; - } - }, - undefined, - context.subscriptions - ); - } - sendCurrentDeviceMessage(currentPanel); - }; - - // Open Simulator on the webview - const openSimulator: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.openSimulator", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_SIMULATE_TO, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - deviceSelectionService.setCurrentActiveDevice(device); - const telemetryEvents = - telemetryHandlerService.getTelemetryEventsForOpenSimulator( - device - ); - telemetryAI.trackFeatureUsage( - telemetryEvents.openSimulatorTelemetryEvent - ); - telemetryAI.runWithLatencyMeasure( - openWebview, - telemetryEvents.openSimulatorPerformanceTelemetryEvent - ); - } - ); - - const gettingStartedOpen: vscode.Disposable = - vscode.commands.registerCommand( - "deviceSimulatorExpress.common.gettingStarted", - () => { - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_GETTING_STARTED - ); - webviewService.openTutorialPanel(); - } - ); - - const openTemplateFile = (template: string) => { - const fileName = template; - const filePath = - __dirname + path.sep + "templates" + path.sep + fileName; - const file = fs.readFileSync(filePath, "utf8"); - const showNewFilePopup: boolean = vscode.workspace - .getConfiguration() - .get(CONFIG.SHOW_NEW_FILE_POPUP); - - if (showNewFilePopup && template === CONSTANTS.TEMPLATE.CPX) { - vscode.window - .showInformationMessage( - CONSTANTS.INFO.NEW_FILE, - DialogResponses.DONT_SHOW, - DialogResponses.EXAMPLE_CODE, - DialogResponses.TUTORIALS - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.DONT_SHOW) { - vscode.workspace - .getConfiguration() - .update(CONFIG.SHOW_NEW_FILE_POPUP, false); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_DONT_SHOW - ); - } else if (selection === DialogResponses.EXAMPLE_CODE) { - open(CONSTANTS.LINKS.EXAMPLE_CODE); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_EXAMPLE_CODE - ); - } else if (selection === DialogResponses.TUTORIALS) { - const okAction = () => { - open(CONSTANTS.LINKS.TUTORIALS); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_TUTORIALS - ); - }; - utils.showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT - ); - } - }); - } - - // tslint:disable-next-line: ban-comma-operator - vscode.workspace - .openTextDocument({ - content: file, - language: LANGUAGE_VARS.PYTHON.ID, - }) - .then((template: vscode.TextDocument) => { - vscode.window.showTextDocument(template, 1, false).then(() => { - openWebview(); - }); - }), - // tslint:disable-next-line: no-unused-expression - (error: any) => { - telemetryHandlerService.handleNewFileErrorTelemetry(); - console.error(`Failed to open a new text document: ${error}`); - }; - }; - - const newFile: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.newFile", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_FOR_NEW_FILE, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - deviceSelectionService.setCurrentActiveDevice(device); - - const deviceToTemplateMapping = { - [CONSTANTS.DEVICE_NAME.CPX]: CONSTANTS.TEMPLATE.CPX, - [CONSTANTS.DEVICE_NAME.MICROBIT]: CONSTANTS.TEMPLATE.MICROBIT, - [CONSTANTS.DEVICE_NAME.CLUE]: CONSTANTS.TEMPLATE.CLUE, - }; - const templateFile = deviceToTemplateMapping[device]; - - const telemetryEvents = - telemetryHandlerService.getTelemetryEventsForNewFile(device); - - telemetryAI.trackFeatureUsage( - telemetryEvents.newFileTelemetryEvent - ); - telemetryAI.runWithLatencyMeasure( - () => openTemplateFile(templateFile), - telemetryEvents.newFilePerformanceTelemetryEvent - ); - } - ); - - const installDependencies: vscode.Disposable = - vscode.commands.registerCommand( - "deviceSimulatorExpress.common.installDependencies", - async () => { - pythonExecutablePath = await setupService.setupEnv( - context, - true - ); - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_INSTALL_EXTENSION_DEPENDENCIES - ); - } - ); - - const killProcessIfRunning = () => { - if (childProcess !== undefined) { - if (currentPanel) { - currentPanel.webview.postMessage({ - command: "reset-state", - active_device: - deviceSelectionService.getCurrentActiveDevice(), - }); - } - // TODO: We need to check the process was correctly killed - childProcess.kill(); - childProcess = undefined; - } - }; - - const runSimulatorCommand = async () => { - pythonProcessDataBuffer = []; - // Prevent running new code if a debug session is active - if (inDebugMode) { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.DEBUGGING_SESSION_IN_PROGESS - ); - return; - } - if (shouldShowRunCodePopup) { - const shouldExitCommand = await vscode.window - .showWarningMessage( - CONSTANTS.WARNING.ACCEPT_AND_RUN, - DialogResponses.ACCEPT_AND_RUN, - DialogResponses.CANCEL - ) - .then((selection: vscode.MessageItem | undefined) => { - let hasAccepted = true; - if (selection === DialogResponses.ACCEPT_AND_RUN) { - shouldShowRunCodePopup = false; - hasAccepted = false; - } - return hasAccepted; - }); - // Don't run users code if they don't accept - if (shouldExitCommand) { - return; - } - } - - openWebview(); - - if (!currentPanel) { - return; - } - - console.info(CONSTANTS.INFO.RUNNING_CODE); - - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_SIMULATOR, - true - ); - - killProcessIfRunning(); - - await fileSelectionService.updateCurrentFileFromEditor( - vscode.window.activeTextEditor - ); - - if (fileSelectionService.getCurrentFileAbsPath() === "") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_RUN, - true - ); - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FILE_TO_RUN, - DialogResponses.MESSAGE_UNDERSTOOD - ); - } else { - // Save on run - await fileSelectionService.getCurrentTextDocument().save(); - - if ( - !fileSelectionService - .getCurrentTextDocument() - .fileName.endsWith(LANGUAGE_VARS.PYTHON.FILE_ENDS) - ) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_RUN, - true - ); - return; - } - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.FILE_SELECTED( - fileSelectionService.getCurrentFileAbsPath() - ) - ); - - // Activate the run webview button - currentPanel.webview.postMessage({ - command: "activate-play", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - const args = [ - utils.getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.PROCESS_USER_CODE_PY - ), - fileSelectionService.getCurrentFileAbsPath(), - JSON.stringify({ enable_telemetry: utils.getTelemetryState() }), - ]; - childProcess = cp.spawn(pythonExecutablePath, args); - - let dataFromTheProcess = ""; - let oldMessage = ""; - - // Data received from Python process - childProcess.stdout.on("data", (data) => { - dataFromTheProcess = data.toString(); - if (currentPanel) { - // NOTE: parts of the flow regarding pythonProcessDataBuffer - // are needed for the CLUE simulator to properly receive - // base_64 strings on UNIX systems. - - // added any incomplete data to beginning - const processedData = pythonProcessDataBuffer - .join("") - .concat(dataFromTheProcess); - pythonProcessDataBuffer = []; - - // Process the data from the process and send one state at a time - processedData.split("\0").forEach((message) => { - if ( - currentPanel && - message.length > 0 && - message !== oldMessage - ) { - oldMessage = message; - let messageToWebview; - // Check the message is a JSON - try { - messageToWebview = JSON.parse(message); - // Check the JSON is a state - switch (messageToWebview.type) { - case "state": - const messageData = JSON.parse( - messageToWebview.data - ); - if ( - messageData.device_name === - deviceSelectionService.getCurrentActiveDevice() - ) { - messagingService.sendMessageToWebview( - VSCODE_MESSAGES_TO_WEBVIEW.SET_STATE, - messageData - ); - } - break; - - case "print": - console.log( - `Process print statement output = ${messageToWebview.data}` - ); - utils.logToOutputChannel( - outChannel, - `[PRINT] ${messageToWebview.data}` - ); - break; - - default: - console.log( - `Non-state JSON output from the process : ${messageToWebview}` - ); - break; - } - } catch (err) { - if (err instanceof SyntaxError) { - // if not a JSON string, it is incomplete - // add to beginning of next strings - pythonProcessDataBuffer.push(message); - } else { - console.log( - `Errored output: ${messageToWebview}` - ); - } - } - } - }); - } - }); - - // Std error output - childProcess.stderr.on("data", (data) => { - console.error( - `Error from the Python process through stderr: ${data}` - ); - telemetryAI.trackFeatureUsage( - TelemetryEventName.ERROR_PYTHON_PROCESS - ); - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.STDERR(data), - true - ); - if (currentPanel) { - currentPanel.webview.postMessage({ - active_device: - deviceSelectionService.getCurrentActiveDevice(), - command: "reset-state", - }); - } - }); - - // When the process is done - childProcess.on("end", (code: number) => { - console.info(`Command execution exited with code: ${code}`); - }); - } - }; - - // Send message to the webview - const runSimulator: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.runSimulator", - () => { - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_RUN_PALETTE - ); - runSimulatorCommand(); - } - ); - - const deployCode = async (device: string) => { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_DEVICE, - true - ); - - await fileSelectionService.updateCurrentFileFromEditor( - vscode.window.activeTextEditor - ); - - if (fileSelectionService.getCurrentFileAbsPath() === "") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, - true - ); - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, - DialogResponses.MESSAGE_UNDERSTOOD - ); - } else { - await fileSelectionService.getCurrentTextDocument().save(); - - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.FILE_SELECTED( - fileSelectionService.getCurrentFileAbsPath() - ) - ); - - const deviceProcess = cp.spawn(pythonExecutablePath, [ - utils.getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.DEVICE_PY - ), - device, - fileSelectionService.getCurrentFileAbsPath(), - ]); - - let dataFromTheProcess = ""; - - // Data received from Python process - deviceProcess.stdout.on("data", (data) => { - dataFromTheProcess = data.toString(); - - let messageToWebview; - try { - messageToWebview = JSON.parse(dataFromTheProcess); - if (messageToWebview.type === "complete") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_SUCCESS, - true - ); - } - telemetryHandlerService.handleDeployToDeviceFinishedTelemetry( - messageToWebview, - device - ); - } catch (err) { - console.log( - `Non-JSON output from the process : ${dataFromTheProcess}` - ); - } - }); - - // Std error output - deviceProcess.stderr.on("data", (data) => { - telemetryHandlerService.handleDeployToDeviceErrorTelemetry( - data, - device - ); - console.error( - `Error from the Python device process through stderr: ${data}` - ); - utils.logToOutputChannel( - outChannel, - `[ERROR] ${data} \n`, - true - ); - }); - - // When the process is done - deviceProcess.on("end", (code: number) => { - console.info(`Command execution exited with code: ${code}`); - }); - } - }; - - const deployToDevice: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.deployToDevice", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_DEPLOY_TO, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - - const telemetryEvents = - telemetryHandlerService.getTelemetryEventsForStartingDeployToDevice( - device - ); - - telemetryAI.trackFeatureUsage(telemetryEvents.deployTelemetryEvent); - telemetryAI.runWithLatencyMeasure(() => { - deployCode(device); - }, telemetryEvents.deployPerformanceTelemetryEvent); - } - ); - - let serialMonitor: SerialMonitor | undefined; - if (configFileCreated) { - serialMonitor = SerialMonitor.getInstance(); - context.subscriptions.push(serialMonitor); - } - - const selectSerialPort: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.selectSerialPort", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.selectSerialPort(null, null); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CHOOSE_PORT); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const openSerialMonitor: vscode.Disposable = - vscode.commands.registerCommand( - "deviceSimulatorExpress.common.openSerialMonitor", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure( - serialMonitor.openSerialMonitor.bind(serialMonitor), - TelemetryEventName.COMMAND_SERIAL_MONITOR_OPEN - ); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const changeBaudRate: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.changeBaudRate", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure( - serialMonitor.changeBaudRate.bind(serialMonitor), - TelemetryEventName.COMMAND_SERIAL_MONITOR_BAUD_RATE - ); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const closeSerialMonitor: vscode.Disposable = - vscode.commands.registerCommand( - "deviceSimulatorExpress.common.closeSerialMonitor", - (port, showWarning = true) => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.closeSerialMonitor(port, showWarning); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const showReleaseNote = vscode.commands.registerCommand( - "deviceSimulatorExpress.", - (port, showWarning = true) => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.closeSerialMonitor(port, showWarning); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - UsbDetector.getInstance().initialize(context.extensionPath); - UsbDetector.getInstance().startListening(); - - if ( - CPXWorkspace.rootPath && - (utils.fileExistsSync( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ) || - vscode.window.activeTextEditor) - ) { - (() => { - if (!SerialMonitor.getInstance().initialized) { - SerialMonitor.getInstance().initialize(); - } - })(); - } - - // Debugger configuration - const simulatorDebugConfiguration = new SimulatorDebugConfigurationProvider( - utils.getPathToScript(context, "out/", "debug_user_code.py") - ); - - const debugAdapterFactory = new DebugAdapterFactory( - vscode.debug.activeDebugSession, - messagingService, - debuggerCommunicationService - ); - vscode.debug.registerDebugAdapterTrackerFactory( - LANGUAGE_VARS.PYTHON.ID, - debugAdapterFactory - ); - // On Debug Session Start: Init comunication - const debugSessionsStarted = vscode.debug.onDidStartDebugSession(() => { - if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { - // Reinitialize process - killProcessIfRunning(); - inDebugMode = true; - - try { - // Shut down existing server on debug restart - if (debuggerCommunicationService.getCurrentDebuggerServer()) { - debuggerCommunicationService.resetCurrentDebuggerServer(); - } - - debuggerCommunicationService.setCurrentDebuggerServer( - new DebuggerCommunicationServer( - currentPanel, - utils.getServerPortConfig(), - deviceSelectionService - ) - ); - - telemetryHandlerService.handleDebuggerTelemetry(); - - openWebview(); - if (currentPanel) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .setWebview(currentPanel); - currentPanel.webview.postMessage({ - active_device: - deviceSelectionService.getCurrentActiveDevice(), - command: "activate-play", - }); - } - } catch (err) { - if (err.message === SERVER_INFO.ERROR_CODE_INIT_SERVER) { - console.error( - `Error trying to init the server on port ${utils.getServerPortConfig()}` - ); - - telemetryHandlerService.handleDebuggerFailTelemetry(); - - vscode.window.showErrorMessage( - CONSTANTS.ERROR.DEBUGGER_SERVER_INIT_FAILED( - utils.getServerPortConfig() - ) - ); - } - } - } - }); - - // On Debug Session Stop: Stop communiation - const debugSessionStopped = vscode.debug.onDidTerminateDebugSession(() => { - if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { - inDebugMode = false; - simulatorDebugConfiguration.deviceSimulatorExpressDebug = false; - if (debuggerCommunicationService.getCurrentDebuggerServer()) { - debuggerCommunicationService.resetCurrentDebuggerServer(); - } - if (currentPanel) { - currentPanel.webview.postMessage({ - command: "reset-state", - active_device: - deviceSelectionService.getCurrentActiveDevice(), - }); - } - } - }); - - const configsChanged = vscode.workspace.onDidChangeConfiguration( - async () => { - if (utils.checkConfig(CONFIG.CONFIG_ENV_ON_SWITCH)) { - pythonExecutablePath = await setupService.setupEnv(context); - } - } - ); - - context.subscriptions.push( - installDependencies, - runSimulator, - changeBaudRate, - closeSerialMonitor, - deployToDevice, - newFile, - openSimulator, - openSerialMonitor, - selectSerialPort, - gettingStartedOpen, - vscode.debug.registerDebugConfigurationProvider( - CONSTANTS.DEBUG_CONFIGURATION_TYPE, - simulatorDebugConfiguration - ), - debugSessionsStarted, - debugSessionStopped, - configsChanged - ); + telemetryAI = new TelemetryAI(context); + setupService = new SetupService(telemetryAI); + let currentPanel: vscode.WebviewPanel | undefined; + let childProcess: cp.ChildProcess | undefined; + let messageListener: vscode.Disposable; + let activeEditorListener: vscode.Disposable; + const webviewService = new WebviewService(context, deviceSelectionService); + const telemetryHandlerService = new TelemetryHandlerService( + telemetryAI, + deviceSelectionService + ); + const formalNameToNickNameMapping = { + [CONSTANTS.DEVICE_NAME_FORMAL.CPX]: CONSTANTS.DEVICE_NAME.CPX, + [CONSTANTS.DEVICE_NAME_FORMAL.MICROBIT]: CONSTANTS.DEVICE_NAME.MICROBIT, + [CONSTANTS.DEVICE_NAME_FORMAL.CLUE]: CONSTANTS.DEVICE_NAME.CLUE, + }; + + // Add our library path to settings.json for autocomplete functionality + updatePythonExtraPaths(); + + // ignore import errors so that adafruit_circuitplayground library + // doesn't trigger lint errors + updatePylintArgs(context); + + pythonExecutablePath = await setupService.setupEnv(context); + + try { + utils.generateCPXConfig(); + configFileCreated = true; + } catch (err) { + console.info("Failed to create the CPX config file."); + configFileCreated = false; + } + + if (pythonExecutablePath === "") { + return; + } + + if (outChannel === undefined) { + outChannel = vscode.window.createOutputChannel(CONSTANTS.NAME); + utils.logToOutputChannel(outChannel, CONSTANTS.INFO.WELCOME_OUTPUT_TAB); + } + + vscode.workspace.onDidSaveTextDocument( + async (document: vscode.TextDocument) => { + await fileSelectionService.updateCurrentFileFromTextFile(document); + } + ); + + const currVersionReleaseName = + "release_note_" + getPackageInfo(context).extensionVersion; + const viewedReleaseNote = context.globalState.get( + currVersionReleaseName, + false + ); + + if (!viewedReleaseNote) { + PopupService.openReleaseNote(); + context.globalState.update(currVersionReleaseName, true); + } + + const openWebview = () => { + if (currentPanel && currentPanel.webview) { + messagingService.setWebview(currentPanel.webview); + currentPanel.webview.html = webviewService.getWebviewContent( + WEBVIEW_TYPES.SIMULATOR, + true, + currentPanel + ); + currentPanel.reveal(vscode.ViewColumn.Beside); + } else { + currentPanel = vscode.window.createWebviewPanel( + CONSTANTS.WEBVIEW_TYPE.SIMULATOR, + CONSTANTS.LABEL.WEBVIEW_PANEL, + { preserveFocus: true, viewColumn: vscode.ViewColumn.Beside }, + { + // Only allow the webview to access resources in our extension's media directory + localResourceRoots: [ + vscode.Uri.file( + path.join( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY + ) + ), + ], + enableScripts: true, + } + ); + + currentPanel.webview.html = webviewService.getWebviewContent( + WEBVIEW_TYPES.SIMULATOR, + true, + currentPanel + ); + messagingService.setWebview(currentPanel.webview); + + if (messageListener !== undefined) { + messageListener.dispose(); + const index = context.subscriptions.indexOf(messageListener); + if (index > -1) { + context.subscriptions.splice(index, 1); + } + } + + if (activeEditorListener !== undefined) { + activeEditorListener.dispose(); + const index = context.subscriptions.indexOf( + activeEditorListener + ); + if (index > -1) { + context.subscriptions.splice(index, 1); + } + } + + if (currentPanel) { + // Handle messages from webview + messageListener = currentPanel.webview.onDidReceiveMessage( + message => { + const messageJson = JSON.stringify({ + active_device: deviceSelectionService.getCurrentActiveDevice(), + state: message.text, + }); + switch (message.command) { + case WEBVIEW_MESSAGES.BUTTON_PRESS: + // Send input to the Python process + telemetryHandlerService.handleButtonPressTelemetry( + message.text + ); + console.log(`About to write ${messageJson} \n`); + if ( + inDebugMode && + debuggerCommunicationService.getCurrentDebuggerServer() + ) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .emitInputChanged(messageJson); + } else if (childProcess) { + childProcess.stdin.write( + messageJson + "\n" + ); + } + break; + case WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP: + console.log(`Play button ${messageJson} \n`); + if (message.text.state as boolean) { + fileSelectionService.setPathAndSendMessage( + message.text.selected_file + ); + fileSelectionService.findCurrentTextDocument(); + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_RUN_SIMULATOR_BUTTON + ); + runSimulatorCommand(); + } else { + killProcessIfRunning(); + } + + if (childProcess) { + childProcess.stdin.write( + messageJson + "\n" + ); + } + + break; + case WEBVIEW_MESSAGES.GESTURE: + case WEBVIEW_MESSAGES.SENSOR_CHANGED: + telemetryHandlerService.handleGestureTelemetry( + message.text + ); + console.log(`Sensor changed ${messageJson} \n`); + if ( + inDebugMode && + debuggerCommunicationService.getCurrentDebuggerServer() + ) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .emitInputChanged(messageJson); + } else if (childProcess) { + childProcess.stdin.write( + messageJson + "\n" + ); + } + break; + case WEBVIEW_MESSAGES.REFRESH_SIMULATOR: + console.log("Refresh button"); + runSimulatorCommand(); + break; + case WEBVIEW_MESSAGES.SLIDER_TELEMETRY: + telemetryHandlerService.handleSensorTelemetry( + message.text + ); + break; + case WEBVIEW_MESSAGES.SWITCH_DEVICE: + deviceSelectionService.setCurrentActiveDevice( + message.text.active_device + ); + killProcessIfRunning(); + break; + default: + vscode.window.showInformationMessage( + CONSTANTS.ERROR.UNEXPECTED_MESSAGE + ); + break; + } + }, + undefined, + context.subscriptions + ); + + activeEditorListener = utils.addVisibleTextEditorCallback( + currentPanel, + context + ); + } + + currentPanel.onDidDispose( + () => { + currentPanel = undefined; + if ( + debuggerCommunicationService.getCurrentDebuggerServer() + ) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .setWebview(undefined); + } + killProcessIfRunning(); + if (firstTimeClosed) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.FIRST_TIME_WEBVIEW + ); + firstTimeClosed = false; + } + }, + undefined, + context.subscriptions + ); + } + sendCurrentDeviceMessage(currentPanel); + }; + + // Open Simulator on the webview + const openSimulator: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.openSimulator", + async () => { + const chosen_device = await vscode.window.showQuickPick( + Object.values(CONSTANTS.DEVICE_NAME_FORMAL) + ); + + if (!chosen_device) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_SIMULATE_TO, + true + ); + return; + } + + const device = formalNameToNickNameMapping[chosen_device]; + deviceSelectionService.setCurrentActiveDevice(device); + const telemetryEvents = telemetryHandlerService.getTelemetryEventsForOpenSimulator( + device + ); + telemetryAI.trackFeatureUsage( + telemetryEvents.openSimulatorTelemetryEvent + ); + telemetryAI.runWithLatencyMeasure( + openWebview, + telemetryEvents.openSimulatorPerformanceTelemetryEvent + ); + } + ); + + const gettingStartedOpen: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.gettingStarted", + () => { + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_GETTING_STARTED + ); + webviewService.openTutorialPanel(); + } + ); + + const openTemplateFile = (template: string) => { + const fileName = template; + const filePath = + __dirname + path.sep + "templates" + path.sep + fileName; + const file = fs.readFileSync(filePath, "utf8"); + const showNewFilePopup: boolean = vscode.workspace + .getConfiguration() + .get(CONFIG.SHOW_NEW_FILE_POPUP); + + if (showNewFilePopup && template === CONSTANTS.TEMPLATE.CPX) { + vscode.window + .showInformationMessage( + CONSTANTS.INFO.NEW_FILE, + DialogResponses.DONT_SHOW, + DialogResponses.EXAMPLE_CODE, + DialogResponses.TUTORIALS + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.DONT_SHOW) { + vscode.workspace + .getConfiguration() + .update(CONFIG.SHOW_NEW_FILE_POPUP, false); + telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_CLICK_DIALOG_DONT_SHOW + ); + } else if (selection === DialogResponses.EXAMPLE_CODE) { + open(CONSTANTS.LINKS.EXAMPLE_CODE); + telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_CLICK_DIALOG_EXAMPLE_CODE + ); + } else if (selection === DialogResponses.TUTORIALS) { + const okAction = () => { + open(CONSTANTS.LINKS.TUTORIALS); + telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_CLICK_DIALOG_TUTORIALS + ); + }; + utils.showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT + ); + } + }); + } + + // tslint:disable-next-line: ban-comma-operator + vscode.workspace + .openTextDocument({ + content: file, + language: LANGUAGE_VARS.PYTHON.ID, + }) + .then((template: vscode.TextDocument) => { + vscode.window.showTextDocument(template, 1, false).then(() => { + openWebview(); + }); + }), + // tslint:disable-next-line: no-unused-expression + (error: any) => { + telemetryHandlerService.handleNewFileErrorTelemetry(); + console.error(`Failed to open a new text document: ${error}`); + }; + }; + + const newFile: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.newFile", + async () => { + const chosen_device = await vscode.window.showQuickPick( + Object.values(CONSTANTS.DEVICE_NAME_FORMAL) + ); + + if (!chosen_device) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.NO_DEVICE_CHOSEN_FOR_NEW_FILE, + true + ); + return; + } + + const device = formalNameToNickNameMapping[chosen_device]; + deviceSelectionService.setCurrentActiveDevice(device); + + const deviceToTemplateMapping = { + [CONSTANTS.DEVICE_NAME.CPX]: CONSTANTS.TEMPLATE.CPX, + [CONSTANTS.DEVICE_NAME.MICROBIT]: CONSTANTS.TEMPLATE.MICROBIT, + [CONSTANTS.DEVICE_NAME.CLUE]: CONSTANTS.TEMPLATE.CLUE, + }; + const templateFile = deviceToTemplateMapping[device]; + + const telemetryEvents = telemetryHandlerService.getTelemetryEventsForNewFile( + device + ); + + telemetryAI.trackFeatureUsage( + telemetryEvents.newFileTelemetryEvent + ); + telemetryAI.runWithLatencyMeasure( + () => openTemplateFile(templateFile), + telemetryEvents.newFilePerformanceTelemetryEvent + ); + } + ); + + const installDependencies: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.installDependencies", + async () => { + pythonExecutablePath = await setupService.setupEnv(context, true); + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_INSTALL_EXTENSION_DEPENDENCIES + ); + } + ); + + const killProcessIfRunning = () => { + if (childProcess !== undefined) { + if (currentPanel) { + currentPanel.webview.postMessage({ + command: "reset-state", + active_device: deviceSelectionService.getCurrentActiveDevice(), + }); + } + // TODO: We need to check the process was correctly killed + childProcess.kill(); + childProcess = undefined; + } + }; + + const runSimulatorCommand = async () => { + pythonProcessDataBuffer = []; + // Prevent running new code if a debug session is active + if (inDebugMode) { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.DEBUGGING_SESSION_IN_PROGESS + ); + return; + } + if (shouldShowRunCodePopup) { + const shouldExitCommand = await vscode.window + .showWarningMessage( + CONSTANTS.WARNING.ACCEPT_AND_RUN, + DialogResponses.ACCEPT_AND_RUN, + DialogResponses.CANCEL + ) + .then((selection: vscode.MessageItem | undefined) => { + let hasAccepted = true; + if (selection === DialogResponses.ACCEPT_AND_RUN) { + shouldShowRunCodePopup = false; + hasAccepted = false; + } + return hasAccepted; + }); + // Don't run users code if they don't accept + if (shouldExitCommand) { + return; + } + } + + openWebview(); + + if (!currentPanel) { + return; + } + + console.info(CONSTANTS.INFO.RUNNING_CODE); + + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.DEPLOY_SIMULATOR, + true + ); + + killProcessIfRunning(); + + await fileSelectionService.updateCurrentFileFromEditor( + vscode.window.activeTextEditor + ); + + if (fileSelectionService.getCurrentFileAbsPath() === "") { + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.NO_FILE_TO_RUN, + true + ); + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FILE_TO_RUN, + DialogResponses.MESSAGE_UNDERSTOOD + ); + } else { + // Save on run + await fileSelectionService.getCurrentTextDocument().save(); + + if ( + !fileSelectionService + .getCurrentTextDocument() + .fileName.endsWith(LANGUAGE_VARS.PYTHON.FILE_ENDS) + ) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.NO_FILE_TO_RUN, + true + ); + return; + } + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.FILE_SELECTED( + fileSelectionService.getCurrentFileAbsPath() + ) + ); + + // Activate the run webview button + currentPanel.webview.postMessage({ + command: "activate-play", + active_device: deviceSelectionService.getCurrentActiveDevice(), + }); + const args = [ + utils.getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.PROCESS_USER_CODE_PY + ), + fileSelectionService.getCurrentFileAbsPath(), + JSON.stringify({ enable_telemetry: utils.getTelemetryState() }), + ]; + childProcess = cp.spawn(pythonExecutablePath, args); + + let dataFromTheProcess = ""; + let oldMessage = ""; + + // Data received from Python process + childProcess.stdout.on("data", data => { + dataFromTheProcess = data.toString(); + if (currentPanel) { + // NOTE: parts of the flow regarding pythonProcessDataBuffer + // are needed for the CLUE simulator to properly receive + // base_64 strings on UNIX systems. + + // added any incomplete data to beginning + const processedData = pythonProcessDataBuffer + .join("") + .concat(dataFromTheProcess); + pythonProcessDataBuffer = []; + + // Process the data from the process and send one state at a time + processedData.split("\0").forEach(message => { + if ( + currentPanel && + message.length > 0 && + message !== oldMessage + ) { + oldMessage = message; + let messageToWebview; + // Check the message is a JSON + try { + messageToWebview = JSON.parse(message); + // Check the JSON is a state + switch (messageToWebview.type) { + case "state": + const messageData = JSON.parse( + messageToWebview.data + ); + if ( + messageData.device_name === + deviceSelectionService.getCurrentActiveDevice() + ) { + messagingService.sendMessageToWebview( + VSCODE_MESSAGES_TO_WEBVIEW.SET_STATE, + messageData + ); + } + break; + + case "print": + console.log( + `Process print statement output = ${messageToWebview.data}` + ); + utils.logToOutputChannel( + outChannel, + `[PRINT] ${messageToWebview.data}` + ); + break; + + default: + console.log( + `Non-state JSON output from the process : ${messageToWebview}` + ); + break; + } + } catch (err) { + if (err instanceof SyntaxError) { + // if not a JSON string, it is incomplete + // add to beginning of next strings + pythonProcessDataBuffer.push(message); + } else { + console.log( + `Errored output: ${messageToWebview}` + ); + } + } + } + }); + } + }); + + // Std error output + childProcess.stderr.on("data", data => { + console.error( + `Error from the Python process through stderr: ${data}` + ); + telemetryAI.trackFeatureUsage( + TelemetryEventName.ERROR_PYTHON_PROCESS + ); + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.STDERR(data), + true + ); + if (currentPanel) { + currentPanel.webview.postMessage({ + active_device: deviceSelectionService.getCurrentActiveDevice(), + command: "reset-state", + }); + } + }); + + // When the process is done + childProcess.on("end", (code: number) => { + console.info(`Command execution exited with code: ${code}`); + }); + } + }; + + // Send message to the webview + const runSimulator: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.runSimulator", + () => { + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_RUN_PALETTE + ); + runSimulatorCommand(); + } + ); + + const deployCode = async (device: string) => { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.DEPLOY_DEVICE, + true + ); + + await fileSelectionService.updateCurrentFileFromEditor( + vscode.window.activeTextEditor + ); + + if (fileSelectionService.getCurrentFileAbsPath() === "") { + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, + true + ); + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, + DialogResponses.MESSAGE_UNDERSTOOD + ); + } else { + await fileSelectionService.getCurrentTextDocument().save(); + + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.FILE_SELECTED( + fileSelectionService.getCurrentFileAbsPath() + ) + ); + + const deviceProcess = cp.spawn(pythonExecutablePath, [ + utils.getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.DEVICE_PY + ), + device, + fileSelectionService.getCurrentFileAbsPath(), + ]); + + let dataFromTheProcess = ""; + + // Data received from Python process + deviceProcess.stdout.on("data", data => { + dataFromTheProcess = data.toString(); + + let messageToWebview; + try { + messageToWebview = JSON.parse(dataFromTheProcess); + if (messageToWebview.type === "complete") { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.DEPLOY_SUCCESS, + true + ); + } + telemetryHandlerService.handleDeployToDeviceFinishedTelemetry( + messageToWebview, + device + ); + } catch (err) { + console.log( + `Non-JSON output from the process : ${dataFromTheProcess}` + ); + } + }); + + // Std error output + deviceProcess.stderr.on("data", data => { + telemetryHandlerService.handleDeployToDeviceErrorTelemetry( + data, + device + ); + console.error( + `Error from the Python device process through stderr: ${data}` + ); + utils.logToOutputChannel( + outChannel, + `[ERROR] ${data} \n`, + true + ); + }); + + // When the process is done + deviceProcess.on("end", (code: number) => { + console.info(`Command execution exited with code: ${code}`); + }); + } + }; + + const deployToDevice: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.deployToDevice", + async () => { + const chosen_device = await vscode.window.showQuickPick( + Object.values(CONSTANTS.DEVICE_NAME_FORMAL) + ); + + if (!chosen_device) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_DEPLOY_TO, + true + ); + return; + } + + const device = formalNameToNickNameMapping[chosen_device]; + + const telemetryEvents = telemetryHandlerService.getTelemetryEventsForStartingDeployToDevice( + device + ); + + telemetryAI.trackFeatureUsage(telemetryEvents.deployTelemetryEvent); + telemetryAI.runWithLatencyMeasure(() => { + deployCode(device); + }, telemetryEvents.deployPerformanceTelemetryEvent); + } + ); + + let serialMonitor: SerialMonitor | undefined; + if (configFileCreated) { + serialMonitor = SerialMonitor.getInstance(); + context.subscriptions.push(serialMonitor); + } + + const selectSerialPort: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.selectSerialPort", + () => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure(() => { + serialMonitor.selectSerialPort(null, null); + }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CHOOSE_PORT); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + const openSerialMonitor: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.openSerialMonitor", + () => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure( + serialMonitor.openSerialMonitor.bind(serialMonitor), + TelemetryEventName.COMMAND_SERIAL_MONITOR_OPEN + ); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + const changeBaudRate: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.changeBaudRate", + () => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure( + serialMonitor.changeBaudRate.bind(serialMonitor), + TelemetryEventName.COMMAND_SERIAL_MONITOR_BAUD_RATE + ); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + const closeSerialMonitor: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.closeSerialMonitor", + (port, showWarning = true) => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure(() => { + serialMonitor.closeSerialMonitor(port, showWarning); + }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + const showReleaseNote = vscode.commands.registerCommand( + "deviceSimulatorExpress.", + (port, showWarning = true) => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure(() => { + serialMonitor.closeSerialMonitor(port, showWarning); + }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + UsbDetector.getInstance().initialize(context.extensionPath); + UsbDetector.getInstance().startListening(); + + if ( + CPXWorkspace.rootPath && + (utils.fileExistsSync( + path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) + ) || + vscode.window.activeTextEditor) + ) { + (() => { + if (!SerialMonitor.getInstance().initialized) { + SerialMonitor.getInstance().initialize(); + } + })(); + } + + // Debugger configuration + const simulatorDebugConfiguration = new SimulatorDebugConfigurationProvider( + utils.getPathToScript(context, "out/", "debug_user_code.py") + ); + + const debugAdapterFactory = new DebugAdapterFactory( + vscode.debug.activeDebugSession, + messagingService, + debuggerCommunicationService + ); + vscode.debug.registerDebugAdapterTrackerFactory( + LANGUAGE_VARS.PYTHON.ID, + debugAdapterFactory + ); + // On Debug Session Start: Init comunication + const debugSessionsStarted = vscode.debug.onDidStartDebugSession(() => { + if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { + // Reinitialize process + killProcessIfRunning(); + inDebugMode = true; + + try { + // Shut down existing server on debug restart + if (debuggerCommunicationService.getCurrentDebuggerServer()) { + debuggerCommunicationService.resetCurrentDebuggerServer(); + } + + debuggerCommunicationService.setCurrentDebuggerServer( + new DebuggerCommunicationServer( + currentPanel, + utils.getServerPortConfig(), + deviceSelectionService + ) + ); + + telemetryHandlerService.handleDebuggerTelemetry(); + + openWebview(); + if (currentPanel) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .setWebview(currentPanel); + currentPanel.webview.postMessage({ + active_device: deviceSelectionService.getCurrentActiveDevice(), + command: "activate-play", + }); + } + } catch (err) { + if (err.message === SERVER_INFO.ERROR_CODE_INIT_SERVER) { + console.error( + `Error trying to init the server on port ${utils.getServerPortConfig()}` + ); + + telemetryHandlerService.handleDebuggerFailTelemetry(); + + vscode.window.showErrorMessage( + CONSTANTS.ERROR.DEBUGGER_SERVER_INIT_FAILED( + utils.getServerPortConfig() + ) + ); + } + } + } + }); + + // On Debug Session Stop: Stop communiation + const debugSessionStopped = vscode.debug.onDidTerminateDebugSession(() => { + if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { + inDebugMode = false; + simulatorDebugConfiguration.deviceSimulatorExpressDebug = false; + if (debuggerCommunicationService.getCurrentDebuggerServer()) { + debuggerCommunicationService.resetCurrentDebuggerServer(); + } + if (currentPanel) { + currentPanel.webview.postMessage({ + command: "reset-state", + active_device: deviceSelectionService.getCurrentActiveDevice(), + }); + } + } + }); + + const configsChanged = vscode.workspace.onDidChangeConfiguration( + async () => { + if (utils.checkConfig(CONFIG.CONFIG_ENV_ON_SWITCH)) { + pythonExecutablePath = await setupService.setupEnv(context); + } + } + ); + + context.subscriptions.push( + installDependencies, + runSimulator, + changeBaudRate, + closeSerialMonitor, + deployToDevice, + newFile, + openSimulator, + openSerialMonitor, + selectSerialPort, + gettingStartedOpen, + vscode.debug.registerDebugConfigurationProvider( + CONSTANTS.DEBUG_CONFIGURATION_TYPE, + simulatorDebugConfiguration + ), + debugSessionsStarted, + debugSessionStopped, + configsChanged + ); } const updatePythonExtraPaths = () => { - updateConfigLists( - "python.autoComplete.extraPaths", - [ - __dirname, - path.join(__dirname, CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY), - path.join(__dirname, CONSTANTS.FILESYSTEM.CLUE), - path.join(__dirname, CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON), - ], - vscode.ConfigurationTarget.Global - ); + updateConfigLists( + "python.autoComplete.extraPaths", + [ + __dirname, + path.join(__dirname, CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY), + path.join(__dirname, CONSTANTS.FILESYSTEM.CLUE), + path.join(__dirname, CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON), + ], + vscode.ConfigurationTarget.Global + ); }; const updatePylintArgs = (context: vscode.ExtensionContext) => { - const outPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY - ); - const micropythonPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY - ); - - const cluePath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.CLUE - ); - - const baseCircuitPythonPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON - ); - // update pylint args to extend system path - // to include python libs local to extention - updateConfigLists( - "python.linting.pylintArgs", - [ - "--init-hook", - `import sys; sys.path.extend([\"${outPath}\",\"${micropythonPath}\",\"${cluePath}\",\"${baseCircuitPythonPath}\"])`, - ], - vscode.ConfigurationTarget.Workspace - ); + const outPath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY + ); + const micropythonPath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY + ); + + const cluePath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + CONSTANTS.FILESYSTEM.CLUE + ); + + const baseCircuitPythonPath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON + ); + // update pylint args to extend system path + // to include python libs local to extention + updateConfigLists( + "python.linting.pylintArgs", + [ + "--init-hook", + `import sys; sys.path.extend([\"${outPath}\",\"${micropythonPath}\",\"${cluePath}\",\"${baseCircuitPythonPath}\"])`, + ], + vscode.ConfigurationTarget.Workspace + ); }; const updateConfigLists = ( - section: string, - newItems: string[], - scope: vscode.ConfigurationTarget + section: string, + newItems: string[], + scope: vscode.ConfigurationTarget ) => { - // function for adding elements to configuration arrays - const currentExtraItems: string[] = - vscode.workspace.getConfiguration().get(section) || []; - const extraItemsSet: Set = new Set( - currentExtraItems.concat(newItems) - ); - - vscode.workspace - .getConfiguration() - .update(section, Array.from(extraItemsSet), scope); + // function for adding elements to configuration arrays + const currentExtraItems: string[] = + vscode.workspace.getConfiguration().get(section) || []; + const extraItemsSet: Set = new Set( + currentExtraItems.concat(newItems) + ); + + vscode.workspace + .getConfiguration() + .update(section, Array.from(extraItemsSet), scope); }; // this method is called when your extension is deactivated export async function deactivate() { - const monitor: SerialMonitor = SerialMonitor.getInstance(); - await monitor.closeSerialMonitor(null, false); - UsbDetector.getInstance().stopListening(); + const monitor: SerialMonitor = SerialMonitor.getInstance(); + await monitor.closeSerialMonitor(null, false); + UsbDetector.getInstance().stopListening(); } diff --git a/Source/extension_utils/utils.ts b/Source/extension_utils/utils.ts index e276605a5..b7be3b71c 100644 --- a/Source/extension_utils/utils.ts +++ b/Source/extension_utils/utils.ts @@ -7,11 +7,11 @@ import * as path from "path"; import * as util from "util"; import * as vscode from "vscode"; import { - CONSTANTS, - CPX_CONFIG_FILE, - DialogResponses, - GLOBAL_ENV_VARS, - SERVER_INFO, + CONSTANTS, + CPX_CONFIG_FILE, + DialogResponses, + GLOBAL_ENV_VARS, + SERVER_INFO, } from "../constants"; import { CPXWorkspace } from "../cpxWorkspace"; import { DeviceContext } from "../deviceContext"; @@ -19,94 +19,94 @@ import { DeviceContext } from "../deviceContext"; export const exec = util.promisify(cp.exec); const errorChannel = vscode.window.createOutputChannel( - CONSTANTS.ERROR.INSTALLATION_ERROR + CONSTANTS.ERROR.INSTALLATION_ERROR ); // tslint:disable-next-line: export-name export const getPathToScript = ( - context: vscode.ExtensionContext, - folderName: string, - fileName: string = "" + context: vscode.ExtensionContext, + folderName: string, + fileName: string = "" ) => { - const onDiskPath = vscode.Uri.file( - path.join(context.extensionPath, folderName, fileName) - ); - const scriptPath = onDiskPath.with({ scheme: "vscode-resource" }); - return scriptPath.fsPath; + const onDiskPath = vscode.Uri.file( + path.join(context.extensionPath, folderName, fileName) + ); + const scriptPath = onDiskPath.with({ scheme: "vscode-resource" }); + return scriptPath.fsPath; }; export const showPrivacyModal = ( - okAction: () => void, - thirdPartyDisclaimer: string + okAction: () => void, + thirdPartyDisclaimer: string ) => { - vscode.window - .showInformationMessage( - `${thirdPartyDisclaimer}: ${CONSTANTS.LINKS.PRIVACY}`, - DialogResponses.AGREE_AND_PROCEED, - DialogResponses.CANCEL - ) - .then((privacySelection: vscode.MessageItem | undefined) => { - if (privacySelection === DialogResponses.AGREE_AND_PROCEED) { - okAction(); - } else if (privacySelection === DialogResponses.CANCEL) { - // do nothing - } - }); + vscode.window + .showInformationMessage( + `${thirdPartyDisclaimer}: ${CONSTANTS.LINKS.PRIVACY}`, + DialogResponses.AGREE_AND_PROCEED, + DialogResponses.CANCEL + ) + .then((privacySelection: vscode.MessageItem | undefined) => { + if (privacySelection === DialogResponses.AGREE_AND_PROCEED) { + okAction(); + } else if (privacySelection === DialogResponses.CANCEL) { + // do nothing + } + }); }; export const logToOutputChannel = ( - outChannel: vscode.OutputChannel | undefined, - message: string, - show: boolean = false + outChannel: vscode.OutputChannel | undefined, + message: string, + show: boolean = false ): void => { - if (outChannel) { - if (show) { - outChannel.show(true); - } - outChannel.append(message); - } + if (outChannel) { + if (show) { + outChannel.show(true); + } + outChannel.append(message); + } }; export function tryParseJSON(jsonString: string): any | boolean { - try { - const jsonObj = JSON.parse(jsonString); - if (jsonObj && typeof jsonObj === "object") { - return jsonObj; - } - } catch (exception) {} - - return false; + try { + const jsonObj = JSON.parse(jsonString); + if (jsonObj && typeof jsonObj === "object") { + return jsonObj; + } + } catch (exception) {} + + return false; } export function fileExistsSync(filePath: string): boolean { - try { - return fs.statSync(filePath).isFile(); - } catch (error) { - return false; - } + try { + return fs.statSync(filePath).isFile(); + } catch (error) { + return false; + } } export function mkdirRecursivelySync(dirPath: string): void { - if (directoryExistsSync(dirPath)) { - return; - } - const dirname = path.dirname(dirPath); - if (path.normalize(dirname) === path.normalize(dirPath)) { - fs.mkdirSync(dirPath); - } else if (directoryExistsSync(dirname)) { - fs.mkdirSync(dirPath); - } else { - mkdirRecursivelySync(dirname); - fs.mkdirSync(dirPath); - } + if (directoryExistsSync(dirPath)) { + return; + } + const dirname = path.dirname(dirPath); + if (path.normalize(dirname) === path.normalize(dirPath)) { + fs.mkdirSync(dirPath); + } else if (directoryExistsSync(dirname)) { + fs.mkdirSync(dirPath); + } else { + mkdirRecursivelySync(dirname); + fs.mkdirSync(dirPath); + } } export function directoryExistsSync(dirPath: string): boolean { - try { - return fs.statSync(dirPath).isDirectory(); - } catch (e) { - return false; - } + try { + return fs.statSync(dirPath).isDirectory(); + } catch (e) { + return false; + } } /** @@ -115,121 +115,119 @@ export function directoryExistsSync(dirPath: string): boolean { * The padding is applied from the start (left) of the current string. */ export function padStart( - sourceString: string, - targetLength: number, - padString?: string + sourceString: string, + targetLength: number, + padString?: string ): string { - if (!sourceString) { - return sourceString; - } - - if (!(String.prototype as any).padStart) { - // https://github.com/uxitten/polyfill/blob/master/string.polyfill.js - padString = String(padString || " "); - if (sourceString.length > targetLength) { - return sourceString; - } else { - targetLength = targetLength - sourceString.length; - if (targetLength > padString.length) { - padString += padString.repeat(targetLength / padString.length); // append to original to ensure we are longer than needed - } - return padString.slice(0, targetLength) + sourceString; - } - } else { - return (sourceString as any).padStart(targetLength, padString); - } + if (!sourceString) { + return sourceString; + } + + if (!(String.prototype as any).padStart) { + // https://github.com/uxitten/polyfill/blob/master/string.polyfill.js + padString = String(padString || " "); + if (sourceString.length > targetLength) { + return sourceString; + } else { + targetLength = targetLength - sourceString.length; + if (targetLength > padString.length) { + padString += padString.repeat(targetLength / padString.length); // append to original to ensure we are longer than needed + } + return padString.slice(0, targetLength) + sourceString; + } + } else { + return (sourceString as any).padStart(targetLength, padString); + } } export function convertToHex(num: number, width = 0): string { - return padStart(num.toString(16), width, "0"); + return padStart(num.toString(16), width, "0"); } export function generateCPXConfig(): void { - const deviceContext: DeviceContext = DeviceContext.getInstance(); - const cpxJson = { - port: deviceContext.port, - }; - const cpxConfigFilePath: string = path.join( - CPXWorkspace.rootPath, - CPX_CONFIG_FILE - ); - mkdirRecursivelySync(path.dirname(cpxConfigFilePath)); - fs.writeFileSync(cpxConfigFilePath, JSON.stringify(cpxJson, null, 4)); + const deviceContext: DeviceContext = DeviceContext.getInstance(); + const cpxJson = { + port: deviceContext.port, + }; + const cpxConfigFilePath: string = path.join( + CPXWorkspace.rootPath, + CPX_CONFIG_FILE + ); + mkdirRecursivelySync(path.dirname(cpxConfigFilePath)); + fs.writeFileSync(cpxConfigFilePath, JSON.stringify(cpxJson, null, 4)); } export const addVisibleTextEditorCallback = ( - currentPanel: vscode.WebviewPanel, - context: vscode.ExtensionContext + currentPanel: vscode.WebviewPanel, + context: vscode.ExtensionContext ): vscode.Disposable => { - const initialPythonEditors = filterForPythonFiles( - vscode.window.visibleTextEditors - ); - currentPanel.webview.postMessage({ - command: "visible-editors", - state: { activePythonEditors: initialPythonEditors }, - }); - return vscode.window.onDidChangeVisibleTextEditors( - (textEditors: vscode.TextEditor[]) => { - const activePythonEditors = filterForPythonFiles(textEditors); - currentPanel.webview.postMessage({ - command: "visible-editors", - state: { activePythonEditors }, - }); - }, - {}, - context.subscriptions - ); + const initialPythonEditors = filterForPythonFiles( + vscode.window.visibleTextEditors + ); + currentPanel.webview.postMessage({ + command: "visible-editors", + state: { activePythonEditors: initialPythonEditors }, + }); + return vscode.window.onDidChangeVisibleTextEditors( + (textEditors: vscode.TextEditor[]) => { + const activePythonEditors = filterForPythonFiles(textEditors); + currentPanel.webview.postMessage({ + command: "visible-editors", + state: { activePythonEditors }, + }); + }, + {}, + context.subscriptions + ); }; export const filterForPythonFiles = (textEditors: vscode.TextEditor[]) => { - return textEditors - .filter( - (editor) => editor.document.languageId === GLOBAL_ENV_VARS.PYTHON - ) - .map((editor) => editor.document.fileName); + return textEditors + .filter(editor => editor.document.languageId === GLOBAL_ENV_VARS.PYTHON) + .map(editor => editor.document.fileName); }; export const getActiveEditorFromPath = ( - filePath: string + filePath: string ): vscode.TextDocument => { - const activeEditor = vscode.window.visibleTextEditors.find( - (editor: vscode.TextEditor) => editor.document.fileName === filePath - ); - return activeEditor ? activeEditor.document : undefined; + const activeEditor = vscode.window.visibleTextEditors.find( + (editor: vscode.TextEditor) => editor.document.fileName === filePath + ); + return activeEditor ? activeEditor.document : undefined; }; export const getServerPortConfig = (): number => { - // tslint:disable: no-backbone-get-set-outside-model prefer-type-cast - if ( - vscode.workspace - .getConfiguration() - .has(SERVER_INFO.SERVER_PORT_CONFIGURATION) - ) { - return vscode.workspace - .getConfiguration() - .get(SERVER_INFO.SERVER_PORT_CONFIGURATION) as number; - } - return SERVER_INFO.DEFAULT_SERVER_PORT; + // tslint:disable: no-backbone-get-set-outside-model prefer-type-cast + if ( + vscode.workspace + .getConfiguration() + .has(SERVER_INFO.SERVER_PORT_CONFIGURATION) + ) { + return vscode.workspace + .getConfiguration() + .get(SERVER_INFO.SERVER_PORT_CONFIGURATION) as number; + } + return SERVER_INFO.DEFAULT_SERVER_PORT; }; export const checkConfig = (configName: string): boolean => { - return vscode.workspace.getConfiguration().get(configName) === true; + return vscode.workspace.getConfiguration().get(configName) === true; }; export const getConfig = (configName: string): string => { - return vscode.workspace.getConfiguration().get(configName); + return vscode.workspace.getConfiguration().get(configName); }; export const createEscapedPath = (...pieces: string[]) => { - const initialPath: string = path.join(...pieces); + const initialPath: string = path.join(...pieces); - // escape all special characters - // https://stackoverflow.com/questions/1779858/how-do-i-escape-a-string-for-a-shell-command-in-node - return `"` + initialPath.replace(/(["'$`\\])/g, "\\$1") + `"`; + // escape all special characters + // https://stackoverflow.com/questions/1779858/how-do-i-escape-a-string-for-a-shell-command-in-node + return `"` + initialPath.replace(/(["'$`\\])/g, "\\$1") + `"`; }; export const getTelemetryState = () => { - return vscode.workspace - .getConfiguration() - .get("telemetry.enableTelemetry", true); + return vscode.workspace + .getConfiguration() + .get("telemetry.enableTelemetry", true); }; diff --git a/Source/requirements.txt b/Source/requirements.txt index 3a5fdb5a2..c13eef60b 100644 --- a/Source/requirements.txt +++ b/Source/requirements.txt @@ -9,4 +9,4 @@ adafruit-circuitpython-fancyled==1.3.3 Pillow==8.1.1 adafruit-circuitpython-bitmap_font==1.1.0 adafruit-circuitpython-display-shapes==1.2.0 -adafruit-circuitpython-neopixel==5.0.0 +adafruit-circuitpython-neopixel==5.0.0 \ No newline at end of file diff --git a/Source/serialMonitor.ts b/Source/serialMonitor.ts index f5460862c..f3685cd58 100644 --- a/Source/serialMonitor.ts +++ b/Source/serialMonitor.ts @@ -11,288 +11,300 @@ import { logToOutputChannel } from "./extension_utils/utils"; import { SerialPortControl } from "./serialPortControl"; export interface ISerialPortDetail { - path: string; - manufacturer: string; - vendorId: string; - productId: string; + path: string; + manufacturer: string; + vendorId: string; + productId: string; } export class SerialMonitor implements vscode.Disposable { - public static DEFAULT_BAUD_RATE: number = 115200; + public static DEFAULT_BAUD_RATE: number = 115200; - public static listBaudRates(): number[] { - return [ - 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 74880, 115200, - 230400, 250000, - ]; - } + public static listBaudRates(): number[] { + return [ + 300, + 1200, + 2400, + 4800, + 9600, + 19200, + 38400, + 57600, + 74880, + 115200, + 230400, + 250000, + ]; + } - public static getInstance(): SerialMonitor { - if (SerialMonitor._serialMonitor === null) { - SerialMonitor._serialMonitor = new SerialMonitor(); - } - return SerialMonitor._serialMonitor; - } + public static getInstance(): SerialMonitor { + if (SerialMonitor._serialMonitor === null) { + SerialMonitor._serialMonitor = new SerialMonitor(); + } + return SerialMonitor._serialMonitor; + } - private static _serialMonitor: SerialMonitor | null = null; + private static _serialMonitor: SerialMonitor | null = null; - private _currentPort!: string; - private _currentBaudRate!: number; - private _outputChannel!: vscode.OutputChannel; - private _serialPortControl: SerialPortControl | null = null; - private _baudRateStatusBar!: vscode.StatusBarItem; - private _openPortStatusBar!: vscode.StatusBarItem; - private _portsStatusBar!: vscode.StatusBarItem; + private _currentPort!: string; + private _currentBaudRate!: number; + private _outputChannel!: vscode.OutputChannel; + private _serialPortControl: SerialPortControl | null = null; + private _baudRateStatusBar!: vscode.StatusBarItem; + private _openPortStatusBar!: vscode.StatusBarItem; + private _portsStatusBar!: vscode.StatusBarItem; - private constructor() { - const deviceContext = DeviceContext.getInstance(); - deviceContext.onDidChange(() => { - if (deviceContext.port) { - if (!this.initialized) { - this.initialize(); - } - this.updatePortListStatus(null); - } - }); - } + private constructor() { + const deviceContext = DeviceContext.getInstance(); + deviceContext.onDidChange(() => { + if (deviceContext.port) { + if (!this.initialized) { + this.initialize(); + } + this.updatePortListStatus(null); + } + }); + } - public initialize() { - const defaultBaudRate: number = SerialMonitor.DEFAULT_BAUD_RATE; - this._outputChannel = vscode.window.createOutputChannel( - CONSTANTS.MISC.SERIAL_MONITOR_NAME - ); - this._currentBaudRate = defaultBaudRate; - this._portsStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.PORT - ); - this._portsStatusBar.command = - "deviceSimulatorExpress.common.selectSerialPort"; - this._portsStatusBar.tooltip = "Select Serial Port"; - this._portsStatusBar.show(); + public initialize() { + const defaultBaudRate: number = SerialMonitor.DEFAULT_BAUD_RATE; + this._outputChannel = vscode.window.createOutputChannel( + CONSTANTS.MISC.SERIAL_MONITOR_NAME + ); + this._currentBaudRate = defaultBaudRate; + this._portsStatusBar = vscode.window.createStatusBarItem( + vscode.StatusBarAlignment.Right, + STATUS_BAR_PRIORITY.PORT + ); + this._portsStatusBar.command = + "deviceSimulatorExpress.common.selectSerialPort"; + this._portsStatusBar.tooltip = "Select Serial Port"; + this._portsStatusBar.show(); - this._openPortStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.OPEN_PORT - ); - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.openSerialMonitor"; - this._openPortStatusBar.text = `$(plug)`; - this._openPortStatusBar.tooltip = "Open Serial Monitor"; - this._openPortStatusBar.show(); + this._openPortStatusBar = vscode.window.createStatusBarItem( + vscode.StatusBarAlignment.Right, + STATUS_BAR_PRIORITY.OPEN_PORT + ); + this._openPortStatusBar.command = + "deviceSimulatorExpress.common.openSerialMonitor"; + this._openPortStatusBar.text = `$(plug)`; + this._openPortStatusBar.tooltip = "Open Serial Monitor"; + this._openPortStatusBar.show(); - this._baudRateStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.BAUD_RATE - ); - this._baudRateStatusBar.command = - "deviceSimulatorExpress.common.changeBaudRate"; - this._baudRateStatusBar.tooltip = "Baud Rate"; - this._baudRateStatusBar.text = defaultBaudRate.toString(); - this.updatePortListStatus(null); - } + this._baudRateStatusBar = vscode.window.createStatusBarItem( + vscode.StatusBarAlignment.Right, + STATUS_BAR_PRIORITY.BAUD_RATE + ); + this._baudRateStatusBar.command = + "deviceSimulatorExpress.common.changeBaudRate"; + this._baudRateStatusBar.tooltip = "Baud Rate"; + this._baudRateStatusBar.text = defaultBaudRate.toString(); + this.updatePortListStatus(null); + } - public async selectSerialPort(vid: string | null, pid: string | null) { - const lists = await SerialPortControl.list(); - if (!lists.length) { - vscode.window.showInformationMessage( - "No serial message is available." - ); - return; - } + public async selectSerialPort(vid: string | null, pid: string | null) { + const lists = await SerialPortControl.list(); + if (!lists.length) { + vscode.window.showInformationMessage( + "No serial message is available." + ); + return; + } - if (vid && pid) { - const valueOfVid = parseInt(vid, 16); - const valueOfPid = parseInt(pid, 16); - const foundPort = lists.find((port) => { - if (port.productId && port.vendorId) { - return ( - parseInt(port.productId, 16) === valueOfPid && - parseInt(port.vendorId, 16) === valueOfVid - ); - } - return false; - }); - if ( - foundPort && - !(this._serialPortControl && this._serialPortControl.isActive) - ) { - this.updatePortListStatus(foundPort.path); - } - } else { - const chosen = await vscode.window.showQuickPick( - lists - .map((port: ISerialPortDetail): vscode.QuickPickItem => { - return { - description: port.manufacturer, - label: port.path, - }; - }) - .sort((a, b): number => { - return a.label === b.label - ? 0 - : a.label > b.label - ? 1 - : -1; - }) as vscode.QuickPickItem[], - { placeHolder: CONSTANTS.MISC.SELECT_PORT_PLACEHOLDER } - ); + if (vid && pid) { + const valueOfVid = parseInt(vid, 16); + const valueOfPid = parseInt(pid, 16); + const foundPort = lists.find(port => { + if (port.productId && port.vendorId) { + return ( + parseInt(port.productId, 16) === valueOfPid && + parseInt(port.vendorId, 16) === valueOfVid + ); + } + return false; + }); + if ( + foundPort && + !(this._serialPortControl && this._serialPortControl.isActive) + ) { + this.updatePortListStatus(foundPort.path); + } + } else { + const chosen = await vscode.window.showQuickPick( + lists + .map( + (port: ISerialPortDetail): vscode.QuickPickItem => { + return { + description: port.manufacturer, + label: port.path, + }; + } + ) + .sort((a, b): number => { + return a.label === b.label + ? 0 + : a.label > b.label + ? 1 + : -1; + }) as vscode.QuickPickItem[], + { placeHolder: CONSTANTS.MISC.SELECT_PORT_PLACEHOLDER } + ); - if (chosen && chosen.label) { - this.updatePortListStatus(chosen.label); - } - } - } + if (chosen && chosen.label) { + this.updatePortListStatus(chosen.label); + } + } + } - public async openSerialMonitor() { - if (!this._currentPort) { - const ans = await vscode.window.showInformationMessage( - CONSTANTS.WARNING.NO_SERIAL_PORT_SELECTED, - DialogResponses.SELECT, - DialogResponses.CANCEL - ); - if (ans === DialogResponses.SELECT) { - await this.selectSerialPort(null, null); - } - if (!this._currentPort) { - return; - } - } + public async openSerialMonitor() { + if (!this._currentPort) { + const ans = await vscode.window.showInformationMessage( + CONSTANTS.WARNING.NO_SERIAL_PORT_SELECTED, + DialogResponses.SELECT, + DialogResponses.CANCEL + ); + if (ans === DialogResponses.SELECT) { + await this.selectSerialPort(null, null); + } + if (!this._currentPort) { + return; + } + } - if (this._serialPortControl) { - if (this._currentPort !== this._serialPortControl.currentPort) { - await this._serialPortControl.changePort(this._currentPort); - } else if (this._serialPortControl.isActive) { - vscode.window.showWarningMessage( - `Serial Monitor is already opened for ${this._currentPort}` - ); - return; - } - } else { - this._serialPortControl = new SerialPortControl( - this._currentPort, - this._currentBaudRate, - this._outputChannel - ); - } + if (this._serialPortControl) { + if (this._currentPort !== this._serialPortControl.currentPort) { + await this._serialPortControl.changePort(this._currentPort); + } else if (this._serialPortControl.isActive) { + vscode.window.showWarningMessage( + `Serial Monitor is already opened for ${this._currentPort}` + ); + return; + } + } else { + this._serialPortControl = new SerialPortControl( + this._currentPort, + this._currentBaudRate, + this._outputChannel + ); + } - if (!this._serialPortControl.currentPort) { - console.error( - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT(this._currentPort) - ); - return; - } + if (!this._serialPortControl.currentPort) { + console.error( + CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT(this._currentPort) + ); + return; + } - try { - await this._serialPortControl.open(); - this.updatePortStatus(true); - } catch (error) { - logToOutputChannel( - outChannel, - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT_DUE_TO( - this._currentPort, - error - ), - true - ); - } - } + try { + await this._serialPortControl.open(); + this.updatePortStatus(true); + } catch (error) { + logToOutputChannel( + outChannel, + CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT_DUE_TO( + this._currentPort, + error + ), + true + ); + } + } - public get initialized(): boolean { - return !!this._outputChannel; - } + public get initialized(): boolean { + return !!this._outputChannel; + } - public dispose() { - if (this._serialPortControl && this._serialPortControl.isActive) { - return this._serialPortControl.stop(); - } - } + public dispose() { + if (this._serialPortControl && this._serialPortControl.isActive) { + return this._serialPortControl.stop(); + } + } - public async changeBaudRate() { - const baudRates = SerialMonitor.listBaudRates(); - const chosen = await vscode.window.showQuickPick( - baudRates.map((baudRate) => baudRate.toString()) - ); + public async changeBaudRate() { + const baudRates = SerialMonitor.listBaudRates(); + const chosen = await vscode.window.showQuickPick( + baudRates.map(baudRate => baudRate.toString()) + ); - if (!chosen) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.NO_RATE_SELECTED, - true - ); - return; - } + if (!chosen) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.NO_RATE_SELECTED, + true + ); + return; + } - if (!parseInt(chosen, 10)) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.INVALID_BAUD_RATE, - true - ); - return; - } + if (!parseInt(chosen, 10)) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.INVALID_BAUD_RATE, + true + ); + return; + } - if (!this._serialPortControl) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.SERIAL_MONITOR_NOT_STARTED, - true - ); - return; - } + if (!this._serialPortControl) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.SERIAL_MONITOR_NOT_STARTED, + true + ); + return; + } - const selectedRate: number = parseInt(chosen, 10); - await this._serialPortControl.changeBaudRate(selectedRate); - this._currentBaudRate = selectedRate; - this._baudRateStatusBar.text = chosen; - } + const selectedRate: number = parseInt(chosen, 10); + await this._serialPortControl.changeBaudRate(selectedRate); + this._currentBaudRate = selectedRate; + this._baudRateStatusBar.text = chosen; + } - public async closeSerialMonitor(port: string, showWarning: boolean = true) { - if (this._serialPortControl) { - if (port && port !== this._serialPortControl.currentPort) { - // Port is not opened - return false; - } - const result = await this._serialPortControl.stop(); - this.updatePortStatus(false); - return result; - } else if (!port && showWarning) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.SERIAL_PORT_NOT_STARTED, - true - ); - return false; - } - } + public async closeSerialMonitor(port: string, showWarning: boolean = true) { + if (this._serialPortControl) { + if (port && port !== this._serialPortControl.currentPort) { + // Port is not opened + return false; + } + const result = await this._serialPortControl.stop(); + this.updatePortStatus(false); + return result; + } else if (!port && showWarning) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.SERIAL_PORT_NOT_STARTED, + true + ); + return false; + } + } - private updatePortStatus(isOpened: boolean) { - if (isOpened) { - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.closeSerialMonitor"; - this._openPortStatusBar.text = `$(x)`; - this._openPortStatusBar.tooltip = "Close Serial Monitor"; - this._baudRateStatusBar.show(); - } else { - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.openSerialMonitor"; - this._openPortStatusBar.text = `$(plug)`; - this._openPortStatusBar.tooltip = "Open Serial Monitor"; - this._baudRateStatusBar.hide(); - } - } + private updatePortStatus(isOpened: boolean) { + if (isOpened) { + this._openPortStatusBar.command = + "deviceSimulatorExpress.common.closeSerialMonitor"; + this._openPortStatusBar.text = `$(x)`; + this._openPortStatusBar.tooltip = "Close Serial Monitor"; + this._baudRateStatusBar.show(); + } else { + this._openPortStatusBar.command = + "deviceSimulatorExpress.common.openSerialMonitor"; + this._openPortStatusBar.text = `$(plug)`; + this._openPortStatusBar.tooltip = "Open Serial Monitor"; + this._baudRateStatusBar.hide(); + } + } - private updatePortListStatus(port: string | null) { - const deviceContext = DeviceContext.getInstance(); - if (port) { - deviceContext.port = port; - } - this._currentPort = deviceContext.port; + private updatePortListStatus(port: string | null) { + const deviceContext = DeviceContext.getInstance(); + if (port) { + deviceContext.port = port; + } + this._currentPort = deviceContext.port; - if (deviceContext.port) { - this._portsStatusBar.text = deviceContext.port; - } else { - this._portsStatusBar.text = ""; + } + } } diff --git a/Source/serialPortControl.ts b/Source/serialPortControl.ts index 0abcfa03e..64d8d010a 100644 --- a/Source/serialPortControl.ts +++ b/Source/serialPortControl.ts @@ -9,188 +9,188 @@ import { CONSTANTS } from "./constants"; import { logToOutputChannel } from "./extension_utils/utils"; interface ISerialPortDetail { - path: string; - manufacturer: string; - vendorId: string; - productId: string; + path: string; + manufacturer: string; + vendorId: string; + productId: string; } export class SerialPortControl { - public static get serialport(): any { - if (!SerialPortControl._serialport) { - SerialPortControl._serialport = require("usb-native").SerialPort; - } - return SerialPortControl._serialport; - } - - public static list(): Promise { - return new Promise((resolve, reject) => { - SerialPortControl.serialport.list().then( - (ports) => resolve(ports), - (err) => reject(err) - ); - }); - } - - private static _serialport: any; - - private _currentPort: string; - private _currentBaudRate: number; - private _currentSerialPort: any; - - public constructor( - port: string, - baudRate: number, - private _outputChannel: OutputChannel - ) { - this._currentPort = port; - this._currentBaudRate = baudRate; - } - - public get isActive(): boolean { - return this._currentSerialPort && this._currentSerialPort.isOpen; - } - - public get currentPort(): string { - return this._currentPort; - } - - public open(): Promise { - logToOutputChannel( - this._outputChannel, - CONSTANTS.INFO.OPENING_SERIAL_PORT(this._currentPort) - ); - return new Promise((resolve, reject) => { - if (this._currentSerialPort && this._currentSerialPort.isOpen) { - this._currentSerialPort.close((err: any) => { - if (err) { - return reject(err); - } - this._currentSerialPort = null; - return this.open().then( - () => { - resolve(); - }, - (error) => { - reject(error); - } - ); - }); - } else { - this._currentSerialPort = new SerialPortControl.serialport( - this._currentPort, - { baudRate: this._currentBaudRate } - ); - this._outputChannel.show(); - this._currentSerialPort.on("open", () => { - this._currentSerialPort.write( - CONSTANTS.MISC.SERIAL_MONITOR_TEST_IF_OPEN + os.EOL, - (err: any) => { - if ( - err && - !( - err.message.indexOf( - CONSTANTS.ERROR.COMPORT_UNKNOWN_ERROR - ) >= 0 - ) - ) { - logToOutputChannel( - this._outputChannel, - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT( - this._currentPort - ) - ); - logToOutputChannel( - this._outputChannel, - CONSTANTS.ERROR.RECONNECT_DEVICE - ); - reject(err); - } else { - logToOutputChannel( - this._outputChannel, - CONSTANTS.INFO.OPENED_SERIAL_PORT( - this._currentPort - ) - ); - resolve(); - } - } - ); - }); - } - - this._currentSerialPort.on("data", (event: any) => { - logToOutputChannel(this._outputChannel, event.toString()); - }); - - this._currentSerialPort.on("error", (error: any) => { - logToOutputChannel(this._outputChannel, error.toString()); - }); - }); - } - - public changePort(newPort: string): Promise { - return new Promise((resolve, reject) => { - if (newPort === this._currentPort) { - resolve(); - return; - } - this._currentPort = newPort; - if (!this._currentSerialPort || !this.isActive) { - resolve(); - return; - } - this._currentSerialPort.close((error: any) => { - if (error) { - reject(error); - } else { - this._currentSerialPort = null; - resolve(); - } - }); - }); - } - - public stop(): Promise { - return new Promise((resolve, reject) => { - if (!this._currentSerialPort || !this.isActive) { - resolve(false); - return; - } - this._currentSerialPort.close((error: any) => { - if (this._outputChannel) { - logToOutputChannel( - this._outputChannel, - CONSTANTS.INFO.CLOSED_SERIAL_PORT(this._currentPort) - ); - } - this._currentSerialPort = null; - if (error) { - reject(error); - } else { - resolve(true); - } - }); - }); - } - - public changeBaudRate(newBaudRate: number): Promise { - return new Promise((resolve, reject) => { - this._currentBaudRate = newBaudRate; - if (!this._currentSerialPort || !this.isActive) { - resolve(); - return; - } - this._currentSerialPort.update( - { baudRate: this._currentBaudRate }, - (error: any) => { - if (error) { - reject(error); - } else { - resolve(); - } - } - ); - }); - } + public static get serialport(): any { + if (!SerialPortControl._serialport) { + SerialPortControl._serialport = require("usb-native").SerialPort; + } + return SerialPortControl._serialport; + } + + public static list(): Promise { + return new Promise((resolve, reject) => { + SerialPortControl.serialport.list().then( + ports => resolve(ports), + err => reject(err) + ); + }); + } + + private static _serialport: any; + + private _currentPort: string; + private _currentBaudRate: number; + private _currentSerialPort: any; + + public constructor( + port: string, + baudRate: number, + private _outputChannel: OutputChannel + ) { + this._currentPort = port; + this._currentBaudRate = baudRate; + } + + public get isActive(): boolean { + return this._currentSerialPort && this._currentSerialPort.isOpen; + } + + public get currentPort(): string { + return this._currentPort; + } + + public open(): Promise { + logToOutputChannel( + this._outputChannel, + CONSTANTS.INFO.OPENING_SERIAL_PORT(this._currentPort) + ); + return new Promise((resolve, reject) => { + if (this._currentSerialPort && this._currentSerialPort.isOpen) { + this._currentSerialPort.close((err: any) => { + if (err) { + return reject(err); + } + this._currentSerialPort = null; + return this.open().then( + () => { + resolve(); + }, + error => { + reject(error); + } + ); + }); + } else { + this._currentSerialPort = new SerialPortControl.serialport( + this._currentPort, + { baudRate: this._currentBaudRate } + ); + this._outputChannel.show(); + this._currentSerialPort.on("open", () => { + this._currentSerialPort.write( + CONSTANTS.MISC.SERIAL_MONITOR_TEST_IF_OPEN + os.EOL, + (err: any) => { + if ( + err && + !( + err.message.indexOf( + CONSTANTS.ERROR.COMPORT_UNKNOWN_ERROR + ) >= 0 + ) + ) { + logToOutputChannel( + this._outputChannel, + CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT( + this._currentPort + ) + ); + logToOutputChannel( + this._outputChannel, + CONSTANTS.ERROR.RECONNECT_DEVICE + ); + reject(err); + } else { + logToOutputChannel( + this._outputChannel, + CONSTANTS.INFO.OPENED_SERIAL_PORT( + this._currentPort + ) + ); + resolve(); + } + } + ); + }); + } + + this._currentSerialPort.on("data", (event: any) => { + logToOutputChannel(this._outputChannel, event.toString()); + }); + + this._currentSerialPort.on("error", (error: any) => { + logToOutputChannel(this._outputChannel, error.toString()); + }); + }); + } + + public changePort(newPort: string): Promise { + return new Promise((resolve, reject) => { + if (newPort === this._currentPort) { + resolve(); + return; + } + this._currentPort = newPort; + if (!this._currentSerialPort || !this.isActive) { + resolve(); + return; + } + this._currentSerialPort.close((error: any) => { + if (error) { + reject(error); + } else { + this._currentSerialPort = null; + resolve(); + } + }); + }); + } + + public stop(): Promise { + return new Promise((resolve, reject) => { + if (!this._currentSerialPort || !this.isActive) { + resolve(false); + return; + } + this._currentSerialPort.close((error: any) => { + if (this._outputChannel) { + logToOutputChannel( + this._outputChannel, + CONSTANTS.INFO.CLOSED_SERIAL_PORT(this._currentPort) + ); + } + this._currentSerialPort = null; + if (error) { + reject(error); + } else { + resolve(true); + } + }); + }); + } + + public changeBaudRate(newBaudRate: number): Promise { + return new Promise((resolve, reject) => { + this._currentBaudRate = newBaudRate; + if (!this._currentSerialPort || !this.isActive) { + resolve(); + return; + } + this._currentSerialPort.update( + { baudRate: this._currentBaudRate }, + (error: any) => { + if (error) { + reject(error); + } else { + resolve(); + } + } + ); + }); + } } diff --git a/Source/service/PopupService.ts b/Source/service/PopupService.ts index 84d312467..d5aadbff4 100644 --- a/Source/service/PopupService.ts +++ b/Source/service/PopupService.ts @@ -3,14 +3,14 @@ import * as vscode from "vscode"; import { LATEST_RELEASE_NOTE } from "../latest_release_note"; export class PopupService { - public static openReleaseNote() { - const panel = vscode.window.createWebviewPanel( - "releaseNote", - "Release Note", - vscode.ViewColumn.One, - {} - ); + public static openReleaseNote() { + const panel = vscode.window.createWebviewPanel( + "releaseNote", + "Release Note", + vscode.ViewColumn.One, + {} + ); - panel.webview.html = LATEST_RELEASE_NOTE; - } + panel.webview.html = LATEST_RELEASE_NOTE; + } } diff --git a/Source/service/debuggerCommunicationService.ts b/Source/service/debuggerCommunicationService.ts index 1e47024f1..b37b1c2ed 100644 --- a/Source/service/debuggerCommunicationService.ts +++ b/Source/service/debuggerCommunicationService.ts @@ -1,27 +1,27 @@ import { DebuggerCommunicationServer } from "../debuggerCommunicationServer"; export class DebuggerCommunicationService { - private currentDebuggerServer?: DebuggerCommunicationServer; - private previousDebuggerServerToDisconnect?: DebuggerCommunicationServer; + private currentDebuggerServer?: DebuggerCommunicationServer; + private previousDebuggerServerToDisconnect?: DebuggerCommunicationServer; - public setCurrentDebuggerServer(debugServer: DebuggerCommunicationServer) { - this.currentDebuggerServer = debugServer; - } - // Used for restart and stop event - public resetCurrentDebuggerServer() { - if (this.currentDebuggerServer) { - this.currentDebuggerServer.closeConnection(); - } - this.previousDebuggerServerToDisconnect = this.currentDebuggerServer; - this.currentDebuggerServer = undefined; - } - public getCurrentDebuggerServer() { - return this.currentDebuggerServer; - } - // Only used for stop event - public handleStopEvent() { - if (this.previousDebuggerServerToDisconnect) { - this.previousDebuggerServerToDisconnect.disconnectFromPort(); - } - } + public setCurrentDebuggerServer(debugServer: DebuggerCommunicationServer) { + this.currentDebuggerServer = debugServer; + } + // Used for restart and stop event + public resetCurrentDebuggerServer() { + if (this.currentDebuggerServer) { + this.currentDebuggerServer.closeConnection(); + } + this.previousDebuggerServerToDisconnect = this.currentDebuggerServer; + this.currentDebuggerServer = undefined; + } + public getCurrentDebuggerServer() { + return this.currentDebuggerServer; + } + // Only used for stop event + public handleStopEvent() { + if (this.previousDebuggerServerToDisconnect) { + this.previousDebuggerServerToDisconnect.disconnectFromPort(); + } + } } diff --git a/Source/service/deviceSelectionService.ts b/Source/service/deviceSelectionService.ts index 15f8bc2f2..39a8b5988 100644 --- a/Source/service/deviceSelectionService.ts +++ b/Source/service/deviceSelectionService.ts @@ -1,12 +1,12 @@ import { DEFAULT_DEVICE } from "../constants"; export class DeviceSelectionService { - private currentActiveDevice: string = DEFAULT_DEVICE; + private currentActiveDevice: string = DEFAULT_DEVICE; - public getCurrentActiveDevice(): string { - return this.currentActiveDevice; - } - public setCurrentActiveDevice(newActiveDevice: string) { - this.currentActiveDevice = newActiveDevice; - } + public getCurrentActiveDevice(): string { + return this.currentActiveDevice; + } + public setCurrentActiveDevice(newActiveDevice: string) { + this.currentActiveDevice = newActiveDevice; + } } diff --git a/Source/service/fileSelectionService.ts b/Source/service/fileSelectionService.ts index 5ee5e8ef9..d5b0eea11 100644 --- a/Source/service/fileSelectionService.ts +++ b/Source/service/fileSelectionService.ts @@ -5,91 +5,91 @@ import { DeviceSelectionService } from "./deviceSelectionService"; import { MessagingService } from "./messagingService"; export class FileSelectionService { - private currentFileAbsPath: string = ""; - private currentTextDocument: vscode.TextDocument; - private messagingService: MessagingService; + private currentFileAbsPath: string = ""; + private currentTextDocument: vscode.TextDocument; + private messagingService: MessagingService; - constructor(messagingService: MessagingService) { - this.messagingService = messagingService; - } + constructor(messagingService: MessagingService) { + this.messagingService = messagingService; + } - public getCurrentFileAbsPath() { - return this.currentFileAbsPath; - } - public getCurrentTextDocument() { - return this.currentTextDocument; - } - public updateCurrentFileFromTextFile = async ( - activeTextDocument: vscode.TextDocument | undefined - ) => { - if (activeTextDocument) { - await this.updateCurrentFileFromEditor({ - document: activeTextDocument, - } as vscode.TextEditor); - } else { - return; - } - }; - public updateCurrentFileFromEditor = async ( - activeTextDocument: vscode.TextEditor | undefined - ) => { - if ( - activeTextDocument && - activeTextDocument.document && - activeTextDocument.document.languageId === "python" - ) { - this.setPathAndSendMessage(activeTextDocument.document.fileName); - this.currentTextDocument = activeTextDocument.document; - } else if (this.currentFileAbsPath === "") { - this.setPathAndSendMessage(this.getActivePythonFile() || ""); - } - if ( - this.currentTextDocument && - this.getActiveEditorFromPath(this.currentTextDocument.fileName) === - undefined - ) { - await vscode.window.showTextDocument( - this.currentTextDocument, - vscode.ViewColumn.One - ); - } - }; - public findCurrentTextDocument() { - if (this.currentFileAbsPath) { - const foundDocument = this.getActiveEditorFromPath( - this.currentFileAbsPath - ); - if (foundDocument !== undefined) { - this.currentTextDocument = foundDocument; - } - } - } + public getCurrentFileAbsPath() { + return this.currentFileAbsPath; + } + public getCurrentTextDocument() { + return this.currentTextDocument; + } + public updateCurrentFileFromTextFile = async ( + activeTextDocument: vscode.TextDocument | undefined + ) => { + if (activeTextDocument) { + await this.updateCurrentFileFromEditor({ + document: activeTextDocument, + } as vscode.TextEditor); + } else { + return; + } + }; + public updateCurrentFileFromEditor = async ( + activeTextDocument: vscode.TextEditor | undefined + ) => { + if ( + activeTextDocument && + activeTextDocument.document && + activeTextDocument.document.languageId === "python" + ) { + this.setPathAndSendMessage(activeTextDocument.document.fileName); + this.currentTextDocument = activeTextDocument.document; + } else if (this.currentFileAbsPath === "") { + this.setPathAndSendMessage(this.getActivePythonFile() || ""); + } + if ( + this.currentTextDocument && + this.getActiveEditorFromPath(this.currentTextDocument.fileName) === + undefined + ) { + await vscode.window.showTextDocument( + this.currentTextDocument, + vscode.ViewColumn.One + ); + } + }; + public findCurrentTextDocument() { + if (this.currentFileAbsPath) { + const foundDocument = this.getActiveEditorFromPath( + this.currentFileAbsPath + ); + if (foundDocument !== undefined) { + this.currentTextDocument = foundDocument; + } + } + } - public setPathAndSendMessage = (newFilePath: string) => { - this.currentFileAbsPath = newFilePath; - this.messagingService.sendMessageToWebview( - VSCODE_MESSAGES_TO_WEBVIEW.CURRENT_FILE, - { - running_file: newFilePath, - } - ); - }; - private getActiveEditorFromPath = ( - filePath: string - ): vscode.TextDocument => { - const activeEditor = vscode.window.visibleTextEditors.find( - (editor: vscode.TextEditor) => editor.document.fileName === filePath - ); - return activeEditor ? activeEditor.document : undefined; - }; - private getActivePythonFile = () => { - const editors: vscode.TextEditor[] = vscode.window.visibleTextEditors; - const activeEditor = editors.find( - (editor) => editor.document.languageId === LANGUAGE_VARS.PYTHON.ID - ); - if (activeEditor) { - this.currentTextDocument = activeEditor.document; - } - return activeEditor ? activeEditor.document.fileName : ""; - }; + public setPathAndSendMessage = (newFilePath: string) => { + this.currentFileAbsPath = newFilePath; + this.messagingService.sendMessageToWebview( + VSCODE_MESSAGES_TO_WEBVIEW.CURRENT_FILE, + { + running_file: newFilePath, + } + ); + }; + private getActiveEditorFromPath = ( + filePath: string + ): vscode.TextDocument => { + const activeEditor = vscode.window.visibleTextEditors.find( + (editor: vscode.TextEditor) => editor.document.fileName === filePath + ); + return activeEditor ? activeEditor.document : undefined; + }; + private getActivePythonFile = () => { + const editors: vscode.TextEditor[] = vscode.window.visibleTextEditors; + const activeEditor = editors.find( + editor => editor.document.languageId === LANGUAGE_VARS.PYTHON.ID + ); + if (activeEditor) { + this.currentTextDocument = activeEditor.document; + } + return activeEditor ? activeEditor.document.fileName : ""; + }; } diff --git a/Source/service/messagingService.ts b/Source/service/messagingService.ts index a10caf3e8..c702ee268 100644 --- a/Source/service/messagingService.ts +++ b/Source/service/messagingService.ts @@ -4,35 +4,34 @@ import * as fs from "fs"; import { VSCODE_MESSAGES_TO_WEBVIEW } from "../view/constants"; import { DeviceSelectionService } from "./deviceSelectionService"; export class MessagingService { - private currentWebviewTarget: Webview | undefined; - private deviceSelectionService: DeviceSelectionService; + private currentWebviewTarget: Webview | undefined; + private deviceSelectionService: DeviceSelectionService; - constructor(deviceSelectionService: DeviceSelectionService) { - this.deviceSelectionService = deviceSelectionService; - } - public setWebview(webview: Webview) { - this.currentWebviewTarget = webview; - } + constructor(deviceSelectionService: DeviceSelectionService) { + this.deviceSelectionService = deviceSelectionService; + } + public setWebview(webview: Webview) { + this.currentWebviewTarget = webview; + } - // Send a message to webview if it exists - public sendMessageToWebview(command: string, stateToSend: Object) { - if (this.currentWebviewTarget) { - this.currentWebviewTarget.postMessage({ - command, - active_device: - this.deviceSelectionService.getCurrentActiveDevice(), - state: { ...stateToSend }, - }); - } - } - public sendStartMessage() { - this.currentWebviewTarget.postMessage({ - command: VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE, - }); - } - public sendPauseMessage() { - this.currentWebviewTarget.postMessage({ - command: VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE, - }); - } + // Send a message to webview if it exists + public sendMessageToWebview(command: string, stateToSend: Object) { + if (this.currentWebviewTarget) { + this.currentWebviewTarget.postMessage({ + command, + active_device: this.deviceSelectionService.getCurrentActiveDevice(), + state: { ...stateToSend }, + }); + } + } + public sendStartMessage() { + this.currentWebviewTarget.postMessage({ + command: VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE, + }); + } + public sendPauseMessage() { + this.currentWebviewTarget.postMessage({ + command: VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE, + }); + } } diff --git a/Source/service/setupService.ts b/Source/service/setupService.ts index 2b0a26760..f5c80e037 100644 --- a/Source/service/setupService.ts +++ b/Source/service/setupService.ts @@ -3,576 +3,574 @@ import * as os from "os"; import * as path from "path"; import * as vscode from "vscode"; import { - CONFIG, - CONSTANTS, - DialogResponses, - GLOBAL_ENV_VARS, - HELPER_FILES, - TelemetryEventName, - VERSIONS, + CONFIG, + CONSTANTS, + DialogResponses, + GLOBAL_ENV_VARS, + HELPER_FILES, + TelemetryEventName, + VERSIONS, } from "../constants"; import { - checkConfig, - createEscapedPath, - exec, - getConfig, - getPathToScript, - showPrivacyModal, + checkConfig, + createEscapedPath, + exec, + getConfig, + getPathToScript, + showPrivacyModal, } from "../extension_utils/utils"; import TelemetryAI from "../telemetry/telemetryAI"; export class SetupService { - private telemetryAI: TelemetryAI; - - constructor(telemetryAI: TelemetryAI) { - this.telemetryAI = telemetryAI; - } - - public setupEnv = async ( - context: vscode.ExtensionContext, - needsResponse: boolean = false - ) => { - const originalPythonExecutablePath = - await this.getCurrentPythonExecutablePath(); - if (originalPythonExecutablePath === "") { - return; - } - let pythonExecutablePath = originalPythonExecutablePath; - const pythonExecutableName: string = - os.platform() === "win32" - ? HELPER_FILES.PYTHON_EXE - : HELPER_FILES.PYTHON; - - if ( - !(await this.areDependenciesInstalled( - context, - pythonExecutablePath - )) - ) { - // environment needs to install dependencies - if (!(await this.checkIfVenv(context, pythonExecutablePath))) { - const pythonExecutablePathVenv = await this.getPythonVenv( - context, - pythonExecutableName - ); - if (await this.hasVenv(context)) { - // venv in extention exists with wrong dependencies - - if ( - !(await this.areDependenciesInstalled( - context, - pythonExecutablePathVenv - )) - ) { - pythonExecutablePath = - await this.installDependenciesWrapper( - context, - pythonExecutablePathVenv, - pythonExecutablePath - ); - } else { - pythonExecutablePath = pythonExecutablePathVenv; - } - } else { - pythonExecutablePath = await this.promptInstallVenv( - context, - originalPythonExecutablePath, - pythonExecutableName - ); - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INSTALL_VENV - ); - } - - if (pythonExecutablePath === pythonExecutablePathVenv) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.UPDATED_TO_EXTENSION_VENV - ); - vscode.workspace - .getConfiguration() - .update(CONFIG.PYTHON_PATH, pythonExecutablePath); - } - } else { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_HAS_VENV - ); - } - if (pythonExecutablePath === originalPythonExecutablePath) { - // going with original interpreter, either because - // already in venv or error in creating custom venv - if (checkConfig(CONFIG.SHOW_DEPENDENCY_INSTALL)) { - await vscode.window - .showInformationMessage( - CONSTANTS.INFO.INSTALL_PYTHON_DEPS, - DialogResponses.INSTALL_NOW, - DialogResponses.DONT_INSTALL - ) - .then( - async ( - installChoice: vscode.MessageItem | undefined - ) => { - if ( - installChoice === - DialogResponses.INSTALL_NOW - ) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL - ); - await this.installDependenciesWrapper( - context, - pythonExecutablePath - ); - } else { - await vscode.window - .showInformationMessage( - CONSTANTS.INFO.ARE_YOU_SURE, - DialogResponses.INSTALL_NOW, - DialogResponses.DONT_INSTALL - ) - .then( - async ( - installChoice2: - | vscode.MessageItem - | undefined - ) => { - if ( - installChoice2 === - DialogResponses.INSTALL_NOW - ) { - await this.installDependenciesWrapper( - context, - pythonExecutablePath - ); - } else { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_NO_DEPS_INSTALLED - ); - } - } - ); - } - } - ); - } - } - } else if (needsResponse) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.ALREADY_SUCCESSFUL_INSTALL - ); - } - - return pythonExecutablePath; - }; - - public getCurrentPythonExecutablePath = async ( - isTryingPython3: boolean = false - ) => { - let originalPythonExecutablePath = ""; - const systemPythonVar = isTryingPython3 - ? GLOBAL_ENV_VARS.PYTHON3 - : GLOBAL_ENV_VARS.PYTHON; - // try to get name from interpreter - try { - originalPythonExecutablePath = getConfig(CONFIG.PYTHON_PATH); - } catch (err) { - originalPythonExecutablePath = systemPythonVar; - } - - if ( - originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON3 || - originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON || - originalPythonExecutablePath === "" - ) { - // catching any instance where the python path needs to be resolved - // from an system variable - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_AUTO_RESOLVE_PYTHON_PATH - ); - try { - const { stdout } = await this.executePythonCommand( - systemPythonVar, - `-c "import sys; print(sys.executable)"` - ); - originalPythonExecutablePath = stdout.trim(); - } catch (err) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_NO_PYTHON_PATH - ); - if (isTryingPython3) { - // if trying python3 failed, that means that BOTH - // python and python3 failed as system variables - // so that means that there is no python - vscode.window - .showErrorMessage( - CONSTANTS.ERROR.NO_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.INSTALL_PYTHON) { - const okAction = () => { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON - ); - open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON - ); - } - }); - // no python installed, cannot get path - return ""; - } else { - // "python" didn't resolve to anything, trying "python3" - return this.getCurrentPythonExecutablePath(true); - } - } - if ( - !(await this.validatePythonVersion( - originalPythonExecutablePath - )) - ) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_VER - ); - if (isTryingPython3) { - // if we're trying python3, it means we already tried python and it - // all doesn't seem to work, but it got this far, so it means that - // their system python3 version is still not above 3.7, but they - // don't have a path selected. - vscode.window - .showInformationMessage( - CONSTANTS.ERROR.INVALID_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON - ) - .then( - (installChoice: vscode.MessageItem | undefined) => { - if ( - installChoice === - DialogResponses.INSTALL_PYTHON - ) { - const okAction = () => { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON - ); - open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO - .THIRD_PARTY_WEBSITE_PYTHON - ); - } - } - ); - return ""; - } else { - // otherwise, we ran the "python" system variable - // and we can try python3 - return this.getCurrentPythonExecutablePath(true); - } - } - } else { - // should only be applicable if the user defined their own path - - // fix path to be absolute - if (!path.isAbsolute(originalPythonExecutablePath)) { - originalPythonExecutablePath = path.join( - vscode.workspace.rootPath, - originalPythonExecutablePath - ); - } - - if (!fs.existsSync(originalPythonExecutablePath)) { - await vscode.window.showErrorMessage( - CONSTANTS.ERROR.BAD_PYTHON_PATH - ); - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_INTERPRETER_PATH - ); - return ""; - } - - if ( - !(await this.validatePythonVersion( - originalPythonExecutablePath - )) - ) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_VER - ); - vscode.window - .showInformationMessage( - CONSTANTS.ERROR.INVALID_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON - ) - .then((installChoice: vscode.MessageItem | undefined) => { - if (installChoice === DialogResponses.INSTALL_PYTHON) { - const okAction = () => { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON - ); - open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON - ); - } - }); - return ""; - } - } - - return originalPythonExecutablePath; - }; - - public isPipInstalled = async (pythonExecutablePath: string) => { - try { - await this.executePythonCommand(pythonExecutablePath, " -m pip"); - return true; - } catch (err) { - vscode.window - .showErrorMessage( - `We found that you may not have Pip installed on your interpreter at ${pythonExecutablePath}, please install it and try again.`, - DialogResponses.INSTALL_PIP - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.INSTALL_PIP) { - const okAction = () => { - open(CONSTANTS.LINKS.DOWNLOAD_PIP); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PIP - ); - } - }); - return false; - } - }; - - public checkIfVenv = async ( - context: vscode.ExtensionContext, - pythonExecutablePath: string - ) => { - const venvCheckerPath: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.CHECK_IF_VENV_PY - ); - const { stdout } = await this.executePythonCommand( - pythonExecutablePath, - `"${venvCheckerPath}"` - ); - return stdout.trim() === "1"; - }; - - public executePythonCommand = async ( - pythonExecutablePath: string, - command: string - ) => { - return exec(`${createEscapedPath(pythonExecutablePath)} ${command}`); - }; - - public validatePythonVersion = async (pythonExecutablePath: string) => { - const { stdout } = await this.executePythonCommand( - pythonExecutablePath, - "--version" - ); - if (stdout < VERSIONS.MIN_PY_VERSION) { - return false; - } else { - return true; - } - }; - - public hasVenv = async (context: vscode.ExtensionContext) => { - const pathToEnv: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR - ); - - return fs.existsSync(pathToEnv); - }; - - public promptInstallVenv = ( - context: vscode.ExtensionContext, - pythonExecutable: string, - pythonExecutableName: string - ) => { - return vscode.window - .showInformationMessage( - CONSTANTS.INFO.INSTALL_PYTHON_VENV, - DialogResponses.YES, - DialogResponses.NO - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.YES) { - return this.installPythonVenv( - context, - pythonExecutable, - pythonExecutableName - ); - } else { - // return pythonExecutable, notifying the caller - // that the user was unwilling to create venv - // and by default, this will trigger the extension to - // try using pythonExecutable - return pythonExecutable; - } - }); - }; - - public getPythonVenv = async ( - context: vscode.ExtensionContext, - pythonExecutableName: string - ) => { - const subFolder = os.platform() === "win32" ? "Scripts" : "bin"; - - return getPathToScript( - context, - path.join(CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR, subFolder), - pythonExecutableName - ); - }; - - public installPythonVenv = async ( - context: vscode.ExtensionContext, - pythonExecutable: string, - pythonExecutableName: string - ) => { - const pathToEnv: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR - ); - - vscode.window.showInformationMessage( - CONSTANTS.INFO.INSTALLING_PYTHON_VENV - ); - - const pythonPath: string = await this.getPythonVenv( - context, - pythonExecutableName - ); - - try { - // make venv - // run command to download dependencies to out/python_libs - await this.executePythonCommand( - pythonExecutable, - `-m venv "${pathToEnv}"` - ); - } catch (err) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_VENV_CREATION_ERR - ); - vscode.window - .showErrorMessage( - `Virtual environment for download could not be completed. Using original interpreter at: ${pythonExecutable}. If you're on Linux, try running "sudo apt-get install python3-venv".`, - DialogResponses.READ_INSTALL_MD - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.READ_INSTALL_MD) { - open(CONSTANTS.LINKS.INSTALL); - } - }); - - console.error(err); - - return pythonExecutable; - } - - return this.installDependenciesWrapper( - context, - pythonPath, - pythonExecutable - ); - }; - - public areDependenciesInstalled = async ( - context: vscode.ExtensionContext, - pythonPath: string - ) => { - const dependencyCheckerPath: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.CHECK_PYTHON_DEPENDENCIES - ); - try { - // python script will throw exception - // if not all dependencies are downloaded - const { stdout } = await this.executePythonCommand( - pythonPath, - `"${dependencyCheckerPath}"` - ); - - // output for debugging purposes - console.info(stdout); - return true; - } catch (err) { - return false; - } - }; - - public installDependencies = async ( - context: vscode.ExtensionContext, - pythonPath: string - ) => { - const requirementsPyInstallPath: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - "install_dependencies.py" - ); - - if (!this.isPipInstalled(pythonPath)) { - this.telemetryAI.trackFeatureUsage(TelemetryEventName.SETUP_NO_PIP); - return false; - } - - try { - const { stdout } = await this.executePythonCommand( - pythonPath, - `"${requirementsPyInstallPath}"` - ); - console.log(`DSE ${stdout}`); - vscode.window.showInformationMessage( - CONSTANTS.INFO.SUCCESSFUL_INSTALL - ); - return true; - } catch (err) { - console.log(`DSE ${err}`); - return false; - } - }; - - public installDependenciesWrapper = async ( - context: vscode.ExtensionContext, - pythonPath: string, - backupPythonPath: string = "" - ) => { - let errMessage = CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR; - if (backupPythonPath !== "") { - errMessage = `${errMessage} Using original interpreter at: ${backupPythonPath}.`; - } - if (!(await this.installDependencies(context, pythonPath))) { - vscode.window - .showErrorMessage( - CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR, - DialogResponses.READ_INSTALL_MD - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.READ_INSTALL_MD) { - open(CONSTANTS.LINKS.INSTALL); - } - }); - - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DEP_INSTALL_FAIL - ); - return backupPythonPath; - } - return pythonPath; - }; + private telemetryAI: TelemetryAI; + + constructor(telemetryAI: TelemetryAI) { + this.telemetryAI = telemetryAI; + } + + public setupEnv = async ( + context: vscode.ExtensionContext, + needsResponse: boolean = false + ) => { + const originalPythonExecutablePath = await this.getCurrentPythonExecutablePath(); + if (originalPythonExecutablePath === "") { + return; + } + let pythonExecutablePath = originalPythonExecutablePath; + const pythonExecutableName: string = + os.platform() === "win32" + ? HELPER_FILES.PYTHON_EXE + : HELPER_FILES.PYTHON; + + if ( + !(await this.areDependenciesInstalled( + context, + pythonExecutablePath + )) + ) { + // environment needs to install dependencies + if (!(await this.checkIfVenv(context, pythonExecutablePath))) { + const pythonExecutablePathVenv = await this.getPythonVenv( + context, + pythonExecutableName + ); + if (await this.hasVenv(context)) { + // venv in extention exists with wrong dependencies + + if ( + !(await this.areDependenciesInstalled( + context, + pythonExecutablePathVenv + )) + ) { + pythonExecutablePath = await this.installDependenciesWrapper( + context, + pythonExecutablePathVenv, + pythonExecutablePath + ); + } else { + pythonExecutablePath = pythonExecutablePathVenv; + } + } else { + pythonExecutablePath = await this.promptInstallVenv( + context, + originalPythonExecutablePath, + pythonExecutableName + ); + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INSTALL_VENV + ); + } + + if (pythonExecutablePath === pythonExecutablePathVenv) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.UPDATED_TO_EXTENSION_VENV + ); + vscode.workspace + .getConfiguration() + .update(CONFIG.PYTHON_PATH, pythonExecutablePath); + } + } else { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_HAS_VENV + ); + } + if (pythonExecutablePath === originalPythonExecutablePath) { + // going with original interpreter, either because + // already in venv or error in creating custom venv + if (checkConfig(CONFIG.SHOW_DEPENDENCY_INSTALL)) { + await vscode.window + .showInformationMessage( + CONSTANTS.INFO.INSTALL_PYTHON_DEPS, + DialogResponses.INSTALL_NOW, + DialogResponses.DONT_INSTALL + ) + .then( + async ( + installChoice: vscode.MessageItem | undefined + ) => { + if ( + installChoice === + DialogResponses.INSTALL_NOW + ) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL + ); + await this.installDependenciesWrapper( + context, + pythonExecutablePath + ); + } else { + await vscode.window + .showInformationMessage( + CONSTANTS.INFO.ARE_YOU_SURE, + DialogResponses.INSTALL_NOW, + DialogResponses.DONT_INSTALL + ) + .then( + async ( + installChoice2: + | vscode.MessageItem + | undefined + ) => { + if ( + installChoice2 === + DialogResponses.INSTALL_NOW + ) { + await this.installDependenciesWrapper( + context, + pythonExecutablePath + ); + } else { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_NO_DEPS_INSTALLED + ); + } + } + ); + } + } + ); + } + } + } else if (needsResponse) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.ALREADY_SUCCESSFUL_INSTALL + ); + } + + return pythonExecutablePath; + }; + + public getCurrentPythonExecutablePath = async ( + isTryingPython3: boolean = false + ) => { + let originalPythonExecutablePath = ""; + const systemPythonVar = isTryingPython3 + ? GLOBAL_ENV_VARS.PYTHON3 + : GLOBAL_ENV_VARS.PYTHON; + // try to get name from interpreter + try { + originalPythonExecutablePath = getConfig(CONFIG.PYTHON_PATH); + } catch (err) { + originalPythonExecutablePath = systemPythonVar; + } + + if ( + originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON3 || + originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON || + originalPythonExecutablePath === "" + ) { + // catching any instance where the python path needs to be resolved + // from an system variable + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_AUTO_RESOLVE_PYTHON_PATH + ); + try { + const { stdout } = await this.executePythonCommand( + systemPythonVar, + `-c "import sys; print(sys.executable)"` + ); + originalPythonExecutablePath = stdout.trim(); + } catch (err) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_NO_PYTHON_PATH + ); + if (isTryingPython3) { + // if trying python3 failed, that means that BOTH + // python and python3 failed as system variables + // so that means that there is no python + vscode.window + .showErrorMessage( + CONSTANTS.ERROR.NO_PYTHON_PATH, + DialogResponses.INSTALL_PYTHON + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.INSTALL_PYTHON) { + const okAction = () => { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DOWNLOAD_PYTHON + ); + open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON + ); + } + }); + // no python installed, cannot get path + return ""; + } else { + // "python" didn't resolve to anything, trying "python3" + return this.getCurrentPythonExecutablePath(true); + } + } + if ( + !(await this.validatePythonVersion( + originalPythonExecutablePath + )) + ) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INVALID_PYTHON_VER + ); + if (isTryingPython3) { + // if we're trying python3, it means we already tried python and it + // all doesn't seem to work, but it got this far, so it means that + // their system python3 version is still not above 3.7, but they + // don't have a path selected. + vscode.window + .showInformationMessage( + CONSTANTS.ERROR.INVALID_PYTHON_PATH, + DialogResponses.INSTALL_PYTHON + ) + .then( + (installChoice: vscode.MessageItem | undefined) => { + if ( + installChoice === + DialogResponses.INSTALL_PYTHON + ) { + const okAction = () => { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DOWNLOAD_PYTHON + ); + open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO + .THIRD_PARTY_WEBSITE_PYTHON + ); + } + } + ); + return ""; + } else { + // otherwise, we ran the "python" system variable + // and we can try python3 + return this.getCurrentPythonExecutablePath(true); + } + } + } else { + // should only be applicable if the user defined their own path + + // fix path to be absolute + if (!path.isAbsolute(originalPythonExecutablePath)) { + originalPythonExecutablePath = path.join( + vscode.workspace.rootPath, + originalPythonExecutablePath + ); + } + + if (!fs.existsSync(originalPythonExecutablePath)) { + await vscode.window.showErrorMessage( + CONSTANTS.ERROR.BAD_PYTHON_PATH + ); + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INVALID_PYTHON_INTERPRETER_PATH + ); + return ""; + } + + if ( + !(await this.validatePythonVersion( + originalPythonExecutablePath + )) + ) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INVALID_PYTHON_VER + ); + vscode.window + .showInformationMessage( + CONSTANTS.ERROR.INVALID_PYTHON_PATH, + DialogResponses.INSTALL_PYTHON + ) + .then((installChoice: vscode.MessageItem | undefined) => { + if (installChoice === DialogResponses.INSTALL_PYTHON) { + const okAction = () => { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DOWNLOAD_PYTHON + ); + open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON + ); + } + }); + return ""; + } + } + + return originalPythonExecutablePath; + }; + + public isPipInstalled = async (pythonExecutablePath: string) => { + try { + await this.executePythonCommand(pythonExecutablePath, " -m pip"); + return true; + } catch (err) { + vscode.window + .showErrorMessage( + `We found that you may not have Pip installed on your interpreter at ${pythonExecutablePath}, please install it and try again.`, + DialogResponses.INSTALL_PIP + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.INSTALL_PIP) { + const okAction = () => { + open(CONSTANTS.LINKS.DOWNLOAD_PIP); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PIP + ); + } + }); + return false; + } + }; + + public checkIfVenv = async ( + context: vscode.ExtensionContext, + pythonExecutablePath: string + ) => { + const venvCheckerPath: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.CHECK_IF_VENV_PY + ); + const { stdout } = await this.executePythonCommand( + pythonExecutablePath, + `"${venvCheckerPath}"` + ); + return stdout.trim() === "1"; + }; + + public executePythonCommand = async ( + pythonExecutablePath: string, + command: string + ) => { + return exec(`${createEscapedPath(pythonExecutablePath)} ${command}`); + }; + + public validatePythonVersion = async (pythonExecutablePath: string) => { + const { stdout } = await this.executePythonCommand( + pythonExecutablePath, + "--version" + ); + if (stdout < VERSIONS.MIN_PY_VERSION) { + return false; + } else { + return true; + } + }; + + public hasVenv = async (context: vscode.ExtensionContext) => { + const pathToEnv: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR + ); + + return fs.existsSync(pathToEnv); + }; + + public promptInstallVenv = ( + context: vscode.ExtensionContext, + pythonExecutable: string, + pythonExecutableName: string + ) => { + return vscode.window + .showInformationMessage( + CONSTANTS.INFO.INSTALL_PYTHON_VENV, + DialogResponses.YES, + DialogResponses.NO + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.YES) { + return this.installPythonVenv( + context, + pythonExecutable, + pythonExecutableName + ); + } else { + // return pythonExecutable, notifying the caller + // that the user was unwilling to create venv + // and by default, this will trigger the extension to + // try using pythonExecutable + return pythonExecutable; + } + }); + }; + + public getPythonVenv = async ( + context: vscode.ExtensionContext, + pythonExecutableName: string + ) => { + const subFolder = os.platform() === "win32" ? "Scripts" : "bin"; + + return getPathToScript( + context, + path.join(CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR, subFolder), + pythonExecutableName + ); + }; + + public installPythonVenv = async ( + context: vscode.ExtensionContext, + pythonExecutable: string, + pythonExecutableName: string + ) => { + const pathToEnv: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR + ); + + vscode.window.showInformationMessage( + CONSTANTS.INFO.INSTALLING_PYTHON_VENV + ); + + const pythonPath: string = await this.getPythonVenv( + context, + pythonExecutableName + ); + + try { + // make venv + // run command to download dependencies to out/python_libs + await this.executePythonCommand( + pythonExecutable, + `-m venv "${pathToEnv}"` + ); + } catch (err) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_VENV_CREATION_ERR + ); + vscode.window + .showErrorMessage( + `Virtual environment for download could not be completed. Using original interpreter at: ${pythonExecutable}. If you're on Linux, try running "sudo apt-get install python3-venv".`, + DialogResponses.READ_INSTALL_MD + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.READ_INSTALL_MD) { + open(CONSTANTS.LINKS.INSTALL); + } + }); + + console.error(err); + + return pythonExecutable; + } + + return this.installDependenciesWrapper( + context, + pythonPath, + pythonExecutable + ); + }; + + public areDependenciesInstalled = async ( + context: vscode.ExtensionContext, + pythonPath: string + ) => { + const dependencyCheckerPath: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.CHECK_PYTHON_DEPENDENCIES + ); + try { + // python script will throw exception + // if not all dependencies are downloaded + const { stdout } = await this.executePythonCommand( + pythonPath, + `"${dependencyCheckerPath}"` + ); + + // output for debugging purposes + console.info(stdout); + return true; + } catch (err) { + return false; + } + }; + + public installDependencies = async ( + context: vscode.ExtensionContext, + pythonPath: string + ) => { + const requirementsPyInstallPath: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + "install_dependencies.py" + ); + + if (!this.isPipInstalled(pythonPath)) { + this.telemetryAI.trackFeatureUsage(TelemetryEventName.SETUP_NO_PIP); + return false; + } + + try { + const { stdout } = await this.executePythonCommand( + pythonPath, + `"${requirementsPyInstallPath}"` + ); + console.log(`DSE ${stdout}`); + vscode.window.showInformationMessage( + CONSTANTS.INFO.SUCCESSFUL_INSTALL + ); + return true; + } catch (err) { + console.log(`DSE ${err}`); + return false; + } + }; + + public installDependenciesWrapper = async ( + context: vscode.ExtensionContext, + pythonPath: string, + backupPythonPath: string = "" + ) => { + let errMessage = CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR; + if (backupPythonPath !== "") { + errMessage = `${errMessage} Using original interpreter at: ${backupPythonPath}.`; + } + if (!(await this.installDependencies(context, pythonPath))) { + vscode.window + .showErrorMessage( + CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR, + DialogResponses.READ_INSTALL_MD + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.READ_INSTALL_MD) { + open(CONSTANTS.LINKS.INSTALL); + } + }); + + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DEP_INSTALL_FAIL + ); + return backupPythonPath; + } + return pythonPath; + }; } diff --git a/Source/service/telemetryHandlerService.ts b/Source/service/telemetryHandlerService.ts index e76bea74c..f16141f65 100644 --- a/Source/service/telemetryHandlerService.ts +++ b/Source/service/telemetryHandlerService.ts @@ -6,551 +6,551 @@ import TelemetryAI from "../telemetry/telemetryAI"; import { DeviceSelectionService } from "./deviceSelectionService"; export class TelemetryHandlerService { - private telemetryAI: TelemetryAI; - private deviceSelectionService: DeviceSelectionService; + private telemetryAI: TelemetryAI; + private deviceSelectionService: DeviceSelectionService; - constructor( - telemetryAI: TelemetryAI, - deviceSelectionService: DeviceSelectionService - ) { - this.telemetryAI = telemetryAI; - this.deviceSelectionService = deviceSelectionService; - } + constructor( + telemetryAI: TelemetryAI, + deviceSelectionService: DeviceSelectionService + ) { + this.telemetryAI = telemetryAI; + this.deviceSelectionService = deviceSelectionService; + } - public handleDebuggerTelemetry = () => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_DEBUGGER_INIT_SUCCESS - ); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_DEBUGGER_INIT_SUCCESS - ); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_DEBUGGER_INIT_SUCCESS - ); - break; - default: - break; - } - }; + public handleDebuggerTelemetry = () => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_DEBUGGER_INIT_SUCCESS + ); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_DEBUGGER_INIT_SUCCESS + ); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_DEBUGGER_INIT_SUCCESS + ); + break; + default: + break; + } + }; - public handleDebuggerFailTelemetry = () => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_DEBUGGER_INIT_FAIL - ); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_DEBUGGER_INIT_FAIL - ); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_DEBUGGER_INIT_FAIL - ); - break; - default: - break; - } - }; + public handleDebuggerFailTelemetry = () => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_DEBUGGER_INIT_FAIL + ); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_DEBUGGER_INIT_FAIL + ); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_DEBUGGER_INIT_FAIL + ); + break; + default: + break; + } + }; - public handleButtonPressTelemetry = (buttonState: any) => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.handleCPXButtonPressTelemetry(buttonState); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.handleMicrobitButtonPressTelemetry(buttonState); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.handleClueButtonPressTelemetry(buttonState); - break; - default: - break; - } - }; + public handleButtonPressTelemetry = (buttonState: any) => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.handleCPXButtonPressTelemetry(buttonState); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.handleMicrobitButtonPressTelemetry(buttonState); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.handleClueButtonPressTelemetry(buttonState); + break; + default: + break; + } + }; - public handleGestureTelemetry = (sensorState: any) => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.handleCPXGestureTelemetry(sensorState); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - break; - default: - break; - } - }; + public handleGestureTelemetry = (sensorState: any) => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.handleCPXGestureTelemetry(sensorState); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + break; + default: + break; + } + }; - public handleSensorTelemetry = (sensor: string) => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.handleCPXSensorTelemetry(sensor); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.handleMicrobitSensorTelemetry(sensor); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.handleClueSensorTelemetry(sensor); - break; - default: - break; - } - }; + public handleSensorTelemetry = (sensor: string) => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.handleCPXSensorTelemetry(sensor); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.handleMicrobitSensorTelemetry(sensor); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.handleClueSensorTelemetry(sensor); + break; + default: + break; + } + }; - public handleCPXButtonPressTelemetry = (buttonState: any) => { - if (buttonState.button_a && buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_BUTTON_AB - ); - } else if (buttonState.button_a) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_BUTTON_A - ); - } else if (buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_BUTTON_B - ); - } else if (buttonState.switch) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_SWITCH - ); - } - }; + public handleCPXButtonPressTelemetry = (buttonState: any) => { + if (buttonState.button_a && buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_BUTTON_AB + ); + } else if (buttonState.button_a) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_BUTTON_A + ); + } else if (buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_BUTTON_B + ); + } else if (buttonState.switch) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_SWITCH + ); + } + }; - public handleCPXGestureTelemetry = (sensorState: any) => { - if (sensorState.shake) { - this.handleCPXSensorTelemetry("shake"); - } else if (sensorState.touch) { - this.handleCPXSensorTelemetry("touch"); - } - }; + public handleCPXGestureTelemetry = (sensorState: any) => { + if (sensorState.shake) { + this.handleCPXSensorTelemetry("shake"); + } else if (sensorState.touch) { + this.handleCPXSensorTelemetry("touch"); + } + }; - public handleCPXSensorTelemetry = (sensor: string) => { - switch (sensor) { - case "temperature": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_TEMPERATURE_SENSOR - ); - break; - case "light": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_LIGHT_SENSOR - ); - break; - case "motion_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR - ); - break; - case "shake": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_SHAKE - ); - break; - case "touch": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_CAPACITIVE_TOUCH - ); - break; - } - }; + public handleCPXSensorTelemetry = (sensor: string) => { + switch (sensor) { + case "temperature": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_TEMPERATURE_SENSOR + ); + break; + case "light": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_LIGHT_SENSOR + ); + break; + case "motion_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR + ); + break; + case "shake": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_SHAKE + ); + break; + case "touch": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_CAPACITIVE_TOUCH + ); + break; + } + }; - public handleMicrobitButtonPressTelemetry = (buttonState: any) => { - if (buttonState.button_a && buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_AB - ); - } else if (buttonState.button_a) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_A - ); - } else if (buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_B - ); - } - }; + public handleMicrobitButtonPressTelemetry = (buttonState: any) => { + if (buttonState.button_a && buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_AB + ); + } else if (buttonState.button_a) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_A + ); + } else if (buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_B + ); + } + }; - public handleMicrobitSensorTelemetry = (sensor: string) => { - switch (sensor) { - case "temperature": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_TEMPERATURE_SENSOR - ); - break; - case "light": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_LIGHT_SENSOR - ); - break; - case "motion_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR - ); - break; - case "gesture": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_GESTURE_SENSOR - ); - break; - } - }; + public handleMicrobitSensorTelemetry = (sensor: string) => { + switch (sensor) { + case "temperature": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_TEMPERATURE_SENSOR + ); + break; + case "light": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_LIGHT_SENSOR + ); + break; + case "motion_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR + ); + break; + case "gesture": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_GESTURE_SENSOR + ); + break; + } + }; - public handleClueButtonPressTelemetry = (buttonState: any) => { - if (buttonState.button_a && buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_BUTTON_AB - ); - } else if (buttonState.button_a) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_BUTTON_A - ); - } else if (buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_BUTTON_B - ); - } - }; + public handleClueButtonPressTelemetry = (buttonState: any) => { + if (buttonState.button_a && buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_BUTTON_AB + ); + } else if (buttonState.button_a) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_BUTTON_A + ); + } else if (buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_BUTTON_B + ); + } + }; - public handleClueSensorTelemetry = (sensor: string) => { - switch (sensor) { - case "temperature": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_TEMPERATURE_SENSOR - ); - break; - case "light_r": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "light_g": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "light_b": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "light_c": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "motion_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR - ); - break; - case "gesture": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GESTURE_SENSOR - ); - break; - case "humidity": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_HUMIDITY_SENSOR - ); - break; - case "pressure": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_PRESSURE_SENSOR - ); - break; - case "proximity": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_PROXIMITY_SENSOR - ); - break; - case "gyro_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR - ); - break; - case "gyro_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR - ); - break; - case "gyro_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR - ); - break; - case "magnet_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR - ); - break; - case "magnet_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR - ); - break; - case "magnet_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR - ); - break; - } - }; + public handleClueSensorTelemetry = (sensor: string) => { + switch (sensor) { + case "temperature": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_TEMPERATURE_SENSOR + ); + break; + case "light_r": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR + ); + break; + case "light_g": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR + ); + break; + case "light_b": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR + ); + break; + case "light_c": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR + ); + break; + case "motion_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR + ); + break; + case "gesture": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GESTURE_SENSOR + ); + break; + case "humidity": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_HUMIDITY_SENSOR + ); + break; + case "pressure": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_PRESSURE_SENSOR + ); + break; + case "proximity": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_PROXIMITY_SENSOR + ); + break; + case "gyro_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR + ); + break; + case "gyro_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR + ); + break; + case "gyro_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR + ); + break; + case "magnet_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR + ); + break; + case "magnet_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR + ); + break; + case "magnet_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR + ); + break; + } + }; - public handleNewFileErrorTelemetry = () => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_ERROR_COMMAND_NEW_FILE - ); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_ERROR_COMMAND_NEW_FILE - ); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_ERROR_COMMAND_NEW_FILE - ); - break; - default: - break; - } - }; + public handleNewFileErrorTelemetry = () => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_ERROR_COMMAND_NEW_FILE + ); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_ERROR_COMMAND_NEW_FILE + ); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_ERROR_COMMAND_NEW_FILE + ); + break; + default: + break; + } + }; - public getTelemetryEventsForStartingDeployToDevice = (device: string) => { - let deployTelemetryEvent: string; - let deployPerformanceTelemetryEvent: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - deployTelemetryEvent = - TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; - deployPerformanceTelemetryEvent = - TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - deployTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; - deployPerformanceTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - deployTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; - deployPerformanceTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; - break; - } - return { - deployTelemetryEvent, - deployPerformanceTelemetryEvent, - }; - }; + public getTelemetryEventsForStartingDeployToDevice = (device: string) => { + let deployTelemetryEvent: string; + let deployPerformanceTelemetryEvent: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + deployTelemetryEvent = + TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; + deployPerformanceTelemetryEvent = + TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + deployTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; + deployPerformanceTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + deployTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; + deployPerformanceTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; + break; + } + return { + deployTelemetryEvent, + deployPerformanceTelemetryEvent, + }; + }; - public handleDeployToDeviceErrorTelemetry = ( - data: string, - device: string - ) => { - let telemetryErrorName: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - telemetryErrorName = - TelemetryEventName.CPX_ERROR_PYTHON_DEVICE_PROCESS; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - telemetryErrorName = - TelemetryEventName.MICROBIT_ERROR_PYTHON_DEVICE_PROCESS; - case CONSTANTS.DEVICE_NAME.CLUE: - telemetryErrorName = - TelemetryEventName.CLUE_ERROR_PYTHON_DEVICE_PROCESS; - } - this.telemetryAI.trackFeatureUsage(telemetryErrorName, { - error: `${data}`, - }); - }; + public handleDeployToDeviceErrorTelemetry = ( + data: string, + device: string + ) => { + let telemetryErrorName: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + telemetryErrorName = + TelemetryEventName.CPX_ERROR_PYTHON_DEVICE_PROCESS; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + telemetryErrorName = + TelemetryEventName.MICROBIT_ERROR_PYTHON_DEVICE_PROCESS; + case CONSTANTS.DEVICE_NAME.CLUE: + telemetryErrorName = + TelemetryEventName.CLUE_ERROR_PYTHON_DEVICE_PROCESS; + } + this.telemetryAI.trackFeatureUsage(telemetryErrorName, { + error: `${data}`, + }); + }; - public handleDeployToDeviceFinishedTelemetry = ( - message: any, - device: string - ) => { - let successCommandDeployDevice: string; - let errorCommandDeployWithoutDevice: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - successCommandDeployDevice = - TelemetryEventName.CPX_SUCCESS_COMMAND_DEPLOY_DEVICE; - errorCommandDeployWithoutDevice = - TelemetryEventName.CPX_ERROR_DEPLOY_WITHOUT_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - successCommandDeployDevice = - TelemetryEventName.MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE; - errorCommandDeployWithoutDevice = - TelemetryEventName.MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - successCommandDeployDevice = - TelemetryEventName.CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE; - errorCommandDeployWithoutDevice = - TelemetryEventName.CLUE_ERROR_DEPLOY_WITHOUT_DEVICE; - break; - } + public handleDeployToDeviceFinishedTelemetry = ( + message: any, + device: string + ) => { + let successCommandDeployDevice: string; + let errorCommandDeployWithoutDevice: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + successCommandDeployDevice = + TelemetryEventName.CPX_SUCCESS_COMMAND_DEPLOY_DEVICE; + errorCommandDeployWithoutDevice = + TelemetryEventName.CPX_ERROR_DEPLOY_WITHOUT_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + successCommandDeployDevice = + TelemetryEventName.MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE; + errorCommandDeployWithoutDevice = + TelemetryEventName.MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + successCommandDeployDevice = + TelemetryEventName.CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE; + errorCommandDeployWithoutDevice = + TelemetryEventName.CLUE_ERROR_DEPLOY_WITHOUT_DEVICE; + break; + } - switch (message.type) { - case "complete": - this.telemetryAI.trackFeatureUsage(successCommandDeployDevice); - break; - case "no-device": - this.telemetryAI.trackFeatureUsage( - errorCommandDeployWithoutDevice - ); - if ( - device === CONSTANTS.DEVICE_NAME.CPX || - device === CONSTANTS.DEVICE_NAME.CLUE - ) { - vscode.window - .showErrorMessage( - CONSTANTS.ERROR.NO_DEVICE, - DialogResponses.HELP - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.HELP) { - const okAction = () => { - let helpLink: string; - let helpTelemetryEvent: string; - if (device === CONSTANTS.DEVICE_NAME.CPX) { - helpLink = CONSTANTS.LINKS.CPX_HELP; - helpTelemetryEvent = - TelemetryEventName.CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; - } else if ( - device === CONSTANTS.DEVICE_NAME.CLUE - ) { - helpLink = CONSTANTS.LINKS.CLUE_HELP; - helpTelemetryEvent = - TelemetryEventName.CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; - } - open(helpLink); - this.telemetryAI.trackFeatureUsage( - helpTelemetryEvent - ); - }; - utils.showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT - ); - } - }); - } else if (device === CONSTANTS.DEVICE_NAME.MICROBIT) { - vscode.window.showErrorMessage(CONSTANTS.ERROR.NO_DEVICE); - } - break; - case "low-python-version": - vscode.window.showErrorMessage( - CONSTANTS.ERROR.LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT - ); - break; - default: - console.log( - `Non-state JSON output from the process : ${message}` - ); - break; - } - }; + switch (message.type) { + case "complete": + this.telemetryAI.trackFeatureUsage(successCommandDeployDevice); + break; + case "no-device": + this.telemetryAI.trackFeatureUsage( + errorCommandDeployWithoutDevice + ); + if ( + device === CONSTANTS.DEVICE_NAME.CPX || + device === CONSTANTS.DEVICE_NAME.CLUE + ) { + vscode.window + .showErrorMessage( + CONSTANTS.ERROR.NO_DEVICE, + DialogResponses.HELP + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.HELP) { + const okAction = () => { + let helpLink: string; + let helpTelemetryEvent: string; + if (device === CONSTANTS.DEVICE_NAME.CPX) { + helpLink = CONSTANTS.LINKS.CPX_HELP; + helpTelemetryEvent = + TelemetryEventName.CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; + } else if ( + device === CONSTANTS.DEVICE_NAME.CLUE + ) { + helpLink = CONSTANTS.LINKS.CLUE_HELP; + helpTelemetryEvent = + TelemetryEventName.CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; + } + open(helpLink); + this.telemetryAI.trackFeatureUsage( + helpTelemetryEvent + ); + }; + utils.showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT + ); + } + }); + } else if (device === CONSTANTS.DEVICE_NAME.MICROBIT) { + vscode.window.showErrorMessage(CONSTANTS.ERROR.NO_DEVICE); + } + break; + case "low-python-version": + vscode.window.showErrorMessage( + CONSTANTS.ERROR.LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT + ); + break; + default: + console.log( + `Non-state JSON output from the process : ${message}` + ); + break; + } + }; - public getTelemetryEventsForOpenSimulator = (device: string) => { - let openSimulatorTelemetryEvent: string; - let openSimulatorPerformanceTelemetryEvent: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - openSimulatorTelemetryEvent = - TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; - openSimulatorPerformanceTelemetryEvent = - TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - openSimulatorTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; - openSimulatorPerformanceTelemetryEvent = - TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - openSimulatorTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; - openSimulatorPerformanceTelemetryEvent = - TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; - break; - } - return { - openSimulatorTelemetryEvent, - openSimulatorPerformanceTelemetryEvent, - }; - }; + public getTelemetryEventsForOpenSimulator = (device: string) => { + let openSimulatorTelemetryEvent: string; + let openSimulatorPerformanceTelemetryEvent: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + openSimulatorTelemetryEvent = + TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; + openSimulatorPerformanceTelemetryEvent = + TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + openSimulatorTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; + openSimulatorPerformanceTelemetryEvent = + TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + openSimulatorTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; + openSimulatorPerformanceTelemetryEvent = + TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; + break; + } + return { + openSimulatorTelemetryEvent, + openSimulatorPerformanceTelemetryEvent, + }; + }; - public getTelemetryEventsForNewFile = (device: string) => { - let newFileTelemetryEvent: string; - let newFilePerformanceTelemetryEvent: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - newFileTelemetryEvent = - TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; - newFilePerformanceTelemetryEvent = - TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - newFileTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; - newFilePerformanceTelemetryEvent = - TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - newFileTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; - newFilePerformanceTelemetryEvent = - TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; - break; - } - return { - newFileTelemetryEvent, - newFilePerformanceTelemetryEvent, - }; - }; + public getTelemetryEventsForNewFile = (device: string) => { + let newFileTelemetryEvent: string; + let newFilePerformanceTelemetryEvent: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + newFileTelemetryEvent = + TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; + newFilePerformanceTelemetryEvent = + TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + newFileTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; + newFilePerformanceTelemetryEvent = + TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + newFileTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; + newFilePerformanceTelemetryEvent = + TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; + break; + } + return { + newFileTelemetryEvent, + newFilePerformanceTelemetryEvent, + }; + }; } diff --git a/Source/service/webviewService.ts b/Source/service/webviewService.ts index 01584259b..2b6add591 100644 --- a/Source/service/webviewService.ts +++ b/Source/service/webviewService.ts @@ -6,46 +6,47 @@ import { DeviceSelectionService } from "./deviceSelectionService"; // Manages different type of webview export class WebviewService { - private tutorialPanel: vscode.WebviewPanel | undefined; - private context: vscode.ExtensionContext; - private deviceSelectionService: DeviceSelectionService; + private tutorialPanel: vscode.WebviewPanel | undefined; + private context: vscode.ExtensionContext; + private deviceSelectionService: DeviceSelectionService; - constructor( - context: vscode.ExtensionContext, - deviceSelectionService: DeviceSelectionService - ) { - this.context = context; - this.deviceSelectionService = deviceSelectionService; - } + constructor( + context: vscode.ExtensionContext, + deviceSelectionService: DeviceSelectionService + ) { + this.context = context; + this.deviceSelectionService = deviceSelectionService; + } - public openTutorialPanel() { - if (this.tutorialPanel) { - this.tutorialPanel.reveal(vscode.ViewColumn.Beside); - } else { - this.createTutorialPanel(); - } - } + public openTutorialPanel() { + if (this.tutorialPanel) { + this.tutorialPanel.reveal(vscode.ViewColumn.Beside); + } else { + this.createTutorialPanel(); + } + } - public getWebviewContent( - webviewType: string, - hasDevice: boolean, - panel: vscode.WebviewPanel - ) { - const onDiskPath = vscode.Uri.file( - this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.SIMULATOR) - ); - const scriptSrc = panel.webview.asWebviewUri(onDiskPath); + public getWebviewContent( + webviewType: string, + hasDevice: boolean, + panel: vscode.WebviewPanel + ) { + const onDiskPath = vscode.Uri.file( + this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.SIMULATOR) + ); + const scriptSrc = panel.webview.asWebviewUri(onDiskPath); - const vscodeImportPath = vscode.Uri.file( - this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.VSCODE_API) - ); - const vscodeImportPathSrc = - panel.webview.asWebviewUri(vscodeImportPath); + const vscodeImportPath = vscode.Uri.file( + this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.VSCODE_API) + ); + const vscodeImportPathSrc = panel.webview.asWebviewUri( + vscodeImportPath + ); - const attributeString = this.getAttributeString(webviewType, hasDevice); - const nonce = getNonce(); + const attributeString = this.getAttributeString(webviewType, hasDevice); + const nonce = getNonce(); - return ` + return ` @@ -63,49 +64,49 @@ export class WebviewService { < /html>`; - } + } - private createTutorialPanel() { - this.tutorialPanel = vscode.window.createWebviewPanel( - CONSTANTS.WEBVIEW_TYPE.TUTORIAL, - CONSTANTS.LABEL.WEBVIEW_PANEL, - { preserveFocus: true, viewColumn: vscode.ViewColumn.One }, - { - enableScripts: true, - retainContextWhenHidden: true, - } - ); - this.tutorialPanel.webview.html = this.getWebviewContent( - WEBVIEW_TYPES.GETTING_STARTED, - false, - this.tutorialPanel - ); - this.tutorialPanel.onDidDispose(() => { - this.disposeTutorialPanel(); - }); - } + private createTutorialPanel() { + this.tutorialPanel = vscode.window.createWebviewPanel( + CONSTANTS.WEBVIEW_TYPE.TUTORIAL, + CONSTANTS.LABEL.WEBVIEW_PANEL, + { preserveFocus: true, viewColumn: vscode.ViewColumn.One }, + { + enableScripts: true, + retainContextWhenHidden: true, + } + ); + this.tutorialPanel.webview.html = this.getWebviewContent( + WEBVIEW_TYPES.GETTING_STARTED, + false, + this.tutorialPanel + ); + this.tutorialPanel.onDidDispose(() => { + this.disposeTutorialPanel(); + }); + } - private disposeTutorialPanel() { - this.tutorialPanel = undefined; - } - private getAttributeString(webviewType: string, hasDevice: boolean) { - if (hasDevice) { - return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} ${ - WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE - }=${this.deviceSelectionService.getCurrentActiveDevice()} `; - } else { - return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} `; - } - } + private disposeTutorialPanel() { + this.tutorialPanel = undefined; + } + private getAttributeString(webviewType: string, hasDevice: boolean) { + if (hasDevice) { + return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} ${ + WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE + }=${this.deviceSelectionService.getCurrentActiveDevice()} `; + } else { + return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} `; + } + } } // Nonce generator taken from vscode extension samples found here: // https://github.com/microsoft/vscode-extension-samples/blob/master/custom-editor-sample/src/util.ts function getNonce() { - let text = ""; - const possible = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - for (let i = 0; i < 32; i++) { - text += possible.charAt(Math.floor(Math.random() * possible.length)); - } - return text; + let text = ""; + const possible = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + for (let i = 0; i < 32; i++) { + text += possible.charAt(Math.floor(Math.random() * possible.length)); + } + return text; } diff --git a/Source/simulatorDebugConfigurationProvider.ts b/Source/simulatorDebugConfigurationProvider.ts index 40d153f6a..2b6725f22 100644 --- a/Source/simulatorDebugConfigurationProvider.ts +++ b/Source/simulatorDebugConfigurationProvider.ts @@ -6,80 +6,79 @@ import { CONSTANTS, DialogResponses } from "./constants"; import { getServerPortConfig } from "./extension_utils/utils"; export class SimulatorDebugConfigurationProvider - implements vscode.DebugConfigurationProvider -{ - public deviceSimulatorExpressDebug: boolean; + implements vscode.DebugConfigurationProvider { + public deviceSimulatorExpressDebug: boolean; - constructor(private pathToScript: string) { - this.deviceSimulatorExpressDebug = false; - } + constructor(private pathToScript: string) { + this.deviceSimulatorExpressDebug = false; + } - /** - * Modify the debug configuration just before a debug session is being launched. - */ - public resolveDebugConfiguration( - folder: vscode.WorkspaceFolder | undefined, - config: vscode.DebugConfiguration, - token?: vscode.CancellationToken - ): vscode.ProviderResult { - const activeTextEditor = vscode.window.activeTextEditor; + /** + * Modify the debug configuration just before a debug session is being launched. + */ + public resolveDebugConfiguration( + folder: vscode.WorkspaceFolder | undefined, + config: vscode.DebugConfiguration, + token?: vscode.CancellationToken + ): vscode.ProviderResult { + const activeTextEditor = vscode.window.activeTextEditor; - // Create a configuration if no launch.json exists or if it's empty - if (!config.type && !config.request && !config.name) { - if ( - activeTextEditor && - activeTextEditor.document.languageId === "python" - ) { - config.type = "deviceSimulatorExpress"; - config.request = "launch"; - config.name = "Device Simulator Express Debugger"; - config.console = "integratedTerminal"; - } - } - // Check config type - if (config.type === CONSTANTS.DEBUG_CONFIGURATION_TYPE) { - this.deviceSimulatorExpressDebug = true; - if (activeTextEditor) { - const currentFilePath = activeTextEditor.document.fileName; + // Create a configuration if no launch.json exists or if it's empty + if (!config.type && !config.request && !config.name) { + if ( + activeTextEditor && + activeTextEditor.document.languageId === "python" + ) { + config.type = "deviceSimulatorExpress"; + config.request = "launch"; + config.name = "Device Simulator Express Debugger"; + config.console = "integratedTerminal"; + } + } + // Check config type + if (config.type === CONSTANTS.DEBUG_CONFIGURATION_TYPE) { + this.deviceSimulatorExpressDebug = true; + if (activeTextEditor) { + const currentFilePath = activeTextEditor.document.fileName; - // Check file type and name - if (!(activeTextEditor.document.languageId === "python")) { - return vscode.window - .showErrorMessage( - CONSTANTS.ERROR.INVALID_FILE_EXTENSION_DEBUG - ) - .then(() => { - return undefined; // Abort launch - }); - } - // Set the new configuration type so the python debugger can take over - config.type = "python"; - // Set process_user_code path as program - config.program = this.pathToScript; - // Set user's code path and server's port as args - config.args = [ - currentFilePath, - getServerPortConfig().toString(), - ]; - // Set rules - config.rules = [ - { path: this.pathToScript, include: false }, - { - module: "adafruit_circuitplayground", - include: false, - }, - { module: "playsound", include: false }, - ]; - } - } - // Abort / show error message if can't find process_user_code.py - if (!config.program) { - return vscode.window - .showErrorMessage(CONSTANTS.ERROR.NO_PROGRAM_FOUND_DEBUG) - .then(() => { - return undefined; // Abort launch - }); - } - return config; - } + // Check file type and name + if (!(activeTextEditor.document.languageId === "python")) { + return vscode.window + .showErrorMessage( + CONSTANTS.ERROR.INVALID_FILE_EXTENSION_DEBUG + ) + .then(() => { + return undefined; // Abort launch + }); + } + // Set the new configuration type so the python debugger can take over + config.type = "python"; + // Set process_user_code path as program + config.program = this.pathToScript; + // Set user's code path and server's port as args + config.args = [ + currentFilePath, + getServerPortConfig().toString(), + ]; + // Set rules + config.rules = [ + { path: this.pathToScript, include: false }, + { + module: "adafruit_circuitplayground", + include: false, + }, + { module: "playsound", include: false }, + ]; + } + } + // Abort / show error message if can't find process_user_code.py + if (!config.program) { + return vscode.window + .showErrorMessage(CONSTANTS.ERROR.NO_PROGRAM_FOUND_DEBUG) + .then(() => { + return undefined; // Abort launch + }); + } + return config; + } } diff --git a/Source/telemetry/getPackageInfo.ts b/Source/telemetry/getPackageInfo.ts index 6e7044903..cd8d42ab7 100644 --- a/Source/telemetry/getPackageInfo.ts +++ b/Source/telemetry/getPackageInfo.ts @@ -3,53 +3,55 @@ import * as path from "path"; import * as vscode from "vscode"; export interface IPackageJson { - name?: string; - version?: string; - instrumentationKey: string; + name?: string; + version?: string; + instrumentationKey: string; } const getPackagePath = (context: vscode.ExtensionContext) => { - const onDiskPath = vscode.Uri.file( - path.join(context.extensionPath, "package.json") - ); - const packagePath = onDiskPath.with({ scheme: "vscode-resource" }); + const onDiskPath = vscode.Uri.file( + path.join(context.extensionPath, "package.json") + ); + const packagePath = onDiskPath.with({ scheme: "vscode-resource" }); - return packagePath; + return packagePath; }; -export default function getPackageInfo(context: vscode.ExtensionContext): { - extensionName: string; - extensionVersion: string; - instrumentationKey: string; +export default function getPackageInfo( + context: vscode.ExtensionContext +): { + extensionName: string; + extensionVersion: string; + instrumentationKey: string; } { - let packageJson: IPackageJson; - const packagePath = getPackagePath(context); - - try { - packageJson = JSON.parse(fs.readFileSync(packagePath.fsPath, "utf8")); - } catch (error) { - console.error(`Failed to read from package.json: ${error}`); - throw new Error(`Failed to read from package.json: ${error}`); - } - - const extensionName: string | undefined = packageJson.name; - const extensionVersion: string | undefined = packageJson.version; - const instrumentationKey: string | undefined = - packageJson.instrumentationKey; - - if (!extensionName) { - throw new Error( - "Extension's package.json is missing instrumentation key." - ); - } - - if (!extensionVersion) { - throw new Error("Extension's package.json is missing version."); - } - - if (!extensionVersion) { - throw new Error("Extension's package.json is missing version."); - } - - return { extensionName, extensionVersion, instrumentationKey }; + let packageJson: IPackageJson; + const packagePath = getPackagePath(context); + + try { + packageJson = JSON.parse(fs.readFileSync(packagePath.fsPath, "utf8")); + } catch (error) { + console.error(`Failed to read from package.json: ${error}`); + throw new Error(`Failed to read from package.json: ${error}`); + } + + const extensionName: string | undefined = packageJson.name; + const extensionVersion: string | undefined = packageJson.version; + const instrumentationKey: string | undefined = + packageJson.instrumentationKey; + + if (!extensionName) { + throw new Error( + "Extension's package.json is missing instrumentation key." + ); + } + + if (!extensionVersion) { + throw new Error("Extension's package.json is missing version."); + } + + if (!extensionVersion) { + throw new Error("Extension's package.json is missing version."); + } + + return { extensionName, extensionVersion, instrumentationKey }; } diff --git a/Source/telemetry/telemetryAI.ts b/Source/telemetry/telemetryAI.ts index c0c5ff5ac..4dbf5ca41 100644 --- a/Source/telemetry/telemetryAI.ts +++ b/Source/telemetry/telemetryAI.ts @@ -4,76 +4,80 @@ import getPackageInfo from "./getPackageInfo"; // tslint:disable-next-line:export-name export default class TelemetryAI { - private static telemetryReporter: TelemetryReporter; - private static enableTelemetry: boolean | undefined; + private static telemetryReporter: TelemetryReporter; + private static enableTelemetry: boolean | undefined; - constructor(vscodeContext: vscode.ExtensionContext) { - TelemetryAI.telemetryReporter = - this.createTelemetryReporter(vscodeContext); - TelemetryAI.enableTelemetry = vscode.workspace - .getConfiguration() - .get("telemetry.enableTelemetry"); - if (TelemetryAI.enableTelemetry === undefined) { - TelemetryAI.enableTelemetry = true; - } - } + constructor(vscodeContext: vscode.ExtensionContext) { + TelemetryAI.telemetryReporter = this.createTelemetryReporter( + vscodeContext + ); + TelemetryAI.enableTelemetry = vscode.workspace + .getConfiguration() + .get("telemetry.enableTelemetry"); + if (TelemetryAI.enableTelemetry === undefined) { + TelemetryAI.enableTelemetry = true; + } + } - public getExtensionName(context: vscode.ExtensionContext): string { - const { extensionName } = getPackageInfo(context); - return extensionName; - } + public getExtensionName(context: vscode.ExtensionContext): string { + const { extensionName } = getPackageInfo(context); + return extensionName; + } - public getExtensionVersionNumber(context: vscode.ExtensionContext): string { - const { extensionVersion } = getPackageInfo(context); - return extensionVersion; - } + public getExtensionVersionNumber(context: vscode.ExtensionContext): string { + const { extensionVersion } = getPackageInfo(context); + return extensionVersion; + } - public sendTelemetryIfEnabled( - eventName: string, - properties?: { [key: string]: string }, - measurements?: { [key: string]: number } - ) { - if (TelemetryAI.enableTelemetry) { - TelemetryAI.telemetryReporter.sendTelemetryEvent( - eventName, - properties, - measurements - ); - } - } + public sendTelemetryIfEnabled( + eventName: string, + properties?: { [key: string]: string }, + measurements?: { [key: string]: number } + ) { + if (TelemetryAI.enableTelemetry) { + TelemetryAI.telemetryReporter.sendTelemetryEvent( + eventName, + properties, + measurements + ); + } + } - public trackFeatureUsage( - eventName: string, - eventProperties?: { [key: string]: string } - ) { - this.sendTelemetryIfEnabled(eventName, eventProperties); - } + public trackFeatureUsage( + eventName: string, + eventProperties?: { [key: string]: string } + ) { + this.sendTelemetryIfEnabled(eventName, eventProperties); + } - public runWithLatencyMeasure( - functionToRun: () => void, - eventName: string - ): void { - const numberOfNanosecondsInSecond: number = 1000000000; - const startTime: number = Number(process.hrtime.bigint()); - functionToRun(); - const latency: number = Number(process.hrtime.bigint()) - startTime; - const measurement = { - duration: latency / numberOfNanosecondsInSecond, - }; - this.sendTelemetryIfEnabled(eventName, {}, measurement); - } + public runWithLatencyMeasure( + functionToRun: () => void, + eventName: string + ): void { + const numberOfNanosecondsInSecond: number = 1000000000; + const startTime: number = Number(process.hrtime.bigint()); + functionToRun(); + const latency: number = Number(process.hrtime.bigint()) - startTime; + const measurement = { + duration: latency / numberOfNanosecondsInSecond, + }; + this.sendTelemetryIfEnabled(eventName, {}, measurement); + } - private createTelemetryReporter( - context: vscode.ExtensionContext - ): TelemetryReporter { - const { extensionName, extensionVersion, instrumentationKey } = - getPackageInfo(context); - const reporter: TelemetryReporter = new TelemetryReporter( - extensionName, - extensionVersion, - instrumentationKey - ); - context.subscriptions.push(reporter); - return reporter; - } + private createTelemetryReporter( + context: vscode.ExtensionContext + ): TelemetryReporter { + const { + extensionName, + extensionVersion, + instrumentationKey, + } = getPackageInfo(context); + const reporter: TelemetryReporter = new TelemetryReporter( + extensionName, + extensionVersion, + instrumentationKey + ); + context.subscriptions.push(reporter); + return reporter; + } } diff --git a/Source/test/runTest.ts b/Source/test/runTest.ts index 2e15c1ed8..6d54aa78b 100644 --- a/Source/test/runTest.ts +++ b/Source/test/runTest.ts @@ -3,21 +3,21 @@ import * as path from "path"; import { runTests } from "vscode-test"; async function main() { - try { - // The folder containing the Extension Manifest package.json - // Passed to `--extensionDevelopmentPath` - const extensionDevelopmentPath = path.resolve(__dirname, "../../"); + try { + // The folder containing the Extension Manifest package.json + // Passed to `--extensionDevelopmentPath` + const extensionDevelopmentPath = path.resolve(__dirname, "../../"); - // The path to the extension test script - // Passed to --extensionTestsPath - const extensionTestsPath = path.resolve(__dirname, "./suite/index"); + // The path to the extension test script + // Passed to --extensionTestsPath + const extensionTestsPath = path.resolve(__dirname, "./suite/index"); - // Download VS Code, unzip it and run the integration test - await runTests({ extensionDevelopmentPath, extensionTestsPath }); - } catch (err) { - console.error("Failed to run tests"); - process.exit(1); - } + // Download VS Code, unzip it and run the integration test + await runTests({ extensionDevelopmentPath, extensionTestsPath }); + } catch (err) { + console.error("Failed to run tests"); + process.exit(1); + } } main(); diff --git a/Source/test/suite/index.ts b/Source/test/suite/index.ts index 4ae41bac6..c223a6f0d 100644 --- a/Source/test/suite/index.ts +++ b/Source/test/suite/index.ts @@ -16,35 +16,35 @@ import * as path from "path"; // tslint:disable-next-line: export-name export function run(): Promise { - // Create the mocha test - const mocha = new Mocha({ - ui: "tdd", - }); - mocha.useColors(true); + // Create the mocha test + const mocha = new Mocha({ + ui: "tdd", + }); + mocha.useColors(true); - const testsRoot = path.resolve(__dirname, ".."); + const testsRoot = path.resolve(__dirname, ".."); - return new Promise((c, e) => { - glob("**/**.test.js", { cwd: testsRoot }, (err, files) => { - if (err) { - return e(err); - } + return new Promise((c, e) => { + glob("**/**.test.js", { cwd: testsRoot }, (err, files) => { + if (err) { + return e(err); + } - // Add files to the test suite - files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f))); + // Add files to the test suite + files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); - try { - // Run the mocha test - mocha.run((failures) => { - if (failures > 0) { - e(new Error(`${failures} tests failed.`)); - } else { - c(); - } - }); - } catch (err) { - e(err); - } - }); - }); + try { + // Run the mocha test + mocha.run(failures => { + if (failures > 0) { + e(new Error(`${failures} tests failed.`)); + } else { + c(); + } + }); + } catch (err) { + e(err); + } + }); + }); } diff --git a/Source/usbDetector.ts b/Source/usbDetector.ts index 073c99c01..6d28bb9fb 100644 --- a/Source/usbDetector.ts +++ b/Source/usbDetector.ts @@ -12,101 +12,101 @@ import * as utils from "./extension_utils/utils"; import { SerialMonitor } from "./serialMonitor"; export class UsbDetector { - public static getInstance(): UsbDetector { - if (!UsbDetector._instance) { - UsbDetector._instance = new UsbDetector(); - } - return UsbDetector._instance; - } - - private static _instance: UsbDetector; - - private _usbDetector: any; - - private _boardDescriptors: any = null; - - private _extensionRoot: string = null; - - private constructor() {} - - public initialize(extensionRoot: string) { - this._extensionRoot = extensionRoot; - } - - public async startListening() { - const workspaceConfig = vscode.workspace.getConfiguration(); - const enableUSBDetection = workspaceConfig.get( - CONFIG_KEYS.ENABLE_USB_DETECTION - ); - - if (os.platform() === "linux" || !enableUSBDetection) { - return; - } - this._usbDetector = require("usb-native").detector; - - if (!this._usbDetector) { - return; - } - - if (this._extensionRoot === null) { - throw new Error("UsbDetector should be initialized before using."); - } - - this._usbDetector.on("add", async (device: any) => { - if (device.vendorId && device.productId) { - const deviceDescriptor = this.getUsbDeviceDescriptor( - utils.convertToHex(device.vendorId, 4), - utils.convertToHex(device.productId, 4), - this._extensionRoot - ); - - // Not supported device for discovery - if (!deviceDescriptor) { - return; - } - - const boardKey = `${deviceDescriptor.package}:${deviceDescriptor.architecture}:${deviceDescriptor.id}`; - // Log that a board was detected - if (!SerialMonitor.getInstance().initialized) { - SerialMonitor.getInstance().initialize(); - } - } - }); - } - - public stopListening() { - if (this._usbDetector) { - this._usbDetector.stopMonitoring(); - } - } - - private getUsbDeviceDescriptor( - vendorId: string, - productId: string, - extensionRoot: string - ): any { - if (!this._boardDescriptors) { - this._boardDescriptors = []; - const fileContent = fs.readFileSync( - path.join(extensionRoot, "misc", "usbmapping.json"), - "utf8" - ); - const boardIndexes: [] = JSON.parse(fileContent); - boardIndexes.forEach((boardIndex: any) => { - boardIndex.boards.forEach((board: any) => { - board.indexFile = boardIndex.index_file; - }); - this._boardDescriptors = this._boardDescriptors.concat( - boardIndex.boards - ); - }); - } - return this._boardDescriptors.find((obj: any) => { - return ( - obj.vid === vendorId && - (obj.pid === productId || - (obj.pid.indexOf && obj.pid.indexOf(productId) >= 0)) - ); - }); - } + public static getInstance(): UsbDetector { + if (!UsbDetector._instance) { + UsbDetector._instance = new UsbDetector(); + } + return UsbDetector._instance; + } + + private static _instance: UsbDetector; + + private _usbDetector: any; + + private _boardDescriptors: any = null; + + private _extensionRoot: string = null; + + private constructor() {} + + public initialize(extensionRoot: string) { + this._extensionRoot = extensionRoot; + } + + public async startListening() { + const workspaceConfig = vscode.workspace.getConfiguration(); + const enableUSBDetection = workspaceConfig.get( + CONFIG_KEYS.ENABLE_USB_DETECTION + ); + + if (os.platform() === "linux" || !enableUSBDetection) { + return; + } + this._usbDetector = require("usb-native").detector; + + if (!this._usbDetector) { + return; + } + + if (this._extensionRoot === null) { + throw new Error("UsbDetector should be initialized before using."); + } + + this._usbDetector.on("add", async (device: any) => { + if (device.vendorId && device.productId) { + const deviceDescriptor = this.getUsbDeviceDescriptor( + utils.convertToHex(device.vendorId, 4), + utils.convertToHex(device.productId, 4), + this._extensionRoot + ); + + // Not supported device for discovery + if (!deviceDescriptor) { + return; + } + + const boardKey = `${deviceDescriptor.package}:${deviceDescriptor.architecture}:${deviceDescriptor.id}`; + // Log that a board was detected + if (!SerialMonitor.getInstance().initialized) { + SerialMonitor.getInstance().initialize(); + } + } + }); + } + + public stopListening() { + if (this._usbDetector) { + this._usbDetector.stopMonitoring(); + } + } + + private getUsbDeviceDescriptor( + vendorId: string, + productId: string, + extensionRoot: string + ): any { + if (!this._boardDescriptors) { + this._boardDescriptors = []; + const fileContent = fs.readFileSync( + path.join(extensionRoot, "misc", "usbmapping.json"), + "utf8" + ); + const boardIndexes: [] = JSON.parse(fileContent); + boardIndexes.forEach((boardIndex: any) => { + boardIndex.boards.forEach((board: any) => { + board.indexFile = boardIndex.index_file; + }); + this._boardDescriptors = this._boardDescriptors.concat( + boardIndex.boards + ); + }); + } + return this._boardDescriptors.find((obj: any) => { + return ( + obj.vid === vendorId && + (obj.pid === productId || + (obj.pid.indexOf && obj.pid.indexOf(productId) >= 0)) + ); + }); + } } diff --git a/Source/view/App.css b/Source/view/App.css index dd11b283b..413e9fcbc 100644 --- a/Source/view/App.css +++ b/Source/view/App.css @@ -1,16 +1,16 @@ .App { - text-align: center; - display: flex; - justify-content: space-between; + text-align: center; + display: flex; + justify-content: space-between; } .App-main { - background-color: var(--vscode-editor-background); - padding: 0px 0.75em 0px 0.75em; - min-height: 100vh; - width: 100%; - margin-top: 24px; - margin-bottom: 53px; - max-height: 400px; - overflow: scroll; + background-color: var(--vscode-editor-background); + padding: 0px 0.75em 0px 0.75em; + min-height: 100vh; + width: 100%; + margin-top: 24px; + margin-bottom: 53px; + max-height: 400px; + overflow: scroll; } diff --git a/Source/view/App.spec.tsx b/Source/view/App.spec.tsx index eb12d412f..66d6fc9d5 100644 --- a/Source/view/App.spec.tsx +++ b/Source/view/App.spec.tsx @@ -5,24 +5,24 @@ import * as testRenderer from "react-test-renderer"; import App from "./App"; describe("App component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/App.tsx b/Source/view/App.tsx index 4b530406e..3e540c8d9 100644 --- a/Source/view/App.tsx +++ b/Source/view/App.tsx @@ -4,98 +4,98 @@ import * as React from "react"; import "./App.css"; import { - DEVICE_LIST_KEY, - VIEW_STATE, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_ATTRIBUTES_KEY, - WEBVIEW_TYPES, + DEVICE_LIST_KEY, + VIEW_STATE, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_ATTRIBUTES_KEY, + WEBVIEW_TYPES, } from "./constants"; import { Device } from "./container/device/Device"; import { ViewStateContext } from "./context"; import { GettingStartedPage } from "./pages/gettingStarted"; interface IState { - currentDevice: string; - viewState: VIEW_STATE; - type?: WEBVIEW_TYPES; + currentDevice: string; + viewState: VIEW_STATE; + type?: WEBVIEW_TYPES; } const defaultState = { - currentDevice: DEVICE_LIST_KEY.CPX, - viewState: VIEW_STATE.RUNNING, - type: undefined, + currentDevice: DEVICE_LIST_KEY.CPX, + viewState: VIEW_STATE.RUNNING, + type: undefined, }; class App extends React.Component<{}, IState> { - constructor() { - super({}); - this.state = defaultState; - } - componentDidMount() { - if (document.currentScript) { - const webviewTypeAttribute = document.currentScript.getAttribute( - WEBVIEW_ATTRIBUTES_KEY.TYPE - ) as WEBVIEW_TYPES; - if (webviewTypeAttribute) { - this.setState({ type: webviewTypeAttribute }); - } - if (webviewTypeAttribute === WEBVIEW_TYPES.SIMULATOR) { - const initialDevice = document.currentScript.getAttribute( - WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE - ); + constructor() { + super({}); + this.state = defaultState; + } + componentDidMount() { + if (document.currentScript) { + const webviewTypeAttribute = document.currentScript.getAttribute( + WEBVIEW_ATTRIBUTES_KEY.TYPE + ) as WEBVIEW_TYPES; + if (webviewTypeAttribute) { + this.setState({ type: webviewTypeAttribute }); + } + if (webviewTypeAttribute === WEBVIEW_TYPES.SIMULATOR) { + const initialDevice = document.currentScript.getAttribute( + WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE + ); - if (initialDevice) { - this.setState({ currentDevice: initialDevice }); - window.addEventListener("message", this.handleMessage); - } - } - } - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } + if (initialDevice) { + this.setState({ currentDevice: initialDevice }); + window.addEventListener("message", this.handleMessage); + } + } + } + } + componentWillUnmount() { + window.removeEventListener("message", this.handleMessage); + } - render() { - return ( -
-
- - {this.loadContent()} - -
-
- ); - } - loadContent = () => { - console.log(this.state.type); - switch (this.state.type) { - case WEBVIEW_TYPES.GETTING_STARTED: - return ; - case WEBVIEW_TYPES.SIMULATOR: - return ( - - ); - } - return; - }; + render() { + return ( +
+
+ + {this.loadContent()} + +
+
+ ); + } + loadContent = () => { + console.log(this.state.type); + switch (this.state.type) { + case WEBVIEW_TYPES.GETTING_STARTED: + return ; + case WEBVIEW_TYPES.SIMULATOR: + return ( + + ); + } + return; + }; - handleMessage = (event: any): void => { - const message = event.data; + handleMessage = (event: any): void => { + const message = event.data; - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE: - if (message.active_device !== this.state.currentDevice) { - this.setState({ currentDevice: message.active_device }); - } - break; - case VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE: - this.setState({ viewState: VIEW_STATE.RUNNING }); - break; - case VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE: - this.setState({ viewState: VIEW_STATE.PAUSE }); - break; - } - }; + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE: + if (message.active_device !== this.state.currentDevice) { + this.setState({ currentDevice: message.active_device }); + } + break; + case VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE: + this.setState({ viewState: VIEW_STATE.RUNNING }); + break; + case VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE: + this.setState({ viewState: VIEW_STATE.PAUSE }); + break; + } + }; } export default App; diff --git a/Source/view/components/Button.tsx b/Source/view/components/Button.tsx index a7df60dc7..db5034b9d 100644 --- a/Source/view/components/Button.tsx +++ b/Source/view/components/Button.tsx @@ -2,32 +2,33 @@ import * as React from "react"; import "../styles/Button.css"; export interface IButtonProps { - label: string; - image: any; - focusable: boolean; - styleLabel: string; - width: number; - onClick: (event: React.MouseEvent) => void; + label: string; + image: any; + focusable: boolean; + styleLabel: string; + width: number; + onClick: (event: React.MouseEvent) => void; } // Functional Component render -const Button: React.FC = (props) => { - const iconSvg: SVGElement = props.image as SVGElement; - const buttonStyle = { width: props.width }; - const tabIndex = props.focusable ? 0 : -1; +const Button: React.FC = props => { + const iconSvg: SVGElement = props.image as SVGElement; + const buttonStyle = { width: props.width }; + const tabIndex = props.focusable ? 0 : -1; - return ( - - ); + return ( + + ); }; export default Button; diff --git a/Source/view/components/Dropdown.tsx b/Source/view/components/Dropdown.tsx index 16c55e60b..e5506383a 100644 --- a/Source/view/components/Dropdown.tsx +++ b/Source/view/components/Dropdown.tsx @@ -5,30 +5,31 @@ import * as React from "react"; import "../styles/Dropdown.css"; export interface IDropdownProps { - options: string[]; - // styleLabel: string; - name: string; - onSelect?: (event: React.ChangeEvent) => void; + options: string[]; + // styleLabel: string; + name: string; + onSelect?: (event: React.ChangeEvent) => void; } -export const Dropdown: React.FC = (props) => { - return ( - - ); +export const Dropdown: React.FC = props => { + return ( + + ); }; const renderOptions = (options: string[]) => { - return options.map((name, index) => { - return ( - - ); - }); + return options.map((name, index) => { + return ( + + ); + }); }; diff --git a/Source/view/components/clue/Clue.spec.tsx b/Source/view/components/clue/Clue.spec.tsx index e9a6e6c7d..55d065bce 100644 --- a/Source/view/components/clue/Clue.spec.tsx +++ b/Source/view/components/clue/Clue.spec.tsx @@ -5,25 +5,25 @@ import * as testRenderer from "react-test-renderer"; import { Clue } from "./Clue"; describe("Clue component", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/components/clue/Clue.tsx b/Source/view/components/clue/Clue.tsx index e587a23bc..552ff54c3 100644 --- a/Source/view/components/clue/Clue.tsx +++ b/Source/view/components/clue/Clue.tsx @@ -3,10 +3,10 @@ import * as React from "react"; import { - GESTURES_CLUE, - SENSOR_LIST, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, + GESTURES_CLUE, + SENSOR_LIST, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_MESSAGES, } from "../../constants"; import "../../styles/Simulator.css"; import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; @@ -17,142 +17,142 @@ import { ClueSimulator } from "./ClueSimulator"; // Component grouping the functionality for micro:bit functionalities interface IState { - sensors: { [key: string]: number }; - currentSelectedGesture: string; + sensors: { [key: string]: number }; + currentSelectedGesture: string; } const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT_R]: 0, - [SENSOR_LIST.LIGHT_G]: 0, - [SENSOR_LIST.LIGHT_B]: 0, - [SENSOR_LIST.LIGHT_C]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - [SENSOR_LIST.HUMIDITY]: 0, - [SENSOR_LIST.PRESSURE]: 1013, - [SENSOR_LIST.PROXIMITY]: 0, - [SENSOR_LIST.GYRO_X]: 0, - [SENSOR_LIST.GYRO_Y]: 0, - [SENSOR_LIST.GYRO_Z]: 0, - [SENSOR_LIST.MAGNET_X]: 0, - [SENSOR_LIST.MAGNET_Y]: 0, - [SENSOR_LIST.MAGNET_Z]: 0, - }, - currentSelectedGesture: GESTURES_CLUE[0], + sensors: { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT_R]: 0, + [SENSOR_LIST.LIGHT_G]: 0, + [SENSOR_LIST.LIGHT_B]: 0, + [SENSOR_LIST.LIGHT_C]: 0, + [SENSOR_LIST.MOTION_X]: 0, + [SENSOR_LIST.MOTION_Y]: 0, + [SENSOR_LIST.MOTION_Z]: 0, + [SENSOR_LIST.HUMIDITY]: 0, + [SENSOR_LIST.PRESSURE]: 1013, + [SENSOR_LIST.PROXIMITY]: 0, + [SENSOR_LIST.GYRO_X]: 0, + [SENSOR_LIST.GYRO_Y]: 0, + [SENSOR_LIST.GYRO_Z]: 0, + [SENSOR_LIST.MAGNET_X]: 0, + [SENSOR_LIST.MAGNET_Y]: 0, + [SENSOR_LIST.MAGNET_Z]: 0, + }, + currentSelectedGesture: GESTURES_CLUE[0], }; export class Clue extends React.Component<{}, IState> { - state = DEFAULT_STATE; + state = DEFAULT_STATE; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + handleMessage = (event: any): void => { + const message = event.data; - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; - updateGesture = (event: React.ChangeEvent) => { - this.setState({ currentSelectedGesture: event.target.value }); - }; - sendGesture = (isActive: boolean) => { - if (this.state.currentSelectedGesture) { - if (isActive) { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: this.state.currentSelectedGesture, - }); - } else { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: "", - }); - } - } - }; + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.RESET: + this.setState({ ...DEFAULT_STATE }); + break; + } + }; + render() { + return ( + + + + + ); + } + updateSensor = (sensor: SENSOR_LIST, value: number) => { + this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); + }; + updateGesture = (event: React.ChangeEvent) => { + this.setState({ currentSelectedGesture: event.target.value }); + }; + sendGesture = (isActive: boolean) => { + if (this.state.currentSelectedGesture) { + if (isActive) { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: this.state.currentSelectedGesture, + }); + } else { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: "", + }); + } + } + }; } const CLUE_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - label: CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.LEDS, - image: TOOLBAR_SVG.NEO_PIXEL_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.TEMPERATURE, - image: TOOLBAR_SVG.TEMPERATURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.LIGHT, - image: TOOLBAR_SVG.LIGHT_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, - image: TOOLBAR_SVG.MOTION_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.HUMIDITY, - image: TOOLBAR_SVG.HUMIDITY_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.PRESSURE, - image: TOOLBAR_SVG.PRESSURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.PROXIMITY, - image: TOOLBAR_SVG.PROXIMITY_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GESTURE, - image: TOOLBAR_SVG.GESTURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GYROSCOPE, - image: TOOLBAR_SVG.GYROSCOPE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, - image: TOOLBAR_SVG.MAGNET_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GPIO, - image: TOOLBAR_SVG.GPIO_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.SOUND, - image: TOOLBAR_SVG.SOUND_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.SPEAKER, - image: TOOLBAR_SVG.SPEAKER_SVG, - }, + { + label: CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, + image: TOOLBAR_SVG.PUSH_BUTTON_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.LEDS, + image: TOOLBAR_SVG.NEO_PIXEL_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.TEMPERATURE, + image: TOOLBAR_SVG.TEMPERATURE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.LIGHT, + image: TOOLBAR_SVG.LIGHT_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, + image: TOOLBAR_SVG.MOTION_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.HUMIDITY, + image: TOOLBAR_SVG.HUMIDITY_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.PRESSURE, + image: TOOLBAR_SVG.PRESSURE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.PROXIMITY, + image: TOOLBAR_SVG.PROXIMITY_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.GESTURE, + image: TOOLBAR_SVG.GESTURE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.GYROSCOPE, + image: TOOLBAR_SVG.GYROSCOPE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, + image: TOOLBAR_SVG.MAGNET_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.GPIO, + image: TOOLBAR_SVG.GPIO_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.SOUND, + image: TOOLBAR_SVG.SOUND_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.SPEAKER, + image: TOOLBAR_SVG.SPEAKER_SVG, + }, ]; diff --git a/Source/view/components/clue/ClueImage.tsx b/Source/view/components/clue/ClueImage.tsx index 7bbecc68e..b3c3edcf2 100644 --- a/Source/view/components/clue/ClueImage.tsx +++ b/Source/view/components/clue/ClueImage.tsx @@ -8,149 +8,149 @@ import { ViewStateContext } from "../../context"; import { ClueSvg, IRefObject } from "./Clue_svg"; interface EventTriggers { - onMouseUp: (event: Event, buttonKey: string) => void; - onMouseDown: (event: Event, buttonKey: string) => void; - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; + onMouseUp: (event: Event, buttonKey: string) => void; + onMouseDown: (event: Event, buttonKey: string) => void; + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; } interface IProps { - eventTriggers: EventTriggers; - displayMessage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; + eventTriggers: EventTriggers; + displayMessage: string; + leds: { + neopixel: number[]; + isRedLedOn: boolean; + isWhiteLedOn: boolean; + }; } export enum BUTTONS_KEYS { - BTN_A = "BTN_A", - BTN_B = "BTN_B", - BTN_AB = "BTN_AB", + BTN_A = "BTN_A", + BTN_B = "BTN_B", + BTN_AB = "BTN_AB", } // Displays the SVG and call necessary svg modification. export class ClueImage extends React.Component { - private svgRef: React.RefObject = React.createRef(); - constructor(props: IProps) { - super(props); - } - componentDidMount() { - const svgElement = this.svgRef.current; - if (svgElement) { - setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); - this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); - } - } - componentDidUpdate() { - if (this.context === VIEW_STATE.PAUSE && this.svgRef.current) { - disableAllButtons(this.svgRef.current.getButtons()); - } else if (this.context === VIEW_STATE.RUNNING && this.svgRef.current) { - setupAllButtons( - this.props.eventTriggers, - this.svgRef.current.getButtons() - ); - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.eventTriggers.onKeyEvent(event, true, event.key); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.eventTriggers.onKeyEvent(event, false, event.key); - }; - render() { - return ( - - ); - } - public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { - const button = this.svgRef.current?.getButtons()[key].current; - if (button) { - button.focus(); - if (isActive) { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.KEYPRESSED - ); - } else { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.DEFAULT - ); - } - button.setAttribute("pressed", `${isActive}`); - button.setAttribute("aria-pressed", `${isActive}`); - } - } + private svgRef: React.RefObject = React.createRef(); + constructor(props: IProps) { + super(props); + } + componentDidMount() { + const svgElement = this.svgRef.current; + if (svgElement) { + setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); + this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); + } + } + componentDidUpdate() { + if (this.context === VIEW_STATE.PAUSE && this.svgRef.current) { + disableAllButtons(this.svgRef.current.getButtons()); + } else if (this.context === VIEW_STATE.RUNNING && this.svgRef.current) { + setupAllButtons( + this.props.eventTriggers, + this.svgRef.current.getButtons() + ); + } + } + componentWillUnmount() { + window.document.removeEventListener("keydown", this.handleKeyDown); + window.document.removeEventListener("keyup", this.handleKeyUp); + } + setupKeyPresses = ( + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void + ) => { + window.document.addEventListener("keydown", this.handleKeyDown); + window.document.addEventListener("keyup", this.handleKeyUp); + }; + handleKeyDown = (event: KeyboardEvent) => { + const keyEvents = [event.key, event.code]; + // Don't listen to keydown events for the run button, restart button and enter key + if ( + !( + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) + ) + ) { + this.props.eventTriggers.onKeyEvent(event, true, event.key); + } + }; + handleKeyUp = (event: KeyboardEvent) => { + this.props.eventTriggers.onKeyEvent(event, false, event.key); + }; + render() { + return ( + + ); + } + public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { + const button = this.svgRef.current?.getButtons()[key].current; + if (button) { + button.focus(); + if (isActive) { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.KEYPRESSED + ); + } else { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.DEFAULT + ); + } + button.setAttribute("pressed", `${isActive}`); + button.setAttribute("aria-pressed", `${isActive}`); + } + } } ClueImage.contextType = ViewStateContext; const setupButton = ( - buttonElement: SVGRectElement, - eventTriggers: EventTriggers, - key: string + buttonElement: SVGRectElement, + eventTriggers: EventTriggers, + key: string ) => { - buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); - buttonElement.onmousedown = (e) => { - buttonElement.focus(); - eventTriggers.onMouseDown(e, key); - }; - buttonElement.onmouseup = (e) => { - eventTriggers.onMouseUp(e, key); - }; + buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); + buttonElement.onmousedown = e => { + buttonElement.focus(); + eventTriggers.onMouseDown(e, key); + }; + buttonElement.onmouseup = e => { + eventTriggers.onMouseUp(e, key); + }; - buttonElement.onkeydown = (e) => { - // ensure that the keydown is enter, - // or else it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - eventTriggers.onKeyEvent(e, true, key); - } - }; - buttonElement.onkeyup = (e) => { - eventTriggers.onKeyEvent(e, false, key); - }; + buttonElement.onkeydown = e => { + // ensure that the keydown is enter, + // or else it may register shortcuts twice + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + eventTriggers.onKeyEvent(e, true, key); + } + }; + buttonElement.onkeyup = e => { + eventTriggers.onKeyEvent(e, false, key); + }; }; const setupAllButtons = ( - eventTriggers: EventTriggers, - buttonRefs: IRefObject + eventTriggers: EventTriggers, + buttonRefs: IRefObject ) => { - for (const [key, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - setupButton(ref.current, eventTriggers, key); - } - } + for (const [key, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + setupButton(ref.current, eventTriggers, key); + } + } }; const disableAllButtons = (buttonRefs: IRefObject) => { - for (const [, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - // to implement - ref.current.onmousedown = null; - ref.current.onmouseup = null; - ref.current.onkeydown = null; - ref.current.onkeyup = null; - ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); - } - } + for (const [, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + // to implement + ref.current.onmousedown = null; + ref.current.onmouseup = null; + ref.current.onkeydown = null; + ref.current.onkeyup = null; + ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); + } + } }; diff --git a/Source/view/components/clue/ClueSimulator.tsx b/Source/view/components/clue/ClueSimulator.tsx index 89323e93e..a15f101f8 100644 --- a/Source/view/components/clue/ClueSimulator.tsx +++ b/Source/view/components/clue/ClueSimulator.tsx @@ -1,11 +1,11 @@ import * as React from "react"; import { - AB_BUTTONS_KEYS, - CONSTANTS, - DEFAULT_IMG_CLUE, - DEVICE_LIST_KEY, - VIEW_STATE, - WEBVIEW_MESSAGES, + AB_BUTTONS_KEYS, + CONSTANTS, + DEFAULT_IMG_CLUE, + DEVICE_LIST_KEY, + VIEW_STATE, + WEBVIEW_MESSAGES, } from "../../constants"; import { ViewStateContext } from "../../context"; import "../../styles/Simulator.css"; @@ -17,288 +17,288 @@ import ActionBar from "../simulator/ActionBar"; import { BUTTONS_KEYS, ClueImage } from "./ClueImage"; export const DEFAULT_CLUE_STATE: IClueState = { - buttons: { button_a: false, button_b: false }, - displayMessage: DEFAULT_IMG_CLUE, - leds: { - neopixel: [0, 0, 0], - isRedLedOn: false, - isWhiteLedOn: false, - }, + buttons: { button_a: false, button_b: false }, + displayMessage: DEFAULT_IMG_CLUE, + leds: { + neopixel: [0, 0, 0], + isRedLedOn: false, + isWhiteLedOn: false, + }, }; interface IState { - active_editors: string[]; - running_file?: string; - play_button: boolean; - selected_file: string; - clue: IClueState; - currently_selected_file: string; + active_editors: string[]; + running_file?: string; + play_button: boolean; + selected_file: string; + clue: IClueState; + currently_selected_file: string; } interface IClueState { - buttons: { button_a: boolean; button_b: boolean }; - displayMessage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; + buttons: { button_a: boolean; button_b: boolean }; + displayMessage: string; + leds: { + neopixel: number[]; + isRedLedOn: boolean; + isWhiteLedOn: boolean; + }; } export class ClueSimulator extends React.Component { - private imageRef: React.RefObject = React.createRef(); - constructor() { - super({}); - this.state = { - clue: DEFAULT_CLUE_STATE, - play_button: false, - selected_file: "", - active_editors: [], - running_file: undefined, - currently_selected_file: "", - }; - this.onKeyEvent = this.onKeyEvent.bind(this); - } - handleMessage = (event: any): void => { - const message = event.data; - if (message.active_device !== DEVICE_LIST_KEY.CLUE) { - return; - } - switch (message.command) { - case "reset-state": - this.setState({ - clue: DEFAULT_CLUE_STATE, - play_button: false, - }); - break; - case "set-state": - this.handleStateChangeMessage(message); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - clue: { - ...this.state.clue, - displayMessage: DEFAULT_IMG_CLUE, - }, - }); - break; - case "visible-editors": - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } + private imageRef: React.RefObject = React.createRef(); + constructor() { + super({}); + this.state = { + clue: DEFAULT_CLUE_STATE, + play_button: false, + selected_file: "", + active_editors: [], + running_file: undefined, + currently_selected_file: "", + }; + this.onKeyEvent = this.onKeyEvent.bind(this); + } + handleMessage = (event: any): void => { + const message = event.data; + if (message.active_device !== DEVICE_LIST_KEY.CLUE) { + return; + } + switch (message.command) { + case "reset-state": + this.setState({ + clue: DEFAULT_CLUE_STATE, + play_button: false, + }); + break; + case "set-state": + this.handleStateChangeMessage(message); + break; + case "activate-play": + const newRunningFile = this.state.currently_selected_file; + this.setState({ + play_button: !this.state.play_button, + running_file: newRunningFile, + clue: { + ...this.state.clue, + displayMessage: DEFAULT_IMG_CLUE, + }, + }); + break; + case "visible-editors": + this.setState({ + active_editors: message.state.activePythonEditors, + }); + break; + case "current-file": + if (this.state.play_button) { + this.setState({ + currently_selected_file: message.state.running_file, + }); + } else { + this.setState({ + running_file: message.state.running_file, + currently_selected_file: message.state.running_file, + }); + } - break; - } - }; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } + break; + } + }; + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } + componentWillUnmount() { + window.removeEventListener("message", this.handleMessage); + } - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
+ render() { + const playStopImage = this.state.play_button ? StopLogo : PlayLogo; + const playStopLabel = this.state.play_button ? "stop" : "play"; + return ( +
+
+ {this.state.running_file && this.state.play_button + ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) + : CONSTANTS.FILES_PLACEHOLDER} +
-
- -
- -
- ); - } - protected togglePlayClick = () => { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - }; - protected onSelectFile(event: React.FocusEvent) { - this.setState({ - selected_file: event.currentTarget.value, - }); - } - protected refreshSimulatorClick = () => { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - }; - protected handleButtonClick = (key: string, isActive: boolean) => { - let newButtonState = this.state.clue.buttons; - switch (key) { - case AB_BUTTONS_KEYS.BTN_A: - newButtonState.button_a = isActive; - break; - case AB_BUTTONS_KEYS.BTN_B: - newButtonState.button_b = isActive; - break; - case AB_BUTTONS_KEYS.BTN_AB: - newButtonState = { - button_a: isActive, - button_b: isActive, - }; - break; - } - sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); - this.setState({ - clue: { - ...this.state.clue, - buttons: newButtonState, - }, - }); - }; +
+ +
+ +
+ ); + } + protected togglePlayClick = () => { + const button = + window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || + window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { + selected_file: this.state.selected_file, + state: !this.state.play_button, + }); + }; + protected onSelectFile(event: React.FocusEvent) { + this.setState({ + selected_file: event.currentTarget.value, + }); + } + protected refreshSimulatorClick = () => { + const button = window.document.getElementById( + CONSTANTS.ID_NAME.REFRESH_BUTTON + ); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); + }; + protected handleButtonClick = (key: string, isActive: boolean) => { + let newButtonState = this.state.clue.buttons; + switch (key) { + case AB_BUTTONS_KEYS.BTN_A: + newButtonState.button_a = isActive; + break; + case AB_BUTTONS_KEYS.BTN_B: + newButtonState.button_b = isActive; + break; + case AB_BUTTONS_KEYS.BTN_AB: + newButtonState = { + button_a: isActive, + button_b: isActive, + }; + break; + } + sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); + this.setState({ + clue: { + ...this.state.clue, + buttons: newButtonState, + }, + }); + }; - protected onMouseUp = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, false); - }; + protected onMouseUp = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, false); + }; - protected onMouseDown = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, true); - }; + protected onMouseDown = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, true); + }; - protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { - event.stopPropagation(); - if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(key, active); - if (key === BUTTONS_KEYS.BTN_A) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if (key === BUTTONS_KEYS.BTN_B) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if (key === BUTTONS_KEYS.BTN_AB) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } - } - protected handleStateChangeMessage(message: any) { - if (message.state.display_base64 != null) { - this.setState({ - clue: { - ...this.state.clue, - displayMessage: message.state.display_base64, - }, - }); - } else if (message.state.pixels != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - neopixel: message.state.pixels, - }, - }, - }); - } else if (message.state.white_leds != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - isWhiteLedOn: message.state.white_leds, - }, - }, - }); - } else if (message.state.red_led != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - isRedLedOn: message.state.red_led, - }, - }, - }); - } - } + protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { + event.stopPropagation(); + if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(key, active); + if (key === BUTTONS_KEYS.BTN_A) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active + ); + } else if (key === BUTTONS_KEYS.BTN_B) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active + ); + } else if (key === BUTTONS_KEYS.BTN_AB) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active + ); + } + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active + ); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { + this.togglePlayClick(); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { + this.refreshSimulatorClick(); + } + } + protected handleStateChangeMessage(message: any) { + if (message.state.display_base64 != null) { + this.setState({ + clue: { + ...this.state.clue, + displayMessage: message.state.display_base64, + }, + }); + } else if (message.state.pixels != null) { + this.setState({ + clue: { + ...this.state.clue, + leds: { + ...this.state.clue.leds, + neopixel: message.state.pixels, + }, + }, + }); + } else if (message.state.white_leds != null) { + this.setState({ + clue: { + ...this.state.clue, + leds: { + ...this.state.clue.leds, + isWhiteLedOn: message.state.white_leds, + }, + }, + }); + } else if (message.state.red_led != null) { + this.setState({ + clue: { + ...this.state.clue, + leds: { + ...this.state.clue.leds, + isRedLedOn: message.state.red_led, + }, + }, + }); + } + } } ClueSimulator.contextType = ViewStateContext; diff --git a/Source/view/components/clue/Clue_svg.tsx b/Source/view/components/clue/Clue_svg.tsx index 2f09d3321..b67b1f0f9 100644 --- a/Source/view/components/clue/Clue_svg.tsx +++ b/Source/view/components/clue/Clue_svg.tsx @@ -7,1169 +7,1178 @@ import "../../styles/SimulatorSvg.css"; import svg from "../cpx/Svg_utils"; import { DEFAULT_CLUE_STATE } from "./ClueSimulator"; export interface IRefObject { - [key: string]: React.RefObject; + [key: string]: React.RefObject; } interface IProps { - displayImage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; + displayImage: string; + leds: { + neopixel: number[]; + isRedLedOn: boolean; + isWhiteLedOn: boolean; + }; } export class ClueSvg extends React.Component { - private svgRef: React.RefObject = React.createRef(); - private ledsRefs = { - neopixel: React.createRef(), - redLed: React.createRef(), - whiteLeds: [ - React.createRef(), - React.createRef(), - ], - }; - private gradientRefs = { - neopixel: React.createRef(), - whiteLed: React.createRef(), - redLed: React.createRef(), - }; + private svgRef: React.RefObject = React.createRef(); + private ledsRefs = { + neopixel: React.createRef(), + redLed: React.createRef(), + whiteLeds: [ + React.createRef(), + React.createRef(), + ], + }; + private gradientRefs = { + neopixel: React.createRef(), + whiteLed: React.createRef(), + redLed: React.createRef(), + }; - private buttonRefs: IRefObject = { - BTN_A: React.createRef(), - BTN_B: React.createRef(), - BTN_AB: React.createRef(), - }; + private buttonRefs: IRefObject = { + BTN_A: React.createRef(), + BTN_B: React.createRef(), + BTN_AB: React.createRef(), + }; - private displayRef: React.RefObject = React.createRef(); + private displayRef: React.RefObject = React.createRef(); - public getSvgRef(): React.RefObject { - return this.svgRef; - } - public getButtons(): IRefObject { - return this.buttonRefs; - } - public getDisplayRef(): React.RefObject { - return this.displayRef; - } - componentDidMount() { - this.updateSvg(); - } - componentDidUpdate() { - this.updateSvg(); - } + public getSvgRef(): React.RefObject { + return this.svgRef; + } + public getButtons(): IRefObject { + return this.buttonRefs; + } + public getDisplayRef(): React.RefObject { + return this.displayRef; + } + componentDidMount() { + this.updateSvg(); + } + componentDidUpdate() { + this.updateSvg(); + } - render() { - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + render() { + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - A+B - - - + + + + + + + + + + + + + + + + + + + + + + + + + + A+B + + + - - - - - - - LIGHT - - - GESTURE - - - P - - R - - - O - - - XIMI - - - T - - - Y - - - - - - - - - - - - - - Red LED - - - - - Neopixel - - - - -
- ); - } - private updateSvg() { - this.updateDisplay(); - this.updateNeopixel(); - this.updateLeds(); - } + + + + + + + LIGHT + + + GESTURE + + + P + + R + + + O + + + XIMI + + + T + + + Y + + + + + + + + + + + + + + Red LED + + + + + Neopixel + + + + +
+ ); + } + private updateSvg() { + this.updateDisplay(); + this.updateNeopixel(); + this.updateLeds(); + } - private updateDisplay() { - if (this.props.displayImage) { - this.displayRef.current?.setAttribute( - "href", - `data:image/png;base64,${this.props.displayImage}` - ); - } - } + private updateDisplay() { + if (this.props.displayImage) { + this.displayRef.current?.setAttribute( + "href", + `data:image/png;base64,${this.props.displayImage}` + ); + } + } - private updateNeopixel() { - const { neopixel } = this.props.leds; - const rgbColor = `rgb(${ - neopixel[0] + (255 - neopixel[0]) * CONSTANTS.LED_TINT_FACTOR - }, - ${neopixel[1] + (255 - neopixel[1]) * CONSTANTS.LED_TINT_FACTOR},${ - neopixel[2] + (255 - neopixel[2]) * CONSTANTS.LED_TINT_FACTOR - })`; + private updateNeopixel() { + const { neopixel } = this.props.leds; + const rgbColor = `rgb(${neopixel[0] + + (255 - neopixel[0]) * CONSTANTS.LED_TINT_FACTOR}, + ${neopixel[1] + + (255 - neopixel[1]) * CONSTANTS.LED_TINT_FACTOR},${neopixel[2] + + (255 - neopixel[2]) * CONSTANTS.LED_TINT_FACTOR})`; - this.ledsRefs.neopixel.current?.setAttribute("fill", rgbColor); + this.ledsRefs.neopixel.current?.setAttribute("fill", rgbColor); - if (neopixel === DEFAULT_CLUE_STATE.leds.neopixel) { - this.gradientRefs.neopixel.current?.setAttribute( - "stop-opacity", - "0" - ); - } else { - this.gradientRefs.neopixel.current?.setAttribute( - "stop-opacity", - "1" - ); - } - this.gradientRefs.neopixel.current?.setAttribute( - "stop-color", - rgbColor - ); - } - private updateLeds() { - // update white led - const { isWhiteLedOn, isRedLedOn } = this.props.leds; + if (neopixel === DEFAULT_CLUE_STATE.leds.neopixel) { + this.gradientRefs.neopixel.current?.setAttribute( + "stop-opacity", + "0" + ); + } else { + this.gradientRefs.neopixel.current?.setAttribute( + "stop-opacity", + "1" + ); + } + this.gradientRefs.neopixel.current?.setAttribute( + "stop-color", + rgbColor + ); + } + private updateLeds() { + // update white led + const { isWhiteLedOn, isRedLedOn } = this.props.leds; - this.ledsRefs.whiteLeds.map( - (ledRef: React.RefObject) => { - svg.setLed( - isWhiteLedOn, - CLUE_LEDS_COLORS.WHITE_LEDS_OFF, - CLUE_LEDS_COLORS.WHITE_LEDS_ON, - ledRef.current, - this.gradientRefs.whiteLed.current - ); - } - ); - svg.setLed( - isRedLedOn, - CLUE_LEDS_COLORS.RED_LED_OFF, - CLUE_LEDS_COLORS.RED_LED_ON, - this.ledsRefs.redLed.current, - this.gradientRefs.redLed.current - ); - } + this.ledsRefs.whiteLeds.map( + (ledRef: React.RefObject) => { + svg.setLed( + isWhiteLedOn, + CLUE_LEDS_COLORS.WHITE_LEDS_OFF, + CLUE_LEDS_COLORS.WHITE_LEDS_ON, + ledRef.current, + this.gradientRefs.whiteLed.current + ); + } + ); + svg.setLed( + isRedLedOn, + CLUE_LEDS_COLORS.RED_LED_OFF, + CLUE_LEDS_COLORS.RED_LED_ON, + this.ledsRefs.redLed.current, + this.gradientRefs.redLed.current + ); + } } diff --git a/Source/view/components/cpx/Accessibility_utils.ts b/Source/view/components/cpx/Accessibility_utils.ts index 1ce8d7559..afdadb2ac 100644 --- a/Source/view/components/cpx/Accessibility_utils.ts +++ b/Source/view/components/cpx/Accessibility_utils.ts @@ -3,24 +3,24 @@ // Helpers designed to help to make a simulator accessible. namespace accessibility { - export function makeFocusable(elem: SVGElement): void { - elem.setAttribute("focusable", "true"); - elem.setAttribute("tabindex", "0"); - } + export function makeFocusable(elem: SVGElement): void { + elem.setAttribute("focusable", "true"); + elem.setAttribute("tabindex", "0"); + } - export function setAria( - elem: Element, - role?: string, - label?: string - ): void { - if (role && !elem.hasAttribute("role")) { - elem.setAttribute("role", role); - } + export function setAria( + elem: Element, + role?: string, + label?: string + ): void { + if (role && !elem.hasAttribute("role")) { + elem.setAttribute("role", role); + } - if (label && !elem.hasAttribute("aria-label")) { - elem.setAttribute("aria-label", label); - } - } + if (label && !elem.hasAttribute("aria-label")) { + elem.setAttribute("aria-label", label); + } + } } export default accessibility; diff --git a/Source/view/components/cpx/Cpx.spec.tsx b/Source/view/components/cpx/Cpx.spec.tsx index 229140637..3b5bdfb6a 100644 --- a/Source/view/components/cpx/Cpx.spec.tsx +++ b/Source/view/components/cpx/Cpx.spec.tsx @@ -5,25 +5,25 @@ import * as testRenderer from "react-test-renderer"; import { Cpx } from "./Cpx"; describe("CPX component", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/components/cpx/Cpx.tsx b/Source/view/components/cpx/Cpx.tsx index 2da890fac..02560623a 100644 --- a/Source/view/components/cpx/Cpx.tsx +++ b/Source/view/components/cpx/Cpx.tsx @@ -10,95 +10,95 @@ import Simulator from "./CpxSimulator"; // Component grouping the functionality for circuit playground express const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - }, + sensors: { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT]: 0, + [SENSOR_LIST.MOTION_X]: 0, + [SENSOR_LIST.MOTION_Y]: 0, + [SENSOR_LIST.MOTION_Z]: 0, + }, }; export class Cpx extends React.Component { - state = DEFAULT_STATE; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } + state = DEFAULT_STATE; + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + handleMessage = (event: any): void => { + const message = event.data; - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.RESET: + this.setState({ ...DEFAULT_STATE }); + break; + } + }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; + render() { + return ( + + + + + ); + } + updateSensor = (sensor: SENSOR_LIST, value: number) => { + this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); + }; } const CPX_TOOLBAR_BUTTONS: Array<{ label: any; image: any }> = [ - { - image: TOOLBAR_SVG.SLIDER_SWITCH_SVG, - label: CPX_TOOLBAR_ICON_ID.SWITCH, - }, - { - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - label: CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, - }, - { - image: TOOLBAR_SVG.RED_LED_SVG, - label: CPX_TOOLBAR_ICON_ID.RED_LED, - }, - { - image: TOOLBAR_SVG.SOUND_SVG, - label: CPX_TOOLBAR_ICON_ID.SOUND, - }, - { - image: TOOLBAR_SVG.TEMPERATURE_SVG, - label: CPX_TOOLBAR_ICON_ID.TEMPERATURE, - }, - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: CPX_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.NEO_PIXEL_SVG, - label: CPX_TOOLBAR_ICON_ID.NEO_PIXEL, - }, - { - image: TOOLBAR_SVG.SPEAKER_SVG, - label: CPX_TOOLBAR_ICON_ID.SPEAKER, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: CPX_TOOLBAR_ICON_ID.MOTION, - }, - { - image: TOOLBAR_SVG.IR_SVG, - label: CPX_TOOLBAR_ICON_ID.IR, - }, - { - image: TOOLBAR_SVG.GPIO_SVG, - label: CPX_TOOLBAR_ICON_ID.GPIO, - }, + { + image: TOOLBAR_SVG.SLIDER_SWITCH_SVG, + label: CPX_TOOLBAR_ICON_ID.SWITCH, + }, + { + image: TOOLBAR_SVG.PUSH_BUTTON_SVG, + label: CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, + }, + { + image: TOOLBAR_SVG.RED_LED_SVG, + label: CPX_TOOLBAR_ICON_ID.RED_LED, + }, + { + image: TOOLBAR_SVG.SOUND_SVG, + label: CPX_TOOLBAR_ICON_ID.SOUND, + }, + { + image: TOOLBAR_SVG.TEMPERATURE_SVG, + label: CPX_TOOLBAR_ICON_ID.TEMPERATURE, + }, + { + image: TOOLBAR_SVG.LIGHT_SVG, + label: CPX_TOOLBAR_ICON_ID.LIGHT, + }, + { + image: TOOLBAR_SVG.NEO_PIXEL_SVG, + label: CPX_TOOLBAR_ICON_ID.NEO_PIXEL, + }, + { + image: TOOLBAR_SVG.SPEAKER_SVG, + label: CPX_TOOLBAR_ICON_ID.SPEAKER, + }, + { + image: TOOLBAR_SVG.MOTION_SVG, + label: CPX_TOOLBAR_ICON_ID.MOTION, + }, + { + image: TOOLBAR_SVG.IR_SVG, + label: CPX_TOOLBAR_ICON_ID.IR, + }, + { + image: TOOLBAR_SVG.GPIO_SVG, + label: CPX_TOOLBAR_ICON_ID.GPIO, + }, ]; diff --git a/Source/view/components/cpx/CpxImage.tsx b/Source/view/components/cpx/CpxImage.tsx index b56b7a31c..48aef4e64 100644 --- a/Source/view/components/cpx/CpxImage.tsx +++ b/Source/view/components/cpx/CpxImage.tsx @@ -9,400 +9,398 @@ import * as SvgStyle from "./Cpx_svg_style"; import svg from "./Svg_utils"; interface IProps { - pixels: number[][]; - red_led: boolean; - brightness: number; - switch: boolean; - on: boolean; - onKeyEvent: (event: KeyboardEvent, active: boolean) => void; - onMouseUp: (button: HTMLElement, event: Event) => void; - onMouseDown: (button: HTMLElement, event: Event) => void; - onMouseLeave: (button: HTMLElement, event: Event) => void; + pixels: number[][]; + red_led: boolean; + brightness: number; + switch: boolean; + on: boolean; + onKeyEvent: (event: KeyboardEvent, active: boolean) => void; + onMouseUp: (button: HTMLElement, event: Event) => void; + onMouseDown: (button: HTMLElement, event: Event) => void; + onMouseLeave: (button: HTMLElement, event: Event) => void; } export class CpxImage extends React.Component { - componentDidMount() { - const svgElement = window.document.getElementById("cpx_svg"); - if (svgElement) { - initSvgStyle(svgElement, this.props.brightness); - setupButtons(this.props); - setupPins(this.props); - this.setupKeyPresses(this.props.onKeyEvent); - setupSwitch(this.props); - this.updateImage(); - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - componentDidUpdate() { - this.updateImage(); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the switch, run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.S) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.onKeyEvent(event, true); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.onKeyEvent(event, false); - }; - render() { - return CPX_SVG; - } - private updateImage() { - updateNeopixels(this.props); - updateRedLED(this.props.red_led); - updatePowerLED(this.props.on); - updateSwitch(this.props.switch); - } + componentDidMount() { + const svgElement = window.document.getElementById("cpx_svg"); + if (svgElement) { + initSvgStyle(svgElement, this.props.brightness); + setupButtons(this.props); + setupPins(this.props); + this.setupKeyPresses(this.props.onKeyEvent); + setupSwitch(this.props); + this.updateImage(); + } + } + componentWillUnmount() { + window.document.removeEventListener("keydown", this.handleKeyDown); + window.document.removeEventListener("keyup", this.handleKeyUp); + } + componentDidUpdate() { + this.updateImage(); + } + setupKeyPresses = ( + onKeyEvent: (event: KeyboardEvent, active: boolean) => void + ) => { + window.document.addEventListener("keydown", this.handleKeyDown); + window.document.addEventListener("keyup", this.handleKeyUp); + }; + + handleKeyDown = (event: KeyboardEvent) => { + const keyEvents = [event.key, event.code]; + // Don't listen to keydown events for the switch, run button, restart button and enter key + if ( + !( + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.S) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) + ) + ) { + this.props.onKeyEvent(event, true); + } + }; + handleKeyUp = (event: KeyboardEvent) => { + this.props.onKeyEvent(event, false); + }; + render() { + return CPX_SVG; + } + private updateImage() { + updateNeopixels(this.props); + updateRedLED(this.props.red_led); + updatePowerLED(this.props.on); + updateSwitch(this.props.switch); + } } const makeButton = ( - g: SVGElement, - left: number, - top: number, - id: string + g: SVGElement, + left: number, + top: number, + id: string ): { outer: SVGElement; inner: SVGElement } => { - const buttonCornerRadius = SvgStyle.BUTTON_CORNER_RADIUS; - const buttonWidth = SvgStyle.BUTTON_WIDTH; - const buttonCircleRadius = SvgStyle.BUTTON_CIRCLE_RADIUS; - const btng = svg.child(g, "g", { class: "sim-button-group" }); - svg.child(btng, "rect", { - fill: SvgStyle.BUTTON_OUTER, - height: buttonWidth, - id: id + "_OUTER", - rx: buttonCornerRadius, - ry: buttonCornerRadius, - width: buttonWidth, - x: left, - y: top, - }); - - const outer = btng; - const inner = svg.child(btng, "circle", { - id: id + "_INNER", - cx: left + buttonWidth / 2, - cy: top + buttonWidth / 2, - r: buttonCircleRadius, - fill: SvgStyle.BUTTON_NEUTRAL, - }); - - return { outer, inner }; + const buttonCornerRadius = SvgStyle.BUTTON_CORNER_RADIUS; + const buttonWidth = SvgStyle.BUTTON_WIDTH; + const buttonCircleRadius = SvgStyle.BUTTON_CIRCLE_RADIUS; + const btng = svg.child(g, "g", { class: "sim-button-group" }); + svg.child(btng, "rect", { + fill: SvgStyle.BUTTON_OUTER, + height: buttonWidth, + id: id + "_OUTER", + rx: buttonCornerRadius, + ry: buttonCornerRadius, + width: buttonWidth, + x: left, + y: top, + }); + + const outer = btng; + const inner = svg.child(btng, "circle", { + id: id + "_INNER", + cx: left + buttonWidth / 2, + cy: top + buttonWidth / 2, + r: buttonCircleRadius, + fill: SvgStyle.BUTTON_NEUTRAL, + }); + + return { outer, inner }; }; const initSvgStyle = (svgElement: HTMLElement, brightness: number): void => { - const style: SVGStyleElement = svg.child( - svgElement, - "style", - {} - ) as SVGStyleElement; - style.textContent = SvgStyle.SVG_STYLE; - - // Filters for the glow effect (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) - const defs: SVGDefsElement = svg.child( - svgElement, - "defs", - {} - ) as SVGDefsElement; - - const g = svg.createElement("g") as SVGElement; - svgElement.appendChild(g); - - const glow = svg.child(defs, "filter", { - height: "120%", - id: "filterglow", - width: "120%", - x: "-5%", - y: "-5%", - }); - svg.child(glow, "feGaussianBlur", { stdDeviation: "5", result: "glow" }); - const merge = svg.child(glow, "feMerge", {}); - for (let i = 0; i < 3; ++i) { - svg.child(merge, "feMergeNode", { in: "glow" }); - } - - const neopixelglow = svg.child(defs, "filter", { - height: "600%", - id: "neopixelglow", - width: "600%", - x: "-300%", - y: "-300%", - }); - svg.child(neopixelglow, "feGaussianBlur", { - result: "coloredBlur", - stdDeviation: "4.3", - }); - const neopixelmerge = svg.child(neopixelglow, "feMerge", {}); - svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); - svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); - svg.child(neopixelmerge, "feMergeNode", { in: "SourceGraphic" }); - - // Brightness - const neopixelfeComponentTransfer = svg.child( - neopixelglow, - "feComponentTransfer", - {} - ); - svg.child(neopixelfeComponentTransfer, "feFuncR", { - id: "brightnessFilterR", - type: "linear", - slope: brightness, - }); - svg.child(neopixelfeComponentTransfer, "feFuncG", { - id: "brightnessFilterG", - slope: brightness, - type: "linear", - }); - svg.child(neopixelfeComponentTransfer, "feFuncB", { - id: "brightnessFilterB", - slope: brightness, - type: "linear", - }); - - // BTN A+B - const outerBtn = (left: number, top: number, label: string) => { - return makeButton(g, left, top, "BTN_AB"); - }; - - const ab = outerBtn(165, SvgStyle.MB_HEIGHT - 15, "A+B"); - const abtext = svg.child(ab.outer, "text", { - class: "sim-text-outside", - x: SvgStyle.BUTTON_TEXT_BASELINE, - y: SvgStyle.MB_HEIGHT - 18, - }) as SVGTextElement; - abtext.textContent = "A+B"; + const style: SVGStyleElement = svg.child( + svgElement, + "style", + {} + ) as SVGStyleElement; + style.textContent = SvgStyle.SVG_STYLE; + + // Filters for the glow effect (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) + const defs: SVGDefsElement = svg.child( + svgElement, + "defs", + {} + ) as SVGDefsElement; + + const g = svg.createElement("g") as SVGElement; + svgElement.appendChild(g); + + const glow = svg.child(defs, "filter", { + height: "120%", + id: "filterglow", + width: "120%", + x: "-5%", + y: "-5%", + }); + svg.child(glow, "feGaussianBlur", { stdDeviation: "5", result: "glow" }); + const merge = svg.child(glow, "feMerge", {}); + for (let i = 0; i < 3; ++i) { + svg.child(merge, "feMergeNode", { in: "glow" }); + } + + const neopixelglow = svg.child(defs, "filter", { + height: "600%", + id: "neopixelglow", + width: "600%", + x: "-300%", + y: "-300%", + }); + svg.child(neopixelglow, "feGaussianBlur", { + result: "coloredBlur", + stdDeviation: "4.3", + }); + const neopixelmerge = svg.child(neopixelglow, "feMerge", {}); + svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); + svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); + svg.child(neopixelmerge, "feMergeNode", { in: "SourceGraphic" }); + + // Brightness + const neopixelfeComponentTransfer = svg.child( + neopixelglow, + "feComponentTransfer", + {} + ); + svg.child(neopixelfeComponentTransfer, "feFuncR", { + id: "brightnessFilterR", + type: "linear", + slope: brightness, + }); + svg.child(neopixelfeComponentTransfer, "feFuncG", { + id: "brightnessFilterG", + slope: brightness, + type: "linear", + }); + svg.child(neopixelfeComponentTransfer, "feFuncB", { + id: "brightnessFilterB", + slope: brightness, + type: "linear", + }); + + // BTN A+B + const outerBtn = (left: number, top: number, label: string) => { + return makeButton(g, left, top, "BTN_AB"); + }; + + const ab = outerBtn(165, SvgStyle.MB_HEIGHT - 15, "A+B"); + const abtext = svg.child(ab.outer, "text", { + class: "sim-text-outside", + x: SvgStyle.BUTTON_TEXT_BASELINE, + y: SvgStyle.MB_HEIGHT - 18, + }) as SVGTextElement; + abtext.textContent = "A+B"; }; const updateNeopixels = (props: IProps): void => { - for (let i = 0; i < props.pixels.length; i++) { - const led = window.document.getElementById(`NEOPIXEL_${i}`); - if (led) { - setNeopixel(led, props.pixels[i], props.brightness); - } - } + for (let i = 0; i < props.pixels.length; i++) { + const led = window.document.getElementById(`NEOPIXEL_${i}`); + if (led) { + setNeopixel(led, props.pixels[i], props.brightness); + } + } }; const updateRedLED = (propsRedLED: boolean): void => { - const redLED = window.document.getElementById("SERIAL_LED"); - if (redLED) { - redLED.style.fill = propsRedLED - ? SvgStyle.RED_LED_ON - : SvgStyle.RED_LED_OFF; - } + const redLED = window.document.getElementById("SERIAL_LED"); + if (redLED) { + redLED.style.fill = propsRedLED + ? SvgStyle.RED_LED_ON + : SvgStyle.RED_LED_OFF; + } }; const updatePowerLED = (propsPowerLED: boolean): void => { - const powerLED = window.document.getElementById("PWR_LED"); - if (powerLED) { - powerLED.style.fill = propsPowerLED - ? SvgStyle.POWER_LED_ON - : SvgStyle.POWER_LED_OFF; - } + const powerLED = window.document.getElementById("PWR_LED"); + if (powerLED) { + powerLED.style.fill = propsPowerLED + ? SvgStyle.POWER_LED_ON + : SvgStyle.POWER_LED_OFF; + } }; const setNeopixel = ( - led: HTMLElement, - pixValue: number[], - brightness: number + led: HTMLElement, + pixValue: number[], + brightness: number ): void => { - if (isLightOn(pixValue) && brightness > 0) { - // Neopixels style (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) - changeBrightness("brightnessFilterR", brightness); - changeBrightness("brightnessFilterG", brightness); - changeBrightness("brightnessFilterB", brightness); - - let [hue, sat, lum] = SvgStyle.rgbToHsl([ - pixValue[0], - pixValue[1], - pixValue[2], - ]); - const innerLum = Math.max( - lum * SvgStyle.INTENSITY_FACTOR, - SvgStyle.MIN_INNER_LUM - ); - lum = (lum * 90) / 100 + 10; // at least 10% luminosity for the stroke - - led.style.filter = `url(#neopixelglow)`; - led.style.fill = `hsl(${hue}, ${sat}%, ${innerLum}%)`; - led.style.stroke = `hsl(${hue}, ${sat}%, ${Math.min( - lum * 3, - SvgStyle.MAX_STROKE_LUM - )}%)`; - led.style.strokeWidth = `1.5`; - } else { - led.style.fill = SvgStyle.OFF_COLOR; - led.style.filter = `none`; - led.style.stroke = `none`; - } + if (isLightOn(pixValue) && brightness > 0) { + // Neopixels style (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) + changeBrightness("brightnessFilterR", brightness); + changeBrightness("brightnessFilterG", brightness); + changeBrightness("brightnessFilterB", brightness); + + let [hue, sat, lum] = SvgStyle.rgbToHsl([ + pixValue[0], + pixValue[1], + pixValue[2], + ]); + const innerLum = Math.max( + lum * SvgStyle.INTENSITY_FACTOR, + SvgStyle.MIN_INNER_LUM + ); + lum = (lum * 90) / 100 + 10; // at least 10% luminosity for the stroke + + led.style.filter = `url(#neopixelglow)`; + led.style.fill = `hsl(${hue}, ${sat}%, ${innerLum}%)`; + led.style.stroke = `hsl(${hue}, ${sat}%, ${Math.min( + lum * 3, + SvgStyle.MAX_STROKE_LUM + )}%)`; + led.style.strokeWidth = `1.5`; + } else { + led.style.fill = SvgStyle.OFF_COLOR; + led.style.filter = `none`; + led.style.stroke = `none`; + } }; const isLightOn = (pixValue: number[]): boolean => { - return !pixValue.every((val) => { - return val === 0; - }); + return !pixValue.every(val => { + return val === 0; + }); }; const changeBrightness = (filterID: string, brightness: number): void => { - const brightnessFilter: HTMLElement | null = - window.document.getElementById(filterID); - if (brightnessFilter) { - brightnessFilter.setAttribute("slope", brightness.toString()); - } + const brightnessFilter: HTMLElement | null = window.document.getElementById( + filterID + ); + if (brightnessFilter) { + brightnessFilter.setAttribute("slope", brightness.toString()); + } }; const setupButtons = (props: IProps): void => { - const outButtons = ["A_OUTER", "B_OUTER", "AB_OUTER"]; - const inButtons = ["A_INNER", "B_INNER", "AB_INNER"]; - outButtons.forEach((buttonName) => { - const button = window.document.getElementById("BTN_" + buttonName); - - if (button) { - setupButton(button, "sim-button-outer", props); - } - }); - inButtons.forEach((buttonName) => { - const button = window.document.getElementById("BTN_" + buttonName); - if (button) { - setupButton(button, "sim-button", props); - } - }); + const outButtons = ["A_OUTER", "B_OUTER", "AB_OUTER"]; + const inButtons = ["A_INNER", "B_INNER", "AB_INNER"]; + outButtons.forEach(buttonName => { + const button = window.document.getElementById("BTN_" + buttonName); + + if (button) { + setupButton(button, "sim-button-outer", props); + } + }); + inButtons.forEach(buttonName => { + const button = window.document.getElementById("BTN_" + buttonName); + if (button) { + setupButton(button, "sim-button", props); + } + }); }; const setupPins = (props: IProps): void => { - const pins = [ - "PIN_A1", - "PIN_A2", - "PIN_A3", - "PIN_A4", - "PIN_A5", - "PIN_A6", - "PIN_A7", - ]; - pins.forEach((pinName) => { - const pin = window.document.getElementById(pinName); - - if (pin) { - const svgPin = pin as unknown as SVGElement; - svg.addClass(svgPin, `sim-${pinName}-touch`); - accessibility.makeFocusable(svgPin); - svgPin.onmouseup = (e) => props.onMouseUp(pin, e); - svgPin.onkeyup = (e) => props.onKeyEvent(e, false); - svgPin.onmousedown = (e) => props.onMouseDown(pin, e); - svgPin.onkeydown = (e) => props.onKeyEvent(e, true); - accessibility.setAria( - svgPin, - "button", - `Touch pin ${pinName.substr(pinName.length - 2)}` - ); - } - }); + const pins = [ + "PIN_A1", + "PIN_A2", + "PIN_A3", + "PIN_A4", + "PIN_A5", + "PIN_A6", + "PIN_A7", + ]; + pins.forEach(pinName => { + const pin = window.document.getElementById(pinName); + + if (pin) { + const svgPin = (pin as unknown) as SVGElement; + svg.addClass(svgPin, `sim-${pinName}-touch`); + accessibility.makeFocusable(svgPin); + svgPin.onmouseup = e => props.onMouseUp(pin, e); + svgPin.onkeyup = e => props.onKeyEvent(e, false); + svgPin.onmousedown = e => props.onMouseDown(pin, e); + svgPin.onkeydown = e => props.onKeyEvent(e, true); + accessibility.setAria( + svgPin, + "button", + `Touch pin ${pinName.substr(pinName.length - 2)}` + ); + } + }); }; const addButtonLabels = (button: HTMLElement) => { - let label = ""; - if (button.id.match(/AB/) !== null) { - label = "a+b"; - } else if (button.id.match(/A/) !== null) { - label = "a"; - } else if (button.id.match(/B/) !== null) { - label = "b"; - } - accessibility.setAria(button, "button", label); + let label = ""; + if (button.id.match(/AB/) !== null) { + label = "a+b"; + } else if (button.id.match(/A/) !== null) { + label = "a"; + } else if (button.id.match(/B/) !== null) { + label = "b"; + } + accessibility.setAria(button, "button", label); }; const setupButton = (button: HTMLElement, className: string, props: IProps) => { - const svgButton = button as unknown as SVGElement; - svg.addClass(svgButton, className); - addButtonLabels(button); - if (className.match(/outer/) !== null) { - accessibility.makeFocusable(svgButton); - } - svgButton.onmousedown = (e) => props.onMouseDown(button, e); - svgButton.onmouseup = (e) => props.onMouseUp(button, e); - svgButton.onkeydown = (e) => { - // ensure that the keydown is enter. - // Or else, if the key is a shortcut instead, - // it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - props.onKeyEvent(e, true); - } - }; - svgButton.onkeyup = (e) => props.onKeyEvent(e, false); - svgButton.onmouseleave = (e) => props.onMouseLeave(button, e); + const svgButton = (button as unknown) as SVGElement; + svg.addClass(svgButton, className); + addButtonLabels(button); + if (className.match(/outer/) !== null) { + accessibility.makeFocusable(svgButton); + } + svgButton.onmousedown = e => props.onMouseDown(button, e); + svgButton.onmouseup = e => props.onMouseUp(button, e); + svgButton.onkeydown = e => { + // ensure that the keydown is enter. + // Or else, if the key is a shortcut instead, + // it may register shortcuts twice + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + props.onKeyEvent(e, true); + } + }; + svgButton.onkeyup = e => props.onKeyEvent(e, false); + svgButton.onmouseleave = e => props.onMouseLeave(button, e); }; const setupSwitch = (props: IProps): void => { - const switchElement = window.document.getElementById("SWITCH"); - const swInnerElement = window.document.getElementById("SWITCH_INNER"); - const swHousingElement = window.document.getElementById("SWITCH_HOUSING"); - - if (switchElement && swInnerElement && swHousingElement) { - const svgSwitch: SVGElement = switchElement as unknown as SVGElement; - const svgSwitchInner: SVGElement = - swInnerElement as unknown as SVGElement; - const svgSwitchHousing: SVGElement = - swHousingElement as unknown as SVGElement; - - svg.addClass(svgSwitch, "sim-slide-switch"); - - svgSwitch.onmouseup = (e) => props.onMouseUp(switchElement, e); - svgSwitchInner.onmouseup = (e) => props.onMouseUp(swInnerElement, e); - svgSwitchHousing.onmouseup = (e) => - props.onMouseUp(swHousingElement, e); - svgSwitch.onkeyup = (e) => props.onKeyEvent(e, false); - - accessibility.makeFocusable(svgSwitch); - accessibility.setAria(svgSwitch, "button", "On/Off Switch"); - } + const switchElement = window.document.getElementById("SWITCH"); + const swInnerElement = window.document.getElementById("SWITCH_INNER"); + const swHousingElement = window.document.getElementById("SWITCH_HOUSING"); + + if (switchElement && swInnerElement && swHousingElement) { + const svgSwitch: SVGElement = (switchElement as unknown) as SVGElement; + const svgSwitchInner: SVGElement = (swInnerElement as unknown) as SVGElement; + const svgSwitchHousing: SVGElement = (swHousingElement as unknown) as SVGElement; + + svg.addClass(svgSwitch, "sim-slide-switch"); + + svgSwitch.onmouseup = e => props.onMouseUp(switchElement, e); + svgSwitchInner.onmouseup = e => props.onMouseUp(swInnerElement, e); + svgSwitchHousing.onmouseup = e => props.onMouseUp(swHousingElement, e); + svgSwitch.onkeyup = e => props.onKeyEvent(e, false); + + accessibility.makeFocusable(svgSwitch); + accessibility.setAria(svgSwitch, "button", "On/Off Switch"); + } }; export const updateSwitch = (switchState: boolean): void => { - const switchElement = window.document.getElementById("SWITCH"); - const switchInner = window.document.getElementById( - "SWITCH_INNER" - ) as unknown as SVGElement; - - if (switchElement && switchInner) { - svg.addClass(switchInner, "sim-slide-switch-inner"); - - if (!switchState) { - svg.addClass(switchInner, "on"); - switchInner.setAttribute("transform", "translate(-5,0)"); - } else { - svg.removeClass(switchInner, "on"); - switchInner.removeAttribute("transform"); - } - switchElement.setAttribute("aria-pressed", switchState.toString()); - } + const switchElement = window.document.getElementById("SWITCH"); + const switchInner = (window.document.getElementById( + "SWITCH_INNER" + ) as unknown) as SVGElement; + + if (switchElement && switchInner) { + svg.addClass(switchInner, "sim-slide-switch-inner"); + + if (!switchState) { + svg.addClass(switchInner, "on"); + switchInner.setAttribute("transform", "translate(-5,0)"); + } else { + svg.removeClass(switchInner, "on"); + switchInner.removeAttribute("transform"); + } + switchElement.setAttribute("aria-pressed", switchState.toString()); + } }; export const updatePinTouch = (pinState: boolean, id: string): void => { - console.log(`updating ${id} with ${pinState}`); - const pinElement = window.document.getElementById(id); - const pinSvg: SVGElement = pinElement as unknown as SVGElement; - - if (pinElement && pinSvg) { - pinElement.setAttribute("aria-pressed", pinState.toString()); - pinState - ? svg.addClass(pinSvg, "pin-pressed") - : svg.removeClass(pinSvg, "pin-pressed"); - } + console.log(`updating ${id} with ${pinState}`); + const pinElement = window.document.getElementById(id); + const pinSvg: SVGElement = (pinElement as unknown) as SVGElement; + + if (pinElement && pinSvg) { + pinElement.setAttribute("aria-pressed", pinState.toString()); + pinState + ? svg.addClass(pinSvg, "pin-pressed") + : svg.removeClass(pinSvg, "pin-pressed"); + } }; export default CpxImage; diff --git a/Source/view/components/cpx/CpxSimulator.tsx b/Source/view/components/cpx/CpxSimulator.tsx index 7e095043b..b0d77f441 100644 --- a/Source/view/components/cpx/CpxSimulator.tsx +++ b/Source/view/components/cpx/CpxSimulator.tsx @@ -13,380 +13,380 @@ import { BUTTON_NEUTRAL, BUTTON_PRESSED } from "./Cpx_svg_style"; import { CpxImage, updatePinTouch, updateSwitch } from "./CpxImage"; interface ICpxState { - pixels: number[][]; - brightness: number; - red_led: boolean; - button_a: boolean; - button_b: boolean; - switch: boolean; - touch: boolean[]; - shake: boolean; + pixels: number[][]; + brightness: number; + red_led: boolean; + button_a: boolean; + button_b: boolean; + switch: boolean; + touch: boolean[]; + shake: boolean; } interface IState { - active_editors: string[]; - running_file: string; - selected_file: string; - cpx: ICpxState; - play_button: boolean; - currently_selected_file: string; + active_editors: string[]; + running_file: string; + selected_file: string; + cpx: ICpxState; + play_button: boolean; + currently_selected_file: string; } const DEFAULT_CPX_STATE: ICpxState = { - brightness: 1.0, - button_a: false, - button_b: false, - pixels: [ - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - ], - red_led: false, - switch: false, - touch: [false, false, false, false, false, false, false], - shake: false, + brightness: 1.0, + button_a: false, + button_b: false, + pixels: [ + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + ], + red_led: false, + switch: false, + touch: [false, false, false, false, false, false, false], + shake: false, }; class Simulator extends React.Component<{}, IState> { - constructor(props: Readonly<{}>) { - super(props); - this.state = { - active_editors: [], - cpx: DEFAULT_CPX_STATE, - play_button: false, - running_file: "", - selected_file: "", - currently_selected_file: "", - }; - - this.handleClick = this.handleClick.bind(this); - this.onKeyEvent = this.onKeyEvent.bind(this); - this.onMouseDown = this.onMouseDown.bind(this); - this.onMouseUp = this.onMouseUp.bind(this); - this.onMouseLeave = this.onMouseLeave.bind(this); - this.togglePlayClick = this.togglePlayClick.bind(this); - this.refreshSimulatorClick = this.refreshSimulatorClick.bind(this); - } - - handleMessage = (event: any): void => { - const message = event.data; // The JSON data our extension sent - if (message.active_device !== DEVICE_LIST_KEY.CPX) { - return; - } - switch (message.command) { - case "reset-state": - console.log("Clearing the state"); - this.setState({ - cpx: DEFAULT_CPX_STATE, - play_button: false, - }); - break; - case "set-state": - console.log( - "Setting the state: " + JSON.stringify(message.state) - ); - this.setState({ - cpx: message.state, - play_button: true, - }); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - }); - break; - case "visible-editors": - console.log( - "Setting active editors", - message.state.activePythonEditors - ); - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - console.log("Setting current file", message.state.running_file); - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } - break; - } - }; - - componentDidMount() { - console.log("Mounted"); - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
-
- -
- -
- ); - } - - protected togglePlayClick() { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - } - - protected refreshSimulatorClick() { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - } - - protected onKeyEvent(event: KeyboardEvent, active: boolean) { - let element; - const target = event.target as SVGElement; - // Guard Clause - if (target === undefined) { - return; - } - - if ([event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER)) { - element = window.document.getElementById(target.id); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_A - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_B - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_AB - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.S) - ) { - element = window.document.getElementById(CONSTANTS.ID_NAME.SWITCH); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } else { - if (event.shiftKey) { - switch (event.code) { - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_ONE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A1 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_TWO: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A2 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_THREE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A3 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FOUR: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A4 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FIVE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A5 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SIX: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A6 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SEVEN: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A7 - ); - break; - } - } - } - if (element) { - event.preventDefault(); - this.handleClick(element, active); - element.focus(); - } - } - protected onMouseDown(button: HTMLElement, event: Event) { - event.preventDefault(); - this.handleClick(button, true); - button.focus(); - } - - protected onMouseUp(button: HTMLElement, event: Event) { - event.preventDefault(); - this.handleClick(button, false); - } - - protected onMouseLeave(button: HTMLElement, event: Event) { - event.preventDefault(); - - if (button.getAttribute("pressed") === "true") { - this.handleClick(button, false); - } - } - - private handleClick(element: HTMLElement, active: boolean) { - let newState; - let message; - if (element.id.includes("BTN")) { - newState = this.handleButtonClick(element, active); - message = "button-press"; - } else if (element.id.includes("SWITCH")) { - newState = this.handleSwitchClick(); - message = "button-press"; - } else if (element.id.includes("PIN")) { - newState = this.handleTouchPinClick(element, active); - message = "sensor-changed"; - } else { - return; - } - - if (newState && message) { - sendMessage(message, newState); - } - } - - private handleButtonClick(button: HTMLElement, active: boolean) { - const ButtonA: boolean = button.id.match(/BTN_A/) !== null; - const ButtonB: boolean = button.id.match(/BTN_B/) !== null; - const ButtonAB: boolean = button.id.match(/BTN_AB/) !== null; - let innerButton; - let newState; - - if (ButtonAB) { - innerButton = window.document.getElementById("BTN_AB_INNER"); - newState = { - button_a: active, - button_b: active, - }; - this.setState({ ...this.state, ...newState }); - } else if (ButtonA) { - innerButton = window.document.getElementById("BTN_A_INNER"); - newState = { - button_a: active, - }; - this.setState({ ...this.state, ...newState }); - } else if (ButtonB) { - innerButton = window.document.getElementById("BTN_B_INNER"); - newState = { - button_b: active, - }; - this.setState({ ...this.state, ...newState }); - } - - if (innerButton) { - innerButton.style.fill = this.getButtonColor(active); - } - - button.setAttribute("pressed", `${active}`); - return newState; - } - - private getButtonColor(pressed: boolean) { - const buttonUps = BUTTON_NEUTRAL; - const buttonDown = BUTTON_PRESSED; - return pressed ? buttonDown : buttonUps; - } - - private handleSwitchClick() { - const switchIsOn = !this.state.cpx.switch; - updateSwitch(switchIsOn); - this.setState({ - ...this.state, - cpx: { ...this.state.cpx, switch: switchIsOn }, - }); - return { switch: switchIsOn }; - } - - private handleTouchPinClick(pin: HTMLElement, active: boolean): any { - let cpxState = this.state.cpx; - const pinIndex = parseInt(pin.id.charAt(pin.id.length - 1)) - 1; - const pinState = cpxState.touch; - pinState[pinIndex] = active; - cpxState = { ...cpxState, touch: pinState }; - this.setState({ ...this.state, ...cpxState }); - updatePinTouch(active, pin.id); - return { touch: pinState }; - } + constructor(props: Readonly<{}>) { + super(props); + this.state = { + active_editors: [], + cpx: DEFAULT_CPX_STATE, + play_button: false, + running_file: "", + selected_file: "", + currently_selected_file: "", + }; + + this.handleClick = this.handleClick.bind(this); + this.onKeyEvent = this.onKeyEvent.bind(this); + this.onMouseDown = this.onMouseDown.bind(this); + this.onMouseUp = this.onMouseUp.bind(this); + this.onMouseLeave = this.onMouseLeave.bind(this); + this.togglePlayClick = this.togglePlayClick.bind(this); + this.refreshSimulatorClick = this.refreshSimulatorClick.bind(this); + } + + handleMessage = (event: any): void => { + const message = event.data; // The JSON data our extension sent + if (message.active_device !== DEVICE_LIST_KEY.CPX) { + return; + } + switch (message.command) { + case "reset-state": + console.log("Clearing the state"); + this.setState({ + cpx: DEFAULT_CPX_STATE, + play_button: false, + }); + break; + case "set-state": + console.log( + "Setting the state: " + JSON.stringify(message.state) + ); + this.setState({ + cpx: message.state, + play_button: true, + }); + break; + case "activate-play": + const newRunningFile = this.state.currently_selected_file; + + this.setState({ + play_button: !this.state.play_button, + running_file: newRunningFile, + }); + break; + case "visible-editors": + console.log( + "Setting active editors", + message.state.activePythonEditors + ); + this.setState({ + active_editors: message.state.activePythonEditors, + }); + break; + case "current-file": + console.log("Setting current file", message.state.running_file); + if (this.state.play_button) { + this.setState({ + currently_selected_file: message.state.running_file, + }); + } else { + this.setState({ + running_file: message.state.running_file, + currently_selected_file: message.state.running_file, + }); + } + break; + } + }; + + componentDidMount() { + console.log("Mounted"); + window.addEventListener("message", this.handleMessage); + } + + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + + render() { + const playStopImage = this.state.play_button ? StopLogo : PlayLogo; + const playStopLabel = this.state.play_button ? "stop" : "play"; + return ( +
+
+ {this.state.running_file && this.state.play_button + ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) + : CONSTANTS.FILES_PLACEHOLDER} +
+
+ +
+ +
+ ); + } + + protected togglePlayClick() { + const button = + window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || + window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { + selected_file: this.state.selected_file, + state: !this.state.play_button, + }); + } + + protected refreshSimulatorClick() { + const button = window.document.getElementById( + CONSTANTS.ID_NAME.REFRESH_BUTTON + ); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); + } + + protected onKeyEvent(event: KeyboardEvent, active: boolean) { + let element; + const target = event.target as SVGElement; + // Guard Clause + if (target === undefined) { + return; + } + + if ([event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER)) { + element = window.document.getElementById(target.id); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) + ) { + element = window.document.getElementById( + CONSTANTS.ID_NAME.BUTTON_A + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) + ) { + element = window.document.getElementById( + CONSTANTS.ID_NAME.BUTTON_B + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) + ) { + element = window.document.getElementById( + CONSTANTS.ID_NAME.BUTTON_AB + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.S) + ) { + element = window.document.getElementById(CONSTANTS.ID_NAME.SWITCH); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { + this.togglePlayClick(); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { + this.refreshSimulatorClick(); + } else { + if (event.shiftKey) { + switch (event.code) { + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_ONE: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A1 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_TWO: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A2 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_THREE: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A3 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FOUR: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A4 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FIVE: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A5 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SIX: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A6 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SEVEN: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A7 + ); + break; + } + } + } + if (element) { + event.preventDefault(); + this.handleClick(element, active); + element.focus(); + } + } + protected onMouseDown(button: HTMLElement, event: Event) { + event.preventDefault(); + this.handleClick(button, true); + button.focus(); + } + + protected onMouseUp(button: HTMLElement, event: Event) { + event.preventDefault(); + this.handleClick(button, false); + } + + protected onMouseLeave(button: HTMLElement, event: Event) { + event.preventDefault(); + + if (button.getAttribute("pressed") === "true") { + this.handleClick(button, false); + } + } + + private handleClick(element: HTMLElement, active: boolean) { + let newState; + let message; + if (element.id.includes("BTN")) { + newState = this.handleButtonClick(element, active); + message = "button-press"; + } else if (element.id.includes("SWITCH")) { + newState = this.handleSwitchClick(); + message = "button-press"; + } else if (element.id.includes("PIN")) { + newState = this.handleTouchPinClick(element, active); + message = "sensor-changed"; + } else { + return; + } + + if (newState && message) { + sendMessage(message, newState); + } + } + + private handleButtonClick(button: HTMLElement, active: boolean) { + const ButtonA: boolean = button.id.match(/BTN_A/) !== null; + const ButtonB: boolean = button.id.match(/BTN_B/) !== null; + const ButtonAB: boolean = button.id.match(/BTN_AB/) !== null; + let innerButton; + let newState; + + if (ButtonAB) { + innerButton = window.document.getElementById("BTN_AB_INNER"); + newState = { + button_a: active, + button_b: active, + }; + this.setState({ ...this.state, ...newState }); + } else if (ButtonA) { + innerButton = window.document.getElementById("BTN_A_INNER"); + newState = { + button_a: active, + }; + this.setState({ ...this.state, ...newState }); + } else if (ButtonB) { + innerButton = window.document.getElementById("BTN_B_INNER"); + newState = { + button_b: active, + }; + this.setState({ ...this.state, ...newState }); + } + + if (innerButton) { + innerButton.style.fill = this.getButtonColor(active); + } + + button.setAttribute("pressed", `${active}`); + return newState; + } + + private getButtonColor(pressed: boolean) { + const buttonUps = BUTTON_NEUTRAL; + const buttonDown = BUTTON_PRESSED; + return pressed ? buttonDown : buttonUps; + } + + private handleSwitchClick() { + const switchIsOn = !this.state.cpx.switch; + updateSwitch(switchIsOn); + this.setState({ + ...this.state, + cpx: { ...this.state.cpx, switch: switchIsOn }, + }); + return { switch: switchIsOn }; + } + + private handleTouchPinClick(pin: HTMLElement, active: boolean): any { + let cpxState = this.state.cpx; + const pinIndex = parseInt(pin.id.charAt(pin.id.length - 1)) - 1; + const pinState = cpxState.touch; + pinState[pinIndex] = active; + cpxState = { ...cpxState, touch: pinState }; + this.setState({ ...this.state, ...cpxState }); + updatePinTouch(active, pin.id); + return { touch: pinState }; + } } export default Simulator; diff --git a/Source/view/components/cpx/Cpx_svg.tsx b/Source/view/components/cpx/Cpx_svg.tsx index 0484dfd11..55864d460 100644 --- a/Source/view/components/cpx/Cpx_svg.tsx +++ b/Source/view/components/cpx/Cpx_svg.tsx @@ -6,2996 +6,2997 @@ import * as React from "react"; export const CPX_SVG = ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); export default CPX_SVG; diff --git a/Source/view/components/cpx/Cpx_svg_style.tsx b/Source/view/components/cpx/Cpx_svg_style.tsx index c9f9b2c77..4eff14480 100644 --- a/Source/view/components/cpx/Cpx_svg_style.tsx +++ b/Source/view/components/cpx/Cpx_svg_style.tsx @@ -24,45 +24,45 @@ export const POWER_LED_OFF: string = "#FFFFFF"; // Adapted from : https://github.com/microsoft/pxt/blob/master/pxtsim/simlib.ts export function rgbToHsl( - rgb: [number, number, number] + rgb: [number, number, number] ): [number, number, number] { - const [r, g, b] = rgb; - const [r$, g$, b$] = [r / 255, g / 255, b / 255]; - const cMin = Math.min(r$, g$, b$); - const cMax = Math.max(r$, g$, b$); - const cDelta = cMax - cMin; - let h: number = 0, - s: number, - l: number; - const maxAndMin = cMax + cMin; + const [r, g, b] = rgb; + const [r$, g$, b$] = [r / 255, g / 255, b / 255]; + const cMin = Math.min(r$, g$, b$); + const cMax = Math.max(r$, g$, b$); + const cDelta = cMax - cMin; + let h: number = 0, + s: number, + l: number; + const maxAndMin = cMax + cMin; - // Luminosity - l = (maxAndMin / 2) * 100; + // Luminosity + l = (maxAndMin / 2) * 100; - if (cDelta === 0) { - s = 0; - h = 0; - } else { - // Hue - switch (cMax) { - case r$: - h = 60 * (((g$ - b$) / cDelta) % 6); - break; - case g$: - h = 60 * ((b$ - r$) / cDelta + 2); - break; - case b$: - h = 60 * ((r$ - g$) / cDelta + 4); - break; - } + if (cDelta === 0) { + s = 0; + h = 0; + } else { + // Hue + switch (cMax) { + case r$: + h = 60 * (((g$ - b$) / cDelta) % 6); + break; + case g$: + h = 60 * ((b$ - r$) / cDelta + 2); + break; + case b$: + h = 60 * ((r$ - g$) / cDelta + 4); + break; + } - // Saturation - l > 50 - ? (s = 100 * (cDelta / (2 - maxAndMin))) - : (s = 100 * (cDelta / maxAndMin)); - } + // Saturation + l > 50 + ? (s = 100 * (cDelta / (2 - maxAndMin))) + : (s = 100 * (cDelta / maxAndMin)); + } - return [Math.floor(h), Math.floor(s), Math.floor(l)]; + return [Math.floor(h), Math.floor(s), Math.floor(l)]; } export const SVG_STYLE = ` diff --git a/Source/view/components/cpx/Svg_utils.tsx b/Source/view/components/cpx/Svg_utils.tsx index 4776c4a0a..92836b923 100644 --- a/Source/view/components/cpx/Svg_utils.tsx +++ b/Source/view/components/cpx/Svg_utils.tsx @@ -5,94 +5,94 @@ // tslint:disable-next-line: no-namespace namespace svg { - export function addClass(el: SVGElement, cls: string) { - if (el.classList) { - el.classList.add(cls); - } else if (el.className.baseVal.indexOf(cls) < 0) { - el.className.baseVal += " " + cls; - } - } + export function addClass(el: SVGElement, cls: string) { + if (el.classList) { + el.classList.add(cls); + } else if (el.className.baseVal.indexOf(cls) < 0) { + el.className.baseVal += " " + cls; + } + } - export function removeClass(el: SVGElement, cls: string) { - if (el.classList) { - el.classList.remove(cls); - } else { - el.className.baseVal = el.className.baseVal - .replace(cls, "") - .replace(/\s{2,}/, " "); - } - } + export function removeClass(el: SVGElement, cls: string) { + if (el.classList) { + el.classList.remove(cls); + } else { + el.className.baseVal = el.className.baseVal + .replace(cls, "") + .replace(/\s{2,}/, " "); + } + } - export function hydrate(el: SVGElement, props: any) { - for (const k in props) { - if (k == "title") { - svg.title(el, props[k]); - } else { - el.setAttributeNS(null, k, props[k]); - } - } - } + export function hydrate(el: SVGElement, props: any) { + for (const k in props) { + if (k == "title") { + svg.title(el, props[k]); + } else { + el.setAttributeNS(null, k, props[k]); + } + } + } - export function createElement(name: string, props?: any): SVGElement { - const newElement = document.createElementNS( - "http://www.w3.org/2000/svg", - name - ); - if (props) { - svg.hydrate(newElement, props); - } - return newElement; - } + export function createElement(name: string, props?: any): SVGElement { + const newElement = document.createElementNS( + "http://www.w3.org/2000/svg", + name + ); + if (props) { + svg.hydrate(newElement, props); + } + return newElement; + } - export function child( - parent: Element, - name: string, - props?: any - ): SVGElement { - const childElement = svg.createElement(name, props); - parent.appendChild(childElement); - return childElement; - } + export function child( + parent: Element, + name: string, + props?: any + ): SVGElement { + const childElement = svg.createElement(name, props); + parent.appendChild(childElement); + return childElement; + } - export function fill(el: SVGElement, c: string) { - el.style.fill = c; - } + export function fill(el: SVGElement, c: string) { + el.style.fill = c; + } - export function filter(el: SVGElement, c: string) { - el.style.filter = c; - } + export function filter(el: SVGElement, c: string) { + el.style.filter = c; + } - export function fills(els: SVGElement[], c: string) { - els.forEach((el) => (el.style.fill = c)); - } + export function fills(els: SVGElement[], c: string) { + els.forEach(el => (el.style.fill = c)); + } - export function mkTitle(txt: string): SVGTitleElement { - const t = svg.createElement("title") as SVGTitleElement; - t.textContent = txt; - return t; - } + export function mkTitle(txt: string): SVGTitleElement { + const t = svg.createElement("title") as SVGTitleElement; + t.textContent = txt; + return t; + } - export function title(el: SVGElement, txt: string): SVGTitleElement { - const t = mkTitle(txt); - el.appendChild(t); - return t; - } + export function title(el: SVGElement, txt: string): SVGTitleElement { + const t = mkTitle(txt); + el.appendChild(t); + return t; + } - export function setLed( - ledStatus: boolean, - offColor: string, - onColor: string, - ledElement: SVGElement | null, - gradientStopElement: SVGStopElement | null - ) { - if (ledStatus) { - ledElement?.setAttribute("fill", onColor); - gradientStopElement?.setAttribute("stop-opacity", "1"); - } else { - ledElement?.setAttribute("fill", offColor); - gradientStopElement?.setAttribute("stop-opacity", "0"); - } - } + export function setLed( + ledStatus: boolean, + offColor: string, + onColor: string, + ledElement: SVGElement | null, + gradientStopElement: SVGStopElement | null + ) { + if (ledStatus) { + ledElement?.setAttribute("fill", onColor); + gradientStopElement?.setAttribute("stop-opacity", "1"); + } else { + ledElement?.setAttribute("fill", offColor); + gradientStopElement?.setAttribute("stop-opacity", "0"); + } + } } export default svg; diff --git a/Source/view/components/microbit/Microbit.spec.tsx b/Source/view/components/microbit/Microbit.spec.tsx index 67c62cbc2..386086866 100644 --- a/Source/view/components/microbit/Microbit.spec.tsx +++ b/Source/view/components/microbit/Microbit.spec.tsx @@ -5,25 +5,25 @@ import * as testRenderer from "react-test-renderer"; import { Microbit } from "./Microbit"; describe("Microbit component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/components/microbit/Microbit.tsx b/Source/view/components/microbit/Microbit.tsx index bfc78aa28..e10c0bfb9 100644 --- a/Source/view/components/microbit/Microbit.tsx +++ b/Source/view/components/microbit/Microbit.tsx @@ -4,10 +4,10 @@ import * as React from "react"; import { MICROBIT_TOOLBAR_ICON_ID } from "../../components/toolbar/SensorModalUtils"; import { - GESTURES_MICROBIT, - SENSOR_LIST, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, + GESTURES_MICROBIT, + SENSOR_LIST, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_MESSAGES, } from "../../constants"; import "../../styles/Simulator.css"; import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; @@ -17,114 +17,114 @@ import { MicrobitSimulator } from "./MicrobitSimulator"; // Component grouping the functionality for micro:bit functionalities interface IState { - sensors: { [key: string]: number }; - currentSelectedGesture?: string; + sensors: { [key: string]: number }; + currentSelectedGesture?: string; } const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - }, - currentSelectedGesture: GESTURES_MICROBIT[0], + sensors: { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT]: 0, + [SENSOR_LIST.MOTION_X]: 0, + [SENSOR_LIST.MOTION_Y]: 0, + [SENSOR_LIST.MOTION_Z]: 0, + }, + currentSelectedGesture: GESTURES_MICROBIT[0], }; export class Microbit extends React.Component<{}, IState> { - state = DEFAULT_STATE; + state = DEFAULT_STATE; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + handleMessage = (event: any): void => { + const message = event.data; - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; - updateGesture = (event: React.ChangeEvent) => { - this.setState({ currentSelectedGesture: event.target.value }); - }; - sendGesture = (isActive: boolean) => { - if (this.state.currentSelectedGesture) { - if (isActive) { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: this.state.currentSelectedGesture, - }); - } else { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: "", - }); - } - } - }; + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.RESET: + this.setState({ ...DEFAULT_STATE }); + break; + } + }; + render() { + return ( + + + + + ); + } + updateSensor = (sensor: SENSOR_LIST, value: number) => { + this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); + }; + updateGesture = (event: React.ChangeEvent) => { + this.setState({ currentSelectedGesture: event.target.value }); + }; + sendGesture = (isActive: boolean) => { + if (this.state.currentSelectedGesture) { + if (isActive) { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: this.state.currentSelectedGesture, + }); + } else { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: "", + }); + } + } + }; } const MICROBIT_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, - }, - { - image: TOOLBAR_SVG.RED_LED_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LEDS, - }, - { - image: TOOLBAR_SVG.TEMPERATURE_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, - }, - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - }, - { - image: TOOLBAR_SVG.GESTURE_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.GESTURE, - }, - { - image: TOOLBAR_SVG.GPIO_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.GPIO, - }, - { - image: TOOLBAR_SVG.COMPASS_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.COMPASS, - }, - { - image: TOOLBAR_SVG.SPEAKER_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.SOUND, - }, - { - image: TOOLBAR_SVG.WIRELESS_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.WIRELESS, - }, + { + image: TOOLBAR_SVG.PUSH_BUTTON_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, + }, + { + image: TOOLBAR_SVG.RED_LED_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.LEDS, + }, + { + image: TOOLBAR_SVG.TEMPERATURE_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, + }, + { + image: TOOLBAR_SVG.LIGHT_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, + }, + { + image: TOOLBAR_SVG.MOTION_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, + }, + { + image: TOOLBAR_SVG.GESTURE_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.GESTURE, + }, + { + image: TOOLBAR_SVG.GPIO_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.GPIO, + }, + { + image: TOOLBAR_SVG.COMPASS_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.COMPASS, + }, + { + image: TOOLBAR_SVG.SPEAKER_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.SOUND, + }, + { + image: TOOLBAR_SVG.WIRELESS_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.WIRELESS, + }, ]; diff --git a/Source/view/components/microbit/MicrobitImage.tsx b/Source/view/components/microbit/MicrobitImage.tsx index 18515a425..c9e95216a 100644 --- a/Source/view/components/microbit/MicrobitImage.tsx +++ b/Source/view/components/microbit/MicrobitImage.tsx @@ -8,159 +8,159 @@ import { ViewStateContext } from "../../context"; import { IRefObject, MicrobitSvg } from "./Microbit_svg"; interface EventTriggers { - onMouseUp: (event: Event, buttonKey: string) => void; - onMouseDown: (event: Event, buttonKey: string) => void; - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; + onMouseUp: (event: Event, buttonKey: string) => void; + onMouseDown: (event: Event, buttonKey: string) => void; + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; } interface IProps { - eventTriggers: EventTriggers; - leds: number[][]; + eventTriggers: EventTriggers; + leds: number[][]; } export enum BUTTONS_KEYS { - BTN_A = "BTN_A", - BTN_B = "BTN_B", - BTN_AB = "BTN_AB", + BTN_A = "BTN_A", + BTN_B = "BTN_B", + BTN_AB = "BTN_AB", } // Displays the SVG and call necessary svg modification. export class MicrobitImage extends React.Component { - private svgRef: React.RefObject = React.createRef(); - constructor(props: IProps) { - super(props); - } - componentDidMount() { - const svgElement = this.svgRef.current; - if (svgElement) { - updateAllLeds(this.props.leds, svgElement.getLeds()); - setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); - this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); - } - } - componentDidUpdate() { - if (this.svgRef.current) { - updateAllLeds(this.props.leds, this.svgRef.current.getLeds()); - if (this.context === VIEW_STATE.PAUSE) { - disableAllButtons(this.svgRef.current.getButtons()); - } else if (this.context === VIEW_STATE.RUNNING) { - setupAllButtons( - this.props.eventTriggers, - this.svgRef.current.getButtons() - ); - } - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.eventTriggers.onKeyEvent(event, true, event.key); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.eventTriggers.onKeyEvent(event, false, event.key); - }; - render() { - return ; - } - public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { - const button = this.svgRef.current?.getButtons()[key].current; - if (button) { - button.focus(); - if (isActive) { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.KEYPRESSED - ); - } else { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.DEFAULT - ); - } - button.setAttribute("pressed", `${isActive}`); - button.setAttribute("aria-pressed", `${isActive}`); - } - } + private svgRef: React.RefObject = React.createRef(); + constructor(props: IProps) { + super(props); + } + componentDidMount() { + const svgElement = this.svgRef.current; + if (svgElement) { + updateAllLeds(this.props.leds, svgElement.getLeds()); + setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); + this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); + } + } + componentDidUpdate() { + if (this.svgRef.current) { + updateAllLeds(this.props.leds, this.svgRef.current.getLeds()); + if (this.context === VIEW_STATE.PAUSE) { + disableAllButtons(this.svgRef.current.getButtons()); + } else if (this.context === VIEW_STATE.RUNNING) { + setupAllButtons( + this.props.eventTriggers, + this.svgRef.current.getButtons() + ); + } + } + } + componentWillUnmount() { + window.document.removeEventListener("keydown", this.handleKeyDown); + window.document.removeEventListener("keyup", this.handleKeyUp); + } + setupKeyPresses = ( + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void + ) => { + window.document.addEventListener("keydown", this.handleKeyDown); + window.document.addEventListener("keyup", this.handleKeyUp); + }; + handleKeyDown = (event: KeyboardEvent) => { + const keyEvents = [event.key, event.code]; + // Don't listen to keydown events for the run button, restart button and enter key + if ( + !( + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) + ) + ) { + this.props.eventTriggers.onKeyEvent(event, true, event.key); + } + }; + handleKeyUp = (event: KeyboardEvent) => { + this.props.eventTriggers.onKeyEvent(event, false, event.key); + }; + render() { + return ; + } + public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { + const button = this.svgRef.current?.getButtons()[key].current; + if (button) { + button.focus(); + if (isActive) { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.KEYPRESSED + ); + } else { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.DEFAULT + ); + } + button.setAttribute("pressed", `${isActive}`); + button.setAttribute("aria-pressed", `${isActive}`); + } + } } MicrobitImage.contextType = ViewStateContext; const setupButton = ( - buttonElement: SVGRectElement, - eventTriggers: EventTriggers, - key: string + buttonElement: SVGRectElement, + eventTriggers: EventTriggers, + key: string ) => { - buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); + buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); - buttonElement.onmousedown = (e) => { - buttonElement.focus(); - eventTriggers.onMouseDown(e, key); - }; - buttonElement.onmouseup = (e) => { - eventTriggers.onMouseUp(e, key); - }; + buttonElement.onmousedown = e => { + buttonElement.focus(); + eventTriggers.onMouseDown(e, key); + }; + buttonElement.onmouseup = e => { + eventTriggers.onMouseUp(e, key); + }; - buttonElement.onkeydown = (e) => { - // ensure that the keydown is enter, - // or else it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - eventTriggers.onKeyEvent(e, true, key); - } - }; - buttonElement.onkeyup = (e) => { - eventTriggers.onKeyEvent(e, false, key); - }; + buttonElement.onkeydown = e => { + // ensure that the keydown is enter, + // or else it may register shortcuts twice + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + eventTriggers.onKeyEvent(e, true, key); + } + }; + buttonElement.onkeyup = e => { + eventTriggers.onKeyEvent(e, false, key); + }; }; const setupAllButtons = ( - eventTriggers: EventTriggers, - buttonRefs: IRefObject + eventTriggers: EventTriggers, + buttonRefs: IRefObject ) => { - for (const [key, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - setupButton(ref.current, eventTriggers, key); - } - } + for (const [key, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + setupButton(ref.current, eventTriggers, key); + } + } }; const disableAllButtons = (buttonRefs: IRefObject) => { - for (const [, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - // to implement - ref.current.onmousedown = null; - ref.current.onmouseup = null; - ref.current.onkeydown = null; - ref.current.onkeyup = null; - ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); - } - } + for (const [, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + // to implement + ref.current.onmousedown = null; + ref.current.onmouseup = null; + ref.current.onkeydown = null; + ref.current.onkeyup = null; + ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); + } + } }; const updateAllLeds = ( - leds: number[][], - ledRefs: Array>> + leds: number[][], + ledRefs: Array>> ) => { - for (let j = 0; j < leds.length; j++) { - for (let i = 0; i < leds[0].length; i++) { - const ledElement = ledRefs[j][i].current; - if (ledElement) { - setupLed(ledElement, leds[i][j]); - } - } - } + for (let j = 0; j < leds.length; j++) { + for (let i = 0; i < leds[0].length; i++) { + const ledElement = ledRefs[j][i].current; + if (ledElement) { + setupLed(ledElement, leds[i][j]); + } + } + } }; const setupLed = (ledElement: SVGRectElement, brightness: number) => { - ledElement.style.opacity = (brightness / 10).toString(); + ledElement.style.opacity = (brightness / 10).toString(); }; diff --git a/Source/view/components/microbit/MicrobitSimulator.tsx b/Source/view/components/microbit/MicrobitSimulator.tsx index 3ef219459..467efcaaa 100644 --- a/Source/view/components/microbit/MicrobitSimulator.tsx +++ b/Source/view/components/microbit/MicrobitSimulator.tsx @@ -1,10 +1,10 @@ import * as React from "react"; import { - AB_BUTTONS_KEYS, - CONSTANTS, - DEVICE_LIST_KEY, - VIEW_STATE, - WEBVIEW_MESSAGES, + AB_BUTTONS_KEYS, + CONSTANTS, + DEVICE_LIST_KEY, + VIEW_STATE, + WEBVIEW_MESSAGES, } from "../../constants"; import { ViewStateContext } from "../../context"; import PlayLogo from "../../svgs/play_svg"; @@ -14,246 +14,246 @@ import ActionBar from "../simulator/ActionBar"; import { BUTTONS_KEYS, MicrobitImage } from "./MicrobitImage"; const DEFAULT_MICROBIT_STATE: IMicrobitState = { - leds: [ - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - ], - buttons: { button_a: false, button_b: false }, + leds: [ + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + ], + buttons: { button_a: false, button_b: false }, }; interface IState { - active_editors: string[]; - running_file?: string; - currently_selected_file: string; - play_button: boolean; - selected_file: string; - microbit: IMicrobitState; - sendGesture?: (isActive: boolean) => void; + active_editors: string[]; + running_file?: string; + currently_selected_file: string; + play_button: boolean; + selected_file: string; + microbit: IMicrobitState; + sendGesture?: (isActive: boolean) => void; } interface IMicrobitState { - leds: number[][]; - buttons: { button_a: boolean; button_b: boolean }; + leds: number[][]; + buttons: { button_a: boolean; button_b: boolean }; } export class MicrobitSimulator extends React.Component { - private imageRef: React.RefObject = React.createRef(); - constructor() { - super({}); - this.state = { - microbit: DEFAULT_MICROBIT_STATE, - play_button: false, - selected_file: "", - active_editors: [], - running_file: undefined, - currently_selected_file: "", - }; - this.onKeyEvent = this.onKeyEvent.bind(this); - } - handleMessage = (event: any): void => { - const message = event.data; + private imageRef: React.RefObject = React.createRef(); + constructor() { + super({}); + this.state = { + microbit: DEFAULT_MICROBIT_STATE, + play_button: false, + selected_file: "", + active_editors: [], + running_file: undefined, + currently_selected_file: "", + }; + this.onKeyEvent = this.onKeyEvent.bind(this); + } + handleMessage = (event: any): void => { + const message = event.data; - if (message.active_device !== DEVICE_LIST_KEY.MICROBIT) { - return; - } + if (message.active_device !== DEVICE_LIST_KEY.MICROBIT) { + return; + } - switch (message.command) { - case "reset-state": - this.setState({ - microbit: DEFAULT_MICROBIT_STATE, - play_button: false, - }); - break; - case "set-state": - this.setState({ - microbit: { - ...this.state.microbit, - leds: message.state.leds, - }, - }); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - }); - break; - case "visible-editors": - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } + switch (message.command) { + case "reset-state": + this.setState({ + microbit: DEFAULT_MICROBIT_STATE, + play_button: false, + }); + break; + case "set-state": + this.setState({ + microbit: { + ...this.state.microbit, + leds: message.state.leds, + }, + }); + break; + case "activate-play": + const newRunningFile = this.state.currently_selected_file; + this.setState({ + play_button: !this.state.play_button, + running_file: newRunningFile, + }); + break; + case "visible-editors": + this.setState({ + active_editors: message.state.activePythonEditors, + }); + break; + case "current-file": + if (this.state.play_button) { + this.setState({ + currently_selected_file: message.state.running_file, + }); + } else { + this.setState({ + running_file: message.state.running_file, + currently_selected_file: message.state.running_file, + }); + } - break; - } - }; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } + break; + } + }; + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } + componentWillUnmount() { + window.removeEventListener("message", this.handleMessage); + } - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
-
- -
- -
- ); - } + render() { + const playStopImage = this.state.play_button ? StopLogo : PlayLogo; + const playStopLabel = this.state.play_button ? "stop" : "play"; + return ( +
+
+ {this.state.running_file && this.state.play_button + ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) + : CONSTANTS.FILES_PLACEHOLDER} +
+
+ +
+ +
+ ); + } - protected togglePlayClick = () => { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - }; + protected togglePlayClick = () => { + const button = + window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || + window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { + selected_file: this.state.selected_file, + state: !this.state.play_button, + }); + }; - protected refreshSimulatorClick = () => { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - }; - protected handleButtonClick = (key: string, isActive: boolean) => { - let newButtonState = this.state.microbit.buttons; - switch (key) { - case AB_BUTTONS_KEYS.BTN_A: - newButtonState.button_a = isActive; - break; - case AB_BUTTONS_KEYS.BTN_B: - newButtonState.button_b = isActive; - break; - case AB_BUTTONS_KEYS.BTN_AB: - newButtonState = { - button_a: isActive, - button_b: isActive, - }; - break; - } - sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); - this.setState({ - microbit: { - ...this.state.microbit, - buttons: newButtonState, - }, - }); - }; + protected refreshSimulatorClick = () => { + const button = window.document.getElementById( + CONSTANTS.ID_NAME.REFRESH_BUTTON + ); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); + }; + protected handleButtonClick = (key: string, isActive: boolean) => { + let newButtonState = this.state.microbit.buttons; + switch (key) { + case AB_BUTTONS_KEYS.BTN_A: + newButtonState.button_a = isActive; + break; + case AB_BUTTONS_KEYS.BTN_B: + newButtonState.button_b = isActive; + break; + case AB_BUTTONS_KEYS.BTN_AB: + newButtonState = { + button_a: isActive, + button_b: isActive, + }; + break; + } + sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); + this.setState({ + microbit: { + ...this.state.microbit, + buttons: newButtonState, + }, + }); + }; - protected onMouseUp = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, false); - }; + protected onMouseUp = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, false); + }; - protected onMouseDown = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, true); - }; + protected onMouseDown = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, true); + }; - protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { - event.stopPropagation(); - if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(key, active); - if (key === BUTTONS_KEYS.BTN_A) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if (key === BUTTONS_KEYS.BTN_B) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if (key === BUTTONS_KEYS.BTN_AB) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); + protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { + event.stopPropagation(); + if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(key, active); + if (key === BUTTONS_KEYS.BTN_A) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active + ); + } else if (key === BUTTONS_KEYS.BTN_B) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active + ); + } else if (key === BUTTONS_KEYS.BTN_AB) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active + ); + } + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } - } + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active + ); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { + this.togglePlayClick(); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { + this.refreshSimulatorClick(); + } + } } MicrobitSimulator.contextType = ViewStateContext; diff --git a/Source/view/components/microbit/Microbit_svg.tsx b/Source/view/components/microbit/Microbit_svg.tsx index fd2ea1ca5..22854c38f 100644 --- a/Source/view/components/microbit/Microbit_svg.tsx +++ b/Source/view/components/microbit/Microbit_svg.tsx @@ -7,1803 +7,1884 @@ import * as React from "react"; import "../../styles/SimulatorSvg.css"; export interface IRefObject { - [key: string]: React.RefObject; + [key: string]: React.RefObject; } /* tslint:disable */ const N_LED_COLUMN = 5; const N_LED_ROW = 5; export class MicrobitSvg extends React.Component { - constructor(props: Readonly<{}>) { - super(props); - for (let j = 0; j < N_LED_ROW; j++) { - const led_row: React.RefObject[] = []; - for (let i = 0; i < N_LED_COLUMN; i++) { - led_row.push(React.createRef()); - } - this.ledRefs.push(led_row); - } - } - private svgRef: React.RefObject = React.createRef(); + constructor(props: Readonly<{}>) { + super(props); + for (let j = 0; j < N_LED_ROW; j++) { + const led_row: React.RefObject[] = []; + for (let i = 0; i < N_LED_COLUMN; i++) { + led_row.push(React.createRef()); + } + this.ledRefs.push(led_row); + } + } + private svgRef: React.RefObject = React.createRef(); - private buttonRefs: IRefObject = { - BTN_A: React.createRef(), - BTN_B: React.createRef(), - BTN_AB: React.createRef(), - }; + private buttonRefs: IRefObject = { + BTN_A: React.createRef(), + BTN_B: React.createRef(), + BTN_AB: React.createRef(), + }; - private ledRefs: React.RefObject[][] = []; - public getSvgRef(): React.RefObject { - return this.svgRef; - } - public getButtons(): IRefObject { - return this.buttonRefs; - } - public getLeds(): React.RefObject[][] { - return this.ledRefs; - } + private ledRefs: React.RefObject[][] = []; + public getSvgRef(): React.RefObject { + return this.svgRef; + } + public getButtons(): IRefObject { + return this.buttonRefs; + } + public getLeds(): React.RefObject[][] { + return this.ledRefs; + } - render() { - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (0,0) - - - - (1,0) - - - - (2,0) - - - - (3,0) - - - - (4,0) - - - - (0,1) - - - - (1,1) - - - - (2,1) - - - - (3,1) - - - - (4,1) - - - - (0,2) - - - - (1,2) - - - - (2,2) - - - - (3,2) - - - - (4,2) - - - - (0,3) - - - - (1,3) - - - - (2,3) - - - - (3,3) - - - - (4,3) - - - - (0,4) - - - - (1,4) - - - - (2,4) - - - - (3,4) - - - - (4,4) - - - - - - - - - - P0, ANALOG IN - - - P1, ANALOG IN - - - P2, ANALOG IN - - - P3, ANALOG IN, LED Col 1 - - - P4, ANALOG IN, LED Col 2 - - - P5, BUTTON A - - - P6, LED Col 9 - - - P7, LED Col 8 - - - P8 - - - P9, LED Col 7 - - - P10, ANALOG IN, LED Col 3 - - - P11, BUTTON B - - - P12, RESERVED ACCESSIBILITY - - - P13, SPI - SCK - - - P14, SPI - MISO - - - P15, SPI - MOSI - - - P16, SPI - Chip Select - - - P17, +3v3 - - - P18, +3v3 - - - P19, I2C - SCL - - - P20, I2C - SDA - - - GND - - - GND - - - +3v3 - - - GND - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - - - - - - - - - - - - - - -
- ); - } + render() { + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (0,0) + + + + (1,0) + + + + (2,0) + + + + (3,0) + + + + (4,0) + + + + (0,1) + + + + (1,1) + + + + (2,1) + + + + (3,1) + + + + (4,1) + + + + (0,2) + + + + (1,2) + + + + (2,2) + + + + (3,2) + + + + (4,2) + + + + (0,3) + + + + (1,3) + + + + (2,3) + + + + (3,3) + + + + (4,3) + + + + (0,4) + + + + (1,4) + + + + (2,4) + + + + (3,4) + + + + (4,4) + + + + + + + + + + P0, ANALOG IN + + + P1, ANALOG IN + + + P2, ANALOG IN + + + P3, ANALOG IN, LED Col 1 + + + P4, ANALOG IN, LED Col 2 + + + P5, BUTTON A + + + P6, LED Col 9 + + + P7, LED Col 8 + + + P8 + + + P9, LED Col 7 + + + P10, ANALOG IN, LED Col 3 + + + P11, BUTTON B + + + P12, RESERVED ACCESSIBILITY + + + P13, SPI - SCK + + + P14, SPI - MISO + + + P15, SPI - MOSI + + + P16, SPI - Chip Select + + + P17, +3v3 + + + P18, +3v3 + + + P19, I2C - SCL + + + P20, I2C - SDA + + + GND + + + GND + + + +3v3 + + + GND + + + + + + + + + + + + + + + + + + + + + + A+B + + + + + + + + + + + + + + + + + + + + + + + +
+ ); + } } diff --git a/Source/view/components/simulator/ActionBar.tsx b/Source/view/components/simulator/ActionBar.tsx index 151d3758a..b760817b8 100644 --- a/Source/view/components/simulator/ActionBar.tsx +++ b/Source/view/components/simulator/ActionBar.tsx @@ -7,38 +7,42 @@ import RefreshLogo from "../../svgs/refresh_svg"; import Button from "../Button"; interface IProps { - onTogglePlay: (event: React.MouseEvent) => void; - onToggleRefresh: (event: React.MouseEvent) => void; - playStopImage: JSX.Element; - playStopLabel: string; + onTogglePlay: (event: React.MouseEvent) => void; + onToggleRefresh: (event: React.MouseEvent) => void; + playStopImage: JSX.Element; + playStopLabel: string; } // Component including the actions done on the Simulator (play/stop, refresh) class ActionBar extends React.Component { - public render() { - const { onTogglePlay, onToggleRefresh, playStopImage, playStopLabel } = - this.props; - return ( -
-
- ); - } + public render() { + const { + onTogglePlay, + onToggleRefresh, + playStopImage, + playStopLabel, + } = this.props; + return ( +
+
+ ); + } } export default ActionBar; diff --git a/Source/view/components/toolbar/GenericSliderComponent.tsx b/Source/view/components/toolbar/GenericSliderComponent.tsx index cc46a7930..747721075 100644 --- a/Source/view/components/toolbar/GenericSliderComponent.tsx +++ b/Source/view/components/toolbar/GenericSliderComponent.tsx @@ -4,38 +4,38 @@ import { ISensorProps, ISliderProps } from "../../viewUtils"; import InputSlider from "./InputSlider"; interface IProps { - axisProperties: ISensorProps; - axisValues: { - // key is accessed with axisLabel - [key: string]: number; - }; - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void; + axisProperties: ISensorProps; + axisValues: { + // key is accessed with axisLabel + [key: string]: number; + }; + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void; } -export const GenericSliderComponent: React.FC = (props) => { - return ( -
- {props.axisProperties.sliderProps.map( - (sliderProperties: ISliderProps, index: number) => { - return ( - - -
-
- ); - } - )} -
- ); +export const GenericSliderComponent: React.FC = props => { + return ( +
+ {props.axisProperties.sliderProps.map( + (sliderProperties: ISliderProps, index: number) => { + return ( + + +
+
+ ); + } + )} +
+ ); }; diff --git a/Source/view/components/toolbar/Gesture.tsx b/Source/view/components/toolbar/Gesture.tsx index cad53ea8b..4cf941f13 100644 --- a/Source/view/components/toolbar/Gesture.tsx +++ b/Source/view/components/toolbar/Gesture.tsx @@ -5,66 +5,67 @@ import SensorButton from "./SensorButton"; const GESTURE_BUTTON_MESSAGE = "Send Gesture"; interface IProps { - gestures: string[]; - onSelectGestures?: (event: React.ChangeEvent) => void; - onSendGesture?: (isActive: boolean) => void; + gestures: string[]; + onSelectGestures?: (event: React.ChangeEvent) => void; + onSendGesture?: (isActive: boolean) => void; } export class Gesture extends React.Component { - private sensorButtonRef: React.RefObject = React.createRef(); - render() { - return ( -
- - { - if (this.props.onSendGesture) { - this.props.onSendGesture(true); - } - }} - onMouseUp={() => { - if (this.props.onSendGesture) { - this.props.onSendGesture(false); - } - }} - onKeyDown={this.handleOnKeyDown} - onKeyUp={this.handleOnKeyUp} - type="gesture" - /> -
- ); - } - private handleOnKeyDown = (e: React.KeyboardEvent) => { - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - this.sensorButtonRef!.current!.setButtonClass(true); - if (this.props.onSendGesture) { - this.props.onSendGesture(true); - } - } - }; + private sensorButtonRef: React.RefObject = React.createRef(); + render() { + return ( +
+ + { + if (this.props.onSendGesture) { + this.props.onSendGesture(true); + } + }} + onMouseUp={() => { + if (this.props.onSendGesture) { + this.props.onSendGesture(false); + } + }} + onKeyDown={this.handleOnKeyDown} + onKeyUp={this.handleOnKeyUp} + type="gesture" + /> +
+ ); + } + private handleOnKeyDown = (e: React.KeyboardEvent) => { + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + this.sensorButtonRef!.current!.setButtonClass(true); + if (this.props.onSendGesture) { + this.props.onSendGesture(true); + } + } + }; - private handleOnKeyUp = ( - e: React.KeyboardEvent, - onSendGesture?: (isActive: boolean) => void - ) => { - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - this.sensorButtonRef!.current!.setButtonClass(false); + private handleOnKeyUp = ( + e: React.KeyboardEvent, + onSendGesture?: (isActive: boolean) => void + ) => { + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + this.sensorButtonRef!.current!.setButtonClass(false); - if (this.props.onSendGesture) { - this.props.onSendGesture(false); - } - } - }; + if (this.props.onSendGesture) { + this.props.onSendGesture(false); + } + } + }; } diff --git a/Source/view/components/toolbar/InputSlider.tsx b/Source/view/components/toolbar/InputSlider.tsx index db78f58d3..adfbcef60 100644 --- a/Source/view/components/toolbar/InputSlider.tsx +++ b/Source/view/components/toolbar/InputSlider.tsx @@ -9,122 +9,122 @@ import { sendMessage } from "../../utils/MessageUtils"; import { ISliderProps } from "../../viewUtils"; class InputSlider extends React.Component { - constructor(props: ISliderProps) { - super(props); - this.state = { - value: this.props.value, - }; + constructor(props: ISliderProps) { + super(props); + this.state = { + value: this.props.value, + }; - this.handleOnChange = this.handleOnChange.bind(this); - this.validateRange = this.validateRange.bind(this); - } + this.handleOnChange = this.handleOnChange.bind(this); + this.validateRange = this.validateRange.bind(this); + } - render() { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; + render() { + const isInputDisabled = this.context === VIEW_STATE.PAUSE; - const nbDecimals = - this.props.step.toString().split(".")[1]?.length || 0; - return ( -
- {this.props.axisLabel} - 0 ? 1 : 0}}[0-9]{0,${nbDecimals}}$`} - onKeyUp={this.handleOnChange} - style={{ width: this.getMaximumBoxWidth() + "ch" }} - aria-label={`${this.props.type} sensor input ${this.props.axisLabel}`} - /> - - - {this.props.minValue} - {this.props.maxValue} - - - - {this.props.minLabel} - {this.props.maxLabel} - - -
- ); - } + const nbDecimals = + this.props.step.toString().split(".")[1]?.length || 0; + return ( +
+ {this.props.axisLabel} + 0 ? 1 : 0}}[0-9]{0,${nbDecimals}}$`} + onKeyUp={this.handleOnChange} + style={{ width: this.getMaximumBoxWidth() + "ch" }} + aria-label={`${this.props.type} sensor input ${this.props.axisLabel}`} + /> + + + {this.props.minValue} + {this.props.maxValue} + + + + {this.props.minLabel} + {this.props.maxLabel} + + +
+ ); + } - private getMaximumBoxWidth = () => { - return ( - Math.max( - this.props.minValue.toString().length, - this.props.maxValue.toString().length - ) + 2 - ); - }; + private getMaximumBoxWidth = () => { + return ( + Math.max( + this.props.minValue.toString().length, + this.props.maxValue.toString().length + ) + 2 + ); + }; - private handleOnChange = (event: any) => { - const validatedValue = this.validateRange(this.updateValue(event)); - const newSensorState = this.writeMessage(validatedValue); - if (newSensorState) { - sendMessage(WEBVIEW_MESSAGES.SENSOR_CHANGED, newSensorState); - } - }; + private handleOnChange = (event: any) => { + const validatedValue = this.validateRange(this.updateValue(event)); + const newSensorState = this.writeMessage(validatedValue); + if (newSensorState) { + sendMessage(WEBVIEW_MESSAGES.SENSOR_CHANGED, newSensorState); + } + }; - private writeMessage = (valueTowrite: number) => { - let value = valueTowrite; - if (value > this.props.maxValue || value < this.props.minValue) { - value = parseInt(this.state.value, 10); - } + private writeMessage = (valueTowrite: number) => { + let value = valueTowrite; + if (value > this.props.maxValue || value < this.props.minValue) { + value = parseInt(this.state.value, 10); + } - return this.props.type && this.state.value !== undefined - ? { [this.props.type]: value } - : undefined; - }; + return this.props.type && this.state.value !== undefined + ? { [this.props.type]: value } + : undefined; + }; - private updateValue = (event: any) => { - const newValue = event.target.validity.valid - ? event.target.value - : this.state.value; - if (this.props.onUpdateValue) { - this.props.onUpdateValue(this.props.type as SENSOR_LIST, newValue); - } - return newValue; - }; + private updateValue = (event: any) => { + const newValue = event.target.validity.valid + ? event.target.value + : this.state.value; + if (this.props.onUpdateValue) { + this.props.onUpdateValue(this.props.type as SENSOR_LIST, newValue); + } + return newValue; + }; - private sendTelemetry = () => { - sendMessage(WEBVIEW_MESSAGES.SLIDER_TELEMETRY, this.props.type); - }; + private sendTelemetry = () => { + sendMessage(WEBVIEW_MESSAGES.SLIDER_TELEMETRY, this.props.type); + }; - private validateRange = (valueString: string) => { - let valueInt = parseFloat(valueString); - if (valueInt < this.props.minValue) { - valueInt = this.props.minValue; - this.setState({ value: valueInt }); - } else if (valueInt > this.props.maxValue) { - valueInt = this.props.maxValue; - this.setState({ value: valueInt }); - } - return valueInt; - }; + private validateRange = (valueString: string) => { + let valueInt = parseFloat(valueString); + if (valueInt < this.props.minValue) { + valueInt = this.props.minValue; + this.setState({ value: valueInt }); + } else if (valueInt > this.props.maxValue) { + valueInt = this.props.maxValue; + this.setState({ value: valueInt }); + } + return valueInt; + }; } InputSlider.contextType = ViewStateContext; diff --git a/Source/view/components/toolbar/SensorButton.tsx b/Source/view/components/toolbar/SensorButton.tsx index efd22eb96..b50759bd4 100644 --- a/Source/view/components/toolbar/SensorButton.tsx +++ b/Source/view/components/toolbar/SensorButton.tsx @@ -8,38 +8,39 @@ import "../../styles/SensorButton.css"; import { ISensorButtonProps } from "../../viewUtils"; class SensorButton extends React.Component { - private buttonRef: React.RefObject = React.createRef(); + private buttonRef: React.RefObject = React.createRef(); - public setButtonClass = (isActive: boolean) => { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; + public setButtonClass = (isActive: boolean) => { + const isInputDisabled = this.context === VIEW_STATE.PAUSE; - if (isActive && !isInputDisabled) { - this.buttonRef.current?.setAttribute( - "class", - "sensor-button active-button" - ); - } else if (this.buttonRef.current) { - this.buttonRef!.current!.setAttribute("class", "sensor-button"); - } - }; - render() { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; + if (isActive && !isInputDisabled) { + this.buttonRef.current?.setAttribute( + "class", + "sensor-button active-button" + ); + } else if (this.buttonRef.current) { + this.buttonRef!.current!.setAttribute("class", "sensor-button"); + } + }; + render() { + const isInputDisabled = this.context === VIEW_STATE.PAUSE; - return ( - - ); - } + return ( + + ); + } } SensorButton.contextType = ViewStateContext; export default SensorButton; diff --git a/Source/view/components/toolbar/SensorModalUtils.tsx b/Source/view/components/toolbar/SensorModalUtils.tsx index 57a491960..c7ea53f85 100644 --- a/Source/view/components/toolbar/SensorModalUtils.tsx +++ b/Source/view/components/toolbar/SensorModalUtils.tsx @@ -8,167 +8,169 @@ import * as CPX_MODAL from "./cpx/CpxModalContent"; import * as MICROBIT_MODAL from "./microbit/MicrobitModalContent"; export const TRY_IT_MAKE_CODE = ( - + ); export const FEATURE_REQUEST_ON_GITHUB = ( - + ); export const TOOLBAR_ICON_LABEL = { - GPIO: "GPIO", - IR: "IR", - LEFT_EDGE: "left-edge", - LIGHT: "Light sensor", - MOTION: "Motion Sensor", - NEO_PIXEL: "Neo Pixels", - PUSH_BUTTON: "Push Button", - RED_LED: "Red LED", - RIGHT_EDGE: "right-edge", - SOUND: "Sound Sensor", - SPEAKER: "Speaker", - SWITCH: "Switch", - TAG_INPUT: "Tag Input", - TAG_OUTPUT: "Tag Output", - TEMPERATURE: "Temperature Sensor", - WIRELESS: "Bluetooth and Radio", + GPIO: "GPIO", + IR: "IR", + LEFT_EDGE: "left-edge", + LIGHT: "Light sensor", + MOTION: "Motion Sensor", + NEO_PIXEL: "Neo Pixels", + PUSH_BUTTON: "Push Button", + RED_LED: "Red LED", + RIGHT_EDGE: "right-edge", + SOUND: "Sound Sensor", + SPEAKER: "Speaker", + SWITCH: "Switch", + TAG_INPUT: "Tag Input", + TAG_OUTPUT: "Tag Output", + TEMPERATURE: "Temperature Sensor", + WIRELESS: "Bluetooth and Radio", }; export const CPX_TOOLBAR_ICON_ID = { - GPIO: "toolbar-gpio", - IR: "toolbar-ir-sensor", - LEFT_EDGE: "left-edge", - LIGHT: "toolbar-light-sensor", - MOTION: "toolbar-motion-sensor", - NEO_PIXEL: "toolbar-neo-pixels", - PUSH_BUTTON: "toolbar-a-b-push", - RED_LED: "toolbar-red-led", - RIGHT_EDGE: "right-edge", - SOUND: "toolbar-sound-sensor", - SPEAKER: "toolbar-speaker", - SWITCH: "toolbar-slider-switch", - TEMPERATURE: "toolbar-temperature-sensor", + GPIO: "toolbar-gpio", + IR: "toolbar-ir-sensor", + LEFT_EDGE: "left-edge", + LIGHT: "toolbar-light-sensor", + MOTION: "toolbar-motion-sensor", + NEO_PIXEL: "toolbar-neo-pixels", + PUSH_BUTTON: "toolbar-a-b-push", + RED_LED: "toolbar-red-led", + RIGHT_EDGE: "right-edge", + SOUND: "toolbar-sound-sensor", + SPEAKER: "toolbar-speaker", + SWITCH: "toolbar-slider-switch", + TEMPERATURE: "toolbar-temperature-sensor", }; export const MICROBIT_TOOLBAR_ICON_ID = { - TEMPERATURE: "toolbar-microbit-temperature-sensor", - LIGHT: "toolbar-microbit-light-sensor", - ACCELEROMETER: "toolbar-accelerometer-sensor", - LEDS: "toolbar-microbit-led", - PUSH_BUTTON: "toolbar-microbit-a-b-push", - GPIO: "toolbar-gpio", - SOUND: "toolbar-microbit-sound", - WIRELESS: "toolbar-microbit-wireless", - GESTURE: "toolbar-microbit-gesture-sensor", - COMPASS: "toolbar-microbit-compass-sensor", + TEMPERATURE: "toolbar-microbit-temperature-sensor", + LIGHT: "toolbar-microbit-light-sensor", + ACCELEROMETER: "toolbar-accelerometer-sensor", + LEDS: "toolbar-microbit-led", + PUSH_BUTTON: "toolbar-microbit-a-b-push", + GPIO: "toolbar-gpio", + SOUND: "toolbar-microbit-sound", + WIRELESS: "toolbar-microbit-wireless", + GESTURE: "toolbar-microbit-gesture-sensor", + COMPASS: "toolbar-microbit-compass-sensor", }; export const CLUE_TOOLBAR_ICON_ID = { - TEMPERATURE: "toolbar-clue-temperature-sensor", - LIGHT: "toolbar-clue-light-sensor", - ACCELEROMETER: "toolbar-clue-accelerometer-sensor", - LEDS: "toolbar-clue-led", - PUSH_BUTTON: "toolbar-clue-a-b-push", - GPIO: "toolbar-clue-gpio", - SPEAKER: "toolbar-speaker", - SOUND: "toolbar-clue-sound-sensor", - PRESSURE: "toolbar-clue-pressure-sensor", - HUMIDITY: "toolbar-clue-humidity-sensor", - GESTURE: "toolbar-clue-gesture-sensor", - PROXIMITY: "toolbar-clue-proximity-sensor", - BLUETOOTH: "toolbar-clue-bluetooth", - MAGNETOSCOPE: "toolbar-clue-magnet-sensor", - GYROSCOPE: "toolbar-clue-gyroscope-sensor", + TEMPERATURE: "toolbar-clue-temperature-sensor", + LIGHT: "toolbar-clue-light-sensor", + ACCELEROMETER: "toolbar-clue-accelerometer-sensor", + LEDS: "toolbar-clue-led", + PUSH_BUTTON: "toolbar-clue-a-b-push", + GPIO: "toolbar-clue-gpio", + SPEAKER: "toolbar-speaker", + SOUND: "toolbar-clue-sound-sensor", + PRESSURE: "toolbar-clue-pressure-sensor", + HUMIDITY: "toolbar-clue-humidity-sensor", + GESTURE: "toolbar-clue-gesture-sensor", + PROXIMITY: "toolbar-clue-proximity-sensor", + BLUETOOTH: "toolbar-clue-bluetooth", + MAGNETOSCOPE: "toolbar-clue-magnet-sensor", + GYROSCOPE: "toolbar-clue-gyroscope-sensor", }; export interface IModalContent { - components: any; - descriptionText: string; - descriptionTitle: string; - id: string; - tagInput: any; - tagOutput: any; - tryItDescription: string; + components: any; + descriptionText: string; + descriptionTitle: string; + id: string; + tagInput: any; + tagOutput: any; + tryItDescription: string; } export const DEFAULT_MODAL_CONTENT: IModalContent = { - descriptionTitle: "default", - tagInput: undefined, - tagOutput: undefined, - descriptionText: "none", - tryItDescription: "none", - components: undefined, - id: "none", + descriptionTitle: "default", + tagInput: undefined, + tagOutput: undefined, + descriptionText: "none", + tryItDescription: "none", + components: undefined, + id: "none", }; export const LABEL_TO_MODAL_CONTENT_CONSTRUCTOR = new Map([ - [CPX_TOOLBAR_ICON_ID.GPIO, CPX_MODAL.GPIO_CONTENT], - [CPX_TOOLBAR_ICON_ID.IR, CPX_MODAL.IR_CONTENT], - [CPX_TOOLBAR_ICON_ID.LIGHT, CPX_MODAL.LIGHT_CONTENT], - [CPX_TOOLBAR_ICON_ID.MOTION, CPX_MODAL.MOTION_CONTENT], - [CPX_TOOLBAR_ICON_ID.NEO_PIXEL, CPX_MODAL.NEOP_CONTENT], - [CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, CPX_MODAL.PUSHB_CONTENT], - [CPX_TOOLBAR_ICON_ID.RED_LED, CPX_MODAL.RED_LED_CONTENT], - [CPX_TOOLBAR_ICON_ID.SOUND, CPX_MODAL.SOUND_CONTENT], - [CPX_TOOLBAR_ICON_ID.SPEAKER, CPX_MODAL.SPEAKER_CONTENT], - [CPX_TOOLBAR_ICON_ID.SWITCH, CPX_MODAL.SWITCH_CONTENT], - [CPX_TOOLBAR_ICON_ID.TEMPERATURE, CPX_MODAL.TEMPERATURE_CONTENT], - [ - MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - MICROBIT_MODAL.ACCELEROMETER_CONTENT, - ], - [MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, MICROBIT_MODAL.TEMPERATURE_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.LIGHT, MICROBIT_MODAL.LIGHT_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.LEDS, MICROBIT_MODAL.LED_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, MICROBIT_MODAL.BUTTON_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.GPIO, MICROBIT_MODAL.GPIO_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.SOUND, MICROBIT_MODAL.SOUND_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.WIRELESS, MICROBIT_MODAL.WIRELESS_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], - [CLUE_TOOLBAR_ICON_ID.TEMPERATURE, CLUE_MODAL.TEMPERATURE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, CLUE_MODAL.BUTTON_CONTENT], - [CLUE_TOOLBAR_ICON_ID.GPIO, CLUE_MODAL.GPIO_CONTENT], - [CLUE_TOOLBAR_ICON_ID.LIGHT, CLUE_MODAL.LIGHT_CONTENT], - [CLUE_TOOLBAR_ICON_ID.LEDS, CLUE_MODAL.LED_CONTENT], - [CLUE_TOOLBAR_ICON_ID.SOUND, CLUE_MODAL.SOUND_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PRESSURE, CLUE_MODAL.PRESSURE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.HUMIDITY, CLUE_MODAL.HUMIDITY_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PROXIMITY, CLUE_MODAL.PROXIMITY_CONTENT], - [CLUE_TOOLBAR_ICON_ID.BLUETOOTH, CLUE_MODAL.BLUETOOTH_CONTENT], - [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.SPEAKER, CLUE_MODAL.SPEAKER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.GYROSCOPE, CLUE_MODAL.GYROSCOPE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, CLUE_MODAL.MAGNETOSCOPE_CONTENT], + [CPX_TOOLBAR_ICON_ID.GPIO, CPX_MODAL.GPIO_CONTENT], + [CPX_TOOLBAR_ICON_ID.IR, CPX_MODAL.IR_CONTENT], + [CPX_TOOLBAR_ICON_ID.LIGHT, CPX_MODAL.LIGHT_CONTENT], + [CPX_TOOLBAR_ICON_ID.MOTION, CPX_MODAL.MOTION_CONTENT], + [CPX_TOOLBAR_ICON_ID.NEO_PIXEL, CPX_MODAL.NEOP_CONTENT], + [CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, CPX_MODAL.PUSHB_CONTENT], + [CPX_TOOLBAR_ICON_ID.RED_LED, CPX_MODAL.RED_LED_CONTENT], + [CPX_TOOLBAR_ICON_ID.SOUND, CPX_MODAL.SOUND_CONTENT], + [CPX_TOOLBAR_ICON_ID.SPEAKER, CPX_MODAL.SPEAKER_CONTENT], + [CPX_TOOLBAR_ICON_ID.SWITCH, CPX_MODAL.SWITCH_CONTENT], + [CPX_TOOLBAR_ICON_ID.TEMPERATURE, CPX_MODAL.TEMPERATURE_CONTENT], + [ + MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, + MICROBIT_MODAL.ACCELEROMETER_CONTENT, + ], + [MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, MICROBIT_MODAL.TEMPERATURE_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.LIGHT, MICROBIT_MODAL.LIGHT_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.LEDS, MICROBIT_MODAL.LED_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, MICROBIT_MODAL.BUTTON_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.GPIO, MICROBIT_MODAL.GPIO_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.SOUND, MICROBIT_MODAL.SOUND_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.WIRELESS, MICROBIT_MODAL.WIRELESS_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], + [CLUE_TOOLBAR_ICON_ID.TEMPERATURE, CLUE_MODAL.TEMPERATURE_CONTENT], + [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], + [CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, CLUE_MODAL.BUTTON_CONTENT], + [CLUE_TOOLBAR_ICON_ID.GPIO, CLUE_MODAL.GPIO_CONTENT], + [CLUE_TOOLBAR_ICON_ID.LIGHT, CLUE_MODAL.LIGHT_CONTENT], + [CLUE_TOOLBAR_ICON_ID.LEDS, CLUE_MODAL.LED_CONTENT], + [CLUE_TOOLBAR_ICON_ID.SOUND, CLUE_MODAL.SOUND_CONTENT], + [CLUE_TOOLBAR_ICON_ID.PRESSURE, CLUE_MODAL.PRESSURE_CONTENT], + [CLUE_TOOLBAR_ICON_ID.HUMIDITY, CLUE_MODAL.HUMIDITY_CONTENT], + [CLUE_TOOLBAR_ICON_ID.PROXIMITY, CLUE_MODAL.PROXIMITY_CONTENT], + [CLUE_TOOLBAR_ICON_ID.BLUETOOTH, CLUE_MODAL.BLUETOOTH_CONTENT], + [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], + [CLUE_TOOLBAR_ICON_ID.SPEAKER, CLUE_MODAL.SPEAKER_CONTENT], + [CLUE_TOOLBAR_ICON_ID.GYROSCOPE, CLUE_MODAL.GYROSCOPE_CONTENT], + [CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, CLUE_MODAL.MAGNETOSCOPE_CONTENT], ]); export const getModalContent = ( - label: string, - onUpdateValue: (onUpdateValue: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number }, - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void + label: string, + onUpdateValue: (onUpdateValue: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, + onSelectGestures?: (event: React.ChangeEvent) => void, + sendGesture?: (isActive: boolean) => void ) => { - if (label === CLUE_TOOLBAR_ICON_ID.GESTURE) { - return CLUE_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); - } else if (label === MICROBIT_TOOLBAR_ICON_ID.GESTURE) { - return MICROBIT_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); - } - const modalContentConstructor = - LABEL_TO_MODAL_CONTENT_CONSTRUCTOR.get(label); - if (modalContentConstructor) { - return modalContentConstructor(onUpdateValue, sensorValues); - } else { - return; - } + if (label === CLUE_TOOLBAR_ICON_ID.GESTURE) { + return CLUE_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); + } else if (label === MICROBIT_TOOLBAR_ICON_ID.GESTURE) { + return MICROBIT_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); + } + const modalContentConstructor = LABEL_TO_MODAL_CONTENT_CONSTRUCTOR.get( + label + ); + if (modalContentConstructor) { + return modalContentConstructor(onUpdateValue, sensorValues); + } else { + return; + } }; diff --git a/Source/view/components/toolbar/ToolBar.tsx b/Source/view/components/toolbar/ToolBar.tsx index 9bdd48ae5..a2a3ee1a2 100644 --- a/Source/view/components/toolbar/ToolBar.tsx +++ b/Source/view/components/toolbar/ToolBar.tsx @@ -5,215 +5,217 @@ import { Callout, TooltipHost } from "office-ui-fabric-react"; import { IconButton } from "office-ui-fabric-react"; import * as React from "react"; import { - FormattedMessage, - injectIntl, - WrappedComponentProps, + FormattedMessage, + injectIntl, + WrappedComponentProps, } from "react-intl"; import { SENSOR_LIST } from "../../constants"; import "../../styles/ToolBar.css"; import Button from "../Button"; import { - DEFAULT_MODAL_CONTENT, - getModalContent, - IModalContent, + DEFAULT_MODAL_CONTENT, + getModalContent, + IModalContent, } from "./SensorModalUtils"; interface IToolbarState { - currentOpenedId: string; - showModal: boolean; - isDescriptionVisible: boolean; + currentOpenedId: string; + showModal: boolean; + isDescriptionVisible: boolean; } interface IProps extends WrappedComponentProps { - buttonList: Array<{ - label: any; - image: any; - }>; - onUpdateSensor: (sensor: SENSOR_LIST, value: number) => void; - sensorValues: { [key: string]: number }; - onSelectGesture?: (event: React.ChangeEvent) => void; - sendGesture?: (isActive: boolean) => void; + buttonList: Array<{ + label: any; + image: any; + }>; + onUpdateSensor: (sensor: SENSOR_LIST, value: number) => void; + sensorValues: { [key: string]: number }; + onSelectGesture?: (event: React.ChangeEvent) => void; + sendGesture?: (isActive: boolean) => void; } class ToolBar extends React.Component { - private readonly TOOLBAR_BUTTON_WIDTH: number = 32; - - constructor(props: IProps) { - super(props); - initializeIcons(); - this.state = { - currentOpenedId: "", - isDescriptionVisible: false, - showModal: false, - }; - } - - public render() { - const { buttonList } = this.props; - return ( -
-
-
- {buttonList.map( - (currrentButton: any, index: number) => { - return ( - ( - - ), - }} - key={index}> -
- {this.getIconModal()} -
-
- ); - } - - private handleOnClick = ( - event: React.MouseEvent, - label: string - ) => { - if ( - !this.state.showModal && - this.state.currentOpenedId === "" && - this.state.currentOpenedId !== label - ) { - this.openModal(label); - } else { - this.closeCurrentModal(); - if (this.state.currentOpenedId !== label) { - this.openModal(label); - } - } - }; - - private changePressedState(id: string, pressed: boolean) { - const elt = window.document.getElementById(`${id}-button`); - if (elt) { - pressed - ? elt.classList.add("button-pressed") - : elt.classList.remove("button-pressed"); - } - } - private closeCurrentModal = () => { - this.changePressedState(this.state.currentOpenedId, false); - this.setState({ - currentOpenedId: "", - showModal: false, - }); - }; - - private openModal = (label: string) => { - this.setState({ - currentOpenedId: label, - showModal: true, - }); - this.changePressedState(label, true); - }; - - private onShowDescriptionClicked = (): void => { - this.setState({ - isDescriptionVisible: !this.state.isDescriptionVisible, - }); - }; - - private onDescriptionDismiss = (): void => { - this.setState({ - isDescriptionVisible: false, - }); - }; - - private getIconModal() { - if ( - !this.state.showModal || - !getModalContent( - this.state.currentOpenedId, - this.props.onUpdateSensor, - this.props.sensorValues, - this.props.onSelectGesture, - this.props.sendGesture - ) - ) { - return null; - } - - const content = getModalContent( - this.state.currentOpenedId, - this.props.onUpdateSensor, - this.props.sensorValues, - this.props.onSelectGesture, - this.props.sendGesture - ) as IModalContent; - - const components = content - ? content.components - : DEFAULT_MODAL_CONTENT.components; - - return ( -
-
- - - {content.tagInput} - {content.tagOutput} - - -
-
- {this.state.isDescriptionVisible && ( - -
- -
-
- )} -
-
- - - -
- -
{components}
-
-
- ); - } + private readonly TOOLBAR_BUTTON_WIDTH: number = 32; + + constructor(props: IProps) { + super(props); + initializeIcons(); + this.state = { + currentOpenedId: "", + isDescriptionVisible: false, + showModal: false, + }; + } + + public render() { + const { buttonList } = this.props; + return ( +
+
+
+ {buttonList.map( + (currrentButton: any, index: number) => { + return ( + ( + + ), + }} + key={index} + > +
+ {this.getIconModal()} +
+
+ ); + } + + private handleOnClick = ( + event: React.MouseEvent, + label: string + ) => { + if ( + !this.state.showModal && + this.state.currentOpenedId === "" && + this.state.currentOpenedId !== label + ) { + this.openModal(label); + } else { + this.closeCurrentModal(); + if (this.state.currentOpenedId !== label) { + this.openModal(label); + } + } + }; + + private changePressedState(id: string, pressed: boolean) { + const elt = window.document.getElementById(`${id}-button`); + if (elt) { + pressed + ? elt.classList.add("button-pressed") + : elt.classList.remove("button-pressed"); + } + } + private closeCurrentModal = () => { + this.changePressedState(this.state.currentOpenedId, false); + this.setState({ + currentOpenedId: "", + showModal: false, + }); + }; + + private openModal = (label: string) => { + this.setState({ + currentOpenedId: label, + showModal: true, + }); + this.changePressedState(label, true); + }; + + private onShowDescriptionClicked = (): void => { + this.setState({ + isDescriptionVisible: !this.state.isDescriptionVisible, + }); + }; + + private onDescriptionDismiss = (): void => { + this.setState({ + isDescriptionVisible: false, + }); + }; + + private getIconModal() { + if ( + !this.state.showModal || + !getModalContent( + this.state.currentOpenedId, + this.props.onUpdateSensor, + this.props.sensorValues, + this.props.onSelectGesture, + this.props.sendGesture + ) + ) { + return null; + } + + const content = getModalContent( + this.state.currentOpenedId, + this.props.onUpdateSensor, + this.props.sensorValues, + this.props.onSelectGesture, + this.props.sendGesture + ) as IModalContent; + + const components = content + ? content.components + : DEFAULT_MODAL_CONTENT.components; + + return ( +
+
+ + + {content.tagInput} + {content.tagOutput} + + +
+
+ {this.state.isDescriptionVisible && ( + +
+ +
+
+ )} +
+
+ + + +
+ +
{components}
+
+
+ ); + } } export default injectIntl(ToolBar); diff --git a/Source/view/components/toolbar/Toolbar.spec.tsx b/Source/view/components/toolbar/Toolbar.spec.tsx index cc939e108..7598ff1c0 100644 --- a/Source/view/components/toolbar/Toolbar.spec.tsx +++ b/Source/view/components/toolbar/Toolbar.spec.tsx @@ -8,50 +8,50 @@ import { MICROBIT_TOOLBAR_ICON_ID } from "./SensorModalUtils"; import Toolbar from "./ToolBar"; const MOCK_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - }, + { + image: TOOLBAR_SVG.LIGHT_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, + }, + { + image: TOOLBAR_SVG.MOTION_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, + }, ]; const mockUpdateSensors = () => { - return; + return; }; const mockInitialValues = { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT]: 0, }; describe("Toolbar component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/components/toolbar/clue/ClueModalContent.tsx b/Source/view/components/toolbar/clue/ClueModalContent.tsx index 34a56b1d0..b4fc4a136 100644 --- a/Source/view/components/toolbar/clue/ClueModalContent.tsx +++ b/Source/view/components/toolbar/clue/ClueModalContent.tsx @@ -8,311 +8,311 @@ import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; import * as SENSOR_PROPERTIES from "./ClueSensorProperties"; export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-clue-temperature-sensor.description", - descriptionTitle: "toolbar-clue-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-temperature-sensor.tryItDescription", - }; + const temperatureSensorValues = { + T: sensorValues[SENSOR_LIST.TEMPERATURE], + }; + return { + components: [ + , + ], + descriptionText: "toolbar-clue-temperature-sensor.description", + descriptionTitle: "toolbar-clue-temperature-sensor.title", + id: "temperature", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-temperature-sensor.tryItDescription", + }; }; export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-gpio.description", - tryItDescription: "toolbar-clue-gpio.tryItDescription", - components: undefined, - id: "GPIO", - }; + return { + descriptionTitle: "toolbar-clue-gpio.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-gpio.description", + tryItDescription: "toolbar-clue-gpio.tryItDescription", + components: undefined, + id: "GPIO", + }; }; export const ACCELEROMETER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const accelerometerSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-accelerometer-sensor.description", - descriptionTitle: "toolbar-clue-accelerometer-sensor.title", - id: "accelerometer", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-accelerometer-sensor.tryItDescription", - }; + const accelerometerSensorValues = { + X: sensorValues[SENSOR_LIST.MOTION_X], + Y: sensorValues[SENSOR_LIST.MOTION_Y], + Z: sensorValues[SENSOR_LIST.MOTION_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-accelerometer-sensor.description", + descriptionTitle: "toolbar-clue-accelerometer-sensor.title", + id: "accelerometer", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-accelerometer-sensor.tryItDescription", + }; }; export const GYROSCOPE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const gyroSensorValues = { - X: sensorValues[SENSOR_LIST.GYRO_X], - Y: sensorValues[SENSOR_LIST.GYRO_Y], - Z: sensorValues[SENSOR_LIST.GYRO_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-gyroscope-sensor.description", - descriptionTitle: "toolbar-clue-gyroscope-sensor.title", - id: "gyroscope", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-gyroscope-sensor.tryItDescription", - }; + const gyroSensorValues = { + X: sensorValues[SENSOR_LIST.GYRO_X], + Y: sensorValues[SENSOR_LIST.GYRO_Y], + Z: sensorValues[SENSOR_LIST.GYRO_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-gyroscope-sensor.description", + descriptionTitle: "toolbar-clue-gyroscope-sensor.title", + id: "gyroscope", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-gyroscope-sensor.tryItDescription", + }; }; export const MAGNETOSCOPE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const magnetSensorValues = { - X: sensorValues[SENSOR_LIST.MAGNET_X], - Y: sensorValues[SENSOR_LIST.MAGNET_Y], - Z: sensorValues[SENSOR_LIST.MAGNET_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-magnet-sensor.description", - descriptionTitle: "toolbar-clue-magnet-sensor.title", - id: "magnetoscope", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-magnet-sensor.tryItDescription", - }; + const magnetSensorValues = { + X: sensorValues[SENSOR_LIST.MAGNET_X], + Y: sensorValues[SENSOR_LIST.MAGNET_Y], + Z: sensorValues[SENSOR_LIST.MAGNET_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-magnet-sensor.description", + descriptionTitle: "toolbar-clue-magnet-sensor.title", + id: "magnetoscope", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-magnet-sensor.tryItDescription", + }; }; export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const lightSensorValues = { - R: sensorValues[SENSOR_LIST.LIGHT_R], - G: sensorValues[SENSOR_LIST.LIGHT_G], - B: sensorValues[SENSOR_LIST.LIGHT_B], - C: sensorValues[SENSOR_LIST.LIGHT_C], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-light-sensor.description", - descriptionTitle: "toolbar-clue-light-sensor.title", - id: "light_sensor", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-light-sensor.tryItDescription", - }; + const lightSensorValues = { + R: sensorValues[SENSOR_LIST.LIGHT_R], + G: sensorValues[SENSOR_LIST.LIGHT_G], + B: sensorValues[SENSOR_LIST.LIGHT_B], + C: sensorValues[SENSOR_LIST.LIGHT_C], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-light-sensor.description", + descriptionTitle: "toolbar-clue-light-sensor.title", + id: "light_sensor", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-light-sensor.tryItDescription", + }; }; export const HUMIDITY_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const humiditySensorValues = { - H: sensorValues[SENSOR_LIST.HUMIDITY], - }; - return { - descriptionTitle: "toolbar-clue-humidity-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-humidity-sensor.description", - tryItDescription: "toolbar-clue-humidity-sensor.tryItDescription", - components: [ - , - ], - id: "humidity_sensor", - }; + const humiditySensorValues = { + H: sensorValues[SENSOR_LIST.HUMIDITY], + }; + return { + descriptionTitle: "toolbar-clue-humidity-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-humidity-sensor.description", + tryItDescription: "toolbar-clue-humidity-sensor.tryItDescription", + components: [ + , + ], + id: "humidity_sensor", + }; }; export const GESTURE_CONTENT = ( - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void + onSelectGestures?: (event: React.ChangeEvent) => void, + sendGesture?: (isActive: boolean) => void ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-gesture-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-gesture-sensor.description", - tryItDescription: "toolbar-clue-gesture-sensor.tryItDescription", - components: [ - , - ], - id: "gesture_sensor", - }; + return { + descriptionTitle: "toolbar-clue-gesture-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-gesture-sensor.description", + tryItDescription: "toolbar-clue-gesture-sensor.tryItDescription", + components: [ + , + ], + id: "gesture_sensor", + }; }; export const PROXIMITY_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const proximitySensorValues = { - P: sensorValues[SENSOR_LIST.PROXIMITY], - }; - return { - descriptionTitle: "toolbar-clue-proximity-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-proximity-sensor.description", - tryItDescription: "toolbar-clue-proximity-sensor.tryItDescription", - components: [ - , - ], - id: "proximity_sensor", - }; + const proximitySensorValues = { + P: sensorValues[SENSOR_LIST.PROXIMITY], + }; + return { + descriptionTitle: "toolbar-clue-proximity-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-proximity-sensor.description", + tryItDescription: "toolbar-clue-proximity-sensor.tryItDescription", + components: [ + , + ], + id: "proximity_sensor", + }; }; export const PRESSURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const pressureSensorValues = { - P: sensorValues[SENSOR_LIST.PRESSURE], - }; - return { - descriptionTitle: "toolbar-clue-pressure-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-pressure-sensor.description", - tryItDescription: "toolbar-clue-pressure-sensor.tryItDescription", - components: [ - , - ], - id: "pressure_sensor", - }; + const pressureSensorValues = { + P: sensorValues[SENSOR_LIST.PRESSURE], + }; + return { + descriptionTitle: "toolbar-clue-pressure-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-pressure-sensor.description", + tryItDescription: "toolbar-clue-pressure-sensor.tryItDescription", + components: [ + , + ], + id: "pressure_sensor", + }; }; export const BUTTON_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-a-b-push.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-clue-a-b-push.description", - tryItDescription: "toolbar-clue-a-b-push.tryItDescription", - components: undefined, - id: "microbit_button", - }; + return { + descriptionTitle: "toolbar-clue-a-b-push.title", + tagInput: undefined, + tagOutput: TAG_INPUT_SVG, + descriptionText: "toolbar-clue-a-b-push.description", + tryItDescription: "toolbar-clue-a-b-push.tryItDescription", + components: undefined, + id: "microbit_button", + }; }; export const BLUETOOTH_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-bluetooth.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-clue-bluetooth.description", - tryItDescription: "toolbar-clue-bluetooth.tryItDescription", - components: undefined, - id: "bluetooth", - }; + return { + descriptionTitle: "toolbar-clue-bluetooth.title", + tagInput: undefined, + tagOutput: TAG_INPUT_SVG, + descriptionText: "toolbar-clue-bluetooth.description", + tryItDescription: "toolbar-clue-bluetooth.tryItDescription", + components: undefined, + id: "bluetooth", + }; }; export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-sound-sensor.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-sound-sensor.description", - tryItDescription: "toolbar-clue-sound-sensor.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "sound_sensor", - }; + return { + descriptionTitle: "toolbar-clue-sound-sensor.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-sound-sensor.description", + tryItDescription: "toolbar-clue-sound-sensor.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "sound_sensor", + }; }; export const LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-led.description", - tryItDescription: "toolbar-clue-led.tryItDescription", - components: undefined, - id: "clue_neopixel", - }; + return { + descriptionTitle: "toolbar-clue-led.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-led.description", + tryItDescription: "toolbar-clue-led.tryItDescription", + components: undefined, + id: "clue_neopixel", + }; }; export const SPEAKER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-speaker.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-speaker.description", - tryItDescription: "toolbar-speaker.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "speaker", - }; + return { + descriptionTitle: "toolbar-speaker.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-speaker.description", + tryItDescription: "toolbar-speaker.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "speaker", + }; }; diff --git a/Source/view/components/toolbar/clue/ClueSensorProperties.tsx b/Source/view/components/toolbar/clue/ClueSensorProperties.tsx index ad40283f8..f8194eeb3 100644 --- a/Source/view/components/toolbar/clue/ClueSensorProperties.tsx +++ b/Source/view/components/toolbar/clue/ClueSensorProperties.tsx @@ -2,215 +2,215 @@ import { SENSOR_LIST } from "../../../constants"; import { ISensorProps, ISliderProps } from "../../../viewUtils"; const CLUE_SLIDER_R: ISliderProps = { - axisLabel: "R", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_R, - step: 1, + axisLabel: "R", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_R, + step: 1, }; const CLUE_SLIDER_G: ISliderProps = { - axisLabel: "G", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_G, - step: 1, + axisLabel: "G", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_G, + step: 1, }; const CLUE_SLIDER_B: ISliderProps = { - axisLabel: "B", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_B, - step: 1, + axisLabel: "B", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_B, + step: 1, }; const CLUE_SLIDER_C: ISliderProps = { - axisLabel: "C", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_C, - step: 1, + axisLabel: "C", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_C, + step: 1, }; export const CLUE_LIGHT_PROPERTIES: ISensorProps = { - LABEL: "Light Sensor", - sliderProps: [CLUE_SLIDER_R, CLUE_SLIDER_G, CLUE_SLIDER_B, CLUE_SLIDER_C], - unitLabel: "Lux", + LABEL: "Light Sensor", + sliderProps: [CLUE_SLIDER_R, CLUE_SLIDER_G, CLUE_SLIDER_B, CLUE_SLIDER_C], + unitLabel: "Lux", }; // Range for magnet found here https://www.adafruit.com/product/4479 const CLUE_MAGNET_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_X, - step: 0.1, + axisLabel: "X", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.MAGNET_X, + step: 0.1, }; const CLUE_MAGNET_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_Y, - step: 0.1, + axisLabel: "Y", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.MAGNET_Y, + step: 0.1, }; const CLUE_MAGNET_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_Z, - step: 0.1, + axisLabel: "Z", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.MAGNET_Z, + step: 0.1, }; export const CLUE_MAGNET_PROPERTIES: ISensorProps = { - LABEL: "Magnetoscope", - sliderProps: [CLUE_MAGNET_X, CLUE_MAGNET_Y, CLUE_MAGNET_Z], - unitLabel: "μT", + LABEL: "Magnetoscope", + sliderProps: [CLUE_MAGNET_X, CLUE_MAGNET_Y, CLUE_MAGNET_Z], + unitLabel: "μT", }; const CLUE_GYRO_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_X, - step: 0.1, + axisLabel: "X", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.GYRO_X, + step: 0.1, }; const CLUE_GYRO_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_Y, - step: 0.1, + axisLabel: "Y", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.GYRO_Y, + step: 0.1, }; const CLUE_GYRO_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_Z, - step: 0.1, + axisLabel: "Z", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.GYRO_Z, + step: 0.1, }; export const CLUE_GYRO_PROPERTIES: ISensorProps = { - LABEL: "Gyroscope", - sliderProps: [CLUE_GYRO_X, CLUE_GYRO_Y, CLUE_GYRO_Z], - unitLabel: "deg/s", + LABEL: "Gyroscope", + sliderProps: [CLUE_GYRO_X, CLUE_GYRO_Y, CLUE_GYRO_Z], + unitLabel: "deg/s", }; export const CLUE_HUMIDITY_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "H", - maxLabel: "Max", - maxValue: 100, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.HUMIDITY, - step: 0.1, - }, - ], - unitLabel: "%", + LABEL: "Humidity Sensor", + sliderProps: [ + { + axisLabel: "H", + maxLabel: "Max", + maxValue: 100, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.HUMIDITY, + step: 0.1, + }, + ], + unitLabel: "%", }; export const CLUE__PROXIMITY_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "P", - maxLabel: "Max", - maxValue: 255, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.PROXIMITY, - step: 1, - }, - ], - unitLabel: "", + LABEL: "Humidity Sensor", + sliderProps: [ + { + axisLabel: "P", + maxLabel: "Max", + maxValue: 255, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.PROXIMITY, + step: 1, + }, + ], + unitLabel: "", }; export const CLUE_PRESSURE_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "P", - maxLabel: "Max", - maxValue: 1100, - minLabel: "Min", - minValue: 800, - type: SENSOR_LIST.PRESSURE, - step: 0.1, - }, - ], - unitLabel: "hPa", + LABEL: "Humidity Sensor", + sliderProps: [ + { + axisLabel: "P", + maxLabel: "Max", + maxValue: 1100, + minLabel: "Min", + minValue: 800, + type: SENSOR_LIST.PRESSURE, + step: 0.1, + }, + ], + unitLabel: "hPa", }; const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 1023, - minLabel: "Left", - minValue: -1023, - type: SENSOR_LIST.MOTION_X, - step: 0.1, + axisLabel: "X", + maxLabel: "Right", + maxValue: 1023, + minLabel: "Left", + minValue: -1023, + type: SENSOR_LIST.MOTION_X, + step: 0.1, }; const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 1023, - minLabel: "Back", - minValue: -1023, - type: SENSOR_LIST.MOTION_Y, - step: 0.1, + axisLabel: "Y", + maxLabel: "Front", + maxValue: 1023, + minLabel: "Back", + minValue: -1023, + type: SENSOR_LIST.MOTION_Y, + step: 0.1, }; const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 1023, - minLabel: "Up", - minValue: -1023, - type: SENSOR_LIST.MOTION_Z, - step: 0.1, + axisLabel: "Z", + maxLabel: "Down", + maxValue: 1023, + minLabel: "Up", + minValue: -1023, + type: SENSOR_LIST.MOTION_Z, + step: 0.1, }; export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "m/s2", + LABEL: "Motion sensor", + sliderProps: [ + MOTION_SLIDER_PROPS_X, + MOTION_SLIDER_PROPS_Y, + MOTION_SLIDER_PROPS_Z, + ], + unitLabel: "m/s2", }; const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 0.1, + axisLabel: "T", + maxLabel: "Hot", + maxValue: 125, + minLabel: "Cold", + minValue: -55, + type: SENSOR_LIST.TEMPERATURE, + step: 0.1, }; export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", + LABEL: "Temperature sensor", + sliderProps: [TEMPERATURE_SLIDER_PROPS], + unitLabel: "°C", }; diff --git a/Source/view/components/toolbar/cpx/CpxModalContent.tsx b/Source/view/components/toolbar/cpx/CpxModalContent.tsx index 669a059ea..55166eb2a 100644 --- a/Source/view/components/toolbar/cpx/CpxModalContent.tsx +++ b/Source/view/components/toolbar/cpx/CpxModalContent.tsx @@ -4,195 +4,195 @@ import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; import { GenericSliderComponent } from "../GenericSliderComponent"; import { - FEATURE_REQUEST_ON_GITHUB, - IModalContent, - TRY_IT_MAKE_CODE, + FEATURE_REQUEST_ON_GITHUB, + IModalContent, + TRY_IT_MAKE_CODE, } from "../SensorModalUtils"; import * as SENSOR_PROPERTIES from "./CpxSensorProperties"; export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-gpio.description", - tryItDescription: "toolbar-gpio.tryItDescription", - components: undefined, - id: "GPIO", - }; + return { + descriptionTitle: "toolbar-gpio.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-gpio.description", + tryItDescription: "toolbar-gpio.tryItDescription", + components: undefined, + id: "GPIO", + }; }; export const IR_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-ir-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-ir-sensor.description", - tryItDescription: "toolbar-ir-sensor.tryItDescription", - components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], - id: "IR", - }; + return { + descriptionTitle: "toolbar-ir-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-ir-sensor.description", + tryItDescription: "toolbar-ir-sensor.tryItDescription", + components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], + id: "IR", + }; }; export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const lightSensorValues = { - L: sensorValues[SENSOR_LIST.LIGHT], - }; - return { - descriptionTitle: "toolbar-light-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-light-sensor.description", - tryItDescription: "toolbar-light-sensor.tryItDescription", - components: [ - , - ], - id: "light_sensor", - }; + const lightSensorValues = { + L: sensorValues[SENSOR_LIST.LIGHT], + }; + return { + descriptionTitle: "toolbar-light-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-light-sensor.description", + tryItDescription: "toolbar-light-sensor.tryItDescription", + components: [ + , + ], + id: "light_sensor", + }; }; export const MOTION_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const motionSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - descriptionTitle: "toolbar-motion-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-motion-sensor.description", - tryItDescription: "toolbar-motion-sensor.tryItDescription", - components: [ - , - TRY_IT_MAKE_CODE, - FEATURE_REQUEST_ON_GITHUB, - ], - id: "motion_sensor", - }; + const motionSensorValues = { + X: sensorValues[SENSOR_LIST.MOTION_X], + Y: sensorValues[SENSOR_LIST.MOTION_Y], + Z: sensorValues[SENSOR_LIST.MOTION_Z], + }; + return { + descriptionTitle: "toolbar-motion-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-motion-sensor.description", + tryItDescription: "toolbar-motion-sensor.tryItDescription", + components: [ + , + TRY_IT_MAKE_CODE, + FEATURE_REQUEST_ON_GITHUB, + ], + id: "motion_sensor", + }; }; export const NEOP_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-neo-pixels.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-neo-pixels.description", - tryItDescription: "toolbar-neo-pixels.tryItDescription", - components: undefined, - id: "neon_pixel", - }; + return { + descriptionTitle: "toolbar-neo-pixels.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-neo-pixels.description", + tryItDescription: "toolbar-neo-pixels.tryItDescription", + components: undefined, + id: "neon_pixel", + }; }; export const PUSHB_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-a-b-push.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-a-b-push.description", - tryItDescription: "toolbar-a-b-push.tryItDescription", - components: undefined, - id: "push_btn", - }; + return { + descriptionTitle: "toolbar-a-b-push.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-a-b-push.description", + tryItDescription: "toolbar-a-b-push.tryItDescription", + components: undefined, + id: "push_btn", + }; }; export const RED_LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-red-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-red-led.description", - tryItDescription: "toolbar-red-led.tryItDescription", - components: undefined, - id: "red_LED", - }; + return { + descriptionTitle: "toolbar-red-led.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-red-led.description", + tryItDescription: "toolbar-red-led.tryItDescription", + components: undefined, + id: "red_LED", + }; }; export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-sound-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-sound-sensor.description", - tryItDescription: "toolbar-sound-sensor.tryItDescription", - components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], - id: "sound_sensor", - }; + return { + descriptionTitle: "toolbar-sound-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-sound-sensor.description", + tryItDescription: "toolbar-sound-sensor.tryItDescription", + components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], + id: "sound_sensor", + }; }; export const SWITCH_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-slider-switch.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-slider-switch.description", - tryItDescription: "toolbar-slider-switch.tryItDescription", - components: undefined, - id: "slider_switch", - }; + return { + descriptionTitle: "toolbar-slider-switch.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-slider-switch.description", + tryItDescription: "toolbar-slider-switch.tryItDescription", + components: undefined, + id: "slider_switch", + }; }; export const SPEAKER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-speaker.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-speaker.description", - tryItDescription: "toolbar-speaker.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "speaker", - }; + return { + descriptionTitle: "toolbar-speaker.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-speaker.description", + tryItDescription: "toolbar-speaker.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "speaker", + }; }; export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-temperature-sensor.description", - descriptionTitle: "toolbar-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-temperature-sensor.tryItDescription", - }; + const temperatureSensorValues = { + T: sensorValues[SENSOR_LIST.TEMPERATURE], + }; + return { + components: [ + , + ], + descriptionText: "toolbar-temperature-sensor.description", + descriptionTitle: "toolbar-temperature-sensor.title", + id: "temperature", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-temperature-sensor.tryItDescription", + }; }; diff --git a/Source/view/components/toolbar/cpx/CpxSensorProperties.tsx b/Source/view/components/toolbar/cpx/CpxSensorProperties.tsx index 478eb36c0..f91f91469 100644 --- a/Source/view/components/toolbar/cpx/CpxSensorProperties.tsx +++ b/Source/view/components/toolbar/cpx/CpxSensorProperties.tsx @@ -2,70 +2,70 @@ import { SENSOR_LIST } from "../../../constants"; import { ISensorProps, ISliderProps } from "../../../viewUtils"; const LIGHT_SLIDER_PROPS: ISliderProps = { - maxValue: 320, - minValue: 0, - minLabel: "Dark", - maxLabel: "Bright", - type: "light", - axisLabel: "L", - step: 1, + maxValue: 320, + minValue: 0, + minLabel: "Dark", + maxLabel: "Bright", + type: "light", + axisLabel: "L", + step: 1, }; export const LIGHT_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Light sensor", - sliderProps: [LIGHT_SLIDER_PROPS], - unitLabel: "Lux", + LABEL: "Light sensor", + sliderProps: [LIGHT_SLIDER_PROPS], + unitLabel: "Lux", }; const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 0.1, + axisLabel: "T", + maxLabel: "Hot", + maxValue: 125, + minLabel: "Cold", + minValue: -55, + type: SENSOR_LIST.TEMPERATURE, + step: 0.1, }; export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", + LABEL: "Temperature sensor", + sliderProps: [TEMPERATURE_SLIDER_PROPS], + unitLabel: "°C", }; const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 78, - minLabel: "Left", - minValue: -78, - type: SENSOR_LIST.MOTION_X, - step: 1, + axisLabel: "X", + maxLabel: "Right", + maxValue: 78, + minLabel: "Left", + minValue: -78, + type: SENSOR_LIST.MOTION_X, + step: 1, }; const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 78, - minLabel: "Back", - minValue: -78, - type: SENSOR_LIST.MOTION_Y, - step: 1, + axisLabel: "Y", + maxLabel: "Front", + maxValue: 78, + minLabel: "Back", + minValue: -78, + type: SENSOR_LIST.MOTION_Y, + step: 1, }; const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 78, - minLabel: "Up", - minValue: -78, - type: SENSOR_LIST.MOTION_Z, - step: 1, + axisLabel: "Z", + maxLabel: "Down", + maxValue: 78, + minLabel: "Up", + minValue: -78, + type: SENSOR_LIST.MOTION_Z, + step: 1, }; export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "Lux", + LABEL: "Motion sensor", + sliderProps: [ + MOTION_SLIDER_PROPS_X, + MOTION_SLIDER_PROPS_Y, + MOTION_SLIDER_PROPS_Z, + ], + unitLabel: "Lux", }; diff --git a/Source/view/components/toolbar/microbit/MicrobitModalContent.tsx b/Source/view/components/toolbar/microbit/MicrobitModalContent.tsx index c0ffe7b5b..c53cf5554 100644 --- a/Source/view/components/toolbar/microbit/MicrobitModalContent.tsx +++ b/Source/view/components/toolbar/microbit/MicrobitModalContent.tsx @@ -8,180 +8,180 @@ import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; import * as SENSOR_PROPERTIES from "./MicrobitSensorProperties"; export const ACCELEROMETER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - // this object will be accessed with the axis label - const accelerometerSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-accelerometer-sensor.description", - descriptionTitle: "toolbar-accelerometer-sensor.title", - id: "accelerometer", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-accelerometer-sensor.tryItDescription", - }; + // this object will be accessed with the axis label + const accelerometerSensorValues = { + X: sensorValues[SENSOR_LIST.MOTION_X], + Y: sensorValues[SENSOR_LIST.MOTION_Y], + Z: sensorValues[SENSOR_LIST.MOTION_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-accelerometer-sensor.description", + descriptionTitle: "toolbar-accelerometer-sensor.title", + id: "accelerometer", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-accelerometer-sensor.tryItDescription", + }; }; export const LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-led.description", - tryItDescription: "toolbar-microbit-led.tryItDescription", - components: undefined, - id: "microbit_LED", - }; + return { + descriptionTitle: "toolbar-microbit-led.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-led.description", + tryItDescription: "toolbar-microbit-led.tryItDescription", + components: undefined, + id: "microbit_LED", + }; }; export const BUTTON_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-a-b-push.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-microbit-a-b-push.description", - tryItDescription: "toolbar-microbit-a-b-push.tryItDescription", - components: undefined, - id: "microbit_button", - }; + return { + descriptionTitle: "toolbar-microbit-a-b-push.title", + tagInput: undefined, + tagOutput: TAG_INPUT_SVG, + descriptionText: "toolbar-microbit-a-b-push.description", + tryItDescription: "toolbar-microbit-a-b-push.tryItDescription", + components: undefined, + id: "microbit_button", + }; }; export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-sound.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-sound.description", - tryItDescription: "toolbar-microbit-sound.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_sound", - }; + return { + descriptionTitle: "toolbar-microbit-sound.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-sound.description", + tryItDescription: "toolbar-microbit-sound.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_sound", + }; }; export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-gpio.description", - tryItDescription: "toolbar-microbit-gpio.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_gpio", - }; + return { + descriptionTitle: "toolbar-microbit-gpio.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-gpio.description", + tryItDescription: "toolbar-microbit-gpio.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_gpio", + }; }; export const COMPASS_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-compass-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-compass-sensor.description", - tryItDescription: "toolbar-microbit-compass-sensor.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_compass", - }; + return { + descriptionTitle: "toolbar-microbit-compass-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-compass-sensor.description", + tryItDescription: "toolbar-microbit-compass-sensor.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_compass", + }; }; export const WIRELESS_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-wireless.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-wireless.description", - tryItDescription: "toolbar-microbit-wireless.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_wireless", - }; + return { + descriptionTitle: "toolbar-microbit-wireless.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-wireless.description", + tryItDescription: "toolbar-microbit-wireless.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_wireless", + }; }; export const GESTURE_CONTENT = ( - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void + onSelectGestures?: (event: React.ChangeEvent) => void, + sendGesture?: (isActive: boolean) => void ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-gesture-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-microbit-gesture-sensor.description", - tryItDescription: "toolbar-microbit-gesture-sensor.tryItDescription", - components: [ - , - ], - id: "gesture_sensor", - }; + return { + descriptionTitle: "toolbar-microbit-gesture-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-microbit-gesture-sensor.description", + tryItDescription: "toolbar-microbit-gesture-sensor.tryItDescription", + components: [ + , + ], + id: "gesture_sensor", + }; }; export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const lightSensorValues = { - L: sensorValues[SENSOR_LIST.LIGHT], - }; - return { - descriptionTitle: "toolbar-light-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-light-sensor.description", - tryItDescription: "toolbar-light-sensor.tryItDescription", - components: [ - , - ], - id: "light_sensor", - }; + const lightSensorValues = { + L: sensorValues[SENSOR_LIST.LIGHT], + }; + return { + descriptionTitle: "toolbar-light-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-light-sensor.description", + tryItDescription: "toolbar-light-sensor.tryItDescription", + components: [ + , + ], + id: "light_sensor", + }; }; export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-temperature-sensor.description", - descriptionTitle: "toolbar-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-temperature-sensor.tryItDescription", - }; + const temperatureSensorValues = { + T: sensorValues[SENSOR_LIST.TEMPERATURE], + }; + return { + components: [ + , + ], + descriptionText: "toolbar-temperature-sensor.description", + descriptionTitle: "toolbar-temperature-sensor.title", + id: "temperature", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-temperature-sensor.tryItDescription", + }; }; diff --git a/Source/view/components/toolbar/microbit/MicrobitSensorProperties.tsx b/Source/view/components/toolbar/microbit/MicrobitSensorProperties.tsx index 4a8974625..c32b00477 100644 --- a/Source/view/components/toolbar/microbit/MicrobitSensorProperties.tsx +++ b/Source/view/components/toolbar/microbit/MicrobitSensorProperties.tsx @@ -2,73 +2,73 @@ import { SENSOR_LIST } from "../../../constants"; import { ISensorProps, ISliderProps } from "../../../viewUtils"; const LIGHT_SLIDER_PROPS: ISliderProps = { - maxValue: 255, - minValue: 0, - minLabel: "Dark", - maxLabel: "Bright", - type: "light", - axisLabel: "L", - step: 1, + maxValue: 255, + minValue: 0, + minLabel: "Dark", + maxLabel: "Bright", + type: "light", + axisLabel: "L", + step: 1, }; export const LIGHT_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Light sensor", - sliderProps: [LIGHT_SLIDER_PROPS], - unitLabel: "Lux", + LABEL: "Light sensor", + sliderProps: [LIGHT_SLIDER_PROPS], + unitLabel: "Lux", }; const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 1023, - minLabel: "Left", - minValue: -1023, - type: SENSOR_LIST.MOTION_X, - step: 1, + axisLabel: "X", + maxLabel: "Right", + maxValue: 1023, + minLabel: "Left", + minValue: -1023, + type: SENSOR_LIST.MOTION_X, + step: 1, }; const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 1023, - minLabel: "Back", - minValue: -1023, - type: SENSOR_LIST.MOTION_Y, - step: 1, + axisLabel: "Y", + maxLabel: "Front", + maxValue: 1023, + minLabel: "Back", + minValue: -1023, + type: SENSOR_LIST.MOTION_Y, + step: 1, }; const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 1023, - minLabel: "Up", - minValue: -1023, - type: SENSOR_LIST.MOTION_Z, - step: 1, + axisLabel: "Z", + maxLabel: "Down", + maxValue: 1023, + minLabel: "Up", + minValue: -1023, + type: SENSOR_LIST.MOTION_Z, + step: 1, }; export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "m/s2", + LABEL: "Motion sensor", + sliderProps: [ + MOTION_SLIDER_PROPS_X, + MOTION_SLIDER_PROPS_Y, + MOTION_SLIDER_PROPS_Z, + ], + unitLabel: "m/s2", }; const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 1, + axisLabel: "T", + maxLabel: "Hot", + maxValue: 125, + minLabel: "Cold", + minValue: -55, + type: SENSOR_LIST.TEMPERATURE, + step: 1, }; export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", + LABEL: "Temperature sensor", + sliderProps: [TEMPERATURE_SLIDER_PROPS], + unitLabel: "°C", }; diff --git a/Source/view/constants.ts b/Source/view/constants.ts index 2503ff43c..56dda92af 100644 --- a/Source/view/constants.ts +++ b/Source/view/constants.ts @@ -3,150 +3,150 @@ // Key events export const CONSTANTS = { - CURRENTLY_RUNNING: (file: string) => { - return `Currently running: ${file}`; - }, - DEVICE_NAME: { - CPX: "CPX", - MICROBIT: "micro:bit", - }, - ID_NAME: { - BUTTON_A: "BTN_A_OUTER", - BUTTON_AB: "BTN_AB_OUTER", - BUTTON_B: "BTN_B_OUTER", - PIN_A1: "PIN_A1", - PIN_A2: "PIN_A2", - PIN_A3: "PIN_A3", - PIN_A4: "PIN_A4", - PIN_A5: "PIN_A5", - PIN_A6: "PIN_A6", - PIN_A7: "PIN_A7", - PLAY_BUTTON: "play-button", - REFRESH_BUTTON: "refresh-button", - STOP_BUTTON: "stop-button", - SWITCH: "SWITCH", - }, - KEYBOARD_KEYS: { - A: "KeyA", - B: "KeyB", - C: "KeyC", - CAPITAL_R: "R", - CAPITAL_F: "F", - ENTER: "Enter", - S: "KeyS", - NUMERIC_ONE: "Digit1", - NUMERIC_TWO: "Digit2", - NUMERIC_THREE: "Digit3", - NUMERIC_FOUR: "Digit4", - NUMERIC_FIVE: "Digit5", - NUMERIC_SIX: "Digit6", - NUMERIC_SEVEN: "Digit7", - }, - FILES_PLACEHOLDER: - "The simulator will run the .py file you have focused on.", - SIMULATOR_BUTTON_WIDTH: 60, - TOOLBAR_INFO: `Explore what's on the board:`, - LED_TINT_FACTOR: 0.5, + CURRENTLY_RUNNING: (file: string) => { + return `Currently running: ${file}`; + }, + DEVICE_NAME: { + CPX: "CPX", + MICROBIT: "micro:bit", + }, + ID_NAME: { + BUTTON_A: "BTN_A_OUTER", + BUTTON_AB: "BTN_AB_OUTER", + BUTTON_B: "BTN_B_OUTER", + PIN_A1: "PIN_A1", + PIN_A2: "PIN_A2", + PIN_A3: "PIN_A3", + PIN_A4: "PIN_A4", + PIN_A5: "PIN_A5", + PIN_A6: "PIN_A6", + PIN_A7: "PIN_A7", + PLAY_BUTTON: "play-button", + REFRESH_BUTTON: "refresh-button", + STOP_BUTTON: "stop-button", + SWITCH: "SWITCH", + }, + KEYBOARD_KEYS: { + A: "KeyA", + B: "KeyB", + C: "KeyC", + CAPITAL_R: "R", + CAPITAL_F: "F", + ENTER: "Enter", + S: "KeyS", + NUMERIC_ONE: "Digit1", + NUMERIC_TWO: "Digit2", + NUMERIC_THREE: "Digit3", + NUMERIC_FOUR: "Digit4", + NUMERIC_FIVE: "Digit5", + NUMERIC_SIX: "Digit6", + NUMERIC_SEVEN: "Digit7", + }, + FILES_PLACEHOLDER: + "The simulator will run the .py file you have focused on.", + SIMULATOR_BUTTON_WIDTH: 60, + TOOLBAR_INFO: `Explore what's on the board:`, + LED_TINT_FACTOR: 0.5, }; export const AB_BUTTONS_KEYS = { - BTN_A: "BTN_A", - BTN_B: "BTN_B", - BTN_AB: "BTN_AB", + BTN_A: "BTN_A", + BTN_B: "BTN_B", + BTN_AB: "BTN_AB", }; export const BUTTON_CLASSNAME = { - ACTIVE: "sim-button-group", - DEACTIVATED: "sim-button-group-deactivated", + ACTIVE: "sim-button-group", + DEACTIVATED: "sim-button-group-deactivated", }; export const BUTTON_STYLING_CLASSES = { - DEFAULT: "sim-button-outer", - KEYPRESSED: "sim-button-key-press", + DEFAULT: "sim-button-outer", + KEYPRESSED: "sim-button-key-press", }; export const CLUE_LEDS_COLORS = { - WHITE_LEDS_OFF: "#ffde00", - WHITE_LEDS_ON: "white", - RED_LED_OFF: "#808080", - RED_LED_ON: "red", + WHITE_LEDS_OFF: "#ffde00", + WHITE_LEDS_ON: "white", + RED_LED_OFF: "#808080", + RED_LED_ON: "red", }; export enum DEVICE_LIST_KEY { - CPX = "CPX", - MICROBIT = "micro:bit", - CLUE = "CLUE", + CPX = "CPX", + MICROBIT = "micro:bit", + CLUE = "CLUE", } // Pauses on Debug mode alter the state of the view export enum VIEW_STATE { - PAUSE = "debug-pause", - RUNNING = "running", + PAUSE = "debug-pause", + RUNNING = "running", } // export enum WEBVIEW_MESSAGES { - SWITCH_DEVICE = "switch-device", - REFRESH_SIMULATOR = "refresh-simulator", - TOGGLE_PLAY_STOP = "toggle-play-stop", - BUTTON_PRESS = "button-press", - SENSOR_CHANGED = "sensor-changed", - GESTURE = "gesture", - SLIDER_TELEMETRY = "slider-telemetry", + SWITCH_DEVICE = "switch-device", + REFRESH_SIMULATOR = "refresh-simulator", + TOGGLE_PLAY_STOP = "toggle-play-stop", + BUTTON_PRESS = "button-press", + SENSOR_CHANGED = "sensor-changed", + GESTURE = "gesture", + SLIDER_TELEMETRY = "slider-telemetry", } export enum VSCODE_MESSAGES_TO_WEBVIEW { - SET_DEVICE = "set-device", - PAUSE_DEVICE = "pause-device", - RUN_DEVICE = "run-device", - RESET = "reset-state", - CURRENT_FILE = "current-file", - SET_STATE = "set-state", + SET_DEVICE = "set-device", + PAUSE_DEVICE = "pause-device", + RUN_DEVICE = "run-device", + RESET = "reset-state", + CURRENT_FILE = "current-file", + SET_STATE = "set-state", } export enum DEBUG_COMMANDS { - STACK_TRACE = "stackTrace", - CONTINUE = "continue", - DISCONNECT = "disconnect", + STACK_TRACE = "stackTrace", + CONTINUE = "continue", + DISCONNECT = "disconnect", } export enum SENSOR_LIST { - TEMPERATURE = "temperature", - LIGHT = "light", - ACCELEROMETER = "accelerometer", - MOTION_X = "motion_x", - MOTION_Y = "motion_y", - MOTION_Z = "motion_z", - LIGHT_R = "light_r", - LIGHT_G = "light_g", - LIGHT_B = "light_b", - LIGHT_C = "light_c", - HUMIDITY = "humidity", - PRESSURE = "pressure", - PROXIMITY = "proximity", - MAGNET_X = "magnet_x", - MAGNET_Y = "magnet_y", - MAGNET_Z = "magnet_z", - GYRO_X = "gyro_x", - GYRO_Y = "gyro_y", - GYRO_Z = "gyro_z", + TEMPERATURE = "temperature", + LIGHT = "light", + ACCELEROMETER = "accelerometer", + MOTION_X = "motion_x", + MOTION_Y = "motion_y", + MOTION_Z = "motion_z", + LIGHT_R = "light_r", + LIGHT_G = "light_g", + LIGHT_B = "light_b", + LIGHT_C = "light_c", + HUMIDITY = "humidity", + PRESSURE = "pressure", + PROXIMITY = "proximity", + MAGNET_X = "magnet_x", + MAGNET_Y = "magnet_y", + MAGNET_Z = "magnet_z", + GYRO_X = "gyro_x", + GYRO_Y = "gyro_y", + GYRO_Z = "gyro_z", } export const GESTURES_MICROBIT = [ - "shake", - "up", - "down", - "left", - "right", - "face up", - "face down", - "freefall", - "3g", - "6g", - "8g", + "shake", + "up", + "down", + "left", + "right", + "face up", + "face down", + "freefall", + "3g", + "6g", + "8g", ]; export const GESTURES_CLUE = ["up", "down", "left", "right", "shake"]; export enum WEBVIEW_ATTRIBUTES_KEY { - INITIAL_DEVICE = "initial_device", - TYPE = "webview_type", + INITIAL_DEVICE = "initial_device", + TYPE = "webview_type", } export enum WEBVIEW_TYPES { - SIMULATOR = "simulator", - GETTING_STARTED = "getting_started", + SIMULATOR = "simulator", + GETTING_STARTED = "getting_started", } export const DEFAULT_IMG_CLUE = `/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAEBAQEBAQEBA QEBAQEBAQICAQEBAQMCAgICAwMEBAMDAwMEBAYFBAQFBAMDBQcFBQYGBgYGBAUHBwcGBwYGBgb/2wBDAQEBAQEBAQMCAgMGBAMEB diff --git a/Source/view/container/device/Device.spec.tsx b/Source/view/container/device/Device.spec.tsx index 5271bcdfa..0423721ef 100644 --- a/Source/view/container/device/Device.spec.tsx +++ b/Source/view/container/device/Device.spec.tsx @@ -6,25 +6,25 @@ import { DEVICE_LIST_KEY } from "../../constants"; import { Device } from "./Device"; describe("Device component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/container/device/Device.tsx b/Source/view/container/device/Device.tsx index 41705059e..dd30d2dc6 100644 --- a/Source/view/container/device/Device.tsx +++ b/Source/view/container/device/Device.tsx @@ -8,35 +8,35 @@ import { Microbit } from "../../components/microbit/Microbit"; import { DEVICE_LIST_KEY } from "../../constants"; interface IProps { - currentSelectedDevice: string; + currentSelectedDevice: string; } // Container to switch between multiple devices export class Device extends React.Component { - constructor(props: IProps) { - super(props); - } - render() { - const { currentSelectedDevice } = this.props; + constructor(props: IProps) { + super(props); + } + render() { + const { currentSelectedDevice } = this.props; - return ( -
- - {loadSelectedDevice(currentSelectedDevice)} - -
- ); - } + return ( +
+ + {loadSelectedDevice(currentSelectedDevice)} + +
+ ); + } } const loadSelectedDevice = (currentSelectedDevice: string) => { - switch (currentSelectedDevice) { - case DEVICE_LIST_KEY.CPX: - return ; - case DEVICE_LIST_KEY.MICROBIT: - return ; - case DEVICE_LIST_KEY.CLUE: - return ; - default: - return null; - } + switch (currentSelectedDevice) { + case DEVICE_LIST_KEY.CPX: + return ; + case DEVICE_LIST_KEY.MICROBIT: + return ; + case DEVICE_LIST_KEY.CLUE: + return ; + default: + return null; + } }; diff --git a/Source/view/index.css b/Source/view/index.css index 3801bbf26..918c31f9e 100644 --- a/Source/view/index.css +++ b/Source/view/index.css @@ -1,13 +1,13 @@ @import url("https://fonts.googleapis.com/css?family=Joti+One"); body { - margin: 0; - padding: 0; - font-family: sans-serif; + margin: 0; + padding: 0; + font-family: sans-serif; } html, body { - overflow: hidden; - height: 100%; + overflow: hidden; + height: 100%; } diff --git a/Source/view/index.tsx b/Source/view/index.tsx index 2d9c941b6..32e7400b1 100644 --- a/Source/view/index.tsx +++ b/Source/view/index.tsx @@ -12,11 +12,11 @@ const messageEn = require("./translations/en.json"); const locale = "en"; const message = { - en: messageEn, + en: messageEn, }; ReactDOM.render( - - - , - document.getElementById("root") + + + , + document.getElementById("root") ); diff --git a/Source/view/pages/gettingStarted.css b/Source/view/pages/gettingStarted.css index 29a072207..ae6d20b4f 100644 --- a/Source/view/pages/gettingStarted.css +++ b/Source/view/pages/gettingStarted.css @@ -1,56 +1,56 @@ .inv { - display: none; + display: none; } .codeText { - overflow-x: auto; - white-space: pre-wrap; - word-wrap: break-word; + overflow-x: auto; + white-space: pre-wrap; + word-wrap: break-word; } li:not(:last-child) { - margin-bottom: 6px; + margin-bottom: 6px; } .normalFontWeight { - font-weight: normal; + font-weight: normal; } .deviceSelector { - width: 250px; - border: 1px solid var(--vscode-dropdown-border); - background-color: var(--vscode-dropdown-background); - color: var(--vscode-dropdown-foreground); - margin: 0 0 5px; - padding: 8px; - border-radius: 5px; - font-size: 12px; - padding-right: 30px; + width: 250px; + border: 1px solid var(--vscode-dropdown-border); + background-color: var(--vscode-dropdown-background); + color: var(--vscode-dropdown-foreground); + margin: 0 0 5px; + padding: 8px; + border-radius: 5px; + font-size: 12px; + padding-right: 30px; } .deviceSelector optgroup { - background-color: var(--vscode-dropdown-listBackground); - color: var(--vscode-dropdown-foreground); + background-color: var(--vscode-dropdown-listBackground); + color: var(--vscode-dropdown-foreground); } .deviceSelector option { - background-color: var(--vscode-dropdown-listBackground); - color: var(--vscode-dropdown-foreground); + background-color: var(--vscode-dropdown-listBackground); + color: var(--vscode-dropdown-foreground); } .codeBox { - display: block; - width: 90%; - margin: 10px; - padding: 15px; - text-align: left; - background: none; - border: 1px solid grey; - border-radius: 4px; - background-color: var(--vscode-textCodeBlock-background); + display: block; + width: 90%; + margin: 10px; + padding: 15px; + text-align: left; + background: none; + border: 1px solid grey; + border-radius: 4px; + background-color: var(--vscode-textCodeBlock-background); } .container { - text-align: left; - padding: 0 10px 20px 10px; + text-align: left; + padding: 0 10px 20px 10px; } diff --git a/Source/view/pages/gettingStarted.spec.tsx b/Source/view/pages/gettingStarted.spec.tsx index c45e2e6d1..12554fdfb 100644 --- a/Source/view/pages/gettingStarted.spec.tsx +++ b/Source/view/pages/gettingStarted.spec.tsx @@ -5,25 +5,25 @@ import * as testRenderer from "react-test-renderer"; import { GettingStartedPage } from "./gettingStarted"; describe("GettingStartedPage component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/styles/Button.css b/Source/view/styles/Button.css index 993bd4937..c30ed1360 100644 --- a/Source/view/styles/Button.css +++ b/Source/view/styles/Button.css @@ -1,50 +1,50 @@ .button { - height: 32px; - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-debugToolBar-background); + height: 32px; + background: var(--vscode-debugToolBar-background); + border-color: var(--vscode-debugToolBar-background); } .button-icon { - fill: var(--vscode-badgeForegroundOverride); + fill: var(--vscode-badgeForegroundOverride); } .button-rectangle { - stroke: var(--vscode-badgeForegroundOverride); + stroke: var(--vscode-badgeForegroundOverride); } .play-button { - border-radius: 8px 0px 0px 8px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-radius: 8px 0px 0px 8px; + border-color: var(--vscode-highContrastButtonBorderOverride-color); } .refresh-button { - border-radius: 0px 8px 8px 0px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-radius: 0px 8px 8px 0px; + border-color: var(--vscode-highContrastButtonBorderOverride-color); } .button:focus, .button:hover { - background-color: var(--vscode-terminal-selectionBackground); + background-color: var(--vscode-terminal-selectionBackground); } .button:active { - background-color: var(--vscode-editor-selectionHighlightBackground); + background-color: var(--vscode-editor-selectionHighlightBackground); } .toolbar-button { - border: none; + border: none; } .toolbar-button:hover { - outline: none; + outline: none; } .edge-button { - pointer-events: none; - border: none; + pointer-events: none; + border: none; } .button-pressed { - background-color: var(--vscode-button-background); - outline: none; + background-color: var(--vscode-button-background); + outline: none; } diff --git a/Source/view/styles/Dropdown.css b/Source/view/styles/Dropdown.css index b617665a9..b69b14c74 100644 --- a/Source/view/styles/Dropdown.css +++ b/Source/view/styles/Dropdown.css @@ -1,24 +1,24 @@ .dropdown { - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-foreground); - border-radius: 2px; - box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.22); - color: var(--vscode-foreground); - height: 32px; - width: 100%; + background: var(--vscode-debugToolBar-background); + border-color: var(--vscode-foreground); + border-radius: 2px; + box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.22); + color: var(--vscode-foreground); + height: 32px; + width: 100%; } select.dropdown:hover, select.dropdown:focus, select.dropdown:active { - outline: 1px solid var(--vscode-button-background); + outline: 1px solid var(--vscode-button-background); } option { - height: 32px; - background: var(--vscode-debugToolBar-background); - outline: 0; - align-items: center; - font-size: 14px; - color: var(--vscode-foreground); + height: 32px; + background: var(--vscode-debugToolBar-background); + outline: 0; + align-items: center; + font-size: 14px; + color: var(--vscode-foreground); } diff --git a/Source/view/styles/InputSlider.css b/Source/view/styles/InputSlider.css index 0adcd1340..b51dae8f3 100644 --- a/Source/view/styles/InputSlider.css +++ b/Source/view/styles/InputSlider.css @@ -1,103 +1,103 @@ :root { - --slider-gray-color: #cccccc; - --slider-width: 240px; + --slider-gray-color: #cccccc; + --slider-width: 240px; } .inputSlider { - height: 48px; - margin-bottom: 60px; - display: table-cell; + height: 48px; + margin-bottom: 60px; + display: table-cell; } .sliderValue { - -webkit-appearance: none; - text-align: center; - width: 48px; - height: 32px; - background-color: var(--vscode-editor-background); - margin-right: 15px; - margin-top: auto; - margin-bottom: auto; - margin-left: 5px; - color: var(--badgeForegroundOverride); - border-radius: 2px; - font-size: 16px; - font-weight: bold; - border-width: 1px; - border-radius: 2px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); + -webkit-appearance: none; + text-align: center; + width: 48px; + height: 32px; + background-color: var(--vscode-editor-background); + margin-right: 15px; + margin-top: auto; + margin-bottom: auto; + margin-left: 5px; + color: var(--badgeForegroundOverride); + border-radius: 2px; + font-size: 16px; + font-weight: bold; + border-width: 1px; + border-radius: 2px; + border-color: var(--vscode-highContrastButtonBorderOverride-color); } .slider { - -webkit-appearance: none; - background-color: var(--slider-gray-color); - height: 1px; - width: var(--slider-width); - vertical-align: middle; + -webkit-appearance: none; + background-color: var(--slider-gray-color); + height: 1px; + width: var(--slider-width); + vertical-align: middle; } .slider::-webkit-slider-thumb { - -webkit-appearance: none; - appearance: none; - width: 16px; - height: 16px; - border-radius: 50%; - background: var(--vscode-textLink-activeForeground); - cursor: pointer; + -webkit-appearance: none; + appearance: none; + width: 16px; + height: 16px; + border-radius: 50%; + background: var(--vscode-textLink-activeForeground); + cursor: pointer; } .slider::-webkit-slider-runnable-track:focus, .inputSlider:focus, .slider:focus { - outline: none; + outline: none; } .sliderValue:focus, .sliderValue:hover { - -webkit-appearance: none; - color: var(--vscode-textLink-activeForeground); - outline: 1px solid var(--vscode-textLink-activeForeground); + -webkit-appearance: none; + color: var(--vscode-textLink-activeForeground); + outline: 1px solid var(--vscode-textLink-activeForeground); } .maxLabel, .minLabel { - display: inline-block; - position: absolute; - vertical-align: top; + display: inline-block; + position: absolute; + vertical-align: top; } .maxLabel { - right: 0; + right: 0; } .minLabel { - left: 0; + left: 0; } .sliderArea, .sliderValue { - display: inline-block; - vertical-align: middle; + display: inline-block; + vertical-align: middle; } .sliderArea { - width: var(--slider-width); - height: 49px; + width: var(--slider-width); + height: 49px; } .downLabelArea { - width: var(--slider-width); - height: 15px; - margin-top: 10px; - position: relative; - font-size: 14px; + width: var(--slider-width); + height: 15px; + margin-top: 10px; + position: relative; + font-size: 14px; } .upLabelArea { - width: var(--slider-width); - height: 15px; - margin-bottom: 10px; - position: relative; - font-weight: bolder; - font-size: 16px; + width: var(--slider-width); + height: 15px; + margin-bottom: 10px; + position: relative; + font-weight: bolder; + font-size: 16px; } .slider, .upLabelArea, .downLabelArea { - display: block; + display: block; } diff --git a/Source/view/styles/LightSensorBar.css b/Source/view/styles/LightSensorBar.css index ec70e6765..5d0abac42 100644 --- a/Source/view/styles/LightSensorBar.css +++ b/Source/view/styles/LightSensorBar.css @@ -1,20 +1,20 @@ .title { - font-size: 14px; - text-align: left; - font-weight: bold; + font-size: 14px; + text-align: left; + font-weight: bold; } .header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; + -webkit-appearance: none; + height: 30px; + margin-bottom: 2px; } .lightSensorBar { - -webkit-appearance: none; - margin-top: 10px; - width: 400px; - margin-left: auto; - margin-right: auto; - padding-bottom: 16px; + -webkit-appearance: none; + margin-top: 10px; + width: 400px; + margin-left: auto; + margin-right: auto; + padding-bottom: 16px; } diff --git a/Source/view/styles/MotionSensorBar.css b/Source/view/styles/MotionSensorBar.css index 5d68da3c9..8ea39c23c 100644 --- a/Source/view/styles/MotionSensorBar.css +++ b/Source/view/styles/MotionSensorBar.css @@ -1,20 +1,20 @@ .title { - font-size: 14px; - text-align: left; + font-size: 14px; + text-align: left; } .header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; + -webkit-appearance: none; + height: 30px; + margin-bottom: 2px; } .MotionSensorBar { - width: 100%; - margin-left: auto; - margin-right: auto; + width: 100%; + margin-left: auto; + margin-right: auto; } .sensor-button-container { - padding: 10px 0; + padding: 10px 0; } diff --git a/Source/view/styles/SensorButton.css b/Source/view/styles/SensorButton.css index 75c322083..21241eca2 100644 --- a/Source/view/styles/SensorButton.css +++ b/Source/view/styles/SensorButton.css @@ -1,29 +1,29 @@ .sensor-button { - color: var(--vscode-badgeForegroundOverride); - text-align: center; - background-color: var(--vscode-button-background); - width: 100%; - height: 32px; - font-weight: bolder; - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - padding: 4px; + color: var(--vscode-badgeForegroundOverride); + text-align: center; + background-color: var(--vscode-button-background); + width: 100%; + height: 32px; + font-weight: bolder; + border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-width: 1px; + border-style: solid; + padding: 4px; } .sensor-button:focus, .sensor-button:active { - outline-width: thick; - outline-offset: 4px; - outline: 2px solid var(--vscode-focusBorder); - background-color: var(--vscode-button-hoverBackground); + outline-width: thick; + outline-offset: 4px; + outline: 2px solid var(--vscode-focusBorder); + background-color: var(--vscode-button-hoverBackground); } .sensor-button:active, .active-button { - opacity: 0.5; + opacity: 0.5; } .sensor-button:hover { - background-color: var(--vscode-button-hoverBackground); + background-color: var(--vscode-button-hoverBackground); } diff --git a/Source/view/styles/Simulator.css b/Source/view/styles/Simulator.css index ea7979248..016cc8855 100644 --- a/Source/view/styles/Simulator.css +++ b/Source/view/styles/Simulator.css @@ -1,83 +1,83 @@ .simulator { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - max-width: 700px; - max-height: 700px; - margin-left: auto; - margin-right: auto; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + max-width: 700px; + max-height: 700px; + margin-left: auto; + margin-right: auto; } .buttons { - display: flex; - flex-direction: row; - padding-top: 20px; - justify-content: center; + display: flex; + flex-direction: row; + padding-top: 20px; + justify-content: center; } .file-selector { - padding: 20px; - width: 80%; - height: 30px; - border: 1px solid var(--vscode-debugToolBar-background); - border-radius: 3px; + padding: 20px; + width: 80%; + height: 30px; + border: 1px solid var(--vscode-debugToolBar-background); + border-radius: 3px; } .shake-pressed { - /* Start the shake animation and make the animation last for 0.5 seconds */ - animation: shake 0.5s; + /* Start the shake animation and make the animation last for 0.5 seconds */ + animation: shake 0.5s; - /* When the animation is finished, start again */ - animation-iteration-count: infinite; + /* When the animation is finished, start again */ + animation-iteration-count: infinite; } @keyframes shake { - 0% { - transform: translate(1px, 1px) rotate(0deg); - } - 10% { - transform: translate(-1px, -2px) rotate(-1deg); - } - 20% { - transform: translate(-3px, 0px) rotate(1deg); - } - 30% { - transform: translate(3px, 2px) rotate(0deg); - } - 40% { - transform: translate(1px, -1px) rotate(1deg); - } - 50% { - transform: translate(-1px, 2px) rotate(-1deg); - } - 60% { - transform: translate(-3px, 1px) rotate(0deg); - } - 70% { - transform: translate(3px, 1px) rotate(-1deg); - } - 80% { - transform: translate(-1px, -1px) rotate(1deg); - } - 90% { - transform: translate(1px, 2px) rotate(0deg); - } - 100% { - transform: translate(1px, -2px) rotate(-1deg); - } + 0% { + transform: translate(1px, 1px) rotate(0deg); + } + 10% { + transform: translate(-1px, -2px) rotate(-1deg); + } + 20% { + transform: translate(-3px, 0px) rotate(1deg); + } + 30% { + transform: translate(3px, 2px) rotate(0deg); + } + 40% { + transform: translate(1px, -1px) rotate(1deg); + } + 50% { + transform: translate(-1px, 2px) rotate(-1deg); + } + 60% { + transform: translate(-3px, 1px) rotate(0deg); + } + 70% { + transform: translate(3px, 1px) rotate(-1deg); + } + 80% { + transform: translate(-1px, -1px) rotate(1deg); + } + 90% { + transform: translate(1px, 2px) rotate(0deg); + } + 100% { + transform: translate(1px, -2px) rotate(-1deg); + } } .microbit-container { - max-width: 350px; - padding: 20px; + max-width: 350px; + padding: 20px; } .clue-container { - width: 100%; - max-width: 500px; - padding: 20px; + width: 100%; + max-width: 500px; + padding: 20px; } .cpx-container { - width: 100%; - padding-top: 10px; + width: 100%; + padding-top: 10px; } diff --git a/Source/view/styles/SimulatorSvg.css b/Source/view/styles/SimulatorSvg.css index 523411c2f..10d839893 100644 --- a/Source/view/styles/SimulatorSvg.css +++ b/Source/view/styles/SimulatorSvg.css @@ -1,115 +1,115 @@ .microbit-svg { - padding: 0 0 0 10px; + padding: 0 0 0 10px; } svg.sim { - box-sizing: border-box; - width: 100%; - height: 100%; - display: block; + box-sizing: border-box; + width: 100%; + height: 100%; + display: block; } svg.sim.grayscale { - -moz-filter: grayscale(1); - -webkit-filter: grayscale(1); - filter: grayscale(1); + -moz-filter: grayscale(1); + -webkit-filter: grayscale(1); + filter: grayscale(1); } .sim-button-group { - cursor: pointer; + cursor: pointer; } .sim-button { - pointer-events: none; - fill: "rgb(17, 17, 17)"; + pointer-events: none; + fill: "rgb(17, 17, 17)"; } .sim-button-group > .sim-button:active { - fill: orange; + fill: orange; } .sim-text-outside { - font-size: 25px; - fill: var(--vscode-foreground); + font-size: 25px; + fill: var(--vscode-foreground); } .sim-board, .sim-display, sim-button { - fill: #111; + fill: #111; } .sim-button-group > .sim-button-outer:hover { - stroke: orange; - stroke-width: 4px; + stroke: orange; + stroke-width: 4px; } .sim-button-group > .sim-button-outer:active { - fill: orange; + fill: orange; } .sim-button-outer { - fill: #7e7272; + fill: #7e7272; } .sim-button-key-press { - fill: orange; + fill: orange; } .sim-button-nut { - fill: #704a4a; - pointer-events: none; + fill: #704a4a; + pointer-events: none; } .sim-systemled { - fill: #333; - stroke: #555; - stroke-width: 1px; + fill: #333; + stroke: #555; + stroke-width: 1px; } .sim-light-level-button { - stroke: #fff; - stroke-width: 3px; + stroke: #fff; + stroke-width: 3px; } .sim-antenna { - stroke: #555; - stroke-width: 2px; + stroke: #555; + stroke-width: 2px; } .sim-text { - font-family: "Lucida Console", Monaco, monospace; - font-size: 25px; - fill: #fff; - pointer-events: none; + font-family: "Lucida Console", Monaco, monospace; + font-size: 25px; + fill: #fff; + pointer-events: none; } .sim-text-pin { - font-family: "Lucida Console", Monaco, monospace; - font-size: 20px; - fill: #fff; - pointer-events: none; + font-family: "Lucida Console", Monaco, monospace; + font-size: 20px; + fill: #fff; + pointer-events: none; } .sim-thermometer { - stroke: #aaa; - stroke-width: 3px; + stroke: #aaa; + stroke-width: 3px; } /* animations */ .sim-flash { - animation-name: sim-flash-animation; - animation-duration: 0.1s; + animation-name: sim-flash-animation; + animation-duration: 0.1s; } @keyframes sim-flash-animation { - from { - fill: yellow; - } - to { - fill: default; - } + from { + fill: yellow; + } + to { + fill: default; + } } .sim-flash-stroke { - animation-name: sim-flash-stroke-animation; - animation-duration: 0.4s; - animation-timing-function: ease-in; + animation-name: sim-flash-stroke-animation; + animation-duration: 0.4s; + animation-timing-function: ease-in; } @keyframes sim-flash-stroke-animation { - from { - stroke: yellow; - } - to { - stroke: default; - } + from { + stroke: yellow; + } + to { + stroke: default; + } } /* wireframe */ .sim-wireframe * { - fill: none; - stroke: black; + fill: none; + stroke: black; } .sim-wireframe .sim-display, .sim-wireframe .sim-led, @@ -120,29 +120,29 @@ sim-button { .sim-wireframe .sim-button-label, .sim-wireframe .sim-button, .sim-wireframe .sim-text-pin { - visibility: hidden; + visibility: hidden; } .sim-wireframe .sim-label { - stroke: none; - fill: #777; + stroke: none; + fill: #777; } .sim-label, .sim-button-label { - fill: #000; + fill: #000; } .sim-wireframe .sim-board { - stroke-width: 2px; + stroke-width: 2px; } *:focus { - outline: none; + outline: none; } .sim-button-group:focus { - stroke: #4d90fe; - stroke-width: 4px; + stroke: #4d90fe; + stroke-width: 4px; } .sim-button-group:focus { - stroke: #4d90fe; - stroke-width: 4px; + stroke: #4d90fe; + stroke-width: 4px; } *:focus .sim-button-outer, .sim-pin:focus, @@ -151,27 +151,27 @@ sim-button { .no-drag, .sim-text, .sim-text-pin { - user-drag: none; - user-select: none; - -moz-user-select: none; - -webkit-user-drag: none; - -webkit-user-select: none; - -ms-user-select: none; + user-drag: none; + user-select: none; + -moz-user-select: none; + -webkit-user-drag: none; + -webkit-user-select: none; + -ms-user-select: none; } .sim-button { - stroke: none; + stroke: none; } .sim-button:active { - stroke: none; + stroke: none; } .cls-1 { - fill: #097054; + fill: #097054; } .cls-1, .cls-14, .cls-23, .cls-9 { - stroke: #000; + stroke: #000; } .cls-1, .cls-11, @@ -185,15 +185,15 @@ sim-button { .cls-5, .cls-6, .cls-9 { - stroke-miterlimit: 10; + stroke-miterlimit: 10; } .cls-1, .cls-23 { - stroke-width: 1.99px; + stroke-width: 1.99px; } .cls-18, .cls-2 { - fill: #fff; + fill: #fff; } .cls-11, .cls-12, @@ -205,7 +205,7 @@ sim-button { .cls-6, .cls-7, .cls-8 { - fill: none; + fill: none; } .cls-11, .cls-12, @@ -216,10 +216,10 @@ sim-button { .cls-6, .cls-7, .cls-8 { - stroke: #fff; + stroke: #fff; } .cls-3 { - stroke-width: 2px; + stroke-width: 2px; } .cls-12, .cls-17, @@ -228,65 +228,63 @@ sim-button { .cls-6, .cls-7, .cls-8 { - stroke-linecap: round; + stroke-linecap: round; } .cls-4, .cls-7 { - stroke-width: 1.63px; + stroke-width: 1.63px; } .cls-5 { - stroke-width: 1.41px; + stroke-width: 1.41px; } .cls-6 { - stroke-width: 1.6px; + stroke-width: 1.6px; } .cls-7, .cls-8 { - stroke-linejoin: round; + stroke-linejoin: round; } .cls-8 { - stroke-width: 1.63px; + stroke-width: 1.63px; } .cls-10, .cls-9 { - fill: #7e7272; + fill: #7e7272; } .cls-22, .cls-9 { - stroke-width: 1.5px; + stroke-width: 1.5px; } .cls-12 { - stroke-width: 1.71px; + stroke-width: 1.71px; } .cls-14 { - stroke-width: 0.25px; + stroke-width: 0.25px; } .cls-17 { - stroke-width: 2.02px; + stroke-width: 2.02px; } .cls-18 { - font-size: 7px; - font-family: - SegoeUI-Bold, - Segoe UI; - font-weight: 700; - letter-spacing: -0.02em; + font-size: 7px; + font-family: SegoeUI-Bold, Segoe UI; + font-weight: 700; + letter-spacing: -0.02em; } .cls-19 { - letter-spacing: -0.03em; + letter-spacing: -0.03em; } .cls-20 { - letter-spacing: -0.05em; + letter-spacing: -0.05em; } .cls-21 { - letter-spacing: 0em; + letter-spacing: 0em; } .cls-22 { - stroke: #7e7272; + stroke: #7e7272; } .sim-text-outside-clue { - font-size: 14px; - fill: var(--vscode-foreground); + font-size: 14px; + fill: var(--vscode-foreground); } diff --git a/Source/view/styles/TemperatureSensorBar.css b/Source/view/styles/TemperatureSensorBar.css index e52920b20..dfab0b7cd 100644 --- a/Source/view/styles/TemperatureSensorBar.css +++ b/Source/view/styles/TemperatureSensorBar.css @@ -1,18 +1,18 @@ .title { - font-size: 14px; - text-align: left; - font-weight: bold; + font-size: 14px; + text-align: left; + font-weight: bold; } .header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; + -webkit-appearance: none; + height: 30px; + margin-bottom: 2px; } .temperatureSensorBar { - margin-top: 10px; - width: 440px; - margin-left: auto; - margin-right: auto; - padding-bottom: 16px; + margin-top: 10px; + width: 440px; + margin-left: auto; + margin-right: auto; + padding-bottom: 16px; } diff --git a/Source/view/styles/ToolBar.css b/Source/view/styles/ToolBar.css index f85843e90..faca0569c 100644 --- a/Source/view/styles/ToolBar.css +++ b/Source/view/styles/ToolBar.css @@ -1,182 +1,182 @@ .toolbar-parent { - background: var(--vscode-debugToolBar-background); - width: fit-content; - border-radius: 2px; - height: fit-content; - margin-left: auto; - margin-right: auto; - margin-top: 24px; - margin-bottom: 50px; + background: var(--vscode-debugToolBar-background); + width: fit-content; + border-radius: 2px; + height: fit-content; + margin-left: auto; + margin-right: auto; + margin-top: 24px; + margin-bottom: 50px; } .toolbar { - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - display: flex; - flex-direction: column; - align-content: center; - align-items: center; + box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); + border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-width: 1px; + border-style: solid; + display: flex; + flex-direction: column; + align-content: center; + align-items: center; } .toolbar-icon { - min-width: 360px; - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - padding: 0px 8px 0px 8px; + min-width: 360px; + box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); + border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-width: 1px; + border-style: solid; + padding: 0px 8px 0px 8px; } .tag, .title { - display: inline; + display: inline; } .sensor_modal { - vertical-align: middle; - width: 360px; - overflow-y: visible; - overflow-x: hidden; - position: relative; - height: fit-content; - padding-left: 16px; - box-shadow: none; - margin-left: 1px; + vertical-align: middle; + width: 360px; + overflow-y: visible; + overflow-x: hidden; + position: relative; + height: fit-content; + padding-left: 16px; + box-shadow: none; + margin-left: 1px; } .title { - -webkit-appearance: none; - font-size: 16px; - font-weight: bolder; - color: var(--vscode-badgeForegroundOverride); - text-align: left; - margin-right: 40px; - position: absolute; - left: 0; - padding-left: inherit; - width: 320px; + -webkit-appearance: none; + font-size: 16px; + font-weight: bolder; + color: var(--vscode-badgeForegroundOverride); + text-align: left; + margin-right: 40px; + position: absolute; + left: 0; + padding-left: inherit; + width: 320px; } .info-icon { - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - color: var(--vscode-badgeForegroundOverride); - border-width: 1px; - border-style: solid; - padding: 0px 4px; - float: right; - left: 25px; - margin-top: -10px; + background: var(--vscode-debugToolBar-background); + border-color: var(--vscode-highContrastButtonBorderOverride-color); + color: var(--vscode-badgeForegroundOverride); + border-width: 1px; + border-style: solid; + padding: 0px 4px; + float: right; + left: 25px; + margin-top: -10px; } .info-icon:hover { - background-color: var(--vscode-terminal-selectionBackground); - color: var(--vscode-badgeForegroundOverride); + background-color: var(--vscode-terminal-selectionBackground); + color: var(--vscode-badgeForegroundOverride); } .info-icon:active { - background-color: var(--vscode-editor-selectionHighlightBackground); - color: var(--vscode-badgeForegroundOverride); + background-color: var(--vscode-editor-selectionHighlightBackground); + color: var(--vscode-badgeForegroundOverride); } .tag { - position: absolute; - left: 200px; + position: absolute; + left: 200px; } .description-callout { - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - padding: "210px 214px 214px 210px"; - border: 2px solid var(--vscode-highContrastButtonBorderOverride-color); + box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); + padding: "210px 214px 214px 210px"; + border: 2px solid var(--vscode-highContrastButtonBorderOverride-color); } .description-callout .ms-Callout-beak { - background-color: var(--vscode-debugToolBar-background); + background-color: var(--vscode-debugToolBar-background); } .description-callout .ms-Callout-main { - background-color: var(--vscode-debugToolBar-background); - overflow-x: hidden; - overflow-y: auto; - margin: -1px; + background-color: var(--vscode-debugToolBar-background); + overflow-x: hidden; + overflow-y: auto; + margin: -1px; } .try-it-description { - -webkit-appearance: none; - font-size: 14px; - background: var(--vscode-debugToolBar-background); - word-wrap: break-word; - width: 320px; - height: "100%"; - margin-top: 15px; - text-align: left; - line-height: 17px; - font-weight: 100; + -webkit-appearance: none; + font-size: 14px; + background: var(--vscode-debugToolBar-background); + word-wrap: break-word; + width: 320px; + height: "100%"; + margin-top: 15px; + text-align: left; + line-height: 17px; + font-weight: 100; } .description { - -webkit-appearance: none; - color: var(--vscode-badgeForegroundOverride); - font-size: 14px; - word-wrap: break-word; - width: 320px; - height: "100%"; - text-align: left; - font-weight: 400; - padding: 10px 0px 10px 10px; - margin: 10px; - overflow-y: hidden; + -webkit-appearance: none; + color: var(--vscode-badgeForegroundOverride); + font-size: 14px; + word-wrap: break-word; + width: 320px; + height: "100%"; + text-align: left; + font-weight: 400; + padding: 10px 0px 10px 10px; + margin: 10px; + overflow-y: hidden; } .title_group { - margin-top: 20px; - width: fit-content; - padding-left: 16px; + margin-top: 20px; + width: fit-content; + padding-left: 16px; } .try_area { - position: relative; - padding-bottom: 30px; - text-align: left; - line-height: 17px; - font-weight: 100; - opacity: 90%; - font-size: 14px; - word-wrap: break-word; - padding-right: 10px; + position: relative; + padding-bottom: 30px; + text-align: left; + line-height: 17px; + font-weight: 100; + opacity: 90%; + font-size: 14px; + word-wrap: break-word; + padding-right: 10px; } .link-parent { - padding-top: 12px; - -webkit-appearance: none; - color: var(--vscode-textLink-foreground); - text-align: right; - text-decoration: none; - font-weight: bold; + padding-top: 12px; + -webkit-appearance: none; + color: var(--vscode-textLink-foreground); + text-align: right; + text-decoration: none; + font-weight: bold; } .link-parent:hover { - -webkit-appearance: none; - color: var(--vscode-textLink-activeForeground); - text-decoration: none; + -webkit-appearance: none; + color: var(--vscode-textLink-activeForeground); + text-decoration: none; } .link { - -webkit-appearance: none; - text-decoration: none; + -webkit-appearance: none; + text-decoration: none; } .gesture-container { - display: "flex"; - justify-content: "space-between"; - flex-direction: "column"; - align-items: "center"; - height: 750; - padding-top: 10px; + display: "flex"; + justify-content: "space-between"; + flex-direction: "column"; + align-items: "center"; + height: 750; + padding-top: 10px; } .generic-slider-component { - padding-top: 10px; + padding-top: 10px; } diff --git a/Source/view/svgs/arrow_right_svg.tsx b/Source/view/svgs/arrow_right_svg.tsx index 538c52229..7eead7979 100644 --- a/Source/view/svgs/arrow_right_svg.tsx +++ b/Source/view/svgs/arrow_right_svg.tsx @@ -1,20 +1,21 @@ import * as React from "react"; export const ARROW_RIGHT_SVG = ( - - - + + + ); export default ARROW_RIGHT_SVG; diff --git a/Source/view/svgs/close_svg.tsx b/Source/view/svgs/close_svg.tsx index b591fa868..ac05bedfc 100644 --- a/Source/view/svgs/close_svg.tsx +++ b/Source/view/svgs/close_svg.tsx @@ -1,25 +1,26 @@ import * as React from "react"; export const CLOSE_SVG = ( - - - - + + + + ); export default CLOSE_SVG; diff --git a/Source/view/svgs/play_svg.tsx b/Source/view/svgs/play_svg.tsx index 8c1317ee1..0da21aa9d 100644 --- a/Source/view/svgs/play_svg.tsx +++ b/Source/view/svgs/play_svg.tsx @@ -1,18 +1,19 @@ import * as React from "react"; export const PLAY_SVG = ( - - - + + + ); export default PLAY_SVG; diff --git a/Source/view/svgs/refresh_svg.tsx b/Source/view/svgs/refresh_svg.tsx index 4df58cd59..340ad03f8 100644 --- a/Source/view/svgs/refresh_svg.tsx +++ b/Source/view/svgs/refresh_svg.tsx @@ -2,19 +2,20 @@ import * as React from "react"; import "../styles/Button.css"; export const REFRESH_SVG = ( - - - + + + ); export default REFRESH_SVG; diff --git a/Source/view/svgs/stop_svg.tsx b/Source/view/svgs/stop_svg.tsx index f6a628fa3..a89175f66 100644 --- a/Source/view/svgs/stop_svg.tsx +++ b/Source/view/svgs/stop_svg.tsx @@ -1,20 +1,21 @@ import * as React from "react"; export const STOP_SVG = ( - - - + + + ); export default STOP_SVG; diff --git a/Source/view/svgs/tag_input_svg.tsx b/Source/view/svgs/tag_input_svg.tsx index 8e346d140..13a507504 100644 --- a/Source/view/svgs/tag_input_svg.tsx +++ b/Source/view/svgs/tag_input_svg.tsx @@ -1,26 +1,27 @@ import * as React from "react"; export const TAG_INPUT_SVG = ( - - - - + + + + ); export default TAG_INPUT_SVG; diff --git a/Source/view/svgs/tag_output_svg.tsx b/Source/view/svgs/tag_output_svg.tsx index 157dca014..745175db5 100644 --- a/Source/view/svgs/tag_output_svg.tsx +++ b/Source/view/svgs/tag_output_svg.tsx @@ -1,25 +1,26 @@ import * as React from "react"; export const TAG_OUTPUT_SVG = ( - - - - + + + + ); export default TAG_OUTPUT_SVG; diff --git a/Source/view/svgs/toolbar_svg.tsx b/Source/view/svgs/toolbar_svg.tsx index 701725550..52de70b86 100644 --- a/Source/view/svgs/toolbar_svg.tsx +++ b/Source/view/svgs/toolbar_svg.tsx @@ -3,693 +3,738 @@ import { TOOLBAR_ICON_LABEL } from "../components/toolbar/SensorModalUtils"; import "../styles/Button.css"; export const LEFT_EDGE_SVG = ( - - - - - - - - - - + + + + + + + + + + ); export const RIGHT_EDGE_SVG = ( - - - - - - - - - - + + + + + + + + + + ); export const GPIO_SVG = ( - - Created with Sketch. - - - - - - + + Created with Sketch. + + + + + + ); export const IR_SVG = ( - - Created with Sketch. - - - - - - - - + + Created with Sketch. + + + + + + + + ); export const LIGHT_SVG = ( - - - - - - - - - - - + + + + + + + + + + + ); export const MOTION_SVG = ( - - - - - - - - - - - + + + + + + + + + + + ); export const NEO_PIXEL_SVG = ( - - Created with Sketch. - - - - - - - - - - - - - - - + + Created with Sketch. + + + + + + + + + + + + + + + ); export const PUSH_BUTTON_SVG = ( - - Created with Sketch. - - - - - - - - - + + Created with Sketch. + + + + + + + + + ); export const RED_LED_SVG = ( - - Created with Sketch. - - - - - - - - - + + Created with Sketch. + + + + + + + + + ); export const SLIDER_SWITCH_SVG = ( - - Created with Sketch. - - - - - - - - - + + Created with Sketch. + + + + + + + + + ); export const SOUND_SVG = ( - - Created with Sketch. - - - - - - - - - - - + + Created with Sketch. + + + + + + + + + + + ); export const SPEAKER_SVG = ( - - Created with Sketch. - - - - - - - - + + Created with Sketch. + + + + + + + + ); export const TEMPERATURE_SVG = ( - - - - - - - - - + + + + + + + + + ); export const WIRELESS_SVG = ( - - - - - - - - - + + + + + + + + + ); export default LEFT_EDGE_SVG; export const GESTURE_SVG = ( - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + ); export const HUMIDITY_SVG = ( - - - - + + + - - - - - - - - - + /> + + + ); export const PRESSURE_SVG = ( - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + ); export const PROXIMITY_SVG = ( - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + ); export const MAGNET_SVG = ( - - - + + - - + /> + + ); export const GYROSCOPE_SVG = ( - - - + + + - - - - - - - - - + + + + + + + + + ); export const COMPASS_SVG = ( - - - - - + + + + + ); diff --git a/Source/view/translations/en.json b/Source/view/translations/en.json index 6583386d6..c5e6ebed9 100644 --- a/Source/view/translations/en.json +++ b/Source/view/translations/en.json @@ -1,112 +1,112 @@ { - "toolbar-gpio.description": "8 GPIOs on the device! Pin A1 - A7 can also be used as capacitive touch sensors, and A0 is a true analog output pin.", - "toolbar-gpio.title": "GPIO", - "toolbar-gpio.tryItDescription": "Use your mouse to interact with the pin A1 - A7 or use your keyboard SHIFT + ”1” - “7”.", - "toolbar-ir-sensor.description": "Allows you to send commands to the device with a remote control, or even send messages between multiple devices! You can also do very simple proximity sensing since it reads the reflected light.", - "toolbar-ir-sensor.title": "IR Transmit & Receiver", - "toolbar-ir-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-light-sensor.description": "An analog light sensor can be used to detect ambient light, with similar spectral response to the human eye.", - "toolbar-light-sensor.title": "Light Sensor", - "toolbar-light-sensor.tryItDescription": "Change the brightness detected by the sensor here!", - "toolbar-motion-sensor.description": "Detects acceleration in X, Y and Z orientations. It can also detect 'tap' and 'double tap' strikes on the board and when the board is shaken.", - "toolbar-motion-sensor.title": "Motion Sensor", - "toolbar-motion-sensor.tryItDescription": "Change the acceleration here and click or click on the button to simulate a shake. The tap feature is not supported by the Device Simulator Express. If you would like to see the 'tap' feature implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-neo-pixels.description": "The 10 full color RGB LEDs surrounding the outer edge of the boards can be set to any color. Great for beautiful lighting effects!", - "toolbar-neo-pixels.title": "NeoPixels", - "toolbar-neo-pixels.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-a-b-push.description": "Two push buttons A and B are connected to digital pin #4 (Left) and #5 (Right) each.", - "toolbar-a-b-push.title": "Push Buttons", - "toolbar-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-red-led.description": "This Red LED is connected to the digital #13 GPIO pin. It can be very handy when you want an indicator LED.", - "toolbar-red-led.title": "Red LED", - "toolbar-red-led.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-sound-sensor.description": "A digital microphone can detect audio volume and even perform basic FFT functions but cannot read it like an analog voltage.", - "toolbar-sound-sensor.title": "Sound Sensor", - "toolbar-sound-sensor.tryItDescription": "If you would like to see the sound sensor implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-slider-switch.description": "This slide switch returns True or False depending on whether it's ON or OFF and can be used as a toggle switch in your code!", - "toolbar-slider-switch.title": "Slider Switch", - "toolbar-slider-switch.tryItDescription": "Click it with your mouse or press 'S' on your keyboard to switch it ON and OFF!", - "toolbar-speaker.description": "This speaker can play a .wav file and different tones and also has a class D amplifier that is connected to an output A0 pin built in! You can turn it off using the shutdown control on pin #11 on the physical device.", - "toolbar-speaker.title": "Speaker", - "toolbar-speaker.tryItDescription": "Right now the tones are not supported on the simulator. If you would like to see tones implemented, please +1 the feature addition issue on GitHub! Regardless, you can play it on your device!", - "toolbar-temperature-sensor.description": "This sensor uses an NTC thermistor to sense temperature an calculate it with the analog voltage on analog pin #A9.", - "toolbar-temperature-sensor.title": "Temperature Sensor", - "toolbar-temperature-sensor.tryItDescription": "You can set the temperature in degrees Celsius.", - "toolbar-accelerometer-sensor.title": "Accelerometer", - "toolbar-accelerometer-sensor.description": "An accelerometer measures the acceleration of your micro:bit; this component senses when the micro:bit is moved.", - "toolbar-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", - "toolbar-microbit-light-sensor.title": "Light Sensor", - "toolbar-microbit-temperature-sensor.title": "Temperature Sensor", - "toolbar-microbit-led.title": "LEDs", - "toolbar-microbit-led.description": "The microbit has 25 LEDs for you to play with. The LEDs have 9 levels of brightness.", - "toolbar-microbit-led.tryItDescription": "Run your code and see the LEDs light up!", - "toolbar-microbit-a-b-push.title": "Buttons", - "toolbar-microbit-a-b-push.description": "There are two buttons on the front of the micro:bit (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", - "toolbar-microbit-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-microbit-sound.title": "Sound", - "toolbar-microbit-sound.description": "Your BBC micro:bit can be programmed to make a wide variety of sounds - from single notes, tones and beats to your own musical compositions.", - "toolbar-microbit-sound.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-gpio.title": "GPIO (Pins)", - "toolbar-microbit-gpio.description": "On the bottom edge of your BBC micro:bit there are 25 gold strips, called pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", - "toolbar-microbit-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-wireless.title": "Bluetooth & Radio", - "toolbar-microbit-wireless.description": "micro:bits can use radio waves and bluetooth services to communicate with each other.", + "toolbar-gpio.description": "8 GPIOs on the device! Pin A1 - A7 can also be used as capacitive touch sensors, and A0 is a true analog output pin.", + "toolbar-gpio.title": "GPIO", + "toolbar-gpio.tryItDescription": "Use your mouse to interact with the pin A1 - A7 or use your keyboard SHIFT + ”1” - “7”.", + "toolbar-ir-sensor.description": "Allows you to send commands to the device with a remote control, or even send messages between multiple devices! You can also do very simple proximity sensing since it reads the reflected light.", + "toolbar-ir-sensor.title": "IR Transmit & Receiver", + "toolbar-ir-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-light-sensor.description": "An analog light sensor can be used to detect ambient light, with similar spectral response to the human eye.", + "toolbar-light-sensor.title": "Light Sensor", + "toolbar-light-sensor.tryItDescription": "Change the brightness detected by the sensor here!", + "toolbar-motion-sensor.description": "Detects acceleration in X, Y and Z orientations. It can also detect 'tap' and 'double tap' strikes on the board and when the board is shaken.", + "toolbar-motion-sensor.title": "Motion Sensor", + "toolbar-motion-sensor.tryItDescription": "Change the acceleration here and click or click on the button to simulate a shake. The tap feature is not supported by the Device Simulator Express. If you would like to see the 'tap' feature implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-neo-pixels.description": "The 10 full color RGB LEDs surrounding the outer edge of the boards can be set to any color. Great for beautiful lighting effects!", + "toolbar-neo-pixels.title": "NeoPixels", + "toolbar-neo-pixels.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-a-b-push.description": "Two push buttons A and B are connected to digital pin #4 (Left) and #5 (Right) each.", + "toolbar-a-b-push.title": "Push Buttons", + "toolbar-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", + "toolbar-red-led.description": "This Red LED is connected to the digital #13 GPIO pin. It can be very handy when you want an indicator LED.", + "toolbar-red-led.title": "Red LED", + "toolbar-red-led.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-sound-sensor.description": "A digital microphone can detect audio volume and even perform basic FFT functions but cannot read it like an analog voltage.", + "toolbar-sound-sensor.title": "Sound Sensor", + "toolbar-sound-sensor.tryItDescription": "If you would like to see the sound sensor implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-slider-switch.description": "This slide switch returns True or False depending on whether it's ON or OFF and can be used as a toggle switch in your code!", + "toolbar-slider-switch.title": "Slider Switch", + "toolbar-slider-switch.tryItDescription": "Click it with your mouse or press 'S' on your keyboard to switch it ON and OFF!", + "toolbar-speaker.description": "This speaker can play a .wav file and different tones and also has a class D amplifier that is connected to an output A0 pin built in! You can turn it off using the shutdown control on pin #11 on the physical device.", + "toolbar-speaker.title": "Speaker", + "toolbar-speaker.tryItDescription": "Right now the tones are not supported on the simulator. If you would like to see tones implemented, please +1 the feature addition issue on GitHub! Regardless, you can play it on your device!", + "toolbar-temperature-sensor.description": "This sensor uses an NTC thermistor to sense temperature an calculate it with the analog voltage on analog pin #A9.", + "toolbar-temperature-sensor.title": "Temperature Sensor", + "toolbar-temperature-sensor.tryItDescription": "You can set the temperature in degrees Celsius.", + "toolbar-accelerometer-sensor.title": "Accelerometer", + "toolbar-accelerometer-sensor.description": "An accelerometer measures the acceleration of your micro:bit; this component senses when the micro:bit is moved.", + "toolbar-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", + "toolbar-microbit-light-sensor.title": "Light Sensor", + "toolbar-microbit-temperature-sensor.title": "Temperature Sensor", + "toolbar-microbit-led.title": "LEDs", + "toolbar-microbit-led.description": "The microbit has 25 LEDs for you to play with. The LEDs have 9 levels of brightness.", + "toolbar-microbit-led.tryItDescription": "Run your code and see the LEDs light up!", + "toolbar-microbit-a-b-push.title": "Buttons", + "toolbar-microbit-a-b-push.description": "There are two buttons on the front of the micro:bit (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", + "toolbar-microbit-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", + "toolbar-microbit-sound.title": "Sound", + "toolbar-microbit-sound.description": "Your BBC micro:bit can be programmed to make a wide variety of sounds - from single notes, tones and beats to your own musical compositions.", + "toolbar-microbit-sound.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-microbit-gpio.title": "GPIO (Pins)", + "toolbar-microbit-gpio.description": "On the bottom edge of your BBC micro:bit there are 25 gold strips, called pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", + "toolbar-microbit-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-microbit-wireless.title": "Bluetooth & Radio", + "toolbar-microbit-wireless.description": "micro:bits can use radio waves and bluetooth services to communicate with each other.", - "toolbar-microbit-wireless.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-gesture-sensor.title": "Gesture", - "toolbar-microbit-gesture-sensor.description": "If you move your BBC micro:bit in a certain way (as a gesture) then the micro:bit is able to detect this. It can recognize the following gestures: up, down, left, right, face up, face down, freefall, 3g, 6g, 8g, and shake.", + "toolbar-microbit-wireless.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-microbit-gesture-sensor.title": "Gesture", + "toolbar-microbit-gesture-sensor.description": "If you move your BBC micro:bit in a certain way (as a gesture) then the micro:bit is able to detect this. It can recognize the following gestures: up, down, left, right, face up, face down, freefall, 3g, 6g, 8g, and shake.", - "toolbar-microbit-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", - "toolbar-microbit-compass-sensor.title": "Compass", - "toolbar-microbit-compass-sensor.description": "A digital compass is an input sensor that detects magnetic fields. Your BBC micro:bit has an inbuilt compass that can detect the direction in which it is facing.", - "toolbar-microbit-compass-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-temperature-sensor.title": "Temperature", - "toolbar-clue-temperature-sensor.description": "CLUE uses the BMP280 sensor, an environmental sensor with temperature. This precision sensor from Bosch is the best low-cost, precision sensing solution for measuring temperature with ±1.0°C accuracy.", + "toolbar-microbit-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", + "toolbar-microbit-compass-sensor.title": "Compass", + "toolbar-microbit-compass-sensor.description": "A digital compass is an input sensor that detects magnetic fields. Your BBC micro:bit has an inbuilt compass that can detect the direction in which it is facing.", + "toolbar-microbit-compass-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", + "toolbar-clue-temperature-sensor.title": "Temperature", + "toolbar-clue-temperature-sensor.description": "CLUE uses the BMP280 sensor, an environmental sensor with temperature. This precision sensor from Bosch is the best low-cost, precision sensing solution for measuring temperature with ±1.0°C accuracy.", - "toolbar-clue-temperature-sensor.tryItDescription": "You can simulate the temperature in your code!", + "toolbar-clue-temperature-sensor.tryItDescription": "You can simulate the temperature in your code!", - "toolbar-clue-light-sensor.title": "Light/Color Sensor", - "toolbar-clue-light-sensor.description": "The light sensor uses APDS9960 and is able to return the red, blue, green and clear light.", - "toolbar-clue-light-sensor.tryItDescription": "You can set the color values of the light detected.", - "toolbar-clue-accelerometer-sensor.title": "Accelerometer", - "toolbar-clue-accelerometer-sensor.description": " The 3-axis accelerometer, can tell you which direction is down towards the Earth (by measuring gravity) or how fast the board is accelerating in 3D space.", - "toolbar-clue-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", - "toolbar-clue-led.title": "Neopixel", - "toolbar-clue-led.description": "The CLUE has one full RGB LED (NeoPixel) on the back of the device.", + "toolbar-clue-light-sensor.title": "Light/Color Sensor", + "toolbar-clue-light-sensor.description": "The light sensor uses APDS9960 and is able to return the red, blue, green and clear light.", + "toolbar-clue-light-sensor.tryItDescription": "You can set the color values of the light detected.", + "toolbar-clue-accelerometer-sensor.title": "Accelerometer", + "toolbar-clue-accelerometer-sensor.description": " The 3-axis accelerometer, can tell you which direction is down towards the Earth (by measuring gravity) or how fast the board is accelerating in 3D space.", + "toolbar-clue-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", + "toolbar-clue-led.title": "Neopixel", + "toolbar-clue-led.description": "The CLUE has one full RGB LED (NeoPixel) on the back of the device.", - "toolbar-clue-led.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-clue-a-b-push.title": "Buttons", - "toolbar-clue-a-b-push.description": "There are two buttons on the front of the CLUE (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", - "toolbar-clue-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-clue-gpio.title": "Input/Output (GPIO)", - "toolbar-clue-gpio.description": "On the bottom edge of your CLUE, you have 25 pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", - "toolbar-clue-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-sound-sensor.title": "Sound", - "toolbar-clue-sound-sensor.description": "The CLUE uses a PDM MEMS microphone. PDM is a little like 1-bit PWM. You clock the mic with a 1 MHz - 3 MHz clock rate, and on the data line you'll get a square wave out that syncs with the clock.", - "toolbar-clue-sound-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-pressure-sensor.title": "Pressure", - "toolbar-clue-pressure-sensor.description": "CLUE uses the BMP280 sensor for barometric pressure. Because pressure changes with altitude, you can also use it as an altimeter with ±1 meter accuracy.", + "toolbar-clue-led.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-clue-a-b-push.title": "Buttons", + "toolbar-clue-a-b-push.description": "There are two buttons on the front of the CLUE (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", + "toolbar-clue-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", + "toolbar-clue-gpio.title": "Input/Output (GPIO)", + "toolbar-clue-gpio.description": "On the bottom edge of your CLUE, you have 25 pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", + "toolbar-clue-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", + "toolbar-clue-sound-sensor.title": "Sound", + "toolbar-clue-sound-sensor.description": "The CLUE uses a PDM MEMS microphone. PDM is a little like 1-bit PWM. You clock the mic with a 1 MHz - 3 MHz clock rate, and on the data line you'll get a square wave out that syncs with the clock.", + "toolbar-clue-sound-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", + "toolbar-clue-pressure-sensor.title": "Pressure", + "toolbar-clue-pressure-sensor.description": "CLUE uses the BMP280 sensor for barometric pressure. Because pressure changes with altitude, you can also use it as an altimeter with ±1 meter accuracy.", - "toolbar-clue-pressure-sensor.tryItDescription": "You can set the pressure here in hectoPascals (hPa).", - "toolbar-clue-humidity-sensor.title": "Humidity", - "toolbar-clue-humidity-sensor.description": "The SHT30-D sensor has an excellent ±2% relative humidity and ±0.5°C accuracy for most uses.", - "toolbar-clue-humidity-sensor.tryItDescription": "You can set the humidity in percentage (%) here.", - "toolbar-clue-gesture-sensor.title": "Gesture", - "toolbar-clue-gesture-sensor.description": "The gesture sensor can detect directional gestures (left to right, right to left, up to down, down to up), but in theory more complicated gestures like zig-zag, clockwise or counterclockwise circle, near to far, etc. could also be detected with additional code. ", - "toolbar-clue-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", - "toolbar-clue-proximity-sensor.title": "Proximity", - "toolbar-clue-proximity-sensor.description": "The proximity sensor uses APDS9960 and is able to return how close an object is to the front of the sensor. This is a number from 0 to 255 where the higher the number the closer an object is to the sensor. You won't be able to translate this into an absolute value in units like inches or millimeters, you can only see how it changes relative to other values.", + "toolbar-clue-pressure-sensor.tryItDescription": "You can set the pressure here in hectoPascals (hPa).", + "toolbar-clue-humidity-sensor.title": "Humidity", + "toolbar-clue-humidity-sensor.description": "The SHT30-D sensor has an excellent ±2% relative humidity and ±0.5°C accuracy for most uses.", + "toolbar-clue-humidity-sensor.tryItDescription": "You can set the humidity in percentage (%) here.", + "toolbar-clue-gesture-sensor.title": "Gesture", + "toolbar-clue-gesture-sensor.description": "The gesture sensor can detect directional gestures (left to right, right to left, up to down, down to up), but in theory more complicated gestures like zig-zag, clockwise or counterclockwise circle, near to far, etc. could also be detected with additional code. ", + "toolbar-clue-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", + "toolbar-clue-proximity-sensor.title": "Proximity", + "toolbar-clue-proximity-sensor.description": "The proximity sensor uses APDS9960 and is able to return how close an object is to the front of the sensor. This is a number from 0 to 255 where the higher the number the closer an object is to the sensor. You won't be able to translate this into an absolute value in units like inches or millimeters, you can only see how it changes relative to other values.", - "toolbar-clue-proximity-sensor.tryItDescription": "Set relative proximity to the sensor in values from 0 - 255, where 0 means very close and 255 means very far.", + "toolbar-clue-proximity-sensor.tryItDescription": "Set relative proximity to the sensor in values from 0 - 255, where 0 means very close and 255 means very far.", - "toolbar-clue-bluetooth.title": "Bluetooth", - "toolbar-clue-bluetooth.description": "You can transmit data over Bluetooth to a computer or mobile device for data plotting and logging, or save it to the built in storage.", - "toolbar-clue-bluetooth.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! ", - "toolbar-clue-speaker.description": "The CLUE has a buzzer/speaker for playing tones and beeps.", - "toolbar-clue-magnet-sensor.title": "Magnetometer", - "toolbar-clue-magnet-sensor.description": "Sense the magnetic fields that surround us with this handy triple-axis magnetometer (compass) module. Magnetometers can sense where the strongest magnetic force is coming from, generally used to detect magnetic north, but can also be used for measuring magnetic fields.", - "toolbar-clue-magnet-sensor.tryItDescription": "You can set the magnetic field value in microTeslas (uT).", - "toolbar-clue-gyroscope-sensor.title": "Gyroscope", - "toolbar-clue-gyroscope-sensor.description": "The 3-axis gyroscope that can measure spin and twist users LSM6DS33.", - "toolbar-clue-gyroscope-sensor.tryItDescription": "Set the angular velocity in degrees/second." + "toolbar-clue-bluetooth.title": "Bluetooth", + "toolbar-clue-bluetooth.description": "You can transmit data over Bluetooth to a computer or mobile device for data plotting and logging, or save it to the built in storage.", + "toolbar-clue-bluetooth.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! ", + "toolbar-clue-speaker.description": "The CLUE has a buzzer/speaker for playing tones and beeps.", + "toolbar-clue-magnet-sensor.title": "Magnetometer", + "toolbar-clue-magnet-sensor.description": "Sense the magnetic fields that surround us with this handy triple-axis magnetometer (compass) module. Magnetometers can sense where the strongest magnetic force is coming from, generally used to detect magnetic north, but can also be used for measuring magnetic fields.", + "toolbar-clue-magnet-sensor.tryItDescription": "You can set the magnetic field value in microTeslas (uT).", + "toolbar-clue-gyroscope-sensor.title": "Gyroscope", + "toolbar-clue-gyroscope-sensor.description": "The 3-axis gyroscope that can measure spin and twist users LSM6DS33.", + "toolbar-clue-gyroscope-sensor.tryItDescription": "Set the angular velocity in degrees/second." } diff --git a/Source/view/tsconfig.json b/Source/view/tsconfig.json index 3bb77287f..28c6454e0 100644 --- a/Source/view/tsconfig.json +++ b/Source/view/tsconfig.json @@ -1,19 +1,19 @@ { - "compilerOptions": { - "module": "esnext", - "moduleResolution": "node", - "target": "es6", - "outDir": "out", - "lib": ["es6", "dom"], - "jsx": "react", - "sourceMap": true, - "rootDir": "..", - "strict": true, - "noUnusedLocals": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "experimentalDecorators": true - }, - "exclude": ["node_modules"], - "include": ["./index.tsx"] + "compilerOptions": { + "module": "esnext", + "moduleResolution": "node", + "target": "es6", + "outDir": "out", + "lib": ["es6", "dom"], + "jsx": "react", + "sourceMap": true, + "rootDir": "..", + "strict": true, + "noUnusedLocals": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "experimentalDecorators": true + }, + "exclude": ["node_modules"], + "include": ["./index.tsx"] } diff --git a/Source/view/utils/MessageUtils.tsx b/Source/view/utils/MessageUtils.tsx index 18adf5031..a9fcf9c75 100644 --- a/Source/view/utils/MessageUtils.tsx +++ b/Source/view/utils/MessageUtils.tsx @@ -1,12 +1,12 @@ interface vscode { - postMessage(message: any): void; + postMessage(message: any): void; } declare const vscode: vscode; export const sendMessage = ( - type: string, - state: TState + type: string, + state: TState ) => { - vscode.postMessage({ command: type, text: state }); + vscode.postMessage({ command: type, text: state }); }; diff --git a/Source/view/viewUtils.tsx b/Source/view/viewUtils.tsx index a210b8021..1335d039f 100644 --- a/Source/view/viewUtils.tsx +++ b/Source/view/viewUtils.tsx @@ -3,29 +3,29 @@ import { SENSOR_LIST } from "./constants"; // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. export interface ISliderProps { - minValue: number; - maxValue: number; - maxLabel: string; - minLabel: string; - type: string | SENSOR_LIST; - axisLabel: string; - value?: number; - onUpdateValue?: (sensor: SENSOR_LIST, value: number) => void; - step: number; + minValue: number; + maxValue: number; + maxLabel: string; + minLabel: string; + type: string | SENSOR_LIST; + axisLabel: string; + value?: number; + onUpdateValue?: (sensor: SENSOR_LIST, value: number) => void; + step: number; } export interface ISensorButtonProps { - label: string; - type: string; - onMouseUp?: (event: React.PointerEvent) => void; - onMouseDown?: (event: React.PointerEvent) => void; - onKeyUp?: (event: React.KeyboardEvent) => void; - onKeyDown?: (event: React.KeyboardEvent) => void; + label: string; + type: string; + onMouseUp?: (event: React.PointerEvent) => void; + onMouseDown?: (event: React.PointerEvent) => void; + onKeyUp?: (event: React.KeyboardEvent) => void; + onKeyDown?: (event: React.KeyboardEvent) => void; } export interface ISensorProps { - LABEL: string; - sliderProps: ISliderProps[]; - unitLabel: string; + LABEL: string; + sliderProps: ISliderProps[]; + unitLabel: string; } export const X_SLIDER_INDEX = 0; diff --git a/src/adafruit_circuitplayground/__init__.py b/src/adafruit_circuitplayground/__init__.py deleted file mode 100644 index b4bc33da8..000000000 --- a/src/adafruit_circuitplayground/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# added compatibility for new import structure in CircuitPython -# https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/pull/79 - -from .express import cpx as cp diff --git a/src/adafruit_circuitplayground/constants.py b/src/adafruit_circuitplayground/constants.py deleted file mode 100644 index 2c47a919d..000000000 --- a/src/adafruit_circuitplayground/constants.py +++ /dev/null @@ -1,78 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - - -class EXPRESS_STATE: - BUTTON_A = "button_a" - BUTTON_B = "button_b" - ACCELERATION = "acceleration" - BRIGHTNESS = "brightness" - PIXELS = "pixels" - RED_LED = "red_led" - SWITCH = "switch" - TEMPERATURE = "temperature" - LIGHT = "light" - MOTION_X = "motion_x" - MOTION_Y = "motion_y" - MOTION_Z = "motion_z" - TOUCH = "touch" - SHAKE = "shake" - DETECT_TAPS = "detect_taps" - - -ASSIGN_PIXEL_TYPE_ERROR = ( - "The pixel color value type should be tuple, list or hexadecimal." -) - -BRIGHTNESS_RANGE_ERROR = "The brightness value should be a number between 0 and 1." - -CPX = "CPX" - -INDEX_ERROR = ( - "The index is not a valid number, you can access the Neopixels from 0 to 9." -) - -MAC_OS = "darwin" - -NOT_IMPLEMENTED_ERROR = "This method is not implemented by the simulator" - -NOT_SUITABLE_FILE_ERROR = ( - "Your .wav file is not suitable for the Circuit Playground Express." -) - -PIXEL_RANGE_ERROR = ( - "The pixel hexadicimal color value should be in range #000000 and #FFFFFF." -) - -VALID_PIXEL_ASSIGN_ERROR = "The pixel color value should be a tuple with three values between 0 and 255 or a hexadecimal color between 0x000000 and 0xFFFFFF." - -ERROR_SENDING_EVENT = "Error trying to send event to the process : " - -TIME_DELAY = 0.03 - - -EVENTS_BUTTON_PRESS = [ - EXPRESS_STATE.BUTTON_A, - EXPRESS_STATE.BUTTON_B, - EXPRESS_STATE.SWITCH, -] -EVENTS_SENSOR_CHANGED = [ - EXPRESS_STATE.TEMPERATURE, - EXPRESS_STATE.LIGHT, - EXPRESS_STATE.MOTION_X, - EXPRESS_STATE.MOTION_Y, - EXPRESS_STATE.MOTION_Z, -] - -ALL_EXPECTED_INPUT_EVENTS = [ - EXPRESS_STATE.BUTTON_A, - EXPRESS_STATE.BUTTON_B, - EXPRESS_STATE.SWITCH, - EXPRESS_STATE.TEMPERATURE, - EXPRESS_STATE.LIGHT, - EXPRESS_STATE.SHAKE, - EXPRESS_STATE.MOTION_X, - EXPRESS_STATE.MOTION_Y, - EXPRESS_STATE.MOTION_Z, - EXPRESS_STATE.TOUCH, -] diff --git a/src/adafruit_circuitplayground/express.py b/src/adafruit_circuitplayground/express.py deleted file mode 100644 index 7f2857508..000000000 --- a/src/adafruit_circuitplayground/express.py +++ /dev/null @@ -1,215 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -import json -import sys -import os -import playsound - -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent -from .pixel import Pixel -from . import constants as CONSTANTS -from collections import namedtuple -import common - -Acceleration = namedtuple(CONSTANTS.EXPRESS_STATE.ACCELERATION, ["x", "y", "z"]) - - -class Express: - def __init__(self): - # State in the Python process - self.__state = {} - self.__state[CONSTANTS.EXPRESS_STATE.BRIGHTNESS] = 1.0 - self.__state[CONSTANTS.EXPRESS_STATE.BUTTON_A] = False - self.__state[CONSTANTS.EXPRESS_STATE.BUTTON_B] = False - self.__state[CONSTANTS.EXPRESS_STATE.PIXELS] = [ - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - ] - self.__state[CONSTANTS.EXPRESS_STATE.RED_LED] = False - self.__state[CONSTANTS.EXPRESS_STATE.SWITCH] = False - self.__state[CONSTANTS.EXPRESS_STATE.TEMPERATURE] = 0 - self.__state[CONSTANTS.EXPRESS_STATE.LIGHT] = 0 - self.__state[CONSTANTS.EXPRESS_STATE.MOTION_X] = 0 - self.__state[CONSTANTS.EXPRESS_STATE.MOTION_Y] = 0 - self.__state[CONSTANTS.EXPRESS_STATE.MOTION_Z] = 0 - self.__state[CONSTANTS.EXPRESS_STATE.TOUCH] = [False] * 7 - self.__state[CONSTANTS.EXPRESS_STATE.SHAKE] = False - self.__state[CONSTANTS.EXPRESS_STATE.DETECT_TAPS] = 0 - self.pixels = Pixel(self.__state) - - @property - def acceleration(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_ACCELERATION) - return Acceleration( - self.__state[CONSTANTS.EXPRESS_STATE.MOTION_X], - self.__state[CONSTANTS.EXPRESS_STATE.MOTION_Y], - self.__state[CONSTANTS.EXPRESS_STATE.MOTION_Z], - ) - - @property - def button_a(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_BUTTON_A) - return self.__state[CONSTANTS.EXPRESS_STATE.BUTTON_A] - - @property - def button_b(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_BUTTON_B) - return self.__state[CONSTANTS.EXPRESS_STATE.BUTTON_B] - - @property - def detect_taps(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_DETECT_TAPS) - return self.__state[CONSTANTS.EXPRESS_STATE.DETECT_TAPS] - - @detect_taps.setter - def detect_taps(self, value): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_DETECT_TAPS) - value_int = int(value) - self.__state[CONSTANTS.EXPRESS_STATE.DETECT_TAPS] = ( - value_int if (value_int == 1 or value_int == 2) else 1 - ) - - @property - def tapped(self): - """ Not Implemented! - """ - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_TAPPED) - utils.print_for_unimplemented_functions("tapped") - - @property - def red_led(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_RED_LED) - return self.__state[CONSTANTS.EXPRESS_STATE.RED_LED] - - @red_led.setter - def red_led(self, value): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_RED_LED) - self.__state[CONSTANTS.EXPRESS_STATE.RED_LED] = bool(value) - self.__show() - - @property - def switch(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_SWITCH) - return self.__state[CONSTANTS.EXPRESS_STATE.SWITCH] - - @property - def temperature(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_TEMPERATURE) - return self.__state[CONSTANTS.EXPRESS_STATE.TEMPERATURE] - - @property - def light(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_LIGHT) - return self.__state[CONSTANTS.EXPRESS_STATE.LIGHT] - - def __show(self): - if utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - self.__state, CONSTANTS.CPX - ) - else: - utils.send_to_simulator(self.__state, CONSTANTS.CPX) - - def __touch(self, i): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_TOUCH) - return self.__state[CONSTANTS.EXPRESS_STATE.TOUCH][i - 1] - - @property - def touch_A1(self): - return self.__touch(1) - - @property - def touch_A2(self): - return self.__touch(2) - - @property - def touch_A3(self): - return self.__touch(3) - - @property - def touch_A4(self): - return self.__touch(4) - - @property - def touch_A5(self): - return self.__touch(5) - - @property - def touch_A6(self): - return self.__touch(6) - - @property - def touch_A7(self): - return self.__touch(7) - - def adjust_touch_threshold(self, adjustment): - """Not implemented! - The CPX Simulator doesn't use capacitive touch threshold. - """ - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_ADJUST_THRESHOLD) - utils.print_for_unimplemented_functions(Express.adjust_touch_threshold.__name__) - - def shake(self, shake_threshold=30): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_SHAKE) - return self.__state[CONSTANTS.EXPRESS_STATE.SHAKE] - - def play_file(self, file_name): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_PLAY_FILE) - file_name = utils.remove_leading_slashes(file_name) - abs_path_parent_dir = os.path.abspath( - os.path.join(utils.abs_path_to_user_file, os.pardir) - ) - abs_path_wav_file = os.path.normpath( - os.path.join(abs_path_parent_dir, file_name) - ) - abs_path_wav_file = utils.escape_if_OSX(abs_path_wav_file) - - if sys.implementation.version[0] >= 3: - if file_name.endswith(".wav"): - try: - playsound.playsound(abs_path_wav_file) - except: - # TODO TASK: 29054 Verfication of a "valid" .wav file - raise EnvironmentError(CONSTANTS.NOT_SUITABLE_FILE_ERROR) - else: - raise TypeError(file_name + " is not a path to a .wav file.") - else: - raise NotImplementedError("Please use Python 3 or higher.") - - def play_tone(self, frequency, duration): - """ Not Implemented! - """ - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_PLAY_TONE) - utils.print_for_unimplemented_functions(Express.play_tone.__name__) - - def start_tone(self, frequency): - """ Not Implemented! - """ - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_START_TONE) - utils.print_for_unimplemented_functions(Express.start_tone.__name__) - - def stop_tone(self): - """ Not Implemented! - """ - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_STOP_TONE) - utils.print_for_unimplemented_functions(Express.stop_tone.__name__) - - def update_state(self, new_state): - for event in CONSTANTS.ALL_EXPECTED_INPUT_EVENTS: - self._Express__state[event] = new_state.get( - event, self._Express__state[event] - ) - - -cpx = Express() diff --git a/src/adafruit_circuitplayground/locale/en/LC_MESSAGES/express.po b/src/adafruit_circuitplayground/locale/en/LC_MESSAGES/express.po deleted file mode 100644 index 50579af3a..000000000 --- a/src/adafruit_circuitplayground/locale/en/LC_MESSAGES/express.po +++ /dev/null @@ -1,26 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-21 13:35-0700\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: express.py:190 -msgid " is not a path to a .wav file." -msgstr "" - -#: express.py:192 -msgid "Please use Python 3 or higher." -msgstr "" diff --git a/src/adafruit_circuitplayground/locale/express.pot b/src/adafruit_circuitplayground/locale/express.pot deleted file mode 100644 index 50579af3a..000000000 --- a/src/adafruit_circuitplayground/locale/express.pot +++ /dev/null @@ -1,26 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-21 13:35-0700\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: express.py:190 -msgid " is not a path to a .wav file." -msgstr "" - -#: express.py:192 -msgid "Please use Python 3 or higher." -msgstr "" diff --git a/src/adafruit_circuitplayground/pixel.py b/src/adafruit_circuitplayground/pixel.py deleted file mode 100644 index 22fcfc8ae..000000000 --- a/src/adafruit_circuitplayground/pixel.py +++ /dev/null @@ -1,133 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -import json -import sys -import common - -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent -from . import constants as CONSTANTS - - -class Pixel: - def __init__(self, state): - self.__state = state - self.auto_write = True - self.telemetry_state = False - - def show(self): - # Send the state to the extension so that React re-renders the Webview - # or send the state to the debugger (within this library) - if utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - self.__state, CONSTANTS.CPX - ) - else: - common.utils.send_to_simulator(self.__state, CONSTANTS.CPX) - - def __show_if_auto_write(self): - if self.auto_write: - self.show() - - def __getitem__(self, index): - if type(index) is not slice: - if not self.__valid_index(index): - raise IndexError(CONSTANTS.INDEX_ERROR) - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_PIXELS) - return self.__state[CONSTANTS.EXPRESS_STATE.PIXELS][index] - - def __setitem__(self, index, val): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_PIXELS) - is_slice = False - if type(index) is slice: - is_slice = True - else: - if not self.__valid_index(index): - raise IndexError(CONSTANTS.INDEX_ERROR) - self.__state[CONSTANTS.EXPRESS_STATE.PIXELS][ - index - ] = self.__extract_pixel_value(val, is_slice) - self.__show_if_auto_write() - - def __iter__(self): - yield from self.__state[CONSTANTS.EXPRESS_STATE.PIXELS] - - def __enter__(self): - return self - - def __repr__(self): - return "[" + ", ".join([str(x) for x in self]) + "]" - - def __len__(self): - return len(self.__state[CONSTANTS.EXPRESS_STATE.PIXELS]) - - def __valid_index(self, index): - return ( - type(index) is int - and index >= -len(self.__state[CONSTANTS.EXPRESS_STATE.PIXELS]) - and index < len(self.__state[CONSTANTS.EXPRESS_STATE.PIXELS]) - ) - - def fill(self, val): - for index in range(len(self.__state[CONSTANTS.EXPRESS_STATE.PIXELS])): - self.__state[CONSTANTS.EXPRESS_STATE.PIXELS][ - index - ] = self.__extract_pixel_value(val) - self.__show_if_auto_write() - - def __extract_pixel_value(self, val, is_slice=False): - extracted_values = [] - values = val - if not is_slice: - values = [val] - # Type validation - for v in values: - if type(v) is list: - rgb_value = tuple(v) - elif type(v) is int: - rgb_value = self.__hex_to_rgb(hex(v)) - elif type(v) is tuple: - rgb_value = v - else: - raise ValueError(CONSTANTS.ASSIGN_PIXEL_TYPE_ERROR) - # Values validation - if len(rgb_value) != 3 or any( - not self.__valid_rgb_value(pix) for pix in rgb_value - ): - raise ValueError(CONSTANTS.VALID_PIXEL_ASSIGN_ERROR) - extracted_values.append(rgb_value) - return rgb_value if not is_slice else extracted_values - - def __hex_to_rgb(self, hexValue): - if hexValue[0:2] == "0x" and len(hexValue) <= 8: - hexToRgbValue = [0, 0, 0] - hexColor = hexValue[2:].zfill(6) - hexToRgbValue[0] = int(hexColor[0:2], 16) # R - hexToRgbValue[1] = int(hexColor[2:4], 16) # G - hexToRgbValue[2] = int(hexColor[4:6], 16) # B - return tuple(hexToRgbValue) - else: - raise ValueError(CONSTANTS.PIXEL_RANGE_ERROR) - - def __valid_rgb_value(self, pixValue): - return type(pixValue) is int and pixValue >= 0 and pixValue <= 255 - - @property - def brightness(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_BRIGHTNESS) - return self.__state[CONSTANTS.EXPRESS_STATE.BRIGHTNESS] - - @brightness.setter - def brightness(self, brightness): - if not self.__valid_brightness(brightness): - raise ValueError(CONSTANTS.BRIGHTNESS_RANGE_ERROR) - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_BRIGHTNESS) - self.__state[CONSTANTS.EXPRESS_STATE.BRIGHTNESS] = brightness - self.__show_if_auto_write() - - def __valid_brightness(self, brightness): - return (type(brightness) is float or type(brightness) is int) and ( - brightness >= 0 and brightness <= 1 - ) diff --git a/src/adafruit_circuitplayground/test/__init__.py b/src/adafruit_circuitplayground/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/adafruit_circuitplayground/test/sample.mp4 b/src/adafruit_circuitplayground/test/sample.mp4 deleted file mode 100644 index ed139d6d50cc43f89c27392621f20d174d0bf051..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1055736 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

Aa@|$FDt-+LPp7ZlZYEj+U-s{? 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⁣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%0DXThCjUf28ZIq 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≫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

l{J&)}YQ*vBn(G1ylxHzv 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

^>&uqp0SB(s(nZAP%Ox2{`ej2 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

QHULVySZ}#~PuWJ^7tmFuh?r7A2=*(e)d45vEW8 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 diff --git a/src/adafruit_circuitplayground/test/sample.wav b/src/adafruit_circuitplayground/test/sample.wav deleted file mode 100644 index 362feec5a6c6d167193fc975a2175264968ab671..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210158 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≤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 z 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

0`oAv;E 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 diff --git a/src/adafruit_circuitplayground/test/test_express.py b/src/adafruit_circuitplayground/test/test_express.py deleted file mode 100644 index 0732d9641..000000000 --- a/src/adafruit_circuitplayground/test/test_express.py +++ /dev/null @@ -1,115 +0,0 @@ -import pytest -from unittest import mock - -import playsound -from ..express import Express -from ..pixel import Pixel -from .. import constants as CONSTANTS - - -class TestExpress(object): - def setup_method(self): - self.cpx = Express() - self.__state = {} - self.__state[CONSTANTS.EXPRESS_STATE.BRIGHTNESS] = 1.0 - self.__state[CONSTANTS.EXPRESS_STATE.BUTTON_A] = False - self.__state[CONSTANTS.EXPRESS_STATE.BUTTON_B] = False - self.__state[CONSTANTS.EXPRESS_STATE.PIXELS] = [(255, 0, 0)] * 10 - self.__state[CONSTANTS.EXPRESS_STATE.RED_LED] = False - self.__state[CONSTANTS.EXPRESS_STATE.SWITCH] = False - self.pixels = Pixel(self.__state) - self.__speaker_enabled = False - - def test_acceleration(self): - mock_motion_x = 10 - mock_motion_y = -10 - mock_motion_z = -20 - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.MOTION_X] = mock_motion_x - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.MOTION_Y] = mock_motion_y - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.MOTION_Z] = mock_motion_z - accel = self.cpx.acceleration - assert accel[0] == 10 - assert accel[1] == -10 - assert accel[2] == -20 - - def test_button_a(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.BUTTON_A] = True - assert self.cpx.button_a - - def test_button_b(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.BUTTON_B] = True - assert self.cpx.button_b - - def test_taps(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.DETECT_TAPS] = 2 - assert 2 == self.cpx.detect_taps - - @pytest.mark.parametrize("taps, expected", [(1, 1), (2, 2), (3, 1)]) - def test_taps_setter(self, taps, expected): - self.cpx.detect_taps = taps - assert expected == self.cpx.detect_taps - - def test_red_led(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.RED_LED] = True - assert self.cpx.red_led - - def test_red_led_int(self): - self.cpx.red_led = 3 - assert self.cpx.red_led - - def test_red_led_string(self): - self.cpx.red_led = "foo" - assert self.cpx.red_led - - def test_switch(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.SWITCH] = True - assert self.cpx.switch - - def test_temperature(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TEMPERATURE] = 31 - assert 31 == self.cpx.temperature - - def test_light(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.LIGHT] = 255 - assert 255 == self.cpx.light - - def test_shake(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.SHAKE] = True - assert self.cpx.shake() - - def test_touch_A1(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][0] = True - assert self.cpx.touch_A1 - - def test_touch_A2(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][1] = True - assert self.cpx.touch_A2 - - def test_touch_A3(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][2] = True - assert self.cpx.touch_A3 - - def test_touch_A4(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][3] = True - assert self.cpx.touch_A4 - - def test_touch_A5(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][4] = True - assert self.cpx.touch_A5 - - def test_touch_A6(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][5] = True - assert self.cpx.touch_A6 - - def test_touch_A7(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][6] = True - assert self.cpx.touch_A7 - - def test_play_file_mp4_wrong_type(self): - with pytest.raises(TypeError): - self.cpx.play_file("sample.mp4") - - def test_play_file_mp4(self): - playsound.playsound = mock.Mock() - self.cpx.play_file("sample.wav") - playsound.playsound.assert_called_once() diff --git a/src/adafruit_circuitplayground/test/test_pixel.py b/src/adafruit_circuitplayground/test/test_pixel.py deleted file mode 100644 index e1179939b..000000000 --- a/src/adafruit_circuitplayground/test/test_pixel.py +++ /dev/null @@ -1,117 +0,0 @@ -import pytest - -from ..pixel import Pixel -from .. import constants as CONSTANTS - - -class TestPixel(object): - def setup_method(self): - state = {} - state[CONSTANTS.EXPRESS_STATE.BRIGHTNESS] = 1.0 - state[CONSTANTS.EXPRESS_STATE.BUTTON_A] = False - state[CONSTANTS.EXPRESS_STATE.BUTTON_B] = False - state[CONSTANTS.EXPRESS_STATE.PIXELS] = [(255, 0, 0), (0, 255, 0), (0, 0, 255)] - state[CONSTANTS.EXPRESS_STATE.RED_LED] = False - state[CONSTANTS.EXPRESS_STATE.SWITCH] = False - self.pixel = Pixel(state) - - def test_get_item_out_of_bounds(self): - with pytest.raises(IndexError): - p = self.pixel[3] - - def test_get_item(self): - assert (0, 0, 255) == self.pixel[2] - - def test_get_item_splice(self): - assert [(255, 0, 0), (0, 255, 0)] == self.pixel[0:2] - - def test_set_item(self): - self.pixel[1] = (50, 50, 50) - assert (50, 50, 50) == self.pixel[1] - - def test_set_item_splice(self): - self.pixel[0:1] = [(100, 100, 100), (0, 0, 100)] - assert (100, 100, 100) == self.pixel[0] - assert (0, 0, 100) == self.pixel[1] - - def test_set_item_out_of_bounds(self): - with pytest.raises(IndexError): - self.pixel[3] = (0, 0, 0) - - def test_set_item_invalid(self): - with pytest.raises(ValueError): - self.pixel[0] = "hello" - - def test_len(self): - assert 3 == len(self.pixel) - - @pytest.mark.parametrize("index, expected", [(0, True), (3, False)]) - def test_valid_index(self, index, expected): - assert self.pixel._Pixel__valid_index(index) == expected - - def test_fill(self): - self.pixel.fill((123, 123, 123)) - assert all( - p == (123, 123, 123) - for p in self.pixel._Pixel__state[CONSTANTS.EXPRESS_STATE.PIXELS] - ) - - @pytest.mark.parametrize( - "val, expected", - [([3, 4, 5], (3, 4, 5)), (432, (0, 1, 176)), ((1, 2, 3), (1, 2, 3))], - ) - def test_extract_pixel_values_not_slice(self, val, expected): - assert expected == self.pixel._Pixel__extract_pixel_value(val) - - @pytest.mark.parametrize( - "val, expected", - [ - ([[3, 4, 5], [6, 7, 8]], [(3, 4, 5), (6, 7, 8)]), - ([444555, 666777], [(6, 200, 139), (10, 44, 153)]), - ([(10, 10, 10), (20, 20, 20)], [(10, 10, 10), (20, 20, 20)]), - ], - ) - def test_extract_pixel_values_slice(self, val, expected): - assert expected == self.pixel._Pixel__extract_pixel_value(val, is_slice=True) - - @pytest.mark.parametrize("val", [[1, 2, 3, 4], [1, 2], 0.3]) - def test_extract_pixel_values_fail(self, val): - with pytest.raises(ValueError): - self.pixel._Pixel__extract_pixel_value(val) - - def test_hex_to_rgb_fail(self): - with pytest.raises(ValueError): - self.pixel._Pixel__hex_to_rgb("x") - - @pytest.mark.parametrize( - "hex, expected", - [ - ("0xffffff", (255, 255, 255)), - ("0x0", (0, 0, 0)), - ("0xff0000", (255, 0, 0)), - ("0xabcdef", (171, 205, 239)), - ], - ) - def test_hex_to_rgb(self, hex, expected): - assert expected == self.pixel._Pixel__hex_to_rgb(hex) - - @pytest.mark.parametrize( - "pixValue, expected", - [(0, True), (200, True), (255, True), (-1, False), (256, False), ("1", False)], - ) - def test_valid_rgb_value(self, pixValue, expected): - assert expected == self.pixel._Pixel__valid_rgb_value(pixValue) - - def test_get_brightness(self): - self.pixel._Pixel__state[CONSTANTS.EXPRESS_STATE.BRIGHTNESS] = 0.4 - assert 0.4 == pytest.approx(self.pixel.brightness) - - @pytest.mark.parametrize("brightness", [-0.1, 1.1]) - def test_set_brightness_fail(self, brightness): - with pytest.raises(ValueError): - self.pixel.brightness = brightness - - @pytest.mark.parametrize("brightness", [0, 1, 0.4, 0.333]) - def test_set_brightness(self, brightness): - self.pixel.brightness = brightness - assert self.pixel._Pixel__valid_brightness(brightness) diff --git a/src/base_circuitpython/__init__.py b/src/base_circuitpython/__init__.py deleted file mode 100644 index 398a3936b..000000000 --- a/src/base_circuitpython/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -import pathlib -import os -import sys - -abs_path = pathlib.Path(__file__).parent.absolute() -clue_path = os.path.join(abs_path, "../clue") -sys.path.insert(0, os.path.join(abs_path)) -sys.path.insert(0, os.path.join(clue_path)) diff --git a/src/base_circuitpython/base_cp_constants.py b/src/base_circuitpython/base_cp_constants.py deleted file mode 100644 index bd93e5576..000000000 --- a/src/base_circuitpython/base_cp_constants.py +++ /dev/null @@ -1,82 +0,0 @@ -class CLUE_STATE: - BUTTON_A = "button_a" - BUTTON_B = "button_b" - PRESSED_BUTTONS = "pressed_buttons" - SEA_LEVEL_PRESSURE = "sea_level_pressure" - TEMPERATURE = "temperature" - PROXIMITY = "proximity" - GESTURE = "gesture" - HUMIDITY = "humidity" - PRESSURE = "pressure" - PIXEL = "pixel" - # Accelerometer - MOTION_X = "motion_x" - MOTION_Y = "motion_y" - MOTION_Z = "motion_z" - # Light/color sensor - LIGHT_R = "light_r" - LIGHT_G = "light_g" - LIGHT_B = "light_b" - LIGHT_C = "light_c" - # Magnetometer - MAGNET_X = "magnet_x" - MAGNET_Y = "magnet_y" - MAGNET_Z = "magnet_z" - # Gyroscope - GYRO_X = "gyro_x" - GYRO_Y = "gyro_y" - GYRO_Z = "gyro_z" - # LEDs - RED_LED = "red_led" - WHITE_LEDS = "white_leds" - - -CPX = "CPX" -CLUE = "CLUE" -PIXELS = "pixels" -SHAKE = "shake" - -CLUE_PIN = "D18" - -CLUE = "CLUE" -BASE_64 = "display_base64" -IMG_DIR_NAME = "img" -SCREEN_HEIGHT_WIDTH = 240 - -EXPECTED_INPUT_BUTTONS = set([CLUE_STATE.BUTTON_A, CLUE_STATE.BUTTON_B]) - -ALL_EXPECTED_INPUT_EVENTS = set( - [ - CLUE_STATE.TEMPERATURE, - CLUE_STATE.LIGHT_R, - CLUE_STATE.LIGHT_G, - CLUE_STATE.LIGHT_B, - CLUE_STATE.LIGHT_C, - CLUE_STATE.MOTION_X, - CLUE_STATE.MOTION_Y, - CLUE_STATE.MOTION_Z, - CLUE_STATE.HUMIDITY, - CLUE_STATE.PRESSURE, - CLUE_STATE.PROXIMITY, - CLUE_STATE.GESTURE, - CLUE_STATE.GYRO_X, - CLUE_STATE.GYRO_Y, - CLUE_STATE.GYRO_Z, - CLUE_STATE.MAGNET_X, - CLUE_STATE.MAGNET_Y, - CLUE_STATE.MAGNET_Z, - ] -) - -BMP_IMG = "BMP" - -BMP_IMG_ENDING = ".bmp" - -NO_VALID_IMGS_ERR = "No valid images" - -BLINKA_BMP = "blinka.bmp" -CLUE_TERMINAL_LINE_HEIGHT = 16 -CLUE_TERMINAL_LINE_NUM_MAX = 15 -CLUE_TERMINAL_X_OFFSET = 15 -CLUE_TERMINAL_Y_OFFSET = 5 -CLUE_TERMINAL_LINE_BREAK_AMT = 37 diff --git a/src/base_circuitpython/board.py b/src/base_circuitpython/board.py deleted file mode 100644 index 8bef9ed4f..000000000 --- a/src/base_circuitpython/board.py +++ /dev/null @@ -1,128 +0,0 @@ -# dummy class for references to board display to work -# https://learn.adafruit.com/arduino-to-circuitpython/the-board-module - - -import terminal_handler - - -class __Display: - def __init__(self): - self.active_group = None - self.terminal = terminal_handler.Terminal() - - def show(self, group=None): - if group != self.active_group: - self.active_group = group - - if group == None: - self.terminal._Terminal__draw() - return - - # if the group has no attribute called - # "draw", then it is liable for updating itself - # when it calls show - if hasattr(group, "_Group__draw"): - group._Group__draw() - - -DISPLAY = __Display() - -# default pin for neopixel, -# shows that this could -# refer to the CPX -# or CLUE neopixel pin -NEOPIXEL = "D00" - -# ETC PINS WITHIN THE CLUE THAT MAY BE REFERENCED -# found by runing print(dir(board)) on clue -A0 = 0 -A1 = 0 -A2 = 0 -A3 = 0 -A4 = 0 -A5 = 0 -A6 = 0 -A7 = 0 - -ACCELEROMETER_GYRO_INTERRUPT = 0 - -BUTTON_A = 0 -BUTTON_B = 0 - -D0 = 0 -D1 = 0 -D2 = 0 -D3 = 0 -D4 = 0 -D5 = 0 -D6 = 0 -D7 = 0 -D8 = 0 -D9 = 0 -D10 = 0 -D11 = 0 -D12 = 0 -D13 = 0 -D14 = 0 -D15 = 0 -D16 = 0 -D17 = 0 -D18 = 0 -D19 = 0 -D20 = 0 - -I2C = 0 - -L = 0 - -MICROPHONE_CLOCK = 0 -MICROPHONE_DATA = 0 - -MISO = 0 -MOSI = 0 - -P0 = 0 -P1 = 0 -P2 = 0 -P3 = 0 -P4 = 0 -P5 = 0 -P6 = 0 -P7 = 0 -P8 = 0 -P9 = 0 -P10 = 0 -P11 = 0 -P12 = 0 -P13 = 0 -P14 = 0 -P15 = 0 -P16 = 0 -P17 = 0 -P18 = 0 -P19 = 0 -P20 = 0 - -PROXIMITY_LIGHT_INTERRUPT = 0 - -RX = 0 -SCK = 0 -SCL = 0 -SDA = 0 - -SPEAKER = 0 - -SPI = 0 - -TFT_BACKLIGHT = 0 -TFT_CS = 0 -TFT_DC = 0 -TFT_MOSI = 0 -TFT_RESET = 0 -TFT_SCK = 0 - -TX = 0 - -UART = 0 - -WHITE_LEDS = 0 diff --git a/src/base_circuitpython/digitalio.py b/src/base_circuitpython/digitalio.py deleted file mode 100644 index 604db72c3..000000000 --- a/src/base_circuitpython/digitalio.py +++ /dev/null @@ -1,17 +0,0 @@ -# dummy class for neopixel library to work - -# original implementation docs for digitalio: -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/digitalio/__init__.html - - -class DigitalInOut: - def __init__(self, pin): - self.pin = pin - pass - - def deinit(self): - pass - - -class Direction: - OUTPUT = 0 diff --git a/src/base_circuitpython/displayio/__init__.py b/src/base_circuitpython/displayio/__init__.py deleted file mode 100644 index a926bf965..000000000 --- a/src/base_circuitpython/displayio/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# Displayio implementation loosely based on the -# displayio package in Adafruit CircuitPython - -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/__init__.html - -from .bitmap import Bitmap -from .group import Group -from .palette import Palette - -# references to img and bmp_img are for testing purposes -from .tile_grid import TileGrid diff --git a/src/base_circuitpython/displayio/bitmap.py b/src/base_circuitpython/displayio/bitmap.py deleted file mode 100644 index c913dff2b..000000000 --- a/src/base_circuitpython/displayio/bitmap.py +++ /dev/null @@ -1,105 +0,0 @@ -from . import constants as CONSTANTS - -# Bitmap implementation loosely based on the -# displayio.Bitmap class in Adafruit CircuitPython - -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/Bitmap.html - -# The colour of a certain pixel is interpreted -# within the TileGrid instance that the object -# lives within. Each pixel is an integer value -# that refers to the colours in the palette via index. - - -class Bitmap: - """ - .. currentmodule:: displayio - - `Bitmap` -- Stores values in a 2D array - ========================================================================== - - Stores values of a certain size in a 2D array - - .. class:: Bitmap(width, height, value_count) - - Create a Bitmap object with the given fixed size. Each pixel stores a value that is used to - index into a corresponding palette. This enables differently colored sprites to share the - underlying Bitmap. value_count is used to minimize the memory used to store the Bitmap. - - :param int width: The number of values wide - :param int height: The number of values high - :param int value_count: The number of possible pixel values. - - """ - - def __init__(self, width, height, value_count=255): - self.__width = width - self.__height = height - self.values = bytearray(width * height) - - @property - def width(self): - """ - .. attribute:: width - - Width of the bitmap. (read only) - - """ - return self.__width - - @property - def height(self): - """ - .. attribute:: height - - Height of the bitmap. (read only) - - """ - return self.__height - - def __setitem__(self, index, value): - """ - .. method:: __setitem__(index, value) - - Sets the value at the given index. The index can either be an x,y tuple or an int equal - to ``y * width + x``. - - This allows you to:: - - bitmap[0,1] = 3 - - """ - if isinstance(index, tuple): - if index[0] >= self.width or index[1] >= self.height: - raise IndexError(CONSTANTS.PIXEL_OUT_OF_BOUNDS) - - index = index[0] + index[1] * self.width - - try: - self.values[index] = value - except IndexError: - raise IndexError(CONSTANTS.PIXEL_OUT_OF_BOUNDS) - - def __getitem__(self, index): - """ - .. method:: __getitem__(index) - - Returns the value at the given index. The index can either be an x,y tuple or an int equal - to ``y * width + x``. - - This allows you to:: - - print(bitmap[0,1]) - - """ - - if isinstance(index, tuple): - if index[0] >= self.width or index[1] >= self.height: - raise IndexError(CONSTANTS.PIXEL_OUT_OF_BOUNDS) - - index = index[0] + index[1] * self.width - - try: - return self.values[index] - except IndexError: - raise IndexError(CONSTANTS.PIXEL_OUT_OF_BOUNDS) diff --git a/src/base_circuitpython/displayio/color_type.py b/src/base_circuitpython/displayio/color_type.py deleted file mode 100644 index c56347315..000000000 --- a/src/base_circuitpython/displayio/color_type.py +++ /dev/null @@ -1,12 +0,0 @@ -# Datatype for the items within a palette -class _ColorType: - def __init__(self, rgb888): - self.rgb888 = rgb888 - self.transparent = False - - def __eq__(self, other): - return ( - isinstance(other, _ColorType) - and self.rgb888 == other.rgb888 - and self.transparent == other.transparent - ) diff --git a/src/base_circuitpython/displayio/constants.py b/src/base_circuitpython/displayio/constants.py deleted file mode 100644 index bca672472..000000000 --- a/src/base_circuitpython/displayio/constants.py +++ /dev/null @@ -1,12 +0,0 @@ -PIXEL_OUT_OF_BOUNDS = "pixel coordinates out of bounds" -PALETTE_OUT_OF_RANGE = "Palette index out of range" -TILE_OUT_OF_BOUNDS = "Tile index out of bounds" -INCORR_SUBCLASS = "Layer must be a Group or TileGrid subclass." -LAYER_ALREADY_IN_GROUP = "Layer already in a group." -GROUP_FULL = "Group Full" -SCALE_TOO_SMALL = "scale must be >= 1" - -SCREEN_HEIGHT_WIDTH = 240 - -CLUE = "CLUE" -BASE_64 = "display_base64" diff --git a/src/base_circuitpython/displayio/group.py b/src/base_circuitpython/displayio/group.py deleted file mode 100644 index 5acc1f2a8..000000000 --- a/src/base_circuitpython/displayio/group.py +++ /dev/null @@ -1,354 +0,0 @@ -import base64 -from io import BytesIO -from PIL import Image -import adafruit_display_text - -from displayio.tile_grid import TileGrid -from . import constants as CONSTANTS - -import common -import board -import sys - -# Group implementation loosely based on the -# displayio.Group class in Adafruit CircuitPython -# (with only the functions needed for the CLUE) - -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/Group.html - - -class Group: - """ - `Group` -- Group together sprites and subgroups - ========================================================================== - - Manage a group of sprites and groups and how they are inter-related. - - .. class:: Group(*, max_size=4, scale=1, x=0, y=0) - Create a Group of a given size and scale. Scale is in one dimension. For example, scale=2 - leads to a layer's pixel being 2x2 pixels when in the group. - :param int max_size: The maximum group size. - :param int scale: Scale of layer pixels in one dimension. - :param int x: Initial x position within the parent. - :param int y: Initial y position within the parent. - """ - - def __init__( - self, - max_size=sys.maxsize, - scale=1, - x=0, - y=0, - check_active_group_ref=True, - auto_write=True, - ): - self.__check_active_group_ref = check_active_group_ref - self.__auto_write = auto_write - self.__contents = [] - self.__max_size = max_size - - if scale < 1: - raise ValueError(CONSTANTS.SCALE_TOO_SMALL) - - self.__scale = scale - """ - .. attribute:: scale - - Scales each pixel within the Group in both directions. For example, when scale=2 each pixel - will be represented by 2x2 pixels. - - """ - self.__x = x - """ - .. attribute:: x - - X position of the Group in the parent. - - """ - self.__y = y - """ - .. attribute:: y - - Y position of the Group in the parent. - """ - self.__parent = None - self.__hidden = False - - @property - def x(self): - return self.__x - - @x.setter - def x(self, val): - if self.__x != val: - self.__x = val - self.__elem_changed() - - @property - def y(self): - return self.__y - - @y.setter - def y(self, val): - if self.__y != val: - self.__y = val - self.__elem_changed() - - @property - def scale(self): - return self.__scale - - @scale.setter - def scale(self, val): - if val < 1: - raise ValueError(CONSTANTS.SCALE_TOO_SMALL) - - if self.__scale != val: - self.__scale = val - self.__elem_changed() - - @property - def hidden(self): - """ - .. attribute:: hidden - - True when the Group and all of it's layers are not visible. When False, the Group's layers - are visible if they haven't been hidden. - """ - return self.__hidden - - @hidden.setter - def hidden(self, val): - changed = val != self.__hidden - self.__hidden = val - for elem in self.__contents: - elem.hidden = val - - if changed: - self.__elem_changed() - - def append(self, item): - """ - .. method:: append(layer) - - Append a layer to the group. It will be drawn above other layers. - """ - self.__prepare_for_add(item) - self.__contents.append(item) - self.__elem_changed() - - def insert(self, idx, item): - """ - .. method:: insert(index, layer) - - Insert a layer into the group. - """ - self.__prepare_for_add(item) - self.__contents.insert(idx, item) - self.__elem_changed() - - def index(self, layer): - """ - .. method:: index(layer) - - Returns the index of the first copy of layer. Raises ValueError if not found. - """ - for idx, elem in enumerate(self.__contents): - if elem == layer: - return idx - - return ValueError() - - def pop(self, i=-1): - """ - .. method:: pop(i=-1) - - Remove the ith item and return it. - """ - item = self.__contents.pop(i) - self.__set_parent(item, None) - self.__elem_changed() - return item - - def remove(self, layer): - """ - .. method:: remove(layer) - - Remove the first copy of layer. Raises ValueError if it is not present. - """ - idx = self.index(layer) - item = self.__contents[idx] - - self.__set_parent(item, None) - self.__contents.pop(idx) - self.__elem_changed() - - def __delitem__(self, index): - """ - .. method:: __delitem__(index) - - Deletes the value at the given index. - - This allows you to:: - - del group[0] - """ - item = self.__contents[index] - self.__set_parent(item, None) - del self.__contents[index] - self.__elem_changed() - - def __getitem__(self, index): - """ - .. method:: __getitem__(index) - - Returns the value at the given index. - - This allows you to:: - - print(group[0]) - - """ - return self.__contents[index] - - def __setitem__(self, index, val): - """ - .. method:: __setitem__(index, value) - - Sets the value at the given index. - - This allows you to:: - - group[0] = sprite - """ - old_val = self.__contents[index] - - self.__contents[index] = val - if old_val != val: - self.__elem_changed() - - def __len__(self): - """ - .. method:: __len__() - - Returns the number of layers in a Group - """ - if not self.__contents: - return 0 - else: - return len(self.__contents) - - @property - def __in_group(self): - return self.__parent != None - - def __prepare_for_add(self, item): - if len(self.__contents) == self.__max_size: - raise RuntimeError(CONSTANTS.GROUP_FULL) - elif not isinstance(item, TileGrid) and not isinstance(item, Group): - raise ValueError(CONSTANTS.INCORR_SUBCLASS) - elif (isinstance(item, Group) and item._Group__in_group) or ( - isinstance(item, TileGrid) and item._TileGrid__in_group - ): - raise ValueError(CONSTANTS.LAYER_ALREADY_IN_GROUP) - self.__set_parent(item, self) - - def __set_parent(self, item, val): - if isinstance(item, TileGrid): - item._TileGrid__parent = val - else: - item._Group__parent = val - - def __elem_changed(self): - # Ensure that this group is what the board is currently showing. - # Otherwise, don't bother to draw it. - if self.__auto_write: - self.__trigger_draw() - - def __trigger_draw(self): - # select the correct parent to draw from if necessary - if self.__check_active_group_ref and board.DISPLAY.active_group == self: - self.__draw() - - elif self.__in_group: - # If a sub-group is modified, propagate to top level to - # see if one of the parents are the current active group. - self.__parent._Group__elem_changed() - - def __draw(self, img=None, x=0, y=0, scale=None, show=True): - # this function is not a part of the orignal implementation - # it is what draws itself and its children and potentially shows it to the - # frontend - if img == None: - img = Image.new( - "RGBA", - (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), - (0, 0, 0, 0), - ) - if scale is None: - scale = self.scale - else: - scale *= self.scale - - try: - if isinstance(self, adafruit_display_text.label.Label): - # adafruit_display_text has some positioning considerations - # that need to be handled. - - # This was found manually, display must be positioned upwards - # 1 unit (1 unit * scale = scale) - y -= scale - - # Group is positioned against anchored_position (already incorporated into self.x and self.y), - # which is positioned against anchor_point - - x += self._anchor_point[0] - y += self._anchor_point[1] - except AttributeError: - pass - - for elem in self.__contents: - if not elem.hidden: - if isinstance(elem, Group): - img = elem._Group__draw( - img=img, x=x + self.x, y=y + self.y, scale=scale, show=False, - ) - else: - img = elem._TileGrid__draw( - img=img, x=x + self.x, y=y + self.y, scale=scale - ) - - # show should only be true to the highest parent group - if show: - self.__show(img) - - # return value only used if this is within another group - return img - - def __show(self, img): - # sends current img to the frontend - buffered = BytesIO() - img.save(buffered, format="BMP") - byte_base64 = base64.b64encode(buffered.getvalue()) - img_str = str(byte_base64)[2:-1] - - sendable_json = {CONSTANTS.BASE_64: img_str} - - if common.utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - sendable_json, CONSTANTS.CLUE - ) - else: - common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) - - def __len__(self): - if not self.__contents: - return 0 - else: - return len(self.__contents) - - def pop(self, i=-1): - item = self.__contents.pop(i) - item.parent = None - self.__elem_changed() - return item diff --git a/src/base_circuitpython/displayio/palette.py b/src/base_circuitpython/displayio/palette.py deleted file mode 100644 index b954d982b..000000000 --- a/src/base_circuitpython/displayio/palette.py +++ /dev/null @@ -1,81 +0,0 @@ -from .color_type import _ColorType -from . import constants as CONSTANTS - -# Palette implementation loosely based on the -# displayio.Palette class in Adafruit CircuitPython -# (with only the functions needed for the CLUE) - -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/Palette.html - - -class Palette: - """ - `Palette` -- Stores a mapping from bitmap pixel palette_indexes to display colors - ========================================================================================= - - Map a pixel palette_index to a full color. Colors are transformed to the display's format internally to - save memory. - - .. class:: Palette(color_count) - - Create a Palette object to store a set number of colors. - - :param int color_count: The number of colors in the Palette - """ - - def __init__(self, color_count): - self.__color_count = color_count - self.__contents = [] - - # set all colours to black by default - for i in range(self.__color_count): - self.__contents.append(_ColorType((0, 0, 0))) - - def __setitem__(self, index, value): - """ - .. method:: __setitem__(index, value) - - Sets the pixel color at the given index. The index should be an integer in the range 0 to color_count-1. - - The value argument represents a color, and can be from 0x000000 to 0xFFFFFF (to represent an RGB value). - Value can be an int, bytes (3 bytes (RGB) or 4 bytes (RGB + pad byte)), bytearray, - or a tuple or list of 3 integers. - - This allows you to:: - - palette[0] = 0xFFFFFF # set using an integer - palette[1] = b'\xff\xff\x00' # set using 3 bytes - palette[2] = b'\xff\xff\x00\x00' # set using 4 bytes - palette[3] = bytearray(b'\x00\x00\xFF') # set using a bytearay of 3 or 4 bytes - palette[4] = (10, 20, 30) # set using a tuple of 3 integers - - """ - if index >= self.__color_count: - raise IndexError(CONSTANTS.PALETTE_OUT_OF_RANGE) - - self.__contents[index].rgb888 = value - - def __len__(self): - """ - .. method:: __len__() - - Returns the number of colors in a Palette - - """ - return self.__color_count - - def make_transparent(self, index): - """ - .. method:: make_transparent(palette_index) - """ - self.__toggle_transparency(index, True) - - def make_opaque(self, index): - """ - .. method:: make_opaque(palette_index) - """ - self.__toggle_transparency(index, False) - - def __toggle_transparency(self, index, transparency): - if self.__contents[index]: - self.__contents[index].transparent = transparency diff --git a/src/base_circuitpython/displayio/test/__init__.py b/src/base_circuitpython/displayio/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/base_circuitpython/displayio/test/img/group_test_result.bmp b/src/base_circuitpython/displayio/test/img/group_test_result.bmp deleted file mode 100644 index 3dfdad5fce9797b69f25281ee08d44dad30c16e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeIwv5lQo7zW{MlRL$71ytYyoYNMK&LQ_ZN@H&)@%=`+aWrBJh&HT+Gjd zUw(r>BX9`l`H=A5KtRtoSo95tfSwNt?+pa>e1k>ba0ux6knr9>K+iW=^bLoAo(~D{ z4FvRjgGJwP2e1k>ba0ux6knr9>K+iW=^bLoA zo(~D{4FvRjgGJwP2|Eu&|R(dXt#jWRB({pJoZavqUo=anK>$%qS zTpEj8&$XuK(pcPjt~EWE#^TmjP0yvVxb<9XdM=H{t>;?Pb7?GYJ=dC^ zOJi~Cxz_Yt8jD-cwWjCNSloK9H9eQc;?{Gm>A5r(x1MWF&!w@r^;~OuE{(;l=UUTq zX)JC%*P5P7V{z-b*7RH&i(AjNrsvXF+YfaCk zvAFeIYkDq?#jWRB({pJoZavqUo=anK>$%qSTpEj8&$XuK(pcPjt~EWE#^TmjP0yvVxb<9XdM=H{t>;?Pb7?GYJ=dC^OJi~Cxz_Yt8jD-cwWjCNSloK9H9eQc z;?{Gm>A5r(x1MWF&!w@r^;~OuE{(;l=UUTqX)JC%*P5P7V{z-b*7RH&i(AjNrsvXF z+8JWb7|P?1oXUa(ETN#=hCp(3Fvvjd(7y-q;S>jvFl0(veDd!2xu*A2SA1oT`Q_BsJQuN!oK3Fx^r>~#Wq zUN`9e63}yL*y{xJyl&9_C7|chu-6IbdEKD8JWb7|P?1oXUa z(ETN#=hCp(3Fvvjd(7y-q;S>jvFl0(veDd!2xu z*A2SA1oT`Q_BsJQuN!oK3Fx^r>~#WqUN`9e63}yL*y{xJyl&9_C7|chu-6IbdEKD< zOF+-1VXqU=^SVLzmw=v2!(Jz#=XHbbF9AK5hP_Te&+7)=UjlkA4SSt{p4Sb!zXbGL z8umH?J+B*de+lThH0*T(dR{l^{u0o0Y1r!o^t^7+{UxC1(y-SF=y~0s`%6I2rD3lV L(DS-M_m{xmwbZOQ diff --git a/src/base_circuitpython/displayio/test/test_bitmap.py b/src/base_circuitpython/displayio/test/test_bitmap.py deleted file mode 100644 index 2967aa632..000000000 --- a/src/base_circuitpython/displayio/test/test_bitmap.py +++ /dev/null @@ -1,44 +0,0 @@ -import pytest -from ..bitmap import Bitmap -from .. import constants as CONSTANTS - - -class TestBitmap(object): - @pytest.mark.parametrize("x, y", [(1, 1), (2, 6), (0, 0)]) - def test_create_bitmap(self, x, y): - bitmap = Bitmap(x, y) - - @pytest.mark.parametrize("x, y, palette_num", [(1, 1, 4), (2, 3, 6), (4, 4, 9)]) - def test_set_and_get_pixel(self, x, y, palette_num): - bitmap = Bitmap(5, 5) - bitmap[x, y] = palette_num - assert palette_num == bitmap[x, y] - - @pytest.mark.parametrize("i, palette_num", [(1, 1), (24, 2)]) - def test_set_and_get_pixel_singular_index(self, i, palette_num): - bitmap = Bitmap(5, 5) - bitmap[i] = palette_num - assert palette_num == bitmap[i] - - @pytest.mark.parametrize( - "x_size, y_size, x_coord, y_coord", - [(1, 1, 0, 4), (1, 1, 4, 0), (200, 200, 300, 1), (200, 200, 1, 300)], - ) - def test_get_set_index_err(self, x_size, y_size, x_coord, y_coord): - bitmap = Bitmap(x_size, y_size) - - with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): - bitmap[x_coord, y_coord] = 0 - - with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): - val = bitmap[x_coord, y_coord] - - @pytest.mark.parametrize("x_size, y_size, i", [(1, 1, 3), (200, 200, 40000)]) - def test_get_set_index_err_singular_index(self, x_size, y_size, i): - bitmap = Bitmap(x_size, y_size) - - with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): - bitmap[i] = 0 - - with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): - val = bitmap[i] diff --git a/src/base_circuitpython/displayio/test/test_group.py b/src/base_circuitpython/displayio/test/test_group.py deleted file mode 100644 index 3e4b3601e..000000000 --- a/src/base_circuitpython/displayio/test/test_group.py +++ /dev/null @@ -1,174 +0,0 @@ -import sys -import os -import pytest -import pathlib - -from unittest import mock - -from common import utils - -from displayio.tile_grid import TileGrid -from displayio.group import Group -from displayio.palette import Palette -from displayio.bitmap import Bitmap -from .. import constants as CONSTANTS -from PIL import Image - - -class TestGroup(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - self.dummy_bitmap = Bitmap(500, 500) - self.dummy_palette = Palette(5) - self.dummy_pos = (0, 0) - - utils.send_to_simulator = mock.Mock() - - def test_append_tilegrid_group_to_group(self): - tg1 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - tg2 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - g1 = Group(max_size=10) - g2 = Group(max_size=10) - - g2.append(g1) - g2.append(tg1) - g2.append(tg2) - - assert len(g2._Group__contents) == 3 - assert len(g1._Group__contents) == 0 - - @pytest.mark.parametrize("group_item", [(""), (5), ((4, 5))]) - def test_incorr_subclass(self, group_item): - g1 = Group(max_size=10) - with pytest.raises(ValueError, match=CONSTANTS.INCORR_SUBCLASS): - g1.append(group_item) - - @pytest.mark.parametrize("scale", [(0), (-2)]) - def test_invalid_scale(self, scale): - with pytest.raises(ValueError, match=CONSTANTS.SCALE_TOO_SMALL): - g1 = Group(scale=scale) - - def test_layer_already_in_group(self): - g1 = Group(max_size=4) - - tg1 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - tg2 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - g1.append(tg1) - - # should allow this, since it checks equality by reference: - g1.append(tg2) - - # should throw error for same group by reference - with pytest.raises(ValueError, match=CONSTANTS.LAYER_ALREADY_IN_GROUP): - g1.append(tg1) - - def test_group_full(self): - g1 = Group(max_size=1) - - tg1 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - tg2 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - g1.append(tg1) - - with pytest.raises(RuntimeError, match=CONSTANTS.GROUP_FULL): - g1.append(tg2) - - @pytest.mark.parametrize( - "size_w,size_h,draw_w,draw_h,accent_colors,x_offset,y_offset,scale_sub,scale_main", - [ - ( - (30, 27), - (63, 34), - (10, 11), - (40, 20), - ((244, 266, 23), (134, 26, 3)), - 3, - 9, - 2, - 3, - ) - ], - ) - def test_draw_group( - self, - size_w, - size_h, - draw_w, - draw_h, - accent_colors, - x_offset, - y_offset, - scale_sub, - scale_main, - ): - palette = Palette(3) - palette[1] = accent_colors[0] - palette[2] = accent_colors[1] - - bmp_1 = Bitmap(size_w[0], size_h[0]) - bmp_2 = Bitmap(size_w[1], size_h[1]) - - for i in range(draw_h[0]): - for j in range(draw_w[0]): - try: - bmp_1[j, i] = 1 - except IndexError: - continue - - for i in range(draw_h[1]): - for j in range(draw_w[1]): - try: - bmp_2[j, i] = 2 - except IndexError: - continue - - tg = TileGrid(bitmap=bmp_1, pixel_shader=palette, position=(0, 0)) - tg2 = TileGrid(bitmap=bmp_2, pixel_shader=palette, position=(50, 50)) - - group_main = Group(max_size=10, scale=scale_main, check_active_group_ref=False) - group_sub = Group(max_size=10, scale=scale_sub) - - group_sub.append(tg) - group_main.append(group_sub) - group_main.append(tg2) - img = group_main._Group__draw() - - img.putalpha(255) - expected = Image.open( - os.path.join(self.abs_path, "img", "group_test_result.bmp") - ) - expected.putalpha(255) - bmp_img_expected = expected.load() - bmp_img = img.load() - for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - assert bmp_img_expected[j, i] == bmp_img[j, i] diff --git a/src/base_circuitpython/displayio/test/test_palette.py b/src/base_circuitpython/displayio/test/test_palette.py deleted file mode 100644 index 8b0d1aa38..000000000 --- a/src/base_circuitpython/displayio/test/test_palette.py +++ /dev/null @@ -1,31 +0,0 @@ -import pytest -from ..palette import Palette -from .. import constants as CONSTANTS -from ..color_type import _ColorType - - -class TestPalette(object): - @pytest.mark.parametrize( - "color_count, palette_num, val", - [(11, 5, (255, 255, 255)), (1, 0, (255, 0, 255)), (4, 3, (0, 0, 0))], - ) - def test_get_and_set_palette(self, color_count, palette_num, val): - palette = Palette(color_count) - palette[palette_num] = val - assert palette._Palette__contents[palette_num] == _ColorType(val) - - @pytest.mark.parametrize("palette_size, palette_index", [(3, 7), (0, 0), (3, 3)]) - def test_get_and_set_palette_err(self, palette_size, palette_index): - palette = Palette(palette_size) - with pytest.raises(IndexError, match=CONSTANTS.PALETTE_OUT_OF_RANGE): - palette[palette_index] = 0 - - def test_set_transparency(self): - palette = Palette(5) - assert palette._Palette__contents[2].transparent == False - - palette.make_transparent(2) - assert palette._Palette__contents[2].transparent == True - - palette.make_opaque(2) - assert palette._Palette__contents[2].transparent == False diff --git a/src/base_circuitpython/displayio/test/test_tile_grid.py b/src/base_circuitpython/displayio/test/test_tile_grid.py deleted file mode 100644 index 1f2d9d5fa..000000000 --- a/src/base_circuitpython/displayio/test/test_tile_grid.py +++ /dev/null @@ -1,173 +0,0 @@ -import pytest -from PIL import Image -from ..tile_grid import TileGrid -from ..palette import Palette -from ..bitmap import Bitmap -from .. import constants as CONSTANTS - - -class TestTileGrid(object): - def setup_method(self): - self.dummy_bitmap = Bitmap(500, 500) - self.dummy_palette = Palette(5) - self.dummy_pos = (0, 0) - - @pytest.mark.parametrize( - "bitmap_w,bitmap_h,palette_num,tile_width,tile_height,position", - [(1, 1, 3, 1, 1, (0, 5)), (5, 7, 4, 2, 3, (0, 5))], - ) - def test_basic_constructor( - self, bitmap_w, bitmap_h, palette_num, tile_width, tile_height, position - ): - # constructor with position tuple - tg1 = TileGrid( - bitmap=Bitmap(bitmap_w, bitmap_h), - pixel_shader=Palette(palette_num), - tile_width=tile_width, - tile_height=tile_height, - position=position, - ) - - # alternate constructor with no position tuple - - tg2 = TileGrid( - bitmap=Bitmap(bitmap_w, bitmap_h), - pixel_shader=Palette(palette_num), - tile_width=tile_width, - tile_height=tile_height, - x=position[0], - y=position[1], - ) - - tile_grids = [tg1, tg2] - - for tg in tile_grids: - assert tg._TileGrid__bitmap.width == bitmap_w - assert tg._TileGrid__bitmap.height == bitmap_h - assert len(tg.pixel_shader._Palette__contents) == palette_num - assert tg._TileGrid__tile_width == tile_width - assert tg._TileGrid__tile_height == tile_height - assert tg.x == position[0] - assert tg.y == position[1] - - # alternate constructor with no height and width -> takes the bitmap's height and width - tg3 = TileGrid( - bitmap=Bitmap(bitmap_w, bitmap_h), - pixel_shader=Palette(palette_num), - x=position[0], - y=position[1], - ) - - assert tg3._TileGrid__bitmap.width == bitmap_w - assert tg3._TileGrid__bitmap.height == bitmap_h - assert len(tg3.pixel_shader._Palette__contents) == palette_num - assert tg3._TileGrid__tile_width == bitmap_w - assert tg3._TileGrid__tile_height == bitmap_h - assert tg3.x == position[0] - assert tg3.y == position[1] - - @pytest.mark.parametrize( - "w, h, x, y", [(5, 5, 2, 1), (2, 7, 0, 0), (66, 88, 65, 87)] - ) - def test_tile_set_get(self, w, h, x, y): - tg = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - tile_width=w, - tile_height=h, - position=self.dummy_pos, - ) - - tg_x_y = tg[x, y] - assert tg_x_y == tg._TileGrid__bitmap[x, y] - - @pytest.mark.parametrize( - "w, h, x, y", [(55, 56, 100, 1), (55, 56, 0, 56), (66, 88, 66, 88)] - ) - def test_tile_out_of_bounds(self, w, h, x, y): - tg = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - tile_width=w, - tile_height=h, - position=self.dummy_pos, - ) - with pytest.raises(IndexError, match=CONSTANTS.TILE_OUT_OF_BOUNDS): - tg_x_y = tg[x, y] - - @pytest.mark.parametrize( - "size_w, size_h, x, y, draw_w, draw_h, bg_color, accent_color, x_offset, y_offset, scale", - [ - (10, 10, 5, 5, 5, 5, (3, 0, 0, 255), (244, 255, 23, 255), 2, 0, 2), - (100, 30, 2, 3, 6, 3, (255, 255, 255, 255), (45, 45, 77, 255), 0, 7, 5), - ], - ) - def test_draw( - self, - size_w, - size_h, - x, - y, - draw_w, - draw_h, - bg_color, - accent_color, - x_offset, - y_offset, - scale, - ): - - palette = Palette(2) - palette[0] = bg_color - palette[1] = accent_color - - bmp = Bitmap(size_w, size_h) - - for i in range(size_h): - for j in range(size_w): - bmp[j, i] = 0 - - for i in range(y, y + draw_h): - for j in range(x, x + draw_w): - try: - bmp[j, i] = 1 - except IndexError: - continue - - tg = TileGrid(bitmap=bmp, pixel_shader=palette, position=(0, 0)) - tg2 = TileGrid(bitmap=bmp, pixel_shader=palette, position=(0, 0)) - img = Image.new( - "RGBA", (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - # without scaling, test output - img = tg._TileGrid__draw(img, x_offset, y_offset, 1) - bmp_img = img.load() - for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - if (i in range(y_offset + y, y_offset + y + draw_h)) and ( - j in range(x_offset + x, x_offset + x + draw_w) - ): - assert bmp_img[j, i] == accent_color - elif (i in range(y_offset, y_offset + size_h)) and ( - j in range(x_offset, x_offset + size_w) - ): - assert bmp_img[j, i] == bg_color - - img = Image.new( - "RGBA", (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - # with scaling, test output - img = tg._TileGrid__draw(img, x_offset, y_offset, scale) - bmp_img = img.load() - for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - if ( - i in range(y_offset + y * scale, y_offset + (y + draw_h) * scale) - ) and ( - j in range(x_offset + x * scale, x_offset + (x + draw_w) * scale) - ): - assert bmp_img[j, i] == accent_color - elif (i in range(y_offset * scale, (y_offset + draw_h) * scale)) and ( - j in range(x_offset * scale, (x_offset + draw_w) * scale) - ): - assert bmp_img[j, i] == bg_color diff --git a/src/base_circuitpython/displayio/tile_grid.py b/src/base_circuitpython/displayio/tile_grid.py deleted file mode 100644 index ad948cfde..000000000 --- a/src/base_circuitpython/displayio/tile_grid.py +++ /dev/null @@ -1,280 +0,0 @@ -from PIL import Image, ImageColor -from . import constants as CONSTANTS -import threading -import queue -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# TileGrid implementation loosely based on the -# displayio.TileGrid class in Adafruit CircuitPython -# (with only the functions needed for the CLUE) -# this version of the class only supports a single tile, -# therefore, get/set functionality is a bit different. - -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/TileGrid.html - - -class TileGrid: - """ - `TileGrid` -- A grid of tiles sourced out of one bitmap - ========================================================================== - - Position a grid of tiles sourced from a bitmap and pixel_shader combination. Multiple grids - can share bitmaps and pixel shaders. - - A single tile grid is also known as a Sprite. - - .. class:: TileGrid(bitmap, *, pixel_shader, width=1, height=1, tile_width=None, tile_height=None, default_tile=0, x=0, y=0) - - Create a TileGrid object. The bitmap is source for 2d pixels. The pixel_shader is used to - convert the value and its location to a display native pixel color. This may be a simple color - palette lookup, a gradient, a pattern or a color transformer. - - tile_width and tile_height match the height of the bitmap by default. - - :param displayio.Bitmap bitmap: The bitmap storing one or more tiles. - :param displayio.Palette pixel_shader: The pixel shader that produces colors from values - :param int width: Width of the grid in tiles. - :param int height: Height of the grid in tiles. - :param int tile_width: Width of a single tile in pixels. Defaults to the full Bitmap and must evenly divide into the Bitmap's dimensions. - :param int tile_height: Height of a single tile in pixels. Defaults to the full Bitmap and must evenly divide into the Bitmap's dimensions. - :param int default_tile: Default tile index to show. - :param int x: Initial x position of the left edge within the parent. - :param int y: Initial y position of the top edge within the parent. - """ - - def __init__( - self, - bitmap, - pixel_shader, - default_tile=0, - tile_width=None, - tile_height=None, - x=0, - y=0, - position=None, - ): - self.x = None - """ - .. attribute:: x - - X position of the left edge in the parent. - """ - self.y = None - """ - .. attribute:: y - - Y position of the top edge in the parent. - """ - self.pixel_shader = pixel_shader - """ - .. attribute:: pixel_shader - - The pixel shader of the tilegrid. - """ - self.hidden = False - """ - .. attribute:: hidden - - True when the TileGrid is hidden. This may be False even when a part of a hidden Group. - """ - - self.__bitmap = bitmap - self.__tile_width = None - self.__tile_height = None - - if tile_width is None: - self.__tile_width = bitmap.width - else: - self.__tile_width = tile_width - - if tile_height is None: - self.__tile_height = bitmap.height - else: - self.__tile_height = tile_height - - if position and isinstance(position, tuple): - self.x = position[0] - self.y = position[1] - else: - self.x = x - self.y = y - - self.__parent = None - - # unimplemented features - self.__flip_x = False - self.__flip_y = False - self.__transpose_xy = False - - telemetry_py.send_telemetry(TelemetryEvent.CLUE_API_TILE_GRID) - - @property - def flip_x(self): - """ - .. attribute:: flip_x - - If true, the left edge rendered will be the right edge of the right-most tile. - """ - return self.__flip_x - - @flip_x.setter - def flip_x(self, val): - utils.print_for_unimplemented_functions(TileGrid.flip_x.__name_) - self.__flip_x = val - - @property - def flip_y(self): - - """ - .. attribute:: flip_y - - If true, the top edge rendered will be the bottom edge of the bottom-most tile. - """ - return self.__flip_y - - @flip_y.setter - def flip_y(self, val): - utils.print_for_unimplemented_functions(TileGrid.flip_y.__name_) - self.__flip_y = val - - @property - def transpose_xy(self): - - """ - .. attribute:: transpose_xy - - If true, the TileGrid's axis will be swapped. When combined with mirroring, any 90 degree - rotation can be achieved along with the corresponding mirrored version. - """ - return self.__transpose_xy - - @transpose_xy.setter - def transpose_xy(self, val): - utils.print_for_unimplemented_functions(TileGrid.transpose_xy.__name_) - self.__transpose_xy = val - - # setitem for an index simply gets the index of the bitmap - # rather than the tile index - def __setitem__(self, index, value): - """ - .. method:: __setitem__(index, tile_index) - Sets the tile index at the given index. The index can either be an x,y tuple or an int equal - to ``y * width + x``. - - This allows you to:: - - grid[0] = 10 - - or:: - - grid[0,0] = 10 - """ - if isinstance(index, tuple): - if index[0] >= self.__tile_width or index[1] >= self.__tile_height: - raise IndexError(CONSTANTS.TILE_OUT_OF_BOUNDS) - - self.__bitmap[index] = value - - # getitem for an index simply gets the index of the bitmap - # rather than the tile index - def __getitem__(self, index): - """ - .. method:: __getitem__(index) - Returns the tile index at the given index. The index can either be an x,y tuple or an int equal - to ``y * width + x``. - - This allows you to:: - - print(grid[0]) - """ - if isinstance(index, tuple): - if index[0] >= self.__tile_width or index[1] >= self.__tile_height: - raise IndexError(CONSTANTS.TILE_OUT_OF_BOUNDS) - - return self.__bitmap[index] - - @property - def __in_group(self): - return self.__parent != None - - # methods that are not in the origin class: - - def __draw(self, img, x, y, scale): - # draw the current bitmap with - # appropriate scale on the global bmp_img - x = self.x * scale + x - y = self.y * scale + y - - new_shape = self.__draw_group( - x, y, 0, self.__tile_height, 0, self.__tile_width, scale - ) - - img.paste(new_shape, (x, y), new_shape) - return img - - def __draw_group(self, x, y, y_start, y_end, x_start, x_end, scale): - height = y_end - y_start - width = x_end - x_start - - this_img = Image.new("RGBA", (width * scale, height * scale), (0, 0, 0, 0)) - this_img.putalpha(0) - this_bmp_img = this_img.load() - - for i in range(y_start, y_end): - for j in range(x_start, x_end): - x_offset = j * scale - y_offset = i * scale - - x_max = min(x_offset + scale, width * scale) - y_max = min(y_offset + scale, height * scale) - - curr_val = self.__bitmap[j, i] - palette_obj = self.pixel_shader._Palette__contents[curr_val] - - transparent = palette_obj.transparent - - if not transparent and x_offset >= 0 and y_offset >= 0: - - curr_colour = palette_obj.rgb888 - self.__fill_pixel( - curr_val, - curr_colour, - x_offset, - y_offset, - scale, - x_max, - y_max, - this_bmp_img, - ) - - return this_img - - # helper method for drawing pixels on bmp_img - # given the src, offset, and scale - def __fill_pixel( - self, - curr_val, - curr_colour, - x_offset, - y_offset, - scale, - x_max, - y_max, - this_bmp_img, - ): - - for new_y in range(y_offset, y_max): - for new_x in range(x_offset, x_max): - try: - if isinstance(curr_colour, tuple): - this_bmp_img[new_x, new_y] = curr_colour - else: - this_bmp_img[new_x, new_y] = ( - (curr_colour >> 16) & 255, - (curr_colour >> 8) & 255, - (curr_colour) & 255, - ) - except IndexError: - pass diff --git a/src/base_circuitpython/fontio.py b/src/base_circuitpython/fontio.py deleted file mode 100644 index 3c7e567bd..000000000 --- a/src/base_circuitpython/fontio.py +++ /dev/null @@ -1,14 +0,0 @@ -# dummy library for adafruit_bitmap_font to work - -# original implementation docs for fontio: -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/fontio/__init__.html - -# file taken from adafruit_bitmap_font's examples: -# https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font/blob/master/test/fontio.py -import collections -import displayio - -Glyph = collections.namedtuple( - "Glyph", - ["bitmap", "tile_index", "width", "height", "dx", "dy", "shift_x", "shift_y"], -) diff --git a/src/base_circuitpython/fonts/ter-u12n.bdf b/src/base_circuitpython/fonts/ter-u12n.bdf deleted file mode 100644 index 390d0a1e8..000000000 --- a/src/base_circuitpython/fonts/ter-u12n.bdf +++ /dev/null @@ -1,25240 +0,0 @@ -STARTFONT 2.1 -FONT -xos4-Terminus-Medium-R-Normal--12-120-72-72-C-60-ISO10646-1 -SIZE 12 72 72 -FONTBOUNDINGBOX 6 12 0 -2 -STARTPROPERTIES 20 -FAMILY_NAME "Terminus" -FOUNDRY "xos4" -SETWIDTH_NAME "Normal" -ADD_STYLE_NAME "" -COPYRIGHT "Copyright (C) 2018 Dimitar Toshkov Zhekov" -NOTICE "Licensed under the SIL Open Font License, Version 1.1" -WEIGHT_NAME "Medium" -SLANT "R" -PIXEL_SIZE 12 -POINT_SIZE 120 -RESOLUTION_X 72 -RESOLUTION_Y 72 -SPACING "C" -AVERAGE_WIDTH 60 -CHARSET_REGISTRY "ISO10646" -CHARSET_ENCODING "1" -MIN_SPACE 6 -FONT_ASCENT 10 -FONT_DESCENT 2 -DEFAULT_CHAR 65533 -ENDPROPERTIES -CHARS 1326 -STARTCHAR char0 -ENCODING 0 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -D8 -88 -00 -88 -88 -00 -88 -D8 -00 -00 -ENDCHAR -STARTCHAR space -ENCODING 32 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR exclam -ENCODING 33 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -20 -20 -20 -00 -20 -20 -00 -00 -ENDCHAR -STARTCHAR quotedbl -ENCODING 34 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -50 -50 -50 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR numbersign -ENCODING 35 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -F8 -50 -50 -F8 -50 -50 -00 -00 -ENDCHAR -STARTCHAR dollar -ENCODING 36 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -A8 -A0 -70 -28 -A8 -70 -20 -00 -ENDCHAR -STARTCHAR percent -ENCODING 37 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -48 -A8 -50 -10 -20 -28 -54 -48 -00 -00 -ENDCHAR -STARTCHAR ampersand -ENCODING 38 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -50 -20 -68 -90 -90 -68 -00 -00 -ENDCHAR -STARTCHAR quotesingle -ENCODING 39 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -20 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR parenleft -ENCODING 40 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -40 -40 -40 -40 -20 -10 -00 -00 -ENDCHAR -STARTCHAR parenright -ENCODING 41 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -10 -10 -10 -10 -20 -40 -00 -00 -ENDCHAR -STARTCHAR asterisk -ENCODING 42 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -50 -20 -F8 -20 -50 -00 -00 -00 -ENDCHAR -STARTCHAR plus -ENCODING 43 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -20 -20 -F8 -20 -20 -00 -00 -00 -ENDCHAR -STARTCHAR comma -ENCODING 44 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -20 -20 -40 -00 -ENDCHAR -STARTCHAR hyphen -ENCODING 45 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -F8 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR period -ENCODING 46 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -20 -20 -00 -00 -ENDCHAR -STARTCHAR slash -ENCODING 47 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -08 -10 -10 -20 -20 -40 -40 -00 -00 -ENDCHAR -STARTCHAR zero -ENCODING 48 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -98 -A8 -C8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR one -ENCODING 49 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -60 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR two -ENCODING 50 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -08 -10 -20 -40 -F8 -00 -00 -ENDCHAR -STARTCHAR three -ENCODING 51 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -08 -30 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR four -ENCODING 52 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -18 -28 -48 -88 -F8 -08 -08 -00 -00 -ENDCHAR -STARTCHAR five -ENCODING 53 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -F0 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR six -ENCODING 54 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -80 -80 -F0 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR seven -ENCODING 55 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -08 -08 -10 -10 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR eight -ENCODING 56 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -70 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR nine -ENCODING 57 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -78 -08 -08 -70 -00 -00 -ENDCHAR -STARTCHAR colon -ENCODING 58 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -20 -20 -00 -00 -20 -20 -00 -00 -ENDCHAR -STARTCHAR semicolon -ENCODING 59 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -20 -20 -00 -00 -20 -20 -40 -00 -ENDCHAR -STARTCHAR less -ENCODING 60 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -10 -20 -40 -20 -10 -08 -00 -00 -ENDCHAR -STARTCHAR equal -ENCODING 61 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -00 -00 -F8 -00 -00 -00 -00 -ENDCHAR -STARTCHAR greater -ENCODING 62 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -20 -10 -08 -10 -20 -40 -00 -00 -ENDCHAR -STARTCHAR question -ENCODING 63 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -10 -20 -00 -20 -20 -00 -00 -ENDCHAR -STARTCHAR at -ENCODING 64 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -98 -A8 -A8 -98 -80 -78 -00 -00 -ENDCHAR -STARTCHAR A -ENCODING 65 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR B -ENCODING 66 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -F0 -88 -88 -88 -F0 -00 -00 -ENDCHAR -STARTCHAR C -ENCODING 67 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -80 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR D -ENCODING 68 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -90 -88 -88 -88 -88 -90 -E0 -00 -00 -ENDCHAR -STARTCHAR E -ENCODING 69 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR F -ENCODING 70 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -F0 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR G -ENCODING 71 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -80 -B8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR H -ENCODING 72 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -F8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR I -ENCODING 73 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR J -ENCODING 74 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -38 -10 -10 -10 -10 -90 -90 -60 -00 -00 -ENDCHAR -STARTCHAR K -ENCODING 75 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -90 -A0 -C0 -C0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR L -ENCODING 76 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -80 -80 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR M -ENCODING 77 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -D8 -A8 -A8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR N -ENCODING 78 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -C8 -A8 -98 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR O -ENCODING 79 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR P -ENCODING 80 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -88 -F0 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR Q -ENCODING 81 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -A8 -70 -08 -00 -ENDCHAR -STARTCHAR R -ENCODING 82 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -88 -F0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR S -ENCODING 83 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -70 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR T -ENCODING 84 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -20 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR U -ENCODING 85 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR V -ENCODING 86 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -50 -50 -50 -20 -20 -00 -00 -ENDCHAR -STARTCHAR W -ENCODING 87 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -A8 -A8 -D8 -88 -00 -00 -ENDCHAR -STARTCHAR X -ENCODING 88 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -20 -20 -50 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Y -ENCODING 89 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR Z -ENCODING 90 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -08 -10 -20 -40 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR bracketleft -ENCODING 91 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -40 -40 -40 -40 -40 -40 -70 -00 -00 -ENDCHAR -STARTCHAR backslash -ENCODING 92 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -20 -20 -10 -10 -08 -08 -00 -00 -ENDCHAR -STARTCHAR bracketright -ENCODING 93 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -10 -10 -10 -10 -10 -10 -70 -00 -00 -ENDCHAR -STARTCHAR asciicircum -ENCODING 94 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -50 -88 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR underscore -ENCODING 95 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -F8 -00 -ENDCHAR -STARTCHAR grave -ENCODING 96 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR a -ENCODING 97 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR b -ENCODING 98 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -F0 -88 -88 -88 -88 -F0 -00 -00 -ENDCHAR -STARTCHAR c -ENCODING 99 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR d -ENCODING 100 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -08 -78 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR e -ENCODING 101 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR f -ENCODING 102 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -18 -20 -70 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR g -ENCODING 103 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR h -ENCODING 104 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR i -ENCODING 105 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -00 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR j -ENCODING 106 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -08 -08 -00 -18 -08 -08 -08 -08 -08 -48 -30 -ENDCHAR -STARTCHAR k -ENCODING 107 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -48 -50 -60 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR l -ENCODING 108 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR m -ENCODING 109 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -A8 -A8 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR n -ENCODING 110 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR o -ENCODING 111 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR p -ENCODING 112 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -F0 -80 -80 -ENDCHAR -STARTCHAR q -ENCODING 113 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -88 -88 -88 -88 -78 -08 -08 -ENDCHAR -STARTCHAR r -ENCODING 114 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -B8 -C0 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR s -ENCODING 115 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -80 -70 -08 -08 -F0 -00 -00 -ENDCHAR -STARTCHAR t -ENCODING 116 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -20 -20 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR u -ENCODING 117 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR v -ENCODING 118 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -50 -50 -20 -20 -00 -00 -ENDCHAR -STARTCHAR w -ENCODING 119 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -A8 -A8 -A8 -70 -00 -00 -ENDCHAR -STARTCHAR x -ENCODING 120 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -50 -20 -20 -50 -88 -00 -00 -ENDCHAR -STARTCHAR y -ENCODING 121 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR z -ENCODING 122 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -10 -20 -40 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR braceleft -ENCODING 123 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -18 -20 -20 -40 -20 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR bar -ENCODING 124 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -20 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR braceright -ENCODING 125 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -10 -10 -08 -10 -10 -10 -60 -00 -00 -ENDCHAR -STARTCHAR asciitilde -ENCODING 126 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -48 -A8 -90 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR nbspace -ENCODING 160 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR exclamdown -ENCODING 161 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -00 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR cent -ENCODING 162 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -70 -A8 -A0 -A0 -A8 -70 -20 -00 -ENDCHAR -STARTCHAR sterling -ENCODING 163 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -30 -48 -40 -F0 -40 -40 -48 -F8 -00 -00 -ENDCHAR -STARTCHAR currency -ENCODING 164 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -30 -48 -48 -30 -48 -00 -00 -00 -ENDCHAR -STARTCHAR yen -ENCODING 165 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -20 -70 -20 -70 -20 -00 -00 -ENDCHAR -STARTCHAR brokenbar -ENCODING 166 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -20 -00 -00 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR section -ENCODING 167 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -30 -48 -20 -50 -48 -28 -10 -48 -30 -00 -00 -ENDCHAR -STARTCHAR dieresis -ENCODING 168 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR copyright -ENCODING 169 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -84 -B4 -A4 -A4 -B4 -84 -78 -00 -00 -ENDCHAR -STARTCHAR ordfeminine -ENCODING 170 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -08 -38 -48 -38 -00 -78 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR guillemotleft -ENCODING 171 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -14 -28 -50 -A0 -50 -28 -14 -00 -00 -ENDCHAR -STARTCHAR logicalnot -ENCODING 172 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -08 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR softhyphen -ENCODING 173 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -78 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR registered -ENCODING 174 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -84 -B4 -AC -B4 -AC -84 -78 -00 -00 -ENDCHAR -STARTCHAR macron -ENCODING 175 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR degree -ENCODING 176 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -50 -20 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR plusminus -ENCODING 177 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -20 -F8 -20 -20 -00 -F8 -00 -00 -ENDCHAR -STARTCHAR twosuperior -ENCODING 178 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -30 -48 -10 -20 -78 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR threesuperior -ENCODING 179 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -70 -08 -30 -08 -70 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR acute -ENCODING 180 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR mu -ENCODING 181 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -98 -E8 -80 -80 -ENDCHAR -STARTCHAR paragraph -ENCODING 182 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -A8 -A8 -A8 -68 -28 -28 -28 -00 -00 -ENDCHAR -STARTCHAR periodcentered -ENCODING 183 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -20 -20 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR cedilla -ENCODING 184 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -20 -20 -40 -ENDCHAR -STARTCHAR onesuperior -ENCODING 185 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -10 -30 -10 -10 -38 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR ordmasculine -ENCODING 186 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -48 -48 -48 -30 -00 -78 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR guillemotright -ENCODING 187 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -A0 -50 -28 -14 -28 -50 -A0 -00 -00 -ENDCHAR -STARTCHAR onequarter -ENCODING 188 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -C0 -44 -48 -50 -20 -48 -98 -28 -78 -08 -08 -ENDCHAR -STARTCHAR onehalf -ENCODING 189 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -C0 -44 -48 -50 -20 -40 -98 -24 -08 -10 -3C -ENDCHAR -STARTCHAR threequarters -ENCODING 190 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -E0 -10 -60 -14 -E8 -10 -24 -4C -94 -3C -04 -04 -ENDCHAR -STARTCHAR questiondown -ENCODING 191 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -00 -20 -40 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Agrave -ENCODING 192 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Aacute -ENCODING 193 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Acircumflex -ENCODING 194 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Atilde -ENCODING 195 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Adieresis -ENCODING 196 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Aring -ENCODING 197 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR AE -ENCODING 198 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -7C -90 -90 -FC -90 -90 -90 -9C -00 -00 -ENDCHAR -STARTCHAR Ccedilla -ENCODING 199 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -80 -80 -80 -88 -70 -20 -40 -ENDCHAR -STARTCHAR Egrave -ENCODING 200 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Eacute -ENCODING 201 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Ecircumflex -ENCODING 202 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Edieresis -ENCODING 203 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Igrave -ENCODING 204 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Iacute -ENCODING 205 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Icircumflex -ENCODING 206 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Idieresis -ENCODING 207 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Eth -ENCODING 208 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -90 -88 -E8 -88 -88 -90 -E0 -00 -00 -ENDCHAR -STARTCHAR Ntilde -ENCODING 209 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -88 -88 -C8 -A8 -98 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Ograve -ENCODING 210 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Oacute -ENCODING 211 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Ocircumflex -ENCODING 212 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Otilde -ENCODING 213 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Odieresis -ENCODING 214 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR multiply -ENCODING 215 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -50 -20 -50 -88 -00 -00 -00 -ENDCHAR -STARTCHAR Oslash -ENCODING 216 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -74 -88 -98 -A8 -C8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Ugrave -ENCODING 217 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Uacute -ENCODING 218 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Ucircumflex -ENCODING 219 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Udieresis -ENCODING 220 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Yacute -ENCODING 221 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR Thorn -ENCODING 222 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -F0 -88 -88 -88 -F0 -80 -80 -00 -00 -ENDCHAR -STARTCHAR germandbls -ENCODING 223 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -90 -90 -F0 -88 -88 -C8 -B0 -00 -00 -ENDCHAR -STARTCHAR agrave -ENCODING 224 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR aacute -ENCODING 225 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR acircumflex -ENCODING 226 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR atilde -ENCODING 227 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR adieresis -ENCODING 228 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR aring -ENCODING 229 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR ae -ENCODING 230 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -28 -68 -B0 -A0 -78 -00 -00 -ENDCHAR -STARTCHAR ccedilla -ENCODING 231 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -80 -80 -88 -70 -20 -40 -ENDCHAR -STARTCHAR egrave -ENCODING 232 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR eacute -ENCODING 233 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR ecircumflex -ENCODING 234 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR edieresis -ENCODING 235 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR igrave -ENCODING 236 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR iacute -ENCODING 237 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR icircumflex -ENCODING 238 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR idieresis -ENCODING 239 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR eth -ENCODING 240 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -A0 -40 -A0 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR ntilde -ENCODING 241 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR ograve -ENCODING 242 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR oacute -ENCODING 243 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR ocircumflex -ENCODING 244 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR otilde -ENCODING 245 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR odieresis -ENCODING 246 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR divide -ENCODING 247 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -20 -00 -F8 -00 -20 -20 -00 -00 -ENDCHAR -STARTCHAR oslash -ENCODING 248 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -74 -98 -A8 -C8 -88 -70 -00 -00 -ENDCHAR -STARTCHAR ugrave -ENCODING 249 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR uacute -ENCODING 250 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR ucircumflex -ENCODING 251 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR udieresis -ENCODING 252 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR yacute -ENCODING 253 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR thorn -ENCODING 254 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -F0 -88 -88 -88 -88 -F0 -80 -80 -ENDCHAR -STARTCHAR ydieresis -ENCODING 255 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR Amacron -ENCODING 256 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR amacron -ENCODING 257 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Abreve -ENCODING 258 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR abreve -ENCODING 259 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Aogonek -ENCODING 260 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -F8 -88 -88 -88 -10 -0C -ENDCHAR -STARTCHAR aogonek -ENCODING 261 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -08 -78 -88 -88 -78 -10 -0C -ENDCHAR -STARTCHAR Cacute -ENCODING 262 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -70 -88 -80 -80 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR cacute -ENCODING 263 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -70 -88 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Ccircumflex -ENCODING 264 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -70 -88 -80 -80 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR ccircumflex -ENCODING 265 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -70 -88 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Cdotaccent -ENCODING 266 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -70 -88 -80 -80 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR cdotaccent -ENCODING 267 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -88 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Ccaron -ENCODING 268 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -80 -80 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR ccaron -ENCODING 269 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -88 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Dcaron -ENCODING 270 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -A0 -40 -E0 -90 -88 -88 -88 -88 -90 -E0 -00 -00 -ENDCHAR -STARTCHAR dcaron -ENCODING 271 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -08 -08 -78 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Dcroat -ENCODING 272 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -90 -88 -E8 -88 -88 -90 -E0 -00 -00 -ENDCHAR -STARTCHAR dcroat -ENCODING 273 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -3C -08 -78 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Emacron -ENCODING 274 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR emacron -ENCODING 275 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR Ebreve -ENCODING 276 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR ebreve -ENCODING 277 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR Edotaccent -ENCODING 278 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR edotaccent -ENCODING 279 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR Eogonek -ENCODING 280 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -F0 -80 -80 -80 -F8 -10 -0C -ENDCHAR -STARTCHAR eogonek -ENCODING 281 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -F8 -80 -80 -78 -20 -18 -ENDCHAR -STARTCHAR Ecaron -ENCODING 282 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR ecaron -ENCODING 283 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR Gcircumflex -ENCODING 284 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -70 -88 -80 -80 -B8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR gcircumflex -ENCODING 285 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR Gbreve -ENCODING 286 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -80 -80 -B8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR gbreve -ENCODING 287 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR Gdotaccent -ENCODING 288 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -70 -88 -80 -80 -B8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR gdotaccent -ENCODING 289 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR Gcommaaccent -ENCODING 290 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -80 -B8 -88 -88 -70 -20 -40 -ENDCHAR -STARTCHAR gcommaaccent -ENCODING 291 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR Hcircumflex -ENCODING 292 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -88 -88 -88 -F8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR hcircumflex -ENCODING 293 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -80 -80 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Hbar -ENCODING 294 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -48 -FC -48 -78 -48 -48 -48 -48 -00 -00 -ENDCHAR -STARTCHAR hbar -ENCODING 295 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -F0 -40 -70 -48 -48 -48 -48 -00 -00 -ENDCHAR -STARTCHAR Itilde -ENCODING 296 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR itilde -ENCODING 297 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Imacron -ENCODING 298 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR imacron -ENCODING 299 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Ibreve -ENCODING 300 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR ibreve -ENCODING 301 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Iogonek -ENCODING 302 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -20 -20 -20 -20 -20 -20 -70 -20 -18 -ENDCHAR -STARTCHAR iogonek -ENCODING 303 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -00 -60 -20 -20 -20 -20 -70 -20 -18 -ENDCHAR -STARTCHAR Idotaccent -ENCODING 304 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR dotlessi -ENCODING 305 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR IJ -ENCODING 306 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -88 -A8 -A8 -90 -00 -00 -ENDCHAR -STARTCHAR ij -ENCODING 307 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -88 -88 -00 -98 -88 -88 -88 -88 -88 -28 -10 -ENDCHAR -STARTCHAR Jcircumflex -ENCODING 308 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -28 -38 -10 -10 -10 -10 -90 -90 -60 -00 -00 -ENDCHAR -STARTCHAR jcircumflex -ENCODING 309 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -14 -18 -08 -08 -08 -08 -08 -48 -30 -ENDCHAR -STARTCHAR Kcommaaccent -ENCODING 310 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -90 -A0 -C0 -C0 -A0 -90 -A8 -20 -40 -ENDCHAR -STARTCHAR kcommaaccent -ENCODING 311 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -48 -50 -60 -60 -50 -68 -20 -40 -ENDCHAR -STARTCHAR kgreenlandic -ENCODING 312 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -48 -50 -60 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR Lacute -ENCODING 313 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -40 -80 -80 -80 -80 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR lacute -ENCODING 314 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -60 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Lcommaaccent -ENCODING 315 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -80 -80 -80 -80 -80 -F8 -20 -40 -ENDCHAR -STARTCHAR lcommaaccent -ENCODING 316 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -20 -20 -20 -20 -20 -20 -70 -20 -40 -ENDCHAR -STARTCHAR Lcaron -ENCODING 317 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -80 -80 -80 -80 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR lcaron -ENCODING 318 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -60 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Ldot -ENCODING 319 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -80 -90 -90 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR ldot -ENCODING 320 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -20 -20 -24 -24 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Lslash -ENCODING 321 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -40 -60 -C0 -40 -40 -7C -00 -00 -ENDCHAR -STARTCHAR lslash -ENCODING 322 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -20 -20 -30 -60 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Nacute -ENCODING 323 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -88 -88 -C8 -A8 -98 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR nacute -ENCODING 324 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Ncommaaccent -ENCODING 325 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -C8 -A8 -98 -88 -88 -A8 -20 -40 -ENDCHAR -STARTCHAR ncommaaccent -ENCODING 326 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -A8 -20 -40 -ENDCHAR -STARTCHAR Ncaron -ENCODING 327 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -88 -88 -C8 -A8 -98 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR ncaron -ENCODING 328 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR napostrophe -ENCODING 329 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -40 -40 -80 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Eng -ENCODING 330 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -C8 -A8 -98 -88 -88 -88 -08 -10 -ENDCHAR -STARTCHAR eng -ENCODING 331 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -88 -08 -10 -ENDCHAR -STARTCHAR Omacron -ENCODING 332 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR omacron -ENCODING 333 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Obreve -ENCODING 334 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR obreve -ENCODING 335 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Ohungarumlaut -ENCODING 336 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR ohungarumlaut -ENCODING 337 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR OE -ENCODING 338 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -7C -90 -90 -9C -90 -90 -90 -7C -00 -00 -ENDCHAR -STARTCHAR oe -ENCODING 339 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -A8 -A8 -B0 -A0 -78 -00 -00 -ENDCHAR -STARTCHAR Racute -ENCODING 340 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -F0 -88 -88 -88 -F0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR racute -ENCODING 341 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -B8 -C0 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR Rcommaaccent -ENCODING 342 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -88 -F0 -A0 -90 -A8 -20 -40 -ENDCHAR -STARTCHAR rcommaaccent -ENCODING 343 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -B8 -C0 -80 -80 -80 -C0 -40 -80 -ENDCHAR -STARTCHAR Rcaron -ENCODING 344 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -F0 -88 -88 -88 -F0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR rcaron -ENCODING 345 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -B8 -C0 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR Sacute -ENCODING 346 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -70 -88 -80 -70 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR sacute -ENCODING 347 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -78 -80 -70 -08 -08 -F0 -00 -00 -ENDCHAR -STARTCHAR Scircumflex -ENCODING 348 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -70 -88 -80 -70 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR scircumflex -ENCODING 349 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -78 -80 -70 -08 -08 -F0 -00 -00 -ENDCHAR -STARTCHAR Scedilla -ENCODING 350 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -70 -08 -08 -88 -70 -20 -40 -ENDCHAR -STARTCHAR scedilla -ENCODING 351 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -80 -70 -08 -08 -F0 -20 -40 -ENDCHAR -STARTCHAR Scaron -ENCODING 352 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -80 -70 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR scaron -ENCODING 353 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -78 -80 -70 -08 -08 -F0 -00 -00 -ENDCHAR -STARTCHAR Tcedilla -ENCODING 354 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -20 -20 -20 -20 -20 -30 -10 -20 -ENDCHAR -STARTCHAR tcedilla -ENCODING 355 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -20 -20 -20 -20 -18 -10 -20 -ENDCHAR -STARTCHAR Tcaron -ENCODING 356 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -F8 -20 -20 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR tcaron -ENCODING 357 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -20 -20 -70 -20 -20 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR Tbar -ENCODING 358 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -20 -70 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR tbar -ENCODING 359 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -20 -70 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR Utilde -ENCODING 360 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR utilde -ENCODING 361 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Umacron -ENCODING 362 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR umacron -ENCODING 363 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Ubreve -ENCODING 364 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR ubreve -ENCODING 365 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Uring -ENCODING 366 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -A8 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uring -ENCODING 367 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -A8 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Uhungarumlaut -ENCODING 368 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uhungarumlaut -ENCODING 369 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Uogonek -ENCODING 370 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -88 -88 -88 -70 -20 -18 -ENDCHAR -STARTCHAR uogonek -ENCODING 371 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -78 -10 -0C -ENDCHAR -STARTCHAR Wcircumflex -ENCODING 372 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -88 -88 -88 -88 -A8 -A8 -D8 -88 -00 -00 -ENDCHAR -STARTCHAR wcircumflex -ENCODING 373 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -88 -88 -A8 -A8 -A8 -70 -00 -00 -ENDCHAR -STARTCHAR Ycircumflex -ENCODING 374 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR ycircumflex -ENCODING 375 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR Ydieresis -ENCODING 376 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR Zacute -ENCODING 377 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -F8 -08 -10 -20 -40 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR zacute -ENCODING 378 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -F8 -10 -20 -40 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Zdotaccent -ENCODING 379 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -F8 -08 -10 -20 -40 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR zdotaccent -ENCODING 380 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -F8 -10 -20 -40 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Zcaron -ENCODING 381 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -F8 -08 -10 -20 -40 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR zcaron -ENCODING 382 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -F8 -10 -20 -40 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR longs -ENCODING 383 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -18 -20 -20 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni0186 -ENCODING 390 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -08 -08 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni018E -ENCODING 398 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -08 -08 -78 -08 -08 -08 -F8 -00 -00 -ENDCHAR -STARTCHAR Schwa -ENCODING 399 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -08 -08 -F8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni0190 -ENCODING 400 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -60 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR florin -ENCODING 402 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -28 -20 -70 -20 -20 -20 -20 -A0 -40 -ENDCHAR -STARTCHAR uni019D -ENCODING 413 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -C8 -A8 -98 -88 -88 -C8 -40 -80 -ENDCHAR -STARTCHAR uni019E -ENCODING 414 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -88 -08 -08 -ENDCHAR -STARTCHAR uni01B5 -ENCODING 437 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -08 -10 -F8 -20 -40 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR uni01B6 -ENCODING 438 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -10 -78 -20 -40 -F8 -00 -00 -ENDCHAR -STARTCHAR Ezh -ENCODING 439 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -08 -10 -30 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni01CD -ENCODING 461 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni01CE -ENCODING 462 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR uni01CF -ENCODING 463 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR uni01D0 -ENCODING 464 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR uni01D1 -ENCODING 465 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni01D2 -ENCODING 466 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni01D3 -ENCODING 467 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni01D4 -ENCODING 468 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -ENDCHAR -STARTCHAR uni01DC -ENCODING 476 -SWIDTH 1000 0 -DWIDTH 6 0 -BBX 5 10 0 0 -BITMAP -40 -20 -88 -00 -88 -88 -88 -88 -88 -78 -ENDCHAR -STARTCHAR uni01E2 -ENCODING 482 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -78 -00 -7C -90 -90 -FC -90 -90 -90 -9C -00 -00 -ENDCHAR -STARTCHAR uni01E3 -ENCODING 483 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -70 -28 -68 -B0 -A0 -78 -00 -00 -ENDCHAR -STARTCHAR uni01E4 -ENCODING 484 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -80 -80 -B8 -88 -9C -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni01E5 -ENCODING 485 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -88 -9C -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR Gcaron -ENCODING 486 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -80 -80 -B8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR gcaron -ENCODING 487 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR uni01E8 -ENCODING 488 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -88 -90 -A0 -C0 -C0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR uni01E9 -ENCODING 489 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -40 -40 -48 -50 -60 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR uni01EA -ENCODING 490 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -88 -70 -20 -18 -ENDCHAR -STARTCHAR uni01EB -ENCODING 491 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -70 -20 -18 -ENDCHAR -STARTCHAR uni01EC -ENCODING 492 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -70 -88 -88 -88 -88 -88 -88 -70 -20 -18 -ENDCHAR -STARTCHAR uni01ED -ENCODING 493 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -70 -88 -88 -88 -88 -70 -20 -18 -ENDCHAR -STARTCHAR uni01EE -ENCODING 494 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -F8 -08 -10 -30 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni01EF -ENCODING 495 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -F8 -08 -10 -30 -08 -08 -88 -70 -ENDCHAR -STARTCHAR uni01F0 -ENCODING 496 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -14 -08 -18 -08 -08 -08 -08 -08 -48 -30 -ENDCHAR -STARTCHAR uni01F4 -ENCODING 500 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -70 -88 -80 -80 -B8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni01F5 -ENCODING 501 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR AEacute -ENCODING 508 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -10 -7C -90 -90 -FC -90 -90 -90 -9C -00 -00 -ENDCHAR -STARTCHAR aeacute -ENCODING 509 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -70 -28 -68 -B0 -A0 -78 -00 -00 -ENDCHAR -STARTCHAR Oslashacute -ENCODING 510 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -74 -88 -98 -A8 -C8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR oslashacute -ENCODING 511 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -74 -98 -A8 -C8 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Scommaaccent -ENCODING 536 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -70 -08 -08 -88 -70 -20 -40 -ENDCHAR -STARTCHAR scommaaccent -ENCODING 537 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -80 -70 -08 -08 -F0 -20 -40 -ENDCHAR -STARTCHAR Tcommaaccent -ENCODING 538 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -20 -20 -20 -20 -20 -30 -10 -20 -ENDCHAR -STARTCHAR tcommaaccent -ENCODING 539 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -20 -20 -20 -20 -18 -08 -10 -ENDCHAR -STARTCHAR uni0232 -ENCODING 562 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni0233 -ENCODING 563 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR dotlessj -ENCODING 567 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -18 -08 -08 -08 -08 -08 -48 -30 -ENDCHAR -STARTCHAR uni0254 -ENCODING 596 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni0258 -ENCODING 600 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -F8 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR schwa -ENCODING 601 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -08 -F8 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni025B -ENCODING 603 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -60 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni0272 -ENCODING 626 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -C8 -40 -80 -ENDCHAR -STARTCHAR ezh -ENCODING 658 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -08 -10 -30 -08 -08 -88 -70 -ENDCHAR -STARTCHAR commaturnedmod -ENCODING 699 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR afii57929 -ENCODING 700 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR afii64937 -ENCODING 701 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -10 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR circumflex -ENCODING 710 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR caron -ENCODING 711 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR breve -ENCODING 728 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR dotaccent -ENCODING 729 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR ogonek -ENCODING 731 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -10 -20 -18 -ENDCHAR -STARTCHAR tilde -ENCODING 732 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR hungarumlaut -ENCODING 733 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR gravecomb -ENCODING 768 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR acutecomb -ENCODING 769 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni0302 -ENCODING 770 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR tildecomb -ENCODING 771 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni0304 -ENCODING 772 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni0305 -ENCODING 773 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -F8 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni0306 -ENCODING 774 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni0307 -ENCODING 775 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni0308 -ENCODING 776 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni030A -ENCODING 778 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni030B -ENCODING 779 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni030C -ENCODING 780 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni0329 -ENCODING 809 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -20 -20 -ENDCHAR -STARTCHAR tonos -ENCODING 900 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR dieresistonos -ENCODING 901 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -50 -50 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR Alphatonos -ENCODING 902 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR anoteleia -ENCODING 903 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -20 -20 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR Epsilontonos -ENCODING 904 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Etatonos -ENCODING 905 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -88 -88 -88 -F8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Iotatonos -ENCODING 906 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Omicrontonos -ENCODING 908 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Upsilontonos -ENCODING 910 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR Omegatonos -ENCODING 911 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -70 -88 -88 -88 -88 -88 -50 -D8 -00 -00 -ENDCHAR -STARTCHAR iotadieresistonos -ENCODING 912 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -50 -50 -60 -20 -20 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR Alpha -ENCODING 913 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Beta -ENCODING 914 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -F0 -88 -88 -88 -F0 -00 -00 -ENDCHAR -STARTCHAR Gamma -ENCODING 915 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -80 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR Delta -ENCODING 916 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -50 -50 -88 -88 -88 -F8 -00 -00 -ENDCHAR -STARTCHAR Epsilon -ENCODING 917 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Zeta -ENCODING 918 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -08 -10 -20 -40 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Eta -ENCODING 919 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -F8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Theta -ENCODING 920 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -A8 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Iota -ENCODING 921 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Kappa -ENCODING 922 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -90 -A0 -C0 -C0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR Lambda -ENCODING 923 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -50 -50 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Mu -ENCODING 924 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -D8 -A8 -A8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Nu -ENCODING 925 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -C8 -A8 -98 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Xi -ENCODING 926 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -00 -00 -70 -00 -00 -00 -F8 -00 -00 -ENDCHAR -STARTCHAR Omicron -ENCODING 927 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Pi -ENCODING 928 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -88 -88 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Rho -ENCODING 929 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -88 -F0 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR Sigma -ENCODING 931 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -40 -20 -10 -10 -20 -40 -F8 -00 -00 -ENDCHAR -STARTCHAR Tau -ENCODING 932 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -20 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR Upsilon -ENCODING 933 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR Phi -ENCODING 934 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -A8 -A8 -A8 -A8 -70 -20 -00 -00 -ENDCHAR -STARTCHAR Chi -ENCODING 935 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -20 -20 -50 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Psi -ENCODING 936 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -A8 -A8 -A8 -A8 -A8 -70 -20 -20 -00 -00 -ENDCHAR -STARTCHAR Omega -ENCODING 937 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -50 -D8 -00 -00 -ENDCHAR -STARTCHAR Iotadieresis -ENCODING 938 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Upsilondieresis -ENCODING 939 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR alphatonos -ENCODING 940 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -68 -90 -90 -90 -90 -68 -00 -00 -ENDCHAR -STARTCHAR epsilontonos -ENCODING 941 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -70 -88 -60 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR etatonos -ENCODING 942 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -F0 -88 -88 -88 -88 -88 -08 -08 -ENDCHAR -STARTCHAR iotatonos -ENCODING 943 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -60 -20 -20 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR upsilondieresistonos -ENCODING 944 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -50 -50 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR alpha -ENCODING 945 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -68 -90 -90 -90 -90 -68 -00 -00 -ENDCHAR -STARTCHAR beta -ENCODING 946 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -90 -90 -F0 -88 -88 -88 -F0 -80 -80 -ENDCHAR -STARTCHAR gamma -ENCODING 947 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -50 -50 -20 -20 -20 -ENDCHAR -STARTCHAR delta -ENCODING 948 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -40 -20 -70 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR epsilon -ENCODING 949 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -60 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR zeta -ENCODING 950 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -10 -20 -40 -80 -80 -80 -70 -08 -10 -ENDCHAR -STARTCHAR eta -ENCODING 951 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -88 -08 -08 -ENDCHAR -STARTCHAR theta -ENCODING 952 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -30 -48 -48 -78 -48 -48 -48 -30 -00 -00 -ENDCHAR -STARTCHAR iota -ENCODING 953 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -60 -20 -20 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR kappa -ENCODING 954 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -48 -50 -60 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR lambda -ENCODING 955 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -20 -20 -50 -50 -88 -88 -00 -00 -ENDCHAR -STARTCHAR mugreek -ENCODING 956 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -98 -E8 -80 -80 -ENDCHAR -STARTCHAR nu -ENCODING 957 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -50 -50 -20 -20 -00 -00 -ENDCHAR -STARTCHAR xi -ENCODING 958 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -80 -80 -70 -80 -80 -80 -70 -08 -10 -ENDCHAR -STARTCHAR omicron -ENCODING 959 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR pi -ENCODING 960 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR rho -ENCODING 961 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -F0 -80 -80 -ENDCHAR -STARTCHAR sigma1 -ENCODING 962 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -80 -80 -80 -70 -08 -10 -ENDCHAR -STARTCHAR sigma -ENCODING 963 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -90 -90 -90 -90 -60 -00 -00 -ENDCHAR -STARTCHAR tau -ENCODING 964 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -20 -20 -20 -20 -10 -00 -00 -ENDCHAR -STARTCHAR upsilon -ENCODING 965 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR phi -ENCODING 966 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -90 -A8 -A8 -A8 -A8 -70 -20 -20 -ENDCHAR -STARTCHAR chi -ENCODING 967 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -50 -20 -20 -50 -88 -88 -ENDCHAR -STARTCHAR psi -ENCODING 968 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -A8 -A8 -A8 -A8 -A8 -70 -20 -20 -ENDCHAR -STARTCHAR omega -ENCODING 969 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -50 -88 -A8 -A8 -A8 -50 -00 -00 -ENDCHAR -STARTCHAR iotadieresis -ENCODING 970 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -60 -20 -20 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR upsilondieresis -ENCODING 971 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR omicrontonos -ENCODING 972 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR upsilontonos -ENCODING 973 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR omegatonos -ENCODING 974 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -50 -88 -A8 -A8 -A8 -50 -00 -00 -ENDCHAR -STARTCHAR theta1 -ENCODING 977 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -30 -48 -48 -3C -08 -C8 -48 -30 -00 -00 -ENDCHAR -STARTCHAR phi1 -ENCODING 981 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -70 -A8 -A8 -A8 -A8 -70 -20 -00 -ENDCHAR -STARTCHAR uni03F0 -ENCODING 1008 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -C4 -28 -10 -20 -50 -8C -00 -00 -ENDCHAR -STARTCHAR uni03F1 -ENCODING 1009 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -F0 -80 -70 -ENDCHAR -STARTCHAR uni03F2 -ENCODING 1010 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni03F3 -ENCODING 1011 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -08 -08 -00 -18 -08 -08 -08 -08 -08 -48 -30 -ENDCHAR -STARTCHAR uni03F4 -ENCODING 1012 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -F8 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni03F5 -ENCODING 1013 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -80 -F0 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR uni03F6 -ENCODING 1014 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -08 -78 -08 -08 -F0 -00 -00 -ENDCHAR -STARTCHAR uni0400 -ENCODING 1024 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR afii10023 -ENCODING 1025 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR afii10051 -ENCODING 1026 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -40 -40 -70 -48 -48 -48 -48 -08 -10 -ENDCHAR -STARTCHAR afii10052 -ENCODING 1027 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -F8 -80 -80 -80 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR afii10053 -ENCODING 1028 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -F0 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10054 -ENCODING 1029 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -70 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10055 -ENCODING 1030 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR afii10056 -ENCODING 1031 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR afii10057 -ENCODING 1032 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -38 -10 -10 -10 -10 -90 -90 -60 -00 -00 -ENDCHAR -STARTCHAR afii10058 -ENCODING 1033 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -A0 -B0 -A8 -A8 -A8 -A8 -B0 -00 -00 -ENDCHAR -STARTCHAR afii10059 -ENCODING 1034 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -A0 -A0 -B0 -E8 -A8 -A8 -A8 -B0 -00 -00 -ENDCHAR -STARTCHAR afii10060 -ENCODING 1035 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -40 -40 -70 -48 -48 -48 -48 -00 -00 -ENDCHAR -STARTCHAR afii10061 -ENCODING 1036 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -88 -90 -A0 -C0 -C0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR uni040D -ENCODING 1037 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -88 -88 -98 -A8 -C8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10062 -ENCODING 1038 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -88 -88 -88 -88 -78 -08 -08 -70 -00 -00 -ENDCHAR -STARTCHAR afii10145 -ENCODING 1039 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -88 -88 -88 -F8 -20 -20 -ENDCHAR -STARTCHAR afii10017 -ENCODING 1040 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10018 -ENCODING 1041 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -80 -80 -F0 -88 -88 -88 -F0 -00 -00 -ENDCHAR -STARTCHAR afii10019 -ENCODING 1042 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -F0 -88 -88 -88 -F0 -00 -00 -ENDCHAR -STARTCHAR afii10020 -ENCODING 1043 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -80 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR afii10021 -ENCODING 1044 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -38 -48 -48 -48 -48 -48 -48 -FC -84 -00 -ENDCHAR -STARTCHAR afii10022 -ENCODING 1045 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR afii10024 -ENCODING 1046 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -A8 -A8 -A8 -70 -70 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR afii10025 -ENCODING 1047 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -08 -30 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10026 -ENCODING 1048 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -98 -A8 -C8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10027 -ENCODING 1049 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -88 -88 -98 -A8 -C8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10028 -ENCODING 1050 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -90 -A0 -C0 -C0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR afii10029 -ENCODING 1051 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -38 -48 -48 -48 -48 -48 -48 -88 -00 -00 -ENDCHAR -STARTCHAR afii10030 -ENCODING 1052 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -D8 -A8 -A8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10031 -ENCODING 1053 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -F8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10032 -ENCODING 1054 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10033 -ENCODING 1055 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -88 -88 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10034 -ENCODING 1056 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -88 -F0 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR afii10035 -ENCODING 1057 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -80 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10036 -ENCODING 1058 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -20 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR afii10037 -ENCODING 1059 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -78 -08 -08 -70 -00 -00 -ENDCHAR -STARTCHAR afii10038 -ENCODING 1060 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -70 -A8 -A8 -A8 -A8 -A8 -A8 -70 -20 -00 -ENDCHAR -STARTCHAR afii10039 -ENCODING 1061 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -20 -20 -50 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10040 -ENCODING 1062 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -88 -88 -88 -7C -04 -04 -ENDCHAR -STARTCHAR afii10041 -ENCODING 1063 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -78 -08 -08 -08 -00 -00 -ENDCHAR -STARTCHAR afii10042 -ENCODING 1064 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -A8 -A8 -A8 -A8 -A8 -A8 -A8 -78 -00 -00 -ENDCHAR -STARTCHAR afii10043 -ENCODING 1065 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -A8 -A8 -A8 -A8 -A8 -A8 -A8 -7C -04 -04 -ENDCHAR -STARTCHAR afii10044 -ENCODING 1066 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -C0 -40 -70 -48 -48 -48 -48 -70 -00 -00 -ENDCHAR -STARTCHAR afii10045 -ENCODING 1067 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -C8 -A8 -A8 -A8 -A8 -C8 -00 -00 -ENDCHAR -STARTCHAR afii10046 -ENCODING 1068 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -70 -48 -48 -48 -48 -70 -00 -00 -ENDCHAR -STARTCHAR afii10047 -ENCODING 1069 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -08 -38 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10048 -ENCODING 1070 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -90 -A8 -A8 -A8 -E8 -A8 -A8 -90 -00 -00 -ENDCHAR -STARTCHAR afii10049 -ENCODING 1071 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -88 -88 -88 -78 -28 -48 -88 -00 -00 -ENDCHAR -STARTCHAR afii10065 -ENCODING 1072 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR afii10066 -ENCODING 1073 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -80 -F0 -88 -88 -88 -88 -F0 -00 -00 -ENDCHAR -STARTCHAR afii10067 -ENCODING 1074 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -90 -90 -F0 -88 -88 -88 -F0 -00 -00 -ENDCHAR -STARTCHAR afii10068 -ENCODING 1075 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -80 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR afii10069 -ENCODING 1076 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR afii10070 -ENCODING 1077 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR afii10072 -ENCODING 1078 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -A8 -A8 -70 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR afii10073 -ENCODING 1079 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -30 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10074 -ENCODING 1080 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR afii10075 -ENCODING 1081 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR afii10076 -ENCODING 1082 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -48 -50 -60 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR afii10077 -ENCODING 1083 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -38 -48 -48 -48 -48 -88 -00 -00 -ENDCHAR -STARTCHAR afii10078 -ENCODING 1084 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -D8 -A8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10079 -ENCODING 1085 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10080 -ENCODING 1086 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10081 -ENCODING 1087 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10082 -ENCODING 1088 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -F0 -80 -80 -ENDCHAR -STARTCHAR afii10083 -ENCODING 1089 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10084 -ENCODING 1090 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR afii10085 -ENCODING 1091 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR afii10086 -ENCODING 1092 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -70 -A8 -A8 -A8 -A8 -70 -20 -00 -ENDCHAR -STARTCHAR afii10087 -ENCODING 1093 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -50 -20 -20 -50 -88 -00 -00 -ENDCHAR -STARTCHAR afii10088 -ENCODING 1094 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -7C -04 -04 -ENDCHAR -STARTCHAR afii10089 -ENCODING 1095 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -78 -08 -08 -00 -00 -ENDCHAR -STARTCHAR afii10090 -ENCODING 1096 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -A8 -A8 -A8 -A8 -A8 -78 -00 -00 -ENDCHAR -STARTCHAR afii10091 -ENCODING 1097 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -A8 -A8 -A8 -A8 -A8 -7C -04 -04 -ENDCHAR -STARTCHAR afii10092 -ENCODING 1098 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -C0 -40 -70 -48 -48 -70 -00 -00 -ENDCHAR -STARTCHAR afii10093 -ENCODING 1099 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -C8 -A8 -A8 -C8 -00 -00 -ENDCHAR -STARTCHAR afii10094 -ENCODING 1100 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -40 -40 -70 -48 -48 -70 -00 -00 -ENDCHAR -STARTCHAR afii10095 -ENCODING 1101 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -38 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10096 -ENCODING 1102 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -90 -A8 -A8 -E8 -A8 -90 -00 -00 -ENDCHAR -STARTCHAR afii10097 -ENCODING 1103 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -88 -88 -78 -28 -48 -00 -00 -ENDCHAR -STARTCHAR uni0450 -ENCODING 1104 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR afii10071 -ENCODING 1105 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR afii10099 -ENCODING 1106 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -F0 -40 -70 -48 -48 -48 -48 -08 -10 -ENDCHAR -STARTCHAR afii10100 -ENCODING 1107 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -F8 -80 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR afii10101 -ENCODING 1108 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -E0 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10102 -ENCODING 1109 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -80 -70 -08 -08 -F0 -00 -00 -ENDCHAR -STARTCHAR afii10103 -ENCODING 1110 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -00 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR afii10104 -ENCODING 1111 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR afii10105 -ENCODING 1112 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -08 -08 -00 -18 -08 -08 -08 -08 -08 -48 -30 -ENDCHAR -STARTCHAR afii10106 -ENCODING 1113 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -60 -A0 -B0 -A8 -A8 -B0 -00 -00 -ENDCHAR -STARTCHAR afii10107 -ENCODING 1114 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -A0 -A0 -F0 -A8 -A8 -B0 -00 -00 -ENDCHAR -STARTCHAR afii10108 -ENCODING 1115 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -F0 -40 -70 -48 -48 -48 -48 -00 -00 -ENDCHAR -STARTCHAR afii10109 -ENCODING 1116 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -10 -48 -50 -60 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR uni045D -ENCODING 1117 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR afii10110 -ENCODING 1118 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR afii10193 -ENCODING 1119 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -F8 -20 -20 -ENDCHAR -STARTCHAR afii10146 -ENCODING 1122 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -F0 -40 -70 -48 -48 -48 -70 -00 -00 -ENDCHAR -STARTCHAR afii10194 -ENCODING 1123 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -E0 -40 -70 -48 -48 -70 -00 -00 -ENDCHAR -STARTCHAR uni046A -ENCODING 1130 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -88 -50 -20 -70 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR uni046B -ENCODING 1131 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -50 -20 -70 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR afii10050 -ENCODING 1168 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -F8 -80 -80 -80 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR afii10098 -ENCODING 1169 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -08 -F8 -80 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR uni0492 -ENCODING 1170 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -7C -40 -40 -40 -F0 -40 -40 -40 -00 -00 -ENDCHAR -STARTCHAR uni0493 -ENCODING 1171 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -40 -40 -F0 -40 -40 -00 -00 -ENDCHAR -STARTCHAR uni0494 -ENCODING 1172 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -80 -F0 -88 -88 -88 -08 -10 -ENDCHAR -STARTCHAR uni0495 -ENCODING 1173 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -80 -80 -E0 -90 -90 -10 -20 -ENDCHAR -STARTCHAR uni0496 -ENCODING 1174 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -A8 -A8 -A8 -70 -70 -A8 -A8 -AC -04 -04 -ENDCHAR -STARTCHAR uni0497 -ENCODING 1175 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -A8 -A8 -70 -A8 -A8 -AC -04 -04 -ENDCHAR -STARTCHAR uni0498 -ENCODING 1176 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -08 -30 -08 -08 -88 -70 -20 -20 -ENDCHAR -STARTCHAR uni0499 -ENCODING 1177 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -30 -08 -88 -70 -20 -20 -ENDCHAR -STARTCHAR uni049A -ENCODING 1178 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -90 -A0 -C0 -C0 -A0 -90 -8C -04 -04 -ENDCHAR -STARTCHAR uni049B -ENCODING 1179 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -48 -50 -60 -60 -50 -4C -04 -04 -ENDCHAR -STARTCHAR uni049C -ENCODING 1180 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -84 -A8 -B0 -E0 -E0 -B0 -A8 -84 -00 -00 -ENDCHAR -STARTCHAR uni049D -ENCODING 1181 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -A8 -B0 -E0 -E0 -B0 -A8 -00 -00 -ENDCHAR -STARTCHAR uni04A0 -ENCODING 1184 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -C4 -48 -50 -60 -60 -50 -48 -44 -00 -00 -ENDCHAR -STARTCHAR uni04A1 -ENCODING 1185 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -C8 -50 -60 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR uni04A2 -ENCODING 1186 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -F8 -88 -88 -88 -8C -04 -04 -ENDCHAR -STARTCHAR uni04A3 -ENCODING 1187 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -F8 -88 -88 -8C -04 -04 -ENDCHAR -STARTCHAR uni04A4 -ENCODING 1188 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -9C -90 -90 -F0 -90 -90 -90 -90 -00 -00 -ENDCHAR -STARTCHAR uni04A5 -ENCODING 1189 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -9C -90 -F0 -90 -90 -90 -00 -00 -ENDCHAR -STARTCHAR uni04AA -ENCODING 1194 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -80 -80 -80 -88 -70 -20 -20 -ENDCHAR -STARTCHAR uni04AB -ENCODING 1195 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -80 -80 -88 -70 -20 -20 -ENDCHAR -STARTCHAR uni04AE -ENCODING 1198 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni04AF -ENCODING 1199 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -50 -50 -20 -20 -20 -ENDCHAR -STARTCHAR uni04B0 -ENCODING 1200 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -50 -20 -70 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni04B1 -ENCODING 1201 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -50 -50 -20 -70 -20 -ENDCHAR -STARTCHAR uni04B2 -ENCODING 1202 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -20 -20 -50 -88 -8C -04 -04 -ENDCHAR -STARTCHAR uni04B3 -ENCODING 1203 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -50 -20 -20 -50 -8C -04 -04 -ENDCHAR -STARTCHAR uni04B6 -ENCODING 1206 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -78 -08 -08 -0C -04 -04 -ENDCHAR -STARTCHAR uni04B7 -ENCODING 1207 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -78 -08 -0C -04 -04 -ENDCHAR -STARTCHAR uni04B8 -ENCODING 1208 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -A8 -A8 -78 -28 -28 -08 -00 -00 -ENDCHAR -STARTCHAR uni04B9 -ENCODING 1209 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -A8 -A8 -78 -28 -08 -00 -00 -ENDCHAR -STARTCHAR uni04BA -ENCODING 1210 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -80 -F0 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni04BB -ENCODING 1211 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -80 -80 -F0 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni04C0 -ENCODING 1216 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR uni04C1 -ENCODING 1217 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -A8 -A8 -A8 -70 -70 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR uni04C2 -ENCODING 1218 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -A8 -A8 -70 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR uni04CF -ENCODING 1231 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR uni04D0 -ENCODING 1232 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni04D1 -ENCODING 1233 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR uni04D2 -ENCODING 1234 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni04D3 -ENCODING 1235 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR uni04D4 -ENCODING 1236 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -7C -90 -90 -FC -90 -90 -90 -9C -00 -00 -ENDCHAR -STARTCHAR uni04D5 -ENCODING 1237 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -28 -68 -B0 -A0 -78 -00 -00 -ENDCHAR -STARTCHAR uni04D6 -ENCODING 1238 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR uni04D7 -ENCODING 1239 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR uni04D8 -ENCODING 1240 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -08 -08 -F8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10846 -ENCODING 1241 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -08 -F8 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04DA -ENCODING 1242 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -08 -08 -F8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04DB -ENCODING 1243 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -08 -F8 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04DC -ENCODING 1244 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -A8 -A8 -A8 -70 -70 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR uni04DD -ENCODING 1245 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -A8 -A8 -70 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR uni04DE -ENCODING 1246 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -08 -30 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04DF -ENCODING 1247 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -30 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04E2 -ENCODING 1250 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -88 -88 -98 -A8 -C8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni04E3 -ENCODING 1251 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR uni04E4 -ENCODING 1252 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -88 -88 -98 -A8 -C8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni04E5 -ENCODING 1253 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR uni04E6 -ENCODING 1254 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04E7 -ENCODING 1255 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04E8 -ENCODING 1256 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -F8 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04E9 -ENCODING 1257 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -F8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04EA -ENCODING 1258 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -88 -88 -F8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04EB -ENCODING 1259 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -F8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04EC -ENCODING 1260 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -08 -38 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04ED -ENCODING 1261 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -38 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04EE -ENCODING 1262 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -88 -88 -88 -88 -78 -08 -08 -70 -00 -00 -ENDCHAR -STARTCHAR uni04EF -ENCODING 1263 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR uni04F0 -ENCODING 1264 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -88 -88 -88 -88 -78 -08 -08 -70 -00 -00 -ENDCHAR -STARTCHAR uni04F1 -ENCODING 1265 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR uni04F2 -ENCODING 1266 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -88 -88 -88 -88 -78 -08 -08 -70 -00 -00 -ENDCHAR -STARTCHAR uni04F3 -ENCODING 1267 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR uni04F4 -ENCODING 1268 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -88 -88 -88 -88 -78 -08 -08 -08 -00 -00 -ENDCHAR -STARTCHAR uni04F5 -ENCODING 1269 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -88 -88 -88 -78 -08 -08 -00 -00 -ENDCHAR -STARTCHAR uni04F8 -ENCODING 1272 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -88 -88 -C8 -A8 -A8 -A8 -A8 -C8 -00 -00 -ENDCHAR -STARTCHAR uni04F9 -ENCODING 1273 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -88 -88 -C8 -A8 -A8 -C8 -00 -00 -ENDCHAR -STARTCHAR uni1E0C -ENCODING 7692 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -90 -88 -88 -88 -88 -90 -E0 -20 -20 -ENDCHAR -STARTCHAR uni1E0D -ENCODING 7693 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -08 -78 -88 -88 -88 -88 -78 -20 -20 -ENDCHAR -STARTCHAR Klinebelow -ENCODING 7732 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -90 -A0 -C0 -C0 -A0 -90 -88 -00 -70 -ENDCHAR -STARTCHAR klinebelow -ENCODING 7733 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -48 -50 -60 -60 -50 -48 -00 -70 -ENDCHAR -STARTCHAR uni1E36 -ENCODING 7734 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -80 -80 -80 -80 -80 -F8 -20 -20 -ENDCHAR -STARTCHAR uni1E37 -ENCODING 7735 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -20 -20 -20 -20 -20 -20 -70 -20 -20 -ENDCHAR -STARTCHAR uni1E40 -ENCODING 7744 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -88 -D8 -A8 -A8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni1E41 -ENCODING 7745 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -F0 -A8 -A8 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR uni1E42 -ENCODING 7746 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -D8 -A8 -A8 -88 -88 -88 -88 -20 -20 -ENDCHAR -STARTCHAR uni1E43 -ENCODING 7747 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -A8 -A8 -A8 -A8 -A8 -10 -10 -ENDCHAR -STARTCHAR uni1E44 -ENCODING 7748 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -88 -88 -C8 -A8 -98 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni1E45 -ENCODING 7749 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni1E46 -ENCODING 7750 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -C8 -A8 -98 -88 -88 -88 -20 -20 -ENDCHAR -STARTCHAR uni1E47 -ENCODING 7751 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -88 -20 -20 -ENDCHAR -STARTCHAR uni1E6C -ENCODING 7788 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -20 -20 -20 -20 -20 -20 -10 -10 -ENDCHAR -STARTCHAR uni1E6D -ENCODING 7789 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -20 -20 -20 -20 -18 -10 -10 -ENDCHAR -STARTCHAR Edotbelow -ENCODING 7864 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -F0 -80 -80 -80 -F8 -20 -20 -ENDCHAR -STARTCHAR edotbelow -ENCODING 7865 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -F8 -80 -80 -78 -20 -20 -ENDCHAR -STARTCHAR Etilde -ENCODING 7868 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR etilde -ENCODING 7869 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR uni1ECA -ENCODING 7882 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -20 -20 -20 -20 -20 -20 -70 -20 -20 -ENDCHAR -STARTCHAR uni1ECB -ENCODING 7883 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -00 -60 -20 -20 -20 -20 -70 -20 -20 -ENDCHAR -STARTCHAR Odotbelow -ENCODING 7884 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -88 -70 -20 -20 -ENDCHAR -STARTCHAR odotbelow -ENCODING 7885 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -70 -20 -20 -ENDCHAR -STARTCHAR uni1EE4 -ENCODING 7908 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -88 -88 -88 -70 -20 -20 -ENDCHAR -STARTCHAR uni1EE5 -ENCODING 7909 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -78 -20 -20 -ENDCHAR -STARTCHAR Ytilde -ENCODING 7928 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR ytilde -ENCODING 7929 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR uni2000 -ENCODING 8192 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2001 -ENCODING 8193 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR enspace -ENCODING 8194 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2003 -ENCODING 8195 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2004 -ENCODING 8196 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2005 -ENCODING 8197 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2006 -ENCODING 8198 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2007 -ENCODING 8199 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2008 -ENCODING 8200 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2009 -ENCODING 8201 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni200A -ENCODING 8202 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni200B -ENCODING 8203 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR afii61664 -ENCODING 8204 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR afii301 -ENCODING 8205 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR afii299 -ENCODING 8206 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR afii300 -ENCODING 8207 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR hyphentwo -ENCODING 8208 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -78 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2011 -ENCODING 8209 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -78 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR figuredash -ENCODING 8210 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -F8 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR endash -ENCODING 8211 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -F8 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR emdash -ENCODING 8212 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -F8 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR afii00208 -ENCODING 8213 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -F8 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR dblverticalbar -ENCODING 8214 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -50 -50 -50 -50 -50 -50 -00 -00 -ENDCHAR -STARTCHAR underscoredbl -ENCODING 8215 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -F8 -00 -F8 -ENDCHAR -STARTCHAR quoteleft -ENCODING 8216 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -10 -20 -20 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR quoteright -ENCODING 8217 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -40 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR quotesinglbase -ENCODING 8218 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -20 -20 -40 -00 -ENDCHAR -STARTCHAR quotereversed -ENCODING 8219 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -10 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR quotedblleft -ENCODING 8220 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -28 -50 -50 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR quotedblright -ENCODING 8221 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -28 -28 -50 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR quotedblbase -ENCODING 8222 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -50 -50 -A0 -00 -ENDCHAR -STARTCHAR uni201F -ENCODING 8223 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -A0 -A0 -50 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR dagger -ENCODING 8224 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -20 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR daggerdbl -ENCODING 8225 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -20 -20 -20 -20 -70 -20 -00 -00 -ENDCHAR -STARTCHAR bullet -ENCODING 8226 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -30 -78 -78 -30 -00 -00 -00 -00 -ENDCHAR -STARTCHAR ellipsis -ENCODING 8230 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR perthousand -ENCODING 8240 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -44 -A8 -50 -20 -40 -A8 -54 -28 -00 -00 -ENDCHAR -STARTCHAR minute -ENCODING 8242 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -20 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR second -ENCODING 8243 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -50 -50 -50 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR guilsinglleft -ENCODING 8249 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -10 -20 -40 -20 -10 -08 -00 -00 -ENDCHAR -STARTCHAR guilsinglright -ENCODING 8250 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -20 -10 -08 -10 -20 -40 -00 -00 -ENDCHAR -STARTCHAR exclamdbl -ENCODING 8252 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -50 -50 -50 -00 -50 -50 -00 -00 -ENDCHAR -STARTCHAR overline -ENCODING 8254 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -F8 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2070 -ENCODING 8304 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -30 -48 -48 -48 -30 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2071 -ENCODING 8305 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -00 -60 -20 -20 -70 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2074 -ENCODING 8308 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -08 -18 -28 -78 -08 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2075 -ENCODING 8309 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -70 -40 -70 -08 -70 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2076 -ENCODING 8310 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -30 -40 -70 -48 -30 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2077 -ENCODING 8311 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -78 -08 -10 -20 -20 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2078 -ENCODING 8312 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -30 -48 -30 -48 -30 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2079 -ENCODING 8313 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -30 -48 -38 -08 -30 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni207A -ENCODING 8314 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -F8 -20 -20 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni207B -ENCODING 8315 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -78 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni207C -ENCODING 8316 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -00 -78 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni207D -ENCODING 8317 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -10 -20 -20 -20 -10 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni207E -ENCODING 8318 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -10 -10 -10 -20 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR nsuperior -ENCODING 8319 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -70 -48 -48 -48 -48 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2080 -ENCODING 8320 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -48 -48 -48 -30 -00 -00 -ENDCHAR -STARTCHAR uni2081 -ENCODING 8321 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -10 -30 -10 -10 -38 -00 -00 -ENDCHAR -STARTCHAR uni2082 -ENCODING 8322 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -48 -10 -20 -78 -00 -00 -ENDCHAR -STARTCHAR uni2083 -ENCODING 8323 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -70 -08 -30 -08 -70 -00 -00 -ENDCHAR -STARTCHAR uni2084 -ENCODING 8324 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -08 -18 -28 -78 -08 -00 -00 -ENDCHAR -STARTCHAR uni2085 -ENCODING 8325 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -70 -40 -70 -08 -70 -00 -00 -ENDCHAR -STARTCHAR uni2086 -ENCODING 8326 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -40 -70 -48 -30 -00 -00 -ENDCHAR -STARTCHAR uni2087 -ENCODING 8327 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -78 -08 -10 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni2088 -ENCODING 8328 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -48 -30 -48 -30 -00 -00 -ENDCHAR -STARTCHAR uni2089 -ENCODING 8329 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -48 -38 -08 -30 -00 -00 -ENDCHAR -STARTCHAR uni208A -ENCODING 8330 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -20 -20 -F8 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni208B -ENCODING 8331 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -78 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni208C -ENCODING 8332 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -78 -00 -78 -00 -00 -00 -ENDCHAR -STARTCHAR uni208D -ENCODING 8333 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -10 -20 -20 -20 -10 -00 -00 -ENDCHAR -STARTCHAR uni208E -ENCODING 8334 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -20 -10 -10 -10 -20 -00 -00 -ENDCHAR -STARTCHAR uni2090 -ENCODING 8336 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -08 -38 -48 -38 -00 -00 -ENDCHAR -STARTCHAR uni2091 -ENCODING 8337 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -48 -78 -40 -38 -00 -00 -ENDCHAR -STARTCHAR uni2092 -ENCODING 8338 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -48 -48 -48 -30 -00 -00 -ENDCHAR -STARTCHAR uni2093 -ENCODING 8339 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -88 -50 -20 -50 -88 -00 -00 -ENDCHAR -STARTCHAR uni2094 -ENCODING 8340 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -70 -08 -78 -48 -30 -00 -00 -ENDCHAR -STARTCHAR uni2095 -ENCODING 8341 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -40 -70 -48 -48 -48 -48 -00 -00 -ENDCHAR -STARTCHAR uni2096 -ENCODING 8342 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -40 -48 -50 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR uni2097 -ENCODING 8343 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR uni2098 -ENCODING 8344 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -F0 -A8 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR uni209A -ENCODING 8346 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -70 -48 -48 -48 -70 -40 -40 -ENDCHAR -STARTCHAR peseta -ENCODING 8359 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -C0 -A0 -A0 -C8 -9C -88 -88 -84 -00 -00 -ENDCHAR -STARTCHAR Euro -ENCODING 8364 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -38 -44 -F0 -40 -F0 -44 -38 -00 -00 -ENDCHAR -STARTCHAR uni20AE -ENCODING 8366 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -30 -60 -30 -60 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni2102 -ENCODING 8450 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -A8 -A0 -A0 -A0 -A0 -A8 -70 -00 -00 -ENDCHAR -STARTCHAR uni210E -ENCODING 8462 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni210F -ENCODING 8463 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -F0 -40 -70 -48 -48 -48 -48 -00 -00 -ENDCHAR -STARTCHAR uni2115 -ENCODING 8469 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -C8 -A8 -D8 -A8 -98 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii61352 -ENCODING 8470 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -94 -94 -D0 -F0 -F0 -B4 -90 -94 -00 -00 -ENDCHAR -STARTCHAR uni211A -ENCODING 8474 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -C8 -A8 -A8 -A8 -A8 -A8 -70 -18 -00 -ENDCHAR -STARTCHAR uni211D -ENCODING 8477 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -A8 -A8 -A8 -B0 -B0 -A8 -E4 -00 -00 -ENDCHAR -STARTCHAR trademark -ENCODING 8482 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F4 -5C -54 -54 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2124 -ENCODING 8484 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -18 -28 -50 -A0 -C0 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Ohm -ENCODING 8486 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -50 -D8 -00 -00 -ENDCHAR -STARTCHAR aleph -ENCODING 8501 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -48 -48 -24 -68 -90 -90 -88 -48 -00 -00 -ENDCHAR -STARTCHAR arrowleft -ENCODING 8592 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -60 -FC -60 -20 -00 -00 -00 -00 -ENDCHAR -STARTCHAR arrowup -ENCODING 8593 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -F8 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR arrowright -ENCODING 8594 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -10 -18 -FC -18 -10 -00 -00 -00 -00 -ENDCHAR -STARTCHAR arrowdown -ENCODING 8595 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -20 -20 -20 -F8 -70 -20 -00 -00 -ENDCHAR -STARTCHAR arrowboth -ENCODING 8596 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -CC -FC -CC -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR arrowupdn -ENCODING 8597 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -F8 -20 -20 -F8 -70 -20 -00 -00 -ENDCHAR -STARTCHAR uni21A4 -ENCODING 8612 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -24 -64 -FC -64 -24 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni21A6 -ENCODING 8614 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -90 -98 -FC -98 -90 -00 -00 -00 -00 -ENDCHAR -STARTCHAR arrowupdnbse -ENCODING 8616 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -F8 -20 -F8 -70 -20 -F8 -00 -00 -ENDCHAR -STARTCHAR carriagereturn -ENCODING 8629 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -08 -08 -28 -68 -F8 -60 -20 -00 -00 -ENDCHAR -STARTCHAR uni21BB -ENCODING 8635 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -30 -50 -94 -84 -84 -84 -78 -00 -00 -ENDCHAR -STARTCHAR uni21CB -ENCODING 8651 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -40 -FC -00 -FC -08 -10 -00 -00 -00 -ENDCHAR -STARTCHAR uni21CC -ENCODING 8652 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -08 -FC -00 -FC -40 -20 -00 -00 -00 -ENDCHAR -STARTCHAR arrowdblleft -ENCODING 8656 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -7C -E0 -7C -20 -00 -00 -00 -00 -ENDCHAR -STARTCHAR arrowdblup -ENCODING 8657 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -F8 -50 -50 -50 -50 -50 -00 -00 -ENDCHAR -STARTCHAR arrowdblright -ENCODING 8658 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -10 -F8 -1C -F8 -10 -00 -00 -00 -00 -ENDCHAR -STARTCHAR arrowdbldown -ENCODING 8659 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -50 -50 -50 -F8 -70 -20 -00 -00 -ENDCHAR -STARTCHAR arrowdblboth -ENCODING 8660 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -FC -CC -FC -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni21D5 -ENCODING 8661 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -F8 -50 -50 -F8 -70 -20 -00 -00 -ENDCHAR -STARTCHAR universal -ENCODING 8704 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -F8 -50 -50 -50 -20 -20 -00 -00 -ENDCHAR -STARTCHAR existential -ENCODING 8707 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -F8 -08 -08 -F8 -08 -08 -F8 -00 -00 -ENDCHAR -STARTCHAR uni2204 -ENCODING 8708 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -F8 -28 -28 -F8 -48 -48 -F8 -80 -00 -ENDCHAR -STARTCHAR emptyset -ENCODING 8709 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -70 -98 -A8 -A8 -C8 -70 -80 -00 -00 -ENDCHAR -STARTCHAR increment -ENCODING 8710 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -50 -50 -88 -88 -88 -F8 -00 -00 -ENDCHAR -STARTCHAR gradient -ENCODING 8711 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -88 -88 -88 -50 -50 -20 -20 -00 -00 -ENDCHAR -STARTCHAR element -ENCODING 8712 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -38 -40 -80 -F8 -80 -40 -38 -00 -00 -ENDCHAR -STARTCHAR notelement -ENCODING 8713 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -38 -50 -90 -F8 -A0 -60 -78 -40 -00 -ENDCHAR -STARTCHAR uni220A -ENCODING 8714 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -80 -F8 -80 -78 -00 -00 -00 -ENDCHAR -STARTCHAR suchthat -ENCODING 8715 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -E0 -10 -08 -F8 -08 -10 -E0 -00 -00 -ENDCHAR -STARTCHAR uni220C -ENCODING 8716 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -E0 -50 -48 -F8 -28 -30 -F0 -10 -00 -ENDCHAR -STARTCHAR uni220D -ENCODING 8717 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -08 -F8 -08 -F0 -00 -00 -00 -ENDCHAR -STARTCHAR minus -ENCODING 8722 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -F8 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2213 -ENCODING 8723 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -F8 -00 -20 -20 -F8 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni2214 -ENCODING 8724 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -00 -20 -20 -F8 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni2215 -ENCODING 8725 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -08 -10 -20 -40 -80 -00 -00 -00 -ENDCHAR -STARTCHAR uni2216 -ENCODING 8726 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -80 -40 -20 -10 -08 -00 -00 -00 -ENDCHAR -STARTCHAR bulletoperator -ENCODING 8729 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -30 -78 -30 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR radical -ENCODING 8730 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -0C -08 -08 -08 -88 -88 -48 -28 -18 -00 -00 -ENDCHAR -STARTCHAR infinity -ENCODING 8734 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -50 -A8 -A8 -A8 -50 -00 -00 -00 -00 -ENDCHAR -STARTCHAR orthogonal -ENCODING 8735 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -80 -80 -80 -80 -F8 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2225 -ENCODING 8741 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -50 -50 -50 -50 -50 -50 -00 -00 -ENDCHAR -STARTCHAR logicaland -ENCODING 8743 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -20 -20 -50 -50 -88 -88 -00 -00 -ENDCHAR -STARTCHAR logicalor -ENCODING 8744 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -50 -50 -20 -20 -00 -00 -ENDCHAR -STARTCHAR intersection -ENCODING 8745 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR union -ENCODING 8746 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR approxequal -ENCODING 8776 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -68 -B0 -00 -68 -B0 -00 -00 -00 -ENDCHAR -STARTCHAR notequal -ENCODING 8800 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -F8 -20 -40 -F8 -80 -00 -00 -00 -ENDCHAR -STARTCHAR equivalence -ENCODING 8801 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -00 -F8 -00 -F8 -00 -00 -00 -ENDCHAR -STARTCHAR lessequal -ENCODING 8804 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -10 -20 -40 -80 -40 -20 -10 -00 -F8 -00 -00 -ENDCHAR -STARTCHAR greaterequal -ENCODING 8805 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -40 -20 -10 -08 -10 -20 -40 -00 -F8 -00 -00 -ENDCHAR -STARTCHAR uni226A -ENCODING 8810 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -14 -28 -50 -A0 -50 -28 -14 -00 -00 -ENDCHAR -STARTCHAR uni226B -ENCODING 8811 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -A0 -50 -28 -14 -28 -50 -A0 -00 -00 -ENDCHAR -STARTCHAR propersubset -ENCODING 8834 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -78 -80 -80 -80 -80 -78 -00 -00 -00 -ENDCHAR -STARTCHAR propersuperset -ENCODING 8835 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -F0 -08 -08 -08 -08 -F0 -00 -00 -00 -ENDCHAR -STARTCHAR reflexsubset -ENCODING 8838 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -80 -80 -80 -80 -78 -00 -F8 -00 -00 -ENDCHAR -STARTCHAR reflexsuperset -ENCODING 8839 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -08 -08 -08 -08 -F0 -00 -F8 -00 -00 -ENDCHAR -STARTCHAR perpendicular -ENCODING 8869 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -20 -20 -20 -20 -20 -F8 -00 -00 -ENDCHAR -STARTCHAR uni22C2 -ENCODING 8898 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni22C3 -ENCODING 8899 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni2300 -ENCODING 8960 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -70 -98 -A8 -A8 -C8 -70 -80 -00 -00 -ENDCHAR -STARTCHAR house -ENCODING 8962 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -20 -50 -88 -88 -88 -F8 -00 -00 -ENDCHAR -STARTCHAR uni2308 -ENCODING 8968 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -40 -40 -40 -40 -40 -40 -40 -00 -00 -ENDCHAR -STARTCHAR uni2309 -ENCODING 8969 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -10 -10 -10 -10 -10 -10 -10 -00 -00 -ENDCHAR -STARTCHAR uni230A -ENCODING 8970 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -40 -40 -40 -40 -40 -70 -00 -00 -ENDCHAR -STARTCHAR uni230B -ENCODING 8971 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -10 -10 -10 -10 -10 -10 -70 -00 -00 -ENDCHAR -STARTCHAR revlogicalnot -ENCODING 8976 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -80 -80 -80 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2319 -ENCODING 8985 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -80 -80 -80 -F8 -00 -00 -00 -00 -ENDCHAR -STARTCHAR integraltp -ENCODING 8992 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -28 -28 -20 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR integralbt -ENCODING 8993 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -20 -20 -A0 -A0 -40 -00 -00 -ENDCHAR -STARTCHAR uni239B -ENCODING 9115 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -10 -10 -20 -20 -20 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR uni239C -ENCODING 9116 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR uni239D -ENCODING 9117 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -40 -40 -40 -40 -20 -20 -20 -10 -10 -08 -ENDCHAR -STARTCHAR uni239E -ENCODING 9118 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -20 -10 -10 -10 -08 -08 -08 -08 -08 -08 -ENDCHAR -STARTCHAR uni239F -ENCODING 9119 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -ENDCHAR -STARTCHAR uni23A0 -ENCODING 9120 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -08 -08 -08 -08 -10 -10 -10 -20 -20 -40 -ENDCHAR -STARTCHAR uni23A1 -ENCODING 9121 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -78 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR uni23A2 -ENCODING 9122 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR uni23A3 -ENCODING 9123 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -78 -ENDCHAR -STARTCHAR uni23A4 -ENCODING 9124 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -78 -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -ENDCHAR -STARTCHAR uni23A5 -ENCODING 9125 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -ENDCHAR -STARTCHAR uni23A6 -ENCODING 9126 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -78 -ENDCHAR -STARTCHAR uni23A7 -ENCODING 9127 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -0C -10 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni23A8 -ENCODING 9128 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -C0 -C0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni23A9 -ENCODING 9129 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -10 -0C -ENDCHAR -STARTCHAR uni23AB -ENCODING 9131 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -C0 -20 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -ENDCHAR -STARTCHAR uni23AC -ENCODING 9132 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -10 -10 -10 -10 -0C -0C -10 -10 -10 -10 -10 -ENDCHAR -STARTCHAR uni23AD -ENCODING 9133 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -20 -C0 -ENDCHAR -STARTCHAR uni23AE -ENCODING 9134 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni23AF -ENCODING 9135 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni23BA -ENCODING 9146 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -FC -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni23BB -ENCODING 9147 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -FC -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni23BC -ENCODING 9148 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -FC -00 -00 -00 -ENDCHAR -STARTCHAR uni23BD -ENCODING 9149 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -FC -ENDCHAR -STARTCHAR uni23D0 -ENCODING 9168 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2409 -ENCODING 9225 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -90 -90 -F0 -90 -90 -00 -7C -10 -10 -10 -10 -00 -ENDCHAR -STARTCHAR uni240A -ENCODING 9226 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -80 -80 -80 -F0 -00 -3C -20 -38 -20 -20 -00 -ENDCHAR -STARTCHAR uni240B -ENCODING 9227 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -88 -88 -88 -50 -20 -00 -7C -10 -10 -10 -10 -00 -ENDCHAR -STARTCHAR uni240C -ENCODING 9228 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -F0 -80 -E0 -80 -80 -00 -3C -20 -38 -20 -20 -00 -ENDCHAR -STARTCHAR uni240D -ENCODING 9229 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -60 -90 -80 -90 -60 -00 -38 -24 -38 -28 -24 -00 -ENDCHAR -STARTCHAR uni2424 -ENCODING 9252 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -90 -D0 -B0 -90 -90 -00 -20 -20 -20 -20 -3C -00 -ENDCHAR -STARTCHAR SF100000 -ENCODING 9472 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2501 -ENCODING 9473 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -FC -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF110000 -ENCODING 9474 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2503 -ENCODING 9475 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -30 -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2508 -ENCODING 9480 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -A8 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2509 -ENCODING 9481 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -A8 -A8 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni250A -ENCODING 9482 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -00 -20 -20 -00 -20 -20 -00 -20 -20 -00 -ENDCHAR -STARTCHAR uni250B -ENCODING 9483 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -00 -30 -30 -00 -30 -30 -00 -30 -30 -00 -ENDCHAR -STARTCHAR SF010000 -ENCODING 9484 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -3C -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni250D -ENCODING 9485 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -3C -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni250E -ENCODING 9486 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -3C -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni250F -ENCODING 9487 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -3C -3C -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR SF030000 -ENCODING 9488 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -E0 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2511 -ENCODING 9489 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -E0 -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2512 -ENCODING 9490 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -F0 -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2513 -ENCODING 9491 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -F0 -F0 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR SF020000 -ENCODING 9492 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -3C -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2515 -ENCODING 9493 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -3C -3C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2516 -ENCODING 9494 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -3C -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2517 -ENCODING 9495 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -3C -3C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF040000 -ENCODING 9496 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -E0 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2519 -ENCODING 9497 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -E0 -E0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni251A -ENCODING 9498 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -F0 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni251B -ENCODING 9499 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -F0 -F0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF080000 -ENCODING 9500 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -3C -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni251D -ENCODING 9501 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -3C -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni251E -ENCODING 9502 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -3C -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni251F -ENCODING 9503 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -3C -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2520 -ENCODING 9504 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -3C -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2521 -ENCODING 9505 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -3C -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2522 -ENCODING 9506 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -3C -3C -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2523 -ENCODING 9507 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -3C -3C -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR SF090000 -ENCODING 9508 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -E0 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2525 -ENCODING 9509 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -E0 -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2526 -ENCODING 9510 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -F0 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2527 -ENCODING 9511 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -F0 -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2528 -ENCODING 9512 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -F0 -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2529 -ENCODING 9513 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -F0 -F0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni252A -ENCODING 9514 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -F0 -F0 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni252B -ENCODING 9515 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -F0 -F0 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR SF060000 -ENCODING 9516 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni252D -ENCODING 9517 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni252E -ENCODING 9518 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni252F -ENCODING 9519 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -FC -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2530 -ENCODING 9520 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2531 -ENCODING 9521 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -F0 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2532 -ENCODING 9522 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -3C -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2533 -ENCODING 9523 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -FC -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR SF070000 -ENCODING 9524 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2535 -ENCODING 9525 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -E0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2536 -ENCODING 9526 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -3C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2537 -ENCODING 9527 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -FC -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2538 -ENCODING 9528 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2539 -ENCODING 9529 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -F0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni253A -ENCODING 9530 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -3C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni253B -ENCODING 9531 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -FC -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF050000 -ENCODING 9532 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni253D -ENCODING 9533 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni253E -ENCODING 9534 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni253F -ENCODING 9535 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -FC -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2540 -ENCODING 9536 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2541 -ENCODING 9537 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2542 -ENCODING 9538 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2543 -ENCODING 9539 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2544 -ENCODING 9540 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2545 -ENCODING 9541 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -F0 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2546 -ENCODING 9542 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -3C -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2547 -ENCODING 9543 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -FC -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2548 -ENCODING 9544 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -FC -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2549 -ENCODING 9545 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -F0 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni254A -ENCODING 9546 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -3C -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni254B -ENCODING 9547 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -FC -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR SF430000 -ENCODING 9552 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -FC -00 -FC -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF240000 -ENCODING 9553 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -50 -50 -50 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF510000 -ENCODING 9554 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -3C -20 -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF520000 -ENCODING 9555 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -7C -50 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF390000 -ENCODING 9556 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -7C -40 -5C -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF220000 -ENCODING 9557 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -E0 -20 -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF210000 -ENCODING 9558 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -F0 -50 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF250000 -ENCODING 9559 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -10 -D0 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF500000 -ENCODING 9560 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -3C -20 -3C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF490000 -ENCODING 9561 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -50 -7C -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF380000 -ENCODING 9562 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -5C -40 -7C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF280000 -ENCODING 9563 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -E0 -20 -E0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF270000 -ENCODING 9564 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -50 -F0 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF260000 -ENCODING 9565 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -D0 -10 -F0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF360000 -ENCODING 9566 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -3C -20 -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF370000 -ENCODING 9567 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -50 -5C -50 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF420000 -ENCODING 9568 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -5C -40 -5C -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF190000 -ENCODING 9569 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -E0 -20 -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF200000 -ENCODING 9570 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -50 -D0 -50 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF230000 -ENCODING 9571 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -D0 -10 -D0 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF470000 -ENCODING 9572 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -FC -00 -FC -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF480000 -ENCODING 9573 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -50 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF410000 -ENCODING 9574 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -FC -00 -DC -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF450000 -ENCODING 9575 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -FC -00 -FC -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF460000 -ENCODING 9576 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -50 -FC -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF400000 -ENCODING 9577 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -DC -00 -FC -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF540000 -ENCODING 9578 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -FC -20 -FC -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF530000 -ENCODING 9579 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -50 -FC -50 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF440000 -ENCODING 9580 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -DC -00 -DC -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR uni256D -ENCODING 9581 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -0C -10 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni256E -ENCODING 9582 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -80 -40 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni256F -ENCODING 9583 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -40 -80 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2570 -ENCODING 9584 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -10 -0C -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2571 -ENCODING 9585 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -04 -04 -08 -08 -10 -10 -20 -20 -40 -40 -80 -80 -ENDCHAR -STARTCHAR uni2572 -ENCODING 9586 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -80 -40 -40 -20 -20 -10 -10 -08 -08 -04 -04 -ENDCHAR -STARTCHAR uni2573 -ENCODING 9587 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -84 -84 -48 -48 -30 -30 -30 -30 -48 -48 -84 -84 -ENDCHAR -STARTCHAR uni2574 -ENCODING 9588 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -E0 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2575 -ENCODING 9589 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -20 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2576 -ENCODING 9590 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -3C -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2577 -ENCODING 9591 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -20 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2578 -ENCODING 9592 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -E0 -E0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2579 -ENCODING 9593 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -30 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni257A -ENCODING 9594 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -3C -3C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni257B -ENCODING 9595 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni257C -ENCODING 9596 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -3C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni257D -ENCODING 9597 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -30 -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni257E -ENCODING 9598 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -E0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni257F -ENCODING 9599 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -30 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR upblock -ENCODING 9600 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -FC -FC -FC -FC -FC -FC -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2581 -ENCODING 9601 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -FC -ENDCHAR -STARTCHAR uni2582 -ENCODING 9602 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -FC -FC -FC -ENDCHAR -STARTCHAR uni2583 -ENCODING 9603 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -FC -FC -FC -FC -ENDCHAR -STARTCHAR dnblock -ENCODING 9604 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR uni2585 -ENCODING 9605 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR uni2586 -ENCODING 9606 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -FC -FC -FC -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR uni2587 -ENCODING 9607 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -FC -FC -FC -FC -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR block -ENCODING 9608 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -FC -FC -FC -FC -FC -FC -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR uni2589 -ENCODING 9609 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -ENDCHAR -STARTCHAR uni258A -ENCODING 9610 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -ENDCHAR -STARTCHAR uni258B -ENCODING 9611 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -ENDCHAR -STARTCHAR lfblock -ENCODING 9612 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -E0 -E0 -E0 -E0 -E0 -E0 -E0 -E0 -E0 -E0 -E0 -E0 -ENDCHAR -STARTCHAR uni258D -ENCODING 9613 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -ENDCHAR -STARTCHAR uni258E -ENCODING 9614 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR uni258F -ENCODING 9615 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR rtblock -ENCODING 9616 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -1C -1C -1C -1C -1C -1C -1C -1C -1C -1C -1C -1C -ENDCHAR -STARTCHAR ltshade -ENCODING 9617 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -90 -24 -90 -24 -90 -24 -90 -24 -90 -24 -90 -24 -ENDCHAR -STARTCHAR shade -ENCODING 9618 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -A8 -54 -A8 -54 -A8 -54 -A8 -54 -A8 -54 -A8 -54 -ENDCHAR -STARTCHAR dkshade -ENCODING 9619 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -D8 -B4 -D8 -B4 -D8 -B4 -D8 -B4 -D8 -B4 -D8 -B4 -ENDCHAR -STARTCHAR uni2596 -ENCODING 9622 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -E0 -E0 -E0 -E0 -E0 -E0 -ENDCHAR -STARTCHAR uni2597 -ENCODING 9623 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -1C -1C -1C -1C -1C -1C -ENDCHAR -STARTCHAR uni2598 -ENCODING 9624 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -E0 -E0 -E0 -E0 -E0 -E0 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2599 -ENCODING 9625 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -E0 -E0 -E0 -E0 -E0 -E0 -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR uni259A -ENCODING 9626 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -E0 -E0 -E0 -E0 -E0 -E0 -1C -1C -1C -1C -1C -1C -ENDCHAR -STARTCHAR uni259B -ENCODING 9627 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -FC -FC -FC -FC -FC -FC -E0 -E0 -E0 -E0 -E0 -E0 -ENDCHAR -STARTCHAR uni259C -ENCODING 9628 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -FC -FC -FC -FC -FC -FC -1C -1C -1C -1C -1C -1C -ENDCHAR -STARTCHAR uni259D -ENCODING 9629 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -1C -1C -1C -1C -1C -1C -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni259E -ENCODING 9630 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -1C -1C -1C -1C -1C -1C -E0 -E0 -E0 -E0 -E0 -E0 -ENDCHAR -STARTCHAR uni259F -ENCODING 9631 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -1C -1C -1C -1C -1C -1C -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR filledbox -ENCODING 9632 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -78 -78 -78 -78 -78 -00 -00 -00 -00 -ENDCHAR -STARTCHAR filledrect -ENCODING 9644 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -F8 -F8 -F8 -00 -00 -ENDCHAR -STARTCHAR uni25AE -ENCODING 9646 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -00 -00 -ENDCHAR -STARTCHAR triagup -ENCODING 9650 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -30 -30 -78 -78 -FC -FC -00 -00 -00 -ENDCHAR -STARTCHAR uni25B6 -ENCODING 9654 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -C0 -F0 -FC -FC -F0 -C0 -00 -00 -00 -ENDCHAR -STARTCHAR triagrt -ENCODING 9658 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -C0 -F0 -FC -FC -F0 -C0 -00 -00 -00 -ENDCHAR -STARTCHAR triagdn -ENCODING 9660 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -FC -FC -78 -78 -30 -30 -00 -00 -00 -ENDCHAR -STARTCHAR uni25C0 -ENCODING 9664 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -0C -3C -FC -FC -3C -0C -00 -00 -00 -ENDCHAR -STARTCHAR triaglf -ENCODING 9668 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -0C -3C -FC -FC -3C -0C -00 -00 -00 -ENDCHAR -STARTCHAR blackdiamond -ENCODING 9670 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -70 -F8 -70 -20 -00 -00 -00 -00 -ENDCHAR -STARTCHAR lozenge -ENCODING 9674 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -50 -88 -50 -20 -00 -00 -00 -00 -ENDCHAR -STARTCHAR circle -ENCODING 9675 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -30 -48 -48 -30 -00 -00 -00 -00 -ENDCHAR -STARTCHAR H18533 -ENCODING 9679 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -30 -78 -78 -30 -00 -00 -00 -00 -ENDCHAR -STARTCHAR invbullet -ENCODING 9688 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -FC -FC -FC -FC -CC -84 -84 -CC -FC -FC -FC -FC -ENDCHAR -STARTCHAR invcircle -ENCODING 9689 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -FC -FC -FC -FC -CC -B4 -B4 -CC -FC -FC -FC -FC -ENDCHAR -STARTCHAR smileface -ENCODING 9786 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -84 -CC -84 -B4 -B4 -84 -78 -00 -00 -ENDCHAR -STARTCHAR invsmileface -ENCODING 9787 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -FC -B4 -FC -84 -CC -FC -78 -00 -00 -ENDCHAR -STARTCHAR sun -ENCODING 9788 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -A8 -70 -D8 -70 -A8 -20 -00 -00 -ENDCHAR -STARTCHAR female -ENCODING 9792 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -70 -20 -F8 -20 -00 -00 -ENDCHAR -STARTCHAR male -ENCODING 9794 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -3C -0C -14 -70 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR spade -ENCODING 9824 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -F8 -F8 -70 -20 -70 -00 -00 -ENDCHAR -STARTCHAR club -ENCODING 9827 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -20 -A8 -F8 -A8 -20 -70 -00 -00 -ENDCHAR -STARTCHAR heart -ENCODING 9829 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -50 -F8 -F8 -F8 -70 -70 -20 -00 -00 -ENDCHAR -STARTCHAR diamond -ENCODING 9830 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -70 -F8 -70 -20 -00 -00 -00 -00 -ENDCHAR -STARTCHAR musicalnote -ENCODING 9834 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -48 -78 -40 -40 -40 -40 -80 -00 -00 -ENDCHAR -STARTCHAR musicalnotedbl -ENCODING 9835 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -48 -78 -48 -48 -48 -48 -50 -80 -00 -ENDCHAR -STARTCHAR uni2713 -ENCODING 10003 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -04 -04 -08 -88 -90 -50 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni2714 -ENCODING 10004 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -0C -0C -18 -D8 -F0 -70 -60 -60 -00 -00 -ENDCHAR -STARTCHAR uni2717 -ENCODING 10007 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -48 -28 -10 -10 -28 -24 -40 -40 -00 -00 -ENDCHAR -STARTCHAR uni2718 -ENCODING 10008 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -18 -D8 -70 -30 -78 -6C -C0 -C0 -00 -00 -ENDCHAR -STARTCHAR uni27E8 -ENCODING 10216 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -10 -10 -20 -20 -40 -20 -20 -10 -10 -00 -00 -ENDCHAR -STARTCHAR uni27E9 -ENCODING 10217 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -40 -40 -20 -20 -10 -20 -20 -40 -40 -00 -00 -ENDCHAR -STARTCHAR uni27EA -ENCODING 10218 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -28 -28 -50 -50 -A0 -50 -50 -28 -28 -00 -00 -ENDCHAR -STARTCHAR uni27EB -ENCODING 10219 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -A0 -A0 -50 -50 -28 -50 -50 -A0 -A0 -00 -00 -ENDCHAR -STARTCHAR uni2800 -ENCODING 10240 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2801 -ENCODING 10241 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2802 -ENCODING 10242 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2803 -ENCODING 10243 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2804 -ENCODING 10244 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2805 -ENCODING 10245 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2806 -ENCODING 10246 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2807 -ENCODING 10247 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2808 -ENCODING 10248 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2809 -ENCODING 10249 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni280A -ENCODING 10250 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni280B -ENCODING 10251 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni280C -ENCODING 10252 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni280D -ENCODING 10253 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni280E -ENCODING 10254 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni280F -ENCODING 10255 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2810 -ENCODING 10256 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2811 -ENCODING 10257 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2812 -ENCODING 10258 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2813 -ENCODING 10259 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2814 -ENCODING 10260 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2815 -ENCODING 10261 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2816 -ENCODING 10262 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2817 -ENCODING 10263 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2818 -ENCODING 10264 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2819 -ENCODING 10265 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni281A -ENCODING 10266 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni281B -ENCODING 10267 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni281C -ENCODING 10268 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni281D -ENCODING 10269 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni281E -ENCODING 10270 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni281F -ENCODING 10271 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2820 -ENCODING 10272 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2821 -ENCODING 10273 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2822 -ENCODING 10274 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2823 -ENCODING 10275 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2824 -ENCODING 10276 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2825 -ENCODING 10277 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2826 -ENCODING 10278 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2827 -ENCODING 10279 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2828 -ENCODING 10280 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2829 -ENCODING 10281 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni282A -ENCODING 10282 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni282B -ENCODING 10283 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni282C -ENCODING 10284 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni282D -ENCODING 10285 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni282E -ENCODING 10286 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni282F -ENCODING 10287 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2830 -ENCODING 10288 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2831 -ENCODING 10289 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2832 -ENCODING 10290 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2833 -ENCODING 10291 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2834 -ENCODING 10292 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2835 -ENCODING 10293 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2836 -ENCODING 10294 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2837 -ENCODING 10295 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2838 -ENCODING 10296 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2839 -ENCODING 10297 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni283A -ENCODING 10298 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni283B -ENCODING 10299 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni283C -ENCODING 10300 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni283D -ENCODING 10301 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni283E -ENCODING 10302 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni283F -ENCODING 10303 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2840 -ENCODING 10304 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2841 -ENCODING 10305 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2842 -ENCODING 10306 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2843 -ENCODING 10307 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2844 -ENCODING 10308 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2845 -ENCODING 10309 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2846 -ENCODING 10310 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2847 -ENCODING 10311 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2848 -ENCODING 10312 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2849 -ENCODING 10313 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni284A -ENCODING 10314 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni284B -ENCODING 10315 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni284C -ENCODING 10316 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni284D -ENCODING 10317 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni284E -ENCODING 10318 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni284F -ENCODING 10319 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2850 -ENCODING 10320 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2851 -ENCODING 10321 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2852 -ENCODING 10322 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2853 -ENCODING 10323 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2854 -ENCODING 10324 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2855 -ENCODING 10325 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2856 -ENCODING 10326 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2857 -ENCODING 10327 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2858 -ENCODING 10328 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2859 -ENCODING 10329 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni285A -ENCODING 10330 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni285B -ENCODING 10331 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni285C -ENCODING 10332 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni285D -ENCODING 10333 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni285E -ENCODING 10334 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni285F -ENCODING 10335 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2860 -ENCODING 10336 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2861 -ENCODING 10337 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2862 -ENCODING 10338 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2863 -ENCODING 10339 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2864 -ENCODING 10340 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2865 -ENCODING 10341 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2866 -ENCODING 10342 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2867 -ENCODING 10343 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2868 -ENCODING 10344 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2869 -ENCODING 10345 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni286A -ENCODING 10346 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni286B -ENCODING 10347 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni286C -ENCODING 10348 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni286D -ENCODING 10349 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni286E -ENCODING 10350 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni286F -ENCODING 10351 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2870 -ENCODING 10352 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2871 -ENCODING 10353 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2872 -ENCODING 10354 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2873 -ENCODING 10355 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2874 -ENCODING 10356 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2875 -ENCODING 10357 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2876 -ENCODING 10358 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2877 -ENCODING 10359 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2878 -ENCODING 10360 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2879 -ENCODING 10361 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni287A -ENCODING 10362 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni287B -ENCODING 10363 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni287C -ENCODING 10364 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni287D -ENCODING 10365 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni287E -ENCODING 10366 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni287F -ENCODING 10367 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2880 -ENCODING 10368 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2881 -ENCODING 10369 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2882 -ENCODING 10370 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2883 -ENCODING 10371 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2884 -ENCODING 10372 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2885 -ENCODING 10373 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2886 -ENCODING 10374 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2887 -ENCODING 10375 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2888 -ENCODING 10376 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2889 -ENCODING 10377 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni288A -ENCODING 10378 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni288B -ENCODING 10379 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni288C -ENCODING 10380 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni288D -ENCODING 10381 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni288E -ENCODING 10382 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni288F -ENCODING 10383 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2890 -ENCODING 10384 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2891 -ENCODING 10385 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2892 -ENCODING 10386 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2893 -ENCODING 10387 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2894 -ENCODING 10388 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2895 -ENCODING 10389 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2896 -ENCODING 10390 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2897 -ENCODING 10391 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2898 -ENCODING 10392 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2899 -ENCODING 10393 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni289A -ENCODING 10394 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni289B -ENCODING 10395 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni289C -ENCODING 10396 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni289D -ENCODING 10397 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni289E -ENCODING 10398 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni289F -ENCODING 10399 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A0 -ENCODING 10400 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A1 -ENCODING 10401 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A2 -ENCODING 10402 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A3 -ENCODING 10403 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A4 -ENCODING 10404 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A5 -ENCODING 10405 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A6 -ENCODING 10406 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A7 -ENCODING 10407 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A8 -ENCODING 10408 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A9 -ENCODING 10409 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28AA -ENCODING 10410 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28AB -ENCODING 10411 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28AC -ENCODING 10412 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28AD -ENCODING 10413 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28AE -ENCODING 10414 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28AF -ENCODING 10415 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B0 -ENCODING 10416 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B1 -ENCODING 10417 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B2 -ENCODING 10418 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B3 -ENCODING 10419 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B4 -ENCODING 10420 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B5 -ENCODING 10421 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B6 -ENCODING 10422 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B7 -ENCODING 10423 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B8 -ENCODING 10424 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B9 -ENCODING 10425 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28BA -ENCODING 10426 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28BB -ENCODING 10427 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28BC -ENCODING 10428 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28BD -ENCODING 10429 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28BE -ENCODING 10430 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28BF -ENCODING 10431 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28C0 -ENCODING 10432 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C1 -ENCODING 10433 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C2 -ENCODING 10434 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C3 -ENCODING 10435 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C4 -ENCODING 10436 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C5 -ENCODING 10437 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C6 -ENCODING 10438 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C7 -ENCODING 10439 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C8 -ENCODING 10440 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C9 -ENCODING 10441 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28CA -ENCODING 10442 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28CB -ENCODING 10443 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28CC -ENCODING 10444 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28CD -ENCODING 10445 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28CE -ENCODING 10446 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28CF -ENCODING 10447 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D0 -ENCODING 10448 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D1 -ENCODING 10449 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D2 -ENCODING 10450 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D3 -ENCODING 10451 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D4 -ENCODING 10452 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D5 -ENCODING 10453 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D6 -ENCODING 10454 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D7 -ENCODING 10455 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D8 -ENCODING 10456 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D9 -ENCODING 10457 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28DA -ENCODING 10458 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28DB -ENCODING 10459 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28DC -ENCODING 10460 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28DD -ENCODING 10461 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28DE -ENCODING 10462 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28DF -ENCODING 10463 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E0 -ENCODING 10464 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E1 -ENCODING 10465 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E2 -ENCODING 10466 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E3 -ENCODING 10467 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E4 -ENCODING 10468 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E5 -ENCODING 10469 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E6 -ENCODING 10470 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E7 -ENCODING 10471 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E8 -ENCODING 10472 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E9 -ENCODING 10473 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28EA -ENCODING 10474 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28EB -ENCODING 10475 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28EC -ENCODING 10476 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28ED -ENCODING 10477 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28EE -ENCODING 10478 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28EF -ENCODING 10479 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F0 -ENCODING 10480 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F1 -ENCODING 10481 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F2 -ENCODING 10482 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F3 -ENCODING 10483 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F4 -ENCODING 10484 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F5 -ENCODING 10485 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F6 -ENCODING 10486 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F7 -ENCODING 10487 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F8 -ENCODING 10488 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F9 -ENCODING 10489 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28FA -ENCODING 10490 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28FB -ENCODING 10491 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28FC -ENCODING 10492 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28FD -ENCODING 10493 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28FE -ENCODING 10494 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28FF -ENCODING 10495 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni2E2C -ENCODING 11820 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -00 -00 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uniE0A0 -ENCODING 57504 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -90 -B8 -90 -90 -90 -20 -40 -80 -80 -80 -80 -ENDCHAR -STARTCHAR uniE0A1 -ENCODING 57505 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -80 -80 -80 -F0 -00 -24 -34 -2C -24 -24 -00 -ENDCHAR -STARTCHAR uniE0A2 -ENCODING 57506 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -30 -48 -48 -48 -FC -FC -CC -CC -FC -FC -00 -ENDCHAR -STARTCHAR uniE0B0 -ENCODING 57520 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -C0 -E0 -F0 -F8 -FC -FC -F8 -F0 -E0 -C0 -80 -ENDCHAR -STARTCHAR uniE0B1 -ENCODING 57521 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -40 -20 -10 -08 -04 -04 -08 -10 -20 -40 -80 -ENDCHAR -STARTCHAR uniE0B2 -ENCODING 57522 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -04 -0C -1C -3C -7C -FC -FC -7C -3C -1C -0C -04 -ENDCHAR -STARTCHAR uniE0B3 -ENCODING 57523 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -04 -08 -10 -20 -40 -80 -80 -40 -20 -10 -08 -04 -ENDCHAR -STARTCHAR uniF6BE -ENCODING 63166 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -18 -08 -08 -08 -08 -08 -48 -30 -ENDCHAR -STARTCHAR uniFFFD -ENCODING 65533 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -88 -88 -88 -88 -88 -88 -F8 -00 -00 -ENDCHAR -ENDFONT diff --git a/src/base_circuitpython/img/blinka.bmp b/src/base_circuitpython/img/blinka.bmp deleted file mode 100644 index 0466a02d426e7aa64e8bef4656187276c6f963e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172856 zcmeI&F-ikL6adiG*3K$eSxHb31<@c1!CtVjxAF{@dxX@f0)ppA?I}D$ZV>;@m}Nm2 zOK0JQ*=5)X%g@`-=QG)d$JzUS(|xYvn8vaBIrf@K%$jCD)(;PwbfgPT1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0Rn#t++I$v&hCGomq+dL=yf-``JcD)1p@yrus&`FW3`*d zq?@<%ml)5d^N2Gt{NJM$0D-c=V)7CrXK$atIgRsq^Z60gyL=O?1nLpEIX_viz9Mgj z=Sb$1IG53^jzu7{T5%rB!xCp%AQ$S`*08fthO%0}KyEx@ zw^`d<|HBetSs?FqL^7+)Whkrl3-lXz!^%9I*Z&hlNT3&pd`|zN^lxso`Je9o3nm0c zB#`zrV$ZqVZnx`sys*)|k2IqAg-T#3khe9WL`ObH|16n@IOby%NG(TKq9yYfAD@_; F<{QoHq!<7I diff --git a/src/base_circuitpython/neopixel_write.py b/src/base_circuitpython/neopixel_write.py deleted file mode 100644 index 341215f35..000000000 --- a/src/base_circuitpython/neopixel_write.py +++ /dev/null @@ -1,55 +0,0 @@ -# overriden neopixel_write library to write to frontend - -# original implementation docs for neopixel_write: -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/neopixel_write/__init__.html - - -import pathlib -import sys -import os - -import common -from adafruit_circuitplayground import cp -import base_cp_constants as CONSTANTS - - -def neopixel_write(gpio, buf): - """Write buf out on the given DigitalInOut.""" - - if len(tuple(buf)) > 0: - # if we are explicitly given - # the clue pin, that means that - # the clue is definitely the active device - # because the constructor for the - # clue is what calls neopixel - # with the clue pin argument - if gpio.pin != CONSTANTS.CLUE_PIN: - send_cpx(buf) - send_clue(buf) - - -def send_clue(buf): - sendable_json = {CONSTANTS.PIXELS: tuple(buf)} - if common.utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - sendable_json, CONSTANTS.CLUE - ) - else: - common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) - - -def send_cpx(buf): - buf_list = list(buf) - ret_list = [] - temp_list = [] - for idx, elem in enumerate(buf_list): - if idx % 3 == 0 and idx != 0: - ret_list.append(tuple(temp_list)) - temp_list = [] - temp_list.append(elem) - - if len(temp_list) == 3: - ret_list.append(tuple(temp_list)) - - max_index = min(len(ret_list), 10) - cp.pixels[0:max_index] = ret_list[0:max_index] diff --git a/src/base_circuitpython/pulseio.py b/src/base_circuitpython/pulseio.py deleted file mode 100644 index f69a45836..000000000 --- a/src/base_circuitpython/pulseio.py +++ /dev/null @@ -1,16 +0,0 @@ -from common import utils - - -class PulseIn: - def __init__(self, pin, maxlen=2, *, idle_state=False): - utils.print_for_unimplemented_functions(PulseIn.__init__.__qualname__) - - -class PulseOut: - def __init__(self, carrier): - utils.print_for_unimplemented_functions(PulseOut.__init__.__qualname__) - - -class PWMOut: - def __init__(self, pin, *, duty_cycle=0, frequency=500, variable_frequency=False): - utils.print_for_unimplemented_functions(PWMOut.__init__.__qualname__) diff --git a/src/base_circuitpython/terminal_handler.py b/src/base_circuitpython/terminal_handler.py deleted file mode 100644 index 83130f0b0..000000000 --- a/src/base_circuitpython/terminal_handler.py +++ /dev/null @@ -1,108 +0,0 @@ -from PIL import Image -import threading -import os -import base64 -from io import BytesIO -import time -import collections -import pathlib - -from common import utils -import board -import base_cp_constants as CONSTANTS -import displayio -import terminalio - - -class Terminal: - def __init__(self): - self.__output_values = collections.deque() - self.__lock = threading.Lock() - self.__abs_path = pathlib.Path(__file__).parent.absolute() - self.__base_img = Image.open( - os.path.join(self.__abs_path, CONSTANTS.IMG_DIR_NAME, CONSTANTS.BLINKA_BMP) - ) - - def __create_newline(self, str_list): - self.__lock.acquire() - for string in str_list: - self.__output_values.appendleft(string) - - over = len(self.__output_values) - CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX - - # max CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX items in output_values - if over > 0: - for i in range(over): - self.__output_values.pop() - - self.__lock.release() - - def __draw(self, no_verif=False): - - import adafruit_display_text.label - - # no need to check the active group within the Group class - # since the caller of draw already did - splash = displayio.Group( - max_size=20, check_active_group_ref=False, auto_write=False - ) - - self.__lock.acquire() - - # since the text starts from the bottom, - # we need to find an offset if there are empty spots - - # handling of output_values already ensures that there are - # max CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX items in output_values deque - num_empty_slots = CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX - len( - self.__output_values - ) - curr_y = CONSTANTS.CLUE_TERMINAL_Y_OFFSET + ( - CONSTANTS.CLUE_TERMINAL_LINE_HEIGHT * num_empty_slots - ) - for output_val in reversed(self.__output_values): - if len(output_val): - text_area = adafruit_display_text.label.Label( - terminalio.FONT, text=output_val, line_spacing=1.25 - ) - - text_area.y = curr_y - text_area.x = CONSTANTS.CLUE_TERMINAL_X_OFFSET - splash.append(text_area) - - curr_y += CONSTANTS.CLUE_TERMINAL_LINE_HEIGHT - - self.__lock.release() - - splash._Group__draw(img=self.__base_img.copy()) - - def add_str_to_terminal(self, curr_display_string=""): - - line_break_amt = CONSTANTS.CLUE_TERMINAL_LINE_BREAK_AMT - - # characters until forced newline - newline_expected_val = line_break_amt - out_str = "" - new_strs = [] - for idx, d in enumerate(curr_display_string): - # handle custom or forced newline - if d == "\n" or newline_expected_val == 0: - new_strs.append(out_str) - out_str = "" - newline_expected_val = line_break_amt - - # if it was a custom newline, no longer need to - # process the character - if d == "\n": - continue - else: - newline_expected_val -= 1 - out_str += d - new_strs.append(out_str) - - self.__create_newline(new_strs) - - # only go ahead to draw the screen - # if the terminal is actively on the screen - if board.DISPLAY.active_group == None: - self.__draw() diff --git a/src/base_circuitpython/terminalio.py b/src/base_circuitpython/terminalio.py deleted file mode 100644 index 58abb7fc4..000000000 --- a/src/base_circuitpython/terminalio.py +++ /dev/null @@ -1,15 +0,0 @@ -# overriden terminalio library, which uses -# adafruit_bitmap_font to load the default font - -# original implementation docs for terminalio: -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/terminalio/__init__.html - -from adafruit_bitmap_font import bitmap_font # pylint: disable=wrong-import-position - -import os -import pathlib - -abs_path = pathlib.Path(__file__).parent.absolute() - -# load default font -FONT = bitmap_font.load_font(os.path.join(abs_path, "fonts", "ter-u12n.bdf")) diff --git a/src/base_circuitpython/test/__init__.py b/src/base_circuitpython/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/base_circuitpython/test/test_terminal_handler.py b/src/base_circuitpython/test/test_terminal_handler.py deleted file mode 100644 index 22a8986af..000000000 --- a/src/base_circuitpython/test/test_terminal_handler.py +++ /dev/null @@ -1,61 +0,0 @@ -import pytest - -import base_circuitpython.terminal_handler -from common import utils -from unittest import mock - - -class TestTerminal(object): - def setup_method(self): - - utils.send_to_simulator = mock.Mock() - - @pytest.mark.parametrize( - "str_vals", - [ - (["potato", "Lorem ipsum"]), - ([""]), - ([".......", "123456", "", "test"]), - (["123456789 123456789 123456789 1234567"]), - ], - ) - def test_single_line(self, str_vals): - self.terminal = base_circuitpython.terminal_handler.Terminal() - for s in str_vals: - self.terminal.add_str_to_terminal(s) - - result = list(self.terminal._Terminal__output_values) - result.reverse() - - # output should just be the reversed version since all lines - # don't have newline or exceed 37 characters - assert str_vals == result - - @pytest.mark.parametrize( - "str_vals, expected", - [ - ( - ["\nCode done running. Waiting for reload."], - [".", "Code done running. Waiting for reload", ""], - ), - ( - ["TESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTEST"], - ["ESTTESTTEST", "TESTTESTTESTTESTTESTTESTTESTTESTTESTT"], - ), - ( - ["\nCode done running. Waiting for reload.", "........."], - [".........", ".", "Code done running. Waiting for reload", ""], - ), - ( - ["TEST TEST TEST TEST TEST ", "..."], - ["...", " ", "TEST TEST TEST TEST TEST "], - ), - ], - ) - def test_multiline(self, str_vals, expected): - self.terminal = base_circuitpython.terminal_handler.Terminal() - for s in str_vals: - self.terminal.add_str_to_terminal(s) - - result = list(self.terminal._Terminal__output_values) - assert result == expected diff --git a/src/check_if_venv.py b/src/check_if_venv.py deleted file mode 100644 index 45fd3dd2b..000000000 --- a/src/check_if_venv.py +++ /dev/null @@ -1,11 +0,0 @@ -# from https://stackoverflow.com/questions/1871549/determine-if-python-is-running-inside-virtualenv -import sys - -isVenv = hasattr(sys, "real_prefix") or ( - hasattr(sys, "base_prefix") and sys.base_prefix != sys.prefix -) - -# prints result for frontend to read -# 1 -> is a venv -# 0 -> is NOT a venv -print(int(isVenv)) diff --git a/src/check_python_dependencies.py b/src/check_python_dependencies.py deleted file mode 100644 index 6c51463c7..000000000 --- a/src/check_python_dependencies.py +++ /dev/null @@ -1,36 +0,0 @@ -# from https://stackoverflow.com/questions/16294819/check-if-my-python-has-all-required-packages -import sys -import pkg_resources -import python_constants as CONSTANTS - - -def check_for_dependencies(): - with open(f"{sys.path[0]}/requirements.txt") as f: - dependencies = [x.strip() for x in f.readlines()] - - cleaned_dependencies = [] - - # getting names of packages from tar.gz files - - # FOR PRE-DOWNLOADED TAR.GZ FILES, ENSURE THAT - # THERE ARE NO DASHES AFTER THE ONE THAT IS - # AT THE END OF THE PACKAGE NAME. - # So, it would be: - # {package_name}-{trailing_verison_info}.tar.gz - for dep in dependencies: - if len(dep) > 7 and dep.strip()[-7:] == ".tar.gz": - last_dash = dep.rfind("-") - dep = dep[:last_dash] - - cleaned_dependencies.append(dep) - - # here, if a dependency is not met, a DistributionNotFound or VersionConflict - # exception is caught and replaced with a new exception with a clearer description. - try: - pkg_resources.require(cleaned_dependencies) - except (pkg_resources.DistributionNotFound, pkg_resources.VersionConflict) as e: - raise Exception(CONSTANTS.DEPEND_ERR) - - -if __name__ == "__main__": - check_for_dependencies() diff --git a/src/clue/__init__.py b/src/clue/__init__.py deleted file mode 100644 index c34e9688b..000000000 --- a/src/clue/__init__.py +++ /dev/null @@ -1 +0,0 @@ -import base_circuitpython diff --git a/src/clue/adafruit_clue.py b/src/clue/adafruit_clue.py deleted file mode 100644 index 059573021..000000000 --- a/src/clue/adafruit_clue.py +++ /dev/null @@ -1,852 +0,0 @@ -# The MIT License (MIT) -# -# Copyright (c) 2020 Kattni Rembor for Adafruit Industries -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -""" -`adafruit_clue` -================================================================================ - -A high level library representing all the features of the Adafruit CLUE. - - -* Author(s): Kattni Rembor - -Implementation Notes --------------------- - -**Hardware:** - -.. "* `Adafruit CLUE - nRF52840 Express with Bluetooth LE `_" - -**Software and Dependencies:** - -* Adafruit CircuitPython firmware for the supported boards: - https://github.com/adafruit/circuitpython/releases - - * Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice - * Adafruit's Register library: https://github.com/adafruit/Adafruit_CircuitPython_Register - * Adafruit's LSM6DS CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_LSM6DS - * Adafruit's LIS3MDL CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_LIS3MDL - * Adafruit's APDS9960 CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_APDS9960 - * Adafruit's BMP280 CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_BMP280 - * Adafruit's SHT31D CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_SHT31D - * Adafruit's NeoPixel CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_NeoPixel -""" - -import common -from base_circuitpython import base_cp_constants as CONSTANTS -import neopixel -import time -import array -import math -from PIL import Image -import pathlib -import sys -import os -import board - -abs_path = pathlib.Path(__file__).parent.absolute() -sys.path.insert(0, os.path.join(abs_path)) - -# REVISED VERSION OF THE ADAFRUIT CLUE LIBRARY FOR DSX - -__version__ = "0.0.0-auto.0" -__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_CLUE.git" - - -class _ClueSimpleTextDisplay: - """Easily display lines of text on CLUE display.""" - - def __init__( - self, - title=None, - title_color=0xFFFFFF, - title_scale=1, # pylint: disable=too-many-arguments - text_scale=1, - font=None, - colors=None, - ): - import displayio - import terminalio - from adafruit_display_text import label - - if not colors: - colors = ( - Clue.VIOLET, - Clue.GREEN, - Clue.RED, - Clue.CYAN, - Clue.ORANGE, - Clue.BLUE, - Clue.MAGENTA, - Clue.SKY, - Clue.YELLOW, - Clue.PURPLE, - ) - - self._display = board.DISPLAY - self._colors = colors - self._label = label - self._font = terminalio.FONT - if font: - self._font = font - self.text_scale = text_scale - self.text_group = displayio.Group(max_size=20, scale=self.text_scale) - if title: - # Fail gracefully if title is longer than 60 characters. - if len(title) > 60: - raise ValueError("Title must be 60 characters or less.") - - title = label.Label( - self._font, - text=title, - max_glyphs=60, - color=title_color, - scale=title_scale, - ) - title.x = 0 - title.y = 8 * self.text_scale - self._y = title.y + 18 * self.text_scale - - self.text_group.append(title) - else: - self._y = 3 * self.text_scale - - self._lines = [] - for num in range(1): - self._lines.append(self.add_text_line(color=colors[num % len(colors)])) - - def __getitem__(self, item): - """Fetch the Nth text line Group""" - if len(self._lines) - 1 < item: - for _ in range(item - (len(self._lines) - 1)): - self._lines.append( - self.add_text_line(color=self._colors[item % len(self._colors)]) - ) - return self._lines[item] - - def add_text_line(self, color=0xFFFFFF): - """Adds a line on the display of the specified color and returns the label object.""" - text_label = self._label.Label(self._font, text="", max_glyphs=45, color=color) - text_label.x = 0 - text_label.y = self._y - self._y = text_label.y + 13 * self.text_scale - self.text_group.append(text_label) - - return text_label - - def show(self): - """Call show() to display the data list.""" - self._display.show(self.text_group) - - def show_terminal(self): - """Revert to terminalio screen.""" - self._display.show(None) - - -class Clue: # pylint: disable=too-many-instance-attributes, too-many-public-methods - """Represents a single CLUE.""" - - # Color variables available for import. - RED = (255, 0, 0) - YELLOW = (255, 255, 0) - ORANGE = (255, 150, 0) - GREEN = (0, 255, 0) - TEAL = (0, 255, 120) - CYAN = (0, 255, 255) - BLUE = (0, 0, 255) - PURPLE = (180, 0, 255) - MAGENTA = (255, 0, 150) - WHITE = (255, 255, 255) - BLACK = (0, 0, 0) - - GOLD = (255, 222, 30) - PINK = (242, 90, 255) - AQUA = (50, 255, 255) - JADE = (0, 255, 40) - AMBER = (255, 100, 0) - VIOLET = (255, 0, 255) - SKY = (0, 180, 255) - - RAINBOW = (RED, ORANGE, YELLOW, GREEN, BLUE, PURPLE) - - def __init__(self): - self.__state = {} - self.__state[CONSTANTS.CLUE_STATE.BUTTON_A] = False - self.__state[CONSTANTS.CLUE_STATE.BUTTON_B] = False - self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS] = set() - self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE] = 1013.25 - self.__state[CONSTANTS.CLUE_STATE.TEMPERATURE] = 0 - self.__state[CONSTANTS.CLUE_STATE.PROXIMITY] = 0 - self.__state[CONSTANTS.CLUE_STATE.GESTURE] = "" - self.__state[CONSTANTS.CLUE_STATE.HUMIDITY] = 0 - self.__state[CONSTANTS.CLUE_STATE.PRESSURE] = 1013 - self.__state[CONSTANTS.CLUE_STATE.PIXEL] = neopixel.NeoPixel( - pin=CONSTANTS.CLUE_PIN, n=1, pixel_order=neopixel.RGB - ) - # Accelerometer - self.__state[CONSTANTS.CLUE_STATE.MOTION_X] = 0 - self.__state[CONSTANTS.CLUE_STATE.MOTION_Y] = 0 - self.__state[CONSTANTS.CLUE_STATE.MOTION_Z] = 0 - # Light/color sensor - self.__state[CONSTANTS.CLUE_STATE.LIGHT_R] = 0 - self.__state[CONSTANTS.CLUE_STATE.LIGHT_G] = 0 - self.__state[CONSTANTS.CLUE_STATE.LIGHT_B] = 0 - self.__state[CONSTANTS.CLUE_STATE.LIGHT_C] = 0 - # Magnetometer - self.__state[CONSTANTS.CLUE_STATE.MAGNET_X] = 0 - self.__state[CONSTANTS.CLUE_STATE.MAGNET_Y] = 0 - self.__state[CONSTANTS.CLUE_STATE.MAGNET_Z] = 0 - # Gyroscope - self.__state[CONSTANTS.CLUE_STATE.GYRO_X] = 0 - self.__state[CONSTANTS.CLUE_STATE.GYRO_Y] = 0 - self.__state[CONSTANTS.CLUE_STATE.GYRO_Z] = 0 - # LEDs - self.__state[CONSTANTS.CLUE_STATE.RED_LED] = False - self.__state[CONSTANTS.CLUE_STATE.WHITE_LEDS] = False - - self.button_mapping = { - CONSTANTS.CLUE_STATE.BUTTON_A: "A", - CONSTANTS.CLUE_STATE.BUTTON_B: "B", - } - self.display = board.DISPLAY - - @property - def button_a(self): - """``True`` when Button A is pressed. ``False`` if not. - This example prints when button A is pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.button_a: - print("Button A pressed") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_BUTTON_A - ) - return self.__state[CONSTANTS.CLUE_STATE.BUTTON_A] - - @property - def button_b(self): - """``True`` when Button B is pressed. ``False`` if not. - This example prints when button B is pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.button_b: - print("Button B pressed") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_BUTTON_B - ) - return self.__state[CONSTANTS.CLUE_STATE.BUTTON_B] - - @property - def were_pressed(self): - """Returns a set of the buttons that have been pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print(clue.were_pressed) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_WERE_PRESSED - ) - ret = self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS].copy() - self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS].clear() - return ret - - @property - def acceleration(self): - """Obtain acceleration data from the x, y and z axes. - This example prints the values. Try moving the board to see how the printed values change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Accel: {:.2f} {:.2f} {:.2f}".format(*clue.acceleration)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_ACCELERATION - ) - return ( - self.__state[CONSTANTS.CLUE_STATE.MOTION_X], - self.__state[CONSTANTS.CLUE_STATE.MOTION_Y], - self.__state[CONSTANTS.CLUE_STATE.MOTION_Z], - ) - - def shake(self, shake_threshold=30, avg_count=10, total_delay=0.1): - """Detect when the accelerometer is shaken. Optional parameters: - :param shake_threshold: Increase or decrease to change shake sensitivity. This - requires a minimum value of 10. 10 is the total - acceleration if the board is not moving, therefore - anything less than 10 will erroneously report a constant - shake detected. (Default 30) - :param avg_count: The number of readings taken and used for the average - acceleration. (Default 10) - :param total_delay: The total time in seconds it takes to obtain avg_count - readings from acceleration. (Default 0.1) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SHAKE - ) - is_shaken = self.__state[CONSTANTS.CLUE_STATE.GESTURE] == CONSTANTS.SHAKE - return is_shaken - - @property - def color(self): - """The red, green, blue, and clear light values. (r, g, b, c) - This example prints the values. Try holding something up to the sensor to see the values - change. Works best with white LEDs enabled. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Color: R: {} G: {} B: {} C: {}".format(*clue.color)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_COLOR - ) - return ( - self.__state[CONSTANTS.CLUE_STATE.LIGHT_R], - self.__state[CONSTANTS.CLUE_STATE.LIGHT_G], - self.__state[CONSTANTS.CLUE_STATE.LIGHT_B], - self.__state[CONSTANTS.CLUE_STATE.LIGHT_C], - ) - - @property - def temperature(self): - """The temperature in degrees Celsius. - This example prints the value. Try touching the sensor to see the value change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - print("Temperature: {:.1f}C".format(clue.temperature)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TEMPERATURE - ) - return self.__state[CONSTANTS.CLUE_STATE.TEMPERATURE] - - @property - def magnetic(self): - """Obtain x, y, z magnetic values in microteslas. - This example prints the values. Try moving the board to see how the printed values change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Magnetic: {:.3f} {:.3f} {:.3f}".format(*clue.magnetic)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_MAGNETIC - ) - return ( - self.__state[CONSTANTS.CLUE_STATE.MAGNET_X], - self.__state[CONSTANTS.CLUE_STATE.MAGNET_Y], - self.__state[CONSTANTS.CLUE_STATE.MAGNET_Z], - ) - - @property - def proximity(self): - """A relative proximity to the sensor in values from 0 - 255. - This example prints the value. Try moving your hand towards and away from the front of the - board to see how the printed values change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Proximity: {}".format(clue.proximity)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_PROXIMITY - ) - return self.__state[CONSTANTS.CLUE_STATE.PROXIMITY] - - @property - def gyro(self): - """Obtain x, y, z angular velocity values in degrees/second. - This example prints the values. Try moving the board to see how the printed values change. - print("Gyro: {:.2f} {:.2f} {:.2f}".format(*clue.gyro)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_GYRO - ) - return ( - self.__state[CONSTANTS.CLUE_STATE.GYRO_X], - self.__state[CONSTANTS.CLUE_STATE.GYRO_Y], - self.__state[CONSTANTS.CLUE_STATE.GYRO_Z], - ) - - @property - def gesture(self): - """A gesture code if gesture is detected. Shows ``0`` if no gesture detected. - ``1`` if an UP gesture is detected, ``2`` if DOWN, ``3`` if LEFT, and ``4`` if RIGHT. - This example prints the gesture values. Try moving your hand up, down, left or right over - the sensor to see the value change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Gesture: {}".format(clue.gesture)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_GESTURE - ) - gesture_mapping = {"": 0, "up": 1, "down": 2, "left": 3, "right": 4} - return gesture_mapping.get(self.__state[CONSTANTS.CLUE_STATE.GESTURE], 0) - - @property - def humidity(self): - """The measured relative humidity in percent. - This example prints the value. Try breathing on the sensor to see the values change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Humidity: {:.1f}%".format(clue.humidity)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_HUMIDITY - ) - return self.__state[CONSTANTS.CLUE_STATE.HUMIDITY] - - @property - def pressure(self): - """The barometric pressure in hectoPascals. - This example prints the value. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - print("Pressure: {:.3f}hPa".format(clue.pressure)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_PRESSURE - ) - return self.__state[CONSTANTS.CLUE_STATE.PRESSURE] - - @property - def altitude(self): - """The altitude in meters based on the sea level pressure at your location. You must set - ``sea_level_pressure`` to receive an accurate reading. - This example prints the value. Try moving the board vertically to see the value change. - .. code-block:: python - from adafruit_clue import clue - clue.sea_level_pressure = 1015 - print("Altitude: {:.1f}m".format(clue.altitude)) - """ - # National Oceanic and Atmospheric Administration (NOAA) formula for converting atmospheric pressure to pressure altitude. - OUTSIDE_MULTIPLER_CONSTANT = 44330 - POWER_CONSTANT = 0.1903 - WHOLE_CONSTANT = 1 - - altitude = OUTSIDE_MULTIPLER_CONSTANT * ( - WHOLE_CONSTANT - - math.pow( - self.__state[CONSTANTS.CLUE_STATE.PRESSURE] - / self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE], - POWER_CONSTANT, - ) - ) - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_ALTITUDE - ) - return altitude - - @property - def sea_level_pressure(self): - """Set to the pressure at sea level at your location, before reading altitude for - the most accurate altitude measurement. - This example prints the value. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - clue.sea_level_pressure = 1015 - print("Pressure: {:.3f}hPa".format(clue.pressure)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SEA_LEVEL_PRESSURE - ) - return self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE] - - @sea_level_pressure.setter - def sea_level_pressure(self, value): - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SEA_LEVEL_PRESSURE - ) - self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE] = value - - @property - def pixel(self): - """The NeoPixel RGB LED. - This example turns the NeoPixel purple. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - clue.pixel.fill((255, 0, 255)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_PIXEL - ) - return self.__state[CONSTANTS.CLUE_STATE.PIXEL] - - @property - def touch_0(self): - """Not Implemented! - - Detect touch on capacitive touch pad 0. - .. image :: ../docs/_static/pad_0.jpg - :alt: Pad 0 - This example prints when pad 0 is touched. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.touch_0: - print("Touched pad 0") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TOUCH - ) - common.utils.print_for_unimplemented_functions("touch_0") - - @property - def touch_1(self): - """Not Implemented! - - Detect touch on capacitive touch pad 1. - .. image :: ../docs/_static/pad_1.jpg - :alt: Pad 1 - This example prints when pad 1 is touched. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.touch_1: - print("Touched pad 1") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TOUCH - ) - common.utils.print_for_unimplemented_functions("touch_1") - - @property - def touch_2(self): - """Not Implemented! - - Detect touch on capacitive touch pad 2. - .. image :: ../docs/_static/pad_2.jpg - :alt: Pad 2 - This example prints when pad 2 is touched. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.touch_2: - print("Touched pad 2") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TOUCH - ) - common.utils.print_for_unimplemented_functions("touch_2") - - @property - def white_leds(self): - """The red led next to the USB plug labeled LED. - .. image :: ../docs/_static/white_leds.jpg - :alt: White LEDs - This example turns on the white LEDs. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - clue.white_leds = True - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_WHITE_LEDS - ) - return self.__state[CONSTANTS.CLUE_STATE.WHITE_LEDS] - - @white_leds.setter - def white_leds(self, value): - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_WHITE_LEDS - ) - self.__set_leds(CONSTANTS.CLUE_STATE.WHITE_LEDS, value) - - @property - def red_led(self): - """The red led next to the USB plug labeled LED. - .. image :: ../docs/_static/red_led.jpg - :alt: Red LED - This example turns on the red LED. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - clue.red_led = True - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_RED_LED - ) - return self.__state[CONSTANTS.CLUE_STATE.RED_LED] - - @red_led.setter - def red_led(self, value): - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_RED_LED - ) - self.__set_leds(CONSTANTS.CLUE_STATE.RED_LED, value) - - def play_tone(self, frequency, duration): - """ Not Implemented! - Produce a tone using the speaker. Try changing frequency to change - the pitch of the tone. - :param int frequency: The frequency of the tone in Hz - :param float duration: The duration of the tone in seconds - .. image :: ../docs/_static/speaker.jpg - :alt: Speaker - This example plays a 880 Hz tone for a duration of 1 second. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - clue.play_tone(880, 1) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions(Clue.play_tone.__name__) - - def start_tone(self, frequency): - """ Not Implemented! - Produce a tone using the speaker. Try changing frequency to change - the pitch of the tone. - :param int frequency: The frequency of the tone in Hz - .. image :: ../docs/_static/speaker.jpg - :alt: Speaker - This example plays a 523Hz tone when button A is pressed and a 587Hz tone when button B is - pressed, only while the buttons are being pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.button_a: - clue.start_tone(523) - elif clue.button_b: - clue.start_tone(587) - else: - clue.stop_tone() - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions(Clue.start_tone.__name__) - - def stop_tone(self): - """ Not Implemented! - Use with start_tone to stop the tone produced. - .. image :: ../docs/_static/speaker.jpg - :alt: Speaker - This example plays a 523Hz tone when button A is pressed and a 587Hz tone when button B is - pressed, only while the buttons are being pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.button_a: - clue.start_tone(523) - elif clue.button_b: - clue.start_tone(587) - else: - clue.stop_tone() - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions(Clue.stop_tone.__name__) - - @property - def sound_level(self): - """Not Implemented! - Obtain the sound level from the microphone (sound sensor). - .. image :: ../docs/_static/microphone.jpg - :alt: Microphone (sound sensor) - This example prints the sound levels. Try clapping or blowing on - the microphone to see the levels change. - .. code-block:: python - from adafruit_clue import clue - while True: - print(clue.sound_level) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions("sound_level") - - def loud_sound(self, sound_threshold=200): - """Not Implemented! - Utilise a loud sound as an input. - :param int sound_threshold: Threshold sound level must exceed to return true (Default: 200) - .. image :: ../docs/_static/microphone.jpg - :alt: Microphone (sound sensor) - This example turns the NeoPixel LED blue each time you make a loud sound. - Try clapping or blowing onto the microphone to trigger it. - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.loud_sound(): - clue.pixel.fill((0, 50, 0)) - else: - clue.pixel.fill(0) - You may find that the code is not responding how you would like. - If this is the case, you can change the loud sound threshold to - make it more or less responsive. Setting it to a higher number - means it will take a louder sound to trigger. Setting it to a - lower number will take a quieter sound to trigger. The following - example shows the threshold being set to a higher number than - the default. - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.loud_sound(sound_threshold=300): - clue.pixel.fill((0, 50, 0)) - else: - clue.pixel.fill(0) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions(Clue.loud_sound.__name__) - - @staticmethod - def simple_text_display( - title=None, - title_color=(255, 255, 255), - title_scale=1, # pylint: disable=too-many-arguments - text_scale=1, - font=None, - colors=None, - ): - """Display lines of text on the CLUE display. Lines of text are created in order as shown - in the example below. If you skip a number, the line will be shown blank on the display, - e.g. if you include ``[0]`` and ``[2]``, the second line on the display will be empty, and - the text specified for lines 0 and 2 will be displayed on the first and third line. - Remember, Python begins counting at 0, so the first line on the display is 0 in the code. - - Setup occurs before the loop. For data to be dynamically updated on the display, you must - include the data call in the loop by using ``.text =``. For example, if setup is saved as - ``clue_data = display_clue_data()`` then ``clue_data[0].text = clue.proximity`` must be - inside the ``while True:`` loop for the proximity data displayed to update as the - values change. You must call ``show()`` at the end of the list for anything to display. - See example below for usage. - - :param str title: The title displayed above the data. Set ``title="Title text"`` to provide - a title. Defaults to None. - :param title_color: The color of the title. Not necessary if no title is provided. Defaults - to white (255, 255, 255). - :param int title_scale: Scale the size of the title. Not necessary if no title is provided. - Defaults to 1. - :param int text_scale: Scale the size of the data lines. Scales the title as well. - Defaults to 1. - :param str font: The font to use to display the title and data. Defaults to built in - ``terminalio.FONT``. - :param colors: A list of colors for the lines of data on the display. If you provide a - single color, all lines will be that color. Otherwise it will cycle through - the list you provide if the list is less than the number of lines displayed. - Default colors are used if ``colors`` is not set. For example, if creating - two lines of data, ``colors=((255, 255, 255), (255, 0, 0))`` would set the - first line white and the second line red, and if you created four lines of - data with the same setup, it would alternate white and red. - - .. image :: ../docs/_static/display_clue_data.jpg - :alt: Display Clue Data demo - - This example displays three lines with acceleration, gyro and magnetic data on the display. - Remember to call ``show()`` after the list to update the display. - - .. code-block:: python - - from adafruit_clue import clue - - clue_data = clue.simple_text_display(title="CLUE Sensor Data!", title_scale=2) - - while True: - clue_data[0].text = "Acceleration: {:.2f} {:.2f} {:.2f}".format(*clue.acceleration) - clue_data[1].text = "Gyro: {:.2f} {:.2f} {:.2f}".format(*clue.gyro) - clue_data[2].text = "Magnetic: {:.3f} {:.3f} {:.3f}".format(*clue.magnetic) - clue_data.show() - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TEXT_DISPLAY - ) - return _ClueSimpleTextDisplay( - title=title, - title_color=title_color, - title_scale=title_scale, - text_scale=text_scale, - font=font, - colors=colors, - ) - - def update_state(self, new_state): - for event in new_state.keys(): - if event in CONSTANTS.EXPECTED_INPUT_BUTTONS: - self.__update_button(event, new_state.get(event)) - elif event in CONSTANTS.ALL_EXPECTED_INPUT_EVENTS: - if self.__state[event] != new_state[event]: - self.__state[event] = new_state.get(event) - - # helpers - def __update_button(self, button, value): - if value: - self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS].add( - self.button_mapping[button] - ) - self.__state[button] = value - - def __set_leds(self, led, value): - value = bool(value) - self.__state[led] = value - sendable_json = {led: value} - if common.utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - sendable_json, CONSTANTS.CLUE - ) - else: - common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) - - -clue = Clue() # pylint: disable=invalid-name -"""Object that is automatically created on import. - - To use, simply import it from the module: - - .. code-block:: python - - from adafruit_clue import clue -""" diff --git a/src/clue/adafruit_display_text/label.py b/src/clue/adafruit_display_text/label.py deleted file mode 100644 index f7bab0b7f..000000000 --- a/src/clue/adafruit_display_text/label.py +++ /dev/null @@ -1,280 +0,0 @@ -# The MIT License (MIT) -# -# Copyright (c) 2019 Scott Shawcroft for Adafruit Industries LLC -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -""" -`adafruit_display_text.label` -==================================================== - -Displays text labels using CircuitPython's displayio. - -* Author(s): Scott Shawcroft - -Implementation Notes --------------------- - -**Hardware:** - -**Software and Dependencies:** - -* Adafruit CircuitPython firmware for the supported boards: - https://github.com/adafruit/circuitpython/releases - -""" - -import displayio - -__version__ = "0.0.0-auto.0" -__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git" - - -class Label(displayio.Group): - """A label displaying a string of text. The origin point set by ``x`` and ``y`` - properties will be the left edge of the bounding box, and in the center of a M - glyph (if its one line), or the (number of lines * linespacing + M)/2. That is, - it will try to have it be center-left as close as possible. - - :param Font font: A font class that has ``get_bounding_box`` and ``get_glyph``. - Must include a capital M for measuring character size. - :param str text: Text to display - :param int max_glyphs: The largest quantity of glyphs we will display - :param int color: Color of all text in RGB hex - :param double line_spacing: Line spacing of text to display""" - - def __init__( - self, - font, - *, - x=0, - y=0, - text=None, - max_glyphs=None, - color=0xFFFFFF, - background_color=None, - line_spacing=1.25, - **kwargs - ): - if not max_glyphs and not text: - raise RuntimeError("Please provide a max size, or initial text") - if not max_glyphs: - max_glyphs = len(text) - super().__init__(max_size=max_glyphs, auto_write=False, **kwargs) - self.width = max_glyphs - self.font = font - self._text = None - self._anchor_point = (0, 0) - self.x = x - self.y = y - - self.palette = displayio.Palette(2) - if background_color is not None: - self.palette[0] = background_color - self.palette.make_opaque(0) - self._transparent_background = False - else: - self.palette[0] = 0 - self.palette.make_transparent(0) - self._transparent_background = True - self.palette[1] = color - - bounds = self.font.get_bounding_box() - self.height = bounds[1] - self._line_spacing = line_spacing - self._boundingbox = None - - if text is not None: - self._update_text(str(text)) - - def _update_text(self, new_text): # pylint: disable=too-many-locals - x = 0 - y = 0 - i = 0 - old_c = 0 - y_offset = int( - ( - self.font.get_glyph(ord("M")).height - - new_text.count("\n") * self.height * self.line_spacing - ) - / 2 - ) - # print("y offset from baseline", y_offset) - left = right = top = bottom = 0 - for character in new_text: - if character == "\n": - y += int(self.height * self._line_spacing) - x = 0 - continue - glyph = self.font.get_glyph(ord(character)) - if not glyph: - continue - right = max(right, x + glyph.width) - if y == 0: # first line, find the Ascender height - top = min(top, -glyph.height + y_offset) - bottom = max(bottom, y - glyph.dy + y_offset) - position_y = y - glyph.height - glyph.dy + y_offset - position_x = x + glyph.dx - if ( - not self._text - or old_c >= len(self._text) - or character != self._text[old_c] - ): - try: - face = displayio.TileGrid( - glyph.bitmap, - pixel_shader=self.palette, - default_tile=glyph.tile_index, - tile_width=glyph.width, - tile_height=glyph.height, - position=(position_x, position_y), - ) - except TypeError: - face = displayio.TileGrid( - glyph.bitmap, - pixel_shader=self.palette, - default_tile=glyph.tile_index, - tile_width=glyph.width, - tile_height=glyph.height, - x=position_x, - y=position_y, - ) - if i < len(self): - self[i] = face - else: - self.append(face) - elif self._text and character == self._text[old_c]: - try: - self[i].position = (position_x, position_y) - except AttributeError: - self[i].x = position_x - self[i].y = position_y - - x += glyph.shift_x - - # TODO skip this for control sequences or non-printables. - i += 1 - old_c += 1 - # skip all non-prinables in the old string - while ( - self._text - and old_c < len(self._text) - and ( - self._text[old_c] == "\n" - or not self.font.get_glyph(ord(self._text[old_c])) - ) - ): - old_c += 1 - # Remove the rest - while len(self) > i: - self.pop() - self._text = new_text - self._boundingbox = (left, top, left + right, bottom - top) - - @property - def bounding_box(self): - """An (x, y, w, h) tuple that completely covers all glyphs. The - first two numbers are offset from the x, y origin of this group""" - return tuple(self._boundingbox) - - @property - def line_spacing(self): - """The amount of space between lines of text, in multiples of the font's - bounding-box height. (E.g. 1.0 is the bounding-box height)""" - return self._line_spacing - - @line_spacing.setter - def line_spacing(self, spacing): - if self._line_spacing != spacing: - self._line_spacing = spacing - self._Group__trigger_draw() - - @property - def color(self): - """Color of the text as an RGB hex number.""" - return self.palette[1] - - @color.setter - def color(self, new_color): - self.palette[1] = new_color - self._Group__trigger_draw() - - @property - def background_color(self): - """Color of the background as an RGB hex number.""" - if not self._transparent_background: - return self.palette[0] - return None - - @background_color.setter - def background_color(self, new_color): - if new_color is not None: - self.palette[0] = new_color - self.palette.make_opaque(0) - self._transparent_background = False - else: - self.palette[0] = 0 - self.palette.make_transparent(0) - self._transparent_background = True - - self._Group__trigger_draw() - - @property - def text(self): - """Text to display.""" - return self._text - - @text.setter - def text(self, new_text): - # APR 2, 2O2O -> - # Added manual trigger to update text since - # on-screen text updating is a lot faster this way. - - # Previously, the group was set to auto_write=True - # and each letter in the group was individually - # drawn and sent to the front-end display. - if new_text != self._text: - self._update_text(str(new_text)) - self._Group__trigger_draw() - - @property - def anchor_point(self): - """Point that anchored_position moves relative to. - Tuple with decimal percentage of width and height. - (E.g. (0,0) is top left, (1.0, 0.5): is middle right.)""" - return self._anchor_point - - @anchor_point.setter - def anchor_point(self, new_anchor_point): - if self._anchor_point != new_anchor_point: - self._Group__trigger_draw() - - @property - def anchored_position(self): - """Position relative to the anchor_point. Tuple containing x,y - pixel coordinates.""" - return ( - self.x - self._boundingbox[2] * self._anchor_point[0], - self.y - self._boundingbox[3] * self._anchor_point[1], - ) - - @anchored_position.setter - def anchored_position(self, new_position): - self.x = int(new_position[0] - (self._boundingbox[2] * self._anchor_point[0])) - self.y = int(new_position[1] - (self._boundingbox[3] * self._anchor_point[1])) - self._Group__trigger_draw() diff --git a/src/clue/adafruit_slideshow.py b/src/clue/adafruit_slideshow.py deleted file mode 100644 index aa1fb6b65..000000000 --- a/src/clue/adafruit_slideshow.py +++ /dev/null @@ -1,407 +0,0 @@ -from PIL import Image - -import os -import base64 -from io import BytesIO -from base_circuitpython import base_cp_constants as CONSTANTS -import time -from random import shuffle -import common -import board - -# taken from adafruit -# https://github.com/adafruit/Adafruit_CircuitPython_Slideshow/blob/master/adafruit_slideshow.py - - -class PlayBackOrder: - """Defines possible slideshow playback orders.""" - - # pylint: disable=too-few-public-methods - ALPHABETICAL = 0 - """Orders by alphabetical sort of filenames""" - - RANDOM = 1 - """Randomly shuffles the images""" - # pylint: enable=too-few-public-methods - - -class PlayBackDirection: - """Defines possible slideshow playback directions.""" - - # pylint: disable=too-few-public-methods - BACKWARD = -1 - """The next image is before the current image. When alphabetically sorted, this is towards A.""" - - FORWARD = 1 - """The next image is after the current image. When alphabetically sorted, this is towards Z.""" - # pylint: enable=too-few-public-methods - - -# custom -class SlideShow: - """ - Class for displaying a slideshow of .bmp images on displays. - :param str folder: Specify the folder containing the image files, in quotes. Default is - the root directory, ``"/"``. - :param PlayBackOrder order: The order in which the images display. You can choose random - (``RANDOM``) or alphabetical (``ALPHABETICAL``). Default is - ``ALPHABETICAL``. - :param bool loop: Specify whether to loop the images or play through the list once. `True` - if slideshow will continue to loop, ``False`` if it will play only once. - Default is ``True``. - :param int dwell: The number of seconds each image displays, in seconds. Default is 3. - :param bool fade_effect: Specify whether to include the fade effect between images. ``True`` - tells the code to fade the backlight up and down between image display - transitions. ``False`` maintains max brightness on the backlight between - image transitions. Default is ``True``. - :param bool auto_advance: Specify whether to automatically advance after dwell seconds. ``True`` - if slideshow should auto play, ``False`` if you want to control advancement - manually. Default is ``True``. - :param PlayBackDirection direction: The playback direction. - Example code for Hallowing Express. With this example, the slideshow will play through once - in alphabetical order: - .. code-block:: python - from adafruit_slideshow import PlayBackOrder, SlideShow - import board - import pulseio - slideshow = SlideShow(board.DISPLAY, pulseio.PWMOut(board.TFT_BACKLIGHT), folder="/", - loop=False, order=PlayBackOrder.ALPHABETICAL) - while slideshow.update(): - pass - Example code for Hallowing Express. Sets ``dwell`` to 0 seconds, turns ``auto_advance`` off, - and uses capacitive touch to advance backwards and forwards through the images and to control - the brightness level of the backlight: - .. code-block:: python - from adafruit_slideshow import PlayBackOrder, SlideShow, PlayBackDirection - import touchio - import board - import pulseio - forward_button = touchio.TouchIn(board.TOUCH4) - back_button = touchio.TouchIn(board.TOUCH1) - brightness_up = touchio.TouchIn(board.TOUCH3) - brightness_down = touchio.TouchIn(board.TOUCH2) - slideshow = SlideShow(board.DISPLAY, pulseio.PWMOut(board.TFT_BACKLIGHT), folder="/", - auto_advance=False, dwell=0) - while True: - if forward_button.value: - slideshow.direction = PlayBackDirection.FORWARD - slideshow.advance() - if back_button.value: - slideshow.direction = PlayBackDirection.BACKWARD - slideshow.advance() - if brightness_up.value: - slideshow.brightness += 0.001 - elif brightness_down.value: - slideshow.brightness -= 0.001 - """ - - def __init__( - self, - display, - backlight_pwm=None, - *, - folder=".", - order=PlayBackOrder.ALPHABETICAL, - loop=True, - dwell=3, - fade_effect=True, - auto_advance=True, - direction=PlayBackDirection.FORWARD, - ): - self._BASE_DWELL = 0.3 - self._BASE_DWELL_DARK = 0.7 - self._NO_FADE_TRANSITION_INCREMENTS = 18 - - self.auto_advance = auto_advance - """Enable auto-advance based on dwell time. Set to ``False`` to manually control.""" - - self.loop = loop - """Specifies whether to loop through the images continuously or play through the list once. - ``True`` will continue to loop, ``False`` will play only once.""" - - self.fade_effect = fade_effect - """Whether to include the fade effect between images. ``True`` tells the code to fade the - backlight up and down between image display transitions. ``False`` maintains max - brightness on the backlight between image transitions.""" - - self.dwell = self._BASE_DWELL + dwell - """The number of seconds each image displays, in seconds.""" - - self.direction = direction - """Specify the playback direction. Default is ``PlayBackDirection.FORWARD``. Can also be - ``PlayBackDirection.BACKWARD``.""" - - self.advance = self.__advance_with_fade - """Displays the next image. Returns True when a new image was displayed, False otherwise. - """ - - self.fade_frames = 8 - - # assign new advance method if fade is disabled - if not fade_effect: - self.advance = self.__advance_no_fade - - self._img_start = None - - self.brightness = 1.0 - - # blank screen for start - self._curr_img_handle = Image.new( - "RGBA", (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - - # if path is relative, this makes sure that - # it's relative to the users's code file - abs_path_parent_dir = os.path.abspath( - os.path.join(common.utils.abs_path_to_user_file, os.pardir) - ) - abs_path_folder = os.path.normpath(os.path.join(abs_path_parent_dir, folder)) - - self.folder = abs_path_folder - - # get files within specified directory - self.dirs = os.listdir(self.folder) - - self._order = order - self._curr_img = "" - self._current_image_index = None - - # load images into main queue - self.__load_images() - - display.show(self) - # show the first working image - self.advance() - - common.telemetry.telemetry_py.send_telemetry( - common.telemetry.TelemetryEvent.CLUE_API_SLIDESHOW - ) - - @property - def current_image_name(self): - """Returns the current image name.""" - return self._curr_img - - @property - def order(self): - """Specifies the order in which the images are displayed. Options are random (``RANDOM``) or - alphabetical (``ALPHABETICAL``). Default is ``RANDOM``.""" - return self._order - - @order.setter - def order(self, order): - if order not in [PlayBackOrder.ALPHABETICAL, PlayBackOrder.RANDOM]: - raise ValueError("Order must be either 'RANDOM' or 'ALPHABETICAL'") - - self._order = order - self.__load_images() - - @property - def brightness(self): - """Brightness of the backlight when an image is displaying. Clamps to 0 to 1.0""" - return self._brightness - - @brightness.setter - def brightness(self, brightness): - if brightness < 0: - brightness = 0 - elif brightness > 1.0: - brightness = 1.0 - self._brightness = brightness - - def update(self): - """Updates the slideshow to the next image.""" - now = time.monotonic() - if not self.auto_advance or now - self._img_start < self.dwell: - return True - - return self.advance() - - def __get_next_img(self): - - if self.direction == PlayBackDirection.FORWARD: - if self._current_image_index == None: - self._current_image_index = 0 - else: - self._current_image_index += 1 - - if self._current_image_index >= len(self.dir_imgs): - - if self.loop: - self._current_image_index = 0 - self.__load_images() - else: - self._current_image_index = len(self.dir_imgs) - 10 - return "" - - else: - if self._current_image_index == None: - self._current_image_index = len(self.dir_imgs) - 1 - else: - self._current_image_index -= 1 - - if self._current_image_index < 0: - if self.loop: - self._current_image_index = len(self.dir_imgs) - 1 - self.__load_images() - else: - self._current_image_index = 0 - return "" - - img = self.dir_imgs[self._current_image_index] - return img - - def __load_images(self): - self.dir_imgs = [] - for d in self.dirs: - try: - new_path = os.path.join(self.folder, d) - - # only add bmp imgs - if os.path.splitext(new_path)[-1] == CONSTANTS.BMP_IMG_ENDING: - self.dir_imgs.append(new_path) - except Image.UnidentifiedImageError as e: - continue - - if not len(self.dir_imgs): - raise RuntimeError(CONSTANTS.NO_VALID_IMGS_ERR) - - if self._order == PlayBackOrder.RANDOM: - shuffle(self.dir_imgs) - else: - self.dir_imgs.sort() - - def __advance_with_fade(self): - if board.DISPLAY.active_group != self: - return - - old_img = self._curr_img_handle - advance_sucessful = False - - while not advance_sucessful: - new_path = self.__get_next_img() - if new_path == "": - self._img_start = time.monotonic() - return False - - try: - new_img = Image.open(new_path) - - new_img = new_img.convert("RGBA") - new_img.putalpha(255) - - new_img = new_img.crop( - (0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - - if new_img.size[0] < 240 or new_img.size[1] < 240: - black_overlay = Image.new( - "RGBA", - CONSTANTS.SCREEN_HEIGHT_WIDTH, - CONSTANTS.SCREEN_HEIGHT_WIDTH, - ) - black_overlay.paste(new_img) - new_img = black_overlay - - black_overlay = Image.new("RGBA", new_img.size) - advance_sucessful = True - except Image.UnidentifiedImageError as e: - pass - - # fade out old photo - for i in range(self.fade_frames, -1, -1): - sendable_img = Image.blend( - black_overlay, old_img, i * self.brightness / self.fade_frames - ) - self.__send(sendable_img) - - time.sleep(self._BASE_DWELL_DARK) - - # fade in new photo - for i in range(self.fade_frames + 1): - sendable_img = Image.blend( - black_overlay, new_img, i * self.brightness / self.fade_frames - ) - self.__send(sendable_img) - - self._curr_img_handle = new_img - self._curr_img = new_path - self._img_start = time.monotonic() - return True - - def __advance_no_fade(self): - if board.DISPLAY.active_group != self: - return - - old_img = self._curr_img_handle - - advance_sucessful = False - - while not advance_sucessful: - new_path = self.__get_next_img() - if new_path == "": - self._img_start = time.monotonic() - return False - - try: - new_img = Image.open(new_path) - - new_img = new_img.crop( - (0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - - if ( - new_img.size[0] < CONSTANTS.SCREEN_HEIGHT_WIDTH - or new_img.size[1] < CONSTANTS.SCREEN_HEIGHT_WIDTH - ): - black_overlay = Image.new( - "RGBA", - CONSTANTS.SCREEN_HEIGHT_WIDTH, - CONSTANTS.SCREEN_HEIGHT_WIDTH, - ) - black_overlay.paste(new_img) - new_img = black_overlay - - self._curr_img = new_path - - new_img = new_img.convert("RGBA") - new_img.putalpha(255) - advance_sucessful = True - except Image.UnidentifiedImageError as e: - pass - - if self.brightness < 1.0: - black_overlay = Image.new("RGBA", new_img.size) - new_img = Image.blend(black_overlay, new_img, self.brightness) - - # gradually scroll new img over old img - for i in range(self._NO_FADE_TRANSITION_INCREMENTS + 1): - curr_y = ( - i * CONSTANTS.SCREEN_HEIGHT_WIDTH / self._NO_FADE_TRANSITION_INCREMENTS - ) - img_piece = new_img.crop((0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, curr_y)) - old_img.paste(img_piece) - self.__send(old_img) - - self._curr_img_handle = new_img - self._curr_img = new_path - self._img_start = time.monotonic() - return True - - def __send(self, img): - # sends current bmp_img to the frontend - buffered = BytesIO() - img.save(buffered, format=CONSTANTS.BMP_IMG) - byte_base64 = base64.b64encode(buffered.getvalue()) - - # only send the base_64 string contents - img_str = str(byte_base64)[2:-1] - - sendable_json = {CONSTANTS.BASE_64: img_str} - - if common.utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - sendable_json, CONSTANTS.CLUE - ) - else: - common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) diff --git a/src/clue/test/__init__.py b/src/clue/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/clue/test/img/test_clue_text_1.bmp b/src/clue/test/img/test_clue_text_1.bmp deleted file mode 100644 index 7ea72fe2cea4b656b69e41a9a262552dc2a18a7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 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 w^^Bjk^Sd3rc15q8XCwq88Il86E`aR{Pgpe zU%&nM^Us&p-ydIpfB)z2Hy=N|rq`d>zyJ2#$6tT{Uid!&0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7csfqx17^8Lrx|Nixl|FQTQehuwUW=`fOJ?-1vKe=I}Cp)Ke z{+5$(Px6^*b9*cEEi>I`XPaAR=36HBC;7~r%-NswlW*U-CvTh1X>#)INj@`eZf|A2 zWv2V=Y;)_(e9PqiB%hg+Is0>d^6fkKXHV{PZkgP-`BqQsZ~OM{c7FP9yQl4M^-p`Y^X>PxecqFE=5wEO%jCYzw|ZKC z+qZYO^V4_RJ#Bxhf7-L1Z@;(g^PZeDpZlC!CiiW=)zkXhzP-DhpT67fY5QCK)1K{o z`@L)qBf-M8P>dT!;XJ?);hztunO+0M7$+xG3ATl-t@ww~#}{jSz?E1x~nx!sog?9Bai zp7w0#Z{6SSobKB_w|ZKC+qZYO^ZD*{Znxz=J99ssr#;*GTlcp+r~7u#t)AB3_U+y6 ze7-xK+ikhe&fHJuY0q~4*8T0y>Au}_tEct1eS3F1pYKlRc3bYVGxyVZ+OwU%b$`2a zx^MT~>S_IL-`+jR=eH+wc4j{JZQjm**1OZ+)$VNjX@ASN{q)`J$+`7R_tVbIPv^WX zzs-G{xAUL%?(}!HJKKKR-|}rgeK&h@Zavfev@`S5Id98vbKmCe{Aay8{ax+Owx9O5 zeA`do&7PcF&vZZS%=~oD+w$Aow|P7NS?^ANSG%+Ar~NJ8_S1K>C+F5P-A_9=^4Zzu z?cde<^PZMz`~0@e?b}=XeD|dDB%hf!x3@B%ncTNI^KH&=TPF7#`Rr_S-f%K!&q=;z zp7i9mZEo-0+UL6`ohSLsw7I>N`OM_L&6#g=e%ms+-^gcYoAZW~IeSj>E%T%&zio4S z_trk&J?T8jXQs{Vt;}a8_ifI6oAcY2$^Aw?JKLN$oXpvCl5d$OJ^5{$+q<{+`R+;Q zNj@`eZf|8iGr4bb=G&a#woLA~^ZC}3d3tAi>sC+e-`-E}pXRskpY~7h-_B3(Z~5t+ z+dZv+dp~uU=C|*k_D}EM&QI@e`RSe8J*|IxKXsVqx9^|!Pw(H(Pw#K}>7Cm>t$%wz zb(rS2@1OQh@88Z(@6UYRmUCuK=KMD2lW*TGGrfPBe}~_jH|KnE+jjoshL*|Oa&Gyy Z&u?>X`FGw=@1N%1;kW0_Isfl%e*nkUw}=1$ diff --git a/src/clue/test/img/test_display_text_2.bmp b/src/clue/test/img/test_display_text_2.bmp deleted file mode 100644 index c08c37fe02c3cabf6a774b181a985bbe629605e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeIx(M`iJ5CG7?0DLn76LbLnJ0;(&z!!5c10!(skY(vma7bHF@}f98U7WM~e0@9~ zo^Gel>k#81#{1W}neHQsE8f4}O{b9wPXYu85FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAVA={0&mYRZNZFxmx&_rVcvbg`An`=pIM>L*G&I*ByPJBY*-*V zp*6$GAe35#m2rai)oP}HI}&FF&ut5gbi(!L)b6dBrMuepIr??$J7j4`jnA)ptC{g? zIn#;nL7+eDzC&vNTrShEd%1WIr|CETc|XSn@~;1vncl8n{g`pqdl1N;slBu`b1tiF n%cwRJoNFz0wkPlp`?(?K-s%q91OWj81PBlyK!5;&Zv{R8Ce|~( diff --git a/src/clue/test/img/test_display_text_3.bmp b/src/clue/test/img/test_display_text_3.bmp deleted file mode 100644 index 3b68886396ece1aee9d6df5771e9a874a2679c36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 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 E7mPcEsQ>@~ diff --git a/src/clue/test/img/test_image_shapes_1.bmp b/src/clue/test/img/test_image_shapes_1.bmp deleted file mode 100644 index 6719a7f8d6f1788d8c28c8c7a9d839f2cc4a8435..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeIuOAUZP5JbTN0i2P5f)%iLRAL1|IDqD(f>b9j+05RmuWcLaUQ0_lzJ{9f%JRQY z_4FR9P9s2o009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ j009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7csfnNw*yLO6e diff --git a/src/clue/test/img/test_image_shapes_2.bmp b/src/clue/test/img/test_image_shapes_2.bmp deleted file mode 100644 index ae1f7618d0b2a21643e1668654c47d3932eef879..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeIw+erjb6hzUh0r+hQMqmK`8>OijkQt2aBLbn=Agh@Mao`lQ*e|coZ};cxdA{DK z>;3qB@6O}(*Y#ZAzdxMs_vaty+&lyb5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBm_1kUYLpXe8x{m%kb%-8OJX7$@50X;|XW+wuAp0GL^3FtY3H#-r~ z^MuvWNI=gKyxEC>o+qr1Mgn?{;LT11^gLm8G!oEr1aEdCpyvszqmh7~BY3kD0XS!dO=Lp{HL_p6IR!1WNJxB0nCjxq&usRwE=sAKnI}yH2t@U*G1}uh-Y7>FfN{{Fwj#^UL(|y8U9BE*=C35FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNB!O<=lQ?mf3H z=qv)q3%oTvU8Z}__s);MJQE2l6nH85Uc>+V{cG3@*LN6!V+7Wh{CD1}K4zCpStKy0 zdHDI=cbgrIHy77;A+lR#LE&37D8Sm$pUV@T7gCaLYD1XQ6oo=R+|)NaEuiPLsP&oxdT#2Qofgn@TGV%0V%(%1^@s6 diff --git a/src/clue/test/img/test_image_shapes_4.bmp b/src/clue/test/img/test_image_shapes_4.bmp deleted file mode 100644 index be810780ba72a7f1955073e58b1f243f530dcca3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeI)QBoUM5Cu>r3&?ktkQI0V{?972l`JSbAOa&%Wm-m{?s>YJqk=MSpkL4FTjOyR z_V>TP{qy_b`StDi{@3ySzt{KQ4u2j$I=+sd|M!o>%lnVQ;qc@|fB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pkHwYXuUpHK_Z+&Ee%s3w&c_psx1_61#0nfMIoxnNIcQ;uz zP}a276{yV$WF;hP+S$$NUI}C+Bx~BrTWwY#Do{O3CWta@>ZJ_$Vy1ow6mMjy%NYuNY=EKx7w^gRzk9-o!y-7l|WWPvZk%P)n)~< z5|TCT?B;Z@1hNv6HErdsHY<>okgREEH>Z0gkd=_EX)ABFS%IvCWKBD}Io&IPtb}Au zTY0O^3S=cDYuee(>0SwBB_wOw%3Ez#AS)qR)6Q;A_evluAz9N_-fFV~SqaISc6M{R zR{~iH$(pwER+|;bN=VkUvzybs639wO*0hzk+N{7GCFJn*bm{G6a7WXgM)K=j39L`Z zDZ_`S!=<-#&euKKRtzxX)d@2>c}Q7LcDlG4$J8!uBzN2>&n;oTkY|xj4q)@_TjaSb%$M^l(#^4m zZ70vMt21~ZFrMeeoAWR4&u-DhcK273=l$*ck*|0*&%HP2kM7TI(T|+e>#j|nuXFNM z83OX0u_serCoq`j_J@rto;N&lT(|az{VI8W*wyax!p?aP``~!5zVPOUly({9*NYB| z@p;?}VfMVS=P)0y{Tz_659E30!QKAyC;mQoImYM556>IhuX-0J%JVMPyqk-Z=iRJ& z7Z)neyIAv{E^_lodwAYcyf(j9dET7dfrA3_Jcz6H3V{tH?O|iZf_HYNJnwAbkAJzF zMB2^y@q=_HS18YSvIt{z2@FTt&ADq)`dlk87HMI=b_Kq!S70F0!rZ$e-99JK8fjtv z9KNrf5NL|DFi$K;&#wr4`TysC`T6JPB>T_IzvAwDCIvp9YDu2lhu$3mKW?_adR!009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5(rAaMK_uB+ZYn9QdMd|qHxn4kZpxEFzL z0eS8g)o-PMJg?MucDH~$cZ=$`Qb3+p>N~qzK%Tor^;;<*&nxwv-7O%`-J<%f6p-hY z`p)hakmqhu{Z||9zO%ap=yi(uU-2(F5Evny2 z0eN1j@9b^?dF~d~Z>4}duhe&Tw}3o%i|V&hK%Q6XJG)yzp1Vc$TPYyVEA^e-Eg;X` zqWY~Akmr^9&h8eF=WbE`Rtm`TN_}T{3&?Y~sD3L2+j-Qs3F# z0`lA~s^3Zhd0wgS>}~;h?iST=rGPxI)OU8bfIN4L>bFuro>%HSyIVk>yG8X|DIm`) z^_|@R`Vk;NfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk a1PBlyK!5-N0t5&UAV7cs0RjYO1^x$f_BIRv diff --git a/src/clue/test/img/test_image_shapes_5.bmp b/src/clue/test/img/test_image_shapes_5.bmp deleted file mode 100644 index e5473f83d5742c6a45046fad223e2cdcdf3d1995..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeI)?Qvs85Qb4f0Q@EdBG>@;+xOKyDsN%NtC`lB2O+9} zKmYpi_pgW3tydtckgREYZ_e(OKvp4H(^lTrdIhoy$(pwJ=ImYxWEGM%ZRKsP zS0Jm9tZ931&hC{!Rv}r_R^HZn1+ogsnzr}m>|P0E6_Pb=tydtckgREYZ_e(OKvp4H(^lTrdIhoy$(pwJ=ImYxWEGM%ZRKsP zS0Jm9tZ931&hC{!Rv}r_R^HZn1+ogsnzr}m>|P0E6_Pb=tydtckgREYZ_e(OKvp4H(^lTrdIhoy$(pwJ=ImYxWEGM%ZRKsP zS0Jm9tZ931&hC{!Rv}r_R^HZn1+ogsnzr}m>|P0E6_Pb=tydtckgREYZ_e(OKvp4H(^lTrdIdIA$l>Yf+Si-GhNgWR$sac* zFki@9!-uECwXbvM^V4qX@(gn!Fj>fR$=4dL*WbpycpVl9oCMwiIkvUpV?oI;@7{0Y zp5C!N2wVuf1+rov$9LZAA1!|JqxW%7yLb@zB=8={ryn%^>33p&|C`C{Cv8bL-BRwh ztM>fOm@j&M-Y?hQCFUzVOFB8gJI}sG&-aS?de4%+ za~84N={ff53|UwdtO z{+g5Dl_8+#jC(TW*901SzWaxbFMQtck>hLE{;7E>6_*F0Oeu zFH+CDx$0fKP(APBn)mb~S5Ml9=RM`M`fJtm>f{b=6wq@cuB|5oR!rK5jfo51*_nFY z*@fSFxzGP!tkc`h7QSu`dh=(iB<;=l<{eD`a0>yKGc177^8&O-dP*76b`}>iJ7^MZR==_y+)_NVhKaJg&JVqS0q z>pkV7pH2Nc$)|WeeJ!K8Q_^By#=p|DKBaQJ^zA)9_k5gr+2i@eo?hajuh%h_9qn1` z2<)oo7t;Sx_V&XWX6IBcSIVSG&##=y}H7sXYRE?s2v2jKIV7eB-}w?f%is4LbFsfSwoqzc|Xj zG(NieenvpgdY&n-=TtrGxu>j|UG=Qzneuv0)w7;^%9`0#&w8FIujf=f>$#__nO*g) z=b7?)PSvxXd&-*GRnK~!DX-^LJ?purteIW)tmm2XdQR1|o_org*;UVao++>AR6Xmt zr>vP>^{nTa@_J6yvz~j(n%Py)dY&n-=TtrGxu>j|UG=Qzneuv0)w7;^%9`0#&w8FI zujf=f>$#__nO*g)=b7?)PSvxXd&-*GRnK~!DX-^LJ?purteIW)tmm2XdQR1|o_org z*;UVao++>AR6Xmtr>vP>^{nTa@_J6yvz~j(n%Py)dY&n-=TtrGxu>j|UG=Qzneuv0 z)w7;^%9`0#&w8FIujf=f>$#__nO*g)=b7?)PJOtZdzkDRBB1Axi!$by1oZqRCci01 zVB1MQU5u9_YtjjU%V0LXGJ)jGB!P_w{BgV_R}YfX1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oP8<@E_d! B4ZHvV diff --git a/src/clue/test/img/test_image_text_1.bmp b/src/clue/test/img/test_image_text_1.bmp deleted file mode 100644 index dee4173d2604b57b07aaabb92eb8c5b9057ffeb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230454 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 qN9c#uet_`tL{Z>z?f62Xr~^Y!@q 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 UFu(u<3^2d|0}L?0zzPHZ0zx#fl>h($ diff --git a/src/clue/test/slideshow_pics/pic_1.bmp b/src/clue/test/slideshow_pics/pic_1.bmp deleted file mode 100644 index 0d15550078f61eb5e68515958b9c3a79d376bbbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113974 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 G?EfD(a~m1} diff --git a/src/clue/test/slideshow_pics/pic_2.bmp b/src/clue/test/slideshow_pics/pic_2.bmp deleted file mode 100644 index 345d5820e11be986d573aab47bdf709e48ca9e82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113974 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 diff --git a/src/clue/test/slideshow_pics/pic_3.bmp b/src/clue/test/slideshow_pics/pic_3.bmp deleted file mode 100644 index 78ef7b8a23d5f92e06cffc87c0795af7f6ef884c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 330726 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 diff --git a/src/clue/test/slideshow_pics/pic_6.bmp b/src/clue/test/slideshow_pics/pic_6.bmp deleted file mode 100644 index d3e2540397b43a06c2c748ffe972047b8141ae8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115818 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 C7L5@A diff --git a/src/clue/test/slideshow_pics/pic_8.bmp b/src/clue/test/slideshow_pics/pic_8.bmp deleted file mode 100644 index 2746a30f812280f3aff4b5ca6992f753ced09982..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193734 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 C1~?P| diff --git a/src/clue/test/test_adafruit_clue.py b/src/clue/test/test_adafruit_clue.py deleted file mode 100644 index 0d7204205..000000000 --- a/src/clue/test/test_adafruit_clue.py +++ /dev/null @@ -1,193 +0,0 @@ -import pytest - -import os -import pathlib -from PIL import Image - -from unittest import mock -from unittest.mock import MagicMock, patch - -from common import utils - -import displayio -import terminalio - -from ..adafruit_clue import clue -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS - - -class TestAdafruitClue(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - - self.main_img = Image.new( - "RGBA", - (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), - (0, 0, 0, 0), - ) - - utils.send_to_simulator = mock.Mock() - - def test_clue_display_text(self): - img = Image.open( - os.path.join(self.abs_path, CONSTANTS.IMG_DIR_NAME, f"test_clue_text_1.bmp") - ) - - img.putalpha(255) - expected = img.load() - clue_data = clue.simple_text_display(title="LET'S TEST!", title_scale=2) - - clue_data.text_group._Group__show = self.__send_helper - clue_data.text_group._Group__check_active_group_ref = False - - clue_data[0].text = "Lorem ipsum" - clue_data[1].text = "dolor sit amet, consectetur " - clue_data[2].text = "adipiscing:" - - clue_data[4].text = "e" - clue_data[5].text = "sed do eiusmod" - clue_data[6].text = "tempor incididunt\nut labore" - clue_data[7].text = "ut labore" - - clue_data[10].text = "et dolore" - clue_data[11].text = "magna" - clue_data[12].text = "aliqua\ntestest" - clue_data[13].text = "Ut enim ad" - clue_data[14].text = "Excepteur sint" - clue_data.show() - helper._Helper__test_image_equality(self.main_img.load(), expected) - - def __send_helper(self, image): - self.main_img = image - - def test_buttons(self): - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_A, True) - assert clue.button_a - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_A, False) - assert not clue.button_a - - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_B, True) - assert clue.button_b - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_B, False) - assert not clue.button_b - - assert clue.were_pressed == set(["A", "B"]) - assert clue.were_pressed == set() - - @pytest.mark.parametrize( - "mock_x, mock_y, mock_z", [(1, 2, 3), (0, 0, 0), (4, 6, 100)] - ) - def test_acceleration(self, mock_x, mock_y, mock_z): - clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_X] = mock_x - clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_Y] = mock_y - clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_Z] = mock_z - assert clue.acceleration == (mock_x, mock_y, mock_z) - - @pytest.mark.parametrize( - "mock_color_r, mock_color_g,mock_color_b,mock_color_c", - [(1, 2, 3, 4), (255, 255, 255, 255), (120, 140, 160, 180)], - ) - def test_color(self, mock_color_r, mock_color_g, mock_color_b, mock_color_c): - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_R] = mock_color_r - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_G] = mock_color_g - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_B] = mock_color_b - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_C] = mock_color_c - assert clue.color == (mock_color_r, mock_color_g, mock_color_b, mock_color_c) - - @pytest.mark.parametrize("mock_temperature", [-10, 0, 10]) - def test_temperature(self, mock_temperature): - clue._Clue__state[CONSTANTS.CLUE_STATE.TEMPERATURE] = mock_temperature - assert clue.temperature == mock_temperature - - @pytest.mark.parametrize( - "mock_magnetic_x, mock_magnetic_y, mock_magnetic_z", - [(1, 2, 3), (100, 150, 200), (10, 5, 15)], - ) - def test_magnetic(self, mock_magnetic_x, mock_magnetic_y, mock_magnetic_z): - clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_X] = mock_magnetic_x - clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_Y] = mock_magnetic_y - clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_Z] = mock_magnetic_z - assert clue.magnetic == (mock_magnetic_x, mock_magnetic_y, mock_magnetic_z,) - - @pytest.mark.parametrize("mock_distance", (0, 10, 250, 255)) - def test_proximity(self, mock_distance): - clue._Clue__state[CONSTANTS.CLUE_STATE.PROXIMITY] = mock_distance - assert clue.proximity == mock_distance - - @pytest.mark.parametrize( - "mock_gyro_x, mock_gyro_y, mock_gyro_z", - [(1, 2, 3), (100, 150, 200), (10, 5, 15)], - ) - def test_gyro(self, mock_gyro_x, mock_gyro_y, mock_gyro_z): - clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_X] = mock_gyro_x - clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_Y] = mock_gyro_y - clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_Z] = mock_gyro_z - assert clue.gyro == (mock_gyro_x, mock_gyro_y, mock_gyro_z) - - @pytest.mark.parametrize( - "gesture_word, gesture_number", - [("", 0), ("up", 1), ("down", 2), ("left", 3), ("right", 4)], - ) - def test_gesture(self, gesture_word, gesture_number): - clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = gesture_word - assert clue.gesture == gesture_number - - def test_shake(self): - NONE = "none" - SHAKE = "shake" - clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = SHAKE - assert clue.shake() - clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = NONE - assert not clue.shake() - - @pytest.mark.parametrize("mock_humidity", [0, 10, 50, 100]) - def test_humidity(self, mock_humidity): - clue._Clue__state[CONSTANTS.CLUE_STATE.HUMIDITY] = mock_humidity - assert clue.humidity == mock_humidity - - @pytest.mark.parametrize("mock_pressure", [0, 10, 50, 100]) - def test_pressure(self, mock_pressure): - clue._Clue__state[CONSTANTS.CLUE_STATE.PRESSURE] = mock_pressure - assert clue.pressure == mock_pressure - - @pytest.mark.parametrize( - "mock_pressure, mock_sea_level_pressure, expected_altitude", - [ - (1000, 1015, 125.42255615546036), - (1030, 1015, -123.93061640175468), - (1020, 1013, -58.13176263932101), - ], - ) - def test_altitude(self, mock_pressure, mock_sea_level_pressure, expected_altitude): - clue.sea_level_pressure = mock_sea_level_pressure - clue._Clue__state[CONSTANTS.CLUE_STATE.PRESSURE] = mock_pressure - assert expected_altitude == pytest.approx(clue.altitude) - - @pytest.mark.parametrize("mock_sea_level_pressure", [1040, 1015, 1013]) - def test_sea_level_pressure(self, mock_sea_level_pressure): - clue.sea_level_pressure = mock_sea_level_pressure - assert mock_sea_level_pressure == clue.sea_level_pressure - - @pytest.mark.parametrize( - "mock_color", [(255, 0, 0), (255, 255, 255), (123, 123, 123)] - ) - def test_pixel(self, mock_color): - clue.pixel.fill(mock_color) - assert clue.pixel[0] == mock_color - - @pytest.mark.parametrize( - "value, expected", - [(True, True), (False, False), (1, True), ("a", True), (0, False), ("", False)], - ) - def test_red_led(self, value, expected): - clue.red_led = value - assert clue.red_led == expected - - @pytest.mark.parametrize( - "value, expected", - [(True, True), (False, False), (1, True), ("a", True), (0, False), ("", False)], - ) - def test_white_leds(self, value, expected): - clue.white_leds = value - assert clue.white_leds == expected diff --git a/src/clue/test/test_adafruit_display_shapes.py b/src/clue/test/test_adafruit_display_shapes.py deleted file mode 100644 index 8c1c3c303..000000000 --- a/src/clue/test/test_adafruit_display_shapes.py +++ /dev/null @@ -1,81 +0,0 @@ -import pytest -import pathlib -import os - -import displayio - -from PIL import Image -from unittest import mock - -from common import utils - - -from adafruit_display_shapes.rect import Rect -from adafruit_display_shapes.circle import Circle -from adafruit_display_shapes.roundrect import RoundRect - -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS -import board - - -class TestAdafruitDisplayShapes(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - - utils.send_to_simulator = mock.Mock() - self.main_img = Image.new( - "RGBA", - (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), - (0, 0, 0, 0), - ) - - def test_shapes(self): - - expected_images = [] - for i in range(5): - img = Image.open( - os.path.join( - self.abs_path, - CONSTANTS.IMG_DIR_NAME, - f"test_image_shapes_{i+1}.bmp", - ) - ) - - img.putalpha(255) - expected_images.append(img.load()) - - # TAKEN FROM ADAFRUIT'S DISPLAY SHAPES LIBRARY - # https://github.com/ladyada/Adafruit_CircuitPython_Display_Shapes/blob/master/examples/display_shapes_simpletest.py - splash = displayio.Group(max_size=10) - splash._Group__show = self.__send_helper - board.DISPLAY.show(splash) - color_bitmap = displayio.Bitmap(320, 240, 1) - color_palette = displayio.Palette(1) - color_palette[0] = 0xFFFFFF - bg_sprite = displayio.TileGrid( - color_bitmap, x=0, y=0, pixel_shader=color_palette - ) - splash.append(bg_sprite) - helper._Helper__test_image_equality(self.main_img.load(), expected_images[0]) - - rect = Rect(80, 20, 41, 41, fill=0x00FF00) - splash.append(rect) - helper._Helper__test_image_equality(self.main_img.load(), expected_images[1]) - circle = Circle(100, 100, 20, fill=0x00FF00, outline=0xFF00FF) - splash.append(circle) - - helper._Helper__test_image_equality(self.main_img.load(), expected_images[2]) - - rect2 = Rect(50, 100, 61, 81, outline=0x0, stroke=3) - splash.append(rect2) - - helper._Helper__test_image_equality(self.main_img.load(), expected_images[3]) - - roundrect = RoundRect(10, 10, 61, 81, 10, fill=0x0, outline=0xFF00FF, stroke=6) - splash.append(roundrect) - - helper._Helper__test_image_equality(self.main_img.load(), expected_images[4]) - - def __send_helper(self, image): - self.main_img = image diff --git a/src/clue/test/test_adafruit_display_text.py b/src/clue/test/test_adafruit_display_text.py deleted file mode 100644 index 922230275..000000000 --- a/src/clue/test/test_adafruit_display_text.py +++ /dev/null @@ -1,65 +0,0 @@ -import pytest - -import os -import sys -import pathlib -from PIL import Image -from unittest import mock - -from common import utils - -import displayio -import terminalio - -from adafruit_display_text import label - -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS - -# to keep track of test # to find right expected bmp -test_count = 0 - - -class TestAdafruitDisplayText(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - # Create a new black (default) image - utils.send_to_simulator = mock.Mock() - - @pytest.mark.parametrize( - "text, x,y, scale, color", - [ - ("Hello World", 1, 10, 4, (0, 22, 103)), - ("WWWWwwwmMMmmm", 30, 6, 1, (190, 173, 222)), - ("wOooo00ooo", 104, 49, 9, 0xEFEFEF), - ("!!!\n yay!", 100, 100, 5, (200, 200, 255)), - ], - ) - def test_display_text(self, text, x, y, scale, color): - global test_count - - expected_image = Image.open( - os.path.join( - self.abs_path, - CONSTANTS.IMG_DIR_NAME, - f"test_display_text_{test_count+1}.bmp", - ) - ) - expected_image.convert("RGBA") - expected_image.putalpha(255) - loaded_img = expected_image.load() - - text_area = label.Label( - terminalio.FONT, - text=text, - scale=scale, - color=color, - check_active_group_ref=False, - ) - text_area.x = x - text_area.y = y - - main_img = text_area._Group__draw() - - helper._Helper__test_image_equality(main_img.load(), loaded_img) - test_count += 1 diff --git a/src/clue/test/test_adafruit_slideshow.py b/src/clue/test/test_adafruit_slideshow.py deleted file mode 100644 index 1f966b15a..000000000 --- a/src/clue/test/test_adafruit_slideshow.py +++ /dev/null @@ -1,100 +0,0 @@ -from ..adafruit_slideshow import SlideShow, PlayBackDirection, PlayBackOrder -import board -import pathlib -import os - -from PIL import Image -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS - -from unittest import mock - -from common import utils - - -class TestAdafruitSlideShow(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - - # Create a new black (default) image - self.main_img = Image.new( - "RGBA", - (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), - (0, 0, 0, 0), - ) - - utils.send_to_simulator = mock.Mock() - - def test_slideshow(self): - - pic_dir = os.path.join(self.abs_path, "slideshow_pics") - slideshow_images = [] - for i in range(8): - img = Image.open(os.path.join(pic_dir, f"pic_{i+1}.bmp")) - img = img.convert("RGBA") - img.putalpha(255) - - img = img.crop( - (0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - - if img.size[0] < 240 or img.size[1] < 240: - black_overlay = Image.new( - "RGBA", - CONSTANTS.SCREEN_HEIGHT_WIDTH, - CONSTANTS.SCREEN_HEIGHT_WIDTH, - ) - black_overlay.paste(img) - img = black_overlay - - slideshow_images.append(img) - - # Create the slideshow object that plays through once alphabetically. - slideshow = SlideShow( - board.DISPLAY, - dwell=3, - folder=pic_dir, - loop=True, - fade_effect=True, - auto_advance=True, - order=PlayBackOrder.ALPHABETICAL, - direction=PlayBackDirection.FORWARD, - ) - - slideshow._SlideShow__send = self.__send_helper - - # first image's appear time is unstable,since it fades/scrolls in - # can only predict following ones... - - for i in range(1, 8): - slideshow.advance() - helper._Helper__test_image_equality( - self.main_img.load(), slideshow_images[i].load() - ) - - # Create the slideshow object that plays through once backwards. - slideshow2 = SlideShow( - board.DISPLAY, - dwell=3, - folder=pic_dir, - loop=True, - fade_effect=False, - auto_advance=True, - order=PlayBackOrder.ALPHABETICAL, - direction=PlayBackDirection.BACKWARD, - ) - - slideshow2._SlideShow__send = self.__send_helper - - helper._Helper__test_image_equality( - self.main_img.load(), slideshow_images[7].load() - ) - - for i in range(6, -1, -1): - slideshow2.advance() - helper._Helper__test_image_equality( - self.main_img.load(), slideshow_images[i].load() - ) - - def __send_helper(self, image): - self.main_img = image diff --git a/src/clue/test/test_helpers.py b/src/clue/test/test_helpers.py deleted file mode 100644 index 429965aaf..000000000 --- a/src/clue/test/test_helpers.py +++ /dev/null @@ -1,32 +0,0 @@ -from base_circuitpython import base_cp_constants as CONSTANTS - - -class Helper: - def __test_image_equality(self, image_1, image_2): - for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - pixel_1 = image_1[j, i] - pixel_2 = image_2[j, i] - - if not isinstance(pixel_1, tuple): - pixel_1 = self.hex2rgba(pixel_1) - - if not isinstance(pixel_2, tuple): - pixel_2 = self.hex2rgba(pixel_2) - assert pixel_1[0:3] == pixel_2[0:3] - - def hex2rgba(self, curr_colour): - - ret_list = [] - - for i in range(3, -1, -1): - val = (curr_colour >> (2 ** (i + 1))) & 255 - if val == 0: - ret_list.append(0) - else: - ret_list.append(val) - - return tuple(ret_list) - - -helper = Helper() diff --git a/src/common/__init__.py b/src/common/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/common/constants.py b/src/common/constants.py deleted file mode 100644 index c0592c7db..000000000 --- a/src/common/constants.py +++ /dev/null @@ -1,12 +0,0 @@ -MAC_OS = "darwin" - -ERROR_SENDING_EVENT = "Error trying to send event to the process : " - -ACTIVE_DEVICE_FIELD = "active_device" -STATE_FIELD = "state" - -CONNECTION_ATTEMPTS = 10 -TIME_DELAY = 0.03 -DEFAULT_PORT = "5577" - -MICROPYTHON_LIBRARY_NAME = "micropython" diff --git a/src/common/debugger_communication_client.py b/src/common/debugger_communication_client.py deleted file mode 100644 index 08db21b89..000000000 --- a/src/common/debugger_communication_client.py +++ /dev/null @@ -1,104 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -import sys -import json - -# WARNING: importing socketio will sometimes cause errors in normal execution -# try to import common instead of common.debugger_communication_cleint -import socketio - -import copy -import pathlib - -from . import constants as CONSTANTS -from . import utils -import threading -import os -import python_constants as TOPLEVEL_CONSTANTS - -from adafruit_circuitplayground.express import cpx -from adafruit_circuitplayground.constants import CPX - -# add ref for micropython and clue -abs_path_to_parent_dir = os.path.dirname( - os.path.join(pathlib.Path(__file__).parent, "..", "..") -) -sys.path.insert( - 0, os.path.join(abs_path_to_parent_dir, TOPLEVEL_CONSTANTS.MICROPYTHON_LIBRARY_NAME) -) - -sys.path.insert(0, os.path.join(abs_path_to_parent_dir, TOPLEVEL_CONSTANTS.CLUE_DIR)) - -from microbit.__model.microbit_model import __mb as mb -from microbit.__model.constants import MICROBIT - -from base_circuitpython.base_cp_constants import CLUE -from adafruit_clue import clue - -device_dict = {CPX: cpx, MICROBIT: mb, CLUE: clue} -processing_state_event = threading.Event() -previous_state = {} - -# similar to utils.send_to_simulator, but for debugging -# (needs handle to device-specific debugger) -def debug_send_to_simulator(state, active_device): - global previous_state - if state != previous_state: - previous_state = copy.deepcopy(state) - - updated_state = utils.update_state_with_device_name(state, active_device) - message = utils.create_message(updated_state) - - update_state(json.dumps(message)) - - -# Create Socket Client -sio = socketio.Client(reconnection_attempts=CONSTANTS.CONNECTION_ATTEMPTS) - -# TODO: Get port from process_user_code.py via childprocess communication - - -# Initialize connection -def init_connection(port=CONSTANTS.DEFAULT_PORT): - sio.connect("http://localhost:{}".format(port)) - - -# Transfer the user's inputs to the API -def __update_api_state(data): - try: - event_state = json.loads(data) - active_device_string = event_state.get(CONSTANTS.ACTIVE_DEVICE_FIELD) - - if active_device_string is not None: - active_device = device_dict.get(active_device_string) - if active_device is not None: - active_device.update_state(event_state.get(CONSTANTS.STATE_FIELD)) - - except Exception as e: - print(CONSTANTS.ERROR_SENDING_EVENT, e, file=sys.stderr, flush=True) - - -# Method : Update State -def update_state(state): - processing_state_event.clear() - sio.emit("updateState", state) - processing_state_event.wait() - - -# Event : Button pressed (A, B, A+B, Switch) -# or Sensor changed (Temperature, light, Motion) -@sio.on("input_changed") -def input_changed(data): - sio.emit("receivedState", data) - __update_api_state(data) - - -@sio.on("received_state") -def received_state(data): - processing_state_event.set() - - -@sio.on("process_disconnect") -def process_disconnect(data): - sio.disconnect() diff --git a/src/common/telemetry.py b/src/common/telemetry.py deleted file mode 100644 index fd4a8537c..000000000 --- a/src/common/telemetry.py +++ /dev/null @@ -1,35 +0,0 @@ -import sys - -from applicationinsights import TelemetryClient -from common import constants as CONSTANTS -from .telemetry_events import TelemetryEvent - - -class Telemetry: - def __init__(self): - # State of the telemetry - self.__enable_telemetry = True - self.telemetry_client = TelemetryClient("__AIKEY__") - self.telemetry_state = dict.fromkeys( - [name for name, _ in TelemetryEvent.__members__.items()], False - ) - self.extension_name = "Device Simulator Express" - - def send_telemetry(self, event_name: TelemetryEvent): - if ( - self.__enable_telemetry - and self.telemetry_available() - and not self.telemetry_state[event_name.name] - and not sys.platform.startswith(CONSTANTS.MAC_OS) - ): - self.telemetry_client.track_event( - f"{self.extension_name}/{event_name.value}" - ) - self.telemetry_client.flush() - self.telemetry_state[event_name.name] = True - - def telemetry_available(self): - return self.telemetry_client.context.instrumentation_key == "__AIKEY__" - - -telemetry_py = Telemetry() diff --git a/src/common/telemetry_events.py b/src/common/telemetry_events.py deleted file mode 100644 index a140c823b..000000000 --- a/src/common/telemetry_events.py +++ /dev/null @@ -1,65 +0,0 @@ -import enum - - -class TelemetryEvent(enum.Enum): - CPX_API_ACCELERATION = "CPX.API.ACCELERATION" - CPX_API_BUTTON_A = "CPX.API.BUTTON.A" - CPX_API_BUTTON_B = "CPX.API.BUTTON.B" - CPX_API_SWITCH = "CPX.API.SWITCH" - CPX_API_TEMPERATURE = "CPX.API.TEMPERATURE" - CPX_API_BRIGHTNESS = "CPX.API.BRIGHTNESS" - CPX_API_LIGHT = "CPX.API.LIGHT" - CPX_API_TOUCH = "CPX.API.TOUCH" - CPX_API_SHAKE = "CPX.API.SHAKE" - CPX_API_TAPPED = "CPX.API.TAPPED" - CPX_API_PLAY_FILE = "CPX.API.PLAY.FILE" - CPX_API_PLAY_TONE = "CPX.API.PLAY.TONE" - CPX_API_START_TONE = "CPX.API.START.TONE" - CPX_API_STOP_TONE = "CPX.API.STOP.TONE" - CPX_API_DETECT_TAPS = "CPX.API.DETECT.TAPS" - CPX_API_ADJUST_THRESHOLD = "CPX.API.ADJUST.THRESHOLD" - CPX_API_RED_LED = "CPX.API.RED.LED" - CPX_API_PIXELS = "CPX.API.PIXELS" - MICROBIT_API_TEMPERATURE = "MICROBIT.API.TEMPERATURE" - MICROBIT_API_ACCELEROMETER = "MICROBIT.API.ACCELEROMETER" - MICROBIT_API_GESTURE = "MICROBIT.API.GESTURE" - MICROBIT_API_DISPLAY_SCROLL = "MICROBIT.API.DISPLAY.SCROLL" - MICROBIT_API_DISPLAY_SHOW = "MICROBIT.API.DISPLAY.SHOW" - MICROBIT_API_DISPLAY_OTHER = "MICROBIT.API.DISPLAY_OTHER" - MICROBIT_API_LIGHT_LEVEL = "MICROBIT.API.LIGHT.LEVEL" - MICROBIT_API_IMAGE_CREATION = "MICROBIT.API.IMAGE.CREATION" - MICROBIT_API_IMAGE_OTHER = "MICROBIT.API.IMAGE.OTHER" - MICROBIT_API_IMAGE_STATIC = "MICROBIT.API.IMAGE.STATIC" - MICROBIT_API_BUTTON = "MICROBIT.API.BUTTON" - MICROBIT_API_COMPASS = "MICROBIT.API.COMPASS" - MICROBIT_API_I2C = "MICROBIT.API.I2C" - MICROBIT_API_SPI = "MICROBIT.API.SPI" - MICROBIT_API_AUDIO = "MICROBIT.API.AUDIO" - MICROBIT_API_MUSIC = "MICROBIT.API.MUSIC" - MICROBIT_API_NEOPIXEL = "MICROBIT.API.NEOPIXEL" - MICROBIT_API_RADIO = "MICROBIT.API.RADIO" - MICROBIT_API_SPEECH = "MICROBIT.API.SPEECH" - MICROBIT_API_UTIME = "MICROBIT.API.UTIME" - CLUE_API_ACCELERATION = "CLUE.API.ACCELERATION" - CLUE_API_BUTTON_A = "CLUE.API.BUTTON.A" - CLUE_API_BUTTON_B = "CLUE.API.BUTTON.B" - CLUE_API_WERE_PRESSED = "CLUE.API.WERE.PRESSED" - CLUE_API_SHAKE = "CLUE.API.SHAKE" - CLUE_API_COLOR = "CLUE.API.COLOR" - CLUE_API_TEMPERATURE = "CLUE.API.TEMPERATURE" - CLUE_API_MAGNETIC = "CLUE.API.MAGNETIC" - CLUE_API_PROXIMITY = "CLUE.API.PROXIMITY" - CLUE_API_GYRO = "CLUE.API.GYRO" - CLUE_API_GESTURE = "CLUE.API.GESTURE" - CLUE_API_HUMIDITY = "CLUE.API.HUMIDITY" - CLUE_API_PRESSURE = "CLUE.API.PRESSURE" - CLUE_API_ALTITUDE = "CLUE.API.ALTITUDE" - CLUE_API_SEA_LEVEL_PRESSURE = "CLUE.API.SEA.LEVEL.PRESSURE" - CLUE_API_PIXEL = "CLUE.API.PIXEL" - CLUE_API_TOUCH = "CLUE.API.TOUCH" - CLUE_API_WHITE_LEDS = "CLUE.API.WHITE.LEDS" - CLUE_API_RED_LED = "CLUE.API.RED.LED" - CLUE_API_SOUND = "CLUE.API.SOUND" - CLUE_API_TEXT_DISPLAY = "CLUE.API.TEXT.DISPLAY" - CLUE_API_SLIDESHOW = "CLUE.API.SLIDESHOW" - CLUE_API_TILE_GRID = "CLUE.API.TILE.GRID" diff --git a/src/common/test/__init__.py b/src/common/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/common/test/test_debugger_communication_client.py b/src/common/test/test_debugger_communication_client.py deleted file mode 100644 index fea21211e..000000000 --- a/src/common/test/test_debugger_communication_client.py +++ /dev/null @@ -1,193 +0,0 @@ -import pytest -import json # Remove -from unittest import mock -import socketio -import threading -import os -import sys - -from common import constants as CONSTANTS - -abs_path_to_parent_dir = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "..", ".." -) - -sys.path.insert(0, abs_path_to_parent_dir) -# Insert absolute path to Micropython libraries for micro:bit into sys.path -abs_path_to_micropython_lib = os.path.join( - abs_path_to_parent_dir, CONSTANTS.MICROPYTHON_LIBRARY_NAME -) - -sys.path.insert(0, abs_path_to_micropython_lib) - -from common import debugger_communication_client -from adafruit_circuitplayground import express -from adafruit_circuitplayground.constants import CPX - - -class TestDebuggerCommunicationClient(object): - @mock.patch("socketio.Client.connect") - def test_init_connection(self, mock_connect): - mock_connect.return_value = None - debugger_communication_client.init_connection() - mock_connect.assert_called_once() - - def test_init_connection1(self): - socketio.Client.connect = mock.Mock() - socketio.Client.connect.return_value = None - debugger_communication_client.init_connection() - socketio.Client.connect.assert_called_once() - - def test_update_state(self): - threading.Event.clear = mock.Mock() - threading.Event.wait = mock.Mock() - socketio.Client.emit = mock.Mock() - socketio.Client.emit.return_value = None - debugger_communication_client.update_state( - {CONSTANTS.ACTIVE_DEVICE_FIELD: CPX, CONSTANTS.STATE_FIELD: {}} - ) - socketio.Client.emit.assert_called_once() - - @mock.patch.dict( - express.cpx._Express__state, - { - "brightness": 1.0, - "button_a": False, - "button_b": False, - "pixels": [ - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - ], - "red_led": False, - "switch": False, - "temperature": 0, - "light": 0, - "motion_x": 0, - "motion_y": 0, - "motion_z": 0, - "touch": [False] * 7, - "shake": False, - }, - clear=True, - ) - def test_button_press(self): - data = { - CONSTANTS.ACTIVE_DEVICE_FIELD: CPX, - CONSTANTS.STATE_FIELD: {"button_a": True, "button_b": True, "switch": True}, - } - expected_data = { - "brightness": 1.0, - "button_a": True, - "button_b": True, - "pixels": [ - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - ], - "red_led": False, - "switch": True, - "temperature": 0, - "light": 0, - "motion_x": 0, - "motion_y": 0, - "motion_z": 0, - "touch": [False] * 7, - "shake": False, - } - serialized_data = json.dumps(data) - debugger_communication_client.input_changed(serialized_data) - assert expected_data == express.cpx._Express__state - - @mock.patch.dict( - express.cpx._Express__state, - { - "brightness": 1.0, - "button_a": False, - "button_b": False, - "pixels": [ - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - ], - "red_led": False, - "switch": False, - "temperature": 0, - "light": 0, - "motion_x": 0, - "motion_y": 0, - "motion_z": 0, - "touch": [False] * 7, - "shake": False, - }, - clear=True, - ) - def test_input_changed(self): - data = { - CONSTANTS.ACTIVE_DEVICE_FIELD: CPX, - CONSTANTS.STATE_FIELD: { - "temperature": 1, - "light": 2, - "motion_x": 3, - "motion_y": 4, - "motion_z": 5, - }, - } - expected_data = { - "brightness": 1.0, - "button_a": False, - "button_b": False, - "pixels": [ - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - ], - "red_led": False, - "switch": False, - "temperature": 1, - "light": 2, - "motion_x": 3, - "motion_y": 4, - "motion_z": 5, - "touch": [False] * 7, - "shake": False, - } - serialized_data = json.dumps(data) - debugger_communication_client.input_changed(serialized_data) - assert expected_data == express.cpx._Express__state - - @mock.patch("builtins.print") - @mock.patch.dict(express.cpx._Express__state, {}, clear=True) - def test_update_api_state_fail(self, mocked_print): - data = [] - debugger_communication_client.input_changed(data) - # Exception is caught and a print is stated to stderr - mocked_print.assert_called_once() diff --git a/src/common/test/test_utils.py b/src/common/test/test_utils.py deleted file mode 100644 index 11e7c8a2e..000000000 --- a/src/common/test/test_utils.py +++ /dev/null @@ -1,32 +0,0 @@ -import sys - -from unittest import mock - -from common import constants as CONSTANTS -from common import utils - - -class TestUtils(object): - def test_remove_leading_slashes(self): - original = "///a//b/" - expected = "a//b/" - assert expected == utils.remove_leading_slashes(original) - - def test_escape_notOSX(self): - _utils_sys = utils.sys - if sys.platform.startswith(CONSTANTS.MAC_OS): - utils.sys = mock.MagicMock() - utils.sys.configure_mock(platform="win32") - original = "a b" - assert original == utils.escape_if_OSX(original) - utils.sys = _utils_sys - - def test_escape_isOSX(self): - _utils_sys = utils.sys - if not sys.platform.startswith(CONSTANTS.MAC_OS): - utils.sys = mock.MagicMock() - utils.sys.configure_mock(platform="darwin") - original = "a b" - expected = "a%20b" - assert expected == utils.escape_if_OSX(original) - utils.sys = _utils_sys diff --git a/src/common/utils.py b/src/common/utils.py deleted file mode 100644 index d6d241b2f..000000000 --- a/src/common/utils.py +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -from . import constants as CONSTANTS -import json -import copy -import time -import sys - -previous_state = {} - -abs_path_to_user_file = "" -debug_mode = False - - -def update_state_with_device_name(state, device_name): - updated_state = dict(state) - - state_ext = { - "device_name": device_name, - } - updated_state.update(state_ext) - - return updated_state - - -def create_message(msg, send_type="state"): - if isinstance(msg, dict): - msg = json.dumps(msg) - - message = {"type": send_type, "data": msg} - return message - - -def send_to_simulator(state, device_name): - global previous_state - - updated_state = update_state_with_device_name(state, device_name) - message = create_message(updated_state) - - if updated_state != previous_state: - previous_state = copy.deepcopy(updated_state) - print(json.dumps(message) + "\0", end="", file=sys.__stdout__, flush=True) - time.sleep(CONSTANTS.TIME_DELAY) - - -def send_print_to_simulator(raw_msg): - data_str = str(raw_msg) - message = create_message(data_str, "print") - print(json.dumps(message) + "\0", file=sys.__stdout__, flush=True) - time.sleep(CONSTANTS.TIME_DELAY) - - -def remove_leading_slashes(string): - string = string.lstrip("\\/") - return string - - -def escape_if_OSX(file_name): - if sys.platform == CONSTANTS.MAC_OS: - file_name = file_name.replace(" ", "%20") - return file_name - - -def print_for_unimplemented_functions(function_name): - msg = f"'{function_name}' is not implemented in the simulator but it will work on the actual device!\n" - send_print_to_simulator(msg) diff --git a/src/constants.ts b/src/constants.ts deleted file mode 100644 index b14d875f0..000000000 --- a/src/constants.ts +++ /dev/null @@ -1,555 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as path from "path"; -import { MessageItem } from "vscode"; -import * as nls from "vscode-nls"; - -// Debugger Server -export const SERVER_INFO = { - DEFAULT_SERVER_PORT: 5577, - ERROR_CODE_INIT_SERVER: "ERROR_INIT_SERVER", - SERVER_PORT_CONFIGURATION: "deviceSimulatorExpress.debuggerServerPort", -}; - -const localize: nls.LocalizeFunc = nls.config({ - messageFormat: nls.MessageFormat.file, -})(); - -export const CONFIG = { - CONFIG_ENV_ON_SWITCH: - "deviceSimulatorExpress.configNewEnvironmentUponSwitch", - PYTHON_PATH: "python.pythonPath", - SHOW_DEPENDENCY_INSTALL: "deviceSimulatorExpress.showDependencyInstall", - SHOW_NEW_FILE_POPUP: "deviceSimulatorExpress.showNewFilePopup", -}; - -export const CONSTANTS = { - WEBVIEW_TYPE: { - SIMULATOR: "simulator", - TUTORIAL: "tutorial", - }, - DEBUG_CONFIGURATION_TYPE: "deviceSimulatorExpress", - DEVICE_NAME: { - CPX: "CPX", - MICROBIT: "micro:bit", - CLUE: "CLUE", - }, - DEVICE_NAME_FORMAL: { - CPX: "Circuit Playground Express", - MICROBIT: "micro:bit", - CLUE: "CLUE", - }, - SCRIPT_PATH: { - SIMULATOR: "out/simulator.js", - VSCODE_API: "out/vscode_import.js", - }, - ERROR: { - BAD_PYTHON_PATH: - 'Your interpreter is not pointing to a valid Python executable. Please select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application', - COMPORT_UNKNOWN_ERROR: - "Writing to COM port (GetOverlappedResult): Unknown error code 121", - CPX_FILE_ERROR: localize( - "error.cpxFileFormat", - "The cpx.json file format is not correct." - ), - DEBUGGER_SERVER_INIT_FAILED: (port: number) => { - return localize( - "error.debuggerServerInitFailed", - `Warning : The Debugger Server cannot be opened. Please try to free the port ${port} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.` - ); - }, - DEBUGGING_SESSION_IN_PROGESS: localize( - "error.debuggingSessionInProgress", - "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n" - ), - DEPENDENCY_DOWNLOAD_ERROR: - "Dependency download could not be completed. Functionality may be limited. Please review the installation docs.", - - FAILED_TO_OPEN_SERIAL_PORT: (port: string): string => { - return localize( - "error.failedToOpenSerialPort", - `[ERROR] Failed to open serial port ${port}.` - ); - }, - FAILED_TO_OPEN_SERIAL_PORT_DUE_TO: (port: string, error: any) => { - return localize( - "error.failedToOpenSerialPortDueTo", - `[ERROR] Failed to open serial port ${port} due to error: ${error}. \n` - ); - }, - INSTALLATION_ERROR: localize( - "error.installationError", - "Installation Error" - ), - - INVALID_FILE_EXTENSION_DEBUG: localize( - "error.invalidFileExtensionDebug", - "The file you tried to run isn't a Python file." - ), - INVALID_PYTHON_PATH: localize( - "error.invalidPythonPath", - 'We found that your selected Python interpreter version is too low to run the extension. Please upgrade to version 3.7+ or select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application.' - ), - LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT: localize( - "error.lowPythonVersionForMicrobitDeployment", - "To deploy your code to the micro:bit, you must be using Python 3.3+" - ), - NO_DEVICE: localize( - "error.noDevice", - "The device is not detected. Please double check if your board is connected and/or properly formatted" - ), - NO_FILE_TO_RUN: localize( - "error.noFileToRun", - '[ERROR] We can\'t find a Python file to run. Please make sure you select or open a new ".py" code file, or use the "New File" command to get started and see useful links.\n' - ), - NO_FILE_TO_DEPLOY: localize( - "error.noFileToDeploy", - "[ERROR] We can't find a Python file to deploy to your device.\n" - ), - NO_FOLDER_OPENED: localize( - "error.noFolderCreated", - "In order to use the Serial Monitor, you need to open a folder and reload VS Code." - ), - NO_PROGRAM_FOUND_DEBUG: localize( - "error.noProgramFoundDebug", - "Cannot find a program to debug." - ), - NO_PYTHON_PATH: localize( - "error.noPythonPath", - "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again." - ), - RECONNECT_DEVICE: localize( - "error.reconnectDevice", - "Please disconnect your Circuit Playground Express and try again." - ), - STDERR: (data: string) => { - return localize("error.stderr", `\n[ERROR] ${data} \n`); - }, - UNEXPECTED_MESSAGE: localize( - "error.unexpectedMessage", - "Webview sent an unexpected message" - ), - }, - FILESYSTEM: { - BASE_CIRCUITPYTHON: "base_circuitpython", - CLUE: "clue", - PYTHON_VENV_DIR: "venv", - MICROPYTHON_DIRECTORY: "micropython", - OUTPUT_DIRECTORY: "out", - }, - INFO: { - ALREADY_SUCCESSFUL_INSTALL: localize( - "info.successfulInstall", - "Your current configuration is already successfully set up for the Device Simulator Expresss." - ), - ARE_YOU_SURE: localize( - "info.areYouSure", - "Are you sure you don't want to install the dependencies? The extension can't run without installing them." - ), - CLOSED_SERIAL_PORT: (port: string) => { - return localize( - "info.closedSerialPort", - `[DONE] Closed the serial port - ${port} \n` - ); - }, - COMPLETED_MESSAGE: "Completed", - CPX_JSON_ALREADY_GENERATED: localize( - "info.cpxJsonAlreadyGenerated", - "cpx.json has already been generated." - ), - DEPLOY_DEVICE: localize( - "info.deployDevice", - "\n[INFO] Deploying code to the device...\n" - ), - DEPLOY_SIMULATOR: localize( - "info.deploySimulator", - "\n[INFO] Deploying code to the simulator...\n" - ), - DEPLOY_SUCCESS: localize( - "info.deploySuccess", - "\n[INFO] Code successfully copied! Your device should be loading and ready to go shortly.\n" - ), - EXTENSION_ACTIVATED: localize( - "info.extensionActivated", - "Congratulations, your extension Device Simulator Express is now active!" - ), - FILE_SELECTED: (filePath: string) => { - return localize( - "info.fileSelected", - `[INFO] File selected : ${filePath} \n` - ); - }, - FIRST_TIME_WEBVIEW: localize( - "info.firstTimeWebview", - 'To reopen the simulator select the command "Open Simulator" from command palette.' - ), - INSTALLING_PYTHON_VENV: localize( - "info.installingPythonVenv", - "A virtual environment is currently being created. The required Python packages will be installed. You will be prompted a message telling you when the installation is done." - ), - INSTALL_PYTHON_DEPS: localize( - "info.installPythonDependencies", - "Do you want us to try and install this extension's dependencies on your selected Python interpreter for you?" - ), - INSTALL_PYTHON_VENV: localize( - "info.installPythonVenv", - "Do you want us to try and install this extension's dependencies via virtual environment for you?" - ), - NEW_FILE: localize( - "info.newFile", - "New to Python or the Circuit Playground Express? We are here to help!" - ), - NO_DEVICE_CHOSEN_TO_DEPLOY_TO: localize( - "info.noDeviceChosenToDeployTo", - "\n[INFO] No device was selected to deploy to.\n" - ), - NO_DEVICE_CHOSEN_TO_SIMULATE_TO: localize( - "info.noDeviceChosenToSimulateTo", - "\n[INFO] No device was selected to simulate.\n" - ), - NO_DEVICE_CHOSEN_FOR_NEW_FILE: localize( - "info.noDeviceChosenForNewFile", - "\n[INFO] No device was selected to open a template file for.\n" - ), - OPENED_SERIAL_PORT: (port: string) => { - return localize( - "info.openedSerialPort", - `[INFO] Opened the serial port - ${port} \n` - ); - }, - OPENING_SERIAL_PORT: (port: string) => { - return localize( - "info.openingSerialPort", - `[STARTING] Opening the serial port - ${port} \n` - ); - }, - PLEASE_OPEN_FOLDER: localize( - "info.pleaseOpenFolder", - "Please open a folder first." - ), - REDIRECT: localize("info.redirect", "You are being redirected."), - RUNNING_CODE: localize("info.runningCode", "Running user code"), - SUCCESSFUL_INSTALL: localize( - "info.successfulInstall", - "Successfully set up the Python environment." - ), - THIRD_PARTY_WEBSITE_ADAFRUIT: localize( - "info.thirdPartyWebsiteAdafruit", - 'By clicking "Agree and Proceed" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit\'s privacy policy' - ), - THIRD_PARTY_WEBSITE_PIP: localize( - "info.thirdPartyWebsitePip", - 'By clicking "Agree and Proceed" you will be redirected to pip.pypa.io, a third party website not managed by Microsoft. Please note that your activity on pip.pypa.io is subject to PyPA\'s privacy policy' - ), - THIRD_PARTY_WEBSITE_PYTHON: localize( - "info.thirdPartyWebsitePython", - 'By clicking "Agree and Proceed" you will be redirected to python.org, a third party website not managed by Microsoft. Please note that your activity on python.org is subject to Python\'s privacy policy' - ), - UPDATED_TO_EXTENSION_VENV: localize( - "info.updatedToExtensionsVenv", - "Automatically updated interpreter to point to extension's virtual environment." - ), - WELCOME_OUTPUT_TAB: localize( - "info.welcomeOutputTab", - "Welcome to the Device Simulator Express output tab!\n\n" - ), - }, - LABEL: { - WEBVIEW_PANEL: localize( - "label.webviewPanel", - "Device Simulator Express" - ), - }, - LINKS: { - DOWNLOAD_PIP: "https://pip.pypa.io/en/stable/installing/", - DOWNLOAD_PYTHON: "https://www.python.org/downloads/", - EXAMPLE_CODE: - "https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples", - CPX_HELP: - "https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart", - CLUE_HELP: "https://learn.adafruit.com/adafruit-clue/circuitpython", - INSTALL: - "https://github.com/microsoft/vscode-python-devicesimulator/blob/dev/docs/install.md", - PRIVACY: "https://www.adafruit.com/privacy", - TUTORIALS: - "https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library", - }, - MISC: { - SELECT_PORT_PLACEHOLDER: localize( - "misc.selectPortPlaceholder", - "Select a serial port" - ), - SERIAL_MONITOR_NAME: localize( - "misc.serialMonitorName", - "Device Simulator Express Serial Monitor" - ), - SERIAL_MONITOR_TEST_IF_OPEN: localize( - "misc.testIfPortOpen", - "Test if serial port is open" - ), - }, - NAME: localize("name", "Device Simulator Express"), - TEMPLATE: { - CPX: "cpx_template.py", - MICROBIT: "microbit_template.py", - CLUE: "clue_template.py", - }, - WARNING: { - ACCEPT_AND_RUN: localize( - "warning.agreeAndRun", - "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk." - ), - INVALID_BAUD_RATE: localize( - "warning.invalidBaudRate", - "Invalid baud rate, keep baud rate unchanged." - ), - NO_RATE_SELECTED: localize( - "warning.noRateSelected", - "No rate is selected, keep baud rate unchanged." - ), - NO_SERIAL_PORT_SELECTED: localize( - "warning.noSerialPortSelected", - "No serial port was selected, please select a serial port first" - ), - SERIAL_MONITOR_ALREADY_OPENED: (port: string) => { - return localize( - "warning.serialMonitorAlreadyOpened", - `Serial monitor is already opened for ${port} \n` - ); - }, - SERIAL_MONITOR_NOT_STARTED: localize( - "warning.serialMonitorNotStarted", - "Serial monitor has not been started." - ), - SERIAL_PORT_NOT_STARTED: localize( - "warning.serialPortNotStarted", - "Serial port has not been started.\n" - ), - }, -}; - -export enum CONFIG_KEYS { - ENABLE_USB_DETECTION = "deviceSimulatorExpress.enableUSBDetection", -} - -export enum TelemetryEventName { - FAILED_TO_OPEN_SIMULATOR = "SIMULATOR.FAILED_TO_OPEN", - - // Debugger - CPX_DEBUGGER_INIT_SUCCESS = "CPX.DEBUGGER.INIT.SUCCESS", - CPX_DEBUGGER_INIT_FAIL = "CPX.DEBUGGER.INIT.FAIL", - MICROBIT_DEBUGGER_INIT_SUCCESS = "MICROBIT.DEBUGGER.INIT.SUCCESS", - MICROBIT_DEBUGGER_INIT_FAIL = "MICROBIT.DEBUGGER.INIT.FAIL", - CLUE_DEBUGGER_INIT_SUCCESS = "CLUE.DEBUGGER.INIT.SUCCESS", - CLUE_DEBUGGER_INIT_FAIL = "CLUE.DEBUGGER.INIT.FAIL", - - // Extension commands - COMMAND_RUN_SIMULATOR_BUTTON = "COMMAND.RUN.SIMULATOR_BUTTON", - COMMAND_RUN_PALETTE = "COMMAND.RUN.PALETTE", - COMMAND_INSTALL_EXTENSION_DEPENDENCIES = "COMMAND.INSTALL.EXTENSION.DEPENDENCIES", - COMMAND_SERIAL_MONITOR_CHOOSE_PORT = "COMMAND.SERIAL_MONITOR.CHOOSE_PORT", - COMMAND_SERIAL_MONITOR_OPEN = "COMMAND.SERIAL_MONITOR.OPEN", - COMMAND_SERIAL_MONITOR_BAUD_RATE = "COMMAND.SERIAL_MONITOR.BAUD_RATE", - COMMAND_SERIAL_MONITOR_CLOSE = "COMMAND.SERIAL_MONITOR.CLOSE", - COMMAND_GETTING_STARTED = "COMMAND.GETTING_STARTED", - - CPX_COMMAND_DEPLOY_DEVICE = "CPX.COMMAND.DEPLOY.DEVICE", - CPX_COMMAND_NEW_FILE = "CPX.COMMAND.NEW.FILE.CPX", - CPX_COMMAND_OPEN_SIMULATOR = "CPX.COMMAND.OPEN.SIMULATOR", - - MICROBIT_COMMAND_DEPLOY_DEVICE = "MICROBIT.COMMAND.DEPLOY.DEVICE", - MICROBIT_COMMAND_NEW_FILE = "MICROBIT.COMMAND.NEW.FILE", - MICROBIT_COMMAND_OPEN_SIMULATOR = "MICROBIT.COMMAND.OPEN.SIMULATOR", - - CLUE_COMMAND_DEPLOY_DEVICE = "CLUE.COMMAND.DEPLOY.DEVICE", - CLUE_COMMAND_NEW_FILE = "CLUE.COMMAND.NEW.FILE.CPX", - CLUE_COMMAND_OPEN_SIMULATOR = "CLUE.COMMAND.OPEN.SIMULATOR", - - // Simulator interaction - CPX_SIMULATOR_BUTTON_A = "CPX.SIMULATOR.BUTTON.A", - CPX_SIMULATOR_BUTTON_B = "CPX.SIMULATOR.BUTTON.B", - CPX_SIMULATOR_BUTTON_AB = "CPX.SIMULATOR.BUTTON.AB", - CPX_SIMULATOR_SWITCH = "CPX.SIMULATOR.SWITCH", - - MICROBIT_SIMULATOR_BUTTON_A = "MICROBIT.SIMULATOR.BUTTON.A", - MICROBIT_SIMULATOR_BUTTON_B = "MICROBIT.SIMULATOR.BUTTON.B", - MICROBIT_SIMULATOR_BUTTON_AB = "MICROBIT.SIMULATOR.BUTTON.AB", - - CLUE_SIMULATOR_BUTTON_A = "CLUE.SIMULATOR.BUTTON.A", - CLUE_SIMULATOR_BUTTON_B = "CLUE.SIMULATOR.BUTTON.B", - CLUE_SIMULATOR_BUTTON_AB = "CLUE.SIMULATOR.BUTTON.AB", - - // Sensors - CPX_SIMULATOR_TEMPERATURE_SENSOR = "CPX.SIMULATOR.TEMPERATURE", - CPX_SIMULATOR_LIGHT_SENSOR = "CPX.SIMULATOR.LIGHT", - CPX_SIMULATOR_MOTION_SENSOR = "CPX.SIMULATOR.MOTION", - CPX_SIMULATOR_SHAKE = "CPX.SIMULATOR.SHAKE", - CPX_SIMULATOR_CAPACITIVE_TOUCH = "CPX.SIMULATOR.CAPACITIVE.TOUCH", - - MICROBIT_SIMULATOR_TEMPERATURE_SENSOR = "MICROBIT.SIMULATOR.TEMPERATURE", - MICROBIT_SIMULATOR_LIGHT_SENSOR = "MICROBIT.SIMULATOR.LIGHT", - MICROBIT_SIMULATOR_MOTION_SENSOR = "MICROBIT.SIMULATOR.MOTION", - MICROBIT_SIMULATOR_GESTURE_SENSOR = "MICROBIT.SIMULATOR.GESTURE", - - CLUE_SIMULATOR_TEMPERATURE_SENSOR = "CLUE.SIMULATOR.TEMPERATURE", - CLUE_SIMULATOR_LIGHT_SENSOR = "CLUE.SIMULATOR.LIGHT", - CLUE_SIMULATOR_MOTION_SENSOR = "CLUE.SIMULATOR.MOTION", - CLUE_SIMULATOR_GESTURE_SENSOR = "CLUE.SIMULATOR.GESTURE", - CLUE_SIMULATOR_PRESSURE_SENSOR = "CLUE.SIMULATOR.PRESSURE", - CLUE_SIMULATOR_PROXIMITY_SENSOR = "CLUE.SIMULATOR.PROXIMITY", - CLUE_SIMULATOR_HUMIDITY_SENSOR = "CLUE.SIMULATOR.HUMIDITY", - CLUE_SIMULATOR_GYRO_SENSOR = "CLUE.SIMULATOR.GYRO", - CLUE_SIMULATOR_MAGNET_SENSOR = "CLUE.SIMULATOR.MAGNET", - - // Pop-up dialog - CPX_CLICK_DIALOG_DONT_SHOW = "CPX.CLICK.DIALOG.DONT.SHOW", - CPX_CLICK_DIALOG_EXAMPLE_CODE = "CPX.CLICK.DIALOG.EXAMPLE.CODE", - CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CPX.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", - CPX_CLICK_DIALOG_TUTORIALS = "CPX.CLICK.DIALOG.TUTORIALS", - - CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CLUE.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", - - ERROR_PYTHON_PROCESS = "ERROR.PYTHON.PROCESS", - - CPX_ERROR_COMMAND_NEW_FILE = "CPX.ERROR.COMMAND.NEW.FILE", - CPX_ERROR_DEPLOY_WITHOUT_DEVICE = "CPX.ERROR.DEPLOY.WITHOUT.DEVICE", - CPX_ERROR_PYTHON_DEVICE_PROCESS = "CPX.ERROR.PYTHON.DEVICE.PROCESS", - CPX_SUCCESS_COMMAND_DEPLOY_DEVICE = "CPX.SUCCESS.COMMAND.DEPLOY.DEVICE", - - MICROBIT_ERROR_COMMAND_NEW_FILE = "MICROBIT.ERROR.COMMAND.NEW.FILE", - MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE = "MICROBIT.ERROR.DEPLOY.WITHOUT.DEVICE", - MICROBIT_ERROR_PYTHON_DEVICE_PROCESS = "MICROBIT.ERROR.PYTHON.DEVICE.PROCESS", - MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE = "MICROBIT.SUCCESS.COMMAND.DEPLOY.DEVICE", - - CLUE_ERROR_COMMAND_NEW_FILE = "CLUE.ERROR.COMMAND.NEW.FILE", - CLUE_ERROR_DEPLOY_WITHOUT_DEVICE = "CLUE.ERROR.DEPLOY.WITHOUT.DEVICE", - CLUE_ERROR_PYTHON_DEVICE_PROCESS = "CLUE.ERROR.PYTHON.DEVICE.PROCESS", - CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE = "CLUE.SUCCESS.COMMAND.DEPLOY.DEVICE", - - // Performance - CPX_PERFORMANCE_DEPLOY_DEVICE = "CPX.PERFORMANCE.DEPLOY.DEVICE", - CPX_PERFORMANCE_NEW_FILE = "CPX.PERFORMANCE.NEW.FILE", - CPX_PERFORMANCE_OPEN_SIMULATOR = "CPX.PERFORMANCE.OPEN.SIMULATOR", - - MICROBIT_PERFORMANCE_DEPLOY_DEVICE = "MICROBIT.PERFORMANCE.DEPLOY.DEVICE", - MICROBIT_PERFORMANCE_NEW_FILE = "MICROBIT.PERFORMANCE.NEW.FILE", - MICROBIT_PERFORMANCE_OPEN_SIMULATOR = "MICROBIT.PERFORMANCE.OPEN.SIMULATOR", - - CLUE_PERFORMANCE_DEPLOY_DEVICE = "CLUE.PERFORMANCE.DEPLOY.DEVICE", - CLUE_PERFORMANCE_NEW_FILE = "CLUE.PERFORMANCE.NEW.FILE", - CLUE_PERFORMANCE_OPEN_SIMULATOR = "CLUE.PERFORMANCE.OPEN.SIMULATOR", - - // Venv options - SETUP_VENV_CREATION_ERR = "SETUP.VENV.CREATION.ERR", - SETUP_NO_PIP = "SETUP.NO.PIP", - SETUP_DEP_INSTALL_FAIL = "SETUP.DEP.INSTALL.FAIL", - SETUP_AUTO_RESOLVE_PYTHON_PATH = "SETUP.AUTO.RESOLVE.PYTHON.PATH", - SETUP_NO_PYTHON_PATH = "SETUP.NO.PYTHON.PATH", - SETUP_DOWNLOAD_PYTHON = "SETUP.DOWNLOAD.PYTHON", - SETUP_INVALID_PYTHON_INTERPRETER_PATH = "SETUP.INVALID.PYTHON.INTERPRETER.PATH", - SETUP_INVALID_PYTHON_VER = "SETUP.INVALID.PYTHON.VER", - SETUP_INSTALL_VENV = "SETUP.INSTALL.VENV", - SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL = "SETUP.ORIGINAL.INTERPRETER.DEP.INSTALL", - SETUP_HAS_VENV = "SETUP.HAS.VENV", - SETUP_NO_DEPS_INSTALLED = "SETUP.NO.DEPS.INSTALLED", -} -export const DEFAULT_DEVICE = CONSTANTS.DEVICE_NAME.CPX; - -// tslint:disable-next-line: no-namespace -export namespace DialogResponses { - export const ACCEPT_AND_RUN: MessageItem = { - title: localize("dialogResponses.agreeAndRun", "Agree and Run"), - }; - export const AGREE_AND_PROCEED: MessageItem = { - title: localize("dialogResponses.agreeAndProceed", "Agree and Proceed"), - }; - export const CANCEL: MessageItem = { - title: localize("dialogResponses.cancel", "Cancel"), - }; - export const SELECT: MessageItem = { - title: localize("dialogResponses.select", "Select"), - }; - export const HELP: MessageItem = { - title: localize("dialogResponses.help", "I need help"), - }; - export const DONT_SHOW: MessageItem = { - title: localize("dialogResponses.dontShowAgain", "Don't Show Again"), - }; - export const NO: MessageItem = { - title: localize("dialogResponses.No", "No"), - }; - export const INSTALL_NOW: MessageItem = { - title: localize("dialogResponses.installNow", "Install Now"), - }; - export const DONT_INSTALL: MessageItem = { - title: localize("dialogResponses.dontInstall", "Don't Install"), - }; - export const PRIVACY_STATEMENT: MessageItem = { - title: localize("info.privacyStatement", "Privacy Statement"), - }; - export const TUTORIALS: MessageItem = { - title: localize("dialogResponses.tutorials", "Tutorials on Adafruit"), - }; - export const EXAMPLE_CODE: MessageItem = { - title: localize( - "dialogResponses.exampleCode", - "Example Code on GitHub" - ), - }; - export const MESSAGE_UNDERSTOOD: MessageItem = { - title: localize("dialogResponses.messageUnderstood", "Got It"), - }; - export const INSTALL_PIP: MessageItem = { - title: localize( - "dialogResponses.installPip", - "Install from Pip's webpage" - ), - }; - export const INSTALL_PYTHON: MessageItem = { - title: localize( - "dialogResponses.installPython", - "Install from python.org" - ), - }; - export const YES: MessageItem = { - title: localize("dialogResponses.Yes", "Yes"), - }; - export const READ_INSTALL_MD: MessageItem = { - title: localize( - "dialogResponses.readInstall", - "Read installation docs" - ), - }; -} - -export const CPX_CONFIG_FILE = path.join(".vscode", "cpx.json"); - -export const STATUS_BAR_PRIORITY = { - PORT: 20, - OPEN_PORT: 30, - BAUD_RATE: 40, -}; - -export const VERSIONS = { - MIN_PY_VERSION: "Python 3.7.0", -}; - -export const HELPER_FILES = { - CHECK_IF_VENV_PY: "check_if_venv.py", - CHECK_PYTHON_DEPENDENCIES: "check_python_dependencies.py", - DEVICE_PY: "device.py", - PROCESS_USER_CODE_PY: "process_user_code.py", - PYTHON_EXE: "python.exe", - PYTHON: "python", -}; - -export const GLOBAL_ENV_VARS = { - PYTHON: "python", - PYTHON3: "python3", -}; -export const LANGUAGE_VARS = { - PYTHON: { ID: "python", FILE_ENDS: ".py" }, -}; - -export default CONSTANTS; diff --git a/src/cpxWorkspace.ts b/src/cpxWorkspace.ts deleted file mode 100644 index 47239a79a..000000000 --- a/src/cpxWorkspace.ts +++ /dev/null @@ -1,26 +0,0 @@ -import * as fs from "fs"; -import * as path from "path"; -import * as vscode from "vscode"; - -export class CPXWorkspace { - static get rootPath(): string | undefined { - const workspaceFolders = vscode.workspace.workspaceFolders; - if (!workspaceFolders || workspaceFolders.length === 0) { - return undefined; - } - - for (const workspaceFolder of workspaceFolders) { - const workspaceFolderPath = workspaceFolder.uri.fsPath; - const cpxConfigPath = path.join( - workspaceFolderPath, - ".vscode", - "cpx.json" - ); - if (fs.existsSync(cpxConfigPath)) { - return workspaceFolderPath; - } - } - - return workspaceFolders[0].uri.fsPath; - } -} diff --git a/src/debug_user_code.py b/src/debug_user_code.py deleted file mode 100644 index a1ad6cb16..000000000 --- a/src/debug_user_code.py +++ /dev/null @@ -1,95 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -import os -import sys -import traceback -from pathlib import Path -import python_constants as CONSTANTS -import check_python_dependencies -from common import utils - -# will propagate errors if dependencies aren't sufficient -check_python_dependencies.check_for_dependencies() - -abs_path_to_parent_dir = os.path.dirname(os.path.abspath(__file__)) - -# Insert absolute path to Adafruit library for CPX into sys.path -abs_path_to_adafruit_lib = os.path.join( - abs_path_to_parent_dir, CONSTANTS.ADAFRUIT_LIBRARY_NAME -) -sys.path.insert(0, abs_path_to_adafruit_lib) - -# Insert absolute path to Micropython libraries for micro:bit into sys.path -abs_path_to_micropython_lib = os.path.join( - abs_path_to_parent_dir, CONSTANTS.MICROPYTHON_LIBRARY_NAME -) -sys.path.insert(0, abs_path_to_micropython_lib) - -# Insert absolute path to library for CLUE into sys.path -sys.path.insert(0, os.path.join(abs_path_to_parent_dir, CONSTANTS.CLUE)) - -# Insert absolute path to Circuitpython libraries for CLUE into sys.path -sys.path.insert(0, os.path.join(abs_path_to_parent_dir, CONSTANTS.CIRCUITPYTHON)) - -# This import must happen after the sys.path is modified -from common import debugger_communication_client - -# get board so we can get terminal handle -import board - -# get handle to terminal for clue -curr_terminal = board.DISPLAY.terminal - -## Execute User Code ## - -# Get user's code path -abs_path_to_code_file = "" -if len(sys.argv) > 1 and sys.argv[1]: - abs_path_to_code_file = sys.argv[1] -else: - raise FileNotFoundError(CONSTANTS.ERROR_NO_FILE) - -# Get Debugger Server Port -server_port = CONSTANTS.DEFAULT_PORT -if len(sys.argv) > 2: - server_port = sys.argv[2] - -# Init Communication -debugger_communication_client.init_connection(server_port) - -# Init API variables -utils.abs_path_to_user_file = abs_path_to_code_file -utils.debug_mode = True - -# overriding print function so that it shows on clue terminal -def print_decorator(func): - global curr_terminal - - def wrapped_func(*args, **kwargs): - curr_terminal.add_str_to_terminal("".join(str(e) for e in args)) - return func(*args, **kwargs) - - return wrapped_func - - -print = print_decorator(print) - -# Execute the user's code file -with open(abs_path_to_code_file, encoding="utf8") as user_code_file: - curr_terminal.add_str_to_terminal(CONSTANTS.CODE_START_MSG_CLUE) - user_code = user_code_file.read() - try: - codeObj = compile(user_code, abs_path_to_code_file, CONSTANTS.EXEC_COMMAND) - exec(codeObj, {"print": print}) - sys.stdout.flush() - except Exception as e: - exc_type, exc_value, exc_traceback = sys.exc_info() - errorMessage = CONSTANTS.ERROR_TRACEBACK - stackTrace = traceback.format_exception(exc_type, exc_value, exc_traceback) - - for frameIndex in range(2, len(stackTrace) - 1): - errorMessage += "\t" + str(stackTrace[frameIndex]) - print(e, errorMessage, file=sys.stderr, flush=True) - curr_terminal.add_str_to_terminal(CONSTANTS.CODE_FINISHED_MSG_CLUE) - board.DISPLAY.show(None) diff --git a/src/debugger/debugAdapter.ts b/src/debugger/debugAdapter.ts deleted file mode 100644 index 59a78482e..000000000 --- a/src/debugger/debugAdapter.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { DebugAdapterTracker, DebugConsole, DebugSession } from "vscode"; -import { DebuggerCommunicationService } from "../service/debuggerCommunicationService"; -import { MessagingService } from "../service/messagingService"; -import { DEBUG_COMMANDS } from "../view/constants"; - -export class DebugAdapter implements DebugAdapterTracker { - private readonly console: DebugConsole | undefined; - private readonly messagingService: MessagingService; - private debugCommunicationService: DebuggerCommunicationService; - constructor( - debugSession: DebugSession, - messagingService: MessagingService, - debugCommunicationService: DebuggerCommunicationService - ) { - this.console = debugSession.configuration.console; - this.messagingService = messagingService; - this.debugCommunicationService = debugCommunicationService; - } - onWillStartSession() { - // To Implement - } - onWillReceiveMessage(message: any): void { - if (message.command) { - // Only send pertinent debug messages - switch (message.command) { - case DEBUG_COMMANDS.CONTINUE: - this.messagingService.sendStartMessage(); - break; - case DEBUG_COMMANDS.STACK_TRACE: - this.messagingService.sendPauseMessage(); - break; - case DEBUG_COMMANDS.DISCONNECT: - // Triggered on stop event for debugger - if (!message.arguments.restart) { - this.debugCommunicationService.handleStopEvent(); - } - break; - } - } - } - // A debugger error should unlock the webview - onError() { - this.messagingService.sendStartMessage(); - } - // Device is always running when exiting debugging mode - onExit() { - this.messagingService.sendStartMessage(); - } -} diff --git a/src/debugger/debugAdapterFactory.ts b/src/debugger/debugAdapterFactory.ts deleted file mode 100644 index 5b0e2b401..000000000 --- a/src/debugger/debugAdapterFactory.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { - DebugAdapterTracker, - DebugAdapterTrackerFactory, - DebugSession, - ProviderResult, -} from "vscode"; -import { DebuggerCommunicationService } from "../service/debuggerCommunicationService"; -import { MessagingService } from "../service/messagingService"; -import { DebugAdapter } from "./debugAdapter"; - -export class DebugAdapterFactory implements DebugAdapterTrackerFactory { - private debugSession: DebugSession; - private messagingService: MessagingService; - private debugCommunicationService: DebuggerCommunicationService; - constructor( - debugSession: DebugSession, - messagingService: MessagingService, - debugCommunicationService: DebuggerCommunicationService - ) { - this.debugSession = debugSession; - this.messagingService = messagingService; - this.debugCommunicationService = debugCommunicationService; - } - public createDebugAdapterTracker( - session: DebugSession - ): ProviderResult { - return new DebugAdapter( - session, - this.messagingService, - this.debugCommunicationService - ); - } -} diff --git a/src/debuggerCommunicationServer.ts b/src/debuggerCommunicationServer.ts deleted file mode 100644 index 0fa4a65cc..000000000 --- a/src/debuggerCommunicationServer.ts +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as http from "http"; -import * as socketio from "socket.io"; -import { WebviewPanel } from "vscode"; -import { SERVER_INFO } from "./constants"; -import { DeviceSelectionService } from "./service/deviceSelectionService"; - -export const DEBUGGER_MESSAGES = { - EMITTER: { - INPUT_CHANGED: "input_changed", - RECEIVED_STATE: "received_state", - DISCONNECT: "process_disconnect", - }, - LISTENER: { - UPDATE_STATE: "updateState", - RECEIVED_STATE: "receivedState", - DISCONNECT: "disconnect", - }, -}; - -export class DebuggerCommunicationServer { - private port: number; - private serverHttp: http.Server; - private serverIo: socketio.Server; - private simulatorWebview: WebviewPanel | undefined; - private deviceSelectionService: DeviceSelectionService; - private isPendingResponse = false; - private pendingCallbacks: Function[] = []; - - constructor( - webviewPanel: WebviewPanel | undefined, - port = SERVER_INFO.DEFAULT_SERVER_PORT, - deviceSelectionService: DeviceSelectionService - ) { - this.port = port; - this.serverHttp = new http.Server(); - this.initHttpServer(); - - this.serverIo = socketio(this.serverHttp); - this.simulatorWebview = webviewPanel; - this.initEventsHandlers(); - console.info(`Server running on port ${this.port}`); - - this.deviceSelectionService = deviceSelectionService; - } - - // send the message to start closing the connection - public closeConnection(): void { - this.sendDisconnectEvent(); - } - - public setWebview(webviewPanel: WebviewPanel | undefined) { - this.simulatorWebview = webviewPanel; - } - // Events are pushed when the previous processed event is over - public emitInputChanged(newState: string): void { - if (this.isPendingResponse) { - this.pendingCallbacks.push(() => { - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, - newState - ); - }); - } else { - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, - newState - ); - this.isPendingResponse = true; - } - } - public disconnectFromPort() { - this.serverIo.close(); - this.serverHttp.close(); - } - private sendDisconnectEvent() { - this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); - } - - private initHttpServer(): void { - this.serverHttp.listen(this.port); - if (!this.serverHttp.listening) { - throw new Error(SERVER_INFO.ERROR_CODE_INIT_SERVER); - } - } - - private initEventsHandlers(): void { - this.serverIo.on("connection", (socket: any) => { - socket.on(DEBUGGER_MESSAGES.LISTENER.UPDATE_STATE, (data: any) => { - this.handleState(data); - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.RECEIVED_STATE, - {} - ); - }); - socket.on(DEBUGGER_MESSAGES.LISTENER.RECEIVED_STATE, () => { - if (this.pendingCallbacks.length > 0) { - const currentCall = this.pendingCallbacks.shift(); - currentCall(); - this.isPendingResponse = true; - } else { - this.isPendingResponse = false; - } - }); - - socket.on(DEBUGGER_MESSAGES.LISTENER.DISCONNECT, () => { - this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); - if (this.simulatorWebview) { - this.simulatorWebview.webview.postMessage({ - command: "reset-state", - }); - } - }); - }); - } - - private handleState(data: any): void { - try { - const messageToWebview = JSON.parse(data); - if (messageToWebview.type === "state") { - const messageState = JSON.parse(messageToWebview.data); - if ( - this.simulatorWebview && - messageState.device_name === - this.deviceSelectionService.getCurrentActiveDevice() - ) { - this.simulatorWebview.webview.postMessage({ - active_device: this.deviceSelectionService.getCurrentActiveDevice(), - command: "set-state", - state: messageState, - }); - } - } - } catch (err) { - console.error(`Error: Non-JSON output from the process : ${data}`); - } - } -} diff --git a/src/dev-requirements.txt b/src/dev-requirements.txt deleted file mode 100644 index 26f334b51..000000000 --- a/src/dev-requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ --r ./requirements.txt -black==19.10b0 -pytest==5.0.1 \ No newline at end of file diff --git a/src/device.py b/src/device.py deleted file mode 100644 index def9673b0..000000000 --- a/src/device.py +++ /dev/null @@ -1,121 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -from subprocess import check_output -import string -import os -import sys -import shutil -import json -import uflash -import python_constants as CONSTANTS - -if sys.platform == "win32": - # pylint: disable=import-error - import win32api - - -class Device: - def __init__(self, name, file_path): - self.name = name - self.file_path = file_path - self.connected = False - self.error_message = None - - def find_adafruit_device_directory(self): - """ - Check if the Adafruit Device is available/plugged in - """ - found_directory = None - - if sys.platform.startswith(CONSTANTS.LINUX_OS) or sys.platform.startswith( - CONSTANTS.MAC_OS - ): - # Mac or Linux - mounted = ( - check_output(CONSTANTS.MOUNT_COMMAND) - .decode(CONSTANTS.UTF_FORMAT) - .split("\n") - ) - for mount in mounted: - drive_path = mount.split()[2] if mount else "" - if drive_path.endswith(CONSTANTS.ADAFRUIT_DRIVE_NAME): - found_directory = drive_path - break - elif sys.platform == CONSTANTS.WINDOWS_OS: - # Windows - for drive_letter in string.ascii_uppercase: - drive_path = "{}:{}".format(drive_letter, os.sep) - if os.path.exists(drive_path): - drive_name = win32api.GetVolumeInformation(drive_path)[0] - if drive_name == CONSTANTS.ADAFRUIT_DRIVE_NAME: - found_directory = drive_path - break - else: - raise NotImplementedError(CONSTANTS.NOT_SUPPORTED_OS.format(sys.platform)) - - if not found_directory: - self.connected = False - self.error_message = ( - CONSTANTS.NO_ADAFRUIT_DEVICE_DETECTED_ERROR_TITLE, - CONSTANTS.NO_ADAFRUIT_DEVICE_DETECTED_ERROR_DETAIL.format(sys.platform), - ) - else: - self.connected = True - self.error_message = None - return found_directory - - def deployToAdafruitDevice(self): - device_directory = self.find_adafruit_device_directory() - if self.error_message: - print( - "{}:\t{}".format(self.error_message[0], self.error_message[1]), - file=sys.stderr, - flush=True, - ) - if self.connected: - original_file_name = self.file_path.rsplit(os.sep, 1)[-1] - if original_file_name == "code.py" or original_file_name == "main.py": - dest_path = os.path.join(device_directory, original_file_name) - else: - dest_path = os.path.join(device_directory, "code.py") - shutil.copyfile(self.file_path, dest_path) - message = {"type": "complete"} - else: - message = {"type": "no-device"} - return message - - def deployToMicrobit(self): - # Temporarily redirecting stdout because there are some print statements in uflash library - fake_stdout = open(os.devnull, "w") - _stdout = sys.stdout - sys.stdout = fake_stdout - - try: - uflash.flash(path_to_python=self.file_path) - message = {"type": "complete"} - except RuntimeError: - message = {"type": "low-python-version"} - except IOError: - self.error_message = CONSTANTS.NO_MICROBIT_DETECTED_ERROR_TITLE - print( - self.error_message, file=sys.stderr, flush=True, - ) - message = {"type": "no-device"} - - sys.stdout = _stdout - return message - - def deploy(self): - if self.name == CONSTANTS.MICROBIT: - return self.deployToMicrobit() - elif self.name == CONSTANTS.CPX or self.name == CONSTANTS.CLUE: - return self.deployToAdafruitDevice() - else: - return {"type": "no-device"} - - -if __name__ == "__main__": - device = Device(sys.argv[1], sys.argv[2]) - message = device.deploy() - print(json.dumps(message), flush=True) diff --git a/src/deviceContext.ts b/src/deviceContext.ts deleted file mode 100644 index a4f0afd2e..000000000 --- a/src/deviceContext.ts +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Credit: A majority of this code was taken from the Visual Studio Code Arduino extension with some modifications to suit our purposes. - -import * as fs from "fs"; -import * as path from "path"; -import * as vscode from "vscode"; -import CONSTANTS, { CPX_CONFIG_FILE } from "./constants"; -import { CPXWorkspace } from "./cpxWorkspace"; -import * as utils from "./extension_utils/utils"; - -export class DeviceContext implements vscode.Disposable { - public static getInstance(): DeviceContext { - return DeviceContext._deviceContext; - } - - private static _deviceContext: DeviceContext = new DeviceContext(); - - private _onDidChange = new vscode.EventEmitter(); - private _watcher: vscode.FileSystemWatcher; - private _vscodeWatcher: vscode.FileSystemWatcher; - private _port!: string; - - private constructor() { - if (vscode.workspace && CPXWorkspace.rootPath) { - this._watcher = vscode.workspace.createFileSystemWatcher( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ); - this._vscodeWatcher = vscode.workspace.createFileSystemWatcher( - path.join(CPXWorkspace.rootPath, ".vscode"), - true, - true, - false - ); - - // Reloads the config into the code if the cpx config file has changed - this._watcher.onDidCreate(() => this.loadContext()); - this._watcher.onDidChange(() => this.loadContext()); - this._watcher.onDidDelete(() => this.loadContext()); - - this._vscodeWatcher.onDidDelete(() => this.loadContext()); - } - } - - public loadContext(): Thenable { - return vscode.workspace.findFiles(CPX_CONFIG_FILE, null, 1).then( - files => { - let cpxConfigJson: any = {}; - if (files && files.length > 0) { - const configFile = files[0]; - cpxConfigJson = utils.tryParseJSON( - fs.readFileSync(configFile.fsPath, "utf8") - ); - if (cpxConfigJson) { - this._port = cpxConfigJson.port; - this._onDidChange.fire(); - } else { - console.error(CONSTANTS.ERROR.CPX_FILE_ERROR); - } - } else { - this._port = null; - this._onDidChange.fire(); - } - return this; - }, - reason => { - this._port = null; - this._onDidChange.fire(); - return this; - } - ); - } - - public saveContext() { - if (!CPXWorkspace.rootPath) { - return; - } - const cpxConfigFile = path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE); - let cpxConfigJson: any = {}; - if (utils.fileExistsSync(cpxConfigFile)) { - cpxConfigJson = utils.tryParseJSON( - fs.readFileSync(cpxConfigFile, "utf8") - ); - } - if (!cpxConfigJson) { - // log and notify user error - return; - } - cpxConfigJson.port = this.port; - - utils.mkdirRecursivelySync(path.dirname(cpxConfigFile)); - fs.writeFileSync( - cpxConfigFile, - JSON.stringify( - cpxConfigJson, - (key, value) => { - if (value === null) { - return undefined; - } - return value; - }, - 4 - ) - ); - } - - public dispose() { - if (this._watcher) { - this._watcher.dispose(); - } - - if (this._vscodeWatcher) { - this._vscodeWatcher.dispose(); - } - } - - public async initialize() { - if ( - CPXWorkspace.rootPath && - utils.fileExistsSync( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ) - ) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.CPX_JSON_ALREADY_GENERATED - ); - return; - } else { - if (!CPXWorkspace.rootPath) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.PLEASE_OPEN_FOLDER - ); - return; - } - } - } - - public get onDidChange(): vscode.Event { - return this._onDidChange.event; - } - - public get port() { - return this._port; - } - - public set port(value: string) { - this._port = value; - this.saveContext(); - } -} diff --git a/src/extension.ts b/src/extension.ts deleted file mode 100644 index 5940217dc..000000000 --- a/src/extension.ts +++ /dev/null @@ -1,1101 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as cp from "child_process"; -import * as fs from "fs"; -import * as open from "open"; -import * as path from "path"; -import * as vscode from "vscode"; -import { - CONFIG, - CONSTANTS, - CPX_CONFIG_FILE, - DialogResponses, - GLOBAL_ENV_VARS, - HELPER_FILES, - LANGUAGE_VARS, - SERVER_INFO, - TelemetryEventName, -} from "./constants"; -import { CPXWorkspace } from "./cpxWorkspace"; -import { DebugAdapterFactory } from "./debugger/debugAdapterFactory"; -import { DebuggerCommunicationServer } from "./debuggerCommunicationServer"; -import * as utils from "./extension_utils/utils"; -import { SerialMonitor } from "./serialMonitor"; -import { DebuggerCommunicationService } from "./service/debuggerCommunicationService"; -import { DeviceSelectionService } from "./service/deviceSelectionService"; -import { FileSelectionService } from "./service/fileSelectionService"; -import { MessagingService } from "./service/messagingService"; -import { PopupService } from "./service/PopupService"; -import { SetupService } from "./service/setupService"; -import { TelemetryHandlerService } from "./service/telemetryHandlerService"; -import { WebviewService } from "./service/webviewService"; -import { SimulatorDebugConfigurationProvider } from "./simulatorDebugConfigurationProvider"; -import getPackageInfo from "./telemetry/getPackageInfo"; -import TelemetryAI from "./telemetry/telemetryAI"; -import { UsbDetector } from "./usbDetector"; -import { - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, - WEBVIEW_TYPES, -} from "./view/constants"; - -let telemetryAI: TelemetryAI; -let pythonExecutablePath: string = GLOBAL_ENV_VARS.PYTHON; -let configFileCreated: boolean = false; -let inDebugMode: boolean = false; -// Notification booleans -let firstTimeClosed: boolean = true; -let shouldShowRunCodePopup: boolean = true; - -let setupService: SetupService; -const deviceSelectionService = new DeviceSelectionService(); -const messagingService = new MessagingService(deviceSelectionService); -const debuggerCommunicationService = new DebuggerCommunicationService(); -const fileSelectionService = new FileSelectionService(messagingService); - -let pythonProcessDataBuffer: string[]; - -export let outChannel: vscode.OutputChannel | undefined; - -const sendCurrentDeviceMessage = (currentPanel: vscode.WebviewPanel) => { - if (currentPanel) { - currentPanel.webview.postMessage({ - command: VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE, - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } -}; -// Extension activation -export async function activate(context: vscode.ExtensionContext) { - telemetryAI = new TelemetryAI(context); - setupService = new SetupService(telemetryAI); - let currentPanel: vscode.WebviewPanel | undefined; - let childProcess: cp.ChildProcess | undefined; - let messageListener: vscode.Disposable; - let activeEditorListener: vscode.Disposable; - const webviewService = new WebviewService(context, deviceSelectionService); - const telemetryHandlerService = new TelemetryHandlerService( - telemetryAI, - deviceSelectionService - ); - const formalNameToNickNameMapping = { - [CONSTANTS.DEVICE_NAME_FORMAL.CPX]: CONSTANTS.DEVICE_NAME.CPX, - [CONSTANTS.DEVICE_NAME_FORMAL.MICROBIT]: CONSTANTS.DEVICE_NAME.MICROBIT, - [CONSTANTS.DEVICE_NAME_FORMAL.CLUE]: CONSTANTS.DEVICE_NAME.CLUE, - }; - - // Add our library path to settings.json for autocomplete functionality - updatePythonExtraPaths(); - - // ignore import errors so that adafruit_circuitplayground library - // doesn't trigger lint errors - updatePylintArgs(context); - - pythonExecutablePath = await setupService.setupEnv(context); - - try { - utils.generateCPXConfig(); - configFileCreated = true; - } catch (err) { - console.info("Failed to create the CPX config file."); - configFileCreated = false; - } - - if (pythonExecutablePath === "") { - return; - } - - if (outChannel === undefined) { - outChannel = vscode.window.createOutputChannel(CONSTANTS.NAME); - utils.logToOutputChannel(outChannel, CONSTANTS.INFO.WELCOME_OUTPUT_TAB); - } - - vscode.workspace.onDidSaveTextDocument( - async (document: vscode.TextDocument) => { - await fileSelectionService.updateCurrentFileFromTextFile(document); - } - ); - - const currVersionReleaseName = - "release_note_" + getPackageInfo(context).extensionVersion; - const viewedReleaseNote = context.globalState.get( - currVersionReleaseName, - false - ); - - if (!viewedReleaseNote) { - PopupService.openReleaseNote(); - context.globalState.update(currVersionReleaseName, true); - } - - const openWebview = () => { - if (currentPanel && currentPanel.webview) { - messagingService.setWebview(currentPanel.webview); - currentPanel.webview.html = webviewService.getWebviewContent( - WEBVIEW_TYPES.SIMULATOR, - true, - currentPanel - ); - currentPanel.reveal(vscode.ViewColumn.Beside); - } else { - currentPanel = vscode.window.createWebviewPanel( - CONSTANTS.WEBVIEW_TYPE.SIMULATOR, - CONSTANTS.LABEL.WEBVIEW_PANEL, - { preserveFocus: true, viewColumn: vscode.ViewColumn.Beside }, - { - // Only allow the webview to access resources in our extension's media directory - localResourceRoots: [ - vscode.Uri.file( - path.join( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY - ) - ), - ], - enableScripts: true, - } - ); - - currentPanel.webview.html = webviewService.getWebviewContent( - WEBVIEW_TYPES.SIMULATOR, - true, - currentPanel - ); - messagingService.setWebview(currentPanel.webview); - - if (messageListener !== undefined) { - messageListener.dispose(); - const index = context.subscriptions.indexOf(messageListener); - if (index > -1) { - context.subscriptions.splice(index, 1); - } - } - - if (activeEditorListener !== undefined) { - activeEditorListener.dispose(); - const index = context.subscriptions.indexOf( - activeEditorListener - ); - if (index > -1) { - context.subscriptions.splice(index, 1); - } - } - - if (currentPanel) { - // Handle messages from webview - messageListener = currentPanel.webview.onDidReceiveMessage( - message => { - const messageJson = JSON.stringify({ - active_device: deviceSelectionService.getCurrentActiveDevice(), - state: message.text, - }); - switch (message.command) { - case WEBVIEW_MESSAGES.BUTTON_PRESS: - // Send input to the Python process - telemetryHandlerService.handleButtonPressTelemetry( - message.text - ); - console.log(`About to write ${messageJson} \n`); - if ( - inDebugMode && - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .emitInputChanged(messageJson); - } else if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - break; - case WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP: - console.log(`Play button ${messageJson} \n`); - if (message.text.state as boolean) { - fileSelectionService.setPathAndSendMessage( - message.text.selected_file - ); - fileSelectionService.findCurrentTextDocument(); - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_RUN_SIMULATOR_BUTTON - ); - runSimulatorCommand(); - } else { - killProcessIfRunning(); - } - - if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - - break; - case WEBVIEW_MESSAGES.GESTURE: - case WEBVIEW_MESSAGES.SENSOR_CHANGED: - telemetryHandlerService.handleGestureTelemetry( - message.text - ); - console.log(`Sensor changed ${messageJson} \n`); - if ( - inDebugMode && - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .emitInputChanged(messageJson); - } else if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - break; - case WEBVIEW_MESSAGES.REFRESH_SIMULATOR: - console.log("Refresh button"); - runSimulatorCommand(); - break; - case WEBVIEW_MESSAGES.SLIDER_TELEMETRY: - telemetryHandlerService.handleSensorTelemetry( - message.text - ); - break; - case WEBVIEW_MESSAGES.SWITCH_DEVICE: - deviceSelectionService.setCurrentActiveDevice( - message.text.active_device - ); - killProcessIfRunning(); - break; - default: - vscode.window.showInformationMessage( - CONSTANTS.ERROR.UNEXPECTED_MESSAGE - ); - break; - } - }, - undefined, - context.subscriptions - ); - - activeEditorListener = utils.addVisibleTextEditorCallback( - currentPanel, - context - ); - } - - currentPanel.onDidDispose( - () => { - currentPanel = undefined; - if ( - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .setWebview(undefined); - } - killProcessIfRunning(); - if (firstTimeClosed) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.FIRST_TIME_WEBVIEW - ); - firstTimeClosed = false; - } - }, - undefined, - context.subscriptions - ); - } - sendCurrentDeviceMessage(currentPanel); - }; - - // Open Simulator on the webview - const openSimulator: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.openSimulator", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_SIMULATE_TO, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - deviceSelectionService.setCurrentActiveDevice(device); - const telemetryEvents = telemetryHandlerService.getTelemetryEventsForOpenSimulator( - device - ); - telemetryAI.trackFeatureUsage( - telemetryEvents.openSimulatorTelemetryEvent - ); - telemetryAI.runWithLatencyMeasure( - openWebview, - telemetryEvents.openSimulatorPerformanceTelemetryEvent - ); - } - ); - - const gettingStartedOpen: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.gettingStarted", - () => { - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_GETTING_STARTED - ); - webviewService.openTutorialPanel(); - } - ); - - const openTemplateFile = (template: string) => { - const fileName = template; - const filePath = - __dirname + path.sep + "templates" + path.sep + fileName; - const file = fs.readFileSync(filePath, "utf8"); - const showNewFilePopup: boolean = vscode.workspace - .getConfiguration() - .get(CONFIG.SHOW_NEW_FILE_POPUP); - - if (showNewFilePopup && template === CONSTANTS.TEMPLATE.CPX) { - vscode.window - .showInformationMessage( - CONSTANTS.INFO.NEW_FILE, - DialogResponses.DONT_SHOW, - DialogResponses.EXAMPLE_CODE, - DialogResponses.TUTORIALS - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.DONT_SHOW) { - vscode.workspace - .getConfiguration() - .update(CONFIG.SHOW_NEW_FILE_POPUP, false); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_DONT_SHOW - ); - } else if (selection === DialogResponses.EXAMPLE_CODE) { - open(CONSTANTS.LINKS.EXAMPLE_CODE); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_EXAMPLE_CODE - ); - } else if (selection === DialogResponses.TUTORIALS) { - const okAction = () => { - open(CONSTANTS.LINKS.TUTORIALS); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_TUTORIALS - ); - }; - utils.showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT - ); - } - }); - } - - // tslint:disable-next-line: ban-comma-operator - vscode.workspace - .openTextDocument({ - content: file, - language: LANGUAGE_VARS.PYTHON.ID, - }) - .then((template: vscode.TextDocument) => { - vscode.window.showTextDocument(template, 1, false).then(() => { - openWebview(); - }); - }), - // tslint:disable-next-line: no-unused-expression - (error: any) => { - telemetryHandlerService.handleNewFileErrorTelemetry(); - console.error(`Failed to open a new text document: ${error}`); - }; - }; - - const newFile: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.newFile", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_FOR_NEW_FILE, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - deviceSelectionService.setCurrentActiveDevice(device); - - const deviceToTemplateMapping = { - [CONSTANTS.DEVICE_NAME.CPX]: CONSTANTS.TEMPLATE.CPX, - [CONSTANTS.DEVICE_NAME.MICROBIT]: CONSTANTS.TEMPLATE.MICROBIT, - [CONSTANTS.DEVICE_NAME.CLUE]: CONSTANTS.TEMPLATE.CLUE, - }; - const templateFile = deviceToTemplateMapping[device]; - - const telemetryEvents = telemetryHandlerService.getTelemetryEventsForNewFile( - device - ); - - telemetryAI.trackFeatureUsage( - telemetryEvents.newFileTelemetryEvent - ); - telemetryAI.runWithLatencyMeasure( - () => openTemplateFile(templateFile), - telemetryEvents.newFilePerformanceTelemetryEvent - ); - } - ); - - const installDependencies: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.installDependencies", - async () => { - pythonExecutablePath = await setupService.setupEnv(context, true); - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_INSTALL_EXTENSION_DEPENDENCIES - ); - } - ); - - const killProcessIfRunning = () => { - if (childProcess !== undefined) { - if (currentPanel) { - currentPanel.webview.postMessage({ - command: "reset-state", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } - // TODO: We need to check the process was correctly killed - childProcess.kill(); - childProcess = undefined; - } - }; - - const runSimulatorCommand = async () => { - pythonProcessDataBuffer = []; - // Prevent running new code if a debug session is active - if (inDebugMode) { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.DEBUGGING_SESSION_IN_PROGESS - ); - return; - } - if (shouldShowRunCodePopup) { - const shouldExitCommand = await vscode.window - .showWarningMessage( - CONSTANTS.WARNING.ACCEPT_AND_RUN, - DialogResponses.ACCEPT_AND_RUN, - DialogResponses.CANCEL - ) - .then((selection: vscode.MessageItem | undefined) => { - let hasAccepted = true; - if (selection === DialogResponses.ACCEPT_AND_RUN) { - shouldShowRunCodePopup = false; - hasAccepted = false; - } - return hasAccepted; - }); - // Don't run users code if they don't accept - if (shouldExitCommand) { - return; - } - } - - openWebview(); - - if (!currentPanel) { - return; - } - - console.info(CONSTANTS.INFO.RUNNING_CODE); - - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_SIMULATOR, - true - ); - - killProcessIfRunning(); - - await fileSelectionService.updateCurrentFileFromEditor( - vscode.window.activeTextEditor - ); - - if (fileSelectionService.getCurrentFileAbsPath() === "") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_RUN, - true - ); - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FILE_TO_RUN, - DialogResponses.MESSAGE_UNDERSTOOD - ); - } else { - // Save on run - await fileSelectionService.getCurrentTextDocument().save(); - - if ( - !fileSelectionService - .getCurrentTextDocument() - .fileName.endsWith(LANGUAGE_VARS.PYTHON.FILE_ENDS) - ) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_RUN, - true - ); - return; - } - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.FILE_SELECTED( - fileSelectionService.getCurrentFileAbsPath() - ) - ); - - // Activate the run webview button - currentPanel.webview.postMessage({ - command: "activate-play", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - const args = [ - utils.getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.PROCESS_USER_CODE_PY - ), - fileSelectionService.getCurrentFileAbsPath(), - JSON.stringify({ enable_telemetry: utils.getTelemetryState() }), - ]; - childProcess = cp.spawn(pythonExecutablePath, args); - - let dataFromTheProcess = ""; - let oldMessage = ""; - - // Data received from Python process - childProcess.stdout.on("data", data => { - dataFromTheProcess = data.toString(); - if (currentPanel) { - // NOTE: parts of the flow regarding pythonProcessDataBuffer - // are needed for the CLUE simulator to properly receive - // base_64 strings on UNIX systems. - - // added any incomplete data to beginning - const processedData = pythonProcessDataBuffer - .join("") - .concat(dataFromTheProcess); - pythonProcessDataBuffer = []; - - // Process the data from the process and send one state at a time - processedData.split("\0").forEach(message => { - if ( - currentPanel && - message.length > 0 && - message !== oldMessage - ) { - oldMessage = message; - let messageToWebview; - // Check the message is a JSON - try { - messageToWebview = JSON.parse(message); - // Check the JSON is a state - switch (messageToWebview.type) { - case "state": - const messageData = JSON.parse( - messageToWebview.data - ); - if ( - messageData.device_name === - deviceSelectionService.getCurrentActiveDevice() - ) { - messagingService.sendMessageToWebview( - VSCODE_MESSAGES_TO_WEBVIEW.SET_STATE, - messageData - ); - } - break; - - case "print": - console.log( - `Process print statement output = ${messageToWebview.data}` - ); - utils.logToOutputChannel( - outChannel, - `[PRINT] ${messageToWebview.data}` - ); - break; - - default: - console.log( - `Non-state JSON output from the process : ${messageToWebview}` - ); - break; - } - } catch (err) { - if (err instanceof SyntaxError) { - // if not a JSON string, it is incomplete - // add to beginning of next strings - pythonProcessDataBuffer.push(message); - } else { - console.log( - `Errored output: ${messageToWebview}` - ); - } - } - } - }); - } - }); - - // Std error output - childProcess.stderr.on("data", data => { - console.error( - `Error from the Python process through stderr: ${data}` - ); - telemetryAI.trackFeatureUsage( - TelemetryEventName.ERROR_PYTHON_PROCESS - ); - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.STDERR(data), - true - ); - if (currentPanel) { - currentPanel.webview.postMessage({ - active_device: deviceSelectionService.getCurrentActiveDevice(), - command: "reset-state", - }); - } - }); - - // When the process is done - childProcess.on("end", (code: number) => { - console.info(`Command execution exited with code: ${code}`); - }); - } - }; - - // Send message to the webview - const runSimulator: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.runSimulator", - () => { - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_RUN_PALETTE - ); - runSimulatorCommand(); - } - ); - - const deployCode = async (device: string) => { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_DEVICE, - true - ); - - await fileSelectionService.updateCurrentFileFromEditor( - vscode.window.activeTextEditor - ); - - if (fileSelectionService.getCurrentFileAbsPath() === "") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, - true - ); - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, - DialogResponses.MESSAGE_UNDERSTOOD - ); - } else { - await fileSelectionService.getCurrentTextDocument().save(); - - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.FILE_SELECTED( - fileSelectionService.getCurrentFileAbsPath() - ) - ); - - const deviceProcess = cp.spawn(pythonExecutablePath, [ - utils.getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.DEVICE_PY - ), - device, - fileSelectionService.getCurrentFileAbsPath(), - ]); - - let dataFromTheProcess = ""; - - // Data received from Python process - deviceProcess.stdout.on("data", data => { - dataFromTheProcess = data.toString(); - - let messageToWebview; - try { - messageToWebview = JSON.parse(dataFromTheProcess); - if (messageToWebview.type === "complete") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_SUCCESS, - true - ); - } - telemetryHandlerService.handleDeployToDeviceFinishedTelemetry( - messageToWebview, - device - ); - } catch (err) { - console.log( - `Non-JSON output from the process : ${dataFromTheProcess}` - ); - } - }); - - // Std error output - deviceProcess.stderr.on("data", data => { - telemetryHandlerService.handleDeployToDeviceErrorTelemetry( - data, - device - ); - console.error( - `Error from the Python device process through stderr: ${data}` - ); - utils.logToOutputChannel( - outChannel, - `[ERROR] ${data} \n`, - true - ); - }); - - // When the process is done - deviceProcess.on("end", (code: number) => { - console.info(`Command execution exited with code: ${code}`); - }); - } - }; - - const deployToDevice: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.deployToDevice", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_DEPLOY_TO, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - - const telemetryEvents = telemetryHandlerService.getTelemetryEventsForStartingDeployToDevice( - device - ); - - telemetryAI.trackFeatureUsage(telemetryEvents.deployTelemetryEvent); - telemetryAI.runWithLatencyMeasure(() => { - deployCode(device); - }, telemetryEvents.deployPerformanceTelemetryEvent); - } - ); - - let serialMonitor: SerialMonitor | undefined; - if (configFileCreated) { - serialMonitor = SerialMonitor.getInstance(); - context.subscriptions.push(serialMonitor); - } - - const selectSerialPort: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.selectSerialPort", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.selectSerialPort(null, null); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CHOOSE_PORT); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const openSerialMonitor: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.openSerialMonitor", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure( - serialMonitor.openSerialMonitor.bind(serialMonitor), - TelemetryEventName.COMMAND_SERIAL_MONITOR_OPEN - ); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const changeBaudRate: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.changeBaudRate", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure( - serialMonitor.changeBaudRate.bind(serialMonitor), - TelemetryEventName.COMMAND_SERIAL_MONITOR_BAUD_RATE - ); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const closeSerialMonitor: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.closeSerialMonitor", - (port, showWarning = true) => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.closeSerialMonitor(port, showWarning); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const showReleaseNote = vscode.commands.registerCommand( - "deviceSimulatorExpress.", - (port, showWarning = true) => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.closeSerialMonitor(port, showWarning); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - UsbDetector.getInstance().initialize(context.extensionPath); - UsbDetector.getInstance().startListening(); - - if ( - CPXWorkspace.rootPath && - (utils.fileExistsSync( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ) || - vscode.window.activeTextEditor) - ) { - (() => { - if (!SerialMonitor.getInstance().initialized) { - SerialMonitor.getInstance().initialize(); - } - })(); - } - - // Debugger configuration - const simulatorDebugConfiguration = new SimulatorDebugConfigurationProvider( - utils.getPathToScript(context, "out/", "debug_user_code.py") - ); - - const debugAdapterFactory = new DebugAdapterFactory( - vscode.debug.activeDebugSession, - messagingService, - debuggerCommunicationService - ); - vscode.debug.registerDebugAdapterTrackerFactory( - LANGUAGE_VARS.PYTHON.ID, - debugAdapterFactory - ); - // On Debug Session Start: Init comunication - const debugSessionsStarted = vscode.debug.onDidStartDebugSession(() => { - if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { - // Reinitialize process - killProcessIfRunning(); - inDebugMode = true; - - try { - // Shut down existing server on debug restart - if (debuggerCommunicationService.getCurrentDebuggerServer()) { - debuggerCommunicationService.resetCurrentDebuggerServer(); - } - - debuggerCommunicationService.setCurrentDebuggerServer( - new DebuggerCommunicationServer( - currentPanel, - utils.getServerPortConfig(), - deviceSelectionService - ) - ); - - telemetryHandlerService.handleDebuggerTelemetry(); - - openWebview(); - if (currentPanel) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .setWebview(currentPanel); - currentPanel.webview.postMessage({ - active_device: deviceSelectionService.getCurrentActiveDevice(), - command: "activate-play", - }); - } - } catch (err) { - if (err.message === SERVER_INFO.ERROR_CODE_INIT_SERVER) { - console.error( - `Error trying to init the server on port ${utils.getServerPortConfig()}` - ); - - telemetryHandlerService.handleDebuggerFailTelemetry(); - - vscode.window.showErrorMessage( - CONSTANTS.ERROR.DEBUGGER_SERVER_INIT_FAILED( - utils.getServerPortConfig() - ) - ); - } - } - } - }); - - // On Debug Session Stop: Stop communiation - const debugSessionStopped = vscode.debug.onDidTerminateDebugSession(() => { - if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { - inDebugMode = false; - simulatorDebugConfiguration.deviceSimulatorExpressDebug = false; - if (debuggerCommunicationService.getCurrentDebuggerServer()) { - debuggerCommunicationService.resetCurrentDebuggerServer(); - } - if (currentPanel) { - currentPanel.webview.postMessage({ - command: "reset-state", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } - } - }); - - const configsChanged = vscode.workspace.onDidChangeConfiguration( - async () => { - if (utils.checkConfig(CONFIG.CONFIG_ENV_ON_SWITCH)) { - pythonExecutablePath = await setupService.setupEnv(context); - } - } - ); - - context.subscriptions.push( - installDependencies, - runSimulator, - changeBaudRate, - closeSerialMonitor, - deployToDevice, - newFile, - openSimulator, - openSerialMonitor, - selectSerialPort, - gettingStartedOpen, - vscode.debug.registerDebugConfigurationProvider( - CONSTANTS.DEBUG_CONFIGURATION_TYPE, - simulatorDebugConfiguration - ), - debugSessionsStarted, - debugSessionStopped, - configsChanged - ); -} - -const updatePythonExtraPaths = () => { - updateConfigLists( - "python.autoComplete.extraPaths", - [ - __dirname, - path.join(__dirname, CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY), - path.join(__dirname, CONSTANTS.FILESYSTEM.CLUE), - path.join(__dirname, CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON), - ], - vscode.ConfigurationTarget.Global - ); -}; - -const updatePylintArgs = (context: vscode.ExtensionContext) => { - const outPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY - ); - const micropythonPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY - ); - - const cluePath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.CLUE - ); - - const baseCircuitPythonPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON - ); - // update pylint args to extend system path - // to include python libs local to extention - updateConfigLists( - "python.linting.pylintArgs", - [ - "--init-hook", - `import sys; sys.path.extend([\"${outPath}\",\"${micropythonPath}\",\"${cluePath}\",\"${baseCircuitPythonPath}\"])`, - ], - vscode.ConfigurationTarget.Workspace - ); -}; - -const updateConfigLists = ( - section: string, - newItems: string[], - scope: vscode.ConfigurationTarget -) => { - // function for adding elements to configuration arrays - const currentExtraItems: string[] = - vscode.workspace.getConfiguration().get(section) || []; - const extraItemsSet: Set = new Set( - currentExtraItems.concat(newItems) - ); - - vscode.workspace - .getConfiguration() - .update(section, Array.from(extraItemsSet), scope); -}; - -// this method is called when your extension is deactivated -export async function deactivate() { - const monitor: SerialMonitor = SerialMonitor.getInstance(); - await monitor.closeSerialMonitor(null, false); - UsbDetector.getInstance().stopListening(); -} diff --git a/src/extension_utils/utils.ts b/src/extension_utils/utils.ts deleted file mode 100644 index b7be3b71c..000000000 --- a/src/extension_utils/utils.ts +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as cp from "child_process"; -import * as fs from "fs"; -import * as path from "path"; -import * as util from "util"; -import * as vscode from "vscode"; -import { - CONSTANTS, - CPX_CONFIG_FILE, - DialogResponses, - GLOBAL_ENV_VARS, - SERVER_INFO, -} from "../constants"; -import { CPXWorkspace } from "../cpxWorkspace"; -import { DeviceContext } from "../deviceContext"; - -export const exec = util.promisify(cp.exec); - -const errorChannel = vscode.window.createOutputChannel( - CONSTANTS.ERROR.INSTALLATION_ERROR -); - -// tslint:disable-next-line: export-name -export const getPathToScript = ( - context: vscode.ExtensionContext, - folderName: string, - fileName: string = "" -) => { - const onDiskPath = vscode.Uri.file( - path.join(context.extensionPath, folderName, fileName) - ); - const scriptPath = onDiskPath.with({ scheme: "vscode-resource" }); - return scriptPath.fsPath; -}; - -export const showPrivacyModal = ( - okAction: () => void, - thirdPartyDisclaimer: string -) => { - vscode.window - .showInformationMessage( - `${thirdPartyDisclaimer}: ${CONSTANTS.LINKS.PRIVACY}`, - DialogResponses.AGREE_AND_PROCEED, - DialogResponses.CANCEL - ) - .then((privacySelection: vscode.MessageItem | undefined) => { - if (privacySelection === DialogResponses.AGREE_AND_PROCEED) { - okAction(); - } else if (privacySelection === DialogResponses.CANCEL) { - // do nothing - } - }); -}; - -export const logToOutputChannel = ( - outChannel: vscode.OutputChannel | undefined, - message: string, - show: boolean = false -): void => { - if (outChannel) { - if (show) { - outChannel.show(true); - } - outChannel.append(message); - } -}; - -export function tryParseJSON(jsonString: string): any | boolean { - try { - const jsonObj = JSON.parse(jsonString); - if (jsonObj && typeof jsonObj === "object") { - return jsonObj; - } - } catch (exception) {} - - return false; -} - -export function fileExistsSync(filePath: string): boolean { - try { - return fs.statSync(filePath).isFile(); - } catch (error) { - return false; - } -} - -export function mkdirRecursivelySync(dirPath: string): void { - if (directoryExistsSync(dirPath)) { - return; - } - const dirname = path.dirname(dirPath); - if (path.normalize(dirname) === path.normalize(dirPath)) { - fs.mkdirSync(dirPath); - } else if (directoryExistsSync(dirname)) { - fs.mkdirSync(dirPath); - } else { - mkdirRecursivelySync(dirname); - fs.mkdirSync(dirPath); - } -} - -export function directoryExistsSync(dirPath: string): boolean { - try { - return fs.statSync(dirPath).isDirectory(); - } catch (e) { - return false; - } -} - -/** - * This method pads the current string with another string (repeated, if needed) - * so that the resulting string reaches the given length. - * The padding is applied from the start (left) of the current string. - */ -export function padStart( - sourceString: string, - targetLength: number, - padString?: string -): string { - if (!sourceString) { - return sourceString; - } - - if (!(String.prototype as any).padStart) { - // https://github.com/uxitten/polyfill/blob/master/string.polyfill.js - padString = String(padString || " "); - if (sourceString.length > targetLength) { - return sourceString; - } else { - targetLength = targetLength - sourceString.length; - if (targetLength > padString.length) { - padString += padString.repeat(targetLength / padString.length); // append to original to ensure we are longer than needed - } - return padString.slice(0, targetLength) + sourceString; - } - } else { - return (sourceString as any).padStart(targetLength, padString); - } -} - -export function convertToHex(num: number, width = 0): string { - return padStart(num.toString(16), width, "0"); -} - -export function generateCPXConfig(): void { - const deviceContext: DeviceContext = DeviceContext.getInstance(); - const cpxJson = { - port: deviceContext.port, - }; - const cpxConfigFilePath: string = path.join( - CPXWorkspace.rootPath, - CPX_CONFIG_FILE - ); - mkdirRecursivelySync(path.dirname(cpxConfigFilePath)); - fs.writeFileSync(cpxConfigFilePath, JSON.stringify(cpxJson, null, 4)); -} - -export const addVisibleTextEditorCallback = ( - currentPanel: vscode.WebviewPanel, - context: vscode.ExtensionContext -): vscode.Disposable => { - const initialPythonEditors = filterForPythonFiles( - vscode.window.visibleTextEditors - ); - currentPanel.webview.postMessage({ - command: "visible-editors", - state: { activePythonEditors: initialPythonEditors }, - }); - return vscode.window.onDidChangeVisibleTextEditors( - (textEditors: vscode.TextEditor[]) => { - const activePythonEditors = filterForPythonFiles(textEditors); - currentPanel.webview.postMessage({ - command: "visible-editors", - state: { activePythonEditors }, - }); - }, - {}, - context.subscriptions - ); -}; - -export const filterForPythonFiles = (textEditors: vscode.TextEditor[]) => { - return textEditors - .filter(editor => editor.document.languageId === GLOBAL_ENV_VARS.PYTHON) - .map(editor => editor.document.fileName); -}; - -export const getActiveEditorFromPath = ( - filePath: string -): vscode.TextDocument => { - const activeEditor = vscode.window.visibleTextEditors.find( - (editor: vscode.TextEditor) => editor.document.fileName === filePath - ); - return activeEditor ? activeEditor.document : undefined; -}; - -export const getServerPortConfig = (): number => { - // tslint:disable: no-backbone-get-set-outside-model prefer-type-cast - if ( - vscode.workspace - .getConfiguration() - .has(SERVER_INFO.SERVER_PORT_CONFIGURATION) - ) { - return vscode.workspace - .getConfiguration() - .get(SERVER_INFO.SERVER_PORT_CONFIGURATION) as number; - } - return SERVER_INFO.DEFAULT_SERVER_PORT; -}; - -export const checkConfig = (configName: string): boolean => { - return vscode.workspace.getConfiguration().get(configName) === true; -}; - -export const getConfig = (configName: string): string => { - return vscode.workspace.getConfiguration().get(configName); -}; - -export const createEscapedPath = (...pieces: string[]) => { - const initialPath: string = path.join(...pieces); - - // escape all special characters - // https://stackoverflow.com/questions/1779858/how-do-i-escape-a-string-for-a-shell-command-in-node - return `"` + initialPath.replace(/(["'$`\\])/g, "\\$1") + `"`; -}; - -export const getTelemetryState = () => { - return vscode.workspace - .getConfiguration() - .get("telemetry.enableTelemetry", true); -}; diff --git a/src/install_dependencies.py b/src/install_dependencies.py deleted file mode 100644 index 00fe81d37..000000000 --- a/src/install_dependencies.py +++ /dev/null @@ -1,9 +0,0 @@ -import subprocess -import sys -import pathlib -import os - -os.chdir(str(pathlib.Path(__file__).parent.parent.absolute())) -subprocess.check_call( - [sys.executable, "-m", "pip", "install", "-r", "./out/requirements.txt"] -) diff --git a/src/latest_release_note.ts b/src/latest_release_note.ts deleted file mode 100644 index ed9357870..000000000 --- a/src/latest_release_note.ts +++ /dev/null @@ -1,38 +0,0 @@ -// TODO: find a better way of loading html into a string -export const LATEST_RELEASE_NOTE = `

Device Simulator Express Release Notes 🤖

-

Device Simulator Express, a Microsoft Garage project, allows you to code microcontrollers without the hardware on hand! You can program your Adafruit Circuit Playground Express (CPX), your BBC micro:bit or the Adafruit CLUE!

-
- LIGHTGESTUREPROXIMITY -
- -

📝 April 22, 2020

-

Changes:

-
    -
  • Increased precision for certain sensors on the CLUE and CPX.
  • -
-

Fixes:

-
    -
  • Fixed bugs within the CLUE slideshow library and debugger.
  • -
- -

📝 April 20, 2020

-

-

We're back with a full release for the Adafruit CLUE 🐍🔍.

-

-

Changes:

-
    -
  • The Adafruit CLUE is enabled by default.
  • -
  • The "Getting Started" page now includes some guidance on the debugger.
  • -
-

Fixes:

-
    -
  • Implemented fix for the switch on the CPX.
  • -
  • The CLUE debugger's LEDs can now correctly show on the UI.
  • -
  • The dependency installation process is fixed, and users without Git installed can now run setup.
  • -
- -

- -

PS: You can read about the DSX team in the article here!

-

Create something wonderful ✨🙌,
-       - The Device Simulator Express Team

`; diff --git a/src/micropython/__init__.py b/src/micropython/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/micropython/audio.py b/src/micropython/audio.py deleted file mode 100644 index 36a336465..000000000 --- a/src/micropython/audio.py +++ /dev/null @@ -1,39 +0,0 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/audio.html. - - -def play(source, wait=True, pin="pin0", return_pin=None): - """ - This function is not implemented in the simulator. - - Play the source to completion. - - ``source`` is an iterable, each element of which must be an ``AudioFrame``. - - If ``wait`` is ``True``, this function will block until the source is exhausted. - - ``pin`` specifies which pin the speaker is connected to. - - ``return_pin`` specifies a differential pin to connect to the speaker - instead of ground. - """ - utils.print_for_unimplemented_functions(play.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_AUDIO) - - -class AudioFrame: - """ - This class is not implemented in the simulator. - - An ``AudioFrame`` object is a list of 32 samples each of which is a signed byte - (whole number between -128 and 127). - - It takes just over 4 ms to play a single frame. - """ - - def __init__(self): - utils.print_for_unimplemented_functions(AudioFrame.__init__.__qualname__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_AUDIO) diff --git a/src/micropython/microbit/__init__.py b/src/micropython/microbit/__init__.py deleted file mode 100644 index 478fcff42..000000000 --- a/src/micropython/microbit/__init__.py +++ /dev/null @@ -1,52 +0,0 @@ -from .__model.image import Image -from .__model.microbit_model import __mb -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -accelerometer = __mb.accelerometer -button_a = __mb.button_a -button_b = __mb.button_b -compass = __mb.compass -display = __mb.display -i2c = __mb.i2c -spi = __mb.spi - - -def panic(n): - """ - Enter a panic mode. Requires restart. Pass in an arbitrary integer <= 255 to indicate a status - """ - __mb.panic(n) - - -def reset(): - """ - Restart the board. - """ - __mb.reset() - - -def sleep(n): - """ - Wait for ``n`` milliseconds. One second is 1000 milliseconds, so:: - microbit.sleep(1000) - will pause the execution for one second. ``n`` can be an integer or - a floating point number. - """ - __mb.sleep(n) - - -def running_time(): - """ - Return the number of milliseconds since the board was switched on or - restarted. - """ - return __mb.running_time() - - -def temperature(): - """ - Return the temperature of the micro:bit in degrees Celcius. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_TEMPERATURE) - return __mb.temperature() diff --git a/src/micropython/microbit/__model/accelerometer.py b/src/micropython/microbit/__model/accelerometer.py deleted file mode 100644 index 4b28d35ee..000000000 --- a/src/micropython/microbit/__model/accelerometer.py +++ /dev/null @@ -1,136 +0,0 @@ -from . import constants as CONSTANTS -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - - -class Accelerometer: - # The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/accelerometer.html. - def __init__(self): - self.__x = 0 - self.__y = 0 - self.__z = 0 - self.__current_gesture = "" - self.__prev_gestures = set() - self.__gestures = [] - - def get_x(self): - """ - Get the acceleration measurement in the ``x`` axis, as a positive or - negative integer, depending on the direction. The measurement is given in - milli-g. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_ACCELEROMETER) - return self.__x - - def get_y(self): - """ - Get the acceleration measurement in the ``y`` axis, as a positive or - negative integer, depending on the direction. The measurement is given in - milli-g. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_ACCELEROMETER) - return self.__y - - def get_z(self): - """ - Get the acceleration measurement in the ``z`` axis, as a positive or - negative integer, depending on the direction. The measurement is given in - milli-g. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_ACCELEROMETER) - return self.__z - - def get_values(self): - """ - Get the acceleration measurements in all axes at once, as a three-element - tuple of integers ordered as X, Y, Z. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_ACCELEROMETER) - return (self.__x, self.__y, self.__z) - - def current_gesture(self): - """ - Return the name of the current gesture. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_GESTURE) - self.__add_current_gesture_to_gesture_lists() - return self.__current_gesture - - def is_gesture(self, name): - """ - Return True or False to indicate if the named gesture is currently active. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_GESTURE) - self.__add_current_gesture_to_gesture_lists() - if name not in CONSTANTS.GESTURES: - raise ValueError(CONSTANTS.INVALID_GESTURE_ERR) - return name == self.__current_gesture - - def was_gesture(self, name): - """ - Return True or False to indicate if the named gesture was active since the - last [was_gesture] call. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_GESTURE) - self.__add_current_gesture_to_gesture_lists() - if name not in CONSTANTS.GESTURES: - raise ValueError(CONSTANTS.INVALID_GESTURE_ERR) - was_gesture = name in self.__prev_gestures - self.__prev_gestures.clear() - return was_gesture - - def get_gestures(self): - """ - Return a tuple of the gesture history. The most recent is listed last. - Also clears the gesture history before returning. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_GESTURE) - self.__add_current_gesture_to_gesture_lists() - gestures = tuple(self.__gestures) - self.__gestures.clear() - return gestures - - # Helpers and Hidden Functions - - def __get_accel(self, axis): - if axis == "x": - return self.get_x() - elif axis == "y": - return self.get_y() - elif axis == "z": - return self.get_z() - - def __set_accel(self, axis, accel): - if accel < CONSTANTS.MIN_ACCELERATION or accel > CONSTANTS.MAX_ACCELERATION: - raise ValueError(CONSTANTS.INVALID_ACCEL_ERR) - if axis == "x": - self.__x = accel - elif axis == "y": - self.__y = accel - elif axis == "z": - self.__z = accel - - def __set_gesture(self, gesture): - if gesture in CONSTANTS.GESTURES: - self.__current_gesture = gesture - elif gesture == "": - self.__current_gesture = "" - else: - raise ValueError(CONSTANTS.INVALID_GESTURE_ERR) - - def __add_current_gesture_to_gesture_lists(self): - if self.__current_gesture in CONSTANTS.GESTURES: - self.__gestures.append(self.__current_gesture) - self.__prev_gestures.add(self.__current_gesture) - - def __update_motion(self, axis, accel): - if accel is not None: - previous_accel = self.__get_accel(axis) - if accel != previous_accel: - self.__set_accel(axis, accel) - - def __update_gesture(self, gesture): - if gesture is not None: - previous_gesture = self.__current_gesture - if previous_gesture != gesture: - self.__set_gesture(gesture) diff --git a/src/micropython/microbit/__model/button.py b/src/micropython/microbit/__model/button.py deleted file mode 100644 index 1bbe4ddbc..000000000 --- a/src/micropython/microbit/__model/button.py +++ /dev/null @@ -1,59 +0,0 @@ -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - - -class Button: - # The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/button.html. - def __init__(self): - self.__pressed = False - self.__presses = 0 - self.__prev_pressed = False - - def is_pressed(self): - """ - Returns ``True`` if the specified button ``button`` is currently being - held down, and ``False`` otherwise. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_BUTTON) - return self.__pressed - - def was_pressed(self): - """ - Returns ``True`` or ``False`` to indicate if the button was pressed - (went from up to down) since the device started or the last time this - method was called. Calling this method will clear the press state so - that the button must be pressed again before this method will return - ``True`` again. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_BUTTON) - res = self.__prev_pressed - self.__prev_pressed = False - return res - - def get_presses(self): - """ - Returns the running total of button presses, and resets this total - to zero before returning. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_BUTTON) - res = self.__presses - self.__presses = 0 - return res - - def __press_down(self): - self.__pressed = True - self.__prev_pressed = True - self.__presses += 1 - - def __release(self): - self.__pressed = False - - def __update(self, is_button_pressed): - if is_button_pressed is not None: - was_button_pressed = self.is_pressed() - - if is_button_pressed != was_button_pressed: - if is_button_pressed: - self.__press_down() - else: - self.__release() diff --git a/src/micropython/microbit/__model/compass.py b/src/micropython/microbit/__model/compass.py deleted file mode 100644 index 56eb43911..000000000 --- a/src/micropython/microbit/__model/compass.py +++ /dev/null @@ -1,88 +0,0 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - - -class Compass: - # The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/compass.html. - def calibrate(self): - """ - This function is not implemented in the simulator. - - Starts the calibration process. When this function is called on the physical device, an instructive message will be scrolled to the user after which they will need to rotate the device in order to draw a circle on the LED display on the actual device. - """ - utils.print_for_unimplemented_functions(Compass.calibrate.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) - - def is_calibrated(self): - """ - This function is not implemented in the simulator. - - Returns ``True`` if the compass has been successfully calibrated, and - returns ``False`` otherwise. - """ - utils.print_for_unimplemented_functions(Compass.is_calibrated.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) - - def clear_calibration(self): - """ - This function is not implemented in the simulator. - - Undoes the calibration, making the compass uncalibrated again. - """ - utils.print_for_unimplemented_functions(Compass.clear_calibration.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) - - def get_x(self): - """ - This function is not implemented in the simulator. - - Gives the reading of the magnetic field strength on the ``x`` axis in nano - tesla, as a positive or negative integer, depending on the direction of the - field. - """ - utils.print_for_unimplemented_functions(Compass.get_x.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) - - def get_y(self): - """ - This function is not implemented in the simulator. - - Gives the reading of the magnetic field strength on the ``y`` axis in nano - tesla, as a positive or negative integer, depending on the direction of the - field. - """ - utils.print_for_unimplemented_functions(Compass.get_y.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) - - def get_z(self): - """ - This function is not implemented in the simulator. - - Gives the reading of the magnetic field strength on the ``z`` axis in nano - tesla, as a positive or negative integer, depending on the direction of the - field. - """ - utils.print_for_unimplemented_functions(Compass.get_z.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) - - def heading(self): - """ - This function is not implemented in the simulator. - - Gives the compass heading, calculated from the above readings, as an - integer in the range from 0 to 360, representing the angle in degrees, - clockwise, with north as 0. - """ - utils.print_for_unimplemented_functions(Compass.heading.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) - - def get_field_strength(self): - """ - This function is not implemented in the simulator. - - Returns an integer indication of the magnitude of the magnetic field around - the device in nano tesla. - """ - utils.print_for_unimplemented_functions(Compass.get_field_strength.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) diff --git a/src/micropython/microbit/__model/constants.py b/src/micropython/microbit/__model/constants.py deleted file mode 100644 index 3e05b8b90..000000000 --- a/src/micropython/microbit/__model/constants.py +++ /dev/null @@ -1,169 +0,0 @@ -MICROBIT = "micro:bit" - -# string arguments for constructor -BLANK_5X5 = "00000:00000:00000:00000:00000:" - -# pre-defined image patterns -IMAGE_PATTERNS = { - "HEART": "09090:99999:99999:09990:00900:", - "HEART_SMALL": "00000:09090:09990:00900:00000:", - "HAPPY": "00000:09090:00000:90009:09990:", - "SMILE": "00000:00000:00000:90009:09990:", - "SAD": "00000:09090:00000:09990:90009:", - "CONFUSED": "00000:09090:00000:09090:90909:", - "ANGRY": "90009:09090:00000:99999:90909:", - "ASLEEP": "00000:99099:00000:09990:00000:", - "SURPRISED": "09090:00000:00900:09090:00900:", - "SILLY": "90009:00000:99999:00909:00999:", - "FABULOUS": "99999:99099:00000:09090:09990:", - "MEH": "09090:00000:00090:00900:09000:", - "YES": "00000:00009:00090:90900:09000:", - "NO": "90009:09090:00900:09090:90009:", - "CLOCK12": "00900:00900:00900:00000:00000:", - "CLOCK11": "09000:09000:00900:00000:00000:", - "CLOCK10": "00000:99000:00900:00000:00000:", - "CLOCK9": "00000:00000:99900:00000:00000:", - "CLOCK8": "00000:00000:00900:99000:00000:", - "CLOCK7": "00000:00000:00900:09000:09000:", - "CLOCK6": "00000:00000:00900:00900:00900:", - "CLOCK5": "00000:00000:00900:00090:00090:", - "CLOCK4": "00000:00000:00900:00099:00000:", - "CLOCK3": "00000:00000:00999:00000:00000:", - "CLOCK2": "00000:00099:00900:00000:00000:", - "CLOCK1": "00090:00090:00900:00000:00000:", - "ARROW_N": "00900:09990:90909:00900:00900:", - "ARROW_NE": "00999:00099:00909:09000:90000:", - "ARROW_E": "00900:00090:99999:00090:00900:", - "ARROW_SE": "90000:09000:00909:00099:00999:", - "ARROW_S": "00900:00900:90909:09990:00900:", - "ARROW_SW": "00009:00090:90900:99000:99900:", - "ARROW_W": "00900:09000:99999:09000:00900:", - "ARROW_NW": "99900:99000:90900:00090:00009:", - "TRIANGLE": "00000:00900:09090:99999:00000:", - "TRIANGLE_LEFT": "90000:99000:90900:90090:99999:", - "CHESSBOARD": "09090:90909:09090:90909:09090:", - "DIAMOND": "00900:09090:90009:09090:00900:", - "DIAMOND_SMALL": "00000:00900:09090:00900:00000:", - "SQUARE": "99999:90009:90009:90009:99999:", - "SQUARE_SMALL": "00000:09990:09090:09990:00000:", - "RABBIT": "90900:90900:99990:99090:99990:", - "COW": "90009:90009:99999:09990:00900:", - "MUSIC_CROTCHET": "00900:00900:00900:99900:99900:", - "MUSIC_QUAVER": "00900:00990:00909:99900:99900:", - "MUSIC_QUAVERS": "09999:09009:09009:99099:99099:", - "PITCHFORK": "90909:90909:99999:00900:00900:", - "XMAS": "00900:09990:00900:09990:99999:", - "PACMAN": "09999:99090:99900:99990:09999:", - "TARGET": "00900:09990:99099:09990:00900:", - "TSHIRT": "99099:99999:09990:09990:09990:", - "ROLLERSKATE": "00099:00099:99999:99999:09090:", - "DUCK": "09900:99900:09999:09990:00000:", - "HOUSE": "00900:09990:99999:09990:09090:", - "TORTOISE": "00000:09990:99999:09090:00000:", - "BUTTERFLY": "99099:99999:00900:99999:99099:", - "STICKFIGURE": "00900:99999:00900:09090:90009:", - "GHOST": "99999:90909:99999:99999:90909:", - "SWORD": "00900:00900:00900:09990:00900:", - "GIRAFFE": "99000:09000:09000:09990:09090:", - "SKULL": "09990:90909:99999:09990:09990:", - "UMBRELLA": "09990:99999:00900:90900:09900:", - "SNAKE": "99000:99099:09090:09990:00000:", -} - -IMAGE_TUPLE_LOOKUP = { - "ALL_CLOCKS": [ - "CLOCK12", - "CLOCK11", - "CLOCK10", - "CLOCK9", - "CLOCK8", - "CLOCK7", - "CLOCK6", - "CLOCK5", - "CLOCK4", - "CLOCK3", - "CLOCK2", - "CLOCK1", - ], - "ALL_ARROWS": [ - "ARROW_N", - "ARROW_NE", - "ARROW_E", - "ARROW_SE", - "ARROW_S", - "ARROW_SW", - "ARROW_W", - "ARROW_NW", - ], -} - -# 5x5 Alphabet -# Taken from https://raw.githubusercontent.com/micropython/micropython/264d80c84e034541bd6e4b461bfece4443ffd0ac/ports/nrf/boards/microbit/modules/microbitfont.h -ALPHABET = b"\x00\x00\x00\x00\x00\x08\x08\x08\x00\x08\x0a\x4a\x40\x00\x00\x0a\x5f\xea\x5f\xea\x0e\xd9\x2e\xd3\x6e\x19\x32\x44\x89\x33\x0c\x92\x4c\x92\x4d\x08\x08\x00\x00\x00\x04\x88\x08\x08\x04\x08\x04\x84\x84\x88\x00\x0a\x44\x8a\x40\x00\x04\x8e\xc4\x80\x00\x00\x00\x04\x88\x00\x00\x0e\xc0\x00\x00\x00\x00\x08\x00\x01\x22\x44\x88\x10\x0c\x92\x52\x52\x4c\x04\x8c\x84\x84\x8e\x1c\x82\x4c\x90\x1e\x1e\xc2\x44\x92\x4c\x06\xca\x52\x5f\xe2\x1f\xf0\x1e\xc1\x3e\x02\x44\x8e\xd1\x2e\x1f\xe2\x44\x88\x10\x0e\xd1\x2e\xd1\x2e\x0e\xd1\x2e\xc4\x88\x00\x08\x00\x08\x00\x00\x04\x80\x04\x88\x02\x44\x88\x04\x82\x00\x0e\xc0\x0e\xc0\x08\x04\x82\x44\x88\x0e\xd1\x26\xc0\x04\x0e\xd1\x35\xb3\x6c\x0c\x92\x5e\xd2\x52\x1c\x92\x5c\x92\x5c\x0e\xd0\x10\x10\x0e\x1c\x92\x52\x52\x5c\x1e\xd0\x1c\x90\x1e\x1e\xd0\x1c\x90\x10\x0e\xd0\x13\x71\x2e\x12\x52\x5e\xd2\x52\x1c\x88\x08\x08\x1c\x1f\xe2\x42\x52\x4c\x12\x54\x98\x14\x92\x10\x10\x10\x10\x1e\x11\x3b\x75\xb1\x31\x11\x39\x35\xb3\x71\x0c\x92\x52\x52\x4c\x1c\x92\x5c\x90\x10\x0c\x92\x52\x4c\x86\x1c\x92\x5c\x92\x51\x0e\xd0\x0c\x82\x5c\x1f\xe4\x84\x84\x84\x12\x52\x52\x52\x4c\x11\x31\x31\x2a\x44\x11\x31\x35\xbb\x71\x12\x52\x4c\x92\x52\x11\x2a\x44\x84\x84\x1e\xc4\x88\x10\x1e\x0e\xc8\x08\x08\x0e\x10\x08\x04\x82\x41\x0e\xc2\x42\x42\x4e\x04\x8a\x40\x00\x00\x00\x00\x00\x00\x1f\x08\x04\x80\x00\x00\x00\x0e\xd2\x52\x4f\x10\x10\x1c\x92\x5c\x00\x0e\xd0\x10\x0e\x02\x42\x4e\xd2\x4e\x0c\x92\x5c\x90\x0e\x06\xc8\x1c\x88\x08\x0e\xd2\x4e\xc2\x4c\x10\x10\x1c\x92\x52\x08\x00\x08\x08\x08\x02\x40\x02\x42\x4c\x10\x14\x98\x14\x92\x08\x08\x08\x08\x06\x00\x1b\x75\xb1\x31\x00\x1c\x92\x52\x52\x00\x0c\x92\x52\x4c\x00\x1c\x92\x5c\x90\x00\x0e\xd2\x4e\xc2\x00\x0e\xd0\x10\x10\x00\x06\xc8\x04\x98\x08\x08\x0e\xc8\x07\x00\x12\x52\x52\x4f\x00\x11\x31\x2a\x44\x00\x11\x31\x35\xbb\x00\x12\x4c\x8c\x92\x00\x11\x2a\x44\x98\x00\x1e\xc4\x88\x1e\x06\xc4\x8c\x84\x86\x08\x08\x08\x08\x08\x18\x08\x0c\x88\x18\x00\x00\x0c\x83\x60" -# We support ASCII characters between these indexes on the microbit -ASCII_START = 32 -ASCII_END = 126 -SPACE_BETWEEN_LETTERS_WIDTH = 1 -WHITESPACE_WIDTH = 3 - -# numerical LED values -LED_HEIGHT = 5 -LED_WIDTH = 5 -BRIGHTNESS_MIN = 0 -BRIGHTNESS_MAX = 9 - -# sensor max/min values -MAX_TEMPERATURE = 125 -MIN_TEMPERATURE = -55 -MAX_LIGHT_LEVEL = 255 -MIN_LIGHT_LEVEL = 0 -MAX_ACCELERATION = 1023 -MIN_ACCELERATION = -1023 - -GESTURES = set( - [ - "up", - "down", - "left", - "right", - "face up", - "face down", - "freefall", - "3g", - "6g", - "8g", - "shake", - ] -) - -# error messages -BRIGHTNESS_ERR = "brightness out of bounds" -COPY_ERR_MESSAGE = "please call copy function first" -INCORR_IMAGE_SIZE = "image data is incorrect size" -INDEX_ERR = "index out of bounds" -NOT_IMPLEMENTED_ERROR = "This method is not implemented by the simulator" -UNSUPPORTED_ADD_TYPE = "unsupported types for __add__:" -SAME_SIZE_ERR = "images must be the same size" -INVALID_GESTURE_ERR = "invalid gesture" -INVALID_ACCEL_ERR = "invalid acceleration" -INVALID_LIGHT_LEVEL_ERR = "invalid light level" -INVALID_TEMPERATURE_ERR = "invalid temperature" - -TIME_DELAY = 0.03 - -EXPECTED_INPUT_BUTTONS = [ - "button_a", - "button_b", -] - -EXPECTED_INPUT_ACCEL = { - "motion_x": "x", - "motion_y": "y", - "motion_z": "z", -} - -EXPECTED_INPUT_LIGHT = "light" - -EXPECTED_INPUT_TEMP = "temperature" - -EXPECTED_INPUT_GESTURE = "gesture" diff --git a/src/micropython/microbit/__model/display.py b/src/micropython/microbit/__model/display.py deleted file mode 100644 index 523811db0..000000000 --- a/src/micropython/microbit/__model/display.py +++ /dev/null @@ -1,369 +0,0 @@ -import copy -import time -import threading -import common - -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent -from . import constants as CONSTANTS -from .image import Image - - -class Display: - # The implementation based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/display.html. - - def __init__(self): - self.__image = Image() - self.__on = True - self.__light_level = 0 - self.__blank_image = Image() - - self.__current_pid = None - self.__lock = threading.Lock() - - def scroll(self, value, delay=150, wait=True, loop=False, monospace=False): - """ - Scrolls ``value`` horizontally on the display. If ``value`` is an integer or float it is - first converted to a string using ``str()``. The ``delay`` parameter controls how fast - the text is scrolling. - - If ``wait`` is ``True``, this function will block until the animation is - finished, otherwise the animation will happen in the background. - - If ``loop`` is ``True``, the animation will repeat forever. - - If ``monospace`` is ``True``, the characters will all take up 5 pixel-columns - in width, otherwise there will be exactly 1 blank pixel-column between each - character as they scroll. - - Note that the ``wait``, ``loop`` and ``monospace`` arguments must be specified - using their keyword. - """ - if not wait: - thread = threading.Thread( - target=self.scroll, args=(value, delay, True, loop, monospace) - ) - thread.start() - return - - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_SCROLL) - - # Set current_pid to the thread's identifier - self.__lock.acquire() - self.__current_pid = threading.get_ident() - self.__lock.release() - - if isinstance(value, (str, int, float)): - value = str(value) - else: - raise TypeError(f"can't convert {type(value)} object to str implicitly") - - letters = [] - for c in value: - if monospace: - letters.append(Display.__get_image_from_char(c)) - letters.append( - Image(CONSTANTS.SPACE_BETWEEN_LETTERS_WIDTH, CONSTANTS.LED_HEIGHT) - ) - else: - if c == " ": - letters.append( - Image(CONSTANTS.WHITESPACE_WIDTH, CONSTANTS.LED_HEIGHT) - ) - else: - letters.append( - Display.__strip_unlit_columns(Display.__get_image_from_char(c)) - ) - letters.append( - Image( - CONSTANTS.SPACE_BETWEEN_LETTERS_WIDTH, CONSTANTS.LED_HEIGHT, - ) - ) - appended_image = Display.__create_scroll_image(letters) - - while True: - # Show the scrolled image one square at a time. - for x in range(appended_image.width() - CONSTANTS.LED_WIDTH + 1): - self.__lock.acquire() - - # If show or scroll is called again, there will be a different pid and break - if self.__current_pid != threading.get_ident(): - self.__lock.release() - break - - self.__image.blit( - appended_image, x, 0, CONSTANTS.LED_WIDTH, CONSTANTS.LED_HEIGHT - ) - self.__lock.release() - self.__update_client() - - Display.sleep_ms(delay) - - if not loop: - break - - def show(self, value, delay=400, wait=True, loop=False, clear=False): - """ - Display the ``image``. - - If ``value`` is a string, float or integer, display letters/digits in sequence. - Otherwise, if ``value`` is an iterable sequence of images, display these images in sequence. - Each letter, digit or image is shown with ``delay`` milliseconds between them. - - If ``wait`` is ``True``, this function will block until the animation is - finished, otherwise the animation will happen in the background. - - If ``loop`` is ``True``, the animation will repeat forever. - - If ``clear`` is ``True``, the display will be cleared after the iterable has finished. - - Note that the ``wait``, ``loop`` and ``clear`` arguments must be specified - using their keyword. - """ - if not wait: - thread = threading.Thread( - target=self.show, args=(value, delay, True, loop, clear) - ) - thread.start() - return - - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_SHOW) - - # Set current_pid to the thread's identifier - self.__lock.acquire() - self.__current_pid = threading.get_ident() - self.__lock.release() - - images = [] - use_delay = False - if isinstance(value, Image): - images.append(value.crop(0, 0, CONSTANTS.LED_WIDTH, CONSTANTS.LED_HEIGHT)) - elif isinstance(value, (str, int, float)): - chars = list(str(value)) - for c in chars: - images.append(Display.__get_image_from_char(c)) - if len(chars) > 1: - use_delay = True - else: - # Check if iterable - try: - _ = iter(value) - except TypeError as e: - raise e - - for elem in value: - if isinstance(elem, Image): - images.append( - elem.crop(0, 0, CONSTANTS.LED_WIDTH, CONSTANTS.LED_HEIGHT) - ) - elif isinstance(elem, str) and len(elem) == 1: - images.append(Display.__get_image_from_char(elem)) - # If elem is not char or image, break without iterating through rest of list - else: - break - use_delay = True - - while True: - for image in images: - self.__lock.acquire() - - # If show or scroll is called again, there will be a different pid and break - if self.__current_pid != threading.get_ident(): - self.__lock.release() - break - - self.__image = image - self.__lock.release() - self.__update_client() - - if use_delay: - Display.sleep_ms(delay) - - if not loop: - break - if clear: - self.clear() - - def get_pixel(self, x, y): - """ - Return the brightness of the LED at column ``x`` and row ``y`` as an - integer between 0 (off) and 9 (bright). - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_OTHER) - self.__lock.acquire() - pixel = self.__image.get_pixel(x, y) - self.__lock.release() - return pixel - - def set_pixel(self, x, y, value): - """ - Set the brightness of the LED at column ``x`` and row ``y`` to ``value``, - which has to be an integer between 0 and 9. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_OTHER) - self.__lock.acquire() - self.__image.set_pixel(x, y, value) - self.__lock.release() - self.__update_client() - - def clear(self): - """ - Set the brightness of all LEDs to 0 (off). - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_OTHER) - self.__lock.acquire() - self.__image = Image() - self.__lock.release() - self.__update_client() - - def on(self): - """ - Use on() to turn on the display. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_OTHER) - self.__on = True - - def off(self): - """ - Use off() to turn off the display. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_OTHER) - self.__on = False - - def is_on(self): - """ - Returns ``True`` if the display is on, otherwise returns ``False``. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_OTHER) - return self.__on - - def read_light_level(self): - """ - Use the display's LEDs in reverse-bias mode to sense the amount of light - falling on the display. Returns an integer between 0 and 255 representing - the light level, with larger meaning more light. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_LIGHT_LEVEL) - return self.__light_level - - def __set_light_level(self, level): - if level < CONSTANTS.MIN_LIGHT_LEVEL or level > CONSTANTS.MAX_LIGHT_LEVEL: - raise ValueError(CONSTANTS.INVALID_LIGHT_LEVEL_ERR) - else: - self.__light_level = level - - # Helpers - - def __get_array(self): - self.__lock.acquire() - if self.is_on(): - leds = copy.deepcopy(self.__image._Image__LED) - else: - leds = self.__blank_image._Image__LED - self.__lock.release() - return leds - - @staticmethod - def __get_image_from_char(c): - # If c is not between the ASCII alphabet we cover, make it a question mark - if ord(c) < CONSTANTS.ASCII_START or ord(c) > CONSTANTS.ASCII_END: - c = "?" - offset = (ord(c) - CONSTANTS.ASCII_START) * CONSTANTS.LED_WIDTH - representative_bytes = CONSTANTS.ALPHABET[ - offset : offset + CONSTANTS.LED_HEIGHT - ] - return Image(Display.__convert_bytearray_to_image_str(representative_bytes)) - - # Removes columns that are not lit - @staticmethod - def __strip_unlit_columns(image): - min_index = CONSTANTS.LED_WIDTH - 1 - max_index = 0 - for row in image._Image__LED: - for index, bit in enumerate(row): - if bit > 0: - min_index = min(min_index, index) - max_index = max(max_index, index) - return image.crop(min_index, 0, max_index - min_index + 1, CONSTANTS.LED_HEIGHT) - - # This method is different from Image's __bytes_to_array. - # This one requires a conversion from binary of the ALPHABET constant to an image. - @staticmethod - def __convert_bytearray_to_image_str(byte_array): - arr = [] - for b in byte_array: - # Convert byte to binary - b_as_bits = str(bin(b))[2:] - sub_arr = [] - while len(sub_arr) < 5: - # Iterate throught bits - # If there is a 1 at b, then the pixel at column b is lit - for bit in b_as_bits[::-1]: - if len(sub_arr) < 5: - sub_arr.insert(0, int(bit) * CONSTANTS.BRIGHTNESS_MAX) - else: - break - # Add 0s to the front until the list is 5 long - while len(sub_arr) < 5: - sub_arr.insert(0, 0) - arr.append(sub_arr) - image_str = "" - for row in arr: - for elem in row: - image_str += str(elem) - image_str += ":" - return image_str - - @staticmethod - def __insert_blank_column(image): - for row in image._Image__LED: - row.append(0) - - @staticmethod - def __create_scroll_image(images): - blank_5x5_image = Image() - front_of_scroll_image = Image(4, 5) - images.insert(0, front_of_scroll_image) - - scroll_image = Image._Image__append_images(images) - end_of_scroll_image = Image() - # Insert columns of 0s until the ending is a 5x5 blank - end_of_scroll_image.blit( - scroll_image, - scroll_image.width() - CONSTANTS.LED_WIDTH, - 0, - CONSTANTS.LED_WIDTH, - CONSTANTS.LED_HEIGHT, - ) - while not Image._Image__same_image(end_of_scroll_image, blank_5x5_image): - Display.__insert_blank_column(scroll_image) - end_of_scroll_image.blit( - scroll_image, - scroll_image.width() - CONSTANTS.LED_WIDTH, - 0, - CONSTANTS.LED_WIDTH, - CONSTANTS.LED_HEIGHT, - ) - - return scroll_image - - def __update_client(self): - sendable_json = {"leds": self.__get_array()} - - if common.utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - sendable_json, CONSTANTS.MICROBIT - ) - else: - common.utils.send_to_simulator(sendable_json, CONSTANTS.MICROBIT) - - def __update_light_level(self, new_light_level): - if new_light_level is not None: - previous_light_level = self.read_light_level() - if new_light_level != previous_light_level: - self.__set_light_level(new_light_level) - - @staticmethod - def sleep_ms(ms): - time.sleep(ms / 1000) diff --git a/src/micropython/microbit/__model/i2c.py b/src/micropython/microbit/__model/i2c.py deleted file mode 100644 index 2c83868d2..000000000 --- a/src/micropython/microbit/__model/i2c.py +++ /dev/null @@ -1,51 +0,0 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - - -class I2c: - # The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/i2c.html. - def init(self, freq=100000, sda="pin20", scl="pin19"): - """ - This function is not implemented in the simulator. - - Re-initialize peripheral with the specified clock frequency ``freq`` on the - specified ``sda`` and ``scl`` pins. - - Warning: - - Changing the I²C pins from defaults will make the accelerometer and - compass stop working, as they are connected internally to those pins. - """ - utils.print_for_unimplemented_functions(I2c.init.__qualname__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_I2C) - - def scan(self): - """ - This function is not implemented in the simulator. - - Scan the bus for devices. Returns a list of 7-bit addresses corresponding - to those devices that responded to the scan. - """ - utils.print_for_unimplemented_functions(I2c.scan.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_I2C) - - def read(self, addr, n, repeat=False): - """ - This function is not implemented in the simulator. - - Read ``n`` bytes from the device with 7-bit address ``addr``. If ``repeat`` - is ``True``, no stop bit will be sent. - """ - utils.print_for_unimplemented_functions(I2c.read.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_I2C) - - def write(self, addr, buf, repeat=False): - """ - This function is not implemented in the simulator. - - Write bytes from ``buf`` to the device with 7-bit address ``addr``. If - ``repeat`` is ``True``, no stop bit will be sent. - """ - utils.print_for_unimplemented_functions(I2c.write.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_I2C) diff --git a/src/micropython/microbit/__model/image.py b/src/micropython/microbit/__model/image.py deleted file mode 100644 index a525ea6e1..000000000 --- a/src/micropython/microbit/__model/image.py +++ /dev/null @@ -1,539 +0,0 @@ -from . import constants as CONSTANTS -from .producer_property import ProducerProperty -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - - -class Image: - """ - If ``string`` is used, it has to consist of digits 0-9 arranged into - lines, describing the image, for example:: - - image = Image("90009:" - "09090:" - "00900:" - "09090:" - "90009") - - will create a 5×5 image of an X. The end of a line is indicated by a colon. - It's also possible to use a newline (\\n) to indicate the end of a line - like this:: - - image = Image("90009\\n" - "09090\\n" - "00900\\n" - "09090\\n" - "90009") - - The other form creates an empty image with ``width`` columns and - ``height`` rows. Optionally ``buffer`` can be an array of - ``width``×``height`` integers in range 0-9 to initialize the image:: - - Image(2, 2, b'\x08\x08\x08\x08') - - or:: - - Image(2, 2, bytearray([9,9,9,9])) - - Will create a 2 x 2 pixel image at full brightness. - - .. note:: - - Keyword arguments cannot be passed to ``buffer``. - """ - - # Attributes assigned (to functions) later; - # having this here helps the pylint. - HEART = None - HEART_SMALL = None - HAPPY = None - SMILE = None - SAD = None - CONFUSED = None - ANGRY = None - ASLEEP = None - SURPRISED = None - SILLY = None - FABULOUS = None - MEH = None - YES = None - NO = None - CLOCK12 = None - CLOCK11 = None - CLOCK10 = None - CLOCK9 = None - CLOCK8 = None - CLOCK7 = None - CLOCK6 = None - CLOCK5 = None - CLOCK4 = None - CLOCK3 = None - CLOCK2 = None - CLOCK1 = None - ARROW_N = None - ARROW_NE = None - ARROW_E = None - ARROW_SE = None - ARROW_S = None - ARROW_SW = None - ARROW_W = None - ARROW_NW = None - TRIANGLE = None - TRIANGLE_LEFT = None - CHESSBOARD = None - DIAMOND = None - DIAMOND_SMALL = None - SQUARE = None - SQUARE_SMALL = None - RABBIT = None - COW = None - MUSIC_CROTCHET = None - MUSIC_QUAVER = None - MUSIC_QUAVERS = None - PITCHFORK = None - XMAS = None - PACMAN = None - TARGET = None - TSHIRT = None - ROLLERSKATE = None - DUCK = None - HOUSE = None - TORTOISE = None - BUTTERFLY = None - STICKFIGURE = None - GHOST = None - SWORD = None - GIRAFFE = None - SKULL = None - UMBRELLA = None - SNAKE = None - ALL_CLOCKS = None - ALL_ARROWS = None - - # implementing image model as described here: - # https://microbit-micropython.readthedocs.io/en/v1.0.1/image.html - - def __init__(self, *args, **kwargs): - # Depending on the number of arguments - # in constructor, it treat args differently. - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_CREATION) - if len(args) == 0: - # default constructor - self.__LED = self.__string_to_square_array(CONSTANTS.BLANK_5X5) - elif len(args) == 1: - pattern = args[0] - if isinstance(pattern, str): - self.__LED = self.__string_to_square_array(pattern) - else: - raise TypeError("Image(s) takes a string") - else: - - width = args[0] - height = args[1] - - if width < 0 or height < 0: - # This is not in original, but ideally, - # image should fail non-silently - raise ValueError(CONSTANTS.INDEX_ERR) - - if len(args) == 3: - # This option is for potential third bytearray arguments - byte_arr = args[2] - self.__LED = self.__bytes_to_array(width, height, byte_arr) - else: - self.__LED = self.__create_leds(width, height) - self.read_only = False - - def width(self): - """ - Return the number of columns in the image. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - if len(self.__LED) > 0: - return len(self.__LED[0]) - else: - return 0 - - def height(self): - """ - Return the numbers of rows in the image. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - return len(self.__LED) - - def set_pixel(self, x, y, value): - """ - Set the brightness of the pixel at column ``x`` and row ``y`` to the - ``value``, which has to be between 0 (dark) and 9 (bright). - - This method will raise an exception when called on any of the built-in - read-only images, like ``Image.HEART``. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - if self.read_only: - raise TypeError(CONSTANTS.COPY_ERR_MESSAGE) - elif not self.__valid_pos(x, y): - raise ValueError(CONSTANTS.INDEX_ERR) - elif not self.__valid_brightness(value): - raise ValueError(CONSTANTS.BRIGHTNESS_ERR) - else: - self.__LED[y][x] = value - - def get_pixel(self, x, y): - """ - Return the brightness of pixel at column ``x`` and row ``y`` as an - integer between 0 and 9. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - if self.__valid_pos(x, y): - return self.__LED[y][x] - else: - raise ValueError(CONSTANTS.INDEX_ERR) - - def shift_up(self, n): - """ - Return a new image created by shifting the picture up by ``n`` rows. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - return self.__shift_vertical(-n) - - def shift_down(self, n): - """ - Return a new image created by shifting the picture down by ``n`` rows. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - return self.__shift_vertical(n) - - def shift_right(self, n): - """ - Return a new image created by shifting the picture right by ``n`` - columns. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - return self.__shift_horizontal(n) - - def shift_left(self, n): - """ - Return a new image created by shifting the picture left by ``n`` - columns. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - return self.__shift_horizontal(-n) - - def crop(self, x, y, w, h): - """ - Return a new image by cropping the picture to a width of ``w`` and a - height of ``h``, starting with the pixel at column ``x`` and row ``y``. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - res = Image(w, h) - res.blit(self, x, y, w, h) - return res - - def copy(self): - """ - Return an exact copy of the image. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - return Image(self.__create_string()) - - # This inverts the brightness of each LED. - # ie: Pixel that is at brightness 4 would become brightness 5 - # and pixel that is at brightness 9 would become brightness 0. - def invert(self): - """ - Return a new image by inverting the brightness of the pixels in the - source image. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - for y in range(self.height()): - for x in range(self.width()): - self.set_pixel(x, y, CONSTANTS.BRIGHTNESS_MAX - self.get_pixel(x, y)) - - # This fills all LEDs with same brightness. - def fill(self, value): - """ - Set the brightness of all the pixels in the image to the - ``value``, which has to be between 0 (dark) and 9 (bright). - - This method will raise an exception when called on any of the built-in - read-only images, like ``Image.HEART``. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - for y in range(self.height()): - for x in range(self.width()): - self.set_pixel(x, y, value) - - # This transposes a certain area (w x h) on src onto the current image. - def blit(self, src, x, y, w, h, xdest=0, ydest=0): - """ - Copy the rectangle defined by ``x``, ``y``, ``w``, ``h`` from the image ``src`` into - this image at ``xdest``, ``ydest``. - Areas in the source rectangle, but outside the source image are treated as having a value of 0. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - if not src.__valid_pos(x, y): - raise ValueError(CONSTANTS.INDEX_ERR) - - for count_y in range(h): - for count_x in range(w): - if self.__valid_pos(xdest + count_x, ydest + count_y): - if src.__valid_pos(x + count_x, y + count_y): - transfer_pixel = src.get_pixel(x + count_x, y + count_y) - else: - transfer_pixel = 0 - self.set_pixel(xdest + count_x, ydest + count_y, transfer_pixel) - - # This adds two images (if other object is not an image, throws error). - # The images must be the same size. - def __add__(self, other): - """ - Create a new image by adding the brightness values from the two images for each pixel. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - if not isinstance(other, Image): - raise TypeError( - CONSTANTS.UNSUPPORTED_ADD_TYPE + f"'{type(self)}', '{type(other)}'" - ) - elif not (other.height() == self.height() and other.width() == self.width()): - raise ValueError(CONSTANTS.SAME_SIZE_ERR) - else: - res = Image(self.width(), self.height()) - - for y in range(self.height()): - for x in range(self.width()): - sum_value = other.get_pixel(x, y) + self.get_pixel(x, y) - display_result = min(CONSTANTS.BRIGHTNESS_MAX, sum_value) - res.set_pixel(x, y, display_result) - - return res - - # This multiplies image by number (if other factor is not a number, it throws an error). - def __mul__(self, other): - """ - Create a new image by multiplying the brightness of each pixel by n. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - try: - float_val = float(other) - except TypeError: - raise TypeError(f"can't convert {type(other)} to float") - - res = Image(self.width(), self.height()) - - for y in range(self.height()): - for x in range(self.width()): - product = self.get_pixel(x, y) * float_val - res.set_pixel(x, y, min(CONSTANTS.BRIGHTNESS_MAX, product)) - - return res - - def __repr__(self): - """ - Get a compact string representation of the image. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - ret_str = "Image('" - for index_y in range(self.height()): - ret_str += self.__row_to_str(index_y) - - ret_str += "')" - - return ret_str - - def __str__(self): - """ - Get a readable string representation of the image. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - ret_str = "Image('\n" - for index_y in range(self.height()): - ret_str += "\t" + self.__row_to_str(index_y) + "\n" - - ret_str += "')" - - return ret_str - - # HELPER FUNCTIONS - - # This create 2D array of off LEDs with - # width w and height h - def __create_leds(self, w, h): - arr = [] - for _ in range(h): - sub_arr = [] - for _ in range(w): - sub_arr.append(0) - arr.append(sub_arr) - - return arr - - # This turns byte array to 2D array for LED field. - def __bytes_to_array(self, width, height, byte_arr): - bytes_translated = bytes(byte_arr) - - if not len(bytes_translated) == height * width: - raise ValueError(CONSTANTS.INCORR_IMAGE_SIZE) - - arr = [] - sub_arr = [] - - for index, elem in enumerate(bytes_translated): - if index % width == 0 and index != 0: - arr.append(sub_arr) - sub_arr = [] - - sub_arr.append(elem) - - arr.append(sub_arr) - return arr - - # This converts string (with different rows separated by ":") - # to 2d array arrangement. - def __string_to_square_array(self, pattern): - initial_array, max_subarray_len = self.__string_directly_to_array(pattern) - - # Fill in empty spaces in w x h matrix. - for arr_y in initial_array: - num_extra_spaces = max_subarray_len - len(arr_y) - for _ in range(num_extra_spaces): - arr_y.append(0) - - return initial_array - - def __string_directly_to_array(self, pattern): - # The result may have spaces in the 2D array - # and may uneven sub-array lengths - arr = [] - sub_arr = [] - - max_subarray_len = 0 - - for elem in pattern: - if elem == ":" or elem == "\n": - if len(sub_arr) > max_subarray_len: - max_subarray_len = len(sub_arr) - arr.append(sub_arr) - sub_arr = [] - else: - sub_arr.append(int(elem)) - - if ( - len(pattern) > 0 - and not str(pattern)[-1] == ":" - and not str(pattern)[-1] == "\n" - and len(sub_arr) != 0 - ): - if len(sub_arr) > max_subarray_len: - max_subarray_len = len(sub_arr) - arr.append(sub_arr) - - return arr, max_subarray_len - - def __valid_brightness(self, value): - return value >= CONSTANTS.BRIGHTNESS_MIN and value <= CONSTANTS.BRIGHTNESS_MAX - - def __valid_pos(self, x, y): - return x >= 0 and x < self.width() and y >= 0 and y < self.height() - - def __shift_vertical(self, n): - res = Image(self.width(), self.height()) - - if n > 0: - # down - res.blit(self, 0, 0, self.width(), self.height() - n, 0, n) - else: - # up - if self.__valid_pos(0, abs(n)): - res.blit(self, 0, abs(n), self.width(), self.height() - abs(n), 0, 0) - - return res - - def __shift_horizontal(self, n): - res = Image(self.width(), self.height()) - if n > 0: - # right - res.blit(self, 0, 0, self.width() - n, self.height(), n, 0) - else: - # left - if self.__valid_pos(abs(n), 0): - res.blit(self, abs(n), 0, self.width() - abs(n), self.height(), 0, 0) - - return res - - def __create_string(self): - ret_str = "" - for index_y in range(self.height()): - ret_str += self.__row_to_str(index_y) - return ret_str - - def __row_to_str(self, y): - new_str = "" - for x in range(self.width()): - new_str += str(self.get_pixel(x, y)) - - new_str += ":" - - return new_str - - @staticmethod - def __append_images(images): - width = 0 - height = 0 - for image in images: - width += image.width() - height = max(height, image.height()) - res = Image(width, height) - x_ind = 0 - for image in images: - res.blit(image, 0, 0, image.width(), image.height(), xdest=x_ind) - x_ind += image.width() - return res - - @staticmethod - def __same_image(i1, i2): - if i1.width() != i2.width() or i1.height() != i2.height(): - return False - for y in range(i1.height()): - for x in range(i1.width()): - if i1.get_pixel(x, y) != i2.get_pixel(x, y): - return False - return True - - -# This is for generating functions like Image.HEART -# that return a new read-only Image -def create_const_func(func_name): - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_STATIC) - - def func(*args): - const_instance = Image(CONSTANTS.IMAGE_PATTERNS[func_name]) - const_instance.read_only = True - return const_instance - - func.__name__ = func_name - return ProducerProperty(func) - - -# for attributes like Image.ALL_CLOCKS -# that return tuples -def create_const_list_func(func_name): - def func(*args): - collection_names = CONSTANTS.IMAGE_TUPLE_LOOKUP[func_name] - ret_list = [] - for image_name in collection_names: - const_instance = Image(CONSTANTS.IMAGE_PATTERNS[image_name]) - const_instance.read_only = True - ret_list.append(const_instance) - - return tuple(ret_list) - - func.__name__ = func_name - return ProducerProperty(func) - - -for name in CONSTANTS.IMAGE_PATTERNS.keys(): - setattr(Image, name, create_const_func(name)) - -for name in CONSTANTS.IMAGE_TUPLE_LOOKUP.keys(): - setattr(Image, name, create_const_list_func(name)) diff --git a/src/micropython/microbit/__model/microbit_model.py b/src/micropython/microbit/__model/microbit_model.py deleted file mode 100644 index 1f78e35ae..000000000 --- a/src/micropython/microbit/__model/microbit_model.py +++ /dev/null @@ -1,98 +0,0 @@ -import time - -from common import utils -from .accelerometer import Accelerometer -from .button import Button -from .compass import Compass -from .display import Display -from .i2c import I2c -from .spi import SPI -from . import constants as CONSTANTS - - -class MicrobitModel: - def __init__(self): - # State in the Python process - self.accelerometer = Accelerometer() - self.button_a = Button() - self.button_b = Button() - self.compass = Compass() - self.display = Display() - self.i2c = I2c() - self.spi = SPI() - - self.__start_time = time.time() - self.__temperature = 0 - self.__microbit_button_dict = { - "button_a": self.button_a, - "button_b": self.button_b, - } - - def panic(self, n): - # Due to the shim, there is another call frame. - utils.print_for_unimplemented_functions(MicrobitModel.panic.__name__) - - def reset(self): - # Due to the shim, there is another call frame. - utils.print_for_unimplemented_functions(MicrobitModel.reset.__name__) - - def sleep(self, n): - time.sleep(n / 1000) - - def running_time(self): - print(f"time. time: {time.time()}") - return time.time() - self.__start_time - - def temperature(self): - return self.__temperature - - def __set_temperature(self, temperature): - if ( - temperature < CONSTANTS.MIN_TEMPERATURE - or temperature > CONSTANTS.MAX_TEMPERATURE - ): - raise ValueError(CONSTANTS.INVALID_TEMPERATURE_ERR) - else: - self.__temperature = temperature - - def update_state(self, new_state): - self.__update_buttons(new_state) - self.__update_motion(new_state) - self.__update_light(new_state) - self.__update_temp(new_state) - self.__update_gesture(new_state) - - # helpers - def __update_buttons(self, new_state): - # get button pushes - for button_name in CONSTANTS.EXPECTED_INPUT_BUTTONS: - button = self.__microbit_button_dict[button_name] - button._Button__update(new_state.get(button_name)) - - def __update_motion(self, new_state): - # set motion_x, motion_y, motion_z - for name, direction in CONSTANTS.EXPECTED_INPUT_ACCEL.items(): - self.accelerometer._Accelerometer__update_motion( - direction, new_state.get(name) - ) - - def __update_light(self, new_state): - # set light level - new_light_level = new_state.get(CONSTANTS.EXPECTED_INPUT_LIGHT) - self.display._Display__update_light_level(new_light_level) - - def __update_temp(self, new_state): - # set temperature - new_temp = new_state.get(CONSTANTS.EXPECTED_INPUT_TEMP) - if new_temp is not None: - previous_temp = self.temperature() - if new_temp != previous_temp: - self._MicrobitModel__set_temperature(new_temp) - - def __update_gesture(self, new_state): - # set gesture - new_gesture = new_state.get(CONSTANTS.EXPECTED_INPUT_GESTURE) - self.accelerometer._Accelerometer__update_gesture(new_gesture) - - -__mb = MicrobitModel() diff --git a/src/micropython/microbit/__model/producer_property.py b/src/micropython/microbit/__model/producer_property.py deleted file mode 100644 index f67f23261..000000000 --- a/src/micropython/microbit/__model/producer_property.py +++ /dev/null @@ -1,3 +0,0 @@ -class ProducerProperty(property): - def __get__(self, cls, owner): - return classmethod(self.fget).__get__(cls, owner)() diff --git a/src/micropython/microbit/__model/spi.py b/src/micropython/microbit/__model/spi.py deleted file mode 100644 index d455e30b0..000000000 --- a/src/micropython/microbit/__model/spi.py +++ /dev/null @@ -1,66 +0,0 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - - -class SPI: - # The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/spi.html. - def init( - baudrate=1000000, bits=8, mode=0, sclk="pin13", mosi="pin15", miso="pin14" - ): - """ - This function is not implemented in the simulator. - - Initialize SPI communication with the specified parameters on the - specified ``pins``. Note that for correct communication, the parameters - have to be the same on both communicating devices. - - The ``baudrate`` defines the speed of communication. - - The ``bits`` defines the size of bytes being transmitted. Currently only - ``bits=8`` is supported. However, this may change in the future. - - The ``mode`` determines the combination of clock polarity and phase - according to the following convention, with polarity as the high order bit - and phase as the low order bit: - - Polarity (aka CPOL) 0 means that the clock is at logic value 0 when idle - and goes high (logic value 1) when active; polarity 1 means the clock is - at logic value 1 when idle and goes low (logic value 0) when active. Phase - (aka CPHA) 0 means that data is sampled on the leading edge of the clock, - and 1 means on the trailing edge. - - The ``sclk``, ``mosi`` and ``miso`` arguments specify the pins to use for - each type of signal. - """ - utils.print_for_unimplemented_functions(SPI.init.__qualname__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPI) - - def read(self, nbytes): - """ - This function is not implemented in the simulator. - - Read at most ``nbytes``. Returns what was read. - """ - utils.print_for_unimplemented_functions(SPI.read.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPI) - - def write(self, buffer): - """ - This function is not implemented in the simulator. - - Write the ``buffer`` of bytes to the bus. - """ - utils.print_for_unimplemented_functions(SPI.write.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPI) - - def write_readinto(self, out, in_): - """ - This function is not implemented in the simulator. - - Write the ``out`` buffer to the bus and read any response into the ``in_`` - buffer. The length of the buffers should be the same. The buffers can be - the same object. - """ - utils.print_for_unimplemented_functions(SPI.write_readinto.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPI) diff --git a/src/micropython/microbit/test/__init__.py b/src/micropython/microbit/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/micropython/microbit/test/test_accelerometer.py b/src/micropython/microbit/test/test_accelerometer.py deleted file mode 100644 index 241f63df1..000000000 --- a/src/micropython/microbit/test/test_accelerometer.py +++ /dev/null @@ -1,104 +0,0 @@ -import pytest -from unittest import mock - -from ..__model.accelerometer import Accelerometer -from ..__model import constants as CONSTANTS - - -class TestAccelerometer(object): - def setup_method(self): - self.accelerometer = Accelerometer() - - @pytest.mark.parametrize( - "accel", - [ - CONSTANTS.MIN_ACCELERATION, - CONSTANTS.MIN_ACCELERATION + 1, - 100, - CONSTANTS.MAX_ACCELERATION - 1, - CONSTANTS.MAX_ACCELERATION, - ], - ) - def test_x_y_z(self, accel): - self.accelerometer._Accelerometer__set_accel("x", accel) - assert accel == self.accelerometer.get_x() - self.accelerometer._Accelerometer__set_accel("y", accel) - assert accel == self.accelerometer.get_y() - self.accelerometer._Accelerometer__set_accel("z", accel) - assert accel == self.accelerometer.get_z() - - @pytest.mark.parametrize("axis", ["x", "y", "z"]) - def test_x_y_z_invalid_accel(self, axis): - with pytest.raises(ValueError): - self.accelerometer._Accelerometer__set_accel( - axis, CONSTANTS.MAX_ACCELERATION + 1 - ) - with pytest.raises(ValueError): - self.accelerometer._Accelerometer__set_accel( - axis, CONSTANTS.MIN_ACCELERATION - 1 - ) - - @pytest.mark.parametrize( - "accels", - [ - (23, 25, 26), - (204, 234, -534), - (CONSTANTS.MIN_ACCELERATION + 10, 234, CONSTANTS.MAX_ACCELERATION), - ], - ) - def test_get_values(self, accels): - self.accelerometer._Accelerometer__set_accel("x", accels[0]) - self.accelerometer._Accelerometer__set_accel("y", accels[1]) - self.accelerometer._Accelerometer__set_accel("z", accels[2]) - assert accels == self.accelerometer.get_values() - - @pytest.mark.parametrize("gesture", ["up", "face down", "freefall", "8g"]) - def test_current_gesture(self, gesture): - self.accelerometer._Accelerometer__set_gesture(gesture) - assert gesture == self.accelerometer.current_gesture() - - @pytest.mark.parametrize("gesture", ["up", "face down", "freefall", "8g"]) - def test_is_gesture(self, gesture): - self.accelerometer._Accelerometer__set_gesture(gesture) - assert self.accelerometer.is_gesture(gesture) - for g in CONSTANTS.GESTURES: - if g != gesture: - assert not self.accelerometer.is_gesture(g) - - def test_is_gesture_error(self): - with pytest.raises(ValueError): - self.accelerometer.is_gesture("sideways") - - def test_was_gesture(self): - mock_gesture_up = "up" - mock_gesture_down = "down" - - assert not self.accelerometer.was_gesture(mock_gesture_up) - self.accelerometer._Accelerometer__set_gesture(mock_gesture_up) - self.accelerometer.current_gesture() # Call is needed for gesture detection so it can be added to the lists. - self.accelerometer._Accelerometer__set_gesture("") - assert self.accelerometer.was_gesture(mock_gesture_up) - assert not self.accelerometer.was_gesture(mock_gesture_up) - - def test_was_gesture_error(self): - with pytest.raises(ValueError): - self.accelerometer.was_gesture("sideways") - - def test_get_gestures(self): - mock_gesture_up = "up" - mock_gesture_down = "down" - mock_gesture_freefall = "freefall" - - self.accelerometer._Accelerometer__set_gesture(mock_gesture_up) - self.accelerometer.current_gesture() # Call is needed for gesture detection so it can be added to the lists. - self.accelerometer._Accelerometer__set_gesture(mock_gesture_down) - self.accelerometer.current_gesture() - self.accelerometer._Accelerometer__set_gesture(mock_gesture_freefall) - self.accelerometer.current_gesture() - self.accelerometer._Accelerometer__set_gesture("") - assert ( - mock_gesture_up, - mock_gesture_down, - mock_gesture_freefall, - ) == self.accelerometer.get_gestures() - assert () == self.accelerometer.get_gestures() diff --git a/src/micropython/microbit/test/test_button.py b/src/micropython/microbit/test/test_button.py deleted file mode 100644 index 31e9d6720..000000000 --- a/src/micropython/microbit/test/test_button.py +++ /dev/null @@ -1,46 +0,0 @@ -import pytest -from ..__model.button import Button - - -class TestButton(object): - def setup_method(self): - self.button = Button() - - def test_press_down(self): - self.button._Button__press_down() - assert self.button._Button__presses == 1 - assert self.button._Button__pressed - assert self.button._Button__prev_pressed - self.button._Button__press_down() - assert self.button._Button__presses == 2 - assert self.button._Button__pressed - assert self.button._Button__prev_pressed - - def test_release(self): - self.button._Button__pressed = True - self.button._Button__prev_pressed = False - self.button._Button__release() - assert not self.button._Button__pressed - - def test_is_pressed(self): - assert not self.button.is_pressed() - self.button._Button__press_down() - assert self.button.is_pressed() - - def test_was_pressed(self): - assert not self.button.was_pressed() - self.button._Button__press_down() - self.button._Button__release() - assert self.button.was_pressed() - # Button resets __prev_pressed after was_pressed() is called. - assert not self.button.was_pressed() - - @pytest.mark.parametrize("presses", [1, 2, 4]) - def test_get_presses(self, presses): - assert 0 == self.button.get_presses() - for i in range(presses): - self.button._Button__press_down() - self.button._Button__release() - assert presses == self.button.get_presses() - # Presses is reset to 0 after get_presses() is called. - assert 0 == self.button.get_presses() diff --git a/src/micropython/microbit/test/test_display.py b/src/micropython/microbit/test/test_display.py deleted file mode 100644 index 1055c8870..000000000 --- a/src/micropython/microbit/test/test_display.py +++ /dev/null @@ -1,185 +0,0 @@ -import pytest -import threading -from unittest import mock -from common import utils - -from ..__model import constants as CONSTANTS -from ..__model.display import Display -from ..__model.image import Image - - -STR_A = "09900:90090:99990:90090:90090" -STR_QUESTION_MARK = "09990:90009:00990:00000:00900" -STR_EXCLAMATION_MARK = "09000:09000:09000:00000:09000:" -STR_SIX = "00090:00900:09990:90009:09990" - - -class TestDisplay(object): - def setup_method(self): - self.display = Display() - utils.send_to_simulator = mock.Mock() - - @pytest.mark.parametrize("x, y, brightness", [(1, 1, 4), (2, 3, 6), (4, 4, 9)]) - def test_set_and_get_pixel(self, x, y, brightness): - self.display.set_pixel(x, y, brightness) - assert brightness == self.display.get_pixel(x, y) - - @pytest.mark.parametrize("x, y", [(5, 0), (0, -1), (0, 5)]) - def test_get_pixel_error(self, x, y): - with pytest.raises(ValueError, match=CONSTANTS.INDEX_ERR): - self.display.get_pixel(x, y) - - @pytest.mark.parametrize( - "x, y, brightness, err_msg", - [ - (5, 0, 0, CONSTANTS.INDEX_ERR), - (0, -1, 0, CONSTANTS.INDEX_ERR), - (0, 0, -1, CONSTANTS.BRIGHTNESS_ERR), - ], - ) - def test_set_pixel_error(self, x, y, brightness, err_msg): - with pytest.raises(ValueError, match=err_msg): - self.display.set_pixel(x, y, brightness) - - def test_clear(self): - self.display.set_pixel(2, 3, 7) - self.display.set_pixel(3, 4, 6) - self.display.set_pixel(4, 4, 9) - assert not self.__is_clear() - self.display.clear() - assert self.__is_clear() - - def test_on_off(self): - self.display.on() - assert self.display.is_on() - self.display.off() - assert not self.display.is_on() - - def test_show_one_image(self): - img = Image() - img.set_pixel(0, 0, 8) - img.set_pixel(0, 1, 9) - img.set_pixel(0, 2, 7) - img.set_pixel(2, 2, 6) - self.display.show(img, delay=0) - assert Image._Image__same_image(img, self.display._Display__image) - - def test_show_different_size_image(self): - img = Image(3, 7) - img.set_pixel(1, 1, 9) - img.set_pixel(2, 6, 9) # Will not be on display - expected = Image(5, 5) - expected.set_pixel(1, 1, 9) - self.display.show(img, delay=0) - assert Image._Image__same_image(expected, self.display._Display__image) - - def test_show_smaller_image(self): - img = Image(2, 2) - img.set_pixel(1, 1, 9) - expected = Image(5, 5) - expected.set_pixel(1, 1, 9) - self.display.show(img, delay=0) - assert Image._Image__same_image(expected, self.display._Display__image) - - @pytest.mark.parametrize( - "value, expected_str", - [ - ("!", STR_EXCLAMATION_MARK), - ("A", STR_A), - (" ", CONSTANTS.BLANK_5X5), - (6, STR_SIX), - ("\x7F", STR_QUESTION_MARK), # Character is out of our ASCII range - ], - ) - def test_show_char(self, value, expected_str): - expected = Image(expected_str) - self.display.show(value, delay=0) - assert Image._Image__same_image(expected, self.display._Display__image) - - def test_show_char_with_clear(self): - image = Image(STR_EXCLAMATION_MARK) - self.display.show(image, delay=0, clear=True) - assert self.__is_clear() - - def test_show_iterable(self): - expected = Image(STR_A) - value = [Image(STR_EXCLAMATION_MARK), "A", "ab"] - self.display.show(value, delay=0) - assert Image._Image__same_image(expected, self.display._Display__image) - - def test_show_non_iterable(self): - with pytest.raises(TypeError): - self.display.show(TestDisplay()) - - def test_scroll(self): - self.display.scroll("a b") - self.__is_clear() - - def test_scroll_type_error(self): - with pytest.raises(TypeError): - self.display.scroll(["a", 1]) - - # Should change these threaded tests to test behaviour in the future - def test_show_threaded(self): - threading.Thread = mock.Mock() - self.display.show("a", delay=0, wait=False) - threading.Thread.assert_called_once() - - def test_scroll_threaded(self): - threading.Thread = mock.Mock() - self.display.scroll("test", delay=0, wait=False) - threading.Thread.assert_called_once() - - def test_get_array(self): - self.display.set_pixel(3, 3, 3) - self.display.off() - assert self.display._Display__get_array() == [ - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - ] - - self.display.on() - assert self.display._Display__get_array() == [ - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 3, 0], - [0, 0, 0, 0, 0], - ] - - # The second show call should immedaitely stop the first show call. - # Therefore the final result of display should be 6. - def test_async_tests(self): - self.display.show("MMMMMMMMMMMMMM", delay=100, wait=False) - self.display.show("6", delay=0) - assert Image._Image__same_image(Image(STR_SIX), self.display._Display__image) - - @pytest.mark.parametrize( - "light_level", - [ - CONSTANTS.MIN_LIGHT_LEVEL, - CONSTANTS.MIN_LIGHT_LEVEL + 1, - 100, - CONSTANTS.MAX_LIGHT_LEVEL - 1, - CONSTANTS.MAX_LIGHT_LEVEL, - ], - ) - def test_light_level(self, light_level): - self.display._Display__set_light_level(light_level) - assert light_level == self.display.read_light_level() - - @pytest.mark.parametrize( - "invalid_light_level", - [CONSTANTS.MIN_LIGHT_LEVEL - 1, CONSTANTS.MAX_LIGHT_LEVEL + 1], - ) - def test_invalid_light_level(self, invalid_light_level): - with pytest.raises(ValueError): - self.display._Display__set_light_level(invalid_light_level) - - # Helpers - def __is_clear(self): - i = Image(CONSTANTS.BLANK_5X5) - return Image._Image__same_image(i, self.display._Display__image) diff --git a/src/micropython/microbit/test/test_image.py b/src/micropython/microbit/test/test_image.py deleted file mode 100644 index 5ea150230..000000000 --- a/src/micropython/microbit/test/test_image.py +++ /dev/null @@ -1,283 +0,0 @@ -import pytest -from ..__model.image import Image - -from ..__model import constants as CONSTANTS - - -class TestImage(object): - def setup_method(self): - self.image = Image() - self.image_heart = Image(CONSTANTS.IMAGE_PATTERNS["HEART"]) - - @pytest.mark.parametrize("x, y, brightness", [(1, 1, 4), (2, 3, 6), (4, 4, 9)]) - def test_get_set_pixel(self, x, y, brightness): - self.image.set_pixel(x, y, brightness) - assert brightness == self.image.get_pixel(x, y) - - @pytest.mark.parametrize("x, y", [(5, 0), (0, -1), (0, 5)]) - def test_get_pixel_error(self, x, y): - with pytest.raises(ValueError, match=CONSTANTS.INDEX_ERR): - self.image.get_pixel(x, y) - - @pytest.mark.parametrize( - "x, y, brightness, err_msg", - [ - (5, 0, 0, CONSTANTS.INDEX_ERR), - (0, -1, 0, CONSTANTS.INDEX_ERR), - (0, 0, -1, CONSTANTS.BRIGHTNESS_ERR), - ], - ) - def test_set_pixel_error(self, x, y, brightness, err_msg): - with pytest.raises(ValueError, match=err_msg): - self.image.set_pixel(x, y, brightness) - - @pytest.mark.parametrize( - "image, height, width", - [ - (Image(), 5, 5), - (Image(3, 3), 3, 3), - (Image(""), 0, 0), - (Image("00:00000"), 2, 5), - (Image("0000:0000"), 2, 4), - ], - ) - def test_width_and_height(self, image, height, width): - print(str(image)) - assert image.height() == height - assert image.width() == width - - @pytest.mark.parametrize( - "x, y, w, h, x_dest, y_dest, actual", - [ - (0, 0, 3, 2, 2, 1, Image("00000:00090:00999:00000:00000:")), - (0, 0, 3, 3, 8, 8, Image("00000:00000:00000:00000:00000:")), - (3, 0, 3, 3, 0, 0, Image("90000:99000:99000:00000:00000:")), - (3, 0, 7, 7, 0, 0, Image("90000:99000:99000:90000:00000:")), - ], - ) - def test_blit_heart(self, x, y, w, h, x_dest, y_dest, actual): - result = Image() - result.blit(self.image_heart, x, y, w, h, x_dest, y_dest) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "x, y, w, h, x_dest, y_dest, actual", - [ - (1, 1, 2, 4, 3, 3, Image("09090:99999:99999:09999:00999:")), - (0, 0, 3, 3, 8, 8, Image(CONSTANTS.IMAGE_PATTERNS["HEART"])), - (0, 0, 7, 7, 0, 0, Image(CONSTANTS.IMAGE_PATTERNS["HEART"])), - (3, 0, 7, 7, 0, 0, Image("90000:99000:99000:90000:00000:")), - ], - ) - def test_blit_heart_nonblank(self, x, y, w, h, x_dest, y_dest, actual): - result = Image(CONSTANTS.IMAGE_PATTERNS["HEART"]) - src = Image(CONSTANTS.IMAGE_PATTERNS["HEART"]) - result.blit(src, x, y, w, h, x_dest, y_dest) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "x, y, w, h, x_dest, y_dest", [(5, 6, 2, 4, 3, 3), (5, 0, 3, 3, 8, 8)] - ) - def test_blit_heart_valueerror(self, x, y, w, h, x_dest, y_dest): - result = Image(CONSTANTS.IMAGE_PATTERNS["HEART"]) - with pytest.raises(ValueError, match=CONSTANTS.INDEX_ERR): - result.blit(self.image_heart, x, y, w, h, x_dest, y_dest) - - @pytest.mark.parametrize( - "image1, image2", [(Image(2, 2, bytearray([4, 4, 4, 4])), Image("44:44"))] - ) - def test_constructor_bytearray(self, image1, image2): - assert image1._Image__LED == image2._Image__LED - - @pytest.mark.parametrize( - "x, y, w, h, actual", [(1, 1, 2, 4, Image("99:99:99:09:"))] - ) - def test_crop_heart(self, x, y, w, h, actual): - result = self.image_heart.crop(1, 1, 2, 4) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, actual", [(Image("99:99:99:00:"), Image("22:22:22:22:"))] - ) - def test_fill(self, target, actual): - target.fill(2) - assert target._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, actual", [(Image("012:345:678:900:"), Image("987:654:321:099:"))] - ) - def test_invert(self, target, actual): - target.invert() - assert target._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, value, actual", - [ - (Image("012:345:678:900:"), 1, Image("001:034:067:090:")), - (Image("012:345:678:900:"), 6, Image("000:000:000:000:")), - (Image("012:345:678:900:"), -1, Image("120:450:780:000:")), - ], - ) - def test_shift_right(self, target, value, actual): - result = target.shift_right(value) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, value, actual", - [ - (Image("012:345:678:900:"), 2, Image("200:500:800:000:")), - (Image("012:345:678:900:"), 6, Image("000:000:000:000:")), - (Image("012:345:678:900:"), -2, Image("000:003:006:009:")), - ], - ) - def test_shift_left(self, target, value, actual): - result = target.shift_left(value) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, value, actual", - [ - (Image("012:345:678:900:"), 2, Image("678:900:000:000:")), - (Image("012:345:678:900:"), 6, Image("000:000:000:000:")), - (Image("012:345:678:900:"), -2, Image("000:000:012:345:")), - ], - ) - def test_shift_up(self, target, value, actual): - result = target.shift_up(value) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, value, actual", - [ - (Image("012:345:678:900:"), 1, Image("000:012:345:678")), - (Image("012:345:678:900:"), 6, Image("000:000:000:000:")), - (Image("012:345:678:900:"), -1, Image("345:678:900:000:")), - ], - ) - def test_shift_down(self, target, value, actual): - result = target.shift_down(value) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize("target", [(Image("012:345:678:900:"))]) - def test_copy(self, target): - result = target.copy() - assert result._Image__LED == target._Image__LED - - @pytest.mark.parametrize( - "target, multiplier, actual", - [ - (Image("012:345:678:900:"), 2, Image("024:689:999:900:")), - (Image("012:345:678:900:"), 0, Image("000:000:000:000:")), - ], - ) - def test_multiply(self, target, multiplier, actual): - result = target * multiplier - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, multiplier", - [ - (Image("012:345:678:900:"), []), - (Image("012:345:678:900:"), Image("000:000:000:000:")), - ], - ) - def test_multiply_error(self, target, multiplier): - - with pytest.raises( - TypeError, match=f"can't convert {type(multiplier)} to float" - ): - target * multiplier - - @pytest.mark.parametrize( - "target, value, actual", - [ - ( - Image("012:345:678:900:"), - Image("024:689:999:900:"), - Image("036:999:999:900:"), - ), - ( - Image("999:999:999:000:"), - Image("999:999:999:000:"), - Image("999:999:999:000:"), - ), - ], - ) - def test_add(self, target, value, actual): - result = target + value - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, value, err_message", - [ - ( - Image("012:345:678:900:"), - 2, - CONSTANTS.UNSUPPORTED_ADD_TYPE + f"'{type(Image())}', '{type(2)}'", - ), - ( - Image("012:345:678:900:"), - [], - CONSTANTS.UNSUPPORTED_ADD_TYPE + f"'{type(Image())}', '{type([])}'", - ), - ], - ) - def test_add_typeerror(self, target, value, err_message): - with pytest.raises(TypeError, match=err_message): - target + value - - @pytest.mark.parametrize( - "target, value", [(Image(2, 3), Image(3, 3)), (Image(2, 1), Image(0, 0))] - ) - def test_add_valueerror(self, target, value): - with pytest.raises(ValueError, match=CONSTANTS.SAME_SIZE_ERR): - target + value - - @pytest.mark.parametrize( - "initial, actual", - [ - (Image("0:000:00:0000:"), Image("0000:0000:0000:0000:")), - (Image("12125:1212:12:1:"), Image("12125:12120:12000:10000:")), - ], - ) - def test_uneven_strings(self, initial, actual): - assert initial._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "image, repr_actual, str_actual", - [ - ( - Image("05150:05050:05050:99999:09990:"), - "Image('05150:05050:05050:99999:09990:')", - "Image('\n 05150:\n 05050:\n 05050:\n 99999:\n 09990:\n')", - ), - (Image(""), "Image('')", "Image('\n')"), - ( - Image("00000:00000:00000:00000:00000:"), - "Image('00000:00000:00000:00000:00000:')", - "Image('\n 00000:\n 00000:\n 00000:\n 00000:\n 00000:\n')", - ), - ( - Image("00:00:00:00:"), - "Image('00:00:00:00:')", - "Image('\n 00:\n 00:\n 00:\n 00:\n')", - ), - ], - ) - def test_str(self, image, repr_actual, str_actual): - repr_output = repr(image) - str_output = str(image) - assert repr_actual == repr_output - assert str_actual == str_output - - @pytest.mark.parametrize( - "const, actual", - [ - (Image.SNAKE, Image(CONSTANTS.IMAGE_PATTERNS["SNAKE"])), - (Image.PITCHFORK, Image(CONSTANTS.IMAGE_PATTERNS["PITCHFORK"])), - ], - ) - def test_image_constants(self, const, actual): - assert const._Image__LED == actual._Image__LED - with pytest.raises(TypeError, match=CONSTANTS.COPY_ERR_MESSAGE): - const.set_pixel(0, 0, 5) diff --git a/src/micropython/microbit/test/test_init.py b/src/micropython/microbit/test/test_init.py deleted file mode 100644 index aebbc805a..000000000 --- a/src/micropython/microbit/test/test_init.py +++ /dev/null @@ -1,45 +0,0 @@ -import time - -import pytest -from unittest import mock - -from .. import * -from ..__model.microbit_model import MicrobitModel - -# tests methods in __init__.py - - -class TestShim(object): - def test_sleep(self): - # Save pointer to function about to be mocked - real_function = MicrobitModel.sleep - - milliseconds = 100 - MicrobitModel.sleep = mock.Mock() - sleep(milliseconds) - MicrobitModel.sleep.assert_called_with(milliseconds) - - # Restore original function - MicrobitModel.sleep = real_function - - def test_running_time(self): - # Save pointer to function about to be mocked - real_function = MicrobitModel.running_time - - MicrobitModel.running_time = mock.Mock() - running_time() - MicrobitModel.running_time.assert_called_once() - - # Restore original function - MicrobitModel.running_time = real_function - - def test_temperature(self): - # Save pointer to function about to be mocked - real_function = MicrobitModel.temperature - - MicrobitModel.temperature = mock.Mock() - temperature() - MicrobitModel.temperature.asser_called_once() - - # Restore original function - MicrobitModel.temperature = real_function diff --git a/src/micropython/microbit/test/test_microbit_model.py b/src/micropython/microbit/test/test_microbit_model.py deleted file mode 100644 index 4e06c6c36..000000000 --- a/src/micropython/microbit/test/test_microbit_model.py +++ /dev/null @@ -1,48 +0,0 @@ -import time - -import pytest -from unittest import mock -from ..__model import constants as CONSTANTS -from ..__model.microbit_model import MicrobitModel - - -class TestMicrobitModel(object): - def setup_method(self): - self.__mb = MicrobitModel() - - @pytest.mark.parametrize("value", [9, 30, 1999]) - def test_sleep(self, value): - time.sleep = mock.Mock() - self.__mb.sleep(value) - time.sleep.assert_called_with(value / 1000) - - def test_running_time(self): - mock_start_time = 10 - mock_end_time = 300 - self.__mb._MicrobitModel__start_time = mock_start_time - time.time = mock.MagicMock(return_value=mock_end_time) - assert mock_end_time - mock_start_time == pytest.approx( - self.__mb.running_time() - ) - - @pytest.mark.parametrize( - "temperature", - [ - CONSTANTS.MIN_TEMPERATURE, - CONSTANTS.MIN_TEMPERATURE + 1, - 0, - CONSTANTS.MAX_TEMPERATURE - 1, - CONSTANTS.MAX_TEMPERATURE, - ], - ) - def test_temperature(self, temperature): - self.__mb._MicrobitModel__set_temperature(temperature) - assert temperature == self.__mb.temperature() - - @pytest.mark.parametrize( - "invalid_temperature", - [CONSTANTS.MIN_TEMPERATURE - 1, CONSTANTS.MAX_TEMPERATURE + 1], - ) - def test_invalid_temperature(self, invalid_temperature): - with pytest.raises(ValueError): - self.__mb._MicrobitModel__set_temperature(invalid_temperature) diff --git a/src/micropython/music.py b/src/micropython/music.py deleted file mode 100644 index ad25816a6..000000000 --- a/src/micropython/music.py +++ /dev/null @@ -1,109 +0,0 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/music.html. - - -def set_tempo(ticks=4, bpm=120): - """ - This function is not implemented in the simulator. - - Sets the approximate tempo for playback. - - A number of ticks (expressed as an integer) constitute a beat. Each beat is to be played at a certain frequency per minute (expressed as the more familiar BPM - beats per minute - also as an integer). - - Suggested default values allow the following useful behaviour: - - * ``music.set_tempo()`` - reset the tempo to default of ticks = 4, bpm = 120 - * ``music.set_tempo(ticks=8)`` - change the "definition" of a beat - * ``music.set_tempo(bpm=180)`` - just change the tempo - - To work out the length of a tick in milliseconds is very simple arithmetic: ``60000/bpm/ticks_per_beat`` . For the default values that's ``60000/120/4 = 125 milliseconds`` or ``1 beat = 500 milliseconds``. - """ - utils.print_for_unimplemented_functions(set_tempo.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def get_tempo(): - """ - This function is not implemented in the simulator. - - Gets the current tempo as a tuple of integers: ``(ticks, bpm)``. - """ - utils.print_for_unimplemented_functions(get_tempo.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def play(music, pin="microbit.pin0", wait=True, loop=False): - """ - This function is not implemented in the simulator. - - Plays ``music`` containing the musical DSL defined above. - - If ``music`` is a string it is expected to be a single note such as, - ``'c1:4'``. - - If ``music`` is specified as a list of notes (as defined in the section on - the musical DSL, above) then they are played one after the other to perform - a melody. - - In both cases, the ``duration`` and ``octave`` values are reset to - their defaults before the music (whatever it may be) is played. - - An optional argument to specify the output pin can be used to override the - default of ``microbit.pin0``. - - If ``wait`` is set to ``True``, this function is blocking. - - If ``loop`` is set to ``True``, the tune repeats until ``stop`` is called - (see below) or the blocking call is interrupted. - """ - utils.print_for_unimplemented_functions(play.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def pitch(frequency, duration=-1, pin="microbit.pin0", wait=True): - """ - This function is not implemented in the simulator. - - Plays a pitch at the integer frequency given for the specified number of - milliseconds. For example, if the frequency is set to 440 and the length to - 1000 then we hear a standard concert A for one second. - - Note that you can only play one pitch on one pin at any one time. - - If ``wait`` is set to ``True``, this function is blocking. - - If ``duration`` is negative the pitch is played continuously until either the - blocking call is interrupted or, in the case of a background call, a new - frequency is set or ``stop`` is called (see below). - """ - utils.print_for_unimplemented_functions(pitch.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def stop(pin="microbit.pin0"): - """ - This function is not implemented in the simulator. - - Stops all music playback on a given pin, eg. ``music.stop(pin1)``. - If no pin is given, eg. ``music.stop()`` pin0 is assumed. - """ - utils.print_for_unimplemented_functions(stop.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def reset(): - """ - This function is not implemented in the simulator. - - Resets the state of the following attributes in the following way: - - * ``ticks = 4`` - * ``bpm = 120`` - * ``duration = 4`` - * ``octave = 4`` - """ - utils.print_for_unimplemented_functions(reset.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) diff --git a/src/micropython/radio.py b/src/micropython/radio.py deleted file mode 100644 index ac6d24fe3..000000000 --- a/src/micropython/radio.py +++ /dev/null @@ -1,180 +0,0 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/radio.html. - -RATE_250KBIT = "" - -RATE_1MBIT = "" - -RATE_2MBIT = "" - - -def on(): - """ - This function is not implemented in the simulator. - - Turns the radio on. This needs to be explicitly called since the radio - draws power and takes up memory that you may otherwise need. - """ - utils.print_for_unimplemented_functions(on.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def off(): - """ - This function is not implemented in the simulator. - - Turns off the radio, thus saving power and memory - """ - utils.print_for_unimplemented_functions(off.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def config(**kwargs): - """ - This function is not implemented in the simulator. - - Configures various keyword based settings relating to the radio. The - available settings and their sensible default values are listed below. - - The ``length`` (default=32) defines the maximum length, in bytes, of a - message sent via the radio. It can be up to 251 bytes long (254 - 3 bytes - for S0, LENGTH and S1 preamble). - - The ``queue`` (default=3) specifies the number of messages that can be - stored on the incoming message queue. If there are no spaces left on the - queue for incoming messages, then the incoming message is dropped. - - The ``channel`` (default=7) can be an integer value from 0 to 83 - (inclusive) that defines an arbitrary "channel" to which the radio is - tuned. Messages will be sent via this channel and only messages received - via this channel will be put onto the incoming message queue. Each step is - 1MHz wide, based at 2400MHz. - - The ``power`` (default=6) is an integer value from 0 to 7 (inclusive) to - indicate the strength of signal used when broadcasting a message. The - higher the value the stronger the signal, but the more power is consumed - by the device. The numbering translates to positions in the following list - of dBm (decibel milliwatt) values: -30, -20, -16, -12, -8, -4, 0, 4. - - The ``address`` (default=0x75626974) is an arbitrary name, expressed as a - 32-bit address, that's used to filter incoming packets at the hardware - level, keeping only those that match the address you set. The default used - by other micro:bit related platforms is the default setting used here. - - The ``group`` (default=0) is an 8-bit value (0-255) used with the - ``address`` when filtering messages. Conceptually, "address" is like a - house/office address and "group" is like the person at that address to - which you want to send your message. - - The ``data_rate`` (default=radio.RATE_1MBIT) indicates the speed at which - data throughput takes place. Can be one of the following contants defined - in the ``radio`` module : ``RATE_250KBIT``, ``RATE_1MBIT`` or - ``RATE_2MBIT``. - - If ``config`` is not called then the defaults described above are assumed. - """ - utils.print_for_unimplemented_functions(config.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def reset(): - """ - This function is not implemented in the simulator. - - Reset the settings to their default values (as listed in the documentation - for the ``config`` function above). - """ - utils.print_for_unimplemented_functions(reset.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def send_bytes(message): - """ - This function is not implemented in the simulator. - - Sends a message containing bytes. - """ - utils.print_for_unimplemented_functions(send_bytes.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def receive_bytes(): - """ - This function is not implemented in the simulator. - - Receive the next incoming message on the message queue. Returns ``None`` if - there are no pending messages. Messages are returned as bytes. - """ - utils.print_for_unimplemented_functions(receive_bytes.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def receive_bytes_into(buffer): - """ - This function is not implemented in the simulator. - - Receive the next incoming message on the message queue. Copies the message - into ``buffer``, trimming the end of the message if necessary. - Returns ``None`` if there are no pending messages, otherwise it returns the length - of the message (which might be more than the length of the buffer). - """ - utils.print_for_unimplemented_functions(receive_bytes_into.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def send(message): - """ - This function is not implemented in the simulator. - - Sends a message containing bytes. - """ - utils.print_for_unimplemented_functions(send.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def receive(): - """ - This function is not implemented in the simulator. - - Works in exactly the same way as ``receive_bytes`` but returns - whatever was sent. - - Currently, it's equivalent to ``str(receive_bytes(), 'utf8')`` but with a - check that the the first three bytes are ``b'\x01\x00\x01'`` (to make it - compatible with other platforms that may target the micro:bit). It strips - the prepended bytes before converting to a string. - - A ``ValueError`` exception is raised if conversion to string fails. - """ - utils.print_for_unimplemented_functions(receive.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def receive_full(): - """ - This function is not implemented in the simulator. - - Returns a tuple containing three values representing the next incoming - message on the message queue. If there are no pending messages then - ``None`` is returned. - - The three values in the tuple represent: - - * the next incoming message on the message queue as bytes. - * the RSSI (signal strength): a value between 0 (strongest) and -255 (weakest) as measured in dBm. - * a microsecond timestamp: the value returned by ``time.ticks_us()`` when the message was received. - - For example:: - - details = radio.receive_full() - if details: - msg, rssi, timestamp = details - - This function is useful for providing information needed for triangulation - and/or triliteration with other micro:bit devices. - """ - utils.print_for_unimplemented_functions(receive_full.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) diff --git a/src/micropython/speech.py b/src/micropython/speech.py deleted file mode 100644 index e92458a96..000000000 --- a/src/micropython/speech.py +++ /dev/null @@ -1,61 +0,0 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/speech.html. - - -def translate(words): - """ - This function is not implemented in the simulator. - - Given English words in the string ``words``, return a string containing - a best guess at the appropriate phonemes to pronounce. The output is - generated from this - `text to phoneme translation table `_. - - This function should be used to generate a first approximation of phonemes - that can be further hand-edited to improve accuracy, inflection and - emphasis. - """ - utils.print_for_unimplemented_functions(translate.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) - - -def pronounce(phonemes, pitch=64, speed=72, mouth=128, throat=128): - """ - This function is not implemented in the simulator. - - Pronounce the phonemes in the string ``phonemes``. See below for details of - how to use phonemes to finely control the output of the speech synthesiser. - Override the optional pitch, speed, mouth and throat settings to change the - timbre (quality) of the voice. - """ - utils.print_for_unimplemented_functions(pronounce.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) - - -def say(words, pitch=64, speed=72, mouth=128, throat=128): - """ - This function is not implemented in the simulator. - - Say the English words in the string ``words``. The result is semi-accurate - for English. Override the optional pitch, speed, mouth and throat - settings to change the timbre (quality) of the voice. This is a short-hand - equivalent of: ``speech.pronounce(speech.translate(words))`` - """ - utils.print_for_unimplemented_functions(say.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) - - -def sing(phonemes, pitch=64, speed=72, mouth=128, throat=128): - """ - This function is not implemented in the simulator. - - Sing the phonemes contained in the string ``phonemes``. Changing the pitch - and duration of the note is described below. Override the optional pitch, - speed, mouth and throat settings to change the timbre (quality) of the - voice. - """ - utils.print_for_unimplemented_functions(sing.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) diff --git a/src/micropython/utime.py b/src/micropython/utime.py deleted file mode 100644 index 9ae5ee4df..000000000 --- a/src/micropython/utime.py +++ /dev/null @@ -1,132 +0,0 @@ -import time - -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/utime.html. - - -def sleep(seconds): - """ - Sleep for the given number of seconds. You can use a floating-point number - to sleep for a fractional number of seconds, or use the - :func:`utime.sleep_ms()` and :func:`utime.sleep_us()` functions. - """ - time.sleep(seconds) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def sleep_ms(ms): - """ - Delay for given number of milliseconds, should be positive or 0. - """ - time.sleep(ms / 1000) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def sleep_us(us): - """ - Delay for given number of microseconds, should be positive or 0. - """ - time.sleep(us / 1000000) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def ticks_ms(): - """ - This function is not implemented in the simulator. - - Returns an increasing millisecond counter with an arbitrary reference point, - that wraps around after some value. - """ - utils.print_for_unimplemented_functions(ticks_ms.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def ticks_us(): - """ - This function is not implemented in the simulator. - - Just like :func:`utime.ticks_ms()` above, but in microseconds. - """ - utils.print_for_unimplemented_functions(ticks_us.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def ticks_add(ticks, delta): - """ - This function is not implemented in the simulator. - - Offset ticks value by a given number, which can be either positive or - negative. Given a ticks value, this function allows to calculate ticks - value delta ticks before or after it, following modular-arithmetic - definition of tick values. - - Example: - - .. code-block:: python - - # Find out what ticks value there was 100ms ago - print(ticks_add(time.ticks_ms(), -100)) - - # Calculate deadline for operation and test for it - deadline = ticks_add(time.ticks_ms(), 200) - while ticks_diff(deadline, time.ticks_ms()) > 0: - do_a_little_of_something() - - # Find out TICKS_MAX used by this port - print(ticks_add(0, -1)) - """ - utils.print_for_unimplemented_functions(ticks_add.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def ticks_diff(ticks1, ticks2): - """ - This function is not implemented in the simulator. - - Measure ticks difference between values returned from - :func:`utime.ticks_ms()` or :func:`ticks_us()` functions, as a signed value - which may wrap around. - - The argument order is the same as for subtraction operator, - ``ticks_diff(ticks1, ticks2)`` has the same meaning as ``ticks1 - ticks2``. - - :func:`utime.ticks_diff()` is designed to accommodate various usage - patterns, among them: - - Polling with timeout. In this case, the order of events is known, and you - will deal only with positive results of :func:`utime.ticks_diff()`: - - .. code-block:: python - - # Wait for GPIO pin to be asserted, but at most 500us - start = time.ticks_us() - while pin.value() == 0: - if time.ticks_diff(time.ticks_us(), start) > 500: - raise TimeoutError - - - Scheduling events. In this case, :func:`utime.ticks_diff()` result may be - negative if an event is overdue: - - - .. code-block:: python - - # This code snippet is not optimized - now = time.ticks_ms() - scheduled_time = task.scheduled_time() - if ticks_diff(scheduled_time, now) > 0: - print("Too early, let's nap") - sleep_ms(ticks_diff(scheduled_time, now)) - task.run() - elif ticks_diff(scheduled_time, now) == 0: - print("Right at time!") - task.run() - elif ticks_diff(scheduled_time, now) < 0: - print("Oops, running late, tell task to run faster!") - task.run(run_faster=true) - """ - utils.print_for_unimplemented_functions(ticks_diff.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) diff --git a/src/process_user_code.py b/src/process_user_code.py deleted file mode 100644 index 4b17792a6..000000000 --- a/src/process_user_code.py +++ /dev/null @@ -1,152 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -import os -import io -import sys -import copy -import json -import threading -import traceback -import python_constants as CONSTANTS -from pathlib import Path -import check_python_dependencies - -# will propagate errors if dependencies aren't sufficient -check_python_dependencies.check_for_dependencies() - -read_val = "" -threads = [] -# Redirecting the process stdout -user_stdout = io.StringIO() -sys.stdout = user_stdout - -abs_path_to_parent_dir = os.path.dirname(os.path.abspath(__file__)) - -# Insert absolute path to library for CLUE into sys.path -sys.path.insert(0, os.path.join(abs_path_to_parent_dir, CONSTANTS.CLUE_DIR)) - -# Insert absolute path to Circuitpython libraries for CLUE into sys.path -sys.path.insert(0, os.path.join(abs_path_to_parent_dir, CONSTANTS.CIRCUITPYTHON)) - -# Insert absolute path to Adafruit library for CPX into sys.path -abs_path_to_adafruit_lib = os.path.join( - abs_path_to_parent_dir, CONSTANTS.ADAFRUIT_LIBRARY_NAME -) -sys.path.insert(0, abs_path_to_adafruit_lib) - -# Insert absolute path to Micropython libraries for micro:bit into sys.path -abs_path_to_micropython_lib = os.path.join( - abs_path_to_parent_dir, CONSTANTS.MICROPYTHON_LIBRARY_NAME -) -sys.path.insert(0, abs_path_to_micropython_lib) - -# This import must happen after the sys.path is modified -from common.telemetry import telemetry_py -from common import utils -from adafruit_circuitplayground.express import cpx -from adafruit_circuitplayground.constants import CPX - -from microbit.__model.microbit_model import __mb as mb -from microbit.__model.constants import MICROBIT - -from adafruit_clue import clue -from base_circuitpython.base_cp_constants import CLUE -import board - -# get handle to terminal for clue -curr_terminal = board.DISPLAY.terminal - -# Handle User Inputs Thread -class UserInput(threading.Thread): - def __init__(self): - threading.Thread.__init__(self) - - def run(self): - device_dict = {CPX: cpx, MICROBIT: mb, CLUE: clue} - while True: - read_val = sys.stdin.readline() - sys.stdin.flush() - try: - new_state_message = json.loads(read_val) - device = new_state_message.get(CONSTANTS.ACTIVE_DEVICE_FIELD) - new_state = new_state_message.get(CONSTANTS.STATE_FIELD, {}) - if device in device_dict: - device_dict[device].update_state(new_state) - else: - raise Exception(CONSTANTS.DEVICE_NOT_IMPLEMENTED_ERROR) - - except Exception as e: - print(CONSTANTS.ERROR_SENDING_EVENT, e, file=sys.stderr, flush=True) - - -user_input = UserInput() -threads.append(user_input) -user_input.start() - - -# Handle User's Print Statements Thread -def handle_user_prints(): - global user_stdout - global curr_terminal - while True: - if user_stdout.getvalue(): - message = {"type": "print", "data": user_stdout.getvalue()} - - # when I use the value for user_stdout.getvalue() directly - # as the argument for add_str_to_terminal, it only sends the first - # line of the stream. - - # hence, I parse it out of the message dict and take off the - # extra newline at the end. - - data_str = str(message["data"]) - curr_terminal.add_str_to_terminal(data_str[:-1]) - print(json.dumps(message) + "\0", file=sys.__stdout__, flush=True) - user_stdout.truncate(0) - user_stdout.seek(0) - - -user_prints = threading.Thread(target=handle_user_prints) -threads.append(user_prints) -user_prints.start() - - -# Execute User Code Thread -def execute_user_code(abs_path_to_code_file): - global curr_terminal - curr_terminal.add_str_to_terminal(CONSTANTS.CODE_START_MSG_CLUE) - utils.abs_path_to_user_file = abs_path_to_code_file - # Execute the user's code.py file - with open(abs_path_to_code_file, encoding="utf8") as user_code_file: - user_code = user_code_file.read() - try: - codeObj = compile(user_code, abs_path_to_code_file, CONSTANTS.EXEC_COMMAND) - exec(codeObj, {}) - sys.stdout.flush() - except Exception as e: - exc_type, exc_value, exc_traceback = sys.exc_info() - errorMessage = CONSTANTS.ERROR_TRACEBACK - stackTrace = traceback.format_exception(exc_type, exc_value, exc_traceback) - - for frameIndex in range(2, len(stackTrace) - 1): - errorMessage += "\t" + str(stackTrace[frameIndex]) - print(e, errorMessage, file=sys.stderr, flush=True) - - curr_terminal.add_str_to_terminal(errorMessage) - - curr_terminal.add_str_to_terminal(CONSTANTS.CODE_FINISHED_MSG_CLUE) - board.DISPLAY.show(None) - - -user_code = threading.Thread(args=(sys.argv[1],), target=execute_user_code) -telemetry_state = json.loads(sys.argv[2]) - -telemetry_py._Telemetry__enable_telemetry = telemetry_state.get( - CONSTANTS.ENABLE_TELEMETRY, True -) -threads.append(user_code) -user_code.start() - -for thread in threads: - thread.join() diff --git a/src/python_constants.py b/src/python_constants.py deleted file mode 100644 index f469ec149..000000000 --- a/src/python_constants.py +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -ACTIVE_DEVICE_FIELD = "active_device" - -ADAFRUIT_DRIVE_NAME = "CIRCUITPY" - -DEPEND_ERR = 'The required dependencies aren\'t downloaded. Please use CTRL+SHIFT+P to open the command palette and select "Device Simulator Express: Install Extension Dependencies".' - -DEVICE_NOT_IMPLEMENTED_ERROR = "Device not implemented." - -ENABLE_TELEMETRY = "enable_telemetry" - -EXEC_COMMAND = "exec" -ERROR_SENDING_EVENT = "Error trying to send event to the process : " -ERROR_TRACEBACK = "\n\tTraceback of code execution : \n" -ERROR_NO_FILE = "Error : No file was passed to the process to execute.\n" - -ADAFRUIT_LIBRARY_NAME = "adafruit_circuitplayground" -MICROPYTHON_LIBRARY_NAME = "micropython" - -LINUX_OS = "linux" - -MAC_OS = "darwin" -MOUNT_COMMAND = "mount" - -NO_ADAFRUIT_DEVICE_DETECTED_ERROR_TITLE = ( - "No Adafruit device (Circuit Playground Express or Clue) detected" -) -NO_ADAFRUIT_DEVICE_DETECTED_ERROR_DETAIL = ( - "Could not find drive with name 'CIRCUITPYTHON'. Detected OS: {}" -) -NO_MICROBIT_DETECTED_ERROR_TITLE = "No micro:bit detected" -NOT_SUPPORTED_OS = 'The OS "{}" not supported.' -NOT_IMPLEMENTED_ERROR = "This method is not implemented by the simulator" - -STATE_FIELD = "state" - -UTF_FORMAT = "utf-8" - -WINDOWS_OS = "win32" - -DEFAULT_PORT = "5577" - -CPX = "CPX" - -MICROBIT = "micro:bit" - -CLUE = "CLUE" -CLUE_DIR = "clue" - -CIRCUITPYTHON = "base_circuitpython" - -CODE_START_MSG_CLUE = "soft reboot\ncode.py output:" -CODE_FINISHED_MSG_CLUE = "\nCode done running. Waiting for reload." diff --git a/src/requirements.txt b/src/requirements.txt deleted file mode 100644 index c13eef60b..000000000 --- a/src/requirements.txt +++ /dev/null @@ -1,12 +0,0 @@ -playsound==1.2.2 -applicationinsights==0.11.9 -python-socketio==4.3.1 -requests==2.22.0 -pywin32==227; platform_system == "Windows" -PyObjC; platform_system == "darwin" -uflash==1.3.0 -adafruit-circuitpython-fancyled==1.3.3 -Pillow==8.1.1 -adafruit-circuitpython-bitmap_font==1.1.0 -adafruit-circuitpython-display-shapes==1.2.0 -adafruit-circuitpython-neopixel==5.0.0 \ No newline at end of file diff --git a/src/serialMonitor.ts b/src/serialMonitor.ts deleted file mode 100644 index f3685cd58..000000000 --- a/src/serialMonitor.ts +++ /dev/null @@ -1,310 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Credit: A majority of this code was taken from the Visual Studio Code Arduino extension with some modifications to suit our purposes. - -import * as vscode from "vscode"; -import CONSTANTS, { DialogResponses, STATUS_BAR_PRIORITY } from "./constants"; -import { DeviceContext } from "./deviceContext"; -import { outChannel } from "./extension"; -import { logToOutputChannel } from "./extension_utils/utils"; -import { SerialPortControl } from "./serialPortControl"; - -export interface ISerialPortDetail { - path: string; - manufacturer: string; - vendorId: string; - productId: string; -} - -export class SerialMonitor implements vscode.Disposable { - public static DEFAULT_BAUD_RATE: number = 115200; - - public static listBaudRates(): number[] { - return [ - 300, - 1200, - 2400, - 4800, - 9600, - 19200, - 38400, - 57600, - 74880, - 115200, - 230400, - 250000, - ]; - } - - public static getInstance(): SerialMonitor { - if (SerialMonitor._serialMonitor === null) { - SerialMonitor._serialMonitor = new SerialMonitor(); - } - return SerialMonitor._serialMonitor; - } - - private static _serialMonitor: SerialMonitor | null = null; - - private _currentPort!: string; - private _currentBaudRate!: number; - private _outputChannel!: vscode.OutputChannel; - private _serialPortControl: SerialPortControl | null = null; - private _baudRateStatusBar!: vscode.StatusBarItem; - private _openPortStatusBar!: vscode.StatusBarItem; - private _portsStatusBar!: vscode.StatusBarItem; - - private constructor() { - const deviceContext = DeviceContext.getInstance(); - deviceContext.onDidChange(() => { - if (deviceContext.port) { - if (!this.initialized) { - this.initialize(); - } - this.updatePortListStatus(null); - } - }); - } - - public initialize() { - const defaultBaudRate: number = SerialMonitor.DEFAULT_BAUD_RATE; - this._outputChannel = vscode.window.createOutputChannel( - CONSTANTS.MISC.SERIAL_MONITOR_NAME - ); - this._currentBaudRate = defaultBaudRate; - this._portsStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.PORT - ); - this._portsStatusBar.command = - "deviceSimulatorExpress.common.selectSerialPort"; - this._portsStatusBar.tooltip = "Select Serial Port"; - this._portsStatusBar.show(); - - this._openPortStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.OPEN_PORT - ); - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.openSerialMonitor"; - this._openPortStatusBar.text = `$(plug)`; - this._openPortStatusBar.tooltip = "Open Serial Monitor"; - this._openPortStatusBar.show(); - - this._baudRateStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.BAUD_RATE - ); - this._baudRateStatusBar.command = - "deviceSimulatorExpress.common.changeBaudRate"; - this._baudRateStatusBar.tooltip = "Baud Rate"; - this._baudRateStatusBar.text = defaultBaudRate.toString(); - this.updatePortListStatus(null); - } - - public async selectSerialPort(vid: string | null, pid: string | null) { - const lists = await SerialPortControl.list(); - if (!lists.length) { - vscode.window.showInformationMessage( - "No serial message is available." - ); - return; - } - - if (vid && pid) { - const valueOfVid = parseInt(vid, 16); - const valueOfPid = parseInt(pid, 16); - const foundPort = lists.find(port => { - if (port.productId && port.vendorId) { - return ( - parseInt(port.productId, 16) === valueOfPid && - parseInt(port.vendorId, 16) === valueOfVid - ); - } - return false; - }); - if ( - foundPort && - !(this._serialPortControl && this._serialPortControl.isActive) - ) { - this.updatePortListStatus(foundPort.path); - } - } else { - const chosen = await vscode.window.showQuickPick( - lists - .map( - (port: ISerialPortDetail): vscode.QuickPickItem => { - return { - description: port.manufacturer, - label: port.path, - }; - } - ) - .sort((a, b): number => { - return a.label === b.label - ? 0 - : a.label > b.label - ? 1 - : -1; - }) as vscode.QuickPickItem[], - { placeHolder: CONSTANTS.MISC.SELECT_PORT_PLACEHOLDER } - ); - - if (chosen && chosen.label) { - this.updatePortListStatus(chosen.label); - } - } - } - - public async openSerialMonitor() { - if (!this._currentPort) { - const ans = await vscode.window.showInformationMessage( - CONSTANTS.WARNING.NO_SERIAL_PORT_SELECTED, - DialogResponses.SELECT, - DialogResponses.CANCEL - ); - if (ans === DialogResponses.SELECT) { - await this.selectSerialPort(null, null); - } - if (!this._currentPort) { - return; - } - } - - if (this._serialPortControl) { - if (this._currentPort !== this._serialPortControl.currentPort) { - await this._serialPortControl.changePort(this._currentPort); - } else if (this._serialPortControl.isActive) { - vscode.window.showWarningMessage( - `Serial Monitor is already opened for ${this._currentPort}` - ); - return; - } - } else { - this._serialPortControl = new SerialPortControl( - this._currentPort, - this._currentBaudRate, - this._outputChannel - ); - } - - if (!this._serialPortControl.currentPort) { - console.error( - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT(this._currentPort) - ); - return; - } - - try { - await this._serialPortControl.open(); - this.updatePortStatus(true); - } catch (error) { - logToOutputChannel( - outChannel, - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT_DUE_TO( - this._currentPort, - error - ), - true - ); - } - } - - public get initialized(): boolean { - return !!this._outputChannel; - } - - public dispose() { - if (this._serialPortControl && this._serialPortControl.isActive) { - return this._serialPortControl.stop(); - } - } - - public async changeBaudRate() { - const baudRates = SerialMonitor.listBaudRates(); - const chosen = await vscode.window.showQuickPick( - baudRates.map(baudRate => baudRate.toString()) - ); - - if (!chosen) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.NO_RATE_SELECTED, - true - ); - return; - } - - if (!parseInt(chosen, 10)) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.INVALID_BAUD_RATE, - true - ); - return; - } - - if (!this._serialPortControl) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.SERIAL_MONITOR_NOT_STARTED, - true - ); - return; - } - - const selectedRate: number = parseInt(chosen, 10); - await this._serialPortControl.changeBaudRate(selectedRate); - this._currentBaudRate = selectedRate; - this._baudRateStatusBar.text = chosen; - } - - public async closeSerialMonitor(port: string, showWarning: boolean = true) { - if (this._serialPortControl) { - if (port && port !== this._serialPortControl.currentPort) { - // Port is not opened - return false; - } - const result = await this._serialPortControl.stop(); - this.updatePortStatus(false); - return result; - } else if (!port && showWarning) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.SERIAL_PORT_NOT_STARTED, - true - ); - return false; - } - } - - private updatePortStatus(isOpened: boolean) { - if (isOpened) { - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.closeSerialMonitor"; - this._openPortStatusBar.text = `$(x)`; - this._openPortStatusBar.tooltip = "Close Serial Monitor"; - this._baudRateStatusBar.show(); - } else { - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.openSerialMonitor"; - this._openPortStatusBar.text = `$(plug)`; - this._openPortStatusBar.tooltip = "Open Serial Monitor"; - this._baudRateStatusBar.hide(); - } - } - - private updatePortListStatus(port: string | null) { - const deviceContext = DeviceContext.getInstance(); - if (port) { - deviceContext.port = port; - } - this._currentPort = deviceContext.port; - - if (deviceContext.port) { - this._portsStatusBar.text = deviceContext.port; - } else { - this._portsStatusBar.text = " - {renderOptions(props.options)} - - ); -}; - -const renderOptions = (options: string[]) => { - return options.map((name, index) => { - return ( - - ); - }); -}; diff --git a/src/view/components/clue/Clue.spec.tsx b/src/view/components/clue/Clue.spec.tsx deleted file mode 100644 index c69b4ebe7..000000000 --- a/src/view/components/clue/Clue.spec.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { Clue } from "./Clue"; - -describe("Clue component", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); diff --git a/src/view/components/clue/Clue.tsx b/src/view/components/clue/Clue.tsx deleted file mode 100644 index 546f136ee..000000000 --- a/src/view/components/clue/Clue.tsx +++ /dev/null @@ -1,158 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { - GESTURES_CLUE, - SENSOR_LIST, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, -} from "../../constants"; -import "../../styles/Simulator.css"; -import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; -import { sendMessage } from "../../utils/MessageUtils"; -import { CLUE_TOOLBAR_ICON_ID } from "../toolbar/SensorModalUtils"; -import ToolBar from "../toolbar/ToolBar"; -import { ClueSimulator } from "./ClueSimulator"; - -// Component grouping the functionality for micro:bit functionalities -interface IState { - sensors: { [key: string]: number }; - currentSelectedGesture: string; -} -const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT_R]: 0, - [SENSOR_LIST.LIGHT_G]: 0, - [SENSOR_LIST.LIGHT_B]: 0, - [SENSOR_LIST.LIGHT_C]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - [SENSOR_LIST.HUMIDITY]: 0, - [SENSOR_LIST.PRESSURE]: 1013, - [SENSOR_LIST.PROXIMITY]: 0, - [SENSOR_LIST.GYRO_X]: 0, - [SENSOR_LIST.GYRO_Y]: 0, - [SENSOR_LIST.GYRO_Z]: 0, - [SENSOR_LIST.MAGNET_X]: 0, - [SENSOR_LIST.MAGNET_Y]: 0, - [SENSOR_LIST.MAGNET_Z]: 0, - }, - currentSelectedGesture: GESTURES_CLUE[0], -}; - -export class Clue extends React.Component<{}, IState> { - state = DEFAULT_STATE; - - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; - - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; - updateGesture = (event: React.ChangeEvent) => { - this.setState({ currentSelectedGesture: event.target.value }); - }; - sendGesture = (isActive: boolean) => { - if (this.state.currentSelectedGesture) { - if (isActive) { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: this.state.currentSelectedGesture, - }); - } else { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: "", - }); - } - } - }; -} - -const CLUE_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - label: CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.LEDS, - image: TOOLBAR_SVG.NEO_PIXEL_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.TEMPERATURE, - image: TOOLBAR_SVG.TEMPERATURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.LIGHT, - image: TOOLBAR_SVG.LIGHT_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, - image: TOOLBAR_SVG.MOTION_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.HUMIDITY, - image: TOOLBAR_SVG.HUMIDITY_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.PRESSURE, - image: TOOLBAR_SVG.PRESSURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.PROXIMITY, - image: TOOLBAR_SVG.PROXIMITY_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GESTURE, - image: TOOLBAR_SVG.GESTURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GYROSCOPE, - image: TOOLBAR_SVG.GYROSCOPE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, - image: TOOLBAR_SVG.MAGNET_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GPIO, - image: TOOLBAR_SVG.GPIO_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.SOUND, - image: TOOLBAR_SVG.SOUND_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.SPEAKER, - image: TOOLBAR_SVG.SPEAKER_SVG, - }, -]; diff --git a/src/view/components/clue/ClueImage.tsx b/src/view/components/clue/ClueImage.tsx deleted file mode 100644 index 85694d4e0..000000000 --- a/src/view/components/clue/ClueImage.tsx +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { BUTTON_CLASSNAME, VIEW_STATE } from "../../constants"; -import CONSTANTS, { BUTTON_STYLING_CLASSES } from "../../constants"; -import { ViewStateContext } from "../../context"; -import { ClueSvg, IRefObject } from "./Clue_svg"; - -interface EventTriggers { - onMouseUp: (event: Event, buttonKey: string) => void; - onMouseDown: (event: Event, buttonKey: string) => void; - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; -} -interface IProps { - eventTriggers: EventTriggers; - displayMessage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; -} - -export enum BUTTONS_KEYS { - BTN_A = "BTN_A", - BTN_B = "BTN_B", - BTN_AB = "BTN_AB", -} -// Displays the SVG and call necessary svg modification. -export class ClueImage extends React.Component { - private svgRef: React.RefObject = React.createRef(); - constructor(props: IProps) { - super(props); - } - componentDidMount() { - const svgElement = this.svgRef.current; - if (svgElement) { - setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); - this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); - } - } - componentDidUpdate() { - if (this.context === VIEW_STATE.PAUSE && this.svgRef.current) { - disableAllButtons(this.svgRef.current.getButtons()); - } else if (this.context === VIEW_STATE.RUNNING && this.svgRef.current) { - setupAllButtons( - this.props.eventTriggers, - this.svgRef.current.getButtons() - ); - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.eventTriggers.onKeyEvent(event, true, event.key); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.eventTriggers.onKeyEvent(event, false, event.key); - }; - render() { - return ( - - ); - } - public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { - const button = this.svgRef.current?.getButtons()[key].current; - if (button) { - button.focus(); - if (isActive) { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.KEYPRESSED - ); - } else { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.DEFAULT - ); - } - button.setAttribute("pressed", `${isActive}`); - button.setAttribute("aria-pressed", `${isActive}`); - } - } -} - -ClueImage.contextType = ViewStateContext; -const setupButton = ( - buttonElement: SVGRectElement, - eventTriggers: EventTriggers, - key: string -) => { - buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); - buttonElement.onmousedown = e => { - buttonElement.focus(); - eventTriggers.onMouseDown(e, key); - }; - buttonElement.onmouseup = e => { - eventTriggers.onMouseUp(e, key); - }; - - buttonElement.onkeydown = e => { - // ensure that the keydown is enter, - // or else it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - eventTriggers.onKeyEvent(e, true, key); - } - }; - buttonElement.onkeyup = e => { - eventTriggers.onKeyEvent(e, false, key); - }; -}; -const setupAllButtons = ( - eventTriggers: EventTriggers, - buttonRefs: IRefObject -) => { - for (const [key, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - setupButton(ref.current, eventTriggers, key); - } - } -}; -const disableAllButtons = (buttonRefs: IRefObject) => { - for (const [, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - // to implement - ref.current.onmousedown = null; - ref.current.onmouseup = null; - ref.current.onkeydown = null; - ref.current.onkeyup = null; - ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); - } - } -}; diff --git a/src/view/components/clue/ClueSimulator.tsx b/src/view/components/clue/ClueSimulator.tsx deleted file mode 100644 index a15f101f8..000000000 --- a/src/view/components/clue/ClueSimulator.tsx +++ /dev/null @@ -1,304 +0,0 @@ -import * as React from "react"; -import { - AB_BUTTONS_KEYS, - CONSTANTS, - DEFAULT_IMG_CLUE, - DEVICE_LIST_KEY, - VIEW_STATE, - WEBVIEW_MESSAGES, -} from "../../constants"; -import { ViewStateContext } from "../../context"; -import "../../styles/Simulator.css"; -import "../../styles/Simulator.css"; -import PlayLogo from "../../svgs/play_svg"; -import StopLogo from "../../svgs/stop_svg"; -import { sendMessage } from "../../utils/MessageUtils"; -import ActionBar from "../simulator/ActionBar"; -import { BUTTONS_KEYS, ClueImage } from "./ClueImage"; - -export const DEFAULT_CLUE_STATE: IClueState = { - buttons: { button_a: false, button_b: false }, - displayMessage: DEFAULT_IMG_CLUE, - leds: { - neopixel: [0, 0, 0], - isRedLedOn: false, - isWhiteLedOn: false, - }, -}; - -interface IState { - active_editors: string[]; - running_file?: string; - play_button: boolean; - selected_file: string; - clue: IClueState; - currently_selected_file: string; -} - -interface IClueState { - buttons: { button_a: boolean; button_b: boolean }; - displayMessage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; -} -export class ClueSimulator extends React.Component { - private imageRef: React.RefObject = React.createRef(); - constructor() { - super({}); - this.state = { - clue: DEFAULT_CLUE_STATE, - play_button: false, - selected_file: "", - active_editors: [], - running_file: undefined, - currently_selected_file: "", - }; - this.onKeyEvent = this.onKeyEvent.bind(this); - } - handleMessage = (event: any): void => { - const message = event.data; - if (message.active_device !== DEVICE_LIST_KEY.CLUE) { - return; - } - switch (message.command) { - case "reset-state": - this.setState({ - clue: DEFAULT_CLUE_STATE, - play_button: false, - }); - break; - case "set-state": - this.handleStateChangeMessage(message); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - clue: { - ...this.state.clue, - displayMessage: DEFAULT_IMG_CLUE, - }, - }); - break; - case "visible-editors": - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } - - break; - } - }; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } - - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
- -
- -
- -
- ); - } - protected togglePlayClick = () => { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - }; - protected onSelectFile(event: React.FocusEvent) { - this.setState({ - selected_file: event.currentTarget.value, - }); - } - protected refreshSimulatorClick = () => { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - }; - protected handleButtonClick = (key: string, isActive: boolean) => { - let newButtonState = this.state.clue.buttons; - switch (key) { - case AB_BUTTONS_KEYS.BTN_A: - newButtonState.button_a = isActive; - break; - case AB_BUTTONS_KEYS.BTN_B: - newButtonState.button_b = isActive; - break; - case AB_BUTTONS_KEYS.BTN_AB: - newButtonState = { - button_a: isActive, - button_b: isActive, - }; - break; - } - sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); - this.setState({ - clue: { - ...this.state.clue, - buttons: newButtonState, - }, - }); - }; - - protected onMouseUp = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, false); - }; - - protected onMouseDown = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, true); - }; - - protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { - event.stopPropagation(); - if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(key, active); - if (key === BUTTONS_KEYS.BTN_A) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if (key === BUTTONS_KEYS.BTN_B) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if (key === BUTTONS_KEYS.BTN_AB) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } - } - protected handleStateChangeMessage(message: any) { - if (message.state.display_base64 != null) { - this.setState({ - clue: { - ...this.state.clue, - displayMessage: message.state.display_base64, - }, - }); - } else if (message.state.pixels != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - neopixel: message.state.pixels, - }, - }, - }); - } else if (message.state.white_leds != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - isWhiteLedOn: message.state.white_leds, - }, - }, - }); - } else if (message.state.red_led != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - isRedLedOn: message.state.red_led, - }, - }, - }); - } - } -} -ClueSimulator.contextType = ViewStateContext; diff --git a/src/view/components/clue/Clue_svg.tsx b/src/view/components/clue/Clue_svg.tsx deleted file mode 100644 index bcbf4e6d2..000000000 --- a/src/view/components/clue/Clue_svg.tsx +++ /dev/null @@ -1,1184 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { CLUE_LEDS_COLORS, CONSTANTS } from "../../constants"; -import "../../styles/SimulatorSvg.css"; -import svg from "../cpx/Svg_utils"; -import { DEFAULT_CLUE_STATE } from "./ClueSimulator"; -export interface IRefObject { - [key: string]: React.RefObject; -} -interface IProps { - displayImage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; -} -export class ClueSvg extends React.Component { - private svgRef: React.RefObject = React.createRef(); - private ledsRefs = { - neopixel: React.createRef(), - redLed: React.createRef(), - whiteLeds: [ - React.createRef(), - React.createRef(), - ], - }; - private gradientRefs = { - neopixel: React.createRef(), - whiteLed: React.createRef(), - redLed: React.createRef(), - }; - - private buttonRefs: IRefObject = { - BTN_A: React.createRef(), - BTN_B: React.createRef(), - BTN_AB: React.createRef(), - }; - - private displayRef: React.RefObject = React.createRef(); - - public getSvgRef(): React.RefObject { - return this.svgRef; - } - public getButtons(): IRefObject { - return this.buttonRefs; - } - public getDisplayRef(): React.RefObject { - return this.displayRef; - } - componentDidMount() { - this.updateSvg(); - } - componentDidUpdate() { - this.updateSvg(); - } - - render() { - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - - LIGHT - - - GESTURE - - - P - - R - - - O - - - XIMI - - - T - - - Y - - - - - - - - - - - - - - Red LED - - - - - Neopixel - - - - -
- ); - } - private updateSvg() { - this.updateDisplay(); - this.updateNeopixel(); - this.updateLeds(); - } - - private updateDisplay() { - if (this.props.displayImage) { - this.displayRef.current?.setAttribute( - "href", - `data:image/png;base64,${this.props.displayImage}` - ); - } - } - - private updateNeopixel() { - const { neopixel } = this.props.leds; - const rgbColor = `rgb(${neopixel[0] + - (255 - neopixel[0]) * CONSTANTS.LED_TINT_FACTOR}, - ${neopixel[1] + - (255 - neopixel[1]) * CONSTANTS.LED_TINT_FACTOR},${neopixel[2] + - (255 - neopixel[2]) * CONSTANTS.LED_TINT_FACTOR})`; - - this.ledsRefs.neopixel.current?.setAttribute("fill", rgbColor); - - if (neopixel === DEFAULT_CLUE_STATE.leds.neopixel) { - this.gradientRefs.neopixel.current?.setAttribute( - "stop-opacity", - "0" - ); - } else { - this.gradientRefs.neopixel.current?.setAttribute( - "stop-opacity", - "1" - ); - } - this.gradientRefs.neopixel.current?.setAttribute( - "stop-color", - rgbColor - ); - } - private updateLeds() { - // update white led - const { isWhiteLedOn, isRedLedOn } = this.props.leds; - - this.ledsRefs.whiteLeds.map( - (ledRef: React.RefObject) => { - svg.setLed( - isWhiteLedOn, - CLUE_LEDS_COLORS.WHITE_LEDS_OFF, - CLUE_LEDS_COLORS.WHITE_LEDS_ON, - ledRef.current, - this.gradientRefs.whiteLed.current - ); - } - ); - svg.setLed( - isRedLedOn, - CLUE_LEDS_COLORS.RED_LED_OFF, - CLUE_LEDS_COLORS.RED_LED_ON, - this.ledsRefs.redLed.current, - this.gradientRefs.redLed.current - ); - } -} diff --git a/src/view/components/clue/__snapshots__/Clue.spec.tsx.snap b/src/view/components/clue/__snapshots__/Clue.spec.tsx.snap deleted file mode 100644 index dce8f43ff..000000000 --- a/src/view/components/clue/__snapshots__/Clue.spec.tsx.snap +++ /dev/null @@ -1,2202 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Clue component should render correctly 1`] = ` -Array [ -
-
- The simulator will run the .py file you have focused on. -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - LIGHT - - - GESTURE - - - P - - R - - - O - - - XIMI - - - T - - - Y - - - - - - - - - - - - - - Red LED - - - - - Neopixel - - - - -
-
-
- - -
-
, -
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
, -] -`; diff --git a/src/view/components/cpx/Accessibility_utils.ts b/src/view/components/cpx/Accessibility_utils.ts deleted file mode 100644 index afdadb2ac..000000000 --- a/src/view/components/cpx/Accessibility_utils.ts +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Helpers designed to help to make a simulator accessible. -namespace accessibility { - export function makeFocusable(elem: SVGElement): void { - elem.setAttribute("focusable", "true"); - elem.setAttribute("tabindex", "0"); - } - - export function setAria( - elem: Element, - role?: string, - label?: string - ): void { - if (role && !elem.hasAttribute("role")) { - elem.setAttribute("role", role); - } - - if (label && !elem.hasAttribute("aria-label")) { - elem.setAttribute("aria-label", label); - } - } -} - -export default accessibility; diff --git a/src/view/components/cpx/Cpx.spec.tsx b/src/view/components/cpx/Cpx.spec.tsx deleted file mode 100644 index 24c53d551..000000000 --- a/src/view/components/cpx/Cpx.spec.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { Cpx } from "./Cpx"; - -describe("CPX component", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); diff --git a/src/view/components/cpx/Cpx.tsx b/src/view/components/cpx/Cpx.tsx deleted file mode 100644 index d91728fba..000000000 --- a/src/view/components/cpx/Cpx.tsx +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { CPX_TOOLBAR_ICON_ID } from "../../components/toolbar/SensorModalUtils"; -import ToolBar from "../../components/toolbar/ToolBar"; -import { SENSOR_LIST, VSCODE_MESSAGES_TO_WEBVIEW } from "../../constants"; -import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; -import Simulator from "./CpxSimulator"; - -// Component grouping the functionality for circuit playground express -const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - }, -}; - -export class Cpx extends React.Component { - state = DEFAULT_STATE; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; - - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; -} - -const CPX_TOOLBAR_BUTTONS: Array<{ label: any; image: any }> = [ - { - image: TOOLBAR_SVG.SLIDER_SWITCH_SVG, - label: CPX_TOOLBAR_ICON_ID.SWITCH, - }, - { - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - label: CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, - }, - { - image: TOOLBAR_SVG.RED_LED_SVG, - label: CPX_TOOLBAR_ICON_ID.RED_LED, - }, - { - image: TOOLBAR_SVG.SOUND_SVG, - label: CPX_TOOLBAR_ICON_ID.SOUND, - }, - { - image: TOOLBAR_SVG.TEMPERATURE_SVG, - label: CPX_TOOLBAR_ICON_ID.TEMPERATURE, - }, - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: CPX_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.NEO_PIXEL_SVG, - label: CPX_TOOLBAR_ICON_ID.NEO_PIXEL, - }, - { - image: TOOLBAR_SVG.SPEAKER_SVG, - label: CPX_TOOLBAR_ICON_ID.SPEAKER, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: CPX_TOOLBAR_ICON_ID.MOTION, - }, - { - image: TOOLBAR_SVG.IR_SVG, - label: CPX_TOOLBAR_ICON_ID.IR, - }, - { - image: TOOLBAR_SVG.GPIO_SVG, - label: CPX_TOOLBAR_ICON_ID.GPIO, - }, -]; diff --git a/src/view/components/cpx/CpxImage.tsx b/src/view/components/cpx/CpxImage.tsx deleted file mode 100644 index 48aef4e64..000000000 --- a/src/view/components/cpx/CpxImage.tsx +++ /dev/null @@ -1,406 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import CONSTANTS from "../../constants"; -import accessibility from "./Accessibility_utils"; -import CPX_SVG from "./Cpx_svg"; -import * as SvgStyle from "./Cpx_svg_style"; -import svg from "./Svg_utils"; - -interface IProps { - pixels: number[][]; - red_led: boolean; - brightness: number; - switch: boolean; - on: boolean; - onKeyEvent: (event: KeyboardEvent, active: boolean) => void; - onMouseUp: (button: HTMLElement, event: Event) => void; - onMouseDown: (button: HTMLElement, event: Event) => void; - onMouseLeave: (button: HTMLElement, event: Event) => void; -} - -export class CpxImage extends React.Component { - componentDidMount() { - const svgElement = window.document.getElementById("cpx_svg"); - if (svgElement) { - initSvgStyle(svgElement, this.props.brightness); - setupButtons(this.props); - setupPins(this.props); - this.setupKeyPresses(this.props.onKeyEvent); - setupSwitch(this.props); - this.updateImage(); - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - componentDidUpdate() { - this.updateImage(); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the switch, run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.S) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.onKeyEvent(event, true); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.onKeyEvent(event, false); - }; - render() { - return CPX_SVG; - } - private updateImage() { - updateNeopixels(this.props); - updateRedLED(this.props.red_led); - updatePowerLED(this.props.on); - updateSwitch(this.props.switch); - } -} - -const makeButton = ( - g: SVGElement, - left: number, - top: number, - id: string -): { outer: SVGElement; inner: SVGElement } => { - const buttonCornerRadius = SvgStyle.BUTTON_CORNER_RADIUS; - const buttonWidth = SvgStyle.BUTTON_WIDTH; - const buttonCircleRadius = SvgStyle.BUTTON_CIRCLE_RADIUS; - const btng = svg.child(g, "g", { class: "sim-button-group" }); - svg.child(btng, "rect", { - fill: SvgStyle.BUTTON_OUTER, - height: buttonWidth, - id: id + "_OUTER", - rx: buttonCornerRadius, - ry: buttonCornerRadius, - width: buttonWidth, - x: left, - y: top, - }); - - const outer = btng; - const inner = svg.child(btng, "circle", { - id: id + "_INNER", - cx: left + buttonWidth / 2, - cy: top + buttonWidth / 2, - r: buttonCircleRadius, - fill: SvgStyle.BUTTON_NEUTRAL, - }); - - return { outer, inner }; -}; - -const initSvgStyle = (svgElement: HTMLElement, brightness: number): void => { - const style: SVGStyleElement = svg.child( - svgElement, - "style", - {} - ) as SVGStyleElement; - style.textContent = SvgStyle.SVG_STYLE; - - // Filters for the glow effect (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) - const defs: SVGDefsElement = svg.child( - svgElement, - "defs", - {} - ) as SVGDefsElement; - - const g = svg.createElement("g") as SVGElement; - svgElement.appendChild(g); - - const glow = svg.child(defs, "filter", { - height: "120%", - id: "filterglow", - width: "120%", - x: "-5%", - y: "-5%", - }); - svg.child(glow, "feGaussianBlur", { stdDeviation: "5", result: "glow" }); - const merge = svg.child(glow, "feMerge", {}); - for (let i = 0; i < 3; ++i) { - svg.child(merge, "feMergeNode", { in: "glow" }); - } - - const neopixelglow = svg.child(defs, "filter", { - height: "600%", - id: "neopixelglow", - width: "600%", - x: "-300%", - y: "-300%", - }); - svg.child(neopixelglow, "feGaussianBlur", { - result: "coloredBlur", - stdDeviation: "4.3", - }); - const neopixelmerge = svg.child(neopixelglow, "feMerge", {}); - svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); - svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); - svg.child(neopixelmerge, "feMergeNode", { in: "SourceGraphic" }); - - // Brightness - const neopixelfeComponentTransfer = svg.child( - neopixelglow, - "feComponentTransfer", - {} - ); - svg.child(neopixelfeComponentTransfer, "feFuncR", { - id: "brightnessFilterR", - type: "linear", - slope: brightness, - }); - svg.child(neopixelfeComponentTransfer, "feFuncG", { - id: "brightnessFilterG", - slope: brightness, - type: "linear", - }); - svg.child(neopixelfeComponentTransfer, "feFuncB", { - id: "brightnessFilterB", - slope: brightness, - type: "linear", - }); - - // BTN A+B - const outerBtn = (left: number, top: number, label: string) => { - return makeButton(g, left, top, "BTN_AB"); - }; - - const ab = outerBtn(165, SvgStyle.MB_HEIGHT - 15, "A+B"); - const abtext = svg.child(ab.outer, "text", { - class: "sim-text-outside", - x: SvgStyle.BUTTON_TEXT_BASELINE, - y: SvgStyle.MB_HEIGHT - 18, - }) as SVGTextElement; - abtext.textContent = "A+B"; -}; - -const updateNeopixels = (props: IProps): void => { - for (let i = 0; i < props.pixels.length; i++) { - const led = window.document.getElementById(`NEOPIXEL_${i}`); - if (led) { - setNeopixel(led, props.pixels[i], props.brightness); - } - } -}; - -const updateRedLED = (propsRedLED: boolean): void => { - const redLED = window.document.getElementById("SERIAL_LED"); - if (redLED) { - redLED.style.fill = propsRedLED - ? SvgStyle.RED_LED_ON - : SvgStyle.RED_LED_OFF; - } -}; - -const updatePowerLED = (propsPowerLED: boolean): void => { - const powerLED = window.document.getElementById("PWR_LED"); - if (powerLED) { - powerLED.style.fill = propsPowerLED - ? SvgStyle.POWER_LED_ON - : SvgStyle.POWER_LED_OFF; - } -}; - -const setNeopixel = ( - led: HTMLElement, - pixValue: number[], - brightness: number -): void => { - if (isLightOn(pixValue) && brightness > 0) { - // Neopixels style (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) - changeBrightness("brightnessFilterR", brightness); - changeBrightness("brightnessFilterG", brightness); - changeBrightness("brightnessFilterB", brightness); - - let [hue, sat, lum] = SvgStyle.rgbToHsl([ - pixValue[0], - pixValue[1], - pixValue[2], - ]); - const innerLum = Math.max( - lum * SvgStyle.INTENSITY_FACTOR, - SvgStyle.MIN_INNER_LUM - ); - lum = (lum * 90) / 100 + 10; // at least 10% luminosity for the stroke - - led.style.filter = `url(#neopixelglow)`; - led.style.fill = `hsl(${hue}, ${sat}%, ${innerLum}%)`; - led.style.stroke = `hsl(${hue}, ${sat}%, ${Math.min( - lum * 3, - SvgStyle.MAX_STROKE_LUM - )}%)`; - led.style.strokeWidth = `1.5`; - } else { - led.style.fill = SvgStyle.OFF_COLOR; - led.style.filter = `none`; - led.style.stroke = `none`; - } -}; - -const isLightOn = (pixValue: number[]): boolean => { - return !pixValue.every(val => { - return val === 0; - }); -}; - -const changeBrightness = (filterID: string, brightness: number): void => { - const brightnessFilter: HTMLElement | null = window.document.getElementById( - filterID - ); - if (brightnessFilter) { - brightnessFilter.setAttribute("slope", brightness.toString()); - } -}; - -const setupButtons = (props: IProps): void => { - const outButtons = ["A_OUTER", "B_OUTER", "AB_OUTER"]; - const inButtons = ["A_INNER", "B_INNER", "AB_INNER"]; - outButtons.forEach(buttonName => { - const button = window.document.getElementById("BTN_" + buttonName); - - if (button) { - setupButton(button, "sim-button-outer", props); - } - }); - inButtons.forEach(buttonName => { - const button = window.document.getElementById("BTN_" + buttonName); - if (button) { - setupButton(button, "sim-button", props); - } - }); -}; - -const setupPins = (props: IProps): void => { - const pins = [ - "PIN_A1", - "PIN_A2", - "PIN_A3", - "PIN_A4", - "PIN_A5", - "PIN_A6", - "PIN_A7", - ]; - pins.forEach(pinName => { - const pin = window.document.getElementById(pinName); - - if (pin) { - const svgPin = (pin as unknown) as SVGElement; - svg.addClass(svgPin, `sim-${pinName}-touch`); - accessibility.makeFocusable(svgPin); - svgPin.onmouseup = e => props.onMouseUp(pin, e); - svgPin.onkeyup = e => props.onKeyEvent(e, false); - svgPin.onmousedown = e => props.onMouseDown(pin, e); - svgPin.onkeydown = e => props.onKeyEvent(e, true); - accessibility.setAria( - svgPin, - "button", - `Touch pin ${pinName.substr(pinName.length - 2)}` - ); - } - }); -}; - -const addButtonLabels = (button: HTMLElement) => { - let label = ""; - if (button.id.match(/AB/) !== null) { - label = "a+b"; - } else if (button.id.match(/A/) !== null) { - label = "a"; - } else if (button.id.match(/B/) !== null) { - label = "b"; - } - accessibility.setAria(button, "button", label); -}; - -const setupButton = (button: HTMLElement, className: string, props: IProps) => { - const svgButton = (button as unknown) as SVGElement; - svg.addClass(svgButton, className); - addButtonLabels(button); - if (className.match(/outer/) !== null) { - accessibility.makeFocusable(svgButton); - } - svgButton.onmousedown = e => props.onMouseDown(button, e); - svgButton.onmouseup = e => props.onMouseUp(button, e); - svgButton.onkeydown = e => { - // ensure that the keydown is enter. - // Or else, if the key is a shortcut instead, - // it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - props.onKeyEvent(e, true); - } - }; - svgButton.onkeyup = e => props.onKeyEvent(e, false); - svgButton.onmouseleave = e => props.onMouseLeave(button, e); -}; - -const setupSwitch = (props: IProps): void => { - const switchElement = window.document.getElementById("SWITCH"); - const swInnerElement = window.document.getElementById("SWITCH_INNER"); - const swHousingElement = window.document.getElementById("SWITCH_HOUSING"); - - if (switchElement && swInnerElement && swHousingElement) { - const svgSwitch: SVGElement = (switchElement as unknown) as SVGElement; - const svgSwitchInner: SVGElement = (swInnerElement as unknown) as SVGElement; - const svgSwitchHousing: SVGElement = (swHousingElement as unknown) as SVGElement; - - svg.addClass(svgSwitch, "sim-slide-switch"); - - svgSwitch.onmouseup = e => props.onMouseUp(switchElement, e); - svgSwitchInner.onmouseup = e => props.onMouseUp(swInnerElement, e); - svgSwitchHousing.onmouseup = e => props.onMouseUp(swHousingElement, e); - svgSwitch.onkeyup = e => props.onKeyEvent(e, false); - - accessibility.makeFocusable(svgSwitch); - accessibility.setAria(svgSwitch, "button", "On/Off Switch"); - } -}; - -export const updateSwitch = (switchState: boolean): void => { - const switchElement = window.document.getElementById("SWITCH"); - const switchInner = (window.document.getElementById( - "SWITCH_INNER" - ) as unknown) as SVGElement; - - if (switchElement && switchInner) { - svg.addClass(switchInner, "sim-slide-switch-inner"); - - if (!switchState) { - svg.addClass(switchInner, "on"); - switchInner.setAttribute("transform", "translate(-5,0)"); - } else { - svg.removeClass(switchInner, "on"); - switchInner.removeAttribute("transform"); - } - switchElement.setAttribute("aria-pressed", switchState.toString()); - } -}; -export const updatePinTouch = (pinState: boolean, id: string): void => { - console.log(`updating ${id} with ${pinState}`); - const pinElement = window.document.getElementById(id); - const pinSvg: SVGElement = (pinElement as unknown) as SVGElement; - - if (pinElement && pinSvg) { - pinElement.setAttribute("aria-pressed", pinState.toString()); - pinState - ? svg.addClass(pinSvg, "pin-pressed") - : svg.removeClass(pinSvg, "pin-pressed"); - } -}; - -export default CpxImage; diff --git a/src/view/components/cpx/CpxSimulator.tsx b/src/view/components/cpx/CpxSimulator.tsx deleted file mode 100644 index b0d77f441..000000000 --- a/src/view/components/cpx/CpxSimulator.tsx +++ /dev/null @@ -1,392 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { CONSTANTS, DEVICE_LIST_KEY, WEBVIEW_MESSAGES } from "../../constants"; -import { sendMessage } from "../../utils/MessageUtils"; - -import "../../styles/Simulator.css"; -import PlayLogo from "../../svgs/play_svg"; -import StopLogo from "../../svgs/stop_svg"; -import ActionBar from "../simulator/ActionBar"; -import { BUTTON_NEUTRAL, BUTTON_PRESSED } from "./Cpx_svg_style"; -import { CpxImage, updatePinTouch, updateSwitch } from "./CpxImage"; - -interface ICpxState { - pixels: number[][]; - brightness: number; - red_led: boolean; - button_a: boolean; - button_b: boolean; - switch: boolean; - touch: boolean[]; - shake: boolean; -} - -interface IState { - active_editors: string[]; - running_file: string; - selected_file: string; - cpx: ICpxState; - play_button: boolean; - currently_selected_file: string; -} - -const DEFAULT_CPX_STATE: ICpxState = { - brightness: 1.0, - button_a: false, - button_b: false, - pixels: [ - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - ], - red_led: false, - switch: false, - touch: [false, false, false, false, false, false, false], - shake: false, -}; - -class Simulator extends React.Component<{}, IState> { - constructor(props: Readonly<{}>) { - super(props); - this.state = { - active_editors: [], - cpx: DEFAULT_CPX_STATE, - play_button: false, - running_file: "", - selected_file: "", - currently_selected_file: "", - }; - - this.handleClick = this.handleClick.bind(this); - this.onKeyEvent = this.onKeyEvent.bind(this); - this.onMouseDown = this.onMouseDown.bind(this); - this.onMouseUp = this.onMouseUp.bind(this); - this.onMouseLeave = this.onMouseLeave.bind(this); - this.togglePlayClick = this.togglePlayClick.bind(this); - this.refreshSimulatorClick = this.refreshSimulatorClick.bind(this); - } - - handleMessage = (event: any): void => { - const message = event.data; // The JSON data our extension sent - if (message.active_device !== DEVICE_LIST_KEY.CPX) { - return; - } - switch (message.command) { - case "reset-state": - console.log("Clearing the state"); - this.setState({ - cpx: DEFAULT_CPX_STATE, - play_button: false, - }); - break; - case "set-state": - console.log( - "Setting the state: " + JSON.stringify(message.state) - ); - this.setState({ - cpx: message.state, - play_button: true, - }); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - }); - break; - case "visible-editors": - console.log( - "Setting active editors", - message.state.activePythonEditors - ); - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - console.log("Setting current file", message.state.running_file); - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } - break; - } - }; - - componentDidMount() { - console.log("Mounted"); - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
-
- -
- -
- ); - } - - protected togglePlayClick() { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - } - - protected refreshSimulatorClick() { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - } - - protected onKeyEvent(event: KeyboardEvent, active: boolean) { - let element; - const target = event.target as SVGElement; - // Guard Clause - if (target === undefined) { - return; - } - - if ([event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER)) { - element = window.document.getElementById(target.id); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_A - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_B - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_AB - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.S) - ) { - element = window.document.getElementById(CONSTANTS.ID_NAME.SWITCH); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } else { - if (event.shiftKey) { - switch (event.code) { - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_ONE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A1 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_TWO: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A2 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_THREE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A3 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FOUR: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A4 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FIVE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A5 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SIX: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A6 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SEVEN: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A7 - ); - break; - } - } - } - if (element) { - event.preventDefault(); - this.handleClick(element, active); - element.focus(); - } - } - protected onMouseDown(button: HTMLElement, event: Event) { - event.preventDefault(); - this.handleClick(button, true); - button.focus(); - } - - protected onMouseUp(button: HTMLElement, event: Event) { - event.preventDefault(); - this.handleClick(button, false); - } - - protected onMouseLeave(button: HTMLElement, event: Event) { - event.preventDefault(); - - if (button.getAttribute("pressed") === "true") { - this.handleClick(button, false); - } - } - - private handleClick(element: HTMLElement, active: boolean) { - let newState; - let message; - if (element.id.includes("BTN")) { - newState = this.handleButtonClick(element, active); - message = "button-press"; - } else if (element.id.includes("SWITCH")) { - newState = this.handleSwitchClick(); - message = "button-press"; - } else if (element.id.includes("PIN")) { - newState = this.handleTouchPinClick(element, active); - message = "sensor-changed"; - } else { - return; - } - - if (newState && message) { - sendMessage(message, newState); - } - } - - private handleButtonClick(button: HTMLElement, active: boolean) { - const ButtonA: boolean = button.id.match(/BTN_A/) !== null; - const ButtonB: boolean = button.id.match(/BTN_B/) !== null; - const ButtonAB: boolean = button.id.match(/BTN_AB/) !== null; - let innerButton; - let newState; - - if (ButtonAB) { - innerButton = window.document.getElementById("BTN_AB_INNER"); - newState = { - button_a: active, - button_b: active, - }; - this.setState({ ...this.state, ...newState }); - } else if (ButtonA) { - innerButton = window.document.getElementById("BTN_A_INNER"); - newState = { - button_a: active, - }; - this.setState({ ...this.state, ...newState }); - } else if (ButtonB) { - innerButton = window.document.getElementById("BTN_B_INNER"); - newState = { - button_b: active, - }; - this.setState({ ...this.state, ...newState }); - } - - if (innerButton) { - innerButton.style.fill = this.getButtonColor(active); - } - - button.setAttribute("pressed", `${active}`); - return newState; - } - - private getButtonColor(pressed: boolean) { - const buttonUps = BUTTON_NEUTRAL; - const buttonDown = BUTTON_PRESSED; - return pressed ? buttonDown : buttonUps; - } - - private handleSwitchClick() { - const switchIsOn = !this.state.cpx.switch; - updateSwitch(switchIsOn); - this.setState({ - ...this.state, - cpx: { ...this.state.cpx, switch: switchIsOn }, - }); - return { switch: switchIsOn }; - } - - private handleTouchPinClick(pin: HTMLElement, active: boolean): any { - let cpxState = this.state.cpx; - const pinIndex = parseInt(pin.id.charAt(pin.id.length - 1)) - 1; - const pinState = cpxState.touch; - pinState[pinIndex] = active; - cpxState = { ...cpxState, touch: pinState }; - this.setState({ ...this.state, ...cpxState }); - updatePinTouch(active, pin.id); - return { touch: pinState }; - } -} - -export default Simulator; diff --git a/src/view/components/cpx/Cpx_svg.tsx b/src/view/components/cpx/Cpx_svg.tsx deleted file mode 100644 index 55864d460..000000000 --- a/src/view/components/cpx/Cpx_svg.tsx +++ /dev/null @@ -1,3002 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/boardsvg.ts - -import * as React from "react"; - -export const CPX_SVG = ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -); - -export default CPX_SVG; diff --git a/src/view/components/cpx/Cpx_svg_style.tsx b/src/view/components/cpx/Cpx_svg_style.tsx deleted file mode 100644 index 4eff14480..000000000 --- a/src/view/components/cpx/Cpx_svg_style.tsx +++ /dev/null @@ -1,302 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts#L477 - -export const MB_WIDTH = 180.09375; -export const MB_HEIGHT = 179.22874; - -export const OFF_COLOR = "#c8c8c8"; -export const MAX_STROKE_LUM = 75; -export const MIN_INNER_LUM = 85; -export const INTENSITY_FACTOR = 1.3; -export const RED_LED_ON: string = "#FF7777"; -export const RED_LED_OFF: string = "#FFFFFF"; -export const BUTTON_NEUTRAL: string = "#000000"; -export const BUTTON_PRESSED: string = "#FFA500"; -export const BUTTON_OUTER: string = "#DCDCDC"; -export const BUTTON_CORNER_RADIUS: number = 2; -export const BUTTON_WIDTH: number = 10; -export const BUTTON_CIRCLE_RADIUS: number = 3; -export const BUTTON_TEXT_BASELINE: number = 163; -export const POWER_LED_ON: string = "#00FF00"; -export const POWER_LED_OFF: string = "#FFFFFF"; - -// Adapted from : https://github.com/microsoft/pxt/blob/master/pxtsim/simlib.ts -export function rgbToHsl( - rgb: [number, number, number] -): [number, number, number] { - const [r, g, b] = rgb; - const [r$, g$, b$] = [r / 255, g / 255, b / 255]; - const cMin = Math.min(r$, g$, b$); - const cMax = Math.max(r$, g$, b$); - const cDelta = cMax - cMin; - let h: number = 0, - s: number, - l: number; - const maxAndMin = cMax + cMin; - - // Luminosity - l = (maxAndMin / 2) * 100; - - if (cDelta === 0) { - s = 0; - h = 0; - } else { - // Hue - switch (cMax) { - case r$: - h = 60 * (((g$ - b$) / cDelta) % 6); - break; - case g$: - h = 60 * ((b$ - r$) / cDelta + 2); - break; - case b$: - h = 60 * ((r$ - g$) / cDelta + 4); - break; - } - - // Saturation - l > 50 - ? (s = 100 * (cDelta / (2 - maxAndMin))) - : (s = 100 * (cDelta / maxAndMin)); - } - - return [Math.floor(h), Math.floor(s), Math.floor(l)]; -} - -export const SVG_STYLE = ` - svg.sim { - box-sizing: border-box; - width: 100%; - height: 100%; - display: block; - } - svg.sim.grayscale { - -moz-filter: grayscale(1); - -webkit-filter: grayscale(1); - filter: grayscale(1); - } - .sim-button { - pointer-events: none; - } - - .sim-button-outer { - cursor: pointer; - } - .sim-button-outer:hover { - stroke-width: 1px; - stroke: orange !important; - } - .sim-button-nut { - fill:#704A4A; - pointer-events:none; - } - .sim-button-nut:hover { - stroke:1px solid #704A4A; - } - - .sim-pin-touch.touched:hover { - stroke:darkorange; - } - - .sim-led-back:hover { - stroke:#fff; - stroke-width:3px; - } - .sim-led:hover { - stroke:#ff7f7f; - stroke-width:3px; - } - - .sim-systemled { - fill:#333; - stroke:#555; - stroke-width: 1px; - } - - .sim-light-level-button { - stroke:#f1c40f; - stroke-width: 1px; - } - - .sim-pin-level-button { - stroke:darkorange; - stroke-width: 1px; - } - - .sim-sound-level-button { - stroke:#7f8c8d; - stroke-width: 1px; - } - - .sim-antenna { - stroke:#555; - stroke-width: 2px; - } - - .sim-text { - font-family:"Lucida Console", Monaco, monospace; - font-size:8px; - fill:#fff; - pointer-events: none; user-select: none; - } - .sim-text-outside{ - font-size:8px; - fill: var(--vscode-descriptionForeground); - } - .sim-text.small { - font-size:6px; - } - .sim-text.inverted { - fill:#000; - } - - .sim-text-pin { - font-family:"Lucida Console", Monaco, monospace; - font-size:5px; - fill:#fff; - pointer-events: none; - } - - .sim-thermometer { - stroke:#aaa; - stroke-width: 1px; - } - - #rgbledcircle:hover { - r:8px; - } - - #SWITCH_HOVER { - cursor: pointer; - } - .sim-slide-switch:hover #SWITCH_HOVER { - stroke:orange !important; - stroke-width: 1px; - } - - .sim-slide-switch-inner.on { - fill:#ff0000 !important; - } - - /* animations */ - .sim-theme-glow { - animation-name: sim-theme-glow-animation; - animation-timing-function: ease-in-out; - animation-direction: alternate; - animation-iteration-count: infinite; - animation-duration: 1.25s; - } - @keyframes sim-theme-glow-animation { - from { opacity: 1; } - to { opacity: 0.75; } - } - - .sim-flash { - animation-name: sim-flash-animation; - animation-duration: 0.1s; - } - - @keyframes sim-flash-animation { - from { fill: yellow; } - to { fill: default; } - } - - .sim-flash-stroke { - animation-name: sim-flash-stroke-animation; - animation-duration: 0.4s; - animation-timing-function: ease-in; - } - - @keyframes sim-flash-stroke-animation { - from { stroke: yellow; } - to { stroke: default; } - } - - - .sim-sound-stroke { - animation-name: sim-sound-stroke-animation; - animation-duration: 0.4s; - } - - @keyframes sim-sound-stroke-animation { - from { stroke: yellow; } - to { stroke: default; } - } - - /* wireframe */ - .sim-wireframe * { - fill: none; - stroke: black; - } - .sim-wireframe .sim-display, - .sim-wireframe .sim-led, - .sim-wireframe .sim-led-back, - .sim-wireframe .sim-head, - .sim-wireframe .sim-theme, - .sim-wireframe .sim-button-group, - .sim-wireframe .sim-button-label, - .sim-wireframe .sim-button, - .sim-wireframe .sim-text-pin - { - visibility: hidden; - } - .sim-wireframe .sim-label - { - stroke: none; - fill: #777; - } - .sim-wireframe .sim-board { - stroke-width: 2px; - } - *:focus { - outline: none; - } - - .sim-button-outer:focus, - .sim-slide-switch:focus, - .sim-thermometer:focus, - .sim-button-group:focus .sim-button-outer, - .sim-light-level-button:focus, - .sim-sound-level-button:focus { - stroke: #4D90FE; - stroke-width: 2px !important; - } - - .no-drag { - user-drag: none; - user-select: none; - -moz-user-select: none; - -webkit-user-drag: none; - -webkit-user-select: none; - -ms-user-select: none; - } - - .sim-PIN_A1-touch:hover, - .sim-PIN_A2-touch:hover, - .sim-PIN_A3-touch:hover, - .sim-PIN_A4-touch:hover, - .sim-PIN_A5-touch:hover, - .sim-PIN_A6-touch:hover, - .sim-PIN_A7-touch:hover{ - stroke:orange !important; - stroke-width:1px; - } - - .sim-PIN_A1-touch:focus, - .sim-PIN_A2-touch:focus, - .sim-PIN_A3-touch:focus, - .sim-PIN_A4-touch:focus, - .sim-PIN_A5-touch:focus, - .sim-PIN_A6-touch:focus, - .sim-PIN_A7-touch:focus{ - stroke:#4D90FE; - stroke-width:2px; - } - - .pin-pressed{ - stroke:orange !important; - stroke-width:1px; - } -`; diff --git a/src/view/components/cpx/Svg_utils.tsx b/src/view/components/cpx/Svg_utils.tsx deleted file mode 100644 index 92836b923..000000000 --- a/src/view/components/cpx/Svg_utils.tsx +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Adapted from : https://github.com/microsoft/pxt/blob/master/pxtsim/svg.ts - -// tslint:disable-next-line: no-namespace -namespace svg { - export function addClass(el: SVGElement, cls: string) { - if (el.classList) { - el.classList.add(cls); - } else if (el.className.baseVal.indexOf(cls) < 0) { - el.className.baseVal += " " + cls; - } - } - - export function removeClass(el: SVGElement, cls: string) { - if (el.classList) { - el.classList.remove(cls); - } else { - el.className.baseVal = el.className.baseVal - .replace(cls, "") - .replace(/\s{2,}/, " "); - } - } - - export function hydrate(el: SVGElement, props: any) { - for (const k in props) { - if (k == "title") { - svg.title(el, props[k]); - } else { - el.setAttributeNS(null, k, props[k]); - } - } - } - - export function createElement(name: string, props?: any): SVGElement { - const newElement = document.createElementNS( - "http://www.w3.org/2000/svg", - name - ); - if (props) { - svg.hydrate(newElement, props); - } - return newElement; - } - - export function child( - parent: Element, - name: string, - props?: any - ): SVGElement { - const childElement = svg.createElement(name, props); - parent.appendChild(childElement); - return childElement; - } - - export function fill(el: SVGElement, c: string) { - el.style.fill = c; - } - - export function filter(el: SVGElement, c: string) { - el.style.filter = c; - } - - export function fills(els: SVGElement[], c: string) { - els.forEach(el => (el.style.fill = c)); - } - - export function mkTitle(txt: string): SVGTitleElement { - const t = svg.createElement("title") as SVGTitleElement; - t.textContent = txt; - return t; - } - - export function title(el: SVGElement, txt: string): SVGTitleElement { - const t = mkTitle(txt); - el.appendChild(t); - return t; - } - - export function setLed( - ledStatus: boolean, - offColor: string, - onColor: string, - ledElement: SVGElement | null, - gradientStopElement: SVGStopElement | null - ) { - if (ledStatus) { - ledElement?.setAttribute("fill", onColor); - gradientStopElement?.setAttribute("stop-opacity", "1"); - } else { - ledElement?.setAttribute("fill", offColor); - gradientStopElement?.setAttribute("stop-opacity", "0"); - } - } -} - -export default svg; diff --git a/src/view/components/cpx/__snapshots__/Cpx.spec.tsx.snap b/src/view/components/cpx/__snapshots__/Cpx.spec.tsx.snap deleted file mode 100644 index 960f9b501..000000000 --- a/src/view/components/cpx/__snapshots__/Cpx.spec.tsx.snap +++ /dev/null @@ -1,4666 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`CPX component should render correctly 1`] = ` -Array [ -
-
- The simulator will run the .py file you have focused on. -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
-
, -
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
, -] -`; diff --git a/src/view/components/microbit/Microbit.spec.tsx b/src/view/components/microbit/Microbit.spec.tsx deleted file mode 100644 index e948a1988..000000000 --- a/src/view/components/microbit/Microbit.spec.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { Microbit } from "./Microbit"; - -describe("Microbit component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); diff --git a/src/view/components/microbit/Microbit.tsx b/src/view/components/microbit/Microbit.tsx deleted file mode 100644 index b85565e67..000000000 --- a/src/view/components/microbit/Microbit.tsx +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { MICROBIT_TOOLBAR_ICON_ID } from "../../components/toolbar/SensorModalUtils"; -import { - GESTURES_MICROBIT, - SENSOR_LIST, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, -} from "../../constants"; -import "../../styles/Simulator.css"; -import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; -import { sendMessage } from "../../utils/MessageUtils"; -import ToolBar from "../toolbar/ToolBar"; -import { MicrobitSimulator } from "./MicrobitSimulator"; - -// Component grouping the functionality for micro:bit functionalities -interface IState { - sensors: { [key: string]: number }; - currentSelectedGesture?: string; -} -const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - }, - currentSelectedGesture: GESTURES_MICROBIT[0], -}; - -export class Microbit extends React.Component<{}, IState> { - state = DEFAULT_STATE; - - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; - - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; - updateGesture = (event: React.ChangeEvent) => { - this.setState({ currentSelectedGesture: event.target.value }); - }; - sendGesture = (isActive: boolean) => { - if (this.state.currentSelectedGesture) { - if (isActive) { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: this.state.currentSelectedGesture, - }); - } else { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: "", - }); - } - } - }; -} - -const MICROBIT_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, - }, - { - image: TOOLBAR_SVG.RED_LED_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LEDS, - }, - { - image: TOOLBAR_SVG.TEMPERATURE_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, - }, - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - }, - { - image: TOOLBAR_SVG.GESTURE_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.GESTURE, - }, - { - image: TOOLBAR_SVG.GPIO_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.GPIO, - }, - { - image: TOOLBAR_SVG.COMPASS_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.COMPASS, - }, - { - image: TOOLBAR_SVG.SPEAKER_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.SOUND, - }, - { - image: TOOLBAR_SVG.WIRELESS_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.WIRELESS, - }, -]; diff --git a/src/view/components/microbit/MicrobitImage.tsx b/src/view/components/microbit/MicrobitImage.tsx deleted file mode 100644 index a216dceef..000000000 --- a/src/view/components/microbit/MicrobitImage.tsx +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { BUTTON_CLASSNAME, VIEW_STATE } from "../../constants"; -import CONSTANTS, { BUTTON_STYLING_CLASSES } from "../../constants"; -import { ViewStateContext } from "../../context"; -import { IRefObject, MicrobitSvg } from "./Microbit_svg"; - -interface EventTriggers { - onMouseUp: (event: Event, buttonKey: string) => void; - onMouseDown: (event: Event, buttonKey: string) => void; - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; -} -interface IProps { - eventTriggers: EventTriggers; - leds: number[][]; -} - -export enum BUTTONS_KEYS { - BTN_A = "BTN_A", - BTN_B = "BTN_B", - BTN_AB = "BTN_AB", -} -// Displays the SVG and call necessary svg modification. -export class MicrobitImage extends React.Component { - private svgRef: React.RefObject = React.createRef(); - constructor(props: IProps) { - super(props); - } - componentDidMount() { - const svgElement = this.svgRef.current; - if (svgElement) { - updateAllLeds(this.props.leds, svgElement.getLeds()); - setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); - this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); - } - } - componentDidUpdate() { - if (this.svgRef.current) { - updateAllLeds(this.props.leds, this.svgRef.current.getLeds()); - if (this.context === VIEW_STATE.PAUSE) { - disableAllButtons(this.svgRef.current.getButtons()); - } else if (this.context === VIEW_STATE.RUNNING) { - setupAllButtons( - this.props.eventTriggers, - this.svgRef.current.getButtons() - ); - } - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.eventTriggers.onKeyEvent(event, true, event.key); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.eventTriggers.onKeyEvent(event, false, event.key); - }; - render() { - return ; - } - public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { - const button = this.svgRef.current?.getButtons()[key].current; - if (button) { - button.focus(); - if (isActive) { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.KEYPRESSED - ); - } else { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.DEFAULT - ); - } - button.setAttribute("pressed", `${isActive}`); - button.setAttribute("aria-pressed", `${isActive}`); - } - } -} - -MicrobitImage.contextType = ViewStateContext; -const setupButton = ( - buttonElement: SVGRectElement, - eventTriggers: EventTriggers, - key: string -) => { - buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); - - buttonElement.onmousedown = e => { - buttonElement.focus(); - eventTriggers.onMouseDown(e, key); - }; - buttonElement.onmouseup = e => { - eventTriggers.onMouseUp(e, key); - }; - - buttonElement.onkeydown = e => { - // ensure that the keydown is enter, - // or else it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - eventTriggers.onKeyEvent(e, true, key); - } - }; - buttonElement.onkeyup = e => { - eventTriggers.onKeyEvent(e, false, key); - }; -}; -const setupAllButtons = ( - eventTriggers: EventTriggers, - buttonRefs: IRefObject -) => { - for (const [key, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - setupButton(ref.current, eventTriggers, key); - } - } -}; -const disableAllButtons = (buttonRefs: IRefObject) => { - for (const [, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - // to implement - ref.current.onmousedown = null; - ref.current.onmouseup = null; - ref.current.onkeydown = null; - ref.current.onkeyup = null; - ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); - } - } -}; -const updateAllLeds = ( - leds: number[][], - ledRefs: Array>> -) => { - for (let j = 0; j < leds.length; j++) { - for (let i = 0; i < leds[0].length; i++) { - const ledElement = ledRefs[j][i].current; - if (ledElement) { - setupLed(ledElement, leds[i][j]); - } - } - } -}; -const setupLed = (ledElement: SVGRectElement, brightness: number) => { - ledElement.style.opacity = (brightness / 10).toString(); -}; diff --git a/src/view/components/microbit/MicrobitSimulator.tsx b/src/view/components/microbit/MicrobitSimulator.tsx deleted file mode 100644 index d3507710c..000000000 --- a/src/view/components/microbit/MicrobitSimulator.tsx +++ /dev/null @@ -1,259 +0,0 @@ -import * as React from "react"; -import { - AB_BUTTONS_KEYS, - CONSTANTS, - DEVICE_LIST_KEY, - VIEW_STATE, - WEBVIEW_MESSAGES, -} from "../../constants"; -import { ViewStateContext } from "../../context"; -import PlayLogo from "../../svgs/play_svg"; -import StopLogo from "../../svgs/stop_svg"; -import { sendMessage } from "../../utils/MessageUtils"; -import ActionBar from "../simulator/ActionBar"; -import { BUTTONS_KEYS, MicrobitImage } from "./MicrobitImage"; - -const DEFAULT_MICROBIT_STATE: IMicrobitState = { - leds: [ - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - ], - buttons: { button_a: false, button_b: false }, -}; - -interface IState { - active_editors: string[]; - running_file?: string; - currently_selected_file: string; - play_button: boolean; - selected_file: string; - microbit: IMicrobitState; - sendGesture?: (isActive: boolean) => void; -} - -interface IMicrobitState { - leds: number[][]; - buttons: { button_a: boolean; button_b: boolean }; -} -export class MicrobitSimulator extends React.Component { - private imageRef: React.RefObject = React.createRef(); - constructor() { - super({}); - this.state = { - microbit: DEFAULT_MICROBIT_STATE, - play_button: false, - selected_file: "", - active_editors: [], - running_file: undefined, - currently_selected_file: "", - }; - this.onKeyEvent = this.onKeyEvent.bind(this); - } - handleMessage = (event: any): void => { - const message = event.data; - - if (message.active_device !== DEVICE_LIST_KEY.MICROBIT) { - return; - } - - switch (message.command) { - case "reset-state": - this.setState({ - microbit: DEFAULT_MICROBIT_STATE, - play_button: false, - }); - break; - case "set-state": - this.setState({ - microbit: { - ...this.state.microbit, - leds: message.state.leds, - }, - }); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - }); - break; - case "visible-editors": - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } - - break; - } - }; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } - - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
-
- -
- -
- ); - } - - protected togglePlayClick = () => { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - }; - - protected refreshSimulatorClick = () => { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - }; - protected handleButtonClick = (key: string, isActive: boolean) => { - let newButtonState = this.state.microbit.buttons; - switch (key) { - case AB_BUTTONS_KEYS.BTN_A: - newButtonState.button_a = isActive; - break; - case AB_BUTTONS_KEYS.BTN_B: - newButtonState.button_b = isActive; - break; - case AB_BUTTONS_KEYS.BTN_AB: - newButtonState = { - button_a: isActive, - button_b: isActive, - }; - break; - } - sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); - this.setState({ - microbit: { - ...this.state.microbit, - buttons: newButtonState, - }, - }); - }; - - protected onMouseUp = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, false); - }; - - protected onMouseDown = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, true); - }; - - protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { - event.stopPropagation(); - if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(key, active); - if (key === BUTTONS_KEYS.BTN_A) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if (key === BUTTONS_KEYS.BTN_B) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if (key === BUTTONS_KEYS.BTN_AB) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); - - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); - - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); - - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } - } -} -MicrobitSimulator.contextType = ViewStateContext; diff --git a/src/view/components/microbit/Microbit_svg.tsx b/src/view/components/microbit/Microbit_svg.tsx deleted file mode 100644 index c3d95fdbb..000000000 --- a/src/view/components/microbit/Microbit_svg.tsx +++ /dev/null @@ -1,1890 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Adapted from : https://makecode.microbit.org/#editor - -import * as React from "react"; -import "../../styles/SimulatorSvg.css"; - -export interface IRefObject { - [key: string]: React.RefObject; -} -/* tslint:disable */ - -const N_LED_COLUMN = 5; -const N_LED_ROW = 5; -export class MicrobitSvg extends React.Component { - constructor(props: Readonly<{}>) { - super(props); - for (let j = 0; j < N_LED_ROW; j++) { - const led_row: React.RefObject[] = []; - for (let i = 0; i < N_LED_COLUMN; i++) { - led_row.push(React.createRef()); - } - this.ledRefs.push(led_row); - } - } - private svgRef: React.RefObject = React.createRef(); - - private buttonRefs: IRefObject = { - BTN_A: React.createRef(), - BTN_B: React.createRef(), - BTN_AB: React.createRef(), - }; - - private ledRefs: React.RefObject[][] = []; - public getSvgRef(): React.RefObject { - return this.svgRef; - } - public getButtons(): IRefObject { - return this.buttonRefs; - } - public getLeds(): React.RefObject[][] { - return this.ledRefs; - } - - render() { - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (0,0) - - - - (1,0) - - - - (2,0) - - - - (3,0) - - - - (4,0) - - - - (0,1) - - - - (1,1) - - - - (2,1) - - - - (3,1) - - - - (4,1) - - - - (0,2) - - - - (1,2) - - - - (2,2) - - - - (3,2) - - - - (4,2) - - - - (0,3) - - - - (1,3) - - - - (2,3) - - - - (3,3) - - - - (4,3) - - - - (0,4) - - - - (1,4) - - - - (2,4) - - - - (3,4) - - - - (4,4) - - - - - - - - - - P0, ANALOG IN - - - P1, ANALOG IN - - - P2, ANALOG IN - - - P3, ANALOG IN, LED Col 1 - - - P4, ANALOG IN, LED Col 2 - - - P5, BUTTON A - - - P6, LED Col 9 - - - P7, LED Col 8 - - - P8 - - - P9, LED Col 7 - - - P10, ANALOG IN, LED Col 3 - - - P11, BUTTON B - - - P12, RESERVED ACCESSIBILITY - - - P13, SPI - SCK - - - P14, SPI - MISO - - - P15, SPI - MOSI - - - P16, SPI - Chip Select - - - P17, +3v3 - - - P18, +3v3 - - - P19, I2C - SCL - - - P20, I2C - SDA - - - GND - - - GND - - - +3v3 - - - GND - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - - - - - - - - - - - - - - -
- ); - } -} diff --git a/src/view/components/microbit/__snapshots__/Microbit.spec.tsx.snap b/src/view/components/microbit/__snapshots__/Microbit.spec.tsx.snap deleted file mode 100644 index 9e167bbca..000000000 --- a/src/view/components/microbit/__snapshots__/Microbit.spec.tsx.snap +++ /dev/null @@ -1,3238 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Microbit component should render correctly 1`] = ` -Array [ -
-
- The simulator will run the .py file you have focused on. -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (0,0) - - - - - - (1,0) - - - - - - (2,0) - - - - - - (3,0) - - - - - - (4,0) - - - - - - (0,1) - - - - - - (1,1) - - - - - - (2,1) - - - - - - (3,1) - - - - - - (4,1) - - - - - - (0,2) - - - - - - (1,2) - - - - - - (2,2) - - - - - - (3,2) - - - - - - (4,2) - - - - - - (0,3) - - - - - - (1,3) - - - - - - (2,3) - - - - - - (3,3) - - - - - - (4,3) - - - - - - (0,4) - - - - - - (1,4) - - - - - - (2,4) - - - - - - (3,4) - - - - - - (4,4) - - - - - - - - - - - - P0, ANALOG IN - - - - - P1, ANALOG IN - - - - - P2, ANALOG IN - - - - - P3, ANALOG IN, LED Col 1 - - - - - P4, ANALOG IN, LED Col 2 - - - - - P5, BUTTON A - - - - - P6, LED Col 9 - - - - - P7, LED Col 8 - - - - - P8 - - - - - P9, LED Col 7 - - - - - P10, ANALOG IN, LED Col 3 - - - - - P11, BUTTON B - - - - - P12, RESERVED ACCESSIBILITY - - - - - P13, SPI - SCK - - - - - P14, SPI - MISO - - - - - P15, SPI - MOSI - - - - - P16, SPI - Chip Select - - - - - P17, +3v3 - - - - - P18, +3v3 - - - - - P19, I2C - SCL - - - - - P20, I2C - SDA - - - - - GND - - - - - GND - - - - - +3v3 - - - - - GND - - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
-
, -
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
, -] -`; diff --git a/src/view/components/simulator/ActionBar.tsx b/src/view/components/simulator/ActionBar.tsx deleted file mode 100644 index b760817b8..000000000 --- a/src/view/components/simulator/ActionBar.tsx +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { CONSTANTS } from "../../constants"; -import RefreshLogo from "../../svgs/refresh_svg"; -import Button from "../Button"; - -interface IProps { - onTogglePlay: (event: React.MouseEvent) => void; - onToggleRefresh: (event: React.MouseEvent) => void; - playStopImage: JSX.Element; - playStopLabel: string; -} - -// Component including the actions done on the Simulator (play/stop, refresh) - -class ActionBar extends React.Component { - public render() { - const { - onTogglePlay, - onToggleRefresh, - playStopImage, - playStopLabel, - } = this.props; - return ( -
-
- ); - } -} -export default ActionBar; diff --git a/src/view/components/toolbar/GenericSliderComponent.tsx b/src/view/components/toolbar/GenericSliderComponent.tsx deleted file mode 100644 index 273896621..000000000 --- a/src/view/components/toolbar/GenericSliderComponent.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import * as React from "react"; -import { SENSOR_LIST } from "../../constants"; -import { ISensorProps, ISliderProps } from "../../viewUtils"; -import InputSlider from "./InputSlider"; - -interface IProps { - axisProperties: ISensorProps; - axisValues: { - // key is accessed with axisLabel - [key: string]: number; - }; - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void; -} -export const GenericSliderComponent: React.FC = props => { - return ( -
- {props.axisProperties.sliderProps.map( - (sliderProperties: ISliderProps, index: number) => { - return ( - - -
-
- ); - } - )} -
- ); -}; diff --git a/src/view/components/toolbar/Gesture.tsx b/src/view/components/toolbar/Gesture.tsx deleted file mode 100644 index a89a3bd5c..000000000 --- a/src/view/components/toolbar/Gesture.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import * as React from "react"; -import { CONSTANTS } from "../../constants"; -import { Dropdown } from "../Dropdown"; -import SensorButton from "./SensorButton"; - -const GESTURE_BUTTON_MESSAGE = "Send Gesture"; -interface IProps { - gestures: string[]; - onSelectGestures?: (event: React.ChangeEvent) => void; - onSendGesture?: (isActive: boolean) => void; -} -export class Gesture extends React.Component { - private sensorButtonRef: React.RefObject = React.createRef(); - render() { - return ( -
- - { - if (this.props.onSendGesture) { - this.props.onSendGesture(true); - } - }} - onMouseUp={() => { - if (this.props.onSendGesture) { - this.props.onSendGesture(false); - } - }} - onKeyDown={this.handleOnKeyDown} - onKeyUp={this.handleOnKeyUp} - type="gesture" - /> -
- ); - } - private handleOnKeyDown = (e: React.KeyboardEvent) => { - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - this.sensorButtonRef!.current!.setButtonClass(true); - if (this.props.onSendGesture) { - this.props.onSendGesture(true); - } - } - }; - - private handleOnKeyUp = ( - e: React.KeyboardEvent, - onSendGesture?: (isActive: boolean) => void - ) => { - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - this.sensorButtonRef!.current!.setButtonClass(false); - - if (this.props.onSendGesture) { - this.props.onSendGesture(false); - } - } - }; -} diff --git a/src/view/components/toolbar/InputSlider.tsx b/src/view/components/toolbar/InputSlider.tsx deleted file mode 100644 index adfbcef60..000000000 --- a/src/view/components/toolbar/InputSlider.tsx +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { SENSOR_LIST, VIEW_STATE, WEBVIEW_MESSAGES } from "../../constants"; -import { ViewStateContext } from "../../context"; -import "../../styles/InputSlider.css"; -import { sendMessage } from "../../utils/MessageUtils"; -import { ISliderProps } from "../../viewUtils"; - -class InputSlider extends React.Component { - constructor(props: ISliderProps) { - super(props); - this.state = { - value: this.props.value, - }; - - this.handleOnChange = this.handleOnChange.bind(this); - this.validateRange = this.validateRange.bind(this); - } - - render() { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; - - const nbDecimals = - this.props.step.toString().split(".")[1]?.length || 0; - return ( -
- {this.props.axisLabel} - 0 ? 1 : 0}}[0-9]{0,${nbDecimals}}$`} - onKeyUp={this.handleOnChange} - style={{ width: this.getMaximumBoxWidth() + "ch" }} - aria-label={`${this.props.type} sensor input ${this.props.axisLabel}`} - /> - - - {this.props.minValue} - {this.props.maxValue} - - - - {this.props.minLabel} - {this.props.maxLabel} - - -
- ); - } - - private getMaximumBoxWidth = () => { - return ( - Math.max( - this.props.minValue.toString().length, - this.props.maxValue.toString().length - ) + 2 - ); - }; - - private handleOnChange = (event: any) => { - const validatedValue = this.validateRange(this.updateValue(event)); - const newSensorState = this.writeMessage(validatedValue); - if (newSensorState) { - sendMessage(WEBVIEW_MESSAGES.SENSOR_CHANGED, newSensorState); - } - }; - - private writeMessage = (valueTowrite: number) => { - let value = valueTowrite; - if (value > this.props.maxValue || value < this.props.minValue) { - value = parseInt(this.state.value, 10); - } - - return this.props.type && this.state.value !== undefined - ? { [this.props.type]: value } - : undefined; - }; - - private updateValue = (event: any) => { - const newValue = event.target.validity.valid - ? event.target.value - : this.state.value; - if (this.props.onUpdateValue) { - this.props.onUpdateValue(this.props.type as SENSOR_LIST, newValue); - } - return newValue; - }; - - private sendTelemetry = () => { - sendMessage(WEBVIEW_MESSAGES.SLIDER_TELEMETRY, this.props.type); - }; - - private validateRange = (valueString: string) => { - let valueInt = parseFloat(valueString); - if (valueInt < this.props.minValue) { - valueInt = this.props.minValue; - this.setState({ value: valueInt }); - } else if (valueInt > this.props.maxValue) { - valueInt = this.props.maxValue; - this.setState({ value: valueInt }); - } - return valueInt; - }; -} -InputSlider.contextType = ViewStateContext; - -export default InputSlider; diff --git a/src/view/components/toolbar/SensorButton.tsx b/src/view/components/toolbar/SensorButton.tsx deleted file mode 100644 index b50759bd4..000000000 --- a/src/view/components/toolbar/SensorButton.tsx +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { VIEW_STATE } from "../../constants"; -import { ViewStateContext } from "../../context"; -import "../../styles/SensorButton.css"; -import { ISensorButtonProps } from "../../viewUtils"; - -class SensorButton extends React.Component { - private buttonRef: React.RefObject = React.createRef(); - - public setButtonClass = (isActive: boolean) => { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; - - if (isActive && !isInputDisabled) { - this.buttonRef.current?.setAttribute( - "class", - "sensor-button active-button" - ); - } else if (this.buttonRef.current) { - this.buttonRef!.current!.setAttribute("class", "sensor-button"); - } - }; - render() { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; - - return ( - - ); - } -} -SensorButton.contextType = ViewStateContext; -export default SensorButton; diff --git a/src/view/components/toolbar/SensorModalUtils.tsx b/src/view/components/toolbar/SensorModalUtils.tsx deleted file mode 100644 index c7ea53f85..000000000 --- a/src/view/components/toolbar/SensorModalUtils.tsx +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. -import * as React from "react"; -import { SENSOR_LIST } from "../../constants"; -import { ARROW_RIGHT_SVG } from "../../svgs/arrow_right_svg"; -import * as CLUE_MODAL from "./clue/ClueModalContent"; -import * as CPX_MODAL from "./cpx/CpxModalContent"; -import * as MICROBIT_MODAL from "./microbit/MicrobitModalContent"; - -export const TRY_IT_MAKE_CODE = ( - -); - -export const FEATURE_REQUEST_ON_GITHUB = ( - -); - -export const TOOLBAR_ICON_LABEL = { - GPIO: "GPIO", - IR: "IR", - LEFT_EDGE: "left-edge", - LIGHT: "Light sensor", - MOTION: "Motion Sensor", - NEO_PIXEL: "Neo Pixels", - PUSH_BUTTON: "Push Button", - RED_LED: "Red LED", - RIGHT_EDGE: "right-edge", - SOUND: "Sound Sensor", - SPEAKER: "Speaker", - SWITCH: "Switch", - TAG_INPUT: "Tag Input", - TAG_OUTPUT: "Tag Output", - TEMPERATURE: "Temperature Sensor", - WIRELESS: "Bluetooth and Radio", -}; -export const CPX_TOOLBAR_ICON_ID = { - GPIO: "toolbar-gpio", - IR: "toolbar-ir-sensor", - LEFT_EDGE: "left-edge", - LIGHT: "toolbar-light-sensor", - MOTION: "toolbar-motion-sensor", - NEO_PIXEL: "toolbar-neo-pixels", - PUSH_BUTTON: "toolbar-a-b-push", - RED_LED: "toolbar-red-led", - RIGHT_EDGE: "right-edge", - SOUND: "toolbar-sound-sensor", - SPEAKER: "toolbar-speaker", - SWITCH: "toolbar-slider-switch", - TEMPERATURE: "toolbar-temperature-sensor", -}; - -export const MICROBIT_TOOLBAR_ICON_ID = { - TEMPERATURE: "toolbar-microbit-temperature-sensor", - LIGHT: "toolbar-microbit-light-sensor", - ACCELEROMETER: "toolbar-accelerometer-sensor", - LEDS: "toolbar-microbit-led", - PUSH_BUTTON: "toolbar-microbit-a-b-push", - GPIO: "toolbar-gpio", - SOUND: "toolbar-microbit-sound", - WIRELESS: "toolbar-microbit-wireless", - GESTURE: "toolbar-microbit-gesture-sensor", - COMPASS: "toolbar-microbit-compass-sensor", -}; - -export const CLUE_TOOLBAR_ICON_ID = { - TEMPERATURE: "toolbar-clue-temperature-sensor", - LIGHT: "toolbar-clue-light-sensor", - ACCELEROMETER: "toolbar-clue-accelerometer-sensor", - LEDS: "toolbar-clue-led", - PUSH_BUTTON: "toolbar-clue-a-b-push", - GPIO: "toolbar-clue-gpio", - SPEAKER: "toolbar-speaker", - SOUND: "toolbar-clue-sound-sensor", - PRESSURE: "toolbar-clue-pressure-sensor", - HUMIDITY: "toolbar-clue-humidity-sensor", - GESTURE: "toolbar-clue-gesture-sensor", - PROXIMITY: "toolbar-clue-proximity-sensor", - BLUETOOTH: "toolbar-clue-bluetooth", - MAGNETOSCOPE: "toolbar-clue-magnet-sensor", - GYROSCOPE: "toolbar-clue-gyroscope-sensor", -}; - -export interface IModalContent { - components: any; - descriptionText: string; - descriptionTitle: string; - id: string; - tagInput: any; - tagOutput: any; - tryItDescription: string; -} - -export const DEFAULT_MODAL_CONTENT: IModalContent = { - descriptionTitle: "default", - tagInput: undefined, - tagOutput: undefined, - descriptionText: "none", - tryItDescription: "none", - components: undefined, - id: "none", -}; - -export const LABEL_TO_MODAL_CONTENT_CONSTRUCTOR = new Map([ - [CPX_TOOLBAR_ICON_ID.GPIO, CPX_MODAL.GPIO_CONTENT], - [CPX_TOOLBAR_ICON_ID.IR, CPX_MODAL.IR_CONTENT], - [CPX_TOOLBAR_ICON_ID.LIGHT, CPX_MODAL.LIGHT_CONTENT], - [CPX_TOOLBAR_ICON_ID.MOTION, CPX_MODAL.MOTION_CONTENT], - [CPX_TOOLBAR_ICON_ID.NEO_PIXEL, CPX_MODAL.NEOP_CONTENT], - [CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, CPX_MODAL.PUSHB_CONTENT], - [CPX_TOOLBAR_ICON_ID.RED_LED, CPX_MODAL.RED_LED_CONTENT], - [CPX_TOOLBAR_ICON_ID.SOUND, CPX_MODAL.SOUND_CONTENT], - [CPX_TOOLBAR_ICON_ID.SPEAKER, CPX_MODAL.SPEAKER_CONTENT], - [CPX_TOOLBAR_ICON_ID.SWITCH, CPX_MODAL.SWITCH_CONTENT], - [CPX_TOOLBAR_ICON_ID.TEMPERATURE, CPX_MODAL.TEMPERATURE_CONTENT], - [ - MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - MICROBIT_MODAL.ACCELEROMETER_CONTENT, - ], - [MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, MICROBIT_MODAL.TEMPERATURE_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.LIGHT, MICROBIT_MODAL.LIGHT_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.LEDS, MICROBIT_MODAL.LED_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, MICROBIT_MODAL.BUTTON_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.GPIO, MICROBIT_MODAL.GPIO_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.SOUND, MICROBIT_MODAL.SOUND_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.WIRELESS, MICROBIT_MODAL.WIRELESS_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], - [CLUE_TOOLBAR_ICON_ID.TEMPERATURE, CLUE_MODAL.TEMPERATURE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, CLUE_MODAL.BUTTON_CONTENT], - [CLUE_TOOLBAR_ICON_ID.GPIO, CLUE_MODAL.GPIO_CONTENT], - [CLUE_TOOLBAR_ICON_ID.LIGHT, CLUE_MODAL.LIGHT_CONTENT], - [CLUE_TOOLBAR_ICON_ID.LEDS, CLUE_MODAL.LED_CONTENT], - [CLUE_TOOLBAR_ICON_ID.SOUND, CLUE_MODAL.SOUND_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PRESSURE, CLUE_MODAL.PRESSURE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.HUMIDITY, CLUE_MODAL.HUMIDITY_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PROXIMITY, CLUE_MODAL.PROXIMITY_CONTENT], - [CLUE_TOOLBAR_ICON_ID.BLUETOOTH, CLUE_MODAL.BLUETOOTH_CONTENT], - [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.SPEAKER, CLUE_MODAL.SPEAKER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.GYROSCOPE, CLUE_MODAL.GYROSCOPE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, CLUE_MODAL.MAGNETOSCOPE_CONTENT], -]); - -export const getModalContent = ( - label: string, - onUpdateValue: (onUpdateValue: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number }, - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void -) => { - if (label === CLUE_TOOLBAR_ICON_ID.GESTURE) { - return CLUE_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); - } else if (label === MICROBIT_TOOLBAR_ICON_ID.GESTURE) { - return MICROBIT_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); - } - const modalContentConstructor = LABEL_TO_MODAL_CONTENT_CONSTRUCTOR.get( - label - ); - if (modalContentConstructor) { - return modalContentConstructor(onUpdateValue, sensorValues); - } else { - return; - } -}; diff --git a/src/view/components/toolbar/ToolBar.tsx b/src/view/components/toolbar/ToolBar.tsx deleted file mode 100644 index a2a3ee1a2..000000000 --- a/src/view/components/toolbar/ToolBar.tsx +++ /dev/null @@ -1,221 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. -import { initializeIcons } from "@uifabric/icons"; -import { Callout, TooltipHost } from "office-ui-fabric-react"; -import { IconButton } from "office-ui-fabric-react"; -import * as React from "react"; -import { - FormattedMessage, - injectIntl, - WrappedComponentProps, -} from "react-intl"; -import { SENSOR_LIST } from "../../constants"; -import "../../styles/ToolBar.css"; -import Button from "../Button"; -import { - DEFAULT_MODAL_CONTENT, - getModalContent, - IModalContent, -} from "./SensorModalUtils"; - -interface IToolbarState { - currentOpenedId: string; - showModal: boolean; - isDescriptionVisible: boolean; -} - -interface IProps extends WrappedComponentProps { - buttonList: Array<{ - label: any; - image: any; - }>; - onUpdateSensor: (sensor: SENSOR_LIST, value: number) => void; - sensorValues: { [key: string]: number }; - onSelectGesture?: (event: React.ChangeEvent) => void; - sendGesture?: (isActive: boolean) => void; -} - -class ToolBar extends React.Component { - private readonly TOOLBAR_BUTTON_WIDTH: number = 32; - - constructor(props: IProps) { - super(props); - initializeIcons(); - this.state = { - currentOpenedId: "", - isDescriptionVisible: false, - showModal: false, - }; - } - - public render() { - const { buttonList } = this.props; - return ( -
-
-
- {buttonList.map( - (currrentButton: any, index: number) => { - return ( - ( - - ), - }} - key={index} - > -
- {this.getIconModal()} -
-
- ); - } - - private handleOnClick = ( - event: React.MouseEvent, - label: string - ) => { - if ( - !this.state.showModal && - this.state.currentOpenedId === "" && - this.state.currentOpenedId !== label - ) { - this.openModal(label); - } else { - this.closeCurrentModal(); - if (this.state.currentOpenedId !== label) { - this.openModal(label); - } - } - }; - - private changePressedState(id: string, pressed: boolean) { - const elt = window.document.getElementById(`${id}-button`); - if (elt) { - pressed - ? elt.classList.add("button-pressed") - : elt.classList.remove("button-pressed"); - } - } - private closeCurrentModal = () => { - this.changePressedState(this.state.currentOpenedId, false); - this.setState({ - currentOpenedId: "", - showModal: false, - }); - }; - - private openModal = (label: string) => { - this.setState({ - currentOpenedId: label, - showModal: true, - }); - this.changePressedState(label, true); - }; - - private onShowDescriptionClicked = (): void => { - this.setState({ - isDescriptionVisible: !this.state.isDescriptionVisible, - }); - }; - - private onDescriptionDismiss = (): void => { - this.setState({ - isDescriptionVisible: false, - }); - }; - - private getIconModal() { - if ( - !this.state.showModal || - !getModalContent( - this.state.currentOpenedId, - this.props.onUpdateSensor, - this.props.sensorValues, - this.props.onSelectGesture, - this.props.sendGesture - ) - ) { - return null; - } - - const content = getModalContent( - this.state.currentOpenedId, - this.props.onUpdateSensor, - this.props.sensorValues, - this.props.onSelectGesture, - this.props.sendGesture - ) as IModalContent; - - const components = content - ? content.components - : DEFAULT_MODAL_CONTENT.components; - - return ( -
-
- - - {content.tagInput} - {content.tagOutput} - - -
-
- {this.state.isDescriptionVisible && ( - -
- -
-
- )} -
-
- - - -
- -
{components}
-
-
- ); - } -} - -export default injectIntl(ToolBar); diff --git a/src/view/components/toolbar/Toolbar.spec.tsx b/src/view/components/toolbar/Toolbar.spec.tsx deleted file mode 100644 index bd122082e..000000000 --- a/src/view/components/toolbar/Toolbar.spec.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { SENSOR_LIST } from "../../constants"; -import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; -import { MICROBIT_TOOLBAR_ICON_ID } from "./SensorModalUtils"; -import Toolbar from "./ToolBar"; - -const MOCK_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - }, -]; -const mockUpdateSensors = () => { - return; -}; -const mockInitialValues = { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, -}; -describe("Toolbar component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); diff --git a/src/view/components/toolbar/__snapshots__/Toolbar.spec.tsx.snap b/src/view/components/toolbar/__snapshots__/Toolbar.spec.tsx.snap deleted file mode 100644 index de9a7a42d..000000000 --- a/src/view/components/toolbar/__snapshots__/Toolbar.spec.tsx.snap +++ /dev/null @@ -1,143 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Toolbar component should render correctly 1`] = ` -
-
-
-
- -
-
- -
-
-
-
-`; diff --git a/src/view/components/toolbar/clue/ClueModalContent.tsx b/src/view/components/toolbar/clue/ClueModalContent.tsx deleted file mode 100644 index 250e61388..000000000 --- a/src/view/components/toolbar/clue/ClueModalContent.tsx +++ /dev/null @@ -1,318 +0,0 @@ -import * as React from "react"; -import { GESTURES_CLUE, SENSOR_LIST } from "../../../constants"; -import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; -import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; -import { GenericSliderComponent } from "../GenericSliderComponent"; -import { Gesture } from "../Gesture"; -import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; -import * as SENSOR_PROPERTIES from "./ClueSensorProperties"; - -export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-clue-temperature-sensor.description", - descriptionTitle: "toolbar-clue-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-temperature-sensor.tryItDescription", - }; -}; - -export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-gpio.description", - tryItDescription: "toolbar-clue-gpio.tryItDescription", - components: undefined, - id: "GPIO", - }; -}; - -export const ACCELEROMETER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const accelerometerSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-accelerometer-sensor.description", - descriptionTitle: "toolbar-clue-accelerometer-sensor.title", - id: "accelerometer", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-accelerometer-sensor.tryItDescription", - }; -}; -export const GYROSCOPE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const gyroSensorValues = { - X: sensorValues[SENSOR_LIST.GYRO_X], - Y: sensorValues[SENSOR_LIST.GYRO_Y], - Z: sensorValues[SENSOR_LIST.GYRO_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-gyroscope-sensor.description", - descriptionTitle: "toolbar-clue-gyroscope-sensor.title", - id: "gyroscope", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-gyroscope-sensor.tryItDescription", - }; -}; -export const MAGNETOSCOPE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const magnetSensorValues = { - X: sensorValues[SENSOR_LIST.MAGNET_X], - Y: sensorValues[SENSOR_LIST.MAGNET_Y], - Z: sensorValues[SENSOR_LIST.MAGNET_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-magnet-sensor.description", - descriptionTitle: "toolbar-clue-magnet-sensor.title", - id: "magnetoscope", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-magnet-sensor.tryItDescription", - }; -}; - -export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const lightSensorValues = { - R: sensorValues[SENSOR_LIST.LIGHT_R], - G: sensorValues[SENSOR_LIST.LIGHT_G], - B: sensorValues[SENSOR_LIST.LIGHT_B], - C: sensorValues[SENSOR_LIST.LIGHT_C], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-light-sensor.description", - descriptionTitle: "toolbar-clue-light-sensor.title", - id: "light_sensor", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-light-sensor.tryItDescription", - }; -}; - -export const HUMIDITY_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const humiditySensorValues = { - H: sensorValues[SENSOR_LIST.HUMIDITY], - }; - return { - descriptionTitle: "toolbar-clue-humidity-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-humidity-sensor.description", - tryItDescription: "toolbar-clue-humidity-sensor.tryItDescription", - components: [ - , - ], - id: "humidity_sensor", - }; -}; - -export const GESTURE_CONTENT = ( - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-gesture-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-gesture-sensor.description", - tryItDescription: "toolbar-clue-gesture-sensor.tryItDescription", - components: [ - , - ], - id: "gesture_sensor", - }; -}; - -export const PROXIMITY_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const proximitySensorValues = { - P: sensorValues[SENSOR_LIST.PROXIMITY], - }; - return { - descriptionTitle: "toolbar-clue-proximity-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-proximity-sensor.description", - tryItDescription: "toolbar-clue-proximity-sensor.tryItDescription", - components: [ - , - ], - id: "proximity_sensor", - }; -}; - -export const PRESSURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const pressureSensorValues = { - P: sensorValues[SENSOR_LIST.PRESSURE], - }; - return { - descriptionTitle: "toolbar-clue-pressure-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-pressure-sensor.description", - tryItDescription: "toolbar-clue-pressure-sensor.tryItDescription", - components: [ - , - ], - id: "pressure_sensor", - }; -}; - -export const BUTTON_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-a-b-push.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-clue-a-b-push.description", - tryItDescription: "toolbar-clue-a-b-push.tryItDescription", - components: undefined, - id: "microbit_button", - }; -}; - -export const BLUETOOTH_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-bluetooth.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-clue-bluetooth.description", - tryItDescription: "toolbar-clue-bluetooth.tryItDescription", - components: undefined, - id: "bluetooth", - }; -}; - -export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-sound-sensor.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-sound-sensor.description", - tryItDescription: "toolbar-clue-sound-sensor.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "sound_sensor", - }; -}; - -export const LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-led.description", - tryItDescription: "toolbar-clue-led.tryItDescription", - components: undefined, - id: "clue_neopixel", - }; -}; - -export const SPEAKER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-speaker.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-speaker.description", - tryItDescription: "toolbar-speaker.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "speaker", - }; -}; diff --git a/src/view/components/toolbar/clue/ClueSensorProperties.tsx b/src/view/components/toolbar/clue/ClueSensorProperties.tsx deleted file mode 100644 index ccb8d8e1b..000000000 --- a/src/view/components/toolbar/clue/ClueSensorProperties.tsx +++ /dev/null @@ -1,216 +0,0 @@ -import { SENSOR_LIST } from "../../../constants"; -import { ISensorProps, ISliderProps } from "../../../viewUtils"; - -const CLUE_SLIDER_R: ISliderProps = { - axisLabel: "R", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_R, - step: 1, -}; - -const CLUE_SLIDER_G: ISliderProps = { - axisLabel: "G", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_G, - step: 1, -}; - -const CLUE_SLIDER_B: ISliderProps = { - axisLabel: "B", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_B, - step: 1, -}; -const CLUE_SLIDER_C: ISliderProps = { - axisLabel: "C", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_C, - step: 1, -}; - -export const CLUE_LIGHT_PROPERTIES: ISensorProps = { - LABEL: "Light Sensor", - sliderProps: [CLUE_SLIDER_R, CLUE_SLIDER_G, CLUE_SLIDER_B, CLUE_SLIDER_C], - unitLabel: "Lux", -}; - -// Range for magnet found here https://www.adafruit.com/product/4479 -const CLUE_MAGNET_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_X, - step: 0.1, -}; -const CLUE_MAGNET_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_Y, - step: 0.1, -}; -const CLUE_MAGNET_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_Z, - step: 0.1, -}; - -export const CLUE_MAGNET_PROPERTIES: ISensorProps = { - LABEL: "Magnetoscope", - sliderProps: [CLUE_MAGNET_X, CLUE_MAGNET_Y, CLUE_MAGNET_Z], - unitLabel: "μT", -}; -const CLUE_GYRO_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_X, - step: 0.1, -}; -const CLUE_GYRO_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_Y, - step: 0.1, -}; -const CLUE_GYRO_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_Z, - step: 0.1, -}; - -export const CLUE_GYRO_PROPERTIES: ISensorProps = { - LABEL: "Gyroscope", - sliderProps: [CLUE_GYRO_X, CLUE_GYRO_Y, CLUE_GYRO_Z], - unitLabel: "deg/s", -}; - -export const CLUE_HUMIDITY_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "H", - maxLabel: "Max", - maxValue: 100, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.HUMIDITY, - step: 0.1, - }, - ], - unitLabel: "%", -}; -export const CLUE__PROXIMITY_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "P", - maxLabel: "Max", - maxValue: 255, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.PROXIMITY, - step: 1, - }, - ], - unitLabel: "", -}; -export const CLUE_PRESSURE_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "P", - maxLabel: "Max", - maxValue: 1100, - minLabel: "Min", - minValue: 800, - type: SENSOR_LIST.PRESSURE, - step: 0.1, - }, - ], - unitLabel: "hPa", -}; -const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 1023, - minLabel: "Left", - minValue: -1023, - type: SENSOR_LIST.MOTION_X, - step: 0.1, -}; - -const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 1023, - minLabel: "Back", - minValue: -1023, - type: SENSOR_LIST.MOTION_Y, - step: 0.1, -}; - -const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 1023, - minLabel: "Up", - minValue: -1023, - type: SENSOR_LIST.MOTION_Z, - step: 0.1, -}; - -export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "m/s2", -}; - -const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 0.1, -}; - -export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", -}; diff --git a/src/view/components/toolbar/cpx/CpxModalContent.tsx b/src/view/components/toolbar/cpx/CpxModalContent.tsx deleted file mode 100644 index 55166eb2a..000000000 --- a/src/view/components/toolbar/cpx/CpxModalContent.tsx +++ /dev/null @@ -1,198 +0,0 @@ -import * as React from "react"; -import { SENSOR_LIST } from "../../../constants"; -import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; -import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; -import { GenericSliderComponent } from "../GenericSliderComponent"; -import { - FEATURE_REQUEST_ON_GITHUB, - IModalContent, - TRY_IT_MAKE_CODE, -} from "../SensorModalUtils"; -import * as SENSOR_PROPERTIES from "./CpxSensorProperties"; - -export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-gpio.description", - tryItDescription: "toolbar-gpio.tryItDescription", - components: undefined, - id: "GPIO", - }; -}; - -export const IR_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-ir-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-ir-sensor.description", - tryItDescription: "toolbar-ir-sensor.tryItDescription", - components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], - id: "IR", - }; -}; -export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const lightSensorValues = { - L: sensorValues[SENSOR_LIST.LIGHT], - }; - return { - descriptionTitle: "toolbar-light-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-light-sensor.description", - tryItDescription: "toolbar-light-sensor.tryItDescription", - components: [ - , - ], - id: "light_sensor", - }; -}; -export const MOTION_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const motionSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - descriptionTitle: "toolbar-motion-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-motion-sensor.description", - tryItDescription: "toolbar-motion-sensor.tryItDescription", - components: [ - , - TRY_IT_MAKE_CODE, - FEATURE_REQUEST_ON_GITHUB, - ], - id: "motion_sensor", - }; -}; -export const NEOP_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-neo-pixels.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-neo-pixels.description", - tryItDescription: "toolbar-neo-pixels.tryItDescription", - components: undefined, - id: "neon_pixel", - }; -}; -export const PUSHB_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-a-b-push.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-a-b-push.description", - tryItDescription: "toolbar-a-b-push.tryItDescription", - components: undefined, - id: "push_btn", - }; -}; -export const RED_LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-red-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-red-led.description", - tryItDescription: "toolbar-red-led.tryItDescription", - components: undefined, - id: "red_LED", - }; -}; -export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-sound-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-sound-sensor.description", - tryItDescription: "toolbar-sound-sensor.tryItDescription", - components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], - id: "sound_sensor", - }; -}; -export const SWITCH_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-slider-switch.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-slider-switch.description", - tryItDescription: "toolbar-slider-switch.tryItDescription", - components: undefined, - id: "slider_switch", - }; -}; -export const SPEAKER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-speaker.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-speaker.description", - tryItDescription: "toolbar-speaker.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "speaker", - }; -}; -export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-temperature-sensor.description", - descriptionTitle: "toolbar-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-temperature-sensor.tryItDescription", - }; -}; diff --git a/src/view/components/toolbar/cpx/CpxSensorProperties.tsx b/src/view/components/toolbar/cpx/CpxSensorProperties.tsx deleted file mode 100644 index f91f91469..000000000 --- a/src/view/components/toolbar/cpx/CpxSensorProperties.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import { SENSOR_LIST } from "../../../constants"; -import { ISensorProps, ISliderProps } from "../../../viewUtils"; - -const LIGHT_SLIDER_PROPS: ISliderProps = { - maxValue: 320, - minValue: 0, - minLabel: "Dark", - maxLabel: "Bright", - type: "light", - axisLabel: "L", - step: 1, -}; - -export const LIGHT_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Light sensor", - sliderProps: [LIGHT_SLIDER_PROPS], - unitLabel: "Lux", -}; - -const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 0.1, -}; -export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", -}; - -const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 78, - minLabel: "Left", - minValue: -78, - type: SENSOR_LIST.MOTION_X, - step: 1, -}; -const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 78, - minLabel: "Back", - minValue: -78, - type: SENSOR_LIST.MOTION_Y, - step: 1, -}; -const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 78, - minLabel: "Up", - minValue: -78, - type: SENSOR_LIST.MOTION_Z, - step: 1, -}; - -export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "Lux", -}; diff --git a/src/view/components/toolbar/microbit/MicrobitModalContent.tsx b/src/view/components/toolbar/microbit/MicrobitModalContent.tsx deleted file mode 100644 index 6d4ae76ef..000000000 --- a/src/view/components/toolbar/microbit/MicrobitModalContent.tsx +++ /dev/null @@ -1,187 +0,0 @@ -import * as React from "react"; -import { GESTURES_MICROBIT, SENSOR_LIST } from "../../../constants"; -import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; -import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; -import { GenericSliderComponent } from "../GenericSliderComponent"; -import { Gesture } from "../Gesture"; -import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; -import * as SENSOR_PROPERTIES from "./MicrobitSensorProperties"; - -export const ACCELEROMETER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - // this object will be accessed with the axis label - const accelerometerSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-accelerometer-sensor.description", - descriptionTitle: "toolbar-accelerometer-sensor.title", - id: "accelerometer", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-accelerometer-sensor.tryItDescription", - }; -}; -export const LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-led.description", - tryItDescription: "toolbar-microbit-led.tryItDescription", - components: undefined, - id: "microbit_LED", - }; -}; - -export const BUTTON_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-a-b-push.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-microbit-a-b-push.description", - tryItDescription: "toolbar-microbit-a-b-push.tryItDescription", - components: undefined, - id: "microbit_button", - }; -}; -export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-sound.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-sound.description", - tryItDescription: "toolbar-microbit-sound.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_sound", - }; -}; -export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-gpio.description", - tryItDescription: "toolbar-microbit-gpio.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_gpio", - }; -}; -export const COMPASS_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-compass-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-compass-sensor.description", - tryItDescription: "toolbar-microbit-compass-sensor.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_compass", - }; -}; -export const WIRELESS_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-wireless.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-wireless.description", - tryItDescription: "toolbar-microbit-wireless.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_wireless", - }; -}; -export const GESTURE_CONTENT = ( - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-gesture-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-microbit-gesture-sensor.description", - tryItDescription: "toolbar-microbit-gesture-sensor.tryItDescription", - components: [ - , - ], - id: "gesture_sensor", - }; -}; -export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const lightSensorValues = { - L: sensorValues[SENSOR_LIST.LIGHT], - }; - return { - descriptionTitle: "toolbar-light-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-light-sensor.description", - tryItDescription: "toolbar-light-sensor.tryItDescription", - components: [ - , - ], - id: "light_sensor", - }; -}; - -export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-temperature-sensor.description", - descriptionTitle: "toolbar-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-temperature-sensor.tryItDescription", - }; -}; diff --git a/src/view/components/toolbar/microbit/MicrobitSensorProperties.tsx b/src/view/components/toolbar/microbit/MicrobitSensorProperties.tsx deleted file mode 100644 index c32b00477..000000000 --- a/src/view/components/toolbar/microbit/MicrobitSensorProperties.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import { SENSOR_LIST } from "../../../constants"; -import { ISensorProps, ISliderProps } from "../../../viewUtils"; - -const LIGHT_SLIDER_PROPS: ISliderProps = { - maxValue: 255, - minValue: 0, - minLabel: "Dark", - maxLabel: "Bright", - type: "light", - axisLabel: "L", - step: 1, -}; - -export const LIGHT_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Light sensor", - sliderProps: [LIGHT_SLIDER_PROPS], - unitLabel: "Lux", -}; - -const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 1023, - minLabel: "Left", - minValue: -1023, - type: SENSOR_LIST.MOTION_X, - step: 1, -}; - -const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 1023, - minLabel: "Back", - minValue: -1023, - type: SENSOR_LIST.MOTION_Y, - step: 1, -}; - -const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 1023, - minLabel: "Up", - minValue: -1023, - type: SENSOR_LIST.MOTION_Z, - step: 1, -}; - -export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "m/s2", -}; - -const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 1, -}; - -export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", -}; diff --git a/src/view/constants.ts b/src/view/constants.ts deleted file mode 100644 index 56dda92af..000000000 --- a/src/view/constants.ts +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license.a - -// Key events -export const CONSTANTS = { - CURRENTLY_RUNNING: (file: string) => { - return `Currently running: ${file}`; - }, - DEVICE_NAME: { - CPX: "CPX", - MICROBIT: "micro:bit", - }, - ID_NAME: { - BUTTON_A: "BTN_A_OUTER", - BUTTON_AB: "BTN_AB_OUTER", - BUTTON_B: "BTN_B_OUTER", - PIN_A1: "PIN_A1", - PIN_A2: "PIN_A2", - PIN_A3: "PIN_A3", - PIN_A4: "PIN_A4", - PIN_A5: "PIN_A5", - PIN_A6: "PIN_A6", - PIN_A7: "PIN_A7", - PLAY_BUTTON: "play-button", - REFRESH_BUTTON: "refresh-button", - STOP_BUTTON: "stop-button", - SWITCH: "SWITCH", - }, - KEYBOARD_KEYS: { - A: "KeyA", - B: "KeyB", - C: "KeyC", - CAPITAL_R: "R", - CAPITAL_F: "F", - ENTER: "Enter", - S: "KeyS", - NUMERIC_ONE: "Digit1", - NUMERIC_TWO: "Digit2", - NUMERIC_THREE: "Digit3", - NUMERIC_FOUR: "Digit4", - NUMERIC_FIVE: "Digit5", - NUMERIC_SIX: "Digit6", - NUMERIC_SEVEN: "Digit7", - }, - FILES_PLACEHOLDER: - "The simulator will run the .py file you have focused on.", - SIMULATOR_BUTTON_WIDTH: 60, - TOOLBAR_INFO: `Explore what's on the board:`, - LED_TINT_FACTOR: 0.5, -}; -export const AB_BUTTONS_KEYS = { - BTN_A: "BTN_A", - BTN_B: "BTN_B", - BTN_AB: "BTN_AB", -}; -export const BUTTON_CLASSNAME = { - ACTIVE: "sim-button-group", - DEACTIVATED: "sim-button-group-deactivated", -}; -export const BUTTON_STYLING_CLASSES = { - DEFAULT: "sim-button-outer", - KEYPRESSED: "sim-button-key-press", -}; -export const CLUE_LEDS_COLORS = { - WHITE_LEDS_OFF: "#ffde00", - WHITE_LEDS_ON: "white", - RED_LED_OFF: "#808080", - RED_LED_ON: "red", -}; -export enum DEVICE_LIST_KEY { - CPX = "CPX", - MICROBIT = "micro:bit", - CLUE = "CLUE", -} - -// Pauses on Debug mode alter the state of the view -export enum VIEW_STATE { - PAUSE = "debug-pause", - RUNNING = "running", -} - -// -export enum WEBVIEW_MESSAGES { - SWITCH_DEVICE = "switch-device", - REFRESH_SIMULATOR = "refresh-simulator", - TOGGLE_PLAY_STOP = "toggle-play-stop", - BUTTON_PRESS = "button-press", - SENSOR_CHANGED = "sensor-changed", - GESTURE = "gesture", - SLIDER_TELEMETRY = "slider-telemetry", -} - -export enum VSCODE_MESSAGES_TO_WEBVIEW { - SET_DEVICE = "set-device", - PAUSE_DEVICE = "pause-device", - RUN_DEVICE = "run-device", - RESET = "reset-state", - CURRENT_FILE = "current-file", - SET_STATE = "set-state", -} -export enum DEBUG_COMMANDS { - STACK_TRACE = "stackTrace", - CONTINUE = "continue", - DISCONNECT = "disconnect", -} -export enum SENSOR_LIST { - TEMPERATURE = "temperature", - LIGHT = "light", - ACCELEROMETER = "accelerometer", - MOTION_X = "motion_x", - MOTION_Y = "motion_y", - MOTION_Z = "motion_z", - LIGHT_R = "light_r", - LIGHT_G = "light_g", - LIGHT_B = "light_b", - LIGHT_C = "light_c", - HUMIDITY = "humidity", - PRESSURE = "pressure", - PROXIMITY = "proximity", - MAGNET_X = "magnet_x", - MAGNET_Y = "magnet_y", - MAGNET_Z = "magnet_z", - GYRO_X = "gyro_x", - GYRO_Y = "gyro_y", - GYRO_Z = "gyro_z", -} - -export const GESTURES_MICROBIT = [ - "shake", - "up", - "down", - "left", - "right", - "face up", - "face down", - "freefall", - "3g", - "6g", - "8g", -]; -export const GESTURES_CLUE = ["up", "down", "left", "right", "shake"]; - -export enum WEBVIEW_ATTRIBUTES_KEY { - INITIAL_DEVICE = "initial_device", - TYPE = "webview_type", -} -export enum WEBVIEW_TYPES { - SIMULATOR = "simulator", - GETTING_STARTED = "getting_started", -} -export const DEFAULT_IMG_CLUE = `/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAEBAQEBAQEBA -QEBAQEBAQICAQEBAQMCAgICAwMEBAMDAwMEBAYFBAQFBAMDBQcFBQYGBgYGBAUHBwcGBwYGBgb/2wBDAQEBAQEBAQMCAgMGBAMEB -gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgb/wAARCAJYAlgDASIAAhEBAxEB/8QAHwAAA -QUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0Kxw -RVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl -5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBA -QAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRC -hYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkp -aanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD/AD/6KKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP//Z`; - -export default CONSTANTS; diff --git a/src/view/container/device/Device.spec.tsx b/src/view/container/device/Device.spec.tsx deleted file mode 100644 index 491d4e2a5..000000000 --- a/src/view/container/device/Device.spec.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { DEVICE_LIST_KEY } from "../../constants"; -import { Device } from "./Device"; - -describe("Device component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); diff --git a/src/view/container/device/Device.tsx b/src/view/container/device/Device.tsx deleted file mode 100644 index dd30d2dc6..000000000 --- a/src/view/container/device/Device.tsx +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { Clue } from "../../components/clue/Clue"; -import { Cpx } from "../../components/cpx/Cpx"; -import { Microbit } from "../../components/microbit/Microbit"; -import { DEVICE_LIST_KEY } from "../../constants"; - -interface IProps { - currentSelectedDevice: string; -} -// Container to switch between multiple devices - -export class Device extends React.Component { - constructor(props: IProps) { - super(props); - } - render() { - const { currentSelectedDevice } = this.props; - - return ( -
- - {loadSelectedDevice(currentSelectedDevice)} - -
- ); - } -} -const loadSelectedDevice = (currentSelectedDevice: string) => { - switch (currentSelectedDevice) { - case DEVICE_LIST_KEY.CPX: - return ; - case DEVICE_LIST_KEY.MICROBIT: - return ; - case DEVICE_LIST_KEY.CLUE: - return ; - default: - return null; - } -}; diff --git a/src/view/container/device/__snapshots__/Device.spec.tsx.snap b/src/view/container/device/__snapshots__/Device.spec.tsx.snap deleted file mode 100644 index cd2e25d19..000000000 --- a/src/view/container/device/__snapshots__/Device.spec.tsx.snap +++ /dev/null @@ -1,3240 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Device component should render correctly 1`] = ` -
-
-
- The simulator will run the .py file you have focused on. -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (0,0) - - - - - - (1,0) - - - - - - (2,0) - - - - - - (3,0) - - - - - - (4,0) - - - - - - (0,1) - - - - - - (1,1) - - - - - - (2,1) - - - - - - (3,1) - - - - - - (4,1) - - - - - - (0,2) - - - - - - (1,2) - - - - - - (2,2) - - - - - - (3,2) - - - - - - (4,2) - - - - - - (0,3) - - - - - - (1,3) - - - - - - (2,3) - - - - - - (3,3) - - - - - - (4,3) - - - - - - (0,4) - - - - - - (1,4) - - - - - - (2,4) - - - - - - (3,4) - - - - - - (4,4) - - - - - - - - - - - - P0, ANALOG IN - - - - - P1, ANALOG IN - - - - - P2, ANALOG IN - - - - - P3, ANALOG IN, LED Col 1 - - - - - P4, ANALOG IN, LED Col 2 - - - - - P5, BUTTON A - - - - - P6, LED Col 9 - - - - - P7, LED Col 8 - - - - - P8 - - - - - P9, LED Col 7 - - - - - P10, ANALOG IN, LED Col 3 - - - - - P11, BUTTON B - - - - - P12, RESERVED ACCESSIBILITY - - - - - P13, SPI - SCK - - - - - P14, SPI - MISO - - - - - P15, SPI - MOSI - - - - - P16, SPI - Chip Select - - - - - P17, +3v3 - - - - - P18, +3v3 - - - - - P19, I2C - SCL - - - - - P20, I2C - SDA - - - - - GND - - - - - GND - - - - - +3v3 - - - - - GND - - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
-
-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-`; diff --git a/src/view/context.ts b/src/view/context.ts deleted file mode 100644 index 24fafc556..000000000 --- a/src/view/context.ts +++ /dev/null @@ -1,6 +0,0 @@ -import * as React from "react"; -import { VIEW_STATE } from "./constants"; - -// View is running by default - -export const ViewStateContext = React.createContext(VIEW_STATE.RUNNING); diff --git a/src/view/index.css b/src/view/index.css deleted file mode 100644 index 918c31f9e..000000000 --- a/src/view/index.css +++ /dev/null @@ -1,13 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Joti+One"); - -body { - margin: 0; - padding: 0; - font-family: sans-serif; -} - -html, -body { - overflow: hidden; - height: 100%; -} diff --git a/src/view/index.tsx b/src/view/index.tsx deleted file mode 100644 index 32e7400b1..000000000 --- a/src/view/index.tsx +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import App from "./App"; - -import "./index.css"; - -const messageEn = require("./translations/en.json"); -const locale = "en"; - -const message = { - en: messageEn, -}; -ReactDOM.render( - - - , - document.getElementById("root") -); diff --git a/src/view/pages/__snapshots__/gettingStarted.spec.tsx.snap b/src/view/pages/__snapshots__/gettingStarted.spec.tsx.snap deleted file mode 100644 index 18dac92ce..000000000 --- a/src/view/pages/__snapshots__/gettingStarted.spec.tsx.snap +++ /dev/null @@ -1,901 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`GettingStartedPage component should render correctly 1`] = ` -
-

- Getting started -

- -

- Copy these snippets of code to a .py file and run the simulator -

-
-

- Tutorial for Circuit Playground Express -

-

- > Import the Circuit Playground library to use it (This is required) -

- -
-        from adafruit_circuitplayground import cp
-      
-
-

- > Turn on the little red LED -

- -
-        while True:
-      
-
-            cp.red_led = True
-      
-
-

- > Turn up red LED when button A is clicked -

- -
-        while True:
-      
-
-            if cp.button_a:
-      
-
-                cp.red_led = True
-      
-
-

- > Light up the first neopixel blue -

- -
-        cp.pixels[0] = (0, 0, 255)
-      
-
-

- And much more! These links have more tutorials: -

-

- - Getting started with CPX and CircuitPython - -

-

- - More example code - -

-

- Keyboard Shortcuts -

-
    -
  • - Push Button: - - A - - for Button A, - - B - - for Button B, - - C - - for Buttons A & B -
  • -
  • - Refresh the simulator: - - Shift - - + - - R - -
  • -
  • - Run the simulator: - - Shift - - + - - F - -
  • -
-
-
-

- Tutorial for micro:bit -

-

- > Import the micro:bit library to use it (This is required) -

- -
-        from microbit import *
-      
-
-

- > Light up your micro:bit with love by showing a heart -

- -
-        display.show(Image.HEART)
-      
-
-

- > Use your micro:bit to tell the world how you’re feeling -

- -
-        while True:
-      
-
-            if button_a.is_pressed():
-      
-
-                display.show(Image.HAPPY)
-      
-
-            if button_b.is_pressed():
-      
-
-                display.show(Image.SAD)
-      
-
-

- > Read then display the temperature -

- -
-        while True:
-      
-
-            temp = temperature()
-      
-
-            display.show(temp)
-      
-
-

- > Display your name with the scroll functionality -

- -
-        while True:
-      
-
-            display.show("Your name")
-      
-
-

- And much more! These links have more tutorials: -

-

- - Microbit Tutorials - -

-

- - Microbit official documentation - -

-

- Keyboard Shortcuts -

-
    -
  • - Push Button: - - A - - for Button A, - - B - - for Button B, - - C - - for Buttons A & B -
  • -
  • - Refresh the simulator: - - Shift - - + - - R - -
  • -
  • - Run the simulator: - - Shift - - + - - F - -
  • -
-
-
-

- Tutorial for CLUE -

-

- > Import the the main CLUE library (This is required) -

- -
-        from adafruit_clue import clue
-      
-
-

- > Display text on the CLUE and change the text when a button is pressed -

- -
-        clue_data = clue.simple_text_display(title="CLUE!")
-      
-
-        while True:
-      
-
-            clue_data[1].text = "Hello World!"
-      
-
-            if clue.button_a:
-      
-
-                clue_data[5].text = "A is pressed!"
-      
-
-            else:
-      
-
-                clue_data[5].text = "A is not pressed!"
-      
-
-            clue_data.show()
-      
-
-

- > Create a slide show on the CLUE -

-

- Make sure there are bitmap (.bmp) pictures of your choice in the same directory as the code file. -

- -
-        import board
-      
-
-        from adafruit_slideshow import SlideShow
-      
-
-         
-      
-
-        slideshow = SlideShow(clue.display, auto_advance=True, dwell=3, fade_effect=True)
-      
-
-        while slideshow.update():
-      
-
-            pass
-      
-
-

- > Light up the neopixel green -

- -
-        clue.pixel.fill(clue.GREEN)
-      
-
-

- > Display sensor data on the CLUE -

- -
-        clue_data = clue.simple_text_display(title="CLUE Sensor Data!", title_scale=2)
-      
-
-        while True:
-      
-
-            clue_data[0].text = "Acceleration: 
-        {}
-         
-        {}
-         
-        {}
-        ".format(*clue.acceleration)
-      
-
-            clue_data[1].text = "Gyro: 
-        {}
-         
-        {}
-         
-        {}
-        ".format(*clue.gyro)
-      
-
-            clue_data[2].text = "Magnetic: 
-        {}
-         
-        {}
-         
-        {}
-        ".format(*clue.magnetic)
-      
-
-            clue_data[3].text = "Pressure: 
-        {}
-        hPa".format(clue.pressure)
-      
-
-            clue_data[4].text = "Altitude: 
-        {}
-        m".format(clue.altitude)
-      
-
-            clue_data[5].text = "Temperature: 
-        {}
-        C".format(clue.temperature)
-      
-
-            clue_data[6].text = "Humidity: 
-        {}
-        %".format(clue.humidity)
-      
-
-            clue_data[7].text = "Proximity: 
-        {}
-        ".format(clue.proximity)
-      
-
-            clue_data[8].text = "Gesture: 
-        {}
-        ".format(clue.gesture)
-      
-
-            clue_data[9].text = "Color: R: 
-        {}
-         G: 
-        {}
-         B: 
-        {}
-         C: 
-        {}
-        ".format(*clue.color)
-      
-
-            clue_data[10].text = "Button A: 
-        {}
-        ".format(clue.button_a)
-      
-
-            clue_data[11].text = "Button B: 
-        {}
-        ".format(clue.button_b)
-      
-
-            clue_data.show()
-      
-
-

- > Draw a blue rectangle on the screen -

- -
-        import board
-      
-
-        import displayio
-      
-
-        from adafruit_display_shapes.rect import Rect
-      
-
-         
-      
-
-        splash = displayio.Group(max_size=20)
-      
-
-        board.DISPLAY.show(splash)
-      
-
-         
-      
-
-        rect = Rect(80, 20, 41, 41, fill=0x0000FF)
-      
-
-        splash.append(rect)
-      
-
-

- And much more! These links have more tutorials: -

-

- - Getting started with CLUE and CircuitPython - -

-

- - More example code - -

-

- Keyboard Shortcuts -

-
    -
  • - Push Button: - - A - - for Button A, - - B - - for Button B, - - C - - for Buttons A & B -
  • -
  • - Refresh the simulator: - - Shift - - + - - R - -
  • -
  • - Run the simulator: - - Shift - - + - - F - -
  • -
  • - Capacitive Touch Sensor: - - Shift - - + - - 1 - - ~ - - 7 - - for GPIO pins A1 - A7 -
  • -
  • - Slider Switch: - - Shift - - + - - S - -
  • -
-
-
-

- Tutorial for using the debugger -

-

- > Enter debug mode -

-

- Press - - F5 - - or go to - - Run -> Start Debugging - -

- Start debugging -

- > Set a breakpoint or multiple breakpoints -

-

- Stopping at a breakpoint pauses the program at that particular place. -

-

- Use the debug toolbar or the shortcuts below -

- Debugger Toolbar -
    -
  • - - F5 - - to continue / pause -
  • -
  • - - F10 - - to step over (execute current statement and all functions that it calls and stop before the next statement) -
  • -
  • - - F11 - - to step into (stop at first statement of first function called from first line) -
  • -
  • - - Shift - - + - - F11 - - to step out (run current function to end) -
  • -
  • - - Ctrl - - + - - Shift - - + - - F11 - - to restart -
  • -
  • - - Shift - - + - - F5 - - to stop -
  • -
- debugging experience -

- > Observe the device's state on the "Variables" tab on the left when stopped at a breakpoint -

- Debugger Variables -

- And much more! These links have more tutorials: -

-

- - Learn more about debugging in VS Code - -

-
-
-`; diff --git a/src/view/pages/gettingStarted.css b/src/view/pages/gettingStarted.css deleted file mode 100644 index d312598b1..000000000 --- a/src/view/pages/gettingStarted.css +++ /dev/null @@ -1,56 +0,0 @@ -.inv { - display: none; -} - -.codeText { - overflow-x: auto; - white-space: pre-wrap; - word-wrap: break-word; -} - -li:not(:last-child) { - margin-bottom: 6px; -} - -.normalFontWeight { - font-weight: normal; -} - -.deviceSelector { - width: 250px; - border: 1px solid var(--vscode-dropdown-border); - background-color: var(--vscode-dropdown-background); - color: var(--vscode-dropdown-foreground); - margin: 0 0 5px; - padding: 8px; - border-radius: 5px; - font-size: 12px; - padding-right: 30px; -} - -.deviceSelector optgroup { - background-color: var(--vscode-dropdown-listBackground); - color: var(--vscode-dropdown-foreground); -} - -.deviceSelector option { - background-color: var(--vscode-dropdown-listBackground); - color: var(--vscode-dropdown-foreground); -} - -.codeBox { - display: block; - width: 90%; - margin: 10px; - padding: 15px; - text-align: left; - background: none; - border: 1px solid grey; - border-radius: 4px; - background-color: var(--vscode-textCodeBlock-background); -} - -.container { - text-align: left; - padding: 0 10px 20px 10px; -} diff --git a/src/view/pages/gettingStarted.spec.tsx b/src/view/pages/gettingStarted.spec.tsx deleted file mode 100644 index 278d5ed4b..000000000 --- a/src/view/pages/gettingStarted.spec.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { GettingStartedPage } from "./gettingStarted"; - -describe("GettingStartedPage component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); diff --git a/src/view/pages/gettingStarted.tsx b/src/view/pages/gettingStarted.tsx deleted file mode 100644 index 2477594e7..000000000 --- a/src/view/pages/gettingStarted.tsx +++ /dev/null @@ -1,281 +0,0 @@ -import * as React from "react"; -import "./gettingStarted.css"; - -export class GettingStartedPage extends React.Component { - private selectRef: React.RefObject = React.createRef(); - - componentDidMount() { - this.selectRef.current?.addEventListener("change", (event: any) => { - const visibleElement = document.querySelector(".visibleElement"); - const target = document.getElementById(event!.target!.value); - if (visibleElement !== null) { - visibleElement.className = "inv"; - } - if (target !== null) { - target.className = "visibleElement"; - } - }); - } - - render() { - return ( - -
-

Getting started

- -

- Copy these snippets of code to a .py file and run the - simulator -

- {/* prettier-ignore */} -
-

Tutorial for Circuit Playground Express

-

- > Import the Circuit Playground library to use it (This is required) -

- -
from adafruit_circuitplayground import cp
-
-

> Turn on the little red LED

- -
while True:
-
    cp.red_led = True
-
-

> Turn up red LED when button A is clicked

- -
while True:
-
    if cp.button_a:
-
        cp.red_led = True
-
-

> Light up the first neopixel blue

- -
cp.pixels[0] = (0, 0, 255)
-
-

And much more! These links have more tutorials:

-

- - Getting started with CPX and CircuitPython - -

-

- - More example code - -

-

Keyboard Shortcuts

-
    -
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • -
  • Refresh the simulator: Shift + R
  • -
  • Run the simulator: Shift + F
  • -
-
- {/* prettier-ignore */} -
-

Tutorial for micro:bit

-

- > Import the micro:bit library to use it (This is - required) -

- -
from microbit import *
-
-

- > Light up your micro:bit with love by showing a - heart -

- -
display.show(Image.HEART)
-
-

- > Use your micro:bit to tell the world how you’re - feeling -

- -
while True:
-
    if button_a.is_pressed():
-
        display.show(Image.HAPPY)
-
    if button_b.is_pressed():
-
        display.show(Image.SAD)
-
-

> Read then display the temperature

- -
while True:
-
    temp = temperature()
-
    display.show(temp)
-
-

- > Display your name with the scroll functionality -

- -
while True:
-
    display.show("Your name")
-
-

And much more! These links have more tutorials:

-

- - Microbit Tutorials - -

-

- - Microbit official documentation - -

-

Keyboard Shortcuts

-
    -
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • -
  • Refresh the simulator: Shift + R
  • -
  • Run the simulator: Shift + F
  • -
-
- {/* prettier-ignore */} -
-

Tutorial for CLUE

-

- > Import the the main CLUE library (This is - required) -

- -
from adafruit_clue import clue
-
-

- > Display text on the CLUE and change the text when - a button is pressed -

- -
-                                clue_data = clue.simple_text_display(title="CLUE!")
-                            
-
while True:
-
    clue_data[1].text = "Hello World!"
-
    if clue.button_a:
-
        clue_data[5].text = "A is pressed!"
-
    else:
-
        clue_data[5].text = "A is not pressed!"
-
    clue_data.show()
-
-

> Create a slide show on the CLUE

-

- Make sure there are bitmap (.bmp) pictures of your choice in the same directory - as the code file. -

- -
import board
-
from adafruit_slideshow import SlideShow
-
 
-
slideshow = SlideShow(clue.display, auto_advance=True, dwell=3, fade_effect=True)
-                            
-
while slideshow.update():
-
    pass
-
-

> Light up the neopixel green

- -
clue.pixel.fill(clue.GREEN)
-
-

> Display sensor data on the CLUE

- -
clue_data = clue.simple_text_display(title="CLUE Sensor Data!", title_scale=2)
-
while True:
-
    clue_data[0].text = "Acceleration: {"{}"} {"{}"} {"{}"}".format(*clue.acceleration)
-
    clue_data[1].text = "Gyro: {"{}"} {"{}"} {"{}"}".format(*clue.gyro)
-
    clue_data[2].text = "Magnetic: {"{}"} {"{}"} {"{}"}".format(*clue.magnetic)
-
    clue_data[3].text = "Pressure: {"{}"}hPa".format(clue.pressure)
-
    clue_data[4].text = "Altitude: {"{}"}m".format(clue.altitude)
-
    clue_data[5].text = "Temperature: {"{}"}C".format(clue.temperature)
-
    clue_data[6].text = "Humidity: {"{}"}%".format(clue.humidity)
-
    clue_data[7].text = "Proximity: {"{}"}".format(clue.proximity)
-
    clue_data[8].text = "Gesture: {"{}"}".format(clue.gesture)
-
    clue_data[9].text = "Color: R: {"{}"} G: {"{}"} B: {"{}"} C: {"{}"}".format(*clue.color)
-
    clue_data[10].text = "Button A: {"{}"}".format(clue.button_a)
-
    clue_data[11].text = "Button B: {"{}"}".format(clue.button_b)
-
    clue_data.show()
-
-

> Draw a blue rectangle on the screen

- -
import board
-
import displayio
-
from adafruit_display_shapes.rect import Rect
-
 
-
splash = displayio.Group(max_size=20)
-
board.DISPLAY.show(splash)
-
 
-
rect = Rect(80, 20, 41, 41, fill=0x0000FF)
-
splash.append(rect)
-
-

And much more! These links have more tutorials:

-

- - Getting started with CLUE and CircuitPython - -

-

- - More example code - -

-

Keyboard Shortcuts

-
    -
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • -
  • Refresh the simulator: Shift + R
  • -
  • Run the simulator: Shift + F
  • -
  • Capacitive Touch Sensor: Shift + 1 ~ 7 for GPIO pins A1 - A7
  • -
  • Slider Switch: Shift + S
  • -
-
- {/* prettier-ignore */} -
-

Tutorial for using the debugger

-

- > Enter debug mode -

-

Press F5 or go to Run -> Start Debugging

- Start debugging -

- > Set a breakpoint or multiple breakpoints -

-

Stopping at a breakpoint pauses the program at that particular place.

-

Use the debug toolbar or the shortcuts below

- Debugger Toolbar -
    -
  • F5 to continue / pause
  • -
  • F10 to step over (execute current statement and all functions that it calls and stop before the next statement)
  • -
  • F11 to step into (stop at first statement of first function called from first line)
  • -
  • Shift + F11 to step out (run current function to end)
  • -
  • Ctrl + Shift + F11 to restart
  • -
  • Shift + F5 to stop
  • -
- debugging experience -

- > Observe the device's state on the "Variables" tab on the left when stopped at a breakpoint -

- Debugger Variables -

And much more! These links have more tutorials:

-

- - Learn more about debugging in VS Code - -

-
-
-
- ); - } -} diff --git a/src/view/pages/gettingStartedPictures/debugger/debugger_vars.png b/src/view/pages/gettingStartedPictures/debugger/debugger_vars.png deleted file mode 100644 index 267f461ef3e2c2a5828a1db3bff454c7eecff476..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44993 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

IqyB?WD=aWcD#Ji7HNax7-GQ>11cdloxpL( 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

xd9?>F(T_Er zym&K6!IPx|%r~`jNlxgr@++cA^3^`0!xnX9hx}CT^9xi!M9~{wl@Qd*SYsx=srl9& zP*Rs}JAG;(NUO3Eh~;C0-sF6lkXwAFpjV%NMm6_E{U1RlmjaA4$81yiQ)<&4X?7!D ztUsiguns|DPxLe)QPHXcM$}(%cg&Eq_qnX3Ql(}OR6|t{D|>1^RBjzqb%ywi4isbNCmq@_k;cN=*?}NV`Gw-7SU#iFQ~1r6ds)m zo%Yp0=&$v)?;C%%nz|CY@bf9<(*GXBGTjL-T@_wJaPU#9$=e3N;FeU&f@?oCnrsbg zMGY{J<)tElWJj95KU|ym4g!&VoDI;Ok(D7gi;Gq6)h#HabS?Xe-`I zXsYbuFDoWj12&`dk&5wlNg~=R?Pte=vZj&@6;*<|h7!O@O&Rc*;TtrDj@Ck{wT~vxti|US;l*H`d2!K#DWJO1$O$=Mwb=NJipO1 zE!S|Zs%8Ds#XC{xeL@_gPChH7mod7YbqDCH(z1=Fb>em_-GU)k?gcYVo8#c9K{*r- z-ZJ9A@87>8Y)rf259AuNP_M%86@53TFgJ!YHc#sCd~=);R5Y$%!+AsFRs#N_T|;=w zhvLp4G5v7co9QXJb@V1Ln?iFRs1}MfFvCQX6sQXEd);5vM^(HGEOv z{=?4KNrW&1E-`qlcn>gD`-_wde_CircU{Z8UWqQ8$=Ff^g5cwDz|@xgYrGN5e44Z@ z1;{B&6WUwnJ~ChSX@tzJJ=HW=gTdddav8w@TkP(2Jd|e!dGPxqojZadIaEcI5~uwP zo+`VCpCMs0F=b@#TPWFaY<4Lu4+`1I@Rh`zIHp!U=ShE-+o8iV$ihVR;?@FyY+(h@ z0NoVg&DKcag|TNJepMtk1u{OU4dzn4TEyzW_K7^#> zy_ko-goZKln0wR7-OR7~QG|(n3t`3RRngc}HlSxf1m&q2>9QAB(;5GGx%Si>REa?# zvA^hpeatzI1H0yLFpg?b2oui-RxdY{Ei82lgkmF8Jpf?q$}VT8OF$Y?pAC4y{8yE; zlP&BIAaNBu%5EH8KY?BC`|t)B&&OG!EGi`(+&CU|4H}!4l#m->A`;^PdQ*mE(~71A}VnT4>gLpJi*_C6?&>?GPci|)-?zCgb2OA z6C2y{6F0EtGI~xU;oSW29$Ed*&kFNE2n$&5`S-XumAr_m>C;f#LTa+yjwW4-KJyLO zF&I;{FcOVDyzL09#J;H_?Xo5@q7cy#T ze+DT>O8)aF&#!#<{TcEu7|!byTGjZ87)vKqW zfQ(_I1_}gx5BA$re?5DG`3ALo2A<7w@z%XZaBqbxSSXEr9T3GccZoAS@7A2Pm257f z3_%Z2iU5~=HZGrvq~(NXbppD7y*Tf>5#Na|&h5l<+sc|E9_Vvvsxz!FJyKZ5>bl>` zZw~rom|rP>@E*Q2pXR%E8q3*_i0XB&IeKxHn{j@Ze_vYwQd#3}aWy)}EKn5ZB$uwn z(93#Ut)%W33i9NiCN@D<#4_$QpMCSM<9|2(Jk~xGt{Id%!hu4k+OmW~=j^VArGniu z$ZD5XT$y{_A)WH#27MsIjqw*3m^;pp%zm4qHxi2@-5!0|9xVDL%*&;s;tJEuAPFU z)({>3Q!77xt79>Kg1h^v)C}}bfN*y`ypimRDGI%~xo&P>%s#mzZtF#vZXQ2KOE!%b zd)R8q$VYp>YlZ&K(LGb$@OgJ&w{z`Bn>fCDj zjZ=W`)Z?=#()dY^5x2{ONBW3r%!2=A}(grcT9p<3W96-+Ol5bc}# z>rO-Ac(yNM6n@DtcxkFk8gYH_7-wo0lzY2)8GZgiE)5dvDqf?xF>_0^9d5i|J>(O3 zE4HT2US&3xhgx+LRLr;L*1Ym1E2c}lLT@NymyMzA8UAQ^7=KS-{xtxIP)_R7g)}n7 z-}uEyu!|PDwrp?4a8QBOJ=j9(NJF1FQ)qK9@ZM0su4?toq+5d+#a|vuktAZsV2++7ww+q+$*klO!ojhTGyxi(?+&=+#<3n%& diff --git a/src/view/pages/gettingStartedPictures/debugger/debugging.gif b/src/view/pages/gettingStartedPictures/debugger/debugging.gif deleted file mode 100644 index 5d42a436ae20b4fc76a2c10f2f78716dd566fdc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 652131 zcmeF$?rv!i5LmjUy9K0KIz_rcKw7#Rq(Nn$^ZGlU z`}^vcc{}r)&&)9jN>CwTOBee?CqkjUXW*kN}iKfKLE45q9+dyurbQdSbfk zVCzfcgv{c7&;|WR5g*iiiSJ%d;B7=uI!64T#6%Jf8j_D@WTd2I`5WX^lobCFm8T@9 zp!^S&F(p+QrJ)UF7@X?A5vv82Nj6oG6*UznHI*VYl^gYcXu_x=G}H`S)a(k>f~nM= zQ`8~BG@7-LXc@>z94+%F21-gsMn)!>12YvhGZPcDWhQe_0}Bg3tH%r*D+>pgK8F(f zJ2KjL{|R^C7D(a!kGwXY_y>M|UcoqTq5s6S3u7t^i--s-ii(kuiJAI|CHaesi%YUI zO9}}{zNeM6u$T1Ck^YZkvg~IkIayhGKOLw76dK+HP5q>-tfQh#s*;(ap1Y|2b@#oR z`uh*I8hRR_6@IM!5s2&;?CBZ8$`leD5{d{7qoRuRHH{1piwbgx>Zp$D z-iUV8h-sXT{ZEEz{8Un+xK!eQG8q#qtJ6OAq@|~2^ta@cG3KoQ$<56z5QP+2&=d?W z6}bu&7Z;a!NR}3tmX7t7X+g@d&?|%JDyyn0dnX&hsNrGu@P-EX^dx*{t*NQGXNlQ`1P()4gTW>#ILf{AXup=5n3p zj*k{biWe3Z7D2$JX4ukv%hKY+a;)X@{NS1h&sO25?Y5kq|6H8z4H6v?A{|D$oeb4q z+}&PcppY$AJ-@uXJly=d8+i>0dEG=pAP}?&Y;}1ZZCPmzc^*zK z6y*QnK>Lh}hJl2F#Qwi*{4XZa|1174B>xwZ|6fA_L?9&sDHY+x{oz0YR+BM!$zU{y zUO8W}v2-||l-Fr}tntg}XNYVZrBYMbcp9^IwaIu>`D7NC^+di>bH#L?kk{$@c(c6% zu|zl)m2ykv+!w_(R?~@=s-Isqz9<(cw^lFK7^DEECt7Qk8!QIns8rf&SDPJvR+~{eRtXcP^)&pcLrk!*vzIn8uvzn&}0i$JDUzBvw592 zr#hSM>xyLKsnxn#PJUKu*O;m4@SH8fttSiBy4x;(b#!;lOn0|mZS{p?)2RQwb&FG{ zyB6Xp>$p9d{i0H&{;lgiew2|q7DS5@aj-lXkDz(q+w**TjA0+`&w%821)5N`DD3V1 z_vh*MZ0iT23@hP6e!I}mRtgE3;2&e!>TY;4c%gQb6wg_>@2mrj;)x@ zdcCcg`KZ0^3q^T`kWt7YW>Jy>nByDCv@xI}m~DsDvAlK^T~(PT=jwi%RTSY#nI#?H zLAf4Q`Y>aTUCVx1mV2W{E@5IWOAb2>Vfa=$%>mP{%GY;*C4=5o#4(NIdBU+8(yyG7 zQ*k2#s=#R!p#()(+&H}VSL`-u{ka)6%INA6!J+i)Aw`a`fUhY+dB^V0Vb{k`akG`p zT`l&BlV)LWzY+ar2B3sOxim1NJxQd2(CfZRn4%qDISm#!+x!4-r*ZNiX`*s1*pMrA zxY|fdj$8GMuWE85uUcs>IA;3=JOtqQ$dpTW6~PY8RL8Mx<|fI6vXod@p;C9h4OwFnT#HI0DKJ2;qa?{;!==CPi@}oun}6Mzad;Vik2U=a@|2xXzT;Mf zV|#b2rkOM~D#HgUw68>_gEXf*YFt3K5xTBJyJ3QIZWO0R={8VBkk-TeYM^tSn!<;$ zyv4S>(IQCitHNFvJfQlDhN+_yJgq+8@dxi2nuHY zdMJeNg@x07Bb7!jG*d{7VTKmgO|uU@CKfhu#7~ea!P0hMJaC*b`?!{WM2!C(bj^km zN{8>K42obNOYl*dg~%hqmYb3^U3Ag{$e=Mo$!exDARVivDu#^aSdGsR?ON@t{K{%u zDo$1H^IS3sJ08|*Oxpsf@NYxe;8a6Z-I>7oh6MK-rg=Are!|!_NDC^!dY**BvN?k4 zIJ!pk9-7*f4Xw|X7xNv6upC$*%+rCU2(zm=@$E?^XOD4;{Ggk?wW<&z!(wd0(zZC= zHzW3IFZx&)7!Y`%78M$y?y{>n>%_Q{sz*>oTjr!xYTIei3Hpvpi?vS2B*(5uV!1i* z;@4a#?c^AH7@?7a)@b(}T%nT0MPPKz3q+-8>KFmb#bBi{$s;XeUZz|ZxN_6N@pxjD zI<6!ACm4$CvJtew&uNOZPtshC+XXm;V?H6ZRK$tQq6TV80r-}56UwVRN-$;B?=@qx z&tn>UC7Npd*g3fZrwr0MC%U*7L&K`*wTz~vN_5kTbu$JEB3cU-R-R;sEsAe7ZD;5n z6ABa(`{pA8=2RjGsUglju^i%#l@-;ysx|wXSpbzJO)Ro1E?-P5Qy#*12i0R*Odx|# zO>`yf&dT59=C!LAYFNe1%t9SeM`EvY!?A~%fc?!{=_(NaZNrB$bUr0UH~Z9^oOftE zZLI}o_Sq|W*3F$QPWTb-C@Hm_#}AbsQdG3GQ78c@c`H-C10Z{pn#D2xm<1z%k=WkB z57aZsB}B!8Tk3^jTj^pit;I!SA_t}8y)tKE)kF5f;GuLFwjo5xt1(>EWHs1v-F~Jm z#Pv+hnP9bd$EY1%ZCm>^Gomt(qUWBUXd&omVE7EK$JpUf{7bqF91ve}clp9(@#AR2 zW4x&|l)rvfF0anWNU*!o31yDXUt%TfJ~x{PXf;SN`6f=g&#Rlmtf5=YKVXIJMpaQf zoHb2U$*JgXSqWGuba3`JTQS-WOd2;G8AR3!aU;^!ipA1R1f)Xvi4--dGUwvbJqncz zzIGcNh}qbtTjAwZzmIJ#Q&r+Cm5icpx~vk@>yIx{zB9NK3K$XO1SfMJG@2ON@n~P- zA<~7rH&R8*m*Qb3R+lf;86iEh90eJ4j^b6xCCZBJBkW`TO0sN%>}HM}zJXE`w(a$p z#`j7hUFNc3KSSLyC!r;ThJU>2L*>l0{8oT}MD1-Ed)j((*&;64mhpGnBEG0`xFFfM z{8(FRZBcs3?ou}1j&j^WH2%mi|KqYYW@}hgWEFuL+*e`yySd67?y90rA zXK9XIe;9QZ7>EiQ&y^VtGPcczV}U9qPMl@Q*1ooEhc2U9I+=~khc>I@1v6+K%SCl# zElTny)+%<#wTdnzj_ND$qqw~LP*Xm1nRR@n*+(a1(>e&#c$POdoy8Z&nPcM10BXU! zpLfn`ZmU`Moj)#@do#SIM(Ut5_U&ACXs(IvFZX@EM!&l=+@A6L^uMV0A|ifa&YXQ} z_%$8@+!%7?=-QRooiKN6rC6avC-2UkaR*vfxtH(Jg+@WjXp>09O_$O=HntM|V( zTSRqXQ2^~(84%IB&qr|lU6$g$HeV@~<`Ps#eh2}i2qw3guPsR+Wx0efI_dKoqV}tT zbtJOO)#r#|1Pl_Qe&GZ=7zOR&HqrR<3hxz2-f>%66*PmztWeecm`exWfw?qz52+ww z>H$Oc^7}f1Y0Bn)J~4j2mL&4lM__|t-2#0Us-Ft^o{U<=;-xm)vLpfaIyU*s3~Er# z0V}B1f{t;kwe44)2`@d@Xj`0H9nV&47j)e`3*9C(%l-Hhf`7mTaz)&ew zaO~a{TT|uxqleF;a@X;Penoy~**KK0l4ZJBetTiN2gzg%Vc1m$ch>q)5TL{Ys8pDhD>_VAAP56o$x-p(UF-iJ%JgfH3m3lc^AB7oXo2+@PN_5mICZeA~lWTm({Lrb1LNBoUB6`ggiGhIWnH5 zhfbuXR?zGBaw=J1H$M59<#|E89^qR0tJ(&uEXH8O@~0z0OWH~gGwWo!&b;({0aWCq zsqru^*~FYkfk%GNeEu+0bc15ukfxR*H+sG!JvTO%R91e+Bi=B$WBBZfdNXk@iXEy_ zpX%LsXa|Et??Un9QEvHSD)njVX9g>2MS?tfSrQppq(LgoK4btb1ZUd{83d4pqr~&1 zi+I`@`=<*IW)SzwO=*aMCgjZ+o$QEf$E(mjr{?4Ciy^z`MPe&J-kp9%F? z2mCbe{Y?1%RgL^z4K@2xqdbK{-YnoL?K17EtdEYdDJwCWyJBI&-l2NgDp;Cs{A^<6 zBqd`G|J~%4?LBuLihp>kV&<5xYXy&zBs(Kyi<8OR$mP_wc=KKt(I3eiowfPJug%a? z;uLQSla=`*@FkX>^bvz@%Y#8L**Ttr>bo+9XkgbnjG}m_N*coABjL~!KX^=P_Q=WyZGg-qjQw09u@imdJoO)1$P=Ds)=8 zOZIt8vYWi)^gP;{_~Nw!F=I22%AoF|@;()Bzz&+|6;ZxW?VA?w#(>~cr+J3zY&%dq zn#=XiknD%xpZvw8Cpp#VRmrhA=qz%-=p?9)YVlAl7OnV;gzF5wREtLn9@`U-S!Cjj z_0b6Pj>^=5BtUT_Q`u0oY!C*+Tgy3biH%AV3=C5obO!7wr{vs{BOTR|$L!DXsXw*& zzs7f+9md@o2n?ee{(TbkJ(D;Ja7QAJKj8tZcr_2SRyR3UPrs;k-toUy=O64=uIh$g zEGInd1?H^E=7Z8 zDT^RPl6BOOCHqbxDqfJ?RVaUzfQsbE#~)_p+rmGjXyoA(p#l(-6BWnEd7+IohVsx?WLmvBV ziTbsFRRncbggs;u$TOOpfy~%M{g&hdX0!BwdhRv@AN!Tb(!F}I1DD7xvmSVRM?M$D zV!Sqo_y@W^90{U77KTz3<9`+KBtWY_78oygs~Yv#CCy3T9|>mU#2PASS7J8a^Q2Bs zpjuE@;wsskG^$r7FkvtZ$dp&Rj)A-$Xk3FPrRc%y9UCzdmU0mWb1r(9O zXi-rMdxAOaIjXZwpW5k6YgGWkVEfvUP)5&ssB5-6=TE-^Tx7nD^thz;Z^`E-UHm0I z(U|kkYWoHrez)UJ)*PrEyljv9RqNudeB&^e(XXs-m8{bZSYs$3dw1D+X`Q^STbePj zzXz1gU`>L^(-|<6zms%-*Dh|1vQLjOWK6?v(e7YlJNT$}BF~Ya7cT_Qzv1~t04?8T zdq=Ne#1mT?)+E^j4mAXMkjnaEf)sL_y)u$?8Ooy-+OC|`VN^I``g9LLe71q z+53&#S<<+^W+5DSnOlEA7Gt&L`rM@TzhdZlxQ8vvn*Sy+SeVkMa%v|yLhXwE(9LFu z$67zb#{nE=!8BO-b1sz9DK&Dhk4h|whyHo4m8DN9zfAySNf2lrQ8x_XF`qzR2*%sn^gc3Gh{B-La zMF(s1yG5~)(&4f|Px{qVPm7}k%C*%gOIOZ`+*MMYv5(?2vlj$R5y0SLj9`t8W!DX% z`8sA=dS-+Gw~*%-LXQZn6jYg;v=`BIv|SV(2<1A}hJ52!KX6?B1_;hqC0jfR5{m2l zRafA=bw6DL(eDM&cF7HXV-R#5VwL;$vW361{fO&XLIHN~-iq53M>g9A&uo!%ZvRH9 zbBS*!YaAh$TP!dI6PazZ7VeV%WlGoxR~i+;Gv{@*pH{ z`OI$xLT-hMZbiP|if!FWe7_Y0-N{Ja$(i3lL+%ud?v%gZsczk=BknY4?zJTEbX=9<4$guGN1z350jv2nlDBVOQd9;+q)w3z>C3;EMg^r!3lpB|d$ ze40OfG=B#q{}yij843A2R`gfl#|x|U-x&5Ae#paA5&m}3>nY;lVC(e~@p?^zxRFFu{rGnlf_N%I_`FB_-9jLF$Zku8 zq2W@?WozunMB!33ap7z3%Eb|Jm$ZVu&WAE_6Le|kkF*E!ZGl~1IW&(%56s!%JK*}u^`)v4C4GaJs;J=4p6|1B7e zLhsz5$x^{ZE>F+ZsNQv>HEUe7RcDt8(_O(^8!&1(eG8!DS5v!D2pA(7o%t z`Hf^5o!aEdeRnvK#;ve){@*9sixi5? z*gig7l*{%|Z#4zH+>3UN7MUZ0U;icMwZD@>#<**cLZJYrlK26RTXd6X?}l`jiWs!j&U&mUiOWA3t|G~(qEASrE-N* zxI!WcDcp#kk(s*=}m>YDzS)yS#$KbosY`fH@_D??Weuvkyl>P#R-t3w8gBJCNau(bOQxrfGB;|Sh5SmkN=vBYEzTn5pkgbI$^#{YIyPgkP7M?!mL?n`*V4b&-LZ_ zvjLavb$xzR&^s3nQL?mz(qo%c*Fh?h?kZ^Ij){odNat?VdgP;hs;~PuEH42 z5&Baqei@r7jw%UhwPG{`G|j*@J1RM3fJ7%eCXOZt$oM>#AcP1F%jc)PMUgS4u^P1p1};#`qNvs4<# zOd~i_*@{^{hmA_g)yZ^w<84=Rc!@!xfAd~$zZo!_G_#DbvyYKeJ0&80VV3^j4EV5Q z_l-hC9nCv00weU~n>rjfX5ep$V)6-c3X)e~03v&6jfZJUCHpFOnKxtGyE5#eu`cky zn~8V&1pLnZ4Y-8VTp_3`%y*)$0G2lR29pGt4r+ksC_OU{_P zh4D*-gT`fh=7i}bei|r(1{K_{;$j87^%%$Wx8U_LO~JEYp(9-~z?WZ0ao~bj|6uJ0 z@adtTxOng3^36h3UcXS28n7t#J^keE{er@(AxG{C8T~Z1i%vHiP2tJ~kY3YFy0StB zPHD1L(xq0Z+rqdWxZmimKq}coPbEOY3l!IP=(s-m%A8~4Mrv;u!NbmGKXfL7)aud; zV{$RW@q2c_Hj$00W}X9jZ65h`Sy<(k2xj1#I&?+Z)j#m9^uHMLOc(IVah4EvDxW1QM(MYeX5S2?OFQ)z7*KX)E% zC`{s69zoQr)Sh3+Og|cZ?qZ!q0g+%yMoZ{4Y_(z*d!~K=XNu}ob(+a2VU&|q9O~^( zib8A^ipEG;f<`}Vh^GutENJWl$jMTvWyEO*YZRyaO^(2FV$@z_H30u*K2zv(&_R=J zB^R^^mDuDDt34!4c2`}~Wo#V5yWOjZsvXfG$+E0nI!zUnl9!ke0Tga}r_J<5@s`eE z;0EERZ=-o8+v_NA9#|L(!lg(85bYC1#qI`3ywv?RodhKA0E&JKm{foihASxC(A;5! zuW~!hD6>q@-YnMR`^m2xQ++hbKrcbZnvJqX!x;$pxFCe(=;EHB`)`o3r!&Qr`>Q}< z1QVxy;PIj4=)){EcYVn>_l=7avQHTTTYTUPm`6a_PgZa#1l0H|3)pEE?STG{nF%D! zU`^^r8bjirk|290*W(~OFbJ_jzcF*e7ej5UV&@*t?C|q87Lo?y#q{NEu-h|O_J`Bg z0^UvN^a(JM1J{3#koygxIOu#)6*@@gTN7~)Q$qVPgFcYl z7$-j9_6elhFLoeEJLiv$_*Wrku$(OSnIZ^ZTX21cdiU%tdTBV#u?4n@UHN+x#}yl@ z4-+CR(q%*J$%HF16u@Pkx9Xhn#3qWoPEoF+-J{0BglUEA#&tq(IBv(B1Q@PRE1wBD zgakv<4(YjGxUv78i06ICDLNE(RA~AEGg3XAwBh>^FL9i7=USLz_e2FM!Jy&&yVFx0 z`QOPC1M`;ADklZf!Ala2R@QjdZZfOxX5?CtN_0-q99877FhmUcF}xu?O5g^q)Uv!3 zYRv0C?8_ybvy`Mia7V>iswD2y^UW7{5aS1=u_{i|8jgFG80P?;&km(k9B@HJ1F4s& zuKQ|IARFC5+@4(rqW=6=H1Ildt0=~}Z%j}TU?HhFV0ah-NBT)_l_yC+Xh1e8INP7u z`a9uW^v5aAuW>7+&H^RcZ<>-{EhVtq1;VQ9{#7O361u#Cy@_XzhHbwO*N)$pb<>=f zw0Ekrebqu@9zCf|y5=ZXVJgh)x{YUl%4_}%sSBFtthUZ`t)>{mXS$GyeUwI(CN0&X zkkAm0u+eCRIkf7>w;I;)7iL$+h0@(ki1w;rfA2=^vwoLl0b>mdf9udTCoRT?1;E3K zt+D#{8Q!+I2N&Ss#_py^I}4>x|AzMm19*nSdjlkfkYnGL@(i$+YL;Q=g@!;n*wfo6 zlUb%GxxO@IBk=yP5YM6lo#}bjzS;a{xFYWtTNu0!CAZdWdS4vD`BYHo-ZVfCRClL3 zp@=*A6U##pYrKnQ5;vqY6=|wWfsx))HprWATro4x_p&FF(ebulxUcN&`+{;85-J&N zzSj11h?=ft!b$0blh=~$}vh@Wo0iL z5%K^|7Mv6xh)iNp{3HW;?gG#)^zfm^j{Tw+SZizZ{DOd}+lVK>lp^y9QybL^E6YdOhg8e(mE}jL1lA41oGHoH0Ab zuD1U>eOsmwuQk0G6KOd26S5m2CT>UB+jNCmC&5ys(RNRg2vtn)G!`az`r;b}PWG}< zwl93u$Ub>2`E=DEr)0RS%F3#v@C;ae2%-XJ+fywHsPYO$b#g0PrY6M_WBv?EQOXtj z_l8Lg)ul8IDQ8zZ6lQRvP=S;%BANvQ`8EfXD0%9a7%<<0>ORkwXo*c=sd7|xcm4w8 zAZ*FyQPU})x8GAyV-@$Z$p-k|%gQ6Mx2z?o%Y+YOk&h(#Pv8xx#^g@KkcL(3j4))! zn0bv*m^3)#V_A3Sa33R67l(E6G{fhk-6xU0U~#=;uMtodC*qn~7)J`h#*~NCzvc^e zOpQ)!N8)Wa6r`|_Rz@48dZuEzIigPqF(`8H;bW!Da>q3&@;ZgX zr9OI&CuN7Zv({b4Djm=NH(3krqZa;2yFH2RfK2kw7SxI5OD_{*KvEeJp!cy3IX5!c6cNzYN-W}S7^E!x9VtqI zGA1sFfm`_tC6J3KnVx$d!zLSppe94ih@tatREdh73QkG^Sq!#S;}RuS8BD>$M& zEid37t#_S1q*UaBT>FkKUqvW_QCBPIg?52X>SNvT%TKLtWV&Ke<}@iv#Iq%(^~6v6 z@*?BG7zU&tHB%GnkcC8eza@50)hrTzb_4TvsBL6hDK{I(-mEA{tA z4cj&Nr&D^TP3lq^&8?BnT)%ppnHt8IzOCqC1%TD2k{hO}B=`Z>F5yy%z?*gDTQS2b z|FvXF%?@Uh)w8|<3*7*04Pc<^3jEhthRGM^a!1oRjx=F9CB_&z z>tp@DJ`XEPm-owj8mVu=%96+7D*YmxYP4wq3riSHCS~nWO_;ymKx{D%RUE^(LP`1D z3-=k7v>QZv_tPKM@itd4{_Zq*&6OQG# z?(P%lQ8o^#(&k)2_pKxn_Xahp8@;BcssFlf`pE+Lu>B?pgub*5J_Lhih%og={_q3pY&Iws z%(V!_u(zlk+{MA&wuI2+s!_R zdgoI;=wm(bniAEtdq1OpA2Nd*;)@sRdu)4YALX`{-vE$|pY4`Dbp=`Ts;gh_Pll-NVfx!q|+?_rVeX=UbV)oZ?#2Y&U)>3?_9xC!(EGm?2eUU5DlfIr-JKDFd>=MNzcJ)Wy^?Ky$-{!e2^VQi37GVq#s#X{pT@MEY#^%qKmF#9x9Qv|JKrDrP zzU21Wc8x9Q`fubKSHT7G`XTSX&DB~u)SbhT4D)80%yhq+_cebWxm43o!OQwhcIAxw z^*6xp0pjb!_Ala%bn^PZgZ@#awvnbRCiq!NuG`sy8X zln9q6+dD7fF%*5ph*C`N+i4jR=7@8s5vBbdl*F0B?@p1#nQF_UxiF5Jq;taW>0!CB~gfTZ{;D@4_SRlVq3^j2_D-%Y3qK3Uwyp==% z^c!x>^pQ{SqD_PGkCa#4it59_X6)b$2g}6AJ3FFRW z*5Ca@1YTd5gFjWgIla?+KU`86IQdC;MOvR3{WC^vax|J%`%^NBH$EwvNwz1m`EwRp znB2SDK);u--%kRfU#c)pgO>e-E`R5eq2NKN*m$aVnK2*Tkh?vvjD(*G9DP_u!yNk{ z#Fakpk(P#$ALadJ8ug#3l6@$~P})8^8v5QO0^o z27K1=loI@i_6u2?*$Z+0;Q6lo;hGF)^aIVnJ;>>6+UD0lkv=cuaewT}d-o#GU(ruV zATN_X|Ma4N?5aK{KZ;|&-lkKbCBDTZghUwmKh7#3?nZZh=p!B)Y~>)I*hjF4fiQXp zH<3Q*^FY|!&=1onF{G{JJ{p#@7IB&#T=20pfWG0FwrXNjIJ*JmIjN?6j8SV$ zm6AsMZcMm^4yA52%&0!XI>f@=yQwZm_;2#K;DT$=2 zPY$?Sp?hDiFIeq)aeB|T0=F7X<#2vrUu$t%ZgM?);8^eQJesd_e&pQj33$A@ID33& z5pDt?;Bb-k?^{mKXLE3Mki?0yFBw8PUQ-EU8;U`Qzl}_?kgFLn91fA7GSzy z)sb~3!ZbH@@V~Q&O(X8zpAyO(#w6-AUnISEvK~#uqpgNprj|yB(|YK#>wVoj&*tTj zdtW%JOHaX~5Y*^4h>~d(gta5HNhDurG-|C-{{bQK`uFAW_UZ~D8H(J?pB;)u?hgsW zWbJ^2!_*GRBEZVP5>u9ZCWx zWGdmgQ5jkW+o3R>S^2wuX4>34W$cm*u4G)=geEK(Im;9xPsq{^GB&MzQ(2&HiIgH| z-Z9b=2|{%>IXOwe>A*PLvAUBf&$a8BDc^$!TAc5*_VI1u$J1vTI)azyuSLGCQfrZ7 zp()`8)C|cgf$YVzvE)*_rTxHEH}5hxR*Oh{ta6QEU210K#W5f)(QPW0=(T~^%II;blVv_;2;oQ1*ub>44Q*Kh-5q))%CsnWtCQWZ6SPI1R6 zB82O_lXEz{ePn`0BZt?N=@TG@SZ`fs8M>vh#rfvsDa7kL71+M<{ZwQ7XVIfM7?_1Y z4~M@qylmX2aHcc<#_wY6Rp#Yj>X&glBeE5<4s|%i`888N@M#uvud_WD-N6msziggw zqTxl6!J*-Amcj*WS7+-L+DjCDeKJ>)l@LD2FgBxE&~lcb4U4ts;5M2JFe7RgG4|e& z{-YenbQ1PCSopkgQbP3Nqq3RkW#?J%AL*PAuYvX-tk4=2<9pOe16qsMbpx11rbO@N zR3ydkVH;-R53A1a>aY3&Kj-8bGGVN$PX?B`H(FYL6aRD3jp#jJ9+Z^)cmKHj?-B7# zk#h7BcYy1y;ADs<9g0Y;+#W( zvf0vqHLv~X#Ava!D+h=I4#L@kXmLsu2JoFYqXc?r@w^npNlxL>5-w{vj-;(L_>D18 zF)Q7_T+zZ$B`9Ip5fBhLh*fHk>dqZV6d@g}k{^z{&m}J>2E{Yu3MZS%hVoT6 zCc4}K@b{QUeb6*xwDahxZ!1S}l8Q0J4XiNkl7|_Er12cK0py*K5%ADXyjmpyd!Bh@ z@1HHI-57w0w`yF?DK$FqF9S1yj)EwFHN8TNk+mEHm88QWgAxgVVMeBcFqpW>s4HXS zw6B^pI!w*#K4;_#VNo@6>ccVFX5bM#8Q0-y&PgI;WI;KYa@1vp2w$DBMCZ+0 z|63tA=oqd-&6_iBQo;YTO1)c(Hy7XNt=JyR4^d0ac-9USx?2BeSqDu#R!{^b9xYTH zH66`C14hZo9iwhgEQ{_@sVoMVi&kzarOI*eVh>RA$|WcWu7DSc^E&r{?Pe)a5CglH?W>Djs1(X+Jg&8$e zs;!Hpz^8GKxvMe-6^>K=yc>xo>+h&Bs4Sd}hg=coc%<6z1K^-Ue5o5vMuXDaBJ0JV z_*i@N)3k6WdE{FYx#gS*O=-q{bGK@MQL&rb%<9?YBe`Rg@kY4|5q zw~p0|Tk;9nR`#sp$0bG`hwT*j+C5hOulKu9cW2|BfTGT&4EDGFL&7+}mfKf!45^<7 z`9atuW7L`N=oS09lWAi+(9uC-igJhr8I$q2wywqQHC>`+!x_8O8b59syE?W_kH+G# zXUic~`m$_#&@TR^Er*3fpSFe+ErxK6o3(@UGQ7uvY}o(@Bcggvr|;POIEkxb-n3S;0{Z(%ESX1 z3^K1mJCt1fEiY!ki7_FID0zU?eC>1axE8=sZ15dc{bb%1>dti%nrNy6*EI%(h>vTJ zHIy91Py<%R@+p$5Rs`1&en*>gzCXh{GU4CL-{E3PlN0a*Q{N&Y@ZDUjikuZlS8)IY z_6p-|kw&wKYA{a<#IZ)j5Vg(xV4OG?JzKk2H->~5e&Yf$w>a2+Q*4G)7w>bb|JC3xRoCAYN z+jjT-(N%v}FMG%h`cu!zMJ}^@L_h9sR?QEaHT;fSj5%m^(~Y#Yy>``7?M7d{48_gI z#>!%Ar)Mbs*!G93)EUL}7rh3%%f^JkXt4ZV;Dyj9sa}f|n*AN7E#!&O63@)Nt}{n+ zX}_*&Z~=_-oP9O7rg|RM`gMj)?T|D5tkk*T=Qnk)Xq*PYqX<4#tCd0GHh8qFi_P~M zZp~~|3V=x#3B$&(APd-ZBJ!OJc8NV_bR9QhXj=ONTfvEGNyl&zvJkb)`er4{r(yX9 zz=E;KF82wPvn(YbB4n@un?_+!_xd{K{rYayaEF1S)b+w>MIT1+zcC+k&xH%A2ckDo z*>6f=lQbxY^)dm*DLWVaT9SVtd{k}-}Tm5be zGTkn8cUB)VI=6b!e7SG6zVV7{kqa!g-Y-}v(}Syp;cI44bIELVl2EWq?{Gw+iy7Zd z%fIj!3YsWjAyF}Fz^28su(&qcrIE3O^t&u6c%%T+DZg44aSdYn`1l5JXA^i0!ZFqc zgtq}i@V>qc3fwga-s$$~^QKwnW-c0HiD{(|&s)~iF_ft+{GtkJ@Z-=Rqq)Kgnc>O; zze^a%U5dIT`oABp#S|0QX6}#qBFi21eu3SHuQksyo*v!Jpu!qWin96jvl=ZYf#47Ze_ zuz@Z(|X>U8;AoYl1|tlXUPY#?}gGZ4b{1#FgQ-8zDk9roWRic3b6D zm*IOw%OM-o1KH$wP)#QG36RTSa8dJ)k?<_^V=UR2UE2OU&>db}1acu?n$C)e6r5aG z3$_?~rc2q~sFJZF@`-k-i66p{gdA@a~Vjj22B2DVHG<@H4X&*>;*kY@%P>keZdMNd>C(ddg zeVH--oF_qk@ZDpWP;VzX)x>$#OvyZWr~+&78_3DmCpY6ta(-kjgGFw*>d8 z|1C1VEemINw>>o|81^4_d@;WHgiL9sfa-8+v|ZtO!Gz76Nki=DerS@Kx!rQI*-|B~ zB}Yw^FkTXX_MU^pFafE~sZx5KmHE`k_1=kVsH)>tKI$V9iYF<#_keVc0g);AEAGJ8 ze=7+mh?RtY+h7PX_K;OCoiwEb5*=tE1~ZIIV~+G+nkME#EGB@w`S51QN{2aG=ox&svHe={H(xr1^#(%=2rIZZ)jQiLF6R+UYSf*F~v!+2L;{oOJ&(Q&Vpk7ceAm(hBMof%2s~ zb&EWEx5+D|p15VDJNCmpC-3;34gKqcLN7=Gvp!I{)%t-|x(lC5j$cu^BX*po$t-2G z2qN-q7?@eB_GACdkTg*cd6g#YB-n@o2f3OGhJNhK?i30ZTExFIB=+woW67W-Mb;{> zqTApkA=Rz@G(4!qexqJHJb*UhRDathe~S+-utNudWZuGUBN(Ldd&)z|9W3*uLI9hA zopr|WzA~B1mP{wCI2z{t&@Xf(GZhW`Wqq6pvfmad4w6Eb$uoslWL)PO{-JXnSlKO< z9>@Bk+UrpY#4u$IY)M}uye{)(K|*>@j9J`LFj;VY6ad4x zGlLsW^Bt*#P12Naf+uzfnd2AF=)ujm-%an#nJB(C|7M*p^l>9Ekv=9z%v&V8VI;3H zEjU+1<`EyUoiEi>uGbfxTo&KwbWQYMlM@&f|JJK&6cKDOmTL%iQ77~UjH$M>51VUI>LYQKK$?3S4LORaoD99jCcnY-6hyTgvc z>W^n`XBc3o!Q_?0{VKy&6b#aoE1{AocWJmr+Tx2;LPQ2w0(Fc~tH1|xgs(aKgRPt| z)C+3!-dE$J*RXCjjNQi*(C+Dp}bj1p8>a9IYIk? zViBw^7^olVev9T|jGnE_XJa15hyxqfBKEqy3L_e`4KxeH@DJtEdb1zOFfNS`TF@cK zFZ%XqR_5o&-4fc|9)2btq(8D_8b&+jvBe)ou>Tm*Jgn&D8(VY=6-sO(%?|BH=R=RM#X=flod(rnh>4^^fK&X$psFymapSr21I;yX_s<%3;zq+f(I;_vS ztk*iN-@2{mIJG4)`v{yT| zU%RzuJGR3*Sm?~!*}xp=wH~ne76lZH9~3Og;(2S=mg{()Q~$c=@;N&J4|^$Nl5>WD zc7k1&5~yptzi<1$2Ry(JyucSc!5_TACp^M0yuvp;!#}*kM?Az&yu??0s9)=oAJU#F z(v(*@me;vlMEbkKyT;0UUHG{X909Nm+aa{UV^_uzqyb!3V4hIC&09Rq-@MM}JkRgE z&-Xmg|Gdx#J<$)n(HDKLhXsf!EMKdD6p2xzWziO;LMN0$7=V1pw>zG9ImyTSejwnx zq}H%SAh8X?=ki(j`lkyVw;lJp4q$!P$30~Y8Y85s8P)C~c>yA^b5V(rq{oHGbG_V; ztI5-am;(W@Db(J%*WU$Ou#xN%uzlOtyr{$d;9tHxmH(@`yZ9uyYr03lxF2)J4VqIS6~~W&$LlM8j6PzVzV3^b z@yA7w^PPQHhM-@D_pc zrT<%i{eiaZ_Z+Ra%Mr|5p(j`oBq-NE+HUFwomM79&y3|Q5rZp^->iD4ptyi~i z;l`Camu_9Vck$-cyO(cYzkh#@_&XA1;gc%yCI!5habw4iAxD;+I5JbNTaOUxgsIJC z&!3y-jWUReh8B1_HDb}Ws9Ls@VaJv|n|5v6w{hpzy*n>q!@m*VRh*mGIOE5UV>6R# z+$EuhzNPAEMq4huQ<4pvf?d0cRNoH8#jcz+UO~;qeS_6p#U=K=wRMM!CYkX`etD7S z4RmG0afI4e|2rx59$6tH0Yy z$)%QDhWRF$TuiKm3+9{)N|5LxyooyNR{u((lu`sM3cF;S_|XaPz;o~@J!&ySh4IX& zkuL0_n5b8ZGeP}gthBrT88#volO(Nwdu^gB$I+O$(rtLtb~_~dh|QouG%c3QsD1aOJ4 zE*T_=T;c4C1VT2k!7E{z4OrlT3I8tG;Dcdv_Sr0=rR&|FzCk1-BT|%l$?VMNcHM6?&FGSEI;n4%L$KjxqfNh?#A1w7-Uz$n zco~n8`o00VM~*$NJ7ku=yQDay^%wySY=&7vBRRCGmcL znH`nM=^?atgF`=%ks8jlP2g#B*WIk1jKs+_;Qu4B9xeS?C;N z(A&}@#hFVnJo0Si;05+tR{zh)iCXf8zAchnPNiLrrda!%T+qk})JamezQTv~iubd5 z$+D!1A@F^ZFAfN?1PT^L7`7*X5$@mr{{a|40S-_j3VT+==7K)iRBKV`Nk%D{Cbc2d zVjK^2#W$KE2al9u9K+~DDPA`T4^)df-_V9DK&T>Yq#_mC&<4`DmJt$`>jzxoMJP%! zj1C$B4d3C#CA^RY9S$QD7yQN~MgXN|lmZrk!&!7Pg1B)gN)Osdg^;#ZB#wOTdpkmd z&N70wZ>XpgMhwqJelRy}l;RL?t6L|yl#DE>V1gAaBL+3N5~f+ugo4uMfz}Ar@45JxJ$_OmJp@$nVXN9GxPc42RB#p#yBc)1DEkdC~ zUi^Rs%o#>0LQ$M%c;N^6kwaUcCbdRBGLjrYLnxYojZhq-l`~6)C&vLwm6^~LsT@Zx zez3f9W$lEQuvp<#AjA$>-5+=@>(9~aT6o?n~c?Jnp zabNuMr57O7?|zOt3jYWgP=OAVpanIkZ45{#1j;3zlZhCO8pw+wWMmRFs%S1Iy3AFU z#|gtYRYvZRxMik-1tmPA=CC1$FuA7_BZ%QcNeZbuG^2JIS;8>Lvn>^LVv37XfgDVg z1t{I8Biw;WMgQaT0~LfKYL&_&xHjS*Y^oECDnQ#ahai}WlC&e@s*lrDu%&PK@uC@p z&PGGxN|l^-2#kQ}4?N0+2xV)L&M`wU^C(1ZtrZgjZ<*P>4CD=LA(XcnwhU`e&j5|ovI+JM5YFJPU zY#@z;u4v2GVDZ!Vs00z(Xq84V*@-8va&SZ28BWD1p@!OJo}M`ZBC2pNe5y$=NVtUk zEbtb99+bP?_3n4U8(u*z3?&PV%W@^dz)`+7BZD)WVKwr{TcXisI$c(_Xl3d8FrK*_Qj?k4#>~SqDSmPeBjOdPq{U5BAm&6R=$KMpd*in`$>Z$xuV>{5AF!`dY`0}&aO zUNTbJmLGZHvXmWga#iqG3~S`TaxmShEGCHaMW(saHMCUnA|OkY1}@tb@1r3dX-QAo ze+m7NdEtUy$iQ@BR=QC~Uq+Trbi#RO+{k%^RtsWsnmY2y)<`+bYA_CAwGsYCPHBYL z_Wv|TRUfJ7C9qSAiXKE8K-O?~NU4!3eYmP4E})6Sh+;Tfa@UstbtyzmYU6^0bQ!T& zc)lYwsF}KyI;*R9l9}!AxS}IlO6d)#7rt)qcM2X|RkFp0r6D;PTsn}$BvJv%v7*Jn zNW-KaidhSFJ2K43-u8ag8`bwv)jAWrm>n&(*-(snEO74O!&^x0eB)@8;A!=}AHE+= z&!y0Zc6n&-f&$HmMJ!}lgkpu_XiD##=RNoN&n;wW;24TR5l6SDtMfMG9LGu<8Nwu9 zY@AvQA;0^6b+!IWBS`7sJI0AmGYG7LYU#R4x-MlhYEi{Yd@&Uj)!4DU^<-sF{QuQf zCC{}e?h&uHs_c|o`ouqy>_DqP59*oZR7+>>9y_OTe-AN7DjJHr;waf)%mrfctiNpMC9bpZk3gx?wQ=mgP5w(+xzr zb#g&rn#ds;dzDzJ^qVbChnuo)jcK{u$_q50Wd!MOlEnHf!5GWz;wu-DAr$tCYKEZ} zD(PypNY(oe-?;yc=gYLr6-s0L+T<|BB_IsZn*wMeWb z?#i4PD~LDIBREDqoZ!YhA_`sXxAH8rynxS!VXxp1<)BKrD#Q8E&?)i)w(@5+G(ZF1X(x29 z`{=L^?eGrq&;`k>Q1W8@8pG)D4pMlEtFj5F^q|VbCmAGa#&8M^X2{jRs9M~E%Tz!I zDCqvI1MfoWg~aZJGGY*Y3aDnO$+8ejlEHAkqsSa^J610Tt4;M9uoErt{5+xquZHi~ zV-VXyh-M2BJ%Twfs=vC#rv_=jJ}dZEOa<8kafU%9TB&J1!olJyivO@=v2-Xs+>Y;3T+6mH;;&>(1)wGwVv!l0@jH|Zv${jHGU6H;;ifn%o6yk=E@yFy$vQfw zv6L{kE~o{6su?g09#voy@k|AR>xqWJ2u_akk}o&>@GY7z4dW+$=3)->a3eXgBRz7` zz7Ir*PD09Wy=bwHhzNu{j3Z*JgJ4OAnlNXMPyQqZanvJ~#t0La?1bQGjEcl`LIDl9 zV2Fxnj9Q8SrEna8Y{}jO?l?^1nr=M~@Pd4+Ndghth@=)6;jeJfIZzUZ(1Q>qF2ov# zh%hOGk`k?UO!1U4Mh0nxVyS}=NOP1jzBuWa>cgFQ3LAFBh5u4c^YrUdfT~N*NgFQ4 zN~8#LKJnI4AugM-;Vh+?Iw>z%2|7*)nM%O}vfz_qX^hOKin`Bk54r6BY`tGg>yLjCnU>jBqan8FVLon z=5y}E>0}0ZCW?eMFYjasqVz!ETyKT)uFG8JbXaONpa#rzByWz!9arU5QbdGQ;EU?f zDKjr}cBbpFp%X&x=$;J&+p9i&aN2I`J(i$3iN{=Gb9Ba`6#fQ$HbSh3$|F+n6~jt+ z5+^-5Vv;h6HG&6{hUYb~Cp}W36SScWb&w1-KoBTLnE%|0-Db>r7(rw*)b^mqBShy# zH?(+;rx|JnEt=I(Sb|Iq#!Pzx@7gUFVo@m$&v5!=1VpAI<`hi_Xd>OB zBB?Z=^u#sR;!piFPyuyN1+`EK^-v8pQ4w`f6}3?r^-&!)QXzFxCACs1^-?W0Q!#Z@ zHMLVY^;11HR6%uAMYU8(^;AtYRZ(?SRkc-F^;KOpR$+BkWmQt~#7k2GIk_}o)RZGa zO2@q7$aXb0@YE~xbWf?vN@;ajYn54@wOOI{S^uRqTB&tft+iUQ^;)$xTe)>xy|r7x z^;^YNEpBxWbF~kLRbYDc6JPAK#8f9zA&$NZZofe@YHfYiHX{mN)jdm!IHffW!YPq&+z4mL}0%#dVXu-B@f%9sGB5SqQ zK+Lvn-S%za)zxc4ECEZv*#m3&wB*gKu#q zSyrGIj-wnVqy(hlIG*8MapG|!7jZeabGdJD$<}j4_n;KlC-#U8!Q)dZvuA5L3X>V1;D@*tf3L|XCtD(6qG?3K0$ajq6OZ-c$J|T#DF70 zAQO)F6Ivl6M>l(87If=Yd%bs{O1CFY7j>aRG^9@~)?iNW;&FL*H&}ymFV`*Dw|Bwd zc#pRc;7}u^AQtTRe(}czsP}k{w;0->M~b(9l|d9b;CmUEWw{qj8#saiD13QBZONA_ zL?aGzfCX0f5>#U^=9fZfw;P_}E&oFJpkhE7Ou-WzK^gFOcuBx`Md1cGU=N=6eomke zJV6XJAOvJsFi?PcJ;4fEU<_iR7|ue1m3UYmSU8sWi4BH=cfx`%7(wpB14h6G+G3v? z0WOe$6O7{=h~a)V;)FATa(VZ0#i0%|;smhZ7mR}&=tO-%Vh3!&IMM+Za$qBNKo^YT z8eU<8Gr|S(z!~s(jNg@Zr6GPdf&@6>V$y*a*1$n1R~*!!%20q4(qR?C#0CD~V$NY2 z)}SNIm?hx%jmJTZ$yfzAK^*!Z4=UFjT44h;qL2SLkXgfy@mP=f_>RXRkM}quIN=;t zK_l#79B$!^rQsHkfEA1biT``Vks(=50-&o{FG8T^7LAUH!llPy z8rmQSkYE&6p=%r(jWt4z+4u!?!5lUr2YMh6x}h9|;GOK?99}^PTHp#W8!cQqkD;Ii zus|BtSc^qq8tCK%3fUUixTN8?JdT-wRUisj0UK5Uf0$q#g27Rk;2eTMFqq&Qroj+2 z;ETTj7|4{TK|+zoL9}z=w#6Y4&_WZ&NRnLujFWk`aiO-!yAHH?wOjkOV>=`0+qGeP zxidl&HX6T?Ijkr*y!&Mbx?znypt#%MxRaZ|R|1UxPNH2x0}A02R$-l0paojE4p;yT z`1g3jnIlesdjA`NmTg#giNJZEx1J5V#kX&;9md6FJWmk&Ca5@|yF#9mS3Tyzf zgCYVZTMgXs4I8=_+EO{`v$s!5k{#o#G z!UJ4d!dt?mH=@jK+5>_a>VA7KUZBPrI`tn!}Iz@6sWrS3(26`eLpD7koUdLi+E% zfffYAlRvMhSG`P!o7;7-9P0T59s#B`fTqjAUtIbdoccH{84!i_LLe5NA=s1s=f%s|84Bo$em9oACT<+Z<76*Z11t<$DXu)3Lt?X~ zVaeI}+n3H9R>9;!0?(ts77W>hTf0@5oVAGAc)9an&*}mhCR^{<0 zK7o*@)v>Bl5Z!Ea0zMAg>cx2pk0FtG(!5zhH#^yk39yXXEH;qS?v!FAACp zNV+IAAf$^y2&VqeX5Du=;jOVF_u^5GMSXf>k*x9X_hC;nAc@6`aPoeE&I4 zT%DCP6S63ztdRv98d!``Cd%UpN6HrUJn_@hK^7wv#)$PyLr)cZV$qUXGpp9ET)TSx z3O20Rv1H4dJ&QK2+O=%kx_t{buH3nF;hM>UH?Q8kdb!m7YUHor!GsGNK8!fA;>C;` z{|)T8>j)#1D_g#dIkV=?oI6vF{INxpOPg#6e$ne3u{J7@j9R6^;uf8V!s(mLuPjP*duH;) zqjSX!Ww*@&PP$0Ho_SC)BL28(gK`XCIa_UBmDf!;b+G<#jJtEMdM^dAbKmQ$DVs(wFHw(;|+*YBN*hTK?tS*C4>um zC{xT%C;V7U4m48ftG{g@|ZIDxenQITU^L!Y{*^ zqe^xoSTxQ#Fv)r-qKax&9&e70W6mO*YVu%BrouE{r=Ko6Dt?}VD*q~}DwqcoHYaMt zQA#G!3X`o}nH$yzJ1P^4GVdh@@-`A%4F1LoFuQCXjBvsVFU)Ym zT6zg)#9}t)ro$FrjB&;qZ=6=eSWZS~$Rg8eC!TvoGKdYP4R!(+&A5~fF%T6SV@Lbi z!doTtCDiiEFOA2-4z{>-4K6%uxD~81qR0XgrYIZi ztqHZD$vEW{UC}6Dk83ERq8hAHvM-$zO(UCj8ZAvtQ>)?8R4e_F-^Ky1Pz$?_lMXIe zNOKDdDbnP)*I=tFm%H*Rsmv$V=ww3+QoLIX8$7YVZ|3ltZvVIAF@WyIP8`1ud+f5$ zPJ3YxNBrf)jCovp@4o*IeDEEY3G&FsACH-oOpWkgVFtuE0O9VXkxbbz0;#;mar=`B z3vQ5~{HP2A8qgm?nkT#nN^pV{tRQG^hr2LEhIbb1pa(w)!Yy&IN^nA+36U4V6cQ#` zK~tf2JmNSAwr_p*!w&=(qLBQ!aECnXp$}vEdQ!3sGpGYz# zYH1^GlM&V&(*YlBOeLLw=~i*bhM)-ITOhho~eEc z;bbO13Cd84Qg(^V;35$-$x*6um5)p%V=8&cSYC#ew5+8qZ;8uXYNeF8JLO?qsmovr z6NJE2j1y%k%V8>WnapgaGe5{niEZ$i)U2lPikX;WBJ+~g?4~!r3C?g%DVkvNrD3os z&UC61H0V5xHn(ZVb;@&|^sJ{nRY1<%P4k}o>?bOTXTmEmVo#SiL>rO-&(HXCp$u)P zLminKx?R=<3FIv&Uyi-m~NQ0j8q^C(VqW=d7-R4D4iqe#-w1W}V;Fwkl)0nCt zqbodK6izmXFnIJ5m}tWi;3?Cf3U#PNH6t1&y3e92^`0~x%tk!}1VZq%3Q4HyXgV>7 zk|J}dTQokSn#nubnbBB4@pfmAIaguhC5vXmv{UWeG%%4!yrfvt;LIfDeL!nHC> zkZWd+AP7O|Ar2=5%?Z-rR>*pCv$UfFF06$Eue0`~a59~tm$_17p>u7V&>r>0zlr;8r z!cI5w-jO-xwU}5#ej$S35Q})kg5mCN2cuvTt9VT*h6{N+a|J|%bPy4)j1wOFQ_7Tf zs&u_$V~{Wj(V>99D=xB;j~o^gdl$(})>w<*@?y>mA*ye60%oY(h#XU!{l zkY)>mjfdw-8#hmuu&;x$+Gjs^TB>;>=$`uY#Z?P?*egYK5s8iLHNWYEvChnJ=j+yA zQ`LBlf!?5Vz?5Wbd)p5+_8PejZr%nLdChh4NLfQs9V_f7kuen1%e$Ij0yxw#ylgUFi=RqKX zy&(1Vp5tKOC+>XdOs6N#3;*+jA2dDWQTI8srAp8}?|BkjpTr=jnrlu^ee7g^=F?X= zgdga9Kz44DyQ7ftiP>vw#<$# zF?;zZfCG3K_eX#Sxc`2027P%VeZ|*tFQ5w(QAQ9bfn4$eMG+P-fC{W21_~zwihv4k zP-aIYDbKJpkYs=dIDnw%86MRMli+fELVR2GL9_7^fm9clG9wFPgD!!ChA{%gax7>; zMTru3YNCT!6NE;n7Df0rZebD4f^A+g0%d>-s1OJvSQA!wg(0YgV!;8>;0>za0?+^s zs!$T^qzB$03)K?|-jEF}@P=`CgkmuQ8i)#|a3o#9g;ywoR{{bcc!j0_Ky`rvlR^w9 z2vG!vSt{s=*5i83wI`Dh2YFXVj&WSDXB3UmgJyFWN$3?NU<)dOC7t+#hCzXaf);wj zglq8!*8m}HvHt_VAS-17intPist7*d(u!-rC=+o5DggtEAPN{j6B;m#9Jmt0Sd8(L z0bPg+1(OyiKn&18hQxplvG@^2fD2;i4a}ehOmhk7zz6IShRon!D1ZyhfDkP}4Bh~b z@z{o4(E^s>jm!WFUw9>97?0nm3c=_VCtwN8PzQCmhVy6=YnTl;a0qZ{Xk)>Q#<)Ho z=!H6z5FZ!{j$;xU@Qht3ja32y&{zu^nHDYZ2B6b{Ch?1_P=`{Kf{$2#EEp$eFkc0A zP?iWqm`HRVwTY1tAfLzzJE#>Muo0xFB|q61%%cMLQF0$qlr2dUc%zLacPO<;7Pn|a zOX+YiJ*?pFqL}Xjq&IU zrf~we5DZt85F7x98aV>)$c~GG3;hU>2&ok<0F^4?0+}!`J5mg7&^)Li z4t*e-Z}gHdIe+U{UO0J)jG+Nh0Bi{{YCcIDKq-`3@swPGlo<0kY~dhNsTNgv7FfAp z=3$g+5fb8%2xqAf&)AGLu|4c5k=g;BuxXKH!2)$z3Dg*w2>}FRNRTR^1B2iTC4rgb zX#bATz>Xe4jp(>2#Bi8k!2*czjl#(SRqzUxaGQv6jtDUXe&7w@z?fRmmw!nXov9L` zsR9bgl;8uOS;0I^krHC*2`vCU!=VB6nV}2jI3bw{{uP&n;0a=oBRe7r|A7#6@D0H* zoNiQ{#)*E&$#~V~oR(=Aexn*xnw<#&NFOm9J%a_m;1b->2nggAQqwAYUV!(D;@rumXZ;t=w8PzWl*+y8}`fE_7O z0)6NRLNFX9z_hI31}CthEKr-H^ARY(1A@p3XfSZ*QUS^k3>L7W9#8|iU=888h>X}> zPAa%60i}y4rJ;7GWU&LwkS@Hcw0vq4T*RflFe8Bi6P4N(JfIDyq9LW4C>`*oh>|z8 zIu3nH7mM4tDv_n;Gr5%;Bbdt-8zC$(BR0FL9N4g?$*`v7fNh*04QuKW=Af`JM4l=E zEHDA9SgR7A`x1)6D5oNv9>6H)5DfQKYZIA=5 zp^J|jG%VD*GXa6-un9TP19?y&*{T&OU<>DP9bFTYojVO<>i;tzqNQLd8@yl%!Vv|m zFcHHUx-oK!A0f$ksRFkQzXR8uE5QWcFb(dJAd;$)sL?DtAPwaZ#%*Jj zU17?oOa-c3oz$!n%k{wBQlq zsR9Pnq68Gu24sb?TGA{q(k$>j86XTIm>ph>2o`_>d&~+4;e^97K4r)ZB%wEcnXh5E zkT&tbg7%I~jGR;_ju^!-5Fs%?hp@Dj6mh9rvko}sdkO@mr9v~RCTcLrOpaWe)276G5UYrSD zFe`A-IySHZWk3jO_W~eTnhLSDDM68bzyd%(2B<)YZG$L{nyk9n2s``{8Qss81-OBm z$b&1Bi<~^nnTa5^2#MPj5wIU>KtNcrrL8LJK-6(Q;r$KVunWzyylnFo=&j!D zy~+hG+$vz;2<{P`lBAu4&)$6=^36Q-ZQnJp3**5k=8y<6O&e<5Nu*h3EZqVpJryyO zmRdN*Z`l+YIHNf7j3UU3TQffUs)c@S5kHSDw5D%8eJ6KMVsZ>S0$z{Luo5O|4(Oas&_ zVFSt06r@A5+HnMjjXz9r<%Bz*UI>?B+5ZWwX)swHn@Xz)ra;PE-U6~Y0w355XdpmR ztAVDF9Qm^{;S)d%u-Ngb0(iXR&lm_fAQdQJg-~Dv%o{cN2Uj?kCdj zkgE~z{-=~%kn;W#=|JyUp#c^_tk+Ry_N^@s5)u!Rggh=b{yl`*Yc|NP70}|H`294_ ziXW1)D#3u*{0tT&VDBmb(i9)k5N{k3AFSWNk_YeI61_KbBQ}3vE8F1=Q8BsY@Sex+ zo{CV%&7;yte~ixPUlu3euuR=6EO5jotO^^j zp-iEU=%ATvj;W^NMPsKRY%qahIZ zbzy9U#>4ow9we2;{)woSO{E@63niJ=-P#~t+uo7UscGzs31B6 zCon|s!Q;ieDLF;@WHzZAiokJQj4JY zyqp`kLB0}}3-H4a<2B*ml>(^V3#ZM`6&~;%w(v8s`w=qVotJ{~H69)tfBYH#xNcJn zaLp<0Y!W2z5(c55Fai+4SpTRXNKnMMTLl#^TxbVj!4Is&)oFNc)j|&^qS$gaF5Rku zEHr&AxT04%g)B;Rd$#b)IG8al7L4!>oCY}N7TG9y63Re^Fi-{J$xwxcGN{yOP&h&; zQKKquBz0qB1Pc}!P;KS9mFS45VHKhvhAt7%g(ohdx?q(N!9#2b!u51zix!M$oe=uzVLf zM%x40vqU4pB-X6TuZk16C^G~CjkY&gMInbkr;4d+Dcb#tm# z2ZHF@)fHC08Z^8hqyK1YDGdWN2!k55`&LmH6mrjG1FhEgy{aZ3qpX+(<`i0~rQ`}U z@IV9;RB%BR%*f(F2qTm*LM|Az@InkT)Nn%%JM{2F5JMDkL=sCh@kA6;R53XgjBxQq z7-N)iMjC6h@kSR{R1F0@F!_l@4Gt|Xp)^D3zGAqf;2Iwl87cPlcJFzRe^_bzya?}X`VqV1y;(Tf=YtyOOBIt zWI2u?6gUy*tp9@2Q>aOAGIcAs~#gkrBN=gmuQWKZly$V{dDi%htK`2lDV&MiG@>Ky%J7Y?S zFSWe!#VUq!+ilIsDr-!zf$C}(L9%wc;xmQP1B(M_vH=e-bm~aWFZ=w+cpy0h7H&3Q zz&Z`pl7+7wl#(yEcIw>GF> znC3j8KmSjDikBf4IKAaz9TQj4!3i6eutLQnmwa-{E4Tb|%rn<~bIwg{5l7HN7aerW zUBKg#O?DRXgq{{ zC|NUEcww1qTIm)dR?c}P2OxHzQ>;4q#xpF|U58zE+7+@LN!(Y_op;}*0bY29=osgk zMXo1^6I|M0;RG%G!Ws%Ah_whZ0!~81n6JS9a7WtG)SfY>2D1^^8b+XlLHHsxIcrN=E)fr3*l`KC0M0-p!wdxFMitbeLL>yE zgATX=8t7O=qYA>Bh9wL)mXHM)Rlo&kyiAgxIaL^-@frE7>_DthK@uEUoDJmWGdcLd zAWjLIRAr`S3vr|@gm8m65HdIl@r*3=SD=^R@0hB|;uekK9C)Rs17Tx@9@M4~XsRkQ zNy$VO5Em90Wa0`uK>}5r>Rdw=#5l)A6mkxwXhki0QH*9(qZ{R@Lq{+=kcJeblRLrb zF42igT*4AixTc6k@RFE(LyAlRXuqHpD?5E7SSR>{_*63joW{f)ws=wsb}^1`AQdKN zQURNI2a`z=#nm|e| zFs@JXs!erJKsf%3b^ZFDYIu;;n6zXBBw)oj&S9s25tf1{aL6WC(x?YwGu=VfDPk0>j-*XC_J|ALBqkdhnB#9c1}j3+W|(5Zi**@en%`)Q z1(MVYP;t?*jAS=4vIq?e3_}}V5J?59G!VvqBMY!-pl7uC45~`DUY=axH$p3jTH^7t z15I@t&j=7-XzSbC0yjUN>_7^F+Y2yCxI4o=XK=T&AF+r_x3{%{2aL;=Mp!_^-GR!9 zxq=?LB&9oaL+C<65DR7GSjWm}#L*yYjh}TiqY#Z~<0dL(Bqv$POJ;JDo&01FeN?1V zrt*wPdODP1A`VSUZigb+449;Y7(d!-U;Q=u=UU^rhV@Ii3ht)>gjA-kbe16TqEU;D7Y3j_B>kjWBV z#B7(cEO0_*H1mo+42=bIfOuT&;~4uyMw8=(?qQfA3Ab>(Hvht*Z-L-~7<4eB4rn<+ zBz%JoU(CT9xFpC4Y#DK$*g#|^Hv}{!ZUe)l3_;Uduz~7b+k1O>jBD@!cw`{sse1t5 z!li<}O5ouhCwBxXz&a`l@q?lOl?S~o1WQ>!cCMJh2dIdTQ{ID$Qdma=C~$EtT1vPZ zE8`Q&!13T4Q8y@!BNzaO^5%$K5)=)jjA0@DKu-Tt)2F0dT|VHIjN(8@buBD;yg9|6iCWAEoH$MSfXu(Xq*L1(f@#o^M;k9iJ#u!$=fya#e#&h z!1oOLl=V&DV8n-nAXoaDg2LF~L%F{5tCH(O5~UH3qd>r>NRVC`Kev#VggSvXLa5n0 zpwj!j<_n7!h=N_C1q4w)d*K?au#PG@KlVF8^h1jdzyMomBa8W_f!KiK$d~Jo7k!~Y zrr?SG%NGw&6BEpvHiAFqGr%rO!5a{dd%241V4ViaJj!`I$b*n0b3!VtLMyyNEX=~r z*}Tr{!qL$}Fbu;5kv=ipkWBFqP&y`71bj{w9wWDqEf!Yr7=MgNRMNt{GVtVALE952j7(y>Giu`JZ$ zM9Vot4KWEgGPM-(L~i>K;Ny^kNGcd=KGrdZ^Z`X$oScKehHT3~&Jl{cgD^$x9G*Id zW2?mtX~ZamL}E-vWn4yPY(~P-L}R*jg-8iQNVQ^KPJ<~jReRd6UdD`Nt8@U zmCTTYTu6mnNtldDnVd^Nyjls z5TSqrcuD|>N~xSms;o+@yh^OhO0C>VuIx&${7SG4OR*eFvMfupJWI4pOSN1}wroqc z1c0Y>017}#K?F*mq)WWaOTFAnzGOzFG_n%G00ekT!YoX~JWRw)OvPMG#%xT-e9W#q z00-zx<+4kcq)g1rOwHU(&TO*3oDinW5C?!v(kxBWJWbS0P1RgY))dPFn9I(D49g74 z*sM+4yiMH9%@O&`$ODnV)XD=u0O1@?;w(<%JWk|HPUT!q=4?*qd`{?$PU)OZ>a0%d zyiV-QPVL-I?(9zQ)J~`bP6w#So&Rjf+3Z5yOi%S(Pxfrj2605t{E*SSN&+x|1yBI| z%uoH?PyXyr|NKt?4Nw6cPy#Jb13gd#O;810PzG&K2YpZojZg`lPztTk{4@Xp_|2+( z&CR@l^NdFK3{epsQ4%dm-lUKYp#b{4PYZ2P7kyC}jZqn$Q5vmL8@*8+6;K1v(5XBC z@}x=g{Lm^ZQ6eo;BRx`sJW(m+5FU-n12BLbjZ!I{(kaDI0=QBv%~CDhQZDUME~Qd1 z4O20#&;=lX1E@;a?8_h((kVkyH+@q$jnha}(gz7m1Mz?}?NKNlQ$FoeKRr+bc+5W? zR6;FO{3L*?bO4bYN)KgIFaNY07dV4SKq%U4T4=R=t$gX%(r-VSzNbgf?KjZ%tT*UD(?U zR|^T&s0`Hwy?{5^&rG-gea%=3U50JzI)mR%f0Vz-d z6JXf@<leb8|Dhds#8lbr{V4NxTj1DTc5 z8JK|!m|Cix+N!-;t<74l#ageOfd=SLj!oH=ZCd>#*~BzivQ62Q-OsPx+OO?exSiXu zJ=Y5WgG`8pZkPvG9I4hz7=$yZ)j<#(pq*UGtz4KC zS_Pp>Vr9?^=!T9>+LQfgw(y!;Wb|Sh22wtUjDpY=G9&N zL|epETjuT9;LT4_xL*Wz-BVarFyP+-{@8iQ1pSp+9!*oDOkC@&5y=^W?2Uvta5WAf zgh^;n!#bNth;9|uAUFc!lb%#BuU5z#0ZGA`#&R{ExoWbgZceK6iU4#luVKE+KGN!y0 zP7V*4N(87-F!0#+1yC@cVfnRT8$DtqE?y-6%V@~d5Pp+IZMvi_xfC^OtzI9_bmSg>V zgK(H*I(E@OxCcTuULEG)2j*kmkdS;pT~H382>l@Fr?*hrQ} z$vJ_7?cyUK1WcfxPrhbs&gRYuWxjw|^nFlM{)c%`0`~RKIEG(WRsb+?2XU@g3%y$~ zh-Z18XL_z@d%kCU&S!nzXE4B6{`BQvR^SQNPY1?bTt3y_?cqQkRmv4XxP=ZssqX$#+j&^o(1qIlJm(tD&o^M_ z)BkNzDPZS`-f5oRX?GUhhL+u0*5g}_*IeGuUH;ub2I!!E=t6yip6=mZ7-)2DWT~`Z zp@d|OHiF5Kmm|Ofl!}Bl_`8xWYqLIU4LRwkfY{BA&~+AEr9Ec-l<9O{XK_Yd3oV4G z-fO=8-HH}oSq|#g&0kv{;Dc7ygnrOXaaz8>IZ@MnFMUW_J6t=8zuDMYmH zY|sAe1W{|F=vQ;iQMz7bo0eZGFojq!1-N!l2}tV5p6$KHYoKOq1>RwzHf*CtXkAw5 zUdC+&7FDQz;CYAzN7w@}c!NU7gkkRCWzblDl}cqE%FJ$N(9Uk{-tKMYR1__cH2;>$ zwyx1(c88y~>(h;6eel=_c2FEx-i~#LOqg%_u5bIkZ~V@0{oZf>?(aDv}=e<1AL z?%&=ApLSWE0km!GyY&vG@h8}9$-Qxpi%s*D@ z;1=)!H&mTo+xT5%{ygUa25?56%Ay4E8o{#0t%4H2Ocf7vF(31^_Uju?+{uCQwrV*>s-YSY~nuCuk!d*`wA^+5cYK#U}JV z7t=$=-Ec60+LeGeFa=#$hGo!&|Musw-2)#d+j(g7bM03OSk#qd<|#9&PUr+J`|_70 zb6KBtTIUNEuac=;&~WGm%KmfPKG2$$?>fKne+Y*+&uIW)K%c*Thy_w7&^>_Q8GmI3 z5b}T~azig_ME7l^2JU}m@+Kct9Ki9EU4{uJXWX6e{KSDLU)wiE*JM51p44(00c%U( za!aTJ+N^ba&v#kBb%Jnl1#RPE$Jk~U-37$~I=|~e;M;JJ0*X~yWoP9;7tlyAb|Qdw zBj)x(&(91e+rvik#3tee$M{DF(Sh=pB`g{Cdt)0F_vorgk@fMrPbxwdI5 z4^R`}SX~(T!5wq~r*@4$^!@DP!c219U22RUR3gCLZpcp}cy0&|^^WZZxHf@wPuagl z*QrF<1u=tU&<4UU{K9VrUOPm5QJthe9JHVNgxQpzkF@LhGZy( zDX^+cJRM8mc_1iQ?rj5T1bWtQ{mvHpejRTE?QxF{hh^taDY*LP{pqJw08syjUQhsH z$9e^*@n0{{H@Em`7x}_A@M}l#Y*%ppWN_Thcrjh{j@1W|Rf2SnU@-sCUkSilA9sh9 zef!_7_UE4-3eb{IC!NY;b?W&wPMTVJ4Zjf(8#Zn>0cN z!-ftYLX4(*b}_8l$zpA^TCGvoiptb4QWQ;mNEAA4c8 z+Bae)gbSU?aHi1VIx8?mT-ZMmhGcZQiKnOE{DR$8-lGgfRs8h6+mG*Ty)35fsBHqVfKLdw_zU>(pMf9yFV z2SK^~(35)Lwd5XrEeRsvBr$mh>O*=Elnfd`-7ukq9C?({5gc`L$w^7bn$n5C0voKb z!xCGpvBx5ttg_1zo8pSkwg?jiU=eWLjQ@lK28}khb*PerjfGcTW$l4zH{0&<<3GBL zMMQG*>=CKF^U@ofnQ@Y4nw$Ib``TH9#yMxb15?=xafOHlMrdp$rZ8xQHa8u^1QWc# z0bd<}DNdm?G>hx*H9&7VneDj?O6UPxTB48>&QPk^7v@VFz5?5T(Nhg@Z!K=&{ zF&nhdLla%J(MKblw9-qH=M|~7(8Cki!)mT z46nLC3aLbL`j}$MloZolcc1shnPypQ_S-jWaNV6K)_;q%W-5B0(^$RuJq^V3sbz4g~)pS|`;JN-0^GEM!J0oGj* z3%5|h`zVprHDHQ9OA5D4UdtrjWh{BAEf`!tni7s&vGgTKlp7!c6N9%i>5VLW^BV)f z0yumLtbhb`m~5(}1ki-zH{AfujrKR2aH#)Jf>p8{Pj2@RIn1XP(o=ySLU)j4=)ocK zIY`Mir>geA?qsw>)ukj73f0BXCkFZ*@D#L?BwS$<4jM$wdbPcX0OA;`SRoXTaST~t zDvDM_MkT2D#4my|jA9%k8OvzB?s*R@QELeTz%st;B(O_u+2B0hKm;?vuWX^|#ny1J z2fzr%5nTff+%6zLwuvy265K-}80pAHLh_L&Fbx7KX~|1sGLxFzq$Us0mPdjzl8}s` zBJJk5*%a!O|3Fw{3IUoYMT|J593faPcSD9`VG;ysh99JdhE`2t2s-dXd6MA;)BRF( zg3y5zN@0*&K15XUF%=In7ZF4Vh!Ou@%*hamh>_qO$O&ms;)5b2GYf^lLAlD=B^IFp zs%RjJQ*6lwoCiHjk;014>tauQK!$$;^q+VzBS8yl(1Rj0p$csX8q=7CHAiz2QtZ zYUyGw_La-gkcQ1bghNuHIzg;ZQ}i+250fDW_H?2k&~%72Nj0CK9z=!vu_i=jSUa9{ z)0-9nCxS+@M3l&?LL)#zN!GbecT!~o^0dJ=8RCHrY(Qfk@PG|+Knm#fgatk*gB=KK zSUce1oeNzoV;k$($3nJg4&DC>L?hx;0K9QvZ_9++_-Dwx=;8u+aYxw3B86~-R4k`O zWWtgYm$~sYwz8cqZLPDx+0<`;83c}N-I1^}6{@y{A>mHEgH>$g;u5h_0T;^S3WzxK zJxeIh%N){Nu0o`$vJ((i4Wd zJbTD+q-hU(a6~K|u{9!0Y_%j6%NyS2+H46o#xkBUZ9OO&--?B!kOPiP{}H+Al$OS0 zxvVY2GlWjeCl^uE1Iqs((z0gA!8_ztf$JoqUGdJRKK{86@3uNshIqAi=e-C=Hqoo% zIjFs9-4GH8(TD*HCBTxffkSF=3}awGo?1i(DCo=(E$*|fe@(**MXtca z2_-RCJag}RHDv!^OsrwmK+%E}{o4@dF@pk8%qODxsRD`z8Y1!J;zJIt&*!OvCL|!k z7joc`5x{^Bnf|98;P3;wW;zJ|9YLoVk^&~MT%Zprfi%WZj#vXd=t3Vl(T6f?@74Mt z7{>LL4CxMKD`CSK&C5pl2kggfZP;&{9E&&W?5~48?DU$>Sj=TFwanufPPl>}1aXokuH;ti+!etO zv>_67q7gTs?@?qRMH@IT>Yoiq-D?0bP@BQz; z`shzfxAXQ69nHRwV;gO8VkP5xo4%{__5%2=w^@Q*I zOcW^5I_XN~+01%fLL@W-5ot&Z-~oQ=o=!VZi7~+?}aG2aJH{F~bR1AAkv% z#sydHeSx1b#P6MfpS=JXTtVE$+(Inh^^x3y6&R(VfftRy_JLm; zy5avD!XZJ4AGFBC()9`Y`NhPD1^OL{pZF1t>=s^_!ZPSW{fN!B1%^KCgZ}wnBRXOu z+L&nEh;*#QZ%|Nm{0VUc*|ND^afzS`w2U_J0);@JHk1MzlAtzx7ehD!b+MtmJw%ud z-j{`9DCD3_prC{tLGlFLB}@V%ILIapffI0nMjQc2m_!vo-kM1Xv>UpcFC04&E6CVBy8R9z?`m76RJGAp_~j1fw|`d(fPwy;FfTgkZse6=1+b z)Z7YGTF#L{8r)(W0%Sl6Zh=829FqV0 znT4^<10x2<1xSDign$WzWJr!=Ns1&%s^m$oq)M8kOQs}BvgAw3Buvg^OtxfA>SRvx zBu(}tPWog}0_9NNWKr7WQSPKr8f8)vB~t$6Qa+_qDy395B~wDBQes0pXysOJ`mDBH3z;KqF75U7VXbV5UHpi}7=L&zOA41*c4zz7YMq91F8V4l#Cg`%$X5_C74wt^h^>+-Xz39gUp~sh?9dr$a!Um4NgKEV8B1} zMCuvC3Lpa{NKt_CL7shH+!>+usldiLAro>OLzLdfZILR-rb}3%$u-0~b_)MQ(Blu7 z&hm|bJ^~bB{gXcu7VD z)+OReSxF?gCnmUOe8OjZM#6l`CwSuq_=YHnrfBNTr3TS~6=z;R5fhH(| z1}K99=z|XEf=XzEPAG&bD1~CEg*s@2W+;bhXoY%ch~npnl4yrUf&wC-lGM)ujmA#3 zT`j#G2Qr!Hyow4aRWdNb5D3Hu(%lG@B94AUCvX?MQCZ1E*_N5Xqs@?(A*mT06L@_G zexSi5qz=0UMJ^slgZN@eG=lORE0;<;*1fn`bs-=E>tyoWTDy0)jCh0Vy!U zn?eDAaU(-G51xf%Ig;ZzZouf}K%feN$+00sFk0`OT&5+T7ad>qsXz)$pB1n`3SQVByQiUI_XDHK9DY+IK|T`zP4TX1BM4T?sJ z6l!^-b(CnY`s%L&Yp@FIuo7#r8tbtlYqBcqvNCJ4I;*lO;JrMF32@ZmfL&YO1Y*YB z+@(U@serlBP%XrcVjcuG5JV}!SzLBkGBD=dom&nWS9c8+r@{o5uEY{(sV|z-Sgn&K zP{9%aK^pXH8!Y4RUI6j16^`i>Z027n}8Fl7oPSmNI zlqtL))n&rAylVOM!anE&!Wf(S{Tj64ssbp%T2_gB-T@bA?bdQ_*Lv;Of^FD}?bwoS z*_!RyqHWr$?b@ z4Cmmw0znw=9lV>uX4kv2>$hIjyP8bAmg_Kd!gB4Ktl%pbr1oH3-5-5>nx*!c+ z2VjTaX{q6~zqv>htIyRaPxTB(S z-opiysJSei)xh(T0rEkk3h@Ccjm1UHZZ-$C7CTaW!ip=6unTq}%@ z2*?tRy=JLfsZ;1;f<*vh5@B9pUSRWVOg*AV4wDR?;YcD z9t$M+{_KTeCmcOwk*GyCq;L9ZRMvHtbM#2mDoMP=LNAyPL`Dk!rf?-&@+D((CTsF0 zb8;tp@+UXY3ZJM69IbMgR-EYJi~iIbnwNU*jD4U1EZYZ1^l(K0!DR9q&{&A_6>3ow zm<@CQF!xms&{+piz{!n32Uwqc1!^-lgnY3;Ghb>$NOLojrUpQ677`&F{<7)FW`Pyh z4fvT2Ped>4@j0V&I!hQIt5K=`v2|o*!k9uVfI*Uw7IK(pSu_bpb;F#8+Ip0HE6^_9FfID z%Z7`xShe1DOKmjwb+kt4fgaE@T7A=lI38!4HA}GdXp?qnn>HA^wM?r3P4h{T%mpDW z#~$cHI5>k}=k-uy%ba``R#OR5ANK!m19xx>w_r!LlrXkgyn$8k7+JWIXzZ#=b@lgM zc1lEnFRIx^00AR(f|-T(S)cZIgLim~H?yQRTxVEo=d}FIgFbWvBe_GhvZtTqv|i`- z9v)I?^@(o}_kQztfBW|(i}H77!a(~7MW=Esi3ZonR%I96bZdm^Za3sr_a$UzcVonO zV|a#Z_=d}x&$hE4$90w1^Ba`QNx4s4aMV12f%-TdeG9aGgO&*_gRiwGVE^}x<9Lqi z_(QX>STunALiSiBw^}T>0yF@?jD~{qRCIgaS4SQ)>dFxK%oS+2FS>z+UpR+r`Id8e zmm8gj$FzAf9d-o9)2XVGtT_LAcBBNTSVl{L-u%dmcS%O#fK1U(jR*FQ>-nDZIbjF5 z*c5V&1UZYTh2BU2izfMk({LL)c}hs0gFMI`$N?fuLMM>ZBp8B}V>yL*d8d2&r-S-K zlsAZ<_mxONZAbxJcvL{2Cy-DzS-jNxwjV?C+MV~djrV!3>-w%Ev?!ZTqbxFVPl*ZK zR-8=sEHODp_llNo!k6x_WnO{6fp&LWPZkV;Ifr_-Yx}lO&!~&Boc=^`1>p|IMFq_Mr8LO zEP)Y-Q(}uUHgGXnjUE z1be~+lKklft*?t{tKs!EU;DU;MRq z{L@2y)EkSpzr^_R$sV{vCX^?&u^3$ZMIm%2ofLaqxZiyz&P(aTu`>qF?|j?4eV_Nd z&mXt9;7cDW`YOBO!7n|(RlCzm{oezA;Cl$wy98@PiW1;JktjIUdyN8^ykD=)VBldl z6hbdhU0;X8b0Y@ZzkTO>zJJHP&lkO)1kO#-R?#2IGz}Q$Meu-ttApxL38(Vxg2IqhN@-x3-hrZ~COX(_}%zi|Hd!&>nkfb=cyj0eEP?3{G`!&b=%tI`gz}g`H zVkm#}0|Wqp0|^#1co1Pig$o%rbodZrM2QnARwQ^QQlx(yId=4@>w*FWu{@USm`P+x zl`C1cbomlyOpyl$s<3$zXHK0vdG_@A6KGJOLx~o(Il@R%rAwJMb@~))RH;dgR<(N7 zYL+1*uy*ZfXI$8GtGrsZGq!A6oh77|Q_J&Cy24r@QNwQ=nZAFq zF7)~rF6A3{r^9X3htjjkjCU*+H+~#>a^=gJH+TL#Ax4cRJ?h&dQi5&jB^?F#{vEtX zf{)3U=ZSP`diCqmn^$p!&?WhUps=VrSSwfeD!_^*tN5({g8Ji{N(y74gl^mdY=^eg z(BM85P~aq;RU+IE!wfatki!l={1C(tMI4c+$SgatGR%TPU?9%I`_7SN!qH_k2^{H- zBYk=SLxDm}3r7i+E+C0E-DVRBjNRsO1U7w^AtJotpqrA)Dy_T{%Pg;yZaa=*!9gSw zy6OM2BkNu~6HS&h1AxRfv0{O}IOUAfyeQ=BM7~Qbp^LEmHVkkvK!X~A6LSnC48gVl z`+ya57SRu<7kUw=4@lj-6w^#K-IUW#J^ge;6Hy#hMWEJnF-`B3h()#>zZA*Gf84q5 zH84Ul<+SUJJW_!R3IQ|9NQl#t*kX-67TIKr<8r%Yq(}*e-N^Kf$5gF-aXe5xg>%ks zy>+TQ6!5^L4HZ~$Vca%s=yR(-(E{+@pb9;7utXR1i-~c9SvRM;==dfWOSK)C;DQZ4 z7~zB!4ouWhPb~E(7B{=LGaO>`O~!wgNh#J@VRL7+m895h<6Tb!4oxYQU76*UU4H+0 zIc7a_#}r^iQUbMU=c$(Bo;_Q0;Wp9xmS}IoCB%}wR2ad|H3a_4PsLpLLz}RoS>!_g z;#FaVN$aqQQA2OqL6@+uc_oLedm@38s{OO+1TAd&W}I)XhERmC^w#^C`=a0^tZ%q! zL}{Q-z@nM3%t5=Z1dGw)mvPb|rarjyh(MliFLsA#k%%|m$a!#_C*(6# zh8g?pwcoyFnQzOac_draIY{5lhbi0JH5|I=_Sq|sX+5dvA&O2KxuLMA5hMSBmA%L5 zJ12s&N!P^jHPbcfPz~~5FiHoM8pOhX@9LWWT&IG(`7bO0WR(BRkqEWzBrbasTcWT* zH@yV|Zg}zEGjfoEU6dnhqN_ydI#-Sj_(XK1Q{N7G*h3%w5Qv}3o$e+BF`q~b0H``2 zOWq)b23%lF;eb-d_Ryq_P;Vs?&_!#MFPNm+WC$ z9C3%u&J>a*{;VcJBoDXT*T?qk@dWj|1fB*_IQ+CLF<`mICWOF&Jm4a00_2+4z=psB zrUMsHXaN?aQ9v7f@FpX`%QOt30S-K(LIdQ5C8)qOR#XU5^U}!&Oo9IkDrf)+oH)lV zghHWK*dT7TsDypkG7fVvk`8U*TsPA33LW$y57Kbd>FR(2R!jp5{IkZ_MvymP{3Ktz z)Z;kGSx$4F6P;HXA`!D-#Gah$jxcdV@xn+&i~U0%rU@fUe6^e3+^l*j6BZf?T2O-? z^dcE)fIQ>4k#LwGRj~+%9pj0AR#{T*+dRL$*!jjCIyXBg$72@ zQWgkIk_0qh*bKy$XJDW%Hn2k~f8s()ZJ?!svQJAj&;d!xQYRf?sRt}L4sinI5!xWe z8h{GAL^;X^BakTz9`OxYoL~g@!OJajP^d(7Egh<0)V%@(N}K;g;D2t#=v?VqSG(TT zQ|lz6J9&acC00}=V{(TSI`)Qp&SN*-py*1#fTLOUY>Wt%>|`mcEa@!NC7_9;Vk4TG z#R7IEK*MWb_{dSyE~QSFAQyb}#HT}^R4^}CMmZn^TdfIbk_D`!p;&N1|9RE6Hj!;P zm}(P29WHTt+nOfCrjs4aZEsKgNdhp(jXl`}K?>rROjRJmoAma7{4s|lcyNth0HbRF zyzNgKq~6iK7ryb8?|c!XSKaY-C-4OAN{APW!XCC4`E-o}aInRIHg+SAy;fu^+h7Mj z*g2QYY(q8X#x!a6HlN+E0@6p{vS{?QrY#Q%2!V+;Xu$siEx^Mi7STY#=+7`U1WHUP zc|fuGc5mmPMQ~NX7TVrKP+!1cya?4?oG8$L((TD7Pk;woR1K^4y2)0N`quw-b1aVl zhbE@617`r^K4+mt2YiyCXLuORX;$-^*=!U0It;%$@#}_HQV3JX24sgd#cpCj8fh^P zvkE{k$SB5O2p<~JiGGNLTLOmhbx9Z2!mwxQoD$KtxhfzI@kYxNf=g@y1K5qiBpM-C zwZND#TAh>!-AZHKs$d7d5F1=kXq2wGjw}2_i#5MtORgL>9Xbr%IEt}`y5vpCKiPl> zruL1`NqK;j>?$qpbAmtUcm!<01uJO5191QX8)N^rN!|k16Bh8msiwyCy4l@scQ5SC zq~hJgDxDj5zYVeZDYtHdgNr zzxyXQ*z~5!GXfH*mI^l*0lHZ1;=rJqFcTVwIPT|yM?wfEl4R65UeNy?OIv6^D+&IuObF={=np=B>G>Uy8P5?{?E{~jaKLEICJm@C0v?U7;*A`+bXv&mC z_c3$O13DPfgR+f=G9>W=XXIjZ4XmLd`-MtjV;t{!*Zbbv6mJy8IVW?jcS@ung~K`m zc*b)?@=P<2LRftNSw}>c9RaAAQ>ZQOVb;7-yU0# z20Z1d6G_V-A`Qb8N$Kqy=g?sPICv-(iba}-3gO;f4Nhs`o)_Qv&m)G6TOOD&gZ?@` z(Wx)p1mPSf8}uJ7%;n>->vlrWCprUJ;KH^*!3CPYdFe)QI!P2)CpveX&-q?|``;h` zhVlEu=AFdBuOv3+ArnUCA9`U-bVNxWPZw_ESQcv}Y#-mQ)3POt1)a}%0&oJx*2~1)7?uG@lPlODF1=z-H z8o|3%0J(_IfP7*EP9T~x=M_ZYUD*GIZqA_?@<91;0tqoEt|a6S=;j-yArG|SsdA7N zwh-&a2D$`?a2iKZqV3hD#%%`YK2SjYo`I>(uJ}eEU!LKHb|PPbArJG<5C0Gl1JNk< z&oTfHCj{^RV8tC=V*!KbHVPpDFF+S$qZ@i5pdjnuBv2DKQF|!RC5XTRO#)>+;{tGG z14HkkMC1nU;1WjA6-CesIz{7BkfYoKQb5NrP!3V-qb}?N=70iH_+=+xuwQUdCt3<8 zi18>wiOh1s1DHw!Ol|~((OlBTT#S(?gb^FpML+0I1^CBN=uQPBrGR)$5YG`E(^2mT zad(13zYy5Za@%T z(IF?n3^)Y^Y0+qIM;FyGFdC#BD(5C9q(YPtBSTUoM{=~-@iK%05#f=*#^fKmK?>@z zHe_QNb|oJ%aajBjCvy@@05Tw@rAq=1CQ9)j|AAIOOY}fQ4<7O%r(jb`iz3@ceJ=7- ziV1_lqWE~o+K6oot?e8bh$O!fEW@%S*{Klw@2}wTMjW95U~&NqFeH*B!NSMjZc-=f z(k_{UCtbn>d~!R0vLy`iAd4~~Q}IKxKq(&*5t{NT{U|DBaA2~lDy^~zd&t^Y=q4&t z9K}*IH4Nv!Uie zFpZKhJ)|KI(;*GnA^JYp@HbBC8 z8c$kUqtG%DHpi1Z8A3K^lO?;vHUTp?8&DvBho-ZgLX+OGGbJ2h5hZaWxKja$M^@Iz9lBv29B;wIvph3YLj~eI(UVN{;SzB( zj^@EVQvzo=(0q=vL#CiU9g-37Q$L}SKbuoPYt%+>6i54xEZfmkL=!=U#5Q!qj#86( zQi3Fm=R)anLzn+_JUi4SBp~0qL?3vDJx8=eZw56`)Mw;VL%g6x9TG-klxU7KN6XYq z&lF8Hgg~oP1yb@yk;g5aXCERoH%wz0H0(uMlS%iqAD#3`qm(+PR3t=HXRcHMG|x+x zNJTk>3%>Lf!&FQw(sraWO)J$>FBMaHt~rxC9M40K^P!9!2^R8=L= zPhFw`+Oj0{!94-hN?8I?Pa-~hlS7ukQAaQ_GbKMGRVv6dQ;XGDj}=*SVpCVdM?00j z<}@4vsxt-V8t|AMF11l zI~KNKbN0a=)>T1c9-zcTDU7pL0*dOQ}!z(!5e&m8l`q9 zFq1RE0-KbxCnm%z`E^H6(j8mYWx*hPH1LWt!Dh7;LvAsXmY!PZMxDM zHFIT;$ZTEqHQKUfZ8C1#H{s^?B_L`gaAjJCRwas-!ff+Jl9ofzpgtKPWH*Iy3m3J_ zgS9~JbOGaD0YtgDw=f#lCkTXIh+=zlA_`1F8I<7@8Ua!ycY=YU1Z?5V_+mn~=`c1o z8*bnbydfJ*?gTEu8_;sbyecyHGxa+it6z#5BUiGx=^h!=QS_ZMvfg;kh^pLi$EF1j2egh!Ys zH1a|2qXeR%4zt<+DAQm!MmrG4xX!$2Pz^3|wnohWkH&=*n!UdoK7tlc!X!t7h0EacFj7!5l&%8oG)b`oPp8#HO5iL}d9dhWR{H zpr5TmBL$f=6S=Pz8GRX)THDro-gc5x8lfuLGcLI#>^CLwx1nGT+9UtKCP8sjFid4q6ed?b;6g0!VYYi1Ta_>Zh!;!KpBd`qg5cP z%Z#8YnkO*2FpN2$Ss4CQKn~Es5TL;q#M&sJIfn`31aP5rMI?8vAk>P{2k0O(e*&DJ zAahwj17zTc@fj#cfDEu8sc~Wj%HRqF#;j2|t$(6xV8}csnkV+~bf^EuY#3)Kva6u? z7;*!HtPSG?9$_rt+7CfGzeM_MccT|f`lOXqrEj~SSh_PZflMZrG&Xs$_|`K#`9tvM zF@st?I;|60>>ASm6R2RL(_(@Df(@+(YXWF%xXZ@qg={`MixazT8W?WmMhkHe$M#0O z{w8n+$B?G_gIS;gl;IRkpmb2c5tN}3a0(}w>x0Ld_j+$^%0>yT@%bo)D<-5X`6Duu ztuI2LYHi>Oyg?Qq<%P3>3NAs0FXRLU0U9`$8TvpNH@w5W;lqW|3r3g3B_VU=8lQ~- z#hE!m^Z*?yAq++r8e~BTZh{MNVZ=-PtT`9RIae0eg#$*Mg^~YP1zNxodR)cpLaqma zb74FuBH_lPyI&0ZmOcmu{JJPu;04OS3OzL*rsaEfxV3@9X4SUj_+*L#>f5|EL~g9VB2N)z!Ye^wsBkA z4NA9V0u0FHvt)X+7K=#I#HRHQs7<*%?4%9!g9S!SU1Xn;(;RQKPG5zD(JlVrY;s8?IOgzbHWA+K^d;Q2i`z~X(5b@tiR3tzZo6YoHs1I zGAmh#1-_sgu1*7dJ&gln1UewAIv|O0!Uc%IYVQDtDI61m{K(1thC7j5E{FvbehJ!rl^BEe9+#8-@m^yNF z(LoK69FOyQuX93)xtu7x9Ly^ly9_%Buz4s_fDFqzU5yYggstwbSo=Y z$Qn7}8Y;c;C4o_};n2q+8K&p<9)7id0$^jC%baNm2wrb02<7!g zoRDAGzmXNrVQ)TCYqY_6!!ak|uzFb=|D-)9u9J~h!r>qprMKPuv!~l*;sP?3BM4Ff z#C=*gS+lg%JBShx=qVna;n_0NP z1x-~B7I&aAg95j6=?(=?TtcUciU%{e(DCW02bwo#UUlr8WTL_IH!Z^SrRKhfC@L&xeUrfWA3NPq# z4l!+<5XC5!ETzJPZnahsRs;#VfaYOAbfWTES>y!Of~7i%E^z_11=VC=ETCadhS%r@)n zv(QEhZ6uN0G3>S2W~=SC+;;2jx8Q~=?zrTZYwo$|rmOC{?6y1Z9n>};?Yzpy^3T2a z<~z?D#+s7vzX0Fc%>~HXn{WRt^d@`2wYN6x@WT){Jc1DvS8Vac7-y{U#vFG{am2HZ zZ~`8el-x2V3)Xc)m6unx|NP+q3)Q=c+WP=?*NtD7a;`FgW z&4f;O^9UMr&~!m*CDZ}U01gQzL0YMmURR$WVhUNsND)gg7QC#wxrXFdU3JR^I9xgIH#>AV1kZG#-XDIK_`UL*p^$`)cE5aaW=vc-pFztL6M+S zNo&0|R}f^rz@-Os*Hz|=5Y$0qoeDHV&O+$Uoq$U)nzcz zuN!2;$`idnMj3Wou@L_Y@xehx9uXe20vX(=0TBv5a8Cz%5{2JjO$uo+Aoo_(3RkBG zvGB+@w49(G3prsmLW;ro#e&u-IfpN5@C$RuVgj4f^n+7Ri6M4I?1FcpNF)Q;#tPQlP1Je0%;JfHy{ey$?ZPy>We zh!75L4Q6OeqZ-#pkX-rdjlBZaL>5M@gxT?qc+4ZSsAVm8`SFi{45T0jNytJPl92F< zguL_!EhPl(U-SQXq$K~L3lkJ9UH&`GB$}o#T_Qy7fa0y5v9FpLKS&%PO=ovVxqA3yL0^Zex1&4Tz z3hJ4S2=SAG5WQitgbCam1M4EPz3zQ4d~g_F_C)A|GQi;r^jXOI$k4uq z)zBc1VB7yMBbXMB_N^p5t3wT4@CR)irf27j(A1{as&5o(ItIyVR!kVCalkEb77~XV zBDxR~aKfsFp;0kyd62mRF`d9Ns3rI;^i=|-_mpEB+O;$2YR3QnZ46X)WHUceR0t)C;V=O;u zw-_p9tGeu2FIS>Y3!USy5ot>;_ezj22=0jFgeF0DAPvD;vz%Khgfc$S3JYj(46&ev zQlFv^l2jaJP`%Wy7f`(C|U>*&LEi=5pWJ+^kZlf*LgFGy%HL8BVj) zg0zqXKCnX&1d9;o;lY3AWC02WbcTh*hYm)7*kZR-wSq*ztPgqSQxF?f_@N+0Y2DO; zC3xNpuH~@?hM-5tTBFIL^)T#s5=8JKI2v_VA%{*#f(^T1WPWwgg*h)^yOa?3nzv9A z*4`C&w&{ZWWECEWY+2E15FYSZx~NVyt~Sf+&PJrS#geV8XFV^|y7tz%&b6+0&FlYe z!Isv^xyi|tsOV1>Sq7;2E{GzahFSN<(>=^YlyD1Nic~`G#O&s?c}8R zvL-rzHLCM1;7ZOM3|WoD8fth5US5R)R(wM$4*@SH(jkihtKbn1UPDJJODFuY0Klgx zNLQ30kk+VKxat)$LD&tE9V}xSRtd&{dzlEAt{Ir#jaA`P{2Mi-FgJ=ii0uxS-GW@9 zG-1^MTU}$(o@9=E=~+sPV{?hfJn5l~n@z_x$~&Cf?iq>j9Xb-B0UyII1g?|#kkvEXEKI0?q7Ab?ss1h&9d58u7=2G0T63o z8~^ymvURVQ&-~^)|M}$lHS!hkhGN_H*a}FtB(V>z-tzwYoSay+M+pQ%Tw)MrK!X|5 zzkc=0!TgPI!YG^FgDYHO5^d;!;2jq3PQJNCIN|~u5qa#@H|OvQJs=Z|vJx+34pQND z-(zpVpaWX)3*+!A0rUzv00bVAOOGH8#UOA7fhH3ufEIXP@}&VGFc$xRPc8S@n>;mEA_+-NJbE| zF*7GH3BM5{EHDS5afMlU8eDiY^@I+{u~R0dWuzesf>vVsq;jNT8b2@y(9ni9fC)aQ zQQzTIEWilA(FY^Y9p7;pPIoy`XAtaBQW7Eqa1aDymmc!LJQFbj&SM1-C?Ig~11)Dx zACLifun^m$cChjRDH2Bh)^?_rcRe5{u-6eZ_*7D5cQ7;pZ6OYeU?pgRRXWInaq|o1 z(1Q~}A?F|!ED!~bPzfNVX9h7OU*T4T5kYXE6N8|42_cF)Ax8h{F(lEj1}zW;wlFyV zS9v!efVeOaEuabG5Gp#*0(fEr4fucy0bcDGgkgn@5tbJk$br&uL`bNFOt@Gl0C45d z1~)(|QD{BF3(^rwRrhL$sks7&?9JyN3H+_3xecP8T z+BZqu=Pbn)w3za+}CQ$v9LOoYuo&zB-R$;iqVr^&;8gK|I)|rO6P$d75D#Y%n$l)hbTq-Voh_0(b7>e`v3GtW2{UJ4C$N+-vK6OdAz-o>Vp$m2U{)GL zXzy7VXT+T4R07UWXc`11y+D*kNf1MM7;n)Lb{Um^A~~WshXTb6eh4`|V5)t%6kC{Lr&<%XqhiAoITIyf8MSkn+u^Moa%t@v7UgL z9#~+3Q&I$PQxGID3Jkh6EKshbm>w#Su=N@Vwone0!va{Ur44s8A6pn(8hMb~peE6! zWV%cUI%f#srWY8ebJ|gxT1^&eAqDEOS$cs;Qn0l*Sq5>QATgyvTC@#Qq9%%>3PF)A z+O&D}qBI({QaiO9`H>Zgqd979B$>5Z8!ahmv|uYkMEa8OHzOT7p34&} zmKb){s+$t>0%d>(ue&8M0Gt4;5F|hbV{o_5BR#P4xv;~!3jtEn!Mt^Ax*Y*EgWI_Y zffpd+i+;O*0WyV=(`3rqLd_ew{?oApSiX@1Iej~1qt|4d8@UDXzH4zmoKc>?I3sHq zw)*=pNE?w#n-D7Mv;u5LP)oH2e833YT2_0tS-YcLdoMn!FbuQ56dXUqwFG*g2ZA67 ze!#&V><5DYT@_=bOKP@DnzsL;RKc|Zlq&3yf}0Q?;Ht_=VDi<%HcYfO999F82R|Sk z2y#BV2?7oBAgyr%&O-+}z`a}%K35>EP(}u5fWtYg0`yf5`8&l}%tqL2gi@Tv72LnS z_rD0iv;$nm(^4%7oW^Rr#)xF2O$!F@V11^rwGRxz(DJoj9HhfFN=tBD%2jPBvk54S z1ZA6~XUn8&o5vBs!ZzF%z=X1xwVt^ox_twlHLS>(jKvJXJ-``x<^u<55WE2bK4ri@ z1u;}tM!UbuJ$SGbHN{dokjVj?6UAVSvV6<6f+9oP#kee_VBBiKaxE)r#>A{F1{NfA=>D$OX>ce10NK!bqAiN{YxS zoXrNo$SUkMkKCP+Y*@Jm5oo2j?3~XcssT07Q&I*SBY;!hBP(CpA4GM^EQJM094j60 z!vx~W-17xfrq7J?2bfCH7_AU*)@~VX!@tZ~6DiEaJkrLD#>;%tD4o*H%%T^N32_`S z%b*0*T+PjEutR{M`C;s0Zh_rtpLZI(r*3MQ@hels|1dq z3(K$!y5I;hJ=6cSBYH_h2;w9Ou~(;P!G zK}|73ea;v|laSppk`1@CUEIcf+{m5W%Dvo~Wum|r%%HW}#9Z2_UES8rYjVBTJo-q> za4Z+_*FCx{g3a6yW7{3G(?hT^i@n=MV9t+?!jVnUlTF_AUElV7-}s&1`Rv)xJx3xf z-P3K-*FE3_zH8Y{(%U_f#`4;+jV!aR-+rspmtYC$tugC8!X)F(;jG~(;|AKM&+`r8 zB0l0IUgG~Ie&U?O-*E)p#0TI3-bV!<<1(&V2VTqxZj#=8<27w8|EF@q;sQ+FGv4K1t}Zoh#yXDUxn*0^ zd@K)6<>sB+6JFsNqm%4SF-s5z>{sXNX9iqQT*FP(RNm)){^x)m=(23(y8_w;k=9zi z(>J5PAlmRo_)%eENMRFnXWPDt?6;@=^C@=r(Wz0V;sOL%Eta%8!guL z-4_2hsJ*j%(aY}Csh$OfP7sLR>aM=%vi|MhJ}k7}qPG4IdvN2&R+1-q>3v?=;ArswT>d3i@Q^E_3I&^;KbYJu4?C5c)o}d94#3AKGvramqe?n z<3J43UhVpP?b)sZqRs6V`Rd_5^f5l}ENbg#j_#L)FFv{eWr&q98Kc`C{J|b9 z^;F-%9UQ`*Zc0Z$G6HcBE|B4^^wqKw;-(byXFtgh@dwuc@SsP}*aQZqU=59+od2#E zC14BxB=j(E)+3!%8QE|Hpm}2#<(evhIi5rI$BqlWP#?z8nQSyv3(pcgWj#;8%SQG* ziwMx>V+VNP>`%cxrp)o&V+Uj4y?99srIBHtb0Dq)_n5T zunJR(_Ps3owEv;B2rF*}6pF9&9_`#KJ`vjv^c5-eL_hu3ZS+S^Y-g?jv{mW2-nHUA z!GiAYx6NFDyj(|K{+F-`K0SV(bOh#CGGFhor5~0AQ^X#%~t;{9`?2(0tako6a&_$9U3QpgO z*$VaRTQIpO?VMW`So3Di7zY>rI5g>tUgG*-?VMWmYSyh?zlQzMOcvU;ZQr)d1?2$% zy$vV;9$ffv;>C?0N1j~ya^;aC-RT`&`gH2mtzXBUUHf+K-MxPYA71=;^5xB+?|#R5 z1Lp1BCy(_{{(SoL_W-{Tu73Sk!X5QLPP*6zB(OlFMld2l1s7z{2s|#iWReK~Bb-D+ z3p<&xLJKW~aF8k*1TjP-3>1h2LN3`Pic1!$tc3>~(cuIYF@Zv~0kaqaH4=NeEVCU6 z>X9dlc0%ePA_s~=8B;uQ1R@Pauu-5Pd)nxkC_58Lu^nAfL8WXwPyq#EaItG4T*y4~ z$AN%iNllPg@PUpTu4EwvGSaxxB(1E#Kq0B(%waS#o{*}br(}R5hzd5n>ASp$aB1>JHh>pp0Of^J=4Hr-A_ zAiCe)12$M;hb_)I=+HwpS!I`HwpnMNh1Oa1B4LkMYvJ23+xrx_pqp&}=L2v#-g>LG zTyq6NP{alww1mMV7EGfPOcZ>V!FVxgLtTAGB=LkZ+E77776&4slTC(VL5meDyD>*p zUHC(ramI;ektk0UXob>BQbDAP1p0L1YhIZXB@#H1cw)>1IzbCtz8UA6iX|d!Vw)$n zQlKa}nfM!S8VPhDBNh7KlSW1;#7S5M(&S^1M7r5#r$ZiRyTuMwYE{@dX!EZn%P(NYJTdq82uR#v5;-kwplC=Ez%by|dYX1897SW2T^L z9LNa8(NSfh6D|?Fa=Ir{NpEme>69SH^+u;}(N4f*b1;4KfvcteS@_`2QUyaat~_Co z6Dby6D8q_8S%|%|5n8y!uF28i<8?!;yb=kXW1e{;jh{Jr;%NF{VWVIk8AqHsc%DWL zsCMr8=Rh?MJ9~~*s9_gt)SxH|TgK6bm^BzaA&*}~2HK#N2hvzekBK}P%+eu0hG9em z=hy@*#xV^f>|z|x2pafeCO(2S=4LCiLpnAw3TagB6{Ew#{l@XL8;pQ_Vbjv`#^JQN z*bjd}6Nm?Dpo{gL%Z4|^VXSVID<1C3B;x|WudX#jA`;P9(L!PpmAFJEHqnXYnO3!m zI7J1-=UepIR(`Jdk8mYNKsf~Cj?%TS1hH!fB6`rgL=><8N#u)+A)-_iCc%cUut1J< zvi1^4&ID1C#gX!qPD*i+N_2(3tP^hb~AG% zLNr4wNCz+grKB|i1BD{U2&QC`O-AiwJ7}cM9(jU4JaA55=tlQ60Jidt4K^d_fDM4T zD6F`E7^;{=HdGJ^UmO7%syIsKDyIskbg6QJdkIhihs{m_VVilAg$hofxNAmAn$PT< zK*F$1Z(MFogX^P0PT+$v)Py1*$N(Nr#}nR>flrtMli4mA|g`Vu#ATOAi%V;B(=2%3~ zz7Vx^tRkhoC|?StmL|qTji&{9ggIpK&@i^ut#9SY4tafPi^l;XTqVmI7QC^Hm$1YcLv$~7-OG)ZWssXRATYU% z_7ZEb!4Xb`p-r&WHGiZO*sie&A#flMxVYFMRnR|~Ms55+nt2`T<5pP!&A&Q(m};BX#T z)A0%+dTN61j2-Gq{9+x za1k+1z%Y#MHjz>N7}$ydupqXs4l|5Ox&Q({t@zr6a zJ#7W_m9W>wcDA*>ZSNSC+SW?!7PF|IZ#~vHUtD&&eF9oDu2Ejv~CN^Lo*s3W7K~=?*jM9~!5`?#k3~EBEbV?Q2AcH>jND6jgn)Kp% ze^N1u20GB_^$w&1PXZIKzxHc`mU06OFG$nU6dE*lq#zTYh{c~PkP`et9JWYDE1(pT zk?@z5QoY$(0|OLU;AIo&P=n$BplOp6oK8&45Qs6cZWA`0Qk#{4ikN~?5}*iWAbQx` zz*V4P*LKOpQ9)ZaU>K!@B4sILaTrm?@|H8C6C-0OgB`9Qm?OhsEAd>xTkiCcAit${ zscG*(Ua$;qsNpFZxNk``hSeN+paVnNh-nDJ4mH^M=Zne-Q{&L;`En zaBUTHl8Qtc&c8?db|h**{RV0dNP-Zi98>_?G=y-f)2H4rBY;C;JfHy&oGSU=`;3)F zz=KVFWzPuNHR~0!UfbjTDOZZX1BiUtp2JzeXpQ5$7y?_4q-~UYX zHvAKoaJwSL$`*4oj>vNVzXik;cEc>q0+BT8EPsmw2&6ZD`H|6@1bovO4C#bO02mUO z1c4*Cy!(;KD+h@nzOT`(hl8}b!7`iq23lA_idu$p*r!uD0W3f&o6#+qqlg`NnVShO zmSdDsQo({yB_s5V$cu^?>=_yy2wZv~SlKUHVY&{mu$L$sS%8TXumpC>2C0Ct&9Q+B zOPfGZu|gRqbf|+7D4T2A8y#D_!+{}%Xfe(ih!GHkXDX=97=fjL13DOjQn?+)lY>4w zL^2S(75o4ucncrvqr`iQG+;bIl#}(Nxo)tzfp9`Uy9kX@x_qlS8z791urncq8L=ro z@f(PeGZY&c0gcoD5~#S6MsvYMQYnt=lS%;%u(<_~^AS}f!qu~eKDYrbK(&Np0bm@6 zQ+bnV$= z!5V~(o>MxEz{TE+xRxrPO|i(0NI{|5pRJlCpIXA1gQc)3!kIflrMVJV6pWfv2q+8{ zDHNw#8i!)=8|^B(Sz&%AcKP`K&8+)0rVk@lJS$OI0M`>2@TKy5)iT= zsJns~3p|jDZ=6YQWE7el2owN9QS=k!fyPx?$*8F_S7aJ3Y%hp zy_)>RUtF2TEJhVLxO2FfVh9>%T)mu;MowCVUQ{_HT(8Rn3B&Zq+|wxc$KyoKmJc;U&hH_B5fuPTi*nwr3sjgudk4c2FB)am+$OAbr&gpvJ!_zxB(ZqEhc3_ zj1!4-c!eGyt`$m%8t4Uckh7lP&tT92WhAMn!qyxBf;^B0-FgIRC{P<|404s$`)NtR zC?yN%OLT!nI;fgTjf%H#Z zfwIX41Dyg)fUuxUn>En2wv@_hY5`&xI~(O2#!(1k+Az5+2q1l@w4s6y7y=t32+}c~ zo`90nDHVLuC)+_3MFFU?IFPZhf+X~!UB&0j3ozO{@k%o`?f>@dumimY_ zlR;ki1|PwmlOzbNA*5DmB-BLBdvz~UaEMrV2q$U1U)!Wxcv?TZs+}nR->6Xxu8GvG z(h?}~*U}U%nzae8%mxg|Fgauf43opq(X|Yl%89@WH*Bylki)U_KAaGo%Sp;>awluD zoEwWuc(R>1`AkJxJfejI*|{^?nOc*$o!t4usE8d4@X#kbU!$v@Fij=WoEUZ>m9GlX zBu2%s1r0i=-%w#aZ(S*l8G#w9ydt)Vp+e1ZkcMfP2><$+@C}vm-3jgWL7(~z^ATLa z70t}BVwJ(-OHtz&Qnj&xTv`enrPE@YQH))bV-^tOi7DeK@z(WeJKlw41}xnkf;POO zUDa*f*wy4s=49-c-AgVG+pUjn36_40R#WxK& z0zAMFOqd@q=8Wql5vf1|Q)r~-LF0r#Z3KaMQXJAEC$wSoW(U(vGFL)eD2!(90G8V9~y{VjVVv|Ct%BWyy%PAg#7*>$g z8@(7OIgAv6n1jcWg*y~6!Gx1BkXh~W0l>szqrEd47ASvWT7>fD1h^jvI-aT}2q6q9 zVxWSd@Y=%k#>OlR4G?H?CTDYA;`fQ>fzT9MNQ#q5845c8<}g-fX1)kvCgwLL2%fg3 zIqu_XW$JK_nWw&#ib|Q2x~RuhKbFY@g662GCS=Xy%zZ8ql$jU`B8X!PhP6HA!gjw& z&Xv|UBd>WRMr=EF#|I|gU}vr(KdrLBJI>R z?Rfi6+Wm3)heiC7dCkV`p8o1W~jm569mqCT()ZX2fgC3PY>%LB-!>>U-NS@JJ(K|Mk05R< z1t#LVozgfBpGD~2zBAtTlLuFb1D9=-i15Q?g=G#J7f>Jp2E-2V=j<8B zA;hMuO18hsZqCP+>>l@VhU1>5X0}f5=!)5F`g? zBv+H;Mi+$X3P6%cEDsHgV1%GBR3q3z4To>If)gZlucc@*DBX%5&@-(-TAu&`vRDFY z^LfL9jsZr12~F$Bl?6IZhR6)UBtH zDkda#lyJ%vP6S0yH?4RJuCU>^umiqK3Ojj=9M-+NgM&0EaKQ+&GI$Fs7zku11DT$2 z#@Jdk&&{h18>w}41ED1i4fb}=Ase4`92d?{zrRf9^n1s5!SeJ^f6jSO0&6*PcYkeq zJ6n?eNXBZLxdvS5?{c9fpRV|!rxkdAHeQJ~ zdS6F-&-bQxdL`O-ey5Llkb-L&b)x_O5hbVctp_bDx9!~Ic&y(|(NJ)IEbhN3``=~( zVG1U&I0`>!6a~+>k{{g$3ww2YZh|oOSb=-7_j_BB^rQcwq*r?UWBR8@{KQw5sF(VG z2#0^amVp2J0nvJ{w|sr^`o5q1&FB0Zy8F%t{m>VENe=wnKnY7P{BJva#b^E24-dxY z_infVBD(s~Uky{g{M=WU%(wmC_x;}o{@@pW&^LP1KZ#IH{dzY}*Ju9bhoX8+e&d*Z zB9i>!KM>u=e$21+uebj0_x|q(|L_-oFe-leJAJ~Bera2M=V$-+hyC;)mfBAWGe`z) z7=|gph+5EwTKIg;0EkrDhB;CHVelZrgbEir8Ky1Oh=md-E@WZkBF2mwH*)Og@gvBK z6i1RQY4Rk>g;|C~OzH9^%$PD~(yVFoCeEBXck=A%^C!@tLWdG9YV;`5q)L}cG?V2i z)TmOUaxr-T09FGEwsP(2^()x0V#ks#Yqo5pNO!QZZR_?e+_-Y*(yeRvF5bL)_ww!Q z_b=eUg7Mx-+u$tX#EKU)=GwNVnPl3um6BLXTP+qz1ro&B@L|iGBSMlcZMrnm)GAhn zR_*#V?AWqr)2?m%HtyWIck}K|(&^OTQmd9kz*cMH5l@Bcr50SY)Efdv|P z;84H`w;*vOi3b33;7K^4V$NlEA%+=hxFLrf0=8Xu6pA<^SdY;Z*<{-AGKE6xr6*u~ zt=)9PeKp$H5rQf0mm`lo`uHP|K?*q}kwqS*;DW(5IFfN$k@zH(3RvhNl~r1KC6-yr z1!9z4PWT{s+T?#5u!V7nj9;>d9xiBwT9Av8sW;isA#;bkog+W8OvT%y2 zu%rUBInf9$%&65lt!j3RbMrZ?AZ16+LD`J6&L(}p%FW}LQ;Ct0c#{naN;55Lw%$s3#FKs ztU=CWhQ?~cm$|G%@--VX_aKo3MICjhVbc+KT(St-2$g?+`a#j0+Rx+kd=$??m-NRq zNV^pO{06n~hAEVxjADoZAw$cX{!CH=TRcN2-?GNrhSIfc+~5#PLtEFpp+RpjLlVl` z)6}SDHG_P>2W5Z*8J=*au6=DG9Dv3K$EJ$9kz@ofd`2ZW;EiC^!3K6)NDX@NjiR}2 zDfmnOphCWtj#b>?BzU`--UK(25yWk7V3Q&i1w^=W9Zn+aQrvQsunfnM@gMU5L+2Jl zxy-S#jc&A;zS1a1e@zNtquO0F?r@NU38Wd&Gl(1{Vze+`V0*RTGselEXF$2r8CnK9!qG4@+_cLR_Mj z=u;mpZP`Acyw5fD+gbmn$cZSX#16zfhzl|yKxG857;PBkFp)Tt4wOI|4a~{ViYUPg zcFh-8%wP<`p$cmGfDBjgA=-q60vVJ653OP06%(Sv7-}#Z@uY|jdFX;2CSsQqVZu27 zrh&d#4rK(F{?m>=- zS>qd1s?wEqD2^uO+~;BvI)mupSGo9sX41q3hqyu^&LhZY*n<#6=!#b;N<~6Ec0EEu z(jZ=N2rr;oFoTe;8FEOf9b1NzQl7G_Q(XujR@ur{R)U5pAptEn5e4=g1g)1)D_e)s z%bEp~D8Dp`LyLJ#gPfoco)CiuLJ&YvKy$Anspc~(nv!frP$=D0!2~@(Q?G$72})ze z8t!Q)7WjY;W<>}KQb2|@tdO!Uga$J-qk};}0~)I607+Z`4Rq8YpN%a^{XWS5l)NS+ z1*{MUEESs&-d+?TCwN58gj?L@rY56F+NeUl$Q(z^gN*aYMC6pvILE>3rDQ=VOT#PP z@eanN-rW}+L1#yUgran4LS0R@(L01N0vlGX-Fy#%qEPq_8;nQ@3oOMRsVX4hL@b+3~f-sT5ri$4}&0E*bW zc?GYv1fD9e!3l^#HqAtWhpd%h`n-S(4R%nsiq;@HX80l_EP8CR5Q1h8mSuxfy0uh{J6GWQ^5_aKa zD-XHI<2dp_muzMyzlaC)UI-GNcn)ogO3X;CW;qTrV{KOZ7dNBw4MwSu8JA-Rwz%0e zHf#`MO5zLGPDe1}*|#BPdkyLPvHT+bB9Na$E)gt(>2B@LUBvZwGU)Rn@Llr`ZwM(Kf2{vdJ%8PHjPf+ZWxHb97R}SXDBWPp&MYPF)BS{Tn(d7BfxXIQS zpS;cd25gDnj76lY70Ku;VV?6|QC<`t zpRKXN5EaccMBC7O;mw4hX4uT~t(<1e7&oX}(Ub$&d`pwPnT()-CIFXm%?8i~9kvXe za6nf=NEc(^fG(6#IH1v2TtGKCPAqU8SX5osMWQ7Cj+c2Mh7y25CS+nJE(0enLoAe( z0yu&$WP&4rff6_(SEQFrtrx=lN-Ye5*53p2*dir_+nEa7WlAk19Nj6^K#&aH z&EjP2ohY%%-&L4GY``oGUMtZ9In*9ZXh4Yh6E&Kc`*2cG*vvI-f)H>(9^e9uVO|oF zklY~6(4+${KtT&&fi$>Hv`xea1m83mf(CHFBP@}O@q#5#!3abFD=blH5SI#kfGOYt z6=*=dox}3c8SYV=GBv{e4c9|11Y(IwI<8|ozGDxuK-}ca3(#0_nWHud4bg}oP54<7 zU;+o}oYFwUs-1wa*?^|GR^8kIYEe|vfP*CeU|JQtf(+7BvRT9?j1%>3S_I|ar|AI< zF+&{?i#K=^WG&5x^}wrPV5jvON}Rw8kii%Tfj?2757@!hJPf1BoUmEhv#FLJjLr3_ zfE@TjA9w%@+`-c1;oZy|%Bes|o&!Qwn=~X>5u%_uY=RB!KsUIJyaj{Jv-%f@W0HH2C8YL8jp|$v-k`x`gD8>b3LK)42BaDR-KpiT2 z1td-)fA%LERbp6Nz#C-3GCW-w9cUR{01hCi8F`{3oT7Jm-AjPoK{yXKTtb@ofqfa0 zLe$PBC)z8ic>eS_xhgLP#lS>ZjZGz_hpX%+vX`P$!*0OL!_X z(8P4s6+o%r2-tuPG%E>mB-k+4l9dA$*vvEt!7qL32!!dFjv2%CmlvVlYk_ znL^~)Cm9VQ80X(da?e6&Kr=ccE2#qpKwe1%>5v|T;U<|})oM_@z%rCWl8r5$kzpOeXmpr(ce zs@ly-D%luB^VvWLP7^(!{h)?ka>v!vyt)kwBpz6cFASvg<; z{?P%p5raKy#t57M3A>;PE3N=n=f(EI$X?A!&Y>FIZ2NdgRL3#hNE!!!VeECq2)LbS)yKZ68OH z^NihzzK2r(z2Xp9N+27=9sEiuoJk;kN+^K_GVZO7GL+x}E9MA5+3kDKrlk|p7LGULyo}!SpeZ)rbP5Fox-r0 z;WA$Z-*76M0cECY_!-nN!lxyK1#VEJO(_eUKpe0nqP_?VH~~4k7MHFcr{N#`=?_!B zRuVDb2G#FNq@UD~0Uoe2LZE;Tz(J^Jh6ecA2>j~(K_HWMl5y!DJpr5j)>Vv+04#GG z>?TA2Q|B-Ba?$h;Fe3!R_1{5|u*u#HF_Gp3zl{YO%_@j6MLel3b8uZD;k*^Y71_XN z{sIdBK7(1=^eEu8@V&6bvYZT)Sq(E8JAkx7*xN|=#t!qap7=1J6o;Uc#RZI%b%7#T z-~bXwU4UZZ5KC<%Izko0@fFYUSZHw6$EvI@*LKmUZ}&Bwrvq%2cz1ns~t z=#9As!%NKA=|#jx>I@2aAwovPn5F{;Bg7*N=Nf264x?_C;h!;kf=()&0+R%3Myf&o z3^znA!!-EK=b589B!Vkf^Ss6KOJK7?L_+)}#1*&}XlX#KNtO@!0W{b%w5mWDu15kmyl#QoBN zHMPVDgy1tw>6|XaMek+(EcZ7wH~u07CqTD9+1Ohm?vfP)HBW>Bo3ufE0Y|C;K+!^j z8-xek?Ls{1anUPm-LFCT7Pc<=pQT5_!WL!brek+fEv6uD@lUR#e|REHi!u+wD&}A zPdMI)LnGXP3xp#-PutL(!z=WFJD!;e1d%x)WLQoFjR%7cXo11?%(wFx5adB%BJd+f zL%5xZc(VJp8(f+i)(Pyv>LRnkb+kc{@HNnltuDhgv_i9&doP@OLMlW^&W*V*LOjXY zGf;teQv{*j41Bx9^v$>RX0L3a!y+Ix{#k-7PyyI*frlFe%S)US%+|sGwt%O}LJoLA zYb~W~VYxxrfYQk2M7SEPp~RBTh_?^{Hyt6932h+XhyF%n67A8br62pgmW@tM2XwKLYodCU$ zLlIR|H%jT%JeQz$f_iC@2B%Y{LaoY_Ygdd}hOqQH)+@^wy~d^ecJ7(O z53JJ09cQkRz&~=&Nuw+9i!{08#MSZ2#IIUj-&P5H^mp93#1DCVliOAWox+0H+vG)arHmh5n> zr4#;;Os#Q<$$_O3x_Ra$5j0c5ju=BsY_Y#Ygv>+_tK&hMXXtxq1mWWPMw?YmTLG=y z1mjJvZ=}(UM8?W#sl#zTR6)tOFiU3@*lL97EF2#bVJ*4DQG+EjF^elrvwCTB9Bi<3 zNXaTGBmpitV{EAeY06P?xj_kCuAM>=O;piE8Ew@6(MJh2Ba2BXt<=&=xftsJ05~;3 zflopG^nzIaDfJ(B-Ut;`DKgQg5LI=%dF;hZrdAv?QdlBm}nbOEd<-3EilGX^e{to&=J; z?S1JXTT%-*8ZjZW<>+!Opc!p)h=BcL9+~i0s92?se>g%_ z>-tBsGBHI{xx*A-FxUma0ESG=YZ?1m;~vszMuRB;V8(LCz&^z+XPJwSee~lW0U1a^ z4w8_9L{}t?wG2F}>H>R+g*)&SNlCJ+jK8Ym7_B%*P5Nq6oH}B{95#th{%~R!Gvz5Q z<~xW1hh;45U@LtHsh53HV-8_uEHT0`y~%7)8UqTxh#4|o70z4IkTY_OCLVBj=D3JMEu;1E|v zFk>6C0nF}MC;-ucd@reifq>Hzu_#jm7PY#8nkH8CeA&45*0z3T0&ORweNlLYc0Ft z)mM$|tG)IGN6Cgt369VOR!cPxQ?U0_?#SD~E#T-a#t#5Ta78ms9OSlE@ zaf6&>CC7xh&9&73bD4rvC^|O5nFv-dOl4*7;_HsTir0Y?+s44Av9Mol<0KW#U{F!H zRPxR5o8cU1InTLUhh%K1z))RW?F+jRCa+=drHea*%E6|hs-J&F*%n)P$;Z_2qfyyt zM0r@!X=9Oy)3U%(nz%8K@rsI#S!q#Yc4;ss!x)4hklB`j4oArGsEr7m1Po&lM*bv_ zVI3Pz1Y^la&h@X8+hiwG3d%8wZc-KC#ec*?%>*u$mX~@j{x+cV>}EQTo809#w_Fd|-K8SdSh`pwu(r)cUBqIIg~0Y4!C(rkPCHamylb=lJYit7 zShJ8ecuxlZ-W5uV+SUno_`?}B0`!!#;Sh&Z=PGV-BXTs!zSj81M=9)K7gbYFR6xMO z(Pst7OI2%Bl@j)?^1UM19gDppqVYU0tSUC!qRPZS#C>j|51r^m=T^Eu1qODTDjbfu z`O6Cti*Eb17yNpdG{&V z%^v*!i>zJkzBm5yk)M3!FQ56%Z^_=B-1nDASpk9%)di|ucrT056i)}k;yE8I2}mL8 zO`T*o%G$4BUBD6Vh3~T1Dth_PpZ@keWbRFcdS9vD{P^kyy$dT7Od%F@VHpt2RJtJ( zFfZx!>>r@*QO~!`ds4g6risT z4F~$qR0i!+Z~*cCK_B`|=@Kah@r+oe&h`F5SN6aJ;H_Bx4OBd@{*W*Um9UTOD*x1s z{d({py1^6*K?>$b38K#ZD9H+aMP1khyDp&rCNQ#kj|6Qi12b>~!@>;Nunpbt4dF2V z4)e|gi3$Z{di816x?#aeN1r?yW^etb;h{4`V`9&RS1#kAS?`PF~Z8Q7`X!YcJa}AQ6e!iBQ2Rp*5F@Bh0ci2D{wo}wE*h_IAsLUsaKI62uT)4e6W-wJGzka5u@|sPA6U^>l)&`T zksXC{C`0d%p6(60O&+`P5c4ex@rA4kfe6|Q8;xZi5E9Sc>m5bqzZP(gDzGDkq#}dw zBEhmO&GIbKGA-BcBb6v5A3_;Pvj5znx}*_Q`fnKsEGuJB39xLeSTP}e#RQZ<3f^E3 zEYIG+KnjR}5`RSsV!X zuPU8x7FlxHX3_lS;qfHw7S)mk#M11@@{?ZR7?9yT)bclhGdP8FIJ<)XEuE|6q$^Yi zG35-+SC%duLIwZ+K^GWP0r+zBOo0nSMFR3o6(dO>`0VN=pb%6s9Nu6l!>BSbb3NG; zzmSdyUQi!0DO6rE3cF$6GQklFL9p&o01NN{6|CoIuPO%(3{+B7P|hX`<}1t6HgEIb za`T7);TVoV7JN|!NPrY5lsD_(Ldhb;ctnWShd4>JL{0QWTgy0?C>c%eSJLXxK*fvP z;T5|MMz6CFg$2+^(^#g^GgZYg#RyrtQ3=$uJ&p88;VRvv%2b|8Rmk&R5)ceN(_n}o z>ZYz6$dSMnPZzGp98d2R14b7HEF#U)K_3*-j_3%UVk2nYfHDlCBtiiiV$Xajb$ zH+?Y$G;~9~p$>>iIauJ*LX@<0Xi#?G7aRv84mD9xv{4=PQAt!qk==G8w)`T70gFXaSv3{D)oxZwDMEDNE*NEOCyUx!O~36RKtqMO{aoQ87K{+0xB?J z4Kl7!==52=AttQwJaqSQ&==P zeI@tmG7n|)T{sn4L1i-8Wi>;E_C|AGYI2TF(G&{OUU)M9+o;P}OaU-)byq<)WWl8g zPvuoWr2&E!S4eRlcTWjsm0e=cOFNY@n-x?t)ipPXOv{oYQE3U#zz+}s5lV&;4nYvm zUp`Y$# z2W%lNreO_)EDs#We{yOySb=-iHh=|qfPt%RC&euV0xm7pH4XMsw=%&XY!9Yr9&|A4 zYETziarack1RSB;bU{>U#r;fyaUZvYP56-9A=?I#T}(Du$jo8~O*#|F5ipNo^RGH( zb~;HHT9fT`3r1(BHN&RBbvpqO$1>$%&bVDVFE1X0wAgFx8_93>{)96+IPyS*W3MZKC;2V+wFCHU%(U%3-cf|HM z(*$Em{sM9IxEHWtN5%mha0^BPd3HkVj0yOWAvuzb$bd z@7*LoSz9>i-b)t%vt~{A^b|Byq_rbg*C)JS5{lS%d%_EZb`sFQS~sqDzxN}epcC3a zUI#^sA!VFwAO}dHH!*^X!?;3U?ID=p8`8lN)&OOQ;RHA;P^))tyu^HyV@8T$ccXw6 zuz`ZO!o;Sb4_x38z5$V00FUbgea6=Rq8XJ%(%}_!pa+@;Z*pKuHd+U?N7I->1g0T_ z8ps-c>n*gQ6+BduWqPJ*x=<(?fmJ|(eWd~afw4+5Zy|7k`|J%8cMq1*WxexQ8WJW8 zOR$242p)5c2F(TAY?f{Ls%u#@8$dc^p*m&IydnuNSB^>H$nq?9^CnjTyzs7YcWLK%5}42+I$6B1!|xdbc3R^f_EE~0~lmB77q+p6f zIaExbFB7Z~rt|{X%&*3aZmrD_OD`5bQvzazgt2wkzk^kBkx)#@_G`G*e0?-Qg|W@WLFP5>xeW!iU+$T zIDil=0f3rGh|n2g+Bp#}XR({tT^A+=c42`|V?+G;e6H7QVx*79p&T%vE7pg`SYfr# zx1t5YwK3Wyh6Ziy6-%^4wTa^`eA^{bsC|<=%B6hDm3z4>xhr(~By-cASaiAHEB^=Dk zl8&Wd*w6h?B~-TBscz1T4!nnXm~K-zSb$iXQOOG~!NG4r52nHocwz|{p%c1!voJgg z2w}q?0th@DfUq`e6Z?}ifU#X-117W*W{N3T+@xh@v#lhcY5cYYNG^)uuw_JtguB?w zCXa{wMaGr|R_h@m082&y*O*+IUZRYloXWL*+hzKu-&U#qC1CWyr(u%|-vIH(eLI!S z6sptAtt(c2GGMe!@(ODiqHq~v5dY=@yX+j#{aqc?O#*I39~Q~G?ZxH_rp;}SCZBob z+|N^KG+(ew-`|D*naBDe52miqa=~w63at5wZNdy*cdvJX3uO1fPpQIz*_oe`dUQu8%I6KJ4 z;Wt_aMyMVmWE(a}MC8qPsw#j-X=I*Dx~5NdP3w8fz+c|uw4oXJbY@8 zNai6W){}St)|polc)ly{!t8~>DfYRad7U%Hp%~Tx34}gIPT&!$#t;B?K#IS@8MJ=} zjyY;Zf`JNHAPVaDH&g&dSlVYi1S6td92(&z(trIif(Pc}?0evD-hEH`6}%JPr3&?Z3%B zafEyA6>Hv?ynC-4VI;Wl;lzV`>2#>L5j~fhce*4F37!*- z1}d!3%ZmoF!XZT|>@tpxHjd*XgVKysj&Dvr31yU0PDy2zR$hr^mRfGfTTC{6Srbkb zA%Is;|5zz;+fd!SrNlf+F{OYKPr1XI0wyf;)I57&bpdC%X@-`cYt5w@SQljC=A60p z8IB2b+4WeYl1@r#rIucbX{MM)7Rf)MDG=0J?tEI?9+@nYs8Y+AlG{&jn1W|#TJ#sYTA2~wSMUU=smBF-9-#U+d+acyzh zaaZ1R;f-frcj&RC9(%p55MR6A3`CFyfFL7D4jGZai8caq(}=w)d}!f`gl-~6S2^;fY;!{Ns>Qm(~7#wF3oh)PCpHG)KX7P_0(R1iM5y% zAq#++J~@&qp>Za<)KO$R>Ju2LE>mY#sp^@T5{{51>pYGWs@VmOq*iRLK1ra&A&_cH zc;SX0j(FmVFUF}m64;vO-9OgH1A-Z$3;ZL|oAY=vNSdM<=y3qj~C?!$L^t zp%mG0Cx?9!CR|H(Q!7ZWfb!bddUUJSt zJB9PZJ<0HhBeL+l3JilkVtVWO_I(cOtKU!u7@S~(Mk6TALi`r#h`);Bj~|f-{~oBI zfsDm$14?6${usi792{^29Z*_B80bKT*l&L!nV$_7G6DfQWPZ!*pa(w)!VrpZgd{AX zM6QOlFKKNeWa7zDVuh=pwCPO>=mNC56Ny70;t-SQ&Ltv&h#dy8huxV(4uz;gL=e%3 zIAlZ;lgNljFv5sIM1&xS&;YX-Pf=L8O2BsI+KjL z$Z?KzjAC6dfe1S4F^YE7qaXh`M@*bS0j?oRt#BYHw(NmxChTCdw1ZVY?-Fv*o^Y&mz}}=QN}(*s{~C$PRH|~7tZbz#UkOXAr7&wbDbu0W|56kgl8q@i z(4!y(0mxtqbC`7W12E}0NVD{5ExD4yP`-G^Xi9UM)U4)VIF&`&!0juk@>M42c!we6 zKnGP295K&{PA=#m2S1nt9UoUn)%dM4Pq_hJV%fCjInNK5-~x8;&d5Ur?1FN)EOY7~|zoaId{(n0_bqMMmG(=L5-hB*#_0tYyN z19HGAbjtLPcesHATuOl-%n=r`Xd71Ekg8mf2Ab9^s!@-MRK;OaHsSDTQ+%}tM@c}A zg0KPC0N{Ws%yg@Ci~|MqvH?HH(F9qHCv5nHsG;cKo*S)_KD$L7|7Xb|puxdpCxqC^ z;zUoO6?JG^TM00Uj)S6qEv#V=i`c{}mLwhZs7zKU5w3mXDQq(-4Smvyy7&PDd&w$S zKU)O{>;(g2jYKMj(nhe@<|%}71W}U;+t|u>wua$Uu)g95T}VYVbvXoQ_i_Lue0Hl` zxGG*8P+CI#B%W&m%O2eE1GX-fH*dWbB03>gy4ICi-Vx|@E}_tcLe#I*Ew6dci{A9A zcfHDLtYaY?k&sSyR9~4PRN$n5SfrvZzugN0;xJs9n!&hu!9ZP3JCt83lWw!|$!lo~ z;Rs7Oshq0HSJbi$vrIJ-Ywe2zVj5s!9zwKzu|ZwNkt;&J|Hi2b2x--Z;DjuAfeTYu zf(}YawMRM+q1p9raJuuIEPOY-eLWw0kBsCbD|yLGPO^JF3SWqD4Hm7^6*Oza#;OYAI<}NChfE-R;2>ZnK-;9L5Sa_$Lhzl-TGzRY8!rFFN@0Fpcn+ z14L#V|48u`p|abbFcNA*FoPf_0qICb8WDHk!VMxQH63@0$CT8r5f1vD=a^y0d>yZm zn~dsIt9sR}ZuJMBJj*CQB&1$jZl3U~mi>m=FM{@SF#SN_yck#zaB;*{z%Z1`VnsGe zU^ASb4ee-4s=~tZ$s7N%jK_VY0T+lw9022GU;l9g|9}xLp$lzgM1LiDP0PZgB@J&# zUn0_S7=rSu>nuq3csPvUZYP{TYEKp!)2=SK!4Hn`ge%-5uuh?@9m2I*tJsjX9!h5S z+!rp0`;S}zi~}NZhAg^jS6@lfJe)1#aN1kkvgJr5!@c736*x$bBbh1N9 zv3+LALQ7RaqYB^jSxv{<#jmvF7-pnYd(T6eCu5Ay4SxR!iLjw zOl88#8r4+1s-zU-e9`#L>DckVe4N-{iRV8GffXDi3gs;CyWdmJDZddxA8OJzP#l4$ zd_*GdexbnI^+@i&3?UL**vC_Rek(I8fZbfW|G^!O4tk?Md|8^l7PS0%ow+{U2wu>` zC5r>SgbLi$T2Beq!H)af>wfpVcaqq_G)bKrvb@q-99UK}5Cu%PKF zc!xRP|Bn6aOBkC!k$}nDh67@`BND*=%MBh+$04*l5?8Pr$QiAb{7Cc)pl*ol~U^G7vVNc zcQ6NW;01AD27X{p!}L{tF?pd73yB7Q43=WT^AFdjeKSadN5y?lH563_Hl5K9b&&(S zwtRkc2VO7)9pC^6;8Gp%16&Yf}p}+q%wYkQ-hnxiA8mTaxxTDhyyT$ZF|6N zbs-3Zs27t5NPZAnf#Co{(1>+W1;O@Vbb3M0gRq+;YuwQne zioeK;9H)qlXNZ0@1O!F_oPuD<|JF9~Hx&9n1j{9ZohXn4i8wbHD;cJXMA0f6Mt-|? zT<@qyeh^)Tp#!t{ig|I5awH8>v0A8Acel}D7+`j^w8UB!&PT z;01tW22Us$4qygWi2*J2Ql%wDvG6uj2r6lERt~0#1gVy5X*k>$PyaYJPoa4VaEfyj z2babILjaa~RC9_UTz@18RS+{bFprTi4rODB#rG9pfQ0~n09wKV_(zh&Xa-J`lGi~U z(b$sy#*)%6;2jlrxcs1aS#S*%f(rE5cGpS~f?Aa0hp=mvkfu6R8+Fa7=#W2hZtCpwcUI zb`*s7554dxV8oW?X`YpWO${Iy2^keLw^e@Nkcx4OGev0guqe0E4fy2~oM$C+FqxCN z1Wi+V-I4{6hI+ygb>9Ji#j%CaQjNZG1l(~h1knOf&>faQ1-yZi*;tySq#**5n%vVM ztQiqHDGrO^5IgV-5;799IWZhjn=kq#xS5+ZdItOPGd@rTc0dNZiHyGqq(N$M!TDGg zAqaTE0gIU`R2WaC|1eW`fR%?apXd~Qagv-rb$Mt>p6AJ>U8)$^R7mrXMHg^V+s2UR zbO+9d7+Wb*<(OjHL@M=HB~I|4lPL%ST8)v!2mm)6e()Tf0F%Le_%niNq=EFc0Af)X)Go3_b4I%)?yx}#SxK@q_) zHgE$z;G;q+tFwA=M4AP|sRFcScFaV4L~)(OGzXKyrsqU=z3QC`@J5cK00HTx&FZXq z!6^!mCe`;wh`DXuhEBmMtTI)3tW|NS^%nd|CGS?J#fYm?a+&|s35;-{#(@T5U{Ke! zdRE60B#@|^|6rjLssd3E2MSc7m(U158mS#>dju;bnwm0GqN&nAq8jn3ELswx+7S|4 zs&pU(_F^xq%Birb1CUCq9}BYRWvjS4d~hKs?jRM*gmx))PI6Ew?sQI7YOI>4o}sv` zY5A-R%rOa? z*)3i`J@ZPhD{%s6&<6W@9s=Y6BLJH!00e~42rogYCGoZ>5i}ly3qC16m#ROUK&l7A zqBdhA=P(UxP!W${4ysT-1n~mPPz*WHAjO~sCG#;MLlB&RAU?ArEn*=_vIDvxG_Sy$ z7eTQF|A8+y@-b^5K={%z7b3d(0w94auphw!uzCX!K>{?|qelRS1rfWk$`CKW1i1+Z zSAe64`@6U6u_24R$(u?eJC0p*D5;_gZ*c*)q6>~92z~TxYPuM`Moh(ej!;o2g`^KA zz^prKzH7-Ty)YDna*&$Q0DFK=QQ8;>5S@VJDEvrqY1SG2g(Z3*wUapoOEaMU*BpqD zJ<`ZemoSr{nH|0n1(U!A8e0%9kOr7wx-Jp71ADwC@dZaBAeMW#3Cj>Q@}hi85Hymx zeQ=U=pbe{VxGHd|Ff0w&;KAb%3w2$CZh5xOeiA0Q$kEKmcn z|6n1uX)y`%3~7rJyZgBf;RA30ygT{?4z#-++q*SN25NpFDI=-@l7~;zKLv}oC2Pv0gC^? zVsYXQibqV;St;j7Ok`Dsd9qvd^bahMg;Vka|2vs?@VZfAwa&r?)Bzo6aKOW{1ZV&) zch!sx+`zn{0r{#yDi8wBfuS1=5*aKK!aNc$pbO_f3~g`%Q7{UXKtFiP5Sow>1!2M} zzyud#2pWI{H3AH5><}98uqq$|-#`l;5YDG*4x1nZbilCwQXiZE!UPe{4RH_${{sar zkT3!v#S>A)2T}}U8wIR@4GJ*=e=rWykj)(M2-7UX(?A6ya0GdPsSuIFnF}+ls-sw( zn|442Bhmpfpanm`0w^E@WPk@6M8*1pn`?XmHNXQwupb|gn@5lXCs5K~P{nVo(>wiY zaV(BxM~;-WTWaI2KVd|})R&i{Rl{^zx`1Xr`wy*BNSU~$ifq;BTNi3#Z60YBGn9$K zq^+1zmBW-wTdfo?m=??6VphVnq)d{h3?%~`US>c<&w)gB%?Jx@%eVXzxjYHsp&}!I z1m=MWRA2+Z+!4ea%m#}RBftdX01gT?Kl7s^2&*y$F#;q^&7gV$@GJ=d|D*vd(y$Pr zlfl3O1`Q4@zylJqu;#D`hrKfwtpf18!wfOc86pkOfB_3(19rgB77@A!Ar5LV0v@md z4e|^lFeKv82Lv<%qN=IRU=ID_%@a}4G9ud#5xc0$qjnGkht0+;umWU|2I0-I1tbGy zkOn#+J~m)KW{d_R1FIbk*F0_C_l+gYTM?4=58gO_1zG=D+DYsyD=lWwws%Hpg$?CyD4C*Ul0ZM!vZA@#=vU@_$}#^&NTW> z5g|ngRfc6sQDs6Q;D4lnnW9s|6biVMcTZ6(Z&bby&gv{DXG{T#^KcfsG)!htI9b5q z#d0R8(Nww-%2FbkB@TM?HgA=Q;xvxz584~KOb9r>=PYmn6@0;@N#q`(*hNmN+Kt>` z{@W(}G6H&6YaVts*DzU&wpK99r69G2- z5uuv`tWXYJFG1qn3)Vo~Yfq}iy&nOc4u<=q*ZndZ|4Rpd-Vi072SacJ;!WP>&AXV* zKsIgC3{%oxa050_(;-j$wI3xTFA=&L7SLNOcx-XPGzEsU)PNLyXD90wN61OB>N(H+ zZ&qOl`9_tf08kAE4IuQzbU3qE7s>D%iPnq0Vj62rB|{MP`A6)NaHq$9_3MuvPIBXO zUl9Mg2@=eq9?ubC{}Byx4!A(ZQ2-E*D%ns`kVT1Z&k8QIGp^VgB&@!TyETFZoN?0z zM-`gPRl=zv!Z>k_aMtK$4i^=Y zJ(c#fb8eN#6OYanGn8~83W>pVX!$kHX+aSh|8sNz!pW(Jr5;0$W82nd+J!89(80PHrPK!K@$!T&k(?R$^#f2PhvV&2?&BnrEw zPp4kp`t|7)o^Kaa++FZJ#c>EPu0Yp6=6A5KXW!oad-(C?&!=DC{(b!U_3zJrhq*pe zd|M_sFv|1oyMJO)paBWCdoBz9+%v*K=S+x2xOv_v4~GGTb4Lg1UbAe8NlG;FL=;n0 zaYYpo5wWuojF53g8f&!iMjUh0aYq?N|2zSYOM>hq$V(Q{;71{Y#DogMTFYXHCSQ9p z%GX#p;g7Z^+Nq$1+G^{Tf)Mf&8;VpIfdp2(@)FF2#N2WrI;1&=77Rp?W}IhUifN{r zZlcLcw%#g;C@%&5;?6>EqU?h-0e$m@UI6_{1tt(3=Nn$Wc}fKlzB#8*HK?i{cJV<(M)mK-|12Df>T@?+xG{9?BJ8UKOMPiFJ_E=<-Rd!isn|1bC zXqAf1Hfn3b%`ya}GXM+({|QHl@-7r^j|K#xkU2jhbkC1-BRQi1CP_JEM23y_1|DOUd1je?1ainEjcftPOFD^U5E}@R5=vsHJobbfpW)iK8Q9#Gpk_8r!FvZfZMnL+`YhDpyQWyTvhOKmn8GAKT>r(1hGV(xz z3@z-Mwbe3$z16N7m;jcJBcM{1RXc8tc6QopxBYh9bJu-$-Yc87THvp(Ot;-~LCzG2 zeZ!$%hrv}~xpU317yvKY|LxAV3xrEvfes7w4UByEoql}s%Qydg^wmB19}N{?-udFh z^;iK%CMLe%L)taLw>RbyE*u;f=ncB~P>7mEvXdoHfhKa1?P5eT2u6@*$0D2tSYSbq zuwVome38*QNVH{f@G>MJ;jjqjGMsn-EgG@E+o^UCR@dyT4 zgF~gvumdU}+zB*57#0$)AU9B=M{IBd6$~+hEbsseasb5`_D+ji=aW%gK z9<_u=nQZOm8^Kvd0E@E+{{;tt#WB~pk}$mqoeL4==}>rlbDn>APXS5@U-}GrNJJ)5 zkpf$v_sC-)1UU~3|Lw5e_zp%P6ToYb%=^bYh+`lH+|OA?SYRnnv@(^YQV>~e77HZ! zN?77ZjG^(Mh-x`YT;{Setc*)Rs;Em~22+^BBxW&kinUs zZ=gq^kQM9(?Mg)~lE<<6aV!(XAwnS+c}{euQ=RH;q;DQ69*1FX9{Fh3AjW5gjFsmC zz!6Rx4Ky8R{lJt1MVTIM=gL?nG?vG#%q?BxP=?~pX@SENFC%(UjAm4$8|7$6o0Uvu z&gP78Nh1Jy^Dzwhu{?F8PzR=mF$$&PAKic$_`G$m;EdBZA9B1|98o%p5h)|6$xw;P5~1Os3MH!qJz5ZmvL>x( zUDiYc_Y8}&RjzZTYhCSnS22P#q*)kgTJCpJ1>j(s-g2WpFVU{(Sj++3l%qR?gVTTL zG_d9rYGo~ZSA07ri)BuBCE|3L{|yQ z)hyiZfo0`w%-FhC)c_Z-!zFHUjeA_=CO4RR4QXGOQqtaBAQN%SDJZ2ok5nLbdW$_5 zBjTu`4ml6B%A;&%&3j(-E|RFe5!WYuGv45gmO@V@*l8&=4u@r;unGV}hmfNJ1Af%D zEc$9H|4WpzALzEX3*OOhL1@bdD_6o3rf`KVd|?cKhPldgu2SxIg;-GcAIpGdU|pNt zbGg)F7_c74=H*%QfCrvEO>d2Dd}E7kwte8_Bs#lapj;fUEb z>kv;qWh%jHU@yc~SyjIBm9so%RHs_it7dhpi&^I2F;k84WpjUvyo@*KpyM*+imKza@pQH=XuY4{&O$Gx?1}7$X`t!;vzq@IOSr*xdbsicAZP636nOp z8+Pa7oQK92=X%%8yFQ2ehM!9HO&qX-Cw$=ze|V1y-HexkE`Loych!np0Znfg1_}n#nEu0$9r|Q@%k!PB zdtLOS_v!lnK?L#!XM5rz`yM9t^nzXTzM_S@fxv)tt{_PZ>Z&?Gtct!RWn~mcRS4<2-1e?OdNz)0RM{KnV442uQx5(|LYNdmn)FyJc@JrFf!A->`xtK(}v2Yf&X zj6ez0Fnn7kY>^H%a~OXErD{VEIHM5Q8yJ?NkUdhE$np(4Gc>9Sj?h~_{}+70=`p?5 z^SI*Zka=N{iHU^L8W{UJmqL&x|KIpQMchB%C_-r2 zAV^H0Bs8#8nu6Z3#7lgo7de7Y3=&Sni4#Zzl?g=zq@@UBmJPrF6|ez7K!#LwMSu)Q zfgDI?fklyuKET?L=~BeidY&AN1TF}e?#sb5FahS_L-wL3hG8Q+L`IMN$o4px4w;{4 zW1r%<00dbEiFwF1^p_ua$VkW}iIX%bPyi{|gF@H?y8}SmK?AQ^5x!%DB&f$$N=M^+ z4HEdoO^AXbX`zBZ0zw!BLZHW?Aw^~JfGJc3eI!V(>`Jfv%Fr-K*&w=wXuR^cy&`jm zJ=h*yJeM5!7Z!j?K@gXDaHEpkuRiKXklahY+>L{|I(=Zo|M!Zo?EyqnfXPT00e^9T z{CUVyV6AMdmwAwYlKh7s*bNH6oh*1c0`s&2JTN_I!b&vCvhtBLXaf~s%6D7{Pqc(4 zn93Zm0iyH_okNWiD1s_P21)3N4d_Qn$bq3C1u8@aW3T}%tbyDF1>pP$R!E0cm`$*Z zPU)OZdJ{{&LP+dMMC1sES_=ia+{p-WfL@#!g$s`M!85FTIEQHfz3fZ(M8<#YJBYHMR6;N4B6K9p2`ZK- zm;^Qunu3T&Ojv`~gaYX7jM_X6+^oW5@JF2JO)JDg{}p%v6Ft#?EKw6xPEvu1ad;c* z%uyZP(dw+gSiHd9I08o)EO{wI6Z?lWbgKLDPXJ}C1X;oOi=XOh&-bj-J3N>Murqhq z$SBRov~#Nd%nu<$%={bBTHJ$JNK*~ijRUaCR$_rA(1X46Os%~32CV1W-H1w^e>+(d>% zunI=ehE{M>9z9i5O;riAPO>bB`^i8J6u0XNj_gCsJ6KZu_)o-)1eqc`l+?)LIKO`g zAS$&|V^u#ay#RgSIP`Qz-v|dv+ExDC4+Ln^|A~QBGp)sOW3t>C0yIE`&YT245WX*( zP(Af6V(HUKFcQG<#7!WGLA8X~tjc1M0V}i%4CsJtyepH1GzzGpjRg1k?j4du!mBm?;m-9Tyg%l3&l-B>d4+^kWZX&yl ziNnv57vCt>V~ts_!_uX4S@<)_lhlS?WsXCrKl)IC@q|et2wDAuOswM8-5G)`Km$F{ z13?f3J&*%4aDp3f$}Y0Gb2Y1Uy-;>dj5Ju14T@JNu-eoZQPLQJQ+!c>oY;bZ)Zg@o z6cEl61%)+O2zz}|DpZAx-CMrx+q&9V|I4_aT!@9Wv@W9c7BC<<#2f6znY5+}LG*4O}h zRfUJm0U-d+C~;d!T?pg6&4Hx?h4qCY4r0v#Un!nqD()ijr3|AxOO#Ws?SY;{AVlh* z0M(@sGXP`vU;z!@4l@W-6=+NW=BIyvCcs2J{!(BDzT+D^7{RRE;MhMUh$Cl|M#Zd- z1K@&oIRq{+W9;aFEC^xdn1e9Am^zZlXrsGMS_WOvJ)S%~7>?l^F&3`%p%#kQx-eDI zU|!L%fkREyCQ8w)WKlpc1~upaB}N85(15r-22h{^4aEsYaZcr}VqqR;Vit`nCMj)s zxW_9pE;f)lQsn7y0F-SG|3Aor9Pr>0&Vr!bjys5C02l%0c$aGHnDUSSV5~tq#$$Cp zuY-{+JF81BebNS4$;-SB@yx+Ph=bE*frC{6*);=4c8-#zj<|Fe!8DMQ6S3gPCgj6f zPp+BQK$077N}Lc|A5tqG{-F~{+bT4My4cj`AsC_?=mEg?21O}|Q7zS&o@~mlY|EJG zrKp&WMGjrCzVFEd?^LntIDl;)>vr)250;J&a2I2fBi3r|&y}ZQq-xsEto1=)-+=9p ztyuz*m^fe$Lp1G)NowlwwfuXnLMX9l0s}B8sfM2G3N4ljx*(Ss0kYk)jBX7m4q{RX z8XJhshXo84FwXCeP2((x5qQ}0epp(jl8Uu#_>OPN#%!g~Yyil>&PL(lkOD_o2FuMZ zu-=Ux6z+EU?e$nJM2I7rDvt(05VEU7eW`5;uQAh;EOBv%gMQZF*as&`bIP9NCPmS<6;|9oX)-g z2LMAB@rjAZ1LswT0rF=QzuXoMsh)5uS0rTw-3vHpeL@gth=iWLj^IY}?HFY2cu5mb zfnClwFkd#`z$ zzj>V4bB{`sO(9PEu>h`yS^;JXwcsdB=IXzx$fk`Gt7Z z|9M#PpXaYk@UL3cml3!h3J`d+-;N~szc#(3H!Kfsr(+2Y2S)7hs=s>7XFulHvEa}L zNfHi~Re))Cjw$*pczQ%jt z5B{#y`+_JbTI4__2>cXJhSKGNEExC1caS@%0xk&JGdQY8_l*YV5O_9$(W3Os5C4ge zgl=Du4si!J;`D@BI>n8C0)LlEQ*-L$&hqfaSdaMzoB5)lapCWOfKVZDAi;tL4W<7U1-^KCYS~;8>FcP3)ZDGh7Ti7taveF#fT6!Mtrm- zjy<|+-rdtOrAm*UKZEW#!U*Zorca|zt$H=<)}%wj?wDoBh}Z>Z*S4*DH}BrQe*+IL zd^qvq#*ZUUu6#LjjUY=xCwa0V0;??PI_idbW;j!Ca2%Cz;erGc<kAA)S_Uzxg zH@~GFeP=`@_-!dg-^^Yv9ns{7UzyBARa*xln4p3SGT5Ml4?6f(Bs1yK|B?wZ{nJfe z4QTg|K2IIB$4qZ1AVn-v;MahPD}s^YiYpR9L<26uC?kyx;4sfW0?zni1HE*k*RoaC~;MDOY%0FYfnNM<&#YAhFfn|QkkWeTXNZ@mtTSzrkG=rS!PDhMVIDu3~>g4 z0T*PVV@>nKvIlrWwsgTL?zkhPiV}?ShL1iHA&owJ_-H~i?IEN(|Z5GI>pw z)I35SmE%9A0P9kyGsQAwQZ|`#C!Ta=g5f{&IAE2T+ZyDgl;46I|0TB;VOb?@Hu{G&Z^t5}(`GdCdddWh#S7WUj)d`iWTi086RDv|uERqA* zXQQ3A+H14jcA50nD;-K!eWNqbPftt}l1TA8le8{@(c#Z7nP8X8L+0%?5tZu0vrCy~ z2rT5`n4o|JhRZdw%A0fEx#yp|wNq3xH4ZAwbK!vDhxrj{|2WPrd5UrCG~J!|Kf3%a z@UTQWV(nd~I6mYBm+3II+sb*HwenZD{dH{46DRgK(?7#P^wN~GkR8+CVuSUtZ9n}v zt5{^m_{XE4zWVF4-#%|}$1T#m3grtx-OGRoFigJxvy5gJ2<#tsyMQTbvNOV|&S@?A z5lsp)89Dt!fspG)V-W_~!7pynk?@V)=gY0Z47CeI*O<)+qPU_Gl zL}=lVfLKYF815gZd>MCur35*>j)(v1pa^Se%Uj|yEF@H#oWcPt6;g(jw}NHxUa6GX z4UR|!)LH((;Jal6PiZmP&g~ol1`xsNhyY+@Z<5!oleGK$TO3Q;FPSRjIN*wHh5ET0~K^8p`}VUTtx z0~rQcNN!>@qZ-}lMjaWyNFrndR=L8oz>tYl|LQFhzx16hl7<7@;qEA4sFebt0z^|x zCT}ZzT%{=Y5?D$BRL5)yEputqqayW#yDU+qWYv<`#lkPCqlut~WK7w)q%JgRR#t21 zER@FLPH@7EE{KSfSU`}PGtnkTVdG73!WA_M;R89%Y0gUIfS?W`K|43G#e1qi15v;P z6>_5iy@qC=o>6RY%-D@*5XX$ztH?nU>XC)+v7x?U0cTmT0y5x%1t+jUTT5%&)1nq^ z9*rAF4{oFS;V+CwIEkye}dOIfyahYtxDLa^$UX-LDZ4qJg^F)tqaX$O+ES1{M4jo`D@K6cCF~F`6qkzuAE;rk4&}m~9}E z{ii@U(a`N#)&+m~MjodzV1_)x9I80%KwhwnV&veA#n8ep#*q$UG`PcQG)E-{vVvZu zG05Vm!$5YRi|JkC6?ugSW(h(9PLTMcY9yO^MBq5;j@RYIBkOIQXEKj@S zssfyhz`C*Nf)#g2H~`|ci1pqhW#VsHeS;~Mk+)?~z<7G5$P)SM?EW645&^a=JyanC z4^%{+Y#^;b1d9nZa2Ym?l?{Y@^92&`xW^hkBV-8z5L{_)`U9!v?yi7mR__dwM+fF_7(jZz8K;2hy;2FcjR7CJTfFtg!bq)Nt4u#KPWs z`~WKou14?K#>*Bcs1N7>(Ls`d4tae+8NMu#&wgRaYNjX|-~b0NfO*+MA3D+XyxMyC zxge8NYj@s|G(*oxr6GD||1@!sN(x5WTIy{stcB)|Op|WYm$OL)pDNu_qdo0v=Zb{% z;WU9E>Zv*d&js>^^j=ZR1@idx4c!rgl|m4 z5E?)Nlz|cSgJ__#DiFapXwd=TOV1pe5CR>rm*MYmV&Mf5enCinVJNf!3(^=e$}g_j zc#oqP2aW=E+7VTB~z-a~$fmw(TKm#4uEpnwn9 zffcZTn&AP9wOL;M{}CA+K@OZindMx#DP9Fy;03PF(W!|;)K4ndMK>%%EM$V6Oa=}p z+O;0WH3+|X9Rntni#1IbjSeBEEvS_Mf#t>h07-CA}{1*olE5DMWC0zlj8Lk}j7 zvd|zAK!w2U&17g5#Ds_p9fj^3UZ*@${=fTgRq3GGh2r$7ofJ0u5z#oo)IyqLm3B(Az+d#o30}JrL_(+yHEP@S;z>n>pyGb8GP#;0~69!n14cGzvJp{&)oH(e# z2zbB-u-gcv|G+Nb+XnpMLYa{>m_sAv6&<>p!#y1TkpUPK#Q)g=(5V0m$Uqrb0i4y` z_u$;jkpUWf&j_>}75tkRdgC{Od)IJft9H@Y?Q7h6Ehfq2S5I zxShrHRI(6Pe{@Wx%)_n0-BB#d*%4tu8YC{Y3RYQ;;n)h``6GyQ7wOa#4Q*A@$XYBU zi_qN87p_-Y;ZKP0ns;Ra7;t3bg`+_*UKxTD@I{{Fm6JMP0JllR=DlIJ9oAv>KooQW zCgj-j;9=;Io^3qBH^7@f5ESgW+lL{P3XmKz!XmaIglF{vIG}(g48xGw0gpLWIdB^& zLfk-T|H3E^L@65OK{;IU1tmgY+>a4sIc$K7l>=19+xd*Z3DALs5rggtV>4nz|FIk$ z+(2yzBF)*H3M`;A@*E(+LC;0wNjm0ZLgw4>ncPr^bxh0t9El^iQ~G958;%uhzbxMP28&3a~;sP(gYMg!lZIHN>K(vO+`6q9KuAI;cDXi_|KlFm9 zt)@-n4-a7wY%&a%4h;@yX_q2w!jcLJK@JLu5~k5*j?F4sX~4d(kKfAg@bZZ z2E58wkrW#>-4~6LA)sQ-L9l=Zr~#ptlO((uMYv%%5`+s_(I!NyM%dv->?}u|(K+A( z6|g`QI6@`J&$e0CmIPao3Tm7iuor4lUsVnOE6)495Tt4RVldD(vq9@4|}CbJZX##YNfGos(8h z1L#goaZ)lxY$s`HM0H={1u|Nyt!Ngsd_T9qwkiaOc|L{^8CCTBQ$93DZG(!k0#0aNbGqL~@n8FIvB`8l^l8JyGiI|ny7%|{- z%4Gl^)Y<>hfez?fAl87KkwG4~fDep;5LizHenA<)0X-LS6613|gYFW`&yE5>y1oGz zL{nBh=a70V7@$;4*{jZospSYvLmub7zJ#^Jf~WCj!2(Vv-HE~at{Z#wN0)_!>{P#E zv`{S<>sV>MN&#pRk?h8Wu>B@?NQ)o?GM;Q9unn|Jgkg;$aw3b%Kz#;h-Q-cKfJ}x_ z&fXzXyOmOBQBxn~?;V5(U|S<5qxI;O4JX71bU=h+|8+xjmVuK=)}F zR9E$qvA_)korIZb4ZlqK-3R9$}3v^vGtk&ukqHjXyj|gnze+3m=*%# zz-dhH2&TZ2n0k!EwputGEJ$N^X1B^nr?E*7jm3fiW4D9^1dw6pN%KNs-mqh_z*kMz z;}!>zcMORkW2a9uQS*4RNAzr6b4gdLEN=sMa69H*Ly|x9byn>`ebI^aHh`k(gCo4) ztI+G+T=AmihZc8|6y!(j)GG|ygyWEOnC6LHTy|!gw;Q+Jm1bA%&hcmCDMc#_Vn2kq-qPSzVz5Xe9RPLMFTcuk199{;6#%|1#U`Hbx}4(3!Hm-Jftnc!W#1m=Jef z3&dXIsh(m+IC$Z-TtGoHi^cYg0R@iuhdYV1ozQ zgHL#ud-<0qM}_+{2Y|sI_%-%wk|mkKk;a8~%d6n160CV~|70ZWUiXq(>_x-S#lUzf z$vBMzI+sewaqU!SlPSS^k^}&eaqhv9E<-~n?_HRcBj8XwB8BbX7KzX|7lXkx*;k)B zW=~H!YgBpuS~-}bdaA4Xs;hvQGlU=L|3T?elmBoe;DjWiMa-J(Ob^NMXo~4dJE^odwrQ`oi_6_zR8SPo+97oGvwM8P?vk_{Z+BmGcW11=0!sr3 zjakk4U!G$e{{+W@mfm_$@8l2tpt$c?D1p_IK1op`0~7|5B=gZe&gF{(JRDj zxe36GHq_siKBW1ym;h%IjD-YH$4x&w85qf@1 z)l8gH?Wbnm7*DhT#ey}N0Bt{}s2~1ml)B?nfAw4c zghPHpV7N_N2AkW2rB8+lm_k~aLfJ`xqRm4gvuft z>%S15n*0OAzkkavC{SP`|D3>ou?!yUrm&ZUh6dlvQ%G=PCWQ+N8oZ!uqb?j14JwJX z@!z~m1ur}lxQC?2geV2x0B}=9PMte>_VoD^Xi%X;i54|_6lu;8Mwm8r`V?wZsZ*&| zWttRgR;^jH3>mQ%Y*?{l$(A*H7HwL!YuUDS`xb6oxpV2(wR;zDUcEleWbykKaA3e( ziXONLzyL`Tg?j0u0D3@$zv<2tmnNeu#f}ISzL{7kQlvYFdH44H8+dTx!-*F+ejIsn<;$5jcm5oD^yGJP|5M#iqrh+` z3`$sbQKIPY+KG_F;qsq5F#ioLZk%`BAehbyV~sR#sy+Sr)+u{Lzfp(7_8O4DoNllR z!2}gdut2-I`l`VQC7h7L3N5@4!wfatki!l={P3v01RF6h!iYlPFayBY!<1h3+bA4U zr0B1*%Qou9wuYqmub1)~YDu7ZG;0WlnbMnaq6@|wC_L{VnoI#4_AAXGjdI&fx-7Na zlFKf={1VJCzoae_flPr?fkG5=$G!$w`=^^WQ43NslI9es5CxPF$ekts31>Zz?i6UH zm@aVSMfzxrPoY9$c_=`fK%A7Qr53yt(*-FV>%mPu{S?$tMIDvYQcXP-)e1!=~rGa<2C(?GhVDpJSbF5-7BUnK%#vzV6jAelZ97j2_vIAX6kb*iP;5cq!0~Tmd zf(PWu2FD@7pL{_Y#1O&3M)bx*Dgv|s?a!0z>l|5c{F(te!l0q`kfaE<7jcHWl z8o3oc1?Y}XN=#Ox8lr^!5KRFR7!)33QX7)!>ttF}SE2?|HP?_t7wl4^-2ikG4DgUH zEco9f6*Lqm)S(V)7|RjxaEV1+jwdcS!z4O!iAKbbEdtyN2~DUM!hPcz8-O4K3z$Kq zl)xDhoZwCrCyqsoFoX!)2`h!!lO0H-9BR-2Du2R)5_IE*%uI_2boq^GtO0R_)8#Hz zpv?lN$eheY63%R78G?L6EYkMAunp=Ti=0)Yq}fiiNRpC4rAknsKn{2u6&~bBL{E!y z1VUT_s-NTu5-w57s-E&Ksw9vdT8Wnte8mGEILiWUd6Y*;qZn)GDN}R8)nbmYt2+5W zITwLAp~O&eFmwwwx9LEgcoTy;0qi)wk&ab>GAG9@2Nc-qQ^!6QvXPzCJAWw8pBUyQ zi80TLGT|o}*=izh@N72}`aPY&=K}Nb8PWztQiHfjqDs8ecAz8$%;s6 zHF}h6<>H<32GS8Fy-$hF;@WCOb4P(@B5g5E(jIiRkGClxJ5OpzYy^S>&SKyu4zR0a z#{yKLp7$w0;e%0;iquNvps_z8!BaO81y3SY1@kqf4ssITvS@XHaU~U5vBC*+R3a;G z{fUBm!h~@I1D!~5W;dSk7HZx?1t-9QG`>NL4&+1=2lk03zJb6NXyF&%@T*Qv@Q4HY zm%K5S@r-Hw7RrLovOb~b88TstSS*8(C<#X<(p4{0BuW?FBbcz3p+p>vXC4A2f|0rg zrQ^1yBW|KqXx?yJLF(4GVHWe4y#?HQ4X;jl)S_&;Cdi1=>biF18XrAkzW;?hQO?%8 zF4kbGME99ZiFvDWSo()v^!`Kx>}@Yn*MOB1oS_XWu&-46n}$oYL6&m?uv=X42W=EE z8jD~igLAUL70*?~iM`-BuJH=^62-uvc*HkY-H6G#uz-5a$y~n?44oWP9DVpor)hnT zYxab|Nii^jdE(7f_k`4Nee14SAr49WWCynRCN3t|-@KxdhQ%ZxhI2yf5+0i<7gm7{ zY%ptbk6_t7f%l6)m;zRugBCndTsgWuXn+43-~mU<=K7aCHO@-GR>1O(7Nu8SHXlUyc1587=+{|TwjGf6m{q1 ztmN+Ivpo;`&9eXwhT{neG$D?qE*70&|d}0G;LF$l-9?0PYv_b3dg0W{3Bl$n9dH2(T42K*$b*DJ69|hK)?kJn zYzA}U+jN2jM&Ju3hzbZO7+Bzgn82D0K?9KB^MJt!b;9t50`U^hgjguvd?MP0DXvC< znt;J4UO*Slff(B01fpORDgkkvNgB*f1vJ61LN6zfa2k}53BSP!<4fIKAP=O$?m!Il zB#7MH@U5t+tWfXq1`rVwQ4u+(_ejLxcmm;4Ar@l66#p{85l|;4j*pP$Ar=HFNnYk& z7U@OY;cYHpP{QGDvJ1C9bdFzY^vg+c(TtO}|uq2Jb` z1JlCZ%s~}2;HyU92c>N%(vI3hEUz%&gKWSK-jD!4&)1Alv37#7jp7P@Vj|%Y3kA%rm}vwY3>@IA9o^9fpQ-bd;`79fgECAZ8Bzlr zvJiiQuR_SxJ_z0t55wTi^>`4O8tf#aktci7C;u&`5kuzph-gvtsHUtZ7KV|0psQ_^ z=p$fCp{&n(%IHV5=vMATd(>=t`a>3L(JQ}lw{FoRmSh=bhc-B_JFs%K_8_|6=E)SL zKk!c>6v`BI;kt0Z5x7fS>L?RBBT@k1CwF2RsnKtILIV_V0gp-@Fo5fjA_6DD8&zNg zz%dfy0KPbY5GJ7w8dELK5iMR|8OmXq#!Cy|N*>ov1zF%FtBDp!vnNWDg`!Xm*)S)_ z&Kx9xg{H8t)Zpq=AR>#RB6%XjG_N!l3?m_$p%p&t zuUPM|T1hpzX(vuEFvC+k$MZviQZOEIC;t#mv&iRG{%IkUGPLZBUy_8%hEWRqq{$}2 z<1T__t}H!53OyPs7IgzG3)Db)ODtcjY9^{X-h>oc(QNv~6k8|BCZcKpCMMnlLq94# zenfqOWOj%}1N0|6&5JM(uqRj`>Jk$kW`V!5A_55^GRLVCMC~5IkA#d8w?n}AK z!+OHSzLZHROgQyX1)g(CC8$dAkb_Pj4}PH!L99!YR44x6!Jbejcwi^V6Ho(HPz%I7 zL+3;e;|ip}5i;S&($65OMi=%Ve*fHsrjoC;h$|NQg$Q)Tc1WTSvJYDJLqO-qY|M`& zy7E9%RaK!TK^p@8=mbsR$a;cj%GSgaP2lIW=0YiBS2trLl*rDGN1zly(86;tPt;+o zaRab%(fXh_lOh7|>w{QezBXY4+;Ie`Dl&D{HP=FcP;jZ(D%wtS2j~>RBH+Q8t|a?( z9KeB3nRE6yAss^D7YI-AY%hkEi6?$@D7ch3J+DjG^boUkkfbP)pWiPZli-bubFUWM;*+Ou!NL zAVewkD3<{~M`JF@$9(i*ZT~#tO;#~J*u}Ldf?YOrK(S<1lU8Y2wfs_t&)6?t*yW14 z!+cC(QkCGJZ1z!eb|Q)~wA>>}+CvwrCL9Dx>BRF`ku_6%f(0}{4Vd+)B%vIWq8lmp z1T4))oeC4Epj*wtGtXl5#Gw&xKo4<&V!d=H=IR_?p$9f>97N0^%>fsv0Kayk1}=yg z`i+KMO~a&t-n

f$159fPf??Ct`0J1|bK!m0wkW4p^;mUNd0ZFklH5arJHT=JuJ+ zVRBg@3LK#lxGo@vX&llD30Q&FZowTn$mwd|?EdNv%h=%eef{$x-q5CLfrj8Oadd@$%wqE`TUnW8d_TxbnKzh6= zBQ}D$j&^Aa*nqpGRVRW}7lM3#QEQ|U7?I_l&Zb)C0a(`rS<+@`9cozaME*#kSOYU{ z)%H?;;;V|Py~sflP5?WR;siP=9HB~DLtqjx5URkgE&jGFzJl*0=o`*KuiEr+nN3ea zh!2?!h5AbEHjl4X%n!@%MM+4P$PL(p4e)~DTFLGlrZ^{xG}mHi3Ok6IhI3zONtgUe zh(#=onQa8-%G#b4A&Z!>hPbVwlicu5g0SHv$B7k6h>LXs?^y5jHnMnEsGAZmgGfw? znQ7lv*L)utlK&&QC(zd~&{HQ6ju2AD62V|te*~ZYFFo9*WtIdc4n=)>q35z|A;P0p z`Q%n4;Ai2JfDf3KYuQT@I7!HIb~J7yG9l!21vKuDiS9-;W`ce=G<$9(&lEzX=0tAR zFFp34BhJ=XNqCZg!U$R5k}~N8zA7tT*oHAssz!j5N+}ZB;BdKhE{qTfOhFnz%^TNv z^K!7(9wF5vT(lGlG;DI=4xU`=szap&>e@eUR6p z7qP&T1^-v!D->CmC@7!_YoO;AauiyUj~b~_mXhO1eG$V{&EpMB;Xh7Blv77mVPct& zN6GXAJ+iV8*rhB>3SElG`v}yQ&l;`4rD@5!0jg#myk{3_g^P4187%`c>WGYxIY@>C zni*Ju+hb_ivTeX1gnx2`t(ifBVgr-H2$w0H`%5l#*etSnTH6-J5Qj4X@+Z&APKf%pCoadeN4v4YN(C5FD7em>E2VOAaLQ4%mrtIA{(oWcDqxSKjLysO9bZ{f7V6y89k$Orl0#2{v3e9o^=l2HNnx0k~su3dQ| zWOX5)y1UIfyk8u~d1Jg|qI&+}q#B~U1)>-HEI&RY!((DRmSushCs6hv6F}=n@?(H6 zfMyipFUQkF{kvfRoV6pyCe4&{Ag6ex*J4~C+(^5@!(7Y-?!k#700AHuDjcR%rjtFQ z$x(u&vcrOlNRMD7P)?(0amGK}g{&LGyJH;C3wXw3B8$elj;QZP28Czayk3~uBmefP z=;+fudKOta%O;@FCl6c7hbn*qoMXa`haksvDTfn$ZOl&{)&H%`hk|t0cj3Z87cQ}g zz#v##qqziPfK8(i_Je0@t3DNYKf0#RPu0Z(-Pq51&?y5e(MJNzCmeW33I5|fCUqjl z1CLakPdt&h+(Vjaq_8u6)BmQ^t2|;9TyV@CRB}7j*PY!RYt=`l6HKO0OyLrLJTCi^ zCYD4qvg5-S z+#yG#vJ)%*$Emr$!+pxfz1>e9K9g!U+)d;7cMCJ~SKxYCK5l0{_}W#EVAS zgGaEJLZkP@P|L;4!=L% zU_ZK{`=ru}iVO_&a?3-W1ZsUK9c#OkGewP=SeM{}TQ)C840hhY%ww zh!p7#fQuM2YTU@NqsNaRLy8fI~%t>3?Z|7IC7BCz4Zh!ZPb%($`R$B-jSo=my2<;$2eYu?Pc zv**vC$(qSRy0q!jrn#&=fRRw9*O_!JQ#w_lJ5xv>;wYFYq5m#|j(`#*f^h1*Oalo@ z!KtvDl80}kCY;B#rgexEExz2&y}S4C;KPd_A3kQJnb*@7ETm6ixaSUu==!NImWhX8 z=7&q}b78?Z2`xiVZ~x3A9aWj^Mw1em6vq_+4umG*gmCd?;e{ApNFir~6}I7rAciR7 zh$NP1;)y7xsN#w&w%FEasKt1iYHIy}(Kof#Hjgfuz^5BR;Si)%ZpB%pz7RkAPEDtP5>yqWkb-*@s7oP%wn<+m_c_E~PKB6>rIunAYwWSe zCabJRWD1Mr9tXNpokLQj`6i$=;aQM$1tGc91)1>q({B>7b`hs8Cd%l#?B0cLT9Cdg z@4WQZYwx}I=BqEKo_-o*sAv&-k!!Cx0tOhWF4(F~O3;)wgpb&4&@g7V%R9tQf+)Pld{|NYBEaE;aQAYcU zsBXJRvs-k$6WTG()90+Bq6p*MqSgw%JUvc1f&XF6b?o4m)DZ{K*sdcPmf3H*k`Z(_S|=`R@!Qp2Jl$|1K_qq7nox3 z9e7E%Qxs zTD6nT{o`}*BOKAZcbT}f?t>aK3lzu!kN*4s@4|h0mg@qVSx|IU(Q&7PVq`oB!baxBEPNoL2~Aju9H`JOBxvC#qEJH(Xn+MuJV6>TK?M&`W_T3J z;qg$EydL(#d42(+V_3if8?Yb+WXOXJY^lgz`tp~+3?^ly7``f&rF>X~2pIS@k67$s zAUMdN0t_igy8Qz_(V2=n5(E(`$p1_saiXJj0vN|~n)95+nxi-+LIgLt3=CybPAv4{ zjzZ2&0TG)=L1nP!1%B0_b#7GcrDd0f*&;>jp z@&>uRY@OF3Cpsrf*~)T9o&S)Hh!Uto6;nvTI-ny+tAuu^0{t(M68b?dw1Evqg!C=7 z(1vVh%i3h5VhXPf5hDr8+p<(5p_8PCDuiIlzeHgYY_LIDM2U$tv#_89-N;3Fwf2m{Ojo?qP{SubzzOm4kS$A9!574v zj#XST58V(iEF(h#GJGKiVPU}w%76tjl!1C^pygSE&;b>UKzdgAN(#nG20K{qt{@Jv zh(~Owy!vaeV?n0M2;`$c$|@lR!AUn9aixOnk$?Z_#%D7-&X8I5$3PD90cFDD^k4;W zwm}ul;8)H5sA@jd)c;_iB&3IC$Tk;02uy5g%jISW!bH2}?Lf)0fms08g!CZC2>_#k zh?X}jB$2Du!85bY2I8;sz>YgK{t($E4H)W8RJutJ4N%^wV_FcHvfjvjArOT%L|u-876K9L8Jm33pYcF!Yt-Sl4S%4Ju^9Oz~LZW*CiEGqsOfc{}5{m}`2v5<%o z3Q@+M&70rYv3I^lPkMCj8}tupz#D*;qk^NJApiVK7KWjXOYlM)sj#_QVmk~cjAatC zoy5jF-v8UNXu!;8E}=RwFn71Kc@ifdOPuG-^2XR%GB3!r-_3&EoC|up-K_)*sAk`9 z&_efXhq|-H!aVzyV*@ZZ=_RkO)U4CJc>I-x2L3P(P^&=g!iE@H#Z?)_0w7QZ5vD@4 zq=48K1cmW;|2I8wFg+ed24%H)7?^G1{)5;-pjg9!H-h=2{vAP1qaa9MB`g3t`fpmAftd%h5D^qOxnI169^q)h7tpu!Lmcgkv!Uv{wqlcZH7haT^eF z3DpP15!&w$xpT zP#7psUvGyNOC@TwkdG?hbSmI9=l2!+<%VOyYi`FDdY52dbp=^?Rzsj+*k%Q{l>Y&E zkOK&I1D5n?qgawAd6L{yiff}5eYH*qQxkV&E6>!6ktKS%c#}AJEWAjQJZU;p_8Dd% zg~F#=+JI$dk%Z3JgbVkCVUdK|APAor8dhkHNRx#cpa$AlLXz-^fMIf97LaBUcg;6!7P)rQW^GLH zU>SA-*ro+pMt3L~o3c5ZVxy9&u@Pg0A}6^LgqzFup>Js@N9pPo-^b^zH@RZ#|UC@o~IO_mO)EMVE+p1^-=RhU53a~ zEZ|cx)d-KkpH+2L2&w`J@KnzLm{6C6ED)yy3TQ0w1JUFFq{e!zLv|j+I;_d58OeAEVF3$92o_FRrL&ckRBElsa0xQ1I$Qcd zof$-+G_ES(cX%inWht)XNK0&q78!M-304-${u^U088;g2J zx)};L3`YnShky;OMXeZTt+Iu!5l3-ma0i`0drn%7-};^VlCC95uoN4#LOZnBW3f~O ztmQVc92=Y<+q6zAvPw&D&59Yb2eYzuj4Ct)G|LFh=m#|Wh1I!tDr5w)l?-w~B2&4u zjncDj`b&JcpDabRayz$lD@;a$H9=q)@xJnN_lx!L?S)S`RlCQTmKa zNftp^duXe+JgYB0yF_m*Ui?|Nn!CB2yFGV{v>+(Be9N?dTe?9SxS}ggQ~Rc|#S2*~ z7II)^sX!LYn3UAnxQZ*g2fHENDY8VTmLH}X%(f9+ z!8*LdJj|;X95Bio!W&Gw9$duvmcK%5CaX&sRi+Ks3uy|RxNDKE*2)VhJ0dk~!+HV1 zJ>11!{KYi-!)KAfNt{_6Y{Y0hSx8*Q=`q5Uq5p70cov2`yDJQ{&A_7G&(mYm~@~ z9LfdM$e!$z{JVjYJjr$8$C=#9uKdbOw8>;)$ff*0pe)L`tT?1x%MJm_;Fij&Tu_y) zJ!jcoCL)=Oz?F)Tp@r%_%&g3?9L<6(%VW{WysR>}oXgs5GP``u3gE_w2h73zy1<*m znt^{f=NacXYTI=feCUvA;ZmI{QcrUWkA}{xM9;=!76M8Pvqn<`N{{w}0{r)v(tOZ? zOwEuN#NO;U*}TmVy)4~)&A$9?Sv=0deE%7>Q$t|ELM}82P=K$IQMs3a&l2*F-|!3@ zkQndm7bU={PXkLeB@T-q7A74QH$4{MRSxncqn`OR0!imlb6J-l2E7PS1;U`@nhz1kyF*0o&G-X_k$Y#Et! z37f>xD4=o=#R4v%+wkfbB%K+Beg7$pcot$8w{J1rHob54^~E*`4W5aVbeb>npdrZfVcq(ac+0U7|0<)A_%P~&6K zJUs9XPaWo!?d((o41FpIBOr)h(Wm;?=Gso$?|Ylco3wJC->Plr};I=w&(x&^*%UI~jPUXME;ojh^ZSis6TrXp7cpbwHA2p$X&g4MU};&wWvi zy>}zfkW}C_!7z?Y@c#|daF|H&Q^0_)#Vr=B-k^)^pRA8YAOJC1oehU%s z-asFaqE@Nfp7lce=5ZeGG@;++9`-G9?vAYI+{WkQ-0ogkuN37%n~(zr-*OP17%*oJ zGDmYPpnK~mheyYA(%^GICv-agp0-^>EmPB*P28q%Q7row=JS6#)?@5=R7F4tNL$BTSsWrtQ zUlx|x%G2c$x&Pi(BXvt>?J59|L9O-5KeTV|)m{&rbT0PN-`~pm{OXbJu|42hj2X{2 zh7ffLn9v3uP1jg08226-*;fwRC+il@_u)5wy=H#q-0PPlOGPeyIW_s06!L(o1_0qf z#lRK4$_+%AP@zIj<|-{jsL3Hj6?V?8qG%DLLX8j~ecOnTMM4%Oq&*vnkkdtkcE;UO z@qyJinl;CXQzMX~3K8SLu}CRXTpbk!Z9dD9u;D|9OCk1z$t2w>s0(+TOu19*R<2#W zegzv=>{zm8&7MV@R_$80ZQZ_w8&~dJx^B&6!JAj_UcFqrA^;HBfC9pW4If6FSn*=U zjU7LB9RDfOoxqhXU&fqS^JdPSJ%0urTJ&hrrA?nkom%zk(03#^fE-))Y}&O8Tdtd1 z_ihy3T=;O}#f=|F{+qW74N(X!(vXq_AxvvDcxZv=67;%RhKyKV;@82g9T65B zI#A}so;GQoqXmAerm5!*k}T2f8N?U5#+g&a0`O#Vk0y4Y$f_Xn!jg!og+_1+BJ&oS zuqF69Sm+U!b}C6fh3E^(C71{-@W8Af$`2>`gd$2o6{29}n_zTOp+SmlT&SuPSSg2x zmln!zzvYG`vPdJ3L^4Swmt?X@Cv&@tFDdu(tE&Sl8_YH>x8zbb$tYtjOfknKvrIG3 zME^6*GhK@Wwl3d<6V59Gd$LX>LH z68EVeRiMM1QO*^~$6J!MGhTV;rMF&t@5MJ?-lCkc-zvEROt3fyCb+gQ)kHX9g%@VH zVTV&=)6Ie>rZ_R&^u-udJ~!rg;~^7;Zln=NxC9d_ZWzG@?YN`M(dAUVsgWC8$o~VE zYAgCRCRWaQr3Wme`R}0`dNBtVDm0*|2LFgjN+q6iIN|4PO%0O5ah?&vC8P#|W1MLQ z$)VU=?}LbrajsdUX{C0B2uENu%6TC1%26Ak{LV2NQAaAVL8Ph^a;ca#kcjc65m@N@ z>#!mEfD^CPKw1SBT*A8z4W3O8*ApJOI`Uo_VmqO#RCuA6WY|6Qk#uBA11zd<{XrCE^yaBY&u7pUB3X@rt}VNZ~uWb`TvG{o}q(* zxTHWZ$&@r+HL{%rV*?Bv$2n|*!1f3*DF#CKAG$>}mu;kpzt- zcY^uRB!IgzpnDLQADdv~M-Y@?O%N!zZUikM&kCUaT0}O|EkhiVh>qjjvmgL2aUi4H z98GpOkfB)va?!(L7PYuVE_Tt21HoPHsPq>sInRs(8=msixJEX%(T$>E-Wlb%rHg$r zUwE=!9<7Hx?TC+imtaEGp8icehS`~MJPwpjL!T%Y6C z2Z=IC9}<&oBVfYSHn5Nr!Iu#_-fp!FFKm|Hbf)-RQVH9ItcBhrz z{cesAolP3wI8lmL)S?WFBSba&80Z;PUenWKNIfK0%as6RVld; za?*t)vTyP^5hp|?xtP{8D<^X4S-?ZnBRwmY=2OTB#HJObH5I6o+KC4QqJh>Wq;)E+ zY2=ie7N{zubVFIHN5wi;vX<4X`9f$yv#`*e1k86Eg==IcbN^Ag*43_eEloz_x>v*0 z@vKT>fk*|rr?D>5pdk7yMXpi~1SNJWs+vkq9XnadR@SnYrAS&6%2tXrl&_yPj70G| zTGE!*qIv~wTsw-{-~n&9z#>L*idDQ~7XP<6V-lWHd=)a^4?`5g9L8~u z_3Pmp2k*bSxxo^uAY>vB*~mpk@{yICWF{}!$wW57l1NcsW(>61&2NTtoaH=cI@j6GcgAy`^}J_3_u0>X26UhWJ!m=~ zZp~^&^qF})W{QQFE>n<9q$NFRN>|#_m&SCZ@9={pO_|DqwQ`q5J!(>y+SKX&GGAnz z5E?VujG2aYtYtlGTG!gvx5jm@b-im|_uALL*0sc3-Mk;u525+uiSmcf2nxY|t)X z0S3T#zVU7E;5qtyk@kZPdUpU7_(9&0m;wbXFh^wu!?%af(;m;ur67s>f)h zGM?LcXE?(Zx)Ab_i=5;qH+jlSzH*eaT;(l?`O9VQa+=4y<}&T+o;oA+GjKIi$* zg&uUG1KsFDKYG!TKJSq_Ug6dTqyi<~6^0&d2WU3jg&=s|$ATd=o(5efN89?)`MmJly~bNPX~D zPk_f?#`Ld`eZ^*9d&?Z)_OQ==V+i2Z%7ACtRWQRH?huD5RAKCyA%L6=zZ@v>@!D3@TX4~_3pAAH0B-ZZAC|C{U|7~Z#@ z@cEYwz?+l)+YI>wz``(q$2))@z`j{CgCD59|C0@WiwmsNfzCKKcXI&FH~@otxVQkn z@Ea-gBf%0h!4o_|^;@gZ>$ontx6~NC11t=u+YAa&fg7lTD(H<3)C>XuJ{f!rrz5}v z01qQb0;M8A0PsN|48jELKN}o@9RG~65#T}0h{61Gs|9R8TzkNQ`@!00U>8oUe#7=hzUzB`zMJK%yG>F5CPWO{yNnx%13AdFLs-5WsJ$hm#KcIzON@hN!?Zid0t~o} z1CYRTTL8Bjfv)4VL&yQkXvM~$K)ArVTI7tdYqvv4!_06EHYB?@45>Oq#$;5+WpuGS zWWfs45=*QM3g7}+lng-_ggHQiLA1s$?7dqYwo&9i2CTG0$i{8F18bBFZ*0L(Bn$({ zLUN=ubJRv|q%?MfMt6Kg%m2VcYNIqi5X3m3Kk0&Dbx zEXV=kW5fZ#Wd<(1t#*Zw^O7nv_SOOie0SxE>78rsoU`kli$j#7!?kmQU+@qD$%+2J? z&h(;|RL42EK+reA#odHT`da`-+`?T!#Yl^T*R;s# z(+$L{g8n;zEWk8Br~<9)#jeCOGR%zYv`osw%*^!6`^3-u)KB*sw~YgscBH$?Z~#*@ z1Lx#Gj+D;6giZSLO{$y>)Fh4JjI=x8!2>wX+>=I*{1SsCjUSLj3gy2GO+Bd$j1iE? zLr4PCpnxqzQU0S&MkCP!a70SGgW4nw9hgx`(@qPW4Zw5@qHNAS)KFy8&d`uaOk)Ae zzyMjCydrVK`u{YJ{gl!vrP3-*zy5?fj>|{LNY218f`Rmd;xr8hXuw0*(FIK{OFRHQ zn6x2CjiHRRLoi4lJwOr#fbMkD)IiVH(pQDm zSe4bS0L`sgrMeaL=q`4P8A1t)tY~8&;~kgS1Qy9q`9w z4GaW0zrZ3_pDwL4(X(=bh2Yf>U1 z$ySBKS^w47edSmEtW|~rP{#;7`IL+-7!zH+fyx-RT$MEI6B7(DR6m%LW%av&@kO)b z)zMf|$&lDd&A%9x$RrgLFNiel;24NDEoT65UdumSAEw0a#9 zJi=E#>DQkH+Ms2|e{HLPWsFhm)ra92$8f-!+uTGQF(VAY-l z4xts?!6n@DBiha~+QkT%V&#G}$-s^U0IcP!E9t-qJrfM@PLB<~fZ@qAA=qzqT8|@9 z4gXD8GbvLZl-#%qJeo96)NlY<1l!$=4VnE>2P~6powdH@jlTulC@b9G1>WGrxWi4Z z#7&GY)m1P#lZFJ7(ETjr1-RBt4P8y!)a|h@t<2VxUew5eNUPr53z&i2Rx@D}(5e+xTZLbcl#CKK6Yi5*&9$(UjkLT)n65+J*#El{ zATHu1{@}o{UJJ9tW;@{2XvhfeufQ8f5&VY+Z(Ni$e9sa#l_Vcp2z8g^A3 zmg705ljBiC#3me4~9%R(WUM{{nB$fVq{wK$wPOfe=l_&`PUa7?O>IYPDnlh_ppcjd?BID*tBCOO}jy zRg(gx#djr=DK)ejSk$8rs}G;>Lm&3bha1($iSXf6NA&voOYg) zuHb~hK8HnU<|^r0R+z3lXuaF%npPNx-ar+muaYKcHEBqrR*ZEjKI$Q$Z~!Me#5>*gtGoE+sy7=&CNwvwi2)&DrQ*md3z4h)0K z>w=C{WA3k#PTPe^-*?Vn`2FPZ%ruH#4M?4|r(RX5j#9=3?%)<~FT+yM)6(}{j4qA5 zrS9j4rmwLbZHFOZzCJgFo@|8yV(NCazza!-VM@zxZ2-XChmj2JJ`BIc=JaHk*uFI0 zo{PiA*Ws4$`KIrLaO_xC0OgK^Uu78XYu@LM>?m#+YBO&}Q|LK(7}iwSyW{Ri!0j+W zPw>8L@s{g_ag74M4Wt%BOk-}QcIv`@3;1r;`X=!bU+k>LZ~YGJg~8y`hA90`?XQ+? z7ymGY?q!UUZ2$=7OFo2$X*dZFY6|c0G{HW2u2c=j$V(e$oBzJ(%k=HxF!3mt@{Yc5 z&pr(OUSEX~g#Q-S0B7rkVM+`~SqkTGhADE^o;&WoZiVSyAXjS&Uvh@Qx&^0g0608M zi}5otR7-Pjxe#$Eo$^2zbX7)iD>n@N_Ua`jZ2$*=$SZ4wIdd96VhaEAw$AY#muE0u zm~3_P)Kcg?N0Z2#6Hm5tP`

-{vN#&nJiSL3j06_uncZcf!BiE7`5^=;>N!Y%Y! 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 z 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

YO>2rMouP(dHVz(BKRCpxD{& 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%0ANooijZsdO7H)43a( z>wLVa@pDC*bAbJ_eu#WukDyTPfKH-~AlS?&2d%1xQBTE>-Mxw12u z_dhYU`~mWELOuAl1lM9e$fq7e#bQpZ(mKi6$z7;jejs1gJeA4IQ7p!?sT9B1Qz+5^ zRH?8)t!te@_u(nWVLsBpX`XF-Wvg_oSku00?d*Kz@d{))zQJyr-xcPq?I}Apc5GT0 z>twCZV_7j*No$$yY_zYduwHj)TWWpbZ8m2*wQp)%-X&vcoyu5nu6wFI^>H=cVmTX} zY+H@(;OqQQcIM63xb~{U{1Yy7-XG_=8d20uAE)yC7ias1zc=7Fgz+Nmu3-~zjj4|- zb1us9xsnXxrY**L*%H^jZ4VLVA6hHDOl)e{Vbx_CG0dDznR+hg?Q+*}th}nZY~Ry= z;s4Xcc%9?gurImBI2oTgQ^567s^IJKJ&*OKM7iTosY75ktMsOVui;2XmvO!)bGjz} zrPxH&Q)#O5HmA1ZJUDKEqz+qtGnw=qB{?a)_P}}eE){;)h{;7YlkoSA)Hj?+LqzvKxOV> zys1;atm=i|q3enNSp;&AM*n(YSoOTCM*29F)pSz_F+KGa^{8R<{n^*`dQubO24V105jXp&@`d+5gQie@5g$n?x=8Mq5} z;bu+Y<;^aY_u)495w!%a_39B$t`W^{uC2`x9&-_$^R7P$BK`Oxe*@h5+#-QVkweLD zBlD4wcaeYY-6jE1acWVs>hAN&QOQkF%gyeq_feVnpiKggZFNw-D`?-%lzKPG!V&quf4MZ-LJzTuDQR*ON@@N!O$8E%ewcMysG5Hmp# zi!BrNUL$tSEta4pil`-aWj>Y+1w>95w*`o!HV4tV#~mccF%E*57vj$D`RgwHZD;u;A^?g`Q*F+)uW1;H^2{LJwLiRy@n-%{vQ z+!Kjo6MqaEt1cv7-X!YDP-*dlah1R({8(lwV5}Ojm5hnO1Ne3W>@bMwq>*HXm*hsM z=h2e1ZlB~MgXu?@{Dvbr$UNCUEZL_d*>f=2?I771CB=au#a1T8$~?t9EXAZG#c(i1 z?;u4RCG`hGs+vsdH}h1buvCSTRJp-a>4Q`Wl(f$bX`(V|Lgs1wVQIW2X<4Kq zDCvw0>2xyb)aL0FVd-Qg>BNKS1PAH3C>huc85lAd@60n$!ZHv`GT;U?U=A`~kTV}4 z^qF_knb&5S7onM_#hFI~nfv>hJIGm^^jT}tS<7Zw3!z!F#aUAWS%3DkMv=3J=(GE! zvwxdq{|e3SEY5Bl$Zp=xZa~hdrO&C7&M7y`DGALfEY8Ur$jRQ%$w1CcrO!>0&P_1O zjSbBO73W3_L(dX+)=WChetA*w( z7w5|lQ^iRaCUzU$nAUw1`wZOIJK4Rs6@acqF8Fps4saq`&yr zUU4TBugnFh+>x%_PO9A6wA>=3+_b3NsJ~o)uUrSILX)mS zU8>@{X@zn~gt(OlmHH zHD`r2$9**iyEVIrwOh2c>youACbf&e+PT8o>Au>D-P$q4x?$S70m-^vh)G>Hu&%4H zuD!3WWw)*ovA&MBzFM-r!lb?wSYK3FpWj!Xvs<5u*pNoskSy7dXaemKX^1Xti0o?! z+id_MHU`o*`bjo=n>2a=8(j+cN=XGn=EOYY-f{#_(`2SP28DGT|AoxYnluZ zo1JHye9A(CG@HHMnnT})hPO2b&NqWBLt}_r!T>D^!=Yf$mgwY`RHm@>rIy6vgltW! zfG6XE2-7UVRtx)9&AwJoaBFFVK{auk;YO>PNt+LETRkyev!HPYu~}LZeN?xu&3ETT08q~`yWf(QBR|pGP6m+j&JrIVtpM^K=1!$2M2}~gu#Rh`o|UH zyd#kQznx5@&|)Un{_i_Db9)-O%#Z(L2WNe7wKrMx^}k#(0D@M(^Zq}sxO_0N5m3SX zU!dce1Du~jc5wA0&>h@gSG+WfkZtQX`}1F}*nX%L4kpMkq_^fDSFH1n|5AuWn-A)W zTk8+9R?DNx9#qfc$}t7Ovc|Pai__M;AIx0_XE_IOA& z5H@zfLY)vG)02PsTejiV1ag>cX7ReSMmw%E&+@*aBcv;;4?xH3d=aGt>ihAG^ zXK@Vh8zv==dA0;++((cXwJ#-u%*)r>xce4r+O51n`Oc#FOl}N%F_}!IIAx(ip&b|H zlA+`3+QbQW8s;pjVGZ6QaN~P)R!5X{?aN8t&Sx6y0ERCMn03iT{Ir~Mc_YT4!j!S) zcied?Ddx&ooU`qPhP5T~eRg$e;SaQcrNmnMU77UV1U3Gtl%LME@&2b?dvIF}iYSwH znYitAA{@n#ac`UItk-Muk8niY{@BxBk_eA>iiBPc zK3btpv+R5;mI&5Y3`_k+%-T>SKRT(TMl{1JKcoBoJEL++>I{Rnvz|6j>8GAYYNt47 z1`}aR<;l|7yy}Ju33nzf9^Tm&ftpH}C`z3x+1`%Jn{c0(GCVk@c~WT+uYHwpIy(=gU znU*9WlZ}lr?JPEQB}*$mYMVMosqF%X2RE?q;`@Xv>Ep|ml{uSQioIB!)EHI{T5DTp zqi9^}= zQ`h`6n_m;dI;>~iPegRO0BBdD7Y9Kjy3e^46|?@5a&vb}2RqQcYy%C_*h7ZL8Y-r> zj1^DNLMw9Npi*wISKHh>;mr|Q!n8%G+tkN9%L;N_ULn0AXcu|Ca0_HMy25T5I1uKH zTPWM6>1rBO0JA0JX{|A+5O%3{Ui#FP8$%pghGAbhlTny=IX*Oxn5eR+PA#vy*APMm zY<#X_wwO(+rdq~iI=M1a%J+mtTgH9BoY`>NJD+ffhJhm2V4MmwHm=qQeIM@pLFNOQ ztd>czDpw)biixW|(M0C!b*>nTg;ad&bgT$ZDMQ8Kciq;R%31Dm!<7T4iPV|KPG}8X zg{8(->s$jZeziBtu|Cq1W}ir7V;m_#3vhmc40sDHh|;%En_tB4yA5m@)w7|SUqVE@ z^Xo;^bGVyZew4WLo{`se>7QFU4Zic(iPG^%np@rMy>q=8)%G!+Tbo6=cS1nd4&a+x zACkDY$5qe*BF$}d2H)GzfHcGBW;bhl?=5-8et?Q*w+ay+%p}l%#JSFHr$QtijK3>r zfTd=4K*0|N#vt`n{Mp@r-UnUhF}2LSnLQVTN3CFVwcMteeG7?4jYI|2!jPE*?O+ep z0-f)rQZtA0y&lR9I^QbcW{w0Ap5%K)RBGF%j~OHcWoBNL8ZD2E*yblxaq(~H%-i4cd@DA!EEAW*%oSJyF|J_O4&?R}AH}PZ)-vuG)g-BdFPCRRf zcj3;6O5BP~yvPT2Vej~gKjKWhe)`>oanmLCy7dRb1MkO4?Z+nW$86-s5adUj???69 zk9^yY6yBeR+8zW>|b{>a<@2=D=Kr~@Ek0ndg34}k%z~F0q0u* zCvbs>RDpY9f!l_G8-anVd4Wqkf%98|GjKtZR6*lnK_iAigMmSPc|korK|i;GI^cp^ zse+rtg6j=~YXXBS^McEIf{V9;3*dmcRKP4TV7ehNB@hVC1IG6NW43@%a3SGTAt7QR zL53mzfgwJ5A)Y-UZd)PFaG?%Vp|)b7R)(SGfuSaOp@u!7dR|+h+Hhe%sKV65!oC@X zDFucpSIW%{+08cP>r4cv2%67UW+M-p5_GKobQ;Y3Xia6w)1d;KU{ zD)#>w3MavSg28~nhk-$Mg+Y2JP5xJqqDYcz(X+$C1iV8NfX8Gt_!I&M(_9B2$AIyN zIahyoheiE6_*6DkYkq9SKkz-;>!Ych@h2Dv>LIb&mC0CyFa(7Z`P;f;&gbt2Bm(On z{E8HbH;ss5^^`&A84mCZTn2L$dQ>_)fE%WfxPQNveQ}|U^26Z4e1QH-&R~#`NdTBIFagLo=<`YkZW#)|@{3jG?o44^kL`p1CZFs-DsDRjTK;t?@m{v10b?8MRSq1307 zr+?Hez=@_EU93Hvt;XpAt=Ql0%+-Cb>KysebhOf>i1^`;Cf~2kJ|s#-pS*{tZTPge z?~wod6rUXWiO@&Hg8%1k0h#1Ko+;EW9D0iX?`vL$cU%_B12uX7%QbJQ*5LoiGeNI; z$Fu(NOip{fdD8K+%+PDzssHv&>U9%e{AZYimFJKX+AkRd>Dp)_I@j{7zDl z{QqjE|B}Rk^Y`Bq8vkeW{>NMRzIEMuHS%9?;fW;v+Mj^m{4M@(&Ga8{Ve{f*>&t&g z;y~Zk&m9NL$8g%gCz5#l`H3XH?sxn9L=xX=4GrG6{CK&&Jv%h?M2#__hHp}FoOj^Z z|EZbAiHsTkQ#0*GlNcIP=oV9;;-km{|6}vUaxm#pK;|apoAZ=+;(7j4GYO34X(zBt zM2`ueH*!3A3xALI-`>t+&jUtE;X3IA4#pKSafJ2SK{K7YsJ@FS)Pm+;argWKbv=oFelkLlQ}nW?~yYt7ovgYqEP=|oA)8% zkc87Suco2|>FQKlp}6+_zcz3DkgEg+4>~q3Per0;q(;iri~riZ>)S1Q(M5p=U=n6|ebn{~Y+Q&D$fsLh(OuA)m9K9Q9vsAxLGK z{D0npiHkeg|GWjo1a-3ic?(Q+{X+lo7KEpTUIzZhTL|@;QTfO7}%t)>Oj(v#4vN@#l-7Q_7zu(^sGVEL+Cm|6Q@o)%d&WSd;R1&Gi-S()=5~CvO3( z-Q(5ztD}^wt&pq7PgmP-uprl4T;3RB&gQn2L8;07KZ5qtUh)MWWNCQ@ALdy#2Y)T{ z`Vo9o8qODTT=~{B#MTf_T zt;B&O&Nz=|Q)dJl)gsB-&tv$K8S$JrMyM9fV@0PKAusb@Hg6yzW$1pWK##}#6PLO6yp@sWO&v|&gvCZ%M)Xw zy}wetL(89hNkt*s!=%9J3YY1LNa)S4w-I=i3|J}?;(I!84Sw0u5=|;kpSQh@POfBO zSD91=3vnl!+cTGyPiTZ>2)&K2WK~j`(k-~iQb5_Wznq*jXursg4X(t8B}|#FUF7s^ zlyec_d@Q$b&qa{n;ZE10ktQ?bPN-K4<>o($h(dXC|5!z8T*zOL`GM%Ht3|sfHB^7- zW-gv4h>WPrbW7=C(5=XbElhvo9KP1u6ze?Gl-niIzw)#at{iHvVw0S35IhGM@ zDZ@?GaPsBJ{K)E#TcvrHl=JA&Qj- z-kzx;Px2JK%6un^pXSi${a#>#8<5+c6TnQ>Wu3r4F^pSs9Ua)c9>eHum{J(8^m32U z@*=gn|B%*;rYPRD3=Ar2O=$@|Qrj+{%IUhk$5H?N0l2B^1CFx>G3}jTzy$UPCkJdP zrb-hyCn2W3OlHxcW@&|2~&O zIzw|e4s@4M1zhp%B=5Bkxvg@EGG$FT(;$-gf(Fx8Qnc9(h6?1|O<-WzUEg^T6=;RG6+}_dqh5p-ydUv{ z)%T``lBl!)NW-f+V{P#|76;c?U^@SW!IaiPBzZsKJ}X`kuBrKXZbQTmLGC?lkB&f+ z`cl*w=GBU+zg!993#YFSqTpFgyOI_eA6M$-1GmRhWO-kT8`GOU+_g=#(Ru8|H~r;@ zDvfB>s{`K{8Uky7HFwX&X5zBRr)~jl}Lg( zz7V0WM7_9n!3c_w>mgJ-@_Hauz(01iOmm3Wb~0QH%_I*Kdmc8es9bfW#CsemsPtNR zg&^crxOC3zyJeLhqeL%*Vx6I`JkO)udk9myBeF!`q}QSLhEbx=F@i-gq`f0Ovp_Qr zkvUnQ+9OOMsKTxT-b?RrNvF7on%54GwL~ry2^qCUvMaGU9E77+L7GPnGfJ?zWw&sc zyU|Xx^JtuF2WYL!MD-xBK3DPiD?jTz7pOB#B2PCBn$VM%WM+_%yAq2tfu@M7%u7%T3JvkbjzpN7FknY&vrS=R2S$K?lVf^YW8JSj z-O~{>I5SctckYi8yvvr445YrAweMgzW{n3G&3o=>chVD1rxL5^kZtlWFD*gGY%&{p zl{BoZN(&31y;h=%!^$MhauM;ECB-OBP{cEd*?pC@+UXoAieArQ_f5gF&BgL?)Gsk# zIoU*C!kaLCwQ!JACsQRq@zqNBfk+e&|EVX@bEpXOT*7hLuZE4GKfY8zba6jq2L) zjiT~Yo#M_{i%dn>R@FNgEc-0K6zr<|6X)Ia*KDNnJ7QPZq6CIOH>}RT^`ZX;D>~7i8`Q|)*X?;=t2{X?~Ty}lZ_CM40&Nwww;RYG7$4d0)nx+N=_ z-kSImt@Er(sYk9_^)4%6huQ>*I!I@&^jd9dedWlazMX1a$&_Z!TKQ9GwSlXdW0e^s ztsdJO&=3M>zNv4eYG{{e=rC>Q3TfymXz1;2=wE9XylFsCH6kS%2Yc)53hK*F$|_Xr zZF=j#Rc0jKjS!i}MboCGkfxP_rnTOtjgW@VA&n%ZQc2&8&ObCxOBgPZ)Xi}wW@= zL51BRechq!-EVHYBdB{KC3~JQV(jal_`;r8xA*F7dMlOhDbBs-r{0@=@5nLxpo804 zkknbY{vki<1MK^UGTdGn?%pc3-ipHBn%5sHKK3@;erUq&Yia21`2L~!b%)1ypkY~0 z|9aoxZ6AWVA1T?7GV32(?@lhXO8pK@op@Ce?53yIC#=Gc)C9LqpxRD&Fo{td(FfCS?!l9eKp}X~=hua}Q zQT<$f%h%gM%uob&5dz$gz@vHp>(=OZgVrBOL~Y0rFm#xrXqc*hmbe~oH+^> zic%~>DfgpPH&E*8!z9T-#$=?v`KV#&sIhtvS3mOYcO*aFs5Q-)t<-BPsD~!#1~B@KK4&U z^Gu}o0RtMxGo&W7%qNi_$HSzCF1d$OHzrH&CQE6i%B7|%&8MnEr)rC)>iee}H>R5J zrb_W9(%mOJ%s+O8eteZQnLmx>#hVzs`-q^KMoLYi%%{gfrzeW0r~0R-H>PLqrsrrr zjY)m%G5@p_`YEXKW8d`00iI7=cb|4>X7;3J4$No1o_^$2|FqISbGk8u*Z66@agtYR z_R@UzZ|LlG(d*wkO2eB zq?yZa?w7&S%aLaS5f&@41A|e;D_DLj$(t)94J&D3{HfBbS;al+VXMD&R|^JKBa&82 z?s(&IuC+IDwOXuaNw4>KaCHr=Cl{{|T5$H$ zZbaO#qck{>VH-gf8&mik6Pp{}0~>RjY%|iE_OzQz9;}PSo91Dg8@#M*kN2Cpo11%Q z%rR!@l@WOLrNEtmtyQV5AGFLd-00)pc+=i!wAPbF0+1UINH$`t^L`8PgDF}Pjnf-% zf&oYLd@v#cFF^n;p>X?lbNk_b4QRQ`B-g`J3cR*Q(6;Vmmu|)P?G_=npK0!rz1gFc zo1`1uO_batw%n^t*%Q)a&+W zMO$}D=k_uAaD3Fz6q^si0NtE2;IVU{fhS&=0NTabzOCi9Y-%^(Io4X~_IxWgkEMEn z%$~Oy+JZL3yAN%E0TKY{7ERrk*!n79xhYI{Ovr?PV{tqT*n9QZ0MvfimxX+_O~reW zig!P7oNkG8ZNFvfxsx-4rs9cb(0m|wj+Xype=GusliJOK0LL_M&(3{i-r4j1h{igH z?{BFdn0hqYfgU}068CWA#(RutX80C?t38Ki%zz*CLhaReeXhBKQGdt+k=;Gd6*$g0YYjn|_onSYteQ*3i z1`tgeR?p5+tEGDTi=(HgnBWIsqrmCto72f3M}vc3h9Az+nDA#Kp58lpU>c+W(M_j) zMgcg#@W6AO+aF^9;WmRQ=Jrb&K+M+Y<(_z4t!S9dn6!@qXtaRe69_CS>)$ygJKU+7 z+%xBag=me|kZ)%_2##*AhdrRxcYdvNE{3CLR=>#K{lX_WCJg^`Wuw?&dAu!yds)&= z-MW*JhQ7?Q-9EQF4mgmu#1Yp%``wIY;)#dOa56pjYxLj@ZwAdL9NoKb-~0QIH@9dX zwINgwe|&FGyx*9;pSkR|#NuHeXO%;LHBxW5<}Ucd4_sS!iyt*HL|d-{UvFX0bTfN@Z}qz6 zO1o_1J5qndm?$|SD!m(}U!JgfJe|k=8i9)*aU6F04^UPg1tw*-r^$=~&I!UJ(&}{E zw6oKmDWnSO!y^|3?cDSiS0>z_I>UL431KSQBXV}Gx`WaA>7SuKDVRMIQEDS9k<8Hi zhUkpZM9Xi6#S_daj>T^WrgzKB8Nce+8#Gyt78ratY_=G9gF$V0YTSrEU7}EEcxKw= zu{jt+ZS=#uH{fh*w9x3MXc=EI)7A9LGX7^#}R1AJa8uKH1NmfKsXk?<=x+@!%y#&-dWy<{5{(oileuB2)+4p zw$0wS2g-5$)L?d~-nGhQv&&%ME}+2_V=Ny_$ryQCD{P+(M`A`Q3yoFg8AD}pmy(AO z$a-}-WY))W6MOcjhI!W>LU$dm0$J!kuc3!_YJMf!R|joM^aCUO%8YR=?aIt=VL~db zx%TZU>_^P;HBIiNLRi$k6T6i}wH-ioyx4U>6eM=txtvD-7$8U1jLMkG3S98!qNeL# zh=ss9rdaSb)^Hj`44^o(xs`Wq+VTVnB9A%@@9aBtl;~qbbXC}^I&{_eKefzdQ$)5( z5=hCoKoyi&JN5On3`q10j2t=*jI3gw8=5#dT+9gx$~-r+cy-umr0aqqYHSn7+GT9_ zRzXxnUW|0Y$mv~-sHw|G)h<)FmQhhNkM2XVCHXUw08^iF*6s~hpMsc0z_LTP#jEYZ zkLJNgRo#|;yQ5-OVONLUR^harV%BghHj4Rh0!64z47p>^?f^IzYMa3RFlCd(KL)i+ z5!1}EefttK*fv#(?Sp-$mLla)nvvrN2VcEdamRe8>JN_n=40Yc#af*ooZf|FN;t>9 zV(WFT2q2MgsmgWi{bu_%R>HN8JFxfBwV`E9!i}ZoYp+|2-hzaC+c;aF`}m-uq({Xk z$3Bnl?N~G3&ZFwW!=9gGl3oK*&3#@&%v+M)!&vMadqV_DMO#R6r+%ODc?~Jw$*Qn^ z-;ey`cV8yOj?9;*Ut&r7&u5?Y`+vr#lMeV|if$uW#Vh zb~x5U<7OQDR>RI)r5C|-Nlt_R>a*frgnUDPH5l^UAn(QNvu^U+ke^9MFG7EfW8J*| z9l-uF?9Vd$ztAfyrFuA36|b;?1oVsmH|F93_iYGcph$YMUv}~^TVi%+7@Mkkf>v}npb)AMsW6{tl)OD} z3c%Det{`erQ6W(;!*dATOX6@DrXH(JwvFFqWt;#}zMKcwX$yK7qwMHD768_vunL+lY_bcKx}@Hp3wbzX#e8k%o$%s72ktW>i-gMO{yS=i zWiX_Ja_+)4q#XUc{a2Zef{lTKH^7L5aCIG@*{M+i>4=Z1)fHd#a1eKg{+Q60$EYqqoimA8lT1FJXC=!1$T^A-wMTjI zoPTjq(v~>x)4)+Yf2k%Rh8Z-f0M0s*Xm+=k*=k+6e%Ioejs6TxtcF4xe>U>fMS&a& zNd<3(YxzBj>t}IvQjif6;bw8EFe)n`aUg9os{Iap!X7lk6zO15@5t}1cG)@?GFTHl z_`>fhn;1ubstkYF&#jCgJuH>0=}p`?;1kmlkGasy;sTcx0kSyv(sZTUrsUDMFzJ?L z-U&(Rzj6$AvKaHPe*Kli9IteNX;gt4S{Y+yEH7Dv{ijy#Qx?%_0RFyyO%Xax<};~1 zno$8%%|CVHGi!%ou^0!=n4L)d7ps`;9D$Hh8b0DsIm(i`VL*|3%!MgcT)|jimyV;( zr|U}UamsPw&=U{uq}#&n89Y&6DJLHCIEB^A=f*Eu6(=8b=BCozd0w<(lYi+;i_izM z-zzIW%Gj>1@qP|OlBNpYpO3#>lSNvmyL^gwa@^B#mDR0Hz-`(>vW#sK;;Kf|2EBFK z^3AFsFWW%l)Xv2RJIKa;jQ^Q0R^Gq^<)BR3#pIyB>&L|knIj@&%{%5~)fMX1wqzo$ zX5QSEH(-0SS`h7oSjaut(_xOE?>(J|_ zgU79_p&GoOF?u!uC?flS$FnYr%>Lj4|sJ1HU&S$F2) zX~|*I({>V+6j`(^v7hW@(l8aQg)&)+dU3cOIXt>POkY$>r!U38B4fX!hy|}QSy=-sSgCfAsGyP8KEW_6byzT254{D z0XUyy8h8Vp0dbD-V$lN>$4Y<1Hn)z=bOzd<$NK9lnZ(2LoPlaRijIJoz{_mSj&ahEkzGLc zSsHQRKI9z${L>l^^;Zb~%`3gA^y66RGa9Vf8Z9<7fe1RH5S@S@l=2vHl8_M1^_~G6 z7LDq`O?nnT29p7r2gSPR1EqTu11>Re#ewG7v6k{Ukn>pgxili^xG#-TfVol#jM;og z#S1#=BZ%wOGhT5}3acA+I!}EkGkM0K+!mogYohwIRoF)vlxz>Q7g7AcEzvC1I;;o8 zKUZFMo*?3!%yb_sW5H%9g*jS-X(>QfPn*h)qE{%6cXFm9-gq(tX7L7?Oa|nB8ns*- zX~aPI^dM&nz+btkr)#za)vidvX%6vpVl1h&ST8{AcY(yrYaH#MXggPsTOxP7I*z|? zjlVU!PG|zupI^cc{!+WfFAwuA1NLeGCs|OP`-vdUF!<3?m;G=7;@PgAk-_E^$(Duv zNok^GK}sSVmH=tP2)Mx{S;g@NH-}A+8muVM^(bTkfC|crO34_E&;&(TjO7Y{B*pB7 zI_h^8F}}>0B14OJI`9G}4`Zm`bOw5=gZfStOX5LZ=NN90X}QTNd8L!y2MHNGNL zXnPft?mNm82lJqe*c4y3M~RuN9gw?sn~!oVGjANvF31I{J1u}kaF|f9u8}u|mwz(5 z?B8OR3_)_K6U3+b0p35mj`CrMrMcGFLxCUZ<}fW^H%#|Td)?@y*=n+Tq{^b6aVaEh zcVO$QhPPh z)-R>gigntP8pc=w>N@X2=-mCM>0*`uXxwc~+!X88&|(}v0ERDdocIccXAsXfYj*z| zA)iG-xzz^IV{RE~wVG%gw(D4ziO%?ab$rfL*$toz2bKzJeC1UOxCBKMl> zfTzyIfSclT^cB@|J~pOb_6+VW#-m!P=#Wt2u63k0E`&`+uq014E54%%7Grgg*+ydm z+tA2jHOX{!R|ZHgGh%Qt@|9zv&Kj;}A1hVyJTFTnG7m4>N50z#3M>R541XL$qN^mWL3(4DPg4SHc-GFSxJ=*V!yinO z31Q)gSSJ>2X=SAzd!Vd<_B-=w;Bmb(#>QQG({iL_9&{yZF4_wlQ<6H)uxDyq)m#8Q ztB)(rdtQ$ez_-i9w@=)k=e?W-g}+OSZfXF^rDPE8z`b^2Ehu2T_a=>ma4!HBE+8u{ ztO05OAFgUDQDzqqPIwIEjXN&ttdOiEnu~xyH{PzqoWw)?ltBfoi%+s+fI*@flPcvriimdi4&lpavLO7MP#87C=t0P4x!YVI?2DJbVOE5;-+^`j-V%`uTsD4u zUb@mM8^iIrS#8y%Zon4|1E9$tjOWU|L_LuMtnrZRFYW?{=n7h-%BBFzL7>1?CiVuz zkshA{U^vloBed}mG@;rmTsk4Y&cs=cZCRGLB0`IW{t>K!J&|?Hd$l$b$?*9KjH!CD z{PcTH`O~x8x*4r7b4$GIGspkX%Uj~Tdkp(T;Rl7X*1eplCgK1(1!2DOwc&AFZ6yIK zSYxiQ2x$5Yhw4nRXFl^f&Y6I!wk5GDV|x=G7H;*%&$$?5iYi_ zXOv2urk233-25>au=)i6MSOPP)93j-Au_X-wX+p?xAl8K+1_5C<-2*Kvm#n`XJ51x z!X7x-k@hcTKNlhSvUakT;-DrQgqvzr#DaQquPbO$H%D*jI#g>rMgp|F<1_sfa3n{BrQMeOl^3((A&o^^avvaGLBetg z@;?&y^Ow>>|Gc*$OVl!XFZvr`Xb67``Id11*()M(SJ{&KTF*xS^t6~iFFNbptLmSF zj4?>E2WB~B$Ld9U^6n>iiL82ln~8l}oi?`0YyCLT^aLqQheWL3bWKW^9Mw6GVGN+D z8zv~Knc{O!Dv*(Cf8%-?5!;i4j>U#;_9tdn;J7K`c#Mu-QvlaM__-ci-Ls|RxIN(+S zagU0}aH;FAqA?5oXPpp}=jmt-G&`s6RIbKj=7!3i49bZg?SVlt7#^*LkwKt}QkF=l zyrB%bg)olL7XRtZk8{fx=K)$5EYbAV`$mB+@8951Qy5wqM-iocv<%yx>WvO+{Yhku zR+@$3*J0lrq+%do$Hg({J_m>N!2FG)6BSLJc&)3UK(z=n++8#&$l3>ma|kv%!FcxQ z4{7`*m2pL%<6V%MKD%Gvp(H-Irr+I|rcrkhE@ogA>D~Pmv01OY`PF)gD5%Z{pgZk7 zx+T)^Y^U0VV}2nF+CTxfh}AW#O(maAj$jd+cJ^`9FeeL+rRJ}@Ui#szI777(^H_Dv zN+;0t!w`NYqIK#2+dgadPmbSZqsjFt28Xk{Z?j*+3^?;C7i2oNw?k2O8*syRps;j! zbEeY3F$vo~>SeVrJUz!w@l|M!(ssP`&x(Ot!$Tb>+gX1#9bu$UL# zDIEDx76EgAr7Qi+=Sq1mA*@-+O7rNl2|6`o6;gk)vFMsaU>d17WYv8yXSGc`Ty<0g zUQxjXzop}`k{JH|oj2YLk_S>7#-vO4@?#4~@NpG|ueNmnq|rzj!Ah^-Nu*;0E`9+{veF42=Dp~03_@Kz-2z9Y6Iam@bTz+>?_ z;AG~T^UwI60}8+}?&s53-`c|OvcNU0z1#62+F#hA?P)eHVp&wPzs}SC{fL(jC_nQX zTsA3sIl+FvG=DclpEUKZq2_>S`snYkWB#A<^6Td4K0Fd+$`Llk(T}4_$c3x>MIwSN zdh*?x(O=jhZ7spTyZb{cI_?h9uW@gteIAb9KAgNN`qnM-efeQ@_EXFx`S z$%WjH&lyqi#Ps#G&cB$(lBvXePmg~wPoyy^W$?IMuuNrf8MV8AyEvRm5OP{*botFT zQzY@~;`G~Z_PJ8IIAUJcOOAy~)m$NulS|IUT1^|>Cf7e)OO2-8zGo)^m5Z&m;~Bhe ze|gqAT$kHDzW?Rj=<&^d)8ux=x78nVb>Sd>#lM4y#Cpc(el4)~h)N_EeptN{JebH} z*K0O!6Z|?|Am;bu^q=tYT)7f`hx?7l$zr{c8Ozzt^V5}fr_aqEw|`BRdSCtiakkF? zV+R@cjNkJPdU4L8^IqcbXMBy#M|t|lq@(!@h<84S`c%pc(oYwTj`rx<}_Kb zI7@o#zaW+j7P1d4nHm!RD$P_>#T_EGO@mo;Ok5|QWm|+yZsk1MB#N`;o4yHVEBKWC zfvwP^cha`NXX?XRVZd52dkJvn1N*zo!+-3haImVyyBMm1<fgJr4=4I@XvFuKK!qQ@y&T-nIGqwke5*#+J2^25`qoFLz7k z-i=$`09cZz%?s^yWA!LkAJ2PjrrXnsPpXoGqB?c?nxvAu07+Dw$>`*00^ z{UiUdzK^eOt?ZUB`)o>*e_&+zHGjsRlRo~T^4(khxA$Nvf#G;ys6a9XcfY`h2jks& zJieNg;HZ{tXj=@aTfg9Vs?A+nIBk-Y&?FH&^x_R`L%-0+NA%J=-`Bh!rTj(()=z0a ziGNo=|0MmgTX;@(_Pg->5KfrL!XDYcrKgJIz5jc4wM~Xa1G9neizbDE&zCJ~>YuN? z36U0E&5jNGYv<4~@VC^tuZeu!=cC2ZdcgW~v8R!YoC`SNQkhW-VUHeSyA0pLpnF=0 zmoXwJ>|r?tjypk!UiCEQ0%eUKw1`c~T+ zCT9CfIsUy%o7z(clCauHJ{lCZPmZ6uACkcAv0AoRXjx+Rh!PaOw?N3}8Xq4^q5kqUZv* zx5i9OG7vQX!nJlMj3Fi3<&wG(r>>v#;Jafa^b(E)7TE#b0^-=J+t8f=QT|Mo3Rn`l zk)Bc&abCDgWbcm)7*)~98%r?=P(W;VnKmX|dpad!M3m14Q;cCz0ogu>(ku@%)l?b^ zwec&0pIa&NlYz#g7!k>x^@RqU&7J#h+hk zre-W0@|=0fFVHjnDaIdpgwXb+E8b8sS_+tdn|#ztY|rVkPXeco_i0*IMs(m-DtKQF zef>n7+AYN{Oa-@kjXpLjv=Zx&AM&j1XwlYMqF8)d3f z1{q+Ne|@ z2US$>Xe*HXi$pUIVx|aS;Iy(tfP@fmaOH2HPNx7MB(@S$o;8Y;hY7v>4I`EiD-JkF z22*GUn8{^4Z1~L^WMaxvEf}z`sF{Z4lKfcFL@0&7Pt(2dp}hmtRm-Ga6fDy+Cqj)5 zjTUPk{`kxsNqxM7ZfYae*Ra(Wh+nNVT#Mc#!20&|rC*xSSH&OoL_vw8*3$ zhv3OjjRYiI5w2tpx<*tp55(h^!g2j;nc58Idp$K2F$>HK^2-AFF^Boiu1Yo!}Y)u|dRRipW?){bl<}%bEjzuBVfc#i2^(-* z1A=+ZfwW6F#5XT?>&a~3nD%ofSW(d+dqgDuMo*-WIlN@a!pGX|E*(E7YRqC)fIt{c ztu(P`n)i;kVB0C3_PD%hIcU@^_#A(8btZpHA5J@${I%Pb6_h&=DP}(}g>;Mp=R!~a zXbNCEFJ@7O0qV;s&+wJdzu-z0cd#ViSyNk~uyen9o?J$xsz$?W=F(yad5{?9$^{F? z&76&HTuJ*rG7E6l2C%7hf}s2A@`mn_vlN4un9mK?G~_MJhc=0`*<_H>w1U8*eAW9>IVy16PnND| ze#xH@9n6zfT(VyOHPQHj$??TC2%T?IRsX;*v4e-FJkE(?WND*mTT^c)`FXN+ z8z+HClU>**f>d-#$VyPe{Vc^vpD93ADUQlJ<&^dc%3K=oSJ@cg!R`ESLKPwxqLhIq zRLQtby4#g5`S2?(+HaF@yxi|-&D0z8eE2^b*l zX`C8n;j-&yvlxwrF$QWgc;WjwUk?m0NTsY}&zQ(gGD{j6_#`9Ac5I0r=+O8)3-m5T z>6z1_20ro=hdD-QVewVTVUcm0e4Il1X7m1SRLMYNc(i7I+NvqnUSwcoTBPZXqN`eb z*8lcSv5}URXV{|*gsVQk$v8)1k_Wj&nBHfAosnXp=z@)KTyHdLU=fsLSS)!I*; zH!mWB1k`2=pBgAcP&)8xqf^oxeqy*}ASZPI<=FrZRw8JNQWYlNLRaJ@I^-NoqQAv} zPRjC6svc1|)^fpzYk~P%s2I8Lb$|o&FF4wa*XE1|$p|7)0gnQ*)?&6Lf&BDS-pr={ zz47vXtxQwQJIs|C(i}#y-8_F6SQD=W%7gsd7sf9(tLG-O}wB7*D6`1QWv68uMmIo}OEXTDNc9OQPfVUtvhs4n*!&QfXQUF+(QGZ$y zXq%CzMN#~V2!7{T@M+`;X&E>u;v4S{zAFe~L4Z%T|C1s2kT!qsn+d0=)@U)IG;Nus z{j##jEaQrC;6Rq5y&bqMVqUzM#hQ%PF!~*>g`L7`3z1%uiD{z`)m0hkb-;oq+7jG5xG12+pVwN*76h@0793+aTG{c-Pe&G`^PX#N zk;>OwM2mdID5c$04v4@dL>G2OVUrx{xT3_6RIdUytHlk`XyJ>)rgtgKiU{*5pIoEj z2wGnh^;Ct9ZM1YX{eni-6z2|3ZG_|V%E# zyLmWKKT5&1P|4L^A#YB2C6!I8gecaYHrd`jrxFa+LsVsuYU*gj5^751slRz-+hbt9 zw~ofakXJfI2&tp92R-8tHfF-MS7h1s;@wpd*`3!YplXdU%2{SBSPZ<^zcrV&ODV_9 z+Jw3SPCK_1P)7PfCMePzenKk=-_KG# zgxn#@eG2eP&HXKpJZUMJ)z^OHSy`JHyf`5?$fyA$tX_J8I)lk{(N^=H2Kt!{zvfyc zxMWklGsD~gDj|wHeRf9SdNzhADpu#G<;s~aPfzFQPUieW-BCOl5t}f=R3t;05j64oSnBkG zmFCyG_07GydYCzX2$$wl){dPW8viZ+g1RU;1FWlPK7Da*v^ezmx`7R{XzZlBimn4k zJDn;(v}`OAtJB+AcYH+)(-_xRvWvSo3o#Im?(MXuKGgiNk05l&vC-L)0#pzCfy~Vi zX2v)Or>@j^BnCac(U~d3j0@z<8PQnQ zx{>Li@J@o$Kv<~99(Gm^ALY+eyof_+^OYQa>w(j2gcIGJ%xw`ue>GPME)&LRT|Q4v zdmM3S8_k+AOsZ^bkpZNN=MN%T1~4pNVG1l{EvhtHc$7Ig56e=K@E4fcQdZ{Zmyvbt z{y6s}rJE*mT?NKkV2iqBVqyzmqvHb$qcImF2sp|MBFS`g%2irrEMDxfYi840!|!rn zSfwo(b^?^4z%>WuZEr8tm{!8>Y3yzR+|b7&zSWt#YMm|%#ue2c5-Br8h1lQl+DPB4 z6Lovfn+uX>s*^QnlE(>-hqnEUZ==-0qpX;vZ25(({Pnw4kcJ?cT1}f~xovQ|ZF8lK z?lW$$w$*}AE2;Q1)aEE1xlmsRNoz^AS5^g`Ck8~G>01$*4lVG}GFqD`TgLz;$MuES zE?Q6a+*K#ryqTw>PA<@8TY1{UEM?B+^3z3Q=4swnW%~_iYx^#R5Z~J*`b|=UW71t$ z1y5j(we*omJ%T*d#!~wo{|fz|`3*yDdzQdioR_xg*{E0xaO3P%ble(nZ29EIGWHQGLc_T$~RK~ch+XgGOjBEcZu^$Vo~AsIhhKOYM9 zJ9|SJ|k%s zmeboJ!acskVL}8;<(W=NVEg3NIsS%-@<~q=?r|j2kgbX=iZ>d`&qE;ASNZZaOosh= zXPR+dXSA%{Xm*>i12H+-m*>3h%G}e3Sb#e8NByTEk9YMt2JHv`2OdE#y z=>UHvdHPm+0Vy=DPr!GcpDVk*h%NH&xND=E!thV!{yD=)?ute2cdQSGKL9AZqf%db}vm?WKGo=3YA1JIA-{DDnwF^W_7HN;b%<)BJ1?@^jN)k)VMWN_j9MaL|b zcD*Z86kp{CgIP7PBPwj0+cCsAy!&5k2MgSB>ubQ)(FXzUc*`GYmMmh&-`XOPowZV| z?BD;$I>Z5t>LX~b<>-R|xEt`K*Q{9~E_V*gr)?25>K^s9Ru{bV-s+#nt5lm4Mu# z@_#nILyhwYTUT!dc7z3hW*F!+q3EEn2+p8dOsOkz_YL#cn*z2d9B(9dDS&%Nm^~{U zEHErq8O7T8D2uxT6f6SpSADQQdBxiEVQ?0#u~+K%&6@9zwWPcyA!N7zML^uYU<6P? zh2==o18wPxX^hz}PLP2af0eE)_4PM~xRF`?qZL?98CTCjjTgwU9Z>2Z&(Nv0nu=nD zz(el$4U6HS1tOFjdl%pgX1R72Pf}bj*!_~x&m5Q^)@LDac~7=H0meDZ`wT39gv|?A zdLBZ_+Tre3GBmae-RqThzl+7A?G(M=o{H%FURmXuV9n@!J8<;s>S=J!&_F$do!-7b z;(3LF)V^(`z1F^hZ=j5FO4hqkdV7^kwKl+?%`ALniJks3^|R{W?27m8UDQ)6b9RT= z*m8EOkJl=-0`d@`!slhfNw|FE8<{`~+2$ifhJ#r**u79Cl)Kc?7Ba9&>IE3cbcy@=*#gi>-O3m%a+XbwCH>F>+6@kTraDka3B_$RGzoZNE{Kn zVSk>F-S}HZr5vgJb}KUU%ItM-0c4N0-YcHMv2W%Abr_=sYAizBu7;{MzulXBVc7ol z5(kE5jL~8yqR=4uTxDxq+iA=$1O|SAnAddtvjYIWxGYJ}+?RPmb3;fJv+?`9ndAUP z={axe#r^eL_bUvYYl@1B&|xC_iAtjDk{C=%``S4GYjkL-d_3@dK|G$Irlhhgw?t4& zXPzThe3cbSC#sV?r%h45*j_kZjx>_WwWyqqvL^32rf)sx?BCm&R4?b%(}6{@M;HF8 zre3aN?#ASs(W0q%o`nhKbamZH)_nJcN%pd2-6_tx#s$?8KC`a{hW_TYz$4u~EZAG96OT?erO;j_%5- zdDgAH5Gs>W8Ep*mcv+>4xaq#nr8}V&!{TKovM3eyz zdn7Zq6aiHkLd1-9G7(cD3z$kzmEDSIF~(S}mS7q(`J!!*vl^eY-1@N4i3!wJ;|wR} z+9-$qW22xopV-fRhJT`7q$oseVwM4;6%wx}EL z#!z~$?8Y&s8t)}=Hm~e)e6+==tDMl?O-ji|!^K#LBsxy=LFf(}{9gd-Ko!3_;$(`> zmow7fyz~%qK~M}_XwJEv8NGDpozaoyz?_jA=(_AYU?Gg3or4tE6DIi?ok|kAglXZZ zCTKmWvzE@eLFs&z4qzj~FO8RT4G_T*U~nkx7s{~WRtJrx!h-q|3<_l+Ei6H%UXO~C zojL^a)>Kti?EbHRc zS#RC-*I|!c_StE#-S)u<8o(B9I5zbJESjMls~M+JL%@-R;#36`{%~d~n4$lVXy)?7 zgT|LMy}-peO+(3M0Er@TPG{$2QB=_VPn{4@P~8I;$SCT;We^*XO+;VpiG>bwL70i{Sp{K;eg;@UI6&xu1uFk!g5ZV*0rdn1 zaA=c+xQGx3CF(mD9KqZY#K{NRhgYP$qeRFgjy{|+C1XSgAE#0tvYAD7S+wOXahXe9 z?vj_i^ku`!7))Uf6Ob8Ugg1O)JQWxreAnX-F`-F7ALK`r38W?i$&iO14Cn;^i6E{( z(2yle@>C?D1AU^IPIZci1t;5JBG*}vU(S=B^|a?b@tIG3S}~se^k+)8#z@TR z$bZO?O^Dzpp&xo@>|^&rSjkS7vg$l+WigxCtU#8t zo%QTzK^xj%YL>L6HSK9po7$;}mbI;Q?Q3Bh+bgM-wzakGZE=fO+3uFNz4h&Hfr}R% z{9w4nCGK&Jn_T2BSGmn)?sJ_RUFc3%y49ubb*-CS>~2@P-R16gy&GQej#s?m?ZkP} zo8I!0m%ZziST1rAT=~wIzV)@Q!q%JL_U>1|{pIg}{Tu&a01sHe1!iw22Jiz5{2;*# z?u3CM%-;9L_r4Xj@P#p)VZ%h2!vywlhe7;d5r>$>BYtit7OY?uTc8srF7b<94BfZD z7sfS?v5j%e-dbvy$36D(YjYc9ArD!zD7F9#EO6u_cY?_Bgcy8(9Azm_naaFv@|Cfi z<$`uXKo-z|m%Ys7D@P2c3II+j_8U82l^cJ-@a9qZVspaiz45Hv?-4IKaeb3NWWgrH6nQ0Fj15{E|gY(g5V zuo%^B)eb8BLX<=eal_IjMD0%1ExRmXe=2kxB1O+{+P1- zB%1u*wLbwaa6#QF;zk~ zXK$`|1>dkH;x;%zrm_|ZNL^hxQ7K6Ko>Od$VE#4-G(!J`W;9$tiXZ@-+CcO$wJ>OJ zQbbij3oOwbbR-ics8SUuH3};hbdd#Sd$u=JL3sgsZBP&ipDZHOf=%eG^$596Fw{V_ zWVr`m2l-v_#xcT55u_!z&~#E(Gy)NvV-v5L1`>9WJQbWk3$}3KH=-f(a1mZwonQeE zWb$PJl^O}`J_j+j&me3<=2{{|ex&rUU|oW!5eC5JK*WYXZVd{;4$MIkz94wgAsEu+ z$tX@Ok@4*<(>b&pc{%u1MGnC*rlK7O0S@*AR=ygaN!vefgmCQ z9q@;K5+O~N=4VueHI5*E#!cFG20g&TII=?|?ni$F?iq|>d~Rbi0ElUrApp(ieCXr^ zvxL>VD80>SrJp1tWe<71CtjfG=4DB25HDtk{k2nBrvOq#PbRteXghXJl{w$!0RsjRfZXiMfHn^f!)DBv@!2o+9W%N)f&~2o20vmuR zDW+ljD3BLm;~NG5-yR0O_$&lvaTaOO)p#yoSRoy70Sa2cV6LK3His)xi8vOD75XhJ ziYPXMsptZQ8QLR!tVaz_;Q0S+KvJlU1@3@4`Y;l}K@tw63SL1H7_aqMzz8-$6|7_Q zfW-8&<~*K*a0CIF-cV2^um@7b4I#qxRN=5rfFy>h_`HK?s?HCD zV+U104t${xlI9M)kc{rIWmJGn&LK>GM;f?7AX?&HHo*pVpc}42Z-U_kx#AHnaRqq6 z5~yGVvIX7BBNI{1=fI5AX2ty4AP10O6h`eJGSMeE5iDLn7w{zqdLR!r@j$X75!2xn zbYKUZ!5pH31zzxT`k)2ur2!v?)jF^i#d0jklE*INZw?|_Fkm2Tzz)!@AW8s3Y#|+5 zA&;FMT^BogWjB4j<7L79$FGsWX-CIwg$f;G~I z8G;ESs;?kE?is*ikA4#*rQsKM@+8Nh9H`(0r$Gn+Mj*gL13I8LRlp_*q7%-f9Bd#b znXEI4M<6x=(+03_GQ&qYu?|Ln2X^RbVh)~k!W?o$WnPdL2I2*sMIbO^04~E};BC*! z@;?DIK!NKrZV@5$CQfLiJXSCe5eP2{OW0;l0t+HB^JK3&fCb>t8@e$~lw;UH;eb$O z*jhoEa47yy84xgej^oM$Td!8U_{xG*9((Pe1D{^$ki1Z--dp1WKnET<z#CDaKVRzq4KfV#sAnBy;Jrj!b{nfgE_Y;RRss8a)4LKk^aT|{jIItW3CwJ3N*VD=6O^1vgj_7S9E zMNopvSTf!8ujMq77_Q|fgVH{RQYX;u1a^0CXiXZfVG}AgBT#o0Fybo~0f}_TIFEG4 z?i6dewtUU^e6J{DK&E3pCQd|#WK2eSRfYvv1~v?@rsVb@8ntU4^=gXmey#@jR3?0w z#uw@;9+%KzqoZ*%qC<%=>p;bHbMKqVCO`UD(s)B28&-~bC1?CsR|POBJg8T_wef>7u6 zAT&XQx3?EeC;POQAi|gC(6@@M_=;sGcXp@ltn`Mo0)~udqfYIetfP6J$E)(!An-6!m3aHvpLxFxz(l}R8X!SWP zMFTib61t}WXJZ7i7eT@odKFOb+GBQI*mh;MD}2a>&Y>9c;2Ww|la-?WIKmhgK@v#~ z3V}z20B|6JSa?Jt1Z)8*qG1p?A!VS~dHB*kF4;VLSctwyic2_mI51qX_?iEqIhq+} zi&SPR*5G$p#{%12BMCz{6Gab2l)8mBP6`o)lLcDJ2d`lvpD? zZ{;KiNFZ2ck3hJO`q`Q-UAup4{C+WM^>d$I|v#a2wk_WH3Yo2?U!E&5ZjK|8c* z+O0{uv`zc8Q9HF&d$n1+wO#wQVLP^Ed$wsCwxO%GaXYtld$()*2huAP((A!A+r%bJ zw2k|?q4}znd$}=dRol#A_7l0Kd%Dk;xvl%U39GNzjJmnIyS+OwusgiPd%U6NyUqK& z(K{~4d%fAay}vcR;XA(3+r8<#zOP%p@jJh#+rIg`zj0c>0X)DH+rJ6Cz}-y15j??_ z+Q1pS!G}!2Aw0sR*}*Bi!c|McF+9Vo+rl}#!z)X}K|I9AbtnHIa2h1EHPS_xwGSo4 zB6U6d#bNv)M100+{6BjE8&G&0z@euObd^gfB;hv3h1|kxyvU9G19M;ioH#0Vz!&p! zSf_yjgIU*bQ5))V$g!Nmk9^CyJm-2L9R@%lQeZ6D_<!%0e#UKJ<0?HoQNHC}o-$TG=8x^=X};zcL*{Y*xov*uc^Zvd2 zOX^k1zz)v->=SN6^6CbfZtE-j>*ap#&m!!}{yqQ1zM#ZL2)x5Pl&&WVgsb2_>FK`k zyWS}9j*|~7d`CI^h+z#H#D_}JTO}WIOkC^vqd<~5B055%kcyKCX+U0p2^#GRN@?^H z3aOHP@R{B4U0>+|(K8r2BaU=);-m#xpax=LhI@osY*=J1>+K_=sv7O=pManPzdls6 z(JTofNTQ=A3J$zLpjlt%U;p}R-gSG?h=G49j`Rhs1zT7F8?<)>>}47ZVLKk-EvI)H zV)6*`Al_BtBE2|4n2o2^rUPU^3%04@0D=r24Jrz%VBv#K4i*Mg_#oqj#fcg`f^<;v zfee`=IZntR^JQVfkt9o+Jc%-;%9Sizx_ti$Gp5X$G;5L^fHSAgojiN`{0TIu(4j<& z8a;|MsnVrPn>u|8HLBF9RI6IOiZ!d&tz5f${R%d$*s)~GnvE*$83u+n?4(=e(#|=! z20yS8r)GqQ4JEog8&9F zJ-YPi)T>*+jy=2f?cBS2ugYRTWy;@Zxn_yD;fh}4CzspsVp%y42Gfr?L1%J0VupaP z4F1w;LWEb)c`A_bkVYEe5!`Ab6~zBS3O;Q1MHIIk^pS!J!eNDS9)1X7h$4K=uE=7GF1`q3j55xcU3=r4V_r+?8MK~_#n@1SH02Of(2gqDfW#=jNHfke4<_dz zfGVWGghqCFRt6ph9+XgP4TbkYm1Mw?glMs0dF7Q>Y)N99ZoUa;oG;NxXPtK5iD#aA z?#XALe*SsYIKk9pu)+>YY_Y~3i)@U&n1jmz zM8Z_)36GppOn)Pxz{)ql=%D|_FE`R9!Zd^A&;byf%tc>HosRcuN>P&Z5grzt@WMk3 ze%a-gK14wqy=06LnrU<(VL`73AB=Fqb0*7h!wx?Tal{f&OtFhhR@N>`cC}|tCAhIy z*`z8kaq&3c@bV3~-<*Rnr0&kNnwKNxrXXi<45Wf-8kGTuMtMM%poY7tph1S7`7EWv zN-xcHn-xC|b<|Q%O?A~)7puYvSTut%W+`nvUdIQqfP^U}PkLV-OkVSf2qL@ihc@~V zqsFsPvYNEfc_2ZC77Xc(CK*37RD+my&~ZdV{?`0+(~dt5IdWG|PI={)Uyga^nm+}h zaigg^(&r|H*3hONexCpIs~3%Sf(GYl032ke0%(J%imJwf2Q1_uYSNMa4t($@ZBBgg z#vhM-^2*yOJd~Lgqz@z=AVy#`XzeLe*5mf z4}bg=gD?JM>&3p2*MDGP+=Y{p$Sij!W2eqge+{K3w@=+7|L*lG^}BZUWmgS>d+=O z?4b{T2*eB;YH^Dp#G)6!2*xn7 zkBek1;{nBp#x(z`agCERqZ{9dJ~qm6j&!UevEYcuJOeC(qi|L7t;3UZK31Ee7j ziO57ghmeeHN@{YGob05iFbT>~TF;ZDETt*=D9Ti-k|w8Y zr7K_Q#Z}63mMej!EpLfSAJTG{ylhA=e+kTBas+58#ZK+Gaxzd=P@uf7asWN4XQ~lX=r##JNPJf!do(grS zrUa@{t4GwNDs_@H3EyNyCX+%Pb*d^^s#UKF$fi;Tsxgr&i87+0qmkhZx1*{kv5MBT z%27C8jSE-X^nnSbsSHOWt680?*1YO9mNsdtj^0Wl)R~4sC%DjEQ@Pi~Dwc^V*nuu4 z!?sqb#H%FW#5cyVpEW$IvT}PWT@J(vxt(JgYbc*_OoN)>_#h80$PgWpfE$4j$uwig zfkDEg5yY|Sur6GzZ-48Oc6^Kq5o!yjnuN$T zw+sJyfovdSnvgIgH*_5n93o;`-dYg2>}_uf(}4>pv;YgzxJ-3dBGvE}qYWy!6gF1D zf)V^-9Mk9z2Oja3f&^(AR2ab#@^C+utgCA+K`rPsV}~>h00lm% zM`9&j^}f)(EN*cI)3TN$x#hF?<*Hrqq8GmS1u%jkjA7EF7{)jTbP~2v##CY&Fodqd z5y4OyI^%Uk)WuxxG62J4qw?$)d|d5Od)^bD`P2t(_?cUO(%ZS3 zSQuY)7=UX?1LE&anZztO(}u>>AuYGi%Y-iU`)q`xF`J}NW**Ovf;6Nxe-=qfVv_%p z;4B;q;~8(E1A(4%29kwj=t^Yh%$fwvLPM*1)!7pip}3lYLnW#qjB*sDkPFpH^%ql` zO7DazbL5m^nt+v1aO*!FOrrjq2TV=$i zf){{nt8^h5c~GV@mI2#kD1kOgu4|xoT`OpI=-JOkP&5r)sd4=7BEV0M@``0`YZU%k za>M4a(Uk3Ma7o+R+V-}%&8==CT0sW1L}!`3rnzFugA05xh5=QsMNoQZ?Fl8CM(q%%mCKV%yKZC&fTV@P;ZWgy!UIqDUxy4&AAEGb(2By(rGPT`LC zyzhyA^^36G|DF=P3x4o4;=B0#4*101gz$`SyowYLdEz*J@|5RJ7%4>e})4{yw zW5W5+i{31sFMUf!kNVVi#q_KXyy{;M`>C{k_9cnE?Qg#n+UwpRxbMC1g|hqI|9<$y z&q?rgU;O0zemE!igOe_Z0!|S3_z6_L^>5GckvR2RC;5Ujh@o_q1ZjMAM_6UgF@5SA z@cQh3efAr&eZUrE2SQ?QX8J<@5Q(5N-yp4lemxH5P!JQA4*vHV$YuWyi(pvlmp|?2 zfTAa9iza_|k${Ru5~L9%h^HL;$1d##fC8ujzxEApVK?+w4p2~j3w7#!$UALF2d1pzmgHCk)H5;=GzHt-1F5QZbb2|)N7=$0C>h9e^Z zXI2Z9YTEi`tDNTrJ1 zNOi0Tj)(yuBOrs|un>k}7qi20&ge@u%iJr&Shx9I1c8}3T5?% z9zzmd2qD(EjKYYJ=ChD3>2D3G0$wE-v`|)-D1TdcgT4riF)54&R~hVpf+>-MCy)of z@QeoWgCrS*JE;N#77Rqj11hkrt#8kaU4uY^Va! zM~bBJbsY(Y9^e7t0}k@$hMTAYV|iP>z?28^2RAvDzhjkuS!h@Zh=PcR2GJMifD2T> z0#V=ym0(zjsD0y53~PV{*#d^50gB?117r39lCfORQi=9x4y&*M14x%4I4RBO3Xh(GWZOoITA#MnZ<ysB@;mtR(N2j(D5p{{H1wkcNvLL@|Pr{0=$Ru!+agbl*1A7oUG(!hV zpaP^K8XX22h7qj}aT+bqTpeZwHEFE|m96!fOX1NCHqxyqQLJCEfO!@YM-o@y+N{43 zV9}Zp{>muJHZ=39MfM7@wnQK`v8qDH0-naKV`Fyc>KeU41|6a^JtJ1L>abB1u_yaV z#A>X@Rt8tlAY8&B7yzvwI|6`HYNST8C3{3D%d@7mtx~BH0~@Yna0OcD1NA1Y@ERdM z=WHr)0}FAZI%`BdOSPMXulm{&{rdl}xlyzi_zJxQe8*0c&hTt97yB8CUSC22le?iza>R zw+qnzYQl_iAb%eSjwYsm%My=aX zuuHpWB)c3{ySe*Cw_8!V>$_IOyA<`i!`no`+fc-dyh&ud43)gi`$NlHP|hp8H3Yo` zHNDpxL)F_)*vq{qq@>TcMa>7k+B-bmYrY-yeqZQW-S>UrmlES=KcXu=>MQW)eIeAh>@IS`d|Z zmYnbw2JEo=3&Ia1nA%tn6u1c7iM9i&fyvQk9hfr8pbL+Jzl&$amHa+v{G5V_o+D9+2WQBT*$|!hjs*dU z7$b@A`wMBA!Y_P{Jn;Vw*Eo_U5z8qF43A(AlJJT^Yl-F{3s_pcmJH18gUJN~i?T?I zwupWnS3)+I72Fk5SX^7!$!(bQzVywf% zsLPWa%Gw%}@-(KS~e@>YV%h zj~NVx*n$`7tOA0(!sP4D7mYo`EYBnnk)iV?6ghwv*^?RBGMGCO`)9?FabpHu8RM&o zh8)VLiH1z@77|T=6|KD(t<%Y)(J_f5@|ukmw~kBc%sQBxlL3^b)fYHc!gpcN0(dFf zqHbDD5>(v~Xc+%%BxxC7vpf=roRVQk2j(yey37Jw?ZLkq)`y)rJspTROcIBgn2Xt%kJ;56t*v0^x(0ZJ+_jrOo$P5Yo~lM55P=DAOvbaLFLp2-eG9oxg}}+ms`o zM~!g2c^8u4n?4$xA4!t$NzMd34#^3S%qel?tYG;Hhh^!)evBK-AP)1$0yC@v;2eMs z9fqi_%l7yvz6`y$P2N|N+a#@Y!K>si0$dW(s&T_$t3V~pZU3;3w;p(38a7Q z-X_Bhn_&N2(mfjCbDk`q-5{vY2g==s$t2xc#O&?W7o7=pN?0eZt7Y=>WFpf ztG@qGsUAwK4(n9m>aQN_waz)Sj!Cwz>r8>`xxVYaK2g1HNx)9*L?P_MUhK*K6UXjN z%I@q>#O#dp?9+}D(Jt-O{_NIHNZ6k3+Ac`k?(E+F?ckp5;;u*JUhd}ZPUueT>b~ym z{_E}zNAM2p^8QBj9`E*kt@v*1`o8b{9_#*IMgZUM0?$PRU+V^c@CXm<3hz%0&*~2U zun@oM60f!tf9e)*vKVjb8c(krAL<^zvmhVxB40!#U-BluLnzyhkLX4}Xh@&*N z`I?`QoDb!m&yt{D`Jyj9q~H0b@0X~b`l|0Ztl#&puQaev`?YWTw~za|ulu{t`@Qe` zzYqMuFZ{z#{Kaql$B+EUul&o;{LSzD&kz04Fa6U`{nc;%*N^?#ul?K4{oU{V-w*!b zFaG0C{^f7}=a2sBum0=L{_XGn?+^d+FaPsT|MhSG_mBViumAhc|NRdT0|fsLBv{bk zL4*kvE@ary;X{ZKB~GMR(c(pn88vR?*wN!hkRe5mBw5nrNt7v7u4LKL@ngu5 zB~PYY+45z~nKf_b+}ZPI(4j?-CSBU}Y1FAzuV&ra^=sI%WzVKv+xBhTxpnX6-P`wX z;K79tCtlq6apcLBFK6D|`E%&erBA0`-THOx*|l%y-rf6m@ZrUeCtv^G{CV{0)vssY z-u-*{@#W8_U*Gm^CYyBfNhqU~a!M+zwDL+Uv($1+F1z&dOEAL}b4)VJH1kX}(^PX! zHrsUbO*rF}b51(zwDV3p^VD-sKKu0ZPe20|bWlPIHS|zK6IFCkMjLhXQAi_|bW%zy zwe(U$Ue@eDl?JUw-@b_g{bm7I6 z%QpLLw9{65ZMNHX`)#=6mV0ix>$dxDyz|z3Z@&BX`)~ii0~dU7!V5S2aKsZ=d~wDb zcl>e4BbR(~$}6}0a?CT=d~?n__xy9vLl=E?(n~k}bktKZ`Z@dhD~;etYh__x^kE z!xw*i^2;~>eDu>-e|`4bcmI9(JqanQsfn0Q6yt06;(({~+f-^6>?WFd!W6 zxaKz1=8l4(qMYT_Mmodsk9}~$oo^fGJk9@UPhpHx8Zcl91oV*%kU(G_JnF<7_|7gbmAiz|DD0Ck~ooI*{fC_z(a{%P5 zXGIv`4qKSC4CDMoLln_cr9yQgNwtVV;VBSQl(Zu1#DF<1c8GhsPnf1DZ@OzsSwn%)wO+{2RWNM0IXJ45l4M$YH_O5qM|jP zhAoI-Ybw&CiWIF59msf>D_5Kz)umbGY=3jwSAA%LoGBehcnKm;#;&%e1|?@=YbsBh zQurUNRcARU^lILRccGA>fEM2b;k1; zuv{VhVqu{9A4tV*eer1!pfdje#$ncnK3k=C_$vj)OI3d(RnUu zqY+Gs3dSWl@nc8xW>S6(X*F|qzAEGYEQYr1!f7rsK zNR@SA0g-L`suSLSMKNrJk!*zM)}rBHs6oH2QHAFEtMF_utJj@Y4bOAx{baC6a~%&T?zvr@b9vLwH@G{XA9|}t{~?6!Hq{?%*j1Y? z|H8kpqdKv>x~xMvMa#K(I=LCUtBzW;Y`ZHKt1`t(yQeBWx%)q)5o~&WHs$-VJ0n2F8osx(vdWS-W4p91M5**LIlz)EG_xr=bBDI8D{x~y zwvs#DO2Q!1DZc8ts_QbjiomcMzX*&qGeoX5v?zrNycYbz6)dTUTQN*4H2Awg96Y&% zsI!~%szLu7sEBYd7$duTg8&NjE)ZNbS-U7T11wYsHn=LjQ?oB{6S~<`E|1cvRpUAe zo4UvQDndiRi!+GJGcp%+2a~g@jibFBvo)upILCUai{iJxL%y_`Gxc!;cWU zx7-%6dW6GRKv!>0P zICJXU$+M@=pFo59bV;C>oFOC-&@wcpLKW6PfX)wS*0xO3|^sk*oC-w`eE zMoPPQakFSWY}hcox%20WflHrG9V7JX*clq%&b_g6Q+>M}5D4Yxe*KD4jrm+hzEf)%NUAVC90=o5VMVesIE7>dT= zh8$Lv;fHZaDB_64foS51D3;gZiupN+A&D@~MB#E6SeW9CI6lSVjyzJ7{zkSh8s4mLxst<(E8hDdw2ZWoag5O+E-_gfnhX zBL!r}iR77d?kDG+1FWg%o-pC*=bwz#DQI13BFHCzQDQ&=oPaip;h>OC=O~wlR{G?m zm}c5lq?~GXqNUy;SK*?JYHI3wJx-zOs;su^>Z`EE|0?UOwAO0tt+?i@>#n@^>g%tw zq6q4+B%W&Qu|##MtVe|&NbGi=(WvO6$X0t@s>_~dtw2)<`|P&?ZY%D%2xV(7M$H-s zE^X1eIc=%r#!DKuRZVg3RpNI0>AL)KC-1-8-Yc*~=@!^8Y*CWx0Kg0<$fLdW4op?P z-X3gmYz=3usl*%??BB(iiR!Mx8kg)By;MQWu}2iIlt(VLE9ay_h4-j?U zkULd1NLOQ>(a|>yu-ZXglY|5-)3i~8F2D@HNi=JazzH!xC&dXjbuFwM(L=RlpJJv%s zwZP0Z1R?`j;B9{M1W)t;HIu-GAS6iBb0t9nC$RAfEHpzK+>pco|9J32VpIWbtV7D{>M#%|fUO|>yB%1L@P#qZ z;fhSSf&ssBhh%qi3{P#1{tOX1mUQM zWI!p(tPB8@<#-~OE=LgZEyM+{>w^wRFbZ43qQ#urY52zHJVe6^YYCb;phnq z%n>qmg(1K0^kt>xIskz?N{N-EF4Z2Ai0V}5qSaLH zPZ(ZxiB*?6k7^(jF-et+bp{g9gy`S}&UnTy36cY+4xj|O;D#)f2s_#BAQ`{3pEBtN z78V>~3}2uF6RtSTEe55F*vzI+j8F?~T!JP;sO)8jf>J>Fs43`#U=P8e~CDR?v#dI;G_l~YnncJ{jlsY_3H`iE%rA*Q*Y=|f~%ha0?rrNL+cPk;7P zi3C-(p9lmCEOJzbXd)lL$bmzoTGpq2#Hn+sfiSS@kQ!V=5;rg~SEU-(gisimEBSAL zL-Sv?ijP|*(LoQ;)(U~NAPSdQL<EQi+37pa7YSF z(Fh&vAb&M|siSKV3SKnYA>)Xu=)9cq)RE8enqP#hw!R z?=3Wq7p;l|#sujqhE;OvRCCxJxIPFgK|GQ?{P1|R7yt@5fj(>m;{+{u#Qd<4i}o2M z4?oLwjh``)!M;Q&QMjVG#VyS%(BTV5Kr&9o@sD=9Lk@?yCQQcRjyuGp7XPTlz1#hd zcaH!krO-#a^-+rEx`W^PhDkH_F^Pl!V;{^_K^GAolYsL(vXE`Y!y~SOg&%_5?N0bO z^l=E8j9e#C|AtA*fl_EWtyOR5bl{d{-WuQNV4d#lLTW$J1p&8KgYrbPL)7d%H`m$d zd1`3VRZxmtINj-~NP=x^lJwwaR|Q9>u5}0S&`<~@yLfhja3|pbt;a;U1r09OAxcoS z7v!O2uZh`}tA|Mtbdg;TMRl9oiL0w1>?+tZ+6l_s!MC071&z2DmWzl`Oj0I*mdWBD zzj%(y0lOa!#X>wA5_`#!L>iYEFAPS8B z!!*=@>7SiIBAi~JrwtHRjk1K^I-4|nhy~T>slbv|Nh*px)1iN;siRNeN1In z1Aq$lKnm_qU z3D*n+rvh@&4kULI_?B?PP;gx|4hDp8*yM)uPzoa;2kx*BB^Pkm1UL$pZ!i&XdKh?0 z|J8^y;fDLrhWW+P{h@E#wZYUHvoOs zQGthD&2j0eF8pF1F#Ees0s+tYjq_MPBnp2DSjuQeeLjp zJTO%QpjCo-0s?W9Ik}TUlmQCJ38kZbUNr&LuxqCVV_$F$uRv=x!wro9002Nntwa)! zP!2Xg5O$ypLbLtX2zj_gweW^J;bb=>Wh_^btF#*AWE5C7b6G}nDgm0HX^Po{icgSQ zb@fyh;F56Eb9E7m4sm9*h!tMI3(0T@4?$VjFbNN#1M5=?GUzD=p>(+jj03;|DypJK zhjl0ldDb`+(P(x8p>@hdTs68-GG(K7!z~X37Z#>n%A7tMRzg5 zj*ll3aOVLO44IrQ^7F!f1^LNsaEv2=QSAf}jT!5J*a>pVuQ^ zEj0{{FqknVY3l`Puh$4dumg0e17F~Kzz1tMKnb3JU>0BjU~qg9|50l87ZKJ63^x#| zyQBk=`jZcM1CSY2YN@FO<`DArlMLomKp7FFnhyX55mX5SQ>AJZSP!fAfXydi_IF_f zNP=p4e?t_N_EUjvS%CS#eFtHGxz+;W$9&!8R}}9b@bP6AmWHKk>F%XlS(fewDM3QI zTO^k57DPlqx&)-lT^i{|LTLd7=}>fUzQ1!nxu4vB!JIjB&dfE}%;){8(UAbuC7FP> zYAvoJZ*grOMozj>b=a)o(TB#cI3##0`U8OMO(!1ijOV**Rmvxj!s17AE72>FglZWL zhy$RnB3@5qjPjYxMfM{R>3n~0dn8qC%oT+|F)}$8B)F+q|~03UwHyfom2 zBqWGm|J#8j_H3{+J;gR&#StyV5N(3|@1VSl=P&lvpJ}G2C#PZZ(4G{M)hC18|YH*iZg*l|R1r&m50)ZjdsPC?^WY0IA!$=$5~5_0CFtxai&lC%cfx zFl?`fE(uI6O*Wgn0z?O}mDR6@NaoXUy1i9{*g`aHZXye=N=E+E5GC-!U zYsk1v+V`t<=_22Sg2wr)KPDMhRn%gO)OOY2JGwmHH;aTy*E#G(KzLpeaw&JyKU8Hk zg*S7X*=urPQeEIz*jTy!Np87`ki0tr!D3M3ATa_DuxkSzd_;AeT)Q?&{55ucRTf;)%?#dZ`o`&_BNYv%poGEV3DXgT zWtE7{wap_gnUf%;=RmJ_r7fX5Sf@@Y~u67!GK=+aPj|wGWI-h=gkRXL)CI$74r?Wf7 zB#e~oxejeRDMKaDC1Ke+KaSn@zn>iatiA2r6MsB;SFo7qS@>=RIzlc!;%_w~avp zjR;a^rO8DMLKsatl3$D`z8Kdh&_K|SXYyBU-)-rt8sQ3;C{1s}gpL|=l?c#|VESPLUL9I3m^_rvG-v{|ajm!C%WgqVXF z?5CWp`ohWr?>Bx<28e13D**7tJKoOuJTm z@BUUF2)7|}@1h@BMaZL3_K&t=1z_08t>%fb zIEZ2_n*<8v3duDWg}``|NUhKBz#>JmcgHYNNrptn!bH&{k}Ibhr~A0@=^_l|i3e#q zmK4#2;&%y=Lq5Qr9q>fP7oiPL0(KqJ&mGEh8`tSLl?x>|r5=6UU~hdnhDxxErc`$- z2F*~VpsXS3*c9mtr5&Rwgt6@*;OA*MfAF`kS9mDqa5g^nbR@cUPEGzC5~>(`oSwei zIf6;w)HxPCQ_l>_P&rCT>Q0-(^k8pz8s>bGih~U)D7JGwPH;e^|!(A`8&id`*csl=7mRL$a*K})3q^eDYd&0zR)1qV@gjcDl>;B z6`H3pBC2%H%bHXfyaq+8vnW5GHO1m-jn*>1;P7o{{GZ^eHMf{1ey=Q`>7m$viCy0T~e zQZh=NgNaziGayW6_5IHnGI_dA2LdXvEl18D$e!PfQnn`L2VNmwN?8R=w6UR#?AFJ2 zBO{ds!+VI&VxksaE+v_wNo20x6PIJ1X)T`(qeb0+7Z;DWE*&JMZB1-X@e6sjb*X%S{wN?0Z6aM6Lc4T&?`3RirkkCtG|YMI&U-u{kPN$l~>QLe6toUX@8{ z=y+#219E@DT}tD;HSw_h2>RgJf&EztRmtJEcv~q|+h|54MZsn%Bl`0p7}CFmTiyvn z+Lg!nt9NoS&JfV?rEdXmca!4jLzpVS0FA6Ni%2cOT((jIDx}t*o06MDLV(9934HSCX^EpX{TdAHBocAff+ni(N4Ko zeX#f(r+K@`;q2{EOG*H*O6{`0YPzBe}dsb34ivAv7zlE>JJeL zqeq;>ViPz7C$*cwUxw!v8?Nx=F>bXfF?5{Vjk&+s!s>Xjg)UZbQ3<{y8F*Xj5!engl)lXjGs>)K zE%+#M!&a#!b{BI7MZ~p8dYB@D_Qe?80@xNJ-R!{EExl?F!5<0zX~0XL9YZ?hr1n~W z&%v|W{?UoEro}b~uBU+G(kU>n_3Qu!a<&wuV{fO9MNxM^l<*7Ct!gP;1cexgRcg3Q zzNoikgH?QnVdAgqBigR# zirhG=Na}@R+;Rhk>DWgxM@}hDhVQtM86)vr_*&JCIvzqIDGv7<@89C7h;bPhWLdaG zh<6zwEIIUFwJnsRL$>7qoV7D$}jvb`da{c5%X6ec+k;^{15)llZ!1sPajoz%naVSaDtumzk@U^N=%!0^% z{gw7$OX_RE-{mBRC<1r!9frY8P12YUc9w_odE_FTw6B=h?Q*Mr%hv_tSv)_TXS&p! zccl}Nf@2gEgZpvekBjqz;Ocv(ZvCCTzB{I?jH}hF)j$VF5+G%{x@5{wt={hz@FpXB zil@9;H;AJM&*#kYtZ3tZu6Ep2!hB_kK^h-zDIfn9R0NZWaXU z<35%oEOhE1LCb;V)B`QQuF{b_$+=B7DJ5N+AjKA(4V>IS>CX? z->At6*geVUt?tUO)UZgGX5puk8XxVA4WEp$79-k1k49V_ZR>f=8yi65vWjc3RR_Tz zf}5jli9!7VlG0i5#dX5aQ}Bh>1#cm?jPwNFgipa@&ptFUy+tYRBB)&U`>)}U6z(*G zq<1fz9zCBLN{bfJah$OF-uz`IUbQ9tr#lx*cJ*v>T+17>8uAua{{}77582(LKpxVH zahnsrDisCS7hJ0gm8ueP?7gn0-$6xg#4Y#9qOEFNP=UeR^>oonm6PEm=P`koOb+vp{yM zZ{&OWcHb%ZBoVf3(TvG4J*knq2D82kq8HF5iFd7|y>IQB|B|`=_ zeo=jRv5Awe&_nZeaP!}bcY8JmXep-IxcK|dD^K^161lUyp!OY!Pj^fzUoUR`#HWP+s78@Pv&nXQiHy;CN@!|v847_uLgf~! zy1KjfpE5ytkcm%!*B;Yc!l6-U7VRu%adCR_{z$fdjxs4$D+N0F7Iy#YZv*JEO*rl* z8mpsUV6b0sp~zYsiJ4$AX}{m|%sb@58IvOzC5CE#4kLm7BSA4E!8s!#Wh0?=BbtLFVcOkMb0gKGgW=FTVso;; zAN!Gms;1)V(a;n|?a^qfp@v{}+ZgqD`O&9^qZo9;XhO@V!(ehsoq8hnSSqDP8pl|& zxWUJ3jfcQF`uh)G^@2g*R*_oNul|^=X3q8Cf)1LAF#(8DaV^Q#+%DV8kEOd zT0}~Js?{5hx5tc^!Nxnw#=Ba^y9c#iq>T6Oj=z1T_0oU5k8+}HV!U5`VnBIf5PKZ$ zFflCf?$g8w%70?4PI;(hVtjC7VqwC+Y+~wi!Y4{QEN5bxW0GurVqST2!FaM8O2eK2 z6i7g_v!u9i0{YCR$o$mL~bqRCb! z4~+BH$_CeSrhX{*ZZ1q6?@pbFk9c=t3D}bCIw0ADN$4`8Eg;yTVo1YCoX57hKXdei z$3Ne-=uuuy-7if4z1KO-DHJI#+}(`)l9G98r5EZ4yos6qd4Sac+QEj+tRBZ?FeT9N`d>d??OzMU~@Je{~y-fEaKE6H{-f>H-Q~ zI`lotW>iWGxB%OC|f^=U-( zqx_J@!PB=XGa?eiM`6l8IOfHNIxwF8$Oi$}rE$hfpw1r^%eXhpL^a1LJx8@T%#Kq? zv8YPZT2HG3-${Mf{gE_5%Y~}T~5MvIH1+KjX-It%44zYGQ z^kfy&Akrj)D~8mEhQc`WI41LEI>orLi%%Hkz1-)eQbFto!|X7DXH`fqV`GY5efZ)m zC*G0+N|??X_$&Yj-!np}7%RL?{WNCe>}bHYXuvi(uSq<|C}{izXv_hN)wx>ml~^vE zAfxU;0?MJg>S-d<$el6}Nu=)lCeW-ZHtcN-*1;TydaSq*>%*s{ZJ* zh2jcU$8s#Ed3-=DpT!F1<=dpon3Zb%m9T)=>;i1F3{Y6>N?FIU25Q9uRgZPLoTHPJ zE0N0UY$8&=h$mshsXYIB=!x@36K?NRmjjU8o{4NdQ0`b2%4tl#7^h*4#6l4ns)Lms zOJi4JGI50ONaO%GC9esaCG6 ztYZFJCjVUnIbtKN*GCuuvANOfkQL(&kcjnq&fj$`$V$SV+0_EE5MUlO`J^Csadl|p z6==lrZJd?0DMq*0h=h0qtID83XO0tPK{FKh%yG$W;_b^{lSpO7Yeg87Wc#QOE1lRJVw_=>^=x0OKa3A2wwYb9zRdU~JwQ$vU?e`e0j~eT(es7q+E#hZ zx`?4;KJ&*k-%+i8I`5y;sVF%*I$g^ zSh==+wU_x>Oa!EX28@d#tx!~OPJsP}y1qGTleB1>n5&N} ztUMfbmR-lt!()jCr_g!Bf>PJ=eeSGATQhBd!|@`R)nxAJ)mLZ1Z3C{o^4K+|VkmC{ zaMyV`upGoIjdeSeEHeC&S7;^58fk34Vm-A@D7$j^d(C>^Tqxrkl5sO$VO{8&;IEE- z504X2_sQQ}kU6cjjOk3@p8e|J4)el}`?b>{{Rpr3{D6g}ulRx+3yw>$oqB~JqoXM_ zcdNR!zFNf?iZjayfR+#0sDRZT<18404_I~0sBfbn(!kE%IgyOH?nNZi3}C)-`!03^ zBQ3OJMG{N%W#ua6*@xhL;keDPA;Et-1Wru0&x=+XyzTGaVq-INAjXT+C0yFjTgKWmt0n!uK{QGCwH}q?4YfJ6!k!Drv)9RHO8-|Tr95i zCl05?2lbN6Ok>0hr+`is5KL)TrG2SbO z3wY}6QMusL)`c%@akKx7X269zdq;~WM{IUj7lMoY3CQ@bsd%rRtq@y_+7w4QMqwsn zGnXbEUp=z#-glO)*!w5A-YayH#qfR8vNmkV)hz^$ZWlF=_RP<}{DcaT3DAF)I3|%VIm>xN=uhx}}>WeiGxl^lfqS_^-x~iCpuX zm+O~x-*We!p@m}e8a#if`pgY^oHl5lsKS3$oI#gMtL}F=XI#DR7nw=7{KJ0!ll0YN z)FpO~f^=ANI7b1cQf;S}uXdmE#=mkP*|5IeUb9*Gt?-0m*}M1a!~M=07xxgu&*Xy| zdKPWsCtl>!MtjqZBaIO48F1~?%`9fh?+lQ5enl|e3hxVS~Eah61WL4Yw~%16C_-rm2(qP z8FY#aI-Y_CJ)@w+V&{mFc$^tOo!dQkwFh-|Z2hmFc1Nm4D_?zq?2N)O>iMtM)Mt z_yQ^S;)liXN?Z%h3nXql#&iS@TFWOxx}uNbE+9rn|q8u9vmLOAQwGFyWgO;LL=yQ06sX}DMh z2%r?hIT|9?0peyc7p4V}z4u@%`PDgcK3KZ2`rv=o zqrrT78gbwFQi{_DjQhOos(|eS`28wv4F7^G*@X^FI{>IJ8>GsZN#>d5B z%9n*=Z_;H-yUkE>-{4o$dZgsRx1uU#JmSC(kv{{&aaNnk%! zqqVOFgQP9)6XL}vwiseb=!&Iwy1G${yG<%87Z?8}DoJ`OQ-#fe$sJ`D%$$KtNwJ>| zX2}q5%3aC`AP%v~RHuLPAh_~<+0E1!t=xke5HECXdC zq0TV21gH&xZvqq<*2(z>d0?kXZ?^k74(c;FJIwWl2$sMa{=3r-e!kdV_3}5bqisf} z=6`~#>Z?7a3=3DYnEwf`B}uZbTHTr6TP!ZNS*)dL1|vk^`rkJ@h{Aj$4F}<2bL#px zb7kzJVbTOS`hE0&9I})(I|V+DN!Gf5G$!C>stA0Ij)nT>m&7wYIe5@bK~`_-$($!j zaM^5}lLhIm+}*(RhrZ)OWOmT4Au6kt88A%*$>wtgk3qPKFCMQZbAJNykL-#O*?ZU^ z*^QZp60ueoRW;pzf-B>TdvZ5{Vir6q$ubfA+H8a8L^v1*LvAhNvR#K1dYo*Qi;0&I zWkw!R_W78JVZ|nI%0lQBu~h1={>(#6i@nfUwDn!&iQem*pRh|T^? zznkQAyB_-sd{L&Bwx!M6c!PYFqz#%owTOGwb-j))aYYFix<8wg{;vHIY%0rYgl{ZM zZ=|eSv)R%C=FK>lo)Sj{0C(H*tsyK+0cjKQ0xJ~{lv%>9{zlMukD0GKmkOwF`uMsX zTM19YzC=DBTcpm!VGLnX@*vCM9Kz>J|Kj+D(p8<>gQ%slNYbjLvdDM+kitfwP8y{s z$mb7xpZxV<-Pm3G>CvC#KP^4*!|q>SMy}Q(9{e$FiN5C+5!>9RG=IBRtV=}_Vz54uiC48-!r-GtK)5+9X;GL;LjIYStd#^(}k-Sm~K8@b>K7*Bj7{hNh9X0uKk<*Ro>I0Nox8c!jIkWcuJ=y!-y z9(h;mVLcPtd~h=?GIZkyfgOy4tuqn~SB(q9e?NUU%Jx{!usQ2hSUwXjY)p$!Iil!t z6rfH1Suaae{JlUq&(M1;lP1?l13IjL#$Y0h{W{=PJC+IwOFWT8A&c|NQ7m%gQk3~4 zA?`j@BA;n{25CN!1{(q7o|gBmpm@03i!Y#fEM9cAu{{!b?}Wv(!L`nVZ@_$RECe-eWrrbakP zU`_&3nT#$2kA62rB$Dcuh|+kboC7>l@q(RNRKdeYGkH{k264yFMtxg$dD1&X8S8fe z+_|U%Vp)e2iWDCob4EBWteABNTsr{LZ_Xr~bGSLzY1e1sCa*2ryp$i;P}~+a<`=_- zPn66`CiIh~L2$rQq9}ZZQ!^fg10BDDd51mmIE3JlLAETXXKZcqIQcWkbQTcr4hGkE ze|uUJ%$=q%N>b+2->2}bNSrMS|8X!xr_8jq&Uz4l70C=gtLVx{<$nPhL3Ofat1Pqo#P7Bk7Tk=daOV)y6HrzdwA9LZh{?$c%hCL=f9sPAb>Q=Ddy7uRDsfid_79765gBvJN`6+jTP=8y?>R{ zUc5R8x3BapcX&4C`ihlc=%ew&xXKDDS7y_Mdou))LQlll!9r^MgJCXvG%A23o_8l< znBD?{(;fBwaANqk-1J!zlP!GN)a%-J>WqlborR6_U|6Pb49O#1N-lY9VkC}>PfPrT z7yx~sS&5WL@QUExYumwVuW+dSnj-BECv-9_g+lPC@+tjOXLV6;;FshYI#!7Fr~eGl z|E|7aI?Vt}Xn^d{CTlTJw0Os$XjgEY*wCg0hP~eux8IxPnUdV*o!p+2Oy`{5Zvg)B z1XK7U0O#i<6QwFEmmqD`agj=b)vr`#Y715x(?RN2>z>7tu~v9=6%+O`G(Gst**=-u zr)XH`0=~H!^h6mbqU>0rzeO~QXT>0OuVe@q!H>di5?s6E#l9)Y5HBPClsZ7#t0s*f zPr^Hxz{s|BuWwWc+0>tx(Z`X@*uVo=GJT#zn3GWBjQ9A^F;8p|XOvPtnZawx!J>-} zy0e}pj-;l|pc5J7FjV36oa7wV;kxeUVp8E&`odi>1N)p$$v3@AmQF%oMRIK$%0d4; ze~dL4#c>PIFNSkxJnU6!yuKf2!JD|a)hM~eCt$)N?-(ZQ0Fw_!fmx7Dqv(QB%tMO5 zB(nM|LVip1`u$@jda6(>8WIjTby;OhNvwZACl5yrJdVEKs&?!%$RvIy0q zT#VXGLBRK-Bqwx%E2&!(So}E%y%Yeo{-m@Of@4KVW;1r4YHg7do3O`LOR}Gx=UHPp z8LO{@H_yXTNRbJsiFxki!+L_r0x z$bk7n)&-Abu^;~~ck8P_y{ESVwzzV-iKYDE$JV&W>NSFAR z+Ua$rpUV^fA*#?h$^=SfZ^P$Gb?SvL&HQIK4R5(`6S!{yuiXeL9$vM?$o1@gZ`yr@ zx2!s)TA+#!b8(3&!e+qkV96pmGqvQ=e}RPUAGNZ5dBf-zBaRmo6V^jj!vTYd#w zxrW1j~@hbm#b$jnzcj6)ykv^J`-3Qp2;lHWXh1iWpp*n9Em1TOBIg=* zx#1|>QFev6L^|mzsA3h`yx>)Vb72u*4PUN%bJgp%n%b{UHA#!kAu|PS)gR>Z=mE}k zzvGE(hKl}enyc@GLb=+A?Aq58X^PSIhSd&%id3}yTzJ~#r&{(_HP2NGoUrBPJ`$)AevMtT zszTscj3ieS8+Hhn8iptPX^eAk8c%gvZS`vH;A(9beSWu%z;O8bpr^n{U;#17ex?$3 zWBAah4NklNdnnIb>(96jCRGZX*v`PZiEI0ze`dp91*T+ICQbyVO%1ak^j10UjlcP$ z1Bdb46RVQG#vEbM3mnD9*+box%IGy2i26xaB4tUC7by11CH5Zg#0Q6NJdo=5W!;ww z=gF^TQw@S^;d5X51lO4eN9mIr&!_A}U7m#!_DFL%XjTyG!^!UxQAAiQDi#d)vjC2$ zHu92g${$>*$3wXu>$(k;74=VA1^1mAM)ZZg2Vzdl;rPw!HU|Z28_&iZy#Ww!0Io8c zs`2EC1x?2S$76{)s_;B2^*pZeJn4!&IzKu7=lN^9;S?x*LJ~<)#`WH~dN)+)B6PJT zsd``a!zEJl!t}!xnAi5mY}8`xT1oY!0t-S*PHu%J%lJhS6M4MfaN4DK^jqkJT==yA z!|#6$VCb&_^0;%&xvP_3FP}7+>j(pIy`xWsv1q)XDB}a=#-_7`X0P3zuP8!q(fDCU zueJLbWANJr_&Sd0LV$D``1}Prq5vu94;^7!*yB_8DCZ;@W z#+x$&n$?4}TB>`RtyknE%b3Jj3_kwWkjPJn(u^egwJj>0ze$|SB%|gF?gY^?)iGWlG zHG-rUjKnT4a)k2ZCZNV}+6k=ZX(Ix{!XkPX)N4LeC!&&G=bkM9rVLhuD}zM*#m{Qd zF%n-<2EoFY%TVX^yvQcn7aDK!F(UM&fHDn>f#H$AS@r*t#2!EWe9_=0iR;g#r%p-K zKhptl7wG4>5krjdi5h`rUQ|M4d3!iS+XQ^s5ms{l_C6{qi>t++Ig=alp0WX)|a2ONm&y@`_C?YE5aS3dCPtK*{PAA+EO zTc=8*L<5xCXrqtf){s`SvVL7TZ7%Ly#h@#Scw9V+2L@4zUBDmlPNLw^rGv7#4&_ly zTOyPQz~+$LM(N7uuf!V@^;B^O(bHrWbIIZI;fZ+@bU{goR#GwyBn%A{(niu%iJR=0 z_4WB{KONF$?vH1RVOqc-<7$Rk4Sv}3^2h3uBDi5n zqIE6C+|d-pLoSwqrsKztEq_*pm6(wRowVYTTlLSCwE7OzTiA;>Wf8JNOQ6AM=Qb?} zgKufY&%LWD&u{jR)P&SOs@d+e{5s%=>r2`IB#bLX4{RiKp0~k^+n@VMg&>rjv#<4+ zgW!1mQe{AROPfwmyPnlGT>UE4tTlWY+w`KvYh0Q01F4T%$7S0HJ|N?XuvFZDliwe) z5@bE@pctK=lJt@v<+@ldq%|`BN6?$b9^iH2$E(2f^N<1mP&bh0#~U}bA;*Cr_-H%4 zFfi%y;7iygGrIKpK(?=58|bNb2ahB(6z+#CY{B1A`FJe~X%X&nxG*Z@pi zRWCxr`A-W$#l@jjX*^P=qVTiuUA<|PNG5OH{QSHwBnHLdj?9bh zoOoB8{}`My9%ISPS2%k0%6a^I$Qb8(08g2cU(6tCxb#f2E;Ukwo2+9sQi<_psgH750B&#(x0fAjwnY%CZtE z#a(q}QG|V4p=~t3zmlMpEc-pcV_a^=zL!5iL0CJA;OB3tU8L*soCU4CWHH(T)&D*S z6DVjL{_&T1+xLFkaD-S6P#|m^fCn@_y)gh?0h|#l$)Q62e=~~F+86zt!BM&qAj#XC zdH?>xh?h&rU0G|q*?=plj=q(VK4xgw?sK%!_fR+on!`AhFUIGSUMqn^RMn^6A#MaU zEHNRkzwmwHk8c2kqI?_s7~J+siUYx`EytFlA=VMjU4~4{MOsCG1Sn(Z#6gOuztN5> z9d;$IFSTAdDk9=ZSygkS&q@fAC{wK#Ix_9m(wX5T9U@r{8rj?i6~>)ej#_!bcEdR` z*-kodqpHH=N|7ZrKLJD8MkHM#44olx1^U0*HjZGu@sCT|9kZwb07O* z*-HWvfe_f{=kPmv*07Lf$EgTDuJufvLzayZ4;>oxDW z4lRMm<^Bq_Ar~=_Vd}Vq!(ckH+A}3TOW+ITQYRDr^UR|)R^rB%JA?WMyVtlTm2@+U z=uIIOpLqxUvc?c+v=;29_tL}A?z#>4l#MP5d|Lkq^nsnY5$kr%4M0sIl8&>~^+H&3 zVVLkIWcRjNm`?cieCLgodBUV*U)<>NhkKrTomf`irb)anGn<5&UP_oR#|l&(a)Z%_ zaj$`+yv96^P_wj}Ukv7&V((uc2@v3*l7Du`)M5`Pc|vXCHYajseT9)@AW2>XeVmzxt=dm!W#+qt8 zr|}~tn_Y`)D913B{B2dsl%&y2Z9kI{k;sUCtoz7@CIj&T8k~QzIPJ9PGc@Z>mCJu@ zIuHIFXLYCx@rb)C`G99#c2 z@`Z7aOpTdIEO=h7m6H1&cPPF);gWb7>}Jl zPS$UI&Z8gX;E~T6*dszkrF2$bV$qU`Q0wbq^i}6x$z~tp1>br*nD>bU4?FCZ&Y|MS zQ+PVR(SHtHOSrbCKrsiq3=`$7y;;!~ZkeNeufs`Yd{kZCuzFP6G$s2(O%FzCP=zM3 z{Mj@nwD$93t#1Ka>(Da>j|AJjpj|6st;Lg(hq)xQ2^#0dXwo;e+f)xU(&{x2vm$=; zG&8wV%0{-cEL(SfPvuFx;k{F#PZqD^h_l>}CgB~VC(r6hpGkVAVeqU|VPI>mZ!>G{ zgnr}e$_`})cpUFiZpH<1pFb+A6R$rq(ebX=6(<@ZBmNY_Jgv>m#H{H1xwXm4le!h{ zsivT6jQ-AC$l-I6m5u*!)=l_0+GAg8MFbphA!qWbp&!Y=pX{uEDVeMEPSD>4GJJMX z?{XCZV1JE#S&|REZ;Xnoh*dWAnonAS<->_RGol$UZS|N`kQ!FVm@M`!dM+n8RYOLs zp#K)3-ROtn4iBVA&S>SWDL;Cl-dMq3`>VM``)48{u|l84YwzINesqm^PjkXh!a@eq zm*;*stI+SIcw{nVY;*-{jGcz;^(G<7!Ygys?fnU|G931P-<*frY~xwKh@{BsqVl?L zMTHd>N@c6@p8OJz77inxHl@T`3BlfvL1h@g@Z>NA-DP=w>naX@p!c*-k;60!r(OW; z97M=(zefwNwX^C<9415;GFAl2D8E6{RZm+#Sy9eKG!sFD8*Yca?o*sqv&q@Or~-Zx zirgn9TL?bqfy%Iq*OUJHVkLBw@8pv}F$q??nkx_OJI&V{m-|v^I$fWy-f@|-6*xF~ zh`wVFfPBx|MkFmCS4?muhA96F(_kqKXfNGc+f7K--2D%SYT|F{WIE{@G`* z4)q5L;)zi*8%I+qeLnb;M2c390(pZoxxK8rdg9Q(s=QfP$yl)Mvei?oQ}CDGV;PQO zLnz9FY0ywvNH;`YiP5%@TUGtM-0qwCiVBA3JuulZMp$-FD+KH;o{;*v@++%j2Bpgw z)mVLQw)#_1&S&qSjIb9im-zxuGBON#KKTFX9E45nVt4SR>wkC0GasQNcR9)Z@bc=% zQ?Ub{O?f;v_7x`^vN!(|T$7vKY$teip-hzNQ9hNVq|xmI27w6;pNYu*MwKn1RK>3a zc()CAXv9tzgcUw3i59SmCjaDqV)uI4&Ao*K=BegMbe^U*31fUO;b2a!Fz8xR24ozq zqz+>(#$KLhavQ6pWbb(20A{iB(0&GRo&ifH@v38wQCcC`QeVo)=UXU~CMDnV+QkJd zl+@U&|46J4R}9rCZ`+6PBxN!gUtlb*Y5m0yjFF=I@U8{A70TN$Gc*P7`IZ1V?dCtSj zVT6;zfoHK(+L#BoTx&6)cEH3PZ<~bS(Mv|L9+fSa=s_QQV^5KC>zv3 z*}An}iL37hkSbfYJi>1LH2cin(0f#T>8x}1t!KdFkL$;QH{Dx|Ugh%F3aXDp<+AG> zR3zz&-cXggY_ziTeb*c_=sR~&=w^xFGAw?)7~QJIflEqxzE$vN7{=6MDbjV*-mL=+ z8jecUy`3d8S&XD17bTH+T(9?W>zyxrc#v1I{%T@4yn(!pKn0aMrr0}3?Z1K)LV^t5bJBn2 z!f)&PG5>@^*pwPDZ85CP{Td5Dae2J3s7Qe>jbIP`XaN{*fH!VB>BUc-uhNi@@(@gL zBVKA_1GyL2%Nzf7BmSRVyb>5ex&94o#y}kQ0SPI3LJdz0QZlIm=eV2MC*&iK}0pu_2ZEg5*Y zK4kAGuqxvUDr$lPlH0=*)hs928GhVE(3wI@8L5|yjimw z1wKrNJ{v4UICHi!LUxcUfT8(Amn4b-Jw`8u%h0sV4D$7>Fd&dAhUApcRuzv}Y!c^` zuql)f8$Ji5p~(0Q>Ey8pM129JC`!I_3VPO?uLc)2Gt^RKWRsaBM$PQ|&PGWhTzPCv zYxPV4zT6%}hUaGmLRb{Vwv4rGvBf^DLt`XF=X@!K^ciz_=_uA*R%#Ys5OfI6Eiy~S{UV(k zE+(#~#F3A0SXxX>0%Df4BU5TNfSl8vYw~_H;J2Y5kgz4q*`k1LQLtpadB!5e00${W za_DWrl{P6P(Li4S(K9stAPX)y5?kGn(lZj|{gF1#SJ1@p9}yXewIR*4fgI~LF0Ebf z(gY#X#2Pu9{Q6+I{!u{1bC^M;ylf@K3QsTIB$Ynjx|Q~%q+louavnol!&k zasDa#P1(^eq1eqA0)|=X>9<&Q0fgapejO!brSDnQZ7Bo&p$%Bda3x9hXSn`$ehphx zzMDM3w$LOrnCro;MML?vc+?{)#JL$C#5W~h<#)d9Ip}N5!mL~FfwkUNsE%i}GB9S~pAK6z$ zjlQ1C{UYUZlc<|Y8iKMZVFQQqodBU8wB~6IJ$s$>N{YdD_$%>?m{387X2ErGP8Gl< z>zw1gEw*Boy$pG|{Q4Qg!`vIkrPb`BD-RCdsVzknim!E>Q2cvR<0Y%>1#5@Dq=7%w z*dL%DNfGA)9V{VTIA{GQVLQIX+Q(u$Z%37e#KAkKciB?cYhev!p^xXK?JEa|qM_s^ zMuE0;pW%iYkyOAy`UOQ0*S?KhKgqgt{;MpVPCJ@77YBxCcJbAA-1~&EKs|~prx$_H zqW}Q7RUda#KR(dF=TOM31O(oE1~Rp;R|55^$X3JgxKxdr=7H`k*wW_|VJJ5%-JewvcdKeV)gYl>Me21Ti*{-11`$F4oNiJ|tP7^~Ji1LA zfCVFA${XoYB) z_@mT3h^2+Xb3>}r*kNeyFw7=8;h2a_a$T}O+8SWA`7Ytu9@Vpf@CRRD#Au<8c0Lna z*hW-2TvFcscRMm6mzr+?TBAqRj1+t7A*L*BH24E+qJ!B|*n7i|b(G(DPmi}EhWDLr zkXoV-Au<|boO8G&xq#*mb|r>0i@WWWJezB%E)o{`FNHzAy7O?@BUw(kkWBh#`re%u zDww!!lDLC}`xzQ%3`qN&^rz3$c$1(<(%IUz(E2)$gfibv7;SHR$E0UNQDOiK^MHix zMyUUUAWUO`#hNt5%-wI18Gc5v0jx`#AQ*r;6)4eSK)Y-cYZ?lXvH=5f;*A~u$3$&oOrO0Yn2&XWyo!FvvRIhywYU<2X!oY3Nj(jH{Ws*ZSwbuzN>LNqTk zCQtL8$!tAd(v-R8wP>FJ`Ey%*iH{^cf?~cxo=l8ZIX$!mg4t9RJp#E6OQ)$|ObbV_zHiD{hI! zmI>8CNR28r0mG4bhP<#S5Zq}O{XNj^vMcKPyQ2HgQgA`OG>SBo9PKF-$XHOlBuCy< zK;m*6&uL_Bih^+bqFGqW9}a@`?ol=0L=P6%o)s!eGbz0;APecCpbm9p7IBU@0~4d2 z#xXQJa@h1tz;mINHKEvaa@XjB@MzJ-!rsPL```zeLF$fNXu@kI`$3Ws6!@c2-t{t4 zsS51#3M$sY68lXw)ui%-AbF?5E6|W1(92nNN9m}HvS~$@F*{5#zoQ0`m&8llR(I;c znEKHh2xN4%w`MT zeii&)$;ZpjWsm9mdFx@y2-5-(dH^*k-d2F@biaPDF_y;=yl#Yn+k%lTinIsig2?$Cn^uS>4eSY!ezL zc@6wg6CHTlp54C-4htPb8R}2J&1kRvkY2c?PmS5iq1>s5#bk=PeH_t8$`L+_8acby zWZd0d5!3p1`YBt)ew6{QK=AiS$~TB0I=ie7wj%03Xbf(xN0AP>}zrrL$Y4k!JDeb&{2Th5U%5 zG^YanF;^tR?Oufn$WejhT9io3AC&gE#B+pQ4M(|SI(%0~1BGA9>5R>DNh6)5MMuKk z57z1d``HG;61K<3@gG(lF4Sz%yu3IAhcszk8~E~1!)9e$W+xd~#If?y{q|sD8tH-N z>UYwlp)?cS5qrN8-QVN%!WeNS29@#1xd1n`J{VjRMqJt|;t{E=tzd#H3x6*;!#x|? zI$H#v1(OWGrfUnS#z-Mz%OQ@6^WNjAyr$m%ew!yjy;=#au2dlW%S2pmKZ`stU($XY z!37}c*o@BRt0)5se;1iA#mXIY*(lF$FR(M61k*DKkx?|+K>Th)306o2oV|2Z)ABC?ei!V0%Dr?^7m=QOu=|vMFFI{6Teh143dOF9V`Fcrx8zv1iraGe zPjWr}HyLAMBibMU^8Pn%g6n&2amK`grFkSW-e^u6{VViuUOBK|)NU=3+{Js-g@y_A z(Ux+*Y|grp0$^8$!kicpP}(?G4w=JfBm#0lhFqlzW$mBuJ_@dnucWCIYD1&66fBC245lvI*ilNy z_A<5|#{8y5?bK)3|F7UGohss~L*}&66nU}mWVG=4aglAYZ zGHGJ%`=eT_eBv%zPa4! zbhSQCidm@L$==*X{JB%4cLvSwb?EvZi6!uu9c~oEDac*lqH`&`{27O1c~qiahFn+r z>>s>;1(dPtA4<1s|3e(|B&Wr1Ahro2t}j*Kgc~l>nGNDTkQxU0K$&dSf)2Lhvi!Di z$R4s$XNcF&La37Ca>Ky3-LX$dB8N4Z#Q|%3iO38w0N&#!%9=UzFcA?;Ti#|JErT4B zhnhupyr4GmZA&zIeuywMQYx-C)T0+-hvulX6Mgd3(^6$M%S{eE$}=^ZtW^lPhaOu; zL4!;jEuSYlmAJJ|I+e{$FEp2~SAqc-u0 zg;KZK3}f?P_iVyMGkOWo7b2RE?Aal@$ZVZG2UO7ghHe{#~Z z=lFT5SMO$lQfqHA64$%`W=`Gv-H%V%S2KRoyz@?eGY(1(v=|qs z8Vle2JMM4x_^EDJ+8IAIZatZ01BC2VDZa3FYh5VS*|G}$kKlUIcMH(Bo?V=_iY5qJ zx68DoSu?Cbic8+R4kbSo?pC$;|jbShN{@FJ-J!C)S z>0HQEtSmhAFh@Hhz?@jWRdmeuhiBnlUNrpILA?H_kh8jqjEAuEhWNR#i`EYrygMN@ zBH{DJUkSR#yhGvPU*88y{W@$S)P59PQ~!qFOg)|N?SYt7_*^us^nbeU6Ic<^U8 z2Fp)BKR~z;=C`?J|L7kD*C_A*CAjvGp?H;^I$gYY4jd00M5MI&ImlJ6usjN`O+LQN zkAkapcM-mkYb@JE<&sP{KjryV^q~JP?*9m`5?=pHaHTRKr=C+vW_*nt^XcwmRwD|R zPAfyaN*d)!@lLV0tj2RxVP%V&Nro<$n`xYm3O#^YQ?iz-X+C3*uQogiu9pmyT|%gH z>BTfxIeWSX6Cn{9-i$b&8YD2DjaZ|aq;ws?$bd8Hwxg?NcS}hnIJOSYxS@XU}^DacOL zd}o%G2N~z|EU=lvplPB=Z6M%BcC$zPw83o9O7~P?s-9l9S8wl1ON?Q&=a-jslN(d% zBKei{-(T8}-x#&d2DYbl&E~0$mIK>vjU%L+9mk!G#%GpogO7vHWmLf70S= zJY4Io7eMkEzs3EaaAVBljcs}0xwG}f=Hm0K&i*f+E+1>EBj6-&M{1dDt~pFHs$X~5 zhdTMnHElKB2lXzKk(S^JZJ)RqhqgZ$QkxYv8fkj{>{zTd3!IA0(46+SO!2*GlX6}MtSoywt3(n>GKz8 zoZ!ztd%555b*&(xP@i!X1c#OF2MH4pc6F*DqlRSdsr4bY__-ltLapuT-f0K47a`+P zZ}<~U7Y-OduZ=v7Y9z`?J7nP&pJe<;n_A)Vkx4x?k>6@Jvp((UP%d;D|8Ztg!Nd`2 zbwBL@rz@PtpBH#poH)+9U$lnrtWzC2*PHgbe464I^8S78C}&u*G0jW?}lTz@YyFF_LOAY@Ie#?&-)P?0qYWsKI8GdISVYcmX1-!(O$J-z5kz03A@z z^RjOB54&iG9~yMLnMB@s_j*Y3QfYyW--Xe~{MJ8SAA8%Pwm{$u4qb%}{+x1_xwOh% z-+o&ut`&5ZTK(`xgJ+;;ZtubK+bbSAp10)VOd(d^8V^`@Z;!Eis@{8&`V3JAX5FU` z-z2&(usrz{q_RS>_q_oee^LE6X#T?|1aaFCZEDC*IXxXLBYZM;>WP7l(w!^;7dwI$ z=->#u6`sQjM+hx?Opt33=nZ)Rk75|0_1Q~Ln`UYTH$;deyo7mA#28XqN1jy?{aTMz zAfrn%Q3yjPuL~*==e(k!P|~{DH9tNa8LzOo`p>9j-UQF;OOv89`g^13`hO0<3|ud1 zujdtX_omL%ZxY|rzId8;x_qJ++4i)F_H*fP>y6OcBYM)(fbye#SXhGUN0QflwSQ=- zfb2GL^{MT4}Lpuy-xu6)g3WMF*+_C!?DO2Ez)zV*+@F1E-+wg9SU0o%`_peC%w zclf@_HV!J$L9r1QCeh}>XoHX^+=X zI%xPPd3uMRL_*r@AKr9K$nFIXu7!Y)S&=_SaiH0@_50+!S1=M^_|lcngi8Ez0|8!k z@QW+@10RCTB%*hfwDlJ@D_2(zR0%asTLFr%A=&p$-A5gX`!S)z`Qxo^HD}t9O8!6@>sYO^ub^OooKsB69 z&KQvsG_l7piKsvx?lnFgAnT#PPmH`AcP|^_l<=E8%Huic&Gh zbc&n>LvWalzj2K(l0~$Bl>z1_h+RV%Z6HuM#DkSUi3E{NU+XX!@op6mYdl!IG8j4t z`hr7zkzgO1<*zcCt&UTU8kl{K|grRwwysnBteS8J5cJMR+o*Dyct_*_f zhWOowRPU-}{0zxf=Hmm@k{IKX^9dEKhcfSibvCiduaX90IP-{OKMmj~88hT3hrocv zuqq&uFLnYMlM(8@&yVvdi-5A5FB=`RfWS`%)GrLgR*e_KfDIf)1bI1OBBywr;(%;4 zypke(J_|d;#O7q#_QP4Dx3AL}M;UQvbcl1A6=lGbvi;17VeA6dxa)&=Q%RG^kN?Xt z)-7T>JwcT4}5~y%XcXi17THbn-yF(%}eO!sb2&$W=#U)IA;sE zB0eB99lZQD|AF>I22RF(9S8|Off*wK4MyK} zM9Lc{3KbwmubOlRa34EyQ|(%kiV%Z3jH)J z4or%U?{_2^{{+SZfHQ6hC%X?>&g8bS*YCO8oS zM;6aql}i8`I@;Vbr&4)zdivOkN{t!)ckvSR!bHWG{Ih&>cFEAV1n(=c*mZi6r%UBH ztSi*|68W3nmP)9al)XNWoNI~{6an%6^dlnUvBpjk+~^Y)0WILdnLl!X4#@8(IoBJ@ zJ@%fmUq!zv<`mvdoCvj64Q}(LR-~^_F;xKmBJ{|G`2( z5d6*q`R@B>*5BlJ$CdA>2j0nrKXjP<#NI?9X?Dp3LJ^9;+fR1!gs<=(5mW9qJkl*Z z_Fr5$a(FrW?dyp^loL3JFXx|75<_WpS3YY?U12{Z9(j`RfO(5oh!T;((y6SdAeu&FyT+Rshqc(S-9y~_^@V1}^ zzQ>VvnpCr2n==HWFe$`eLOA}3OQ66O&*J2$^w6;ZhxRds|1NrZN8(j7-YixhRu(Ff z1dpiX_gkdRW-Jk{?m0y@fNj7WDE#za$!;ka%0dDf>Z0^Q*6KYmUgiSLsJ~s6uW?~2gMc>B6%tv zGk-pyH!iVmQx738P55$Li#dt0+F%4Z7r}WcZ3Mo{xlO*>>p&5m@aCn`R{S+lT`Ad31GQ8}TcnnYl`V@qTmG|}cDj3;ZRy#O!I_-R zpbZNWP~isG7ZNLAi^y;6N3R`gfApR5lGxx__^eOBACj-q0AJ3+ce_|^G~~tu^{Byd z!o9cAmk(k2rVNc9LsX!K4b)13TdWLaeRRa+_97_Orf~xW?V`Zh9Z2Ls)mzSDQ=edb zzpeUe?u*H-vCD{DNo9?3XSs943#@4_oc4usWL+2A`dkr+q|*vkoHc5uRe34Q zBKCxXgY638Rabb}ut*4bTgR@ih!Y7`q_rSkfWo$ougnQ2@kW#uo@e>YgvOE4bFhik z!>D600&D^4y~3wKS5Vm!Jf3FZu_rffzwz!{BTvGWw_NhN2o|*oNk?&IL0h?r9tROm z7SQmVwsG_{kp)3)#mr=y>X*>oaScnxT)v4Te6kp#dj5&!jN3RXOn4$jYvCIpplXu{UTOGZ8`cv9R4*CH#doSTx9wg3 za((i|?B9F--d4%uE5y@l()l+D>9Yr@Ant0fpU|5n#+%$v?gy$w#)n%Wf%ZV& z#Wy?W-Cq)a_hWPUb+K-3eH(u_Rz}?kepGQGE=g6b1@F#vn;#}j)+x&cegZ;7c z`mJ66&R+uTao|(A0hZOppU&TjGQTqcf7nIC9SFM`WI$pSH<-_<(OK{|#Cy-yLc_FP z+G`;G8V)%l?`=8LQ~{1G<0#?vClN+4K_Qj|Bi9Gb_4bbXru!c?E-C7s#ZDHXO{TpI z|Lz~21i}V^Gi}(C(g4G(@C_e?Uu9h+It$P`9=*LX{sFr?3S4m+CP4W`+y@+-<$IRC zI=3Tn*ZP(9)7Oj70_Bzmqm64WMKo4{IB7y#G88jntD8@C=|yo7V62CAD&vLSZgY@& zfMgOuRSFS{NxEe4RRQj!;OfMKY++Ke`pnzJv3F@R=m&x|G%Q|Jc1v*ST~hySagr;d z3G7&C^mo)I{_2i>mX9k_Ad(hJmfsUJ6_ zT2fgA9#2U_ccSAJLUb3ruJIeUOsADm^uDbGW5YjcQihC6ZF^rt;7y(r;a~dQ*AL0i*nE) zC5f}Tv=P!Pv=k%axcAb#PFDe(Zqs!}<3&A*VP8>EcnR;CaCAre^mra(VXU~ZpMu+6 z5;{>|{=8U7G_e8V=vPW>#8U)_H|vegn2unjVM%u}&V)hT&=5Om=Mr%f&idHpXSrQZ zJ>AcLY^9~1|G-MyKEmZRv!^>LG52ptCHu@}=nAP{?-7wA*JHF7*X5%GV*OY5no)tY zNGDDlPXbWVrT9y9znd~CUkia=1uHN zh4s7P_2;rp&rSzoWncsRQi{IIGFq4-Wq5V3aaeBfkI>IMe-9=_--PaLVVPE*wXdl# z5=v1r{=GrsMmvAg{;FZXo7T2#&Xcoooxsk1{2ih!v$*CJC0buWIgiDtF9(xKYQGTY zV`fH~7|pSjY;v^eVUcFuhk)oSYS3i+DvIE1XV^r<*J$cWvxk0BX~y%^(D@$VgI^u2 zh!NzQByx)SRtIA_#)(TD2(4Co|03t)3W5H0^PKD~agaQR-H(UI`o8Ey_K&Y`l-O@u zGAPr)%IKnE$%O@-biIQ3|0%foNp&;-Z^6~#Fq5}PN+3riI@^GVm6KEDQE*kpjyTNW zZIs!;X_T$p)*Z7MV*dM>z0wWQ;PXh5O{PpkOM>u|-8i2~S@9NfY_e_z+)g&Rc4P(| zTJU==tK0rB!PQBy{C2{v! z9*7-f{~?~s9hg=*V#?9;@o%x%p)YRN*S z-me6>k)88H!%armjM`;}-0kUpn@ku5wCC1(I6jeN8Hl;|`@ZktEdASbAz}4(oaIZn z7mL}P9smgI_HZx80j!T1y?I^h>FH^{^#GSPr4 zT+!3N{I|uaUqNTQv}b^zJaCoCxUab1Gx*(a%N;L@++kMl(An@$Pm+z_T{wQ#%HMj= zV)|HuS^L$w-hJWx*&1+zY#wOz+xh{EasW*3gTaZg0kcyM;u-nGQvI=kDN_!S6!^q* zM%dyxQx4Ot`Xq`+>;faYhu$io!tax;Nb5~T2Zeo8E&uF0zJIHA-Qu0@8DUShy;gJ| z$Q$G=2>|h+fC_AW+367uEbOL}>P~*S<$oMFluf7f>-_RtA{=>~O{dK>Zb0~Gz^24N z1t0xR%4~#_kZk^pyOV#ZA-lca%>(JUf1O~!W5AnC zjg|yk#$d+P*H{Cfu)b5?3hFm-9pPNAzwS0L$>4YJa{P>AEHS+xj`L;^lHUa$ zzZ?`4i1qAc3s*b2pSwto%84+@`3UWYIL|1_19g)YJ)B=tY|1wUjXrsv?Y@>YzFE-H z^Df-p6rCLrH_g86r)yj3)`^76JvMEInOg6-5aWE1a?0BLk7Q4deu(kn~o<=V>3 z;@&Ag35n&*t4gy=LP~M$D!May?I&x0-w&@38vDwz={YQ+tX9;663`7{Tj`%{WRB^h zdk6`3W;)_=?rFgsU{5&HU*o<*6Au8eICpnJ(t7?x2$xNZ5rXgLf7C1kDT@ zWJ(y9A;Gh)s0GuC?Wn?F?Z8q{l3K~{!A0hvC!`ACxm-vGox^L?&$zB1KaCVXVO~ z){AU?O4Q?m152Sm_=L0*QWM`~^L50he)AU60A}n_<6Hee6pCOQCGOT2YJ-Ygh?l06 zrUMQzOTM#Q>It@gx8^QKp(t1-N!v>alD)$6xym9D2U=h!NURfm(ofz!puv%Q(L@Dr zCSg9L$*z!tYP$ddDYOLW_g^PuW{RJ`o`xI(a!5EJ+KAW>zLL5=)xgSFZ|sB{!4IqQ zvIb_dA~mmn#Ac@-@EC6qu@=E1lj5VXVZ@}Fcni?TQ!H8pHYW`siH5*Uh(NT8qLPK; zGmjBPsrai07b(27{>jt<-_ilxGDUnTsPd(vas+IJAE@k;s2b5P$r3}%qsXKn2M7^b zF&{*Q$(fdoeoK*#)KBIsdMAuXdOJw%bPC4Ge)or>YDTMmN_^zP2&*2xkS z%8tb=F+qTODaH1aWCG;G&Q76R2*y2B{4>gu<3^wdemnz*Bnkic{se?eXPkK8nKB|~ zf)nWF02LJjGIh!*UBLqtf%GUbBNX`4P&Tekf=wHM=@w1B0Cm>^3mH5W{!=T`JV6t# zur&1s)zf2kkS*~C7Q8-ubvi87DJusNz1A6JmQ-Z_rdVj9r~=7=@+iSbv9UWxwmPKp zA0`y>w)?R{5(^_HgLTkLgBX*AM7_=d6F!WA!Dy)@+9lxSN~)4sv)aqJ=5_mo85>dy z0IUXu84@28ro>=nOB0G`g@j}R2eYvU2XD^MU#}SL@3UXOc*eDk_ThndfYZo!$Bt~E zC3?v;Swnue>IM^WPzlE25je)ABr9qfrv&-MOO@X9Rl&s zf;Od2d^_mW>rh!~ewvo1fEolCNKSJ8o`_xtvs@@dV#9JFU}egYJcCIl`$;yusX{3z zbLph&OdK*CRhBn!wX2G?t+;x^hKAZ%*_<{$ij5!o#bVjZMveSIS2Zy92@`4a^=-?y zeglnso*F;G76|;84wP^Kjekuq4Jg(9DEAoOASjsz&^@yk2kBc9BbnYi#L9E#y}tpL zXi-wrQO~p}z^_i#_1nhA9EQk?-V^b?u|k2Lq*Ma|)cRsHk*1+EX#-#1WA3S*@zBF?mt#MvRG4-MG#4Pw% zGz9`-@pNd>bueFuz_m}@rHAQb>tRZliT21klY$oBwh8L{`X=?V9?x>FQqO^hRjFP&wniyr>2O`fG#0e_>)RNpdkjeLXS_#xIlC3 zGffm?X2>ziTxEE3W!O56-@LQJzx0Wd7Tx=B2shS|yxy&%U;OS;iz#)n|N%Qs%O$o}wTcL8@hYy-Wnx1=OFHU3U^TsU5XaTK_a zXr*GYYKViwVG?YfpmAq|fZGz$+Y_dx3z99m@bwU{_2;qSZ)beYT^^- zYFa8;?BLTA^A#xu`#@N;&?-D}J{(GaQ#a)M#rY+9K1uWMrrU8oFTd@d!Lm)D70YsJ zmVOT`o#>Iq$02OAPbjq=t0TiE?D)j23TG3t##HLy8R9hmjnkzj6vHx#5{jn@VG`vc zIXGP(rC354s*^52pJudoFP-#Mu7AX@(}B{(g_!95yW51IATu z06uZQ7bXJp9?i+`rpGvzt{~)$z!!4y9%RrQX>p65BawK}=~AcC(R59!C?MD>RzLHR;@JQAcL0nTK)qw6V~ z@5A<`-JECUF8PuNA=%KY1wi9V!bp06cmp9}=-3=NW2b>OR|F(Me2chvY`@_ddD4v6 zpE2Mmn)FKDJ3x0>G2UwZu+uW*PZ#HJCFtfGAfecQz7F>PalAix4nIK{pXrE^;9yKn zWxlXU?z$u=8XVLnsAdO$P?LvDW8YDBgxpE34XQDaC$wjN(7 zic~=K;g~!cbb|eDpD%vqvY6F@x*kJ)R#akzyKwmr;yB^&=n_Y3`EdfzfaB_k+gnkxA=UPa^ke?mMOv+@fw#}cNT=+0spax3u5a01HUpz@{qa(m<=w8ysbf~>2ZlE&0_$vfA++?t zD>7B6XGoCCT7rWQlzk!Fzy(W=GSh4z!GnTOP$j`7^M`FikaK2`hf0DTUkroXwUnK2 zaC9(Kx+%(E=NhMi#D+c^^i`LR(AhGZJSj&1o?tGG7UKCr#143TP{BgYolqYvJ_cyA zr9U~9xUR(Ok9dI=B&S&q>ATMW4Q9&z7eZK>6)(#)V8g`jXU|prlcqstV(*aj3$%#Q zPwrujTmIE^1<`<8td!Ey0Uk>MIF<>^Fpxj8-?3Z2`tsxNf*59aqP)xF@sIn1R$xBQ z73&tNS#-eYr+$X#v0wO{3sy!mLwGOTgPijR7HLxZKiGeynW7VcZ7dp}&6XO>_-wpl>y>6B`&h-hTCFj&%ps|HEZC=Fq?Diwb;I(E@v5 zFpbjOrkV(VQa%nuM1NyIKR!*qJ3De55J@dNF&$s|44`&*ZT{v0Hdma!8rY$A7=0KA zW3UM6A(cLW;RHB?ghs9B$6=n~5}cTZYg?`~YIoad>_v?ZTP+cImP-3$25HmnFN*W^ z-iK&GZ-E-Yd8-$!V$s$8$N-MT>SviunoR+mOLbZm^66ZGTq{jRuk2=<0=d^(Eio|! z+(A4W9ZsVul!*k!8AQ&XOX4wZygR+^ac$_A#$S_VPhwoxxkLE&h7t&wwLFYQO~z1$ zs0^M^fupH{r}lHrp@JuK&-o=6uN8#O7VFe=kB98OVd4=)Tsi{U6*(FYy_OFg4Hwp8 zOp2ryCgkcVFYv%IYky97bNhh5>^K1jS{1FLSi(bdt&zV6(zkI0@)mT4P&c62;j!$9 zzrQqaX?b-xqGkU6`f>I&>W`xUI_%+8VMJqkxpN#4eq~HT zX-80GD~HX|i80}lgV>qSCEp@cSS1v5R5_B@vy^5}ZH+X29!nf$f9EYF5+#MMyvURV zQPpHA5S!LyD-$;s<){l#tzv77sIFuCtr$A;7=%zd+C@s|#uiw|P}LRLvmKk5IPKpS zm$-Lq)RlVck#D;CR|l22l};wo$%oIph(m?P*&R+HC7XavMO9Dt|J zg^Y~*PldI-Q#X|$zFLz*VDr`}ee(KSigp5We%;&L2T-WcsRN zx$pQFeoG!P#_5ImiSs2+%oE9r%Z9g11dK#BDnP7dJ!R=YH2%XA6dGve|E_DzGWKuR zy4m%}i2G)dgUF5keX%kKh49|6Rb2nH@EFyZJjyAH|J5*wbwo*eq(;ZhwBSSCWPp4{$y9OsAL|Ch4?hg=uQ)JA zVEffEqXIwP?U=^`r%sX#c*Z`UF*de0U`un@dST4>Vv2hSRXkL|3s$LQ!wgSG{ku*8 z-e$_qx*GlM&=&*HdMR!eF+%(D@dWweh#F`>3XsJ#i$4zoO!?mi0Eb!lnW#fWYNRTZ zyE`X1@G6#^W;*S%HZu$#N%;C+S?0NJ(GHM5NuHL8DD{-=0Lh=MX2C>KdaAe|c*(A- zsQRtRWt7|MIFv(jqul72`U2Awy?vmG+#IB#t??!d?_Th2et{Of(_oCNCawJwAe<<~ z7xndEj{aN7csR=MAA61#k2w7qGNKeil zED;SM%A!Jdl^|hqHq2!7Ni#h<%UL9b2`sY>&?oMuc(ToGWZj^!&J;U<_u z)&MS6dn?gvK__5w-&0Q%rIhS{`9t3CMxB; zlHr{eLzn(K7TaRBcx3HNP2p)!3NvN~Nu=C%8nEj@K(4hGyxi{UAM9$*BPs2V+1 z93=8i_ya}f7F~Xj@Hm5~J`cn!Mjh^uVW`}8fuFsrQl(2Yuq9>7(3#S5{>xH~({F*4 zInvn*lTilOr?FbaID$MWeu*59K7%dbm>^-kR^?zTs?bn_9Sl-GZE$b!?WvfI``E3QBvL-819 z22T7y3Xioqd|Jr?{vmA;`g5)0tpZIK+arSgQhpy~K+euAxiMw+M!)Iu(pf=r^JA1s z0aEV^uYKRNHLrV7ed20BL9t%Aj=b2dZA!ODT+74lmTXLdEzPLB&a_KK%t{kLQIYBM zuSeSG_m{8HV5waYgV-RR*TYpTv(z50wb(FK6jmao-V4&Bc>wE%?XWAAW`1ZPZd6up zg`W?g|8(R{o9;PLNE=n@#r8{NA)fhaHR-b~))`kEJn;q;Q-1^N(>A$H9)oaZ`6qa~ z!gk9XZFb!^E^+OnLzndm(&rk_MOI#VeShgJc)I@A?M)x=s%NnAOg>Uj>%5UxScp2Fi=uNXy8tS>+^3f13G}rRSbjF9-jBzFtf~cinY`M&DXne z1(};1=RYoh&p(kYgV;rD5iInr$0Y#@F4J7<(PX=4^Swm^Pg2roONfXcJN*53sGqS1 zEFh%2H_fYD?jeTia=8y}K3zLG?TTDQJzA8uV|G*$rb!YGFO~-BgwK$sHC}%&>>r9v zKFj><`}#NC^&N8Uhs6CT&X10iash`5Rq5-JGM{EkagPz7*|2uPQqR1KcArGv!#@jh zpUhdr23{g;fYiG{CL0jfE=a%zEU^oguZ*CSJ0U=mDjI023_4Uz{qbE_4qbKje0FY| z@T?n}q^s*tlZ<0lip$IJim3e6j-t?r!a~V z*_rTtHX+^7xP$0veirJKo7hu?+u58a+3lxG7EogX)$yfO>l9dd_9~x7hgSQ5isCxJKnd}9)4g{DEAgl6z zHhT)|dtoXC3hU1*u~q7+;CQ^%j-=JdC=#&*W~S;-qIFD~-8SE#8{Z~J5CBZubrzS< ziiU@s^yY!InbHvBAghf$?IC*PbdwYJ5Jk*#RkMHBWhb99!|j(%l0iipGdjbPD5K*b z>p1jOjrpO3KaP@XLSWh0l#*F6Lssa0m&r0$3yVa;Q zy%b|^B0X1_7;Ek}4S^RVX0wOUyEZ(pcer6`EIA+*=hQ(pKC_T}Y$&AFVIkC1*31Kw z0R|b{4gh%r1vhT5yj*cin4%v=UG*F8+*AYXMU$8)+C#5e>f+I#2rWmVp}c5bS6Znjy7 zYaqoL63K2*3SR?FT>%z8yB4u`9ssCyS?Vevst4-CyV2{ zlg%)!t=2E511$;@Hkwyp4x7j2Iry$k>oXG&AHuu)47KMLx1ZyE|KHr83jkNqkw$Sw z#tcNN(RwuX^^XzN@f>-VE%%98!%0rg{1D;J%7|1^49H=RPtW0LQ49?Zq#M^wdU1{B zGU0Nwb!CX-tJxKl;lN3+^u9l=DI1^o;uDHO*^&+7InCZ+#V( zeQB54X+K}nZne|@_N52=F~9`q@%)e^H^^`NOkc0*3zcZLUaoO1#JgnH%_(608_|$Q z*cQ2wD7{i(k<)SGy14s)0GdE$zl0Om@b?NU52JD_7fHgf01^}YpVvL#<~z;0hBH^dMGr9Di-Bp@g{pL0<10|zC5mXh7&O@@>qK!?R6M?y-1 z9!4_6j{<4mfCVN;(AA0a0HDG??5%OJBRTH_OY_4H1a1ZhLpua+_{zjR^K?&Zg+>E) zPz$6$Lnc8NG;Q`W=%U_0;Q&DOPcIa+xS5?^5ybvMNH|ErGK7NyqcJrL^-XZ}B!B@) zUs{e<2zY|U%XBKnVVyWy45jE!O z@=+&bQYZ9BW#K*)f-##yq38ot>jp&*aHwSTU~dFRd)`Cz>#PLnPw!#w1JDev@O^LB3^h5u#)cW^sfVO!f_BQ`54b`%4k zACcQKwBH`E6hVs7x#oY9X2)8wAYeX67gHg_74Y*D@ zRKXC?b^tIyIJkpu2Ze9rw{LIve)G3;5jXyB?r|$*awG48`4JHa?bAB&q-4ScM7DCc z5nX0N1At0q^LKY+s#&u~VTSj5jJF4}^=Sje5a8`UltU6cUlPCpgH(f0d~a>nci{4M ze$#kQ_xFwCc-Ad%Q5&~_mmh(T;Brq=Exv&R(^W5=*)YEAKr}UlSGaax_%%}?L}Y4( z^a)r5Zvc~a1DUqfrSt$??2SA_<}t(hyib`K+UIo!k1Y56_*8Uyti~ z*YUYG3i&`u!Ek`jFvbGS^a2hpc1Td(Zp)m;k&g3jDy6U%{X7 z!AFN(nPsv^R5#RyjV!~%V>FaEx|DbJM(`=Bp!LOvvYT=H;Bb7Cm;uO7g1DRgBya)7 zq;#<2e6|RguEzHbU$3n1eBB%C&*OdGFGILm)pj76kYJM7RqI2o^MW5Me_VoD^Xi%X;i54|_6lqeWOPMxx z`V?wZsZ*&^Re2R_R;^n{o&a==*@+HZ$(A*H7HwL!YuUDS`xb6oxpGxxtxHlxUcGzy z_VxQ0aA3iM2^Thec(4;4KmQgtX8hQ3V=gQRLri!XbLPun+;vl;z|lN?nFtor7fy); z9GVd#isWE!Y}vEXGPHdgcW&LgdH3dRB+{9b7j&I8e$v##SjU+gk9BbQ$!-H#XI|Kl zc0?x{KX&)XaY%NNC*g)KF%x}>@FlCZcmE!KeEIX~*SCM4zIgpxzp5HxafM@!L52?v zAWDH00go{z2Nw2w5W)y0oRGo_Erjr{t1=V`u?{`_5X2Bg{7W&&OpFY&$truOx)xn* z0EdAJ5sfqjE?DNDO!jccoi|)mz%|$|9FjVgRM40k2<7SnGAzB+4olBKw8&09{S?$tMRjY#luET|#8g#X zmDLVQL=n~$DI3f(E^Wmuw9yI*Eu3)l(MK04ehhNdVl7k>*<_Vu600Ype8?RtkBjok zZm68@R)V~I(2wuD<46t%D>QSi^&T?!syx+Qm)&;VeHY%T_MGI;OX|f$&`HJfpg&G2 zvY~^3Bhr8c7E)MHT(Um!p^QxJD1(elH#L^xiY>kvWBpFWtE5&v{upFcUp0SuSOD-Z?jBoBik60hEvyN)~O*QrazV-FCkv#QYZB z3CRsL-m0y>8tbgJt|~$U6CMBsLM#zN!hW|}fs{ziD!AYk$iRbz6Kuel?z-*1`|gcL z(tDzi{r(&9z($T0RuySAdga6oT27x{guT^fyd~#~=gN2X87nX%a)fB0ExRCQqOrA= z>HWO;cB4zC7;A__k_n;(Z2(y6+)1oN zI);4dK~q2kcRV79o3IWgql(u6XxBm)z7U4+xeyBQU4=#Y{okV1Cj6+RNLA^6j z@F0bOxk&_VYJ-UMls6zg%nv|hNP`6;!U7-Afnk{<105Rlf-+$5A#VFZgTzM$h>-yf zaPR^S?J$mU+~R?8l;a#lwZDqk@ge`y;~rBLK*GstMFTjX;u7c%FeI*lbc~|}8F?fM zZe=~++1_)&l+3*;aZCk0*j z2$8RO=K~vA(A_*zD;JPfL^Qa;JrpDsN^6lO2TGFGeJYh1)#ye!Dklrk(1z<&%Lam{ z3Pm+jhm{yWf{Y;qBlgDz2@9SvD9}C@B=H6iX#wvl;UF8-U_mNzo93!`%{2~y1u`gu z6~y;Nafz{uWI%(sMsP(cxDp~btmsy`+EoqNWuEpF>sa}M&p+ybfPqOFKiOI{f&Y3{ zat4*_Z4j!J;xxw*522((Au1i}REMH)oybK!)ltJ97O{y{iiKGDJGp4{7_vB6+JvCP z0`-Ri0E4Mah1b3jI4^r2NKg|Ow1$*Gv#4~C6jHP5MKBJ)n@K&RrQm=@rV19fxz#O1 z;wh1Mk`=gQHETZ83YfLF6}i<(E1aWJCfa_(HA zi? z9y2g7kE(7eeQlw&5ugKpjZqt?CJ6}@C;DsA_dB`}H^PDrLVcv4s z!+8!Ih)X77zmV9(fi4J&>FlW$%eBQ=QNlc8+#KvGK)c7`?q$5ITOAXLT`W|rrhnXN zPX~oU=vA+5w2TZ=n3Q+N0EG@ZV74gNHzM~Prhb+9kXahT5J#-ANZiKF0+-pQZiB-R zx@W08ILK{uK*E?Qf=>Ar8rsqRl%4a4XFXpVWPC2%$<%5dLR*(Ta=*z%5@GJ{zpguC>!391TL%|0?&M%Y! z4uBsyM9`_uoF5+XbO9?~Ufy_CX?uV(A92lXUSgalem^^JWdG06-DsdUy2f3K_gVsp z`G`0j^{H2VQ6@A3wuwgwCpf_XM&N+~98m)SL(~SU{E!W7;PyFSvhW90us3`8%ZOs~ z@VmTgi`XEh`PHiQ$;g5mWN%XFoBl(#Z+h>4|EpMOx#P(%BFIO^&wT-O<&k@N@XJQ? zjO2Xg7)`W!d|ur{*VgFMVwm@Hdi4TO08_6*oKG%nk0KmI>O|u83@|Mg@FF1a|0a+E zp>_KE!j&HXCyE#gmt=15C{w7`~c~21nC2BPTY7fXGqX;O#d(|E?^JtY95xs5e%XQsRYKF zW9W)*D-eSQZx9T_kjIpe49n0AF=X-fCJ5IsF;FBG-VhE`0Y$i=FxKw~2Pp*4kSv(6 z34=p64&n+Ot)ZIZ1-VcwIt2X0P!SjLu=LOo9}yD!FAX__4J(mE+%OK`a1QH`^6n51 zlQ0s`f)6VPa}*#htZ;+eVIcNO3*XHU#Sam`j}d2)7EdV@ZxI)B@s1`@e=N}#_acBY zQ4>vs4n5El+Yc0VQ7cA~XMCn0;G!S`kxI5?5NYhMUQt70(fewV8@q9Klo1@m(Gh(R z1AlQ1gHaea(HM`Bt@2PDD}os>#}5zUEm+V6SN}0|m}41W5Ig!$8%@s}15zNbW}prs z3*HeS6H+$Fk@3vY7tt{j)v*ZK5gCOfGOk|k^Boec6KV^St1@d6vtAuACg<4__C$OtKtpWIOEkrR8;Cl3fHV^S!Sg(!*Gu8sqh{j6ha&%D8Dftm9qyKUSW$`ad(=?%?AhS|3S935K@+%QD2y+q+ zck<{S^AjVJH7RphEb}tcBD*y6H(QY)RuC^w5+(hQFHciBm(wUrMKA6KCd+W%A_N6E zAs8I1I!i z^i+~L_me+;!rCT8{aB7WMbU$3Q3lDTF!Lt{|69{E<7#*V+&l5cv zC>bS_J(q+xH3Kac2RJjcN-zT(?f)V_0kS`zbcM!iLpjv9VAL#5;0hR_UK+v7?nwRq zj6hYBLBUi(2Xw?%z(L(8LS=M9sk9_46hld(I<27&K(t0F6fis#M6J{!zCaqD0pnm#-O)1nSR}N0= zlq8PTOJ9|LWHe7rZWpIiC0;-m;#4AbKpM(n)LPU#nUq=YtXn0OD(jS5K3s<$r0MK9YLt3+g1jL34kO~O!029;z zs~DA8`7|PSl}&RsJinDq(X<>8w6`8LSuYe>M?zW4Rb;EQFZ8rxRbmAG;2dZ{z)s*1 z&S4cKkS@NpEjacqAod-}l_Jbl11ps_Y0fO!l}pr9A>p+*J{2J%!W79OA?A{UezR0T zb1uSF+5*;U`x0gN)wqDxKwaPxHUapMDh<-B`zV%JFCsc&6lWcFQIUWX+~^#L0Sb^v zSoz|8GB#M_^aQZr7u<*&xKv*zZwGAQ8y+-%^1=o3z!}_V0OXc3O71});*Ij+1hjx~ z2jCl`VG#%>L)g>>{{KK5#$f=Wp%L`L4p#OL7S|kJ;W<+@bkE^$(MJSIltQc191@`} zYG4@Ox5Z`TJ=;Wk81~3D|MD_dA9LD5`A!ZX8FnAzz8Fv5 zo}mL&0CFYb7V-j3C4zU|R7R_lfFaa$$DtWCxKMLI1qSsT2$+Hw_!pkR1~_yCj`crg zHy9*ui8LXdzW>I3nU{%+w^Z5}iocZR5*2xy_kWcUdP!D#rx#sw^f7jHU9Z=z+!aW- zS2vLM8IOxAFvDs8p@Ue%d=)Z%=QwKsmM84kC0(>Gob@?JlP}`8Px@pLW^Yf+)sE8k zQLngFA;Ln(VH(;X2asSCR)OUp0%NP_ZY{YNFqB%&VH0wo2lAkS3vQ49A_Z*W9B_dO zSO5t;HZMeA8o2ZX6qimp^jQ011$e;{s9*%5fE6fsQZBX^*r5$nAaRQ!h8?*NfZ%O` zfinJJ9R5}X+!jKi0D)6r7r^1BgmnZ|U<6LLf*JH>DOrmTbc#o;2+uZToY!HsIDdKa zR;hLz4gb@Sw;0=;pieyFBVeHxV1b|gIiK^{3ouoThcALUacbAdCBWiV}T~(zA0HybrUspOJ z?D`hOB|&ML`xw}P(KLQo0CII$7Ji3V^I`;mn+3W#WIs29-H3yk+LifYZ)f;HVU}d` z%TLE49Z1))Jd|y|dYjAPKlEap2Y?gk6b_QX8CKzaf}7=hx)OTTgFh620Xsz5_vjF` zwac==%^9}i8GwVAz%jbPpEt2@d$B$2Rdir67SqBX;|9_%K`(n)4q7lb8#g{xB8U_# zSVOz2@JHe}AyeDM!_dK7TfzTZuwk17I$>-I#svrg6HKd0^H;GUcDK!TZ6%Zrp#N2v z9T=%>`hn|oxgXRVR-wxH*hBR~SzY*rv-_y`B7$ESycZlIpgM7#K^k1zK&reh)SIT= zn}R*S4$MIkGyxh|;Tc2#8^T!=%s~}2fJ}Mdu9X*0X*R)wy0HBkIm;Qr342lLnoJvY z&=WF?X?(&dJTi1(F(G3yDjR4$9J4{3D@B~H(P2f(Yxp%};}$uT)wA;M2F)UH|fIXwUYHyS}b zxQHnOTQRf*e!-J-Ac(hHy9Xc+w!fEB($mAiSW!91&=rG40&`R>il+#-zvk?;1ZKEwmy*fg>I!po8Q(a#L^EC0e)dTX? z)qMsvR0T931TJBh9|8ynVG`D$VgFm=Ny67HR*_}&1$rTFi&>Ia!Lb@t$+ww;XSvL= zT^g=o6L@)f|03JXp%Fs48^$4iMgW}#ISM%88#q`6s`DJ4feJRj%30wYUO}1iKpMXM zA!yn{nHZXN+b+u#PMxg27urE7s3>i-}D%)u6}0e2r_ zcAo+7HwFdr9Cz=c+w|JN!~4LgTGF4}e+@m5`dXg#(BlCefOt?uiw9b1M3wFnDF4Rh!ZPb%($`R$B-2}(eZ;a2tGqdC0=g*#PNl8ZkF%+o3Bp}>lD0{*vv224zWmu6=+moT&%V9;_weJ(pHIKO z{rmXy>)+46zyJRL1}NZw1I}fYTL&VhmRoTl)It=OM92smIj}HQT?b-FS6+u?(V$@l z%EecP1Dt?GGZdvm3=}DKR8d7R6%~Rl(u@<$Ae6mR0tHW|_s>85fKu7MgRs_UdbDuE9p?u*4QC z>Tt*=t8B8xosrzH$ngcObI<`G9bnX9!w7cRjAx#A;Ki0ox5k#c7lG)etM0n&w(IV@ z@Wwkpyzd5y;a-G^=&8PA*+i!eZsJAazNpsK;s1xG4m_fzAjPCX!FF}f!A2_R1aYZo z*?ZOqBLF^JELg%9i->e#ULF0Zxll(9^~D08`s&qKXRUQtlgWA+t(#S58Lo@%I_=qLqZX{x zY`5L^vT(<}Y_m?GEp6JWReSAU)M+z}8BU4kHeP}c4mG`qC$9M7j5qH1#)aObzoFyy7le2=MJmavx3c; zXP|+E_wabHE&K7v=Oy>@%=<>S@M-Tw{Qq;&P1g)B+N5&BRE5Ldee&f+F8=uBmv8?0 z=nDwGz+EB87v}9FO#ADvhq}^>_`@`K{ZgaA$v4kX8Ax2f35?KbeF*dm{}RZ+sU6K~ zx{II$C)l-Efh}yDA)8{%_A4C3LKknC-r0=Tz!Dm+c_?Jw^N6Px5t>GC)6v#2uz?7h z6mAHiNQO4Bkqb09MGv{ahBlH>3L}8T49Td)C3KjKPz(Vi;2J_Lz5@~|(hwwwn4#Yo z;im7IP&VlcqZr3X#xk0bKwr#U=mMgx5itJ+BaMLM zR3HZ#s@mDbkd&IBA{W`J3d-t&od2ne26Y8JUtJ&*^Z17*V{ri&`ig{v3}vWNNJ_ZT zO@w*zBxzuXE$s*b8^iF>00bvRzl9<@$&f=)CV`D+q@okp%Y_pLfW%(Hq7%cY&UL^w z068RM7(Oh8HcF9_OY|}op-AQ>K;lJFp6iU@45v89Nlx(r@-0R4OB>5#ugxhCM0xb) z0}bba13D#S@@ya?^U2Rc&eLX$45&aM<;btm>UTf*OxY^Qt39|wli|<>L{-TvQ1KDOzVHnLgga-uY(;7Cc7Enb5HeBHpIl%M>NaTePv51XQ1eJ;duwpZy3KB+S z&ne#N#0aDsR;}9hwz$o083SvVb@KMNzzwc&6WCR%KyaCk$g4PC#NU0;Y#%)Z(<^8UPxSfsLIGK$@-q@Fm8TirH%C zx4I3nh(}Cfc!Afq;7zfLSIpupQUlZ=r}~jUzJok7X#~G^Y4REV|p8 z*R(ji;~j5#QG)|Vm|__`uI@javIj7nB^=AhM0`2uNyhf2a4dkuG{s|JZJ7DYW}XCr z2QYq&wvgzeNOzVx^1`H4VhdV-enhS)Z$Evvi81|5fSS%wPL(W7uG`);g$3ne(_;GW-tLQH# zS;>Yi%?0)l3;%c21+T3R_A+pQ16}yqDb)>!DfWO}ReG5(-J38>$yJMF_^>XT<*ZFS z8`IE^b^t0htx(NCQ!$64wcoiTH$TiQ1?Y10(Dx|wLUX;wWCS(63_y#BP5@v4BkPW^>7MHRvnBC?2j?`O06(YH;S&HoqV5YeQx-K_DoldZzn1V=&6q})k zIrkJBlW+nru%QPQICB_DC3=Nt$?m|$`|Ds2`#9(A@v@u!?B{$j`})mx-2Iz(ow0F3 zgIDm;T>p~Cy4W~rz@T>pPy-T zA|yexVYzAspae%4Tjn$;-m~}ey;_p1mb~ah4okZ|@Awj!cJ>ewclgU> z_Iw1)w5D}j+6=4@wHZY0L=bu5AwEx4?9h+C^vOqd%Ul2Y*f(6hO}4PMdp~P$2l(&g zTItigA=B;vLusU-3-ycU@7&$BM5T;!M>w2UqRzzWtGkTUi>C6~_c@q1Sk1C|AklxQ z0S4*Sc!XyYSY~*icNR)u3Xj)$pf@e6rx#x2OzdU^rJzHw)CoFZ6F?+HL^N7RGz>X3 zME{p?9T4VB$zTR4aZ}U80ymIFCg=)T=X@A7eLnbuKv*xsg<>fdPXVYQ46}CIH&!ix z3*Mj#8*qf=v3-s9eOCA?;TLeRqEH*ePzrzp7B>%>uzsvet z0y01bWRM4L@&Vci2S=c8eenWJKn8F?1#aR4=BNce7Z^2Aj$~j3Hj#~R@C6luG8_O6 zPv`>B01m1!F&J|eF7OB1KoJ;mFQ<5g3Ka(I<+0QiS*6Nsf$9Jw$6lvo;qH)SW6Wovj|I4}Tnm|mIi zWQ5m-$w3ow?8Mpzd%5DDJk3ps!Z-XIG(aF|`1KLQNK`=2RppIl<2Y7%_f8mYV7?1O) zjdm~wrehN*Kn$zt0>pq0h8d7HaRQHU4i#~bi?*1pf|xC_kdD@na3w2TNJ)sb2Rs%I zc<5f$1qKbUS9ryL9w{110COYBYQh$C7l(4~MH-l-N$$W1e#nxovQ#mwMc>-xL3ICVS2@!$`RIn5# zI*P40039-xV@Zl#1&g!D9gV31YZ;eqsS!WQIcK2>I#P^ z33kaH9KjMw2xEW&nU*;Tm1&Iwa0J9)49`#rs}m|LZ~_|eoY@eKqQU|k5SgTz5-?*p z>UaeJP&-BvNVJ7Z_2RmhOZQ zL#jDV5wL6L6jOSnP7wpj@Cl8e0U=-t%5VyG(XW0%rPYZW9if;7iyK_}m|yA?hky=o zP??uGDj_ohnmU@eNgi>U4VH>LEZ_rl(40;I6l9PFD|;8&XayKh7jz=CCHohMdYgB| z0vaF#aL}9nqN!#2oSZs4JR=RyFc_r@DH)rp<0*b{=Ug||g>>~$y3lOXHDvZ#tNK8Z zd&i&Qpk-&H1iThy;oyIlgsdH>tdqm6&1zWBY7_m}N&nE3f5vte6E_c828VUwUJ}=1 z9(e)t7Y_H=9O7!X#)7VtTeW*asrN^42=LV77zllPz)^M6cihzE&{y`0TWo^yA%<; z!%GL_Fb!&uy{Ll`XZa!^!Ml_sM`WP~PnZLO@PwS%gvp2tn#q|1UPGimw*n5V2tR%2e@e%e<`)<7P}O2y^D~&X4wnRKqN-e2W=b- z6CnwFecNet z*m#bYY_YJ0owmu)*%*rfpAF{djikfNQqW{(y%~W6mgMx&`l_9JkA_t;Jo~66A@9z_+t$o%oUojFCSnE z=4$~q5CY%(2`JGN>6=I@aL-QRzAE6(HUZBu;XmIH3~BlY13(NpfXGgv$e6M~X|XdL z(-a}Fnk+C0)aevqz`@Um!viGK-oV2f0hyr*4Z)BIHT#^Sc@|+{!#Ax8Q$fVe_>9kx z2r4s;M17hkkkmH(v^s3TtZ5T2Ak{2f33PJAG7SxB958VTjev0iJ}?F&Xcr%l0eIlV zeqqJ&*t2!?%niF>*ft;% z$&ezEJq{S*qpXnFD1pfJEG3J~$Xe@==1F%I_Yb;YpCYMOqk#jMybR4&l$z9jrt!%l znV-p~3zBEarodzA*N1g`%xvSz%~Ko?HUQj8lWnL;85e8IfdlCktf;4O9)wr5no09; zl&fLPzAY-tyxrWLRhs*iNw`K3vI#n111)fsm#_vpp}LHQDBE0?;H?$4SifzM14u9m ztMD-8+zaY_&bf;ayL%8XpbO@(2|3UMd63Q$JQq%p0=94txPXpGV2eO10@EP8X#$r* zO5s|u0=)39QNRlDJQY*AFaHlq4H)18NvfCD(6H#s-$9}v7ONElUf>6w;N@VtGSLe- zu>(-C2Kqe!R~tVY5{z}Eu|bN9V$lI1>(fV2nKsdck+}v9ya`-gBAKZ(Kd=ds05DG; z#3P^sTpF|kkg_O~)vH+{cK{8{z#=RFnHQ`EC(yASzyU#AAu-Jib#OrW=(2dB2dl}z zkg4Y^Fa(t8vTsg}YS06!Y1G$Q#;TCB#fYe5AOwS5=00Et;rJIRAhRww*L_OGej%H1 zfY){b*LZLPvmq9REsQOo3Fj~kdK}{4@Du)=4zC~tJ3!!-0GMUM1T_*2aPSQgQP2^t z0kL}ys5<1Gja-d9e*X|zKML>$n`EmHrAcEb8mg^^b{BIOIvOCU%Z8Ve=d}k8rc2r z=F!~_|M20IF`N6Z3#0)qfCntPqAl7c-i)IlTWD43%pef~^{WN}qu=}8-z@Xrw#&|S zFakVaC>C=97K<_)A_BE;0V==(0jm&L;Q<8uqgp{H9HRjpUVRH1CTu!vnx;3pimFSKG|&)G)q&GXGs|#wo+5Cf2J!}_!g`)kc!isQqhshpE@ZZ{Z@;7nGP0Xj^wiGCH^?7ibGzqKB@Z}Qk z00BVYK!ODc8i~~Df&zv(mJNV7FV-7|5OKUQwQL?li2pqPbEnG@7>)zp#B%r1-5!Pt zF6i<&kN=_qCG-AuTi8{zm8&7MV@R_$80Y@c#e5m&AXqI2a6W#IzPrAw0rrNOjD1KqlI2^Y0n z@=%tNh7Z3TFt;R=akp3;maJk$uX1o%l;~DY?q+dySlAhtIyJ;}vNSY~%W(u{%Og~L zU{xBTi$B^_kJB9)cjL$dPGD*F``jwHnqadCVM>{@Sf0daD5R_r1{NGQcZN;Z@c>Qc zD%m}~`giNsDp>qU9jt?05d&^HCVUrS_n`VCOD^s)xb6x88d-8+;RH<3NdzK6pi#vG zy#KE7Miv|RK zawssxwBrg9iTZ#EF~<<1Orcf~lZ-TsLLtj75q#>g&$@Xgs1l@khCdZhV8y%vzALG_ zKcBHdgmIoxLDKtF*uj=>e!Da-OYs9WR8dDIwNz7271aqHept0tR$p~h2U)qeY*da~ z+QXx8micEMmKeIgrhj4q7ABCuXz7AXgzZ(AJ#u0Qj6E{RB%@`h%>)c3c2dF=X8-5O z1X?h{`R9^I9I!H7b=PILU3ZN#C|-HzrMF&t5jq1{Q#e}YSB6eX$)lh?BKV_zFW^Xt zSX6Q(r#FNpmL{8);i=-DetI`!jW_1l-L^gkIb@MXCb?vjPewUqldZ&WD8q^paRd?Z zup|fD1cYe3qgq}pJpWh*Z~!_gdn_|XIr>Z*(c&Vl4i!*ajU#hb!63YnP`l+n+;l^M zliyMcZh+y2`r_+xmXnQ>@IH|46E=2Jl=8kOy(10AOnxOhsqO_RxnvEQ!5@I7A}O3tt0p#6|`Xjv3O# zTODcENVKH@h+F^+V895uY#0kA44@$ki^)u0;t>&&(PBIC2>^fsME^Fn(T#6WSsdj! zM>^Kgj(5Z(9@phKpT#CANVr5J6o)fD(hopA%URIW6*LVqhbD+G|@!n3(_c! z3MfO1`NYNp9*~@VBoz$TVG5HzD#0(zu?d@P%|}5=g!>Tn4O~#cHg-T;&eW#2xG7^1 zHW*9@Vo?kzSb%wp;!J<|woJNkf<1fFc6Jo)wPtmihszQK=M%8bqXm7c9dXLjB)<@>i)z36N-y7)LSIa2W-9 zY8>B$U{)JVc1nNWr( z+EO~FD$BqO{n5Ea`;dm=GiC`wT>emz$iKv0R=fl z;u$hJC^XPvnj~1_L#7!(UWfr9kd_2^JJrxSd|{d)Y{(ZbLSFC&u)GXmLUTJ#%H4dB zhxvUV19$**Qfdl^AnddxSfWFlkuriXS;2RWlK%l5exOgK)Ib;GAVv=A7eLwI<{QOm z!vLbdif=sQMoCSx{hUfbqS-eXI&eWAenB+3v{)Q3=4!BoJ#4vn6|5C})dfjaRvPwd zw7P150^AyloCFpm{sL@Y=OM$?vM>{C^@uy<>Jn2J3?4=WY!9*K6SzJXLQa{Rl8FHQbvk{bS91!`2Hn7W7v)vDIs`#vHcLO$v4~j!kXKy)zQp%m00TDX97!BFl-5-w-U9BRgU`UoS>JF;ij8 zfMy(kd)xqc@C}H(yihxbPf(Ud0#+<1L8zGqm+4Z2UX&!0Lch#%6B8cKTu0u|eP#9E{JPl#4N+DS129$?6c6O(BWnw`KOsAqTuSr23a#H01wX`!X}(0AW;xNazuL>H$pXkZV*Y6}d*&Sps471vMC`JoBj0 zF^(qLoZs_-G5DUK_y8Y>pWn;0MjHx9+db&3v`a&peVnkRNPt~?22uMdQVR+?9EU5U z0{+-OSsNgyx&;l`!={^tJkW;583BisKJ^pHk;D)7J2qCaAPkDXoye7WFqU~(h-qU8 zYbzldiY!w=!TfszY{`V2JR^m%A=HW%Et&*%tHGmmKnYaJAwq~!;D`|#fMxJW9M}V0 zaEAf-h!Ly_7$PGa;QxqwiwQ?a7Gqh4g)lf5^a!D>7#T#$wq&;*gv+>`t*GchxrEEQ zjI9CTDUDmMqi~%Q2|{sdikCq-C5%E66A+Dyi|$B8`ssih>5kpQ3_^lJ!Ml(I4~a(kn?#B@@X^8NT$d5qyab|m(j~7Or)EU6W^hc=d&88u&~5Tu+5Yo z(2c^Oxvg|oNGYV>CQ)+un|x`qL3d^xtXCGxxVRu{3OZ$1kkuJ z$@U8?9iSEX+fh^(9GPy^T(nm7LgC8i9=jon*ED9C?f$mv?^E8eyp#zd) znLbgu0EN^@g`fdFwv$TRf9MpFe*!adjnl433r$Xl6cBq=^~*J)zC7)R*eaNaVwm7(1-ye z(Na=1qSb2c7%IiqY}M9ntu1y*Iamb3@%Yk5or|6s*J>4B>Y+9~J1`s0p&+N! z01qoAyoM7~Yt`2QfF3a+G~TO|^%2yfNP#+0&*{k$ElC5-qp3V812M4zj_B9unbVzd zRFjj`jMZ3Dp;Q8u6$2fsmRU)&(v=1^qYD5dSk1q+8qv1uE0M^_3m_MYv7%|ogjo1M zi7-GgfS8;hEC$@ypk0?+C0cH`e->L9c@qi7t%?$cgQ$I4-|5#s>>miwWii*wO{&>JG?f+jU zr4eIn6aj`l7HFRu@l5AbsrY%S+4yDSbc*NrkG7_K_$>4BE1-D7mH z1u1ak3vlEu7=>=g2X|-(PBsN1aO6XFWD{`YXq&6Ga)&08fI`sWH(p;Kw*S?6>mnTJ zVqwJr3yq0n$OT^DWnK=2GXQ2_CWKB%g+s(+e*Wa0 z(7zSLfq9VCo}N{RR#AL$D|aYXjtGZtcv`29ghR-I12_OR$^xs#Yr-;v4iJa~7=b$= zEE7=a(1I4w(u4Fp+#X77++1wLt?9>x?8t5lp@!7OpzO=W?9A5e&E{-WX=8TYTcGaj z(GC@&F3-<6Bly1${aV7(fuO*EL&)o@K7=;Y0m5pBe^6+WZDAr9YqADYvtG*P zHByKmf^f*dl7MTzCWr&L>)IyhJ8*!4pa7I61QHGh7v2LoKy1GBp~hxHEKOd?Ht+LB z@2((iVzcb^cJKFw@A#JQ2KsCa-kJH9Z_}2QWGfZbHiBi?z_V0>c8LFkDHw_zkZyvG zZK2reWblY{BLbapD~kD9;Vx_9mOu);i6vHo91RMmPJ(!$fCL}t5r~)EZiioKRu^VV z@phLV@B%py1Vo^5L6Czi(1AFn9P&oq^!D)|_i_A&p!OE>A~*6QM{+x^Z`5_?B-d>H zMoD@;>H%W*v1S_J5Tq(;UJ*`%@a3;m@43C6b*lvh0 z0rOpJh;VA>HVDA>a(_OA>NbcG9|siPTAK(56l`(u&X_6igGpfYMtAf{&;ut(m$`Lp zAh+~Or|FwM(R*EU!j0Wd2lXZeZ31p`C&z64Hfl~!mKTgrn{fYzNMNm?(DOYfEI%NM z5tjf{27_?>AclC+3J>)YZSx332v}I+sO*&suc`*Z8=jggN2nTp`gllzT zMPD!$%pO_-L3s3VcXT}%g8W7F9>?@_S9dbjbhqU6V4w6)hxd6$WBaCCQ-5;Tbw4Rr zb(gT+Y%g?YABqD&X=#rHKTvI<7;(Wy=zq|MCgPRgruP{f_IQ)%D0cYEvIrFFl}NaO zcp-R$CoBqx7Yv956JT|k2pF6^^y4aASDehbFavR?c}MpG%e+@g_vUry`JPwXc1Nri z@TKtv*NGoYqS6Iz5?QC%0dB}XqlbEp8Fk_)b$l0UROkQiOYLwN&32q{>T(wfF(2qV zFas{A0xpPySr6#l`+-Q{g@hx5fB}PO3l@ow`i84`cxzE9cvX!5h*vj*c)0C|2iy$RsMo|AIxT!V(;o^f zNU;^W`{%!4CeL82&ul3FSk#_!2bj=a2ips1fGr>_!{G=7h=YKhgCC%4p*Vmah<1RU z1E3v%*^Y$WcG{LO0dmm?f!hPShyHZ~2mk^H5-k5{@F2p33K1HKbY{SSaQ~J;R3dTW zo&gdfMH+H|AO=AkM@G6c-H_&xN_&x zt!wu#-n@GE^6l&QFW|s}2NUKypfKXZbk(9|%GI&gu}im}olJS`p)5j|GVTl(1*deY zZltV{tI-Q(l6F|D1J<$%PUB{qt0cLr=iIv0uIM#;T)Ex5cl^3_`-Lvi8X$XSG2qL% zXE}sZuWtQ1_UziXbFW@B_xHxI$CEE_{yhKs^y=3Sb)w_P`}pwZ$CuB=yn_KoZZ5k( zbI(oP_@_iW90`&G0s|b-ff+4DGRFpKVbEYpW{hxvf;Wg1i77Wtgab_%NaT)x4O|jQ ze%-0KB8x5Rwh)Xl${1rq4;Au{K12+l#5^};lF~*TnUMnqBQ(^~Atxo2l0Z86;b0X5 zU|>TQBej!LO*h4&lLBve0n}z+;r7^8V|GQ98C9vd<|JNx=h&G?xj3hAirIN5o_XrI zC!c-#`6r-#Vh1O4a*738T9%oWS(ulx$b>Y{IG0igyQC9}GNd?j%_25T3frWd)Fzo$ zbh6l6aCEXD!Z^kqI>HDlcrY1tpq>A-%A}_1x+|}}`Z}m?;Z?>SvBesDEVAUeM<28D z)u#g&SdAx#2l~YVhE5$$Y1U>$EK~M356(qVO-Qj>jU=c)N!y}FJk0~^1tBZd$5dc(H zavJ&?tt5x6f)Q-09MvUI{ScYSN{#GquYuZpGtN2dyfe=|_k7)$jS4$+qhvZtR>@^C z>Xoo7rof6giLfv!3n!eAhcw@$gG&yc3hkJvwv}}>&AFkfE32-CRbF)^^imEKxt2XQ z-F4fYXs~J}yEor``#ssR&NlxGpMCf#sM7_@X!+kw&Qv^-ARXvN!MKl`fG-#c%iHBm zIU$1L-Jy%_nZTu+ZcvRk>LbAbiq9iOSPWNeMvP1nRORE5)S{(-0RH0+whDX<00nQB zNp{jj59PI(l-c#dhTfhfIs#tHw|2WgRD z6u*dI2z&FJ*$iMD421uP9e#5wq?`Z?&B)*eor9_oj)R6`Il&`tB{}MGv5Q_@QPcFM zx4)6GjAl$v;07l+9k4N4Y=a0*GItY4(8Lip2?q{xCkPA(#{rdVm;~^p01^FT9w5q+ zJ0$SAeSNW!cRL*^q7RoTsLi(Gn`w z5~T#TNCz@9)eUYm!UjVj0V{?WzpacQY(!x}3A&Lg6)doUJCKGrgV92!9feime8v`^ zlfrR8q<};D!ao1|S&46klb;Zoh8i>=zZV__G{1p}IQkH)-f&|VLoA0k2av>vo`V+b z^bHYH!oZWmZ?eS6<`fvM7>Nf zfS$xcEEmYcB{k`Ko7E9STK@F6#h!Q9x5v-9K6320kO$dPl zdBBALhhqQEp`a6iDQV{bNV_#Cv;YgzV4&AvBZ6r(;s#f9Mr$B~oO2MP4JU}gC@K-F z=~nl;*^N~ai_r!ZM1d99z*Wc?N)#r1V;Y9g01{9L3@Q319j_3=1N}({V#L7)EuaH% zwvsm3*x{r@c|kAEfeR`$Q5v^mX?yK zRija%B|q3;=m#E(g?|#aI0ZzNBvGOh|MX}cZ-}EV=J6%saVC5*d*x7WaM-HUGAfMN?AVG~ zWV8SH4Y znmH&9s}ZnZv5z6(KzVz>1OoSf&%l6lY+wh`aK>nyhKL79d&ChiVI1JdAFKwzXT$&Z53d_?fJm-1Sn?)dQ%ot0o?|q}OsB1hbc@ngrWdzS6KB7qj zOi{5rWaqBvY6mHUrvSw*BSiIL1nBCm@fRVv;|FPoEB;Z40oX(rP#)3j0OrYp;12&? z$vC7EPMHZVt+LE=7T=ktu;w+jISGHp`Nqkz=b;n5=thq$by|&PLBsj8o4t8j)OWOz z3HmExdiqB-44FqOR0Ao&a5)r;?9+xVCFoSAQQEmGan9x&v>1B@`!~c2KjItV4v)0z zes`lt8>C?=2L{snwxf{tp+z*J8a%*Ih^+X8{`(ELjUs{p+=9RcRsp!dQUYga7`VZ8 zx7ffU>jnnB^rk0fPsPLU)w3RO{#IifS8N#!QQ(kW>Jd&t6pnmU>}A-ANyALBk3t?2 z3^(c6QYVq|(=%Tz9)CVT8j_2DJh?|10ZTUuDTRvJU`AIqhyyA%j@N}qaohj$SYXSS z%;~`y4LgTQEn7AfH_c3$R&TzYkFNjy^S}RrO1jb!R@2#^QV`b9HIrr_8lo9WF)@=3 zy-nPhi2$WU3H$=LEmLf~+W_qVp+a-_+OkU+#2Dlx?5JJQVRA6v;9%*S{O2ixK;U5$>-@R2v zzO|kew%&>P8^Dc6O6Ww8?G;TZLH2zMx(LE{{1Hh=01;&0me52`V9AY~2qQ(|=|P_z zHbgDV!vGlHKU@GH4WE0hBjbih}5%2%8X zQGiC&2#`W0+u%u~2z-M$G(u6FjpPmE2GY|I5(OPZN=l3Xbex(Jf}U7FTLRIcKL*_t zVpbJiAwlX}7NQs%sTfiz01lX6f5cIjZ6CU%B6dtc!(0v@9#V(sLKyyo9R4Ho*&*~v zA4TvXSX_X?Xhg$QfyxykLHt0&tl>>$Oc( z1>wRt4n;YQ3U8^~DqIab9TBvd!-7#$nHZO7Ov(`+*CJdO3RPG-DHs(DKomGaC3w?d zE*J|OW@2K|ITXWtNhMdP7pK8N6%E2NA_WZ+#R#xUG^{}jM8OBGlL|z@0Hh;Vl9Yi( znlubo3*^Bsn8PY;Kt3|zOx4s)fh2Fv8CD|AKo+EM2Gv3S+kD)|8#zEGbQvAd#21D` zAT|tXXom^_62A0Ab6Qfx(ZoD_WN!wYNIswRZHe)@16cpq5s3_d2{g=0v}9c&1Oi;7 zDDg+f?1V)81o1#6E3%(YPQn0CBK%E){7r%$i~tFS$5C#aQ!XfjHYlEHRuv+RRA!^NI{fonIJ@b12Fy*Jb}eXDTO9L zM2ZeY3RqMMeFKYb;0gSJL8VXuEt`Lmc&D4vTX_F^ob=6HkWoZRER`uhL^lkod%h<^ zunS3C0hj%b#ATHQfC+ar4fFV?ECpp%K+mI=g@ev2t=1~{K&YJF#%gvJuj(rLNT{4_ zrB$|?nK@uqq<}5R;?#&JQ?LLMm;yYF0{|(M3x*T}#Yza+f;0?3GzBLPjmy1<{7QZr}(!YqSnPlMWF?jMD)0(2N$5m6qda z4FDGWkZeVQEofLhj*yqyV3>v){X`J{^j(E5VVVvA*a^Xg#VW{l5u6@MaMG#C_Klr7 z%N9=04aCCcWEJks98J{NA#?|*j>I>}%cB1(z|JZ_qb^^_dRU}(93Eyu1N_K#Lc}Ev zz;dF?Aqb315`@E%gbCOg z?4}WpfY*$`JQWSBaA>YE-lu@rYHr}Nk_@nlg$*zsSd2gi80gYD-N%|m3vj}Njjil* z(a7?YoSrQ1n%L|88=mgu03eRGxWmgfK#lo9cTBC7kl!USOuvS&09P(ma>~7+iqXwuo~;h1aT#tEve_%C6ehul?Td zQ+h}EBq;d2Ms?&ZuhX_@#wz|+u@zr2UJQ!*9dN$@Fs~pO zZF*hFa_#4wwS&&BG`(Om{TQjr_yJ{R5?zzj?~CLbOF&^wd=JMQ`-J(V;UxE;MtrMN{*$xKW-SMkYuc7%UZ2g|Z;> zk#>aN!)?{_V(QF#Bn0 zulk~Di;TbzAeKQ7=u}(+BTQ!lJ2Y5_HG_(DvPd*ppEX*iwOUKFN2lI}t~ErH^vXIN zS7icJ6EWg6OcHFzxjbAc`4~+|L~|P7I_vc4@H8ahVN!8UA3_90wBe?r%b0oJCLctO zq02XfvQE4KOM3_xQ1w6;bSo#cLW{L&pY|rg^?I1KYPYs)zcy_9O_O&pRP6}DlA4q~5<^fj3q{(~bxgzxx= zAU-W+SGGZva3ud+j6P^~i0pwb)C*wc=bUgFBCuIjAM{pFf*@ELETcAl=Qq*uW-in2 zM@M&vsUm<6_}zT;$l5jq%e6HRntpglI5>js@vKeoUc)Hyb;vZjTvbM9$#yD0^5ryv z*UfZGQY55;IXma?q(o0-j39P|J|6@NRLoP~M0r;&m*9Xv&&d)TR{Tyvxwx@@2f2_> z7JtugE)`&idqBKk>nWX!Rny+~zAc8*VgN>UU_Qv^Axx;!^%oKe0LG*RQh-w`{wE~y`7`(x$2D+eQ zbt^Lhq9;0|Pdl|+kE6djwr4wm8+dJ7`lat~v&7y)o;OqzoB|MUTwRBFb3`H33;C|N zPDn&7xVpCYN~{M=jVR8KFeF4YCrbW9WLL}$(AAv-#UVV7Bh;q?6oNZcocZCWh3kqD z_~a84x*zvZ~Xs(WPjH?$cKE;a(ktFJL_Tk4`{mYc1dTWlI?*(Gvp3w3r8H} z4#fY_WRRsg&)$R-(7VXf$-SGELjcG;u#N)!$UJlmb7OMF96|@sRY4#CAtT~G@EDh9 z3&j758Km-jw;3XM!4yX?$B#YP>&dnMJlfk02S5Wlz*gGt3dxg2YAnKmnmiVQJ04Rx ziw%H_eX@Boq)m|F<9LB^fRfF(Ar2UfPS^zY`uy9kNYD?ALrAj7K?K5V6_@2sBnU$H zMa;@Mz#wS;#r%%d(;R5?$_;n{#aD$MfW2XtJ?zImVVwQkRBJ!#N;A5MY|zHWn#BP@ zUKF0dC3r(N2tV;h$WG~jH+X|Aj5?j501uD>8Q?*+D3J8i!4V+8XF$L7Q$Iv}fb{>v z!4ZUgS)70jNPiyWiVu(h9B9D}s4k^=13FYf2*`gWv~gM>0V_P7yk!SKs2DJiU_pZg z1s)tof|a>NIasKWsGN*3ZV`>V1{Ycq{)Kn`sXgF38Q-yAd2K5 zYFV>q(WX_qmTgXn zfd>~poOp5L$B`#juDo^H7Evx)62ijZ5j>YVS)yWtdh@7@X-!DUL zsv(y~UQkAo9n4IrzHvfgNzXm`?9)$*RquhBz0;L40 z;s+z{s7jC@)cV1Xs_sbQhbjb73J0LTI4r1G{s{-DNydUv)>&z-)u6p_%~jW2`#Pfm z69xinpk;VERe?#9s-go2DA1u)rsfy{uYv%eAP%dBpuhnP`bx@#25?~2sGbSwY7ybu#0ZGf{-AjlYTF0!-fuJ1#jK7$RkkQ^}<98 z;`!LpB;taO&`+6I_}kz=f*M|H1WrQojs+3MVGvyiEu5sngQ@f;8;?)G#T#_$KzQ8{ zUWSSV4WhI)NISwX2i*o;j5l(o43_4OI2+I&% z0MSLYm>6f8MR-i_OtU6_n;<5nd8RvwLf9ppP?RCXnQIo|4yBAp7U|E!5l{TjKnWcb zCYw|uNHZl&DT=2|fVv>5EXb1T2dnPjv@9Jmt!jv;26AAEq$B{hC|!a|^&duYxFptv zanD`%fp+cP_g(u61t?Pnn8$?7iwft0W0U%!E($)aYK|WcuxlV4sIm%!x>)eGfy^I; zbQx2YICuB+(U%q9_1SOV{rBOIUw-*(WkHKeFqwl8>5g=PkV_W9f_+V56A+=5!qR7u zkgaQC>R}JX)H1S*4MYQbP{t=P@d^Iu3}n4~M}%K#fFli%Q%Sk^=T5f{Q9(!3j=~2WfmG9k|GW;8s#N#m$k9bsP!f9M?D< z?D0@3A;<;5;D~Nq#vPdf%B1dqx`K48Du;-J5p19>3aG#cad=i$l5mg%%pnpcxWFLi zVJr!_;~%jAN-S*Gxdg6~m8$vOD`9DuzT`p)1Gs=Y1`vzyDL@IYV;&doGJ?rOLJx7s z!W6O)hte&^d3G5>Buasp%hIg$E4J!jMp(a}WaxTUsDNN+1n~ktbp&z``#+!i`4U;D=Dzfi1rD zk%+k<56<{VI`~N)JD7)~DI3TMv;fg@d?OlcI}#@*NW>WM=L4qL;0`^Q7L;}LBX;}f zK@+-A|Ik5gYQP9Xv`8MBjw7Y%(StWskpn>>wF4}m5-7kS2^$E48Ifqwi@1ObXn4aL z%;-bdT40H-a@8B)P(=syu%SV46&lFyIqv!5H$M4l!R&~i+KpmmUlK@mC*g)-ERP^fG?5?zD5Ve-%gkeWsY>NG5u9MC#FD|VoMkr#lBxlKVV8R_iYX?= zg1a0bdivF`1MY%>NDNXRy~sp>GY5uDn8FL#RPc+nNzMU~lg2f+@r`jDulljT0vOsK z6xybRNvvTY&zS@O+Xf>9s%r%G|ZGcUAE1i*C`p6`vz|^Qc}!A<86Vaqlu5 zVJxA%!4!kcMe&Uq!+7sM^q~t!pjZK%sTR+{p1>TBo$O_Q-;B+k_S@8t zAnUY*eNT`EOsIhcNI3E(;HhoaEE!$vQCk~wfP_)3B4`7+Gk^rz!7#l*7v?Bn5Ax8B za@090DX_&ka6yH-KX4!-n8rfW=nVM~q=5?Lg?2^|1y-o3LlRu{Kw8QlsN5MXAv6f% z9iIcpOa5Ok=!HXeAkhCc1Z{+D321RY(}5#w$Pd{#LW}f(j!I~t1-Mv5KZk$|vn~xw zUbTS}aM2?F^qLtkWZ8viXjmPb|BM>o8Hxt5weEDss(!`T%~bJ&9K@j&VH?1TR?XRx z1c`v{YnC9%%;E$F@Uc+92khVo^o}69h786)2ntV1riK7jgWEWYL3|JMsKB74L5nnM z9He0y`k)00?HNX3rh;LkwCE9_Yz0oQKU9zPVDEwCrt}6v1xBC-lwlD{Kp7H&PRK|F z{B9ZmPw)tDBjiXT5O2FAqPtW8_Z~0uCXeGRZVUGWu@p`56p2G!+)fB25DzdR z4E`rNj-V6b$)46F0(uH+faU@ZPrDQ^XL#ToXdy*Tpm4NJ1ik?rdW^C-FaEm219*@J z|APg#Mguy)w6?9N2tv*_XozU${3*rxwyd=9Ks-qPb~mMK+Nnj+^?-T z039qL8*)GoE=>dcFII7(+q}xv(x%!V5EQk2Y=$2cQ8| zOcRZw#2f((CS}*|YZ8Ykd=rHfLKCF0c6J!{xB3RQ(X!%Gx@?VAoBtS;0^TQ z9~>blE+8D{Arh(}#1L~ba^NmLrwcUW0!R)puj%V9^ETB76?Jnrd9ydmP8HdS7}H>2 z@Q42j1|R`wu~zubR?_AcwyYN=?-yC1%=}E>%3=hXlNtx0^jzQ%ybMezMjCHw-KOib z*i0K??-Q&+-0V!s)B-J^h&s(99rW!*SfJ3xAsA$mAlfl4BG4^n2&phG;^Aw>SuKZOJizCd)K0wu{n zC6%Z|PZYCWk__ZP+nOXt=wJvg>jRizMk;Vb%c3Uk1e}3Dda~GxZ=-Hu1h6r+ z4vzG6uszFROE!Wle`X@G(OE31?veibF2P%XWb z3gr_dkkw3y)+F%q3;BpHM`9p8E>s&u#bN;|B7qB1?f{-CQ?W&n9DobFCozm-G!+0c zai9TUg-%uVY~dnN)wVB6ftLotlm?&|c!CImLJ5@O2SDrqRDhGPR#R;N#2nxTp2ZF~ zQ5W{W49&$h(ROj$0#+UOaUnNyfkRg9YXG8P5^8Y(;_edaX;zk#Rx|)*ih&iQq8Afy zAih8v!X#~IAz(eA+3+ksxhVL;L}hbt1fsDa50O+7@S`W*fAz351^IrC4wWxQ0w?D>>TGzuIcK0Ag*dYl5B|>)`M)xGpaw4K| zB2w2Xn^z-Vw`g(rj?k1))bu0^g$^Op$di|3Er@8m%67`KbpLTwXumPT_A24XZN0O#Dn49T{MrI`PTt>O^g@DP+>4`RV` zF2g4h7gfD@j}=04{rHao8FFQnR^N;S{-+IIBMLfU6G$sz?kQb9kQmxv0GP1w4v#$4 zB#oqjsN5rDJcJ-+6W3-AP;`wSUo0#2Ovo~ zcoo)zmUFB_&BZ?42(51=m1p#Vj)-*fC!3W4}+o&cz zJFyviu^n5n5gQC9p|BtO42Xb=>(&u)?lP7^3A|2^X1b!PNY#~fifVaLR zq9TT&d8z{k;t{6RqFwJGVn7+VySw*;3KaSqt+`|jf(Ih1rl^CsX^KFAYKu;wDcQ42 zI0`*Kra=aF`i|uNI$)_jjX`@2uLO%b)Hgt9Msq#w(=2iTst>?LBtu|LuMGUtn86@= z4Mk?#ASz1(?QEbKdMz^iu`;|Z8W^Jem9r=sZgMMS8u?@``lJ5fyuakog12Qgm_c9` z%B;Jis8YJSjmzpLrcvUy%}uw>GTtQ0yOMjPggY*adqAuUy^Y!~k(!6YFmeV$0rr5D z2q_j0w^1%&4-5$hM6OZx;0-hb2QmS1>o)(*H3JNaq8$*|1W3tv6u>Y_>8y*QY(sm` zsfDgHvoBnsSnyh}We1Cghj=Q7>ujkP%v>|Zpcg!I05Yc+Y)&)w;m$QfZgrv28wCd( zLCfc12tJX|_t>;e{nSx?oXiOc@b0y-Lpm-pVDL^m!nIe`#Yx$Xwerk7?8ZMrz!o++ z8U}%QHMgRS`?yJLacJ7l^&C{=lL>LS>TuOU|Jf^5ERE@rqcW0ygG? z#{Co2prsAZJvVYazCoA`g1LCTJ3`O6ofRAm2&jTVYo7hcaVH}Y#9u4&LL*_T(7_kx zfT{k^W=QR3B*8#?rhW_D25vyC@GAeoS-=G{4Svt46yP;}C7$BDN)n0<08!Y(BTHik z;zpE)X-+_fNON5!5^=viu)TRq^FI z)oH)>Z69B11uQ@EWBlWFFTDRbY8zc9axFSwX>!%JgOWN%VD}yEAew(84D3F+oD5;C}>8Y1Af0&L=w*YHAT*7Yx=PxC80xZz|-IlVccJ# z6Lw2Rz+iJZKT4#~NhP zEc{53g%3J8JdRk|5~a%l8D)NKXw##Lg9Ibut;}LWPE> zRGD_@pdzY`s$8>XjoLM=*s)~GR&}D|N7}V&+pcBHg{(j$|Nbolqad%|yl-^X{WmX@ zf=qS8?Y&^?ucN$5<^li4vA6NRa2N98(DzTD61_Ow0p2XRTjf}Qi6DyPAgAiptXsQ& z4Li1MlmKemzKuJ#?%lk5?=~{v44AsQ6kO=`S;3pSy(AnCm)!WWy0P>&9x!in-o$k? zRaU@#-X6VRNdMKf=eynuy8P6pFgw2d`Sk1CA8;eT{{8&>`~MGMfC3IkV1Wi6h+u*W zF34bm4n7EBgc43jA%*u{h@nJ>WRYQq9)38{2%LyhhfORH^wR(<^imFpF1{!e3dEoz z2^9rpfeVc_xfqm3Db9w14;<|%5D7w}@neiaUP0sl9|&nuYbup=QbZ@nKn5L6!Wi37 zt$8UC3Y?s?icGcMn%V-CNW8rAWm}7_L1!y6hc{Yy}3P|QoWscMZMgym%#$~Cdo~oK}s;st$CTJ%XioLx@n<%=GACnd@6uLCViIIx88mWZn)x(OK!R1W{d6s8>aiA9pk(UZ@kYW`64Iqnp4SYB}fBri|qaj+XyFM z;!VK@dy`E}0MEw)3~-P^1|B`G05KVM=-^tz4@cbN2Nl~9#FjE)32`1c2}uSVX>71? zPGGL~azy_x^kU8`Q?-e6&N}bR=9_ZHsTN#h!S{oDeEs>?Kf2(B!*tzo=JY&^<+Vp$ zlSVq3dWBYJ8K#;_mZ@@2D==!yW}n?!tF1<)wyVMYTGt!K^}5*`xf)$-bPC8yS)|xO zy0>F?L3V+8c8y0~EP^LpSG54Zhj!$WOJr{4mS2u}=9+KLIp>puxbEk(xf^fk^IogT zz4_+ELJ8gUE4t_{SOSf~=%}JYkFl@T!Icn8ED*(Hd=av1y^{>QlRlI|#}Oi9BR8rkPzeG78{lx@7wS|72ZnQpBa8-yOw_L~cd*t3f2gg_32}%-ETR#Q zh(rkiu|A<&;u3q3F(<}u1RK!6iKHkK7AQ<0R%F5RShvLiR4FziNXU+QqB{w0&n9c6 z2}6WpzBtNpj$=We`rIP4vEYd=jGKop9Kk;@)bB2O$%NpJWkRQ2ErD6nOV$424)S0o zY+%zA5hS%MB3vSZSnQ;SFu0qKfKoTWsRiOpfGNTu=O5#df&!NX!nz=ik@I+iK=S`4 zwLS^5E`h0x5)3zwSisUUU;u*>2;jpEamACOOQJKM3C(CqbD9-mW^9^h&1`COo80W? zzuJfraB7c^he#^ z6v`2|TxGEOl+QpRu33w7hbdCnCuBbELT8#Nx~K`%pbB-UL>;0}WrEG4Ds`z$ZK^lL zsT0+hbE;J389MK{zP7|=EC=b6pB6_*WJS$8dm#*9U|G1rsK=~a1CP}j%Bla&Kr-i}CcMI^sH82eX-|t<1c~+_NnNdLUklsVnhL5Ep)DM%ird_t>8j~m-#WP} zkoCL)X}pX@33o}I5;Ch$%Mjq!_QKe_NT3(Yan2+ACIRH=gHM+POxa}H&AtMFuYG-0 z3=zk`$uv{}jI9iJnyZ%qyjMNp;nN!gm)P}G7LsITmLo9BILARwJ~#vKeNv0y1S@#K z(tK@e4GiH3OL)SyeT{8(i{T7+g}3UNne3pO-tg|1>hQVYmvzgC4E(dc+%xrG6o0)1`iCkF2bgnap)5kt`R%MS# zo5wN$+2Z;wO_zXjM~b;)=mszbP>2Hqqv2+k%5+f2%<_z($>!rXPf)z$6=it`fQVT7 zYJ}a`)si=pEPXga(Fz#A9$vW~r-g%mvbv|0_p7vF?nS2q?h?;5y&5zNd)UM-c7fCk z>|`r@*%OSj_M}?pXk+-!a`JFk1hN77y&=VveU@?i1Vdi-m&*VDDBku7uFQ@dr#=1YTF8}de1X=kz$P~wta2Ia9e@%5#p1k}wU(CApRO<9h-cX_ z#R}l{Y~on&i5Pq19PhZ9k)837i+tp>wJ@}$jdH3|J5G59?f|^1fbt~m+lMi$(v+*5 z6+^8sgnRd_iv?H(G$4kSiuXKJNpF&$jnkc;2&-%Y03$@A7Gc9>3ipsJ>x8t`3lCMR z*ZL6+}Gw)y2sxR_qY!gl+HH=C{s8G;CeAn(K{pWyd@p)>|+0V(*?3B)=0e;$vGjsAE^sg zgS|Qfkb-CAt7w6k_0lH9Y=4mpNmBqWJkKhOE|&1wFU^tUaxcE|k55Fp|M&&ENXIH# zvjc9_VT_!wKIio=5Wf3;`{o0@I@>1}fj9sR|7DymaLSqe2F9!Vjm3A;3Q2ThMjux{ zXywO-`J>&`dMtHHXSe0RL zh0+a8hAj4Ekk;W*>Y)UM;%Aw#2O0o~E@MvOSdKv{l!l0oPPLBnC>tffB2a*o8R?X; zb&o!&k5jo@KGDE3tyl*K>wr5CQ08I9&qsuXk=uz64U zNgJsf9XWL=bZ{sHXos`Fs-bnzuO)*U*~G`3Pi^5OQgq;1!i@ zM3vj=CRT|@K$w*SKz^pML%Da54Toj7hm%voNQpI4Plza!WM7!k4TH6H3ecBvd7T$R zm$@+;qX%y>hB&~2WA7FV4G@qAHvs-L0H5Lx?jR6|bd%zSLx#gkFnJi%(F^Y29y3Bi7vG4FAj)hc%Bh|Dajx}X9nw0l^9)SDFTnr@ z-*5{~VhXrG1sZ?^W3s9PkOI444zFMXv3d@)AV&KVq>XR_bRZ4o&=SmN4x5kzJ&*_8 zP!2-S5J&kDc2J}d!35us4wkS6Er18aZ~~Ed5FYRX%TNwYX{Y6?O;H+7RI08|!H?kC z6>>0ybP*2m0|u?g8H)dDSyb~Zb*LBI5f0N~3a6$Q4PYLVVpgd)k`O5w`p|#9Xs+{t zr?nv;!x%%c;2iLmQex>Vva%q-f)UgMhC7B=CBAkU;`^cA_Kq!yP6Rv zzzO(b5TnYD9wDvEDG>3v3Q4gLRx}YQzzR|Ouxa~LCMT8a>b9R4G+647seu4rY8|Ek znKNk|xHf27Cqsl0En%ksMBq}+F?6(8Nyw6n7^$|i5wV{a8^ah`y0Vub*=Uh>0Rj1^ zk8u!A_^2j?YxDm=T(i`db-|ti_Od#GTQXa-t=p-ZDO5LmA6jbzEZB%dI{-Ui3*Qhg zv$`Vb&$c(Bu4%DV;facSpg3qJObwTWGzYqhu^o1?DSwF>5@~ux=VG+C9FPPVjN84h5wY_j zxeAbg^$BTkS|}_Ae;vCQo`I6VWu}61S&TDFllGQY6AtRmPKHjP1r3_+^uV<9>v?UlL4i`L(aCrd@4{soEK{n;OE2T#m5& zAB?O-76Phk_97;X!bA(2#jpkjfx9)Z3)sLf-w+MqGsDbU!@Ur-OfU|#P@Mwd0q;1Q z<-jsrJFNmSoJ<==6Hx;!vc|jIY;0@DN=&8W`vc{BCq&3NCi{K_$)zS$vVbu)G*lRS zQ3!hc9gV3SW;H3?aW!hp%R;u1^fADS8yyswLjL+4CJ;jm40#I*ktXCn5-gHwi5Z!& zE4BZo55iQ)Qo6eJrpPDg$o;&Tk<2ApI{=le!UMnw-w+Hs-~xGYo3m=WUht|cU_}K% z!@*<9C9*Hqun9Io6ybUet#Hf8Im-e8!^bKFC$O#EDiKP`q~zMoF`X?)TwB1bu1wr= zA4Y`#8b2)yILh391F;cGR?;Q3C?f47ivj=jNzAV z%7F+;959(r3kq56%S(0)ZtKNJ?yxv=kh&A0TOJJ1aV^&L zj4coeU<)@Ir1=urFuFPw!3he^nqd^K%?i`Pjo}|6+HywPQ;O4a+fJIhDQ^H7BLo<+ zaGuHmOyg!Ah@>1*gH!MM533e)3Uo@VRE@yxe;Gd9bXnEJ=v6dE9lPSMgcC!Lf+$`8 zsSDciNQ=bPkfb$Av)px&)p|h$PSDmIzR%-r-d#SF|C}FS&L3i)AS7HLP1=q;vC0EL z2MV1Oh~4Hb!UFFI8xTQ*ssTk}L?kURCS}6oe|{<(K29CJox)7aU4bV*AY%4Z93zF| zF!u)Oo3HnWsNeAhN{-fgxVey|1d5iI|4?*Z72Fw4+{F##UX|O>vR;n_k!GrKrQsAp8cXK1IUeG=)5qcqHH>s<2&_S6f@A^`H|iMwUg~aq z>M%EZ+VSao%-drfb6r^-kAyf%z)J*ljhq20z*0i_oUXq9>%tE45$_*no-QolF8d8H zGWbQ)T6zj)5HjYM%gJFMm zJMY3>?|N$7Uurjc$<&3xLh{8+%)Cqb5Wh!<1B-(=we}AsMDT{H^VESC4BzmS$GGNcuA;=y2UpZGED(Luci|%M_P)#-n`rW!_~A|*;sUt`rclM`5%ZL~V~8p? z$+Z^}Fndk5a4B@ScG35uzT<%Y^Zyz2Un&{?#A>eIYW)-r!=waQ?7(aP`WNG|fsF+n zog!9?IR(7l>r(~SU(fpH9rkJ8_Nc-TvH$k9FI8~A^>a`6+1`(LuLN8MPseN*(qd)W z$Wh2a`UhtUIEVA)Cgc1na6@jlI_|L2{`huz?{3TKQHO|e9yn(mIyUrxHC(r7 z9Nnl(<^kT}t*Oh_`tjf8uW$SH|CA(uTe`pdy~T1M4iG8?4pi~O!GItC6fRWgPM0Gk z3M5XH_(m5)eK;H`j7X8`udlVtFH^a1_|%pLsr{sDVN(>_#gEuu{mB z4^04bnFs}pX(l22^i#k70u6LD0QK|;hqnIdhKQQtoTn!BO8Rb@J=6?K7l}5~$3l@7 zBI$xmSehr6E<*&MF1w!e?N2{zboEtOW0iGQT5GM9Ro8OFbyr?{_4QX^{p^GV3p6P9 z*h^R#O1Ga>b@o|kn~ajmDU*BdH=6_m!xT>c38&JpC{!T4Sk`jHLU-Oc5Zx{b{6{TA zDWWe}dTSH(-u(!jD&93sQAnRXYyzt$4;8pzfJD*%j77UQ6q4uy3NK=4!H+WG)SX!N zut3CAqs6OU9c>kPWRgoZ`DBzm1355VS9bYjm}8b1*G`PJ8Chk8V%8^*d-nNfyr!*| zS{;hMa@9uH0wa^K7z)RcJmUnfL4_i`V2@bz5y_>mBz|im2|_|sU4HkhZ)UWO!guYZ z^bN4=brr(XCISZ-X(A_w# zJgAm0*L-u%JNMkCnvb=ag-(#%4QSL;S5;`Do4eMxgKo%V_GOkycp+W($nydQPa+Ac zvo1K?+d?ETSnPjv$x{jo@r2v#&!ex2ZR!F4aQpd*gdgA^eH^g~RF>Q!X(GeD3d^gF z%EUqLg`QS3d#sm9{8Xq=mtM8X^VffW{`(*K{+nbDfCD680S#E2(A~^f$y!#DRQEs# zl8ALfbDfp2)SJ3chauI$&ilak4=^-r9ujFwN+#qjQ!wa*;31m=B;YUZIl@5LQ^33q z*tqIZPc((1VMW}ry>KYud!cFwxIBUtzJbAEe|r}Wkf)Gv%!6f3mf!bXM zI~`dI5xoVHf0PSiAS}u53@JW}yum{M;UGc}C1OJ~x-5rm+u^<}X)vyAFBT^F9t;&m zNUHtgVG1G3na=VRZZU*wAX3~FJ(kI$fKivbC&tt8Xa&6(M={G`pAWD?9Cd&V zCyF@^b5ueoC6LB5j~TraT*4dK$mTXTfJ>dAfCpqC10Fn3lNFGY4oCRrO(FpeRm2fB zk=P~+=$Q=`BRmW>8STi8dO=nZ=CeO^)CQW#rWpP|!e4SWtp)s8uL`xP~-Qvx8sU zVm3CQr!R7V32(?E2Q{ImH!KScX4D~{W%L0#%PG%vk`oS8(11Q80S;AkKqr;GY-Tt6 z6FqG628Y;YU#IDeXO82V_bGubo}rV_k$@HESVXZ5%9FnawwMZ?<3pVb!H5#=b-l^f zOVDFGw{YkmB zg2Pnb{t=Nywh~QcLu&p1qSaoeMpeNJW^jWa(-S_xL&6d!2NmR5loq7n5}n|xS8Z~F zD~RS&m|r43t|2^1F_MH6ksNeE)0j2nMK8O$AkK36=H5pbfeq+x*w z#-Z5R&{MLLh^!4LYgs6J109kmD*->?13QEPCmPVemEq6@)!O8psaxnu*&EKZcSavuEFo>mrJ0Q2{ zq7WCDkUJ{kEr|e6B081Z_#|?k@OfIjHDoV>fA!wAz0{MIyon1#Rg*-@R3dqs2fV~} zrjK5vT>L6cKcz*uy5aQ+YCr2`8HzYcL86v~USb%z+SH)h7u?Jcu-4qQoaQ zE0BJ?R%O2UCov{UkZEia7KGpvo3KC*LTU{$O!g+<7K)G!OBy31SvE>$Y?Gf%<|*L9 z8_baR4M{)-EZCsRD=5PiPE1cS=LF)a4fwzd-V-+uV9n>O_mELUXg$B67v&(Waf6cF zJU0u`D+gM1r!-whCk-a=lbTmFt$>iI<%G44nh6Y9uu($~*uFw_s{bP2`QpT2nb_Vx z5C%1vv?V@(lSp`4XsBNMnlCJ5!W$7E za~w6`0%8QC4mRKbG-S~Ofe+mJH95f`pkY~NsNp8{zyH7`k$d5@Km7YYWobWV2tE|R z1@)sW^%FpJPzBo>03(RM2gE7^>;usAi7Uf{*SZN7NGFFgttqpF`jvM1D1Ee}9H z^>Z@+BY>;{e60}hhBv!{$jU&Tu(zBzfjn@&Yrutq+r2)>gK9E|R`{mf!vksf24MIC zX-J1vP?pn6z16#_WKuq8GOSLp06I7aS`eM%61`$d2O#u7kh2Nb(>EhiD1mT+KOntx zn1(fAIXYw#my<4vqAr=!6Ra2?SCWYH$rMp*kSC&(pz{co8aiAlI-`RMq)R%bQ-C(P z33srLc7Y3v_z)$SrFh9Ytjm3M79ax6k%08SpzT~nzfqJq3 zFL*sDgvFZR0d06a8cV+1dIr^UJuF1B?RzF`&_A1)F>%X@I2yiBSOp4LsN?GiaeO@< z%f{T=#$e=xZwLk!IDtPH2V%&9bj+>pQ;icFfeSk=GGhT3z^pYG0S*|r{__TCc(Wd3 zEsYF@L=ZDG!>63_$a*TklN^B-AO>`(gE)!=bcjF8dWJ-BG9bvv`;!Hnh^;2W!JS9} zGDw3CoHsJKf(~Q^a4?1_14+t)C)JWjiX4G#iiapeheS{o-!rk_8vviYi7Qk-X(UMH zdxjiP7EZVZTTsaV;{ixvbcz=g|NhBn9nBp8KNh`<4$#>%sa%VVY& z&;@hYgdFIBJm`jU@UWgp0b4i+T%ZCLK!R|q2@#kE&*MR7h^v|)w|V0QOR%sgUZ~&MLh!*RB7O`o9KiUvjM+s&&O+n6NrLQsDumqt5IDj#01cBU_&POhG{Sa z4QMQM08bPQyf6Y@7zQ~QhGEEpyQqmtzy?7WyI}y%n=pf97zQUmFy-u5fBjd? z&*BAO?IIfEExq@XM#1 zQAx8c%MQHA15}oA_F>D#+=XqG9@P~ zcrwQ-t=N(UI5o2_RTdkVtP{N3z=etp^{Yqt23n}wd@4xA3bJt!$b3@KMGb}&xYSly z-L_iU0chF(B+PCwOwcKTWq1bBv4CV@f^h(cvUEs?)F+g~iCP^1#S~d{_&+YIfsqqd z=v0KS~K z$Di0sq3y8_?#B=AD;6lo(v?nIbHx2lvZZflht4J0IgZsm* zK3K*p&SGZR;+%2YoJqiz>_~K|gmcPD)tW&nh9|@IMIR^wIQW79=8425gT);Hh?A$s zbuuNE1?$V13Czfz6pYQSiAV6bBD>X^u(yN_vS?b}Xo|5DR>&8VRZ_j(+O>c`<6Rc$ zT$@EVGo00%INmi>fj=!hHSmDwZRMa*G(0>SJ(RW5EUNXDk3<|_At_&%I^WjB9$J2h zoVaCjtxeU)O+iorJ!l44h`yV^UwXCInlOX^u44pKGhl4a=6=-)4ai03q=!nVTc{95 zzS0SYO+03tVA+^HBfepvCCrUQr)wO59u~}1zyO~(-WX#{a8%*hy$ODN;ojRl3AG6q zz^fYG2^{VTNZw(3#zJ$rXC$2~fo$3%(~*gDNSw%9Hrqj&T*^ysfkBABY`{~$5^0h) z>5C*ul}x`EgUPE5;T)x6fAfocLIE;81D;3$AD{yxa3^@;V}HwNZo5e;=2OwoVGlfH zihYJSQtF(rw`7{+aN}o7_N&4KF5Ep?V;O-r8i7ZUM&!!sQod+gRj5=hCU&?gS8i+L zfaS?V4nCS?Vyzo<@~7y$@=<8Gr34KT7|U|62e*xho%w(?zCAYu>T zID9PK%_`BhDuG|{&=GLi;Yx%PLjhL!hW(7An!O2v)(IEL1Z4;W)z*oH?g>svhY!XH z*p_YDc0zB^1b<9S+eTs*eZ6)rit@_|tKCTJ?6FChT$``~!`0{>fUE_!3HX+8Cwo$5 z!Qz(uCPp}8tkM7{CSr{a3>yGSp%NHI>8%o3j=5mA>s!v{y#5hv)rr;Y2>?LfvWY|^e+j}S4MxC*}f0KoH%C_Q}e%&*wqlZRULrw zEKkW}u@CG8DCEIv%57=5hE1@rp&;=_kk7zcrV*f~fofHNJh!(xhi9MyzfGodc!eAQ z0wNUanuuYX-~i?pg%cp+X?*7cb*Ab|SUID!g`y@$hjhx52657oc`)$98`UTQr-4`&&Rgeg=mYJX~&(l&lmrXF0OJ~gXVg#ri~>ifgg!0an=rCAB7wPj z27!PB>KlX{7=gU_0D;#4AFsn8hdI6w>?vPgBv0}lQB9su&7b~jNNlyBXJ0E)4Xy)o zvuoF9hXqwMb6!xzQZR!3y$LQD26^T40djM)FMD6w3HRRYU8DkWE{YHsF}NQwYV*6e zhkJBx4L@hdfUZ6NZ6NfyT)uzIt#9ykW)jQSW3inW0jq{4TWG5k*oE4Qd`x|@W1K$N zLu9ZFi{0s_os8Ah7xvDozKDZ`#WgAUF02IeQif!h_)vNEUax6upxrAuLc3f-e0MrZzT4h#q?=OL(;> zuryPcju;dc14K}q_>2Yk5VoX^i#CXpxH=F|`9R}*%{!Whb+Xo@niC{qj-8*sHkF9dSM!UwE;GmRP= zbOqoq^0_wvfEX%7APNV9lY@I9of8a?1B~F{ME#YwRwUl2(!p08c$3YOUDsmN0vTOsxl|<3WC@WTXQp{&r(W6M2btb5V+b^8mSrQ3I(`Y!2%I?Nl?#7p zqYyWZ1UYN1UTNacjl#0Rpp@f8Na9in*pe$t5Orb!M&+zQkOl^gFr-4};F4xU@ns1A zB^E!PLrf9fcytm8qu^H(O0MR(BTw_vTd%$M^5hdy`xYe>7dkB!n7{)Q9933ZRhh8D z3p3pC0CzzQ*H{r#3_xCc6g$Opa5ITTllr3c$W}0#4u*@@u zC7jJS7KVTk1&D_OG^zU z(_Cd;Bd}D~h%`YX7(LL@G0y0f2h15Q8qq03^yLU0eEqaoVSk16Sb3M->(|8z&Xo;H zQkuinYL0cnQdy^L^;#s5F~;Ity+Fnlq~^^u-+MET*4t5cE!NePa@F++%!Q@@HCL<~ z4&_&!5cEfr16gnh-Cl#G0&z;pqyphKy{&@L_#&UY^2^htZ&CabbyQL~1mvm#rKcr*e+?M_BCiXaC&NHf5B1_eIQ+~o#9f)S#@ ze;!<+S)!$ZkeFi;7O+7lKo}O^m4$ga+#wHph!W>PuU|v?mr@{-z9VMrU@TlB6Ad%I zyNK_Jaw#7Yslt>hK4pCk(?c_I@dK}5vRa@q7tPQ{Er!tl#3m{*j&htM z9qVYvI|Ap8+k2oMMI#Y#0f~VJ+SWtBlD87HYaAQwBO@ERFc!c74rCw$9*AbCN!mdN zj@%^eEMS2hEJGYJ)E!!INERQWGL@>-2@s#>O6e8xiddYbRg}2NTP{(GcA<+d<3h!Z zp^uh*(IUgb*a-(VV;JNKi)FOoOlM*v8J!q{4RN_WJYqAO+T12LyD1!NE{u=hJj)*e z*%30*OcN9N61(wMzE6v*?~3ckUMmG#gt=N zB|{s^&{hT!DE>&)G8l71$T`cf~~`^!b8Ld=c-qEuntTq#Ri>e83W zF{Pdnr%W69IkX_OraE0B3v$qvqp{$hJLR50Ex-cY)v%OiaVS%pszZpnGI}~dN-Rri zRR!2`s9IGENaymEuD<1$BPFR-PrB8!js>P_T`ODL>ektyl`J%kD_!eq*SqetsMg9| zS`;c4rvf&x^@3^;CtB63UNozCwJTU9#+Al~Risq}%SFw)ShT)1vzpy3XSsPJOlLc&J*HA~DA?D+wkCv)s!^soy_-}IvBFfWX?F_Q-;z(Vv)q_4E!*3a zb~d@nT`qHdM%qJoA)>UEE_J7C-RffZy4uYyzgFwr@8%-^7uy{#cgbts@}l>=>P;_u z*X!Q)!uP%MjW2!YJ6@yIH^27PZ$x8@yxH>0u+*!lZfVKe{6Z09@UInQzaL67hC&O?}HmFL=>s=n7Pv{FF!QR?@a+B&LgP>|@VS)5C7z*>KnF zON4jX(w;U0QJq6ovpU-jb+tqTE#z6Juh!IlBd!&!YX$JS*SU?#SgtDUakCKF@}4)n zg*IB~ei7ba=_El7Y6GN(chveGIKlh67HfY++X{cEd0`oAa3fLN1@B*G2lUNAlA}D}6Xy-!UD4#jX5x!7tFFfZwH##08u< z$0}YPZNNi*;AOwz+0$-$d+}VrZkILO2`2Z*bF}VYMY_6~o^eP&9rO(&JnLJJX~P%1 zs3n*Y6~6v>)#KjQlkZ*SFYo)Eti85W1$yV>KJ?soPxPZ_bl=gt7i5Gqb}vUV*EIykaRbdd7wj)Q2FQ=SSn%)eVStp7ekpctS$Ywq5}|8If&Rg|ve? zB=Lpxq(d-V%?{`SgxDVo2oym)LOQJfg6-u3^+DjF?Oww5-tSqUO=O<85nu5o(eXtf z%_v`2>DuXO-1$VGyZzk<$_)0gU<-DZ_Q{MLd;|O`1mo>fFL1*y42ZXUL3}V^kbFTR zJqttxAw~QO{!xhjK?MKt0!4&~mh6BKj)Rlvl?X^fFoasbso)lp)&wS01zunnzC`dj z+~#qh@nsYjHcSYD)CfM9x;-ECwOetepc<-_3*uoOy2fqb5ez!aA5B9axWFTP12`0i zjEqA%yn+xAV6D7>E||k6I?W0kOBN4en%mLT7C936hlGbRjf@Sz@h<2MG4A2y6cBuR19Krc{xFP$4@NyQtQUh}2T^r6KN z$iW>9f*#y~AJ`;L>f}x4TO#J3#c#Z~%;27yIauG1{fsy=40J*SB9%jXQ0G@L!8p)Dra;8# z1jz7MdwpZe*a0&1WN>Yx&80}Mc+A}XT7Vbi^4 zg<|Ldw8c`$#Q_k&0%S~xlEsMLL5se{0qCZRGG-FQg#*;4jG9)BBHN9ks%>bKjxLNu z1OpYYfEN7!NHCmYR(b^@UBf0&LEe0TDd0jCWD6EpVk!cwte%H7l!JTRNcZ)CEe_#Z ze#JR*OYLz*6@CL2!sl_CX}59^n%?J{hM|7)SWUoYU|eX2X6T2;X;ocC*?Sd1tO$OQ&~Dr0ggT>L;Jm}+UQYRkH8aJZ_%bR|Q;$^ZnZSDZjX z#0QPs2t!OnU8bT)#0M=bh0fNXG-N4UdPNaZ1TKE*0yf^5#;3PZtsa4^nu=@MwdtFR zBurla#iNo%rCMse8UO+0tG-6*>5jwcHUjXlK=~m{BRoRVg2nqaZ52RPECS#y3Fa+KGOSb>0N@V) z?t%Kj5445&^2NuB#fYBlirS>|f+)Tt`a#B9Rw=m5YDXt<76%3ldXL{AY4 z(+E{NX@<45z~V)%)N!5!3Q;j#|_ zFeBaCCl{!%Z4Sa5ctIQ_G2|XX9Na*@s_pnT#R8n|4aC7>+U6Z#F&D(a9hk8na4|$2 z0QJJ1{0>0fVt^FyrcNGl9L&KKN5UPjXag(kAQNx_H$~kVff@7WA)v7rT(KVb=BBoV z99IPdhsB7FfLu^O$sWQ4yTuJ)@KSE@D3h{jd~lV7a9&x<7of{gIbaRna4a+bOb##9 z4qqU-ew$!G#0?}c7oTlcP(TvEXyN8-92Z~tIzR$Pf*0t(FEg(&Gv*=qR2@_DVU{li z`0*idfly&U6-==n5RDTT-{~ztTX^bj&cP6Pa$6w456ppWR)IMOu-p!CA(K@Yw}lz> zrXN%R20%ny*Z>zOvSKo@F$>1xhQ^3;!4&;w`wqa#IsgkyfimwV1H;7uz-Z-;Rw;Az zD4%k9q_R%&+wSfa*vaxq{|_zyl`UJ~)*5DC!11R>LKZl4%?z`*h%>~|?*ROOB2Ph0 zgGCMut{LQOPWNZ|CUP`afm!^(6mvmQbKts(F#wE!ADaONPz(j=^ZKg)z$6oL^X+ZY zL0LHi0CDEA4n*od*F_Z!^bG)jQL7I^gT{zPf)UhjTcm7n8ZN|iz*h67Tc2o(hBAV6 zbYWxeM~6p9*OUtp)EZd82sqxJ z@|txd%mHYNXf*pXT%Tb8r?we5BUuQxA3*gu6BxwibtDJ^T8~c-OmRWav(izc9P(XM z3`TD=W<0xvq}s&+`1K)}C~PaYTz>{#|8a@^Kx*6O9AI_D3;;zhvku(A5csi1iDH^9)KBhfnjw2fcnM(L{zhGEpKlZ z_*zu;`sOxCLd2pqcL3?{@|HHl1&rBJfEnMxU60QJymKVDwG-DfSci2~&@TeCwPQUD z#0a*81Hgi35q5iqb_eJb=#m!@sCs`^dkZ;@YT23@d7BYMh=JLX!(7iH`H@5UlS_G& zQ~8uzd6i>%x%PK?mEjM6Ekq3NQhSC2sIQpYcu86BhhO-ZtM4Ez@0o)e0d%%)x{+se zz+xu&0Kj=kL79RB07f&W1%s46Q}o zo4#~aEU#cc_-9Z+sn#*1fjMIayJuj)Viq_8JaN8Gv6z2G4qUjUUsc`>#-~aySPe6z zj_uwaI^VYBR4Z~0c$8X4%o0Siw^uTb8-}L$rgL|cO#ddRFV?8zyEm5lt@C?)eb>LY zdcO;NtrPsf8+^edJiq7qoiX@rv4-} z#q0U3N%a8?xXCsasYZgRT0o;3cUbG~032{{b2^MidcG=M|@h1puTk%k6wE_KgC*Z`O{Yk!75 zC%Ch7;PS%gApo^!z-ZW;d~Ve|V;aG4O}ZaUG8`uQiYIIx1He{q`?=>l#H9Qov_-pP zdU*uBZ9*(qbwGgHJ8~v{2=UgY6Dd}-coAd9i3Sw_ z01zqC5RW5CmNa?N$P7;BrXG7&NP0UqJaTR%{1;1DGqVu)2Uxn zUPX9g9g(U)tp5GD!375n42*i-q@Y9p9%;rLkWt}9nI1v@=*bhkM=sm}M8rrG0HYRL ziYk!2$Pc|c3arnv1`pc{!U!dtkirTryb!|-HN4Ql4z&`@!w^Lrk;D>BJQ2kdRYXcN zu3BVqwHRfbk;WQr6s@({bfhgdE>P3Wx&Z_l!ZAPYkPf^g6}T>>B9AOi$tZ)wjs?e7 zLQ={sX<7gP-{L?pKQAJAinoH?gHI-k(xfkv`|!)p2LAlJ2tWZ5Bd|anz>G?u1+7}q z#0>=m5Jd#!7-OKQlF>>ny%f_-HQkiO%r?6b)KEnoHO3ri+i^DA za5D`^iJ)=^|hM*2|kJgwh zTJs~8+#Fy}{-Cs|PR8)0>M3P)3eHbX9aI$Ebk$v#-FDs0%UsAD_3#5yjzOjpN)I|g zi(~vfMiv_g<7AwI&8eg^PR>~+-i9517~)M|)N10RNWB>2j6*dQRUT#YF*jW?x^C9S zhKNMuVl}!>kjIuvS!M8gz2nGOQI0ld<8W5s*hnxC7pkd%5-QDUTh*v&`m%tkAZ72U zqNSmV@^(Q%fYzzJawCT9-LAd<8tkye-pj!jqPWBoA@m*KgewTS! z(+sG$t*F}p7qr&*^t7fNv9Yz^p8M{-PuH>*(zv7(wAD7K1w7y;{}N0lt$VN#H^86+ zx)G`u8Bn0eAqV^aqLdQ{tBfYnak#F0fED6kTtY?=K*(Vaf)SJ;iY#}P3MPbe8Ps6r zJlC<;^yo*po5*$M@R;C;PhJu6-ji&@m7TPni>EwpbAgh-pdP7sAb zOv(jsTg2KTW49EofE32ifnyvsC8n5ssRsskL zPDo=M*Jwol4ho_$1KMF6w-^9I3)awrDO3awb?7rFMFLKo^Bmk5XhH0dj!ldLp!u}s zLP#)*U*HoL1U<+Xq%jROXketkl<7<>Gf0bJ4v{(4X=)VNF%Uj7BiE7SVtlhnl?nAR zs1xNV>Ex^0nXH9ORnxP0$4im`PnAX+A`rE@Rr(}LCvVD6^P+}JChC$Zey}Q=3iKzM zUd5PkmFryTilHvDzybqcrX`>N(}f`65{xlog=lOGR$0lO!=VMN zk{!}rTk+JDzaJp0LUiULSU1V(5#lTNJ3JfGX9~(&9)g}$ zRyyVKP77+2Rq^}F=z68D5ti_TDXf+*8f34-O~?t-Fo`ulmNA5-3`|)NPGjh6v5fVX zHx`%_gkED4Lf}9iaKXkt7DTfP7m&fCPe-V^R#A#u|V?Fkpb#Aao!`9Bj}6I*g+n2VntAUHV}E zJKvcw(^ZI`2Y_8aV^_O7`YEeu$Rq?fCJXSbA(IYZGxd&gX5(#)85GUbg!D|7yu3kv zkG2q`VTC?9xz?Tp@ulZcBzg&65Kwrj5(ndX0C9Kx?D?T5QKNAy^*3vQs+(4`_hi`9i2mVH(lOUPWIlc&EAz;#XK79N`x9R3ZP| z@IwX~blnB&$XFMNIX323OHErjTDd5{oHViT(!EH*u4VyPcw z*d5o(3zkt1m`>Xum$f!Lb)0P$L^QVFpas|yLO=r!ydZ9G_mp`I?{#7}v%M&X{~ob0 z*wWqKzaD@^&)HCdCmivKr*2pH>~O~$65^@)SO_(~q>49(F%3SsmYC#)#%R9sAQyRe z7!#*Tk22-HQR`Zz7(Dsz>?o~F8Iai2tgto>LDk>Vhvw34U>SK4SLTJQg6@C5l|OTbAAbIM#b_(*JjZ zR9PWnM+n>x@`wU@K*|OQ{8c0yTkk6#027bT5TfxO&j2?k@_0nz2(9vzW77_y(G~+c zZl;IKtKuM#F(z>HTu9_hXEDU&^f)Q?K;j0h$~W?Bs$kE*dEg-s4*mc;5jq-gid zs`m=x_n0End}jiS&(4$&2!n8JW=)Hj&k{7OAkJnJ&aaKAu0yhK{;W?cMnJO?;p!Bk z+OUr73StL-L4YEl$@~J!3W5j50UTCq3?=Iu=x&}8f$caU9b`eY3?c<~!5plxAm}X- z+^-<^FDXRe8^l4d^6viv&=6s501u)750DWtCILTa@+K}wQ~)IZNDnc5i2|jHNg^Q$ z7y}bGFn2`G;ufR9La>HL5GSl^=v;5AWKRWK&;>sNBpl%O2JAexV5g9AY2%WDW%IFf7uu+__K?F_;5dsRcB5}q+5O2T*Xw2Z)53>;H z9A2RZgbcV4rUrV!9B_dO<}e|IOt%h#fb@x9eqmu&3!#c(4Um8pPK)jm=Nz7a3N|1i z9zh!Pk&KqB9NORpybR84U$8CPOd2M6td900RU~(S=Yk5=sz?Ob-Qh zCk0)xzi5T6V9+FJDLOz9As1pQmP(pnOcoZb4sA;15>wq4p&YPRcP? z3qk?v9LDT#OcOO1LNTyFN3S6gY@r+i?jvQ>N&kp8`>eWflS)fvB_qy}7?1$AluNtx z&?u29jKDCib2*2lOV1Qd(^O5@lmHH`2b+X24uDK=hE40#PVW>=8*NT64lo>mD$5j4 z165Gb6afGLOhMvHs%Jl#0w@q*P#+ad*{bIMXt5-uGAcHWDOlnF)^sFpkT7zvDGs3n zfCd-eQ}O5%RZ}$xD?=>Q?I;jm#jL z4pxt%N*Xj)r%kk))taDzM_IE?x1%@f;>;61BeeK zo~S206)-?GRC7RCTumz-;#5@?V>9;FEQJXhV?ZTiT03@IN0wwu)+86sg1}W}!_|YZ z)VoN-ARM3yW|n4WR!n=NK!~I-4q#pX+4TUHpbC@plic6X2X_i?c^(R;B0R|Kn@^nbM*!ya83sT z3AMrj;`U}70BzkiS0fMu+IF7`B5wm10}6s|^%iZzg#rTiY&~LML1Jmd<-Mqa)o$Pi zeqabHcL*dlB`_Cre+B?pzzpKR3_^EwM->2)fOJXM3&O>TDAizbuP1UqVHegTZh&Uy z;CAmIQPZ;*o5BxfmnonIK@zP%4&hH3B=Iy>d6zfB@a$tvmQw5F}1*)bXsx}g)pesfo zearMY3dD4BP=5zteg^<{oalZRB!=vk6T9LDgi&6*GE56X!HlAOYc7EcgbO@^flKg$ z&A@fhgJ)L_01#k)0RU6eNa{cp;$H7Zrnjo5FpuHfJe#L15*8sbakFcP02VDGp#!7o;{9WLEGuh6*@^ zeK&)tVu8_EWMfu>y7>ep%! z?}?k)nY|~9vlwDRQktvTVYWCayjYt#LpQ&7jD5uy&)665Uv#Z^8ILd7iOTsX(79p*xp?gvBnnxcRT(5qhmgrwE9XFsi&cEHHhd+Sjtj&n zJees5S%E!blRa1~gE@ptLS{FaQA_xQ1v(N|FP(!|QcL-y3&ads#3T+t2i|#?0N{ox z)nWf)DR$5!=vk2e2VoA(U=9WW5wy~DO9DF*+W4Lssgv4kqS>08+Nqy9n^88Kx4DbK zn7gtRe9KszEA|eO2y?5z3`kj>*%>6_ctPSBl?~W_kCUspAPF#c3gSSl0lAXpyG`J2ASnS*n= zru||mHad#_n<~rzC8naci7~hz9Kr=INtDzgg z0o#qMyCCE^ezBV=w7Wp^xWp@)pTQfl|Cz;SG1khv#>E@9W4ufio3YzlqCtY9H8{Qt zgtC2HD^2;nbvwUV*uPI($;-{&D$K;b3Ieu{4(NPWkFnwN5ddS{Le@I#Q8kMue;b=e4e*^ z)aBLCi(HWtebE6J(H;HSZzj^09V8~5#w%Tu7bMBEoyj>Jzx8`7UD&_#T((i!)UiAg zSluHq0Js0!4{X~baPifjYu5YS-?`|{o|iFhUDpfV;3-I|JKWc+l)39%bcj9Mv2)Mc zmm!qBfOVQFU_9by{JnP^pwpVKuf4~8T)hh<$f?5HJ09FGTIC|%zRlgq(H+!LTGTVW z-9h`x{{e%2jQ|52fC4Bs&;8&BD8KQRD9*&dU&kOjDn?mEWo#Q9^+6|e}{Tkb!z2vFld2JmMA13yO@HnV#{P-svR+>PvRt-e>A7|5B_-}###`k!C=Y4-Vb_F@|!`}_UzBO~%p#JK#fL`+j5 z{}AXL69%;&h%4Z)VOD?)+Mf*Y!15mk^9fM%sWj_fR@h~~Ks4jae=VNupann{-~4Wd$+?x8HDDQ6inBDHI@cE-s*x9YX)*tgimE(V2j|Jgs+ zD%mE>N%lB%!YO}XC9ckJx+};?mu?3R72j*4Q^%v>x%cnj!;2qpRs~)2ZdIsX&%V9; z_weJ(pHIKO{rmXoJJIojzyJOK`u86f_K^kFMd)#*U~5BMRL}r(T(r;tO%0I4MHKa< zAXglDlu|=0RR~o>C~2sYK?iOKlT0+()DTWaCB&0YAOaE)JEwvfgpon*FIS)Y|zCMLZ_ zd76}Dt=1ZxaoIr|ooV65R%Q9Y~?5FsHB!^>Z$PU7vQS@38(`XEYxRUMhPBuNENRh(&GRPO7tK? z5=~fPL=t64Ba#|*xYLITg-Fr>BPLYhu>-BdB(fK=C{axmUIe3uCe|3#P(^7Jhk7~) zb;k%g$Y_HKx*E9@kkJk#6#!I8WR+I(@{4UoN?t3FQvi&`>A?t3`Q^e4H|+4k5JxO= z#8I-K#U+@`L5OCUM$v{219;ZSBHcmxCY^F74BMRt>q!}*;lZpNbIxg6=?xYRFhZYj zMaLbcDhDm}&}e}Qm(gmWs`S!KH!Z5Ft+LwRfCZvRtBWo@WDo_r|MuF@gAoRc^*|31 z+mNwb-H{Vg$~H7(NMjES?Mcj5YxPlPysLu17-`!Ow-|l9Y`D$Zcu|f!Vr0fr6fAYf zA%+VSN5L8SNUxCi66tS4M-FsHj!XS;V=okOdPh`|NN{Z2RrF z+YW8+y!T#Zlp~NZ2oxx6oCD7WT}oC6m$ZRAc_+h}a-t{X@r!KNG?If^cGgDL3cVmY zz;b~aL;@$@jFS#AYm}@O3d|*9Rs`b&!-Acy{Nc=TuYBK&apfqB2#iC(aXiB}C&0q> z#=(t7++a>`(M0*mvIAXU?-e<~&JJvmKG}$G02`D|I&iT)|MFByd1rY66Ql!&FAM=_ zm9l_YPVj>1(BTLWJb?_R^Mxcpkaj=};#`oHp0_ydh)7K0(x4`_sOjK|u#(l?5EQqI z#9?kY<6BaA#c6#r@9F z3<8>C5!(YF00me;;~dZ+UnpQYR)I{l{OOz^ltuxAQ8FHAqk!Tofi%uxoP9niI$(&@ zSw7%{GQfd4bSUBX$Y3c(Y0}O!OC`GWr7%sE6PrjiTWYaZ zFUevg%rF2*!h}Ixgph=)ST+o`5hHOpfI$+sqCc{6jskgOL*f{fKu*ymIBCfhZJ@>h z%w$_t6dWL->c&AP1aTU+@Qrj>Vht_812InEz5#SkQQ@muHx06zHVhyNtiT38*#d_<(IFkG&;T6v>4Dgc zV;X(nfF{NPjOT&xnr4w%Sze$Eb8I39J;*~h%5kQ*Xm@<97$Fo|fCXtZ#|9~|#W{#U zg%KcuX1qPeD}>O3D~w{eY*|h{$AR7KfK)npumNXCzyu`RAO|U^s2FMsQHhep2XgPP0}=wQ=>Q zT=bO}huSSTLd2+K?VAHoW5{GVbs%p$|51^rI=8Bl)mlm7s~mLJ)vx|7tWOq5l*Ki= zgcQ;xe(>u+NI8?qT{0m`sU#c|OQIp^%afcdk`W#$tvSTYAdVZXDgi(vB?)A)5+Nl3 z(D+zdR;Fqx9vWgSyV*)x`qG%rbYAd8Od*^l3X>>PX4+&j)Jkc3aH1w{GI%L+mgTno z<0dNtbtpBAzylj7K{uZ9L$rwC9JDwAC!|5pKLjc^(^vy%2KWpG`>(*n0q6*L0BoKK z8#yONiv$Zb0EIpS1Dvse9rif_5l90Z8W;f!4plQcJlA;;$#z);Tu*4HWl@c?Lmqqs z!AtGX3T8QBSyO4cQ^R6YlG(8qcmq8p-U zXCCc6k6w?9@%Cp{vPm4l23XH;&|(Bk z7)Nd@k6#UZGkw><1rCjH)hR3 zR6i#zLB|!`=K%5Y5_=>NeRLCHwsTizRs(TnFCj=ibq5D<0C2T{l(cnqCRkpFXK)sF z03Zhfu}b`65Pm>PchCWZMQ91}I&FnW7oljM0(VJ6cjdu@WZ`Ju$0>a`ghW_`Mo2Mq zLQKY#7Az23n(<6{f@)IIcpsD}*)#y#q+7El9G6!>#Xx)m2R_db0pgGc<^T$s0D88i zdt||E&Ng}W7JHF5|6t~@3Yo_i=S6!31Z*QfdhBKp9&iFtU<>=RPZH-EF@zR1L>-P| z2LPuiWDrqip#e0sLLud017LlOQU-RwD0c7zU>Jm=7$xH8Vl8EUsF;fEfqpaKifVL5cgbt1S)B#25T=o6~bI4ejYRv}6;NF#7X zf3LF>taOM!7#};R9!2AWXsLjbAp6)hK4y_;hAgEwt}n!pXV01VU=4ZH9R&J>ddRFbH77LOne#h`3up-|Vr zOw{QXa`>LTU=G6fdL_`2jSyblFb?9w3AoS(EN}u^@C(+Elu-#z_2w4NcNW%%1}s2g z(!qR?2$q%CU^qiVWbiXJLK^b+JaXJXoQ=(ss0$S;RLN;;rbEFhcRq9if+1Kbz~jpY-$DG*5j z6r%KYawnYsD3HSmDv-saaI&1B8mgi?gi^vhp>e8avZ91=s-4gY90P^Xw4mg{0^c+a z3^fkYFb$j`mBvv%+G!l;APwd70{=rm*))3|B%+U?KFQ^7Y`BKIS9%7tYy);r2EhXz zBpdg10>5faCR(fnBtA`vP<1c@)Z|XKfGB@*p|X)a{AofQg+gS3mDIsPkN8p2;V5Kq z29ZKhoS3h0z;GR^iHss0c;KlB>m5G&gFq^z4*OC>>O^-rat0v?CdZfCh!Yg>|BP@Z zn7T=r3PFHaIuKfl6kN(SZVIN;NL4_mvK%Wn8Mmg=*rs3Fbl4aP7KjlqcmOw0i=e2Q zdA4#*(x>NmSLrAaougQa#!5062{u8RgT}M~U<2_IsniG*ZkHay351)Psq&GqQZlMy zJGNwdS-^t?p`j*Z!ZF2js*%tJH=v`hVVzKdol2gN|zgI@I%D70El*<((^aVbb( z3Ia77-eV96a6QieT67={)-X;J$};}hY{*(q);a*yvp~~o5Y@9k^VAkyXdL2`K!Y5C#!8g}Jgb2aH9RR#gC)PFAyI z`j{;nnJ?=H4Ocp)V+1mrnKTP7HtU&@q$Ay1IRG$Md|FqU(@C3i2yyU0H^2o8SOxUx z!0O__68wIVsw4-{ymP0izNx8I18L729%UQCA`B)Y{1;I&DJg8QgVBIm=eU5F)3=n0tk005qW$$fHO1Na6;U~Y0+>t zfHO1v!C1UfL)5U;+r>*{y+yiy_ThHl2!9ycy)Bo22jPoX+JFC>|1BvSneJr$w8BM>|-G{KmO?FBfd7k~PU3 zY#v-|%9WwXagb;=C!bJ7Ce;&hk9Zse#Hlp~|eB&-mfWH73UPF&1S! z%iR0Mw*0YcY^6qam|2>by{ybq7R;D5%)|^>czn!ytiQ|L|Hn8BniD-(f((vCtD3AC zs2zQ1_c#zb02Fr^DwGV#!AYDOY|r$Zkmp>}Hf_%7Y--m@ku#ks?_5vu+|xom)I}4$ zET+#$O)C5ha{M83_aRYJV8#RezXeUD;mgKGHnJ1J(EsAgoC(a&BBl~O(Z-C-39*?H zxW91P%z*sNLrcJScFjpU(Q8+O6u>RgtHA;J(t5quUMth{eA9wG*qWTv6ZyzQ4IZSN z*o;lj_FRfd9ohM@)UFam_W?mnf*vo+BUKH)2c64pY`!J!vh`wY1F?h+14!|lnu-F0ZmCN(5k&5on57%ozQOF(O#X_?HkspEoI-mA*`*LrCm50 z&DM78)`J|<1)NtUjcASh11H7J;Wykd?X?*U+|s?=2%g}{+1xHH-46cX5MIyJeR0=a z;WG7c66??RaR(q%fSO&>;SI6_5k^^E-eeu$$Ee>{mW>}b-~}YtE?Pd-Xza08{n=k$ zAqq{hT#YT~ZH!TM+AGf9EiTJ^)Y@b9+7dD2ZC&GUUEBE$cGsNeU%}%5Fa&+>=fFAS zU+d(BUhKyHONYMb%D(K(el!#Q=Z{|DRNmC3q5~v{0e8SNK)dPRE8d?T+Pi$d|6A&g zsp9X;;%d(7c?{oeUMe-U+~M` z=tmvxkPgQEJn5oB0lcX-;$F*~?%7}T|Lr9%+Uefzr+((^ZRYK*AZreR9A8!%E$j77 z>-SCXf12a_Ew!*{@I({vG+*-%Gw?E>^E&U~2w&X_f8Epm15QmU9>ANUjwD?!z8Fts zp}y6;+|?-F@emyeW2)-uUeRVf5NK`cCjaJLI_m;#<1By3E>G9A8A>}ZG&aBXY!4=- ztj=j4_i{heJrCqR5A+QG${JoOF>eqDF!9LJ}eL8bJB59Wps$cQh;=1#|qfAwt2<`~V# zUO)MAj+%6S`DOnvcTfcwu(UwY_ph%hqksMiNz;`^Czp|`Xh8y@wh5kpT0^q}sjvDE zRQ~$E|2-P}05L$|zyT@@9z>W>;X;ND9X^B@QQ}035S{4wfl*^djvIA+S0tI-uY{=}Ve{LpqOzq5*6e_sKzn`#YjP;p9A~*w002M* zQ3QcozC4f=s!|G4;kGS#{}{ktpa%eqU7DH5Edv~ z;JI{ZlTqrm4`nHzKBWd0EK(dZ)?NL4`t|MK$Dd#Se*XRa|L0Ey+ys1L#{ zMjLO$F-IMDdgn zgd$Qs1{qMe6G&ECk&y(YFQl194fYHrwpe42MRvn6XqFZ^k)ios|P}pnCgCa*{S|;6PL;(bI5NWBSMe2vmK+cpz8X8;Au` zY!%`JBns}XhFWj!0aat5kdK95gPl2Twby2QzmH>k8zq?M=GNqDGm?;Qz4zw3Z@*)1 zJMb5GCcJRN4@Z1a4eJ%6Q$iZCfdvwp^w&Rt0c_!FhX=61Yhwsv0pTkJ(m-q|a_FFP z8IDneW zTU=94^(9;KPsy_!X$(IgWnfy3S!19PriQhK@V~}&1XRVZRTb`;r@wytligjV`~^zB z|Av6C|5o1oH$Vaw(0~lOUjoZBJq9+=fe&<7_3Y)Z$z=yS;R(-?NaZ~Mfe(JQQbW{2 zSEbPjWCU7UU+gyUKJg(#6;V@Q3}rY&80}APAv>V|02sWF3=d8@1Y!_{SU?&U5jGG+ zViJ|O#2QHuXxh8r1+$|;{#@=qC%9T7a>w-~?iu%IZ|XMIrQM zR7Qkj9OXzI8=l05Lpl}4;1?{EmnzUdKVKBQ$X z|8=>`Y`xNmiUejbg_%SEg#d%c+|B?-RkTgKaX(h{&k0hnzJbZ2HLHUkGfvO}6i|~^ zYh=M0;b)8-AckPx2i z6f~KjPecqMOMzvrdP#k##CAmmeMp_FU4Cuy*gI1`Z24_+i6oCT5o*i`w$KJ&XwZDZ+;(0-t+d?zidmd?&fPC>!xhL2R?9yjMqy2 zHrT<=03- zZ=+%Tg}7wx-D7KQyyMr7xOjq8agc?)E*A60#WF^6l50cb$MV=A9)7QrrR-WC+jo#d z#&VVwRpk8~S;=1p^9^T=+9@{($1ufinbi!l5;vsH(yDUrfUIRY*BM7#){mFNyyq`7 zS#E1a2$X*SUqBanrg8S$iS4{-Mo;H{Z#6Q7uWE;JOoMEE#&mxCY)3q;x^9|xD>F4O1x@HvS9_O;_U@Hmy=`vuCN^rQLme(%o)##H|B3>+P82V(23G0^ z(p{GHmTG5ycf8}T;R8HGE^=~E;l;7B&IQjs03i`HJVQHqecqktcz4MTxYqSJ zc>Nl)aEc%!;Kab|BcGuE`!)sV5DQ*V28Nfx4h#>14Pp-QI!T;=6xYE3&MaJvcO8$| z&UPFqyJ2}dCn;;FTNGneR6&pHr`pjI`HRsaJ>kXrO=cefS`8%>%q3opl zgatAn0~=1z8oE=RPF9b0nJXS@uU9^YU=LU16~b|{cYe_-|4{?lMNf_v+@?~O`kBvJ zF89XI$L{!_% z?uft%B!dbR2n>V+GOzffp1#RS<%7 ziVYqKPYGcERY6evw;+_g>xVVlS6{R|1-Fodj%nAfh!mVWQ+}81H*CXM%mEA zlR!W+fP*7YIx?Vx92kK?bR-JIm>Q5sCpZBVKs-E1Mn{|vNW{8Nqo*jV#FR{)OQai3 zhvOExta z0T0-K66l6!m^u+S2U<7*PLKvS{DXm`v}s_sC=9>IDZ+#t2zFE^9>_{g*~(xGNt9?m zqoc!Tz<}>}Ov2LuB`m&czy&I>P5pSx z$m~Tj2t)y-nu>%>fzV8hVZcOGxH6!F9}rDV`@rccO_S6Ju2anm)f<)!ByEGu4i&HU za6wR{he|ks;q)0JX(W_rkDvKX_25DK5K8_?0pm0{*GS5x6bN8^&hIOR{RExfdxi)Q zhdeL`P|yVI902b0zGpDYUgSoU|47dvJVN zkN#vx0G*eUAkaNLP|W;8MYMw-@X-e?57I2O$@?J;)l)XpxQ&w|4+YfNRMC*5Np-N& zoYa)p2$hv{MGcA3{RqA+e2p75LV?(UUl_O)V1;s^f^=$9*U;2*u!C}_0bRfaRse_Y zP}1-_m?uREPAJcziceZdClBy|+6d2qc)nmz3Ga)(?pVY8V*y(|fnQ;VeNzd81jEJ* zs)gi3Fd#)`vPcwQzzQ4zJ!g?9*{?4ihhi{< z^DNbIAcov)0ZrfrTL1q_aGv&iTgwl_^fdzEPD~KF~qXQs7 zrEc}s2vx5MHO=eFQ*i}blF?8;{Zn-{+s{%7qasuo6eSZK0Ao6)4C0PVIi^n7ggM2J z7p;#+a)8$!%BR?xFw%Ao)TZ@K8&`yIxf*`zx`OCus zeb#6lz=VT?C@6vi49pY4Kt(JAJRslVeJrgNFs`Lg))gWS19-mPz4vpkOEQkGP|ht;Rx>;`-9@FKGR%wLj=*;`*kcR1Z8R?Ry>8m>F9n0vI z*65Z7mwt}vpMI2?uIZuPr<=C1l-6mL=4t1BX`puMpq}Vf3P(I7l(0nB`2a#UT%H$D zhD9LiIxXlXJ7^wS-lWdwrS=w|e(JSeq^Q=C=Pca~;Y$Tp4?5gjWR8_Q(BDrsNGJ?K zzb0IxBM8y`hG0Nr8$H~;I~EpzKP;T%uXdKO{_+*vaJy>U z|0p-@P)CAr0iIk0CbkbJ_7Aw$lBr$=)lOQfyzASb++wTcd_&g17Hr;DiC_6&F`l=A z<&SwYzHy^qUfWUp%snYy!*U31$c7uq<}}Ji8E3xivu^0WQR~k3ZW;l((Q{eRzK$s> z?O0I~mrLz`dF2=(*({Ob0nlDER#|D_+}Y67ba;iVgHp~>QGrlPqJu(#2*>=ZjilTU zf%agPun`|_Hc3raXuDt5+`%$0KM5HJ=3!kOtGGU_zq0a z&se?<)~1gTwl#c2Rwow-I_yRqjg|7VHS|-z3FgNAvo*2Qy~HMnQpGj-_=0X|LisJe zbT~es!g2dXW<7UO2?oy}AAnq4^j#R>lwe@nb6ROS>u^_}!eH*)2?Sc_?LSABBA ziyY52hvqXMIB?G^$8zd^HtXiA9{%!O4s#$L^D#d9ash}Rcr@ONE}DU;jo!ls_C54V8*arOfgR`uap;2)|5#kdj-G?uT#AU>t{H7{+2e#@|eG zfBn7F9XLN12#TrY^U(zZ4|&}g`Kv4W93ys>&%6+0c{p=xdh&4Rb8;U6wiNqZDY~kkSxM#6ai9fQIdWe+hgzUmifl)5 zfJ&*%@hSFqwf|0)aC`RibWneLNw7_#Tm_?CVx-*rN^M7{9K7Y9%BrM01xI(pcTVv4 z`&y=#f{*+g#_$~0@GeJ5%m?%BPPESd{Qd`s8v+Lo9ANO^01WUJGHggrl?{XvCr(5` z$Wo4o14cx-gsDmn7DotSTBCs?%9JV(9?G)vB}|G;#@%9}az(Fl2w9Zqrqdu!adlYO z8E5q9xOB2k-s~mxpa_~0?VMXR(Zh>gvS-t-ZTmLv+`4z)cB13Q@8H0P3)f+s3k%-Lmosnf z{5kaK(x+3eZvDFT(`d1CZ>{}1_|pW(lP_=nJo@zN*RyZ${yqHo^5@g9Z~s32{QCFv zA5T%kEDZ@rPbDXe5Sm4nK*7`iAzadiMgv4KNgEx6M^Q@`zC?#+DN#073DT%V*Z_}x zWzH&%d1x6_9U2taL@eyE%vOo8V3T5t6%!#(-8}Qz|A&>ewOL&haVC)_=BUD;L3?qP z5{!efIKW|vdG*zfF9qfThvM{c-~d5RHst^*Ahr}jCnSlNhHbj}CY*7;w3=shuGAf# zdFmOPZ^ZdooN!$1IVhop8hR+Ai7JYloCht+T%(a**dL{pT6!s_nQFQzr=5C=A4M$i zAz(x5s0dnuIUt0@B#r#l(Hb`V)nU51Dx>4 zIl}^0)kGv9M#?hfKw*=arLBju1?J^4j9;;3=#|3Qa6DJjGeOFXfos>Spu#u=+%#Bzda z{4vNOi##&Pw@F$uZ4|5Q*{3bL{4&fj%RDp9orcOnC8WYbjvAyTxS&BApnwM^ZQO{& zB?^YCVXcy8bq+CY41mNat1u}h3pk~-$_aT$vsGasUb6`mU`~XEG+X}_)FLd9@W(kq zMOY%e2cf{pH^D4>&cMntTZ|!0?$pzd6Mc}`G-?Q5F2N|##b#bdA|%2$&$uhmALE#_ zi4Z5?LCgtEMrjx;=e*Jb+M3I?H{gOFRD&+#5F_u4Roz$uzBY!LQ)N$4-OV?^go}GQ zm#=(0^2v*4=XMvP{5*9WE9Wuv)mwi(|MuC>c5?R0doNMV;fp^$`Q@8`zI-UzV8f^m zQDGox4qh@p{gwz}Q%9F{qW>j}SYWoBnii=Md;uxn(1z6p5S7K4WdL_GAg~H^g3Nto zNSZK81G{pRb0lRIHaW~E z%Zvba+)x7m-NuS>aBv*bn8pW(cp|(|&?x7SMv+p8l)ABCfe(w)1jq4=W9iT+F4W=I zX6F_-q=OdUJ0lv?$h?a=PkU~(jr4d!y*JV^Q8)O(5R9P5J@T=Se*7aK11ZQs3X%eZ zJR~9$sYpK#;RiQJ6!)-~M(?4o|B{xxBqlSd$@-||Mrx=-9p1;V&x`}L}e zAb}9`vji1fM=O^^>;zb7hEdW%jB6=yFcgZZQvo zn;E0U32hioN+;03xcha@)8MXB8I z8_}R90L#P*ap-Q6COv7y*2tPR*0H6niQ{hO=+c>X=LUIPBu;ax(>;o1r#}7ZA&2lt zLq+m>C_UaLld9CEGPS8N|3gbiJ);2)ut1jR1m*yyy0ie&a$+{IDoQ$FA)CxCCaauP zvRDujn4Co;e>v-oLSw9~f>lx#b;_6AVm20(H6>>2>y6?{k%)k4t9tEBU}Hp;U`+L> zj(x0#R5~Y?(zH9M;SNl7Bh$)qRyscbDriH?#|;1g0HQr@Xn#P|NNEqU6LTtTV=LR) z(l$M=Wm;En`<-Ozwox}K;4{|x*rEe0U&@-;;mkPC#BvEbGXAEu2hCU zi%cZe&fQ*N*b|T71bGc0(5Nwx&R@X3-`As-R$(aoTf4lt-EKd;Q6xiX*wEok)mSt465G@=u&=tU0H`O6L|;+C@pyP#AlQ-dL@HCHL6ps$weQ!)UJLttYaM-M@t0KmL}PxX;bN2 zcUHli9&(+3|Gi)el(xd6X00S;4L(&fyV=f`8LM-v>}gZG+Oei}jw#D)jpceayWTcU z|H;Si@d&U3DFB`3Po8vi-agWl-o&WYq03wdltZglM}mpHJpS>IWK4m<3}3gL+Fk9PlfCTkwz$yKuJ*MB_|gl7bl508?$>Mj z(^0O3{~*|T>Zr{^DzdKi!Oz1CUY|MGpvX)g^`YDoklx{$UU%`rKe&VV?U5XepdQIVD0G+X;Yr(JnC-0} z{|v_9QoY0{)d6yaMhm0?|G=L?OvwJsU(wj#o8TYCFwRNwU#J{Jhyb8x2w3R+eR zcHGp$q&0_?^QvOyfZeBtMyxoU8yDqyd->fDh1t4#+?O!od*$1sRNiybvHAM92#; zK>^ai5x8SACgTGZ9W8c;EUqNe*<#*N0xoJG2cniQ0#zyyBO&?0KeR(l_9EiV-bvn9 zGZv*$whT(BfzB)hIkdoM+=vA@&_yiBRt=5Ptk`#WV|dKS6#XMP4vtUM%ViW0QaqEE zm;)~u&?;DnaeW128AJ`lf(m(MClQWBJP;1$)!{6L@x6&dra@F5#0bCu{~h=M92B4( zz`+mLfJ1)4T0tQltknyUK^2k#9KeAWMC4GOWJ-3SOJ3K%edgW4*I~Ze7vfyUE*HPA{ZC(mRYydRs3^_=`Q`*f%NR&iONFz{HH%gnFfY3CwK@Lz& z0yWOJoa0ki)aK+s59EPQNTOpH(KPfy3uMkSjKE=}11>;83!shM3_#{gL*Q`0Bb<;~ zE#a&%!8!#FI0lbR%!D{Jf)Kbs0rh1{z>`0s#b1Ki2>5_yYQYbjfMF`2Lvo}|kN_Fb z!3P!K5#+!LSfpcOc7`RQgjJ5?5F%%sM8G&C&W%h}JMoG+iscCKK(lB> zz{CZImWb?xL_h{429T8_Momfoo3eP~LM=yi;!rAiuUW}r;c zz!q4+55VXkMOY%Ss83~q)|ucRWkEaqLmUDUsp1p>s9DNPhos`@j^?Vax(7ul#E;Sg zIfM>^1gCuw=a_+qR({7!)WoiUrF0HOIpq?X_zOjyMHTrH|GOw^wTzOQhKhVPj1ql? z!kEdE+^L%sXkHj*ED6-wY-C3kYDmaHWnQFZTEVTNq$^fxrbbU_?yK}|su@~=iqdFm zVwWFGLLVVQAAz6<8Y8U=<-O|Gu1+k)nn$nx=*~cdX#9-p3=JkAX_7_^hXAMyxf41~ zslgORv}#U@Xi42njxROK2%v23(4{A`sWmMIJ3s+%nQNOA=wBSDVy*?e8pcHG01H^8 z6&9crl7SVNWW=%^rJ|X?N(ZJ^?F9mC=vl#$nd)hQpc@)N79@k#DXha*muyC@YgH`U zvh9EDCaDkz{Gdv3QUq~EYE~-go7~Dc|X1c-wq>_ufqEHz`X3~;@7u-M&ye{6V zZQ4yOMPO}oT&?Yrq1IMk5Ts%3t>J@Z0SLM(BGf|G%>%-!;KQb^>^fH4KJTuE3L=t< zsf-54-X+n1Y{){)(?reGRL#|xtUzfE*LV%s41m~>jf^>y2R)0;#;G~r!n#%>E98w1 zXaPjM>`Hv1V6p%lH0dDZKuA4;>`*}z5LD+*#OLboO_-u_8iddW0S1&66xzWNWavl= zutU-T5(H-RY9Z}DTJAar?v8LRcGoSU93|jD{}5DxsA6BidROWV-r#A2_bD&h+UN(P z6!iA6j^0epL}Smy5B(G|58f@rB&&81kO3jkNqlYt;iXZ0Lj);H6CH&GVbH9o>92_E zWiY`)eFHCiL*!0{FS$@P4p9+#kwJt=5uL*rCvbTD<^Kq#y1EVvASeP_=7b8c1}N>) zl0hEC?ha#I2-lhkGe-$0GROfe-@R}L9+``3-8dveDBQ4j&1w!KVLGq6F#G7c36 zz?knfyn+Y_^F*wy@sYqNER<$+lQLmL|1iivH^?z~tUw0f0RRc@Vp0SYS|J?_!9-%| zWFFukcQWN2a*i>wax5}D9}4Jofv@!)@IKfiWL?+-+ww9mJD(9K4|Fqj5)0IzD20Yr zfz=2kRub#2Z)H_yh!rKOq9?K|Bi;-lo0Vn?W(RmcVMWUNgv$tY0Gjrnw;ae^UDcQ6 z05=8n%=2!@GffkUz|BC4Lh|^{nH&^e*Zwmn!!#NZv{4fxRK*F@&Js~KwNopP zOwaU9--b<3bu4;U67Y1_=CiqlR;+4r`8_rA95q?P;O?zmi1?CGJd9Yk^+`pwP+N6u zRJB~QWLLxRU1xG!Ux!;KPg(zU|L&c2+WDVavvpq|w)epGCW~6;(RE#4S6-uLWM`LD z12kes3}9!r;|aFVZS-Y-_R1*sW7CFXk9KuTwjagnPI+xtt9Bw)whn`~q-Zv6lO1Qv zHg4y3t>vq}nl@~dwr^W4Y7^{mpB8KnwQkEvZ7(;@-F9+6_h&2iVvja(2RC#S_i3>< zb_>!F95;4Aw{kPLc*~n}gSUB$wRBszYgD&-H^;zk_abRGeE$);0f4&2_IYc_c<=Yw zDVh@JH-O7-dbc-wxA$_~^L*!&d?z>`5gPy)n`H;McJMcaGh2B}IED*2Z-Z!X7r24* z2BtB%f^)Tq6OyNa8pLM!|94b4i=Wzst2m6`sB}+vU3>V4@5XzVc#)B~jt7#1-#328 z_-M2^kptR`3ptXr;*8U{RonQD=SGMlc#r?lf-|@SY!{P7c#?xgk#{+j9r>1r`SC5e zdOP`(wdEO`AER-v$C~m$Gk{ zK`gtoYw`d*yR=U`|Fu`UvLA$z)%UeWd$nVGw{ttSd%Lw;JA`XFr^Cdjr+aO+-}`Cj zFkb;9{2(I;{@?!9xy0{7P`)t%)%6h1gOu ze2qsn!hyikI;{biY}7ev{EKK#olX=4ON%yHw2BYAbsPJ!+Xkjfd$WH#xQ{!`$NaW~ zyAf#nwp+WnPkYOU`v7=AhriCt{IWy(o}D|Ft2@!dR-@$L4!S!FM8OZD(k2WkQ=`!) zLd;1Y?!GJGnw0_wm#O-ec zK0$rjJ3M%B$T{GG(EvdnOvBr|kS$3AyI6=38X;9A12^an@a;|eiutf#7O^KX$_GC8 zhYaTr{pW{&Cdo-PUSl>UXV0H08vz}e%V^W5QKweDnssZ}uVKfQJv;Ma+qZG& z*1el|;v2t#2Nyn^cyZ&$ktbKaoOyHS&!I<`KAn1X>({Yo*RH)cPO%mSpde%kN=K9} z(p=g^#YOr?WV^dOlqG)P9m^a()GJZ0#FX7`dP^#d@)K#5mi`h58*TEN28xRsI_N2h zM%bYnasT=l;e}qzS;U3`NMNPFjm$%-gl?W8Or-)38nC8=0(5BvPOf@s#u`r&;hSI( zln4b*3XGAV2^WfLssXC1F~ku$>hYxr#wq8)i+VK6tpOg9#;yKnf(s@)zS+bUZivdu zB@{FfClM#>Ytzj);XLdy!{&61wmb36Qw7mRD^1To0S#2pK?yC?(9YsaRMABl#cjJs zA&pehNhz(=(n~ST)Y3Q+6weaBBtq|!Q7>8Kghc0Sv?_$!$N`B_Rxyb`FBeKlngER) z;00aG*(8S^@&Hf>HeISIomX_&!5MQ@DRBTZPded`ai00{99lkncAR3`7$6E(usP5_ zmH${0>^~OA8E{r1PonXsm)w;xFE*L@CLK%GXaNsmPLOrT{RBKR$)6hH)?0AJ{i~s8 zIsy{Lg{&OFg*>F`@WU4!suAOZYII5#CM<&Xq(_Ks)Z~*`K0))-<(X-& z+2)&ZMlI!?dG6UwO@R(t=%I-&+UTQ?X4F$5Tsk2NQac$WTR2l?6v~an(m?BCX*KcI zS*03*hikJv!ChjZ;&2hBMreqZ9z~X@s&i@?hnO5jK#~=4)EL2o4NiO}?^**N3_&it zWLF}edcsj68YP)}A!}F3VJv6=O8$tA^ZiI7)~MJm(e5-zre!UjJMt z7@`^mvLWt;m^jPl-Fa`cPQreNEa%}_gZVR=iBDen<(Y3@=iZ@@UV4|1uHO3VvCm%n z?Xy#Qyd0)JAw5f|Kw=X0I*7CCMRUIe?IOGW57%C#Vj;o;(~-sBxadD}fQV0Wy8(D$ zL+SG0#%zLtajoQi{8JqK9(bd7okW80a@+t$kb+&P%Oq@yTdwqW6$HXafeIT(FlzOd zo0uhItwiRmG(8>eaAhjPjq`wr8RK~dc|kPd5s{cgLGh4@O>7kR zpcq9dPLYaL+>ZCi<1Z3)!V<$`feQ$M358INK8&J+?h+I~zJP5i_sfqtR{v4Lu7L1= zXq1QmS#Y0pt?42o+}70olOn?)j%yDbK)hgr$dl-#SuW9_x<*$r5OU6s#gH6Kco3zj z^~Xv^`Gv(`2oply@hKa6h5$2}Lnp41mBAB?D}|>-=MAwlMU>?&ahXe9VuqEy^d)bs z7))UflbFS{9u`5xf~UO)B^pT2A}|-9^(9IJW+?{K=BUQ6VMH1O${j6UxDXF`ATS_2 z0m;A_z#D?dDx_G3lrEA2R+NJZ;Y5 z2cP7LJn3mq8#FK_pKMkiy=0|vHUu0u$QwUZD8q=b;1S~BL^=S568{^f^p`D#9xMR^ z(^&2jXSC#uEoqulo$i!)F7@e83u8>74wa}yHL7#4Se}JwAOx2n-$H;uh)I;Bfw`Gx zqBe96Vsz_Ou}WKvSRfFT8bulg9Dqu$u^!R61PjtY>EYK0@pNW3-3(5N zn_T5C7f-%*?sFG%ROwEay49s(qMAx7Qgx99D8R$0Izg&UVE>@1RxRVAM(~CFd_x;v zWnqEJ^`rH6b1Kqek&rZT5Ph~zLI%3Xs$$1Y2eDv7C|yVa^D`kgIwXfD`s@TlnIm+S zYlJR>U4hg!0*a7ntsW84ISwL?Y5Z420Up4#9CD6|{RF`&-VX~{nBfs504YJj;X+1` zyK9E^!ui=!j~Sdf7Od)qe8C%Zk(?;u!eq(A-Hc0^yBgza2DwqT@|Cgt28xos~nr!Hq`TfGQ<^BTrP)Axg6#Bmebd0TN76Rtf24!3Vk0kXiAK z!+!N8@68W|f!w00RM>wfz7|YA!k}?TnkfLjG)g{_ltw(_Dq;b(sP%Ia8dD2Y6LrBK zbp4HJFcW}!L+J=c_+u8i1zI`&M#-dQ5iXBAK23&lo3gB@DQBk2pBX^9;XSB#$6Gbz zwl^!qoNs;ao8QZclh#-eSeS@qqKc~XqAnuvzjPpd7rCUlP|_n1vVe7gX-T&58FBa= zW}E}q8qWw!zYNJpbS!u{PDJC+{pUwN zjnFSc^wo@j?QM7a+uuuEj>Nw50k0fX0P%pCJwaRDbR^7YQ=oa|)Zx!FyFcFU-}Gjt#4>tP>z z+0UN#wYUB4ai4qL@1FO)_xAh<@}x;w$#SUwZKK&@NZ(Z~`f?0xj?YF)#yt5C8bD13mBq zp~L^qO94r+1WoV&6YvCkh5-%30R_YDG%yBba0Y3x25s;LC6EI_a0hv?2Y*8ZRWJyJ za0p4ShlucGSgQt%7oBnb&) z32measW1)Ia1Gh84c&0|tS}4Za1NVJ4DIj^@h}g4h)(p-O~`OC%#eco<_!t45DoDV z5z+qQkPaEK5x=YtAu$pq(F?M8O?DpmJu+_&>4G= z8{sh?<#8VAu^#R59`TVDy)hj5u^+Q19RV^R1#*YbaUgMG9sj}w(J=S&u^}DuAt5p% zC2}I~aUcEhA~AAk400nmvLh9xAU$#+5V9*A&>b0)B2h9WRdOX+vLz$ZA~P~3WwQT5 zvLoo~vM7!6C{qz8XL2c-@;Y$xDWNhddoCxRvL|8U zCr@$~F<>jXvMasvE5R}>#s6|F$+9fX@+{FZE!A=@*|II&@-5*qF6DAA>9Q{E@-FK# zvVN*5`LZv$Ln;9?Fgp??L((c=f(w9>_FNG!8M84R^D!YaG9_~|DYG&y^D^C1DgAOY zIg>a9^D{v+9SPGT4bvqMGbmLNGgWgnS+g}=^EF{JHf8fIHM28qlQTmzH+6FuN3$bK z^CY+cHBWIiiL*G3^Ei<+IhFG@Yx6dpvnh8oI;9g2dy^x7QzC-1_E0e{DWE&O^E<&a zJjHW7$+JAo^E}ZrJ=JqP*|R;}^F84+KIL;h>9aoV^FHx2Ki3m1oAWvSGbX1qKn3&& zt8*i-b0M;G_J-3e_5ZU$9rQsVG(shGLMgODE%ZV$)IIz2KRL7?2lPWhlmrXZAP;l^ z5;XP}R4g-eMOm~(UGzm^G)84~Mm5wIJM>2TGDLNBM>}ss2eL#@^z}?}ENQezjr2&7 zG)a|oNn3P7ar8+Wkw>L;N_Eah1rkVQZ%D(ENx8I3z4S}LG)!sKNujh%vye*BG)>Qu zDsd7^QB)L%AWr3UPKV$J;?z#-)J}guPx&-Y^K?%EHBbe0PzkkA4fRkFHBl9HQ5m&S z9raNmHBu#YQYp1kE%j0{HB&WpQyJAy_q0yQ)J#Q{2i3GxP1U8WG$7qnNJnu9jNnya zHCAPHR%x|XZU6OFaWz+Ubys<{SAF$Yfi+l#by$hDSdH~qku_PBby=CUSVMJGp|t}~ zby}&FiBc6HSM_g5(N&wZTfOyL!8KgPbzI4{T+Q`d(bZU=HCowK3#;{A;dOVeH662+ z6fuBX(=}i9bzk|lU;Xu80XATXbzR%FU?DGF5jJ5>W?p&H{8&{Kw-R3kc48^EVlDP! zF*alQm0%6FW9v|1K{jO3jZJTIRqgd&H8y2cc4b+%WnH#nIo4xkR^LRnW^Fb%7`7bU z^kh-?WqtN%fi`G`c4%ugW@q+jAMs|Dc4>8zWNmV1A(ks8mT0NAYOVHav36XI7HPS5 zx|sHB!T%N~a+VySHWa&ZYO^+N)pl*!wryW^Yr8gXi7IUAmTt#(9I}_aEAU7tCN;{lFcJAPeRpd$XVx%2g2lA$!sF z5We9b)OUTqVG^*G7v|v~#vuuE_ia(Pck$P2fp>qWRd|Pyct3Y`kGEN~AQV#JfDt%> z75_LCzI7PZcNoYu71mdMQ$bwipdBW7eJfa5lVK7L_*Es?56Bf8{vjD+H4DVm3~J#Y za^VvEfD62U5$fh2Ah>EJSbcfHZRMa7hM^tyVIH)>eRXwr^S6kJhJTT`RQ=Zy0r(TW zvO8;+ShHXpGPsJXcz(N;iq&@<#x)E6VID--57ZZhzts%l*NXpPgOSw?+@T$~zzEFP zdg(V@FJXP9*9i0g7Q)pG#z7zS09I4sjQ}E3cg_;i~tdY zSQ|Dt70dt;{sEW2brOF0g5{uF_23`0!3a$G4k#F1od6Bwpm}3eg%2TFml=)K_;mO3 zlKI(iHTj=Il#?aVlQ%$sDc}d1HH3{|j$xIdUzL8vIG>4?gxlE&CLtGu_=eHBmzf!a z|3R1uxR^CqSwA=nQbBonL86=0nakx zAb!)iSsnNe09k#p!CWt)dezq*YN4EsV1>pcDF|WfcuN z0Tw!emt!@qjdhvzI#w+khdEk}`5Lb6`X6$;tdV11wkK@0ls0?3_8Jj`TyHk4ZEqOmwpd? zeQmqDV|BNCyTYjhxG`Keg}V=ld#sNeq<4CPUE#Sq`dCw87%st9Ct(;=I$0x{5nw#K znbmvkdb*X>50tkS68y2fgGJMWIbHnwp z!;RNF$$DA&I>a-0#9tMc&msJi`nxw9jh$Q2gVhU$ zVI06&S4&|WhC!ZPJdF$e(3kb6i}}%wb&88w8_0OP-C?eW^$>2Gi(!3&ZTwj00nlUB z9n?3)WmOxH-Ne<`eR*LV-q^Ag{)-8mSd+okU$wgb!3fZqig_U!iv3tO8xc0XmaTUm zr1ui6SsSLjSkHUMUv;x#TMy=;o@JH7nZ4$ZfO!v+2%DrQ*yrZLvrWuu;=ys=Z(P6s~FI^9atxrmUDIA z3z_LtA>F_GTkE=tC7i0aTanEG>*t=&Z##qO8(F`h9lRhJ5ZkgHTMl@k7R0#Ug%#}W zdbTm!SRdJXcy?LH}$XH8^alz*1Qsesg8;8_19U<{6pi)`*jTg33Cq^|Mw^ zhiEbm_zO6&;K76o8$OKK@QuZc8#{gsIkM!*lq*}lj5)LB&73=X{tP;_=+UH0n>L*| zwd&QZTf2S@JGSiEv}@bGjXSsQ-MoAI{tZ0%02Qx^3qOuLIbb8Nxomj;9D{TW6slAB zVOOI_l19*o?Rzj`b|YSfjU#)q)VN_@#{V~jn($-Df8%z#-)Qlt()$Z-0-XonN(QB( z4Oaa5Bo=xHPSMUV22G+=Dibxtg*&wzXas!ic)>*$9)9Sd9{bS8g?qJx1(ShBur*aP z{AmMAPF2C8hd{&d0+Uc#{G$hdQ>dkqgFGqM+i6A~iDZ&WF3Dt*PCf}`lSEEQWtCQ5 ziDi~rZpmerUJh5>mttbcoNLZOH=T6WU5DX9+b!gZRA?F0QJZ$QBvO6J{F4lP3f4+HT8jx88mWZn%IM*BZIvo(o%=TMU6XK=M$6TQ?kAeq!u@BKjw*%frS5J+5?z->Jd+(=(4Sevz4^MpYS%RG!^2UQZ z_G)FH{qCJ?mo&F~g8m~U$Sd#tYTkASPAI~1j8Fcu2g>o2ruMG97a}Si7?$C8AnZgb z^X#KdEr@i&OI7ZC%sI|wfe{#+*nw>J4Q#+7D#?h*IC$ZXWYoePRk+g>^ihyYe4}v> zxt;Gm2*MDGaD+@-o(WHg!W61-dCEgf3s*R%=Beg+?n;~V1b33^jVB@k`O_qFF`-0Z zq)i3`)lbY2Fp{xoAph>LQ{X_SxxtlUVcH0V`4DD?39959p+H&yzvzWM8Sp^bm`AEy z(W8STr4+E}3c`}m4p%gzM9i`p3Gax&sGLK1!L>q(iLM~tdOIYr! zO%jt7fWC-JG)(e}xWr{qY{j1}eglIJxx=1jIkI6mVMuo5qcfig&1mipk<_fFHLr+sr0%WSANnswsMRDj?{rLa8H&o<(4bLq5`_kgmG_w{n0{0yKm zr&192m|+~_nEziY^f8ZNlp++cP>VLw*v}3&Q<@a5s6{WzByVbTqa5w1*1D-pk6HBp3t4Hdb+VML ztYuxJ*1u%-vaM}F|;7|$98 zv?xujZ~uP_+~5j#xL;iDYmbZEt*?Ct2VU~(cfb724150z-~eZ9y#h{+ zdkF*IxZZcc3~sQ49h~3(N_fH(F0h3!jA7&uIKzZF@L&>*-T7Y4!`phWiBFug#!`62 zEG939Uku|I!)C)W9sr301LFFM?Z(_fv5$Yu<1w{($V5(VjgO4vB-2>NK^{Pk<*T)Y zgbm14Zg7N)jO8p}G|61|1I#0XWZZ%?>M@?ZDEC9x6}@2$dn>}9F+6M;w;}M#x)LecK>^P z<}}|H$O|m;aSzuw4k41tOD<8Mw|wY?dwI-{PVAa1ed%1fxqx&2=$#AQ1^|;%q>tCGUt!oQ zfBD>$eT`{fY1_91_f}6#?`@p>&X1>M1Bo2*`)z#Wi(kLYFMs(d&tB-0TmSmg7yaOK zdwq(JM=D>;f?~f9Y)g-S|3x;x|6z}Q>7{-R$9^g1en4k^*~eD%2NVGW6(WOw`Bydk zM}d#`e-{XO0f=4$n0D0Heg`Oh@K=4j$ACW}KvD50^RQPDh+5%SfiDEf~VzzFsOuIHG@sabTw#RH;8WqND+jmfVh!+ z&EtdG=M;lw5cFpRh;ShYQ#bc=5HLYlM`&0{xP)!EWlji(GY5szC54zrg9GtT@pzB+_6{T2`0s$CmQIJEC5<9_t0-+Q;(nJbblMi8rIZ0GI*^_B0H9*Oh zhbEM?MU6h-1l|6AX3gIgMa5$c$H)1&zHd&Tt zsgn_@mXoPRZE2Zs_Lj3{YqwU3wI^v@B9Q$^AA<0Veo2j?=_rHA6GhY%dFc^5VTk{L zh)(e^KoO1&37Lv0nUu+!BXpU+sbtQ_WYpDYof&4$>E8zf{g1s)rJmxpkw)2Tb}26I zkqST67C6}^WmuM3&<^`Bn+Uo&Xvv@{no$qRq6HSAoHe1N#-8n2ZWlTpSuhEKQ!3sG zC}sFBaxj%9dU4^YqD9&?EsCT7_M(>+qsDohQHG)6@{Jxki1%_b`{0m5%1sHdtVk*cb(HK~(Tsf~1|?HQ8H6Q%n`su9SjsH&@zv8ui5X~G$1#95qZGXxB# zG@F_&x0;B#x~t9V7`_UvX4R@|^{O>gtjfw**s86is-Vv5t*IKV;W}%;T4%y4YU6aR z+p1OS%C7yytl!$K;wrBkHLYeDsRQ%CETeuJEd>^D3~}RIg=quh65f{i?7F z3n>2zu%|k(5nD|KOIBj$0gH65(vh$X%ds7s9S-}jjViGtD@YVORu+q~8N0C_%d#zN zfJzgxF)JD*OS9fau8Y$dGGwqv`X zW=pqWgSH;Ev`pKy7|^zF>$lh%w{k0%HF#zTqpr<4eBfYrf};zW?c~zU#}r?d!hp3%~IzzvDZ-_4@<8>$?&ey!$IA zW2yrG3%~&^zynOc1#G|vjKB%3zzfX40&D~g48UCA0TWEYsEe=7MjaVU0UEq;aOJ@t z48kES!Xr$=C2YbcjKV3b!Yj6_#ZyehRcysqjKx{3#am3mI=sWY=)+-*CBk^b zWo*W0jK&9?#1Op1Ox(my+-zJd$8$`_b!^9XjK_Jb$7|xnU(ASN49HXhg=tL4g>1+~ zyv7aO#%_$da16(L49Sr!$^Vl~$(3x$INZm6+=hY7$;qLChYZT0EXo6%$PB#5jNHhM ztjbP&$*t_luMEqvEXykl$C<3jO4!M{931F3%DwE%hFr=Ee9EYt%ByV5$BfL$tjx>I z%+2h~&kW7cEX~tQ&DCtp*Nn~Ctj*g@&9;2YFR07m+#7uN%jIm&WgN^3%mpKW7#6&@ z+zik0EYI^y&-HB2_l(c^tk3!E&EHIc;tbHaQFiA{&;{MV>72mp%+BrX&O5u$4-L@~ zEzuKA(G_jc7wyFT?9clb&>dYHH)qfxEz$;z&hi z(=|=a8=%n}Eq)%&)Bmvnaw84YL9GHMeZVI@0x8YXN!`<%*3eDu&N;2q$G6l|{WU;5 zE<%mf22Ioke9|b5)Je_KRE=m(P1eu>)lt2AVy)JOWYxow)o*>yTV23i?bTlm)+@c% za#q$&eb#8*czF%j<6_ltP1xlu*91)0|9jMTeb<5AWqWPGeeKtE=h%R)XoZd0zI@mN zoY;zO*NhF;m0e?y&9#y}*%HBG0ota`+%f0eVhv`}ZQp79+5ueM)_v5o&EEeF-~le+ z15V%tZr}%w;0fN{?%mkS9p6?aZ5SpFvncMYD!$^*=i)~$ z#4xS`GH$>c-s4XWQ%>dU{o_jQ;6gsPM9$MRhU8zqz)H^K2TbEmUgc+w=4r0x zYaZey9@bf|<%7%R9_{5|Zs#OT-Dh0pWzOb(?&p6F=z;#;g@NTK9_Nla=X5T6ch2Yp zEasxT=l_u|>61?Bm2T;mj_H}M>6^~!o$l$M4(g#U>Z4BTrEcn{j_Rpy=>t&a@O|hq zm*@e#VU14f0PNOmT$}eDy#~k;zHaBYuE@r&?90yV&ED)=6YLN> z?BYyd&fen4ZpzlK?c2`n-Ok$39_=DK?cuy$-Y(tPF3jex?(5F(?QY0g6Ykf?7hlvQkMb$6@*(ZJG_f`7zGVq^ul+1uwliHC0o|)S+r@@ zu4UWS?OU)#iK?Vq*X~`sdG+q)+t=@2xq$@_CS2I?VZ@0QFJ|1>C{nnQB~O036>C?@ znKf_b+}ZPI(4j?}bzJlBY1FAzuV&rawd>NcWzVKv+xBhTxg8&kIokK{rT><%Vg_E^ z_;KXPl`m(`TX)0P(WOtPUfufjlh3tp=ic4>cktn1I)B;Rd|TmGiJxcR-u-*{@jr_n zfZhIm{Q33oS4rRhe*gm%a6keTBF`oH61*zCs@7BRK?oz1a67e?8KlZV6kBxhMHpiY%R&xowDCq9bL5Cb9((lhM<5F{ktG=wRB9-d*~yM=Dp_vB6?a_Ho}Knwbkn6PTXx%Z z*VkbWA{Q=inF4oSeDl?}sZZ7Q_g{cRdUs%g3!XDxgZ5pk-lgtU_+f~d?KfbGE4COS zgEQ86V@bD-m@I~sa`q{10fVt5&pVth3fSu%ib`I{#{_n06X$vdd;~YOB*$ zo64=*cKhv{x)$hbvn%sz?7H*T`!}@L_WN%R;TC*w!ihzSX`RL1dvV5_>l<*$Be$|} z$}4wU?#B?PS@Fg@_uMxCB^Q14>MS??^r125&2!E_cl~wE09;~r+H1G{cHDE zeDukmetq_{t=@XZvEP1v`e*Duef;y+e}De__y7O?wNHQp?A7};S2Fq4Pk{@ZN`L_P zKnO-qf)k`*1)E1e3}(<#2E5+g82CXDR_1;dBw-0nc>h8arjU6WWMK=pWWWP{%m^L~ zVGThjAQk3Nhdbn94Yb)FMavT3a(O^!xUC4U1>I0B59V( zRGNo$=Y%TY5*xep-6yXBiXH%IvgZKPA3=_JM|x4BMW zI3b+loE9!=?DZF^fhK32Cdm1!lTMp;;0R=CR=5%8q>if`sFwbyJbF_sGoR$TO) z+7PEkG0NIt47Q_xC9Fr)SzFwOSG*V8ZF&9KTi-qnxX2oAduK(W-{Df1Kh51Xv4IO) zKvbj1$ZtfgTLqF*m!8{nMp9qv)Y=smrCJ?tgB@Hv^G0}>=#}iw*845@W>`}_@?B3u z*}J?BqZ#*XYc8-c)z^A-wSLX!JNepOZkTkzh<$L4ZLB*9=Qx!Vu5ivSY%dK5IZ!_8 zoqQYGyHCz`8WK(ClELX+cDfU(qyNmSIqPXv0b^Ag;JtB|y{uy}?~%tnHrbCGCS)|9 z=|{Yi?}vYv+H@xMovnrIH}fi3zYZ3#7WL>z6|B@PGuX?6wsDvZea11%%g1I-bEAtC zq}}!O$iCAkL`PZah;|ggnsx$#5e(?>VzZ+u+@5EBco^i>;!SikeH}~u8n~~({Bw7|rw4DF zG;7{?vvvneSZabi#SjjXt}fCw*W& z-`LMx5_F|U9nwdqddj7Kb!#zQV@_`g)Up0`wN_p183%jWQKj{aah)YzH+$PhICi+_ z+wF626xt1@c80K>?tAY}-2E<=P)-3R|BhD0Q~Z~uRMUkYFOx8Z%ed~XooFJJmD>EtIv*=yuy|CH0`{%#`sw&xcl z`rRkLL3DS^Tuxg1>wjeV-CvmIvn%`r8UOps|IBDM*ZB42raGPa&efWoKYOyN${mgR zsE+ckb^^5mOt5tlC%ZDLDqBGIV?6u2K)Hy&Y?;4-s6PyxzH?)!{p+qiGpvtFu2G|% z6ug}jL%?rOXagvD7lEj-tQ{{JRhQL7>n;Y~etG@IW9GzMWbENgF{X zE5NF{G>b|G0mG-OQo$^{oxDmZCIE*TY%SV}K)U*-157F;s0Blaz*cZE?CU|eJ3=?q z2_d`|A{+oCeE&n*TPyv0D~l2=7Q8D`NQM9$zyYM4EEKdZu zhHGNO#m^ zJL>~so1F;ch0~%zO7y`_{KXUbKDXIKV7$NhYAfW@o$VsFJ%g>oB0xiMKygw=bviM6 zIx20*E?m4TP{^ye+QV!7!r4lv2JFSSD@Jr=6=7@}VoXO6^c^D`!2?^v!eML5GUo&<%E+9-U&$d4kmJR3+V474ObO4WiuY=EdL$iZ@?%BtK-V8lvb(MrE8 zy-3T$;6ci3fP`gmh6W5QLrBX&Ypb(FETjxTZTf}QdadiiMRro8u)L^8yh|D^Cw}D1 zz8uU;1k7I%Ow`0YTf?=lES@KLf;Akr+i}F(G)>(kp4Lpwb=(@(?9IoUwrbl=fAf&+)gISP9U_-RKZT~bUW@W&m9`i4+KwC z5l{3iJM(1vb*?nBT>QBVlgIS0K^|EbXFlTb*ZPz_}{3=L8J`OxL#&`0r55+ykiT~YK&QQ4b!aDs$hkOuF%rs$eXS?#4< zr8`^I5?t-pmrBAVM6xO5w8BEkPMfleBq}L9RnfG_S#-?Tnkq~?R?)=Qq8iODGlXv{ zETxPxn>2-3-PT4DSGW7tED2YH^(Q=ZtKAtjYZ5i;GATIAE*7&L`?>_Ca{nqwv;|27 z1?(cHK#Q*0axr{0DloLNKTAP4TR;G-NrRoEhBZ5d#S(_C*c5miCvj4+T-?Q1bb`Pt0)!+)qOwbsy-SWA)|S1(uuRFBZ9kpGx|_X{oDEx5 zGA?ASO)K=MsRC9x!^}`ig1p)#WYt%4yvAh>1}tc@&; z^upJLva8iEj}%#ZtesRHr+YQs)k?s@{YfX}M^5`*Ml#=_8{Z!(Uj(M2u1tsC)g55{ z)ht68)OkFWJNw5M4r+|_BTcj5l5cn%86tp#bkG@ zWDvPzP9_{pPSQ~3Hc$Q#P%dS-8D$_<dL z=Q0R@mm&jqpy&Z$g@Hf?RzL-Pfa#rhgmup6e%6P9(1&oyfS2Ouc~FFcVCVr5h73?? zohXBS5Qd2kX~QT3eGmqy9%-uzjaS$VQdT4s7lVhtHnAu&(UIF#qU(I0)R1jp23-&sK=#{*PTy1RtR5 zuug89;OERP19vb8svZiy9*E#h2;d$F?EZ<%76{Bnh}jkh;ueVSerbd_?*T~ffpF=0 zAcNH|i1IcFmj3MC#)(zX6f!ei1j{dmT+qP9sot4?}b?K_O=P8=I411 zhuvO?_9k$dAZ!btZ1)a;%VukvaP1A}?}@$%;tub{kne#o@r2m#*_dsZcJcep@5-KM zn6B*0ZfE%R?P|Ggo6v28$ZD4eZx=s^aM*5yaOovi>)MtH$wu!fSBxLeiSZ@~-PVNT zE{ODY@d_6R3g?LhA93PlYa%Cz_nz-7cmIjXmhkwdZv-z5r|#$h=;$(d1bG&WDtB|| zZfTkLZxx?xIcJFe4)hKeadwsoBbSQ|Q0vKNY&LgjonQsgrtB||aiVZ*_x9<9Xmaw_ z2cq@~VfbocIP?J^Yz#LDueNA?ux|E7b^6wX?q=y6KZwgNb%mhux;AUno(HpL00FOQ z_AYFLVD(jBh)0NZh86}Na0hn)YK2gCSvPIWR%uNTc1j=Zepc#v9&?7sZ<_FOmllRc zAotuxcEuKVIREz9Sn~n!@?4*BQm2jQ4u^VIYqkyteSmCRXKy+ecKmj5brX*Z*~WP<5G*>fk>0*-+~xp9xVX2o$$?7uWX(ul9Lw zd3S$_u+H>&_UBZGY?>Zxg=h1r=81VGaMJGemhWdlcMOBi?>?6ckFW1He{PuY^?^wG zS?39+fBK!@>5*TEla~v-Mr)eJ^UhxEijN7`UU`AQX^T&4@2>h~fAfo1guEV#sTYWg zH+b>B`p#Z)gCOcDC-j7f@Hcmf=MDgTHtST!ZN87}p+9POAp3$4@cT~s2$%7qPJCfl z{Dbd!31{ekcxw*Ncrp)i!npVWxcn2}2M<4pxR;5Vw`^mldb^)^j%SRl*Z0#;b?oN& z;Z|tZ{_567cwmutn2>5sK>zX8mS-ei2;grC;HK-WXYzIa`<9ITRaabH+Xd=_ho8UMEdxOvaqN{$V2|EPR6&XoQ?EIVYrj!Km7(w0jQZ1K~Jh<8%GOIiG(QbCFPT zu>2i}`+Ss$I9(lC?LlH#%t=?bpXUJ&XEj@dm^k?nbAH0l6D_Z(a0`nT#Y?&_Qpn>< zLL4(sE)s{**TTOX7pWTZv#oO8Jkd}i9Qhk>RIzG)PdyCjWWLtoQG1R9!h4%n^|6Si z;KZp3IQ|n%xe5IZ&hc-<^*C69s|9YQScrt-Go}8-v-BFvjk!i z%UZgaeW?#&O^I4)iXn{xzDtSaW;n*>OW8jsv78jLTKYXj{IWk?2-T)KYc1#gZIHqs zVh_gN8R)q}^o7cW+bx|VxZK>SNHxmfYJ@t!KoW{8d>i*JE}Xo`oc zw!D^LgQ3DIn*~9V)`5wJ%X~*c1}lX7I+W12qJYOZC7ZZ@J!pqjGcVyydXd351ENbOUOJ8sN(?IZQdGyfCi1e(hqg=Jeo&Nf!%sz~^vTNp!&YEC55 zG5RQ4hnC`yNZKz+rm6{_H0iGSpiC)9_AlJfgbows#@Q*&e!v&ZXUD*gXyvnh0$LEc zNKjK1iV37P$B=)DiCyqgWuuBy`!Q%zCX6oUqSf2W>Q}Ac&!@p0zlwH5=_2K36(ikw zouJ%H=)4$Dy$KlGmV{By#|@> zFKwjB*oZ{8YU>lvIqhux?Mt3vbPw6mG8>Z%qpb|>9PON~SoAKjipz`o5K^?XF=Z($ z`!klU{4jDM>nN-n@a0?WXxgR=o4LaQgRNH0WMlQsN5&PiEaR61fxu}01piDAowuCP z(eO8Kkx#HWC6|oJwCvT8C)v{^wk>pmcdb9xxe$L?j4mB58micNBTl#> zMXzQ_Y@sW;Wo=c*0Lyn=$bN8xq5xc*k-wGL)5S|#n zxVM2RE-r(TiotS3&WJr8u{Ra&^HbX=WfgarVwvryo08Ei29k{bm;h?Hp1-&{1w%?MB~#A!jEId zrfL=ZKooQF(B$l$9j8!;h$$2z0oEvvR3sYGw7@c*XxOr^>i-}2?^ary*FMDU?!bH zu*zJ+nH)UKLPTT=MX>0Cu6i@1rlc2xI>12?-wx7Twbo34g%!tOw@&}*i6N$L6w_55 z?5@H7S?vJ=U=zNuh+y0^Cp8Y^!`45brQF%=R}W_!c!d#4?g1eF)Eu?aK_Iu1NOHgH zrJ|0K;pp>}GlHqsrVx^=`S_gOt=z0Vi2|1(`aI;P+)o^vpc-GB$z*G7y|%V{A19cp zDcd8-EtxxSOYH)%5KEFZqGHPUMV9fFb<5sSt||cIpeS1EBF$+QM8jP`LvOK~bDY(n z81j$u-E4FT24j)oI)L!(bcOUHCWe$OBcg{Cj?h8D&HZ~v6;VrTMql+%>$y>yJthh!Ig@5-Ek`$?W zD{t<5;={#hJK`shJySbE$P1F8EymOomD@_wM4*x>UFoR8-mHX+1PQvR(WK_rd2JU2$b7uq&V$ft6K7*v?Xs|%0l&#FoOt7@J@R_mZ z*uq_rBXnMz4uu<-a=w4*BuovkLxni@_clWtj{iCvhy31M-{o6s-TYSN<@0kmsXn3~ zcRGF?P$*1GMy+op?0fI7ytWu?d}JSe_9{R<5f zM48?sXGg~V0^hlco675K_K}oRZQi$Dg?*1;n0!b{!`)lz<@Hq9$>Xe%k&-2OXTJ(^|LTECO%Y= zg8-L_*s!oUu3+xW_oEVr=69h?S|i|>RGDci5|Q-R838a!lZ>yfX-j4JpF@>;wxbN( zP=Bxf#U8xj$TM_>RP@uF_3+)M^+nPsiCPnu1gm3xTg@$3x-__rJlP5IL(emN2!O*v ztx3EHo*~^H*09WJ@$zh`Pw2ijTkwLg{^vE|+c9cS`9{FYMIz>p-oXNXNm7_HyuX&t z03-vSoyP{;%aF^YXn7PFOl*-<&}|mKlEHU6{yjpU;s;QnEWpz%w(ED1U_FjBrkIuk zM!ktT)#k<4!(xDYSD>rqW6`HKxhstf(emJW4RHwK)Un?5D-WS4n?VQDOype#X6#Qe z8&-ffqErd)M0-lWx#*NStdiDz(E55dr=|;mygVS%^;+UKNJ}PTF@RUiYCc0o9I^Tn z{2yDTJM|oY1LYmMV6T~vvYlw=H%u$}c$i$A_kOr4Mp>>4b#7Av^XB0S2w4A+Aca;N z7U~o@2-q=v)Q)%1K1cs~^oWdipd}9u+Pgqs7FJF;SL~YDQcwq7Wn!KnrnpBAtmz`I z?2smFYexg6{A_kQ5OC}kh_7&X3)=Q zi^0>6X`z!qGuALDrvjsC48%rE$1Ax=g27+k-{1+7BlPb2{6{IMHIIn|Htak*!-UU86;YA~z8 zppUL%SkGFo!azHf+QZJ2=%%7S#_&%2NG^cftlH!c8AX)1*-wu_^YI`Ae>tW1Y0lR4 zofzsM%5kaG!~VN|z0RN!8~OT`eaYnrQT$va+oN<|zkGj8X*XSm|J6 z-D)*}nVOgd0_7+gj}QFSlSw#!|M3NUZ1aFREwnkL(HQUMbN@DyDLXLwCnyO&d_gdXR?q zplxSK!5cg>6Ttg~mL#rtxn%(;B3^zu9A_5Q)DdbmUnmw@7_fe7$=Pqt93ih;9Qb;w zY7&|Db|^stRHUQ{pv{A$gA1od$V4Tw+)mtG$+>`ASgEFeX)Yl+++i_2wH2^Pt^C}W zH5jxaQ?If#XtLt}j+tGKal$6?TQzj$TR$^oIuG;9up~Z?Y9zd2BL=n#Cz*Y;Zz zzm3A;VCV+0F70_<9tGGP2iPngenHL(zsx`E56rwgtz|aqS2*jnJCBRnozQRP1q~j< zxI)>@xs{(kUtU4mgDa!9k?gAsmk)96Z|JXX*su2DE^Ud&Zn>`RRPF!iT>T@dyfeDG zcd~!@xbPHU{}_Jt7-#>KcJ-8N|6F?YTx91cOSuux=Auy6=aFi?!raNbaOQ25YL00%s=cR zpPZ;C64)GD=S$*_WU?v!gRxg*X{GY03}-U})bnT4m7FCvcpJyEl~hbF1p z%Hj~>mTT0SPZ&wGY1&Sgi|ybhdL`JYHrihgF7PMY>vjF!xWrjc2LI~wZ{d=#T%t1= z3MFH(8-H{>7*3}7IVqibYnGZK7y@76QQtR^D_5o;p2m4LS^3vj2sQowJgv~NDk(GF z(srZD{snh))$MAx+vAGF>-7PA*q=%9r?cJWU;WaW*%Wfe%YDxlatP$RfRLlZ)zO%o z;*`FJ*WoEgSCi0JFQ1EtmLa9guik&IA+dNl9+xFj`ew$SXrXENHaz;_iu zP7t(_^tS&O>fxObocm?S-*=y6=VaH!kl* zd>@qFi{Ziy+lwrqEHR;@wS}9BljRD-O^}hb#7&ep+us+{(jibu)=`uxNLB(7944B{ z))$Bwl+sZrm^h^#T3U0>Q)k*U6VRkPd#WE{|9;k=AsHPI4Z@T? z&JCxhFZmnvPC)Bw+Us$c?BhgVR8(^*M7Ds#*!rKc}b@m)PB zFIy#`S4yW(Ft03tr<=`|cn6-x3Nnou*UexYl}AtK{+_EB)@=J#zLvXMk+XORtcV$v z^jdG`vtsyLNn4w~mo?aHy{~*+*sRu38E#!^^oUz#*S20s$lAS$q|4f~?Yp+nS^iJX zx)0?SVNK`GCV$NU4&?b=DeUIp!;)Nu&LUYC6YAw7eA6p?V9y%*VBw{l!ZPvB-q zD#)8*5D8h1ql0T|y>4>uNx)_L8w7=YR+u4^V@{4=4|8T#g^6iiNzR9HQO&udVey7K z{cgsfc_Fs#B$VB_pxdT*cBJ!?DYCEIylvTQ z?XC@s{^MxipG=;ys4-%m{Sb3OkA1iA5lsitEQ%iMk?}&Uo9H3>9w)_e<*g?f4;N2c zIrdq+JB=?E+wK5xFsQ;}%`2SX5;wMq4 z5g66~TY&)V;=RG{KmZoK?r`;gE097qL%Jq+AOfGmYJIpSZz!5nESyNDHh(0ZR;^Tb zq_#jViVx|Fw@h8(L^_Z2>H0`r(Nwl@AQG``{cbd&v^lQcXno0Ck#e4Frffs$LK#9l zy&eFnY^lniFPvDev3#XYqJa-~8mD5d$zg9aQ?99UBVH$#9Tr@5vC-uRgG?gdT)mU% zu|U4R_E5by6hk4GCBI^|+m1lMT{+%TcQlnF7NPG>P$xW*E>)&K(b{mfq!f=vYx~93 zYPs3@Y;&URL43792|}p2UUjuM9MACU9skjEr$2%tTd||{-`S7MB@oF5&;8YQUj*c< zy=vR}r^dGUUsIhOFAvZYXA)B#EI%8;w`W^Z-#>=Od{B?{{=ni|Z2JeNa-$pDAck%S zqD#{5XsfAP>;&O3HxmS6xgGC>kfIfA1o%4Q?}pJ978`lgn>MBdG7Qr0MRKyk>WWb> z7Vm)sJl!cktoOA0G2&S%#<9}WB_@9!nNIfOl_lv864W&<4-&P^N)D2A-A)dY4T9+o zQ%sU94^u4)OAga)8cz<>9X`S-Gh7xek22j4OOCR2(i+)hu5a)Rkki}RDLPD_dlOHWJ78&6Nmss|zTXXW*a zR%aE>hoxtg?f0i=Ro(Cm=hgkV*5@_D)Me+j<6LLwkxnQE!349a{I(6t`ey@m>u!9# zP})F-%jSL1+C@u7Qkh-Labv_uD>(S3;0E^Yod4H5aOmAKVj& zE6?1E0#jPuf-2R1)VC{Z!oh`}?cp@a7}4T1#`^oo zX`IuT*Li|R$-{Y4fWO6gN*M3Sd0PCI$7M!(%H3sFzNpz{PWjKH%e=Z2kL!XKp}Xs% z?p2fPl0n;$#GqlaUJlZBobCPUtIx#!+CmHJ!}{om!ox<#O4P$<^9f|)VXOQJ^>OkkL)O-V*VCe!IhyQF{A_ zsU7`xk7_yf_5kqs{QkHb4e@z8w2$_EUaFdUzq{;$c)#ATDE)aG+KPsNKekgZ$om>G z6pVY@Crk%7c!BLR%;N3^wrc+(FH%@3njS>o$^hJTB6tq>7E~t(Cz99gJyF`;f!Jzb z2tOGTLQyZydqoiQIw6X&dlSK|gB@4<&YDwkU&D2Ei0KO%I;4lXpUkNuRI>jIX1sI* z6+4ENqBr?mF0DkqN=>+U8#%6j;Q-T3d4zsH0e+u!9a|iRnVA5^*le+6LQPE+r56Q} z2=x%JT{+0D9-rhEzeeyT*3kELuLqh=+8?7f=8cb%{JLORVzMk2WP?XZ;ZZ508uv4) zJ-?20MA|L?@>|Q=8P!x~6eW{8QUIVezA7FQy#$yS$I>PgM1LN#HTR+_d*iNjS#S8D5orM~%ESky~5 z=~7aWK`lVTr&c`aTKjPs$(u}IkFL*Swl4U-od)f;1TsZ@QTFFRR|myMQ_oQ5O?|Y`8y#sN{k#ZfLvgSGy((78M^jI2iJ}jsdLI2q ziE2ZfW(PfWUFm{?Q$tzSE4`K&-C|8#ZMm5smCju0XhUs7qMZ)|;~xEz_H09CV>^Ss zbIDT2O>LF$8VIkWBp-1z7>MxFDrD8o20h|JZOC+ObrH7-XYRsoU}0^I zS-$y>{)giqFWvoCxt7jvc6ON&%*VKR&0q5DT+Ipf4i$g2{XDS!E#|)w?T=Ts+hONC z^}={2+0=f1k>piCxc=z*t>a3s$|w2TudBt6G3tX#&o1Qcy4~c?6()z;XF2^h`V{Q~ zd}%sWj2(nF>s}lZ;b0~rO-Dz=c1sG@kR4A02(^2EpAoCKiY_A#f673YQ%$JhIs*YD zd5{g)!Ph*}xHGA_N8s}M*PnJHvbDrv7OtC^F#b()29Fs(44obec3+}j@sN>(RV0!E^_qq)J z?6!jixftNkUl0A$UQ5C9WX9il6Y#`;SoZsA0wQsnRRlN|%kG$r&tlH|{wAhc^?aGy z`7hH;@O-29d4(qbzVSQY(wQY@<973*1)=jI=)2c$-{xb5ROe~pAJ4=1&8NR1oks;- z9;e2e&xu2w`wbBHOODN#FoZ71&cJu~8<@>kAE~a*g+IUV=QiFPL%P-uy4;@gHr`E# zx|aVzT;H8HAle9inlyfDQhv(jehMLevPFJULw@2%ej*6|LNxyTQvN*V{@+6U*^B&H zhWr_i{OJ$^sA&Qyqyk9I1BgQcz7z%E4FzBy1z;cqqR|8*O9cYV1K~mfp^E|`gMqJy zflu(jdurgVBoJ%{ya)!K76Ok3f%}KR9r&P4>Yz2rpk=e5h2Wss!l0?apz*_?5%}Oi z>fk=f;BK?vj^NX0(YkYcltg5Z$c!jSC2kc`8SRQS*&>d<(} z&=|AOsNm4>!qAYxP~gO2s6Tv|FLjugWSF~Im}_vDQ(>6>V3^Hem?eC;8FjdUWVoJL zxOQ;3T4A`-V7TmIxFmdpD0PIOWCV{{1ZQvrYheWAUW!ixI-5yCLBYdXvvn^v1+X%$W&pOgzC)qA z;-k>JSoGye;jr7Ds*}xUuvlwGxoeazR-jbviZ82EE(iUH+U@@mm$OobI7gxp(Xi*& zJlVhR0r{C7$4Ck`}g=*=Ty7Z_+w< z{lZL|LWHEAj;rosWp*#9!_&!n6+tk5kl3x_ss;uc`u~02^-l^=1#tN=|2tCyu-##X z{eB3-AJ20A|0nvfWLD$RjQ@}5L%Hp$r~d|SPvuE}`2GJYdaXLEjaD`b<;wq`=q=_- z^~M@MM339C>Gz-L+uUzYH^!Q(wz~YBM^XP1eP1XRgZ_APjd7Dxmr#~`OYOl}3WxRP zxVH6vPo`J|i9&1r$y~8o(;JcYhv=(~$FdaKxU3c{Z2uE|)74gY;O!kB)Ni|;|3p98 z-r_tv==lBrM88~T95t!a_V9nASJEec*gKdj`%m;J6!-hB5=aQwaz9r33!-0)IQ9QTZ@CjECi_3p%Y02# zu==0qM~ISn!v81w)Gx{MNhSXieUYIJ+R9?0~rpqY7?U_bbT7!&dLV577gcsNHu$X+Wzx;oO&xW|7~S zpY}l#AEHmeGV?gh_zhY*%nD(C*2#&sdpJ`^5(e~4S9Dwn}R^BZofhy;B$S#1p8@mkV50(e}iKO`%5~L z!qOCTAgY1`*y~8)xuw}roxp+kx1<0m9yW|PFc6J{4CzM-D^4vq2-cYl#r%>>agjp}tcb38e2lRGPe z({)6_4LSZ$F&$gnb!0R<#g`>%+HbYjQC?0IL`SqVytCIJ%UTMO2YhP5o9k%p8wyec z0xA*An;2K9i<}8vSv{b!KtE!>qYV!DE>vWr*dri$VR6^hwcbk#OM#HzXg6~>;n;GgzBXC53 z?=gFuuW~po2jlv2>{ey1vTyfW`nOVyXu-DeFV@0$62Q zZXcpQ{t*4hhv)-7M1Sxh`iKwFC#8Leo>PoL$LvG&!vaiJVI`{z&~*)!2UIr35o0Tm z*`%b#4kkwDvY(najZMX`Ob#-1>pKCp&4UM&PVo^V2kgmllRnIpc?^1zs!gq-?aXe7 zB^wvewQZXR6z+WyL)UT1phLkcVf>!Wd-hy6b@?h!1m$q$`G-#3geuRAv90Ic-{H?x zEO^gjTM$vU?j2&V4|2N%tk;hoSS~OYal0OXMXOgnpVf_N+vmyt^()hZ-(v#`$q}zZEZwVoqr78PH=bXgAW6>WTGhLQ0-d|BqHl@FG zCsf|qF*BJ-SbyQk$Z{zBu9wa~yn|LK*^m`tVX^15vrtXaUFyGlx&zHO(?s21?<8o+ zbHvXM<4Rcy+12F{*~YFO?7&X#L7gVBRqFG0zOT^4O<@WXlg@yn_?W z%?`d(y4xF8nkBTgXHw&NjM;aBGwL#S1+Jb3wgm5T0@sh&np$S|!tTxL1Xi7!9g(cgfjS!MGCl47@Zaq+|2~}QxEyWc z-z*FH*HNW@<@=dr8z#G>6U#S0@VmezX4T^*LFYB0sldJ=&C^K8)pb&~#R12k)(PiM z?-aE1xyPntbh3;1h-!2fq&zsq1kcYlsjo0yAe%s$6 z>=RYKl{H;&i1OcGL!REBlq%lu?Q>plyX0PPvn}5r{$SMqf##9>q~-VB*$<#40^96Y zmhXoq&4G^ZPcZL?%_EED?#~eK|7BSOciBI^-=DOYjhrWd?9QK>M}{gT0H-d1QA?Ee zF(6_;fL%+1O)GHSHIU~~kFPm!cOg(nOJBG-P%;Nv(j6$B0+g0^A;ki6r~qa0gJgz* z+T;H;$jivK8)$P9PGUuLVq1%h94RbiU|Y+2fK$-$A+3ir0q3_Lh*J&RhvWOcrX+2 zgYEIdlBF?Hi-AeYVWih#YRzG)G~rkx;dX$qqR?=Rzu{8&;g!P})mkBiS}t|P7!AeH zwJ8wwT%Igq@H|{`JV1nDVw}S&Up>Ug zT2v@x#HhklXn4iwJX9DE#h7GNSe``LcvUz?M8820Rk&M3d7qT|!$bu~l)rn3inJ(; z$%smXDNFH+%6KTtA&M%*i;dW6)oL%$8nG(8EooM5(%q^GNAptxi(&LH-d zWTfIrn6O4lHhfgl@=7)}Sbn*NDCYiXGt zxitedJQ_or77r;43n`mWmX_F4=2=GgH5C(MH0Nu04jDb|=2K>ZdM=DhE^TZserqn; zYOZJQCz$R$iZ6KtNU=Lww3#_cz8?ABsrk~a`Le6|^3VB-Uka4@3RHCp)IAF{(+ad& z3v^Zsbe{|KzZ5DV1Pc;Fsi8rWC){6>s;K zyzG^1!InN!l&*`HJ{Xs-0ZZ@lN|*afZ}&=f zf=;?}iK21{Sm|J1Nj+RSmsi;jTjhLINg-V|V_ZcVTIE($MLb+JMp4xVTkUaF^+mdR zh@!e1Sna(OyF6SykXPLWThmKX(=J{UU|x+ETGMS@)7D=TbW}YHsBPb?X%??-Gp=m{ z)zPHOBST!1@H5 zdbHvCioE(N*oI{DI!wfR%9DCz>4q|jhVuS~;=P74*v8DF27q*9Aw^>`urbHHp?A13 zH?J`?yn)uT5f0Gwm!j$JsTlh?I_?zR-P+TQ!Owq<*R!o?e!1vbtGVQ;v2(aN)w$Vm zw24%NI>Pqag~RI-A*Ch7!yTb}9r5CwJw+WCA)P?u&Y1qre)Ep>@D72J&QpXgzrD_A zVAr3#uE_qbQS+`Ngl@0Bt_bn&37W1wxh`S4?){K%5997o*d8~Eo)Gb#xufo#kRBJ~ z9$aNxSAKW=#7N8W$~ z>|m!Hw~6kcgY%%pIG0uXpw--<9np}Jz>tgXkem0Ad&ZDw`;hlX($VXXAJK4tz%WpE zIM{nQG-Eg%@_$iBufs7!BXI&F3A!Um-Xkd)BWdj;8S5iiuOm4`qqzd3`MRTp|BE^* zZ67UPAFX^HttJ|)6&S169s3A2YR(vIZ69l2AM1P_>n0lS6&UZ=9Ut@_AI=ybZ668#2jYnqGstgW*OgR8HneYndVp_ zf^%GYb36)jd_HshnR5bfb3(-Pf`aqH3iG0R^U^-^vbOW`nez%A^NPd^%7P0@dJC$y z3+g@#I++W)Q49JV3%@oN38E%aF}?g;T2U-=xnTKTqGO}thsxK^*XR(vs3eu3WDvDUt^*7>&9 zO}w5IwMIm?KIpSPoVh;Qv7WE6PS~?PO}sHHxG_(>F+dTByJkH!a?btlu*t~q(1QT!F2yWf!ZQZ|ZZf0%`qi*7pZ9cqhL6K}j3vI*d zZ^L(PK4)(COl;xpY$3dFqm%4l3hiLqZ6f*ZbWCjH?rh_1?vT9ikfQD43+*;k?BMk5 zkY(+Dq#ZGmY*D`N*4XZ1`|mR8?{WF=k)!SL`L31etrtY?36t!L`fexK{%Yd^F|r~y zRPW1o?!!#)%WWclCtZO-M^eZ_(y!hNTics@+Y@^~Fd#X66kKUwMNu?ZVVp)>jzO{6 zJRHeEo!CCK0ihPeWJD7qEu$Yf>m%zZMzRZGa55hT2px+lu9*5BCPFS?`?`;0XaN(f zh_We2W+W>mF(_sZKsmc3pZ8F&j5Sn@V<5?CZs%^W&`DV5u`DfM8R|qP1*x4CF0uo* zW%_VA=BU0B)m8|_Z2MEXex&#L3CyR{JfZV`p`8NIaYDs$BnSwaJe8(B8O~a+-9%|- zKC;t4Ypwh=GXb4UiZGK3blT4D_ZsSEM(+jf?M3p?3YBsDO4vNFyowzf!UmVweGMag8;O2{2Qhgs zxhB85;n_mxsk$Yfy7lD46k@sN%D(&FcqTt}O>%{<@*Q0qV!{qVM~9dcRG-1b{QKv6 z1Fdpnz=9q*jcD-eACb~6-W6O`3mEO!HD1+?)MreKn9Iv)wBLUoe7li7w$Lu75n;L? zK5ATjNzr|`A3VY6-q}cQt0>C`Mcz}$s45R}-_czms20=c?W}02O6&)|MfxOLCDUl} z+nWunpNpfPPcJt|s-O4XP%A(06lFgbLr}qjh!@i+#92s}!Y?(SuWo!#$9#bkBqvpu z%P-7;zd2`>G01XI$kpJh|AVrY+b;GcQj^1_Sol#?SY$%yoLKa)Snp!#*hB>kI z*3mB~3W4Ag4xbEKL>{jzIWZ}lhKl6p5Ydjn;+z~+LV^O-R8@ncIw>bp-$ZgWcprV$LC8I-z3eIESAfqP;0 zQDE=~o>=G3VzxjbTQXDUn>kL7Mtd;v&wHEI28eA}R@~1AyUmvP32W|>2e8hql}0Lg zaV>bKt*Zem|Hb3(aG?T=8zkV-<}p%vl(j$k^7{t8jNx~(>`T7={8(4W*RE&V=YQ6y z&Z@s4wlsZK6S%PHGG=mcU2k{ku!JJ2G9TadGl~n6=wA7&dsk}l&6xCStE7EsNw>SLt$9llY`_!_Z6V6LKtcG4csj zPD6v@>01FqHEz43ku(VIwFB5*8RQ9Hymk>ONqX*N@@pqcXJLR2-EG1|@vInj3|rUPD`#v##eg9PTvfvSe{)t}JSY=~^XFom*?pjc5S zo29j&%uz~FHK?m8Nqp1L_+fLw@%dN9MaS0RCs4~-cs#nmb!WOF-|>FL=O3HE4!bzF zv`<_@2ZOwn+U8?t{S${owPtp zOw>i2!H~-F+7VXdxQ_s?JQLLdrV;u09rnLObJQSp{gcty&zN$#{LGGZO4**0%StKc zi|6Aibl+&1rQ&h_VUFEd6eT$laR4CchJ&%#C(ZblGNWqiN&224a%y4TU{T*9G68L zNE@$YHJxd*diPu9x_yITr^ivYxe%-O#y?GAXpa`WEtxd!>K=rZf~=1T)}1UkoYM(? z?^OY)>p7D{PaL}jMBf^0L7`pxVonUJm2pCXL#-HJ^`Z(FXjDljRhpc*+&AKUS(-IK zc5wn5KvqTqg<(ZiR}(9b?Hoddsw)Gf5KxPO*>CXsMqA8;or=9B)Ix*;XZD;OG!CTa z0DjW=1x3LU6B&r1#V>EPEh;w3BdI1Y)`wx<%=z?fCQJ!vgsno=G+A6Fb~BP*5t-Ps zb#dvU7Nch;y93e{EOKahf;XPW%IbWh{t-tQ;)2id(Xccl*tSA+X22cP1sDRUE$@C5 z)eX!a1S$9^OQ+<+Tym_pUbgvP%{Ze^Jp_+4G=hp zgJC4E9|ch55tN%yQH(!Sf_n~s?u0A&-{c9xu}SNpTj2$j1Jd0m7`ToJ4{Zc;5NtU6 zD5~RjOLVYlaNYl6mq41$lwfNp1BXS7NSa}}YUn7S^ye}}*p|5_oDfC2j}3ll8(7V! zqTB0)0dXR7hIM)T;xO_9=;YQc@edVofpZz^9LGHNhrJ$LDCz1P!^E9o=n=!mq^`SK z?Ly~j-( z8=%NvnM1S@Y64uVNWa%aGVKkP7Dg`|xd(5o?6Zu^x^Wbpd^j|TXxRMPa~sNo4x(sf zEJxL-Z$)H%6d+8$ut;@#&2-zmms(_FE3e?{e)jb%KeaEQc!?y5SK3Ij@3RIx5@<-! z_nQq0bVJuT4A7CTk0MzcVF2S~fI@L%5_ywe&2uPL4qiAcE+w>NdD^0KI|+X} z9ZUgq+R9wTthF;h`L78V5-uwr^F3)u5$^@YvUOvhqPgNMbJxR!f92Umy3v=YoMB1C9VeXd!S&eZ3v{gG-@ zYS^=!(nf+Dg+Hl4(zZ+}D|=k}w~mq&uOXd<=}6PDz{YO(f4(xqJ{_~JM%y&EyN zs{Lt<_y^=Sv5J$wNTlsK>qn;kNY-cFCAnWMjY}QB0+doT84t;<0_6(=q{W@^gRQjJ z{sQu-JBcuW@cUy*H@yx4SPVx!eq+!g%0LWQwo8#$bp3ggYGc!qO4y$%7Cx21hPUgL zBF{7&ViCy_QTnvPFz!YFzT`7z4i>rkxN(xL4k-J7NyvrH6YJ9zCA8q#gtGh6FUuRw z{ugR3U;T8}&A>QV#MZewNYKWJ(4^O*gw==HhT*Ipr1=D<-__(Eq*B`H^B&LGck;jB z$7CNd+h{zjUzIq3iq?DqPe!Bu<|d>GjEysKW4eh&q5(^mE_g7I%<%=`@+0t}-w^Bi z$Y()zu5%N>DyIpFI;NwTp}IPk1rLh{+S74L&o@76L~aj**P|)e z`cj9fdEy1Wj~l8P9Q}E~MiRWz{syDbA|p|35tPrJ>*~v4YJ{)MtknBeNIv)% zL|eD5E6I$P|C+ul0`70~qb)2(xOVB(c-fmWyL`V{r*rWB^Sp(aoqBE7d1D(3mcaxJ zk8314Hipylinl_ZPn`qg2!H27%RLL7M+7l9x3h(-EzS}=^ovv<6N!)w`F`(v1Zlkt zPu#sH67N%mLoJddE6ht@_8UdSNnG9IZfiXKx183h#`p$%C>#wntWoLUrj&+;vWDss zl#v{iPUW6%;q=q^9)kQH)$6t-D1kMtMwB{%$sUG3&e7J+f{2LhW-mR%&e3H3Ad*`y zX1)%d0Jas1jCub|^7W{in;xmvM22w$wNY+Pr(RB-%pr~rb4#?1zH$>Ip0n5}hk9j?)AHT19`<-4UU2g=R0~o`Pg1i`VhtcCmig`$F>V!b0*zF{O2fUvnf3w*2q+3c zqV*@I6Ws?m_r^cf#iw)^%JG;i$R)pY3Mp&0J` zoamCtaS1~EgLZd=UCvQ_8BxS8r6luthEOO+!fcfDQEaP?WM%DQn4-S{+_k$=oJMFk zx9zT!xZd-qGCG+PBGK&gIJ87)3goqJF~NgB1%I_rV2n}pv-fQXi_M*OKt?@L^#a7; z9HBX;{TWjbnTMhIu%#I2X^+!Uc^y!YpCp@0B9ee3DFRU~{1N+nIB5wZ8S^roZ6Zmu zGAroqbIzg|)}U^-VeGmx>oaa~&paj*so;EpT-bbG_6$Lz=wm>%k3kZhLr3$MS_wW% zKiEExGXbx>(Ls*%l5@g8`=d*NpfXstQ*^odH0iTq>0upcef;2D*PTh)!j_U%h zOcc$p$L~4C`r6Q*=A#%xr^YBgKhH;b&P`n%D?Q3*nLv*m1~U4y2Es^8!zxU3_9uT; zR)%}~1pPLN*noOhKaD&vjj}L}Dp=~^A`cZ6O#wTDK{X?36*A8-gYAloWIBWEI%Bdo zjh{F}P%!hQL1hssOYlcE%ma?Fe&~%pCb(SV*Hd9?G z$Y6^6O=`GimXRvj9xAJCW|qZPkqT#yjcRT=be2P6j#Fa}^6gtGokA!*+#FBh+~MOC zFVighz?^`O3fIA$(7(CwaOw*Vb9d|V{NLuqB-EJ}<|ItjhfwCFg65?Y=f4xr2l~y4 z56sIi%!k>`EB>2DN}pH8Sx}+UK&?b!X0@5R?4_;)S%_oU@&-|-(WTB~1@)m$SW_z3=D1f(({z>pAVM+mYo z`4mL(^ZN4PJAoKpPKekX3LPdyEfQ=djUqv#D5lX^*Y0Ss(a*}Gsuw14cB2Viqlug& z@n1%hzMFDbn4()oQ-@6x3P;lqMl;HBDU+j_d}CQ4V~q0HH$$^_MzgP8V>v-%Di&jT z-^cR5G-gMQ6%3CR+CBSmF!mGlg6fZ15#M;J*f=?4yv%UC{6k8~lkv)+@hUs@itpn! z<>SxZyr>=?uU{OmJsAHDn!vTcXyBV@;v2^*Pc$2vYnB`T@tSDs8Eg46(NR9$7&Ot< zVxIVYqGxg9XZb`oXcAXW=;fOnP#)`JnjA8md@VLP;x!qsJURSjax`ifUp_e=L?C>h zoLroI+%id=22D8+Pfqbo%}ox@C{HaE4$q2BEqP7F8BVQyu~fI4S}vbjR~}y-p4zk< zTx*%y22Fd+PVMqp2^>uAC{OQC#_ZWmAEx#HHJm>FV)e*t`n23?KXCeFczVBn`to49 zt9$x_3AS-DO)d^gqnjZ!npt`>L+K53)0zP#z@|RTfGc425i>L+GsE>W^oKLlT{947 zYuv@mRq@$O@GOJTY}=DrW^d~g^;xEb*@h3Z>=mZYhT!+?mt`nThHuRUX zH^prR+h=)<=Gvdk-S(an1kdp$*tCC`6Rem!h@87KV$)PVcW-NscWO=~*!2GGd49^5 z4^&}^{&$b#b5 zjQqU?WqKne?*%F&Ta|I;xlUL3tE;2noA3pEw*gV&^~*qC+L-9>nn%+C0EM{SBnuBO8du)OK()nU(+wY<$CU6WdHkM>9xwT zk9WUUf_;svy-)D+yTe}Jk>#>NdyAIkPnR7Zm>qs@+JB;42?*}@H(L2F>=2-`67p&( zD8Yegt%$yqY+*is8bi>*QyAbjVb3a^`ay5LxrlS<4Y0`5wHMm%XNw zu$JGtRxmREV`Q!9aP98W+E3>7lEc~J+v~qn)~|}Mm%UoAcsf(=ywT>oRV(NeM0{A!~uc;h$UMtk-~XToSl#YXpt zOS1Qup2Lm4L(^``&Hme)i(VT8Dw{*SM*T*cBi@@^Pd4!ho1^rGBiWndt*-Rtn-fc$ z#Ho9IlZTr#%x)bNTeIR@^Ovo2DqD-M+|naAmx8xeRA!bFw$>`Po*HbekC2+mvo@Bt zwkcn`e&5=;y}cKGdz&P|8NKG^+CK2!KGI>@58gh>-j;CPK5gAT=YpJ!Y+vfUzC7Fp zP`w7Q?2!LIcj)iC(jV?`EVpNa1) zO?xOA@2e0!RDAZ;ZoE}X+}DtOt5LbHW%X7IzpwM@tlHfIqN&?P7j(0F!uW#&T%m1GAJkwEbyrV|@6k z(#qE7(Ba7ZRpO!3w53Dkp^L1A6aLWc$}6{{L-!+R7|W4IjKmhow}s`WRY)7;;B*@>t5A=bH- zrv+DZ^YN!eEU%M~PK)jJi&)M|scecR&dR3sN{!DdWFZwkXH_has>HLJ5Sy~fvpOr^ z0{mHntY6*H8Me)^f#tmElOI;%ym{KU$@skWw_mf*If-PiNqk?ObKdE5*46gD9Dm*; zan^hEzJ%%mCvgrCxfoQv7&5*Xw!awhxxj~95E3s&b1udzFUH$0Ch!-Glgk(X9O{$K z?^!Nq`7g(BAQ1nhemx+!2IzvK{sW3${}&hwG|ZLzzf`~e3lybf5^Vl2^((jke?ZY& zUiSk3rGEVbiguR&Tm34$<3&=x{tqZhQos02yze!ur)7`*2NeBB{gV7@!1Q_S%T<@` z(JFmET9W$pA5e4&F8RQ=(WCfDbY1noKv9zV#qMC=A`J}TnyjhV9RElCiaHTnARz2N zEos+P?f#>FwdLvcRe9syM(q?dMON7Qy)91>)sxw`y>=LU|=YQuHZd%EVp&uZ;KubOt@i9@}5b-i${(pg@vq7zSGnV&y zsvmN?j3n{v36ImncYhF)Oq`LYPL92KpPcXZBsK57r8dcFbfq_Pk{MkNRczVuLf7H56|rp@Z5|Pr9vOaFub+;I(wf z9FpetubUs<4mfg$RXe~?smC;)>N4fUC=+4ea2&rP(!8TR@jvR9^z&pJ{i9bte76Il zA^=NB)Z3e_xvcVMC$r{{{L(_L;wegq#(MceSSMUm0sa0GwKscJp5m`3POJY`zglaO z?<9SXlMM4(P(I6$pYrENz3U%aZi~wD4!P;aM=!EsLs6LLfC0T(za4O|Xfz{^KGR=Y zCKDCB@o!MH{Gb#0dicxgCLfQH!L*I@B^!6XZ|9L?3b0W9N7E#@EU%z?A`Im|ySu*I z#vLM5YEec$k%cTi)r|EzlGj4jOl8R+sW>_{aMk7aq;XN-#~vfn{2U%_$~!nH{;a>n zU${S@CGlY>lc=Gb1}+kWXT?1+W3-E4d=z;PK`?YJ!Cqsb$VHl3jnfO+-xS8V97qcv zkw8(`BX!ZHU=!gRmqf|~z|N?niq6`rl7eye(_O7qD1SG~J@V^y;ek4lijv5;-Cwzmj#Xr)7-HVjedDG|Qj)ER z4Gq-#c9SJcK{1*kHZt-XFaM~lYE5h$y8GL0L;DVXx4q98y6^2mH0sZi_u_L?8Sgyr z=rpQ%sCh4P@v4=2m)Y1}LRI(od;Fs%LC21XSh{SH5cO^w_P^+Mt?Y-19o?^_|0dxg zvq_+6kCWNoWI}hgcx6YAo8RA*8M++FHuYYQIiv#iKEJWQ z>BrqUPmel?eIHN%W&j|$a#R{PB>O&wT02*Pr4tt{y`Kq<%2ndm=npsB&tmP#RgviI zkM`UD$_>d=Q`H!VOWyw`pq-~-+&Pd?v;SQrDvtz;4knN7XG`|v>G*UGrl0QT$U*Y; zLNtc5*bj2mwDa{7JBPBR5AyV)@(pq{hV#u1@=bd3jVe2bi~J6Lz#u)&^32hkTr)eWA@me^ zS9VQq`5o2HKz_p8G^h5GkLp&mfBNCOrVeY4>UW}kzF*dyJ{>!1I3|I2M_tpGr$@g5 z^u-7&tr>ETV=T2!F_NWwhEnFZ5gJ__$gedEesSEy+FKkf(LGE5?)VQkeMzXQ*4)*U z<7NS!l5pehIp*5q7Ln+ZNPDe$_VMFZ$=;G^pYD0Cv*R{7`chPg*1}DWlXf+o(zwL# zh1)VG9eUBFq;LD8;ER(^lit#V%I?K`?@qd4^uN$;T1yX8PP!d*ekJ3(m&9vNh&}Gn zzfzaAmZir}df~ml(vP~ApPrrcA?V96RN5;F9H+QYow6*Jo)s0D(|%NR**AXeRgD*? z1L)qeY>A##op+~$82a*DRqZwXl+&SHo$`F+o;9P|)8XRi@&bG9b+hr)k*ePEBA=dh z%d=BFmcF7mM0>-AGa}kjL=(AQQ5QU_U>$ahQ6|@ zO?%5D@` zt!iTF-3gXCpM}O$HS_E2hQBzUW9_SImFV4#es@04eWkixRc9|Q<$OVas9W7>+`E@h zd%h?VQ{8Q^^EY|?d`Ysey4R=oZ~EE!vfPy#T!_wo7RSYknr_WNV()&o%*Co+OwCY^ z&O!c*i#3zJnvu%hgQ9mA>#!@egf^YS(v*u02i@8+eD7gJ?Zu{hOzp(7&QZhD!IiiQ{r7RJU%9rSG^^=5iMmQ@6mcd(!#hau3~Cw$eks_=C40g~td5+(YW5b*RkK#ny~K{8OuB=Fy$s76(w79mjQI8cu@NMAC@z$C~B9z^0p z&8mXT2|<>}K`_=}8_8f>li*kIU>yj8y=pE4$rR&FCc^$9fudQMwCiMl$k_Sz$2>A5j9m2b%cn9;|MHkWRqlM zvq@wtJhB}f*;y6YO^ED0j>NG>4M;`}nM94iqX_7zv8t#ELe$i8)C_C%oMiNZN%Rst zdIcT5Ru#QLh~7Gm-pPGQ_b_I^ox9H@<`^DxtQK=x6?3=}c_|rlu@VEUjsYdb0N7BF zI24&L>R<&$f}AMs#8RrqQjbQ0t5K|ZDCiv&^9kw(TP(*Yif1+UmQ*aiY3v=}*lq`k zdna)sjug9+pG8eSi~D|-Bqn{9uKxUZ^z+k`&vI<>3R3Y(rtvDi@oGu&8rAVyqwzW? z@p^1u^rgNSn0_(x{bG{z#jN^^`REtRlP@r~1RJRYThjVV-vo!G1gGi*m(c{blLU9R zL=UM%Pt!zi-$Zy)qF;65`_aUYCy59)G*Sv3Xo?Q@MTaJ#!>iGeqv+@pG>R=LPAVzh zG%3M137wQg{RNadnv}kp)P0u((ifJ}pO->f>)7F#I?R?j zc#<+2mO3t#+F_Df>~WITIhxk(nBE(fj>}6Q=tv)8OCM2BC(vY!t)@??XG}R}%!EbG z`KHb1Wh{neEZ@Pbs$EJNe@g&4P@)4%RM?h zXDiE9h!G1J6YccG4CH91JT+uDTpRjsm}F^@G`wQ;&7%Gz-bS{W?YCcc5P3JV^Op6*nT}c7OzO7Xy>EB8-z}fmH2J=uAp}s3YmeIjiD!<^FhDym`js z9(PyjEkA9%OrA%ffjZ@aa*wH3z5zJL)(~9zuaxyW^0A|6R;`c)|JIo?Ou!^%vGi$` zbQt(vB1KWzkEYj}i-EpxqbKx1x3HaQSBN4)IoZ<&KF87C2hv{0Yc1cYjNAF{KASxL zr(k3H%{CIg+LCC6P#z%wC~q2!$ocY(aMOA?wwk^b3@n|nYcC(U{w9loarV{TsF(%p zD(SG!$YDQcE?lTW(hv!tJc7YmOa;N?^CMqF0?kXPN|>YKq*;v$yBlQ)6-Rx*eMHok$}( zpYqvU((X?A3J+h_KLs1%84rnLSA)`q9r6`@9gUX#GEb@J0D`&L@f3Fr)^$0pJwH>y zgEU7J=0}4dNyn=Zo6Oo{;InmJD8WuD$5bTR|7;_#F3g2-)mmmxgBjUwWhmc;mJR=- zkGOq21!p@QOZJW^sTgqo zv1tO;&+ClX?hweC7)9}-h}a_ieYd589A{X-5ph2EXkF|{Neug!JH z#%0RPU>uZo_h{<<5m8%Us&zOnZ#t00P4c4^hv&g;BuU4cN2!u@ym(_bl8$FzbVAbc zwoaBYBpq+%TOvuv%l&uC+Bzlac=ygW?t{9LHp`ZaWU?Z*x6Zcj9+C<+n&)r7-)-mr zIU?C9v3c~SJcz9os_;h zZN+n#l7vjzpw9VuH2Z`8D(!NytGuTrcEXg=FiH;5(zkj7H0af)*{eM!H)^|bUe^S=om*U9pLiYcYvV1zaEKm3TH)Z{A%KG1w z^?#MJPF!n)C9c=f$4EBcy4>-{k#P(nkR6elyWv-6fCbp#hk~&T46p#^L1I>bxWgOq z&;mJ@9vo$>j2tSl?fnvW{juPLeQl!bOCUL$e`f?4C^8beP&w1lQqs8pO6e=ZQ=UeF zrT7e4UZoEZ>f<2+C*Z)oh!4Gq zUO4JI-m!Z)GP2dhfUspmb0@du;nhN!$JjjsuC`yudNyfa9+ z59EgkzzRkG!~G*r&$nlXj@_L+FT|%;1R_@nRjBlM(fDx=MJ)skxRZ+%g9k`SLLaXL z2%!9?5kCFg2-_Umei&^pz?&dPCxs>dv;!H`^QVaY_y-y+X!6N86kM?M0j9F}I4=uRuv2pq#g0#LwvJD_RYJ0QkG z*9WM^?Z?JXK78bl6nJk*pp?au`9eeKVn3?;kY|Rx0X2t3&4gj7L0O?5-yA#yLO_ZR z)ahuNF#w&|u1BvsWJ~wCs>~%7HsE;7@WX?o1oorP8ktqZVOQEjaQR z5y+?Fz%6vBPi1-ujmHRznw%k|9*?4`VdBMtCs5ShByHB*WDSMl(# zQtTMY*(45-$HWdT`Y65}@kK=%u11}*DfQ{e9SSuOFf7DFt|}A=pvW_(QxN$yho$M` zruc+~ROr!x49N3v)CO4cdw_)GT&QYQIz|8YK@mAvIK)OH`&D?hQ)jji#$yml70mYi zVi}x3gy!(OQ;?2M2Su`fsbUPBazm4$Y8vs}!-?8?WC_c3CQ{^&Md(;eWB=^Xv5I^# zFpCi?2G;1s8Ya^6^Fv*XW0~2KPE2yOD!~$1;DhCWFFB-3ou4I0BSVvTn_ajPjIJ>Y z)?EI9&4)Za{#XD&XD8E@0X)^5-ZD#(Zkfm^7*KXBp9>d=KP_agE(Gf3=OokR)#Pun zqjU4~gOBtCcc_8IK^!=wg9DHQ<}rPzAdu>tp&!r+ipC>oWoGEqS>8Q^<~^*;31%Z3 zbB9nTlh@1?llPPRVrXrua!Tw2(|n-NyCwO?B`hf=9B0KsxKRHvAECB95`$$%)T4C^ zeG`oM{KYJ(=(P0fOz;b7axU&-#BzZ0Ss>iF@cMUhSv}dacJhP2z#tP@MOb;iFG5&^ zLfTzi7*#F<2R=Uo_KlWv(xyF6$?cP(kQ^mhPrzHycQ$8bILAcy>T>r8sFh}=ET%$t zyyEo>hLVs9Pv;7LKw69hx$}#vTR*D&-&NfAMTBTp9=xo0`>s5QqrxbnJa)W{Gf|TI zf%lOU!#f90u4gp{1gH?Iz&$ba$3vgoTKx>#ntrib8c*{InKv0fYB}3#8JBCXR=Th4 zgX-i+_eIT}*zXZ~fpq>9d9aVSb~BpZ+j;&qFK)qNY0Z(N4*AZCUzC^@_2O? z|DYqwFVXw>dX!<}uE#V76F&k}jiueM^%<+Zxw&4i7fYTk_q*jR;e7pfb8!Pl?Cq zNrGG$0qT*XV_$~e5CPZWz{??^Iz8I$h(`8vtY&PnZ%!0&r;&$_K|rgK`J74Vy71$= z#;5+|qIF5Wp+0amBqonRd*csfetv5Ae(C;6#+P!ZDTBj3sz(=PZFHM5wLLqb9ZRD}7&O%H#h%hh#L2Fn{p}7M* zlO%U{X}{v%2D5K%hBC)rZ`(t*yPRKjp(^4Pgz^JAxL~KAcQTN5(l_RJn|2(H z-$-e@_Ho%WKo6vfqH3AB7Ig+)lQMzBdDP)B z8tN!sDj%`gPT5R&TxzIHZc4%gw0onwp}S+DyLpn1QD_H*htmAki&3rlD!R_lxB>m+ z0*yECF7iluVhvYaNx9<+sRbrDB5D!A0V+92;QV4h|mdf(iPM~A!l@9 z8gjr7pFtmRVQ_L5JQ!S%SEC2+DE4^_gM2MUa@7wASU?#HaOnWh*-AgR@IW;R%**Ld zQ;&4lvwm>?FcR)GSdAEzF2p^qe?y*DsvL!TUC(66IdIG38a<@{s&+s5 z?8vK4{0#`f`pJl?V52nz@1c#CssC*FVPHLi5Ic#h#!-v(&^{_`f%YT&Nt&-*N_I}} z{t5IGgk=9+OH89Rj>6sT8MybsLqvE`^vS4{#i&^9$ZO#-VE>r^2SOlVw2C|C1=+-_ z$&t1vjUAg`nkNZDC_syI6MIiT!|_Blbh3+BI0C-#fhS)R4h`Ukg^)k^^B@QEsv9z2 z6Gp(&u17&SgmUo7G3zX}($(bkP>B2wWV4=}(PQsNLS?X!097wJ#QyeSSixg@BaGp}C#CK_x(9Au=EO?*8($8*3Ek+fNBAD^? z4GAx?tts-Ypl75~2OM(!Ns05$%#LXxPzS2LHNPV~ZPO04qlAJ8v3K81ql;nYPQ;NBT`qT3QM#aA-@S2Jpic6J$HDJOuU>YWL0mB@%Hnx}DE zMK>f#gXaP1z$;^M!Fll}9pqm=uEG*mg^sDDqJ8G0uH9$J{HaORGxJ^t3d*9QZ_}hQ zWrYO0Q)IQx^1BB#ia_I7qo>x|&30%RqyhXh6wgte-qi0WVAQ5F5qJRDPV(KZBXvor zhp-6fIhJP9ZRqHVh4O<)04;zF_PG5`G^oA?l4^WYq+!Vj~xxAdX8OR2VJ>wY@z1$pf3>3N|z@b z)(EH!CLYn6T)VgN{<%AadBL?`rYWGzZx}#jI^m<1<>qRrX#O5G15z1EnQKk$v$#7@g$S#-?*nn~B(La8gi4==b7Y;4qwqNJxGY89?wdv3QyxEzdq(FiS&$(L z(J~!*FNYRjUDyjif~elZS|CGF3=$}Ueu4uQY=LKgX5Eh*EY}d4f!#7%q>8v%lbt7@ zi^^0Cy?V#2IX8A5aZM$-xcE%~jkp=m1o~cd5F;NxsKTgK{ZIQCaK#~IWT`bQtxue; zCD}^=tV3=(RBWdmMU{0s#zxrBXdRcx^2n{gU?jKk{up8s)<54@Zpfah;QBQ{+3T;i_ubAVANF*oy!I5I5WhV^cHc%jplMD? zPd%8Z`F3QHO<7M*)}?qRb2Gtqt|dx$h)-la94}=O$@<_dSqP%*FE87!A>`P=YPsUK zbp1qB@FSJbn>fWHvzh7eaw&$O-J1vA8&li@m!JLNs z5;KdW;}RQ(5-ymzeBhx&PHn=Yu<%P<7Z2$35C?Y+CRc{%ihXe2_s_~7lXI(=wVH#a zks{4tc~I0>HK{V&Kpp9|@I4eaH0_iUy=)?0p zh1qK8m*U;Ga{gbO;T=Jmmfv{pOEZ~zGPG*^>=1o!nY!xP_jllze73Sn?rb>$T2nUk zyyJ|!K$?yN(KI_nF;c}SRQ|Tq(M4n>#`E-aCE@aEXiy62y}_dZX+ZC(e7+jAtAjM* z_GfYtRTisYSV3jyC{9vnzH^7Gw;6$3aU9B-cFz;@;U_GZ>Vm0 z{IYsjTo)N{0Sc%qYQL4_9NfrPk%ba=_}Rd2)WzLA^$l++8>8)QN*8WJ;Fl>rIlwrq zv%Up{8c#9fklrHS*<3$fW-G)_a^hyAo=3AoI6ZL zPMqZaa8@R~=rOFph+pIM%?-QTAo7<3vj0Jqg z9q*P=*2nx(i)j~uxQW<+PmTvLXWK83B}+*0o0jhi6OQV*amxJE@B1h3@9q!D7+75r z+J3*4=c6}8lV5AtZ*XqDqU%&Wy+XhX{SwoDYu*^Vu)~~E@B~VfJO7)Y>y{|viU{<1 zdSU?@6+_H2^>O>%$~a;D`(SP-=I)$`5;HXS&)vr2_si>DkhhXSoJO+}+%9Rt?SDfZ z_8adj4Dm4Jz?yHX+X4iR|B#DSw!F3`^QoG#pxr@)aX2&wvIEFDi=Raj2>h&4Rq~9I z{!y^=;M-PM6@lbg^dW=RU9s`5+vf-@Z)gbUzT#xf)q{`=y;(s(Tr}`sd_gP^<%!ON zz@5hpkyuJD9G3bf;FsI*h72AHQbEX3tL^>-#fW554OF!fcrlE@J5jWyYP1ma8=q2x zTO4OA#kP*Oz5s0eSw54sMw$#Hy2`y25nED~tKW!vLri_iX~ouM3ceOtOcxCGLs9B* zYYCe^&ZeT->vk9z@M(HxouwxNHu<&}+x(1^#St^RrT1F6v8b^G>v@s@Pq+maLNxwhv^zpVL;tytwTCYQR1mV zplNkViBqUTzy{2z+PzgQ`w)D7KFjfEW?)F4ERRvJl)LfSn#pU#v%*Lif1~?sB~sep z1*4Y$+(7?L?{K7HZVM${X}EDEqfzy%Kzgl3ed4{i-3QPuZnif)py$SKkYB|El%Ky` zyBS#nd=V)8OMCMQb-=B1Gt`$Nr*UVqGwHE!_n68l0`m>hX!L(|3sKw6yt1OH-iMYM(Qb$PthIWyQ1u zpiiC26Rv`j*~!zyy`i(y%kjBphDmWtBCDS|xJ>S; zS41$6rwCHFK1yHX4a2reXZDNM{AHLKcL8#KIOd>X|tgjU>1E)a!VUl z$o8UFt2Zr1lXdaVqamb!>qA^ZG_I80h8~ z`DSTf!{v95Tahf^mKGnV(N@XraS50&Xv#)Fpq9HrjQYNucnuY<^q|nb_cYHjepdxf zKWoa&E||0QwU(qaC68ZUYu&AGVqo28cBx-CK9V%Lt#c6Z=?6#$b2{l*>Rmnwqp|;q zWT@KlkQ;uyzzu zz2;f?RLQ_;&gbh9ctT*$^WJL-wZ!X75uaX+-}uBh`_>w4asPD2?x%QP#>DF4gUI=) znDgEgiv?Uvy{!pqr{U9&6La{--Mu)_ecMLrCxr9vCw(9sN1f#BM|xuFC%caw6hC*| zr;a&zdcPHc1SclMu=gWQ?=bvXVLrYaD?x^ga-bkr!e*jka*yxSt21W6>5(&~=kIvV zBV+^G@BYF4E-JxF$jha^lsTWra@B$uDNuL~Ec#*SFX~3t?wXuxEb;*s-6^*@$hA?7 z#m6;r?dP!#$>DZn0YbuS+;Ut2zptJ%`}$&q*V0(nSyJS zx>CurN{f&|&u1ys93KQ?DT!{m#n10h3bGbM82?-=E^sgj@>xNP#X^f^H@N?;)MoYL`*5W9qpB4( z$@_XL_tePAm71C1$aF#ayt^vO`z_98O0Z^X7m|)=PHSt>YUiTznzzk^QAs2|(*2sE z^L3?bLrQN0RZW!I;NRLTZQJ~s+ujegeOPGwxZn1Pq8-85?$6tf6m1VsY7aDM53+3! z_G}LcY!8iZ5Bt_0Ue->GXl{=jYL8lIkKS*Oq3A#{cEs{_#EEu%R_cg1==fsWk>J^p zNYe4*JCeS2B$suhG?R3^j?+~yDi!VerPNhs&{b~RRpHrH8Q4`7-&Oss ztEQ~0wz;crsH=XVt6{(EH$^v=vAdDCyGgYBk5YH@H#Om^Ko#z$Z|4AomB5ZN3Lnqp zrH*e}U81B1Ov^74soAc$>DYtkjiy)$)J6!nL~1{w zXs2lJ)>-N4_Us|{dj1xL1zLp3pWA4Jv!;^YrJob+EkIp?zhySD?e6IAR+Hp0^Yj;8 z=}`*>+TOvSeOW9_dQs1G>g0Qn@;U|XIwy{O#?3dK+Z78!`%bh}sm3eZ3Up@!+pbk1 z)pvR{bAi7lh0NoxyO;!l8Jp`@LRtLScFi>yalj|o0IQuJ64rVrqY%_i0F50`y`Y)g zuhhBtrztO)0`yl#b+C;dFmaZ~J6;c5uBRT^Pih}JdZ*XXjw>MaYhL%Ka1Xx85q<-r zf7KMlz1U~UtIsp3O3xi=b{v$U4n?Qv$-;PT(0Wfy0^Ys9#u>}AKY~f`radqH z{T@n@U>^Rw8+F=+p-3H(z`N~QP6zCyA;F6%dVFiw-L!=#UxMoizQP_&}P)6!OE|( z7Q-S1G9jSy+6O}%(`1HeX;?jlJ`UtY{X#1g!h*77DzsdHS$6k`7~CmzUZJ=@YQEXk zPljMJf>QN|P0d>rtzB3|UY)W>K_4IT=HuS_rcO`#{R(04YH-wfUY(G1s5O>SDK zDBe-}03PHlAMz3xcDA}Xu7pXNmHGv|$~m1Ym$2SLsvT8&lQ$^PjC>N8anmixO=|j; znw51an%E(z1+$Z?>Y{#k1j=)C%-V(lC^5D5XmN zq!jz&>-`(dlH@|Su5fU_da3e?hd^US0GL(Sx#(Rr^0qTkp(pwoF<5f}gmFRE)Ir+E zznumsQNs%ZYb@iA6GrrlAJaLJr+2hQ2DP^mp)0tzBS2aAfNKKwN!hC$I~FdjK-Z_# zj)y>}ghabbN*l~@A)Lb5{pP9G+V|k=uPN=N(h7da2{EJQ90-BjGSs>B%Xv@r-;da{ zY$e*cE!m5wPwF`ZRlm~jdL=ClE=_;+Yb4J?+>zmL1oG*t`|7Wl(e|*S6^qy_ZlQs7 z2`lwjihMB=)^deWk=_6~LG>V{s<=R{Inu9Vm<$Klr3LrfkCklGyX zq7&*;gsm5=x+$zixd>%&Lm8wr1pGp8tvyAq-wU;djBBINWbh3P+KVVCOQ^YygGCLv zsqI_^o*R+wJ7r4uWtB~`-)WQH!Ba~Mqfa-7jHYbdfIM>U7>xikcS=hEkfxqRAEoPY zg6m+BD}(VYVxZQ7YnT}mKz{>4_AW4chDlGF?sQ9GH@I}~>Gpn+|H-i1)>IYgJ@9DK z-WW|Soam9XmZ`HcAW)V^eDZ9|4_Dsj#|iCeu^VXI{>;+ z8cOL^?thmxPz;NhEZ%Tu$evf@2sjRPe@F+;ge|p#Y@)0_0~W61DYM2|%-(vLBw7)U zqwPuHZ4miw5vsZVr)@O+8QACyOsKYMg3b|8jFs8DYIFs0gBhFkDl}Mq2k0Oe>fCqe zYK+$Tk>dJy0|w*d0HiT*awC)j)%A=_uJ%2z#4Zbfzj|akWO%=K#Qd@LrbzG*BiIOF zpxRl`*4|yV+hQ!bH;hn+bD4*fYX?ND5Qw!g$QVCvqPuN3J&3k3c_p+PxvIpfJ+Q>-edYRdI1;rj^j>cYwZNAm@@q7OD_3~k6`>;|G%O;PX z0dMFnha;cYZvft999#6>OIAx+xL4Vy5NpERj|FM>k$pLV21VO(< zszO63#X_e`D)_pX`dz2#N-Zu88awcS8hN;@dz^_tu!(w*-wE(WY-E7HJ1R`N{tlSs zltyJOf`OWl!XB(opfLOXfoQKIG9l}9XZiJIbikBU+Ale-bs9EaxDX`#s4X!gc{aH@ z_TtZj@DcnRx81dyFO!EqW#$Oj%HskgG2~&s7kA<>ta&I0BtH1(o&$rz=eR!S-AAv4 z+Ae12{WfXzT7Cbb_`HUU+I4WmffeQ+ROEPz?%`v!yY-(?hE<2!7Gw*6fspPCYhN|v z3!}Ud_9HNshgOE*=5>9?|4X^_Etl(!j|4}H^-}^i2rH5*25vW=wVjXQ*yA@ zj~%&bD$>YYkgFJU_4$e!q`yUV)c!?azhdrM*5_M<+K`xMy9lI^%0>=njfz5AnrN~- z`}<67(HQIbhUA&5ZS5tqcSlp~bZ%6u@~+abT>l_KTMT<(BpQi@t!H09Qc{#3WyU!>`H zA6uLLiE_+HadxV-O9Z}WTgtSf$ENwrWWp`|*u_Wn+`xyF*CR~RtCHBSI(nKbNt&)J(UkFsdB0%^VO$*s?I=HLM zA|DtS&PRwT*~LskUG+3C=u|#hX?IbMO8?rdo{2jvZd>zKdC=FY_rOHg3KpQr!Hzkj z)o1W$W@vHP!qMHgvwXKio&NT12d~An2;jOon`a8_*~UXHLG;kn0i_Oe{h3NVk(|Vv zUh~l&kjfqHeq>y;q+s12_)uM-?mA@|{Hb+6oy2&E4XyZ3bAu+4BHYt3VZ6{op|dSK z7xA1Z`_+*OSr((vkffj|qrZaWD0gm#JjTR1kUXca?kdXMS7ltfw-6FLT7UE&HtfB* z@?i})U3Hj{st_h{Z+sMU^4I~2fZSr`L|Y!1K!X;)%zfznN&wrCMd*m`ykD)gKt(bu zPLt`vsf5x2{PJ?ZF&&_~c^0UUpW!7>%&k9CdY}|Z1kEc3e|AiOX!fiupy=m^?LX7S zOHE)GsN#J(QwxzAa@AP9K!5r`jH%#Kq`eCk1i018e)znN@~H@tP97;-#&9h-6eV=m zTK=L};J0Y+gPYAX^Q>J4Drb$a znF4Q)!X%FMA+q?xOMx<{b_TB4$n5uD{eZaP5>o#bBAqZ-Gvx%CfLqFWy^Oc z!Y1O|v(hYiq*Qm%L&JP#COTs3RgHix`-}r#ho_CLVXvV;W0_OMq~_HhWg5ihOsI06 z(lfgf_yySWmbdV~H~?SzdvgTD*=P5Kq zi@t40Aan>wZ-(BH4kAhi5u`~M5fJH3dN-kWk=_lx7wMhQtMn3@(z}32N99D{cdfPe z+2@XN_x*6k9^v=_r}=*krPUYCFKk6gmQ zNp95RuW*b_e=Y^V!m$EiJ{Chk87^9s7FEnc67fYzU)y$q)x$G-Cnp0cA7RR%JBz(({?E z%MO}R{W;1 zSqi{6Ly9>h(~>rRJ|f+~G#CButdI`AU<yh8ckwuPYctCp^pd>)2dvx|VoqjQ=SbmRu+u-~`F~+eq ze|?>CiFyDD5oMTsNj<#XHShBa^(QmUvt#~VpYA7Irp;XAyDHeVz3e?`mVfzNM9$b_ z@7bLeZhmlmnFxQyGoP(TWo)-~b?m`ke{i%21l^pwN0bk1b;rE6x~?w`1+81yBB0+t zyR~)F+je24%l9~p)UH;=IbV1$#2Zf6+nzuCz+sfJ9phek#hYSz8`N#TcHTlcxo2jZ zibeP#2k9u|4a@1I@oXk`iziJgBr%W~~-3_S{vlKe#cjg|}A z{w?OMPn5Fie*d%flO(AhIJXtht6>-aozySB+uvgD5+X!T3#1-4YgS&*)cjJ7cl6tT zNqjRu)qY;z@$k^4@@Dya`$hZh!{fkvKUVK_T=q#lI*G6Ru_@GXHTw3^Y3{wByU#kV zXFDF9*PwlAE*&?YZy#ND-}{9QKK$5{lDeL%{B>5-@$>Ml)Q|Ohw^vggzs@_PetoaJ z{rSD)_SdZx0E_?-K`|&07z|J#8v@7&1&Ja+kD!=}2uw97mM#Lz7z(yPfE}RN?g(su zC{73hCkBd}guu;$;uRq9DxmoF2>f;^K_7x(6iPUYAp8s^+CmT=LWx7N7?wJT!Hf`~ z>F^nXgu!${A%v9amhn#em(C>_S~B%ZPE&K??BzEwI&_`eG@F8n0ec5dHI7G_^WuB- z>go*Ox)w;Sl}TN}K<=PGz|cuQ&`CeSNMlDNR~1S(&PbyTKTwt@4(eq1+(}Q7E#o;Q zG)*mMPD8UYgo}XF;b5#W<}lF&L5&sF8)0;a&btA$_+bjdxY(=<)6hv%iVDVUdN^GQ zd3jWh`~V~U0wV(-J-(BHM9|b^F%x%IIJff?&QViJnjnUg?7RMxY->Yz`tFRiWj{lj zyy8uGa5gR5C{2?hE9BcPy4uATbI1CAx0uE_8&!_g!(k>903UB0%}nr0^sCeq<|mS} z5=dNT5jg?GZH{e5j9(q#esgXdBwmySB;Z7I_!BM|BtNnH>cO?Vt|{{qWoF)H0HbS{ z+59VcNS@3u(g#V*d{@lUcq}4@%%aADqFtoiVcj~aPe^tGM0j+^1ztVtF`*BZ_q0?q9Z_E=Fe`QoPM6%JjK7iR7^~qg8mL9PD z)LBkF{8pJvUp5ifZ09scGCcYWiYYcAFHvoQU$n-MCeyINXgAbpmW7FjkfCjaK^NH6 zO?qq(v*`xdpX#Lb7F|vf1k4bUB?6oE#6ELi^cd zF2h3CkWqk1Hl0&I^++c}AEDDM+nXF*F9!Bi`7L+NEt|MVhm$RazD~yoWzQ$uuQv*v z@YwzFUfFxI%MENZOcoMya0EI81ZJ59;cW-0JqgxIlFP94u3*Skoo5Vl1*Kr9UyH%EUS2z&(%x|PKMsC41KRa+Y12Mvc}-Sqz4a$FP#-Olo} zE%7t-^ea2b%24!@QC5*t;!xB$zN==#XQ##Wycb|6dpVSD4aHG03ubn8qT9)^)vm;! z1Y`QGFJ6)YH zUuTedkp-Jfrqg=vqy$2+E2 zp0xJ1!PefHqYe^yx0mn(BRNlc@KDd;aRA{l;4F{wBI`D2^=p+jL6ANHmesg(^jbCF zl%mKH_R#?0W7Kpvq((mKd%TgLsQHP(arM0#0RJ3@M1PQk5XXaCc}TeOYm}hWcT8eC zOi3x)M8qaVn=?;;CyywmEVlD~mqGNu(AYzr;jIVv(eEsCDzRe$uNP{^G@bDsl!c4z zIQ6^uvH+wR>JqKMSHBc^oaF8{X0~hg*${*c1Q7n<3zGXLE3^^7%2S}i5=Sb_Q?CZ9 zI5V_0KhyQ7W8%VQSFPil`0BwgBZL`9mNP77kEQJ?J-XCyZwK(=XFUn()0);o`N#4p zyFqb}1`Y?jCuL)P$VilRf%)Nwjp$UxcLuKkebgFp=BP=JE28;K#9(YuR?^-4)h6CHh?CjX)=_?OF z6t##Jw}?}9tOt*Xm2NNF>1kIx;_Z@BvT@H+-=1A_pGq0-1ZS~i0YG&cp7b8}j7WN+ zK!&|h*6RQluc~W*sBFXxNbU*?+KFsHHcTxDho*YiN^8lYUr@xiWyg7s^U5k1uDFiyjFawE}0Hi5h`p8C;_rdtx zAqB)rWc&7lGec?GYlW}mi>A7Y*l(|&qngHp)a5u@a!X5U?%`>C9jLLoR(5Jm+di>Z zd$6AE!yUydSLV~oBesh4;mWuEc=v&iEC$|6Q`YzU1NstG8A!F{o!~}7jFzVO@hd!< zOukJB-z5gk2nNFrSJh31g=#QsN+)%!tbozrAdP)CVsp; zIr%DJO3ZI(LtNW{e^u(C;^W(gGk1R~89n?s-!?eb(ti1n2Jp*+!+eeg6TMm35No4O zVDswRgAT~hL?FWBfo50W+svEZ31~Up&~6M zaZ6Iwr;MP#!>$?9v-`%W{{F$}`HMEcpbD@gM?Yc)sStYY~L6sI2@T2FHm851v*wy&W5Q$Nw*C`*zGpH**f>qT zmGU1_RNt#X{7xWu^o|B;BG2^T&F4tx zjx&v5M-W9V(vdw_!^H6ps1Bi_d{6{>+WHbssEaZU=XGaXAGZ~rXYDV=d#IdU=YUCD zWwk|ae&*t2AbVF%m63wrRN(oy0(5^?CG&;u5QZ}h=b^mVxU^BQ@2Lrh7Ajkd#bU<@ zVZKvbSI_0;bxYG=l0{Q1qve#Ghx@|fU1nS`T?vhhQNY`!q!MdFOo7i{sS0xfj+NYV zhLHD(qXzq@DxRyGt&aoN7#NxqliaYO_YEXj4>_9?T|SR)=z;rOma_b^v=+16XT@8L zw*__gii;~2Y?3M&l7ck&Crszcx)+=GD{HopQNngjY{dsX1^Tb6n6;Wst}_Y@?JD=# zJYdACoeD%kYiSmQjcv9M9J>kwy`eqSj!WPA8TFD526nT4?A2E(hfs0-%D-_Ml1W~& z!N9*$N}eUBcmBPf{H5gCoawt4=kwNIvLC84<-fQXx0jZc)w}NYxJ95~4Bt!RsKM&YPZ*+$oOztj zEEQ9U{rEPnw06`GMA2FD3mQccg=E=+z4ys;Crbz_&2);~xOFO@c7~9*RPF25sJg7x zq75dDSD09T1STq=WPm(?34NY-0394Us75dBufX{4;5HGVY{uh{ISK)kLN=`&Z_t5p zyaxevO`0r&@#If)jHut|4~KHS9E#$cV*QlH?YJgc?6N(O^+*axIP}IuCg)FZ`}9>y zAt+!#IJ>~E?>}+=bR+30_ zW-a}%GlqeR0qOuQ^cl1N>lq>RG*Rd?q8~GMv!#KL>oU;{auEsQ)p^Q6Q1z0H6zBZm z2;P@NEca`+x>H15)L5ZD)AP>>7n(@x-~B*oOOI=xu2Ii*7WsC zT-dxQ^(dX)FUd~S<1+RE>_g|4m|TjQH{FJS+0lLav>raQI%#tbFXstiWjfS)grLzk zi5w2du=2OmZqom`9BAha`f{LuFtqcA zPPsa7FrMRCiP2zn{%|st4)Q-Y+CNAK;<0kN{73bsMs76^S6#_Wss7*U%|z{v2zr(J zzto$4RPN|TJ6gS&snX!kQ}6zdMmyg(Aj4mc_BlK?bfbN}KbCpSi03c$rbMt7`uhCK%b>8obztD|#{dpYV zMHwQM4NJSED_IV=av3uSR>(Zz;@QjrR2@;aRKo zXz{H-jrN`OchX?ajad0Vjdr%;jW|`&KaF-@TKaKX{%_JlDKaF#wEL{`c3I)v_GAA{Fi$3>**9)3UfBCt%q*3>sywi8|@xn&(Mu_-gA_BviV;r7+*emG1pKoz_E3VNjNpXerEZ_2x?Gy*l!s-tCXmImg?dm)n)Mztx*)=^Ft8fc+Q=q&bG+sQyuJf+ddOkSGKu`{PbL!{Y#| zk-ycO$AM6SY#gP>U8H~1o7s4J16>r&$HDwjf2lVYjzh#pvWYzYQg2EVMP3wvG?pe1G}SX8pH%Q?z}4c{k#sbwfu6e;k2* ze*lg*@vzc!a1qFhl7-HBVv$QCfL9^Ots>*SB3haeFO6Q2i0)Lr?PwXfdy0WK#fXE? z1S2#n!@zon?BgPBH34(i5btRO(+ERWgAPonI~(En42&@f8!#+-21h|1z#3!@jzwZ2 z1GMXmmRVt>?tuYgUX`g*WFT=68le)iv7m6&3R)1LD3~)5E*d4xC~sT`5l}MH4@5v8# z3Lui+z|SiP0LPj{T3Au_+3T_;C-Q{fK_O=#oNySg0Jh|kScj~5oq%=O#v>dI6oeWB z?_@j*&XP+p*cie%`hNcvR~|9qaS%3_8Hf_XM2^`fPkW+)r_SLsFWUInRk;jESBeA| z9Eu7uyD~;3=rtdWZgs4e9@!Jo4P(u1b&?ZUIr2%apnN^Mu>76$_0j6h&|a7SgL-r5 zzop)kP+1aq=Y{hMfDz_BJz)U$!;z<2t!n0{f}R0VzLS8Q`lW$LfcDO-eJwFdaXhB8 z7dwIE)-MaEg&;&8=Fr16`Cysmm(99rxE(HS8S3oaD`*F>%cC{|98*aU z-7VzlPA);b-i_R8Hm>(xTgJPT{%zteSe>PRh97(29R1pbvjsiVtySU5Hm7?)Y-VPz z(qn1Bzwkx?NQFU5ja;t8QF77{@YP`WtU9};sWMa zfnicut-x`9;|+o6&PpIe@i*S+TCM*7jW>Oq+ZnF2*4vq$TgBU1zURB!A7Egv9mF5! zT^L)*PEM5Q-cIgcX7LKtXg4G2605S(>^T;aAW4&lH7L+ zPhU04yx-r%?XI?vHn{X2ikU;m%pdUq<7*tWF`I-Yb^rl-k*u)YGahyxp1x=Tq8P!P z4DZ9iSA)OvVPTr$ns+UfDkl+Zz50akKm9=McSosEemYA{M8znYR6qXO%IDFTqNv|H z9h{AEZ4^?Ph!BfHznQJ|ysmi8$quf+GTt{E2DWf|XCr^ZIQZ+Vn06H`ijzIB@-cvR z7HJc1PRl-3abEYD$-()K{PZliL1mKOF=`2h*1s#UZqUd1Z2Nqn{^n75GyxB*ZCRqb zfAN&;m)$d$bV84MvG%i1j=^-TOn7td%n^j|BWZiSkbMd3S5MkMwdw&}-s*OPe-IvH zQ~|z(>tCp9_!Em*0lqX8ok|z^5u4fuVNF-`5klG_X{AOh7dxj9Xk>y5jt$AN3d1J+ z9PS|We0GGqyr;2%j%afin=Ylq1ZxglIzyIB8|D3E$p5_7(tN7WQ?XqDKvEuPz9-(< zf(3*h!S!AdN_5~XPE?!+qh9QB7B*wC@kKU&SYyzT8dzEWb>6S^$W$pzj)+U`ecann zMjo7=hcE#kMb!_~J>vV-3hLLcUqE;akT60Z{GE+c4^XDRSx#2!dh(`)W?CFeM4}CE z6rc4hG0aomQ~f$)<=5UTOWYIYQ6Rpj>~f#_;P>7b5<+wkgZWb8R;88L|C?CE=KGQ(GZ;V0*oSd2gfb2 zHqwU16GU@q(U}ww+81EE62KVd$ZQ3YiFJ%~vfFFG`$&mtx8mdg1+TF?*gFL-Tln)J z0xUdWKHFfr3tIfYQjmC-{O=AFB90H1k(_Y$xOt7Mn;QkP6AIe~4 zQb_u?Gyj0S5C=qqBlxa3AjIPBJThoaFZcl}-~=2pbL(N{GY}k95N3l4{InI~*ax?2 z46~PZOYjUnD+m*~3?(25D-aC^9osq0+R>oE!C{V}=!ooq^~`vv*|;5HVMr!U*b9!Z zElW?`$B`3k5&l$GB~;;{@rZnnh$V0U5FYM=6Y4t9< zJQM`C#+(3N921FYK%NW)sXY!W07r&3hBrTUL#zH&`$LLxg7Q70%22^@#VEl6tAc@m zz=3z&TkkMe!)TD!N8{l8P9R+bV&>D%mW`e7|5|ydv z4Acx!PIin$xL=+VOo%eMpeOLlBW2SToEZ*TieYi%$Q)fc@alK{grmYb*w=&P9Ros z05c3j2o>+$+D%U%6cy~Nf2E$U#t?g=2$xoH+Gbz%Q zFNpdnQZ81Kv<>Wy`+>ntI3DgnaEtUtb6a&JvE87?I)`3@U^-XE>{mD<~ zV}rsR+js3Q>+!1Q6Fw@ZQyhCDZ`o6Z!!yi^Gx$(xGgrw3Bq^i2ZpEBQrSs_>O_|J2 zj@8zn&AwDMYPShx__z6_33p&hYFJ*XW5I3$w-+p1*}it(4%3@>(>;0ce&8}^`lWRG zS#rj(bV@S%+&qeL0LSL~{!{9(Z>2ZWIvRqXF=;4Rqyq3=F`0Waqz zWj07DnAtKtM{EcFN&G@L8;e7V^H7PSgVMIf+#MZcNax`h5ki0)&P731ucfqUgXR26*ezUL7bW$qOL*9D}Dwn^^gn>5u_i`F;TsginS-G+qt20j!T z-bCI&%vDDl_Ug1-3Hu3&@@b879naFxYx_#?qC17)ve}a52p4jnn6>MVLpGIJ3qEA{ z6;D(kiVpzqC6er zO6W~MRkz&Dm@>`x7Mz)-BRl4BL?Q2U6+=Qxnle-{fV7TddM#B3gpwZkwU+i(=}oea zTk4;e*jJSu!7z9rsR`B?G}0JFKE!)BEgd*TmK=~AYP*%^KCa2$#7oU;2@d7sdFZ_ zb3=*nmlLpTtMh(U6V#|UQaXgMtTSn_(}*%HxVaBLi*b?OaTD3Yl@URd79$|xag@|L ze7o4X*OyX*=Y=Rw|~5g+on1^rdWUSK7TGh z`&8Y%C;ApIIcaM`jFXo0sDYALsJvqf2l2{tU{X z=Ca=HToQ2U+oN0#FPOEK)$lg;o6+>J7v_f0N>3}kNJJQP@IrDc_nP=9Cmr}F6WL~t zwg)2~q6$JCqahPCfM&9X5JSS$z3utFRPVG;)2t5z!#>SS{!A!4U&6R;@wgK6HZ!S{ zw46=davbEH_{0nO_|?w)(_CTt81bb;`NLVPZ%YP-*hW9+a$h*n!lJv%eXHmfK-tUi z;boqcMI?RN_cnfB2v$9kFr9x4chxIf&xc$y#SP-KNo(Kr)vx2>8~hh`TG828y4au< z$Ln3^pQ@i%AFh2WSf%5GP)Yk7@dIS^LUYD5_S~oXLQq<~xcSMTCcU>-r4FO5tDtWs zuP$?VA{}XHXWn5G)P$~r-%QQY)DRhVEEf8+`4hXXtj|!^V7JD`Qg()=JMuq@xh&Wa zkl1AB#r&AOdP4L$6gYR;Wjiyb1aZK22kBaiLG z;dPK6c2sJ;O-1lZ!5Un2aeH91{%iHSpF}H^xnGw09vtR>69tl)cy**~=QnKUQubWd zul=N3w|}%w`M~>4JL)CFR>RY+Qig3IzICiaXE7v@akQfP*PEGN?|6-ykBm|1n{OhB zN_oZ)ER7+q?OQ6TUj>F-iXJ9YIuv7(SX~>Z;&kpij(#oA3L4}~AI>@^@#W`>1=m9e zlVU*$k(8_r9Yz>)KhG7RQ%j9p_?S6042;b~?6>H8vo>!VBNp~;;TZ_$e!y}O6oIQ}*;ybkb4E7=(#gw^37!%q!A>H47uZ)=kt?VCZbcksr z&M9?>`rG&W5pzERNWHCWl*mcCjr2VVeETJ($^jzrA=c^k-i4HZDb$j5$gcmtt z7it}iUacOP6kB!bu0oZN7~CHk%`X{1sR2uS_!pjXEYT(O+eK&!gP&`OH3byLUx%(hEv(>k;mtDfAN_S6_46K zH^asYWM89)rYy85Py}Fh=@D)fPe&MxXrP!Xc<7~Wm#VavI{P@^=LX02ES=l;`GoHo zn)<0nn>1-FqOwxL_S<~yGa^}SO^1~z8pzvq2gtv)?3Q3Zn|LGsMt-)$w99`kCp+Z4 z8Fw-HDHd2t_XRRX?@=Vj$q|g3^Pu#M6MZ`iDV?%07PX7t8Sg6W;PmNjN+PQ@e_ zHw6Ri8JU=3TYg~OO6z&0N5$(?1}~+$<2sKLTyx{kuqH^okD7H4Vd#`i?5Lb2RpW{@ z(U!&++XwQ|tdV>KAKyp5sX@lWdeLtTuQ6@p6T-P#vKf!rPG0w72)mQabS^oiN*Ds~ zC_oLjf`zd0SMm>E+U#K+F&F|E)B~v%TQF|hOUQGiO+)AvheP7HT?QvZjNPtRlR4N> zCcX|{yB6fulTgOQ5^9Z=+Iz-}ws~JPn?L)9f-f`ablVFzlS`WzZTIR$9~4%8!RXh1s=Kb7Hh8jJ8CG$iwn%INv(7W`|gTjy(eON4I-eby!F7tMaZ?zHG-NM;nu6DuGzWl*yt!9CRH`e z2O@klv*RIRJ*Gr%jdD2|P~thH0pjJf>`>P8kStqG-NC0{PB|vg7_3hi7ob~#*y*7 z_Yw}8QPXOJy$P)EBUR}z1h>P*jbFS^jDSBC6roOk%5)gV0iVL%;2ck2+<4!(I?0DE zn;QeT69+EZM&I%%fNQo+`cQI?z6q^nSAu#;qloKvhwp0yS+EGN8D{a)HU%|@TgLiN>L zLaj^{^Rq$T9+N;Y{Zq1_@{n7ONA3|1WmvSrUM!f=p3EU1VS?yYmFZ9SG+Ka$VYBDOnJ}2@C z2Mc(zMlM|RCD+XieET|Zd!w>fe@?dWGj$rl{bJ8ue2}4Uz39n+`?=_pUA$mJ6Tgnq%MU90ro^xDw2R!at5-J&9ef>Kp{XDJ+BN*GV?>x zpJhKcV*$enStQx!1k5Ewvm2KU8Zj*Z%}p4(_vB%EpmaG3*aemKop_gh@9Dv(|_zr(!3GXxZPHiE+eJtTTD02*cZ zD(6~5;b%+6w;@CTZdtY?fL=uLf+$>48&rK>`qVZzSedDZHn_9*Vs_Zf}VRmllyO1I~WDgm*2J8$SyH_va?$c#;ffz(x*ELQy3pJ(Z5Ke9hPyfotcQqa`re_q$& zcgUX4B`^P^vUoDy^Z^U@t0eS2UuGwAoSQ!iQCwPN?Yek(hZF`u`XUI}) zw1emr7s%2{qAHU`#W$jlzb)8#XCoYQS{i6BO4$>2D_J@|30<5l+}}VQ2x$0Ny2vDmlRl1p&l9^E_J}vHD|bK^E2B%& zIlL=A_m)2+TQEqjPC}0PH0l09I6V)ZNKbcGRk!$Qx6~i!U3Il=DWY5EN4Rnhk3f*L zd{39$#-q@P>Zhq`3IsArJv~k`-Lwnxv~ltTu%3*a9#xiJE#cm01U<6y3bX+tmDIgD zMhYomjbye8-hsW(dwLz;D^w5n8lU#Q#O!0&?locQGc$@X6Y4`N?GRST*RFk*L48&% z5vB=!Hnn}WJ$-i5efDVQU67p3X`d5W{~NUPPPpGizTZ{5-_5+=-L>B%sNXZ8-z%@* zySCrwKRNFnbJmK9nt&K_{^h(2tQCWC#)SOKd8e&N0Z2(M#*F%>^NtLUq6)}u5-3^~ z5Pkoy03sls-W*_yo$e_cPd7-7zU;w z0zlQbMwx4-bQ=>8K2DmbS9m7^hK+-{w2HIWIMnPq(jPQ3kf2H%5vdCSC7u#J<}8Fv zz+;_<8v&{UPVq19#AjuUOv!(m*8Vgzg1ZGNT5FX5L>-O6$hEx@ox;~kNm;eK)Yl`!1(aR3ljlT7`w4jR)(HoD(4dN4g2WKN_53)l** zBdZDE8h=XlBzp7*Mz8^qS~oc!ia6%Z9c5_4*SxXo+OZq?{zm0AQAl9CZ)plNFV!>A z0~Hxx1lGu-3fUdYHy2fVFzC@d!q+o~n?H^=*}bj>yeBOhI>Fg1!i-I8GxrYNq$=?u z#Zk73g^?CL3HyZaHbEIYK^5Iiivvs?$je`iy+=bR;wcs{Q{;iDrK3xH0Pk26%CDu1 zme_ep{d$tkZIZn_+X~b&HpEV#MV&s#tgQUR?1pDDy`$xZho}oiXr;*^G9{!iCA>^= zy9gpZd)9qJjf@9D46S8E>ZTs_PD!#xJe?X>F5^wZ60wXw^;ffXLB%CRKVFRTm%)Qqi?Bz3U)(z^IT(ZTfpt^LsMPoE>F zur~mOf*)mwG$aC{CV(QDe2%AYqywo@NHERiuBxI5h*evplrX$R+cK1t@|diY*`yQ4 z0jXJz7gR1bj(pC099VBdUO|^%iiHW(Y9InsIMW00?QAdzP{>Mb5^lx8k^qtv7#Qmk zL)U;`Kg&$IJb<@EJ$z`Y1dLHeUc{y2B@tMdlK>9cEVX!>rc84{V_AtE)b+4n7X*l&KpK=?XJgp5zeKWOa@)mOfI(*W zJa#<}RmfcRMni?hsID5yY3z0a2J-{I8j4g(@j79+I-w};){hHQIhy}ejb(V&G<4Zk zjVA$xQ;jKBiMDaNzr{ByO=~DIA*yuZZds5dHpk57MM6w`UiFnoH|UjrQdBN|Jyb2- z*7M>tfN|K0Lfo)UK=B|5cLc)Se~5@Vx5Acin&}4Xf@qP_hME~5U}Wk%ZCi=1lC=Gy znLD)G;-2fBH9Hi2EmF4%21a%Tlx3xlqsYZxH#IwUlBP|9NIc$RPwp1bP<#ykbXub+ z2uyzjs|J6oDa8kV)BEnmMAWg@bH?*5ZOy%vOW~l0L~SR|(U&Pv*bhLKg*RhpOT$`E z?y1%kp%Yen<3@t@QR$Un0K8v&^)SXt);3Nz9Ynt^dt0mJaM%p{593^a;5&>K;LHC8 zNKF4ffyCYa4J5+e?m(|>@(mw$jn@P7u0_3pnxV)iePXkz~h zB-+0H4H8Yi$GI7rS;Dw~jdTA;gG3_*;1QUU1|W@Roo4~~@oeM0>XW3rxTlKqsCbPh z*7>H|x?Y<}{;!K!lT8*jH$D#js+qJ6zBn^*!ryIz)22>2}oMqX~}U zcqa~C{8+$Y{D<0bW&DuiKsd$gY{GnHe4q^|M0z^gx2Z_=F*3roHU~udnnN*IYutCJ z23`Ixe&Wa8Pw{MFpvgerLFUmw| zZcy~XfwX=wJ3_lR(K=QLrnhZ{aD5YOJC;{e-H#Q8s$?P)5|9++b0kC*7yrP51??VZZFmuNxX~*KMB4 zV6DyOd@*ZP)|t&4_K}N+KY-RLEnAE#O!o!vvnc=TZY_Iw!N=y=jEL*;%%65vFJePY zoji*_{E{idm9vu!ibaMOD7_*%dJUg= zU*Vd4@`L8l_JLI;W8?)90{kKK3Q)^$Q0S6Nq7vLKA}SE^GU|eSm;pKa&0q~>=m|){ zYQe&s{QiO22nAXZ=t~r^qzIb(8ht6F@fW~vd4d~rXolWKn0VtiN`O23n>(|RjJw0?AcCUOAkxweQo_(7ASx-SLk}I&<^+0RqG@Id_Y9cu<%y zOil{aXb#8khV$=OtzfBCqpavOpVXr4RWXP<)HBvAsIwNRM~iJcbBKjBNI?p|h_m-< zv#*f=afw9pEK-9HBUG~CYL!5GU;CrM->L@QCzB4MW4?iQ9lmaH*A zRs`4`+!FPyAB(sh^HK~=xjzpLZ$+Nme|ks>zc&LmK6p8RHtml=45A?NM(CK~Af*7% zs}y)c3YyCol#E9(1_s3qxtAXL6z)6`yEHQ^!(9VWNH@RFNcfK(D;|=i){Jq61ZZ!O z>T_F?s|;ZEByj^0#;!$acmxTT0bTlBGf^qZzOLO5?6dYj$yfybz|P*tD(H|hF5C1{ z5bbX6qnAP}PnEI;Ny^Xg1wTmDW<`HMLD=zr9{`kM${>Iy{DKUjh{8c+&F$kc(bEzD z1s4}ZqF)2fR&Y1ThbsA(EP%o41(QcA8Iy9V^{hw8=AtrbUls|BO$+f)7;Q_KoJkN< zPTuxU9vTGQpm}{;?ipMN*(HP2sS2cBNSBUvlWTu1EdwySX2$UjO{&ZwFJ^$N(o_f2 z_)`Ess1xV1eHsrDm)_QSDS#u} zR!CfxwbStHYeo)6M#gm(-nka(Cd?58iPv)eHq&G*Fx!PT9$+HoYhzLdjHI$gXIaH- zB4=q{K8{VF_egB^M`tKo%mE6eV&Y?iq6>u6c`T{lnLmH00sD{KS`HzN1&&h|j>{B+ zduhgy&R`Yy1#I4jAP|`~ZVH(f>u$JC42ZvsxvMfqmkJYyL1#HWS~;e$OWKLGvEa-b z$m17+b zCZ1QDjpT~qs+%Qzovh1A$El0Hu`Poj8Q-inBebX0I^FIuE4c)sC_VmAB5wju-_L*5x8u;v36{t!U#BNExg#*Hs(G&*L^e(rY`^4Zf(He2_|2PyA7z7$3Q&Pb8iOE+Re&DOhw9c_nGg$Z zbPfAVFh91CeY}wqR_Lnr_OVA1s}7R)ynw%^lI~Fe5bE*yxN&(08Kboh!EuxX{|c%wFMw|*Z-bzWf1ZnJ=d`je_d{F6ry;IBQ9f7y9j z;+}pP0Ljmk_MHYoHWJNs&?oW)5<=dEbU6;Ywv7atGjfAq&=(a3A>a(+k88&q}9>-iA0tJ>E2* z?C;tuL2*MF5+MB6rUsuw@LflhIgZAv`lE1wSJYvhuat+xu*tElRQFOW=kWHATU{@0 z?iIHF&anYO!DA&vJ8oZ_){{OrO1$ZHyzvh1uN-8)9GsUI^ctT2m<=u4J`A28ddxZe zNO~m1d_+HJ;!#M)Vm57EE!gZqS(ifXEm35E0wSn(xI84_TJ-DYeY*zh_r{@9Q}B^l zMH8&pSm^|!JYmevGSiTA(A3tS_AFk8)A}YluULLycnnc@P-K-mFf?MHoo8?z37a^~ z*{eYcD^s6q6dT4E!xkN#9wG0$1l-Uq7J{0%%=-}z5F>6eQda(pM#V?zHZRDwZXDfn zBgefhQgh;Mmfu{uI6daHEW45Vqs_wU*EFqKX5el?0j*d>p$$^;o6X6`%Lk9y@uHtK zSI%XI6>na=c<_OnXB_pyP32mPSxq4m^@oh=I*r5$aM<9n-^Xi{v&0b`1^W<<7g94eFpVZU=x|CzWB`5{ACgP-WIg*_>ROpU&2JnDS!d)#HcBDRDtBp5-vd^CKzq zeceWp-JmC+VAL`$F&LCuT7q*{t|a6blDF-Ya&Mf0&yvwN9WCm!4EP|L zdQ=&vludvOfl_OLeXxX4JfaQdM!Jh!bB~~Dv^iT`eRuaEsR9`5zdRrFQrKu&nN%h> z26_!$)|gof$gD~21n!HkDj%$zF|Tr?33FT_-^9&EykS?k(>{q4m%Ne7bsI|rt48J3 zW+<_~d!?W9on?6-%Rj>0suR^39MbbdS)PiAHj=M!MW7H3Dq3g!OBj`S=(<4A;$Ak= zT&sw)s?xHtH-bMx(wG0e3K8Ux(%gonzC;xU6))xL&Df<#fwaz?Kkosf@7s9W(R+Q5 z7n@lYGum|(MY>j4zuGktme|r)0CA_(F_!^3P}UJah_t^sNdHSG^*qVRt}or9`sQ&y zW$MN=pMc_PU12x6D2jmG677^lpO@Bfk;2Q5mi(#&qeG zUii*%qT{c0F{!Wn?UMoFN$R&PS_arsN}9DpVhrPM&o|lBoqxb@<+BVQ7a5Pa8H~&u z%Bj9Yv$LMkJ_JM?ri?KH=@@^lUHwzYX*3VFcsbkK2yRiX=r=luOg*@0JQ(i%+@Qoc zs)U^Qeuee@RrbfX`5UeZ+TRv_bM>0x?d!=`fx!Pg*Ovf=0*ol1{=aBM|F^mRf6<7x z2d;{k7ITV_sCyNjQ~XO|e1=b!1O0$--d0X7R1^JAwJ2FO`hUSJm8e(f(J%HJ>fNyV zGx9T>Dv>Q)h8n^yA()UP_xO-$b$o%Od;LRk2KA7OnUx1F z$=s^4f!y7J2Rr|%7XN#$k8>I?ylX{5&fW6~8Jf(i^dS6auKz!)#Vq~wT>w_<)xbqn zAf8M8xu4w|x!-A6-FD+IWbT_ip(nq$`)~dqbNyG1V?V*a3{p!zeB+V~%nqaCw_4$) z)~BR(h}H!a71V%Kt$l zs!e;-^m&)g?gBZ)>>%su&fX&5K}_!U57=n@A2gz6_PEkR!dCtDql`80&HqUwGI>L= zcx#f&Swep z5sZnnu0Q%2`cF3-m|g#yM${DI>scP*`t0M!2xYq?EH(d2NO&|SVnKIfM&vkTd;Gs? zM0cWZyQ#sgU0?d$%C&#H&GPNhOh-83&wta1s@4=t{hrbY3=1mLp$qiA>9FN_K25RZ z6%XJN>T4n6eF z*{sK&c(-bN>74uVUo;|v))SsgF{x=rzUe12Myqw3b;r#2|I{6qP{{2u8qquc7mesm z(b7FJ1AiMojeq?uws_kLi42OY$f9TB?q+mK6)|EGH||B`sv7Oz|1TO*^JuP*?{2FE zm-{1;SzxQhl~TOJL8ORY5%k;Jj@YPc%1@QSpRfy3q*R}%|DqAerq$|ye(_{(j*Hwg zEGTy{z!31-rs8GFJN?=*Aw`93>XI!9{+|bNmJ`J+{3d*Zhuin){8pIOHWl59N}=Xh z+low)l=jcWXJbyBHgSQ}Gz{MH|C#H*b#LN7`3Z3-&Qz|)#)z;oKwjyU@?9An(UiZP z`c|I6Ev!ANGe+lfUs-?$D2Emq0n#L@sxn>30!(~vzfKS zTmQ;zo7nlRnaPm<2XAQJl%Z^093z~qMLojg(8^POsW$taV;|40vuhN^O%zb@Xjfxp zFfSMLOO1YU3obdVJ@u5fHoAizkx9`D5$9Evw_#Z4SvS+*S*7yaY24Eh@E}jUJp27- zm@h|%kJLK^6xAc2hcOmQWP-zyg1dw(h5((*YO&c&Nj>%|QmFUwFReQ#a620PfZ4R% zKc!0?Y@KcB*ViJ=iunbs2O^)Ur4#;?%hn~2@<5I0kJN?s{e%@m_|7t3IN_J27o?5J&!8)JZ+@t(`w6M9Sh=$72u1_az1C)gzIU2XcEk4oO3I(n+B$#eT+>JEe z7aFzw2(7q|Unb83zp=aA*Cos;QAW~>A?w!|M53bg%40bkyt-Wp1Tx{M)fn{6yKPS? zOZL9*tzb9dO?g|a$7DUW1$pnu_{y&QG0*Vio0p4YSNmLhaUf{KPq=!`Aj>uTM*odx z!@72R&_8dRTJ{Zk^AtuhkGl_cuEVHqub)CodsrH8s{RQTXPM)7xTSJ{gjoYD@~8*y27v8CIrkN{P|i=HoaW(K2XC%bM60QaBwoN@_~4(AyEU zIUTc{YRY^!v2!EjbR0$dHhWla_jcatguB7p+=Yo<>CRK~q;JyO{5`!r`Q_88psBZo z#}j)>=cm(X+GZ@ZK1r41YzAY{TzqAcq^WQ=o08OADy;um$L4G4Puq%%(cgFE zIA0twXl=@x+;>$tUz$m3ZLZM&=4o?ISe$BYeK+~dC**vYNc*mBSpWOeyz>>3!Ml!y z$?pN3=c@-v@4EK%e>`74Uptw4*K<7i*+royYV>bVOWlwkQ%1ob5h5Y-CrRyf$H$0om`}e2P zu=~q{>9bFr{|<4<-TQ8a=Y-{dM{U#H-vg)5*UtYP7h^9S3BU!^3WW$&&!&rjC zShK^}+rl^(!?;hvcv!>vWWxn4!-ayvMY6+1+rq^b!*85~ORz@VmW`0KjF1kBkj;*e zZ;Mb|j8Hm>xctahm5o%ljMNN@)XI+3X^Yfbj5IijG-8c1k&QC5jIs!dvdoUMZi}*A zjIuk4La|0W%0@d|M!N<@%anuM+gwDk(T^}L-lXWqmM%|3VxEb(_`Amho;U|r#)OPG zzaYiD%61MD!9=(_N4aBSWSwIxG4W)Gb0P_oyy%oF68pN+DJm#dD>F71gYgzY`Y*<6 z9K~W;V~Vw$pR>kQ1UXl?#T9DB)nnqyS>sFGW1EBG|4{?lES&)dbRBK+DxczeAPFi* zbVDcc1B*^WK?$QHPJL|&BZ~<#LJ1V~iE~;`(`^a;L5b4ki3In=6^PT?WymM%v;_f> zFiAVCPBSA3U)_^>L=uQ6N#aLzVBX|EmQE+x$%~|<3s$G|lVrf>WYA|vpj8T$Tr#9R z1-_I*dzyk|OJ$HtWwJ_T2~K6rNo8+O6*dmS~=-D?df_;=?16i zMr;`-av5e;85Y4AmN^;L?HRU98Fr@`D7H*TxlCuPOxNH{_nb`6_Drv(OrO(CU$(5L za#?;>SpmUWK{;8^+p|KKvR3OQfHd$mW*Fca$g+N|eq@l-WyF z55N)66Rjo8af~2mca+%@%Iwa{Q0(Q7^5xFf z<*v`m-E+%5JIcKX|Ot<2{&&JWwV<$pflUU+pyymck6jVW=FDV9{(>W+M2i7a5R%s8uLy;Y@6ADd|%o1s%x zRb7Scs4QQs1gBKx65`P8Rc|nrG%7W3Eo!m-*W&)TJq>QT??_t5$&Xx+<>y7n(MMVRV^xcZ&y+5nOI zHqXixXjPUxa(b+u5ZCZsw6>L0|FxrGp`)JM(Xho{JtEq$ZruPJuge)}ptY%^h{p{R zaL4S8UAgt&L}LJ*xYdrT#@IUe^{Oiz^&jMMYiAX4qD?H1>KS!wKgl;7#nrZZRNsO% zN|UeGO?uX~#UYDDaYDK{&X9_0HT6>0F%0o}k_rv|&uf_C8}6Os-e2~g@r`HIIF02d zwvd*)AuZyt{Oh`vg6A#TAxN9fCPR+qw>od-AGLN}Ywfgd(Nk!q%WJ(4d+T@J`UKWe zAlh*AyxHga+t!?hkj~~n-MB>0##zzE7#keh*O>6H(Lu{?{+=x#PV0F#8fUBN(-s@% z+27`OAhRD;6f1O;+H{nMbX0bh*~C|&mm9A(cJ!-)N>X5nC@>dCM?J7Jg$45QfYuWW zyx-f|1MB+5*Y!S+eMq-U*96o)0~MR;s1IrPAM2XZZS7E?_iqDtDZ|F{kRQkG?~{9* zjDL3P8G|O#h-n;91lG;2(nAld8T6!Y8i#cOVDW&Sz2{BH-p*!J=fmFj|2pX*3gAnI z11k?bpo^16jG4j9kL}T)#ZxEH%P1p`ed#U>2!11mEBU<~E4^2qfIgyoyO)6$ zjd=V7(y?s0zeY_Lw_R8=7;qLf z+NH)pd_;Kj4ANO~kkVnW9o>(^(a53SGxNTy)~O68LSq3VG*5<4$RYi*wf%~+N!6MVhXC&X!hKK*zo-N_~A1xf!ie~P1V>W3EtQXI)boaoj?G^cK!b<1c#TUIKxm67TT|ez z7l=h=IBhS*Wg~D`Eao~2wvsXk`Uz}BA^eFzbV&Cn-Ab*xk40M41SH&55ui8&p9XYj zbHrStHQ)Ju)JDu)$HH2@#y_XPEjednb(>!hD)|o}pNwb%?jmg-&PZ@AytBPjCD1^?W3$MhHVGogy^%tK#T#&8%@MQG^*9<6m29Bx&38zqB#?z*XOTWE( zR!|Tv6ioZ?)cu;y(~IHp{RL1Fus45B$9S2!U}mfaxO71)OdN0($B6L&XuL=1jF;CF zW@ZXzUSJ8Pz0=27s5EXCv9a>;Fa0RFd&R(Eb@AcA`-cb?{IbB$)gSm376+gTlEMtV z#=Wt2Aij?51zDgd%~N{!Cy|>4t5Ki3J9NRSc$23W-( z5UDnZRE@-=RbqwjD!`6e3`M<&glkJsUb1i&B@mtxAUm#0!qH}s5v;8nNrQq-5;x6# zDT0mQw8r2LWw;zF=CS@f_$ROyh4936SSGf-`m&|W9j8EqyR1Zu9Z+k(Sh>Mb!-qvY zT16VXTm=98RM$=6fFkg(t?JRnDSbsQcPuPOY|;JPp`_pBx7!ph+}!3IfrQl1Z|wT6 zZQY~Y1@Z1iEAP6}ev&57Y~EC&yp^=9g@>;Az855ZJid;!G=h3!2_9TX#=tnM+>Ml@(4N1Lgr1(+{UA*K)z9ic2+iU&gzj7DTGQU6bzrn6B1B zxlkK4sb9?;zJA|l>bKhmI{*ubQ@tOE05*mlCG^$y$S`Zp(rk_30=gl@)3~u0re&h!iE1x zXFu$BtOm3d0d2_j={!&g5-wl_k$D3hR0K%9`YpdQ z(CGO~q~X_-5l~tvA|AOdngZ%L`1m`DLaTN_{+_+)0cCR@wKg19cQEK}`5Tl9YsK$? z4?s1FgWf@)S4c!W7G(0~*Y&G0YK7Y}Ghq7}`0abhV2Qn>=L0PgfOaB{5q8M+J+!kH zq>uvZ#R4z8jRwHLAb_F-@W%|@clXUeJMxdG?UCD?qeu4uS#MxdXhc8pB-?&c^6_uk zhTryZl<<$^@{vtg0|-GrP?|*E3;kW#0S03SWbXme4F}5_1}Y!hi{ej`=uV}v-C*Q- zKbiO^=bpX(n?FX==cdzZVK*-#AD{S302tmwnHoSWkC%lHC<#Vz{S=z11E?x)yzB)6 zaI0<-1EhpiD`y*Rpcy*iR8;!LthrdInCWWKPttW9DLoTJ-v)*WmW135s6$^yhUW2w+!R2J=it6h3^|P zmxES!32XNQWb|LuL*;moQr3zJbH!Ejb%vook261uI~LXVrC%+yexnHl>}DL7yC%sWyG?b2$sopo zng!H4w#02XapmWhWnJRc;qTgYKGfTNx(m^E2Y+nm+mDZ2xPJS$&?o#fw>g)-v9 zQIW*)qT$ERq&9U+&vIj8sp&d>j8{P0dGV_qA?oVlv(S!d?4fX#p3~a>Y#~7>r(ln$hO-ZB?QJ}!w0HQ;lVe*@G zWf##KgBEe+(g@XsTg*gpNHLt@SsqE>-AH!MpDpKcR8)pUDds;Z$GVmqm+|_~H@lvbHGX zw~lBNs%FglpyxEZ^d`yoBl8dC<3P#dzg!%l_g)JA@elmVJ@0f+DHukidvU~pfZbTXs{Frg#R*ab+UmBpy7r+>L}xBb@5Thn(6NG8I9heShi(Ck<42j%b5>xUxT!SbkiV|{)Z08@Zq{Pow zXmH|v7#V&$AwIs8H9}a4rz156wqFc;PwJ3J`u^&1xQp2Q9gw{H7K^BCFa19>;ywaJ z-HPK7A{e#B!%=p3QnfWpPb-MXJ0`P|8-z0?9GG4!Q)mKBT|OHxXV zqdFAUff?edMp7D}N|@)pH1GHtQ;J`Na|Hbok{#5Za<1md{h&A9#JN-dkS~Suss!bY zO$o|?@(30Yk8J5;2Mj+>)d13~dZ(>1_8MnV<~!xFD|7S-kq62gcvSAaGHv=`tG9L# zxnBP5QlLD_i_rijERDY3Q_-QAEX}_2(nUP@dm0P-r44yuY05%k zpM#;SQp4j`IJcey)EgZ2phB7Q_4b|oEivKAf1`7?$brnZk2?S=LV2#wM;gl6Dx~F1 zxESV;u2sOm?3IrB>py1I$`1#rPR`~ZMb6habD_yr$5si1TB#e^xsYn#Yae3%-Olb` ziSNwxziwoSzb8ftW4YZzLq@(8vL`X$s>VL(`z)SOj8o+?2%C%a`^ojWy5RUJYsS=U z=_M!yc==%w4fQsre29q^5!q6#biO5|VKshNG!?vaJCNT7p6R>Q@;*Cqhzi@OVIUhA zx6|PuI6qS)9K8TJmT%x&>W<=&Y*Jw18M=|_S4jKmZQ6#YNhek4<5!IQ(A`!lC{+)& zkAJ+$55)$7Z#Id59R>NByEi-A>TZUL<2FKOj=Ncc02~v0uv?Zz2y-5-z`SvlpP9~2 z{lmt-y$os3Xg=TqJh!7ssr+A10j`6jUd%u3+H1 zMP93C7qR%MW4Z6hY9l9Pd70YsuMo2p;|7FU8}bfn)@ic@#&|ygvYzR+uV)TGU)7Ia zhcRr^tOpA6yu6v=a=jfF~TS%hNpedCLrei21|{4cj_;l+@YVla83f%0w@nAWd>p#R;b?sxI9(FqUklT-3l%AowDn4ijDb5m zcocX)Dca9WD`9swEa#(h(v#$F-9!Tz$31B*r^HB&3y-kPhzM6pwl2cy9{7x_VP7iA zySwDDRc7IH&v3TBxbDki1vim#jT_Ok3FJqT#ey=jeIhTz5^d8rlLyoxuDmg+DDhqz z8TnY1Y+uCZS@q4_Zyzi89#vQ@5~|*TTnc&QR7K zong``VWd|kKv$WJ6xmhPycNJ80uoMPBjO|^=&mVANCCg*00s$!Tvtu{GQl7l!4aRr zF7s*T(5P``N8+Y-KE>_BYWur($!(f~ai1rF`A#*uGdb@V7Z0Z-}aqi5}ypXzAmeLvs*ywa_>yKyB z_hyQKu1?u8dEH7tjoh`oG-I-$Y2I;cJLIlc$hv+HtEVO5p=Owc-SC5de*^{s=MVms z)2K0i;#~-lZbI`S!Elj65Mf%YGUL;Kawb-D?Lk{aCs( zVMQ@Ci#}ea|J8Tzhvhvk)_05~K8`RvTrweVrYHjt*FB=l^R`}*kgu}^ZF;WaW_s`F z**(!kH1sX{dmG=073ImLWLuZlp0$^viyAJ`tD)R`q;mJuQhl0ltbU0yYyeHD?5zaA zx{3Hk%U&oG{-$5b;dmJNDC9lwb{y}>9b6>^mnDrg7R29t^TLXfw++~jp^<_oONK#z z1jR^`xW9bvRmZ4Ed(nukq=tM>`rr`(?c)1tP03x_f33D}HU~MjNLwk}&*E3eLE;Br zs9iDxZtW*!pm-y+pqj-hY+n656L+>g_nX1hZ`5*1a^eXX4W2%L026w^l0v9f^6tl` zZggxQOq~8>tVE=`xLB-ge*aWE@M}jDbpqZ1rdG$QMnlLlozPHDP&MFuXJ$(yMTa zYYs?S`}Hfr_0(J)y%-)N5! zHN8e1Q4T=-Z)m9>RhhF+?ji>^l*!Uhluo3}^%g{cHOhJ<${I&$qsk$lLbYZR*1HVw z&c)nIWlxbG%dnw@13KN%QjsU4mXI+FBdZTIJ)tN{BPZHVPG@5IN(DHY1CM#NoYU(B zapQ^RWL2CQh_(qDt4!CaZXTn>>ZXfgdOwIU6DeGfN>K+oI4>RLTY62A=^0+59zmmX zR*dA4^oeZtyqDF2^CJ3H6OXjWq_c$quJcXbGb zxzX$gu9GI!$VD{Ky?|j~qFwj?CzY}%&$5^{ODRbh6bFFGKkLWJd-9*cn>I8ekU3x_ zJ)AUs!Dv*Ma+5=JC~yQ9coKHhZnAd@-0@AU(n_$*F?P8aFipp+a7Y>}b2Bi{klO$z zTk<>{L1_MN$*n3FjUeqmzY((7yO5yt1X~kI(Sf5`z%ZNf&2H*|QeNO@A)Dab=A5zY zHwf1W?Dk>uCdv5LA$LznEW4F4`(!g;ap|NnHWzQK`pu+6)=Y*yOm^qP9}*w@1g1E6 zPbheh!vchEdGr8$rUJQ)QFC7875nCSO&(mtOp$IPZl7T&I-q4{D8 z?xfsPFrhs(5}6s3=4zI4nZMsSZ@Ob5@t4-{P~9ByKsxc0z$#}yE}XA~=jJmLp;;sE zzeaVE5|)WjP4D|}ip=iR(L6N&@cLplAQ5I!cekDuVC6q2fLQc6oX;RWAe-z!wY=wn z2k8Fb#93f5rmi%d$%=IH4s{?ZED_#!(G4VpiOn!N2Bk-x^e~}y{9+Ar?m|(e5s#Fw z>}&}|LfTuthFu?taBhosz(?Jm74mAUu8NJG!Rx#*&nprql;~SG_m>rXvx*>wxt{1f z3g)-J9pyC}T~kaMc~TkaJDJbaRiTEd_s_X0GKG=@)@gKykJN^f(jQ5bN-B{5j#Zd-1x$eQ%2=~s~pcU8Wlf>V0ANj0HGzd+4n2wz# zziUgc^{uoV7;7(<@%rVjz*WGMmC=mKnG;YxRp%!Vc*3l&MT=^sCn!K!h(I?$G$)E9(IdT=R|uw@aI?lv`Li%d88U%0 zi8?4$EN;o0iTx|bwdWwULBpdN85@GR0@Q~DNfmwt(VTz9Tph8hbH6Go!Tre$Xz0n^ ziM#!4P}1-Z_jK%#EQd@BYq5^GJxChzjmG3tJLT88e9i&tG*Um_`xPq)9H4r?-~J*PljETTZ3Zy4L&zb6&4Wv_1_*MBHGxZ1`F3p%8c zIA?uTggmkGfH$Ylnx%0dk7wMp-}t7rRmL_-WAu!;TP4W{9&cDi_+GgKzp6AaOVu$^ z+`s><@y7109Ae>l#HB)*OY9RGzHj)VF80D)txk4BM@r&e`G(k$!`WbRFQzY?Rg-c; z(%E^FnO4#{zR#e^J~>g!oVdY)iB;U<|8u)Ndl3+hb_BDbc#j77?6!ALoj9cX^-82v z0=QLaH%X{4-o*w18^>Q!Nf!@Y?$#l+mA0v=wys5U8yjq#p4)2$xLiLpAK+Oq;oKE6 z*x)*HQKPNn&2&*Y+qTN!apzw0vwPitmmNIWmSv-qQ#KjknVHwJMlu3+b#{bng;}-< zYgGaLsv{<60S6zIl0E=b>8aI7HPPjEEU1U}H{8kmsLIX6tjL)?`tL%IZd2$JsovBI zp6y>3O3|H^6rDuKY5vK4-$B{jd&LG5Ek%qRVbV?TiGJ~Y8Mv4pE^Da&Q|M7PO(bha zjzpDfaChxYP9LGnO#c7h_N8I}_ zDtQtO4^KSi>A!rc`P{EzQ0?Ph^U|FjCr>~!H3Ve6#!5xBk_aR2JN#pX(VU=`uq;OE z?n;}60#FV#TE|h>4Nob0pp-9#S#E)M{ATX_$N_#?P*N{GaTi0YY--S#^Gbl$VvweM zJnUZ0%{CIBm9Hc-W5j-urON1?pt^=9Dm3J|DWdaHp$6-GnrwllQRC0~Sos=apnI5v ztGw=Y8k`n|oD^jJhSQz3!f_0ZHb&Vr3IC*|?vRADDk&EA4m;{Ke&8qhm!Lr6eka3X z9%#1BS@3?9*5s?jcEC26k{y;MA-B-ezeD>NqT)S!GAuC_%lyJVFyH$+5-b&tBnq1B zv?l&KGscl3{39(N)S9_Y#X7gt*ZuwObhz)b%}4VtYf9U9XE*Mi=`HH3`2l9&B+JOS zmT%fgaYt+iDvzFA5Bf>H&RJ0TUGy0ISo(pJ=;tOs;SC~^(}ErY4-47Iv2lk_?bjqvv?&f~t@zy-6@EMr zjZs}iaa|YY;mx|u*MN~pma-^zkWWrhdazBq`}ED9LV4m3`12TLqegLGEsY0zddW$p zLl`EJC>5R>+cR)GXuXdOAm$tGjE|CDysn6+Kn#>Ajzn2NO2cu$ym+d4xv_xF*Da}4 zj`%nVktod+vnwYx73_dVywTD@2C<3mBxHc&JD}6_mv|*3TenA;TbV{}pF91%cu8TB zM2eUk-2wl}>^>^nk+4YJ=vpNVVLz_C2l2WdXp0%fxzN z9%b*h@J5z%hE?C;xH1BEclbhX{s^ed{NhYzuG+!^+g4h4JR?tPMtd;sH;7jv4EXiw|{=#W8PBU8#@t7K=O%W%+yI1TPjP!r*J`A?8H;Pf@})I<2RTOv5r zUhhSPwpWmsA+8nKe&PAJk(T@JB0HhB?|eo9(Gc5Q`F`1)aGALk~CiUU)V|ky~ro! z-*uWZ=x+-bhWfj)l$eltf~8!PArXP7ppZUuZ~~}f#4N>ZHNHJeilL{*VRwHFKrk$> zD~uyUnkl9=k|NF|-z_xdJgBZQg~48mg+t*bygh8YlLd6p-Ko+<7)kTyX1zRY7ioYI zuUzd%&VuH{=s+$7vdX-((h5~QHUpcxcSZPv3emwC)wz}Q!WLcGYQl@2iIwh)?!7!F z9AfBJOWmJ^8sr3aYE<`?z`ZIPubwy$=%D+kr?6>#K8e0`x&4jWZRwMw2974<-X6wI zVOkjV1jf%X(|@Qx&iIFvZZHVzw8j(c&+}ZFc10$TzB4cRncdUI|r1eTYMW zQ9ohQ$epAfUg>a4Ub;5 zg83;2@g}k-ERafgH03>_%3MdT>RHla1+)BKj)n(&SwGjm&Vj|#NcTE3)kqIk-on!a zE%r?c1=3pz>IvY&5jR^7`uL?k*q(n53Xgq?l)7U4Z2TdzKzaVIe}cps3goR*NF}h! z_(Q>L)e%eu8rPi{m0pazDK$S3GTtL&bjTelEn@4d4c=dVEEVsq9)>>#l%!IH;dRX| z$TAoH^i=!;%w~OpgEkBXEQ)`8wX6RK&KmR4NzCIpuQpS`fa`CcYBw(uzmHLV$oq&t zVUSwXkbxf>m}pS~8wY-m!Lz6CTp423J{hsmx98aE)Y0OBi8E-M$stmQq_0dId|>Ia zY56E8GWqAO!Gf*Sl-5s0-$ka!$4}=^T8m~kmCiGc2&@+wzpa%8Bjtvp6!cnAk=_-O zo8mS&z#`*tLHeq6inQ8*S=HaEYpS(}GQGd$Cpsn*lT!j`AIGS74(QtZ>Ch?{NPvwW zlCijN51a}Vx8%wu{KoyR+e<71--f;=fh|Mna1x_j?E5=+j{Fbm9~UyhTpQ+lK9Ec6 z-qX+i)Com)I}a%Y&&E^k>8@+0xOMLA0G|HrdvG;6qVbA0W9r9>Q9&qy#FB=l& zEDq0I+bSQfx++E61R3jX5IC05_wc=Kz~ZGJo$^fQN@WRStvp$Snxm-N{O_Czz`B>} zeiPoWt0N21m0YGJK5l5bYwlUO&n4_P_8U_iQDTX&l-cqyxEx{S&UMHMY`oVcGJ#ZU!2nj+l;2o|8i!7dE@G1M{?QcVe@pch|6PkuE8S`NM>G=5VsV__XGW)Y@g7w`Fqe~?U*P;tT& zXJxfK*CZC#xr@l53YW(fjn#L_^6RV>g3<@&HJ;t{({b>3T;J{~dHGO0*5hTs%ETq4 zwq)|FR~5>tdSpr*i$DbF7DvCC|52GzclC2^p2Kj$@msPqLj3-(F;nY{Iuiat3bkE#1R0rQhj}(UB+-RzaR`gBg3ExHNjjz7`;8h4R zj_B68t41-mWj2M}wcQi=_=w`J$YGJ8FUdTYK(MPMhrheI3Nmj9o)nL62^!IRR3MT& zyF(>&e`VFfZ7W@oo>EeG266SfNC%~5;hKP{)rXiXK;9G4)dlr>PR?qA6Dz1DK>blfc$%5$LtlKJq zA)x6%gTp864?nOhwzEb`+%EW0j*!0+J2faV$pP<0R7pyF3Uo5Nb+LavAVPa-e!*|` zPd;>uOC@y4Amt999ax_3e4ChbD2-8}R$Aa(Aot#&s)_HFvp~szS^@}79Y;~p`S#EF zHxX(o*1mKuO+J+0OK;a0_~}TxFbD@cUxW#HSi~rf*}gwnTaHAS%2YF-d{|tKTt%Q% zZ|V77BngwKW{c+W>kdt4U33M1IOYD%yuElXZPwE|xc7E`8SvuJs{6Cb;yKm#;efvJ z?xT(?{f>I~PP$5ZZpy6(PiquDo4877xw3d@J6(|akL@bC1-NS-Mv1nkkY86W+MZAo^dZ&afyk<_wFtNuY-2) zyCP=X@jhCM*#!lx`FJWG-UBOMV0j^lp@)z`fT zdMwkg(k4H3FHjdq6jfDcHP>bKv=)wzMnv+>3~KS|IKJx27crpl_%mp|sAJZJ6*wvy z{!?g+vP~cvy7TgjbjRM1*z7~_(b5!u8iYXo`gpeSi2T>LwN!DdeCoE2qS0ITZ*BF6 z#B|ra;ZxcwZyOZTOg*|bY@N7t&5@ih;X^HJ;iPlTdR?DF%j)C39X=|t$Vgn?Rg2-X zU}b@!A}Z1c>$@B`42qf0oP=n%?=lGlEb_&170IRz$-HzD`SLmlqN%2-u7lTDw-V3{ z-}EI>RAV;Pf(CCLIk|r}w09p+|45kba-PFQQj9v)O%AF;%Z|jyjH__#dOp;WT(jjI<<2P8t1humK?LMGdw38I#rfj|SB*NfCF%zeT-s)&?d;xklQGA+ z<|y5#toojBY+79m#+YN+b*0!$oMLzsCVCzh6QoVJz zsqB-3t;uegNVKN2r+uu3dQ=g4Qx;k#|Eug1@9qUDAppJuVHJ$?cK!Bk)_}rkj#Y@q zhr(mZ#Wi|}D&11AC*R^buP@aePxzegcMjjPyu5GxQaYu+CdE(sD4xo@DM`Dz?*qj0 zVKUi+0qPay#ub4th2PT)2ZrxyhT?-i_WAE>`=;*s5oUt8sk5&M1?vcRwrPY^PeXdP zL&Ga*Ou}A%7p9$5CQ0^vpeSNKaSOO8_Z1aE$63Al=N1vo7O^?w0Zl}2!hA>FBBe=@ z{|`s!{Yd5i{_(RN`&h@Z&p9^7I99gf*fV64jy*zll5~c>vJ;Y>vS*ZZ%*e{5*x5~Q z-^*N*B6IrR+uRdY^1e|erSVJRMpZp5l`PFi46l{QTs^JNGnWhj?J))bH3JQl1Sj&a zfrV=R=BoGiFFv5fvD{AgT16XAn0cipJh)^2{!VCphP+r7W>F?Huw?W>*|aoUNMPCO zhdYi^H{+!5e*bV=SMtWXf3fd}%>95EKu}`Q9bRpU(60y8*q}tB-C0GP*GHd|yP(?d z;f=vNbus(Ya$ydM2lumO9`xT5_?gVlaecr zHY4N%Tl{DnGw57jl5teP-si~J~=xCO5@NjU^mF;qD=-RJ5@6pg5D*Gs= z;ZcHYPjW*~_T@S?+1_&5$8`;ln`NJLH$3T=?Hg_An?99&y43J=UABLxq5nws+4qKL z|77W~MmigA0NFSoj2o0_9F)fmsWlGi;)abIhpllVj*TN8xKY2x(NNs;n8xP`xUuAe z`iINXVnnHQ+*xA&q8T^Q-8k{0fv1(b-+pjnsc~u@H@(w1eH2_6M85QNNM8)}l1*+F z*)%IGH+S?g@-9)ej0y-fL6;F_4MT=gsSc@-MYRyoVOF!5K`t93@e1F$Y`IrOO|Q!3 zR^x&$_af)Ea{|Sdg9C@(B38oOiv$9^&BUm^b#iaNH@*EQw^0}3`i3T@G8hG*QA4No zQwO8$hc2!$Z$8#va2#>!^s#gpT!%I9gv#&6oHp+U9l&vrjA-W*ZMMiav^`rgkKl0E z@WR4@;LWj-U!?V@2B!>t2}_rGDS0Cq(nuVV3gBhmVcB;zV6#Y3`>f^9`|;F^)S z3Kd17Tg|+5$F%^jwldsQgqMCY%^8u_rhSTm8R7tTW`ho8&7Zb1Tuv-Lty>PUz~q-Tf(NNoKQaGyi7QHy6AeE2 z2+5Rosas0YZVgtDL7#$lnHDA4N9|oZHR4a&aW9qRmcQgt+vRrKG4wlVs?IQkdFTWrdEeDgefP5DQQohybu@lUZz))xU-_Zva@e z>2dPXcV_7=K6o+?6X3YcdqpQ^ zHzgT1^d+M}67J8>MiTRn7{=iYwLtq#(O za`b+E6)RBVCBe!&1?hfP1c?@_zhu}$;3q{(8WII(gku0eVbVA8;izB9#v(jJd?v#T z2$00sCxG);chN4^u5WGz!!G{H*K)}2=K~B4RG3rgfVDxDkQ9$0m?K=Q>+U@4v<$a|~eEqA>1Vf4-9ILBhc;27iJti+A<{Br}+o1aZQtCwO za=yaEITrnsn5gQlJgdnlqRgXyiShGBH5`wvYwqpRLOu6BF{BzB&AHfk)2h$#k`_%oPZ z>2xRjUQoWNp3H|_ysT_XQpi^_^5 zLno7Ny;jfJJ&nz}O$WgnGKOLuQuvr4_Hu`cS8>-eZw9bhk{MavGZd?gR?^u_>4oj| zLVu0)!jo{5VXG8?%4_o3*Yi&6ioJV_p3`$L0T@W1>XQj9D_7aFG|HW1;}gl6SIz}> z_&3XxK*IOUfFye^|i|9y~JQrl1$SrmiF$su#s~N^1$+Uev;w3$nr*GgT`M{n& z*wHbl{6qaNA%YHeTd2ZV6%jmnmf12`UMEW#t5#~hVP2rCR6n?X= z5x|r5flt@d(*Z@`R^|fo(s{s&HvpAHfRJxMI|*-d>C3dIa1}snz0OL<)7J)&wdXgW zWheNcr;OZP#o}b;Fq(M4geoH7?!L}j8lU{rp2<_q%xWFOctGZ-zWQp|m^TBUn?xBorLPML7i7k{m#EAlut ziVmue+}lOuAZWsSK+FnJ6EQ@NA9(9c6^0XqKNEZW85n&A6~e$0KY`dxB7QBW9s6(? zAn-77NN79fcp9XziwJMmG;(Gnf)ToFxww@q4v5RjfU)J-HGKCR2W=1}I+}@KkP#%& zl9H*sd|Np6HmqgxS#B!WLtIw1h(l%lj&3TXD@^xz&WTE~x1{4bS4x&fPhp(a%lz+K zQ6qEaMY^-ubbZ<=OSdxBxfP!Sea(Oi&P4EEkaT?pvF*Eiwk~-MBEle{S_XreeC)$a zp}|fm%-v^xR`u{#Foy07|HcvAs}MJ4ot4r5P*rk1#X>SOt(BX>`dlHe+ke)hlqaTC zq}G0FgCm)z%f)5ycn&CKt%DP;m|FgBTj|QSYODqJb`K3^D-?L>Zcs_bD&Dw$!f9p+;sDqNzT4x&1u6cZta0Xfh&Sg{-; zvqHQl9YU<1894g+_58CG=MDW*|HOdJTTzZ0ZNo>_xBv*dz-ck_AWVdNj|OvVeK3mQ zdmK&`WX|(ETh41zo1btw!3#jDS zo7q9Gy3bVch3>a*as+!+Qj@sK2nMXH?(N*w3MFZN2pL$wW~w@lb1zXvKCtEqhfOSG zftdsQf?pN!zjEsS=ZYnu1SZuk`Gw|3Fi|ZWlLgdlOJovqGxg51kWZ^&HK*`&vw1n7 zDqt6TTxw`ET~bo1?(n2^I*>&}bk&T1w&IQJ$f@{kuHaBUa$;ywtEsZK{HDwsPa#K& zl#NcSDtkzsEloURT<#HT5dwtGvK|xi5$CDe6WgE>_k6fmbI>)p`S=GQFN;Lf&q^uz z4_EW70Z8>7i{JqmZ-K(A;o7ijA-a1Mt@h`f{N}rw&GvQVLq zIim%ugn=lnXb?7loMNnk;0~*R@?t4u*J2cwpCe6#S^tb|O@&AWSVJh4EDY@p9=$Ud z@i15hnVuF~`$55}CYRY9K~qUiLj%$&z+obSHx-@gRsw**zED`yP0@0uWPU~;%4(Qm z7G&!+gBKmhn~2WB^qks=oUWMav-xC4mtk%R|Efmkp&{f>3{}2$%s7IOoB$C6OCWeT z5%p>SCH-4Agy&|VG4(jh$4_nt!Rfc)rmNl|6Y)wxQrS&S127BXi~xD9|xUi+w;idQNw97NiUB&#Af zak;@STCl}sus-#ynv2z3Sy@g6C{E7yFGPMY;Um92n))cgfd9&kWO_OOBGBFYKDz_O zg9|(BCRkI&YXxD>Ot*ia8d;b8@`X2PYmjJWSr4!giZU-;62%+&fuvqaXDnkd00$ou3HS(WPUuuP_iKv9(CPGX zVia9PMZ-c*?<O{nv9yMe+1)TC zjMcGRgV+6yN&%18Y(nZB-eyOH5jxw}D-3M*F!$5M)zm5EwLt$6WQ~XPjhgeO=uwMI zFH}oFae`QuQPK@Ff@r(rxnFAAKq+a>O2`Mz{IgB^EA0e{IUwg^!tt=18OwNj=-YvQTYI05HS#*r0$M~Ex% z(jOPL!RVGBWeoXT8BBXKnU3zOJgoYCYPvj(#w%DpydC9r?<}Lf;FeK%2xZ$N_l}Ud zC`yb)TlVphO$Ky2u7r<%E?^c|^kAtw5lGR9Mr-_5*8 z0}cmVvg3jnC?&Cm8iF`%?*8F0_sY18suoKKqnZ3XN&)`W!BCx^zNE-URo!ejJMK4F zUskB}P$b^ZB&k#S#ec58RqUn65iEEM&47RaYU%Qw9M2i^BC-rP3X4XFD zYM`$Ld2usR_2SY9re-tpkT+EjsPzMooh{lOpM?S-FNC1`rt*w!7vi_~+nZS!w_sun zO@9f&|GapgfLCQIEF>znU>hb9XS0#)+G!Q!&6j{%!rLZ>6&6@D%z4DXkO1ODFK@tm zg0ct^Y2ux^0#A?W^&DaaK6jlfh=V>5U2=ADI7pZ@*6+g?c_cw zX8dIN_1q$fG^i_qaD-hJBj-X4K|Z#I#k0jfy=6h-Of~7|dpToo*{QZj1Xp zi~W`hJ-|V@YX}4%;GB;T-vfc;MocsmbKImS50SJWNZzv)m7C+!3$;|UlqV2bvL5Id zS11Y-CPL{ux?m;ThL-%WvtQh*Z=<9BTwcM*YIo0QAV|sHdrb(LtqYijb<;i84 zB7X^lwXb0Ct5B2*z6Jv@GaF1s_(HtAWda9fUW>{`dINgCJRctPL;~bjd;tL!!$Z=Od%vWVM3HJIbokcm&e=ckc!85#m~HxOJ#TtDMXj};{moD47R4u8=5$RmfyyO zuYoCZq7(dBhu0tm?KxO89T>gH4yjZ$I7<@^*R_w>%{kC_Y(b;GIa0B<>r_ydf8CB` zUjdC!<>_qUMgqh1%$1rVq0%yvY=dCp317rUC22qUY{x3F%U^}zgjBMI?rMZnLgXpj zQJ(ycRH>=~Lx&A{r`m8YU(UZ9T6ftZqV*$0Wg1#Nc^*IHO9wKAwwWr4qx$V3{hNH{ z;Vz$R+f{s-@8zrahWZMhi;(<*{>O>=S8?tFndgPRX37DmMV|*pW-x8>|I3tuG&e}P z5}}Rms33Hu>%;9ckT5Lw81#2g{xpnWR8A4cdFjdOW5`AkRlpeEbC`hTnCoX%t)j<& zV^|+DL_6G$?zk<~*Id_6)=4Daz`ck??*0sA|(w2l`E4kQ^K8=Jl+W zoRPTe^DYo4cK8o|7G8&HdI#GXqj)fOj*d)LNkhMo^lL>hJd8U!K`{7HgS+gPyA>hy zkick-t(eefF=Kyavei=(bO&3qb2Rt8se-gvHg9rO27H+ah(j|BcCx>Uv8wItXFA3g z&q)@y!mACfBhcIM40sY`B>MoET_LyasJ4fAm1wFsSk1l|h3EHv$%CA^+)~+!YFGuK#(A? zVwL!`FO%k$-F#P7_|v}Ub>HE+3NQ3S^ZsarawnP<_`u{7)f^j%2Zxg1Ld*(kKx$|L z6X_BILM{>9(Q;$X<|4s=d5T>2Sk*&TWDXzJ$m0da9GfpoE zu=7ww$Ap^s8|^OUAq73C_{ayoppZ>CJk9e&J&qGEsO|cR6i^?fq+iCPJ;UYjJ>QU8_1EW5AH|vxq5n_-P)bl z?R9T+k!o6#sN#bDJeqXf8y7H97TSx;8Rec3d)Xd2SPgy89I3?0 z55l-h+k~!1ZpCq^5fpk?8@>S=^HaO8uf#ExIs|K7<@gbQa~k{4RRDCoRcC`aZocLx z=yC0nXTsPgyCvTU=G`~0jE%XTPHr~hsSuAEWQo4Gur$UU@SqOpG|c%da*G%?!?X@k z7(CG`uK8A^IZ)!t(Ioj$z%TtYpI`5w2m^zQCK%Wib{*cQ!V4KjRM2$yK3&L` zW>KeVclQl~=vbhE!_!RYAdaEWoyirPdp}mq_?kqYyQ*LGWp<<`Wc(IlDSNW;z?lsG zX#lJm2LIEZ`BC*|J>;_gqC!jspSeQHyN|q@J6CVDtsi|h?5raeCp!NcGf9s&d0JCi zFYUsWZQyZ;Gu|i>$v(3uXCncikC(F%C1~Oov%buCRUy}%$v*Q|evxh2g@&pLzX{nP z3Q9MY7ViXD{RVo3jGby|zO1Ohl-E>~OvV1t*2zjBB{aMOzqxcxSm-;^=X+%!A%Ks% zC<_q*AFiCcfzFmAc-%nG=xoSrEH*u#J2 zez*Q_O$GE1n{HXz8P~2-!p%h;(|+&Vt<}VU7V_BqY`21uubQP%?CeM`373<-C;|)U z^JUsBmV?NxBxrf$zrMJyFv|3>o5X4@l=M%`Pxp~&!aJe&Dt`#h+ar?NWH!?IPDy`& zb-7CbQROC^s5TndNoD#+H@S9w@1>lEZ|CeMU&RYfQt}t}VPr-aK+hNSUp$SiKLA30 z4NgAaBN>D~EocAzv!!?OD*AimzUK2?Z{0o7puKN-TUzGHG3)+g9!;Y=vSO7E`HVNY)KSg|;`(}(4UncB3`$t& z)C73ZQ#rt}R=U1-auQmF(@P4D#}2dc1aKp~s%gnooV-|k4sC>tWNmUL)aQ5(QV{H} ze^2p5pJ6Umk+l_dGVS(V?WgwR82lb12N!N-hK?OcWI|$_omW-r^^xKd?r2ml)Smsa=1k1at&6UM_M+xbZ{t57F!gN7NKf}GQKh$qjN~SN#_QlDk!N{ zO34xq)QEuBoR>)9u zxR}aX@o}H+W}$j1!k-I9)7YSwa8Hk&j>w}%A@$|QHdy9$UY)Xy8;ie^fZfku%M&g} z_|)|I+n{X!s6Agows!l3tK;oIjQ)w>7BpZsG;(lHD2-MlT)etDLZY!{FPz#SUUfwo z80d*D@anTp5!{ST`8q3EO)7o3nR({IHd*){(yn-bxQrO&pJaaZrKJvgu4T(igXJ6zka1Z6hOeAb2KVHQ)|X=cWWw&~DxVVTf{er*Eef}sXS#(u zQT~dC)2MnjnywPP%q5iXvcB3@te9cP?>nEOJpb_@w2ojGx8OgJF1vTHwZmuOV=@zs z!qZh5S&xmBGM5`p;>P`(9_>8-n62|2T9adl^*o!U>d8sU^PRK28K#+eEb`%k4ml0~ zdG+qPDnkZ{M150$Xo!po_q!3Wq0}Z|vaJG>EGl8Yl_uT1QU#HK=!fa6z!f3PNJN%r ztLY`AErU5poo*&_SKYuebe;@c)7K^$u(NuS3=E)u0cG~M;m@24vC*wpla+c~H(5BN z@CH^IKUsgS-MCR;kmQDL0umKi!-haDczFW*zgfdm8Y@cC`s#)p$G=A~)&*{F7hGc# z*4p{0X&0-0tO|G?KBD{Q<+t!e&S}osnw*SCtEBc>1W>zDaNt{!PCTiMjf(~1PeEBytN}n~-Jg|*KCOli`OfPH(@SAJ&1i8I zIMWq$2}C|eR8F0hQNqS3wcvANlUXJ2S{Km)YZDb=!iSRU=6)!+b4^ZAe3UZNE zl$$P?bPxRn=tvT^s~Vr<{qnq3A%G?@iA$1eK2E0=kWkG%!+^Pu^_#sLOP0!iBrqS_`U91Fe+!O1?h2v8?L|Rv`C13Ac*OfbnNp#73gd?eDVX z;aNg)gXRClFX}NXHC%Sbo)&l0M<;qxlKjFVIR}T0)vtVG2sWhMsoY5VXHUlYx>s?D z3lX|oYvrt>C+uWa^p#;b>1L+GV715gy(-c2XQ6D#T92W&fF~l}HJbAeBwe-bm(0bj z_VQ*geRHSPIVbl_&jRdz!^(&0SfUSDu~6D7iEP@IX#U^)dq{or_TGdaVOcbfVo1PKjQIAvr>3POnHX;rxSD4rq;duO0oAZ zEnPTV*p4nYozUT=@o|@jfaob%P9}aLgbU$mAn^+D(NEFbZq*RXqc6{f$wuB)@eZ^+X52^~7WAMhGZ-D9qG%>(=5}$xcTAKOpKi`sbusC0 z5p0uq*VdHiVON4q8t(wENwq$&Xnh2DurM8E@h1l~#0plrbNIGTR{Wu~Em~)6kX!d) zQ(7fZo|@*#_>kHUL}Os$HdZW{>O#nwga9YO6y)emWiFtPA`y(~vUD$@a~1le!BJKI zToOcLgLfP~DrQX4b4N&=S1~tR*5%a0%cOTxFDyL6ALMI~2l&4?Vro;)kWW-;qVK|dE{`QE zk|;Y8tm2wEjNKRRA9jIaUzJA}64;R3+}oHl!Dg~r=K%BcD%Wj|iD0Fp|FS&m9VGrg z!o=vMPQn=*2|cD{gxK}3(U!s}0Hg775s)Ox3w@x@^qHPfz5d4-hn1~Rls^v0lx{Kh zQXh;|qw?-~0oHO1mxCpjlD)hE-A{iibb8LAZ&*Bp>iv9NWhi=^E6`DNc~mj%lmgSS zl4TzX8-3c__5~{heD@>NScT-6qxbhZU{*c9ll-`;a(z${8V)n;1m=d154+204vPM7 zYY;E$CestEY}X&*Bz+fZndS7P+9!hl&Vw2!_P?1dF`|6Eh;6=?T5^U@zGYq)@{4|^ zMgPU-%)?UtLG)(a!hM722JnrJ5EKQOP-)A~{UO1me}J)mS}f!yvhzrOj8S_xWb!z; z&skaV2JOoDQBcwvuh!K|6%u)GLhGORvnIR~4C7vMxnzWF{g+Iv0>R5_q zeD#g7bE-F$0VqPqb7SPU`&bJfg#Krb^%xEqP)j%BVkeDf+`w1tSoxKw{|`Lx&)lGf zN*?~t{st;Q1fBbM6J-zu6hw0>nbI`JXeuW(l`-PiN7`yc8Gb1qH8NVp zO|03jLE`3D;FWH@RSYVyhR3ld5WK)kQU_vZ0EA7d;W4elmTz-}!zUowY!q}+N(dJg zRF4TXFy(H+1Nu1l1AGwg@@YIapmv}sY?h#o&~?#I!Q}+%_0YUFdGvnjDG!5u#<&w| zk}Ygagu;xY#f;TvK?-Aj4ltUp(wPfpRx}@nbE=Uu9SNSeR)FDW{+olKp`ZL_%A&14+)A9T#)BXy zG&~rcVuEH!LBn@?aBDwZK(j!T3Wl9n_ym?;G7LryQ(j!a3ZF21;O4?@WbaDBucGxN zA|L<_04+z^ZV}|92uPX9*<6v4s$ifYxKxNaR5F~3hSShURZ{2SS+8w}xeU>L6_C5b!S$;(Y5NWD6hY4IuKozH^?W;Y;OO5~@@#Ju53g8yvmyF~_Hke#s!dt{{R>U%h4Ne2`Gv1dv67@c__3 zJ{YN(iRR#%RnHnU&BPBVFaA`1SPPOEFaTFv4o^>%S7`6nE z!0_@t4%Vko7j`qCVtnC-AWi_Ea<}kpQ*TB9A0#4;6YY)X=g74M<>I~FoRM;5DB%$k zYkSV;SO)u<+i<=RS0F^zRe#vCN=OCy6OUe%AmrJmaC7sSadXI3R4WbqYb%JdU+j zR*62E-uh!ExdTA)?JDLR@KwzRn6O}Xevm3Z2nH~XViJtuucLTlotgMz%^!NY7BL~~ zdHkv{iWrL2DIYVb4%b_wvQ*Qb+7Nhw;xvcl1Bwg}fOaIYLqQ0_F$PQJ{^Knp1Q5{% zbM%2ZK^!-niA`0iyleGtwPsEF`l2mcjjYv)8s4_!2o~t9|G0VZkKE?1)h3Ov32)QW zIW|Q!BW=Sgot9RWy*=}wG@ceEi%l6^H$t|S(e;~olaW{RwXP;k{+1CuPra0o>3vt6 zG^gkc(9{G$_mo+Z;lMcw{&(hoqHyEkZE|U?|G74SZCcESuDmiA1!3CRwS?jj447QY z(U=5*yP5;GSdqAGR?`V!axi?!~nkd5Ivk8n0(` z$8D8jiGtU)K>UFAfG3ZCVkA$_FweL)(d?o z^%=70{n;QSTmyVB(A=wOHt|DExiQR`I`nrQJVfKzDQ#B??qV|TvkK7B!VR;2X=f~e znP?*&WQQ?yxa|s4Wd^}GUT5pIt}%SX49A1Y7*SpuVLHbvLSkwrGoD{!38W5k;75m# z+r8tPJpZHj`hpP zYo!g>);PV}#_njBK3y4&4F~bsxV|oKxGQM#xIu`TKenO_;`)t_sW@dF&tYTZW2P8^nVo!-IUR6$`~!~TSINi$3kNnVx-=&&ntG{ZH8UiZIIXgvENcy=IV z_8?PJq!Ro?dzw#Uiu zXGVLsY~J8*gYMl~%*O3X>3PGc1*Rzwp@JbZCs*}jhVh#Pu`~X|zws15&qb%KmpC-A zU3y8GG~zKe?%7nnZ??pB1LSFysUEVFXa6kRYB{<|NcIJ=J7D?x)N;O$x$l3&RZ!Qh zhDSF-R?fT6U3iGTE!TTTXV%|hzT}LD5wiSe zSEwdy^+D5W!_;ci;c5%(>o&R99agWqLS8@0dfnUf`pMMmr-!efv91lstqobNjfAY7 zu?feU)+VObrViI$vc8#>doyqKW-;W=a@LzyO>bULy?Jx^hJ}-_Wp!%vzc*@D>+iGH zKipm0ZCXD(T(`8+_Z(foua18Ze7mA$CKcuz_9o-Ej_H3-s~FLz52S9qRlB(H^Wd%R z!W2XK^vTp)KOsI`CND>J154-B!f-K|fD zBUq2uI*>pyRzADU6pO5B#iNSD4gnj?+-&zd%h`9{$A*S0x@YINR9hqAe~YH;d3KZs zX?TLTE>bT+o7HREVRYME*UU+nLskC0)eT=xU0zS!X%~48nhZZJDDRhcO6tP)Ies$^ z%1(77KR#5;Z+cn%Xd>2n$h~~pUU-{*ZpSQiIYB;gTyQygJ!S9f`#k&FoB>+Z@pevI z(yjHHyk=q7>CNntcmC_OmYSGb@;s7cRNBC^d5(=>CXOQA(+$|bZcm6nYW7P}x&XHX z#~Oa-m*7V=-3b-shYypWevh~8R1mK2vR66p8CPQU%%6%`;Cgd^x?Gf4K*NiztKtsA ztUhv)KJLCc_||ry-*)(hjibkUwa?awJ^N_L!}qQH!o~$b7w1Il!y~!v`^`h3ZVvEE zZL=r;dS=;~G(5u)h=|dm&o6n-V}; zMKr&9Q@&@%8?TQW;2A7mfQGq1{!757a$b=Qlt%sWP^I{9{jVIDv#Rf5;>Xm*=`XhU zG!ccm0}ByWz1Ql~AKzGVYm0EC6cJ}Uc8@fs;g=@gX`g}wT7iJUPd;rY#xM1LH}uQ0 ze*Y6JfCcztbJA2MkL+f@h3R~!cpyXGo}_+vsB50NO_0&u^{Fc& z9NiS~W-Wia$B^y4lf-Asrl+4|Sbn(c0WD7#uYa1zyR;l3@-ph#a@i&M@|V;9xWI}K z9;mHX;Eq=rf8>ZbNw(g>FCAa zzDpp3A_w34-!{iiCHGeIg?Arg_zo!~(cBLkLZJL_KKXu?gyR$&le3KK1kSCt9unbV389=ZrLa-j=Ihe%4E@3#J zIGmg!#>AP40u7NVNQoeK(z{JE50^{;;inDSfSFM>c}%eqs854yCC5AG4oxJ(U3zR@ zDZL|PGM@izA253su4=JvqZE}tkZUnsY;ti*7#bs|b3niVCUF)>V75MaQ1qUh&eB3< z!4&RKmYieQ36^OSUuFuZT=G@#l9@|!k=y7>`-;wFWX?vYu*`Z*4#YeSP3Tb`o^KR1 z9ur)d`#PV`q2wMr@#-63u@Tzvz9H(9JDqyLnm+Tz!1gXu($z2ZaY*?5;3+3-e4bGj zBNr}H__N#NERLWq-AvbFnPW_0O3;^D{KmgNb> z3CcGczgLAyAW`#|n>NzlWh=huzuwYWw1o|5W_VL=(eY>6wYec*MXBKlMfahi?l*$q znBw=~`4@!e&ScAWnAVeEeU`;1Gf#%(gRZnuz62eQj9W*w>hgzo;+wi$30TcsSA-{( z*>#4T2$!I5qA4tPd1lD6L_2etChp9R^qOEw;$GZ^D~U9fu>3~ewhTfdvxn)t)Se7{ z0D!bsmlo$*S7AyjLCyfcydHfNtDRAm@Rv^z7iRlKWxMQkxXn|WC8Y3Lm5GuXcQ+_T z=VLd`;P#py$2ia#z{WkVV)^r@xtzbzG$x#l+~YmFq%RecR^(_ZYW+pj{GL30a?vwG zD6-?c!TZ7m4of2k2c&Vu;-fQbB}V*`)0cFJm1MoNQ)1&?w1bYD-SRTj6?9HBoU2_K z<}oo94Hz@ksei%TXa2w=^&z(d73f@_w;Y|Xv*#R{KZ2`8y~t{=Ni@#!q@rB~NN#RV zx;8HcGXxZ__z8h}HFHg7ioI`zq&8FjZHe-_MA>4Ow#F<=oWvKb6AGPNc>H=cFa6Qx z`4B4-*Xv!K7#ibP804$5eDT`1Zy=H+qA0+7;=TQ=#A4_lmlo4d-e#G*A;68O+kRIU z^K()?DQxmL#zOm^^E?SUtqx6!=(w*Vywd+xCIBegs}S?(xGTE3*fY~C8@HcTX&q26 zY1XxDp0b{;u9-Mt{42PTAar9vz_DL-cW`!nGCEi8ifi4o$mBEHhXZe+Yu5)gjmTSk z&tgKjSN+VQnmdjbJ!@}WatK-oxy>6$-TeLJ!hA~hH@S~@CD!Y&f30<@`5aQC>-aFT z-_^-Bcc&zYbip{_YTA=Wmu_^tT1I}(@svw&`?$K?fA!g6Zq}vyS{u1+SZ;2^U7%WP zHq?2GDs%Xe!kDp9FEv)f?3ZKL5;#vxb^zrKud#!iaNuRAzo% z2S@(OG0nRmLHPQf8H~y|O{U*vOsmH~bpeK{N!H3v!OfJ_%v-E#%mdHVL-(X?d{&P& z0E^ztTPH8^-H`Gk&>8G*d|GKoh{?7mQ)^z zJ+C}ycTdg6yK!Y@vOyl-68fegi(Bhu9ZdOtfX+J~+1D>^T~u#5zrpE?*cc{(LP?^| zsUwD*U8looKHXjKc{na{<(jP@*?E}117CFRN?8FYAvftTV`arM(oQngw3=Ck2UQDN zigJa7=#<{E7fpU-C$zv+)%?0v(u`m(xgza*HQnkXTc{$-=0v{C3>n$E@wj?+fo)dn zA(vnfnDim5RPBdYa-4LwT&nf8cNrHUH;o6BJK@y68V}aiNB+icfOu7&R^VA*lF?o`=>W==)a(e&<(w)rC zx8feZCBYIg3E~brYfUK@-LKd%`#C~yYkgA690ssewY_lf;kFxxLCrAp!Dk!YvK)B+ zsqchZtA2^uq~_OR7tMgQ7No-GJ1Oz&-;r zgB=Ziv-6Yc+;??htD?)Rpw?2YJWj&PJRppkA#nubZ#~J1?0biO^vf9y`&!9$F~std zx@V~x6SJU99z4Cm@%$2@fJUOQ4&Pb)aPi7@xeDn=(MM+iLHB{0x4%N}3-CsN%-Q7{ z87WfQhg7^`EARe^_1W^&7oi__vc6n)ztWtG-B69T!jeGM{O`CJ+WL020aX8z=cmrU z@J9TTpBb)BEp~MKz8HCP1%2u4MK#vV8r+ZmZCx{;(+s$2AQWa-`j~#l{u`_Fe_xUf zoR_$C=VtWYynX*cVEevW*h7V#6OBi|7wLG7rVpG^17##{v*>#BYTCvv3BN;z!0Wvm zN1t+zACAV}yK5d=QOce;~%ql&`;!;zrimPLx;SY!7Gr;@44F2)WT;Z3V{{3?V zi&O^90Lt6?>j1V_sJwBD9E|9;kE)r2G%v~|W#(r>4<{pI*n6c)^s;OYM@C++@w@x6 zrlS4=0(~63TVsd-yvth#*k%p^fON9zg8}{{adSXoSLuF50&p6S)_s!)0um8xhMNm zS_uNFPpeS$e}A6kleE7m>$Q;R>?%Sl2EEN_?x?n>Ro?lDvrqFkbShVLH$L{g6xB^s z)DdR2( zyg({T(15!>o$Lt|#KDE4*w}pxRv)G0{2SXZbnG&zHFT@j>ak{@iqk2&z>^^jQz_TBbx)>YdKh95+!*x&v13QSp z)h9Zlog>dJ23ws6F9i+))klieN2O}izm1LBl|99rjIJ?1=M^-0>kW)FG?AL5zso3I zvUp+~CzS%qkaHy`j03MSj=knLJyIG=8+?*pkNWdiu5R^#5eMoVWE(Yeyper zRZGtdz=7cTBlC#B{amC#r>Ej6=y+5y(@Z<_enMrNO=I5Gj_lo24Uu{&$~klLlRK3O zzqDfFv@-o^ zp+8TUs*ibFX3T2zq%9XIGLM;PZRKfQcoHSZa|O@unXktxH8B-n`Bv!;h_6K5+@eZlaztga7iFF} z)|800T(=p5kS&f%ERG{B7jfp3>gL6PjQ>i>wFkGGV$EM!xKR++c1ysE z^B}cp*2VhHHp|?$*7E1ckBravEl^^``N=AbcQfxP3{_5@zB-qcKP6XXb-;bEwUzRn zn5yV<_qbJ6stPBupi_NEZzVNTa0R8f&)EBWGA5C4TKi?sWZJ%prKrkXh7I%k1xnp4 z7IE(9_w239EmL>;*e>l`b=J?^UE|$|Quq}&0T$2oEHm3GGso1w;K$Cs63hM8X<;{L zAssn;BFI+wd%VKOrpjmPKb&lh3SaG-{zkk_Gv!5Gfq9^h?XrMP*NN?$1wqU=D{Pmg zsIN+ir5um%T+!HUugS)`VLj6=je>~cBj_@Dd3JS9t`jDe0~jXXkW)@OyY4U5%Lq*pKb z%rTT#=cpD~s}g193?wx{)Rer)Fje3%opepEE=hoC#YF$4EPXB2tXkJpUDeHL)&6)@ z7T{M#qt)x+)_-Bg>omNIxd35J3@wb8*>fV7_0&jJLxcZa)=LRkjBQTTkUcD`tqRa0 zbYoec6xMx9SZSKriY>Q`{R@XmH>;T?a{Z*PDK5C-Rjlw;R8oTsf6V*S^a zh*pXfp?}GMgY}A2WmgN(T1;gfVC~dT)xHg5);y}&yZsa`x}0(YS&A@PzRg%zEkU$x zT6MjOx8=f<&4614nAT)kwRPGJ8-Z)Z%rU%GX|3FZ(N(V?RfpwRul3j?)Xwpc&F#j~eu^rXf z{g{WfT>-sWy&=G_Q;7W{3XgMv1Sph|c@i7LfH&!n%~8Yruz@IZ7EhdjMl#FRj1%Wj z(Uc9C4k|1C1sXNdSdw*)&Ww(Z@m~N|)d?8j0^XbmssJ=`mW6$Yotw6WNEZQafdK2e zs^EYg5D6D3ETcG41~h>T^XJzdr~0S*w^)BR7!#bBay2xO&BUMjZ~ zUSaT=;TlGbsicbIW}R{~ z<2asx`JCg2d6EbAieC%c;uL}kj^b{;E|&iYB|7WN&=?L9wlS8l;Q{#H8Uta6m}Cn= zHT%V0=!Ie736Q!F)r8^W3#Kd=NWGz`i$hr`QsLw`K@B&Sj}X9P9_|l5X4gi##B5;! zuuzs0Ac4-YfE)PYgxJ0g3gQ3Vur67y_Ef`NR*|_BV--H3mJkSB*5jQ!h#1CShRWcg zEL}H zihe$24iTduHdykwWq#IU1Fq6PR-Qn1;K)3QLY`o0Oymn*WDR!Y4yNYeP@{>)<^~>Q zjHc(!p3=))vw{Q%^XzUWULHov74x9gdvRuzjuGWO#xm@s9H zE~Gy4IDVt1$m@>`!U>i@S&|(?u|B7+K{6v{mAXD_M5fxcR=thUl>eNG>)MNGS|~l~ ztJeZGI-%H*pt~vR5!M+2#cn)<*gnaHKWdTyivh9CeryhK2*}VAlB|gW_>QuEYy_dE zKjUl3VQaeHGu}LGs-C4kBZ%9Qzu;W5mqF~Xz3tng7=q|XmvQWY0F}t57*j57#*Q_& zt`fM;mb#wqQ*rAj61T3zZ8iU@?p{kny`JmuhV9d)pVuAP?bGYocAQxA>)@5&-c9Q* zDr_Ji)hq-Y`*!QfzFs3zDEn$|k2(qK09WU*IE1k7=7#U>CI~`A2*UR5gMjWadGN9J zoCL@1jFIc&QlrO46@LL<$$jmyUebfm!ie4Qt8SuoWl!RM2n_FT0dG9#?i1b~>yj{W z!S3(EX7LA_@c+(l{=6=VG#d0~2_Zi=HJU%o4Ws+ca1)d6wZN&phVLUwve=z*3G(g- zy)Dlk9Bpl=DDQ3?32!?b@3{V3-$HV`R&RgFYuVQEzSeTd4K#WgX;(>exK=V_HN)&K zh`U~IIrlRsCwpe(@Yh^9l$85y^BC5giFA z?#*UJk6^$n->{kJtEy4u=B_1-1@gzZZ0p`}KR55M4zKupI}^YRV%ED7cwOx|n#);G z>O?SJS+O*9K>vv+DdLs+$q)J)oB~1iF5C*>M&G`44IB7%dcjGSfEdd8<*K+)CELlQ zfvA$COavnKH1c+67hA1?_RSRYUr`NGS*W*@+%ZJ=Qc|5{mon-=0&AZic)xZ$M4`SL zv6@0c0_2%g8S%(q6PccBdUV^Ist#+1o`hL#c4ssc>i4#c_M=gDUm|#hG5C@PFN`0t zSYsHI&zMM>4rl*A8j=@GT&;GP@AW>OKbdxMDajad=aq7UrS3Sfp`iw_#!dvon3s)wRdbKl{rmzmM5W&k9lSXBA2Nf zo1b-@=l6rpMQj)NpT~QqD|uR!`DVxcl-GR+Nk&l(Buxz3U0lHs&uY>vG zuYG`sVPV9G0R|5uOsH@n!-frAl!y^Aga#G^Sg=SCVj zwC72LCnjn*$bzIxlQ4(g@K|!e34<&~?r7;0V+*np7u;}bm+McDQlsW5`T(QGhzmS& zz_{1!fDR`}whZBMut5zc3U53+Vrz`020wHT>ySkY1{EyiHTX3&!ncr34sP1@Vu+VE z4zB;E$dI&Y)B{M^_1VJW&=VfbwjBUkcfzqH`CeQp_a*VlmrWXF@%TB#ip@)(&MV#J zS+6r|-mI+Cs!yN-3lcSo)UIdQPcy!pY7hla&u%$8rJO_-5O-Wyu9Y+wRSPy`Lt5Ce zFp)OJ1LB^H2L3CLV)&bee_YvB2|--hXp@R&&heWK(rwv6$Kb{Dn5;0J({F(T5v`WRZi%8J64t5Y6ZvVJ=|>l1RbLwqkEL zcz_^RD1lZ&j=yarT24EGs1=x$1;rFeH7UlOXehd5m_eJ-r)7XTN|k4dO^O+wUpfB( zR+Irb+<;k<3yzmrOy}8z(3|Z2G(b@B6$R6LN(nj}eo`HTq<;fcYE(i%qNnM4aeDgR zP@x_LD5*>hda8a6jR2-Z6396t27d}$0)@w4YZ&TwAJAkf`y9>OB@P; z+R0suENB=4g}W8WDof;D8f1D5!W-{GBWw^-ln2>xTL&Fr6w;p;*=s>gluqzK3mQ1~ zZVL&pWPuGz+GMYHBVe$>2o~9UA`A8sN3RF?-gX;Rw`s7!u?uY+lE5DyMDGSHi)Akc z9E+85NGH5&^SyscJfzJtM~RU^Q%x20P!a!$5mPeLe9^`o%&c@mB>P*l%|ris0CPhY z$uL0!nI5&l%P4Dr0nixH`|gq=|0%ZC%?;4?*BAF|bj=<#ZBW*`F}<@0H06yD)rfW= zHqaHe7Pr?nXt0vO2;+>^$0y5Rq@3GWNdZQ9)moTrhylvbA@FRhta;RNsPF> z@z#BF&L_AIx7!2Bvg34u9x0=$9vD)LD@j>ruf_kbx>w=w1HaO@3PC7Ag-m<_Wp{c4LO;Ei~!B?|gJ){HFY`%`1a{`%R`3hq_xVtd8&Hp92hY zxx0wf2xvUBRn0AZL!8n+H#UP@Ph`0}UIJ~mIO0SwXc!q>`yAr9gC+k=at!kx#Qt|L zidhU}6>Q+nKnKB)jjn?qgq*@g=&%wBP;)9o6bmclLie$4Yq3)qqM%nY&q+*RUa{8( z6f!;qmJLxcblvs%W|=EiBz3W4oy1Obg5QlMe2ps@2qSlp?%nWpYFwk*V8=Q0HADmu zcz^{I0-O>|fF{3MP#Y~Iv^By@Nf?9U))e?hxTQo%i8Lg(P{yFtWl@bn^VuQQID+MD zFOUu)h$S%zJ4G%MV1HzR;|K)Gnh{W5m+VZ3$4#Q%OLAuXYQ<*eP)t zN;Z1ZD}-F6E~(PXmIc$7^0LSsWtoFsu98E_eB>!>xyv^KE1CZUEG8~_`MOg=@|IGQ zBvqoBNdhuuAyQ0MBieHJvL5*^J-3UGoTvY=~ult2#VInj^$6Qp6B=rKi_lH7UJqzXZ)N)soR ziVC5mzC`K8VCplCPJp8+Z7ENCT2Pky6qi5^>P2wM(QczVe+fed}xA`{Fmh`rR*o`|IET0yw||9x#CmY~TZTmjmV+Z&?+b7zA%u z1rnApgez>}3&VE8D)6a>uj^n2EAzv7?XY!8d|m~wiKh~7fpiY}tq{PN1ILBeNK%ZD z7sps@D{gUhPz=f%gLokmW>5&+Sx_J^2+1k&F^B($tPmwnRKpvl3X=+b!%LU86n#i zwKD0wn{c1<-3f6vu%kTyawB`*gC2B7uWkS9t>GKqj0Wks|LtUc8{5`>?kT$^PGL1K zydfQs&N`({;*GPUrk9n|D1s-p6+4x&5_jtS?neKKo6=ruBRl9L^#hMEJ~Q&o8(DA8dSUSXi29;e-5 z$+;mPTEv~np#fH1K~3RBked}gAs$AQ9I7Gqm0%n#n?T`RpZ(1Ra3T$gpOdlS{;`C( zeLx1B-%^$0K{Outxkc+8()6XoA;KY5w4y-_VFXmb-%P-xs9#Ynn?sbLA}w469z-ri zR3k2gEv^+NX5vQ`W4tY59@3%*I%6=l%o6_LOf4atb=WBWNg&G0G(Os$DWfQ=U=Hvg&slW%Eq6Q4yu=U>$?ngeF%T1`j-}xg#P8dg4zzulhr4?jK zZrGn`7)ENqJ<>!*?&AdX<3VPdK{}X9sz6L0q?oa!ONJvxDwqglfV!!GQksiMmYz(q znot&`r5Pki4&+dV08swpm6%ISDp*)-WJh)wQKFcW2_!-`pjvvCl*!x(@S{vl7*tY- z#4U+MI-P_`pyfZRz@K5COS8k=lL1kgq+I>1$8YIAlqN8G>$@eEyq(PMcQ#oP^cb5ts{5{+x$irPFcdlzHb?awP|7 zs6PIig0f|e#-@WUDEhUeVD{!`ZkUgbW`6GHaU!LYHE4O-8grs#QTiuka^-Mnqazku z9^oLdP}Tnh_~It2#(Nf9kwwP@gut7EqArFUULFM53F3sA-$WWj0x%`8&C&o6>IC3m zkYroqfkZg+<(?*Fv0-86t;C(S6)0Mqqe>}NVQL;}>J?@uM~Z+2;8a_!DMr{Po+jc~ zys4eC<)yOf#c}Fy66&JL(!*Rvp|XTjoTRK~s?y+_3Um!9KBb(dX<-2?sA7buN*t*^ zU#(7EKaSc1lidFs!*0?+=ZFK zrt3f$Yz0&cyDn-?c}^b#!j1s7d5H?hpOa)PP251lTCA}? z<-7(-!ImY${u|DkAAwwsvQ5BI?5fcE>el|v(i()aao=TRfCxx{;-qP+9_y?AW4qWo+L??zwtwy9P<5KHKX`ZU4;#5ds^5@GJkE zIvm4ZTGc}Asj6vCed)jc;|M6EoE|L!{Vh*QskQ1YLRQ?wG8^)4?xs>NiJ7i;pf0)c z?Z9Slu{sx_RsgW^;=SI+n^r*M4Q{ituP@>W{K{{Rm>}wB`>_87H?W4; zFhbz)73(k^*+35;uo*9L2;VLdZ!x!7@&EpA9$&F64ZsM)-|m`#kx6m=4e&}HEFceV z=;BEqZx|SBheoOJ;9i6!+wl+2FX0`m4+F5@+5q`Ns`!bF2cG~Y^CAsPSnKwm2djV- zM=A-XBG;+$0gFHzt3W3sFh~M$FS5i%F&4v~ zC5s7M>`}5xjpEhiz`o1`2INkxMJ%k2^w*5A2^@^favcaaz+3zcUO2Djp5MOoB_mJb z)is_3;EW3t_RpCg2VlU$gn-{Z<=@aO_L<-7GEWBtcAa{SL3B+(x29xwm@hWK3A8|G zV+0<7-wFH;O3+OnRm{GqCS0$x4a{|2b-Tb`=Y?@^Mq+QVVb6C?nPj>O;$k;;0zCF|`gV*0w{R18eIGY|tBZ1%b}TQk z4?ef8MR!I_cY=@hf;TXBr}k=_(RQ{Uo%N5C7>m0&jMrrmrrd7^I7rd}ZtZNX@wa0u zjeH|EeuJcrYXFb4u8#Njf7j*Tq&Ev-=Tpw@1Kb9GP)PrGu6C`3w~F7uaQ7d9zEf?lCX4d37TML7I)U?K9i_SiT+F3!_X6DLQB=0D5&4S`yMf=gvZpI!d%A=H zc1YS5afJctBnX3!aAN|uueWhVy(%Zy@l|0yI_W)?@ zlmYS286eV4zzhUzNH(6C7ybx@eawr%%(F!2t-ZOleaj2t&2OL1-=4z>{*9WwrM=+^ zsD0+M{pM2@JH!20)A`)T-2m8qSmeD}uLS?!SDW8UeL|f6%WK#O^ngF&A3qW<-H)}g zT7GtG03IFj)nQwke*Cg=zUzDbFoQDjo%TXneUP8Er`YUC)|&NIk1X%5(hr*|IptYGlNM-v=4{1`ZZh0~8dcaEGeV1!8(DTEee0a4-z7z!CuEc>!2!(edbnie+P zb*w@y4VMNFVjesc=7kZ5VXIKAb}+#aC`}AhkvSq~f*&%}^^Fp;s<<0IT{4GwUM_!g|Reger81IO7O< zFESA(1JAXEE~}`5gEpkkzUg$_k;fi=oNlKegS?N0;%YO4uP z4s#nJzY#p>K!Y7sIM1aL@w5L(zk+JgOf$SLOMr)nL}-A6pNN78G1l(O55W?_WG%@m zN4Sf_1?%)|f(IeG#WXifpW-x1 zNP$FA9FpNw}}pvc_G1;Jb`AP3iK1-P?IQMK=5CB*`9 z*^e(6pxlV?YBD;rH0b|Q$e3l;NoGPt&U487f;{W3FGoeuq87qpcVKrD#aHEl&NGRH zmr+}{O^Y}hndiE6RH43w0+g;|G$Dv72Ms^9vZTX&t5-=Y8x`zWL2Cw8 zZ^ufgAc6|8b@=c@kFJy9N1vQ@!qz-ylJNaHoxNEVMlbzzTj#wj)m2k&`L_ugeH>>n zv2!i$Act2|@1prO&!W|`O37rjZ}68PTu07N$F48Vn9$e+ZCKjn>xhhZ%%?by zQtXX!CDKSQTZ8{N!Jz349(4Fx*}fFTJ&s}LM+sEm)n>Mn`;1^xs^imI7H}vV;7SEF zLST0!;+h2v$b07_6GnQJE}i+T0%fvI1}s9l3XrZODi8?@di6JhnFS^xA)&-lNTTVO zP-8P0i$!i=y&N*+Al`yhsZ4|(Y)wR61v)|OJZQoDX^=G>oCpOSa=}pHuwh6{fswEi zARD0Ng{7;J1O~#rAy%M>B2ZP8PQauQRK!&aaR>!P^2Qc8#3>qh;%P2(#D;hfgt@`u zbXW+*h?!*o#Ysp4jK_eL(JBW9@g53Tn8p{1fQ>crr0LkGBNNK-EHxC0Nw8wbv5-*( zb$k>WT}c1RHpXNo12{|^=NL;n;t@@HES|$k1<2|R5=bk0R70rO!h4nGsP~@m2 zUj~eViOkhnW`F@9RnZ1sED0y0`AIgS@Le@);0b9avk}y10N%6{JH@m!SB|j)Ex?X~ zGDgD^*l>mAgdsuBlg^jSP?f)GjUh|qlolKgQMXbV@1}{H53)dvMh!zU?*sWlX|qIR%Y z5H0_T?V{q;%?N%n0=X3gp9ZrkE!C)16O{y_(*o0Un%Yevk#m$0h#^dENJuNGZ%^1dS13H3c8Y3c~L$)MVKYW!z-dfN+iAk9{L}5=G39Meq^0GNS6pso?R9(Vy zuUPG?1PE2DH}cY&utnekiR+^VI*??ZeG;vN06gu~gaaIE!Fs$>faaQvI(#Wl2`46` z$Hwv_(Up@}T)+W+4&ZLhGYd|vgB{HJFuTqq)B-Zrg7$QUz3$VP4hG7n)Ee6QJA0uL@6HJN&zTr|{C|KY2h;9D{ z8aM$GB0`vjSp-`#2!U67o3V;zAO;rjs(`Ub;+>o2f!cY3BqksE^3FsbV*uOwdCH zSU!i+g6N8bxfEuBmAi~(Eu*WuGh^p*SM9*caKI&=mS8M9awPn!nIPnB6btOzGBN|^ z%%m1C4tc1;AD6dE=;Z#u7z^{0hBpC6Ceybgi*ohAmB$7QcR*5&2~ZeHPH z6NTEbl=QN|f;j|Qe7Y_BE&~^h>!Xz#=C@4op0$%)qa$d&xIT15G<rA8I~Y~EKK z;lKs}BelsG>;)pYKu1D=xpd0%LH*@O=shoc&O?6mUctfamwiImUu7+Q>D98~EwCuT z-769oeOM@ako$cM@{$L2Mdcc#-vj3HobRwzc3}GDJZLQ@;QiQkwSbs5Yb_y|%!5aQ zw~=HX#251fvVpoQd$Ju<(Qg zEbd0eB2NU6isvRp0%qp=lCS?5BK1~J{k$&pPLH5cZ70f*De5NKGVuQPtvbI194SY;1Sg@ z_3MsbZ#l?0!%}KFTj4_^jY~4+p(M_;~-20%WK2I*}H~5KGw55a$s4 zkkA$x;sk~8vRq>m6VH+4u!9Ct;&kx?9WVrMN&K|01P`*shD-1|vbbJ?k~U)_Q;u0& z>yDCAkN?gammC0+zsY*I4>M4Hg#3;PF6 zG=(P5@+JiWI5gv&NJVA1YDjvLB(cjO$Wre9FH)pQO5*VrQH%m8%piEoRRjbvZ&D%mlBVsPq@*@84-b%zVLo*QF z3w6dREkkA~^DAL7 zOrq20Y~wdWA~^TWET~i3e&U2EQ-(gv)Q zAefXkcS1lnvYzg3KV%d$Ym_lXQ!Yo;RY+oY(5-fbb_Ev`1B4*pmIhgQg+959`%C;z)`W~bbJE^Cba?{0HaoncLY^t=te~_ zwNiD(g(&q-Re%IaM~xOh2p(zNenk_prE=sc11IH!;7bMA1XAy?Q0ZlK`m`Ya)N}-u znF{q#@6@0`l?6vYS7TrSY9Lel=u%5HQ>(O8o%Ie4f?0Xs&q5&IKIjB?rBoRt`DFE0 zb%e`q^;0eBLGtttkL*-Y6;K8BAQb=2hmhdUv`kSaR8li_P7(DXFcnB`LtqDD5g&D> z`jiE3Kvzpg@t7${loczs_0OI)T63*nxAa>3l$j`2#=dpb#Fe5t=x@w5^YqMC?bWT= z6);3~6EW6>6mbiS$YZ@#DIg?M-xX2mYF&2VQA5Bx-E{=^^iBhoS~WFMK#4f3aA|eK zV0{)_8o;YE&}Xr8T~)*g0kv}6X8;(MTOHQuV3v2PHEBh(D>gz^E63=@R9PKEFR-OI zNF-c;b`cw;Uw4fs?oO(Q95GRw*B~a*Y3NC)zeI=GN+X4M1X+1qU$!pte5mN>~F`@eV`-HlS~z zRZ5<%U}rJ_?BBg_Gb5E#W44g+7>LPR|yX-V->YiITjn| z7i8lUgcrylUgl-40!fzVTsTFjxOO@`pi8hqOrAu^x~c;j!UJ5`dgSduZun&)#fKf@ zhGE!ySpbI#$$`I1+!XZkyL=M7*PdM{_42d%)oO-yO;O>cK2!?INg^yB(Yybne1ZK>nk+$s2 zvbaY!uB;5qcCMHs2LgeRLU9*T~bGY zI+U*hQTG4Xhr;QP?>dA>TTV&awB>Y$PdkC~O#+Ze@Y1=sSld>xO zxPW`Rx!XsMJGn=3B4}HaZ@VC|8ofZtwSR=Ts~ApG*i}^oXL44&HLO(*xWKFkGbL;E6KdR z>zvO8-NzkW#OrU-LpabOozm^R$mtw}<$QrEUCNW(IEiZsiObV1{mPRu%oE+zR~@xA zebsS%!>K&U;WW)*{Ygf<)LC8Ecb(UJJx)pWcAXYb8(_O<-PcWhS}E08hk6IL@C0^* zRNo}LrFpe~h9^eyR;TK-pft;|?IMZF7;ZGZt z*I7rj8_*$s;IYDex`c!UeB$%H;6f1A58mgSUeNy?>ZiWo1)l1!9_zDS z>$jfkyWZ=+9_+(j?8lz$%iiqI9_`a!?bn{|+urTp9`55_?&qHF>)!6~9`EyB@AsbX z``+*W9`FMn>`#Cyj#=;zAMq1k@fV-*SG~Lpf7huZPCQcb8$C`RU+U2v^LhXM@ri5m z*Z%WY-6_9)*F#^>O~1GZU-Bov@u#EmDPJA8{qj9=G>ztO3JzCDfgPkZ+TB7u~jM^u0H9f{}5t0SqO#aEyCGhgto2f|5P z`vs5t(bfB-Yq+f6FRsJ+kN^7oJq6h02MfM zs<3&IMT7|pY_Q<@(FTkOF*FPvX%wl_mMBC_Pzo{P3W^pkexS%=DN+B8QKzz~I$*+t z2PZJTps3-cPoP3ShNX(}s@c0SICS`0Q!0j%bH`>pdUt||2410xs9>RMOTU1n(!FT6 zaNfNGS|pHqH$>aD6%0nKVfKNIz+^$D5W%?uhQxeh%O=@0DeR(0ZBs66ma$ddSO;tc zj&(S2-w|s+oz1+t^XJf`OP@}?x^k8-uMqIKWycVl~2BF<3By3sM2tL5Uu+puzuD6|@!Mk1?HRl8_6s z##)aD*=6Kn8jKLtkqvV7m>eY5CP5-(@W2g2%~@wiX5LUxR+&9?5eow)cGLwv zl5}aN7x6iepI)(`CTuCNl@X7S3YP(LgTCpNqIM#Lr=D!O`H)wo_J|P+pshIo3TD+g zf~S>UWG1BqrHYWPg&xYMMG+ypRIZ#3fT{&9tT#b_caE76v7ip1rm<(Tkf#L%Asa5N z5gq$zy8})1=u)lTdJ(l5v2fG_76|lH1vh9QkOjn61*rd5wkC@ayPXyUs+;mAOK-w( zMuabXjA5&7e=JOdg8^M75W__zm=(kc-BmCGL>FrWE}6gS25+jPcKhj~A=PWps}AGr zuEH1TT(PX)-bpa6A2s@Jq@qPz>_wZJ6!mTwSfGK`nO;@()f!~lbz}YhHF`y#qu+9YonT32$C;CItkneakuJA>2$i)O{hCf#O< zumGY63C>$kU0L2+(;pob!iFJa)$2vTP9S4MBb0EMfF7m3`nQZDrEKW{YV=cMUfK0p zL|Xx@l;#u#nkew0K~(tRo5M-G@E6@qCJQKJaMu4)q*cU_>UT-Ll;<1PUipS*1vPp^ zrJp{4^SPUa!3Y~*z@m(EZzwtCnZ@q-0C|tq9eHbAa8v~e=uK8musn!x?=H3L4sp1} zg5|*seUm!M3@9)fvnb_whCN*8tXagp6d-+5pCq7&Wr7BPFXqxG)mOIifLcc+8_7_sB;+ zl0bSdD z16cqFjj}Zs2$*@Y$C*Qw4lM^+3%5|WfhL)ReYRZKCM(d%d-Y}`q~X|Z7!#`xtST#w zyb zM5NNr3JNo5CN&MlIJM6;_A??QRi*z&TI!UcBvk_jHQi8{s+*18<(?R&$R$A%Rachg z1hIUlerjpPGm`aGNa+)qu9BBe!7OO|dn-cX>J?m;wU2nst6ulYSDC0FWfri&Cvn#i zoE+slIEkwYcw_(@XeI_7NaRmUK&Pl=fT4D&zyeP2$=!M6k7@H$wi?p{sl)(eG~$Zc zDAL%~wkMl0(tryhaM=*y&n#7&ty6}$z3JIDC7`{4XiGp?ghW7cHOwgk2pZG*$nm1A zb*#wt@)pWkz_OU_&1O5x0>(-gvXjy&b1wp#uCyRn0YbqJ79gY49!g)h#nwJ=@UPbX zBnV33Pj4x@M)9VyxdT|)zIy*)TGUFV0#22la79Jjt{hef5!v4eSkwRoE`SGcnQUWb zTie^FO};?sN@LW=0;>(Pv5&2gxt9CiXi0D&I5feDG@FCY-e4l9wLxkTJb$DO=+jMla9c*JqJ6=xz8Y0Fnh_Y)Ppj$V|+&8UHw_z4Nsa9_TL(u@Seu6ok zf+()_*1)#AQ-BjRu+r0h>%6}`fpBAHoDg`xvvV+%;pBH)yLL>o5XFMH_9|r^KT8i{ z&4F11nPVaE&&o#N7udiXrx#f`)Q$rwb`K>2J<1iwh12B#-Pt=QutB<$4a94Ytt%@V zK+7}oa(RcC;SP_M2qKOs6ksoSsXDmqobGLIVjSCV<&l|BEzYeAhg~}9hs=!de?%390k8?@m@`8Uu})_PN^$cl~sKcG7fsmu zt7kezlp0{(ug9C2(N<w`OWKHWT7^sHa)shY{3w5u9-(G4K~LV?J@gBe-XP zyHY5qW*q;#;Ts635gkJV7zlnY*MC;AD$8MP?`2+)b5EJ^6QNXtzSBG$(h*`eDN-?d z@W+CM0el^if!CLJ5vYLgS9)Usg{!w`JT`Ntv3;@UeOz^AV?lhzhkyFV6D8I)B&1E- zhBa#_0sHqyjA3cV)O?zEhj^HWdN>o1Bt3);9if0iF*GI^Gy?d4sqz!91W1Y}0y4u9?YAg$csgqlBQP+Bb|^I*B8ek$UtQx) za^xfO*A<6YDCOo*ywr$~SZ0yPMjC^NPMA&jl_{WcW2R#R7uO>Aaa*O7X5^uBPeE`& z_eKAxsEQc@i?jwtT=oE$7!jlP06Fl25#$|s*H06sW^qMq%*0Ees1%0w1`ywM{Q_+9wFLE)Q)!awiifFdV=jzO5?WGEb0dI)(a-vXMg zi4n!QXrreQLCJx^GDv#~F!`dJI;bOU!2<6Qaxu~sm06DFi4m&FngQjSPGOvWGMxt| zbR0lGBt&hg)c~UwBdM{TlKCK%iI*6ok|9=>YIXu5X#usgMkeAB0~(qEMVkL-;g-u0 zp601Y;E0|91#I%^oLVT53uBni^I+z(m}?}QNCBBOahJ@te+bb7MM^T#19M?!Izy?I zP#UFDig^*)00iLzbW&<@B9 z0#b20mKr>GidzwJI9AF5E+Bx2a;9l2XcWPwYC)z0kvF@NsW69Oljws~>V;K;x-pdS$J8sSu%pOd60Hk*suT7Cl9j9AX1=%4*#@6rV(=kQysM z)_H=tBC5&(tU4*e`a{PSt;f0}B2cI>_E0E8fS&}M1dFZ}lva4^tV{zM0|6;s8m(bU z9(<}DNwa2s!uztte{4FXD!ChWI#ASNS~@fb(gTFA>^vBu!kg`aBZ;Ie?! zfJ4r(MsG^Fx^`uBy7r9r4)3Nw+*UW?HbEj151AG%%pAQ{4Q!&8a+xLv2|UsLHi=ho z<-k@NukX=kxDnb|S4knl-K~FKJ2i9jW1CS*4@iY4jW%kmr!G;Hh^P*4pES{CJ=Wv7NaUi6& z3J&P<4jG`07!+l};}S5@4&+gyThdZTM-JGyaMJU7E*X!c`V8sG4wVD?J>EEZ4SI8a z@(ews$^bBsvFTjiIQ?xXzM}Vs^(a==V}+c{)oLb$-ROOR=mo`a4Hjp56;MD}Mh;iw z_38meSu&}pBQ3E27}DCnxVd7{3LPh%?&Ut5cP{pe%rVA%Zd9-^ETO4K+Mbs`Q*Uo1 z-JdVq3D&YBAY$K&lL-QA+K&2~*ftje2jwRh6NYX+8V@+}i47{+5Co@Hx^0{b<_tK8 z(M&tLzkYrq?KJpGOLhNT94_HP;%kK8<4lt0GB0Eki40 zS&U{-32^aEe_@&z0-9YIwn^_Su;)a6yI9tvOYE-zh#oes+gSf4N%B3}2r(Hd3O^!{U>!)|6HkGJ=T$_Ws6hQk zJe?vgv3=E0yF9KD{1Ej3KcUNYtJ0Q;cm}KcbEI#=TfXzY$U5xzQ zAOcJRPRFd4_##mN9(+K8cRC2^SMl7T5>&k%&|SDKQWgL=8gR6+OA{^n?DU;98uj{} z4v%rGu1CDRa*v#Tga2bsaPr%!3?A65m%Gr+HX^E)*YvZl8i~O^#{D+q&E}~z1`J+` zKCuxWeTp2?H!c1>8pngU$~E71vM;rpbT7R+&*9IJvo{!Th3%i~ zPJeyiJ>5jRf1D&3$+2;9Ss?Ale8|RqwA<&O*rT6j$)7gpoi%NeeXrwRftimA1W($) zO5i^->4WI(ToNGmZVr^$^*O7}JxV9Z|g=B{Dy1ihFIX1RNw-~ z|8^R1OV)L(jeVm9dwV!}%PermdeuNteM41!>#%nV=)Ke5xdVXTyHnn?GEGkj-OqyG zX=&ZbZr#gghjV1#Na#0`fZy)f-V=l0NE6%%Ro_WYh3j+`%2eOc3q6LSKdN=z87fFx zXFt*jJ=k|Wns?o+BR}cd-)~1ffXH+26}F!IKu>8H4_E>ZULXJ?!=u~OV}!sHQ}&ZS z;kVH2{m^PuvnfE_)uZi?=P<(aaQ(-a>c3=;&ss5mfdbE}Th9U6FJ)aXHY9&Bv+s(k z0fhoD849nz6rQ3Po&@Y4!+ES$w`9P&g{big{vD1Y+qbC(1=~K>ko1 z)l-!+)k?jjQn@p=s#X3vAFkTHrBtqwc!aS#Q{g0L?V|DH8#?hM7n$e=O2#Uk7^l9l zex7FftxkiXtPpFg3jJ`l8@+WN<{FKtgfntAAI`(|P;`poac^ZOg&_^OY;mC0gVkcC zZdVw-_M^?JLi;9vJ15K07|^~~r=p2gt~+auIqR>c=fR%u-sT3PZoPfGKb8I!K7Qrn z?BMg|$GDEC$7TN=4#zpW=Phu?^7aT0P$QNTXu9lsH2Q?Sv$Fj8B3D*HJ;eJkM1>i^5-@b-3~47Eve3hs{V9 zxt1U}6c)rZglKLK4(&u1xHyr7(JxCODvA>X&eL2p-neM2ho~aognxj)*NKXR%Op-< zp!2H8WUkNEt7+R0u&L|1H^wPc(n2DC4qrfgs8kK7VOO0^4PhGAgr>C~U$3J<7wt80 zefV*ts9M2g1nRM2ue9xGbduJ}MPt%Y!j5XtF^OS|SNA+BY}WI>8o;E`Z`^6pH5Bqq z))0#eNm;Oe7txUHfpb%rwJCI^-3%ewM_n+~CmZh%BT;2mbykRCZyCl~*ATO)97{Cd z+?!}NP0|`}Co$BB`08T)+Y15m_?nDOs@Zie2O)jecdvbRpKZn%hIpMPJY{(tY!cpAjoH-g7VHNx zaT?D|K#g?RuHEnVnn%#)Pd?Wt-BDV5t+11Pd&Fl*=}-5hgu2C}91{GV2Px*84GoP5 zkEbmux88!W-^=|N9*@m_Qnrb0wY@5<5-e$SNG;K*jjN!iI;u{rau3i+OnQ_&klpI8 zoFTjWehe74X-7yF5L`V}d4Bm!?V-1HXYw-mx8>seu9F}X8Yv3;VW>HI?%I=&cSVgS z8}$X7Qy4XQI)ur2yQS(2cE@+Pkf#}aTO-LNgjrHE7SUhe>cJulKd(aspo~yLHHy*P z%*;<%M&ZM;l5ptbv{*ieC>C;xQL8z!QN0a{E=sff}Sr-9N`qkJWx+esnit* z8ZpW<WgS4M^9QFI6+!mJJ)`_rc=gu=%Mt3JC9~>xQ_+7j+^S<$}WAB|?W3&pB}kV>arK`ceKk>K=f} z<&>NgNUI!;%|!}$7Y#m~R6y4wKyomCVbvWdPoViyfnntw7!-x8E)Q(GKU>ZvuAba* zl=ztmn&;1eW|YSt5gSJ{Jag#$61D3t`*H z>+j8jjJFHpV&Xy=(qrm|&KkI-sT}SzI+oDH z!xwybCtI!qOZDWH*;ETN^};lAFB2s(4g`mO03q-CGJHUv*zrO~F|R+x+s2d0q&%)XTxilGQ%gE3a$0ExWF8T2w_ z*RJ4bh-xAu>%C@u;skE5NDK9+Iv4WWxv^;P0uFXnLJ;{TSl8)N7=Rkhx=sYG?*7t* zPfcgH9#Y(TL2*IPd;6;@-og%;tpihD=01cieVZzF<~AyB>v@G+!Ya>23V|orjZUC# zdc*9-f@(P)QbujrLdDB4?P59C(%PWBc^HieaulQBuPz)DNmMdIreX46A4#IXTUU_T zL%InIhU!+KomgdKtYcs$q6%qG{ZB}QI3{$*8b+5kP1px58-5r&T?srezze#%Xpb_Q zVMu`JamDXTuQNOcMzAmR2-^_n)q7R1XUI_(t=sq!1Z~2SApmF;$nO9#*v5MPxAXe3 z%igp3A^JbZGgE#c=Znq^UXfiCPxFW*{Y>E~HK7tDp|oF>E&6$dlSDc>FU#W)U)1Q( zRdIoVtxiEH# zU(WqY(E~OEEtDanQKTlESd3rtMKWiurI$Sk72=92p>{Y~)T0;>V(ZV&x}ybZFhz+E zya-n)HALyS>q6p;6Q>>ChT&<64G%DrXUijkP4UPpE;xXq42gmZhDd`+>k*_r4m>w2 z5u@KNq{jw`+H>Bac!+(~Ly{7!EE2D!Yh#kMCQ|L)4$UCt1V<#9$;7&7p(driiK&>8 zH>Y;~Ix0K(%L$I?E%vLZq&Rad74K354r>tRXenprc>#qbgv0|-&UU+&q)NpBmJjJW zy1C6BwdRSK5U~-F9wR0(z=L&oyEd-EYoFfODAPXzh5N<1fG`C%A;wddXh~;$NUu&V z#pF(HC6kr)c4u?EV4fo{IA8JDc_H(><pBE}SYiRn1pYhFVJ< zP%F3j%~#`oU1$U zx8Y{9mY>Y}QD$>{&M77%H%mX)a0+!Hrm9UoUp3o!VNxk>YE8Bb5}s|kF0hqweI;3M zn`yq=r;`lTCf=r>X?Y~QluUXh++Uq;eKx6*DjdTNWb<^lBp=$5FA){tlu|I!2n)>Jy!%4xh8#MhCAOkP@S^@ig58Gi7H;i%PkXH29F~8PUv-aAIO;Y3*by)T z(V34p?^Y(g*(I|}*W-m)IHx3#?lX#gj)fstr{Jl+ix@bYU%oKGr%tkN>qH*pyK$2f z=v@@+qn<8Cr_UGLS(RxkpRQDC5mi=QlpFG$l`ghrmPS9=Sy!HIZniD;9XwQr)14bl z;Vci3J=P|@TbVE{El-#|mH{_(ERR-Ki;Esza`|j+Vzky49v+K(I&|&y*Vb1s+>1vx zbX|?pHul7xnm2q+JyKFODF>VLraEjqW3;zoFPplS5FLb(-!`D_?|aUG4$y1f9q?1` z{ZGKlh%cF2Gfgc$uM;fnMcj;?y zhn!QblkSsuS+8$Lo{rs>s$gIwg`o%}LioaI(r{eBXyhy-R){@C2Lb5?HIW^?x8atXFg=&Vk+ zRVokcg4DZ))AV+Q5C9u2SGx%%>=q!u`rMPs&lQ&awxj9&{Ks1F?$et)`jPNF70zFp zZ!dcyH|5#u{c%^(b$bfF<|9E!mc zk^k>b6%R+zmK~EG}?B?iae z_I@H!gt!>=5SOS|>&5;OJ8h^~saMFAFT}Yw=nc}}Geh8MxMg{Db; zZizCn3Z5lDoFubUrO^>f!q8z6`&)tUhMm~ zkP=5Dl-C|!7hahCzlnM?OFU}R8ip(NWa}i1v&mk;3fm@hs zG0`B}JqVF~Sm=jn0^WV5uvz~gnFj4G%wb%jkff?7ydg|#uzfG~k)tzCX|CXm=XZej z7d98H066Ft6jWL)G%8fc3Mo@Re+ZnC7(rX{_^h9+1t{SvHYFQiA{C~kLO91OnhCGGh$sWfQ2)u7eCsbGxkqNzD#-p8B zi6SWYhZ2Ty)FH>hwjMjV1(1SXu~qOZ)L*Kab!F6==-s3V4BjkPj+0Al*9h4ScGMZ>L|dUD~wkx^`YA+Z8& zGDYrENWUoYdcjOWI)H^NYvPEyEkj0LKzuRH;A;}5$8%{~vmHveSrpYzJXjM%0HMI3 zs^c+r19(Ch*|)sIFM8KZ2sfLg%AO9CXH2#)#hMq#S5o-Z?uwRYJHvyz7dcph+#AEOFq9 zq-*v#@9#+vOrlrjO7Wtg08RDo1G*WA*9Io7rQt6Hq*$lpVfA8Ni41dr#LX@}tKsXF zKW3McKo4NS;iz=+y4rpDRo|rPf$KyO3SbuB=Uu`apqwgcyeMq&jP@1VJ89@^q(=OwLl;C+8F&ob|R35~h;Ai>phVzJmpDWnDwXw%YT;!iub*piwYgz5y-_> zq(ZtE{@^{9L@iT{U~I^JrnbN$g3Ah5Zg8z`r{o}O6OXcE%_q=}5~Jc){+Zm6OQC8Z zjodaH*mR%Ga9}Qb$MwT|(Itx`)Lee8^@r=@eWn1JxndueiamyFhQxrGa(SzYCHq5~ zf~lEG0+*_>nro^$w3(WBtE#TsL$ZFMsfIC^ntHNplDU|vmQ1UfQqx0%{eg)N3zxdg zqHDanuZbRJ>ypT$YpnmfvB49k2EP+pG!goV;aRGNBmH7b6y1?AG`8kQP(z(3RRunq z%TMm?@|gvM9G1gM+)hc!nS~S}cgs=3Hm9_v%p!(n%W+3;XW(LHF~^hT zWMG?f?qg<&0Eg9d9Jfm$2C!7Z-D)z~K@qTWh(7w7f`PkI{e&G<)zJ4VC)VB7X31WODKvQ&s{tG;Z0~4XWrFZki zGa)dV^5(=N0`Cm&K;gV@-|wM+9_8sgORoO2#8T~9<=lCv1>!xf{dlfU@w@XU>^>Ip ze_k+uzlCw+JERbBTk+0%G*WoqaG!eJeEoRpM((_3fC8(B%=v5brCT7D!R>&-|9sN_ zgNXR%;aGt1e6g!@slM8`%DL-R3&hXzx0e3nMjQA#qySpXzw$Zs1`&?g`#)4OfT{>V z-yfbngl}Vf|F(C54xjwMk9~(RQNaG2qa;5~q*$=-e>v()>W*+tPERn*ml~|@n%ur{ z6cXu7$=ZK7iiO>!_n(em0=9oUex)M6{|Ms!x8oOCb#(u0ebGb)y7_4TNPV#!klGgx zUklYjI!`j;ko85Wbgmd7jXhL4sboG@wf^&ZDU~l}=veyUpD|Z_tFur@mm722Uu|+= z=!}w4-(7F>;0T)-<2c>y^t^(IrtxrC>kXSDmX~#7+N+Kxw2q=}r9K!{WH5Fs^JGy% zgyie=PN4n_8^u$%+PgvfEBJ*;9m8w%c58ig-e*zk2^&+#Pg;Q@F(7 zx=SC+Hjkv&t-3pW`I@onEY+x#5_Lf*=xdCuOOQc$SgY|N6*tH_b zQ`@zm@Jik_qcK`EGG&m)*fVBfRx>u@!1){t!UM5rtS@kjZenmg!7&r-L8O@y@4_Ud z5hpIbPpb2S0LCJ(R zd^Ig8D|v^DFk1y&OFKocO2Q)dQaAKC#cy?q(l6!|lgdBgMV%@j1um5;Fau|qDkz&8 zi#j-;TZ1~JSUQzDv|MYMI;`62a|=;;y_W{f&*opLG!gCT%QU~b%CKmE_qA!zMh=ap z(ngJ~F4IO&onq0&%)MyP#V*06(Zz++k8U(c1+^En$i=^!G;jKa+qI#ZojI$ltG!Ag2II%78YInHyQ+xA0OzR8mKP)4p&@nIK z{H9}Bg2@27&BIsoajdv@fe_gzdFp*@y45ali*}45co}wji2RE7EU72y_k@)uarSME zK8p5FwEXanHoZR551oTLOO8k5{EAP0=F#Jxg|WGI84c_X%Bdlh zq=my73mWdtsbd|cMdBU{o`%S65S64u)fx*~7S3%_8K&D0jq=WRCfY6tVqX#Z5|(dl z*z#GpCrBO(KZ-Y81chL6;1wbLd=dU^d6eWJBbbbcFecv0`O8TyF8|AxW%sOxlap>T z`ZxF;@#>)DAanXnq=jrg&eHH8d)rNvLu5YQk>n8f>P_^2I(~=vUv6Ro5DLD3ks21p zxsClPTR@CCGAz!08y6c{KuRGsBCT~BpE_PZ&M`6~?{%Btp#p}F9`KVZo*C7Nw-9pI zV^k8)2&~G+n1&=!nu9tAyk)$Q4!wI!?^k?OCjvQR@W~h(>W@@QUUKHC5?M`xxwJ0Y zA|`(>Fw3&IbcEVNde5{`y}H?qEvQ1yA*o5H^t;Ss*E7PqtbM*8A%T?$%+OaQo zH{ewnwz}*<5RWui_S?N-uq0XD9!$mq(JSoHwAjoC^$85dO%*HFhm%=c!GkZJtd=uH z*~#*iIBaJH<@$YYblNl*t3t+m7@uF#rL|7iMM9TiQoI!^(9GD37ba`IG!>@kUOpD48t$?erI{|e6{TB_HWg*qc0LwmI@Yll16_;UinBb^n~Jl2 zqaTZN0)yB~azowRO7bGCno9Dc^d3tJ;*{A-3zNj%N{iCCn@Wp;^pB+_xy0;crG*%7 zWo4ysO=abkNFZ^&zzt0?YpLo{tFuaygVB^~Z}5!eia$Z5=ek3)N$1A>7(AO*lSPaB;u4YWFEoeOrR$3^Y>e{PxYFSVZXlCI3| z7tg-6oI{*fbzeKNRrh?9(JX+KQqD8}fE9pp>;vhc-}D$hnBELL(#ziT!8@7F)RC_p}LsE$i=jGe(}+MHdx(HqrWuh9!F8ZqHb9vyM+s-9{o+3c-<(ta#Ft7JDf zdA8-MySD5Vi)6L!N9=X99aI|=v>#Sp>9%j@XJ~uq7z> zgkW4zgb522zcR53BPF4TQjjXaDK!XVG@^(z6euA$vWgHaph$9%DkH@;h>$;^NDCAw zqkw8zMd{H2vJ#{}P-hxM+1UW{3I#vVZdk?mRRN0Xq$(JIMlo?$fUM~UFPtxK_gBV$~n95<}0 zO&ydaVNUQIG-a-job)-w%BPYmSE^5!YA0v6JsdX{-_6)wFPil$jdeJ5O5K49V8(@* z1TU$Nx_BGnS@|mm_9l{b9T~!R#U-b}_IR81X0yi+zN)~Al$c}9ODWXK7y!sr%Kgel zDM;Zp#VU*jhUI!B0*j-_cKIzIzmbxE1A8`n@-Cmi_N(+pi*j-@Yc7M_F%Klfe^aZ} zr^4odZT*K@Ww9kcsWk`^mHPisSonIZm49+-(OCb7gJL5hevNICh%bn3|kVO7txtFUReGygrB|OjLd1s}4*F>c@-PNY4Kjar0 zpMR*eo>)QNmCLz!GMgoeeuMJiRIu7uAD8FO?O>zJ8ni&aN&b8**_V%8?&mvqcd6MM zlU>jEo_BZkd%T*E1oXkQ^5wfc2$54M5Qd!GAn0Ue@VgE?|1xS2Dzm6zD4g!k9aDha zUzKoz4``#Gn3g|tBhd3GbAKV%4d?uZ?X}2>gq;1F6ZO7Rk{$hYBbgm@1AdYfdj^Qe ziaQ{p%8K7&Y6T`N3uyuqXO*5alg16xGLr`#xiV9_16MLq+u}Sk(&}?h($mXpBhoVp zda%-_kw1;i3pPyG zDooZIwk*c>gQE_QkH#srEP|k>E=jLzvMR3J1wED()*h~M{mRpZt&TL{v}Hk-G- zM(x^jJK-5hOD11q+op5di8`-Nyz{!KApYca)1kiQ^)M0h=J&EO`{eg=3IECO=Tm;m z9}qI)Ef^GY@+laS3i?B;j}T{5-TuAsb9*janvc^TDw_VfF^0Kzv@uR(!Miaj#2n@^ z*b5)0DZ$qY78ABLSR*TJS`C+bpUu(#)FX%zwYTE4NK*FH@yQ#W2yeotHJ zoBXF`(j|cHlh~)A>60|1pXQT1X20T-GUbo$n>rVx>6^Bco#vaqR=whzvDJm`m$^5k z=?6U8O7r_%-?QSEeM|n)ne(8<56XR_NC)LTWNZptfV@{fnAy7J2C5yQT^7JqQv@~X zYFrT;RG}Q%gmhJ7)iLiEAU#ur3|(V2aPd^H#&3m8k`y&RV|B2=Mq!IW6g9d6HH69s zVXX;8Z8oSy#13@9vV&<29$Ix2(A0y78KR>u-@Oi?(6!%(4xlY}zVxjXU2IFvQAd?@ z2YoI{?92rqpg%5;<Hg65Yu-{9J=rplLXk&B-JNN{=*@Luyxb)+0q!j~ssJUuymTRM<~yrFS10 z(|fs1=|(7G43`==!nsQwmMvmV85uX@zDt{qEMhH|ny}KkOJ5!@Vs9Rqu=Bdh*hVP+ zU#WFzWYVqe4tO0|%zGp?<+Xa3^>@6O|7oOT%CCwXwJH)yP?Kspu&gczMvP4Oo7HG2 zb7CTrZwVy{PWTUTG%zHK3^;MA8OinBL;(7+1QE_`Omsj#pwU7amwGzndtxD+CzT{N zu_BmcVgZ&n#7 z$<)BRRjb4wN~A-})WUHV^O#-1Omzztbz2uzi&T^BZK;(vM&|g_Fp_c_{3w~e?rD4pMihp)Ai?TGl?w0 z;Mw~TrO(n0Nkoz8Xakj4ApuYt*oIOjT&9tsMV8ulHdCqB2LnyhWFuc^HrFOv-c&h} z&9pHp2iJVL-cGo(yTPOMiN{Fq5Cl3L^gDf_7sTYW9!#5q(MQ73=WfiVjmZqZC*rY+ z4_h-?{E=w9T$W~wYV+jzT-mIPtMpl-=w7Xl3LD2}C;1-TR5lBI^`S3aIUIq5F-x*l zKIC_Y)}hX!@()}ONsHB8jb*x4kC((o5(yzNM@0cwh#l7`o$HE$z4xDq|A6 zkg%)gIZ+U#5IfR9ED_r?9AX&TvW%+jS##7S8(Z7iRh`3no5W#7Z}UX zFOnK55MYoQzd&=UB&m(E9vEmtEFS3V-=ZJt8S{skCetN(rliLMBgozCI$MDbPU1tl zK-yZWl&qwI2y;oF&(YgvejjP-xnV}E7Fxg47fS4Yl3UH>8!6$e1LMOmEsK0@M@xOP z{L%@F@~CmFNy+D)re+MC3*10FmcUNoZ=!Y8)#_Ka<{ zI*tCu>#$$-#^|&-ZO7}U|J-JQyUZAbO!HH_tP6d;N~jbe_GVB( z6X8+_&sisN2s60iW&}G%wyuXfeEnvW7J1)k^jqJ!)fi=$jk7A&k*xCok3DPsB#%35 z!>Abi1e33+#apdgc$PopM+H{#IcKN$lKxHRXJQnz>H%M$5t#7Dj$~(k+(zF z90cwk*X^76bg4a#kIli;C#Mi4qFGS)rWp&Nu}(iSe9Eq+6uiD^v)D z+-nTfnA{s2;;GzQ0%qjAJ7QslynAxxn7jvSqp7?{dMD)kC*~l9{J-q+G5OEjc~ki> z{B_6$ufn|w1#jZBF$M3^yHf=p^0&x^AZ3W}NnbIzAXcO0TUiWFpoYm{yhZ{If^t$x zCCTB^r2;WzQj=+0$dQ_0gQ4egfGAk(fTEFLZ(+l1!D0Guhf<+IK}5M4f9WuLBf{3} za;053DGD2G`R1r{5kS~%q7vu;Wlom`08L}ROk9l>FR2vTNxY~g8$eC9VFBGTNlecc zpsqi!iW!J5t{)YrVT!hh9hW3-Tp6cntFnlji!Nb45vS#vxQJhyBw>A_q~klk`0e#k z!UZ~BC!AHC=qyRn6_MGw`FRJ8t#O#}f43a|e-`hIDZiJyY%s(U8)CyzNtDDy7`_t9 zZ)J*#%ni9&K9r(dR5KA)b$J*ACc@y?(?4<0!0=2hC^)zSV#yQp2+@B^A-0V~eHiD` z`ksJ&fP*P;Zx@064VSgVkp{x`7w62M$eXT?WJ0KxupJaA#gxqzSUHu7LQ_d{w5sHD ztCq?&o>Dlct5jkvl=#HvT z%;pGYNCQtaBo(=gX!m4f>Fdy&m$H>$OI_#KzppR_ko{aD1&*t2VM+ayK_* zSgMsf1Ae?j;j}o6^w1;H4F2Ri+8sj0^$(S8%{8e{Vky^oRj)rB)8O+zl+|!Coi36{ zxyXEBI$ccsv@_(mZ_Wqm>~SY6c^I!Yef%N2Xnb1McL&#q6{6j^oNFhugQMvAY;A`Y zR+OhMA74x^r#p;6F#c{l&xMCmm~z#Al&_DxTYc`-{P%C4-rU$HY?FgNDBr&rsFo+O zfA@O8r%VcfV@@^*{)%CN8zRaiNhF4$hqV%nvpZlI&SUyDPlPzyV?LbxGTi9bN9C|l z0DY%qjtBFg%IVy|Jn74OKLvuYOu|L1H1AfKanqk{8ks-L9Y3Bw z!k>pwFe+RpTQDZx8(As$?=0~|7{=F1oTYAkNxyEf3(t+q+DMdEk zeY1uY)X=<{;NjRT9fW!LxKl-H(y|?Fzc_=^FM=S#Xwc!Mq(iWsjiWnx4`=O!7< zhHChGewhTDT`HUm^;aC8Cb>-0NP;V~Y4#uB|GS;>e;2k}{-<6GevzII!nx1+Dpw+m zIXWH2eV>aGRU%4JHZ3{NjEVsy6KBC0i*mY8B6zo;VS)>Y>YW8g0s{k6`~|L2<^o0y z9Ux;0H%Z4NqL>iizGPTy^+fvsgQ@w{W z)lN0lYF5Pmc+>y(P5t9dqk~EOE9NQxg9!TTcSQ(@ zzuAFD2S@s!2GjBPpcz%@9a}LujT9-2OVynqtW%}{La)EzV?RlIA@T?zJ&vJ;Q;wI6 z=&BGDfB%MT@PNfc{A?beVS@O%Cjxi51o#}W!U+~9fc^YE98G$7KNJ@Z+b|XaM-4_?SvxG3H4W^gtC&#Q7-196lGSz;d61e*9W$4PQIhoaUt6URc=ud#%XDRt=dab zzM~m8u0m!y=-Hyw+^7tYU7%-WU8Fl(MyZvh1!r25U6)>5KnsAcD6G9ix2aB;v^uXX z?s+K>OV#4JsLVLDI;|SDGpQ_^i(ad&DK{%WO`bP1v#!VDqsjW?W>;QOpXc|>w%yup z?6CDJ`jonQI4y&|tM~G^UHU;44`r__wCrVRWzi^YA1X4QWoP(gTTRz9(phE2c5<0R z1C|H^U6149C_~-vbQ{__Dw03UW8d^M89OW8*6XUjt5?+Y2RP}}%siCQ+>h+FMY4?N zlJh!GvF%kb7j@^-X{49(A6Rr67mi&V}82@!kT1l}P|NWvOB01z43-*O0 zkqCzj2j%wv{>Gp-J`C6kh$7%oZlGk|mxw3l38MX66etr#|D)GuCBA4ViJ4`$Va36G z@+ZG7%sbb;sZyGR3^`kC!=VC@DO8+{d%;4rKs|}u)6212xC*7i%#?ePN+HM8z9`ho z%|yGw-n$A2i(#kR>ZovNTjqA9)9n5Lb2#R9t>11BJ16IZRc+W6ODJQ8mv+0~_6uBl zGqSbTVA7n06J7Nq#WcViQ+l6Ac+xp;hc?PddVFE6aR&7 zOjk4Sl$)R@7nJ)=$3Ua-x1OVtX|j>!*MbPWQk1zUoakq=UuJMzTG6EZAw?-xRTzLY zqz*2l%<5VyV<2YHidn3G(8>WYu!<`HJ3Kv*GSBXDWCod7DBWB-cJ(>7;G3b9MbS6S zGRsg@U#%15;JW*hf=q5!tI{`LtJ1OwLy(tMe#I#xO>|9|botLFWvtoq7?@Pl8X{nN zT4m$rYE}g?_!zBtJj}y+6={SQ)$fi&X*#((( zZF#FzIe)a^t2382t?kN=&Bmzec3wtjI$vi*8M{i5&Mf}K)n#0D!wbC8b*{GI)OLK> zabNX3jpEXFw*(H<)=Y?JCKL^&XFAqoPteS?(;QJ>^!X(Ja%`rp=4GCo_LH^h1{9S$ zO&=g_To=JnwA+obx|h|BtxQ&24ZPjzG|n|p|7&IiYdF%EUZJT6x=O*4TZUNOcq3{3gUOdNOg~6X&?i>?t<+YHs*$r#+xsP5fx#r{Gtoe zAeJR=;xvwAFS8(y=2)c6k7m97N*XQD*d-ZC;1WK2{+yNzQ%R zfUEj?T-{){P}!8}2v1YCWz=rddK|4?-ukDGrnGId7v9e5tf>90{RxMH0=lG;76NHh^) zsFN9DsW>8qp?DI#=Ah4t)4^~$i|Oim>Ky4LkWn2bifi6jDN(}maliHMP`Oyn zmH+)O%h6B?Ninl*dR>`fwP+6x`tQUFs4<@&mQ?X`rQ)BW^vw}EZs z3klLP@`L@L+Ll7}bq zNfM;db9}Ofr^tbnnm5!~nu+9zaWuWCb8!$a(a5i8+wySoEb8_XlrYLgnxjmc)0OEA z4`Xig+<+V0;~2MD9gBh>(ifB*td|jG4f&YXX)$;-xb0#D*YdIw7^jz$()@skywais z&+@YL;?vXe@@6~uvx@pfU4VDsvs*=VN`1R^Kz9M}S#9$Jo^>q{PmZpBh*pliVT@O= z(z{nNldg7F^wp+$T{W|^Wg-B-s&y^F+SY72qvE11OQ!|Yu>sIy=sX>a1a&?%N9J^H z-QZVu?|s#;?m2HBJd^mps|gSgJP`h{OOXHdGGYJwi~Sj?gG2xSK2HAsBbw~)e?K25 zxos!cKO=Qhxx#_)gtGrt6QmRWS525JQT{8NE!$MC5ysPC)-~Gn*~>KQiy)NyOmH+< z%#|CAHCL?_@~R9{aBCTDw7B1%Zj80mY<2rX_T9~Xi{I`GL#I28xZU6Q;zrE$z^%BI zAD_%*Z_})FyFZmD7D=Sg?kwILLS=s4ySx3JT}*x~M}cogGa;62331~*_i}4OUE5^F zF6SsR^x^$O%NoLQk05hGE?YUK!=#sGQ5V#qb8)%d7YQa-^8Il-!h1)+DyAmzdULgR zwh-avCbGfhen!W^%ySz-=Fn*H`|E;gB>Wf8{uM`93T%Bz$Wf}DAPh~5e4Qf&*Fd6x zPV*(gGXv_~Fb&J(TcpbkbtHK9KQ<-_=%2ELk#c|RgO=T!t zN`E++Wk5!s1jkEB4;xF;<6nqT)Zd&F7DO;utAuqO!~K z_PC)x_6(v{p5Z?);a{|6X}eBujqIVS&lIPiQL(M&z=TeAf)g{Pl?}Gd=+?E_-$|tS zSQXE7pXv(Tq9i|(h;!h1~r`uYQ|0pAXk9PU<5tGLGvz?7#IG4jbrD+OA&!6_< zqy*IxHPH&04n8tAWYRKz+o2r#@Y0|hI;oo1XD1e9@%)6uR`<-cpyfAhg#S{WLvn^m z`wZ$7T3xm!*pSznjJS|jW?&)`n4WQEvQJ+qc%hAhr&YH4dk=%EcOpzit#taZW_!77 zI-7Z+C)%h&7KA*9^~I#ohR@^ISpBFl_)fJ zZV`VQ2s0c>25RPTRrj#a{~~p$$)aOr)ghF9=*e-7{{ky5gEBJrQ>2&MZ{2B>Aj@_j z*wdI7s>)rc$F)-m#c`$>$dz09_DRh>@~a^1$wV6wuF-yV{^_^SaiR}~@5PZkwk&sa z+>bHc<_>_kKh&hX@_+1kXeteMj8fR2$M|HB&_L9DwW7t(R_cO*(^VvE>16n^Lj;)e zb*!)4*rh-gX|}BJl>Z(l$H>5aP}$?mucz33pKKEXQjjNtV`744cpPScgMxQCiAZNZ z9G3sIOX)ck&Aq>DaP2valW-9Iqs;8p6AEkevoxd1X{q#%qemSrRg)__#DT;$lDT!L z5W<~msCO*10X;F!5%-{L-c$snbPR8DNfWFKiw$ow4PV9ZqzUer?(8g?rZpbzCwB@7 zgKH@>B)eGu5S$PFQ}qnKI6%yK{>S%@Qg}W~*=R?bU`Xy*{j(q$mha<=QQO+1AQIJ7 zXxU0Lg>z$z5YpY9(6H*)VtmxE6>`(_Jb4LyYGvH<}?LqfCbvwzY{X$Se>NHFZh)FwSIysu1 z1@@?!RG4^zcB9_cE7Gd@Ph>KFbx+_UE_N zzAq-@E_psqjT3{4@fy9gv8dvasxdgT;)XwJYJXqXh=x!ynDAKr1BLQ zF zboK9S6u|M#he1X@gsfFL0MVjc{&kLg}a>dej>cR#0MF`{@Fdv*m)dZ0HRLADySeLx)c%Fb#?9Ip>?VY^nXnyvMj>=aUzP{BS2gc+1e4M%MsPmzU9&pHQbSn$3Atf5lv~4 z?b<#q7U3OFkv*;6UCZJBw4(;8z56V}hFYV>)4WEG!zXZ}XOBIn+(YNwqnF)17sA3; zmZLY9J=TUJwzy;VsXcb2Ll4qoPKVu(;KI+IVy=$eE^uP+v}3)vVjt3CU!+~1T4O(+ zVr7?NA$a1TcpSg##KEP7=@srMRW1dgG>et)%*wCHvu~1>q(K>ZFB* zCxxb`Md2nzuB63ZGTIC#0sQXFbPfuB7M5#OLB>6t2Ym)yXK8i7QFZ zsBDX^SjniBiLJrSY%Ggu(8+9lj&4cM?DUB4Sjp@eiR#A9>c@@h)5#i6j~q(R8b65` zTgjTnjhMpCo(~V7)5%^g3tLLhUM~w>Tgl#D3E2YU=ImRB?CInjU@(^VM5mxh1UILKu z@-fN-&~@{1bOW$6@(JJr@K^Im+W!#a6_8u~A=53O#`{B+Q9wWHPq$jY?CH;h_m`d4 zpH25K_o^RP#$WyjKfcw!!n}S$c!lB_5%tUQ5*dYT+=a5Mg$F~0ig-oautlo6MQc(; zni)llp+&l@MKeQ10KDRH*kWVd;vuPGvy9?l_rmGYV!Km+iOj~O*@RzF@>Yar-|KP5&e zJ|alHS~xv?*vwi)Jv@Z9S`-94Wc)geOdNE*IvfNX?94iX4s86jI+8OiV*GmYOe`|J zdTKc=s?2)&S4_IKdS+`(Cj16=d`vd5UIX_S23KYSzZVAIT7xhhh7f+E_!_#HUZXTV zx>RPP{1}?tTBEWTni77KIvtvtUX%73s#a!`ek7{iT9XkUsv&-}$r;Koy=IF{6!Xkx z8#xr~wPxGbW{1pXC%zU_y%tyeX7|h%gN_#O%qHL077hH?0Q{yPy;cRU*09XRh>li? zwbmH?#yI>o0lv1R%!Vv?6j#r-tO}guWxQHt#)Dn>%(b>+e4Jc9i0Zud%C+K>*LEW7 zP|o`H3cAlwO-Ji1R=ONY#pis=Ylro9TO%Jzp;uXtS0`mhTa$IiU}WbcA6EJqeBW5- z?o;RDS^X$oSG8Byx))|gMHeJ^r(=T;$f?&pMhD!_1oB!(&*^n8Q~<9!FgoZ^j@CM_ zy}Bjq;#KRr?KpM+Hg!`6b$`vmz~_NLE2O(hl=4#Adk%ivVLw zu6xbvAHf?M?s)t0+CNhI6j$AjF6(ZxtX@^UUOa+c+P7Yk>wi>lKxX|u^O0VXs9w&_ zKD-}&_~U)THmHK8pSp$&qZO)=p zw8H(mo&DuuG17R0KW*B~2r4bI2D{n^ZL%ut-UgfShMWj0ob`vQJcrz~$~`-WidKhw z3CjHmhO>ExgR;s(yoZy(8N(5XWl`(HQ7^-BQKbp|BSE?&DTt+MStH)}xWM9U5^b33W z$3=9<2iN}&XN~i;kB{sBoqQW-!JC*}FPPV#pz)ko)-PD?ocOUivALeVO)!beJGrl) zf9O4lnlX90o_D@J`R!%$N zID;JcuIZhXX{3#86vCMmo*4{-Y%HIdne-XFjVywVnUUui5`!#Kf!TjLvy>Z|)Y-Fb zZL{@ZFt}|;^sEe$2JPl4w~Q&24DxvcLyhD2M@SIu(?C@ zu|q<%ODeca4%nsi-KEair3LQNZ|*XF>@pMWu?p_71NJz5_qcQRc!7KTn|uEmnne4e zg8SlteM#Sa>70F8;J*CkzT(HeGSPvm;DI{eK-2d?JLfn~DkDLKVuD(a^IY*wrBk#>4-;X1IqT>L;;~>Cs$fuzR z&N+?%9!G5+$9x>e5uGFmo+JTIQhZO+a!xXUCs~^(IUgr^M5hIUr-gviV&Bu!oYQjP zY31f=^~Y%~(OJFV*?)+p?^$ckSv&BobMp-Nan?h0-Ya%w6Js-|F9|fL|Z=O$n zoKF*7%nDx211=VQFP3vIR)H7moBuO3i9ox8pnU-7&=+)^13CqQ&No4z56~6S<&EIw z9pLiee}?7@@bc}`(EPZBAiny~&@{Y)@%zuvgzx^(&_n`Xp%7pHXJ{H;WBL7OXySGM zXJ`_EuStk+{xdWUZz%n4sB>>;7>%;@Rrl>mOJ;BxBHfV>sAna zD@=SRDs(4qcqi$1C!KpI+kN*Rq6xlJCcak{x>q;6*YvyB&b`;|zSrNn2Y~O5h#!oF z9!v}$%={iKav!X^A8fWB?7$BW#E(uwkIsgVu6~d1xsRURkKX??H2sO60)(FMlmtTj zp2BjUBD$ZVww_|ZPjST02|~|FhR-Q}&uL80K}zK5ThBS*=RD$<0-=|}%co2s@}mD4 znw48G)iqBgOyo5}uZ@PU&3>=g*stUPubo@3K=5lu&8yJYw|>L7!B0k0=xwO`ZG7u3 zj~FdP2`vST8kzfsw)3`}`@U-bf(1@}o%eetQh8rQMqM-fILv*YzI@-Q`Is?8xtKz| z1b^&Jp&S{4AC%rsz$RByA8$3_PegP36VZe{mPxTO5)J-}&M2Q|9WD}q$pGk2Q`wV@ zAr$b1!d2auPM}c85l>e=kWFDQ00!Zz9m;2L{6B^!t_H#XYiJH+Xq>61O8@j^fJ@2K zj`s}V@Un>i*&i;k0Sw010_nHATx_%i-0h~!o@y`WnWkDNjD8x>R)3j$L= zv)FeolT(%(es;KqFX9;Cbnr^zEE1SnCUp|n9KA63_%O91aZ7j8^nQlaM$7h(VKxSgI=tgNjzDVe)`l zlYg=scX0L6$A?DwlPT(O$_-y|p(5j9IXZ#_zK_EdVTcIwUx7Qph3F0tkFssQNT9x< z6$k z@B(EX7{O1Az`>5HlZYPl)Fder6|yINiX+rYQetgEB7Z0^qT^k62C%h*v0Z1>Ly1GU zjmw3-WyB-3-lgNr8h2WM#R`Gkaj0-8+e{LbBzX=pGALRI3F=rlwKuDOVd;=bZQH2@ zPCuFHn|{lyPET9`~uv`l@&qy_`rpc5cfv2Mi3lcW(gTec+M z#s4Njp$p)5EAO|GVX&brs++bQeGcn%Tn={3kJa;@7-t*24~w_MQgu4?A%l|+@=Y6_ z4{4KK`B&CQ2Q01wEH>MY7@7XCVcRA5Jr5%5xMH0i4WcG)NLGBz8DNfg^mB?rv$*Fq z&%l|g_~HJnot6IPdMC17CE4k|XFtmKX=p0h*jK*Tad>9SC7rsT)eH%GUC1@)#5$H{ zRT0{-BW&rWgv&$Uob*e5GDBDtVcOO@dbW`+ahie;cterd*0z+X8#t8Rn}9#=z)Pzwc2_fVj*Gu>XD1^k;+_oZGAZ)lo8d~6e= zVT6_bIwu!5QY~{1#0}jnLLJNdCqxBda-^&}ppm(z(EGnrt23 zfvSrRdo%JUOU}FyA>$wbO3?r@Sr*iHmQ0Y^@BhIc2tav=xl<{n248@oz6TyG0ScAzR>bJiG@}pt{oz)M4&c^Pxh87J>+Lk%E=E4D4HdDrIu>F>X=w9 zwLf0t%%!TwiYVEw7%W@dk|z*0(M8jNwlSnC$omP|RPV_g8tt@Ta(Tb1pw2SU@VQO77%MJHSY zl8!FsU^Pq7OV}7Q?5nD`Ib^cBM1WDPROa+e{?(=q*qCwPS6*2haqc)uVbxt{a(pv^ z;+LD?&Q8kk7H%RTgNU_OUn`o&J1&>M*L2V5|GJ+QV(IYm{nS`4J7qf|{TnHu2r8af z01>ffa^h?m?kp783kq@fM1fp@?4EFKVT*vacSq>c#tQlDRErGj&SxS@lILS_c0qBv z??7KJE&(5l_M>XWQQzy0Bq3+)CCt>x1I8_?aaK_MgwVF%(fT>RyVeSS(EY@FUZV75 zjmWkL`1$6V#=Hyd7*3@4QYVGHv^>Z)=osVD`3o!J z^O6^kA0CLPQ-P9BBjk^W-~b-@Mai`?q7>qk^c&uU_BE|DIvXb?m(-NeZDq_5=670& zjwx%X*0{Ok?~H{`GtR)aaeGCZ%maRN-ldgEHz0Y|eWfb@fwb4S45%{)(AHDwQvY|0T`*|ortm7qNxA-A%yJ|vIvs<ws6RrKzM{YSVDXi~q2GYN2dJP{}` z2RsM&bzSK7tlMj?9&#QSq1^+L6NaozgG=gpvKEGkifC`^v1RRkITJ<}!FU-1A|nc- zdefkvhuy6SqRIb*hZ4Dw?zt2bxiuDnK>YVTN$|^fGn$$Z>S{d>y$E4rk6OAAHaRPj zP50-y`mrwxqdgM0@E=w{H{t%jua&}3Cf(sGB9vL8a6v-UccO$CqPYG4=)FXlqXgN# z1u5ve!Q|`0WPf{6P5P)idsqm1xW{`-sG|sz}7y`+JdD zddV6^5c^q$_IntTB1P1DWD5IpYWpQR;h`~l=*Ii`gQAq^`)@nCRptA5?;=ne5QIOE z`$=NjMB%K2S^xb-u192AODnTMtg+y5A1Hz3_%KiP+=XE@vzwxKb{7r1% zOIWG#AAZ!J#vPFUyqk$%Vk=Nmb$k#hU0@Sk)QLdqY7bsuUeeJS(GCM>PcUGs4umf3 zQFNB7XCCrKlmza;k@OF^jf;4)$9q8yvCK=2_)FPmiE4I=bID6Nn@HJs4+qFgN9^~5 zLxTD}`K4IMrO))Ftod0G)um0GhvS2WtT6gL5QoC(MH%{sC{1LN8;2vIhTXGdGNELW zyoDcM|2gf;{E_dr+wTvz8OeH+@w1U!VUw|97ZPS4PA!ZIWS0S*$%OF_TC*c6LCJIpmt`WZ=`Gi_FK0Q<+K(e2B0rEeKg>ulKFluPk~P{vFFVmF<Xa3BByIZWHmm1Br_^xCC`B&@}f4etgbL9KHhgOTehzN-sm5m zgc=`49MS%zuyj6w@K3%DQFgbpzeHc=Yook^-mriFsLyy$`JL>XK7DGCY={2j0QqQd z*5C!y8)R>aeQKIUO|AS9&9r;EiYetCs(zu z^e=tl;+u@V_rOTyR8-Q)QQ2gB;nX$#)LMmHHa+Wsyt40IX43fNbK{g3`ZTeLFfXFY z#s2i-Iz~d4WLuV8RNXZC!1T3eKln{~z+Jpo{KpPdFW&b_LLUXlca=_Z)qg?#Gvm{J zjWf51QwRdeKQ`hB6y!GhWhoVuAbb=L3YBy8Rg2eE5e<}yJ5`VSgxc4Y!T3J2*5b2P z^RwI=56@>&v(>)Wsj)~*{N7h*G)0`7SCNEPQMwqr?p2MjQQ@ah`b6jJ*2f{e7b?`J z(x7@Yf)$jzR3dHW2A1aulNWgJ6&o-##!cqOpoWYYCSA|x-|5uY45USp=Rb3QMOh2a zbE;Es6JHe;m(SJgt2E^|G->FS(W@3t-Zb?I7r${7G7k)g(9aL`_J7E$i&QCNB#oOO zW>I%({u$Tg%F?>tSMll8;Om;)A4h>Y=nj-n*Nj#X7Fa^HR{oAj0KO_zo$Z_pZc+;S zuDr~y8G*UvE-s1$t;y!Sr14!CBD>#4Vi{LLXT4uh_g=-oN0Wedko{f4eL|h!`?Ao& zVw{Wi%$=0={ZuHSnmBqh;fh1DjzO0kugy$6!>9@3EC53iu1GTuQ~N24$n1VX zyF)41RwFlAb#`7`k76Z;P<=S6tR`yG%v2|)XvOJ5>(_U+6L!`7^M#XrO-Ps3HG!;#6gBNRk6q@D&D=HKk-S2~K?>Y?| z3kJ6`Q&7ug8}n%b>h=2brG)F$2l_2tE0sP5$ObyIrfXwWT3~yFsV4Q+ecX8T;Pu$- zjTdhmw2akk0zj0l)~3Sd#)abaySlHu?z6W}UpC;YhH7<}9&XkAp2FCLkK8r%=9i+y z(d^7L2}vsF(Z9)4IGBq80-AzF^S?9(N4_T`Ppq9LPh&c5&0pxU(a%7DwjQ%YCeM{l z-p7-^&x>7XeJm{I7|@JB>kDnH)4mU-vu`bBEh1eE(^70|y|3>jFAk6zwlo>t6RHho zuWa+reV3GYFvZz|7K=VNLbCgLnmv=~Jxj2lTeFY}rcmj+==%a39yDG4Yy0y#*qAPA z^~b|(b>p`6yZ%S=c7nh{iO=q{#?&{My=HY|JjG?g>RoV%>7=gs0uIsMfxsk_!RI*6 z-T}R0N|QPqmiz~z(k;iYR*GKg8x3zz%`Qr-tCs)N6TQ zrfJ!24|9YPzKK?ect;p1jd`>SJzl-AwULc@=wm)5VD8@}V?z!mz+gwgBVsTWGNixhfvn6AgF}9R+Ky8x|df z9o7a?T6!JUD%ot<$@jT&8ldco1Xo*#-skD?bX15?Z`oJL2S7whG<@?lOgt1U_&PTsREy^~K;7R>`)Cxi)3 zf3csH`<_~d)Zm~W|!l0r%6JwL5w|E}+O*-)>a!?)QOeb{L1B*n)d%x#9xIiJr0 zF8+}i4X3cqAAVZ_*#I@q#sPdH%{t>0oZyYYx<*3Vs0Q(MP{%eS|8jFzIMPK-gYB*> z=twgDAOv($3_5KFoehG{7eN>++iN@`lqszvBE>^YWgEZ_DiRF~q)d z@8YTW^2My}ImVQn!Swa;@&k)UjK~n;;qnXBRrH!YEYa*&tt;pfZiB%EdT|q&)T?hw ztu&JxeZk7`OIP2ixb-F%EG6xbu&+_gIgm^AW+<*Pw62XKw~=#~Q4FtfQm-X{8U2LW z!5z9Lz~;dI(8^i3CWdvA%lx@7ptpx~Lnh_KBDOozf8=PRSE+bIoq8j!iGb23ucqLWlsdLo8NM}-ExKAa;M(%l-%;R-15P4vQ2d# z#2BN=1WU;lhpfr_dKJ?@z98?$gWMd63?{{16gaK10ronfB*mXJBvweeGl_Loo z?E8F@M}apX_(eeo^Y!uz=Pl=Zo5WpxWEb&EDF;J4y^>QeWIf!JQS9{zTP>qJ%%8mn zj<7|)$ct3vqG)?VIv(LUGS_49PziLFHdC`P9P>=58o~Va;@#V7+-=)I)(j&4|1FDYLRdj`a72*j%FmNc-D9zxH#zsfpgU z%y*|d7rwZd#fPfK9Qeo!nyL7jl*PWKGHmuv0JNd60{naruwJz{7JFMPOEHZHTdcFd zS~w5O`^YQTuyB}PVasut^GN;$z@W3*a9`#1g`r~0s>7*l4@4ldY3`TK_`Q zvzUk_qAAqdoO~wh(^$=CD=lv+C$o6nZq83`siyNpL(v$l?x<%AWj%@upOgy+qo|c8 zgJh@8deac~>=?qGtfeZnG|U9P-P83pn05qU@}X5}wA!&G5b`~OBpaQM>P<2^thTCQ z#Xj_Pu*r789jXhoF&$i0yX67duHNf+wc2g0Y2?S8xiyOYS=fbgGX)C2y7Yg$ z9CxNc&KdBd)&Od98Tt-<93RdbI*#?LlumcgM3OYBhH6ysm$TBlk8L zo;gn^>eXUR6`rq_W(uEUinE;rEFMCjD}0f+fCDA#Y!x*MenKX`1F)*Eb_JuIw1bnj=@TE039`R1q2hozAp+$XYwMOr2W zF)+C0WfgW%CVv_^7tQhvR`JXe$TfNB>jv<==<7#lBh_nM1}&&dq>5K}%>b(|3?U}T z!A4SljFHf8)O119qy#C&Q=-;2CDqYZ*M7aaD;Z@UL{TScM?0gmZ9Cz3^wj`UoxiPM zBHc5aL5#!|z?cuC7uzJyStr|+0GnG~!5ynMOSjk(-=@Md=)t}>xjhq50e=WnHd_P0 zBk=bvkGLDBMPGGZI0JdyjpcckWazm2X5Ed(y6SRfJ_kQ>lv~e@Usb-bz;AYax#XjY znAr5>Sf}Fh;hI1~PHq_|B92+;3^dnk?c$0+U>S+}joH?d9Z1*$yy?QpSPJ=d#&%j( z0pvZa(i*uO?u@Z@UNQMBLD}Hr!SXKX`&s9VK#pZUr*_cMzl9bd8$MUg)FaS=Jn#(M zKobp=e82pJCS9wINu9kTp1-Dm_N9K?0{59iC!gH+uocmsHVcU9hHqB=jPAg50i8Y{ zZygp?O;`6-cLT+a-D2n)1u)!66!Hq!fl+`EliCLc2M;U^^dpkv_U}%$fkba4a6|XZ zX+IDpljaP!lAxGA+jo8rH$;e+=+#<3kOVHRa6YXZvZ=Nj{Txx^bN5!kAF4Gb+~qrg zt%Y5cWk-MD)iF@OCBR`5WYx*DEhqB9-ofbFfD}<8_?ly`UdPX2W+!}{Z_5(tG6?p+ z+w4?lDfamBMK zo){4whitfJ7I74}$LMJntF`AD{*~s4=)|3M439HKK}PEcKQ2pB6CychL)nC_Q=-Lp ze&eO{6uAx$))+%5&4fibd14J#<0fxCn&@XN9Yyr`Uea}ViLzQ1UA8}mwBrlw;u3#m z8@Q*v33z<|(gkFz8T|A9LF3V+m@D2Gwo$W-oVFzxnJ*nZZWFyGHhrd1YaSVHF5z9r*F#vCkzMo- z%}C%D@iG`8Ezw<$PLe%pF&Lm!Xq9PVECYHdY}F?>f4npKL%xw8pbc~kXVfI3WFm&}0N737>RorHSA0AsfTT*5c@uDOE(=OK!Ex^gvvbt>t5xn|HZ1dE4Kmp4 z@o!^~J=GsnIch>i?JQil_q8c(L_4k*5+k$?OA4|kfbsXY7>yp<|+?48rml8eA%-0=#O~j+9q9rY&o};M*_EP zQ@$T;d5{dpBIxbYA%g4$=vBuOZ0$2KzU+l$43<1Y?p?~D-$hhaCm80Qb2%UErD8tW z$ce3U(40*kKI{7|ifJRMt}Ycn-%df3?No)7DP<}K9Y0T2XKyd=OTV{S-F@wd;_cw5 z3w=K{j%;6QT3}Z1J{X&PY(Ps2nd=KNJJ!V3dyg=a@o|miPdQar!D`D}QB~G0bYti4 zQj4pbK@|f`L^ipbnHD7kW`jB%c3CqWd&q&91J~b~Y%g6qwkKok4MAM4nFRZtA@0Km z3U%IES^g~N`cr;gwUPkVBSazISz^HNqOP4mesGuu>hYW$Dj`mSv@!h+Pjip_+Lb-=j;r^Li9PtPcNt!y%Dt z=nOjCfMUcEeST*c10MRaf1DpfWLIusm_8JS)caN^y4a9ojO0Twto$B%Zc?8YBFgKd z!x*}ZIQpu`*;F4FFTMA#C7yq3@z+hAm+50i>yPsTAT$$?DH4(YsLtfiUYI2D3Cvx` z5x&pNLhKLx3xL>|TFOqs&);}DASvY7 zJSRtc!8JsFF*3JM?6@L%YeT&&(`3>CCqbM{Uj}`@3I`lRVbSOSHgV^Bh2G z1Sj+Iyop|ZEZ)h)VmRdpzerwM=389saTWhMA28%uMLv9%xr{5|`I=3*YAmw*moLOf z1}zKmJ9+!G!ajYjfE6kIH*^imU-($Nu+{nFE@aA!I>NxeGG9{`l&7TxLnyQV{;&h+ z|0EmbQ4@lXRVz-x{MeRl+nl^eo0l&-swzD3PM{0ff}H(Pkx#0~YEYG&t(1{pMS`v? zX}H>-Jh8DocbC5+Kl^oXRwV@B$Ds}oB|GyWlO82zfI*k2M{I$@pa_uV1u2Mn{vgq$ zh)Xi24yRCnDKdk}c+nvr(gB;%u9}iO>|?%Qh#l@+e#zIOJ$#=Tl9ou~{7OElgQ{t} zsgGGKvG8k)Wtdg6_=O_8h#^S{6T zRm>n!waS6=BnQwgQ@WN25FJX4qK0+?;(YXO`Awz2Y}(mTdK+ixnT;kb>}xI>xzCOr z73SFZ=KaLVLTw_s%gfjH%)x8VbxAQr$FiUd#{5HMF86Ov8A*8!h0>vTUFXHToaGnQ zmr}oKV+3gBBTOpikDum?QNKcVxSMl`(su%yr+p_CBdX1VSxu|tsiVuu4wy?%>(H;? zqd9c3=?x~-s0kLBgoVVbR4U~p*YYMXgX{Y{3PBHgbjjuq6U8j5 z`R#~Bi5a;IF1bT8ap97G<8yY1Z_FZOY2-#Mzroa)r{o>;-@``Nl5)Gf z8atCwa%0dzg#ZgGk)nFPZw20af#&F@oE80r4sH7Ssn2JG>rWBub$Q1qlE%-9F~&8& zC+V2{B+K*^k#?*Aw-qF}VWP|0jBj?y}-v0;JKUq2CvNh{|( z>G2oh?_|)u=WQk*_UBKBZ{NrVeKsaHEuQp=L^;&xbFyHXl4n5FX=y~*FtKQhq2s<= zDU;Jdco&}H3u-+WeUm6_la-qZW18{07^gIDstnr&I0n%Lt7Z(7)tFyc4?#LP6gM{a z7C&||0JF_tst_RkF`mw3-Cs$<6rX=fs_fH?8gij_@;+swK5dNUEY*D*_#QKONd~(9 z@YT)Q`U0k_`vC^3U3e#gp)>y!T~L{pWHy|1K>Dqy{up?f`;C^f?b4%&DJg2BY=-H%KI?guY5dgw zlyjfn-Fs}5a=1w*P1Lx}}bs}9qU1Eu{WBu;pcc{ZD&ZO{fAzYey(;pW1>2KpF4}=WERCd(1!l@| z8S@5P2=~L+uC>nIp5^Ap+;vF~3*{E#x8Ip}^vpZi3hqDKaw&NV{3K(nMWiA z->{srg31Xyh%QHGFFED(c;7+Osn`Gb{aOmD>ag7>Mtg z;j7hu>t18)xFJ`&VccUGG;K7r&HCrq$W2wtH@2~IfBQ$0nuDz2W5=$?{f;#DH#S-W ze_*z3MFm%Eru^9IS}?mZTca}5$TR~{L3^MZK2hpi^=yvYfMHEE62F8 z@$F0slOd4{^{c^ay^a2;=#;q-Lf@gUk-tba+OG) zbh;CC0?OI+PAJT3Hd6F+rBo~DXF=f_$|txqRPVTUZ@07|v-1Y$UAH~diZ&5PRGF$Z zk_+x7p4N9Q?l!2pZAaky1y|d z*L*sRRAHs$M*5XrHs$;eU9;B`_pnNHq!%^5N3OFmqu*TYpEI|d-WC;Ja9M3e3)4UM za1QPb6)NZ4GwW3MgekYAy|di*Z%}f@?FL85m*1R9xVR4(jG9m59^C=4&soN98rZZE zdN#Jd-D)1D0emfiEl+|~hyIUg(U)yp#2WFNzx)O*OkiK|4bAu9XSB~wei@>r8lGsV zS!e{FN)@oB%k2RWXwr_T@&eDbwA`E{ty?WlBZ_N0-7EqHU$W~@?9mSjgl5aQiUWF2 zl42_U!4JETwY9c$`)8h$wPS?;{Z+6iVOHT;e3+Emp1GN1&{JOWHa&ZH&C`g_ifL>m zaa3PDbQ@dz0Izb+kXdBF>QZ;aZKHRbsn_7&@mwU=p7fXJ(x%Ly8|;{xXq!c63pUdi z<8<3h*0>!oD{`yvXyFkDkMsgN?gl2al?i*$sX7%qEFQeBezt2;QMANHXaA~UM(cd6 zGmSIzjFIXX(#oVY>%4bh({p*-CTjE%`YEU2EvQjG!*j|&a|hm*t)gWnQg-b*qls32ixwUUVJhpiit1N<#f)g z<2O&+?T6l-Y(T?6ET7->C6K50wl6ivh)WZvsYe!@dgT?;7l}&IiAtS83C6WH+}zgx zhq=3qiep>!1P(zXxCLnl1PKrzNaODA?(PJ4cXw}S+}&M+ySsZJkOX&n`kZ_2yXU>R z^JdNaG#`^*i>keMZK+*Vzki!30!WC1d7pk z27^IqcLh_K3^x12`PM`;xokdvL>$f}bA^1dcuJMFB!T{WlEVosO(N5g zwvx{j&kx2}_)t{78@8eK z4A|SIPEd`>RrUZD8sz1Adpk*NY`{i?<9I)EFY#B`w^g{wF4))o)xgW2R;c`QFZD63 z2yfwS^EVIk82S*{@~rvBrAHa)K)4RmjcbEa82y8bS~EP?`cG4W8*b&51Ix;gB+33# zBBiN5G&&|met491$zi0|*7mIn=Co)-B_7r^oWDvcW=Cmj#}&uuT3IApkhr+03!xue z%&_kX28vf;E?xYRC=ED`?R!zTj-41HH&pt_*tdT2&Q;oOgl<$=^Bh&puN}`~Ehj?yLtc1OI$4@ex3lbeURr8FPFfY>W!uU1tH5~~KHT}uoDPFF zb2-b~N}#qe5O_7>v_tf^+gN~`o0tPQPj#_qdR>mPjH>!1>A7=BhZ7(M40TgfDsZdtmoM zoz<}yW%)_979qh*O|z`0RGm9~#94Z&s@Bie`{Q5u7Z2xCdXVS);)LTD*!TRf z5e(jNEZeZTNbNnz)*A1)!3$+qd^G~Ur9p`wlzyhNyxElXzx}p}AhypxYlH4j5v2<& zlO~AslRl6D+h8mRv;LjGoxz=h8j|fdHvCa(ee#C*E$v0YjqjhGN5hjd_bK{!XV62Y zYURUdTA&GjXu(PiyEqih?066Ik=V4!C3fEnNxb6&@r1#}h`59Gr1qAQ6)VGocNBLe z$f4Fwx_DEw)LW+rcIsCj&&%$_1W+BU+@#-N;bHd^5>rN*WI}exyi3@cz!=f6N_%@W z_W&jg`h=vU8H?@jgFB=breKE|KTHX6l{)l@awikW^5r12J)$6YMM@_P#W&4>bCH6l zwL)%HNrQxlcq&1>$PeM<^Y0bx#+fK;-?0sug+!!HCmGe=9A-K&&Lx^_$YRINr+jmc z&WQS42mr#5+xlFlMXnWo=}qqoA*~1hh%hDBOPA|FP|SY*oNewm@Wpc$BcPqgoR(0X zlaLxC(cTz`^|j=LWlUL?M#e0A21kJf(=mv!@4EoC=1efAMa-4g8_y2}U_(w8FcA|) z6!~jKDqaPku5sGX`!;b83Mq*x%tAhYOBNr*L5xa@lcw4!n$7WGQ`NvTQk(PLXnCVp{WjXo@*-zLPk4oSo7kPj!qUkoSH* zKoqBfJGYEcr%|*SH@U{0(9!_I^P74|jShwL=haby!Ze45cr+Gs2Bo$cr4yW-jnC!g zz(AS|6){d#6IM05-tjXt9Z>c!*&p@lT1RMnWjcky zmqOb~So-N}i(9%t-9G6knP$RFxmsX2eZncJ1p!1FmL#<&SlHYjBeMgVzM)~=cz`zZ zV-11%Jvg(X!mYP$9W*-F-aKGMyYontR_EHlRAAZ+rec? zM)LSWdD25khlBU~LW6}7DOK7qEA7|#_$Q9zpGyOrE|yupt@IL!@6=D zNGxHN3$Cq^2iGZ$b8VtHcpM(o71Z@zDpN;As#i0*vUH(QP#UF6o3zm1f&(n*5SD{5PW`f$hg~I=j)`b=Q|}|k$7QpajN0!HeyLW?rA^Y3 zbgoQu@6LzV>sCwceAG}0S*H)edfF4O&bRSWB4Y|PO9 zb%dw3IP&TnPiktDKvk|6U89M@*1S(0-F&scTQhSp&oON0Xv@;EayR zZ%rpr^2Gy9o=i1vTf%Igfy(m232T3`igq|Qw_VE2Pe_-SRZqlI)@RN(@w*&bO)gE^ zbM*!((Vp`M1FQ`K&ueCIc*&)$Ev4XmOV7)P?vHA}LK^{7CBa-Ro1Dx&Xjzv(KWQED zm}!68(2>hQV(AhnwvM3V0XvvJPWmw;s>c=ed@2sgOOte>lyS<;}1{nkX z>%n^IFNndvk-Y7YqvN*6#}TdMUjrDB_lggz#9rEpkxAnAna+@F?QBZEylq7{8Qp(l zOQqFQqi4DokvUy53Ed^0wi>N@yD>f7^c&@1y5_J3wR->E*%!3ZPpH>5Xz6nB&tK3H z?9pSRkC11M>ONrL*kj<=VgSxDNEtCH>@lfpG3m}R85yyF_E;RXSUl%g0*u%q_Sh1& z*fQtX3XC`^_Ba}~I6CJz28_5S_P7?cxHjjw_KbMW=eTH$=%L$4A=`L?81I8?--n+= zZ{y!<=)-u{;)BoevBuGJ8Q(%u?FcH*32N=*3K$8EY6x1-340ld48qX{?2$WbiDno9 z3-Mk}_JF`&L>r962lm7n#en15qwRCzYkQLW8K=`)lGsQL%UoPa|Hno24;W0OI2X=g zwxp?aZ$ktKK?3ONFx@aSq>M}-ffsr&_8$W!Q4<6R69iDXKU~qzepFzhP?<$Yx2M1w zhl9_>Z}7*f>meVSrm$zCa;}3AI8ePk#jFt^l-xlS-A1#WrHW^wj<5Ted=abu0jB|$ zklz1$OdWOQ1r0EPx^_0A&JT|~fvg)9t=Zx8NCHV?-Dj0Bi~vmBC`_c83%VU9z!Vcb z3Nm@4!TX{dx`71x`#J_lwmtoGg71e5+R|A%xXUjXN@%dmjK^lkmZUVrbzg217^&-- zCgO?c=KMGX2!j$3XcQTknOQ{Y(eNBu7N{s2N%4HPnFZ!pbS{ChH7o{7UZ)P^QnQpO zj;zj(Z1K{p?)9FTJ@3YQUPsK5m0z&MGjqHiV@r1QzNqEMW#$Zz;3!N4Xw`AnGIKqK zb2eUjX4P}`GII|&a*xz=Ph4`(F!L-p@?d--T)*VmVdgz>732`(C@mvWB zun3Dd2}?8x%UlUV6j(%5oJ2GlM0Bo13|K@>oJ1`eL~X7_?ODW}ouF^jig{m&`Ll=z zJBf!kh(}+E$FoQzJ4vKBNPw>-a#o*30wkP`Dmpkqy}iVU+luzds`$#p0m*7?*nqf3we&^} z@U=!RP!kgB1h~mnT`?d@QPD(5QaTeL?zqhw#B&PyO7)}60e(lR#p;8r{m1{j%R(%8){nt(Wr3;$1jrxy?N;}EC9F3}I*m@e* zJhsWYI4=C9K$24x-h*C43}tO9XBYxip)qGeh8trARudH$6TEAE6`+B}qQL>F)(#e6 zaDkr#NYdkP1c5cwyV4X>mGF1rwQqW zEzptxWsCd=u%>-Z=0+~oBTd#5tm0g_lohJNHj7FE4d&4OEJr8B6$2xy8&ecjlEp~*}j5r9Jdw>ZhO6{Q~4ZmeUjM-KP+iOppKNXF2vvR{D#Md z)dSM(x`XA%(4e=$Z1gM9QANcVf1a2CSH1DZmCDWcGS`5s$&GHAhjE!lE!h^ru<&&! z(aJwH=%|_htkpB*u5RaC0KQD++>urL_Q7P zbb%;}8xsumXcG?4*GbUJNB1&0a_2IlKG%bpB`MMwCXOwoyoE1(#U1kT*8ll7NhaOH zKs72fJ>XG2H5%87&?R(_J#)Z4^U^70V=jhbKJ)t4k%5DE0bc-VB^IC-c+VV9g0146 zqP2$;j&KFmb4e#{h~rAlLTOb*;wKr$0fgOpV6`Q}HQSXZ=eoP|>agk(}R>;s5^IApSQsrvaw{jBw$;(l*GmABG8;O<(^OKVQkbEmVRSJ<(`Ja zo~Y7X#D*JI?BkoMZ))Xz?kU(b(nPqP4bZwA6vKj<%bx^}|_`zAz=vseV zUytxualH};$CZV0Umwj*O0ZZlkz7FiUIn%-RYo|_fh)_%Pih*zCTDX;SG{DpCy0;xm zwJbVi0OPht&Mkn!JxE16l>?vGyETSNGir~NYrI^ZdB)wxKe?C*KJ>d0P zIGg5>SVzKTdmMP#=D;AVyw$FGxl6=rV6L$nKxhbDZj5hNal8(oe&4^v9PhtSa zaSYZeR^+zY`KE{i*LsL6_#K<8csjcB-Ve z>*CC3_i^PcwH5TPj}hXQc(bZ4`7d6t*%|oQQEh~n=(;cf68GBsU^QzQH)9N1vqL+3 z5B%|&7CYE@7q~!LXV+?g=ED5cV;K;iMrUvGdU5@=n`>rO-|{p`=0qU3XKlthgS&Yu zz|j#<-AZKbszj?+-3s@BDwmy?JP_z}k-eq%@4prlVL5GPGMAno*Yxgn zRG#;5xf~vOFR-${l`eW`yXG7^LpWvnBVh|Y0X-}~|*KvUE@EU5< z@8_rRo5XO9^E;NnEf4j&CEi4~j~jW%K6dq~t%SS>wTp-2(|*dt&0`!i83h=o(DDFySn zG)#?#m3G>^Y0aQ79ATBtMp4s6oT_8&33y^RQ@(pRKjn?Om)FDwMQ^O8P-NU_A7kZq zz*?7^?myn1`GshLM+rUfsJ?ZWU8|g>Deo)B%F=3eMRC+0PGoXmY*X?H!YS)zA_S zFR0_lFIF^Ka-wSbr`(V2AugSl%&YnRQ&cLmBKGU~23h>2EE+F^E@!o0WbYn`l;bFZ z^t8KqC^SrNzGEf(PgM#*;soOcr~rWMa;{21Oh76l2ik`{$2x}%!h#>s`0R)FWkY(d@)4Py@^Z}UU{ zlxRzeEUn}S9T`o@^lWa5nBYte&zbjWrN9%VIL%y;3zcf+AYy(vJjJkjEHWp2ydhQI z!>I}Rfa_uD!@e7Y&TK>0_>+`?4MJ6Uahc}F6z~f^snm$*SXDKpK>v^Su;fEB73`Dc z56Xvi@EAtzm^hoY$vBAmth!$Z&}HFn!{#MrbTyRSe`i@0_r9Er$Tnjcs?Ek7KJldy%3KF+D#QCbk0(Jm zcBi})JU$7W6U@l{YS9En7xukvly^1B=!;i8S#(oTGZk+mC}JHXb1CAc6a>Yxj}!6H zl+*_Zu@Cse#HNy^18*2oF8zg7b>}u6#b-;efA_nte*9p_Yx+S~!6pE^A_svXtoNOz zT_DkEPWbm5f&%zBUeee4;j_04n_x*pnlWTi!CP$17g0Za((Up(r5w4HX>va;@$e@g zt=Wn>@Ck!(*{?o^{KAaSAwCq7BCO(-?k6FodokgXW(DBZ7F_e^FRj)B0JM68EkrBGKTz$TtLnmpDf6iasO3LGgy)|GAiBDtxlA^ed~M@g7O1BIA(61;?2E(YQACgawT) zNb@4bz9|vhcrDKWj!G^$JtAnWkc#7%k`Wg-tP#bb1xH(I|2QQ@!&Pv~k9#$Q0aULD zw>%vFfvwW<5G+ApG=6*jF78+$4md1$1hBD_$ zYnyVdtq7H?9_K12=Lq@2kfbE?l4Oj^ay`hK<(@Y#H9>S0256DX{WLDMQ8pDuByU%S zC0**0Dl1GFB3H&OUFtK>D$Mxau1-g|G!)QPTF6DN&X>6~R@hWp>AhWBj$r-p4`2OH z;lKD58cYsc(X0QATa#selZOib=pS*dKVgvJn)PNXuMeM-VrunsiWYpTD;P=qgu>Lj zNORDeOvk~LDHt~blqZvD(_XftoB)4xekJ10m@oBtLKlTcU07{6b}mKGnn1B^p0HALjtxuTbEwLwHAgVjd45HZ)^rkXQxm2JG z!De@VS#4XyX8oQ0z7t-Zak`TJPdX`PJGFKTTU0-HJ4ZQi1P&`JySn}gY|<~);Jbx- z;Yq^c{;z}_=Nl!`4HLw6=QhG6G_{=xo-D_`u{OzAu3hn#xcgByBUL}I7}lYtP*t2OXD4s(sC_!-H zZVJ-UCxYf;Ulc|al-ld4PixL|?+)ZLRoHi|T(b_zz8cS3tf@2Cnjs5Wy1ZWVPPb5c z%i1APl)?X-G&quOQo4bVQ3-o-+GzFDki4F+7uGM@n6^^d;-7D@*SsAj@ZJ@zA}7sY zlTR+;21V2+sCu%BjCPD5UWL1(3ibLcGu_OOtT z9Vdrp4tzJ%VoZckGyB=`hs{r)D@UYXqSE#Y{2cwpjJ8-aAxY-X>E@TxVr_#XGQsvteyq1B(|9JT)e}Jb$)FG{b2d?_dbylQ$Xi9+uufrn ze?oh~@^m&1h5ado6%FzZw$T$}FF0?acV&(ys~2q3rx)1ba5mr*ei!1a`iKly`h#zT zm_HtV1W;?4c7aE9AJ1AM@hj__w~ilcdw%#7wXFCc;Cv&R`nlJ*qRTQJ%%ZVI-`;FU z`wN?!41&@=M*G9;yDTX~F=z-v4vMa9h>Ty$h`E{QrA6T;V4bAn1F?<-4Zmg`*)GSA zY5Sd)8IagbqdoD-i%hF+xF5dM;?$cUoa7Nx8M*IWk0Ckp{P;~s1-8yxjgUlXJ0?T0 z>dq;@863hlMFoUMoGGea#+Vs92aKa9QozKpcn>xfOF00=6sBR>62b)6JFYL}!wMU( zAvu7qj)F|haT>7-e-UqbH{fxX@V2ZiffN%ZC!p}a9j<7UH4BW!LCnh4efYsKN_JOq5z~_7y_M@9{pgyTBLT&c*`bV(P zn;~UM1JqO2k&*RfRFNF)kH5T@NKNBsU4|^@5ko`iDhesylN-IJJ%S&K96KU@!Io=SN7bw5#L zZzk&sQookQ8^0>+G4B|*I6n2juPu4ITiSi_=_nzZ#1+wvA^i||JH(%4FNv#9vrBQG zzmNhL@psiUSu@dQrX{Xl=P*g_Fj8-zST8j-HwzvF&v+i%twlSmghFFTSQqn>TL$Tlfw? z!zx5A$&9R!BH%d?O<*TT<0U96;UUuOASZPn*C@7BuGPzkrAQ{K^I#43bIvmZKa;mS6JUmzBA_25>-|}-)9glO`H0$XVhgc zJV3`vN++}(2>U+Dtf;7#rm;+KnQOX#JxD2;i--e-U@Pq5;O%jZe$n*kZau-6Qkk`C z-LfPl{+?OY#G6fy&To?KZO3@>o++-haP<^8v2>@Fsg8!LEb{LxDPhY28r_mWGA(CC z>FI6BQwsDZ4tJ%Y>k*>XVD1+d`QQhp2o|aoT>98Sh`;w)G>63^`AZMF{)D(*K=MUA z?0SjQ^;1ry4<$qGic-C#O=R|Ss+N{Ad&9$9hXd@hlno4HUs#o$OstfR&-@-4a#jwh zTZWadXUWI?@aqZhn{ukX{6*!n>^y;=_3Snd`dlmsoeG$71^32^LMOkbgJy|K$Q?_z zWMpZH#K0+?2QhFD!=*6~K?O8#jQtB(i{MYDrv;LPy%LgTKC7ckBoneH)z4z7D&mhe z-fd)f+3WZsX_G2_(zvSt=-j4^)+Bj2n0IZwJh)LgvRO^Sgpy9b^Fk?P3G(_7e%)K} zP9eZ+hZm7SsxQIo!(KG*N4b(p3xtOSXUDNp00aR{k1yUTOtDay_6mbFn`0WY)JEU+ zsxpUz+?c7TwM2*_#IVWzu-JW71i!gigTP4Vf*)cADhgZwVejs4+OR>JAfdG z8P2(LSB|~_hA3i?8@{SuN??A%0j)l6wW305A#&&4Vzq)#ah=%HjwzAB;V#z|3);o8 zx~;0R!CSc^_Hf!#jaGhPYs>Gh6w^n&W{^Cum5f^Xh2-(oSxKbc%t;C7 zJtd~uH$_7cyHqnffT|PRZ%Z6Xw`3u8S-iIc`s!#1q{`3PvfaN$gzf4xG_yjo=(!gGR}tm@k(2kyfl z9^_!UymO~kHPS6dVB#(tQ@)sA@9Pn}5G8p8wtYJ#LzRIX#t%lqjJ23~3a(~@e#4H= z3_>Ec=w#f+3Z1=yZS`(n;LS$a^f$GXk-|iS{@Bm?K2d5u zpXYhn1ms_GLrh=E+TO^&zGef7U>zti@Uu9LT%$P5GFG^TR?d2L8ZqnCVcuOJxGPC~ z4)$EW2u{bql-9?7ZXoK136Dio%VS|pZ;=tnc^8s{G0Z5D*pC6zM0%J+Ixj{bgTbm< z@OI12E#VSr2|mhREYJy#B=du#OfAnBbD1c3_r$?3*-A3<=hD$ zB$;s~#}jOU*Y3AXwgPT)%MR?<4tVQ!irWn`_QOgJvu4R5VzJjIDn`E5YF22M0?Rli zRSK~uEI<^0Mkx`wUrMCDU(gL8ZeAxwY@&0ooj(%E7pjHeIk@a5d=qf8I}|XzkhD3X z#9_k%ATj)C|amRu*$>f>Rd4A)tcN25_Nw;M>mvg?@Pu) z;%`DsVosnLAjNDO(8g^cj3*^C?`JKTwv!ssPwmk_UXpEYqO|sR#OgzFhmm!J-pA>` z%Q8v}r}PU~NO#8~ym7P8v&g9TPXmU<4c-GFxl|nIoDfrVjcwXoGMaC%D6^C)X;aWy zjxw!GR5glJI1!CL!5a2M1gUqA3CI+(8qT@7oHMy*I0+RHeo~{W#37uIWZk%Dn~H$% z($R~laGdJ0Fx8mg90{l~mXG^nTBtKKObrPsk=PQ*&HU#d{&Qqc2GWNTR!({KJP<5 zKS6;YXMwP0fv87;IH*9ftw4IUK=z?Po}f^Xvrt*HP}QSQ9aN~rED6#q z3GpZi1C>Oyl|(^SOJW{M;s{C;I7^c>OH({b(?F%5w$jYi(yWKl9D=eu&awi{vLcVN z5>Q!LTUo_wS=B>X4MBMwXL*BWd6P$Z3#h!Ut-NEkyz8O7hoIscXGOne#h^#UFsNd* ztzvw&V)CJ4nxJx)vvOXua?zu58C1F2R=K`f3C+^oCaBuwtlHPCI`pXe4yrn7t2$k+ z`uR}xo1prFv-(Q2`o^RB4pjZnR{gYE{qj%^Ls;{Qs|H@H2GO$yIiu!Hd(FGG8q~)c zbi!Ipu3BuZT3pZC_ZhVW?X^T}wZxCL9|-Hnxa!EY>L@+yK4sL=wAX!JtD}Fc`$AaH z#8uCtRnH3XtY^=t=WMU%UaRMQtmh|e5aenQ)@l&-Y!J_AkZf;|UTctjY>+2xROD(@ z)@oGsY*f!^)NF6mUTf5SY}6-gGURG9)@m~KgyPmsmhDZ}YfWFFvNd5dRJL}4%GRFE zP}$l8DqF8L`@C)D`+)Ax1rw;%67bj@wkAPS(-H-ht=C$@30wOwT9O`H5< zEop15>UFK4AFX+W#5r26`JQc>3T;V|Z538HWmc_~gza4CZ85a%O_7)lZ(Ez&+X3T@=)>(DlTzptj~!ElowMy7^IDyQo}J5t9jon~9c!JN z5YP5)!mc{5uKl&PL(i^~jII-|w$rt)tjDh3k*yb8-3eOVHyJH=8Qs3^-A`-HFOS`x zggvh^o8h&4Ts?b`wVU5`^f<2dpb|Bs6ZP71^PScJwK&_3;ul@)PyTarFzY zH;8)mOJ(#+W;RH#_lrID%WF3%at{b;4X6?|sAmrFwGU{o*XuqFa1jm~X4V^P53+d< znrqivb__DF4Spr6w<8*2;2LsTuXFJlqRklc$gJ~PAEJ63^3$#h;2!>{H5@`z7Y4~3 zCTSmzTCa_H8YUzhNyw~C(jLL{97)rz1$B&It&L<6)#eb5qH&EDtk)EIjlRtoEz7K_ zSRX}t9Ier=spB4l(;90cs%gm_gS3rxtXFqEjXe^Kf6J`y*B-z17$4TI9_<*vTpgbz zs-7mA_{BLfzh1TIHSq&9v6@-6zCLmEFtM#&waY!Zr#X2@RP{Y`a;t6fbiMND)8rb# z)J10HmG;z<$JCv6dwL8s{RUj|Zex1rVH#bh0+VN^ zPjdzrQ1Ko-)7>^hv{6p{Jkw4vO9n0{*O_hhnEj+vPSZJCzdB0~DE|VOtA=pSv22vF zde4=E<~YG++#7Sn4|DuFWr95O`I_^hfHHCLe0JNs^hT-d^Lz%uf+Dz7S!W^DV?kY~ zRI_s-adkl#P^u4DjOAQ3-Y7BkUWA5mTY^ihHx@%57VUIO9C(%jHJ4lfC2rs)-?k;M zjbbQn?Mbj404@&FS$6eU4$~=)=v;POU5)`1#{pJsIaiW4ic-8+tUxOua8c&QirK?T zj!sb?&#IB;Y7wBQ1iY%(wpy`KSoOTBMX*)}E^N?QQ}bAB(J6%b)=H~uU4TNUZ!O2U z-oH@*^{u5q>!aWTsBbOyrX7KFWBROWo(FwNXJbvf9Wj1m6>>JQ&a<)eys=iRS)u9~%0^L49i;w?p$7cc^duYw_^wq#@L|HUl0x zRkf)29CcY9d7yGZee0^rBR}5HP~X~G@p}lQiy|!RyGGsjD5y5@@_iTMI02Oy>Ra2{ zLw#!;sBf({bDTww1NE(i7*7g#+ueOm*uhZWdJgJa^FBj;>v^beEvy6et>>Y>wPYvM zx1NXk*75+TZ@mEZtyR6DzV!msx7OZ(`qm3j-`bD|>RT^DeQR?t)VE%Q`qp2c&$fw| zpuV+}4%D|^g8J4TolxI;3F=$>0ieG1GSs&Y@&0v}wG8#Gqc)(v^)l4APT+z1)+iRYcted~@5 zsBgXY1wwN9jR)#muS0$7VKCIUUWfYDlh07!dIRcPi&&mq#9aNVx;mY_I{tZehUw_idgkZ#B2GUf zZ!5pvmc`r_SKW&K4Yv-`yZi5O>+E|__kHHyacjMYBHxFS|G=#w4>cr@b^pYzTe2V9 zy8pthdq|$3ruCn=_0w?n)99bL^(5qJn&f$w?|EMDdC~Xz58S%@c^$I#3GTFOH7@^!ThA8CWQ&3|uPqlVb-F_US~u3KjS!oyL9o{C*Ue6E2qLleo!#z0 zG>KT2_PxX51ehyAHFA|CFliS6?M7CJA?z6|u*+zFLiQbFX z19UhT%GQJUygWZckiPK4B9Yhd!=VX(5kSB*t`R^Y3Hk!XtqW=d|H7^JYlP7F;2DK6 z#K>!fvHpcy>jg22;+qxJiW1uPGl~IR_iM#SeBqhINkhrQLgGf7aS8rMlsWd|`y zQWqE0NzzvLGfB}k@7GB&bi*@CGY*m0OEXUiGs^&%jO%6Cwt|>tIgSeIWx0O!Gt2SZ z?$^ulLEu^B1&}Bj}!pZ~m4B?}vmA4+{ee1A`0? zg9H!%uK?_S_rst2|NriXKO?jMpMLls{;6FA#aHj3!Q3#&GBB|3-iz04^ZO&Bya=Vm zZFh&fA;s1HWdC6x0*}HpsHN6GEC5CjRi8Z}CnAxCUlksDdncNLqlBuwgPA)XfoOqx z7dB@+obg%?_1!-z0P?UxvM0M=j+qkx1{%X`d5Ou3md+?apYlSWQFYa%PERtr~#|NC4>HSoKF)t;Kk` zHx#WG((+lFwBy<8M5&D--aO**s|T39rUj;@{r)x>gMSqYA|Q=wEUg+^Cq zI8%`{h@EY5oc zto``gu#SwEQa;Zh>oYyDmB?xUkV8zDMv0QavH2K3|wpP1CuqAV`dWGs(5f7ItrBnrEZ-K9GiKSa= zcK!%_)g5oC-5ZMgD3vAMT6Zv(#%#4Y-dcb3SK#ZF6mt;*=-k``Xf<1<7a2oG$a1!t zWxID+;n{q+DQYc7Aj_@zd#dM`DI)!}>%nGj?prgNC%2zV3pRK}U%gpw=LeI0kx;YS zxQ_mQS(GAHz{z?e32z7K$KRM)wKji7#x7T8{sI<>Hn{A;RAV`_Z zgnhDt=2{DeW6@bg-Bo`ah{k2~fG<^mrevT)Q!+~Bp(zlbELpy;`#VIA2Ohbh z@_2mZ!w%5w{u+4avccV+soYAI_2l*?u`P~7|K(jgED9@4%XE2M0Q7@Tl(52{;|%|? zPyX4|aL2nzui#OWMi6c>?qZeSe8QOI|LJE>@?K@X1VkxYh@uggScE*i^VQOVOD zt}mKMXZEg2a$_``2zwX#2GC+>G+oG%Os{h1bRwTGU#@8q@xNbRtQ8TpG@EVFT&X{o zTHJo^Hd;B`Zg%U>)~M70X8&ojg%pefOWw*YA(>^?@J3*cDG86UeJ@Q#6r? zCdZ;=X|>-S3nsx@J^hYhBpZ+BYx8K}9)H8%7BI$UdK>l@E7>zTH3XXcUVI#=N zYOzYU)#crz^Jk4(^r;k?a@@1tCabM)&RWTz!xj`GKx_pk8?x?X`^FMo{df6RFz0Wk2o>%+DAL(n-d0RFdJK6K7gD${OF zFqU|Osy`Yf;aD^QVz)gRA8{<6%HsEZgCglvGLt7BOCtlCGm%L7BjlWO;aI6mz20); zWcoy<3L0{5a(w+`85(jf``Jpha;@2Jr72jdnO?2c@$6({?IL@t8z1fxAbnS$luG%Q zR<{F#(Qptt=aHA5*Y1y{p_%r7hkn0370;uEDDzMkF;l3-plaV%f3g&;fo6x&-lV%o zgXq>Yp+)y~r8DsH1+3L#U)%3bqL&41bvT^P<@6=)d>A>NueACV#`Add3%lKu1xapm z=j!4+ZI;{=G1*W5?zJ(q67H9$N2ExshS+Y1z(*K@oh?7abFmy>MB?Qww>P4Af4fox z5tU)?U`YO~NF-!zWSE|wf0q_d{p#*^N`DYqkr6}^bp;Y3gj`wLBhbY|>KCk{tM}0U zmced6IsRu_JgyloJTxs{A&Z#zdvcYBlCW{2b6 zPddBX-`o92$hVyx&~DWg4@a`8eSf(%RH~Pn1-^G#M@CkxIS|i!k}df@$3>ClV0nK_ zvoMxzt9;T8`+IM0Yf7*9@$s(HOx+hA*Idz)2!%Yy{~aqkW&lz$TTURh>K%Fz#);WZ z2oe3ft{{QSC&N&Z81vomK#DMQ7-BcS-AL3Ta-~T6Z{|k6LUfJuFdwhjzeV%^Jlc!n zL$o0GrXepiP7q@)%}RJhcf6k@%ZN{rq--jY^afd?^dMEl{qE(8Z{uA7RrW^$z$LUvb}wF0}#lg_k+D$Pa- zjCXcl_`ewR1tU@MLPyWN!8m*=UFrLC%BQ!Vl&gzetCTOdGw<@_KS}XJ2M$!)= z??o{!itk0U9)|73aNZ2>#qv@L_r@7xuo#DlpNQ-W!VsnJCz=`f`70{Z1j8n&gBp8N zv|UKVpRw}(@#)EeyeBBbwa_1D@}4o)@*84Gp%UAHa((rG(`-Bz#+bmJ}O{N3RnmvBy7 z9M<8|(4-KpTQ7CTk;tej-hOB}n$s7^VC^7i{85gC-XKc7CU6P|9pfjXJ)3PedOVSi zWS*LT??JyCm5cFebv&5P5Hpi~ZoT@kP|QUVw&t=43uBE|j2#>IByhQBhQ`kj_v~@~ zbFVKuTi(a};ov-bDf^`h@&q}<)Azl`*!P3m3dRGuH33^dfyV;Ny0#dK?78l!hUPn- zm=1UPwge$92BG*qpYp`6TE`s4*Q_Qj_SN^#m#%rdjZ6%WKS|Zhu##{WIj0s;zEuu3hhPwQ7x?Ff1w-hcC7}Loql~ zS>x}i`i2vk;Y_WK3lFDqkdy~Ae;a+Dv&83PiEg`I97WY=&yu<37YKo|p4;SExY_Y< zb${!sSyORdfD}T@cd`u=00-TQ3+09Bg+W@VHXHg1Zom1t))!bz0_p6yz1*EB7L&{B ze7N}mZEZ+b*W=^G+0oDzFNaGIDht)N-?V}lKwufb?&lAoOVba0hl))afGT;H6O5x+ zvK@r;)h#y!-DlY#3_m6;HQqN=Paw-RRKW-3=nBfJjLU-Q7KOcMCdqzMgY_=X>w}cYY845ALJ;^fRwnd+oK~ zyVlz8wLX^!uqXzgargx*1q$Sg08wJ?A^as{L0amJE;f$rQzc9amIF$7En?g$ z-|U71AS=C@;=D|M4oUwr+~P2s{`SA%1~ri>|8vRs3vQ+|zW+Qu{RKCSvjlT`ia^W$ z+4M25XrF$9_N?Up18&<6g_uqMU3I~qO<&Srjb7DxOCv`)p6i8J`Ny$hj%fZ&)$cos zxmw?36JLKX)hm5e6~@zhUOMwlx-IHOsS^eQL_|z*UZn3_jl;HL`~BoE3w8GEs%zpk z2Mb6~X3`5UkwcUA2rThMf*DN3zl2jo_FMgL7OlSfjMOrNq< z=~Y&fr?>SFqe483zS=zh`%y+z2Y}kpP%=%4*e?#N*d&}E4w$aD)+sXyqNOBj&sW}l zyMtajsJ^*6oMw)Sib`Z{*8BLj&GM#yu-TL4YUer zB(b*cj`D<+Z<*;>gYL1a-w&%I7ARu~#TS79%3H&0+AlQ|e)8hM0lax&cr*)^HQjr$ zR_h23^&}Ef5lbSGwKQ8-9dl)##VbF=v!q;2p+@zRo;L@`ZGt!6L81BYD+?(B(%(#G zmh7%eW;XI;G<0agD+RAvKYT0bL`vx_mh{-LO$S-OhLlZOypIT~`&fLrzGYodE_M5} z=*`iu{M9#Qz8;U?{gkg8veV)n&i-uLifj3ad3_B3O=Dgqamv?DF1r}&ep;*K(}lP@ zB4j4Lg>Pa4zNx0&T`201_#73WQFGpZ39VzTK(thyk6wvNWi3?ZqOrQIs{n^+@U6 z1mivRb6tHmpF}y6U>@P=N3gZ?8LICE7jWCJ`>u2L%{*@N&O?pDv+jC-pTpfC4y*>ukd^oRwbE+c>q`4}U>nk(n)2oq~y-t0uMfdpvfSJ!iuf@#-Tua*BiD}PFqQ>z^X zOk^C%@x31Q&0xds`Zag`^@Xe`S}gH)^B_0pLj)MP(sQ;XlA``*Bm*-c5cz7w`U}NF zpJG4M4KwYKf3p3k5wZpaa3!#6=PN_Tf9my>%@lAFGgs2>kg|N%1roe>-!iWJ5%N-F zV(R+h+J;fKL)>RCGqZ~^+=IOFbwe~#&w463Ym+!hq%$vui_hi9e+Nk&HU^qm0D`k`c?hc>2q1E-|?!lC4zwncp{q<%~R6U zs&u*i0QO;G_0O9z8WPt!FQ4{Fl4qNrng-2THn2T?{NR2oc07%BIcL5L_O^B(Gyi%@ zpRciLe7;)lT3#EVWc=h+R9}xa!CmP=?QosMy72t zddY&e*pjup6!_iV4H6&5U->gW86c4%9c?z9UTG5iv&mP)1BK55M|}i)q&+37j4i}f zgeC&;p6QR~hKk|LtIXcY`O4WPP3!v9u~p4I_vDTZC}D1O-udKb@@gS#Ul8q2C_HO& zs!M7Dnw-~=;*HkSpN`3M#bz3_IPurm3AMFY`RCf_RDPs46uwENDL zl^Qq%&Hyk`_oZE{!=UKf%qEP+Sw4<)4?5R9*8+W+YBGlNlAZ+~0^-C_<8sVT=cY9! zh+}L9h_?H4EKp*sU*P%dk`wQlOce!Hs5lZTM%Ao-9d>I!wQzi0s($YFUCxylz*}of z_aa>UnO2SnNUpZ6&!Uj~K^^>{Y89~-T>EO_iKX(Ft2FlSt5KV7wclQH9CR;>f*yA8 zz}k|%7LU6^YVU?@<`KjBpDC$VUhy6@JOW@Jn5=qmXl#oA+yv$q=AU7JHhP7!#SPd8_KPRzT%>sF-R;w9|xYL z;UK^r4%kE7BLuEa1Q7O-aQwNSFGRvn726&8m>1%A{L@!hY9j_B96&`bk#iZ;ft0m_ z(?LFk(NllS425gaDUjiUo{9h@8(_|~P=&wy-~PL^+yBo1Q#VK)3j)ByEGpap2%Og4 z1cCI$f!OAo*rx*nWx@3JAMMi>!sgPf+o>J${6iTSDCt#lP2m4_atweZF#>Qg0{8(C zdPEiBD8hd(P0-ie9w`jLPKV|k9U)t=WEqL{-Qmjdc1+CJA}Gv6Smj_!h^a3xv(9wphth{69O z2BSZ2z&I9ZfgLv4+c|KFN<0ukN*h4Uw~Vk;=OzNcMsgGbX?XBwu42u5u>P+9Aw~uS z0Kp8%gTHK0MHmP7RZoNSyQ7fR!E-oo$>Mld5OzdFxS=0ORxn*75`nECTmH8=)dj`` zpg$(y06+w7_;Z+8l|g~FbBe=Q1$G!vh`1w}3c`S#lo_>zx$+PQ_CK6n|MPk71|)_N zO7IV)L9Jz%5lB0A9HIgy7%3|=IGu?cV^>%p8SzVcfDK(MkSIWeR|H}HH>3f;|7XXL zSbvZP%k{@1uVxS_A85gXlHN1ii_z|`j+Vt?%z-a2|Eptvl*7h|Aoycnp}&s7OgN*$ z%IZW=@@aD;GG$x}B3n*ao_x?8mnEe5J=3~5c1^juqVVw!U2FW zy`jROB+uRiSQkIc0>YD+nTL*`U0PL;%ToMR+}8)?5DWoMyqu!u=yl^six; z*UEwW;S#=e;N(kH!M;wM3vpIMG5uL1KxjL>46v!eg7NZ^FA4J4JZx8py z?)tl?|DEjrxO)B1nCb>8{g*a)^whivBmfHpmVhDP2t*(h1dCCQh5LpQ-ho<+jF`wp zK}4kByeN3<-?bS8sbFCF*L1l9AeNvOK_L*>AVzw)K8i^e3q}HELLKEG0*OigzRdi` z9*kjxLH}4s698dyhsOY9{D5E>Cli9XEeM;D-dziT<%dmuhn3t!3oaW$0-;AKA0x3M zK!Q=MW~?#gR;|9oxb#P<|GY5$&sJK*H2#l?e-DEIceoY` z(-RzWcV2+6YydV6zPr9j4gd!XVo|$7VL(Jc^}m61{f{aC!Xjqr!CZK9{`xnR1*19& z0l~(R5Yd7$cZA^)vIvSG0Id-49SJ6T2P9V5-4-13?6+xB5+kxaf?DPmYvl13H10xgQ1fhUMNi4;A1poU| z@gJ>1fN28vPZJ`TCg4Yy7JPxY6?yx%1}1 zb7`2s=-AP+M1O%NSX zWRkM3UeK(EX z43$65cBg;1d9vaD_zbF5TZ)2hara)NsnH1+siw2VzpDDfUVXiQ@zYLy#Y8QHuG*hQ zr^c7#@$0|QPx7;ldqIndqQ1xtz7YD+SMznL83FY7IoTeIzr!*1g(szt=XssqcmAC< zi?y|0Iuh-ud9sm)#tiYFrUfgg7>##we?_BRv|9ru4d7}|_>8)6RtH@&NwhyMAxU27 z@Yy&iKFmY}j|w1a9U{~CIGi0-+!ZBzKNxLhPzk;ZQ+#cTo>R9EaX(oaD>WWkWHD6@ zBpjo(`C&3Q&dFSpyk#_q>)Xwvr)@)L+LZzK z(z|ZudX^iIWOK+w=-iQsT;_;*dq;SD=>xDah0HM`V?0Ne_%$oD)#~kPzPKa(Nh*A` zmMk9r{q|`eTm|!7PPTAsHD9VQfjwAUic3^W;6}}F9dl<-)=PSfPi~R4=rRROfjN38 zM@uD%Mo9%@CYYp~H!wUwkhp1!24tMGC46<_!` zRu{cXvWUz!TN1xx4>_Vp0-!W=}9rZPQ7e5;^u$Jd`MmuwR#QQN){7#r|wynXp>Ui?BMC zw}my{By95%+;r+Q%X$8`&%*ane0|cxi59dr{YJQ>V$1fvoii@#%SYp0vfx&(>co){ z6V6t3u3bR9vsf7d*i8~&GI`y(TRcQ4pE1(H&$0gnc$FbInc{h~YpJ1zeHitH(I=-Q z{?_U>M{vUJ=@>SjK#$?HMMB<9W;DOSLphJISYOo-u zx9C<*8-UW8#5j*}Kmr~XE#rAo05sjaQwD6|s(~k$0DcW)S0H5zlP~aJU*dq$g=HqA z>(8&|gZ$q6PkRmRMdCPQyKu~@qc0{m?yQv+B&Z+K1tj+v{BoVZ@=d`aS(EjrVPz-7 z7kcH;M*HN);(DD2bD7RTd5Vla{41A7zc_uV9t4lIK8gg#8Mr+N=m(XLHNFKfmytGB zyVM1Vm{QLknH;!ww=upnx5%arAws{;@#leRYSZ&A`oy`3Z~RgtvUuuy>MbO_thWDV zG?Z>?BT2ze=RUa*X*WfUF#M(Hkcm+N%WZ>oQ{`tqr3(RE*UHlZh|EK)vbelK#o=u7 zmwp5*qyZDdum`CrF-%-KFE&=bvx->sDD88iWIE641td@Iur%brb=(U@Y>1SX`UzQ`T|#e|L5aRK32BbwAp0bZ}>`W-S*N7XE~G#5}l%-+ZG{EdKntd z*gElW9H*chWa{`z;GKZnA7|C*uXsClfV&8k%pgudZ{}OZxns4oi%ez-?O6O2UDYe5Q3~Tlaennp$}Tr`v^wP``%xd2Wlgghfgtg=Q@HVc5yj z%|Uvi_ihGt#40mZuwJ0oXnznEn(WZxkUrM&xG0@jRnIGJ&mBBKJ3*D^v+vHsQSE8 z?=gt^B^myHNqlyY7N=Pb?Tj5GQTIeVDnZsYvfMOwOlgO4wBEJiSeV$zPwb$)l5T9UrSDcy}C_@eSs zax`~m!<5z6)5V+syX>UBZ;jmv9KwFyZuTaA(YNYMTV0;xxAH_rF@LzxoG+zKyStL& z7F4FcW$8r@ImNq5yXI5**hv^ws;AKl?}^aI zxwV2XL=|5IM-;ghYsbdB4eT~iPm;Y*R!g)gdehx{mii*YxS~>@=VfH9dAniatVUqz zy;}8WIvxF*a&%TaANa`qj%c$YPxlRI)InJMQ33;aTP2p8q`}B%KKpF%2Ascr(x&sZ zTfPT@0-h4BwT52E^4sUussLwR5lDFr90h%~vS1Z^`0DBLV3;w>y@Lk%4!MyCm7_Fs zP)Vke{30yo@jeqf`kjXQ>zd9$cR0{!0U7AE5J7zxCm-ruJLoo;CIj+f7gGjdlE$9p z(f!&gK?n|6%$ywNcuvSIkA@y|trZ&m+G+X{O4N@C`r`F#*Z5JJUd3WtQG8=UwHCZ7ACga+!*2j<4=!s?hxc5Eek@)NUN+tQIz$jRpdgx8t#rSSLNpszsD`dO#eW~i zL^rH)XkPak{XR(+;kMIdAmY~zUtO&I!PY7-4I7#4@Wnh6>I+5F+%^G9%{O% z8TxhLg}y-%H>0n*G=HC@qi?q~n~7Bv9nXKDf3;YB=v~%C|Gatmd%va`Q)$)n_7sf< zTzUScLg45l3LhcBDG2;pkCPe%(G?OK|Afs=h8yh`;wj7k!cFCm+Z$&?f;?Dk6WMifyf8`6o0WR2Ekf?sVo2YCw_2|0D1iY zMfU*ZlmOM*0JZ4=jjI4H>cA%=fjatuy6%DcDS?KyfzPJ{UtR^8PzRZb1exmxS-J;V zrv$yO4YHjMdV3XQPaW(i66~xW?CKuuo)YX?8|*zD{QfE!K^@{J5)z;v6678dk`fYD z8xk=c5{14BiJ=aS6A4Yw4^46pO-Tt&s}0SV4$Zm>&7ls<6A3HO4-4qRf+MjW*n`Tb zK@VcU+V-G|?yv{E;o1NkJruTS4nzqCHXRN}>W4G)LOhSc;W6Mc-0-pxoX;s?AG@)J zy0MBxBK;weB_TLU7nU~L$<-yKJ3I8q6TwTg>_3W;2t4xggNRzie707U5_!u1f5 zda$VGtBAprFkyJ)?UvhK7q%aa)y*FA9>!{l#J)R>#bpBIvd88gj^WC|qRqjc&6gx8 zk-UqHVQs_aEykvq!4i&%fnLX4aRmHwkMrR85Q4&S9CmRl$8ki0*hJ&6tYQT{;>ppW z@tk$>_h`UQ_CTj2O=c=%+!V)Cs|2~8c-0cOyD*3(LLNI7r{CA;u|Z<46;QP15f=)g zJCj&!h4Ydosenq$%pl3qBgr~7>2+O_?M%|!>m+-cWJl3tXMy#Lp)Hu=91cTHhkJOaZ)U>+PjG5G|>(m^Y zv^>$Y0)w<7kF<}eX`kxS%4X8OT&I=Oq*scjR~e*Nd!*N@$OG414t|HT!2>_U#PjVP-Y}V`s4(9K#&2XAW*! z4t{+OboQU@RZ_8Ba>HCo&s^%XT-y3v`q^B@pSeu5c`Raitp8%Ka@FT?&*nY&na4|; z&o7oQ_T>An^Tg{5 zjOvTL>OZE}f9k8nuc-fWQy<$GoyCh=ZuFzt>ql++kNO`!8s>g9-TWvO2SmI9MLurG z1T=KNsjDol?U`#BylEK5P*=qp$NPS?K5no@G}_uXOoTU#i(qG=VYqfo;5DNr40Ux2 zLtXvRgrTk;V5qBf%^2$H8HT#*)r_I8{``x&+Ki#D0_c(0YE3|sCd?~lU3)xW0}`6i zq}dG)hqXk)TI|ZBy?yb*=8&`vEg0%5<82EQeJh5#%F2xdc_VSvkZcXD2fG1zC}Q3{ z;zL;5gchE@4b`_kFn2?n#C)67Z5xKVDofuA;s!&wLBL^LvmB&cL#z5#>jbRhP>b-X zMB5<};zrUW*59VhM2JJuYFbVJEXSqo$6w-wRl=I}hh?!x+JXJxS|*q-tV?09Q)&-n z%nMtm19AE`B_oJRVaOjX;1nj95q-1!5rHup+73jt%I9>e_P6i-=nS{*`qdXeXOI6o zhe+52NNoZn0)VKGh@O^#6)z}4cfpeL9f^A_rnZFUw@sEN`17#7QzO_XlcpEE_&5&T zX7CKNlY6rtdp$OK)8BsCqNzhggTL|z7>?Hx1wuLltg9D%U zzgL5em9-xkbtB>3KmhbK9Q1O&mnj1rmeGW73sO2Fn1Xdb-fKeIc2D#-tBGKz?Ga?& z_6QGSQ6B*Wo)f-iQZdD9s+wzCy$>#fc81yZ?bCI>dfr@CKC+n(?&Sr@kdM09Hc{|2 zW5@QPA46W2^&bNU0-*zIM%`d^?hv}H#S{)!acWwn1Ka0}ZQgXPcsB{YfC(=&&9Q)E zc>y!L%^3jRjpwZiw*zKc?a{n|2}EmL|Ih+c!=um5YSuvDeh>5Z(@bu#Kn5WtH)RR5 zo#R)_*NBn5(h*0(W^C=LmJK|yTX63Yo|1agJHloL$?@A8&}K|O1O1p8tc$;KdRVJJ zk{2*MJZ`*zH01@j!zb2^a9r)dO%VjqpPOXWn_?wrj*K|e?eOfloBbQx^oJ*i)JA|N zgzM?Z*A26YKFy||dv*|5SRhcMNgHiBmM)-e2KA13Ve;6Pz)Awp!8D~XJi76?$7`>n zq95#mf&yg-IB%QW(K!Sll0Iu*{1UQ0Js#MmJrU4%+6<11;(<*bO)%j+VeJM2)FP@V8>vF}F4z-cG7u5c;|)Ov5%dETZ`bH0iU=nT`9kyg|1DB!Mc~tzi4EtnWUWDerg=hcZf1g_q+29mXBtun#=o_hits z%n`ALg-tq8Cc`+e93O}x#5Ntv`8=c>vs|$Uc9sCN@Qzypi1x}L!}bI<5`X}^_67;q zkV(@i!v+veur@c6S-#@Mi&_(3T;~DPMlQbKfpvJ}>6)PS8i&?y7R;iWJaQJByeIYs zmRuwjiP4M`6Ag2};lp>e@PINzItVOU7_PwHmT7DoQv?JQOZ5Eh=;(_keZ*WDeV=pA zBG7@z`gfDZ5ei7s_sSl&c7yv-17-!C{_?()dH|2HvB@?Dul7aL$cxdv8<5Len34Am zPVUYc9faWp($;=r2njCphDkTIEI)60i6WF5Tpfl%ah3@a2nUy?09@(^Ak!uVhJFbR zXp2^p?a_XP#5zvys5R3ncJ5lFdedCx;gQ#jdwG-h-ptN}86XznhDK99=KJElec2k0 z!#?^!C-(Bvz`***?MH!=7etlu93@?KbcxL8XEKW5x5w{5y@+&r8c!tuR6 z|8W#MF#hfVjDl$03`tLPrz`sagsa(UTaLHae^e@c`DJNEjc~OcK~$kO#`Ci>Y1iqEUxur5BKv z^#ppTIU2I_d8mw+XjKauX#$pg2$p?^$9e~^8Fp$0+jZ2ubbYw0ra`{tKIMX4E@=}yGKRqk(*S?#HHAx#9`|1s{E0PC8I-z;G(Vqmg zU2IQ%x~Y*R>GK6T2LaTTi5yphKoKjYm0p#3FNCrKld~*=DT0%hmL>O6#KO>ro4=QG{EtMjen=oBb0CH}H$XjQf40y}6zk7^|fQrUPEcP~oTq&v#WD>JJfCE&eq zcPsLL*=F0Pk|CKmSZg+-#L?(H<|gRQ1+_)w#i`nE!9n*^`h)yPG?ch{@5yA}V|98Z zi=CgerW#rO<76kgeLSNgh=pg-Q{gV*^1K2)|3JA#1}R}$gr!YawF-HvL}z5890P+E zyBPRe2YuS{P7y71U`2~V*=l}JH@C&6icMIoB1TP6A>zjX9u>}WGLf=ZF)~o(v-a4; zvEKz%cFVau<|1;BTXlKrB=4g?@G@%%Ps^5mQ|NsMQeDb`$}{Oc&qoM3Emw;ONJ_xg zD7eOwsgIZ>=oDHs%EBm>o>0b1Kx4hEPW}fOs@!GM zRUN5_WCEn{!=O|l7vh2pU~1c#HqJeH0o}E7mKVH%LX(y;D3@-d89bQX7xtj=lvRqi z-$FQ#P2x)N8kYB*R?wp+x6*UJPIS?7HlIPucGzS@(B{PZD7 zU+Vtr`80ZJ_0#}nNdt7H9QctRp1n>V>99NHn2BR(T`2P#wu~MQpnfdnVkA*@XcnFD zWGa~@kl{p6TYyMh5S=vw#I>%HfIR|^YhrZ* zFeu?K)sgwP`%+|hks0ecM`f$?vOf<2J?W^Z6edClS78;(2ww;!QCnO3&y6vHbD){Z zkSO1k(M#bx+M-WNCGrYArd;uy-$gj^FJ*U>RerW4UxA;djz%up*ToOI`<7GS(P^Y4 zrVzH8!z>=ZMk^4Rk~t?8`thl>0jfgvO=$}JkG9Jm-|_TE?sGt0Bu{#Q19T~uVPl)M1Cs6w}^LgmXqODxeJHn5XM$j z(CL52D|k}coRvggyaamZUYb(>pj8LN9ilHZuJx31UZderi~L=!nHOS0?d%=O{SB^_ z$%n&1bm>>R3W}!2HKX#G17qptnq7{CTw3b&MC;iPK% z5(aUHpvPz&#B@1QWaK0V%+z@S57T)@2qD)`A033XkXis0C%EXy-Vts%?K_83F-ZW# zDxCl%RaP}e_u77NU$GMsq18Xcj#PL1$&kGvM>Xd)rusNEI!@8$Q(qjavR~6YUB{)&f}!MTzNe8# zNDq8SYuDhiUNyPgkAl&Z==ufjq`=DeuR~5YmXGFU)R^NqS%mG_uk&eNk_dg1BndIU zKR2h*f8?=pW#^bYH_ubSPA~i;Rn? zE_!+fHDlTEs48hL{w2r9&o$mX+|il#VS4n2#>zw4c?hy_w+0p`n`j|y68Y$^v?UIu z>u*YMicb+HF4XomO)gXWan0t-61k#>w~k~XKjc@0AfCexV?k5X%Y=NDcnll&&m0M+ zm|j`;x2F<)PS9J}Ic!|ORs8JoWb?+%7T`7AA%z+8g*_`Jui1$v*NPv$`|pCiX0A!y z>ZcYC+`7CL&zszuE`9dwj=WGHY4>UlrMtmHxXTpHSKo{mj-#o*dOiE?(y6z2lHBFJ zA=K`0Nl6dra0yg&8Q-l{}O7nw?s_sOj=KaCzsI4nUV* z(k=Yjdm-(;LWNd(<#0YeKuEs+Xz6+=`2E@ax86H?OFva)n$DUtAIRG%-7G;qTy;qQ z{{4LEc2ntthQzY#NxFnQL?%IYR{F!wsiog=J(-{9&FB>?^lwS^sDslc^j##jAQFfJ z|NRsRYN)U17R6~NEGF}ZY)O^)BMI7(PzgAA4M{X!bM6Hv+@tc3@k990Uz4?v>$Ff5 zNE17^P!$NGU$xMXe33wc;}OyX87&NJEsPS6sBv1Eh)`4$%QR(9vs zAhK4@gw`>v7LI~YEMyD^s@%wglcB2hAx;}FH1Zy68$UTU4S8Fn7H&{0HrfwfCK%8r zk|3AL+a^{ecZXS4Cq2RhQ4S*YAF9PpxFHp>Ol^_hm1$uDJML~%N_0@}n`JD%W#bB(uQmB*(m2j^TzJj3}&*%Io6OWT0_ zLS~qq!5gjIAM?VV`CueeR}fdO0go~k9&8A{uJB_c@33_4WEAYMPEgE;w;dRg=*j}I zn4x@d>_>QDVP&8=7Bo7vSh_s2kvE&p3@D)$gsZC5WTIqHLV)6=Kez^Kn*kN>;S%D3 zYx;n?aneDvBHXNXR)XFBYArT8-GO_d5(!njGvUf-DI@T2ZlmF7(H2UGC`8y1&yK!O znm+X2%Tzy7bC=oHZm6d#jy_uF;>fL;I3nb*L@)@TenbGuxwf~88 zH*NS|SH(yeU$$y)sy$F)rZY+FTMMcn=6T_xRmS2n+>iH#3H_w+A2HWnVQNDSjLkQ- z>I{grtF%`|ULt|w*CCi!;!nibI#3`p_h{j6e;z#ldGBbntQv`MNR0E9qAU|`MMe4L zaoh{#R&5q#r~_Mm1@?;Uz;3%nn9;yKYui`WlBg@1Sd^<8D|hDGzYs^LBB@>nl{=$h{n-cTpq-tXl<+N%s?sg4g0sn;K|(QrTG#1 z=A!~b8eckG{<&cRmNf{t9kCt|`m;Aw0T<~jfs2L?lPQeQG7nSuv`kiY3gAf>f5TR{ zzXLVxB<~oZCuE>p*9M;r3ehOzE9I-q@XC<%jPeVOsjQ9)er`hFA(S)mlI~Us5l9>pcs3@sFI@>x z(15Dn&m5EL&=v=cPo9nnIzJ8adn$E4CJ!3EB^X!yE+!0W!>SEX$<)!z(J6j1uJ%h) z(Pdm?{gFH`w|K)ng7SNm!vF#kEFA{Km(y`wmkGVVXBm0KPn_>PZ46BbpLjko@nU`A zglNJ_}mM)W4fs@vWlQxBuufI>e>6o;gn6z7;e0x6m z4m4#?G3CHE{24>F|!}h>7XQ_35bd>1fbQ48=?= z+f1C$OuWKO!n2t~ioZyBGufco9E#aow%I(P z*?fiBf@iaZ7PCbzv&Dh49}{Ow3THokpDpc}Et{DAygvKoeD*77uAE}7f^Du+XzrWB zT-CF=?-p~_E^{@3bG3( zJ1piqUFN$2=erZ&iB$Pxv1{i|dkZW0Qw2!&sb zBIraxCsBkOD547#F?bn9xlF>oOe(xgrnpS5yG&uZOzFBz6|_v9v`ka9Ok2H7*SSnT zxy-P!%y_YU2fV^Wxx&o8!XmtKS8;_^cZJPzh23?9BWQ&)Y2{wg3Rm^Y{mvEc$rYZB zl?N9q55cRvl&gH~tNg;N0*b3>LETj$%T;05)ki_AB1x;FMXO@ftKyxj5|gWv8>>&D;>6Uq%! z_6;-PjaP~r=DHgemK&C?8&*LZ)=3*SMH{cHH{Nt^*iLTPZEU=~*mwutw5Qy3VBd5U z-gHvjbk^N;vD|cZ-E<4ubWhs!DBAR_-t_9+^q$=G+1Px4vH1bKg`nK>W#94>-tt%6 z3eepOwA>1E-3kuc3Q5{RhZb#xRd0oNZbeLPMQ&_GU2H{zw__-`W7)Ukgty}rw-a=? z6D_xsT(^^hwo{U}Q;W9Ks<+cSw=*WUGdH%gF1EA5J2{j)x$HZ6!aMnjI|aHsg_b)- zt~ufuY$({-;aXsAF7^v_GA+KU1_n zi^*Ejxj#R-zp$~7UcA^}0w16#50=>vR)h~$6%W>Q57sRYHe3%jgATTm4z`O9cB&6{ zI}i3I5B4_>4lWK3!G}kbhsW%PC&GuPiic;qhv$}u7p{kwL5EjKhu1}iKdTRKIuCCr z4}WbO{=PUwgO31IM_3$3*pH5YN=G<)MRV4OoH#3L43L)#ofUSU7=J% z#}r?W>4qT8=wPy?P;xy7RyTY$y<^H6$XyPH^zP$(&3G^>M>?x8&O0aBCc!?n$5_0_ z#KaB-_KxWLcL1*X4(x|`MDHBD0~{TMo_ue2?K1daKg{dnan8V3Ez!N1Dg?zMfiPmQ5v*>f{>{G)jJZ?RQ`$I0W9BzdG z7l~p=-kMWG;*$?Yu2ROwlF@FWn>^ zq4Fg?>x*wF`miZ$$N^YxtZgDc;my|}d7TfJk?rOOwW?p|B2(o^dZ#TR!k-Q$<= z?3Y{}HZkRD&OW4^Jgx~1X~xTv4xIZt}$DXHgd z@YSpS(mlDx>!t2Z;~jvao`?FKpQOdtq??|t#AmP2H!f(0PECBFO}7j!CssYLh&$d$ zjx zUg-XsP?z$n`K4>muJxwqi>cs?aOvx8G!+t}O93ZJd(Z0XL0WVTzzrqfpr z*Dy^7eJXF#>@#2Ku;HbjBgsCQDHlV*XRXQZ%vL8;UvD*{eawwr?1vnle7z8y`h5Ti z!P>f5CrcSxLVs6JI4|`H(eazAsLHo#Y50k^I8Rr4SpjY|UXKmUT9qu$3*{@(#n4kz8)dx-+3sRpX41^iibX58yntR6#du zGP}Bj3zW8`i`KOkavyP+Hu64lI@r4w*c#4Lihp4DQ*b9Xm^p7i?f8pkyAN71V=u<` z$t)>D@m{^X{TfzOjjP3Tnw3^>C%0g`2kz#_bMi6x>%hM@oDIUvX8}^qkNm?!q5fzf=(T=U^Q3SJ3O0YRH(-LXy`{UT1^zVY%{f@yiOzhR0?TP zoFx~3TumWn+cSM9R)N-oHBN=Ajy0a*SJ!IHBO=@-U&)=Z92qr>?qw$`VTxs?-xp^E z3EBjbRO8S0^f}`Lt?>h5(x1~<47v68I6qfs3nI5NL8e+im!Mid)yrUEt9c%yHZ#2$ zhSRHiH|04=RfaA|wk|K-yQSDHKGXB(y^pzJVz1+Eg*k?bPE>Hx<&JvRI9`|;;3d6f zkTQRhGBBc;@Wg@#mr^dtk%Cek*du0ZFttF#BEwGe_T?dzRAsR2BTySlsF zYxLrpvb3KQD-FV5Be>p!Ce=%bl(`y?d&M6%p3go`lhF4}TWtL0+4;2@i$H?61w`j< zZye2!$JqhegTl!BSnGvZ1791R*DYT+bGU@#Yliseyy=H&l>gw$|9K?- zS3w_p9Q^;YppU%So3uX(y12W0mfJ&~@@v##5_HK&GP3DHG5JS&;&Em21V6^z<#-!} zTkUM)V9_c)1t&zVaHo)^lR50*ynec>m>>{Jgp;ac(;K0IN#ue_UGY~zpVtakO6kJE zFB&~Rd&H<{6zh067kL^e43AghK^v$ENsB5TO>3}YGXfFf8$gNDod|A zQ2OX}_;Q{gHQ%(x9*>_qe18J*MGC?{Ql$6x1^cuig_?NI*Zy9}E|;)~VOd+t7^@t4 z{kKicC<#%oCQj#fGOGd%(vm;Z4pck4O&=F-dv8W1~>s1*px6{hze73!LY;}D%GSskda;=E-{q$1_u#&5?9l36dvQI(LL zcoj;_23b>4|Gu^wgD>j75XB)i$?Bt}cyB#HNB7>yos}!LRXH_Ipen^v%4Ic6Y(Bx4 z-by^yY;qks4rcGI>Wc|@={0ax;ri}%Pr@E|vS-F=@Ef3fm04KXQ-LWoWJ&J{0Yw?9 zzf6fZHKnQw-?OsMkY^))Rg-6v*lj<_V5XRQZcd1Qwwm*fQuRq}NglfQbs=?0YEEM9 z#;4sc4H|4&N!XSmF~{p(JwUvOj+?U#rVOiq>*zkhd8O;J{8uzL zQ#me!n2InXY{H5&D~}br3gV`>8^5j~EKSp3^7o?iknl*S`Go_p;?DfLz$&r3G&F9qh8_oz z_7VB?dMDDBb?dGlZ933{z#<8j7?)9hz1N2Ml)}%Lt=B3P)tn!ZmtG(Ejl3H23@B3G z&+H0(YSLOz&2~@qb3e@|5){Wb4yjGM0A9t2T*zth7d(w!DX>$xa8oRiU2J$<5MZXM z+V#sfXFf+o6$0*T-sG8#o|u|`KSCpH{`@r(E6<)gVYPfsu)+<_tv3wdj$ok+k&`zm zyCeZp%JnFHc{T~t*thRPKi&Ui&pI%!oZO_-KgSDl-hG|lll2T;t>)RIesYstew5Vn zhB8R{AvWGaf>9L-Uw#5?3v(I1g2%lxVe%X}chkB0F>D=t(QprqzVkbGU4|&DR zyV*UORDV|ZNHjh|;yljy%qmN`mo%&>7WCqx(|sDA;1j@+CNpRmx8tB#lQ+fAj?{XV zY}8s^0Rs`US6D)3-!+6N%UygHQRXRkD$o%e*`RsoD=XmO?*)G6 zgcXA~-C?pNqw8Pe>h?Sz7}0BNRb`R%uB^Z8XpO*E(PH^NuXy=s)}C@OpXGdPts(qL zO4?<^*7|b>H;!E6n2sQ?cs9+Mwc%NzJ{CDUCQ?Z!ofq6L(ji<~Bo_CWs;gSdD!p|z ziz(EM1SzD>66Y>ndZ=b~PVv;mmSeZQ9>R#NdCIWzn@n)0Q0I4GELz)Y_B zrIP?N@yb)B_oVDWf-YQ2`;2dYcT51UWHmkkj1vK1=Z6ov{dl1FEW+yDHBg~k414Ud z)xpVSp!NB2)#Z~^Esb}PY0o(DX#}RoIy}vabDVhE)Qf4yXW2u(Q?!wr_N9udQ6uE~ z^=3d+t4tDLRPeRHP~+RnwpU_tWg}0&r13sUyKhmf9nc!;xaIN&cu)T`p1HJl9ASgF zHtjnradWe5qgt;1*O~mHfU>Y^W_mLM5k-P|aT?AaZ_!X456QDy{yd3wc_X`D-KCF| z!ylnaKRFk<4W4G@n>S`sn%_SI8ehF;AC&g-E6(d>%zm#}{ELux@^|>S1_ducMo4GX zZ_XF!SQiTnWx+a&YaTD2xDF*hp_lwQ{`E%~C8qi-^@?_z!>Q%b(_*l?nR zzOlAH71z;%el@?%+FPb#{rbdeYvtNJ_{78Jzm?p?$A7y>39kSI&qvjS$T=aCT&&rUT`VWtDNUFc*IPjk5 zhq-zF5rH+67=EELX}Cp{C=>sHEbWX&J{hM2wy>Hzi*=~YLOEynj={&fHcKL*e%AgH z^R9s$CRDeiPvQn__y_%gk?2J|rEzm3H&eVmh6S@b{nDh#Sp16E_Af;qRk&C!jf}uvz@(fqptVO`w=CxTB zwr>nMsrJAf!uQcLf^cOUsvj=}I7FV%64ODIIh&3!O^yiOlNfgF@tAr@T>c~{o{6V8 zLJ8a8El?Tfz=hbcH3+vgCJ;E|a?u2eT)}Li^&AvU@6EA>BPL1gt6qr@vQt(B2|Bl! zwoEf@kP7u5B8QL3k?G;46?h8>L5fUie0?G6D2t6*zS$mH*H?m<3yMz>4qR^P#mZ6{ zA`}m9H`oqsA|0Ebd=!Y}+>Y}-_xm*TYDO;-LQN^cZXD(onRbz))$W!J$T;=V+zq_z zE>GB881!-O8fanmhmv@cxZ{0R95YMR4yNxFW5(KWkCDIY91ORKB4+Akl1#UKRgoe_ znfhlWI?5zy+YQM{>=$b5O=+X6%{%8sZii#n+-nl3LKZ^(&yi>sG77t1w;*K_^+WqT zODYKrg<3(S8B6$%qMdR?rkp@#^?!^+KMQ`kyqk58+&QZ>tXYM%bn*YIBhk?%N^-D3 z1k|Vj>TL?sPJ})NKp&q1U=H8Al3ob~(}$Na5o1LkVk;Mv>YJ5DAC}qjLyZB@XC&X? z5IY)$sgj84jetJvDbpi%@VY9CHig-mLLrG*(FHj6w_M~(hh<8jif8h$(5o_Sc%TOW z`dsBHX<*;Q6_ zR05#S&M;=NA*PZk%=rpthCr9mkat{_q2QQiKyrgAAp4Y=@sr!2v6FnrQ_$Eb)9N+c z@*V*6xymiNs=Uuwof?g)i$H4zVLIEv8U>eHy~DaWNvL)Kj^#S0 z_6BraRec~D81jdD9W=Hr)dQf<``gR?yk{Wdx@45}KllOj8bBW>;@GRjUNY6a_#ZwH$Gy>MAaHv|PheHP*Z=*kMZ*YN|>! zsU`tb7hQl>iXrE{ehq*=-QKl)Rkhlk6{+YJ?xdRMMsO84mOct*2*Nf*RA>i5v+Aqt zmQq!NDil$#GtjNTNOa(3J#kf2JxzP49q=eySTX7|x#5N#4Lbaw`~2kmY89Gl?b>Eg z-Y+dVz(}-Ol$lzMEpA&VE;fdgl1d^}m9{-W3tFj0p3&I}j6};sG$AEhAcxqNAnZWg zr~JOnYN$>fvrf0$FWpmrG@mDCUn<#Rx}w)X5YrA#7feq%7*jU6Nx&fAE&@rYDQEC4{COHPxdlfT>1XckDxsV^mQZ zL#{bhqu%)z{=AQEgt7>PDw>dwQ( zem({Hga^{w=v?)Ar*l+MjSIc^l}vf8Sw{N3jsv;hGQ`XfoPy}C_Zu`oCFouo%JorZ_oC{d!1ZqE^C4pG zuI2Ma?^_VI-Pb{d2B;Yb+q(cW{P}R2L*|+N+smrAkoBSTn_)onDUu#3c|HPYJ{375 zKnNwE`PANw)YFXunosld(H6f^K=bM70yLjdK=bLL8|#xE>wi8r;5RmuGX`irV=H45 zH)DY2Gb26z;rTeA`7Gp&FLjLrn$POZ_&VJLp!sY)pV;x605qS2El`S^4Ln$J9-`Jm_*g6}T? znoqd@LS*g&p!vjpT8RI(0BAnR_ZL%)7Xi&DBX=>YdlArl@_sEA&@Ta+Pl@qTng0@? z`JlT2&1VVFeCp|!8}Baznoo=Wa$D{)p!sxtT7L6u8PI(C?yvM4uK=3QQ0~e|_X?o- zO#E7zqW?5=|I-KKPjmjC7IHr=b$?p<^a;RBKCRQQe!joDWxTrMzq*&ZdeFW4_0#J2 zU#o}oYd`O=ofxm3`LA8%u3dGn-F#a6{c8=xunv}4hnlQo1*~J|t>gX$eF%TA!x=V6 zWH!i5HYfr%sPZ;w-fYmVZZQ1bU}X5rEc2Pw^D}G;%4`ao zY>EbKisx-gzS)#s{iFHFF>F1M*-|jsQViHq&f8Lbvju2An!mTS7`6e;N5^FQS-`e_ z-nQYJ?dPl8faYV$uwyQ>186>00XsH%JAmfnu)5>)dk4^bTxE8{{ct=3cGKl{i`8v> zoQAm$cTu%qe}<7D!o3i}k+9p}yAi*Kqxkk>zVAl;-b*yuOEwvfGuaRK+t1J(0zeeY90HmTc0Qo_90HmT z;Vq!~908gS*$Y7PIRZ2vnzw-Fa|CEUjCTOd=O>`~umu8|&rd+};aLMTpFced!CP5C z^En1IAMt!Z^En1IADLS~^Em-DAB7huih(D}`6sGxPt?~=G;dF|?wmf6J=J+}`YiBN zKmXM5?dkKiQrJ8vS$`A&a48@Z1T_S-kv$EojKi}A?}>J%AUKwIQI-Z_sT!_ zd3)~nub@xhCkMnuWd22%Y>opXJnqK@`FulfTs>t#W$J(uIRS>~o#Im*|?lQ*-EGqZ2+5zN&6TE0!smL>cVe*Kz= zaN|zq=IyV2=S=fN*o+pwgX!<=Nu1rO-=Ce~JF=iP)c+aui53vj8bd{qHi-9UXm2V4 zIq3mFPCAgoe;3H%&wK*p@c(lpT0Kj|5g3Uk-BAc8e;;Y~Zr@1W01|PakfpQ#q)a1M zCX7b+KnJZ`WAZ*rWTRjBZ9i|aa{XeDso{SEeU|bauuAZD+`gN<@&EN3lTQB+=(GGY zJe}O($BZ{rYonYV1{{VgT zcDk3(e{B8-=#$Y|!(ILt^dSlifZaA-{{!?PqB`~o%9#Bp=)UP7b{~|;27xW?c zz)$#WW_YTf_AlsD{8R&<*N+9E{0HkxkE zF=^RqjMTurx9YN1+G^s9`Go0(|M|yrlfc{4^cQ}*pf=Nx{}4z1=Wv++Z63@2>VyCJ ztMozPpeBqz5W>HyCUh6dw5^ho6n_)m|65jyZBm4&LzS{?-#`t~@ZU(>e`KZH%~DWl zEEI{9_?wji1Rzr&*P|or2lF0DW>BnTy0WrI@Fo2-D+T+lDGOVwX@cy6N$OqY*Niwu zOP^&d>;(BnT3t40q8AXg^bVd?!SsJs6S4*y7NfJTBCm0l30F3FoLB6Vv2Mm=8pHWU zm(FS(R0ahf_y3VQG=vY*ttJET-EYtl4~D_C<_vNM%T24Z(4TN=kTW9Rqjth_{Eyth z_(I6(XxAm?_0z|=qI^^0-&YDk5^le<1Pi(B?afvx)n!n9i)y=Xk7u%y)?{n*7_a1b zTD!OjwG#m<;_B3KNY(cK_G(ZzXx)BPMTeJ1{daN$$SXOo}rAFT!4Qw>fRZCjY% zc$jcPInOKe%yv8VIc8;In!e}$cDiXe=S~I?fV`7wQwC&OJGAWYWFrPRcXQn5Y6lHuPRmtmwgBaiSvEeo4wRyZzD(D>SFFvVLE%vIrf^ zfj}d|mdX}X!5PM_sukd4ukv&-%k`L-uBoA{DWqjS*;iZf4*R&GMU##XrG?WY0^`nidl2`v_D|Ee7TpM= zdnedq*qD6eXC!lj^>NbOsS*#^O6^Ge*MrAFnmfFa`@8q%eezA2)6g_qpC7I@=^Zoo z^^{kBHFew65K<-1x>GGj*?GC9Rxw);1s$i7d!YO^JY0BrkIQhII;%G4({G6s@v z5yJ!p>urIhxdsR&&WviX7I7prt61mIE3sAB-r1a0nacyAVDS5E8jb|Z{27U0gyYxL zDg?{T7HlL`n3SdDx%s1uQ>BRBXj$j$MdcOD%&;-794wryS*(QzL39L2CE8SJp{S&A zcUPCDE0aOK^4mBkf|95+Ay$$mF%%JE)H@hzLubaBq!bCsg;HC*O^ib0c#I2Qkyx?w zD%S^1-DAdjt+=+@%KXzi`B4JP6pf2*VydFUqu1>GavBq;7HB-0`_NPJj-Ya=T{99V6dc~01zy%$0Am`3BVsS@kqkJk+_n2}1#Ke&N z=NtQ)pOEVH%`^^(tXl&y?eGGJ5-K&Vh>z6-SDQ;JZsWm+4MJ?CFlB|g?WqyH8j<>LO|&sB zp_sVF*n%QWw3#$brTj7Gsz2HmF1|er=wJD!(9bm|Ci70n{v)S@?uS?lmEWWT?O3qGq~_7H69W=cbNqdIqnh5>Gkvs6*Fo@<`}8l@<$JXECBEU( z+zri3+XO9(1V0gV4~3eg|9Wc1Kxy%&S3GDGtH+{JQ3r;8YHU!H9D<=Q$F<<;so-Lc zX5{r<4sSp`d-E%~U(*83%!Fh~dY$I1WJY>#`mF4G^St*mt)^$&T;dO7jsWxTbso{v zh)a#bVA`8??8j|=loN;HQa2m$gtmTm&7)|eo6l5}Z3AKxNAbQln~X&5LrR)Ile2HO z^luM7lt1Vb)~;z{E7Ew(rMqPlpTYWukvc~%i5c;#Z)*qiR(UcB%wrZ+qW_>%rRzxr zyohP1_|W!_GRh?JTY!a`;h4%c`uAKSwqKwQEb1dm6Y~?_(40fn4h?fYzA~D!RlFeI z>JGkSUBc4f7pxNt$2NFPoSDOJ=k10eZ-}F#O5TcTv)4xM^kwZe-(dWJwWs346bhZnpI_%zTtOyf}Is4$kb}hkcfs zRP7hqSnA-v^?yAYd7MIT@?P!kS$F1_98Pd+tQ$ciSBFdnld8^-V+ldGaSxwk`l>g# zwN+ieei}n&d7>AbEO2l&hPJI<4jLUXzqmNan8>L#GX8Q=byiNX;5mqry4Noi&nk_3 z^g_1&0m>AgzTWEMuCBr{1w)8)v~4Z%E?Lu5G%Wkap)XRVc-F!geUD8Gcf)U}em z(+Al_*)Nz9WRyK|!64L5<9n7Kn#rzy(n`$g9*7k#tZof2dhbI|r@Ct&K^~yE>zIjy zj=i|CUT!f*mAb>_!~F-5-r5wAFm0t7a`p8JRS~S{%{F2ceQ}Y6C^At6u>lb)y=P&H zcLN_j^0J6}WTTedq_*)SGD29V%~cb(Ft&L6!4G%vQHqtMJBp42&Ykk`XQ-6+M&O%4 z&4via^a?xoRBP{P-aEpQC$kbWArJS4p0zxJmuf$6<{+OxPsk=q_S)7JxHZs%eGD$P zqTb>NeKj91yssgw?>VUxM;E5$^H5gjB#uWUr8->uIaR2MxDKr?ToR!pKOfV09H@z@ z>#fXf(C$ka5<~(M^W$%J=|Gj=wQ@3CGY;}tLH+J<-&r4O$o;5$zh_}M{N==V)mO*K7~ib1*ve$ z1x*?%6g$e$@iOTmUB%%U*DEsOF`EcC3bEqFn787fZtLfWVxvzaPvqpOncSZ%Kn;>p zjWvfYz3v(WsrYm6=QLqI7i+Uv414x)&+ds{e6~01s3nW>MLfo9L$%vQ9-R;BUpZ1P zGT_if;vuUS9%WM3me~oy@LOH0w?d|`C5SoUD(7MNPnskL2$HDzp7zb8wNv(gT>|bOIA%!;T?ijfrU1{ zszhaiaOwgZ?pe6L(6Ev2j%f3taaEt~ds18Zc3TBI+xx@0QJ!|Aw@Srzp)p-UG7`bb z1xZ|LeZY^+cA42%=p6cWR zah%zUs4Iqi^mNQ}uWI2U{>cW{#$=^f_cfCU_a4gf;D|f$giqquu#nVexlltPhLODKhD727zp!>>Uv2>(OxHy%c#scJCP(uYF7}NtUo#I5jbOQ%9Ag8eA=+ zhUB77-X$+7N`I~gN86Y9rL`0Nbk5yr??*``3e(L3L7qlmJZXqopT`u`MKJXK)O&eO zF}a@NVia=STT8>#I`A=BQ6PhXSU(W^73ov@Z8C1<-a{C3wDHm3}-+ zByRU<_=iSYMiswoIm9OpsqBU;IK32o za~cX3o=ur%hiA@Wv-DZ?N}$`Mm|4j8Nz*MyK<$85fg;IwaCi!(2wkLP zqiI1|d6ry|d(d^Ox~G7wmZOJqte=;uSZHGTe$3UbB)!WEjHMz{fi?;=^#x_>wfX?* zP!D1ePmB~b=Twt(dFl=X-ddR4T|;tVs>o;MIWD2r3_g1JUwdXlf=z`#4m_iszv6~JYG8u%~;*0*J(qtSxkOv8MK+; zM{c~j)lGq+V?XUL^u8^j$Bf}9tl_h#D3sWc6MlHhO&)2jR>qlM`m=usgnM!Q04xrQ zhM7`d5TlU%@tx`#Wh~?#@f<9@OIpw2o&>2qV&tXV1trPR#ck$1kwfp(i*p1+-SV(` z+V36NclBlBVze@pzNd7FF*qkCrV>+nudI|~_@pq=$~iLVnnz0j~a(*soKf$Uy7;efcHr);v|y|j=WN4Z+I*laoi@=plo(4NC^a6G?fX7MD%kx&T8Yk+_d)|1O^tr>_igzbb~Zp}OkeS9>u!>d)t^w- ze;&Le@WSw#WOz&yy!V!Ui`PM{0~2E$Vm4lBKTPpy=mSMF6>%pH8!@)Sy$QHI$NR|( zhY@}pMa~{xe=YER0*x)6$>=XyfvLvl&tJZHI11^RkohLCCgqpxJ-cb&{)y7(4zZQq zuq%!+T~zh>QK)b5hoQ>WG#9pl!9Afzucf#crzH_DGKJGRhlrsLiw!03i4`7M@hJv46XV#y0uw+$p+^d5D|@n`f>96zK;JXS#pUyVDd zZ)2;Z->Ru0n&MQ1)ZnsoVW7jotF%~9q;#8BI`u|}*~qbFUWg=lJo9U9$v81+uF3RM z82y!4k#Ok?YFPI(A$+++0ao8Vz&rHcbqGFRCDx zqty_tVTS2p@}LZQ?b^ATyRaILg=peNnyuXy_&2s%GN!aD;yGG-(p4V>!S5}_quOVD z*5Yp%Dtxzp;5O1|Qxa)zOElD3RRUQbaCz6Z>;V-*pVhl<6@|HkRkhL-0=UL zn>+;80o6d6{`-~KzoCc!?Mm$Ltn4535U~2>DgG!?IJ1A)o_~)I2Cl@EUlHC6{;~Sh z4LJUDR`#Fq!Icl_zv$TgK@ZW!qb+~X!_5(Lm6qDY_J2WG-D=d%YS;e@`hA9zAcFs& z(64u`MMa8K41-3;U(8nQ<|YLb3K9TuBi)>@3E#GF5MBd;0wy1WiIdtTj| zXwpfzZ4T?Ij9;;QE7MnaV2({8oSYR!5q!J_e$%j)$gX1Z09+aRha_pkYWK= zQC%X)SrFUKKd;2>n#;2vx5H5Qr$G+~xnd@sPJ#{#UGccCR?J6uKmb{JAJukjTLJkn zOJ8i)rys`#`TA}w4t#X`R0U~y$WbiipQgK4+jVyErH=O5Q~T^&9a4;hN%aCEarT17 zNiMlL(jb3X3aO&lz7NIkrSqMP9%o%iKjnUU`C$?5lX`YRB-_OCb5f@6>mGak$(;R< z?h9Pcil>+B!yjtaKXg3qx%#@eiT>7roooIU|t7hRbo4&&Iyiu+=$#) zfQ~lAn&99%%#mO1I>J-;)peBrEsxun@T7y#=;coJ@q{${Ga^<`=8lB7UnZ#d6V|1l z@VBLZcjJsn59Z>kIHrrUdFsBDd77<`bN#*Q{FLWx!6MyJR5f#E(46adrO!HYgzZyt zo7&US5m4(&oEY~4->uq<`z$i0Tvb$VagNg)>fybMv0~pZHWNuhPkfJly&@`sRq*mX zbv=Fu!>wS9Jp^H^`GKgG`K}p!`42)Sa&~Z==|M2lD^5t5F?$39i^BJ7AmA(ilN{Y~ zMOlYtDHnV&xs?l^z)w=bmTk3)zBxYIzH(pqK&_3-6A;RFbFr1~{QJ>%%_Xz=2nAI4 z{yl_LCTvdP$p2z@x9;}$&D&vk4mZu?pRVt_55$?s*GXU8QVjKAoh3+XXcyQKX2`(| z4}+=57@);PU;+({po`H0Y$fFfd5(v7c=igy+fZ`yDTiVFu^Y9T9KHKq7(q6Pg@nkV zcLbSXY;qR81c7#qOxL~45%<-LNYWRmE5%(vk7Jq1WG(vPf=AK%V?`8?&EFdC6^0w( z7gG%?D~9M0$6Bfv)6BQM6XIhft6%Q}ZE3}5DO-}fMljKy4-Lv-)y2H9z^2<)R+1tF zCHR~aGgA%^<$4oQblI1%va1Xa7RnQLSCz1d4G;VNlb-zF-rxVvr`Z3aR>1%NRZt8N z25{m-K``jQc-;T1hxq^gv-)>ej{m`bxpIXM!@&PgdH?eTr4&c>7n9u>{HyW~H=6(H z**tLg+q0p!JXkRxDWA-jGh(3n!x#cDC@z38tehzTRNmKnfAj6LH9w7z+spy^_A=j8 zTfVBoU~oFQsiYzo&4O7HoDn=D>8JoJH78L#)EcupE&*~w+y+B_+>18d00E14x60r zaN8zH!t3J8>_C1akD5%slZE`g@$qQh*gx&m`cBYtRM~nkzUbb12wah4BNU!xxe-RE zUGe7yCC(Ji7|xL!!J20CIfS_kn;DZ3FyvzR-*CK)6`rtp87ID4@iJce``*h0x!)WX zi3)_a7D+1_3cbndqWfE~{$rV=G+IB+avN|+_qWpw!rRIJpq2m9v&k|ap#F&U?>(D5 zSFEeq{J%Y$KwPwq27~aw^=wl3(41-+o(KEo1tuN)73^`Q2bC3N=mT_h%fUfa{To%) zgKFCMc3*1RcI>!oy39-ZfTS|+ul4;D_Fo%@*z6tZ#-5dYZJJW#u4x>9Mw^5SF|BfJ zS#kQ}*t#CT?bNmvZ|~H;Vp!!Q2l_A1&OSPv|cgqfT!uuEK^t}2(9a_OKMQ!GCpzYEvB+soE6U;TQ$UA(4+GXzdhOm zv>1^`a%j9Z4DjC0CWUVI57EwvER>axGo&4}~O1KS|jgLJ4~|dmUX& zo0254CQwbA^FL0x%ftSL&OlHlDyUO74KrxkF}l^WS=Y)zwT9)|)6-iRJ|#X8e)~!^x4)B&jZ`YXM%c5X&67lwDqj1LrtmlLO0OQ)*Egq^er4c zQz+cOe7xHKM_t_$VD&N3P-{A$IefpATY<3U@+pzveVXLV&S6iIS|w%LuPrN{U%s`j zYmyxl@Z#!l1vq`grVdHpq50lcc*KF^845VnSff;h6^Qd-AlRP(F32)Yqdy#t0rkoihqNM-p4?lSvTSJzwI|mC7w> zCL6E(@sRlLpSs!^>hcD&{W)=XH4c`Q3dolnvy+v#aM=KS#&h~XN3Yv$c%UWHK}EAU zO>vNkV4s{}52u@WtUAc?bjhLhn`gZrhB=JHV1O)~9+pv3;9+Hb8+zdMJH8od;Y{gt zu@U*jK$k>~b-J$dxl)jl!A+_Kbh`Rcp{Pe=W9G$fK?I+q--V;!w{1l-Pu`_3r-M`S95RWYKj%SwV5JWFXxd8Yd~-A;W@)$H`Gs$88&Z*XbMisYxm%_2 zMcuEn737a!=j##oe*dkjFZaspeqViU{qg(yaPZ#k&B?s;?XQc!b@llVAP^qE00dL+ z0n-5bpLzk95~!;s4};*b1yFY7Ufe%*^;iLx*ibK_&tV87ej!j-_mN~BhH|JE;_40c zQFQ#Ns|)e1mEX}U9fpgK{jIARt_~yQ@QdKL5z76{G)Ixjf9mR?em2RYD6QBcvU273 zT!#Ost6PWO^Z6XbnEtJ+2L!W@Vr~A^)k6cK9Y=q6&~}vvC6|uky~c_e{?yf1M+qqW z5=NNH&;y#EiIM6hf9h&Q$)8Dyv487oRl}dj8DoFzYE7S?uL|%>Ih0gJo@D(@sZcNF z(iU6Z>NfFg}g`(KV zbUg4kfsvq6SxI#!IqRf^L!(kvZ{+U|8h>1+y0z+T*3wCt_;{rza%48|>ZDwb0Ie0F z`k{#Cv_e?}{Um+lLz(1hrB)nTr(E?T+VB*uKaPIZI`XmB=d{X{ph|yGb*?e%wAx0a z%5Z*UuBGF&1`${Fd{=e8W9hWkYrM+jd}RL3)oC4ypxP9sw$Mj&Rv)QRZB9A5Fd%u> zkQi5O!LGJAVtCe=F2~R?rER>%2|2pFdUe*?Lr{x|P+R#-bKW+jQR|vMy0RmA-aZvq>t3$*>A>*3V`043 zvvu^-cc1glb%HvtLABMNe|FF`>U`!$SI;`myAR{){C3sWu9nW5>sV43z3}+@PYqun zFZww&8>02bK2vmFyyuT^h_zPVq*=Zg5T9s>M~-bWTwe^z5jG}9sBbaTUJfa1HYTT! zZLvvR4r|3Xrj)C1a~WNZ=ub4JwT^A``Cg8i5;kQFs_zJ9Uyj*mHf7C^?TB_>-i{;U zn{sy5cO{oEC%h(_^3KP0Wv(wLQH0F}Fpa$jv{zG+n$1O&<9muySJR2{%_Zy_`>IC3 z4%$R>nb`Qgrtj5k0paTkC5?k8*;gMbG+(3j#t)u#UVW^Oe_d^@@x^fYYOZbKbuGYh zm|S1Y_Yk(!M`(OCr@dYn(rjr=AOC74b-g$h-_l&J@y*WYdTC*zrKNTJo0ISL@;YH_ z+n~mG*X-++Jw#(hN2}SI za3k!_Ue5+Ru&tj(^C-%w>oe8cwgI7uqd4ELO~%`{p@*73ld`+EIBsRzN1jgnOzrI2 z<_~Nid#QPxx!koQ{ZQ?lhdZh;cNBfk&%t;aHuRX=bk~8VGCuKsv_B9hEKa}&G zqGRax2+BL=Y9>x=e7nDx-gYd!(>!a)?*3|n^fuCkyOX#5`i4m8T-nt;?^yoz-Ru8~ zSHn4p^23Yv7dJS3Oo{t=7LaM{`?y~GaH2MUOo#;d_H2Uz$ELy@8l4a- zr(f_JVGbY(;}MzXB-;Qv^NjZ*?c zP?(nDNNz1GJ<|xT^@KVqB)k#~;!N}|kKsbZthOSL^%L@2W8L)vx8*Rq+K_iR;80Gl z+g(pP#yCC|LSEB2$D|0^DR1ROKk%(QJ`_8lmlD~3;oo}>baXM_^26g05JFp|)L|I( z2*sBOGZKeO*}@N!0`sh7vRSwrX1NI(>UPI z+5?@$QXX-_m7)UN`9ZSK*l((O{yLze7(ZUXPp3@2nj}I)KSIkm1FS9Wr+4* zG7?oHEBskkUGZ~b|1<**2%LLrPenjG+CRKQmlVdEY~lC5994KxFhRTLS>v`*0J zg(c!g42*&Qf)QSY@_kI53YJF&VW)>kM7i@5 zHp?N^B;eaP$U7H)n98Xa6=3J6K)yp5-~oIb3g>Ren5K$=Fhy)J;<)TmEQtGJx&Q_M z^2jUM6gwsC0y9Jcw9lXKJqTGcg%fdrVGW_4iA4y5B3%7c$aEMyT2lm=8oSR*%KfgMpy}pQ?}H z0?JlNP!uQzD=9>yEdaewu!!(wnF0fe-5#g_7cO|zVU!#qM06plg#(_qm+O%Z2G-Cd zZaIn|2+X(N(@m+Mm$Zm7_9ZziCQvokbDZ81gKI_MBR_`I|+b*6R0(>LxzgK{(vyNef z!rSYCNl@iFjv(0?Au*ECoa-TKa#@)ia68k?-Sfm)l_YRb8M`S?qZ}rE0R#dMxqFH1 zKSu{vf*Hj@bp?>0SAH@4Az6n6YjXJZ>tOL=us9Cxdohq(J>Ki`0tjP0R4Se^s=ik& z(Rse1e+r8oj#;dQ-v>U}J(5h_eTGa|-tbPvq7Y&z&!Iwmxm{yMF8NFcw5-{Rr3)U3!z=Gv3iN zbr3)*orTtiP-px1aCcGS5^WXW21&i5$MtT#^~LKIFS?6LX0!91Fof?j;!V>couvt5 zV*~c9zyw!C8ke5C*Pag-@u3(+h}~ijrMFbie% zN9c|hJbWzHa}X?}g@ri898p8csAI{gx4LB~F z?uDD}a4?`$KMCE43P$>JtiOvI2~m^_Xr>O0P??7he?(ALV9C#iv5!JK-Z~9-K~Mpa zyvSs#$kd)VIe$1&&A`F+kRx3fhViuZ#gM?K**9MULhRvR>tCV1hTGys@Nq^Q)XxgG zQwUdj(;TKfFh$1S_&J|rP9ptU)$qE%VleraKoB3>S|Ky*sBoi{LrL(in%_<$Hla%O zT0!03`5S~%h8tyW5CZTYe+_yM;1VpW5oAr3AgrSXKKV_aH-_$J9E@UE z+jTGuMVViFiq^l|j0w083JLf70ODKEw^w z5)((}8#9tn*NHp3xq6YA^b7svxKYvHJfEoJT~L++gofb=&dz!gR{@UDZ;YgG5qEo5 zB-U4|3s!7z{6y5_d#nkx7?Cwpo%wOojn|`GC~yKI>M;%4St;vRYjUd|PL0NpG|jU8 z#!S3k;BI0EmsV{RqLu}Xs$$H8xcE&V39_{!{8~5jx$BtrP%H(3G4&mg!vZp@ph0C! zV5Foj5h9leo4nm!%mQs81~D=V@F56rH&4-e+?(UJ;^{9j5Kt`Qe8*)q`)VG>E(QA7 zv9QTV7-yOs;R`?hmhzJXVjb6aWd@m9I&aYVYHOBeM7skG z2|}{m!h=F=314{m;r=QZHjLcDo7Ia-z;OH^hyDbW#EP^OFx4$eR5*2wC`9uIA1@Y z#d77%bVkPf>OzW7RA~IFuv8E6__BebKXXN52CBjDm@Z@&o=#4-MU$sS)U@{GInZ{325`-`|l;Wg5=Qt*~2REUfYAFX}aKY<1-*Vg@ z!nE6a2;Lrh9}?t!yV@rB<&pDSt52UE-EqCVIg3h8B_M1-gF*7< zJ#qwGI8SoAWXRN9{vqOn-KpMI2QhB+_dDmJ^kBWVtUSS)Jwnom5i89VUP ziLx&oP2e&#r5RFxQi4IC%TJ>f6{bL8qDr_W^r0XoD2hw-W*tI=R|?ll+%KADnvBId z%~0@e;8vDph4BkP&no39?&$kxmz9H64)bD8XnN0~yFiU}XEf${i$%gcD zSXr<8pRXcx>Fw;E=Z9etP^_NsPQD@cF(6bjhJit(S?agv)LbELbZ;YC@O99h>lv}s1rgumdJck z5sdwY7+w=dy__`cZnM@yqK}8Snq+>Ao4C}vjJ**UQw1d2 zYWKRI6kt#cV?2F)FHA^BTj}m=U+#b$NG+2&Zt=h~Y?u2Kk zlSBPEK7Z?&-H3=4n`?U+FMB3#k*Gw`Zjt<0RKhYv?^*kHst0P(@|8iE!A_QQi-dI! za<1JvFYv5=>rQyQK?H3$o1{%a`m+w(GHuN(+w$@>pId7Ro&ibwn%13;ji^=%%9rTD z+AN2r(K2eQ*Yj4Lj;(9qQcmr=Wt~o)KL(_nyU+8CESo2>ZhkZ->~tdD5v^TE)KXe^ zxeVS(clumMnf~;!=U%I{+nCsVm)nHwx!-2O;vALB>|-T*kA#P?Zjb4@aB0s);K_K_ z5)Ct(eM0VbBi909GF}^Bn!CL=6O?2wMP2T^@!rjkkn!0sFJEQct{ar`{nmOOcX{v@ zChK=J$o|$ZvQ0_W|8yR?;(NRnAscYHTfU}s_G3^s@K>G3+ko3!m??mXz4=8xg@P#* zWL$~$Jotv9g*~K#+!dF{Rpk$&>^H>{S?FHTMciuX>kojg4q1uPrb5|S*RXWk9#DLD z4&rz|rS%4$rP(_bF4k{$Y}odY;Y`c>-WZdUR!@{$HFL1Mf;ma*9_Jm=>8QsRbntZj zBoa6_u2POU#p|~BKjfxkUO-veN^B}Qy3OxFyu%)XAAvRTS!w*WMsQST(`kp4;>Y!e zxEo7?rFI0=f_|!)u?caj_+cbK%@;f;8Na|P*Hux8k^p4!KNZI;7YKb z2;nS}2fvO93mp&=;!%-|wMo2pfoA<`x2??vQ4VR_=ED-uQ+d;X8z=Wg1VTkbR6-of zt2>i1xK+fK+OBTJRUgs-9+$gX4_5Mn(COUbd;pm+K_6l5V8*N{5c(v-K4P13J;4m_-xl}#7(sEvB+SBr&sQ)7=HV~7Pk021D+^T*7uAUx z54BOa>qDo>z?H>nE>D2{AyLj{1VUf0c2}_{1Ry+w*ljkY?i3Q3SDQfs&?A4Y(Rde0 z^Yf`;0{lx=oJVAk-G&e@mSpg=t-(U2M`#@O4xKX5*R13sAF7=SQ~D4oa;Ii$!U@TQ z28ZkzCHQf7L)SBcLOrUBR&00;Tt+8D1@Eew1z|s6p)p+F<5$$MGdZP^D?j^KHx_DF zShSyrMl))WP9JDLJDR1-0TH!Cj@>eA%`gl;@MKIDaWMR0@Ik(VoY^(kUgZFnxahM- zUHPML*S|Xq=K=)kL&4*`bWehVo*&hdnDvR<5UY^iD09*t0)K+|d zpKqVDznMK}omq2cmTUQ6;LYnxWO+Zo`?)S{D9)?uqR6#INZ-O(&8d(!kgo|##9jWn zsjkmE`i&1hf8MO~3%y9En+bh|5UQC>D-$lSBIPAa(BcX^NZu7D>$m7MIe(kbm~)QQ z`352{Uti}vpRMUafh3c?ixLb8=~@>dw3Dtm_+Rj8-&i6QcKOi_vT~UZNnJRFFM1EU z+Jt^QB3G8x93MitG@Mg;O$D5w#OG3nmS*aVh9JNAJ!yJ7f1A*Aqx)gNM%=)w(nZet z_+SgMnXi0)+!pL}R-J5VQfTf|0Z_YCTTZsD5(alh@{C6$w~P>SE?a~_%X|j(M3coQ z(rNW7`NFg~+7#)bBmwWiXj!lYi)$S+xa5{gCRCbVgkff+%f%%PM&7EsLqjRYtc~p1ib8>4jwVuuBh3*>u%3>Srb%a{yY7*8*D0l{YD# zJt==EZELiHzh5``q%xpc{vpFGAsf718Q*Nj$~HSad|j(LN!s2<3o$d*z3u9lXz$=Y zJNpJEdekB9aIEFPP>}rFG5SC2j{Iep=PzG4X`A#y?-4;kB*2OMIgsTji-$3N91&!N z>6TIyYaE1%mg>By@j1CLx>M||h+oXllgkZ4wTa*$81P+eAUH+lGLo%X5BxD&l6|v{ z$P3I#6^B7Df&8f<;FEj)pWnf&lWW0&Yw?0kZDuJ(4Wo#BEY3IzhMki0eb+0lCYEU` z&s~#gCFO{CTN+3YXD$8n(eE_y?XZ(u;RKx;%vRK3&wx--u`&vxS>uQh=f+q-P_nb! zHB_5PU798`|8_se+sP5oN#Je&aXZ-~$K*u-;@>r0dZO4*nl1pg^p7g$z@N60U6@@x zZl1rB_Ro%tRnqWVmP+Z;MSpB38@~uWqlzt^uCdaRPz(N^c_01wRsXLe<6l+G$FFe| zMDS-yh_xA_K$@LP6Vm**h&w zdtX;vTqe~GgcnEV%?f}cyI*tinn!-PABCX`-XMwTf$e0Hi@0bzY9dU$49E+f z;!CS-wHUx?fm!rB?Ns>pBV((j5bpfKrBHtC%2JqMH}~6c;Yq8v5n>+--vZmoD{rG@ zU_9^8x9F|kMJrt_diM`a7hpSC*P`fG)8#+8ot$teAa+hGqB{PJg71Uxg-(gpv_)PN zmw={=ZuyiZGVNmBNA&{z^SZ?hRjZ@U@x@1-Hl=h8648b0qhzZ9wzPmR4-5Ow=bslt zyI$4F= zy5aj~`&YO1FXj^+UYCooAwK-iH^dL^eO`+1R{E2d=-Bo{zl1&RALsSC^rHIyoU;!@ z#rjtq<=ZC5(e*7u7MF#DLp|JCMS<_nupN?H4M)v$ndLVs42AsC7u8mWw)(>D#vWa6 z7V3ubHO&v;iKJPAaw2{_84`W_a?@5?^=NkM&8E7*?t(R?_v$Q*E#>006=%5csGSR$ zc%N$`bM>t8&TZ#GX0vqh_clS--RDz@M1&`UZc=`Ie_iPI?pmeRC!1m&)s@uZXgotr zU%aS<@H{9Z{L)gcK~w$MmOKGF7%jxInLj_@jelj@K zL*tcY>t+1m=OhPdsUD_f{iY>b7Z$#?N46Q2Bl~8+k+J;8j47NB7Wul&sc`i{#}*d< z<_aH5aMozwH?V2s=^f|OQtV$ZDYZYocG+{=J7Wl=P>Cfv^@M~tlT1f9cBP2IHb(Ny z&fQ>HoHV85$}9Q>#=`de_v;QagZj`TlU;ErbA>gVkIAX5pqs6Wj=lpg2n3bh4qpAL z^Ou@TUZ3xloO}5=$T;`S53Cr^>@_M6Q@*s;Z{`x$%CDGyN?Bx31ZW^<9JTAi%)sVW z-B*o(Bjb0$Y_|!Gm5UZmG`Wj4=(qF{+|C!H_!Dn$KcQ2-R%n3&j*Ov9eKkZXPg0JL zj7jNoqJbmh!}D~iLcRC?>yM1N+!R*IwfBkRI!w99rtV*I@3@7`@hw;z?>o99uvl}` z`4t75V=Q|FG-g(+a*@{2uW883%`i;m|Fm2Q(Ao>-4-D=kxipnFLl|4k`?j zM4mTftt(W~{5Fj4x5;6D@<>g7XCz7@4!!fu@cQF^QD0NnJedchEzJElGc{dZ@2b7^ z=cezgjDP${oIMaq_NhGKLMzJAZ<%Brg8AsM zOE+^~zWaEuPWm(2X<})6b!N!?(<{{TwIUMbWSsCAbpYyuk=#JyWcLz@so6T4sqD^3 zk#AMtYqMpU=7h$e236 z?mF-9Yj}?5J$5d#Q5vXbz}a3!z-J_`;ZF!xaV}vqgKBqVI{N{$rZWTA@SgIf*3iM6jEeQB~1i*ahHkgnCEEHf4}V3yc! zTFpEYbXmmAqa?*5Df;34zKYFzTDo%~{>m>CR2%Wvh2pKqU---$OeCwFdj=dCKVX{K z+Mm+eI_0^kN@H@PYpP9sJGP0zRyIw4dL-d)dCq_C$oRhJtDTGF(^t=}*7#ntXT2d= z0AIFg-+Ad6-Qt?BYR(%FKc+XGpMVp+IAucG>=-3iJxzIP?>teY#-{v}v6iDXoHFlq zr-)aWEXbYR5*ap^=-DQo^NJP4B)iT#tE0)v!vIG$sdfW-Z|*C9{O^%b)d_PE5W?;pPNTN^o7%KV+5mI6bS>ZP#L#XG^FZJ;#j+&6uBDD1zr3&$oTRl#zLAd=X$=39$#~U9)f}BgY4D0iHXq7V9-b`HASf%F_Jo*yxW{abw zX&Dl~x|cEh6aTd(N^`>pu+tc5xbuCzGF0X!q^9uYtmn}k3!m5*GHX4a60r}Uz0b;* zpKXXf&{b65#1v=@?DP?6AUT6ZP*%Mk(-0$F4W-Vy1B@O zL|`61qxW38iwey(V-yode7Jf>$%5`J%9zW5>Ye;`sKKPDoc^C? z;(1+qrJFx5K95y&&xJq#`CTEvTtx*Z!{OoalV|iFg!f{?`*Goegz%x=@Dav{F|mko-H1t#2m&Tz z1{X0$h?w7vSYV7?5{rDN8~MQ_as?B)ii=z)M1J0l++>W}5{vq#8@25bwTp?`$3-0y zqJHj1ftb)>aWt_W8s>>6NkWq~ped%&RC{OyQ}k)^Xj;8!de3Oaq-f@bXx8ayw!LU} zrWg+KnDcru7d>ORlVW%qV)&3E~Pcw?pnQ}KjH zdI=Vu306r7HVp}O(+LiH364yO&f4bm?n`fZ=8rsel1)DTJ%Vt8;Dbv-VQkG1 z@JCrDBoHQm3^An7sL3uLtg&nONSE65SBChXSM@jk6iVQ%nTkD<`ck)gEDTfxcH^|%;G>r6vP>G4LJA!Ea{&+Bd z8M97a0K@J9S2zxO^dLBzMJ8$<34xJPX%r&Jq`7N2V82!qPTmX#d@20oO9er2nd3x8 zgsP!pT@WH)?C^zWqRo0W*qZ}=DCDfgGPC{kG_GzjA)F>lqaon`MczBP5lZ0d#2`}O zM$Q5c+m{2)CX4cckw}U0Ep`x5^?ng=vz%;$z-j+{NB``(oLuZQa531)t#X6lBRPr= zNTBDj!o=#>CM)Yle2P^U13VyqGRrTh4$FjgJ$A}JuKJhH>f`~?16L(Exhg;K0Ftg{ zX3E0fQPAhY1JZB$Lg8$TZE%h_f7(5@Te_8|vXQjsBr1C?W&ZSYWc~XEE&-pyEJZ{= z(ywNh_5AWe8`7VgWlPy(0rUbwN*W{NfsX3%V?XCBMe?4r_s`|;fA&{Cxj9alHjvo= z$lfDBVs9gYQ>|P$FN!vjMb+%eEZ%fzD-Empmwpz1`6j;#)uX@%<{#4Wzg(zJ6f|JV z`nnw4f5CJ8mh$PE<2{hSvAh1*19=sp*r9gLi}+MR(YY7gUjF{e%Bi6p`Al22$LaXb zi;9@{(H#8B)$hcwc9tk}>8=Off5a6LO=L}Ly~@0$MBsd;I>y8*q7vVL5we{hY^Yft z&b%3B;r zQ7dsKnq9VMO{f#j$QX)foH8N7(wVWEXBjazU!f1Yea^V(A3baS+)y?_ab?6gF*F;}S7e@ed_(#_xcxJK z36Of6q~mF(uvg-YlOQ(JE=|WMP!)@8wYY9K>zM~8$sBL)d&uk7y?i2#|8!Rt`_Dd*c6BSxJJsJ z7OE*yq_FY>U{{UXN8^52R$hdN83YJIrY5!FU6JzX*)&}7LnI4^wB?5QFLq{qy6x)^xK%4=%-qx zFJvG1*p*{xdCW=nQ{s&$()nX(*4vf8z5*5%x2GjsNd1k?b4UH-*vnK3nmNyXTur*L zD9iHNYUk+F&KqP!Sfw@6ar8we2qSFd?h*Bl(O#zQ$LP{In8V(CjO8V(Vrh@8*vSiL zMoql0Cd75p#?8t)D9??C5U(WnTsl~8n7Yx-*rNQ@Kwi**+!#NXIUL%6{lCQIFgh>|z>#l-Lup&S#E zB%Kt@GVejOvt88TGVE-QrEn{z{yyKUm6%VNpSiPDf+<9P6{^FSa`K{T3tyX+Xw7(4!9oqj)3fi$t4aHL~-TQC%J{!pJwV?cHbi@I|m+a z2gE@kf;W{m+Q15|Pe693Nsu?G$pY6C*-x=4`9rTR{?upmsftf!z#(SIe;2C%D+<;B zGP{fW=uShw&d^pugZhabd-8-~a~Or>9bvP|{8VFbmdnRSr5qI3s8 zmN@h+U-HLCjVSzhf%^AigCDE9!}!Viq3`A1Kh}&-H4=K%x2scrtXth_oS7Qh#y0+A zp*qN!K5&!JRPVC!bmu^V=(2~~>6Xn^DXFE=qTQ~PnlF)DT<+;Kq8n)!}=gmT9m%S~rIAqi~k_xAUU_=E8qiA)N=si%VI21EMk(Ge*{)S@rP~;Hvb-Cwzkx`Kw<7-#z z%kQCZY1h}B*6%8bf-n%}UH!x`@)9^dopHbGy7DrN{#wHRw;1IWJpAv(`Ku6asS*5D zzxiumZrv3NP`nqQt$Rxs6L7OOz>x8l5dcG`4KyX(e54yF=^AK-xoLw76dezA(7ox% z7$hVdD9KtLw{7Fvms0Rl4oUKmza z1_;QI+OQ@@86Y4Z(S&ypZU6!Kzy%1%H-Lb=^D2Bu_XZGXL|;y^%7cop@NL<|VX z&xFv#AtFFPwunWODT@FBS^X;-(I*T9WEHJw`XnJBAdA*Sv+4-}0r?C~3`fHiARsfj z#Bl2gA}wA2eL6n+i*%fE%~~MjpQYo5*aU2x-oH!7*0Ba3pYtUJ9tUIs5Re0p1F{$p zkb{l`G6o39LB|1k7YN9~KtT4_#RPf=2Pa`dahUMw;K)4;nlULxJS0vpDZwKNlN6HN zkd#VDO5Y2~WJ=B!OU~5`^>I%q=828GAIo2vT*;Io-3J!mRA6oc^BY5|89F?Up=3H9w+*@AJ3SPO) zNx3RB(P}ff?0dNy5;1or@-FJ-X(z|%Cg<@t-2w!?HyL2d-dW5-* z;Y!)KKJ}zm8BKKA3^VoIOxdX~WeYQiC5du!&GHY)h?V4WcvbnjKH~F!IfS}mO9J$b zw_<0%e6PR!Ai4a9P5F^TIT3j|WVQ@iQU>=fBULRUXDOpxD?Qa%8nFPg)A$>^tFek{ zjg)4fik+pJL$dn3LG?xNYVMS3-o|SF+3HIN)q*TFS0!rzsfWmsca2y|%{c>W{sq|e zk{ZS}Qa@1bErVJG?^>mlT9w9Hwb@$rgWB5zHGVQxifdK($m?`d>hv4y3<0UfL7nkI zUAzeREFa9m8*7zj9~US7W`;Z2hx?dL#?ZR}$xM zfD81-1*hOb`Rb**VPTuNh)tZmhKcQH&Gkl{!z_t5vLSW0A^o5slLenGiO)5_=X>LG z8_lv8PL-~m+8Du4XpoA4jP2UNG;6SowJJL#zG=2TYLoJPWn;5sQ>Q^ww|7%-N>gx& zS&0GV&;iv1sJY^R%4dO|U$CxYw&8I~bJGC{u@iX#AoZ9))SGOQgU^wt4v+!c0V|F5 zCY9unN|Jub)^7%_+up4qDP}B=WIr>hM2sPf#tqXJiG+=HZIOTeWF>AM}RI9iJBp#gEq(BqNq3xAE?g=Z9&sQ+~0o9n zO`an&(C&yWQA1d%!q+50Zz>1DPFOoMd`J*c3u<>8=y_&`^)PM$YYtk4!SNahEs7z? zmw~hc=p%G*u@uOX9S&@CcsgP?4!bsd+ARiPTv8y<%%KQC>e192wSG!S3LGzpcqap8 z%p^i>;vo_Aj|_TJOB%CgO?p$Yh2hv9!;TGa%1_=ASoQTD6U0!vOjQM#uyH^+jBNA*wO&|n?iz&o8k30$)K~Z* z+$D#t`S{$Buw4rHcImif7!+L9SnUflMZh~hjXeOQ9%W4rDchh~RJ563Q6KW38l=)b z^i$-cm?M_{j9HkE;jEqaXzc5L)6ISjshJf4n6AdSiz=MpNN$IiHWeIOIe;%Cni@+6 z2VagI*<-;~V|`MfZ%>B_KJ{4eo&PxpNIhP#j6}0eLavYtWTuoHP|bWAF<)zwrNC>lcQL9F zKtoeghz?D`m)9O3TxJ(0kiItjHmz|!qJb1U;GWjc^r?T7yi2K)g5*lQ@^z4zF;$KuB?Q!J zF+i|XeWevS8drvuupd=5LcEi%Cr^J5Cu%AG+%NZR*rScSlyz}Ayw^I6*nJ3#tX$p- zUwZa=T*nSB;IINnJ%XN@g-}h3$n;gu67iz@Hqex`=(am1jfrb-C+8ZJW7krsmeve9 zJV3oJ?7hj?>%X@Mc2)Kdj}XctJ1Z`&HcGEq50IIrV}&EeJ;UBuNdmtSDA#_jw)kMj z>?nz!VYSilw}QP`%GNVR^}G&Px5#B{TPR)tW~4F96S>}K&`bEaC3pjO^(c}Emjn?< zcQ4L&A4z_+iD;IQS_$%gzf?JGCqqK#Fna4c+)rT2pMAB`4w{Olf`ABiEbkzj6w?FH zQg*6V4N5~}@;SkmN1w;cGT&FvzfaW|zjtHqwJ}vi+vJnRH47GKBl~yT=U9FA)d{IV zNZXfu84BbBz?5_(HJj#NR|E!@kw$F*4~+9k0@Gy^Xcgu2>S;Ps?9cv zLo1^>D~Asd6xMTu^6|4nzDwZ?4j2j8@P*?&p}cwg;g5T&f^Wk)v<6!4a1(x zZ8ZX)QX+Vp{jj~pu-@Qd^3l)DR_y5ORI^U7L@6wH82sTg?F!Wn=$yiWj4zaujen&m zn$Dl{%yr@5?zmbaI%`sjnl%IYNXR|XxZWzd0-_RFe#o`*w*tO8V%6t%72k7Qu}&~C zg>#T;QKV?L2FuaX1aOQJ2}4gi&x{tc8nBd=aaey3FNXD{jXUUR%*jxfL*p{5}IkF2kMtOgCDCP$@XzmlTIu<%2&Wakc zHoOoSNMmsLjL3KP8_#&yb0YP44c~&DH9Gty^~f;#;YGoCtJ(X^*=KbsXB=vDpL-!# z)&``Bb}q>f!O#C8^?(9{zZ>vhQjgq9IdZO=iU@g;cY@R`>y0Bd)XYR0k^zjSg7WLS z(@NDg_x!IYFac7J?i#tyD~e~_-&HA|b!TaZQTVf(C{ZXdF7^!QI_C6!3a+`*|AKo~ zNrkVX^Qx)YUBX&|v7N5BM7aXAvhK+Ktx$bm$Gi@Z zdfdLRrDvH}r){9c=c0WvMQS2eW(Ii;C{$m->Y7E#i|Cm@K9+i91ZZo~H!*^ng>!xt zssX7-D^%3b$#cMzM7>8|^ud#XB@`L~s zs<&&*>!saay9Y75&jW?(-PETHEkL1~E6L+sqGiioP`vwbp?ZqJYxTHL?Nm0^;=R$@ z8t=Uc6siv|cZnVssxuHzw~q_e!!P4opB-!@jyyfwS#CXw{I>HD1SPovq5=xl#1Dz6 zaWXKKJ19zjW8#1v8B*;L-`bo7=rx?|m^u2$?<{fFdnrb_(+LPCPGJ+W`-P&k1BOd$bl+H0KN=!yuKCCrk z`)*Ys{&_U&x!qYdB5@@-=aQ&^TaP&UE-1;1j74K4-f;qj>X)}-ViG&g-{((KRyT5v zO(V|ZyuqY$m))v* znkkhNrt4NdRaBCig~+RKbl4xV=hwLu@J5C9dwA@G5or zmZii*gSs2`RoaHXrPO=zJ6@Bo(sw#7uYYg2^KAQ7#u2fV3{*nHmwr4GE^j4Aht~)c z8P7Tu02HbvG()w=vl+Uq6t3YlBi+Vx&O)t~h&ll~oR)2!mO5YwYxB<1%2#~m!O+QhnC~tE&{>1lL582l9$vU zOPH)JkhizF->5%{ovf<}u(vapG?k-ru36(MiGZ5MUwWKdylQB$`(0(e=(I0SBlj#sT z7`hz;uQi!axf5QTg*gSwOPKp(r_lRNru6lMuFHW=;pS3i%u|GJ(Qc>6CrxH- zJ3yft=8O)Idc?sn-K(hJ920-k^ys4Kbl;so;L{{!&Z{%suhZ?EP}gLB$$fg@Ant?*~%v3APtujE`&J-wA_b9kk1BGe}QJ_#A=vJEt6smP* zfkL$#wyyb)LbW@t>sO&#skZ0F_>ZWkrEljpYZR|nU)gZ)xqKFaaTi&oZ1w3)nLjW( zE3st~CG7)|S~$>kzdmB(xNQzOb6_RU&X>_22-zuix zDyH8mrr#>2-zuixDyH8mrr#>2-zuixDyH8mrr#>2-zuj6?^H~GITAa0p%-ipVgn(7 zH56A6ymwT{^cP%T%_^6c{{}x`C$}02xfx6=bkQ|t)#O$LySNuIsk4e=_<14ckKEjO z3YX7}0yq@vgux_o+w9Je5mN!_vz~0@O!rnm*-SUvmpCf53xi{A>b{ZQ%ekBHoGKST zgP@nqAsy}IA=x(mSC)wWx8{E*W4`~b@A%8d^Z(+dJOQx;)8E7rVoYM0na8RGiP0Fi zD#lkU|9q+ydf=>lR5oLu?}a;zT(mT7p1FnL>1>Ky+|@Z3RD1pO){Vz8^6x?NY_cs< z&Q8egxKOh4@um0XfDfU7ARPR)|8yv)-%rE-IP+0|#eqS+CI3~~+Yif?qg=8~~X7_Fr@n^)9lWBcBa`x(?B>sNfC$jUtV zg86dx?Z$13_wC49sR-N2E8V?O2v%Lvm0;Oc1JQ!}uExj~h-NpvVd>}<I^Ws3NvtmyY&ND35=5a)4yw*OOxo@l^!mPQ)}S{22cskUS(tj0e}* zdn>^0l0w$it_8ZNvy|E6!p424{na&|37b-z4ftyo=iVx^%BA5ax%PDNs?hm?3oKj; zJVk<0N}QJ|uS@K54@c+n-sF|Ld%;FlKFW?BkbQ(s#p~;X&j{8T&-$9f3`11Da_E#A zUpDfQMA|8*LkbtnRT()|v5q+AD>GxZOt%@YV4u>8Qrs#KNd%em>;b|D2*~6dndX`j zJ6!yRobgymn{RUHz0tkzRdW7M=sq%S(zv}t3$>Cx@l!*a6nVeOa1+(&95iRc=OzgZ?s8p(z@uz+R4^3{hwTPA8=75~{Xu}3yt3RouEMLvsl z0hS4l|6rN8XCA1T%dHZFu}PwV>204_CcXid2}&Kb5n!1RDKhwvmWh_mVnx6*!69^P znJ7HAOuQS%{K+z5@n_4#!arChaHp-zg-0U}bWer@K#q&Z1W2=gA5ALylu@Zk~CCL7wghC1}Cr&fQz+Ju?*#u;@of5q&tO?x#!F^*K{ZnYWeiXsg5lZfqb8FG|@IzVFkWPHU^?{ z31!MnF@R+Pu(w^#>|*mSlrj01SzhaW+i9Lw+O_19nIfal24I<3-+a-LWRRQ)<{`W5 ztMe#&3@^w-ablU+>eYBJSwOA4>)v+b2n5_ae zBuM>RHp`FyilwOkm1P1Q)%1?*&R+jNu}s|AAG@4>MPgTWRi|QqvgYUa@+j$bljkIt zdw*`%^fZ5V89sP@(6ZBZ)V%3;=Wvmwb+`9M%U100;d{x}y^-fF-*WE!_-N3&PiSq~ zt{FbW7K6UeiatB~^kVqwR!ZyP%8l0jSHnNQH@5!ReBOHa_Ri5>#+!qMiW{HoE1n%ofO{oMc$Aw)@=zlRI?nO&k%c0@eFKUI(l5*@^46$H_Mn~Mee>jnpU1Ycv+1VGnM zG~k9uN+{=Z0XGSOM!SJv>L6820AvA`yc%Qks(GYK!!2U&5;UI=&z>~bY>+?#2Cei3=$LzNHwO) zQv$3Cq4K@p%NnppC#`MXZWVS~j2yok`K}VyO2W|2=pRQC*yRzf zTo}ULOA675$k~nJ_6Q{?`Dyu&=q8%IkQA(klFTHBd?6zdM@br!Ls1bX z;s~5Z%r!<7H8;fE82VB-4$u~yUx0v7&>IV3uGUbRLNsKA=(GpeM;!DJO{^^*9q5Un zwhm)ih-?r;;FYLiG*AwjQFgo0H$7ruCMYhwINqdCH>HTvN?>;-1R$v>C!nIx@idsY z`h{4?2nDo?ZiJ-+n#$*say0N@%$1aB=UGSJA6{I~y z7K4UlCUT2|bPKeS0ex{g!CJcRu4E~8DBk2S4J0{aAW%3$l z@`q&df`V-X!EBX87dEp4j;v7}j#Rad;8b?X_DrJZ>}WkPN?Qa$Ry%y15a_ITr&ggN5Xx`eBC@! z>X>}TnDU^j5nVGxu6i+xN@=7YBc2tZ->rmkA<9Za^XK==6bke0Rxz70RK2za zZT#F;{W#I!#>yC8jo22_LSOyDQc$u&NNM#dYLJwICzHHS5G0OH_Qiyk^aa^67SjjE zPpl-vqN%FcGud{-i~GQ7Hi%k5u$mxMe{e;iSjBlk(3`d(oD6g&IYC1o#U}`wD@y1} z&U++N=JPSp^++!rLKJxeR4z4Jqi7Yz+y>lD`KHXNct`MuUHUbBzfY@vJnRUlCu(~p z$&VLZYmMMBK=B*LQL|Hd8dE`#@fZ4{P7{hU`jb+CUxDQ4WGlc>Ld2nzgY`tPsA6|{ zE7%;tn#SaEeJQV3eFyrhFWC|etw4nMP!ltGuGZ-@*6ENlP-SEB`7Gs@pYPVjHPj(YN2xk*%PSt-+{bXT5V)vdqLvpl10MY&_&i+%rbD*qVVRU5-`U?T=-xG zWF$aJqxv=zimS2*O603E5ck%xd3GRgd_-Menkd)_1a5>MovmSL>hl#qN zlpQJX<-VZNN)i|!N@*eL0nZRGOV>Nw76XZNV39#ngZPmnv{?d-{1_1~3ECnbWPZ@P z?tx+|s~s>b$l~+o+(h#u8rU9m)AtrUv_nya;ApH;FQkoDt&p_6XbKd0?dxMR@-?}g z=ENFg*+|r75Gmpascalo`7v-NBG8d~Y+YhZReEAnX+rzygal!nQHeoS)ejs#aRnDd z`lZVF!KB60d`kjKl4L@SZ^H7mFIn`^W9cc^G>jz%+c!9|$AElWk0jfjA}mk&QWE^7 z34sp?!A}XF>NP*=Gf3$opQaIF$_Sy-(+LlzF;AzH)22aIn%}1h?q3MRjMJ&j(@+mc zaRH>bd8YLBO!<$Q$}_Xo(zCS>X0cCaacQ&o=Gms#vn@Yn+s@2&NY8aXn5%yYrYyWd zpK?00%9Fc!>kHVxpf1z^NZcAKzGghc|43ho+{#CizK>F=QtbJMK z)>gp$2;*M(8%VbB&&uRKK(Z&wX=s~oUS7%N|)ZOo^!k_ zS4f$CGkJT?#r7VxgPBdvICX;9ka=t6O*T^>DH9lDNSq)L0bebTit_DrRMLFi>&{>BDk6aY|^t|tZee>>oNk#MF zhXJB`kdRFUxelw-XKGFVE9GS$z$SdBNf_2YQ~&t9w$VkuRwCQR%GKXN;zHrr0}`P? z_FmxNG;Foq6PNqV^T;;n<;i8{+-=Y;S?Y)cBIYH%=?|nF#3IXoX{gvEAhy9O*1?Bsz zrS+fp*D6n@LQ@V0pK#0N2cMgEJ|Aqf!7m?fo=k;$xhf8~PEa``iYHT{$3MOkEdMW0 zg-lEk03!{71k;Wn5l4EC5c0W&;2TQWr=L4QF0y@r@f)KM*JOymVr@i_g)B{vm7DD9 zS3>XDEuD@fbPE2_#ebq(PmTe>RWy8Q+cpCwK4&2U9R1mZ+Iy~BbWlHcC1%^H3=%~y zqVH;esT>_qFxsvNF?L_t4@y0vb629giF40FczWd!)seyX&U0R9Q)p0Lh`5D*drrW! zPkMWlHVJuwf3Hwc_SqOZUYW^;7WCOI^GWJ&1Be(voLbj`=i&(_9`gD`}ih@mQpHVcv}fo)M&jPXZj$$7m>)h#?xKeJUpNnz6GKRx0-ATITvOqn`XXOer~fhNgRzZ z2gN6`niuL1DBQkK8k@Vn8}x^J^laoc?lbYG+U5ASHHAOcrPxxGoK@VaO(7p|#wLf1 zAI&7xL|!X7wh+N7`ATMrwrA&J*-QDZJ~vgd4Kn& z{k|{Sc~rS6du8r5<(=DLhTvTDByuI%u-zsVC*mhWdk)efZ z@Cxedc@wDH^;W7JT@X0*eygUNdq{x$Y}3Ox*@QC^k=6jP%Dh~YrbzVVEsN+w-P0_2 zN41#sD@dIK<=&W@!3P5cN>Bqr2ZtM5Fr}j8R`Ha`PQtJ!Wlsh~K&K-xA)U2LXv&!1 zOgMHt1N5UC}6s^2NLNuZ}4d*^el)cb>mDx~oRT{E|s{D7JfXV=t17f-DYe)UcT zrj6OiZTL~MO1q77_MFy*Ls%{^lSJ$ zZ$lHuGkSCL>Ti-dW>FkY!7dloii_VdR6(^76*!w)-X1h{s7~<9b+i2>PK(wTpJh8b z@{pCkbkE$f$t*7LZTJsqH8qvmgnq;PH093&j01+boG)`;I;FcLT)z6^^7ATEHFUqR zTwJSMl$Tf$rJm#2_i-On#nt@O)rxcu(f8lH*NDAz4c*VW{?p>U;D%DK0h?=%;@L(` z=FNeOSHhKc%NtxpMt6+xsp|@=e*GjU5-E1yO@HHCOAHme-JC6(!35v_F?PCmruofa z_ofdF&v%FX+P9ErSvb`KN#oCDe}lTz7DtaQV*B{_N2SDraZ-=;s0O|9}%z4zVs0=7A)^ zAOTJe1p!I5iv&11|27rEpqOzefRpntO@%xFPL3bI$&n)XUElQsI641*Dn#&C-}TpE z3;;Me_jCiaJpuqujy^8HknpFekZvFVg0;c~+U$x?SM%8h^Vk>iJ@(*nTH$l?2=c%L zdEtTpPR_I4AS7cjz{xqD3I$7d#{`Gsg2Oz51CE?Y(TpK6Vj(dr!Tw87BV!n*FeC{V zl1>OoU<}O`3(fui8zlQzsGR?EAX$GsfRlqc=HxU0oE*$CCx;2({IxpX?YeD4^Q0~RCZ)Cj_Q3P8}%`i7LI>6Dhels2Z+ zjz6Jt`WsRQr;kxN@@CStq-pe7DdV1LgrqcplQTD+Houp)z?8mp^f8bils2A}@)np1 zHKYTaoX>mdn@kzKNz$))Qj9b+w)^M+RE~aC#$gB@fXdOP&IGH_0jQk2PMIWRbO0(x zbu^PInHE6hC|=2;)u#neIX9!Tn3-t-RL+erS?n`304hgPGy9?q4S>oKuFB@;r2$Ym zf+p!BA?aJ5IUUvlV)z`XnVjqUIdjSxb)M;yq`3emM=3d11)rU@ByloDXnv>}K*E_VWQw4lq=3)h_@zIUdOc zUibollk;ppf9eI;L9p<-eqo?jA;8HA#TSMj%@hKh95i!L%zhq9g2Ygw2$Ng{aB@;- ziqiLs08WmNmo#T(o*g@^FuAxGUkq?^%J+*anM(jpPOW|k)~f{I|b2-4tc~@Ng zl#}cyy8P!R)v7*ayfH-eW|_e%?7ea9hQ6GVDbq z8LY9AVz!dXpu)$md_u5lLxYlTpd9$`r%pRKfw}TMGZYvSe&2^es7rMPsW`$)j+rN# zlts+2Jqb{CWpU{yCFJNzO|gEB=vuMeCdslOh>fKrN(NECSy>$lZx#fR+5Umb!Q(~$ zBQ1um1a|o*9kXEJH~k9sl2%@(^l zQgwmqf2hbx>&7=sDXT;C{2bBIo4|!G$eR8s5gpo%G9+u*6G=vfMnXr zk3ll*6_ffE_Q+z(um)@>^tDVwodmoQ827N_YWe||Ol@g#V^c}7O&AWhPx7%1+i!z| zQdfpbB3v7rh|e_@+2C+%_;G{gN$)amGe~M!od}4R*Rjs@sI7cjuuQcbjB3jxpT$p+ zm*}!1a5Fe4OC4mSzLXd7t)w_rqY1Cl)SXg#$Om)SgfAOYsTvTUn+0wKXVq4HgQZqe zuwkUJ<+M~gZBxm#Y8^nG$pk~=H_MNyGw5=FI&<#|$%EB0Yh!W|Nl+J}-PE}4OG>dr z3ho?VlO1~lM3!7z@PDxP9$rl@?4EW=AfXcwkS!EfT)0|RHcL# zTId}qQW9F|C877;L^=Y}K|w)9K$r*E?>_rIZO+WM*39{4?f)ReX9djtyRIwm5ul9$ zvd8dRWKz{HI|5MqUF0O#m{V|dH;D>ET?ZN}v31xrLQxm_#dWMfNa@`JiutV;OI!(Y zaZ%o0{be~&6Dzd5yH#tdMMOLA;S@CAf!bcH6-(X>412l}_0}HLqQ;G0Y#lyR*s~in zDY7TNnWIzTOhaJ+8$%YVZVCk>Nw2@_(SV((6Hji)-K!*aq_$$qdoel|lyV zb=XRjlc8MrGX3Lk#k-O=>dMwCVBS^tHn8BvR(Fb?+&z+IP<4Ky1W6sQ>yvT+pt?lH;cPFql*HZKv*$<8MbiEBJsa!u6*mU&_icR%c9>JlCQ740Q$y9^Fu5;k-xPc!mA;L80MXJ1Dr30#J((QIu+jVlR1gmuTfp z$PMX-4DpHdSbDY6h(Mk4i>?X{t9ka5KOXiJfxZzbQ`9Ao0PL&>bL4H0LxA1P0V2T`g?lbCwRd# zP)9>lCc3S4m*f2RV^E!t|)U*ZX|7!9Ei_23|s>g;!?JGgN4mo#}TBtDnBH9Qe6Z zkR1yC`bm7c-a?cR+tY4eHy>VG<$|MJ@}hX340ER@P>Voq&}3nK z^Z6dVZJ$XP*z2Eoy@#Mb705vOg{mx+xBoSD=_$iw1d)5TfH{5O`XC}`X^r@-c|DZRLc%Cm+?(lyG01?kbUV8Tnzpjzn%W1?ZM0>OJCK{)>pc>qdr0n^we8cWJvCnwPfatr0s?W#+fBJgblW zT}s%8NeX?ig;Q|d_yU(8DlljkAY#%Y2B``-UOW*sfbB({chi%Nsv$fkop20ow zdyqkL^`O~IfF33NZcT)`hiv5DAVBL5mdt**f9lKdDqf#B{30XBWByymqG{$_ zM_~W&Nb0Wdw;E&ZyZ=<>sKo2cUG)c4Ij8MW1`*Sic-lEo7`yyyV&>Zm>XCdmQdJUe zFKWh$+^<72-&xX5lz0-mVV>E`ohpB3yuECf}XcMheW@MJu1ZtWnE+1N$dc&X1Dn`hat0hX;d@ieY^+DF^q%-@lJw zh*MS0^42wkGRavhoN}zemL-UR?O2r~)`GZ3b!7o}jYg4JT!r>JZ?VdmTPotJ4Ek2Z zs%OpqQ01txKKoOZ^M?4MI#&R1i8@cX%0&&nII9wk3vZDZH3f3smHeT~sa*JnD(A25 z(b5}NKAx&_j@zRx|8rH&g{-nuRnCnoi)D9iDUwM1r9JwGD#uUa-l;0*S*wKp{a1_S z`etuV+M|D}a^g-^Ig&=UIaw7(|7ef?LzUCcS84LR|F5bXQ=mOs`BzoW5s8%fpQ;=S zzdzceC#sw(%V4oTRXK`KX{&#za-^+e^#4%hJWP0${SQ^ntEK9HsB+HN*kqonavs*$ z=A5c>vTKg)@=jGbOEr&+PE|SQ@%E*ss+@nXJ-T$N%5i9fov3oI%Q?25wnqcxoQ_pF zPTgYdC#oF6^M1t>RnCQ4XP`YQ|6)Y{(XlEgK>oBnI{B>qSe5fnO_UN%H=eRuzsB+$%wnwFuz>LT3QFAZ@ zpvsXP@TLJ&Imhi$K$UaS9<5TQemQWg%CR6-l>$^bKzmdLP~`ya(F#D7gS4Qu22?p8 zPTHf?FOJ)z0|AP}mT*9o!_7DdsB(bzXw|VQC+HRuP~}Le3f==$IW5QSQB~2G$L-Mv zOs!IC7XekyBb5g%fGS6_Vh~W}JYZXt0#rGJVXs;MRZi7)g&%+_huDgf1W@HL4xs}8 zRSrY7x*DL$2}fG-p0r1Y09B6Fd5LO`n=gl=-V$5$t4eF$jvb25QLz@hTdjGoVko8v zX)SCmt!4CKD7Lc2TJ%M=mg$e7xO(D;2tR3UOUB{&c9n-0kK3dF|5W7&c9eLBc{(hd z`xdx{0~|LVRwH>W4+0c$dm|Q|56-P~uH!Z$!ix`^Ic&ej$R8HdI9u`LKl58J+;F@X zX7!+8r6aF!A%doXnv?b00L%yyoQEsPEP8Wan7*(?9Mm-N9UBpoZzi2V(=I5=3Hq1$ zv^(?)C>g{E5EuWtDZ$mm<9x{Gs9ro5DfcpiSK5WQCmO|hjYZA})_pyK`nV2Z#iJQ< zmZ4Mo(mV6m>nI#=XXJ7RJWfnmrV*I;bIaO>P^xFD-|0@H2=9;s(_^p6s9CFFu5PI_ ztGa}+HDatYBT6+3&RZo)tY`A;(#MdMs)#fptdsARCn0Vb7udoaxQrJA*%RJ0rO9_! zrkN#pWgwL!mk?G77A&lKm_Y0j(tv?TM$T=iq1fD=vJaI-KG6@sb(BGn>kS+hs6vkk zso+NhHyAR3)OhxjoYEoxP^595(tD%Ww7$J%&EEdx&uk_`58NL0<`$72waf9MvM-vV zWVwD@HCV{Wqi2zCiQO!wFT#Ws$Hz8#IA74V#6Gp|Ngro06W}&9RX5=pHXij{QZala zkmL9Gx{4! z7Rnk(ZxRk8P=@O5R<861#=_EEpOiG2Ez+OdkKki}?Ia>?%*0)HnJtF+NeepzWM}K0 zhno1xLKHFc*BMm5qs_SH4QmooNBbq_hjgTCyXv&&YtoDA$mxYSPis zZELh9IGF+Zgb}87XBjY^eJbxmRpYdalCS9F!enR@eH|0mgIG=4Om$L`|wRk>G)q0%LCr3X z+%2D4&fk>1pU%-149}SfHFRT>3*PzyswAW3%}EzEt z_97Kx@7zu|sFjdr_1+^b)2w+(rf6r#SGCdj){#5?cGT*FNcvX0gvfU_*JQ(Ik&NPW zm-<~cA(7fa86>N8i7RJshxh-%2%S9o%wS2-A+g>6E+f<(rDoaYp;4OMnjjd#RD|me3rfyM#f;-~wx3=zbA+E~oo!phnMCP` zxQBPDenvRy3tN~mo$XsB@%}R_Y=(;|zRz&2g}xPpV)Hgp6Zm4IqwS<2se1k9*sB)M z)(fa1J-3q;(oujpJda(;2&s9<=~LFpYh|rvZ8h%+BROltqy>*VYaQkH z)t2!>%Ge4fHygW#&8N10_)bRhXm{4=Y-jl>+7Rie%0#I9&hacVsBKxz(=+EIuHYn` zB)Pt!6n=~h*_gH&JYaC_u)ZhX^WIkdh3JJTjW&+2pG#Lx!bwfLc27zQHS+GM_-9*S z+AH!l>kfXbi`fp|6v6x8ADpHqH_q9effmVGOEC)x6oW8s9Gh6WJM1xs_iW1_5n_ zD@o})W2|%}QzDw4t2&BlXz^E`MXH{xLGt!W-l0G`k!NbN9G$$G<{jU@XI|}@oUk}q zgHYITa=zp|()H7}7<2T}V2XvkDzJSZdwVWp@$>N-q|eAmLpY+P5fvWI%i$_u5J?;N zjge&f6A?aV;baYBdEZ?`b6UWLx!P%cv{^%y<+arM$r|Lm$Pe*Q6BS32W|Jr@72{|k zAe=OCohEWCVc!qYnMQ-a?@Ybg{QZ;IbBcaH=fIs|>3$NXHbZdWN^6*Dhf9;o7{rfZfhd&!=>b3%I9n7;H?RMNcG?vZu zJ$Lzd4Wh7EMZdp1KiZ$6Q3Tc?Vu#d*SCBB6V*T z8*jEMZ;ml<&RuVACLdlYpYsMj{DH5TY=~tVz=B(UVTAsRYmi-E7Hi)JL|(!xKDz(z z8f4dpIm_4F!cWA-|EapK7=Wdzqsjp5DsZh5{E-xx8v#d4A^A9|h$DhzT)?itSs3Jdu7Mn^OLnn?3`j}jGWlXV zP!cZSH^3bk4Ux5h5i19vTzrLb5T`0qNnG%0R#@3Z_wosW#pz1+Ov>7Lx+=;2_BcVQntQS>dL@5ODxf+CtN4979U09Sj3Zfx`wt^s7YbRRKv- zpszN*0_LcqG{|N3h(>;2gATGKT$ms(QiLqP$pEHg16$S!*Es^x#VbC)`QdY8Q4n32 zy9;=mDU$poD{S0>7L%fY|B42nC5CE-vxWi8m}r6l82r_D*e3dl3rd1C_M#N{4S<*o z5J|X38QDZRuYg@SsaDg-y-QlJ)dw4hR)*lq;ECQj^6DoH6qN-7i}ksw?#V!2ULhQPZ_Zm>%-ji9ni zBNA2uCo2U)G=wN(fs^c_dQ8~3pR5kt&NgL*%y*(HrfC&;(Ik0N@Wo$A!@0nN6Cf%T2KJ7E zbcT8&z+#A?hFmbOIqIxTl0j7(q`~)`EBvx_@&$p|2LhQ0e(*;)WojT8Chj{oo(55h z8tWt%*T^_81254?l445rlnPKtOr^$xdAz{+I;j^8!1X%RHm+}tYO;*F(2}4C5~2t! zC$S+G40iLoAD;plfJ%E2j|Qd*VbkJQGcVhQo>ECu{KTf1aK36t9|Gi59Uxzm@CJwS zw22jv4u5iV$~ny@I;|zig0|lq!e`I zhLK|;6W`gbf&&DpmB^zfTvNn$Nhw*-0*ELRU=4zbp$sB2*M!q(&@7;_A+GdytNm!b z0_=d!RT|NlQ5;!U(sQGP*V14)VCjL5yf7OOGmyh=7tG@juq_YAgGsZvheue3L9CxP0#s=p z9gE3GSd9|~mCy-NVAtL$8fDHI6kl2);u3@_trbAv>BQbdQRI;d>NsUq+$C(vB`NS_ zl)ov(3Dtxy1K6w74(u%>l(=-Lo-F)c(mN8}K;z&t-8^uSlyB-<2@p>5??AKQ-fnT0 zo?=KDwh@pTKWAK-HAd%6pTpu##BFQm^R^B z|BKc4;BmkeY4D;9b)!RN3u`$}8f2GNCuV@E+9U8MH)+}G5<0;#O0}2PllxqB_Sdt0!dh9aNI^o*1s|(*Q-6%gFm}dJ5JPrEl95m z2J!NC9O)|^k8!o!!F5$?oI)HQ5^0$JcvRtT(1|S9vK@-xg z5U*B=j>H|K;tzIN5JZh7q2@veapsW&Cc!3aF|AFIturziscj2^AZiaaNKmrP>EFXg)!Sq^CGGDPPdq5oP(v`Bu)i?mMOgZu$(tx-op zF9II5>XTyv7gmbk;_QdOseESxl*m!u zF`neM(Vd5alN+Hv9yz?5=qeX;3F^+r6MxO%pm5jPdIBcR?M97Ke4VZAs9Ekv6hC2ewMf`&^Z})>%aa16 zyl*3aV!Z%bUVZ$MRGD6KfgSrqhDZg&qOY07fT(fFzI{RZ#%PQBhie9DOfnN?1s_7< zeJvtNU*}C6u(d)!<0hINo}j7n`&0ZLlY0D&H7OGbc^^D?$sI)EIW+?%L6dEs(|t+) zQa6BAptpd_?(_ww8Cn;JqRz~`$jp^A$THQ;M(xa(>6tAmPcFaO>0Y0&o*y?;KF;TS zyb$>Du=nE;`z)yMHJf$z&V9cb`B`w?EcwhVIClolF-NB`M{hdE_=^5A7XhN&9wfzjsRtCehnG(%79#)fk zTi(TvynSj>7>&6Me6GvAIY>@yesZ_+(X?6$_Uwvzt=01}9II|l7u&=Adwkk{A`A_2 z;-#T$6-86+63iD`gevnM3F?YGsFRZ@UH{-ATdF5KF{{n)j<0xm%q)#QlIN)~aGz}* zin_G8HFzu{8qD@wXti*trH zxoJL-uI1U6?|c34Xetm@n7sPNUe)GL$_NOMRGh}hVU^s2)U8BceiupNx$lE%s*!+8JNJFhNFq~mxD3_1M zOe5dXsx>6{tUNd_c3LHRMt3g1)oS}X=L7VF8MHV$gWxF7lzY6v(*EOCZy&N)t|r78 zp_bxrRE)!d?Q{etU(>7-k33`U3Ot|q`r#TjFL~yO-#UFVCT1mBP?sd`G0{@B-P%PSjySGQlo*=)!&f|it_jTBZp`}*?KAMUPXz6I`EYw&AYTRbo zC{LpVqso)?Wb?D`MoX^;252%YD?d=KSkL5QDN#!tzPJA6{3gc%P>JbE5-7e@H`d~j zQJB+gSurO$X1DSI|0w%CH)YrPHl{PT6o0pzxz)*YA^CHbO&x!p7sCai3$}UES8U#X zud(}#=gSn{8Q?D!-t3MI8$Vx=&s;&*)+SN&HN}j3d@YOe+0~s7D(%A;D`!Q za_E}^iJoL!tkT4X?MtL%8N}7-A`N;okvrg)1LI5 zU9-0T`l8seBICzO+D$NpB>#nTuU+OR&W}q4IeotI<^8Ls-0H?>?q6i4znD(sj3K{C zvAg~L-n#y3;2!FGM$f4JzW^J7B` zH^(XzYS&4dYpi~BWS7OOinnHM$0b{?Kb`yZ=CFLD?9vkkvweB%Wp|DmqjE2O#nJl| zZ#XiT9*aJpUsqbv(=)y^iB+u!v-B~2xTL}wzmwixyriQconkC}2In1N`<$W7d}`(4 z6=Lx~@^tPHc-Td+FDVqy*P0kR^=#^0?qjLI&(jZ&c3+8S#%BrgE~LD}-4o%sy=fEN zZ0Z%Z9G8j%@x0JX@gY60*e9*~G_CtR)Vif?HTp3z{}9Eq0g1*}8k@oQfj=W)cl`*x zS^neWDgF~}IQphy8&t5RH+fb{@Oy;*oAe2e^b2*0eV@HpDCeWg&PK5)pdWmt9ZR@8 zD*8|=(uRt{7|g0C8E(?^M*V$;zsHA`TNyo%zq%!)(!XaHdX5;9TX(% z%tv7cRiPgFBHVa@Mwrr;0D;kR{ zBA3-7D9@jDZ4#9kdhETB7Jy!6SR^Cn3B-hO$8{WazOtnX`+1Es-o~HcFpl(m^Z16B zUU|)y_j3>7=*$K+=H}n>ZRcgA=UFI-v&h=Mr7ut{O5Nwp;9y$Q)D)lphLN*Dm)|T5_EA0nmwTIFL>^mx(pmHyiD33+=6f*S#N_{8onzJD#`nM~ zs5v%Nw-6zZAo2GZ7!>P58U!oIDIXrImesiTHAf? z6DXfPMfj+uJXPH^jv^ivtfwTW2z;PDn}ofVggnA+io_={QC~W%Vc{)e5cJ(%+Tv1t zEf?{VVZ+S0Evvg9!Ev{=Sq1{xgkq}4&gcs{esppxpH!ePtqd&JbC~38dGPSOQz!jZ zb#Cr6&mCd7x{!1BKQEik#Xk2AObE^hV;vcuLMXdlrOR1iRoPUtjgCuyY9dPhjy3na z(`44Iu%`>$HwSHeOJp2=v_0U@v5ewXXzh6!w{F;v?YiSjC^GndxA1!`(vxP&+J}eK zT*i)HWyl)tYX8e1CvxrlgjK&J#^{{DT$ORzeDOX@yzh`G$&;Qvc{cH96{Xg{9}= zlDq}9Pj7gBPHItFxE+&Bc|Cqo=^C|R0QP1E^^>!Vvsoq`M5Wo)R=tAvRy41`1EYek z!6VXIgdS>Z<>XzC7a_71y;|i>b-BSuH>!p+`{oX&Vj+%TROqc}J8Q}Bx$ZcvCaM!b zk$&!RSM`F@2cFy)#oqM1B?cRb%>oorkFRdn%C-z~MQo%d956XPpPW3P)lk1VWSVHw z*$Tl))Ci^Y+J6(_EiZgU$YKA>UHa5eH~1g2$jR!(8Lj^*i)_r1zP%jS#pk-AqCxj> zSmdrU%y8)SCT%V^VwzYC*YPj|xvY_lYRYE*R+c|rYIDpYR}@TE0xU8^{9**Rutv#( z^u?AujSB`F{&%e|ghmkA(%Y`Fd{ZCed95|X%qFQBQyqWl@k~$kDT{3C_AZ25PAzO~ zq-i*Cy_xIGo$LdCO?p-9CgDz_hmH#ot`GJ7HkMt< zL{f*wg0zC+0h@KYDO0UDqyG&q$2b`L4S$BJZ_MWl^MSmvHuFLJ*&Vmv7zq!avwmZu z9D99b+;M1ZT7ox~BoATmHFI;xKkoRvKX3t0K-LqYcF?cx6 z96T(|^Z~?S*{bUh4k~6k;wh=u8XQcdGAWZnf&Sx>5LE#TEAE?sNhN( zlF`oQ!I18iBqdaf%>}hP@v-g7&^{=sBWwCk^{kQtSGuSGf5Elfcd>TZpx+W?oGB<> zNsQXc?;}GUItz2}07fqx3nq1S8*VoJn`q~FT6aO0wc?JG>r-rNMzHDp(z^Le;)FrJ zHoBHGVS1DUzUsHA?^)o^GdJ>P_nuszD%J~COa!~u%BC%Ko zH4p>!zPJ}6G7UV|prNxSw+gF?Yj_g!ItrnW^1rsRy_zy1WYbm`aZ^)n@vG~PDF=k} z^A)#rf5cuUZsi!Y-|m%K?xAlQjGgmR;Ok^G)4cA`I7Gj+n!huoedTkR`d9KLAx@1b zdI4+Fy`&iPkyPQxGaHQ>+ruX;vdnWbq&ct+K}K^HXy(-NaILN-@XaZ+PTQQa$VI_8 zTQ7&f<`z)=Wz$zK;R{Splp1~y&T~OeSY%Nfth`Hl)CWHHK@0bbvC%E`(UZzgHKqoG zh*uI%SY+8(#B>G{sgbnudbHA-S}Qkl7$3Y*nKSnio_q26ghd7@$iygD&^NcQ93r$( zPFEYE-#=#q#18Rd^}^dd5Oc-OO2Ch$3*}5c8 zfa}wR-8O09`b3`316-f3gR+Z(>yy>tAwO_^8uCQS0oSKhIr)pg^{FM9hX=SmB|eFa z?Rj_pxxa=l`fIq=)I0v`LHRe`hJw@dcm(u2yRIgb#Na}#ORfrZ8%=zRt?J1Vebw1* zy7w)vfifErpwVN=vK`-{oqaK`v*)4AcEUhN_T?OnUOS`h#Ic@i$;!^&r*7Lxvy?ef z?HYYfiQCC5+Bq_#oqaEBwo|r3a^#jZ`rRhBQ+IoE6n=Id^}pWRehZ??Rf1^__^|Ax zk>1F?dbVr8UuGvA9-6CiL30pgw3ETqo2z!EYcR}hCzF#3qkdg;C^B*99sdoCrheB@ zY|Ty9kj z2v+Fe$8SPJ>UqPL0xWBAmXecLoe2ap@zSqdDlbNR=3B9Ajd$GpP#9k;WP0BV5OXk) zrv9d;+g3pkt~wz$hYrq12Z0xE>J76gOcFlAO;mnP79@GC4+$= zpIpugi1Je>iVPF)%daX1g?I#l}wPmrB?j`>;pv1Idg5#KE2TzBJ{x)^`O1Hm&zySf+az9xCd zEnE`#)u~_dEjFANpolwqpTCYsJv!jJCboAqvTny)PJV4acW-2~_+OLQh#_N*Ax~WtXF~-Vs;4>D65UNnKo=H%qQ7fFq~;^yVaW10;2s z`ab7v+yF@(rqV~a!wrzs6`l3H$nOqF>dIgFN(H(DI5K|JS7F5+z>yoTAXP}!zQ00> zMk6&lu4<1V1$U4-fmZ<>`MjRrJ@u;qj?7)=XF_@vkkoO|`&)J>TN(JXIQ!cKDg)Of z#`nMhO4)%afbMdDGpX`RmjLSM0Jjb$07oX@3GfP30&rxgUZB6a5^#V5mj#9#kt&7l z1|FUXitJE~HVE2#9uyy_m{=9`V>l>PT``Rb_3aYs9jRir3+hW03frNOKZg3WjlwZ0 zlt=}Cyc1lpD_0dC+*=wJfy=#x~nS0dpM+T_sRfMsOP27 z_b!qjTtcm*LML`FPmP7%*bbeox;!rxCUYljDe%%te3)cu*v5+Zm)$V7GvVKI#di$C zq0hs2)e(DD;o#x$!(CAjGy3yIG;y^k)D^uNi6-w9rW{9ieM7^8gz2Osa&AX38VWKc zL}ZpkurUjA{EG0Wi{#ee=QWJ%}aN8P;`by=EE^2jwxATmnE zm0NB+itk&Lk~H^K>F9mkXtjiM0FL~#I9l8A+|6In+q5yaf3fKq#`HSI7*w+vRmXG= z#+bUYnKQ?>ipN?Busn2)O^b-NTV=K%k4^p>>wsZ)l8%elje99@)+Hg%p*YTCmGSkj zID1;)F<=C6WE;o$KwCxtN4_-}A2v=8;K*9y3DF7k0FHb;A|cU`9>9^WeFbo2dH_dO z)J@DDKLg;%h~mWjRXPAi7N$)q!O)c%Ch>hE7EN1Z7|i761f6cU*f7N<0@y9_il&4?IfD<*Cl47|ac`i$r7Lkun$oLkyWC zCLXY*qu>CMEcOcnqs3+jM!mCxXS-n~60ju2*nCt}p(Y$4l4YgyAi8-KYf)92XK&Ty zg|B7trsp+ia^Kj?Yn9<|x6A5e;qRWvPgwI9k|}s^RPf>7Ws!{vm)r_h5mzzwMo9>sJ3l$l%R#+KVJan(HNvhDvvq~KxecAwZV6AkLt#mf7eCb~4 zl2qx2uk@I#1g=kBtW`d;RY>D1fA^}uq$(7?DrB-MY`+T4TJ4RuN=1-Hx>v_1RVU)B zlP9ZF_p8%bYcgbO-pN)*uUBLx)nM^8`I9w;`!zULe93;5rX)BOPWprsT7$Lq z_y$%&lPsadn9$}<=tv@T;R!v!^=Y3lz*;*bTYJJH*N!FCPT*_1@mBG(6;ns7b@Q@y z3&wRz?sY3kb!+&#jmf$%-T1Gq&|pM;D5Cz!mWjP?wf$Dz!DRj6em#h-0W8-*Y|=1J zVU{sVL%u=t(rWKsf?FZr zA_pxxY^}EsTE3JM<;>EonL{MKh$Lr0I$lJZh-SNnd|L~A>|}kl5L72!~a8pWNY&~X?(W|Hj_gl(?}3J6-Wy#%yI=n} zx#@`q0U)ybv|vm- z&ovo(bAsX4>k~(IJE96S10;kS9|y;TZSa>s)l;>{IwS0)E%Nhbg4zxi)-R ziDJMWzUnn(iR&RA?8dv3;LYK4M+c3`J$Taw@>*^9x-j%%138SV&K3dMnZlcaU}gg? zp7yYGIneKX{Hx@anss>(Li@`B64I0rquP2agUJM44L8i--kIN=5m>R=IJB z6?#b?bPP}=xt$Pfh7W82UJ=-&aFz1F_3fwh;5Z8RA)Yypf#;FQny1?77I z4J)Q}#JHmftO5agF*ObuAh(2%Ihzo8J>c=|gdmBoT0F0{7wqW( z)Jz9zz)s?@_1vs?Bq%YkefhWAIPDo078eG5hG!KFLR=@uvO3 zn!IuRkx-Aj2sFi$f}sbhBtp^3+S{+wIP-ZL-%YkO+ot+$|uQ!RJoL2fvF1r-b#It5&x zI18tYP2g)vM1lhym9sQ4h|WhAZRhH0Q>gkIjENC9dagVfo%>C?U;tsQ1bXshMq1SpRmy}^O6r?wL zTC_@f{st&U2FS!fS=0?E_}qkpgDt2 z?U}Hgov9I8xN6^fc<_P5f-2adF}@D3jh>jxo2012{~#foTt@+Jv^w`7t7%);WXPn}Uher|{@h7#C&Fr(Qy2A^rg;)yP&)oqLZ? zEk*EQV{0AW1U}I*g?}nS4gNw>?6uH{pCEloctf{VGud*kaFS3!lKVy8w_&!#bo0l} z4&J_28mdP2G%)>d>Tx9^D|<#6`?^y?dR-Xi+>5twn3nm{lZk*gguuGZsjJ|hL`2|0 z9IK;Gd+O2D4xjN4%_$aopsZAV9kNg^wsucb>Y^=tBV|km=y?S@LB$fh|nX4P0jk9+XqWbI>rE?UAVDXmfu=?IA6KHxL`cAAV<9nZ&@;h z*RaB5p1>P=py69o%LAXJ3-Q(;7c}a&ooB!6nl5q)!K~rs*vzH=3Vg`&%l&OXT?U!(&O3dxTvS{-|$PyZ%@5W__1Ds3=)2e1m2jL?W3+ zL>I#Naer;T8;V5t)`j$>yoNK#jdJx+B{h7;%aY?ZTL?+8T9eUUg@q!spPh1F!L*dx zTVMS`;rPj3vHP>{eYlt~_o<9U-IZ{Ld_aX`T-OI8h&Pv8S3@}LK4UsK*5u9?;G zQg=US0i*MwIsIUW86$J;p>e_Yj{U{GTbm#*|4=3$5-N^=k44t~q!z|5P7V4GS>&0P zggeVOQ{_Fw%DB2d;_XyI>#lXRw~;bxzfllb6&O$ozguA1ns|5pUg7=P*QYG9NqVYk z(!a3CqEO0=8LC$IN~0`lEyIrKRZK)uiC?WHbAVHXMO!GlqCcDAH>)-;5wo^r!|h`h z`R&H!!$F&&Ap4!)!q1U8%6bCz{(%PKf3nE0THe=s9zi)wcDHhP?9HVVz|#J-Jb|V3 z+Acp&S>)9FvaQS0wZ|;7htaZjZ|Sb=>xH#O`>7Ka*<0UqQ zclox)eG}(DS!BIzP1!$K)0w{q7i8 z{lOyZ8rqz)$hF!=_LYmrEb@H~V}}zKIh^6A$%|3z%IVv~FRq-h$T}|Ttyj!Ef3k0z zzCK}*{dQiN`_iaMSJz)Wc%u&$ zAIgh*EffyLC(#QKcH9dSNoQHF7aP|&s(PPDDp}G@g5w-(7@j_R^LVP2>lLV_R^&ND zfQj=)Ge=X*(|NQ|xM%)@%5ix%r|pPvBB`?kzu^L>?)~X)>YJ5Q_uJiyCry7+H&iTT zZO#rvgs+#J4gQ}gh5wJiqW>Yn`rm;f{Xh0DxI?8t3?O=72sI6YG5t|Lqgv{GZsirl zqd|IJC3i(Pn#f{f*3r^xz7c`yddKXP)dP~Xh;_M~t9~b%i<8REaLAFn@je z8|fN;N=FEqt{HJ>(wW6rxRlh&c!`;)dS&QzRuwNr5(3W9NI8HmPo&-TAJfRi*jRer zKIcY~bj891q^Xs6Ib^KQJN~}+Wf3D*ftXLcZ<@~U!O;V$3NOw;f2mVwZ;W5lWDvGr zmf0n`N$Pf8szftwLEXBF9J%1tVoRa>B1CJ74<;_Eo2$lLhXLE?M5Go98TzaSxp z$Mooz(na#54V;XkPT`5fwitc?{=Gr?zrH~@Sl~apRo$iE_bnEGu!sn+?s;@`J8|-0NvglP z@4sOs?|+$qt@{?&f3PHb^lKozZYSr~?=|D2y|MnfAC>*Tzql)=2W&MR(KsXi3k2-; zzpdo`GXeXQ;WeF$_nAO%miT{D(Cb3P4|vl;8n2NFZ&OH+#aqHiGZ*gFiV?MC=9u1B7EA`Yw_#D=?V< z_3M>DG!rVyAV~X!Vg;P(pAeu2yF^g$E8sz*tli)SrjRBB6s;f9P6ze^M3ShEbfQIK zNdxowQAK0O?p$!36leq}=B)%-?h+~J9N)ztKrzo8Hop?w93Qq;6}CYd&}xA60MUHo z4_{Cs;b{nQYz)lX4IEMr(%}yVJNhLD23vN3p`BnL_T>U(q|70ochSd{JXgO>DP$=k zoJoWFu~+!Bxe%LOfAt2kN`Ng*3sGeXRdoqf=|H_eATM~402i=O2guJcqzez3+0g(c zWDb3;3Ie!@i_nk}b#QVT6){opP5$8c_)x*w6WF&nLS-ddO&V0$5eneKR%j^H5UGFw z$#6n|Leq5wl1v&ZjX>5&f#fh?u?Av@Be8^ZgtKAXOVgX950oM#~pK==*>Q#6N={UW)F0nbQ*8h?R5@rOBpV5S2x zuTFgE4|c;?9U{I-!MA}TpE>dwZM^MCL-7e3qJD$`<;^AtxyE11jYf6Gi)}@nQln-3 z#8IwD7vCVy0f6xh2HJEGFAALjFmRiEF^hhK01cayvNRBdE2SQ}gpQNOkzt9rq(Kd7 zK@QTOP)=ge*?5C$Bt#%lhbgHC1LlE;Ii!&&I)JNOq3mffHkcq@PIzK&u$2R`v;)|Z zEcrWG3gAOmnm}&aK(-Cw+d!tz3!s%#`aArAh#?RPgkp&F?2!Bkse-n#;RdkNaGjhh zxX_SH-U#V(jq)lcbuEY}(FXDoo*)Qx<`5uH91(CU9o|I-86q!m!XuTkSacw@I@E$* z;E&a$wiqyE70GpE1kdb5l955xq`(TCVRE*~`nY&2P_kVDQOjy9#0%Q3j&W8ZVbRG} z27Kt`DVu>rs+#a`>NE>LMy~qZlevheq;ZvASbZ$m9h(J|D22^o;nMI`PKt6Y(zPpD zcp#Tpnc`_RC1jRJB|b-kEL~+KrBw!QhX#KfkGxhDimQ$pcgb)t$JQBzK1#@~>BzhY z3WG!>Ihd2=0ULz9%z{1a2Qr$4H1a35c~2Tstkq$aq?nb}Jj0rJV=OpkHJ8ae%FhiQM7Ov=&O_dmr0L%KbAkbHF$XaZw$}UO#Sfqmng(eovp;Q3h z&%L($t`UvQ&xQU}2j`=UivtU;1tvn!q$4iarcUxDH0jU4M3PD586mhy9Hv{OSLJq<0vm*PyJ5ocaChnOwJqG6PDTw`f3bn%Xd+Ny{A8Hw zkBP7ALghJtU4dh~YtSf;>_Rr=two7McQz5Sm9FVhNxg?O3W7bAMJ}-rGi?<$twLTNIS|Xpz&nA5-iz2{ zy$aYM)RR^V>ySlt7ultyJoV0dA_We!jX8!uIcwhM1vx(kUIchwn!42vnTUuieO#d{ zL^VlXsEte5@1_{(MpC&4^T~p(WT}^x;8QL^>^+V2+BFZVDxYg$mVp7$uNXpnQj0X0 zg%dI_1&XPz+Hh}{(hgt%$WzYhQ4JEc-~jEK68qgq838ySCg{jLoC^VpX9Cd9#935L zpANh%h$Nmr;bB*UXb{Qu{F?Kq8YKa+iTztrWhC#h?!HoZi{x$yRU>EYkdVL7EJixG zsWu4NEDdr-5GyFbEcU?j>ZK4gOftDSFuB9-i$TO{C%7Fj0_2xprHsF^=bxC{q&-Gd zH2#VCzCs{!hLImzL2CqUOD8exd=I_eg%X69gqGW$^E;8{=KRG1G#=y65I<5 z@1u====}jw&jIq30m|9|>gj>~N4i>q1MVw6G@gU-&_R}zLAKgKj_E;8Dt-Fjp1jj^ z0S&JIr7w1mTX8xh|KD42$9Axa{Ej<0{cn|g$=Nl_atAZjqXh3C^BFlh5#P#~{-qU{ zH(F%gjADQ6ge5QeE1!{q{~$b#ciCQ>?mlhBZ6*s=;Q%|>X)EqQ81kG}>OWd>51IdL z#nqIJ_GO>6;>y=YaU>I=Kr8O^WYzO^g;2N3&5sSf6z6W5%x}zhLK!sL7lyz34mIR)$Qs zwW}DQ@8(BgvEr!0WI;F*T*q+rq+ichdN+s3P38W&nw{tb7ly?%KHl(bdWveHt#xBj zqqo>~YoQ(BX!I^u(#G4D6$!F7(PC>5pBb>G#TyLo+gOBgNfQnm_^q1uCZ$(Xa{)>g zIK=;8@2!K{?D~J*lt6+@DK3RVvC@_TMGM7>TU(05Ln&UMxI=>_xD4_RvVY#=6cX)rqD zCKR7>X-ywS#CN%OIwbNZ9gNK4Y($#5=ntQ9Hl{4~{B_UAj>0Z_+HUJ^MmCdy*ObNz zf)KD#l*PrgNgwa|jQQi&QGYA&*6 z>L-LxUJ>X)seyS`GNPEoDz@v7>^%^hsW@4ufHw^7zJnPslq=5CV(|Z$uDCRO$L==T z>m!&5ZaN_nCf)vo^4L#WKK)@#cRQ27vA=Rq`lB4_4mQo>0QLTK(*JGJ!A_@_k`B$8 zsTNt$sYF_m5k6=jN+#sctDmRI%9t#VsOgm5cPjMnZdWi*G=`z1XGyoREV^e)-~i3a zbn>R$cTK!#^nmd+H>+F`R*16y;QGTqd`AB0!E|#59$ub&8pjy)z!se;s_&7*@4J!8 zoVndC5e$Kk!sHXV+zR<3Sd=4)vLne7S=;Y(TvW11BQq6)(}h?GKjphr<aL4Jlx-gq*IcVxG3!D z=4mQtWApeU3wJ-C=EHl-N%GX(*&lAlk7o>~m!~%E$z#}E2BwzM#3g27}LGUY6!3tYqRM*3Pik0bP16z`U*CSye zm6^;6+p=2Mqp^dP*}MbWimumVsrXg7QVKgC60XN{6|3^q26j{%t|v-EstU(UIduEu zJ#oIY;IWtPQoW%k$-)#XaZak!LVo+)SPj9CwD5ea4zUJedQ~I|?NQZE!Oy>VVt|JC zER`Cje}!DsBn?o1Vb!>jvNX5afaW*MA2h3*d` zwVJVk$hz^xyVKl)+ci#PZOwCK!%Vr*`GaWZ)*=!6=opmD-o-N%S`IQJxq%1g?frVXcl=y}wk`cX&ciYdt zRZr&OA-WzD>|Gim7M>w}DAbp+M7LUp-hXpW{n|MH?b7YYp=mED^lr~ds%ZzWZ%3n6Pl#p0RKyifB5V54)x#|9Pew+d_;Ribz}4ntrY1fjpEB zIrNPXM!>(LT{MK8 zxbKj;w@FzkZaN{rZ}f~^YmFV79bL%a7)pTeKo*E49R!OHB3kO+3Ud(Ov~nc%tgiSP zQR8G_>^KDToWAtrLU=redxE4PRB(^%9Cuik)p7M#rfjczV&{u&#}75G@F~xcDU8Q( z3?RZo(ZpLt+WWZ6^{mUW%F#_CR!}y_+TPd^u;uv?(^rWc^8==@p)`ax*L@h~h+E?; zKpgnke{zwhdPhU5?|b$1Q8LobpCz^V>Q6ZbH8 zbeiV%7KD3xv-p~@_`%@*$xhzrv5*)iXB;VqF-h1DOaTzHi*&3 ztM%-FPB@Pvxt)HkyQ{SCcXG@TzTh2};7upL_qpCJ#*XBhe!PVKi?uv#02f|D=-VmO zKSGmgL(pV`Crtd5YrWw$!STjG?akmz^4G+*P8=-X;eLKP9AV_F!5`qB=v$zyOE;!& z$E%Gnf^BYgjv!GwOGjR)dAC2s)sM&}EKr_*zq*$gv-3QX)b%OW>!R*ZhHmc%(h#56 z5Dxw@3=KcQZjazv=Z@M4D9}Yw&2eTb$kZ?79ae-Czwdrb*a`W!d6Q7Z9`01;kPlK` z>{lLKR#ES+VCD$VJV*D)E{8rNGw+W)S7ae`%=Rs6ArMSIGpqGkg9MK7ePf+ zc$=&HHDCR31q8%mx^sy*(`-8Q^1rU7u)T!`Q6b5b#;$&B zbj_#0Oi@k-vPNvGL!3<=nN1$x^&~50*d_D3G{i+xnWm8Y`_XJeJEonGSg8tJP8*Jn zaqw_=|5UUqEGqxFn>fdkDf2X}w71?t4V^Y2&i>T7&}2y3j(V6UORRQX9O_{9gfeZJ zB?`Mce6%Nh+%JTt)^mm>R6Y+#shpwE78?)qVPJ7LaSnOI7Odf)j;ro< zHO;@Rvs&ylsF39*uE}zVaS!A7_TU3H2qeYldn(5!w_V$WW2fsm7xHlh-GRL^rJ;U^ z1hwgcDR}rRC&zNr2Lo8&%6p5t1#Dlac?NZRj`%}I@}vFW{sOr^*?c8~*}z%s5+1IX zU3m$SGv1=k!EBnvTjT-Ptc8x3d287(>19iqfL5hD5xL;ZLwJZuT*)rHAfYy&jy!`_ z(|X>ijQlGnv0v#=W2Zz)h>1q77Lv|a>jxk>dh>F7!cFXxPxH+^T?&3)M(kdOTEs!q zF~8rLIT^AAb#9vPcU1WVa-Ik{qg;W-Gv2{kzU~dF2jHNnDF@M1i#WmBglC+ff*gCT zyk^Yr)5Z<8IGJU!5UjYQY;r4IR1dD#m*6z?S7+Twm!y7mcXjr++^USfg5vFDA9Pxz zX*Tk-nLntgCGg0QgU zHO6z}#^AC@-mWXE$<&9ZMHe`0)l|_Ga`%&3&Eh}-Z(6O$(Rbsms?=iZvg@ARa_*B9 zbii6I+1l1;ZR9D?`SmKV8``V`%@?!n)ix8OY8;qrZSPqLQ}fznZ#m`P*m5v8M9h3Y zjBe(hi!Fi&1C_bj6FQjMermznXE(C%z@4r!Ei7}ExIrCe+NC_o9G@=%i<`w8Q`w?1 zR{QmK_&etO&1j~`_%4OEpG5qY=FAS(wMj=zu+|0+wf=793T2!MUlG2TV72zAy=c*H zU8aRSd=X#o{ksXN8?nu8EE8G-fK|t3PR;8MQ-5{DJ-DLHL3-1_ zc+1Uas26)XNWIq|#y7N!E4cq=s8xHY!}j;x$o=gQfMys?Xc%4RH=lu-G>qLej5|M! ze>Y4>GxAVq@@~?KX39or%1&p>!F|dpY09N( z%58qi<8BH<1NRbw`{=--?r^^(xU-NH$|o5zkNN{m1wM*x9tm)tj!l}5Z<pbgG0;HpG$FofVqGH>_ra3a^)#?BA+$tF%@@S2(F%rH&Hqr1H`o;#9ms$F?C-=dw>rd#>5(&-nRe)k3fe)0BK7w`wP&u z(CUc-p_t;DUD0B5*dh>s>llnNI(>t zj&7chmO!|8Q8;As+JX?{=SBbx$N&{BSvqM<1F}-y`6{&d;pb$EE@2w&R7k`^I0sHo zLdnoc)K@6$ka0WRYpi1^oG zP|0M-Tf!EO-H4ZjQ7Mx_5qLub80|;h0DSFY@URumQ(?fqB7#kra0oT}7H@$fI415} zNsueor3;gRGezWE!e*TfG;93M7lbAE;7!P_MKD+cdHXd9tTMFn{@b}x%CUUOWmEDJ z!y$o{@Nd5+Kr{p!gy*?%b!zyf9q^6r8BP@u-a{LN4^3ir6|LD?uVy z-(;qpl?ne@j5#fyQzsLvM7H|;&wW2r2z!WbBSwTjNRtD$P;MPLJ3I^c1flN~Y9zud z)1#i=JNJL4|M^uQ2Eoz#F=1Q36)%(mB4rTyz_{Kr5~nE5tT$$OWZs1An~JtKlBW8+ z|5g8sti>RFKGTbuwqjtv5OUpiH7!t6SQd&cXdziz`1_f{Xus3f?r(bqdE(jjLx@#qFMy|~* z&{kK<^CVCvbkNV2GEA>Gn0=2=wyloxTfcP%H@PMT%h#Fo)dVw}wiQ9Y1!`-CDZQ^g zX}{RMVA8A)>q#>SfntO4dK4eFA#o-Q^uG}6?PzkdN%5m`CluGxfoM|DP=b&;POeAP ze{oY9yj*87WNEA^1Qw`VlGD<>Ho;8fBMO~vPG^&!yo zv1hhTl+BcgwNgWf%Pu;fFaemU_HRDpZ&w_F2S+Ow%?B77i9qub>36p6rO(JW{I8Y} zKM~o~2+1$6bVCYV0`QmW^}X3YiC^n$&ikOV;_4({@5Q_>b7{{E$?xw8$XnWH(W$jN z?_Sr^i;l~9Q*DEfG<}uJa9Cs**y|$PLyNtk(&yHD&RW;HDpvJZ+VQFOGq~=$b`#~S zU!cgoL>K%K*VwbK^13*&K~NjBFO3@Ssg_2930wLHwP>&f8Tl#6G;m)Et*lW?B%C;A zJTU9sN#y0fvJBDrS!XB{Qiw1&&W^@o9n`P?vNaddi5O%!?Y`ORez5eZ-e%eMr1l@K zI2eQKrWm$XsVK&K?lrh`fMj#`#j+`qEc40Wu1RBz$`4Z(zgq9!X&1+vy7Kqw4L4kg zLi*leWK<918FC8eFsZ0Tqe9V#p2v*oNWhsv&#YQ`19mZK>WO|Hu5UafIL7#RR?d7Y zBZ+(+cG{B)f`m-lt>L?4clJC2;>i^i`P4df#_)||_^T@jqs&;ejWyw_c+L2g^~6$7 zMC+Ql8NF%z+W_WVfcIFTrquqLs@-JoLc4LfZL!3EopAn2wnBG2xyIZR{!us3aUl34 zoy=w28~PVwgZ{Wck6I{4=s&Kwt^f&kdLC&B@$m;3B)QFW_sTF3qMI;mL^g!pT6JoC zojR#;%S|axRwA46hxAS-Kc}^~MC4k1Xf5s&LqKbNVt|=|T>oZ0=rqw#e~UB;vRnY&(t)E*nzAr4lgm0!3?NbG&pb9iLQy zDCaW21aT8qaNPTVIPyodX#5ZRhI{&0*R}CU9ka0!&!0pRInPsw{s229^|2bF_c#qp z3zy`AH3+U$U#`|lLwUy22z*T>p3V@ymF)&8=c2;|Qqi87uuwfx$9!BDL*(nQsry8< zRaHHGGr0L)aHT7Xj@7J_z{%Bx_?9KyviX6eljT0%c!{Yrv11C_<!jGZMhs zM=YTVg>ljrd`K`(37 zZJuT3IIe2?R;AvASk@AX>lmg}JM`Yi{(9n^m}admToTYe-FG%j)Kl12R9HEoLw7`P zIY#JL?Bt3?PZUE-H>aXMg5G?zpY9)Q83&5ImikG(jI6U;Barefd_PFf4BtDjozKNe ziofB9nyl(Z?1Ea5PYFox9%&+kigV4f`0ih~}q3C18=Eu_ivAF$upc%KDhM z{iW4DoY7dCiv?0syc-ZoB4$`T`%cv&K9F)u%V=W_SQGbto^ETUGNUnBX5zHtU9W+C)-aG^1mAkZK$EIeNLHpYk?G1<@%WG@l zc7*A5i@nIXekHvz^G=224eu;EQ1;ti_%|B^uB0?8^$tC(Spcvj@M-+ZC6hoKpbyBQdii$mn=ttWza3^Q9IKeA;Z#1eT> z*}Uvugy2ZUS!>33`(@$fZL{mgPnalr)J*IXST*+M5%*hkyB0E^7IKMX{8CRIbswts z7KzdaltC=(`YjOtB7dh}L(8x0a9F%rggH9v6PGg@=lgLifH}CW+JHNI|hJR_F-Jvx*>->h^W%a1b znz74UxRLFrKA#|!zZ%aKeIcavKtwgNdOz~4qlTc_mK)h?+JU<6VBN4bgw%? zq9^hZf0$|854)ZipPtxAnKvJM;wyU+5?TDrd*b^2MeKx=(R))L$+EWhq;vOXRAz)y z%U*Q@Uu*T|`1IzkiDYK>=2yzXKFj2t1(m>Miq3jV(B(YqddnF5%H6vBaQhO;aeUnsNAGWbBrk~_7lIS7XH{S8<^L>~%iS86 z%oKA1hfXZFt~LO>_pC|o1Z&r%whoTPyNWr@@Fq+TsHi9ROJZOgx3|S$V3Jxc$)}+L z{un9^D~0$^s}z-(_$BzUdD*@xIZ{Bv{fKU4IA39k-DBZ&s|2XcJdOV_u<4^1Yd5f+ zshHT2*|kPuczlt!CGtoxtz0%8Z9tDq#a*XM2SavC|ECUAdxu@0YZN^ zaJrSJ2YBbv%gI4ezlA;wDC*u}97bF3F65R!FD=edCv#$Ll68#-1f=g%w`cQ#w={{8 z%R)X<1f)L%vMaL^4p1s`!1Bb<2Crovd>SE1k^}C^e3a$0Wkw3iEpf7pdm7{{F!7DK=C6^IQn0xT3 zC_9Zi*9r(;8FZn-NZ3|96BU5+jq+dw6t)KV7mUePjX&-mlb;wTk9;ruI^c1OH<@#U zR$vn78Ar(~hCU*k$D}s{(_7_^h{q}~N)I?D13qFz9}Hm1pZ%e8^b7mkZ=-Si^HbFa zbK_s$P42XPn5M)|M}&-eDXl*%SZ(AUrsEqJ@$=UA6Sb%FNyi;a%#Vw$R1_>9RSDOB zH)ZGBU|=}qfKeyZF$il`rdtk9WD$g6D%4OxzQQxBZ83WagDxl`s#XCXmp_fR_s{CR zxcoQ;wTENdO!-B@=XO+(dj`*a3`!ol!-Lo1y>akR)ZM@4nJvQz%fgtgc&8Q4I9p{ndn1Bw_I0*4 zYPK#*Ysw(8zGJp=Vzz00_UHNRFO0cnlDU?rbFHuE+TP8zf12wsoa?lo>++rJj+*Pq zn(M8a>+6{7pO_n1pBp@%8^V|$CYc|3IzRe)e(c@+_^0^^!}&@3`6=Idc+~uK*8EJ> z{A|bk+{FC+`uxKAJaQ3ZVToj6`RT&S>xI>K3u~Vi)(san>=!nD7q+4nwzC#?sup%T z7WO6<_SY8<&KC|b7LQ04kDo4{yk0zgw|Mqx@!W9n!hZ46cM%b_c$KwyUA1`Av3NVN zc(=ZIf4+#sSOSnPJz!cw<5>bqE}^R~VHhoe9G1Y)CCun0tn4N1>Lr}cCEUp+yp1LN zizNckG9l?Q5!3QRo@HXmSe0VW$MXgnvG@Ji{;0l z6*|%tdZv{pJSz;6D~zfuPmNZX99Ed2D=g6~tl2AU)ho|BSJ)?4o^PzYxLA1!TIC>J zeZ{oO$+OBOxr*dgU43n|%Hy!g3ti=lUgghT6{ubn>|A{_xhk}=Dtxi}7PKZpx+coB zCdRWSF1aS5y7ta!P10da3c4m8y(W{rCR@EG*SRJ?xu&qOrg*WY1X@=nU4PHC{()!x zqvX1Z>iQ?6bybITHR!r}^twj&x@PsdR_D6*EiaxeZ^@@4D8$rn%oNB*b2GW3I%P4k#2`GZU5lej*#4rRNam;+KzVEj)88+ zMsLSuZ^u`gMrE6{dDKqM7d2M1KYN@77iC z-sSE#On$xT-fg1_9q?or=a_A=+4-E=y>%0Z0G*m0pKDU{%s`8g#I3bg-~*zG*nn>^UxI5@aC zI0PLYkscm19iH$Uo=P5`sUDsi9bPybUP2EM(T7*rhu77IH=T#KlZSU3hxZqUNYD|0 z?C1gW5gP9iQ0fR>?Fhs82;_JKh8htbRFSNp`uNW@Gp-Dz{iAS$3)D> z4|$J?rH&t|9g`RzlR6%g!H&sejwy1EDQk|Yx{j%*j%hZJX)li-gHPzlPUx9Wp75S9 zNS!dMojf%@VRAfShMlm)oUrDcu+^MA>pEedI(fc%^5XL3CHRzs?DQ4$DJSnKl1u88 zTkZ6<@hOkvDKG4lFXog#=TxBPRIuyx&D5#T=Be=I>09ub2-%q^^O+d$nYh%Mgxc9V z<1M`dUIp>-+=UQFo+EeE`o9DWh=YN4O^vEtgGhgWQUVM?dFi^WNG`=u$yfB7c zn8aL|=3JQ7Tzu`iFrT`x*u1d3y!Zybv?9B-X1=uHy|k6Ov{SpZH@lT% z=UlqfT)K8$x=mfWZ(e#_UVaB7AY=$nW`q|n!dnXAqlWM`MnD}AFc<>q7lZK6K?Kww z0=p1FQ;6VAM93u~6nqs%b`{Qi^@H~+Lh33~?JCOnD%$ZX26h!2a}}3!6<>3e&~=qK zb(OSvm3(=X0=`ZqyG~=iPUpSOkh;!PyUsGc&UU=cfnDduT<7In=hs{pbX^xtT^DU$ z7hhhNfNx64ZpxT%%6V@pq;4wJZmNuLsvU1?U^lffH+4BT^))vQT{n$WH%*&2KQC{7 zfp441Zd;gdTX}EWq;A{QZaa)`I~{MkV7J{dw>>$xy*0OeUAO&Hw*#BEgO|5M;Jab6 zJGLR{s1(e-6gD~p9f7@fK)|My?k0@y$f{s&A}}{{$Y_c?C!5gS_@euQl>0RDZdppt zjvU}hcTcu|x5hhcuI{nHth_1Zz7=}End33VeYYL6^-sk1zf9`?Wm5m&*rfjdSo*_% zWnch+0QUdWUicq<@c({o{=fNDJ|GDIF@O{mB;pSMV?M%U!36+-#B7Xw=*_>rW0JA0 zjkfuT`#mIMDnoGScX~?l>EB|0Sc7;of_?0qPL^dtvDNOsPCtAi@5yOeP7QgrCKJW( zJ=lmTl0D!nE?B&F#q~uhiaJ5o4g1s5fR9Sdk4)@yw#jgvw>BN7BdqG>y3Wb(0_}>L zf#Bj08cbe>-Ut5z68;nnih4SJl)@c=x%vC)5N+Mf-hTw{rD-Azgm?ldFT_flA1N2p z8-QLwJCx|HS-;cL;#8?--9i60Bm7 zB%t@-@_Niix!w3-Y^cg;cbER{y84$B<1yQZvn}b)P%HufK&CviCxV6861|equmgy^ z54J-Y*%cxK06G*l#7`ixT&^hQLgh0FolFopYdvAMe715%y0(Bw-lu%|j9WLhs)DH? zwYG;k^(2t#5|c4u+`ecNja1`_UImmKW4MNMd2n89+-#y=-*v^EDzfBrJcM|PThN9> zITgl`BaiF!YA!bRRZLX>G^1g|i<*rA`S`D!V|s6Is@~LB8jY8}%-6NhsQfxsW-FB# z9F>iNFYIxQ`EFhuO|?Z3Bh7D}KCcghsbdwJuFukb$-E6Mo~yU78LSKRzSM0pap+#D z6Xb&|HD6!s4lFJtdmua??9$-c9Y&WSD-PykQtXcL$mu+8X-xDyu{d*6yzsEe>AeU9 zq*HxJ^quH^sb1vL`%u`hB#9G>`8JC%gJKumv5NS@0-w{e5C*;Mm8K7T-N~B~EV$#8 zA;vulX9y9y=VJ^b-d0=uA%TJZpCFnAkQ5;4-$68(k80chGbaBy$P%TGml)_|a8>8J z%QCt`>4;{m^(DSYdjbH7+CAm#;?JKdK+%s5Q)FZKY?CEEJY|xL=dnlC#kvO)D{MU3 zD1%~Qe5Ery(0kAFCUV|aIAq43B3vm6JDV7so#*#-`)SuIE6mp`Xk9-xC0#T}E~ z5NDesWpYCvO@fz)vu$7PA0O(tIiDzMlk2MBf znl2hbM~nvGXzmVUr2i;+mdp7R@*OE%oj6_gL?PtmmxVc*kyWYWhqk@w^<&I(>G-}+ zo|~O*eF*1}!gr@E&r{0B^p&LXC&^GKP;0;+rnD`9N9iRbKP|A|nf5iE5RMYy$)7J5 zSey*{YI~p>3wiKtq9NwxM4}V$nS)#{^J0oz4;y}e?QshbWsRAfJAb;;^Zq&4oIGU( zd?-~sP*>gMbY?tKt-`?y(DGoW+Iq3LNs#y3eDimlONCpWogP2{SWURG=5&3?m%xf6 ztonSnA!m`cG~xQMr^?`0U((GYqJ@b9H)SquQ6mQ9o{O%)9wr$IwpzSQqTr3`sc^Xq+)`av$9 zPHj56Dhp%#OW&N8*ho73HAS^g?8oJSSRst+HO!H${uEyCXvW^kjQ5e!5f{`m;oBbr zNWl_O0p(kx`Ff^aa{*`TiXkQ=0Rz(2d$JLFW4%oRWzVOI71pz}1dkz$zaYS=IZU;e z?;|~lfwbo8FBg9X5O1>2Ak1FdBGFCbMp0en-4O4de!O#n}IZ2qb`-uRM_cYv`j6JB_RVp58!21&b6{GS_7`qX|{8AxRb?pC?}mergh zO=3pvOla~kMJdTl6yBu&7kEYmXp6APyBz5ZuxLj80FS$X;iq+<*z9l=S0I^B&9jr8&t; zXm92X{=8|hU+-W#`Ohs_7c7n1fXPvaC^BLLtFFqU2d7M9uu1LEJ_fa!GKdXlc< znN*;sH}hDdqs3y<8BmK;i8CGZHT#7#$^->vViIRJN3mlPtLHGn3cW6 zTz@cXoaGKC0i!<{V5{Wz`@hdod`(%o{V7Y+y*!elYU{11F*DR2Giq--++-v_t9vs4 zeX(&x{yN)meqV~)`hoiv?@@D|9oDR`9~|{HY#6;@@~*nxS~rxnqLF?2^J*fPnp%V~ zzQiax{bL}H5Z{^S1AIbt2g3LEBiS{9*^+eEY2GOGPw**uBcDa;KUv5xU`f=7|K0BP z-|c4kySfiiEBB(PFX0Hqmn|#ED*E7Wi&KTs9&JPYEM% zWq!10hp*9%1H1+1)^AD|5;iyH6EQE+boQDM#^1N?OV*}sfX4I}x}u#7*G*#H3X z#3W|owmJIUFbqyXj^<^+7b23*j4ck`UrxXo_8xL(#WrsXP`k_z>*g>TD(UNiyro3d$UQs#_*A|4J3u&;1NHw(%b%PBVyr}U{c8{jKpR$p?I2IY7>5US8Q@c$fx;ud-5bDaq z*7ZOr7lKFjSl4duP>wpA_buH&D*Hb=Vf=ZO{6BOZIR$F9Zt+G3V@jab?^Y-wjxcq* zc|@5S8JA|epEWTHGZyhhpj3ILOvIh80+uPGf0o2Iw^GarGWL(YhcF&Hr+GQSTo#&mu z(yIbKa}`ch=NM98HKe4>yoM-?2Qw(qvhXZ)M;vQEW1J?a*zhdnvT5Y2%t&h{h&kGO z<->2w0Pv%A!+hnUQi`_uV$M=SVC--ni1ue1{25MqU_R9R{+*yW3IMD4i~sHu>lr?Z zW~+~l9>=tjJ}mE_wDaL|rE_(fe~}8I<&`wAFo1+B+{IF8#I<*aMZeUk79}Id=urR$ z;q`QLWrVW=%?_vm`HKZVgj`kAD2$muXp2V}6+W!o9(d62!Wb^_+9V-apw6Kv@7$oV zP^;quiA%*}l``BZ4~y7Su(qdsAE~>&n%)GxWOS+^ zT$(A*z>Sw@+aOp}l6C#JSuYDJXOy=dt?jVA9;3H%wiat3>9ihalAX5^PXgWENU-W; z-AuH@*Vst~2bY1kQ105ZXmgD~G$oDaKyAvikMHe$N(KtL)Uw+M>j~Pwf zvCTSd7F{mf&?7k^*g&5rh^HUvSfrS}U{AU**{G8dD}=p8m1{~f7W}zx#>H0~iBd4X z6$Uh3CVPEK*_4!11r1w2sKvLPdBv-swqQOd}PIgd-M)~l85U~Sfm z?uk@f4ewve^aDpL9X>XUT>Uh}E-iALup{`*Z?m4ThF@4n>Q+S15&s%y@epFnkuDv) zZzp)@_IyUqyW1zpBtwCfSPY$~@;%OB@F4_KJ{3)=)$ar23+sp@2pJ)`9;l#fwO2p{ zC#1)$4e#-|5R~A|loHzgtRyzGn*4yQyOp&5$QLiJ9gsLl*M)Z|!o#h*X2jd@1_kn& zc%}U&wgKPo#RJc{^o)$d<*R zCWA8TacUPe60`rM(JSe(75&?+=N~1vvHu}F%YcETfV}MUZ?j&z%B#0d{Sr(S!Mz4X z(DdJCJuc<3v(K+boCXZyABr#jHtW@8S*cnkzSZ8q>&=rlw2VmlZPwFTLn^*+J#}a@ z$PhK~A9Vk1)-(L@mgq|9=GDUlZ2lbIhri8wj|6cHO~jKN2YjR}707;@_3{&flC3lF z@4Cc^PTpgO|2FGwf038viRAf~Mcb4k|2x&L+&4S1oK*@Ve$4Co43%nUrU(gONLz@^ z1)Ju{MaiPfdY_)kyN7**X{u!Co)_rhJ(Dc&%`ZZGl#daf-__nbSzZ5$-oPSEBZYDT zuV!F}xx8_ATSyZ7B zZ{PGFlL>k(UXjV^_Vj4{Mdcm(zKL4jj7j=MRcUZhIr{9(400wqx_qF>(s4F(_WGhG zcdf_@Ca1kbd0A`4SZot>qq!z}M#mp4k_aSr9RB^%h+0oR`S78C~yBVzAK`Q4!_J#N`B>G0-~Kou`EEXe}%LG(ZLZ?7Gx~H zN;!+@QN3UkIa!@XVbdsRUa&m zuIXQY;d+JAO;p5o$!~BbT=knMR>V*BZ}2o+AqT8NDiSy4Hw9*|{@0V+#tOTdv)7Zg zgDAJ{z^?Ai^;9!{btz0?PoL@r-u+*xc1nm=s{129rN$MqAw;L({c%`m;~KNlRj=0l zN$gPL2Jg_-pzHlgEu~*q9qIQM4U2cnLw7fuO5aalS@#Io_gjk;%|`HwE+Vf(|fH=d7-p=jOtzmmmc?}-f!UE!U%6cC+rO=^j9VxIRGDN zOrJw5lyuMKG{#36?k%S7!C^wmnG3)>LeWURa&QlYSZ{$^Uu8buH8o#DYhP?DAALU` z9mMy)a$WQYVKyueHfo?U($G~YA5~OlU9OKj0$MPIXAg(H^@CySK@F^ZAEx^Hz`ZSy zu^teFi zU;5<62E0`FS+DVr!VCnm1ZGGD<~sS;@_AQv2d-}hW`ctfa|7CP0fFj4-~ED;$)GJx zfv&NE!&}f%78ho9?}c2i$?kwUMDW^{?`(H41Hz*q)^F4C0X7E^dnx3ICG;2(a*i2# zVG^>5>2f6nTipyDl=c9`dBn1in#6`Q)rO|P!uHj|K3j+3`a`gLLW%r6Bmf{{KEMY6 zh_WY~N`{!qKb){9jMzVf#NXr6@dt~>kF=a0&#)jb;=$8-$jD#nW< z)`ve9su7E39plbV=u#K!e--OX5eMUsbD54tY4sw&fcUyNU`rf(l{#8WTmpZ5@-$&4 zR=kmQeC`!tybMv6f1HJ5Jc{f~iBm1gi!Z4oERQ42-;OWXCal9sFo7l1$Rxb?jZc?J z%+5BkoJd5J*lOxf5|{XkBEDNAajJ)Kcv^CvpEQd#sUBIEv?`N4M&U4#mqZ(t zq{5gy*OOeqAAekzaLSqjmx;gJPC{rTpK7Gc%cNYIrl2n;Z~7-M#-&v8r|$3*f%8+* zb`l?4r#6@-q17i(Z>Q|VB{Z2PY{Jran z68Bj%uBQ{Y*)nMI(*oBM0h$>v^HZF^psN$&Gt?6-DPzc3rOU>r^Hitf?Icm}WT3kw zK6FVF5XhLy%MfNG(!7o%yG~B!&yqMzi|0s3Dib7dpv&ZEn)haMZDh_)r>kFQa0I0A zvgLd*OVpIj;V?@epGjB2PSt1QmJ|V_Rup6@!4L(*Ev*uX=-LUPLyTjNX^or>5PX|xg2t(n(3@T^jM$5%Gnyq zpOI$JYUR^v<=Dtp)M(~61ymH~RS?dkG+`$_DR`2QPTq!!4HT(-_q8%Khs}RESC6Vd zU$D9$o!t1Q*tE}S-MGzjs1sv{WD4&=}Q+;rW%k zT(%+1tl=@JoUdN~kxP^9PD7hZs)}5W05ahvL2FHKL8BL81Ncb|kgjR`nSLjBBSk?I zN?vw~levKNQ;6~>Vuem}sXprFSDzr(+u^_bTYm22=#%06n#QTRp-8sHZk&!!BZ*H0 zt&dHGk5zBty1PA+Rj`*$V7(sOE z!k>CLtp_*FGqY`iW@VE&EmmwLEqT8VPw3u4TB329hx)2<3)-F5u0 z*|_~V?62y7^aVHe72}qcYA61>Eh~uom5#$@@U_3bzYV*vV8FZ`!Pe{5+s|K7h03{O zNNm>8>|<(d9lXujp6-t-WLef8=x(eyscYV&&d*|RX)}Mtcr&;%*FZVjA=}VEid`4U z{@-2B$4gA8Fi48f&UtZO%I#J&%vNmC z(vjJr(ZIBcZ@U9raU&NCAXs2U9n)m!?!Z7x*7?^lCY#EAsP|aG@MPlbF!uMFi=|2| z)1P~hy=q^lsFp{C(W@AghVoN0-wF+~Hcv>6dT3}jS#JNrLCa*y>uMqb%lS;}kW44> zPO~)+(=kn53G}im4C|uJr0(}|qfd>uOvfyC4B1R^4$tJc58VmXdi-zYc0}u3E$o@pVmg*L%CPHKI!i0x_?hxaoN>8LU+%E zc5B34GvHlAcy=8;hu0%V9t?a%OpUAwflt%XM;>!+=0G$k?MW&@?l~UAZF4QDLI{AY zZ@EybU-IWI+W!hXj zmk5c*4B!34&zo^82NKEjipJYTlrlJPN66LNsH?_ENAfV&bZqSBOzz6f1dHz z13_#Xm(gdwm^*FCztP(_MxxJLBVXzHof>ca-nC=V^ZQLuicIr^iT?Ct5b6Z4yoPAu zaG_U$uocbB&U%5gazVDbDwcVEFMKJbe+l~G43lvwuCJwddU5h}xkS3E^5rsJ?dm%6%(fnKfpTpMM6fQRL?YQH`)nXuPC@WZ)r7TsTWxsl~v z_FCOxpSm#_WAi(8fpXkxuUvnr-f^OQoT7NV$b?@0fIhZEVX`(u#RA~b@uWQ7 z8%l({CgBOXeQzWcfy1ocXG=$sN`pV{tK=)Civ$DI4n7wD_h!9H((@`6rr}D{!3^&2c*k0`w)1VS zMEEB!HiPoRH zccn~Fy4ID|Oqp(b2#NN!%|b4eWVJ6{`^IkN-_3ds8{FLRF*@3JPCKLNqM@X^_kTC* z{m{{Qa69>Dv)-e}dAsn9a}#LI}n-AK`AEycnZ680jMLI7mU~d^``G&*TjvsouFk6|SCuQO^*iKPVAP?`sbY zo)z(0+qm1fY4@$3LB*R#fnm&i3b~JEVl>JBwOOyEOEF5|z;8nq*F)h=Gop{niMS*6 zB^sh~DTQiH3QO+MD;a|TiNHY(`Ya+g;fGBCkM`nvvNpIn3#9MV(LM#c3s;9lh0CMqFfz$*#6enN_YTqf0UJ{UhC&G|ZQ$|Y<4{yS@AvEB` zCfDgfQf1GX8cTNb`Blg8&t^So9!*pH>c}@989qtGK&E95-T`czQw3xS#e`~PDrzMh z2jvt z{7jKy1Y@6)El$I%WRV=)4m)XScpiPnT7wYD0Ey(V!73{VBaWst(x4FRSA9LJ zEu<#iMSt~_0T+rl8v63f(aC*9<9X%p#wBiGvo(WMhbmaSf-nR;9uQ={S#G(N@aN3Z zY(%9oUC-+l`+x+HQb6d+_9O<0tl_LHdD(_j-9&0mm_5%SWEmge@we(>k*}u%li4JF z)`@}?#_~gk(#ZW;3`3~X3gD3O-Ur-bk#nwu!0AMmKtZk^YcLsR;Bk<6#@7p8&P+kiF5mpA~aM60ZMmr8U=my{w z9pZROuP7o|EPKN$LXeYTHea)7BKmsW2qv5CYp;COZ`otR&@!QQXH7LS-OHt5M)_e4 z+*^s&ISaLKF){D#(jiCWmzBVqj15d1L9)9pO&0q~9AANE=gpIul4gvXG_SX5wcX_C zL*WZAD?=dM4R1RTq)3^9Qh0PGcWQgC&`ksb&p=gv_rVM_Q`0)?Voxi1POT^r zPR2REhwy~}hTZ8*UUeqKjtY`gAl3_qFBV8>4JCj@eo-?lOcW7$H+EpK*V$6} zr@E}=SZAZ5YGl!kcxT11g(uT8R}U#|R7&)4ktnL)7E1C=7rhI%`k1GcF*paK#qOU3 z407O=Gb-UXw~@q%9T&mYvvPH|O4sbX3Lv$mL>3+hOb>!oy`9@2Zh*kOj_oKL3^M@K z3Un(Agn2#017i<|1&AN$#M&x=Tjnqh7Ptju^UcxYjdbGkri?f! znCfg5lLrcH7_bclQRx@1BN$#_3Vakte3Jr;|1vnr@#7mCPZL9eMb|*3tqnq18K$u! zhrHS@5^Zhl`A%06#8fyAOOg_$U*P#(Zm}Rh0DTQtz^^0(&!1k&dy}X~Bk;9iKirf* zoCJJIH_Jg_KP-%Tg)C>9A>pt3L5Cy)TR!o(pbsckqZ20IG`C4E3gKuWKQRIH%P@ZI zvkcFW5FC>KiK7VLY6oTI!9q373Dt%Pe)>J`91LO)o91f=!}bJ$;`E%hRiEfw zC3I{YKVFVsC}uTWzKwoaGLw>TbT3DhztXC(coLa$Ip`&8bm|9gye&3iUrl-6G!?c$ zQTF5w9vS+LwF(I?Jq;WYZ9Oc!`CuD}91Eu&nS;B9lnkcpHf!^(?noWPHHo~-%0Ux~fi=H|EaTCI+vY$;)fjh19twQ)CYlf~=&QfgpjBAo zQ(g!yWS0wNDz_o@ih zCSSd{v7OU`>hE3`kC7jMdT}(S<~q#`I5+6d^d5PoqXw`fs2TWiO1bjue-Ojzs%z%Z zH)&(0_)3W15^k8fPGcUOKOfVddpF3f%ckghe<+IsPO7Z!&CtLZttStHpF2%EdXw;| z4NgC~BzFYYQ}GF<+_FwJym?Dr_a)*jl?T=xIP(6Ewb`?MsDUn(ujAJlKfe>@P;3=! zN*sC%n#Wy|yhru^ca+i3^}`m#o}7t&@WOiYd>erxdBbrq2`Fx|B-mN4q?es!2wmh$ zG5n5rWBz!q4kF`@krCDy=zF9Tb7)ahm_xU4=y9=toZ#FGznLktk1C>%bFh|}VC)o< zdVoLAXG~{Vgrt>wwRy98CApBT2NLs8m$2pvrQ}T5=n_5e+ZJy z+JlL1S@vs<3~$TNjKWut~aH2pju`pO-NvswELrQgaa{jowXs2Wh6CoR-cw+#JmLIJ$8}g_M ztdd6G8**_witaH1Np(zs`&6v10vNFpiM}B+*pr=*SeQUt09VXkrZCy4iGC=BoEodk zJ*eN~rQGI<0e*R4GzOedkU<*UcNEZ3R!SP00ueuMY+&_%pzIcm znFfM=3#|BDvacg-=`Z>6#~<&ivo^G3zf3UUt&v;A29va);lhFN9{teB+lo^unElIM z_4GDjQ50MXYGMWug~9uRc}5|FHvoRqUjV7YQc{98*SDbK&!AWA;?||`k-uc4(-QDy zi`2t<_Kk}cQ^i}1{OKKn?x6 zO*->G(~o%ch!0l32@i*ANq+^$AqR(Zr=bO*(#e-%eKhH0qZfn8j*QqZ821DD!?g#f z)JtXk&`#@sZ;fPRBTAW5_?gn#Tfz@W97}b;H8%laNA|tC8;cSe-U7f#M=J7l@C+OH zA0QNE8YRTME-Ht`j&(w@DNM#P`0hxbn(RhEi(`B7U z&qf06!#a-@z}GHv$zh15^hmKENj8lAk?%q-8##gz$WYJIHN?do_!w{vh>{%=vFLv- z$49q#D!4|-6E(mp(04#NhRaLfKQWX`lE9elsSR1cQlhHM-9k`D0S1P!tg$HaANjoi z=mDMZq{jFhdjYu#`LB-T+pDFAD_})C=*-xH?2aRqO@rSFlZ&g440i~f6UGl3gGiXg zEo{Dh68>c;=Lc)h*h>UUZW!ts+^E9+F^Zuboe*}OKb^7yXNcVYgI~C>*F{_3dQ1czUx-<^BchiRl@L3!MqkD z7%m=W{s^0`fUYo)iyfcQ;1ZoAJsGF;ZuEWarMISP4iOPO_u~MpsA?+Co)mLuOu{i* z9U*+#_6TD`WDib_`dd-G*XS8nn&YygA5Ap5Y4}B*7k&5XA&jXp>{@+tYM&noYNWLe z=H~t>w})VBVn&<$KYSkyCQgo?PDh2T}H|@D{pPDT<^hL#D9~AU4gv~ARk{iamB!! zgXQwqy;RcO{ioa(j%4nPTnj^M8P{)K(+?W=hYE*3;jTT?tikfEk%_JOlZO$>uEDvj z!DFBxgsdUEy~cyA{w=o+eiY)ZVy2@Y8KQ=)L23S<%Wb>$@K@`^c!r?{21I|$ZNRfX z`ak712I>P%^y9K2iQ5Kk$Oc`~20bYXl-Upw<8Qe=vk{oG!P;l|8np4Z+%|q3g@fLx z{iob^i{|{N+{TNPlr`r2Pr1!gxB0i+HYw=X6#Y-ReMSFoxeeyq0{y4l9#8pOZs%{x zuWbEOZVMy*Ew}p&K8S3S6uq(b`CD#B8>{~w=;wO7!XG(xgo?#=#|+c(SGf6DE# zQ9Y5J@z?pX-haz&v%lr`wYYh?S1uZae=i zx5een7syjT-NGk*M%*Iu6V)Z9Kp_jJAzLK0NOca6V*)XWS->kyGk=f7PD6vP#|5!k z?Dek4CBL^A=JS`Spl%P^jm5K+D&PH6Zu_Qw&Ol$c+=GSi*DfGxOr{ukg-d+&2lf;V zc346V8p6ziP17t={XV{D(9;0$lg1)R5%1@jS&4x5|CHOl*ojF|F^BN@4LtbXd7m%? zBHJ*>oERezm>=i5)hl4PiV)G&{HsK)nPsgX{VaaHu2Gwe6|sPghwHTOM5MQXW%A%2 zI)fQQ>(8e>>T=UBddarckDee0bL7P;M0^f+@rW0G81F~K1(8`_XR@jK%ZwwvT7=;i z#Quq7J8@#!XgBHjKL0^Bm9o>Xv^Ma46Pim2P4`RH09xw(Q*PTr*DY-3Dsm_oN)^Eg zfv(|MQ+^0x`>2&cf@zUHiIY3m<{Wa}v_6(Ho-L_jpqK!)rI&IWFJ0Ddzpiw5afNBhgo>IGSS`@Z=Ap#orM78JtB9fX?vT z9j`3T{*>EaB9QITvxgX&Q%J75IYul7LR-?`up#Oc284G7gt%5y{4ALxY(?e|{j>+m z^j-?5KhmEQ`B73USN#D0rQ9~h0Q@btGbZROH{w@6}>eVOMdgdrB$U;l4EC0~q z%d4}=loY%*1O+R7wU=`H)Zo)gxxH$u@h<98-8gN<)%c~{PL?!%DYrwd%w*6t-B(HW zkhlx39SYoRUdrtPb6Zh#^HaU6sBJ_18+TC$=a+K3-^_*1RL$AlW7hpN|E1h^*QvYl zc`3JVHov@-+nHN_bbrciZqVOyTTJ~n0&E6SBPZ&0xN~y(f z%DzYduhY@qZ>oVMf4dw9*f)Znx` zS!R91veM#pbAEhy!@AZHfQ-XpbIY~??TNtWv^%|KMUPo9?VwTpFRse-k$GH{ji6MJiok+x;Qw+g;hUY;e zU8c|d9Ua6URe(M#7~n;p9S&@w&xsPar_YU(7huRs)be7;Pqk`dC`k9ZXDG~y5C9hC zfxUpmMa50PlCq|IU}@!$0ApG0f)`_X<3SVSkJkHp#)?i7q3!hor z?hcw++n??qSUX@}3$b+~5_!J>my9iJ-ROdkY&}>CLhQY`+TQGagw`$W{Uo0s*#{`T z3ULh5eD~%UVkl|h7=|)8KXQz)4-0XQaxbQpV7*H*K=>*A@W}a-_qDK#BWO(w9{n8? zEY}nW^NH(M3!yl|q%7-l&Cd_ktyeaxpQ388#SKWfW=+4RgJ<=rl%%jVGM{*svhvD! zCUwy|U6wo#qvn@fsGg)2HBW{4)}ybEdC?8^k6qTI1oh_D!=}V~aNI?G`FDJ-l)|^Z z(8clZWliCF?tWxr5jZF+kZxMleQ(%!P&rJBcgW?S+>NLHh%SQ#e7ipNtA1{UlU3w?|Hn5se9=hV zmiynsZ&b!OTkM|apcjYjP>`JWm?#W9eFrRdg&&d-IUG)52O>v>KZZ9s0u_BHib_QQ zUJE%AXJIG0Q$--@Bl#;y`Yx>aiXd7c3RKm?F5Ie$U>0u*G-LX1!pVvdo)!uW=fZB1 z^NLWBM+(e9`W_1G$}o@+C3Zq#4-H3UxUx6p+Z_5{29?SP^%hFJ>cU=Tr^>H-kCX)6 z^nL8{m62vbRDh|%KJKc@C_8T|;!XN~{>jQ{w-zeWi^6{4^U4_CM=El7h5>Qxs@M=A zYD%1<0cnn^xM*)`YAS|7IhCsTq!wyg&Z0pjr>caEM{0UWhM^DfRp0W3Xn?9kLuyr3 ziRIojOvVhuP|eAzq`DRw7U!a2-SevCwnrMaK!y=R?CO+0AzF@vq7hS$>eMlBTCN<1 zQA?F-@JtIWPj%6#tyA^)l}B2>ZiX?(`0BJBAv%GnqA}O1>hu$DI-yO5pPrM|8P_dz zA{RwJea@>hpC9SO;DO`**fkI&VR{Li;_+aPnk)<-dMPU4M7T;#HeM?|h_iSi%Bd!Y z^od?p5;z$bUz1BK%pk8?JegQklgHx2plA%7N}a69=V@h7b}pVuKd&hed181U2>g|W zU0Vne2C5_!|H|X2EmHOYe#`+*7pc@1tG5ExtBa@0oN7z-o`4$Nz?sVU+EO!NMy;vh znc6C7ZJC`9qs}I9wsEqy+^v;S@1l6N^}P0n?-Qc|JmXv^c3nk?Fq08Z$y_f-U1hWn zlL-~${Gdu*RZ=UH8E47-s8d~a#uJl;B;&$Fd|gexFte3v$-;D1U2VA!vyCz1;{0S? zU0o})opZ_J@_Ai-+Y_@xAmh?Hc6~#iFpE<{$nN%XU3hJ5A)KY_=*|t@q|a<&l1v*|2@O3^ zS`qdL)zS^z>V{qxU-n32rcJ`BhCZG)_GstQO_Ga-evxPP*g&Q&3Y^9PkO)V7Lg^L_ zXXBuhNnX6o9w%bm*(b?v=i zTAsNp0-28tahm7)M0lza%8pDqo9D-Td1`W)k1bW37iM_se*7pqwsme^TzQ7_G;}kc zI3_eN?TGL;O_iOvh6*ko`SP}GGM{=*HLqN^@wQ!*o%&ofukN|kx5KlX`Qx;#A&K&J z;gp{RbGEGCBQ;tw`xjVj^v09kXxs!d zL?kEFTzt@-M+gSe);}Fr|9CofZht8G5_D<}^*$vMfG^bW&4Rag zQ8Xtf_MvmRAo_BrW-USX>y7)ADy_Wp?m-nVjKf zu%x)hIz&2~R6dJXk9?Fp10}=gkdQoYG=o5dGG{w$;b|ShZiD~_Krz!g70<|M5L{`7^iOh}@?pe$7$ zdv+Gq)^8;+P-I0ITZ^wjk_SU<*A>k6o(x~zfI@Fg=ztW$oFRtPAqA%;EwQ6!6V6+UWFZ#TxEv=fU{+s3=s6Fk!S&D>8o>heu6ND+4Ckclv^Y$Sqk@?#2A#a z2NX|F@VKb(i_BC?=cEE!R4NNvTxOf1-?p;Ssmn(p4_Rb%z>TfDblO}4*}7c1NeW>3 z_HvO??sgW&OyUu$Fg zlcu>>8M+%wi~bp_j?`Qt#*oHsdCEMt_fP|Q6*4gi+LEGeNR)9AgNZ@YCYlI<_L<5c zAXgBS&)8*#TD+4pVN_H}{TsbQ6$yO5O_Q5SOF)~Si*A_RXi7o4V1(pHS(8&(YX;$_ zbHvkf27q0Vz?6l#au_t(!n-ycTGrUQtB!`R^$Za0sAQYE@i71ZFGIq)9OofwH|0E; zD)W5dl_wv){aU&#&3uUEMzL-|L0&o&oVl$s!0$ZUOgYC}FWY?vY}cfZ9Fi+=qCbtgRFxMxL}D(YHCAb4aG&KPpGU+3_QwYM0;s9mGRvp+ZL|RXC)+Lp)W%)(*&hnj zm9>awvQ4{|jr8(t?G^&EAr4MZQ-%1QVid_qcIpHtfI`G>I1f19H#^!5?1i@vk|@ZT z-z&sQ7d_9NH?(*U(sH%ZO9BC$C;_)044;|lgq2rd&~osz3*bYR@d2BGELl(6mN9q$ zcn<1lFB6DS(U&eW8H{2%JYD_!<=5wyfg2ejd*l=188kcTG!i-PcH}%eWbpLViaaLS zP6tn(R=%LZOsAC(JVr3YW@dd^MpiT=O%~L^^&G8T@csTtmI1k!AvvX~NZSF{f(5nL z#>PHnxqLRW`hkdtrNMok5$Yj)v>E9T87g)@v-*Zv71h=6eIaa1$o@_VDuT+6emTfc zjmMlnWaWL`AcaK5tJ`p(BGj3Y7-BEmR^>bj+m6nd5vovL{k9pgJmNaB@--{kV%D1wU(Q!KO5m~T z5zzWhYO^PI#Jgi#4I~i~p|+UOpCzTR(=%8*XLcsFdOFq(<)9l>-px7(;)UoUMQ_K0 z5Ax#ZA-yI^JJ58o_`^2Tg*QMFJGCCFor9K*qjoNeBc|42n^WL_At<454@F;NMo(0lNKAXLb zWkf5-L*s&KJUzN5Q*5dku%3%*yeVgPI!V2%c2Lts(%1!*1E%9#17XZcleG$0NDM|M z@_Z%ikc7yBkur)USnzp_juDyQA9TX7e~eYKuJj$hzyMj;U_YQeQaoc;))9u8>E|~4 zZOXh!mckQIg+kqr$z`LH(IS|TZi0IwJ|VIcY)06h-7s_u8)iqT0)SFHz}T3D5**#+icKc!X4d)Xt#aPcq%kV0F#%)O1j!k8 zz}c4&d#JDdwQ?TYfIfv89l>FlOhCSj1RarmuA`ITRx!)cQ)XLJ?jE5f*{uFD&%!bQ z3^byKh&x{L&`|}NXsK@_gU(Axt@tx6@%oOLP9)!$ak!c7ZK)WpNS}Rd%a56%h36uh z-=_yk+SEHa^+oK660d(wI;gNJKX|61Q_pbNIBK{i!A^jXoH65Y*t}hEWLsp>?OLao zpc6~V-DWv@@GlyaIJ%{{NP@dSHgf>n9Dx=xwLs1=zNSdI6_-3TpWE_@t@REjji+s) z7S|%#G|3!1jAl0n7P1RKE~@f`rgSQNy6du1>NgH7ZRJxKoB2o%@Vqrc!VY4?)mi?T zVgbyjG!|W2E268;Sewo|aSj>L+M6M>#%~4LEmau#o!hWUj4*V7g zDC@lM6W_^$q?Z*>j@`Y?=xmia_S*~2MNZ45?fz7VrHa&PhZV$mk6xn0$OImPUnHr` zMD0cgSi%`)5iXX!58&jgvLcwdbOst-Qv4<^$(iQZ${ov{I=2t|{^dz0d-xQNs4Sm8t50j%_dTqrwLI zx{jM!iIH85?0%+bzkoWFd5;RXIQSvG=^)9`t@%u zEyOPy>~3zjPJEYG2$3QyEFBkyGFuk$+>hXT==G{!yE7~*>AjC0*$-&;6iMN^h_Sc* zA#Zk0!;Ze~gQeYKeLN$lPlCtgWX{6=dW7{|3k&}{s{MvBE{q|aH!^1Az#7?|ihS7f zPNRBEW$>svg#g%0Nsh_t#meIkyVzRj zCoEEKgv3%pdt-``&Ha;&M;}6WlINv<_IjZfVrX9v%yNlvwJnE`XM1pu<*Hz4?fH_I z;q;&_W<5U{{m8sY!8aDdqhtaf@{%?%TWx3JFcQpg1nlS}AwgGC;Tu}?m(uFl)0Exn zQB9Jk_y_eYc;DIh!FflX>IRL~jvSLRV(*olQ&o3mmC3k=slJTQJ$j&?{0I9-oy!p9 zyG^(~&Fq`6o7^9?>jwe3JQ2sZLjuP44L)$Sh)vW$AqjX1FW|do$9`wwzKsl=oI(Y! z>{Ro3(TD4W&s6&BuZJ944;`sEHmbDip8*0n!g_m_a6m=9ZBv+hXRr+s0RGpdBPxvv zNZ;0|@uzBCNUG!!LZ0>q27PCHiPh?8Zt}tmNGpwa_?z>OS z6}v@35aF)KZ0_3Cx&?W#ubugX?o~LQ%>vHRTIZe~2-?ylxR9}$C2h~e^M)~e%E;NO znla;v*!isTwf6`*jrLTQG|_`)e)(IZ)7+}uu20X`l+I%t)!T9u4Nwu6VqZ6W@K%fFEs4C)US2r&-($`A^wrb+r@<_R|dBC!!`~ zKghQ{8Kdr-RIN)}bO{aGx;LhUB;*~Px0u*Dj{e7qQHc-?ORq4fbH#XHhP zLh@k?;TpcngcziHb`i+t&Yc;FC(wP!XQEQfY=iCM%m2ndMV;z-4;n(lXMth#fwNXd zTf@wjQ@V)269T*JjAe+vi#VdcEX)p*$OAJ4UO=f!z9?!YRi;j@`Ej7Vt^%<6F(}o; zlKPB5E~ysk-BCy*Q_soYx6mR#P7mScNgKXG0haRpJm{!E!#Jf8_{QGZufz*vof^mL(YUZYg8Yt8QnR=cW3cwuvZ7OpFb>m%mGYOb~o4`cXet;;0x<#bhDOE7@F?JsNUg z1ER~R=J4ZaAhzJ*{PC2yh}7dacF*qbe-LUIyFNg~j2{;V1qP-&)G9%rKk=Poo9y zGu8}vC)J$dx8MDki2tqBo1gNWJ?O2tl0n77@35>{<-kL8b@kbPpA{0mcvlaSL{|ao z`_AnqO}IE%a@q1;QxtzA57%mvBlAarlFsEV5?_q23hGKoE2mb~4%Q!Z*~sdD1rk{d zJ+Il;&Zl%avYVi*mL3W3`&C_u-Xe+F3l2cKl;0KT+1{yjl`ekz8QrjzkR9}D)BW9> z;K5qD2rfdo$;7p?VR{gb^3^8hgYN4V&z0?%rq|r)HP#=m2VF~kbc1Fs)P1ij#&fS< zf2+%#aGIor=I1lMo;>aKK~pKhdh#aaqg7qXz^h%RiVvzK zg&ZG-QbC4DJ>~jtKgRBB#1z2I#t!0j@+oWbi&l$tMc*ebgBHCKls3QtR(2 zRl(d*_Bg44TGm$E;Ad(?X4#ZS;;H3sdF@}7&;;_p3V>+`hADkFRad3JE8KCvH=h-% zB5?3wRTR~=2{j0dliSy1ZJ6P^X2vKvVhsH))V-R zVo~JlsgV;Zqk>4qDS#ML*qBQ zc#HX4fqETt6KPsqs&LDZITjnbS)Bo50$7dGczp~)NA~OXw~>opTo`&ocRiStt{@qD z`3oVHy3}wG7~L%qMWGpv6C!KwP+POj?3k*cdlH}A+B1O~9*nwQ8|xe9tS^Is*eriA z@h<-t!7C+>yiqyqn3P}C!w%aCu;~twCxz5rOY9O>x|~4e94tc4!RGMDd|N5vnM0G^ zQTH(?^JeW?j(H;?LM(aC`gy}fyxLJiM0%B;mN-e-L|&$N%btkbZ4J z1B(+vyCXqWgXT)^Msc7FjYCz{&fqFy8?xj&RVDstVk^VLZl+oZRx7hhEYZC>P`)}> zlUkq5Z#uWq46dojHG5xbTWdP0_$}F?hg$}XPZrl6L7bR-tjtH+S|65ZuK7%@qCUr3 z@T;*Jsa$Azu_Sn|(`{I(ibbYJRXrVWe&iVm!4HvlZZRmHMZBSB?U+XtcVYR_R zmgJ`C+7s8xL-i4}o9fIh3irhue|AiX}!o0JYjo-==}Gy_D|luq=OVm}gMLzH(ZUAT2;!R%><=*ey{ z|I@(w-$0@NcSu$L1(zcDE5&8}!KGfobcp%$+7atCV7_poNLaKV2V%1%!{A>Af*xl^ zJ+J_N9`9TB+yQ^m*8#s8;&No-;bAHi_u_L$Qy4Y1YEXXbD~566;&FMr;Ao-jf%)Eh zQ-wdnIL!5q?i>tM1H`|)32!UeRH|yr7NJf!N$mmjqawJ#l2n20D$Hrh|zT3~r?sShOPnRLCPs7E@atY4A{6 zgmKOsF$htx7PVD^nM#a&BB`x_vx!WWif31iRjsi^KGO%i)`+Q{4~53TDlMKo%=4Kx zi%q)2=LL)P2F44mg09uHVn8*Sat*fo@G~|4>hVzW`}uxfj@n{N>PPe-Hhl z7ybR52VxDog3zfz-i0r{N#I*nE2&$DO;7};uslNQhb@VCawQ`vO%)TFBnI6sDHO3C z#aI|Cua@wO%&{0D9Jt$EXY+9)$?)eE53V8=2rn|9PjOtq$83$S98m(ehm+xKh;CP2 zAA;wrEqcv#A6zLG>VdziMpIR3#0%sW7g`TEPxS&NUGJX+E6R0Rf$bQyXeq$WJ}t6U zSEfcbqqzV1+tPsf0CR_w_wpb7F$IbLnpFSNuKzNce>g7!POE`W6OkgYoofH|yoU)IVyyr1#}s@`s@U)^Ok@*VE&|fL9EB&3I_)Nkq14@|^;wWVquKdPF_<+aB-=#4sUPUeRR zqW>2rs^PDLkRGpXXPLy4ti=YtF|ybQr~d~g;=|D;Ro+nc=NjXj52GI1+4vVGLfR*b zyx)`b50xE*e;tUvQ?`DP37Vo`0Zj^yUc?47KrUmo7z(gr##rydo zu;WTm{n8%`QPYyF4vGr%i-8}6Nnrd+5?G*b^TmwIUtpq!o#MlCx_P<7(w2W*LzD@?VeZmfT)oq87{7CkxU&uf{J$_!=~)*V?+Z+XDf16Z^t+e9yz~VoazFYPCZbNZIUl4i zDE$W}8fNQfx)|Y_{R1xF2858iX=m&zU6KUeEu9iEQeRuNNKqnQxX{W^Hel|H4Gl{Lq1$RX^mh4?d(= zEVt`nbQwA?Tj$GeH)BhVbtR(lO>Wl`WL{t*BYoxf+ezjku?cYeavL!DoMU$frGn@J zds(6uFB9ZhjL(M+yLy-Vd7tfKcY_j?A9fRdmOuO+IL+`%xF%$I+$&(se7yX1k!I|k zE%-(Faza7>>1M6Fbo`?dyY8l!0Ub0Tv2fdOG|o{31TiR|aDuwDV$ z$Y}eZ9OW~5(S(XPN^d6P-?s(*u?SU;!95dX#IpGl9uA{R}65BO%KWi-qFZ&@uR1wG9jgJgoYMTYlJ6%%D!kRUt+OW zhMy+^Jof8l2V(e;=RIdsQxLr%H+bUfN%c28bULY2^C6cpoOB{)OXeK9@dUVC`cL+NkJA&ZkQE&UT=EEgY0e)Z9qxW5%B>MB54Uj!|!#I(1Dh#Se z7TN(#CDl9;f0{i|9a2w81Nodu^6u+}dU^DuFz4TJ=;(E_BsZf(SC(lgsz~^Hc;p=( z?aj&BVykU;8&9`+Llf7OMyBW4F_ zZDzT~lZS#-s8prb&(`^T;Ny0+cx`aF!0&HP+Fg^uH@z1m%Ozcj4P2kBS|1n<>2G}grFxvWpHmq4BbsmQ=nL%%x4_HuYYK9G5=mvc5_j{JChRKj_le#~2vmQOn>-$vK#Wa_ne*YCe z+;Tfze+^wgkFg63ZMo@x*KUZXxV^5@Ue@Xj{aT3%-S1!hEfmwt)z9}K(z$(Y8quKJ z#OA@&j>}zVna&9x7eu$?b#UWn*y)QCqKmI?ReED}P-Ez1E~Gc>PuFL;JnQAvBN#?! z1d$OF>i4Hj@k5yP)KCwonDYCH{4Ad|2se9ICgf7k z#$8HSJy0lsGCQqM@pzyL#X#$sPAp4A3<0EUs#YvScpehSV~w#Ls;Zo zSTywZk3r;tWO;I9=TL}^q!BVZ8<1?_nf}JXz_&KDCb@A=NzHCQlqt>V$_3$k!?c~Ki7ZqwBPn@H8&jRvoBHqkbbMD zX!?$f@Y@%@Z<^e0qJ*A6&3H=QZCsoHJx3PRz&Jb7O}xVu|w+P+J2M+)~ly-jQy47R#6x|jts(kI*mg``v^ z#^~$@iqZ#cHaZbpe*%QXR)uGLv#@fTjfNRWTeJ*YE;9VV8LXnIr!n|#naV)+|FHKK zURgEl)-OnRr!>+H(u$yfbayG8(hbtx-Q73c-6dU0E7H;e(siG8qwlkycklh~y}vWQ zbH+IFA9ybrYyGZy&1=p;)yv#!1 zT;iKt<+#jSpq?Vlk{UUW{)U=LDu9nah~Xx$FVDe>9ygIMpWQuQ5E}@0ro4uQdrV9P z!z%)v6AZv$GVr&-1ijtv4WxGgg_ESa+Mq9lkV~n4=p+y5T@bW~l|0QEilR|Qe!;Iq zBbkJ++Zn*GXwo0{)O;yG0%vO?_@(xPBO&gOsbI!9U@$qO7cEkV7lFe@Ct?+(J) zkS)Ke(65idn*XruTJx>hg{F7_m|3(ZGP(SZWNe@B`WDF-t7W=b3;$c>Z7RGmlsyzB z@XO}@_RD_9xZ|Ny12OJ3d2jGASs)|V22=#mOJL-(rx=Q%Q7+AJ#oii8W=CsuB&ypU zNqzod4>y$S$3!;1#|^C1S>9BhgeEd+T0LmEkP(V6lM#nb1WE~Hap-pbPOU;t1b8r* z-LI!fszJXem@e)I76{GdhWCrskO%a ziOjkqGKgH;P*7YBJmrg6P;!~9ZnZ%8H=RPlYk6!IcU*HNJn2*(xZ(KsDj;Rmx%!(b zOZ9wBwy>{6zxL*<2_p%KO4JU8>rAJm4w~(l0b?>p8m=pl%^vEpc0+QfUOrSJ-Gk3F zc4@gjKppzviMp6S+2qCaPDMtOYY5Qp{m?V*o|{J`%fChan^s{5=LU5GCH7wo&31WV zVSf$H7^*t3e}-lmX2|sa!mnEv$QbKm-|@af7kNfT3C0S3FND z@}|C2HD5|h@7u_%iCTqjUl_|Z-oZkh8B-E>dSiulpyv0H%y4$rZ*7j6$OWNIRoZo) z_sC?+T*s?@0q0bDBy;Q=pX5p3WJM&fY>fhq2Pr&DS4= zT<)(l-#bd5?NsO&!E!|1UAte%wY#!(Z@Ydjv|-4vpzGb~pKgucie>BF>jLoW=I=UWizw0J{_rCRQ(shN+Gydj?KUIa^OM=cQl$&hXkG1btT z#>~eB)jwqikJ3s9EC{L_>eat|#xf-a{}3kZa>K$%ABBl$ebE%M5Mg3VGJzEkCit

{*%p+6IIPhl?}d87s!W2_@4V!8KGWl+Bkqzk0s)rAz}(EikQNf2KmGBkca# zv3#*gau}w=begc~1<7yu2Im2FPWRW@-U9i%$%*^pi=)+RFEECD*3s4J&U}{qq~5{J#jzlP9%+}* z{N=^3XH^1Ch(1>gOU_JR6i=^&@(q#o&YB3R z7k!>EWz>~^D6MsfK^Q^h(0TxC=hgcNPF4xSNQ9M;4IhD{t9Q{tdk97`7if}3p5kPS zdT~-kpN!(SULqO0D#6T{+(BlOtY{Xhl{Pe9(GAG`;gM8bAuQO&GL#^M$F8jghn(A;v`b zOTQIn&CQ#aghoo0y5wYyWPwWI2QA9h3&F@tZdK?dy%jKDOJ66{y0@0acUa#rxi^sU zF;}^kx-(bw7_>4cj;q};yABZZ9VSjoxwE*;F11=TMq8KBG)IJm>oz?}Tc&9VEtMt( zVhT}c+dTKum@3C;1(|9+jz-zMA07nXbzfgdvp3$5y|C^@t{S!N`z3^Wl5!?j{JXKnnEmjrWW?zJURA`>Fe?t6!A?5_}IqJCgffn*7Yc5t2xfn>PB))YS~mM&g&V%IxpZ-$zJFgX3J`P zvB)2BUiK?QyL@9m`Ay-QGh2Ymic~6iyvf}Q{84k&FS@~HjTI~E>SGvNwmz$&O}Wp1ak49?@gI#up=wc@*;$5CsW zsmD+KarC>5VI`rK&A!n~=TmCli5I>TucAM%MJabRpNAN}YrgPv05@HF`e!#0_$Amp zT<>JRf40L(@efCDr*slvuW$lp+XN=V_L)fx-M@u%u9SYT&l91BC} zqw1+AWM{n@4ZnS|QQnWp#Mw9!QTloV^hJV^Cuk%x%WtD-GlW4vZ6qqLcO(C7h+c?x zBs%CxK@RLS-Rslg7`N92nYave;;qB6mVVFDo@vrbg$>8O>wT8|Je5XHYdBu{2~C3N z;xi@2;e@xZX<}7~o~hjoB?|h{L>XyPYmE#gvGvk~JEl_Ur41!hKPd_caLe1_V5jLn zQ{YrJ8Z+!HN}XUH=Hz}pjxWNMhS^HX!=)sP;-oAOwQTY$iEd)oye>nCpH5(2yuk^7 zEB&KVu^{D>NuptgthN?9A^rlH$&ZW$S?EtnB5!u(0}xddVOh*;v;%P9mAMVkjiN;qR99x@g~0TT2t=NXXue&M1dFV z(MZ+_V_}`r`~(}&kGjN$HQVxr;3GBANBFs zGL2Y)z!C00!To|xO!LJ?pMe)F@Tm_lnH2vBG@gBHbF~~y+~@kOkMlGq+a&db;4tYO zG_b!Lgar4$_*|ni0{PS*Or2^1FWB&;gO+_@U!%Otf~MNAKVRKdEB>?%ILH(;MHqkt z_b0Xfcp#H&zv^3k9m(`=g2e6J_Ei3*^NKPM++PJEADrkAG(B7ag8QRUy#RgOXEgua z@hH7`CxOVleh_fEA2()u&K7)yO}qb&B`dSzKyl$M5#Sd?XTf|1LLY9}nrD;lN3EGwgq zMlAC>AEeBxdmkjNYCOoo%QHtSQu%KfRH#>EK@pw~4$tdTQA9(1>W;&44ar8wyWOV$h51GGyCF zB!miN2g{@C58w-i*bO3EkJb2+dAI9>sF;ZDhryWGT4R+pPM5rCryakVm=p zgt0~0ZbY%6x^1G%%enO@y_2)sPJ1`z_Ji0P-ThNuG`jt6QS_Me9?$x?fMI1W1DU_!mFucCp?=wsG-k=?I+`1=bp#YZQL)9W}BQo9xm23 zbR2xEI=|mvE8`a0-zs+U+S`q9=-fSwK7ZIb3Fm&ba~|yE{o~s7yzOU4e%4VELG}X{ zJ2U)?94q(|;p~b^-$V}zSPr@#BI)MJg8qy`* z>(qv7C$ktBVgtT6L^H=hJf3U*W8HySXY44iQ1dXrA4~eskxN5Rq$seX^ZIGl83N?m z<#F;;;u(}qXo0h;lAIE;E2Ell&TA?{$$U~Z z7}~a$G*t)vqcG9Pc0gD{;oTC0G6Qf{HN%$=oK@*EjIQ+qS5*Zxtjj6IemVBZ?JdAn z6=+m{NgTMUGU14KYcl3kwkf+UpcA|vJ5Z@j^X)NWY|xal4w^|%g)OET;Fq+2J(CeB zT1++TCgF@dlj$2!Oup6f)_r|C%c;MZ1fBclbyVY2J{9aPg4l>ioXJ!HzUVHjDzZot&r~6Dz%I10 zlyDmBWYJU`Ef3gF89K?XxOkW0!Vy`e9Wl{Elx5E%u2hAcqXBf}#;9`pY!+0yRkB)E zsyghadTQ=eW_H7)Z<^X;6* zRcHHU?{=Rp^cWyl1#;r`vcJ+Z}@U{eK?PXFJ9)gk!TK%c)VAM0<^$!oTU4EGJ}FNC(ABIYeZs- zp&`syFq`F_q#8}#a`9sewCE{t#=gm$U*E5g@R@Tx5%ezV`ubhEI?<`+aCE2K>llb!Ud5BFY!2)O9>fMXg;>r>Mhu1qyq8Z$RC>Xd&$OFfk%j zg?<$A3n>PX)a;7|iU~-0OBm6zdEXNiKjB6G2T3&Qp@^*F*AHgGF#L#l z@Zc}_OpWH-K?`rDOrFJe%D|N=q5HnWP=5jxYvzRcz;wT=-r;4jKC#ieGx*+1KiCml z6R|EpP25vB$n9PhX}yV0vQfgqt#=Y-br($5F*IO%5*uxTOHJ{4Xh7tqh9YQFn+mVx zEjtf(#7ET3XLORoQd*~RDPsk+yu-tC?x*oNsK#`P1Z>HD^gPe#v6#4bbbbonw;XiGa!* zn8o)p&UGEZuEul%Q%FVipjM%dz4QwtIu5YonD1D4q9oEbH`}b7uWl~}O*oy{wj_A+ z`Y?cV=>$=&-;HalCg&~mJ)!`YY9I92P@=TG- z1MwKoSVx7Ijgw#qx&-DK@ep%`vGf)kf)X*| z6NN-I4ntz6SDwHbnygr-*J z7;UXZrxx-3~UU8;g7qk+K7V)l|P14OItHt%_V+mR4+Y ziG8a1z&rb?lc8(Ud4wh{0?v<(I$dG}f#W@Fb{Hdmi7MEH7b-1_5K##6f~`u13@4$= zQ6vD?ZQTB4h}i{60Y=ai1+^8E=t}DgPDKYrW|b2t6M{aPHsxRmlJW?{cn~=}2f~}L ziQ-73iUY{pC`p|&INqr1YHc^O)lm)QK+nxs=t3_FLybrr6iu)_Z#>;GCN8govI~;s3E#;340jsA z&5)CN%+Qip#U`{+M$`TX*ptEt_ki9$;t35~z5OD=`(1_T)-T0!PJ27Kvyv{6hPUB|o<#4Nr)RVJRFZ9d;7Kh_Wwl@JPv zGoL+b#M`l z;GSlY)6SiCcRe{O7|P+@j+oTs8FMm%)X{euyIH&o3srAF8aSd`WJP1ROMnxQ1K*u* z3xcnwqC3xuAJP}3wEwTQ- zNRx&(gu;dW@Z?`f#LrztCrQHz*#_-6AB(d8D~DfH#Hn;TpkUb1td-RLM~5E+w)Qlu z#kj;LowCw@cKFS$&6VdZ^-ZJ!iZ)kv64zVH zK09k&AkFyCvckY+VSSJ(d4Ik#UA9bVfNO8L*2{R(fCZLdF)x>&la3s5lN z>EDZPLn9>c%=_f6;C@8|6bt~#C>=hFO-s@f8n}j1X6SrQV?oN}T?=`Z1UURYEFz%3 z2C7rgcou9w58=|!nQcV!ZEGaBiHGp{IE%}y@-HeAg{QLzaaK;0P zOj?%glpm`H!#*jJO^_gd;f_?n+D@}-+@-Zpx1up6vFJ4a@yFqJvHK(Yuj;`+4nLl~ zo&1=;ss|q(e#N{owcy*;R( zx4u1Weykq6Ji7hajlgzy+)rS0cQQm*b$2?(`}6MC)LXXuvoGp4_vZ_yRreQPU48-% zzhJh9tIcGHL|j}2IQ*J^K0qX5@ZH(G4HzO3gCFiLe*%AjsDS-h;{Pg#pF}?u@kxk; zOdfXfP(Q7}NvJ|Z9&WM30HYS9dN2(^-^fu+895X0xE*xA#s6Ipn9<2??^_S z=O@Qm5MRDj@JX0RDj-HFfn0D)L?v`Y(Qk&L+^Uf2C4Y>@h<#En@ zRq8$VuaqH~BF^ODF%wAjU_{aLV##p}tzT&iV?{ho!{gsFSCJ!j`k`2-L!b%k(qZZ_ zMFeU>(KB!|!Bo(c%p!2UP|z4D3jXj@h+ui&mR0QZg>K;)A0+x}pX~cP0u-&7AZRN; zWL7gXYV@=zUk(+Dv7Qs42n$SeS>)t~FPO?*7W!hM`ebdxKB0uKhR;P;eMjH@Mg%GhIzWi~9ZN_r z4Sa79N%ebJ^;rfKtM{|jY3Jo;vSnKHkm|wn3fsssogY&3txM;XRCn8eTOH1K{alAG zvmZ*JMpZ@uy4;(EKxUWUuN*xm!&tVwNh2pP-AfgYuG?RRnn}|-(kDlS0wgSK3DfU< zp-u5E0NrZJj|p=f+YL8)zu-*aPhqC)_LQ|c>OE{~gDAR; z^jBL@eepP&I>yZV&wb)e+Nm^%v`bUI`v&TzFd?EOYNI+ot@m?`xPj`y(Ul9Jdhj?B zs2-I5egjkwUX26QgQMRcfa*ag^lBdj8K8RbsvA+R+K&KIJ$TiF8TFr45AKid(eP-; zP)l$ZQP{8WjEeFk1UMVDyLeXxsPo|<56v1fpLlFvu%5JU>1`|Ug z!9&C0j&UK>a_@;wr)VxD5e)kXl)%BS8c7THfVAG13fD3&PV1DgqUckk4u}$7ScFnL8caBneMuAZQ2I8<1?_EZo^$(Uiw))3r)9BxG-2W| zVmKD#u%W%ray*onw6&&wIi5j1rz zrg+ZGS8UND7(!oU17=Kj1L1kEnQkHO7|iE>voK^s+_lBBhZfqmOA8Z?jZNc+)*iRZ ztLRP5pJb2h({I1-$ThXjj~_X=-F`ccYHI%>`_p~-cI9fKsq=FDr`PT6cPNbJZUi}7 zXHYJ>6T6v&=$(Ndi9X1Z&!I=U55W}`mTa^7NK}j2GGGrcpF8QIUo78GlO%w|60G1@ z*Vn#5Mx6lr1nJ26!;90cn0z>FMb3DHdox^Aih49Ow{iIm^?;Z+*o?12l3GYCipd;d zna#|sXoSu_Ep)FV`UW!wOnnP3xgJKi-W|);bDDV%wU3aCz%SQ*5V}A_nOI@BD4Fk9 z$0UkZn}|4x76-qe^zkTMQDhnGb+lB5@Ft4+*(wsYOB#&Ob5Ds7fv7_)nWvj|)yC%= zG!9cz89Hc^@}8eDW?XA+^f-B{MF!ZiPWt3GX9-y@WHM!9D$Gfpx!(|lJ zD=8F_KuI%Pfq5gqsFg>1pOj*F`?yPlX?rD@*0>ho|_|lbHVNtfnG6us6Z-q z=K^LAUxLJA^`J5|lnfFc)M|qKA}-W122emKrI@G|ny7h=q34#Uqlv3^ov3e)Ybcpy zoQh)_nq+Q{V>z7kfgi^PDY?Wx5&_!b;91N)cd{dhVUi~G1rWDJH~R{Mrm+x&!7~#%%rk3 zr7JYmRT&aLOf>;YCLPLg~ zW-h*aE@4_OaceHgQZCs|E(LKOm6m8bT`ZY?G7PsWmP>9K9VTJ19rj6bL~vMulLu^R zJdKMz107aqYP|WeL7!{Bj++C2laZE2Yy?8VYvOo+NzAvGIr-Pdi0Aoqp}FeGm|CBl zFcs6e1mu<%;BjvfoZq@y5)>heWc17_Xp4Ea4JA4SJ0tkIB)(0Bv5RG7*G1n_HD_=| zR&=fW;hb*@{5wrv6UD~{W5!=%CAng9gSWDj7u~WibKr7;G%4*Zm0Zw#9?Wr`H!&7? zH=c)Iqbw-5E!egb!4t;X{1sG zSRAPm0wz}hmV`?MFee3AScP)N8AUF+>S<2e^G@hJg{DR-cHM{@R~m!q7 zhUq~H6x>ecNT5Yz_b}oTVocR#FbyHKNuGWx$m|oS`UdoDFr~2(5r4IuO0%@%(xYeI z^5wMwN2BUlLXEL`eSV|W_=T#fba_u}gU)h;-fhGCr;R}4ppkZ?iAQ6EUmi%jVr{YL z1AjR=W&RWBSU3*n(WN>fgtD)Um;{oTW?D)7X%&K6mEu~_jr>STSGk+5h0N8)rmmQZ zTgGpP6Au_Mk6H_1YD$8a5!YMmY_%{o1!}SOV`4ngw3y;xEHN!UIm1gAr!zH3?p7mF z7FS58!RyxvELZC<)ihYfq&C(PYSqHq)iy9$q=w74XeY62V{TH^VMEsomYDklfl7m$ zI-3eg)53Iu+Ka;zBs@wfmn)w3z38Zh)b&C)yf+By%GJCANVkDqp(3U-}occJAr z!W_%4J(t^h2BKnYa#)T(*p$<5YZ~B}f8{EF{iUVdqEb}=3LKD`?-cNDH1{}69A#Dk zBQaK4tvgjZ4#rMVuT@e1w&^n?CKX(bwqS^TiV~Apx88niIJdHbtMYrxP{DHz!aHS= z!S1e`P_Y4ZNjN*9_OhwbQn8R2)rN+}WxF>;sybV$J7u}+;g~zBJqLJyX8Fe*R40@t zR1U2FzntYE*3tj+T92j!F@fKwXgu{vOE+Nmg18a>-L+mH15A+wI|62T`L2hlpBKNc^~CNT;OJLZVS&t$=I2+ok$BV7+3xU=3XB#W_K)^{geVT6T)0)0+1h_baszI)Q7w z_XE8cxGG8TXf)Bj}|WixYk1$F#@jjtP*;$)vfGahf zu}04qIBjF;V&-b)n6&!U#QnXzu7UsO!LPcPVCMQ75sVLx zRbu27^%atAhmK{kuUNQ2it-Utdb9B4Lq&gZZq(1NxX3iGI&4h; z(8Y3@YB%|TH^u3Dg-ep#Pw*jc!bdR6Rjeh>#$gPYyQy0 zca?6zsWwL~ftlW{H~zWN)&hQo*_G~<##KkHDWEP^!H+eQ)*c=W-z(ePT7DjRxORY9 zJ)L_nY&;zY$g4c-D%gI$s2G36)=@ewZ}Tx^_+3?p)uPSM4vTNzY!7Z2(KbRsYuQy^ zCc9NXy^IdK*j^c)OxnECKmT3@es}%zXP55%Z8p>fb~iL}3=7tedhuFgp0Rl5qQ1iJBU)0R z=5EhLXNv11y}_hY|;@6q= zvDhmH>D}d_^wEps0U@unK**~Y5c29?9clfAf@H(2hkr)V&$&Gx=2yvEI3VN|9te4b zqaPBvsfr2uLQaKa-X+GVkAqE8}kmuI3@R@ z7lpr+KvG*ZwTXisG|Yi?qnbCBNsV7fSsl#VbWfF>JMRkj{TO6svFcJvaRP)B_@PV$ z98!lMvpfiw3$Y*7L>PvriXY0-nJayzpootgd%!O27o&=1oItwag!6h~#!bxS9FPCMnhRFMOp`1Cc-USlAq$_Mn1C5u#yiZzP$d3tU1 z;tfU9ky;h`WQoKQZ}#eA<5bLPUxKEUN|kbJ>I;QD7-XDiKc_C07x5$#$vN!RW}d1T z3*Cc;{TNkZu^LLq1R0h1;U^0#6+vjY#_I%p z*#aJIW6hE~vyt22!f=#AZBit@2^UKJh`qCa`h9urYbLEcx5j#$XDk-}g-f$khxL`Z z?=20(%ND^iN#@lZhfp8NmNiZqn-oS_Y%edD*YZl62Mg0|;{{)Ba$YI}A+K{uOyADM znp#s@S)E(Nza2)&x2=4{b?rlGJc@Ji*mzl$J5#1tn^@K1`kc*Ek>UGwWo_q$6OGre zr=$0$$w?3QKUrXy-|J#GcXzyC_wxm4*_0v9Jhbgxg;?o6NKPB#zwgmXk8xNMN}f<6h+W<>e7^HShw zN&p$J>p|t4Ei^5|g6^CNM4vVps$@shim;OEP+J%s+^n=8?8AGRO-9^W#qCD<4C@@-v-pZZErQdDRgXLRB)F)1p+U~a4qg%#I<$k3t z-)-|vwoJH8{K~q$`yq_cIu$H;miP32M?$`JCVAqlNH9}{*VR4U8q*1sAG)X7VgmYl@BJNFE*bqu7)o#$P=dc5;yyj zEclXL`BD)6_p>}-ioZa!|BD5Gp%P$L^tXnF5}^;UgoXku1c*!EOQZxy4+VfR1EsD4 z-c1K6Nd&&v4^$5c)Xfdl9tzZ23w(zdBu5!!C=n#BA7mO5BtaP@dKF}q5~P>{%mu+8 z=mTZ>0-aNEB{TxunuEEELPF?+<$!}d)RN#RS6orTP|<%{_5=Wc zxCqM$^RJdY|1BW0Yp1Qft^+Ppcnl%;0RI6H9g7L*AaM?i4Isd-`gcHldciPTr#$>< zSN+SRq+IWsyYx4cQcBfgyD7@Q0b->Gq21E(UzaKAOxjV%t-w7%2@oYRu2r}*EvNO5 z%M`dSvP{6P`goa=W#44HJ`@jG_PAMYgk(x*%XI*DRjb?|0}~x>kY!Ig_)C;JB+lV; z*-tsL!<)xtPj>4^gPX@VhwRFarT343h%fQQJDCUoL{y%g95F<-^HspEYDVdc73aJb zL;?V!3(?;Bq630d|;4oU%W4yWdpmB6xRyRs9WsXVzG-SVJD9zPsd_P~Rz>VRd> zM%@hHzX|!G2l#JrOhylzR?&Ap0C5h2-KIVhhAM$m|p|3IK5qIV>_joI{zh9T4ZxK08Pj%*e2b}ay9(nZwIAV^m154J z9vs~&e+rdxgf|ksGZBDYb#n|!d8l`|ygHEGaSX*!qOW(XI*1Q;49#Jvuj8OPSXgEe z4(u<{zk635BJpe#D}JcIin%6K;mZh4zQjP0Oih@E=m=ij&_J$LP5Aq>VS+x1!IX%a z2s5K$qR&Hv@#Qs|QVBZ-XaOMS0!h9AS^yk@7JxPS5yje?gd!kwUs-ZcwH7-9XaOKF zWRPYCN&r-V5`f&2QC-fOhdLRN;!FKKHl0#e2}ILPy&#C2PEM!EKLX1))&#xSSWjp%+{(UR(|}zWXPng0R~zC>e^YXKY*6M zZPzw+ZqeBK-;S6fUE;?+wPRqV~o-}ox->~`2@_dKBl<$Uj zCh)^KXnexe?1kcG+d{>x-@@PAdzjB2)Ka*HwtU!2#`-S!jZOttyoL>hklm$Bxq(Sd z^MIE$M?~4>IuSk@;U(lB zG}9`#I4gIameiIT4{NrJR%~#l@X~B^XdjK5uM_ z@hoer?8nP_-U+X$ubD6`okBQiKK?>yS=be3zld6=;ozPZbTRHqhBwS4u`(5LMb61O z{C^M-|KYzmFV()^)0k|XYnnK(^tj)DkI}a9N$#RH{rzxQNeNAB4$W8y&AJNBAq>j{ zVoNl_id@4=Qo>4`!^#)JDzCz-3Bzmo!s|7{8(qVjQ^H%D!`m0aJFmjK2_t&>BKkEV z23`NNWsgSWoNMGlO5{>=5P@PR7GlYUBPfXCM)=~Mg+|bVVzCS(7~J9p7UEd>BiM=Jds5=?-Qt-U zuQ3D`W1qT3ycmwBA&Ps^0!!Z#D;ydJXO}?L5>GgsK(d=avKZe__;;_A8I&Q^Ic&=R z0G~_jLVcf8OaNiVv7-kNT>aqU&#cHHd!wx4!x( z4Q*#VoPF?7Uw!mSJ>v5YL|=vAGyb(I{v$q15d-?F!V#bTM@0xe)5?J;AoyJ9uLXa# zm12|xdY9sv3Ig=ixM14A4-kFzEca1g4P8!u)K@c4kRbZ1R7wt@ukPg8P>w*nQl*Lc zacV#snz&*ZfX~jv@kLn>d?sC#gy8cHW(fqJLBH`i=@FlaEg<+D_Tv$sQy=kJ?Gc}m zAMrW-5uYo7D`jO#KnSXD|exmm&Dv1;OWZ2tK<&@L3yz&%7@He8%wv@c9yg z&z~XqTm`}BcnCh*JmRx71fSUi0enXB0Py(-1fNGC_*@LZ=Wqx<+d%MH8iLPk0suba zxC8in3Bl*j5PYtK;B!0#pB*6h{1$@G1pEL#!?*$XEFJ3bYs#S&z~@m2J~z33y!e{m z4B&J06@bqkd;mVba|Q6(|Jw8RxU2=hXB0jFpX+YD9_~=O0DOM_h|gOPe0J1J!5$KZ zVFmD6B`1kWqQ{&Rz-N`|d(I(|?^f0R6l0J0JO{yN(QybqPeSnd3k09v3`6kQ>JguN zAozSXiUGmrR@9mhiGW9Zu7lw7-8fvngxKy20H4Pm@wo(o&qgBVH8k^=xfhXMGE1K{&B0G~wx zeD*Dwa5}BdJnE->u_4*#HiHucbZDXc0`yf}phW8#P@*M5Kjmv*odZ8W@ft^}Cy*1@ z4=B-sp=MNs1xmDF+v&xjOQs`FtMbVP$R*xLb;ZWvdI2R`w}8HS2I#AsfWF#8_c_(R zs)%QROwK{7Bl8s39VpTI1?a1rfW9grTdI^i@}=m>2PDa336)~x*-|AuIXPLAl)SWA z6S9V~>RUz)O*%kdtt>a8A=Ubf+zRNc4nT+2_Bx~b2%xXVv@z)s70-82RaSY?ki3UM zY3{*JvH|qf73?yNR*uFRTMuTVMcT#Tyo%Z+nx}xi+Bj~XWC?U=%>nvqX>4P?f*^}U zYSGdxvW?@YLvsvQr%wyDxD8b#eOVSlWVODRMb4RmQDx89uu%Ney)L`Ivi#(qZu^g3ssEew)&C!# z|F`R_SN_6;0k8Q2L^T4$T>}7RRjN5aW+6cCDnNlSP>C;4MI%tnHBciZP^&pmXCYAU z3IOLI1HK?5jUW@(AhVPpfSmzzl=W4R?f;21wEw5$Gd6!Lu4XL0TP$H}EOARL$zm+o zbu7TnRQz$zG~;MB88pNq&GX`z7$UW2BIK%JHC9oVgd^p;k(R(Q@!SlN-ZAlC-y`ba zMYiUky)uVobBkEWLF=|9A5V$z!Bka=i;zS@9hw1$k-bHRV#X;-r6eY-F2$-uoxV#%jC!H1R*K zFQl`W3GECT684=PV7{F6yyQN#?Lqpty4gde>dsX;Wlvi+p%$YsdD(3uk77>r4Ka4029Tk zuPmGf9z>7_92-#uIp$c86NLdEr3%rbV`HXi&59CoeL*k4YXEUuo@gXIM#d-UbBu{xu*!!Uvw%FasAEBFKAfo90CTg8aL1Ax6Nlk%R|vY?Lx6 zCtE`fVvoLFt?-n5=%Ss7HF1zcaS#f=`d9iRTN z2J)3hSK2SO%YM3C9Rc~uljkTvzA_4(Z4V-y&TH{I4WyK#(s_ z8-NJ%IusB=UOy2c$iFLu2=Y2#9tHW5rw~D2ZyF-V2SWsTf{)Wv;&c^`ZzR}&d}SDJ zwDT{L(z55X!rGDNbG(-0=kx3yXcr4~;j$NtWa*I?O9W-(7t82vXqR8%MrAL*JuF3D zuAJ|I$1lGh+@M{pZXwHEt$ihqx?2CtIB~TxCV+mu*(W7;z16A}b-i6@F>(E)%pLt^ zCpS#)W;ZP@>Siy#bmC?|q80u2z;8tE_RwP~>h{QSZ{qf+)eZXHu_3bj-H8@)^xdf< z^o;i0ZUgx1*dfEClN;h&uhkx zVt?!}I75N>*6b-(+;Kn!2PLw42r*vmabVaf1*+)+B>|8h5m!Tr?y^8gdU_lT6-No= zEAvs1W1ob$a8O|<(-Y8eo`im|qrxq|qNY?j2}6>>!*5CMKjvAX>hJ)~LLfI)DEvXWL9M9jx210szrYJfkt-nbj9`uX?Ecj|43IEaZ zGRUwfE26Z#u_!Gs0ZPkDh|=-`=-I6X`V1!tzoM+XZ#~OY1W{IAXOxw9f_c~?sV2P_ zK*y6j0Jq^Gia}X^%HtuIXL;2%^wOl|1b#dz{}2TLMHE;l zqQF5B1ulvx(5nk6w@^e8jUtMae~989MHH7PqS!?d#Q=&ZLQzDqg(8Y*6j7x7LloyI zqS!_eML#OB5mhn`MgLKzzV%k8FuJu&3*wE^^8P_3HfB6v6{RSmP(l$!D2gbyD2%3} zn^8pZ5k(Z6D5B^^5k(}5C~#3kfsP`Itv4SqVj59I;ff-P-zcJJKoNyKiYNw9L=lQ2 zimlhSyfH8oQJ^$^?9(WsC_xbg%B$@dhaw8X@35+o3~8$v-x?F*lu9oJ`HOgh6(d#h$w6W-84`{;YyOVLD9lL<>&AD%d_ln<<8`M^VrY^ zZ=M(fiYSi8!YR%2iA>8-T3)Znpz|XN4hIFzmdTnJzG6F{JvFNGshq0pVwpDK_sO>! z#p3@jBsTs(QT%_R_`hl(|Gyy$za-{wNvzFD?DI+QZjw;bcpfE*g^m{()qpzNeq5jf zP7QjD%1N@IP>dvbO08f@yGQm_!!&KWnNO^jyX>+PG`IE})RF8qw@9C*k_Gw-Ysb&AeFkcBX5T(G8 z`*#=3a{@*8yv|S@!{?H|)ihmU&)zBr;CK|sMG}xZibkHU_r$-E2|ZWjrc;V1kqJ`u zOIlTgFj!Rau}m=xWnh>$OdBRMDdlp7m=Ux7-BvFYOMKLM4U$Yv#miog#YHfV6zV72 znzq0kX7g1$gE)k}w{=o%fP_F}pq)Xj-S=LvO#Xf229MeDw${dXh@Sz6w{jw+Ru*lc zFR>quNw_!4;&B^+qC&O52V)p8CC~YYEOXRf zu7t>Fz&9**bEvR%sYSTi^HsSBDu0~yNZQ_4Szr>arrcuD0zRjRvjLSD0}sNy2NU}<$Jk1$8??1ieu4J;;N;3)1ljJ zkz}`tPCwJvc+rCHYfZ6>j6wH4Hdb{aq)cr;A%9Jxv)XLKe;U?qOh5#}i(Av`ZKl$V zOR!$F^6rnB01saLZfvlhZ#vDv%1QTj?`YAzvmLoR`B*y;N1FCVtkDTR3l-3BX*)k% zLWK1pj~;JDF6U>oKjpkz=082G$hXtbxaPmRp5AFhs+l$4T%3rdQTg9-lTrr#e#`tJ z^p+;lTmc%)vCJ|3Ql39ci#qX{KGKS-jN0LRCS_CgJloXh< zyEa)yb1YvMgo+sT=YXl!?djsAyA)Tfg$U=ZqExWv>7zAluj!)H)%^-m9!8iA5=D*5 zY}_qdkk}Chy5w+*Jr7gLLa%3%6ELSeC$nFAX z?3WdyRy^gf(ZPN9#$O8+-&^BJD?hdGXE;^BX+_wBQ9Q(MIOgil{$t{!KF5dIqtwI1 zX?3>B#va#-GT17QaaG-pbY@k3Q^P?;6ZBW>yXGTw5zdAy$4t(~l^LhX_Q4~OcfX$a z7`wOsrKG6pI9;fyZhl$#rly6cF7pJAm;4(4KWo92Q7pYIXnt6~76YvsHZ*xx%kIvZM8) zWT>sTvEh-;NUo3@rO1M#9lQitjAxQ@VlwM%k((Nr>TR(2)k7cg0&=xFDIufn`XZ~| zed=2vmF`jc_33JbrpVWKH-eu1V{zJ4u5E&U$7VU)=CH-gKv#cO67k4ZBiimRPgd%# zcvdHiR1Q#s0yiq8Kc@-cpW6<+U1PU)jx=iRr~Ihfj)Z?cSMEv%G+`eN(`mx}9Oh^u zKKYT+Mw&$#&_~ZYP;)UoUUXW5xnsR8&LvP>8NkkC3E3dK6Hn|1VO^G!bH)> zQtJd2ym{+H4N7vGBvrk=BFKA77HF!D*`7_RxhuJC+J{t@;&0ZdrpXLv%VNvSjJ7?- z7|$aErX(NrZ%k>Q;^&z%f~&}xvup>*nX)4mzA@*-?9Vgj(qsPnEA+3i&=b@z1e*Zx zPfj!L|5Uq$%4yp5p^5)bhdlpHyY)}4DEi2McgXYKdeRQ(zPtV}Wpa*dsCMiB&~E*! zlp_FBCP%gTKijSCzUTf&DaSvHW;Gq2|9Z&tudz^T%jiF~qW>NX-JiKet79=!Y5l8| zqwt@c<}G}K5aP5Gvh*LN92&nwmycdT6vjt$ns5G<)6_uKiYBvi)vic<9(eetl;fX8 zv*I^Wb@miE@vSMT)RUKg1tdwZ{=H}}T?@zEn;3|o4!@?Mtu?5m2$k&D~hBIN8eIm3lCkFa;UnYm7#c^(D_7coH@b!r8rqA&Rz3|9XYvhRQ03G z<+W9UPB`&yo;Iz{X1?On6gWea?es=ontRQ7DzREdDTH0gk5MX_i^T?N@7-0JNXH?( z`<0^^IcQ%@9imK-np!K2U+~;Rm;xXC;jf*BFHWmLP4{wmAA^fCm|bb;GEtT|o39qE zJi+*8yTMN^dc3HxW!g5n)vSQAnWVF6MREa?tHWRNR39GyiexWB`e(GYo6Pd76i)f% zNk`dNvDP&#$;1!OriyTgtPfO^cO3z=r9t&SB*kpYY`R6(q7(BUpU$)Og+VoynbXNa z`pQ|DWWU$HL7Pw-B15ZjWKInrW>@dn4j8W;!LzP|5s5i@GH0LXPmKD#9Vs1?ChD@M zV~vomm(*N+t~sMa1gNYAbF~soVcCe;4~+)v7NcLDx5g#2k z0vB~yrPpsB9)>t3Vk9wk;yg8~4ppo*T^oimb~Cur zEWLSxQO{fQ0O%A;o5BO6evpi+$Fst@n=QhEa>xF3r;cd>Q^)pHsNhCh6QNN`Ap?Ai zr?=i~wH3fgGn@Xz2;>Jjeq);${e3T%nr4HvfDVFtV3dW{~3wO3bB#YV~62%knBk zyT3xS+re`LNB8oA6hf2Um@ir|E>B z0s~a5>nTHObOY0%m2=n8wbqzypMnn$Zi`d($DTS8O$!^^Sg`yuMAB|n>3o`bcd*aj zEcF6X3x_(zkS++>9@pgK9~rYb>F+3gPjUO?yok5h?!Zb93yE{4^T+4-0y=h$^EGy& zqBT48>auf?dB<#STXH_wU=yd7$`lp@WZ*fldB|M0Mb)HrK9#K+<}fxQ3jM8x?i6pS zdtg^L@S(<;mu6X~Om&i;`C}>(SbkL!i;OFTApQg!GjVqNJW3(U-?f+nQ6{Oxj{o&( z5A^1#yi0DZTm=b6Px16u>))1i=#IZ;tONld1+QF~ zHR6iXD@bF==ru|dlj89D;tI+;is-rA7`*z~!!42vloQLO&yjFpFFG-yZOflUYe~5A z8P)s#qOYTB4K0@{FCKpzLuqL2B%5SE6uy62z}-T?=kHn+RVKD0MO2N1Wh|aNRXsC` zaZ*Y6HkRHi-dgb7NwIJt*P^WacM#6x76Yh+LkecVkjDfGh4tWkor79@PUwkq{|LQ$H*IhJezqHu#>dm4hUHvez8mFHAff3mL zL&>ZH&VkfsK-$b}n0#~Lk3%h&X&bNE^vlC#vnd?a7<9&T41;Z)leF$vidW~3OqWl= z(k3ZJU(e6wy+PX!ripTp7_! zy=>`;@5axZFGJpk`4$2`tW|l^ePLumL|I`G-rg?EiM!EISsVkGzRLRR#I95EE_dFz z>BWy#vpNvx88+XkI_3F=ZiZ{2fI*cD^b%nPtpOc+s2MM(HP{9=N%$qe2E26>!XJXa ze;Zyq#F?)J_s^y}u>S}WH+VrR)cU=T;)7GhQpZ>zl6!Id{>UxERp!|R9J|Z0_tnpz zct76k7jCQQDP&Pkg*wU2w5eD_B!aoCmHKN%$@^5FUIxBY;0-L+LkKAEHMlrj*h?20 zVQ8v6$b53}a%)WuMp`-0Uxg5^VS@!iRU!!A&8l&czT=j%h^!;vk{0^2_Ku?X?LiME zz9h}WIlcffh)T{EC{G{&wvJrpTz&er{plyv7%!d2ZG&lyZIslPqD?n>OQr!3KB~LebU73%lx@%zrgO729VNIdo`uw;u zwTTS7_%A)RY_B8uUi`o9qr1=eB`x?l=p1hu4a#uL(_gu@Z#nJA8%fY} zbbw>qyaH}_g3}a&D^tY^^!&YOqq=e21$fKbF)0@W(9BfE? zR-bVz6XTL61l~)(-7(eu!izP3riRgpGq;S`zUVJpY>qPS@pdiYlIN||_R8zf^ zhO}$H51&nuoJ*p|;Ni9fzX@TpOi#9^m(`ukKO^?CDI-9$qJ^w`IY!C&)$365c#GJ0 z+sq|16z4wx*fi527&Q=r5D_MSkhoA7M`}diRY6N~D*LRh^FRT%ltv*>%E!b=zuq9{ zjZa~(97vkQb7ko=>^XLuaz=LigB^goO1y3Lq8|Hk{hp#5TXuSMX~cH;iGsY|erCyb zOe1Fw7!BXL3yn9f(=hbZCXq>50j%OTb;{M=uIK&nTQ}c=$pin8s&yLTk9jLOwUpv{ zlnu*fT871!geUaxg^bsitlBxo;bWW<5qOrnpDN&6(*XlNI0@MU@Bpeyiu}uVF*DXo zjTacJ)U&5epz+N;5LqAzfAi%0^C?jN3}k zR9DT}Qp8aa;VnpCh}_VU-^X{I`5~H-EXCskG$Ku!g-$i7;6<1}-wUbi72CeznY}U| zzbt;Lke-HBI`9AOWLIoxT@=t)KBga-j?WjyQXz|>5;s#Own2%epBCL>`faAP7+38o z)hOh>hgl3Js(j?xm3a%FSUuEv7H)h4)Pob1JPZU?fy|v3%gjlhA{qT%KG(-8xun`x zATDG5blJBe-Smtd?xLEafM4f%2>3l~+`Co3>z7tUs}vORtt>QX-NlX|K2PJ65vKw7 zd7C%ju2#3YX*%hz=OmLVB-V_6%5hgYGYep567D~xf4Y!2i%LGOiqU*X8cal+a}pwd zlEl{VBTUg&5m|&yImqcSqg6>L!uO3?X%JGGq@6)qt#P5ITyB%ZgNuu)_0b(?m|L5U zl}kdtX5%2GTv|a#QCqHvn-{=G1*2sBD&+L94F7+mY&gq>LL;I8A zB23jfZF>mOh6bjyutYlN>VdGegQYS|juA?lsv~*e4J#Hbd6ctfEp*(%`MHn5r}M`7 zy4yWxNTt#!$JPjFN`yHN0m6VT2?Fke_GVukV6iijmqb~=OHFzUx}Orq;ObOf&9|1= zq=8rMar=P5a2%Hpe)Ucj8b5)72xsk|M$4%tR=_?jXMD+yUe{q)UwNS7=g%F}eJ-Mb zuV&$y$f1hqBt7Au4u7ukPr@Ci3MF5ZIGlNMwDe`ZsNv})j&dGubyanSdgT_9Hq;yd z^9J24&-!$&*gLOu?J+|{DO{JXOFZu3J`Vb6Z-yAPGeVqyc8L=A-&tNdVc}%vaqM!A zwN`a)>Z6|u-fR9CXNYf1HfD7m!8SyoI^7X3+d=rVQ=TVM7@)i)=Q8p4uQItfy5tlzPSbDQ|ip&^12DHKDzZ-w}ev zrRoPD^qAv#&T5Sy2#lKZrcL;iEX9-!CNTC=W}FOoEJvpr$UlaI@RgbFO#)mAF?T^@ z4*MK~s0B8z`^RJP1xKd5(Iu?g3{9uR4C~T2b)yi?cE(FNAGP&N1Na9rN=MH4_6JO& zAtrMX(VlXWuAaT<9`;Ok}?lS~(SIWYW=w zSwlU3M=MZ5!HBoM`gF-BB!g^}U_EdpQf0%-il9$MZG^b&Qf%q9x*B|r;2GtdnJ4c; z$r``<+A=T$oBO9=&IYxnD{IZ>yPz$vHGq2kmdUTJfngF(9BG;HszDEcy!(hjP$HKr zsShtgKz&pGXqCre3q3LI@59F6839kSxK9-U=-rm=uPmjzX4}&phoId!B+c@z)vgM` z_OqImW1c60@w;>N+tg&GRGqtY+ z8qIx(=3156K?5a8Ipsm)uY=#T2SRHHCKJ*fqX#`^e<%_U$hrUY{`ym#|7ZB|&v^W9 zJmulE+2Ksk;hZ?dRL3p;J?hde_7lAvakGohy2S$b;g5~IO8)v;}1R) z%smrsKNDR!6Gxs&Qk_dnoXeV@%Lkt;=AJ9JpR2B%t0T|fQ(b6DT)4fRlmRw@>Ly9zCdK?FHTWhy_a>wLCTry;2YHi6 zbz2~DTV#G)9DG}vdt2UqTe)&ug}kk%x~rAAt2e)E2)=8|y=!T|`?+%W3whT;b>Ag% z-(!B?8+_lNdq3EIKfH23io74EdYF`Wm^Ocy34WN%eOPFJ_>Ek7SVlgqQa!FqJZ_pl zZU;Z^=05JXKmJ*HJVHL6P$B6#nz@o&X~0OVSmib)J=IkMlhwv3F#Kyh2;ngA z%`!Z*9nBUC#(HaXZa)cC%azYIx^SHNZrUFH*7(wS0fuy0>CHC2a$RlAg||MNH40S003Jn}2>Mz@y05Z4 zN(^b%wMtC6U>;?blA>B=wjVt_DjbcQwJMzL0A5w@KKeRU-Z5ETHQ=muotnT3m{(nB zr>IU{;?zwoBC|Q^v#1Y`3)>07#a+$ zzRK|%+N9Yu7~18A@f$gmKpTvle!%&ST^hF+w8RU*=`spCK;8IW+k?H#gdNNDoo|u5Xn8rpPTyrJU)xtUVu}2D*4lgHR5K>uDphNx z-s;jwY9g}JxKnK0(ZtQ)>e_Y{e|(g8gC**IbuVw^-u;sEt9$sF{7;X*3hn#7KBf|i zk0nD@qMjq)V(#}xB(MXUM#*2cfu=0pJb)1TUpc&H%p)H7X01xvE=RMfg{>ETcHY*_ zf5H~`g$I%T^4&nAd-UB(Yh?4=&W*_7*eNXeval23Xr;|RWT;|gu z1&P4yQT_J7D+^0x;LVNzOVI6cUoPF<*-m?K)a8}=6U<2bCwSwZG1ynpNc!6W@5V#U zoK`UyN`K*~kB4qltYQL7+n&3QBfm@>tYXWR{=|&T%?;Tr zv3@u8&ChY07phcZuRfLGhAiI(!pe%BU8gb`TPYTQ35{xdC1>q`3`KN8dDp2pw`C0J~ow$=`?W+vj1**~j5!ybtfP&wmldjF^sUjMO96 zcnPzYmji3YdDqKOT-Yme1GExTLDKX<2j#b5El2~O6uXy$DlS0#+swHHAIw4h;){0n zWxcrQg~R(b44wQ}UShI9N3D@BI#7O~sH&HvPBVsXncju44$M&x`bGD2ikc=Y@-V9lFWdt2EXgpzFunP?IfweU@P_S5OSP z>7E`b^EAxW+b7iY(0i8g_l2vk6}s7JY8t~P(9K^X)a;@`pZ<@RTYw0<`OOR|-8sxH zh$+K&V zdwW^!Cq-d-8lT>?3_Oj3Wm=LLr@=W=k76wTn2?VdG&j|G#A~o6sHhh7NnCm)gan}E zqjUW>9@4K;kn9QU&+`T}yg#O-1z592!0j=bLL_TrZ9?1|2F+&%`#^bIJWR2}I2fK8 z-G8cizRnNZUe;!8Q9z1eeioj+bvkDJwj$j^qkdR?S}il%%~%WL3OD4rE5mktR0|VR zFPJjLuI!bOMWe2^pnSHry$cv@A`1(sj+N~oko*oMTTqJAT$*cT@kjg!U$JF+;bc?@ zcF(Qys!}O%G`+f*X~Viy^nLrMx z`7WNhxFUX1-}%DT?d#p*B7dXyP`0acVdj#O=~Zjtp{w6B;PQnnf7|KO)TiUjx!cP| zwY#?`NHdJARqnUfolY+9VHJF9FM@&HG-i{iDxhh?#wG=}91nG?tPS#|>pqr4k3X#Pq7m3LM zy`jtA+cCMFGX4W93+CO|W#UHERE<=)1$G-<-SV|kdgFe{{xeE(H&5j34Wr^cbaAV0 zS_?XN8WY?7*!XGcAjhX=$2B`3_jD1>+`QrCa%!l6XvAsGH9lR==^n@ZhW?)KK$`C< zg!68h`*^M2%`7G5D!^NW>Q*f@=bZc3{T_z1KSIFg{CgVxfrZ=e*|DI++QvY4r`%66 z>&Tp|mZgVdYWH zDBD>q+(}YTO#+fCbnGMxpe8HoeAClOG2Qugvy<|?lM2v9P25F8-$l#UMJL-uuhYd~ z-Ngv%Vgh$Dr*yFtb+OiWvGsJZPj_)_cD+0A;skVa5qERbck}Rd^U8Mf>2w3FyOI2$ zZUJz&U`n@8QMYh?w@6R7=ybQ(X1Dlxw*;U^lDJ2TzDJs`M@F_sR;NeKxQS!mQR(SXo$gWF>`_1O(Ez~T6T>y>;aYrfZCSXE4qVq7t_OnagW(1#aKj?F zQ9aza2W~PAH{FDrox{xmy&s5sE$DkK`FgEnd#!bPZLE83LA`e1Ui*|@hoWA``d+7= zUgzmvm(5<+^IkVVpF44%2Yug1zCKUcK9EkImvx^vsLu!7=bO^!SJdZU-}kAfFJQVa zaI-Jyye}Bg|CzWyguXwNum6i|KUk+f%(_1u)E@!vk4)*0D(a7}??=Y;^v6#3$8Gk< zpZ9+S3?vW_B+?Hg@eL%)4y5P|K&%H+K?7;vf%KGtZ$$$c^#hqb16k7p*_#77=L5Nb z!93!@eEPuxzQID-!6KbOsP$kmXb`nPC`}nGD;g}XAFSvZtehVFzByQRKKKJLR82fo zLqAl@H&iD(RIf7xvmR;y4K;#?no@?Ei-ub2hgy4veohayZ4Ui9A8H2-cMuPE(hqm> z4R^~9_vj46t%rL-!+qf4{*>W?qT#{%;h~=4;pyR#&Ee7W;W5C-IPu5?{m3NW$dv5J zw9W{^dSnJPG7BD=OBtCj8d<0xS?n44Jw39tIkJ2{vH}=It`d)~(T}e4jc&+}Zt9F~ zS&wdmMt8uYyD6i4MWg%mD3BZdGd+5^IeK(HdJGslAs#!WAN$KUb|yP^t}}LFJ$4Bi zy8@40r;ObcjosFd-Sv#!Pmeupjy;}_Apzr0NXF3^#?gV}7;@tP-EmBtaV)QK?67eh z$T%)^{3&ew8GQUXV*JI{INrthOUwy;k_iHa2}0lmk=z8a?gWX=#4E1}(y$3K$OJib z;x%mI4Sa$EG4Xb5g7RX53UiX0WRiwqk`_2gCpSs2JIP=($>=r76gJ5WnPh=Zvce|W z;FIi#Nsg__cNdeKm{VLNQ``(wJisYlxhX!~DJ0Nlir;HWAZ$tyG9?6^5{6BQz^6nJ zQ({|F;uljAnA4IZ(^3r6(!gmMxoKJ5X*ru|d9P`OuxUlev=Ve$88)o~pH@Xot8GoI zUrcLYBHoiAG#L*t`{?In6vIAvmOky zAAz%;aOTx<=58h34ltPelF;v-x@f diff --git a/src/view/pages/gettingStartedPictures/debugger/start_debugging.jpg b/src/view/pages/gettingStartedPictures/debugger/start_debugging.jpg deleted file mode 100644 index 3d39fbf6618e891ba856af8820192b2a5cb1b64f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51011 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 Cdeq7Q diff --git a/src/view/pages/gettingStartedPictures/debugger/toolbar.png b/src/view/pages/gettingStartedPictures/debugger/toolbar.png deleted file mode 100644 index 754e68e03fbe5eff10db43c4c97871faf02d3184..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4635 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 OZ=kLgT(ex=4*Ngaowt7g diff --git a/src/view/react-app-env.d.ts b/src/view/react-app-env.d.ts deleted file mode 100644 index 6431bc5fc..000000000 --- a/src/view/react-app-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/src/view/styles/Button.css b/src/view/styles/Button.css deleted file mode 100644 index c30ed1360..000000000 --- a/src/view/styles/Button.css +++ /dev/null @@ -1,50 +0,0 @@ -.button { - height: 32px; - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-debugToolBar-background); -} - -.button-icon { - fill: var(--vscode-badgeForegroundOverride); -} - -.button-rectangle { - stroke: var(--vscode-badgeForegroundOverride); -} - -.play-button { - border-radius: 8px 0px 0px 8px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); -} - -.refresh-button { - border-radius: 0px 8px 8px 0px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); -} - -.button:focus, -.button:hover { - background-color: var(--vscode-terminal-selectionBackground); -} - -.button:active { - background-color: var(--vscode-editor-selectionHighlightBackground); -} - -.toolbar-button { - border: none; -} - -.toolbar-button:hover { - outline: none; -} - -.edge-button { - pointer-events: none; - border: none; -} - -.button-pressed { - background-color: var(--vscode-button-background); - outline: none; -} diff --git a/src/view/styles/Dropdown.css b/src/view/styles/Dropdown.css deleted file mode 100644 index b69b14c74..000000000 --- a/src/view/styles/Dropdown.css +++ /dev/null @@ -1,24 +0,0 @@ -.dropdown { - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-foreground); - border-radius: 2px; - box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.22); - color: var(--vscode-foreground); - height: 32px; - width: 100%; -} - -select.dropdown:hover, -select.dropdown:focus, -select.dropdown:active { - outline: 1px solid var(--vscode-button-background); -} - -option { - height: 32px; - background: var(--vscode-debugToolBar-background); - outline: 0; - align-items: center; - font-size: 14px; - color: var(--vscode-foreground); -} diff --git a/src/view/styles/InputSlider.css b/src/view/styles/InputSlider.css deleted file mode 100644 index b51dae8f3..000000000 --- a/src/view/styles/InputSlider.css +++ /dev/null @@ -1,103 +0,0 @@ -:root { - --slider-gray-color: #cccccc; - --slider-width: 240px; -} -.inputSlider { - height: 48px; - margin-bottom: 60px; - display: table-cell; -} -.sliderValue { - -webkit-appearance: none; - text-align: center; - width: 48px; - height: 32px; - background-color: var(--vscode-editor-background); - margin-right: 15px; - margin-top: auto; - margin-bottom: auto; - margin-left: 5px; - color: var(--badgeForegroundOverride); - border-radius: 2px; - font-size: 16px; - font-weight: bold; - border-width: 1px; - border-radius: 2px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); -} - -.slider { - -webkit-appearance: none; - background-color: var(--slider-gray-color); - height: 1px; - width: var(--slider-width); - vertical-align: middle; -} -.slider::-webkit-slider-thumb { - -webkit-appearance: none; - appearance: none; - width: 16px; - height: 16px; - border-radius: 50%; - background: var(--vscode-textLink-activeForeground); - cursor: pointer; -} - -.slider::-webkit-slider-runnable-track:focus, -.inputSlider:focus, -.slider:focus { - outline: none; -} - -.sliderValue:focus, -.sliderValue:hover { - -webkit-appearance: none; - color: var(--vscode-textLink-activeForeground); - outline: 1px solid var(--vscode-textLink-activeForeground); -} -.maxLabel, -.minLabel { - display: inline-block; - position: absolute; - vertical-align: top; -} - -.maxLabel { - right: 0; -} - -.minLabel { - left: 0; -} - -.sliderArea, -.sliderValue { - display: inline-block; - vertical-align: middle; -} - -.sliderArea { - width: var(--slider-width); - height: 49px; -} -.downLabelArea { - width: var(--slider-width); - height: 15px; - margin-top: 10px; - position: relative; - font-size: 14px; -} -.upLabelArea { - width: var(--slider-width); - height: 15px; - margin-bottom: 10px; - position: relative; - font-weight: bolder; - font-size: 16px; -} - -.slider, -.upLabelArea, -.downLabelArea { - display: block; -} diff --git a/src/view/styles/LightSensorBar.css b/src/view/styles/LightSensorBar.css deleted file mode 100644 index 5d0abac42..000000000 --- a/src/view/styles/LightSensorBar.css +++ /dev/null @@ -1,20 +0,0 @@ -.title { - font-size: 14px; - text-align: left; - font-weight: bold; -} - -.header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; -} - -.lightSensorBar { - -webkit-appearance: none; - margin-top: 10px; - width: 400px; - margin-left: auto; - margin-right: auto; - padding-bottom: 16px; -} diff --git a/src/view/styles/MotionSensorBar.css b/src/view/styles/MotionSensorBar.css deleted file mode 100644 index 8ea39c23c..000000000 --- a/src/view/styles/MotionSensorBar.css +++ /dev/null @@ -1,20 +0,0 @@ -.title { - font-size: 14px; - text-align: left; -} - -.header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; -} - -.MotionSensorBar { - width: 100%; - margin-left: auto; - margin-right: auto; -} - -.sensor-button-container { - padding: 10px 0; -} diff --git a/src/view/styles/SensorButton.css b/src/view/styles/SensorButton.css deleted file mode 100644 index 21241eca2..000000000 --- a/src/view/styles/SensorButton.css +++ /dev/null @@ -1,29 +0,0 @@ -.sensor-button { - color: var(--vscode-badgeForegroundOverride); - text-align: center; - background-color: var(--vscode-button-background); - width: 100%; - height: 32px; - font-weight: bolder; - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - padding: 4px; -} - -.sensor-button:focus, -.sensor-button:active { - outline-width: thick; - outline-offset: 4px; - outline: 2px solid var(--vscode-focusBorder); - background-color: var(--vscode-button-hoverBackground); -} - -.sensor-button:active, -.active-button { - opacity: 0.5; -} - -.sensor-button:hover { - background-color: var(--vscode-button-hoverBackground); -} diff --git a/src/view/styles/Simulator.css b/src/view/styles/Simulator.css deleted file mode 100644 index 016cc8855..000000000 --- a/src/view/styles/Simulator.css +++ /dev/null @@ -1,83 +0,0 @@ -.simulator { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - max-width: 700px; - max-height: 700px; - margin-left: auto; - margin-right: auto; -} - -.buttons { - display: flex; - flex-direction: row; - padding-top: 20px; - justify-content: center; -} - -.file-selector { - padding: 20px; - width: 80%; - height: 30px; - border: 1px solid var(--vscode-debugToolBar-background); - border-radius: 3px; -} - -.shake-pressed { - /* Start the shake animation and make the animation last for 0.5 seconds */ - animation: shake 0.5s; - - /* When the animation is finished, start again */ - animation-iteration-count: infinite; -} - -@keyframes shake { - 0% { - transform: translate(1px, 1px) rotate(0deg); - } - 10% { - transform: translate(-1px, -2px) rotate(-1deg); - } - 20% { - transform: translate(-3px, 0px) rotate(1deg); - } - 30% { - transform: translate(3px, 2px) rotate(0deg); - } - 40% { - transform: translate(1px, -1px) rotate(1deg); - } - 50% { - transform: translate(-1px, 2px) rotate(-1deg); - } - 60% { - transform: translate(-3px, 1px) rotate(0deg); - } - 70% { - transform: translate(3px, 1px) rotate(-1deg); - } - 80% { - transform: translate(-1px, -1px) rotate(1deg); - } - 90% { - transform: translate(1px, 2px) rotate(0deg); - } - 100% { - transform: translate(1px, -2px) rotate(-1deg); - } -} - -.microbit-container { - max-width: 350px; - padding: 20px; -} -.clue-container { - width: 100%; - max-width: 500px; - padding: 20px; -} -.cpx-container { - width: 100%; - padding-top: 10px; -} diff --git a/src/view/styles/SimulatorSvg.css b/src/view/styles/SimulatorSvg.css deleted file mode 100644 index c9266c4a3..000000000 --- a/src/view/styles/SimulatorSvg.css +++ /dev/null @@ -1,290 +0,0 @@ -.microbit-svg { - padding: 0 0 0 10px; -} -svg.sim { - box-sizing: border-box; - width: 100%; - height: 100%; - display: block; -} -svg.sim.grayscale { - -moz-filter: grayscale(1); - -webkit-filter: grayscale(1); - filter: grayscale(1); -} -.sim-button-group { - cursor: pointer; -} -.sim-button { - pointer-events: none; - fill: "rgb(17, 17, 17)"; -} -.sim-button-group > .sim-button:active { - fill: orange; -} -.sim-text-outside { - font-size: 25px; - fill: var(--vscode-foreground); -} -.sim-board, -.sim-display, -sim-button { - fill: #111; -} -.sim-button-group > .sim-button-outer:hover { - stroke: orange; - stroke-width: 4px; -} -.sim-button-group > .sim-button-outer:active { - fill: orange; -} -.sim-button-outer { - fill: #7e7272; -} - -.sim-button-key-press { - fill: orange; -} - -.sim-button-nut { - fill: #704a4a; - pointer-events: none; -} - -.sim-systemled { - fill: #333; - stroke: #555; - stroke-width: 1px; -} -.sim-light-level-button { - stroke: #fff; - stroke-width: 3px; -} -.sim-antenna { - stroke: #555; - stroke-width: 2px; -} -.sim-text { - font-family: "Lucida Console", Monaco, monospace; - font-size: 25px; - fill: #fff; - pointer-events: none; -} -.sim-text-pin { - font-family: "Lucida Console", Monaco, monospace; - font-size: 20px; - fill: #fff; - pointer-events: none; -} -.sim-thermometer { - stroke: #aaa; - stroke-width: 3px; -} -/* animations */ -.sim-flash { - animation-name: sim-flash-animation; - animation-duration: 0.1s; -} -@keyframes sim-flash-animation { - from { - fill: yellow; - } - to { - fill: default; - } -} -.sim-flash-stroke { - animation-name: sim-flash-stroke-animation; - animation-duration: 0.4s; - animation-timing-function: ease-in; -} -@keyframes sim-flash-stroke-animation { - from { - stroke: yellow; - } - to { - stroke: default; - } -} -/* wireframe */ -.sim-wireframe * { - fill: none; - stroke: black; -} -.sim-wireframe .sim-display, -.sim-wireframe .sim-led, -.sim-wireframe .sim-led-back, -.sim-wireframe .sim-head, -.sim-wireframe .sim-theme, -.sim-wireframe .sim-button-group, -.sim-wireframe .sim-button-label, -.sim-wireframe .sim-button, -.sim-wireframe .sim-text-pin { - visibility: hidden; -} -.sim-wireframe .sim-label { - stroke: none; - fill: #777; -} -.sim-label, -.sim-button-label { - fill: #000; -} -.sim-wireframe .sim-board { - stroke-width: 2px; -} -*:focus { - outline: none; -} -.sim-button-group:focus { - stroke: #4d90fe; - stroke-width: 4px; -} -.sim-button-group:focus { - stroke: #4d90fe; - stroke-width: 4px; -} -*:focus .sim-button-outer, -.sim-pin:focus, -.sim-thermometer:focus, -.sim-shake:focus, -.no-drag, -.sim-text, -.sim-text-pin { - user-drag: none; - user-select: none; - -moz-user-select: none; - -webkit-user-drag: none; - -webkit-user-select: none; - -ms-user-select: none; -} -.sim-button { - stroke: none; -} -.sim-button:active { - stroke: none; -} -.cls-1 { - fill: #097054; -} -.cls-1, -.cls-14, -.cls-23, -.cls-9 { - stroke: #000; -} -.cls-1, -.cls-11, -.cls-12, -.cls-14, -.cls-17, -.cls-22, -.cls-23, -.cls-3, -.cls-4, -.cls-5, -.cls-6, -.cls-9 { - stroke-miterlimit: 10; -} -.cls-1, -.cls-23 { - stroke-width: 1.99px; -} -.cls-18, -.cls-2 { - fill: #fff; -} -.cls-11, -.cls-12, -.cls-17, -.cls-23, -.cls-3, -.cls-4, -.cls-5, -.cls-6, -.cls-7, -.cls-8 { - fill: none; -} -.cls-11, -.cls-12, -.cls-17, -.cls-3, -.cls-4, -.cls-5, -.cls-6, -.cls-7, -.cls-8 { - stroke: #fff; -} -.cls-3 { - stroke-width: 2px; -} -.cls-12, -.cls-17, -.cls-4, -.cls-5, -.cls-6, -.cls-7, -.cls-8 { - stroke-linecap: round; -} -.cls-4, -.cls-7 { - stroke-width: 1.63px; -} -.cls-5 { - stroke-width: 1.41px; -} -.cls-6 { - stroke-width: 1.6px; -} -.cls-7, -.cls-8 { - stroke-linejoin: round; -} -.cls-8 { - stroke-width: 1.63px; -} -.cls-10, -.cls-9 { - fill: #7e7272; -} -.cls-22, -.cls-9 { - stroke-width: 1.5px; -} -.cls-12 { - stroke-width: 1.71px; -} - -.cls-14 { - stroke-width: 0.25px; -} - -.cls-17 { - stroke-width: 2.02px; -} -.cls-18 { - font-size: 7px; - font-family: SegoeUI-Bold, Segoe UI; - font-weight: 700; - letter-spacing: -0.02em; -} -.cls-19 { - letter-spacing: -0.03em; -} -.cls-20 { - letter-spacing: -0.05em; -} -.cls-21 { - letter-spacing: 0em; -} -.cls-22 { - stroke: #7e7272; -} -.sim-text-outside-clue { - font-size: 14px; - fill: var(--vscode-foreground); -} diff --git a/src/view/styles/TemperatureSensorBar.css b/src/view/styles/TemperatureSensorBar.css deleted file mode 100644 index dfab0b7cd..000000000 --- a/src/view/styles/TemperatureSensorBar.css +++ /dev/null @@ -1,18 +0,0 @@ -.title { - font-size: 14px; - text-align: left; - font-weight: bold; -} - -.header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; -} -.temperatureSensorBar { - margin-top: 10px; - width: 440px; - margin-left: auto; - margin-right: auto; - padding-bottom: 16px; -} diff --git a/src/view/styles/ToolBar.css b/src/view/styles/ToolBar.css deleted file mode 100644 index faca0569c..000000000 --- a/src/view/styles/ToolBar.css +++ /dev/null @@ -1,182 +0,0 @@ -.toolbar-parent { - background: var(--vscode-debugToolBar-background); - width: fit-content; - border-radius: 2px; - height: fit-content; - margin-left: auto; - margin-right: auto; - margin-top: 24px; - margin-bottom: 50px; -} - -.toolbar { - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - display: flex; - flex-direction: column; - align-content: center; - align-items: center; -} - -.toolbar-icon { - min-width: 360px; - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - padding: 0px 8px 0px 8px; -} - -.tag, -.title { - display: inline; -} - -.sensor_modal { - vertical-align: middle; - width: 360px; - overflow-y: visible; - overflow-x: hidden; - position: relative; - height: fit-content; - padding-left: 16px; - box-shadow: none; - margin-left: 1px; -} - -.title { - -webkit-appearance: none; - font-size: 16px; - font-weight: bolder; - color: var(--vscode-badgeForegroundOverride); - text-align: left; - margin-right: 40px; - position: absolute; - left: 0; - padding-left: inherit; - width: 320px; -} - -.info-icon { - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - color: var(--vscode-badgeForegroundOverride); - border-width: 1px; - border-style: solid; - padding: 0px 4px; - float: right; - left: 25px; - margin-top: -10px; -} - -.info-icon:hover { - background-color: var(--vscode-terminal-selectionBackground); - color: var(--vscode-badgeForegroundOverride); -} - -.info-icon:active { - background-color: var(--vscode-editor-selectionHighlightBackground); - color: var(--vscode-badgeForegroundOverride); -} - -.tag { - position: absolute; - left: 200px; -} - -.description-callout { - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - padding: "210px 214px 214px 210px"; - border: 2px solid var(--vscode-highContrastButtonBorderOverride-color); -} - -.description-callout .ms-Callout-beak { - background-color: var(--vscode-debugToolBar-background); -} - -.description-callout .ms-Callout-main { - background-color: var(--vscode-debugToolBar-background); - overflow-x: hidden; - overflow-y: auto; - margin: -1px; -} - -.try-it-description { - -webkit-appearance: none; - font-size: 14px; - background: var(--vscode-debugToolBar-background); - word-wrap: break-word; - width: 320px; - height: "100%"; - margin-top: 15px; - text-align: left; - line-height: 17px; - font-weight: 100; -} - -.description { - -webkit-appearance: none; - color: var(--vscode-badgeForegroundOverride); - font-size: 14px; - word-wrap: break-word; - width: 320px; - height: "100%"; - text-align: left; - font-weight: 400; - padding: 10px 0px 10px 10px; - margin: 10px; - overflow-y: hidden; -} - -.title_group { - margin-top: 20px; - width: fit-content; - padding-left: 16px; -} - -.try_area { - position: relative; - padding-bottom: 30px; - text-align: left; - line-height: 17px; - font-weight: 100; - opacity: 90%; - font-size: 14px; - word-wrap: break-word; - padding-right: 10px; -} - -.link-parent { - padding-top: 12px; - -webkit-appearance: none; - color: var(--vscode-textLink-foreground); - text-align: right; - text-decoration: none; - font-weight: bold; -} - -.link-parent:hover { - -webkit-appearance: none; - color: var(--vscode-textLink-activeForeground); - text-decoration: none; -} - -.link { - -webkit-appearance: none; - text-decoration: none; -} - -.gesture-container { - display: "flex"; - justify-content: "space-between"; - flex-direction: "column"; - align-items: "center"; - height: 750; - padding-top: 10px; -} - -.generic-slider-component { - padding-top: 10px; -} diff --git a/src/view/svgs/arrow_right_svg.tsx b/src/view/svgs/arrow_right_svg.tsx deleted file mode 100644 index 7eead7979..000000000 --- a/src/view/svgs/arrow_right_svg.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import * as React from "react"; - -export const ARROW_RIGHT_SVG = ( - - - -); - -export default ARROW_RIGHT_SVG; diff --git a/src/view/svgs/close_svg.tsx b/src/view/svgs/close_svg.tsx deleted file mode 100644 index ac05bedfc..000000000 --- a/src/view/svgs/close_svg.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import * as React from "react"; - -export const CLOSE_SVG = ( - - - - -); - -export default CLOSE_SVG; diff --git a/src/view/svgs/play_svg.tsx b/src/view/svgs/play_svg.tsx deleted file mode 100644 index 0da21aa9d..000000000 --- a/src/view/svgs/play_svg.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import * as React from "react"; - -export const PLAY_SVG = ( - - - -); - -export default PLAY_SVG; diff --git a/src/view/svgs/refresh_svg.tsx b/src/view/svgs/refresh_svg.tsx deleted file mode 100644 index 340ad03f8..000000000 --- a/src/view/svgs/refresh_svg.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import * as React from "react"; -import "../styles/Button.css"; - -export const REFRESH_SVG = ( - - - -); - -export default REFRESH_SVG; diff --git a/src/view/svgs/stop_svg.tsx b/src/view/svgs/stop_svg.tsx deleted file mode 100644 index a89175f66..000000000 --- a/src/view/svgs/stop_svg.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import * as React from "react"; - -export const STOP_SVG = ( - - - -); - -export default STOP_SVG; diff --git a/src/view/svgs/tag_input_svg.tsx b/src/view/svgs/tag_input_svg.tsx deleted file mode 100644 index 13a507504..000000000 --- a/src/view/svgs/tag_input_svg.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import * as React from "react"; - -export const TAG_INPUT_SVG = ( - - - - -); - -export default TAG_INPUT_SVG; diff --git a/src/view/svgs/tag_output_svg.tsx b/src/view/svgs/tag_output_svg.tsx deleted file mode 100644 index 745175db5..000000000 --- a/src/view/svgs/tag_output_svg.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import * as React from "react"; - -export const TAG_OUTPUT_SVG = ( - - - - -); - -export default TAG_OUTPUT_SVG; diff --git a/src/view/svgs/toolbar_svg.tsx b/src/view/svgs/toolbar_svg.tsx deleted file mode 100644 index 52de70b86..000000000 --- a/src/view/svgs/toolbar_svg.tsx +++ /dev/null @@ -1,740 +0,0 @@ -import * as React from "react"; -import { TOOLBAR_ICON_LABEL } from "../components/toolbar/SensorModalUtils"; -import "../styles/Button.css"; - -export const LEFT_EDGE_SVG = ( - - - - - - - - - - -); -export const RIGHT_EDGE_SVG = ( - - - - - - - - - - -); - -export const GPIO_SVG = ( - - Created with Sketch. - - - - - - -); - -export const IR_SVG = ( - - Created with Sketch. - - - - - - - - -); - -export const LIGHT_SVG = ( - - - - - - - - - - - -); - -export const MOTION_SVG = ( - - - - - - - - - - - -); - -export const NEO_PIXEL_SVG = ( - - Created with Sketch. - - - - - - - - - - - - - - - -); - -export const PUSH_BUTTON_SVG = ( - - Created with Sketch. - - - - - - - - - -); - -export const RED_LED_SVG = ( - - Created with Sketch. - - - - - - - - - -); - -export const SLIDER_SWITCH_SVG = ( - - Created with Sketch. - - - - - - - - - -); - -export const SOUND_SVG = ( - - Created with Sketch. - - - - - - - - - - - -); - -export const SPEAKER_SVG = ( - - Created with Sketch. - - - - - - - - -); - -export const TEMPERATURE_SVG = ( - - - - - - - - - -); - -export const WIRELESS_SVG = ( - - - - - - - - - -); -export default LEFT_EDGE_SVG; - -export const GESTURE_SVG = ( - - - - - - - - - - - - - - - - - - -); -export const HUMIDITY_SVG = ( - - - - - - - - - - - - - -); -export const PRESSURE_SVG = ( - - - - - - - - - - - - - - - - - - - - - -); -export const PROXIMITY_SVG = ( - - - - - - - - - - - - - - - - - - - - -); -export const MAGNET_SVG = ( - - - - - -); -export const GYROSCOPE_SVG = ( - - - - - - - - - - - - - -); -export const COMPASS_SVG = ( - - - - - -); diff --git a/src/view/translations/en.json b/src/view/translations/en.json deleted file mode 100644 index 0a873c763..000000000 --- a/src/view/translations/en.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "toolbar-gpio.description": "8 GPIOs on the device! Pin A1 - A7 can also be used as capacitive touch sensors, and A0 is a true analog output pin.", - "toolbar-gpio.title": "GPIO", - "toolbar-gpio.tryItDescription": "Use your mouse to interact with the pin A1 - A7 or use your keyboard SHIFT + ”1” - “7”.", - "toolbar-ir-sensor.description": "Allows you to send commands to the device with a remote control, or even send messages between multiple devices! You can also do very simple proximity sensing since it reads the reflected light.", - "toolbar-ir-sensor.title": "IR Transmit & Receiver", - "toolbar-ir-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-light-sensor.description": "An analog light sensor can be used to detect ambient light, with similar spectral response to the human eye.", - "toolbar-light-sensor.title": "Light Sensor", - "toolbar-light-sensor.tryItDescription": "Change the brightness detected by the sensor here!", - "toolbar-motion-sensor.description": "Detects acceleration in X, Y and Z orientations. It can also detect 'tap' and 'double tap' strikes on the board and when the board is shaken.", - "toolbar-motion-sensor.title": "Motion Sensor", - "toolbar-motion-sensor.tryItDescription": "Change the acceleration here and click or click on the button to simulate a shake. The tap feature is not supported by the Device Simulator Express. If you would like to see the 'tap' feature implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-neo-pixels.description": "The 10 full color RGB LEDs surrounding the outer edge of the boards can be set to any color. Great for beautiful lighting effects!", - "toolbar-neo-pixels.title": "NeoPixels", - "toolbar-neo-pixels.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-a-b-push.description": "Two push buttons A and B are connected to digital pin #4 (Left) and #5 (Right) each.", - "toolbar-a-b-push.title": "Push Buttons", - "toolbar-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-red-led.description": "This Red LED is connected to the digital #13 GPIO pin. It can be very handy when you want an indicator LED.", - "toolbar-red-led.title": "Red LED", - "toolbar-red-led.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-sound-sensor.description": "A digital microphone can detect audio volume and even perform basic FFT functions but cannot read it like an analog voltage.", - "toolbar-sound-sensor.title": "Sound Sensor", - "toolbar-sound-sensor.tryItDescription": "If you would like to see the sound sensor implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-slider-switch.description": "This slide switch returns True or False depending on whether it's ON or OFF and can be used as a toggle switch in your code!", - "toolbar-slider-switch.title": "Slider Switch", - "toolbar-slider-switch.tryItDescription": "Click it with your mouse or press 'S' on your keyboard to switch it ON and OFF!", - "toolbar-speaker.description": "This speaker can play a .wav file and different tones and also has a class D amplifier that is connected to an output A0 pin built in! You can turn it off using the shutdown control on pin #11 on the physical device.", - "toolbar-speaker.title": "Speaker", - "toolbar-speaker.tryItDescription": "Right now the tones are not supported on the simulator. If you would like to see tones implemented, please +1 the feature addition issue on GitHub! Regardless, you can play it on your device!", - "toolbar-temperature-sensor.description": "This sensor uses an NTC thermistor to sense temperature an calculate it with the analog voltage on analog pin #A9.", - "toolbar-temperature-sensor.title": "Temperature Sensor", - "toolbar-temperature-sensor.tryItDescription": "You can set the temperature in degrees Celsius.", - "toolbar-accelerometer-sensor.title": "Accelerometer", - "toolbar-accelerometer-sensor.description": "An accelerometer measures the acceleration of your micro:bit; this component senses when the micro:bit is moved.", - "toolbar-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", - "toolbar-microbit-light-sensor.title": "Light Sensor", - "toolbar-microbit-temperature-sensor.title": "Temperature Sensor", - "toolbar-microbit-led.title": "LEDs", - "toolbar-microbit-led.description": "The microbit has 25 LEDs for you to play with. The LEDs have 9 levels of brightness.", - "toolbar-microbit-led.tryItDescription": "Run your code and see the LEDs light up!", - "toolbar-microbit-a-b-push.title": "Buttons", - "toolbar-microbit-a-b-push.description": "There are two buttons on the front of the micro:bit (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", - "toolbar-microbit-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-microbit-sound.title": "Sound", - "toolbar-microbit-sound.description": "Your BBC micro:bit can be programmed to make a wide variety of sounds - from single notes, tones and beats to your own musical compositions.", - "toolbar-microbit-sound.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-gpio.title": "GPIO (Pins)", - "toolbar-microbit-gpio.description": "On the bottom edge of your BBC micro:bit there are 25 gold strips, called pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", - "toolbar-microbit-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-wireless.title": "Bluetooth & Radio", - "toolbar-microbit-wireless.description": "micro:bits can use radio waves and bluetooth services to communicate with each other.", - - "toolbar-microbit-wireless.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-gesture-sensor.title": "Gesture", - "toolbar-microbit-gesture-sensor.description": "If you move your BBC micro:bit in a certain way (as a gesture) then the micro:bit is able to detect this. It can recognize the following gestures: up, down, left, right, face up, face down, freefall, 3g, 6g, 8g, and shake.", - - "toolbar-microbit-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", - "toolbar-microbit-compass-sensor.title": "Compass", - "toolbar-microbit-compass-sensor.description": "A digital compass is an input sensor that detects magnetic fields. Your BBC micro:bit has an inbuilt compass that can detect the direction in which it is facing.", - "toolbar-microbit-compass-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-temperature-sensor.title": "Temperature", - "toolbar-clue-temperature-sensor.description": "CLUE uses the BMP280 sensor, an environmental sensor with temperature. This precision sensor from Bosch is the best low-cost, precision sensing solution for measuring temperature with ±1.0°C accuracy.", - - "toolbar-clue-temperature-sensor.tryItDescription": "You can simulate the temperature in your code!", - - "toolbar-clue-light-sensor.title": "Light/Color Sensor", - "toolbar-clue-light-sensor.description": "The light sensor uses APDS9960 and is able to return the red, blue, green and clear light.", - "toolbar-clue-light-sensor.tryItDescription": "You can set the color values of the light detected.", - "toolbar-clue-accelerometer-sensor.title": "Accelerometer", - "toolbar-clue-accelerometer-sensor.description": " The 3-axis accelerometer, can tell you which direction is down towards the Earth (by measuring gravity) or how fast the board is accelerating in 3D space.", - "toolbar-clue-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", - "toolbar-clue-led.title": "Neopixel", - "toolbar-clue-led.description": "The CLUE has one full RGB LED (NeoPixel) on the back of the device.", - - "toolbar-clue-led.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-clue-a-b-push.title": "Buttons", - "toolbar-clue-a-b-push.description": "There are two buttons on the front of the CLUE (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", - "toolbar-clue-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-clue-gpio.title": "Input/Output (GPIO)", - "toolbar-clue-gpio.description": "On the bottom edge of your CLUE, you have 25 pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", - "toolbar-clue-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-sound-sensor.title": "Sound", - "toolbar-clue-sound-sensor.description": "The CLUE uses a PDM MEMS microphone. PDM is a little like 1-bit PWM. You clock the mic with a 1 MHz - 3 MHz clock rate, and on the data line you'll get a square wave out that syncs with the clock.", - "toolbar-clue-sound-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-pressure-sensor.title": "Pressure", - "toolbar-clue-pressure-sensor.description": "CLUE uses the BMP280 sensor for barometric pressure. Because pressure changes with altitude, you can also use it as an altimeter with ±1 meter accuracy.", - - "toolbar-clue-pressure-sensor.tryItDescription": "You can set the pressure here in hectoPascals (hPa).", - "toolbar-clue-humidity-sensor.title": "Humidity", - "toolbar-clue-humidity-sensor.description": "The SHT30-D sensor has an excellent ±2% relative humidity and ±0.5°C accuracy for most uses.", - "toolbar-clue-humidity-sensor.tryItDescription": "You can set the humidity in percentage (%) here.", - "toolbar-clue-gesture-sensor.title": "Gesture", - "toolbar-clue-gesture-sensor.description": "The gesture sensor can detect directional gestures (left to right, right to left, up to down, down to up), but in theory more complicated gestures like zig-zag, clockwise or counterclockwise circle, near to far, etc. could also be detected with additional code. ", - "toolbar-clue-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", - "toolbar-clue-proximity-sensor.title": "Proximity", - "toolbar-clue-proximity-sensor.description": "The proximity sensor uses APDS9960 and is able to return how close an object is to the front of the sensor. This is a number from 0 to 255 where the higher the number the closer an object is to the sensor. You won't be able to translate this into an absolute value in units like inches or millimeters, you can only see how it changes relative to other values.", - - "toolbar-clue-proximity-sensor.tryItDescription": "Set relative proximity to the sensor in values from 0 - 255, where 0 means very close and 255 means very far.", - - "toolbar-clue-bluetooth.title": "Bluetooth", - "toolbar-clue-bluetooth.description": "You can transmit data over Bluetooth to a computer or mobile device for data plotting and logging, or save it to the built in storage.", - "toolbar-clue-bluetooth.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! ", - "toolbar-clue-speaker.description": "The CLUE has a buzzer/speaker for playing tones and beeps.", - "toolbar-clue-magnet-sensor.title": "Magnetometer", - "toolbar-clue-magnet-sensor.description": "Sense the magnetic fields that surround us with this handy triple-axis magnetometer (compass) module. Magnetometers can sense where the strongest magnetic force is coming from, generally used to detect magnetic north, but can also be used for measuring magnetic fields.", - "toolbar-clue-magnet-sensor.tryItDescription": "You can set the magnetic field value in microTeslas (uT).", - "toolbar-clue-gyroscope-sensor.title": "Gyroscope", - "toolbar-clue-gyroscope-sensor.description": "The 3-axis gyroscope that can measure spin and twist users LSM6DS33.", - "toolbar-clue-gyroscope-sensor.tryItDescription": "Set the angular velocity in degrees/second." -} diff --git a/src/view/tsconfig.json b/src/view/tsconfig.json deleted file mode 100644 index 28c6454e0..000000000 --- a/src/view/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "compilerOptions": { - "module": "esnext", - "moduleResolution": "node", - "target": "es6", - "outDir": "out", - "lib": ["es6", "dom"], - "jsx": "react", - "sourceMap": true, - "rootDir": "..", - "strict": true, - "noUnusedLocals": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "experimentalDecorators": true - }, - "exclude": ["node_modules"], - "include": ["./index.tsx"] -} diff --git a/src/view/utils/MessageUtils.tsx b/src/view/utils/MessageUtils.tsx deleted file mode 100644 index 41e093455..000000000 --- a/src/view/utils/MessageUtils.tsx +++ /dev/null @@ -1,12 +0,0 @@ -interface vscode { - postMessage(message: any): void; -} - -declare const vscode: vscode; - -export const sendMessage = ( - type: string, - state: TState -) => { - vscode.postMessage({ command: type, text: state }); -}; diff --git a/src/view/viewUtils.tsx b/src/view/viewUtils.tsx deleted file mode 100644 index 1335d039f..000000000 --- a/src/view/viewUtils.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { SENSOR_LIST } from "./constants"; - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. -export interface ISliderProps { - minValue: number; - maxValue: number; - maxLabel: string; - minLabel: string; - type: string | SENSOR_LIST; - axisLabel: string; - value?: number; - onUpdateValue?: (sensor: SENSOR_LIST, value: number) => void; - step: number; -} - -export interface ISensorButtonProps { - label: string; - type: string; - onMouseUp?: (event: React.PointerEvent) => void; - onMouseDown?: (event: React.PointerEvent) => void; - onKeyUp?: (event: React.KeyboardEvent) => void; - onKeyDown?: (event: React.KeyboardEvent) => void; -} -export interface ISensorProps { - LABEL: string; - sliderProps: ISliderProps[]; - unitLabel: string; -} - -export const X_SLIDER_INDEX = 0; -export const Y_SLIDER_INDEX = 1; -export const Z_SLIDER_INDEX = 2; diff --git a/src/vscode_import.ts b/src/vscode_import.ts deleted file mode 100644 index d9b935355..000000000 --- a/src/vscode_import.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare const acquireVsCodeApi; - -const vscode = acquireVsCodeApi(); From 60cd5ea703d934f66ade8eea4914965c755918c3 Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Tue, 14 Nov 2023 23:35:46 +0200 Subject: [PATCH 10/64] squash! --- .prettierrc.yaml | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .prettierrc.yaml diff --git a/.prettierrc.yaml b/.prettierrc.yaml deleted file mode 100644 index 5379f1e00..000000000 --- a/.prettierrc.yaml +++ /dev/null @@ -1,5 +0,0 @@ -trailingComma: "es5" -tabWidth: 4 -semi: true -endOfLine: auto -printWidth: 80 \ No newline at end of file From c309d6a603417ceaf5ca9d087598fe28900649f0 Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Wed, 15 Nov 2023 00:02:22 +0200 Subject: [PATCH 11/64] squash! --- .github/CODEOWNERS | 3 -- .github/PULL_REQUEST_TEMPLATE.md | 33 -------------------- .github/workflows/ci.yml | 52 -------------------------------- 3 files changed, 88 deletions(-) delete mode 100644 .github/CODEOWNERS delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/ci.yml diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 7bd16fe97..000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,3 +0,0 @@ -# At least one of the code owners below will be required on each PR: - -* @markAtMicrosoft @smmatte @adclements @abmahdy @iennae @nasadigital @isadorasophia @sagarmanchanda diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index ef9bbe450..000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,33 +0,0 @@ -# Description: - -Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. - -## Type of change - -Please delete options that are not relevant. - -- [ ] Bug fix (non-breaking change which fixes an issue) -- [ ] New feature (non-breaking change which adds functionality) -- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) -- [ ] This change requires a documentation update - -# Limitations: - -Please describe limitations of this PR - -# Testing: - -Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration - -- [ ] Test A -- [ ] Test B - -# Checklist: - -- [ ] My code follows the style guidelines of this project -- [ ] My code has been formatted with `npm run format` and passes the checks in `npm run check` -- [ ] I have performed a self-review of my own code -- [ ] I have commented my code, particularly in hard-to-understand areas -- [ ] I have made corresponding changes to the documentation -- [ ] My changes generate no new warnings -- [ ] Any dependent changes have been merged and published in downstream modules diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 93eb4fa78..000000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,52 +0,0 @@ -# This workflow will do a clean install of node dependencies, python dependencies, build the source code and run tests - -name: CI - -on: - push: - branches: [ dev, staging ] - pull_request: - branches: [ dev, staging ] - -jobs: - build-and-test: - - runs-on: ${{ matrix.os }} - - strategy: - fail-fast: false - matrix: - os: [macos-latest, windows-latest, ubuntu-18.04] - node-version: [10.x] - - steps: - - uses: actions/checkout@v2 - - name: Install Linux dependencies - if: matrix.os == 'ubuntu-18.04' - run: | - sudo apt-get update - sudo apt-get install g++-multilib - sudo apt-get install -y build-essential - sudo apt-get install libudev-dev - - name: Use Node.js ${{ matrix.node-version }} and install npm dependencies - uses: actions/setup-node@v2 - with: - node-version: ${{ matrix.node-version }} - - run: npm install - - name: Setup Python environment - uses: actions/setup-python@v2 - with: - python-version: 3.x - - run: | - python -m pip install --upgrade pip - pip install -r ./src/dev-requirements.txt - - name: Use npm to compile, format-check and test - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - run: npm run compile - - run: npm run check - - name: Run tests - uses: GabrielBB/xvfb-action@v1.0 - with: - run: npm run test From 74d1ce3920c2760597443f1c36f327705eab55cc Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Wed, 15 Nov 2023 20:15:19 +0200 Subject: [PATCH 12/64] squash! --- package-lock.json | 32342 -------------------------------------------- package.json | 125 +- 2 files changed, 62 insertions(+), 32405 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 83024d259..000000000 --- a/package-lock.json +++ /dev/null @@ -1,32342 +0,0 @@ -{ - "name": "__EXTENSIONNAME__", - "version": "0.0.0-UNTRACKEDVERSION", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/compat-data": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.5.tgz", - "integrity": "sha512-jWYUqQX/ObOhG1UiEkbH5SANsE/8oKXiQWjj7p7xgj9Zmnt//aUvyz4dBkK0HNsS8/cbyC5NmmH87VekW+mXFg==", - "dev": true, - "requires": { - "browserslist": "^4.8.5", - "invariant": "^2.2.4", - "semver": "^5.5.0" - } - }, - "@babel/core": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.3.tgz", - "integrity": "sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.0", - "@babel/helpers": "^7.4.3", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "convert-source-map": "^1.1.0", - "debug": "^4.1.0", - "json5": "^2.1.0", - "lodash": "^4.17.11", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", - "requires": { - "@babel/types": "^7.4.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", - "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", - "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-builder-react-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz", - "integrity": "sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "esutils": "^2.0.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-call-delegate": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz", - "integrity": "sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz", - "integrity": "sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.8.4", - "browserslist": "^4.8.5", - "invariant": "^2.2.4", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz", - "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz", - "integrity": "sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==", - "dev": true, - "requires": { - "@babel/helper-regex": "^7.8.3", - "regexpu-core": "^4.6.0" - }, - "dependencies": { - "regexpu-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", - "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.1.0", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" - } - }, - "regjsgen": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", - "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", - "dev": true - }, - "regjsparser": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.3.tgz", - "integrity": "sha512-8uZvYbnfAtEm9Ab8NTb3hdLwL4g/LQzEYP7Xs27T96abJCCE2d6r3cPZPQEsLKy0vRSGVNG+/zVGtLr86HQduA==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } - } - } - }, - "@babel/helper-define-map": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", - "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/types": "^7.8.3", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", - "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", - "dev": true, - "requires": { - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", - "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-module-imports": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", - "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-module-transforms": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz", - "integrity": "sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-simple-access": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==" - }, - "@babel/helper-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", - "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", - "dev": true, - "requires": { - "lodash": "^4.17.13" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", - "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-wrap-function": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-replace-supers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", - "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-simple-access": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", - "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@babel/helper-wrap-function": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", - "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helpers": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz", - "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", - "requires": { - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==" - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", - "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3", - "@babel/plugin-syntax-async-generators": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz", - "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-decorators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz", - "integrity": "sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-decorators": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", - "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", - "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", - "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - } - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz", - "integrity": "sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz", - "integrity": "sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - } - } - }, - "@babel/plugin-syntax-decorators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz", - "integrity": "sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-flow": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz", - "integrity": "sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz", - "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", - "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", - "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz", - "integrity": "sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - } - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", - "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", - "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", - "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", - "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-classes": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz", - "integrity": "sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-define-map": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", - "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz", - "integrity": "sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", - "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", - "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", - "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.8.3.tgz", - "integrity": "sha512-g/6WTWG/xbdd2exBBzMfygjX/zw4eyNC4X8pRaq7aRHRoDUCzAIu3kGYIXviOv8BjCuWm8vDBwjHcjiRNgXrPA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-flow": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz", - "integrity": "sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", - "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/plugin-transform-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", - "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", - "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz", - "integrity": "sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz", - "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-simple-access": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz", - "integrity": "sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.8.3", - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz", - "integrity": "sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", - "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", - "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", - "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz", - "integrity": "sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA==", - "dev": true, - "requires": { - "@babel/helper-call-delegate": "^7.8.3", - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", - "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-constant-elements": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.8.3.tgz", - "integrity": "sha512-glrzN2U+egwRfkNFtL34xIBYTxbbUF2qJTP8HD3qETBBqzAWSeNB821X0GjU06+dNpq/UyCIjI72FmGE5NNkQQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", - "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz", - "integrity": "sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g==", - "dev": true, - "requires": { - "@babel/helper-builder-react-jsx": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz", - "integrity": "sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz", - "integrity": "sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz", - "integrity": "sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA==", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.0" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", - "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz", - "integrity": "sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "resolve": "^1.8.1", - "semver": "^5.5.1" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", - "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", - "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", - "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-regex": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", - "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", - "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.3.tgz", - "integrity": "sha512-Ebj230AxcrKGZPKIp4g4TdQLrqX95TobLUWKd/CwG7X1XHUH1ZpkpFvXuXqWbtGRWb7uuEWNlrl681wsOArAdQ==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-typescript": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz", - "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==", - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - }, - "@babel/helper-replace-supers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", - "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", - "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/preset-env": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.4.tgz", - "integrity": "sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.8.4", - "@babel/helper-compilation-targets": "^7.8.4", - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-proposal-async-generator-functions": "^7.8.3", - "@babel/plugin-proposal-dynamic-import": "^7.8.3", - "@babel/plugin-proposal-json-strings": "^7.8.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.8.3", - "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", - "@babel/plugin-proposal-optional-chaining": "^7.8.3", - "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.8.3", - "@babel/plugin-transform-async-to-generator": "^7.8.3", - "@babel/plugin-transform-block-scoped-functions": "^7.8.3", - "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/plugin-transform-classes": "^7.8.3", - "@babel/plugin-transform-computed-properties": "^7.8.3", - "@babel/plugin-transform-destructuring": "^7.8.3", - "@babel/plugin-transform-dotall-regex": "^7.8.3", - "@babel/plugin-transform-duplicate-keys": "^7.8.3", - "@babel/plugin-transform-exponentiation-operator": "^7.8.3", - "@babel/plugin-transform-for-of": "^7.8.4", - "@babel/plugin-transform-function-name": "^7.8.3", - "@babel/plugin-transform-literals": "^7.8.3", - "@babel/plugin-transform-member-expression-literals": "^7.8.3", - "@babel/plugin-transform-modules-amd": "^7.8.3", - "@babel/plugin-transform-modules-commonjs": "^7.8.3", - "@babel/plugin-transform-modules-systemjs": "^7.8.3", - "@babel/plugin-transform-modules-umd": "^7.8.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", - "@babel/plugin-transform-new-target": "^7.8.3", - "@babel/plugin-transform-object-super": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.8.4", - "@babel/plugin-transform-property-literals": "^7.8.3", - "@babel/plugin-transform-regenerator": "^7.8.3", - "@babel/plugin-transform-reserved-words": "^7.8.3", - "@babel/plugin-transform-shorthand-properties": "^7.8.3", - "@babel/plugin-transform-spread": "^7.8.3", - "@babel/plugin-transform-sticky-regex": "^7.8.3", - "@babel/plugin-transform-template-literals": "^7.8.3", - "@babel/plugin-transform-typeof-symbol": "^7.8.4", - "@babel/plugin-transform-unicode-regex": "^7.8.3", - "@babel/types": "^7.8.3", - "browserslist": "^4.8.5", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/preset-react": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.8.3.tgz", - "integrity": "sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-transform-react-display-name": "^7.8.3", - "@babel/plugin-transform-react-jsx": "^7.8.3", - "@babel/plugin-transform-react-jsx-self": "^7.8.3", - "@babel/plugin-transform-react-jsx-source": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/preset-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.8.3.tgz", - "integrity": "sha512-qee5LgPGui9zQ0jR1TeU5/fP9L+ovoArklEqY12ek8P/wV5ZeM/VYSQYwICeoT6FfpJTekG9Ilay5PhwsOpMHA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-transform-typescript": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - } - } - }, - "@babel/runtime": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz", - "integrity": "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" - }, - "@cnakazawa/watch": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", - "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, - "@csstools/convert-colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", - "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", - "dev": true - }, - "@csstools/normalize.css": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", - "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==", - "dev": true - }, - "@fluentui/react-focus": { - "version": "7.1.13", - "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-7.1.13.tgz", - "integrity": "sha512-voY84/vRkcZGUHSwrPO6eEplc0EGKRGf06ov826NdzMq8s2BXoG2JMMdFNclFppQsCtcXOCPmfzwGHShJvGu5g==", - "requires": { - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/set-version": "^7.0.9", - "@uifabric/styling": "^7.11.2", - "@uifabric/utilities": "^7.15.5", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@formatjs/intl-relativetimeformat": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-2.8.0.tgz", - "integrity": "sha512-5T3m5hJSxXrbwtnFHyYBSbTjOXPXu+4NJ0MUu1LAf4fPEdd+pJZfWKuMJSWgFQPVMbLYq9NLvDWQda3hVe99sg==" - }, - "@gulp-sourcemaps/identity-map": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz", - "integrity": "sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==", - "dev": true, - "requires": { - "acorn": "^5.0.3", - "css": "^2.2.1", - "normalize-path": "^2.1.1", - "source-map": "^0.6.0", - "through2": "^2.0.3" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - } - } - }, - "@gulp-sourcemaps/map-sources": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", - "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", - "dev": true, - "requires": { - "normalize-path": "^2.0.1", - "through2": "^2.0.3" - } - }, - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", - "dev": true - }, - "@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", - "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", - "dev": true - }, - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "dev": true - }, - "@hapi/joi": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", - "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", - "dev": true, - "requires": { - "@hapi/address": "2.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/topo": "3.x.x" - } - }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", - "dev": true, - "requires": { - "@hapi/hoek": "^8.3.0" - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", - "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==" - }, - "@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", - "dev": true, - "requires": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@jest/core": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.1.0.tgz", - "integrity": "sha512-iz05+NmwCmZRzMXvMo6KFipW7nzhbpEawrKrkkdJzgytavPse0biEnCNr2wRlyCsp3SmKaEY+SGv7YWYQnIdig==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/reporters": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-changed-files": "^25.1.0", - "jest-config": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-resolve-dependencies": "^25.1.0", - "jest-runner": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "jest-watcher": "^25.1.0", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "realpath-native": "^1.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "requires": { - "type-fest": "^0.8.1" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "jest-watcher": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.1.0.tgz", - "integrity": "sha512-Q9eZ7pyaIr6xfU24OeTg4z1fUqBF/4MP6J801lyQfg7CsnZ/TCzAPvCfckKdL5dlBBEKBeHV0AdyjFZ5eWj4ig==", - "requires": { - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "string-length": "^3.1.0" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - } - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "@jest/environment": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.1.0.tgz", - "integrity": "sha512-cTpUtsjU4cum53VqBDlcW0E4KbQF03Cn0jckGPW/5rrE9tb+porD3+hhLtHAwhthsqfyF+bizyodTlsRA++sHg==", - "requires": { - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/fake-timers": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.1.0.tgz", - "integrity": "sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ==", - "requires": { - "@jest/types": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "lolex": "^5.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", - "requires": { - "@jest/types": "^25.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "@jest/fake-timers": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - } - } - }, - "@jest/reporters": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.1.0.tgz", - "integrity": "sha512-ORLT7hq2acJQa8N+NKfs68ZtHFnJPxsGqmofxW7v7urVhzJvpKZG9M7FAcgh9Ee1ZbCteMrirHA3m5JfBtAaDg==", - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.0", - "jest-haste-map": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", - "node-notifier": "^6.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^3.1.0", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^4.0.1" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "istanbul-lib-instrument": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz", - "integrity": "sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ==", - "requires": { - "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", - "source-map": "^0.6.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - } - } - }, - "@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", - "dev": true, - "requires": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - } - } - }, - "@jest/test-sequencer": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.1.0.tgz", - "integrity": "sha512-WgZLRgVr2b4l/7ED1J1RJQBOharxS11EFhmwDqknpknE0Pm87HLZVS2Asuuw+HQdfQvm2aXL2FvvBLxOD1D0iw==", - "requires": { - "@jest/test-result": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-runner": "^25.1.0", - "jest-runtime": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/transform": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.1.0.tgz", - "integrity": "sha512-4ktrQ2TPREVeM+KxB4zskAT84SnmG1vaz4S+51aTefyqn3zocZUnliLLm5Fsl85I3p/kFPN4CRp1RElIfXGegQ==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^25.1.0", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^3.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-util": "^25.1.0", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "istanbul-lib-instrument": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz", - "integrity": "sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ==", - "requires": { - "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "write-file-atomic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", - "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - } - } - }, - "@jest/types": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.1.0.tgz", - "integrity": "sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - }, - "dependencies": { - "@types/yargs": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.1.tgz", - "integrity": "sha512-sYlwNU7zYi6eZbMzFvG6eHD7VsEvFdoDtlD7eI1JTg7YNnuguzmiGsc6MPSq5l8n+h21AsNof0je+9sgOe4+dg==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@microsoft/load-themed-styles": { - "version": "1.10.43", - "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.43.tgz", - "integrity": "sha512-9RUeBMXPHbT/qHTRIQi9oQs3bw5JkQGBQ8ayjycq95q+1OUI9jBJPiJi2d8btpGdJWisVb3ZXxRsUx5u6f5dRA==" - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, - "@serialport/binding-abstract": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/binding-abstract/-/binding-abstract-8.0.6.tgz", - "integrity": "sha512-1swwUVoRyQ9ubxrkJ8JPppykohUpTAP4jkGr36e9NjbVocSPfqeX6tFZFwl/IdUlwJwxGdbKDqq7FvXniCQUMw==", - "requires": { - "debug": "^4.1.1" - } - }, - "@serialport/binding-mock": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/binding-mock/-/binding-mock-8.0.6.tgz", - "integrity": "sha512-BIbY5/PsDDo0QWDNCCxDgpowAdks+aZR8BOsEtK2GoASTTcJCy1fBwPIfH870o7rnbH901wY3C+yuTfdOvSO9A==", - "requires": { - "@serialport/binding-abstract": "^8.0.6", - "debug": "^4.1.1" - } - }, - "@serialport/bindings": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/@serialport/bindings/-/bindings-8.0.7.tgz", - "integrity": "sha512-IqudDL8ne2Y2S0W5fKA6wdgHCIA2e2OIaPVYhGy6duE6legNHFY+05CLicHAyAeTocXmHU7rVNxzVQrOG5tM4g==", - "requires": { - "@serialport/binding-abstract": "^8.0.6", - "@serialport/parser-readline": "^8.0.6", - "bindings": "^1.5.0", - "debug": "^4.1.1", - "nan": "^2.14.0", - "prebuild-install": "^5.3.0" - } - }, - "@serialport/parser-byte-length": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-byte-length/-/parser-byte-length-8.0.6.tgz", - "integrity": "sha512-92mrFxFEvq3gRvSM7ANK/jfbmHslz91a5oYJy/nbSn4H/MCRXjxR2YOkQgVXuN+zLt+iyDoW3pcOP4Sc1nWdqQ==" - }, - "@serialport/parser-cctalk": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-cctalk/-/parser-cctalk-8.0.6.tgz", - "integrity": "sha512-pqtCYQPgxnxHygiXUPCfgX7sEx+fdR/ObjpscidynEULUq2fFrC5kBkrxRbTfHRtTaU2ii9DyjFq0JVRCbhI0Q==" - }, - "@serialport/parser-delimiter": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-8.0.6.tgz", - "integrity": "sha512-ogKOcPisPMlVtirkuDu3SFTF0+xT0ijxoH7XjpZiYL41EVi367MwuCnEmXG+dEKKnF0j9EPqOyD2LGSJxaFmhQ==" - }, - "@serialport/parser-readline": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-8.0.6.tgz", - "integrity": "sha512-OYBT2mpczh9QUI3MTw8j0A0tIlPVjpVipvuVnjRkYwxrxPeq04RaLFhaDpuRzua5rTKMt89c1y3btYeoDXMjAA==", - "requires": { - "@serialport/parser-delimiter": "^8.0.6" - } - }, - "@serialport/parser-ready": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-ready/-/parser-ready-8.0.6.tgz", - "integrity": "sha512-xcEqv4rc119WR5JzAuu8UeJOlAwET2PTdNb6aIrrLlmTxhvuBbuRFcsnF3BpH9jUL30Kh7a6QiNXIwVG+WR/1Q==" - }, - "@serialport/parser-regex": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-regex/-/parser-regex-8.0.6.tgz", - "integrity": "sha512-J8KY75Azz5ZyExmyM5YfUxbXOWBkZCytKgCCmZ966ttwZS0bUZOuoCaZj2Zp4VILJAiLuxHoqc0foi67Fri5+g==" - }, - "@serialport/stream": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-8.0.6.tgz", - "integrity": "sha512-ym1PwM0rwLrj90vRBB66I1hwMXbuMw9wGTxqns75U3N/tuNFOH85mxXaYVF2TpI66aM849NoI1jMm50fl9equg==", - "requires": { - "debug": "^4.1.1" - } - }, - "@sheerun/mutationobserver-shim": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz", - "integrity": "sha512-vTCdPp/T/Q3oSqwHmZ5Kpa9oI7iLtGl3RQaA/NyLHikvcrPxACkkKVr/XzkSPJWXHRhKGzVvb0urJsbMlRxi1Q==" - }, - "@sinonjs/commons": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.0.tgz", - "integrity": "sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg==", - "requires": { - "type-detect": "4.0.8" - } - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==", - "dev": true - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==", - "dev": true - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", - "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==", - "dev": true - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", - "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==", - "dev": true - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz", - "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==", - "dev": true - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", - "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==", - "dev": true - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", - "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==", - "dev": true - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", - "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==", - "dev": true - }, - "@svgr/babel-preset": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz", - "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", - "dev": true, - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", - "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3", - "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", - "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", - "@svgr/babel-plugin-transform-svg-component": "^4.2.0" - } - }, - "@svgr/core": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz", - "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", - "dev": true, - "requires": { - "@svgr/plugin-jsx": "^4.3.3", - "camelcase": "^5.3.1", - "cosmiconfig": "^5.2.1" - } - }, - "@svgr/hast-util-to-babel-ast": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", - "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@svgr/plugin-jsx": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz", - "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", - "dev": true, - "requires": { - "@babel/core": "^7.4.5", - "@svgr/babel-preset": "^4.3.3", - "@svgr/hast-util-to-babel-ast": "^4.3.2", - "svg-parser": "^2.0.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@svgr/plugin-svgo": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", - "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", - "dev": true, - "requires": { - "cosmiconfig": "^5.2.1", - "merge-deep": "^3.0.2", - "svgo": "^1.2.2" - } - }, - "@svgr/webpack": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz", - "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==", - "dev": true, - "requires": { - "@babel/core": "^7.4.5", - "@babel/plugin-transform-react-constant-elements": "^7.0.0", - "@babel/preset-env": "^7.4.5", - "@babel/preset-react": "^7.0.0", - "@svgr/core": "^4.3.3", - "@svgr/plugin-jsx": "^4.3.3", - "@svgr/plugin-svgo": "^4.3.1", - "loader-utils": "^1.2.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@testing-library/dom": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-6.11.0.tgz", - "integrity": "sha512-Pkx9LMIGshyNbfmecjt18rrAp/ayMqGH674jYER0SXj0iG9xZc+zWRjk2Pg9JgPBDvwI//xGrI/oOQkAi4YEew==", - "requires": { - "@babel/runtime": "^7.6.2", - "@sheerun/mutationobserver-shim": "^0.3.2", - "@types/testing-library__dom": "^6.0.0", - "aria-query": "3.0.0", - "pretty-format": "^24.9.0", - "wait-for-expect": "^3.0.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "requires": { - "regenerator-runtime": "^0.13.2" - } - } - } - }, - "@testing-library/jest-dom": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.0.2.tgz", - "integrity": "sha512-Pl3si4eH88+5wlVz6NjecLfeO7PjTbbgWKwVZXUtBfrGuJLjGdUUo+O92XRu/59wft8HAmwvXHeMWpqWTg2Uwg==", - "requires": { - "@babel/runtime": "^7.5.1", - "@types/testing-library__jest-dom": "^5.0.0", - "chalk": "^2.4.1", - "css": "^2.2.3", - "css.escape": "^1.5.1", - "jest-diff": "^24.0.0", - "jest-matcher-utils": "^24.0.0", - "lodash": "^4.17.11", - "pretty-format": "^24.0.0", - "redent": "^3.0.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@testing-library/react": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-9.4.0.tgz", - "integrity": "sha512-XdhDWkI4GktUPsz0AYyeQ8M9qS/JFie06kcSnUVcpgOwFjAu9vhwR83qBl+lw9yZWkbECjL8Hd+n5hH6C0oWqg==", - "requires": { - "@babel/runtime": "^7.7.6", - "@testing-library/dom": "^6.11.0", - "@types/testing-library__react": "^9.1.2" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "requires": { - "regenerator-runtime": "^0.13.2" - } - } - } - }, - "@types/babel__core": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", - "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.8.tgz", - "integrity": "sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw==", - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" - }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true - }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", - "dev": true, - "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", - "requires": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, - "@types/invariant": { - "version": "2.2.30", - "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.30.tgz", - "integrity": "sha512-98fB+yo7imSD2F7PF7GIpELNgtLNgo5wjivu0W5V4jx+KVVJxo6p/qN4zdzSTBWy4/sN3pPyXwnhRSD28QX+ag==" - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==" - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-dXvuABY9nM1xgsXlOtLQXJKdacxZJd7AtvLsKZ/0b57ruMXDKCOXAC/M75GbllQX6o1pcZ5hAG4JzYy7Z/wM2w==", - "requires": { - "jest-diff": "^24.3.0" - } - }, - "@types/json-schema": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", - "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/node": { - "version": "10.14.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.7.tgz", - "integrity": "sha512-on4MmIDgHXiuJDELPk1NFaKVUxxCFr37tm8E9yN6rAiF5Pzp/9bBfBHkoexqRiY+hk/Z04EJU9kKEb59YqJ82A==" - }, - "@types/open": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/open/-/open-6.1.0.tgz", - "integrity": "sha512-sdB0OltczakZfdn5DYg3ZbHoQeYtU8Vbo4dys0U98gikn++M4gGDI02dzEWXPMP5uXGSjGx9GnK/yLlJMfGjlg==", - "requires": { - "@types/node": "*" - } - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" - }, - "@types/q": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", - "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", - "dev": true - }, - "@types/react": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.8.6.tgz", - "integrity": "sha512-bN9qDjEMltmHrl0PZRI4IF2AbB7V5UlRfG+OOduckVnRQ4VzXVSzy/1eLAh778IEqhTnW0mmgL9yShfinNverA==", - "requires": { - "@types/prop-types": "*", - "csstype": "^2.2.0" - } - }, - "@types/react-dom": { - "version": "16.8.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.8.4.tgz", - "integrity": "sha512-eIRpEW73DCzPIMaNBDP5pPIpK1KXyZwNgfxiVagb5iGiz6da+9A5hslSX6GAQKdO7SayVCS/Fr2kjqprgAvkfA==", - "requires": { - "@types/react": "*" - } - }, - "@types/react-test-renderer": { - "version": "16.9.2", - "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-16.9.2.tgz", - "integrity": "sha512-4eJr1JFLIAlWhzDkBCkhrOIWOvOxcCAfQh+jiKg7l/nNZcCIL2MHl2dZhogIFKyHzedVWHaVP1Yydq/Ruu4agw==", - "requires": { - "@types/react": "*" - } - }, - "@types/socket.io": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/socket.io/-/socket.io-2.1.2.tgz", - "integrity": "sha512-Ind+4qMNfQ62llyB4IMs1D8znMEBsMKohZBPqfBUIXqLQ9bdtWIbNTBWwtdcBWJKnokMZGcmWOOKslatni5vtA==", - "requires": { - "@types/node": "*" - } - }, - "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" - }, - "@types/testing-library__dom": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/@types/testing-library__dom/-/testing-library__dom-6.11.1.tgz", - "integrity": "sha512-ImChHtQqmjwraRLqBC2sgSQFtczeFvBmBcfhTYZn/3KwXbyD07LQykEQ0xJo7QHc1GbVvf7pRyGaIe6PkCdxEw==", - "requires": { - "pretty-format": "^24.3.0" - } - }, - "@types/testing-library__jest-dom": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.0.0.tgz", - "integrity": "sha512-Pm+2mvqs9sND247oMVJbu3QmPUqMzBuJbY5uHHYQdl9MXq5hwWkTbesw1sPIky52Y0sHksWAZnVvGLbdyFSyrA==", - "requires": { - "@types/jest": "*" - } - }, - "@types/testing-library__react": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@types/testing-library__react/-/testing-library__react-9.1.2.tgz", - "integrity": "sha512-CYaMqrswQ+cJACy268jsLAw355DZtPZGt3Jwmmotlcu8O/tkoXBI6AeZ84oZBJsIsesozPKzWzmv/0TIU+1E9Q==", - "requires": { - "@types/react-dom": "*", - "@types/testing-library__dom": "*" - } - }, - "@types/vscode": { - "version": "1.45.1", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.45.1.tgz", - "integrity": "sha512-0NO9qrrEJBO8FsqHCrFMgR2suKnwCsKBWvRSb2OzH5gs4i3QO5AhEMQYrSzDbU/wLPt7N617/rN9lPY213gmwg==", - "dev": true - }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" - }, - "@typescript-eslint/eslint-plugin": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.20.0.tgz", - "integrity": "sha512-cimIdVDV3MakiGJqMXw51Xci6oEDEoPkvh8ggJe2IIzcc0fYqAxOXN6Vbeanahz6dLZq64W+40iUEc9g32FLDQ==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "2.20.0", - "eslint-utils": "^1.4.3", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.20.0.tgz", - "integrity": "sha512-fEBy9xYrwG9hfBLFEwGW2lKwDRTmYzH3DwTmYbT+SMycmxAoPl0eGretnBFj/s+NfYBG63w/5c3lsvqqz5mYag==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.20.0", - "eslint-scope": "^5.0.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - } - } - }, - "@typescript-eslint/parser": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.20.0.tgz", - "integrity": "sha512-o8qsKaosLh2qhMZiHNtaHKTHyCHc3Triq6aMnwnWj7budm3xAY9owSZzV1uon5T9cWmJRJGzTFa90aex4m77Lw==", - "dev": true, - "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.20.0", - "@typescript-eslint/typescript-estree": "2.20.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.20.0.tgz", - "integrity": "sha512-WlFk8QtI8pPaE7JGQGxU7nGcnk1ccKAJkhbVookv94ZcAef3m6oCE/jEDL6dGte3JcD7reKrA0o55XhBRiVT3A==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^6.3.0", - "tsutils": "^3.17.1" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@uifabric/foundation": { - "version": "7.5.25", - "resolved": "https://registry.npmjs.org/@uifabric/foundation/-/foundation-7.5.25.tgz", - "integrity": "sha512-5PcqVMjXG1or7GrZHCWQ1SRNcCUV6lPm7OoAi1AKtVrSEi69g56VjJCJ7sqc/Q587ehDN6LqK9RhLc2IhQVO+Q==", - "requires": { - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/set-version": "^7.0.9", - "@uifabric/styling": "^7.11.2", - "@uifabric/utilities": "^7.15.5", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/icons": { - "version": "7.3.24", - "resolved": "https://registry.npmjs.org/@uifabric/icons/-/icons-7.3.24.tgz", - "integrity": "sha512-0CkTEgY8xwvNs+zUQcvWKLnuYxudjJfPI016385bqizE9dkCMyAfXer/7sgyrp6FjxNUrHGyQUKvdVoT3zSNYA==", - "requires": { - "@uifabric/set-version": "^7.0.9", - "@uifabric/styling": "^7.11.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/merge-styles": { - "version": "7.8.11", - "resolved": "https://registry.npmjs.org/@uifabric/merge-styles/-/merge-styles-7.8.11.tgz", - "integrity": "sha512-U1gYewj/j6ZGBSXD84Ekp+En4N5hH79TsK9hWJq2wKJKK3h0MKmY50WyFKWIL2/kS+wM7zIR6irK0xY+mfjB2g==", - "requires": { - "@uifabric/set-version": "^7.0.9", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/react-hooks": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@uifabric/react-hooks/-/react-hooks-7.1.2.tgz", - "integrity": "sha512-gFsjCeh+g0rZYSx13WIJcA2HLxNKiY4RQsxLuOq1cMsBgiUGix8ofMPd3S5ys+qfVdl+XwoqlV/25PgvIRrpUA==", - "requires": { - "@uifabric/set-version": "^7.0.9", - "@uifabric/utilities": "^7.15.5", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/set-version": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@uifabric/set-version/-/set-version-7.0.9.tgz", - "integrity": "sha512-YJL6WLBlFKDJcLSw1ihqW5PTFi2XMoluEvwGd2qtzp2IVbHvdbk7uIdWuTALo3dFNNqWPN8shSNUdHVATE/1jQ==", - "requires": { - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/styling": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-7.11.2.tgz", - "integrity": "sha512-0so6oM6d0WOogDiOxT5bbfOrkGEvhrmRukSrgr1mY/3tkQ3gue/XW4yus0fNi7H9R8wZa2rIPQaUcZBW3Hrc0g==", - "requires": { - "@microsoft/load-themed-styles": "^1.10.26", - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/set-version": "^7.0.9", - "@uifabric/utilities": "^7.15.5", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/utilities": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-7.15.5.tgz", - "integrity": "sha512-cjnhT7tTvHNXt0rvuajk5s/RQtSWFh2JfRhbmS7dTGfg3vNieoHg2EiNt+ulzKXxtdkFriXoFHRSNkTuV4/L9w==", - "requires": { - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/set-version": "^7.0.9", - "prop-types": "^15.7.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==" - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" - }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", - "dev": true - }, - "acorn-globals": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", - "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" - } - } - }, - "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", - "dev": true - }, - "acorn-walk": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", - "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==" - }, - "address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", - "dev": true - }, - "adjust-sourcemap-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", - "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", - "dev": true, - "requires": { - "assert": "1.4.1", - "camelcase": "5.0.0", - "loader-utils": "1.2.3", - "object-path": "0.11.4", - "regex-parser": "2.2.10" - }, - "dependencies": { - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - } - }, - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", - "dev": true - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "dev": true, - "requires": { - "buffer-equal": "^1.0.0" - } - }, - "applicationinsights": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-1.0.8.tgz", - "integrity": "sha512-KzOOGdphOS/lXWMFZe5440LUdFbrLpMvh2SaRxn7BmiI550KAoSb2gIhiq6kJZ9Ir3AxRRztjhzif+e5P5IXIg==", - "requires": { - "diagnostic-channel": "0.2.0", - "diagnostic-channel-publishers": "0.2.1", - "zone.js": "0.7.6" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", - "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - } - }, - "arity-n": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", - "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" - }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "dev": true, - "requires": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", - "dev": true, - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", - "dev": true - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", - "dev": true - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", - "dev": true, - "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", - "dev": true - }, - "async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "dev": true, - "requires": { - "async-done": "^1.2.2" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "autoprefixer": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz", - "integrity": "sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==", - "dev": true, - "requires": { - "browserslist": "^4.8.3", - "caniuse-lite": "^1.0.30001020", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.26", - "postcss-value-parser": "^4.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-value-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", - "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" - }, - "axobject-query": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz", - "integrity": "sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ==", - "dev": true - }, - "azure-devops-node-api": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-7.2.0.tgz", - "integrity": "sha512-pMfGJ6gAQ7LRKTHgiRF+8iaUUeGAI0c8puLaqHLc7B8AR7W6GJLozK9RFeUHFjEGybC9/EB3r67WPd7e46zQ8w==", - "dev": true, - "requires": { - "os": "0.1.1", - "tunnel": "0.0.4", - "typed-rest-client": "1.2.0", - "underscore": "1.8.3" - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - } - } - }, - "babel-eslint": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", - "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "babel-extract-comments": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", - "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", - "dev": true, - "requires": { - "babylon": "^6.18.0" - } - }, - "babel-jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.1.0.tgz", - "integrity": "sha512-tz0VxUhhOE2y+g8R2oFrO/2VtVjA1lkJeavlhExuRBg3LdNJY9gwQ+Vcvqt9+cqy71MCTJhewvTB7Qtnnr9SWg==", - "requires": { - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^25.1.0", - "chalk": "^3.0.0", - "slash": "^3.0.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@jest/transform": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.1.0.tgz", - "integrity": "sha512-4ktrQ2TPREVeM+KxB4zskAT84SnmG1vaz4S+51aTefyqn3zocZUnliLLm5Fsl85I3p/kFPN4CRp1RElIfXGegQ==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^25.1.0", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^3.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-util": "^25.1.0", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": true - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "istanbul-lib-instrument": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz", - "integrity": "sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ==", - "requires": { - "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "jest-haste-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.1.0.tgz", - "integrity": "sha512-/2oYINIdnQZAqyWSn1GTku571aAfs8NxzSErGek65Iu5o8JYb+113bZysRMcC/pjE5v9w0Yz+ldbj9NxrFyPyw==", - "requires": { - "@jest/types": "^25.1.0", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.3", - "jest-serializer": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-regex-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.1.0.tgz", - "integrity": "sha512-9lShaDmDpqwg+xAd73zHydKrBbbrIi08Kk9YryBEBybQFg/lBWR/2BDjjiSE7KIppM9C5+c03XiDaZ+m4Pgs1w==" - }, - "jest-serializer": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.1.0.tgz", - "integrity": "sha512-20Wkq5j7o84kssBwvyuJ7Xhn7hdPeTXndnwIblKDR2/sy1SUm6rWWiG9kSCgJPIfkDScJCIsTtOKdlzfIHOfKA==" - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "write-file-atomic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", - "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - } - } - }, - "babel-loader": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", - "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", - "dev": true, - "requires": { - "find-cache-dir": "^2.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1", - "pify": "^4.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", - "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-istanbul": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.3.0", - "test-exclude": "^5.2.3" - } - }, - "babel-plugin-jest-hoist": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.1.0.tgz", - "integrity": "sha512-oIsopO41vW4YFZ9yNYoLQATnnN46lp+MZ6H4VvPKFkcc2/fkl3CfE/NZZSmnEIEsJRmJAgkVEK0R7Zbl50CpTw==", - "requires": { - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "babel-plugin-named-asset-import": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz", - "integrity": "sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA==", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" - } - }, - "babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", - "dev": true - }, - "babel-preset-jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.1.0.tgz", - "integrity": "sha512-eCGn64olaqwUMaugXsTtGAM2I0QTahjEtnRu0ql8Ie+gDWAc1N6wqN0k2NilnyTunM69Pad7gJY7LOtwLimoFQ==", - "requires": { - "@babel/plugin-syntax-bigint": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^25.1.0" - } - }, - "babel-preset-react-app": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.1.1.tgz", - "integrity": "sha512-YkWP2UwY//TLltNlEBRngDOrYhvSLb+CA330G7T9M5UhGEMWe+JK/8IXJc5p2fDTSfSiETf+PY0+PYXFMix81Q==", - "dev": true, - "requires": { - "@babel/core": "7.8.4", - "@babel/plugin-proposal-class-properties": "7.8.3", - "@babel/plugin-proposal-decorators": "7.8.3", - "@babel/plugin-proposal-numeric-separator": "7.8.3", - "@babel/plugin-transform-flow-strip-types": "7.8.3", - "@babel/plugin-transform-react-display-name": "7.8.3", - "@babel/plugin-transform-runtime": "7.8.3", - "@babel/preset-env": "7.8.4", - "@babel/preset-react": "7.8.3", - "@babel/preset-typescript": "7.8.3", - "@babel/runtime": "7.8.4", - "babel-plugin-macros": "2.8.0", - "babel-plugin-transform-react-remove-prop-types": "0.4.24" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", - "dev": true, - "requires": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" - } - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bl": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", - "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" - }, - "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==" - }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" - } - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.8.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.7.tgz", - "integrity": "sha512-gFOnZNYBHrEyUML0xr5NJ6edFaaKbTFX9S9kQHlYfCP0Rit/boRIz4G+Avq6/4haEKJXdGGUnoolx+5MWW2BoA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001027", - "electron-to-chromium": "^1.3.349", - "node-releases": "^1.1.49" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", - "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "cacache": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", - "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", - "dev": true, - "requires": { - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "minipass": "^3.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^7.0.0", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camel-case": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", - "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", - "dev": true, - "requires": { - "pascal-case": "^3.1.1", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001028", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001028.tgz", - "integrity": "sha512-Vnrq+XMSHpT7E+LWoIYhs3Sne8h9lx9YJV3acH3THNCwU/9zV93/ta4xVfzTtnqd3rvnuVpVjE3DFqf56tr3aQ==", - "dev": true - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "requires": { - "rsvp": "^4.8.4" - } - }, - "case-sensitive-paths-webpack-plugin": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", - "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "cheerio": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", - "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", - "dev": true, - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.1", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - }, - "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, - "requires": { - "@types/node": "*" - } - } - } - }, - "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - } - } - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-deep": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", - "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", - "dev": true, - "requires": { - "for-own": "^0.1.3", - "is-plain-object": "^2.0.1", - "kind-of": "^3.0.2", - "lazy-cache": "^1.0.3", - "shallow-clone": "^0.1.2" - } - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "collect-v8-coverage": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.0.tgz", - "integrity": "sha512-VKIhJgvk8E1W28m5avZ2Gv2Ruv5YiF56ug2oclvaG9md69BuZImMG2sk9g7QNKLUbtYAKQjXjYxbYZVUlMMKmQ==" - }, - "collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "dev": true, - "requires": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", - "dev": true, - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "compare-versions": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.5.1.tgz", - "integrity": "sha512-9fGPIB7C6AyM18CJJBHt5EnCZDG3oiTJYy0NjfIAGjKpzv0tkxWko7TNQHF5ymqm7IH03tqmeuBxtvD+Izh6mg==" - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" - }, - "compose-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", - "dev": true, - "requires": { - "arity-n": "^1.0.4" - } - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - }, - "dependencies": { - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", - "dev": true - } - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "confusing-browser-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", - "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", - "dev": true - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", - "dev": true, - "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" - } - }, - "core-js": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", - "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", - "dev": true - }, - "core-js-compat": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", - "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", - "dev": true, - "requires": { - "browserslist": "^4.8.3", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - } - }, - "css-blank-pseudo": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", - "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "dev": true, - "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-has-pseudo": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", - "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^5.0.0-rc.4" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-loader": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", - "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash": "^4.17.11", - "postcss": "^6.0.23", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - } - }, - "css-modules-loader-core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz", - "integrity": "sha1-WQhmgpShvs0mGuCkziGwtVHyHRY=", - "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.1", - "postcss-modules-extract-imports": "1.1.0", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz", - "integrity": "sha1-AA29H47vIXqjaLmiEsX8QLKo8/I=", - "requires": { - "chalk": "^1.1.3", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-modules-extract-imports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", - "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", - "requires": { - "postcss": "^6.0.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "css-prefers-color-scheme": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", - "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - }, - "dependencies": { - "css-what": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", - "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", - "dev": true - } - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "css-selector-tokenizer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", - "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", - "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" - } - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dev": true, - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "dev": true - }, - "css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" - }, - "cssdb": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", - "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==", - "dev": true - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" - }, - "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", - "dev": true, - "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", - "postcss-unique-selectors": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "dev": true - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "dev": true - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", - "dev": true - }, - "csso": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", - "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", - "dev": true, - "requires": { - "css-tree": "1.0.0-alpha.37" - } - }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", - "dev": true, - "requires": { - "cssom": "0.3.x" - } - }, - "csstype": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.8.tgz", - "integrity": "sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA==" - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - }, - "dependencies": { - "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "debug-fabulous": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz", - "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==", - "dev": true, - "requires": { - "debug": "3.X", - "memoizee": "0.4.X", - "object-assign": "4.X" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "requires": { - "mimic-response": "^2.0.0" - } - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", - "dev": true, - "requires": { - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - } - }, - "default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" - }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true - }, - "detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "dev": true, - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "diagnostic-channel": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz", - "integrity": "sha1-zJmvlhLCP7H/8TYSxy8sv6qNWhc=", - "requires": { - "semver": "^5.3.0" - } - }, - "diagnostic-channel-publishers": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.2.1.tgz", - "integrity": "sha1-ji1geottef6IC1SLxYzGvrKIxPM=" - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "diff-sequences": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==" - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "requires": { - "webidl-conversions": "^4.0.2" - } - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz", - "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==", - "dev": true, - "requires": { - "no-case": "^3.0.3", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", - "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "dev": true - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.355", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.355.tgz", - "integrity": "sha512-zKO/wS+2ChI/jz9WAo647xSW8t2RmgRLFdbUb/77cORkUTargO+SCj4ctTHjBn2VeNFrsLgDT7IuDVrd3F8mLQ==", - "dev": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "requires": { - "once": "^1.4.0" - } - }, - "engine.io": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", - "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", - "requires": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "~7.4.2" - }, - "dependencies": { - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" - }, - "ws": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", - "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==" - } - } - }, - "engine.io-client": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.1.tgz", - "integrity": "sha512-oVu9kBkGbcggulyVF0kz6BV3ganqUeqXvD79WOFKa+11oK692w1NyFkuEj4xrkFRpZhn92QOqTk4RQq5LiBXbQ==", - "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "ws": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", - "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==" - } - } - }, - "engine.io-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", - "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.4", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", - "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.50", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz", - "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "^1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escodegen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", - "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", - "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" - } - } - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "eslint-config-react-app": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.0.tgz", - "integrity": "sha512-WrHjoGpKr1kLLiWDD81tme9jMM0hk5cMxasLSdyno6DdPt+IfLOrDJBVo6jN7tn4y1nzhs43TmUaZWO6Sf0blw==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.9" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", - "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-loader": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.3.tgz", - "integrity": "sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw==", - "dev": true, - "requires": { - "fs-extra": "^8.1.0", - "loader-fs-cache": "^1.0.2", - "loader-utils": "^1.2.3", - "object-hash": "^2.0.1", - "schema-utils": "^2.6.1" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz", - "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - } - } - }, - "eslint-plugin-flowtype": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz", - "integrity": "sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "eslint-plugin-import": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.0.tgz", - "integrity": "sha512-NK42oA0mUc8Ngn4kONOPsPB1XhbUvNHqF+g307dPV28aknPoiNnKLFd9em4nkswwepdF5ouieqv5Th/63U7YJQ==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.1", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.0", - "read-pkg-up": "^2.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", - "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.4.5", - "aria-query": "^3.0.0", - "array-includes": "^3.0.3", - "ast-types-flow": "^0.0.7", - "axobject-query": "^2.0.2", - "damerau-levenshtein": "^1.0.4", - "emoji-regex": "^7.0.2", - "has": "^1.0.3", - "jsx-ast-utils": "^2.2.1" - } - }, - "eslint-plugin-react": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.18.0.tgz", - "integrity": "sha512-p+PGoGeV4SaZRDsXqdj9OWcOrOpZn8gXoGPcIQTzo2IDMbAKhNDnME9myZWqO3Ic4R3YmwAZ1lDjWl2R2hMUVQ==", - "dev": true, - "requires": { - "array-includes": "^3.1.1", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.2.3", - "object.entries": "^1.1.1", - "object.fromentries": "^2.0.2", - "object.values": "^1.1.1", - "prop-types": "^15.7.2", - "resolve": "^1.14.2" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "object.entries": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", - "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-plugin-react-hooks": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", - "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==", - "dev": true - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - }, - "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", - "dev": true, - "requires": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", - "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "event-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", - "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "from": "^0.1.7", - "map-stream": "0.0.7", - "pause-stream": "^0.0.11", - "split": "^1.0.1", - "stream-combiner": "^0.2.2", - "through": "^2.3.8" - } - }, - "eventemitter2": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", - "integrity": "sha1-YZegldX7a1folC9v1+qtY6CclFI=" - }, - "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", - "dev": true - }, - "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", - "dev": true - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "exec-sh": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", - "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==" - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "expect": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.1.0.tgz", - "integrity": "sha512-wqHzuoapQkhc3OKPlrpetsfueuEiMf3iWh0R8+duCu9PIjXoP7HgD5aeypwTnXUAjC8aMsiVDaWwlbJ1RlQ38g==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-styles": "^4.0.0", - "jest-get-type": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-regex-util": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "diff-sequences": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", - "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-diff": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", - "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-matcher-utils": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", - "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", - "requires": { - "chalk": "^3.0.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fb-watchman": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", - "requires": { - "bser": "^2.0.0" - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "file-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", - "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.5.0" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "filesize": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz", - "integrity": "sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg==", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, - "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "dev": true, - "requires": { - "is-buffer": "~2.0.3" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", - "dev": true - }, - "flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", - "dev": true - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", - "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", - "dev": true, - "requires": { - "debug": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "fork-ts-checker-webpack-plugin": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz", - "integrity": "sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ==", - "dev": true, - "requires": { - "babel-code-frame": "^6.22.0", - "chalk": "^2.4.1", - "chokidar": "^3.3.0", - "micromatch": "^3.1.10", - "minimatch": "^3.0.4", - "semver": "^5.6.0", - "tapable": "^1.0.0", - "worker-rpc": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", - "dev": true, - "requires": { - "picomatch": "^2.0.7" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - } - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": false, - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": false, - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": false, - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "debug": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": false, - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": false, - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "resolved": false, - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": false, - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": false, - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": false, - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": false, - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": false, - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": false, - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.3.5", - "resolved": false, - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "resolved": false, - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": false, - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.0", - "resolved": false, - "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", - "dev": true, - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "resolved": false, - "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": false, - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "resolved": false, - "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": false, - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": false, - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": false, - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": false, - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": false, - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": false, - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": false, - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": false, - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": false, - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.0", - "resolved": false, - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": false, - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "resolved": false, - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": false, - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.0.3", - "resolved": false, - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true, - "optional": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "generic-names": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-1.0.3.tgz", - "integrity": "sha1-LXhqEhruUIh2eWk56OO/+DbCCRc=", - "requires": { - "loader-utils": "^0.2.16" - }, - "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - } - } - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "git-rev-sync": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/git-rev-sync/-/git-rev-sync-1.12.0.tgz", - "integrity": "sha1-RGhAbH5sO6TPRYeZnhrbKNnRr1U=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "graceful-fs": "4.1.11", - "shelljs": "0.7.7" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - } - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "glob-watcher": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", - "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "object.defaults": "^1.1.0" - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - }, - "dependencies": { - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - } - } - }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" - }, - "gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", - "dev": true, - "requires": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" - } - }, - "gulp-cli": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", - "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.1.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.0.1", - "yargs": "^7.1.0" - }, - "dependencies": { - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", - "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "object.assign": "^4.1.0" - } - } - } - }, - "gulp-filter": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz", - "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=", - "dev": true, - "requires": { - "multimatch": "^2.0.0", - "plugin-error": "^0.1.2", - "streamfilter": "^1.0.5" - } - }, - "gulp-sourcemaps": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz", - "integrity": "sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg==", - "dev": true, - "requires": { - "@gulp-sourcemaps/identity-map": "1.X", - "@gulp-sourcemaps/map-sources": "1.X", - "acorn": "5.X", - "convert-source-map": "1.X", - "css": "2.X", - "debug-fabulous": "1.X", - "detect-newline": "2.X", - "graceful-fs": "4.X", - "source-map": "~0.6.0", - "strip-bom-string": "1.X", - "through2": "2.X" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - } - } - }, - "gulp-typescript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-5.0.1.tgz", - "integrity": "sha512-YuMMlylyJtUSHG1/wuSVTrZp60k1dMEFKYOvDf7OvbAJWrDtxxD4oZon4ancdWwzjj30ztiidhe4VXJniF0pIQ==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.5", - "plugin-error": "^1.0.1", - "source-map": "^0.7.3", - "through2": "^3.0.0", - "vinyl": "^2.1.0", - "vinyl-fs": "^3.0.3" - }, - "dependencies": { - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - }, - "dependencies": { - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - } - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", - "dev": true, - "requires": { - "readable-stream": "2 || 3" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - } - }, - "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "handle-thing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "harmony-reflect": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", - "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", - "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", - "requires": { - "react-is": "^16.7.0" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "requires": { - "whatwg-encoding": "^1.0.1" - } - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true - }, - "html-escaper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", - "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==" - }, - "html-minifier-terser": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.0.4.tgz", - "integrity": "sha512-fHwmKQ+GzhlqdxEtwrqLT7MSuheiA+rif5/dZgbz3GjoMXJzcRzy1L9NXoiiyxrnap+q5guSiv8Tz5lrh9g42g==", - "dev": true, - "requires": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", - "he": "^1.2.0", - "param-case": "^3.0.3", - "relateurl": "^0.2.7", - "terser": "^4.6.3" - }, - "dependencies": { - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - } - } - }, - "html-webpack-plugin": { - "version": "4.0.0-beta.11", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz", - "integrity": "sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg==", - "dev": true, - "requires": { - "html-minifier-terser": "^5.0.1", - "loader-utils": "^1.2.3", - "lodash": "^4.17.15", - "pretty-error": "^2.1.1", - "tapable": "^1.1.3", - "util.promisify": "1.0.0" - } - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "dev": true, - "requires": { - "agent-base": "4", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "dev": true, - "requires": { - "postcss": "^6.0.1" - } - }, - "identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", - "dev": true, - "requires": { - "harmony-reflect": "^1.4.6" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true - }, - "immer": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", - "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==", - "dev": true - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "requires": { - "resolve-from": "^3.0.0" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "inquirer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", - "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "intl-format-cache": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/intl-format-cache/-/intl-format-cache-4.1.13.tgz", - "integrity": "sha512-d/1NI8ctPZsPJU3G6k0pIuydnebeck7hG+wIHJOJUJm3eZ2+3bcZCD34o/Mc18M5ZiEZei02xsMtp8g1IQc23A==" - }, - "intl-locales-supported": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/intl-locales-supported/-/intl-locales-supported-1.4.5.tgz", - "integrity": "sha512-D7oriM5x46rd7kNlSW0f9noIBegFr3ReIM6xlMpwH4lfIPD/zvBelPlCjR10IK16boGJG9lKccOvRAM8wzpbrA==" - }, - "intl-messageformat": { - "version": "6.1.9", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-6.1.9.tgz", - "integrity": "sha512-vnPujdP+gpWK/+GxWUo3nWRfrUj67/NAZoBNAyCvZ0fnfWh5jvIkKNr5ZZYewdZ7J3cEFLU6hYYgWztiCEFZGg==", - "requires": { - "intl-format-cache": "^4.1.13", - "intl-messageformat-parser": "^3.0.7" - } - }, - "intl-messageformat-parser": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-3.0.7.tgz", - "integrity": "sha512-L16VbbV3NFaiZV65XwOIH9fBe52TS2EkOR0k8Y4ratsgTE7KPEbcUCUrz/iEQwJo7BcWY4ohkZbeYZRgAiPR1Q==" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" - }, - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", - "dev": true - }, - "is": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", - "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", - "dev": true - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" - }, - "is-docker": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", - "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" - }, - "is-generator-function": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", - "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.1.0.tgz", - "integrity": "sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "requires": { - "has": "^1.0.1" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "dev": true - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "dev": true, - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - } - } - }, - "istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A==", - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-25.1.0.tgz", - "integrity": "sha512-FV6jEruneBhokkt9MQk0WUFoNTwnF76CLXtwNMfsc0um0TlB/LG2yxUd0KqaFjEJ9laQmVWQWS0sG/t2GsuI0w==", - "requires": { - "@jest/core": "^25.1.0", - "import-local": "^3.0.2", - "jest-cli": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "jest-cli": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.1.0.tgz", - "integrity": "sha512-p+aOfczzzKdo3AsLJlhs8J5EW6ffVidfSZZxXedJ0mHPBOln1DccqFmGCoO8JWd4xRycfmwy1eoQkMsF8oekPg==", - "requires": { - "@jest/core": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^15.0.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.1.0.tgz", - "integrity": "sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg==", - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^16.1.0" - } - } - } - }, - "jest-changed-files": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.1.0.tgz", - "integrity": "sha512-bdL1aHjIVy3HaBO3eEQeemGttsq1BDlHgWcOjEOIAcga7OOEGWHD2WSu8HhL7I1F0mFFyci8VKU4tRNk+qtwDA==", - "requires": { - "@jest/types": "^25.1.0", - "execa": "^3.2.0", - "throat": "^5.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "jest-config": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.1.0.tgz", - "integrity": "sha512-tLmsg4SZ5H7tuhBC5bOja0HEblM0coS3Wy5LTCb2C8ZV6eWLewHyK+3qSq9Bi29zmWQ7ojdCd3pxpx4l4d2uGw==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^25.1.0", - "@jest/types": "^25.1.0", - "babel-jest": "^25.1.0", - "chalk": "^3.0.0", - "glob": "^7.1.1", - "jest-environment-jsdom": "^25.1.0", - "jest-environment-node": "^25.1.0", - "jest-get-type": "^25.1.0", - "jest-jasmine2": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "micromatch": "^4.0.2", - "pretty-format": "^25.1.0", - "realpath-native": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", - "requires": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-docblock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.1.0.tgz", - "integrity": "sha512-370P/mh1wzoef6hUKiaMcsPtIapY25suP6JqM70V9RJvdKLrV4GaGbfUseUVk4FZJw4oTZ1qSCJNdrClKt5JQA==", - "requires": { - "detect-newline": "^3.0.0" - }, - "dependencies": { - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" - } - } - }, - "jest-each": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.1.0.tgz", - "integrity": "sha512-R9EL8xWzoPySJ5wa0DXFTj7NrzKpRD40Jy+zQDp3Qr/2QmevJgkN9GqioCGtAJ2bW9P/MQRznQHQQhoeAyra7A==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "jest-get-type": "^25.1.0", - "jest-util": "^25.1.0", - "pretty-format": "^25.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-environment-jsdom": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.1.0.tgz", - "integrity": "sha512-ILb4wdrwPAOHX6W82GGDUiaXSSOE274ciuov0lztOIymTChKFtC02ddyicRRCdZlB5YSrv3vzr1Z5xjpEe1OHQ==", - "requires": { - "@jest/environment": "^25.1.0", - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "jsdom": "^15.1.1" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/fake-timers": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.1.0.tgz", - "integrity": "sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ==", - "requires": { - "@jest/types": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "lolex": "^5.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", - "requires": { - "@jest/types": "^25.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-environment-jsdom-fourteen": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-1.0.1.tgz", - "integrity": "sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q==", - "dev": true, - "requires": { - "@jest/environment": "^24.3.0", - "@jest/fake-timers": "^24.3.0", - "@jest/types": "^24.3.0", - "jest-mock": "^24.0.0", - "jest-util": "^24.0.0", - "jsdom": "^14.1.0" - }, - "dependencies": { - "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", - "dev": true, - "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" - } - }, - "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - } - }, - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, - "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", - "dev": true - }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jsdom": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz", - "integrity": "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^6.0.4", - "acorn-globals": "^4.3.0", - "array-equal": "^1.0.0", - "cssom": "^0.3.4", - "cssstyle": "^1.1.1", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.0", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.1.3", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.5.0", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^6.1.2", - "xml-name-validator": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "jest-environment-node": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.1.0.tgz", - "integrity": "sha512-U9kFWTtAPvhgYY5upnH9rq8qZkj6mYLup5l1caAjjx9uNnkLHN2xgZy5mo4SyLdmrh/EtB9UPpKFShvfQHD0Iw==", - "requires": { - "@jest/environment": "^25.1.0", - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/fake-timers": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.1.0.tgz", - "integrity": "sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ==", - "requires": { - "@jest/types": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "lolex": "^5.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", - "requires": { - "@jest/types": "^25.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" - }, - "jest-haste-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.1.0.tgz", - "integrity": "sha512-/2oYINIdnQZAqyWSn1GTku571aAfs8NxzSErGek65Iu5o8JYb+113bZysRMcC/pjE5v9w0Yz+ldbj9NxrFyPyw==", - "requires": { - "@jest/types": "^25.1.0", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.3", - "jest-serializer": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": true - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-jasmine2": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.1.0.tgz", - "integrity": "sha512-GdncRq7jJ7sNIQ+dnXvpKO2MyP6j3naNK41DTTjEAhLEdpImaDA9zSAZwDhijjSF/D7cf4O5fdyUApGBZleaEg==", - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^25.1.0", - "@jest/source-map": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "co": "^4.6.0", - "expect": "^25.1.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "pretty-format": "^25.1.0", - "throat": "^5.0.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "diff-sequences": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", - "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-diff": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", - "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-matcher-utils": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", - "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", - "requires": { - "chalk": "^3.0.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-leak-detector": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.1.0.tgz", - "integrity": "sha512-3xRI264dnhGaMHRvkFyEKpDeaRzcEBhyNrOG5oT8xPxOyUAblIAQnpiR3QXu4wDor47MDTiHbiFcbypdLcLW5w==", - "requires": { - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - } - } - }, - "jest-matcher-utils": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", - "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", - "requires": { - "chalk": "^2.0.1", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", - "stack-utils": "^1.0.1" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-mock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - } - } - }, - "jest-pnp-resolver": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", - "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==" - }, - "jest-regex-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.1.0.tgz", - "integrity": "sha512-9lShaDmDpqwg+xAd73zHydKrBbbrIi08Kk9YryBEBybQFg/lBWR/2BDjjiSE7KIppM9C5+c03XiDaZ+m4Pgs1w==" - }, - "jest-resolve": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", - "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.1.0.tgz", - "integrity": "sha512-Cu/Je38GSsccNy4I2vL12ZnBlD170x2Oh1devzuM9TLH5rrnLW1x51lN8kpZLYTvzx9j+77Y5pqBaTqfdzVzrw==", - "requires": { - "@jest/types": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-snapshot": "^25.1.0" - } - }, - "jest-runner": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.1.0.tgz", - "integrity": "sha512-su3O5fy0ehwgt+e8Wy7A8CaxxAOCMzL4gUBftSs0Ip32S0epxyZPDov9Znvkl1nhVOJNf4UwAsnqfc3plfQH9w==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-config": "^25.1.0", - "jest-docblock": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-jasmine2": "^25.1.0", - "jest-leak-detector": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-runtime": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.1.0.tgz", - "integrity": "sha512-mpPYYEdbExKBIBB16ryF6FLZTc1Rbk9Nx0ryIpIMiDDkOeGa0jQOKVI/QeGvVGlunKKm62ywcioeFVzIbK03bA==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/source-map": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.3", - "jest-config": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "realpath-native": "^1.1.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.0.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@types/yargs": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.1.tgz", - "integrity": "sha512-sYlwNU7zYi6eZbMzFvG6eHD7VsEvFdoDtlD7eI1JTg7YNnuguzmiGsc6MPSq5l8n+h21AsNof0je+9sgOe4+dg==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", - "requires": { - "@jest/types": "^25.1.0" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.1.0.tgz", - "integrity": "sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg==", - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^16.1.0" - } - } - } - }, - "jest-serializer": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.1.0.tgz", - "integrity": "sha512-20Wkq5j7o84kssBwvyuJ7Xhn7hdPeTXndnwIblKDR2/sy1SUm6rWWiG9kSCgJPIfkDScJCIsTtOKdlzfIHOfKA==" - }, - "jest-snapshot": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.1.0.tgz", - "integrity": "sha512-xZ73dFYN8b/+X2hKLXz4VpBZGIAn7muD/DAg+pXtDzDGw3iIV10jM7WiHqhCcpDZfGiKEj7/2HXAEPtHTj0P2A==", - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "expect": "^25.1.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^25.1.0", - "semver": "^7.1.1" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "diff-sequences": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", - "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-diff": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", - "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-matcher-utils": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", - "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", - "requires": { - "chalk": "^3.0.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "semver": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.1.tgz", - "integrity": "sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-transform-css": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jest-transform-css/-/jest-transform-css-2.0.0.tgz", - "integrity": "sha512-KV5pD27qUltAVj0mZEVvqd+Ahe+WNPOVWKA1BRpIhBJ5OeUUOM46ivAznJrC5B1JrVNbMzWjPxnKl6QTsAAT3Q==", - "requires": { - "common-tags": "1.8.0", - "cosmiconfig": "5.0.6", - "cross-spawn": "6.0.5", - "postcss-load-config": "2.0.0", - "postcss-modules": "1.3.2", - "style-inject": "0.3.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.6.tgz", - "integrity": "sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ==", - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0" - } - } - } - }, - "jest-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", - "dev": true, - "requires": { - "@jest/console": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/source-map": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-validate": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.1.0.tgz", - "integrity": "sha512-kGbZq1f02/zVO2+t1KQGSVoCTERc5XeObLwITqC6BTRH3Adv7NZdYqCpKIZLUgpLXf2yISzQ465qOZpul8abXA==", - "requires": { - "@jest/types": "^25.1.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "jest-get-type": "^25.1.0", - "leven": "^3.1.0", - "pretty-format": "^25.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-watch-typeahead": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz", - "integrity": "sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.1", - "jest-regex-util": "^24.9.0", - "jest-watcher": "^24.3.0", - "slash": "^3.0.0", - "string-length": "^3.1.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", - "dev": true, - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-watcher": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", - "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", - "dev": true, - "requires": { - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "jest-util": "^24.9.0", - "string-length": "^2.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsdom": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", - "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", - "requires": { - "abab": "^2.0.0", - "acorn": "^7.1.0", - "acorn-globals": "^4.3.2", - "array-equal": "^1.0.0", - "cssom": "^0.4.1", - "cssstyle": "^2.0.0", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.1", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.2.0", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^7.0.0", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" - }, - "cssstyle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", - "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - } - } - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" - }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jsx-ast-utils": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", - "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "object.assign": "^4.1.0" - } - }, - "just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", - "dev": true - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - } - } - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" - }, - "last-call-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", - "dev": true, - "requires": { - "lodash": "^4.17.5", - "webpack-sources": "^1.1.0" - } - }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "dev": true, - "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "dev": true, - "requires": { - "flush-write-stream": "^1.0.2" - } - }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", - "dev": true - }, - "less": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", - "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", - "dev": true, - "requires": { - "clone": "^2.1.2", - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "mime": "^1.4.1", - "mkdirp": "^0.5.0", - "promise": "^7.1.1", - "request": "^2.83.0", - "source-map": "~0.6.0" - } - }, - "less-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", - "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "loader-utils": "^1.1.0", - "pify": "^3.0.0" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "dev": true, - "requires": { - "leven": "^3.1.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - }, - "dependencies": { - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - } - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "linkify-it": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.1.0.tgz", - "integrity": "sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg==", - "dev": true, - "requires": { - "uc.micro": "^1.0.1" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "loader-fs-cache": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz", - "integrity": "sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw==", - "dev": true, - "requires": { - "find-cache-dir": "^0.1.1", - "mkdirp": "0.5.1" - }, - "dependencies": { - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "^1.0.0" - } - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" - }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "loglevel": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", - "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==", - "dev": true - }, - "lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", - "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", - "dev": true, - "requires": { - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "dev": true, - "requires": { - "es5-ext": "~0.10.2" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==" - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "requires": { - "tmpl": "1.0.x" - } - }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", - "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "entities": "~1.1.1", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - } - }, - "matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "dev": true, - "requires": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - } - } - }, - "memoizee": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", - "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.45", - "es6-weak-map": "^2.0.2", - "event-emitter": "^0.3.5", - "is-promise": "^2.1", - "lru-queue": "0.1", - "next-tick": "1", - "timers-ext": "^0.1.5" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true - }, - "merge-deep": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", - "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "clone-deep": "^0.2.4", - "kind-of": "^3.0.2" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", - "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "microevent.ts": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", - "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "requires": { - "mime-db": "1.40.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" - }, - "min-indent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz", - "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=" - }, - "mini-css-extract-plugin": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", - "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "minipass": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", - "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", - "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mixin-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", - "dev": true, - "requires": { - "for-in": "^0.1.3", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-in": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", - "dev": true - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, - "mocha": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.1.4.tgz", - "integrity": "sha512-PN8CIy4RXsIoxoFJzS4QNnCH4psUCPWc4/rPrst/ecSJJbLBkubMiyGCP2Kj/9YnWbotFqAoeXyXMucj7gwCFg==", - "dev": true, - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.2.2", - "yargs-parser": "13.0.0", - "yargs-unparser": "1.5.0" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" - } - }, - "yargs-parser": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", - "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" - } - }, - "mute-stdout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "no-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", - "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", - "dev": true, - "requires": { - "lower-case": "^2.0.1", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "node-abi": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.15.0.tgz", - "integrity": "sha512-FeLpTS0F39U7hHZU1srAK4Vx+5AHNVOTP+hxBNQknR/54laTHSFIJkDWDqiquY1LeLUgTfPN7sLPhMubx0PLAg==", - "requires": { - "semver": "^5.4.1" - } - }, - "node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" - }, - "node-libs-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", - "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - } - } - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" - }, - "node-notifier": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", - "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.1.1", - "semver": "^6.3.0", - "shellwords": "^0.1.1", - "which": "^1.3.1" - }, - "dependencies": { - "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", - "optional": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "optional": true - } - } - }, - "node-releases": { - "version": "1.1.49", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.49.tgz", - "integrity": "sha512-xH8t0LS0disN0mtRCh+eByxFPie+msJUBL/lJDBuap53QGiYPa9joh83K4pCZgWJ+2L4b9h88vCVdXQ60NO2bg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "noop-logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, - "now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "dev": true, - "requires": { - "once": "^1.3.2" - } - }, - "npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "object-hash": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", - "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==", - "dev": true - }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true - }, - "object-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", - "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object-path": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", - "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "object.entries": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", - "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "object.fromentries": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", - "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } - }, - "object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "office-ui-fabric-react": { - "version": "7.105.12", - "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-7.105.12.tgz", - "integrity": "sha512-PUmhth8szgLzR6xoN4HkPA0aIahpYr6/sU5oPob5zPRXB2JrhOCnCL9lFsL7/xU0lCFf/OAdoH+ARvF8DcAa0w==", - "requires": { - "@fluentui/react-focus": "^7.1.13", - "@microsoft/load-themed-styles": "^1.10.26", - "@uifabric/foundation": "^7.5.25", - "@uifabric/icons": "^7.3.24", - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/react-hooks": "^7.1.2", - "@uifabric/set-version": "^7.0.9", - "@uifabric/styling": "^7.11.2", - "@uifabric/utilities": "^7.15.5", - "prop-types": "^15.7.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "on-error-resume-next": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-error-resume-next/-/on-error-resume-next-1.1.0.tgz", - "integrity": "sha512-XhWMbmKV0+W95yLJjT1Z9zdkKiPUjDn63YYsji1pdvKqaa7pq4coeHaHEXPsa36SFlffOyOlPK/0rn6Njfb+LA==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "requires": { - "is-wsl": "^1.1.0" - } - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "optimize-css-assets-webpack-plugin": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", - "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", - "dev": true, - "requires": { - "cssnano": "^4.1.10", - "last-call-webpack-plugin": "^3.0.0" - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz", - "integrity": "sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M=" - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-each-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", - "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", - "dev": true - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", - "dev": true - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "param-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz", - "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==", - "dev": true, - "requires": { - "dot-case": "^3.0.3", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - } - } - }, - "parse-asn1": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", - "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parse-semver": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", - "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=", - "dev": true, - "requires": { - "semver": "^5.1.0" - } - }, - "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" - }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascal-case": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", - "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", - "dev": true, - "requires": { - "no-case": "^3.0.3", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "~2.3" - } - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "picomatch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", - "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==" - }, - "pidtree": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", - "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - } - } - }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" - }, - "pnp-webpack-plugin": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.0.tgz", - "integrity": "sha512-ZcMGn/xF/fCOq+9kWMP9vVVxjIkMCja72oy3lziR7UHy0hHFZ57iVpQ71OtveVbmzeCmphBg8pxNdk/hlK99aQ==", - "dev": true, - "requires": { - "ts-pnp": "^1.1.2" - } - }, - "portfinder": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", - "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.1" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-attribute-case-insensitive": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", - "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^6.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-browser-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", - "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", - "dev": true, - "requires": { - "postcss": "^7" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-calc": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", - "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", - "dev": true, - "requires": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", - "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-functional-notation": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", - "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-gray": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", - "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-hex-alpha": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", - "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", - "dev": true, - "requires": { - "postcss": "^7.0.14", - "postcss-values-parser": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-mod-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", - "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-rebeccapurple": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", - "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-custom-media": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", - "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-custom-properties": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", - "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", - "dev": true, - "requires": { - "postcss": "^7.0.17", - "postcss-values-parser": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-custom-selectors": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", - "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-dir-pseudo-class": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", - "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-double-position-gradients": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", - "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", - "dev": true, - "requires": { - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-env-function": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", - "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-flexbugs-fixes": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz", - "integrity": "sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-focus-visible": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", - "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-focus-within": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", - "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-font-variant": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz", - "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-gap-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", - "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-image-set-function": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", - "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-initial": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", - "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", - "dev": true, - "requires": { - "lodash.template": "^4.5.0", - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-lab-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", - "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", - "requires": { - "cosmiconfig": "^4.0.0", - "import-cwd": "^2.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" - } - } - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-logical": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", - "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-media-minmax": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", - "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", - "dev": true, - "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-1.3.2.tgz", - "integrity": "sha512-QujH5ZpPtr1fBWTKDa43Hx45gm7p19aEtHaAtkMCBZZiB/D5za2wXSMtAf94tDUZHF3F5KZcTXISUNqgEQRiDw==", - "requires": { - "css-modules-loader-core": "^1.1.0", - "generic-names": "^1.0.3", - "lodash.camelcase": "^4.3.0", - "postcss": "^7.0.1", - "string-hash": "^1.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.26.tgz", - "integrity": "sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", - "dev": true, - "requires": { - "postcss": "^6.0.1" - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - } - }, - "postcss-nesting": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", - "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", - "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", - "dev": true, - "requires": { - "@csstools/normalize.css": "^10.1.0", - "browserslist": "^4.6.2", - "postcss": "^7.0.17", - "postcss-browser-comments": "^3.0.0", - "sanitize.css": "^10.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", - "dev": true, - "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", - "dev": true, - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-overflow-shorthand": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", - "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-page-break": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", - "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-place": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", - "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-preset-env": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", - "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", - "dev": true, - "requires": { - "autoprefixer": "^9.6.1", - "browserslist": "^4.6.4", - "caniuse-lite": "^1.0.30000981", - "css-blank-pseudo": "^0.1.4", - "css-has-pseudo": "^0.10.0", - "css-prefers-color-scheme": "^3.1.1", - "cssdb": "^4.4.0", - "postcss": "^7.0.17", - "postcss-attribute-case-insensitive": "^4.0.1", - "postcss-color-functional-notation": "^2.0.1", - "postcss-color-gray": "^5.0.0", - "postcss-color-hex-alpha": "^5.0.3", - "postcss-color-mod-function": "^3.0.3", - "postcss-color-rebeccapurple": "^4.0.1", - "postcss-custom-media": "^7.0.8", - "postcss-custom-properties": "^8.0.11", - "postcss-custom-selectors": "^5.1.2", - "postcss-dir-pseudo-class": "^5.0.0", - "postcss-double-position-gradients": "^1.0.0", - "postcss-env-function": "^2.0.2", - "postcss-focus-visible": "^4.0.0", - "postcss-focus-within": "^3.0.0", - "postcss-font-variant": "^4.0.0", - "postcss-gap-properties": "^2.0.0", - "postcss-image-set-function": "^3.0.1", - "postcss-initial": "^3.0.0", - "postcss-lab-function": "^2.0.1", - "postcss-logical": "^3.0.0", - "postcss-media-minmax": "^4.0.0", - "postcss-nesting": "^7.0.0", - "postcss-overflow-shorthand": "^2.0.0", - "postcss-page-break": "^2.0.0", - "postcss-place": "^4.0.1", - "postcss-pseudo-class-any-link": "^6.0.0", - "postcss-replace-overflow-wrap": "^3.0.0", - "postcss-selector-matches": "^4.0.0", - "postcss-selector-not": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-pseudo-class-any-link": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", - "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-replace-overflow-wrap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", - "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-safe-parser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz", - "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-selector-matches": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", - "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-selector-not": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz", - "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "dependencies": { - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - } - } - }, - "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", - "dev": true, - "requires": { - "is-svg": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "prebuild-install": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.3.tgz", - "integrity": "sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==", - "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.7.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true - }, - "pretty-bytes": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", - "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==", - "dev": true - }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "dev": true, - "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" - } - }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", - "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/yargs": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.6.tgz", - "integrity": "sha512-IkltIncDQWv6fcAvnHtJ6KtkmY/vtR3bViOaCzpj/A3yNhlfZAgxNe6AEQD1cQrkYD+YsKVo08DSxvNKEsD7BA==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - } - } - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "optional": true, - "requires": { - "asap": "~2.0.3" - } - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "prompts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz", - "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==", - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.3" - } - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "psl": { - "version": "1.1.32", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.32.tgz", - "integrity": "sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==" - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", - "dev": true - }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dev": true, - "requires": { - "performance-now": "^2.1.0" - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "react": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", - "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - } - }, - "react-app-polyfill": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz", - "integrity": "sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g==", - "dev": true, - "requires": { - "core-js": "^3.5.0", - "object-assign": "^4.1.1", - "promise": "^8.0.3", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.3", - "whatwg-fetch": "^3.0.0" - }, - "dependencies": { - "promise": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.3.tgz", - "integrity": "sha512-HeRDUL1RJiLhyA0/grn+PTShlBAcLuh/1BJGtrvjwbvRDCTLLMEz9rOGCV+R3vHY4MixIuoMEd9Yq/XvsTPcjw==", - "dev": true, - "requires": { - "asap": "~2.0.6" - } - }, - "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", - "dev": true - } - } - }, - "react-dev-utils": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.2.0.tgz", - "integrity": "sha512-MwrvQW2TFjLblhqpDNeqCXHBkz3G5vc7k4wntgutAJZX4ia3o07eGKo6uYGhUOeJ0hfOxcpJFNFk7+4XCc1S8g==", - "dev": true, - "requires": { - "@babel/code-frame": "7.8.3", - "address": "1.1.2", - "browserslist": "4.8.6", - "chalk": "2.4.2", - "cross-spawn": "7.0.1", - "detect-port-alt": "1.1.6", - "escape-string-regexp": "2.0.0", - "filesize": "6.0.1", - "find-up": "4.1.0", - "fork-ts-checker-webpack-plugin": "3.1.1", - "global-modules": "2.0.0", - "globby": "8.0.2", - "gzip-size": "5.1.1", - "immer": "1.10.0", - "inquirer": "7.0.4", - "is-root": "2.1.0", - "loader-utils": "1.2.3", - "open": "^7.0.2", - "pkg-up": "3.1.0", - "react-error-overlay": "^6.0.6", - "recursive-readdir": "2.2.2", - "shell-quote": "1.7.2", - "strip-ansi": "6.0.0", - "text-table": "0.2.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "browserslist": { - "version": "4.8.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.6.tgz", - "integrity": "sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001023", - "electron-to-chromium": "^1.3.341", - "node-releases": "^1.1.47" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } - } - }, - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "open": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.2.tgz", - "integrity": "sha512-70E/pFTPr7nZ9nLDPNTcj3IVqnNvKuP4VsBmoKV9YGTnChe0mlS3C4qM7qKarhZ8rGaHKLfo+vBTHXDp6ZSyLQ==", - "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "react-dom": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", - "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.18.0" - } - }, - "react-error-overlay": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.6.tgz", - "integrity": "sha512-Yzpno3enVzSrSCnnljmr4b/2KUQSMZaPuqmS26t9k4nW7uwJk6STWmH9heNjPuvqUTO3jOSPkHoKgO4+Dw7uIw==", - "dev": true - }, - "react-intl": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-3.1.9.tgz", - "integrity": "sha512-mQxhcFsYsj7O+k2Gsf1p+QaGhEdr+g7v5hYaa88dqar1m1xdWldEJjZ4JK/waHTp4zhVPoco4NQ1JdPkhs8HkA==", - "requires": { - "@formatjs/intl-relativetimeformat": "^2.6.3", - "@types/hoist-non-react-statics": "^3.3.1", - "@types/invariant": "^2.2.30", - "hoist-non-react-statics": "^3.3.0", - "intl-format-cache": "^4.1.10", - "intl-locales-supported": "^1.4.5", - "intl-messageformat": "^6.1.6", - "intl-messageformat-parser": "^3.0.7", - "invariant": "^2.1.1", - "shallow-equal": "^1.1.0" - } - }, - "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==" - }, - "react-scripts": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.0.tgz", - "integrity": "sha512-pBqaAroFoHnFAkuX+uSK9Th1uEh2GYdGY2IG1I9/7HmuEf+ls3lLCk1p2GFYRSrLMz6ieQR/SyN6TLIGK3hKRg==", - "dev": true, - "requires": { - "@babel/core": "7.8.4", - "@svgr/webpack": "4.3.3", - "@typescript-eslint/eslint-plugin": "^2.10.0", - "@typescript-eslint/parser": "^2.10.0", - "babel-eslint": "10.0.3", - "babel-jest": "^24.9.0", - "babel-loader": "8.0.6", - "babel-plugin-named-asset-import": "^0.3.6", - "babel-preset-react-app": "^9.1.1", - "camelcase": "^5.3.1", - "case-sensitive-paths-webpack-plugin": "2.3.0", - "css-loader": "3.4.2", - "dotenv": "8.2.0", - "dotenv-expand": "5.1.0", - "eslint": "^6.6.0", - "eslint-config-react-app": "^5.2.0", - "eslint-loader": "3.0.3", - "eslint-plugin-flowtype": "4.6.0", - "eslint-plugin-import": "2.20.0", - "eslint-plugin-jsx-a11y": "6.2.3", - "eslint-plugin-react": "7.18.0", - "eslint-plugin-react-hooks": "^1.6.1", - "file-loader": "4.3.0", - "fs-extra": "^8.1.0", - "fsevents": "2.1.2", - "html-webpack-plugin": "4.0.0-beta.11", - "identity-obj-proxy": "3.0.0", - "jest": "24.9.0", - "jest-environment-jsdom-fourteen": "1.0.1", - "jest-resolve": "24.9.0", - "jest-watch-typeahead": "0.4.2", - "mini-css-extract-plugin": "0.9.0", - "optimize-css-assets-webpack-plugin": "5.0.3", - "pnp-webpack-plugin": "1.6.0", - "postcss-flexbugs-fixes": "4.1.0", - "postcss-loader": "3.0.0", - "postcss-normalize": "8.0.1", - "postcss-preset-env": "6.7.0", - "postcss-safe-parser": "4.0.1", - "react-app-polyfill": "^1.0.6", - "react-dev-utils": "^10.2.0", - "resolve": "1.15.0", - "resolve-url-loader": "3.1.1", - "sass-loader": "8.0.2", - "semver": "6.3.0", - "style-loader": "0.23.1", - "terser-webpack-plugin": "2.3.4", - "ts-pnp": "1.1.5", - "url-loader": "2.3.0", - "webpack": "4.41.5", - "webpack-dev-server": "3.10.2", - "webpack-manifest-plugin": "2.2.0", - "workbox-webpack-plugin": "4.3.1" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@jest/core": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", - "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/reporters": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.9.0", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-resolve-dependencies": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "jest-watcher": "^24.9.0", - "micromatch": "^3.1.10", - "p-each-series": "^1.0.0", - "realpath-native": "^1.1.0", - "rimraf": "^2.5.4", - "slash": "^2.0.0", - "strip-ansi": "^5.0.0" - } - }, - "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", - "dev": true, - "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" - } - }, - "@jest/reporters": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", - "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^2.0.2", - "istanbul-lib-instrument": "^3.0.1", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.2.6", - "jest-haste-map": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "node-notifier": "^5.4.2", - "slash": "^2.0.0", - "source-map": "^0.6.0", - "string-length": "^2.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@jest/test-sequencer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", - "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", - "dev": true, - "requires": { - "@jest/test-result": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0" - } - }, - "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - }, - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "babel-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", - "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", - "dev": true, - "requires": { - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.9.0", - "chalk": "^2.4.2", - "slash": "^2.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", - "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", - "dev": true, - "requires": { - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", - "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", - "dev": true, - "requires": { - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "css-loader": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", - "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.23", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.1.1", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.0.2", - "schema-utils": "^2.6.0" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "expect": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", - "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "ansi-styles": "^3.2.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.9.0" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "find-cache-dir": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", - "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.0", - "pkg-dir": "^4.1.0" - }, - "dependencies": { - "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - } - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "dev": true, - "optional": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0" - } - }, - "jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", - "dev": true, - "requires": { - "import-local": "^2.0.0", - "jest-cli": "^24.9.0" - }, - "dependencies": { - "jest-cli": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", - "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", - "dev": true, - "requires": { - "@jest/core": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "import-local": "^2.0.0", - "is-ci": "^2.0.0", - "jest-config": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^13.3.0" - } - } - } - }, - "jest-changed-files": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", - "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "execa": "^1.0.0", - "throat": "^4.0.0" - } - }, - "jest-config": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", - "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.9.0", - "@jest/types": "^24.9.0", - "babel-jest": "^24.9.0", - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^24.9.0", - "jest-environment-node": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "micromatch": "^3.1.10", - "pretty-format": "^24.9.0", - "realpath-native": "^1.1.0" - } - }, - "jest-docblock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", - "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", - "dev": true, - "requires": { - "detect-newline": "^2.1.0" - } - }, - "jest-each": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", - "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-environment-jsdom": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", - "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0", - "jsdom": "^11.5.1" - } - }, - "jest-environment-node": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", - "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0" - } - }, - "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, - "dependencies": { - "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": false, - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": false, - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.3", - "resolved": false, - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": false, - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "resolved": false, - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": false, - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": false, - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": false, - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": false, - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": false, - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": false, - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "resolved": false, - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": false, - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": false, - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": false, - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "resolved": false, - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": false, - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": false, - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.2", - "resolved": false, - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "optional": true - }, - "needle": { - "version": "2.4.0", - "resolved": false, - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "resolved": false, - "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": false, - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.7", - "resolved": false, - "integrity": "sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": false, - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": false, - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": false, - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": false, - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": false, - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": false, - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": false, - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": false, - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": false, - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "resolved": false, - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": false, - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "resolved": false, - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": false, - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "resolved": false, - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "optional": true - } - } - } - } - }, - "jest-jasmine2": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", - "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^24.9.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0", - "throat": "^4.0.0" - } - }, - "jest-leak-detector": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", - "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", - "dev": true, - "requires": { - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, - "jest-resolve-dependencies": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", - "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.9.0" - } - }, - "jest-runner": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", - "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.4.2", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-leak-detector": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "source-map-support": "^0.5.6", - "throat": "^4.0.0" - } - }, - "jest-runtime": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", - "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "strip-bom": "^3.0.0", - "yargs": "^13.3.0" - } - }, - "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", - "dev": true - }, - "jest-snapshot": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", - "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "expect": "^24.9.0", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^24.9.0", - "semver": "^6.2.0" - } - }, - "jest-validate": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", - "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "camelcase": "^5.3.1", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "leven": "^3.1.0", - "pretty-format": "^24.9.0" - } - }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", - "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - } - }, - "node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", - "dev": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "p-each-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", - "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", - "dev": true, - "requires": { - "p-reduce": "^1.0.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "postcss-modules-local-by-default": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", - "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", - "dev": true, - "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.16", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.0" - } - }, - "postcss-modules-scope": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz", - "integrity": "sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - } - }, - "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", - "dev": true, - "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" - } - }, - "postcss-value-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", - "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "resolve": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", - "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "terser-webpack-plugin": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.4.tgz", - "integrity": "sha512-Nv96Nws2R2nrFOpbzF6IxRDpIkkIfmhvOws+IqMvYdFLO7o6wAILWFKONFgaYy8+T4LVz77DQW0f7wOeDEAjrg==", - "dev": true, - "requires": { - "cacache": "^13.0.1", - "find-cache-dir": "^3.2.0", - "jest-worker": "^25.1.0", - "p-limit": "^2.2.2", - "schema-utils": "^2.6.4", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.4.3", - "webpack-sources": "^1.4.3" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "webpack": { - "version": "4.41.5", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", - "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.0", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - }, - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - } - } - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "react-test-renderer": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.12.0.tgz", - "integrity": "sha512-Vj/teSqt2oayaWxkbhQ6gKis+t5JrknXfPVo+aIJ8QwYAqMPH77uptOdrlphyxl8eQI/rtkOYg86i/UWkpFu0w==", - "requires": { - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "react-is": "^16.8.6", - "scheduler": "^0.18.0" - }, - "dependencies": { - "scheduler": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", - "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - } - } - }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "dev": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", - "requires": { - "util.promisify": "^1.0.0" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", - "dev": true, - "requires": { - "minimatch": "3.0.4" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" - }, - "regenerate-unicode-properties": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", - "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" - }, - "regenerator-transform": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", - "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", - "dev": true, - "requires": { - "private": "^0.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regex-parser": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", - "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "regexpp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", - "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", - "dev": true - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "~0.5.0" - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - } - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dev": true, - "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "renderkid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", - "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", - "dev": true, - "requires": { - "css-select": "^1.1.0", - "dom-converter": "^0.2", - "htmlparser2": "^3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" - }, - "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - } - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", - "requires": { - "lodash": "^4.17.11" - } - }, - "request-promise-native": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", - "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", - "requires": { - "request-promise-core": "1.1.2", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", - "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "dependencies": { - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - } - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - }, - "resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "dev": true, - "requires": { - "value-or-function": "^3.0.0" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "resolve-url-loader": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz", - "integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==", - "dev": true, - "requires": { - "adjust-sourcemap-loader": "2.0.0", - "camelcase": "5.3.1", - "compose-function": "3.0.3", - "convert-source-map": "1.7.0", - "es6-iterator": "2.0.3", - "loader-utils": "1.2.3", - "postcss": "7.0.21", - "rework": "1.0.1", - "rework-visit": "1.0.0", - "source-map": "0.6.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "dev": true, - "requires": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - }, - "dependencies": { - "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", - "dev": true - } - } - }, - "rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", - "dev": true - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, - "rimraf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", - "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rsvp": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.4.tgz", - "integrity": "sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA==" - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - } - }, - "sanitize.css": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", - "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==", - "dev": true - }, - "sass-loader": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", - "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "loader-utils": "^1.2.3", - "neo-async": "^2.6.1", - "schema-utils": "^2.6.1", - "semver": "^6.3.0" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "saxes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.9.tgz", - "integrity": "sha512-FZeKhJglhJHk7eWG5YM0z46VHmI3KJpMBAQm3xa9meDvd+wevB5GuBB0wc0exPInZiBBHqi00DbS8AcvCGCFMw==", - "requires": { - "xmlchars": "^1.3.1" - } - }, - "scheduler": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", - "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", - "dev": true, - "requires": { - "node-forge": "0.9.0" - } - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" - }, - "semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", - "dev": true, - "requires": { - "sver-compat": "^1.5.0" - } - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - } - } - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, - "serialport": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/serialport/-/serialport-8.0.7.tgz", - "integrity": "sha512-R9bfNebs2dblYf5sD/Aaa7j8+siP4X7TGT02lqHM9DF5fyjlrPGXmsLw9+LKOz1AvjGjkxf2NzBVnDpqRX7clQ==", - "requires": { - "@serialport/binding-mock": "^8.0.6", - "@serialport/bindings": "^8.0.7", - "@serialport/parser-byte-length": "^8.0.6", - "@serialport/parser-cctalk": "^8.0.6", - "@serialport/parser-delimiter": "^8.0.6", - "@serialport/parser-readline": "^8.0.6", - "@serialport/parser-ready": "^8.0.6", - "@serialport/parser-regex": "^8.0.6", - "@serialport/stream": "^8.0.6", - "debug": "^4.1.1" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-clone": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", - "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", - "dev": true, - "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^2.0.1", - "lazy-cache": "^0.2.3", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", - "dev": true, - "requires": { - "is-buffer": "^1.0.2" - } - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", - "dev": true - } - } - }, - "shallow-equal": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.0.tgz", - "integrity": "sha512-Z21pVxR4cXsfwpMKMhCEIO1PCi5sp7KEp+CmOpBQ+E8GpHwKOw2sEzk7sgblM3d/j4z4gakoWEoPcjK0VJQogA==" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "dev": true, - "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } - }, - "shelljs": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.7.tgz", - "integrity": "sha1-svXHfvlxSPS09uImguELuoZnz/E=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" - }, - "simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - } - } - }, - "sisteransi": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", - "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==" - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - } - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - } - }, - "socket.io": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.0.tgz", - "integrity": "sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ==", - "requires": { - "debug": "~4.1.0", - "engine.io": "~3.5.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.4.0", - "socket.io-parser": "~3.4.0" - } - }, - "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" - }, - "socket.io-client": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", - "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "engine.io-client": "~3.5.0", - "has-binary2": "~1.0.2", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "socket.io-parser": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", - "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", - "requires": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" - } - } - } - }, - "socket.io-parser": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", - "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", - "requires": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - } - } - }, - "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", - "dev": true, - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" - } - }, - "sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", - "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", - "dev": true, - "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", - "dev": true - }, - "spdy": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", - "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", - "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "minipass": "^3.1.1" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - }, - "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==" - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", - "dev": true - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "streamfilter": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz", - "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=" - }, - "string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", - "dev": true, - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string.prototype.padend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", - "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.4.3", - "function-bind": "^1.0.2" - } - }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dev": true, - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "dependencies": { - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", - "dev": true - }, - "strip-comments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", - "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", - "dev": true, - "requires": { - "babel-extract-comments": "^1.0.0", - "babel-plugin-transform-object-rest-spread": "^6.26.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "style-inject": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", - "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==" - }, - "style-loader": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.21.0.tgz", - "integrity": "sha512-T+UNsAcl3Yg+BsPKs1vd22Fr8sVT+CJMtzqc6LEw9bbJZb43lm9GoeIfUcDEefBSWC0BhYbcdupV1GtI4DGzxg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^0.4.5" - }, - "dependencies": { - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "supports-hyperlinks": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.0.0.tgz", - "integrity": "sha512-bFhn0MQ8qefLyJ3K7PpHiPUTuTVPWw6RXfaMeV6xgJLXtBbszyboz1bvGTVv4R0YpQm2DqlXXn0fFHhxUHVE5w==", - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "dev": true, - "requires": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "svg-inline-react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/svg-inline-react/-/svg-inline-react-3.1.0.tgz", - "integrity": "sha512-c39AIRQOUXLMD8fQ2rHmK1GOSO3tVuZk61bAXqIT05uhhm3z4VtQFITQSwyhL0WA2uxoJAIhPd2YV0CYQOolSA==", - "requires": { - "prop-types": "^15.5.0" - } - }, - "svg-parser": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.3.tgz", - "integrity": "sha512-fnCWiifNhK8i2Z7b9R5tbNahpxrRdAaQbnoxKlT2KrSCj9Kq/yBSgulCRgBJRhy1dPnSY5slg5ehPUnzpEcHlg==", - "dev": true - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "symbol-tree": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "tar-fs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", - "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", - "requires": { - "chownr": "^1.1.1", - "mkdirp": "^0.5.1", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - } - }, - "tar-stream": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", - "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", - "requires": { - "bl": "^4.0.1", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "dependencies": { - "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "requires": { - "type-fest": "^0.8.1" - } - } - } - }, - "terser": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - }, - "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "terser": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } - } - }, - "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "dev": true, - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "dev": true, - "requires": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" - }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - } - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "dev": true, - "requires": { - "through2": "^2.0.3" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "requires": { - "punycode": "^2.1.0" - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - }, - "ts-import-plugin": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/ts-import-plugin/-/ts-import-plugin-1.5.5.tgz", - "integrity": "sha512-i0ULERaX+vycmASUeJFbAqx+KeMBAH+iFaSim+U9t05DxK+ZGpMCHT18zTRzTEh1dA6OWsHzVZmHgFKh5UTKUA==", - "dev": true, - "requires": { - "tslib": "^1.9.2" - } - }, - "ts-jest": { - "version": "25.0.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-25.0.0.tgz", - "integrity": "sha512-F+hZg3j7XYOFpXJteXb4lnqy7vQzTmpTmX7AJT6pvSGeZejyXj1Lk0ArpnrEPOpv6Zu/NugHc5W7FINngC9WZQ==", - "requires": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "mkdirp": "0.x", - "resolve": "1.x", - "semver": "^5.5", - "yargs-parser": "10.x" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "ts-loader": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-4.5.0.tgz", - "integrity": "sha512-ihgVaSmgrX4crGV4n7yuoHPoCHbDzj9aepCZR9TgIx4SgJ9gdnB6xLHgUBb7bsFM/f0K6x9iXa65KY/Fu1Klkw==", - "dev": true, - "requires": { - "chalk": "^2.3.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^1.0.2", - "micromatch": "^3.1.4", - "semver": "^5.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "ts-pnp": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.5.tgz", - "integrity": "sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA==", - "dev": true - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - }, - "tslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz", - "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^3.2.0", - "glob": "^7.1.1", - "js-yaml": "^3.13.0", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tslint-config-prettier": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz", - "integrity": "sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==", - "dev": true - }, - "tslint-microsoft-contrib": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-6.2.0.tgz", - "integrity": "sha512-6tfi/2tHqV/3CL77pULBcK+foty11Rr0idRDxKnteTaKm6gWF9qmaCNU17HVssOuwlYNyOmd9Jsmjd+1t3a3qw==", - "dev": true, - "requires": { - "tsutils": "^2.27.2 <2.29.0" - }, - "dependencies": { - "tsutils": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz", - "integrity": "sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tslint-react": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/tslint-react/-/tslint-react-3.6.0.tgz", - "integrity": "sha512-AIv1QcsSnj7e9pFir6cJ6vIncTqxfqeFF3Lzh8SuuBljueYzEAtByuB6zMaD27BL0xhMEqsZ9s5eHuCONydjBw==", - "dev": true, - "requires": { - "tsutils": "^2.13.1" - }, - "dependencies": { - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tslint-react-hooks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslint-react-hooks/-/tslint-react-hooks-2.1.0.tgz", - "integrity": "sha512-ccjyguEHGEU5rXikLDaQ6kT1AVo3C0HV8gi2MIJc7SbYAXjbzJkpbs4IXulgfqdEY1T6RnNSuGhyXg+2jTm5Bg==", - "dev": true - }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", - "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/type/-/type-1.0.1.tgz", - "integrity": "sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw==", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typed-rest-client": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.2.0.tgz", - "integrity": "sha512-FrUshzZ1yxH8YwGR29PWWnfksLEILbWJydU7zfIRkyH7kAEzB62uMAl2WY6EyolWpLpVHeJGgQm45/MaruaHpw==", - "dev": true, - "requires": { - "tunnel": "0.0.4", - "underscore": "1.8.3" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", - "dev": true - }, - "typescript-react-intl": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/typescript-react-intl/-/typescript-react-intl-0.4.0.tgz", - "integrity": "sha512-sCQN2YdWSaWNAK9bBezmqZStswfh0MMWQnIlBOn+iFBN4fE1m36fv1zqUaw33jTbQUjIaZ4N+NFbMfS/cnyIew==", - "dev": true, - "requires": { - "typescript": "^2.6.2" - }, - "dependencies": { - "typescript": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", - "dev": true - } - } - }, - "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true - }, - "undertaker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", - "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - } - }, - "undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", - "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", - "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "dev": true, - "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } - } - }, - "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-join": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", - "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=", - "dev": true - }, - "url-loader": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", - "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "mime": "^2.4.4", - "schema-utils": "^2.5.0" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } - } - }, - "url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "usb-detection": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/usb-detection/-/usb-detection-4.7.0.tgz", - "integrity": "sha512-HE9y5uYfA2ebVo64BrIB0OVNaVKZ2oWkadpTItCi4YQXyZ9vD0705iqQ3B7Rz8xevcrW/RNg/85E2o2JoPFmsQ==", - "requires": { - "bindings": "^1.3.0", - "eventemitter2": "^5.0.1", - "nan": "^2.13.2", - "prebuild-install": "^5.1.0" - } - }, - "usb-native": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/usb-native/-/usb-native-5.0.1.tgz", - "integrity": "sha512-FuKUVJmzgo7I6jclH0fCLuQLuOTg3jzzDvQwFgFWJM5Qe1L09snrl84adFCNvE/LGbCCCa4XjLuGGIgB7+zGQA==", - "requires": { - "fs-extra": "^8.1.0", - "serialport": "^8.0.7", - "usb-detection": "^4.7.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "util": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.1.tgz", - "integrity": "sha512-MREAtYOp+GTt9/+kwf00IYoHZyjM8VU4aVrkzUlejyqaIjd2GztVl5V9hGXKlvBKE3gENn/FMfHE5v6hElXGcQ==", - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "object.entries": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - }, - "v8-compile-cache": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", - "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", - "dev": true - }, - "v8-to-istanbul": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.0.1.tgz", - "integrity": "sha512-x0yZvZAkjJwdD3fPiJzYP37aod0ati4LlmD2RmpKjqewjKAov/u/ytZ8ViIZb07cN4cePKzl9ijiUi7C1LQ8hQ==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } - } - }, - "v8flags": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", - "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "version-from-git": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/version-from-git/-/version-from-git-1.1.1.tgz", - "integrity": "sha512-R8kAZ+EFJcqG5HGrfjk7bSBAWKB3AE/Dnh21llvNg6CWJIPJAKsYNLR7lvYrCwu33A3TU4UljPLpp577UxgL3w==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "commander": "^2.15.1", - "cross-spawn": "^6.0.5", - "git-rev-sync": "^1.12.0", - "on-error-resume-next": "^1.0.0", - "semver": "^5.5.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - } - }, - "vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "dev": true, - "requires": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "vsce": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.62.0.tgz", - "integrity": "sha512-KXtPBsdC0K27hmDksINyjoRl9BiuTB+ntmoJEDbbO3GIc+L3wfOclaSy8iYqddnpSA33YDkhKzKXhT0JGzrG/A==", - "dev": true, - "requires": { - "azure-devops-node-api": "^7.2.0", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.1", - "commander": "^2.8.1", - "denodeify": "^1.2.1", - "glob": "^7.0.6", - "lodash": "^4.17.10", - "markdown-it": "^8.3.1", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "osenv": "^0.1.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "semver": "^5.1.0", - "tmp": "0.0.29", - "typed-rest-client": "1.2.0", - "url-join": "^1.1.0", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tmp": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", - "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.1" - } - } - } - }, - "vscode-extension-telemetry": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.1.1.tgz", - "integrity": "sha512-TkKKG/B/J94DP5qf6xWB4YaqlhWDg6zbbqVx7Bz//stLQNnfE9XS1xm3f6fl24c5+bnEK0/wHgMgZYKIKxPeUA==", - "requires": { - "applicationinsights": "1.0.8" - } - }, - "vscode-nls": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.1.tgz", - "integrity": "sha512-4R+2UoUUU/LdnMnFjePxfLqNhBS8lrAFyX7pjb2ud/lqDkrUavFUTcG7wR0HBZFakae0Q6KLBFjMS6W93F403A==" - }, - "vscode-nls-dev": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/vscode-nls-dev/-/vscode-nls-dev-3.3.1.tgz", - "integrity": "sha512-fug18D7CXb8pv8JoQ0D0JmZaIYDQoKLiyZxkAy5P8Cln/FwlNsdzwQILDph62EdGY5pvsJ2Jd1T5qgHAExe/tg==", - "dev": true, - "requires": { - "ansi-colors": "^3.2.3", - "clone": "^2.1.1", - "event-stream": "^3.3.4", - "fancy-log": "^1.3.3", - "glob": "^7.1.2", - "iconv-lite": "^0.4.19", - "is": "^3.2.1", - "source-map": "^0.6.1", - "typescript": "^2.6.2", - "vinyl": "^2.1.0", - "xml2js": "^0.4.19", - "yargs": "^13.2.4" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "event-stream": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.5.tgz", - "integrity": "sha512-vyibDcu5JL20Me1fP734QBH/kenBGLZap2n0+XXM7mvuUPzJ20Ydqj1aKcIeMdri1p+PU+4yAKugjN8KCVst+g==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "from": "^0.1.7", - "map-stream": "0.0.7", - "pause-stream": "^0.0.11", - "split": "^1.0.1", - "stream-combiner": "^0.2.2", - "through": "^2.3.8" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "typescript": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "vscode-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.0.0.tgz", - "integrity": "sha512-RnZUhxEXYCozHtBAQwX/UISlw0JPqlv1I9LLl4++vcPDIvjs2Zfz2Inp8haxixS1sOTftHJ9kiecrwWF9S3taQ==", - "dev": true, - "requires": { - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1" - } - }, - "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", - "requires": { - "browser-process-hrtime": "^0.1.2" - } - }, - "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", - "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" - } - }, - "wait-for-expect": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-3.0.1.tgz", - "integrity": "sha512-3Ha7lu+zshEG/CeHdcpmQsZnnZpPj/UsG3DuKO8FskjuDbkx3jE3845H+CuwZjA2YWYDfKMU2KhnCaXMLd3wVw==" - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "requires": { - "makeerror": "1.0.x" - } - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "dev": true, - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - }, - "webpack": { - "version": "4.32.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.32.2.tgz", - "integrity": "sha512-F+H2Aa1TprTQrpodRAWUMJn7A8MgDx82yQiNvYMaj3d1nv3HetKU0oqEulL9huj8enirKi8KvEXQ3QtuHF89Zg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.0.5", - "acorn-dynamic-import": "^4.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^1.0.0", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - } - } - }, - "webpack-cli": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.2.tgz", - "integrity": "sha512-FLkobnaJJ+03j5eplxlI0TUxhGCOdfewspIGuvDVtpOlrAuKMFC57K42Ukxqs1tn8947/PM6tP95gQc0DCzRYA==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.0", - "findup-sync": "^2.0.0", - "global-modules": "^1.0.0", - "import-local": "^2.0.0", - "interpret": "^1.1.0", - "loader-utils": "^1.1.0", - "supports-color": "^5.5.0", - "v8-compile-cache": "^2.0.2", - "yargs": "^12.0.5" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", - "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", - "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - }, - "dependencies": { - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - } - } - }, - "webpack-dev-server": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.2.tgz", - "integrity": "sha512-pxZKPYb+n77UN8u9YxXT4IaIrGcNtijh/mi8TXbErHmczw0DtPnMTTjHj+eNjkqLOaAZM/qD7V59j/qJsEiaZA==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.2.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.6", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.25", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "0.3.19", - "sockjs-client": "1.4.0", - "spdy": "^4.0.1", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "12.0.5" - }, - "dependencies": { - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "webpack-manifest-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", - "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", - "dev": true, - "requires": { - "fs-extra": "^7.0.0", - "lodash": ">=3.5 <5", - "object.entries": "^1.1.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.4.0 <0.4.11", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==", - "dev": true - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - }, - "workbox-background-sync": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz", - "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-broadcast-update": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz", - "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-build": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-4.3.1.tgz", - "integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.3.4", - "@hapi/joi": "^15.0.0", - "common-tags": "^1.8.0", - "fs-extra": "^4.0.2", - "glob": "^7.1.3", - "lodash.template": "^4.4.0", - "pretty-bytes": "^5.1.0", - "stringify-object": "^3.3.0", - "strip-comments": "^1.0.2", - "workbox-background-sync": "^4.3.1", - "workbox-broadcast-update": "^4.3.1", - "workbox-cacheable-response": "^4.3.1", - "workbox-core": "^4.3.1", - "workbox-expiration": "^4.3.1", - "workbox-google-analytics": "^4.3.1", - "workbox-navigation-preload": "^4.3.1", - "workbox-precaching": "^4.3.1", - "workbox-range-requests": "^4.3.1", - "workbox-routing": "^4.3.1", - "workbox-strategies": "^4.3.1", - "workbox-streams": "^4.3.1", - "workbox-sw": "^4.3.1", - "workbox-window": "^4.3.1" - }, - "dependencies": { - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "workbox-cacheable-response": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz", - "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-core": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", - "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==", - "dev": true - }, - "workbox-expiration": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz", - "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-google-analytics": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz", - "integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==", - "dev": true, - "requires": { - "workbox-background-sync": "^4.3.1", - "workbox-core": "^4.3.1", - "workbox-routing": "^4.3.1", - "workbox-strategies": "^4.3.1" - } - }, - "workbox-navigation-preload": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz", - "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-precaching": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz", - "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-range-requests": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz", - "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-routing": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz", - "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-strategies": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz", - "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-streams": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-4.3.1.tgz", - "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-sw": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz", - "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==", - "dev": true - }, - "workbox-webpack-plugin": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz", - "integrity": "sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.0.0", - "json-stable-stringify": "^1.0.1", - "workbox-build": "^4.3.1" - } - }, - "workbox-window": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-4.3.1.tgz", - "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "worker-rpc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", - "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", - "dev": true, - "requires": { - "microevent.ts": "~0.1.1" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "ws": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.1.tgz", - "integrity": "sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A==" - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true - }, - "xmlchars": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-1.3.1.tgz", - "integrity": "sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw==" - }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true - }, - "yaml": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz", - "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.6.3" - } - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - }, - "dependencies": { - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "yargs-parser": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", - "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yargs-unparser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", - "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", - "dev": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.11", - "yargs": "^12.0.5" - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3" - } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" - }, - "zone.js": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.7.6.tgz", - "integrity": "sha1-+7w50+AmHQmG8boGMG6zrrDSIAk=" - } - } -} diff --git a/package.json b/package.json index c3d9e093d..56d6eedf3 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "instrumentationKey": "__AIKEY__", "icon": "assets/icon.png", "engines": { - "vscode": "^1.43.0" + "vscode": "1.43.0" }, "categories": [ "Other" @@ -253,70 +253,69 @@ "package": "vsce package" }, "devDependencies": { - "@types/glob": "^7.1.1", - "@types/node": "^10.12.21", - "@types/react": "16.8.6", - "@types/react-dom": "16.8.4", - "@types/vscode": "^1.45.1", - "css-loader": "^1.0.0", - "del": "^4.0.0", - "event-stream": "^4.0.1", - "gulp": "^4.0.2", - "gulp-cli": "^2.1.0", - "gulp-filter": "^5.1.0", - "gulp-sourcemaps": "^2.6.5", - "gulp-typescript": "^5.0.1", - "less": "^3.7.0", - "less-loader": "^4.1.0", - "mocha": "^6.1.4", - "npm-run-all": "^4.1.3", - "prettier": "^1.19.1", - "react-scripts": "^3.4.0", - "style-loader": "^0.21.0", - "ts-import-plugin": "^1.5.4", - "ts-loader": "^4.4.2", - "tslint": "^5.12.1", - "tslint-config-prettier": "^1.18.0", - "tslint-microsoft-contrib": "^6.1.0", - "tslint-react": "^3.6.0", - "tslint-react-hooks": "^2.0.0", - "typescript": "^3.8.3", - "typescript-react-intl": "^0.4.0", - "version-from-git": "^1.1.1", - "vsce": "^1.47.0", - "vscode-nls-dev": "^3.2.6", - "vscode-test": "^1.0.0", - "webpack": "^4.15.1", - "webpack-cli": "^3.0.8" + "@types/glob": "8.1.0", + "@types/node": "20.9.0", + "@types/react": "18.2.37", + "@types/react-dom": "18.2.15", + "@types/vscode": "1.84.1", + "css-loader": "6.8.1", + "del": "7.1.0", + "event-stream": "4.0.1", + "gulp": "4.0.2", + "gulp-cli": "2.3.0", + "gulp-filter": "9.0.1", + "gulp-sourcemaps": "3.0.0", + "gulp-typescript": "5.0.1", + "less": "4.2.0", + "less-loader": "11.1.3", + "mocha": "10.2.0", + "npm-run-all": "4.1.5", + "react-scripts": "5.0.1", + "style-loader": "3.3.3", + "ts-import-plugin": "3.0.0", + "ts-loader": "9.5.1", + "tslint": "5.20.1", + "tslint-config-prettier": "1.18.0", + "tslint-microsoft-contrib": "6.1.0", + "tslint-react": "4.1.0", + "tslint-react-hooks": "2.2.2", + "typescript": "5.2.2", + "typescript-react-intl": "0.4.1", + "version-from-git": "1.1.1", + "vsce": "1.47.0", + "vscode-nls-dev": "4.0.4", + "vscode-test": "1.0.0", + "webpack": "5.89.0", + "webpack-cli": "5.1.4" }, "dependencies": { - "@babel/preset-typescript": "^7.8.3", - "@testing-library/jest-dom": "^5.0.2", - "@testing-library/react": "^9.4.0", - "@types/jest": "^24.9.0", - "@types/open": "^6.1.0", - "@types/react-test-renderer": "^16.9.0", - "@types/socket.io": "^2.1.2", - "babel-jest": "^25.1.0", - "compare-versions": "^3.5.1", - "eventemitter2": "^5.0.1", - "glob": "^7.1.4", - "jest": "^25.1.0", - "jest-transform-css": "^2.0.0", - "office-ui-fabric-react": "^7.105.12", - "open": "^6.4.0", - "os": "^0.1.1", - "react": "^16.9.0", - "react-dom": "^16.9.0", - "react-intl": "^3.1.9", - "react-test-renderer": "^16.9.0", - "socket.io": "^2.4.0", - "svg-inline-react": "^3.1.0", - "ts-jest": "^25.0.0", - "usb-native": "^5.0.1", - "util": "^0.12.1", - "vscode-extension-telemetry": "^0.1.1", - "vscode-nls": "^4.1.0" + "@babel/preset-typescript": "7.23.3", + "@testing-library/jest-dom": "6.1.4", + "@testing-library/react": "14.1.0", + "@types/jest": "29.5.8", + "@types/open": "6.1.0", + "@types/react-test-renderer": "18.0.6", + "@types/socket.io": "3.0.1", + "babel-jest": "29.7.0", + "compare-versions": "6.1.0", + "eventemitter2": "6.4.9", + "glob": "10.3.10", + "jest": "29.7.0", + "jest-transform-css": "6.0.1", + "office-ui-fabric-react": "7.204.0", + "open": "9.1.0", + "os": "0.1.2", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-intl": "6.5.5", + "react-test-renderer": "18.2.0", + "socket.io": "4.7.2", + "svg-inline-react": "3.2.1", + "ts-jest": "29.1.1", + "usb-native": "6.0.0", + "util": "0.12.5", + "vscode-extension-telemetry": "0.1.1", + "vscode-nls": "5.2.0" }, "eslintConfig": { "extends": "react-app" From 121937dd2a918376cba59926041ab0bfba0e3139 Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Fri, 17 Nov 2023 03:35:38 +0200 Subject: [PATCH 13/64] squash! --- .github/CODEOWNERS | 3 - .github/PULL_REQUEST_TEMPLATE.md | 33 - .github/workflows/ci.yml | 52 - .prettierrc.yaml | 5 - .../test/__init__.py | 0 .../test/sample.mp4 | Bin 1055736 -> 0 bytes .../test/sample.wav | Bin 210158 -> 0 bytes .../test/test_express.py | 115 - .../test/test_pixel.py | 117 - .../displayio/test/__init__.py | 0 .../displayio/test/img/group_test_result.bmp | Bin 172854 -> 0 bytes .../displayio/test/test_bitmap.py | 44 - .../displayio/test/test_group.py | 174 - .../displayio/test/test_palette.py | 31 - .../displayio/test/test_tile_grid.py | 173 - Source/base_circuitpython/test/__init__.py | 0 .../test/test_terminal_handler.py | 61 - Source/clue/test/__init__.py | 0 Source/clue/test/img/test_clue_text_1.bmp | Bin 172854 -> 0 bytes Source/clue/test/img/test_display_text_1.bmp | Bin 172854 -> 0 bytes Source/clue/test/img/test_display_text_2.bmp | Bin 172854 -> 0 bytes Source/clue/test/img/test_display_text_3.bmp | Bin 172854 -> 0 bytes Source/clue/test/img/test_display_text_4.bmp | Bin 172854 -> 0 bytes Source/clue/test/img/test_image_shapes_1.bmp | Bin 172854 -> 0 bytes Source/clue/test/img/test_image_shapes_2.bmp | Bin 172854 -> 0 bytes Source/clue/test/img/test_image_shapes_3.bmp | Bin 172854 -> 0 bytes Source/clue/test/img/test_image_shapes_4.bmp | Bin 172854 -> 0 bytes Source/clue/test/img/test_image_shapes_5.bmp | Bin 172854 -> 0 bytes Source/clue/test/img/test_image_text_1.bmp | Bin 230454 -> 0 bytes Source/clue/test/img/test_image_text_2.bmp | Bin 230454 -> 0 bytes Source/clue/test/img/test_image_text_3.bmp | Bin 230454 -> 0 bytes Source/clue/test/img/test_image_text_4.bmp | Bin 230454 -> 0 bytes Source/clue/test/slideshow_pics/pic_1.bmp | Bin 113974 -> 0 bytes Source/clue/test/slideshow_pics/pic_2.bmp | Bin 113974 -> 0 bytes Source/clue/test/slideshow_pics/pic_3.bmp | Bin 330726 -> 0 bytes Source/clue/test/slideshow_pics/pic_4.bmp | Bin 327414 -> 0 bytes Source/clue/test/slideshow_pics/pic_5.bmp | Bin 225622 -> 0 bytes Source/clue/test/slideshow_pics/pic_6.bmp | Bin 115818 -> 0 bytes Source/clue/test/slideshow_pics/pic_7.bmp | Bin 93510 -> 0 bytes Source/clue/test/slideshow_pics/pic_8.bmp | Bin 193734 -> 0 bytes Source/clue/test/test_adafruit_clue.py | 193 - .../clue/test/test_adafruit_display_shapes.py | 81 - .../clue/test/test_adafruit_display_text.py | 65 - Source/clue/test/test_adafruit_slideshow.py | 100 - Source/clue/test/test_helpers.py | 32 - Source/common/test/__init__.py | 0 .../test_debugger_communication_client.py | 193 - Source/common/test/test_utils.py | 32 - Source/micropython/microbit/test/__init__.py | 0 .../microbit/test/test_accelerometer.py | 104 - .../micropython/microbit/test/test_button.py | 46 - .../micropython/microbit/test/test_display.py | 185 - .../micropython/microbit/test/test_image.py | 283 - Source/micropython/microbit/test/test_init.py | 45 - .../microbit/test/test_microbit_model.py | 48 - Source/test/runTest.ts | 23 - Source/test/suite/index.ts | 50 - jest.config.js | 28 - package-lock.json | 32342 ---------------- src/adafruit_circuitplayground/__init__.py | 4 - src/adafruit_circuitplayground/constants.py | 78 - src/adafruit_circuitplayground/express.py | 215 - .../locale/en/LC_MESSAGES/express.po | 26 - .../locale/express.pot | 26 - src/adafruit_circuitplayground/pixel.py | 133 - .../test/__init__.py | 0 .../test/sample.mp4 | Bin 1055736 -> 0 bytes .../test/sample.wav | Bin 210158 -> 0 bytes .../test/test_express.py | 115 - .../test/test_pixel.py | 117 - src/base_circuitpython/__init__.py | 8 - src/base_circuitpython/base_cp_constants.py | 82 - src/base_circuitpython/board.py | 128 - src/base_circuitpython/digitalio.py | 17 - src/base_circuitpython/displayio/__init__.py | 11 - src/base_circuitpython/displayio/bitmap.py | 105 - .../displayio/color_type.py | 12 - src/base_circuitpython/displayio/constants.py | 12 - src/base_circuitpython/displayio/group.py | 354 - src/base_circuitpython/displayio/palette.py | 81 - .../displayio/test/__init__.py | 0 .../displayio/test/img/group_test_result.bmp | Bin 172854 -> 0 bytes .../displayio/test/test_bitmap.py | 44 - .../displayio/test/test_group.py | 174 - .../displayio/test/test_palette.py | 31 - .../displayio/test/test_tile_grid.py | 173 - src/base_circuitpython/displayio/tile_grid.py | 280 - src/base_circuitpython/fontio.py | 14 - src/base_circuitpython/fonts/ter-u12n.bdf | 25240 ------------ src/base_circuitpython/img/blinka.bmp | Bin 172856 -> 0 bytes src/base_circuitpython/neopixel_write.py | 55 - src/base_circuitpython/pulseio.py | 16 - src/base_circuitpython/terminal_handler.py | 108 - src/base_circuitpython/terminalio.py | 15 - src/base_circuitpython/test/__init__.py | 0 .../test/test_terminal_handler.py | 61 - src/check_if_venv.py | 11 - src/check_python_dependencies.py | 36 - src/clue/__init__.py | 1 - src/clue/adafruit_clue.py | 852 - src/clue/adafruit_display_text/label.py | 280 - src/clue/adafruit_slideshow.py | 407 - src/clue/test/__init__.py | 0 src/clue/test/img/test_clue_text_1.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_display_text_1.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_display_text_2.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_display_text_3.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_display_text_4.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_image_shapes_1.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_image_shapes_2.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_image_shapes_3.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_image_shapes_4.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_image_shapes_5.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_image_text_1.bmp | Bin 230454 -> 0 bytes src/clue/test/img/test_image_text_2.bmp | Bin 230454 -> 0 bytes src/clue/test/img/test_image_text_3.bmp | Bin 230454 -> 0 bytes src/clue/test/img/test_image_text_4.bmp | Bin 230454 -> 0 bytes src/clue/test/slideshow_pics/pic_1.bmp | Bin 113974 -> 0 bytes src/clue/test/slideshow_pics/pic_2.bmp | Bin 113974 -> 0 bytes src/clue/test/slideshow_pics/pic_3.bmp | Bin 330726 -> 0 bytes src/clue/test/slideshow_pics/pic_4.bmp | Bin 327414 -> 0 bytes src/clue/test/slideshow_pics/pic_5.bmp | Bin 225622 -> 0 bytes src/clue/test/slideshow_pics/pic_6.bmp | Bin 115818 -> 0 bytes src/clue/test/slideshow_pics/pic_7.bmp | Bin 93510 -> 0 bytes src/clue/test/slideshow_pics/pic_8.bmp | Bin 193734 -> 0 bytes src/clue/test/test_adafruit_clue.py | 193 - src/clue/test/test_adafruit_display_shapes.py | 81 - src/clue/test/test_adafruit_display_text.py | 65 - src/clue/test/test_adafruit_slideshow.py | 100 - src/clue/test/test_helpers.py | 32 - src/common/__init__.py | 0 src/common/constants.py | 12 - src/common/debugger_communication_client.py | 104 - src/common/telemetry.py | 35 - src/common/telemetry_events.py | 65 - src/common/test/__init__.py | 0 .../test_debugger_communication_client.py | 193 - src/common/test/test_utils.py | 32 - src/common/utils.py | 67 - src/constants.ts | 555 - src/cpxWorkspace.ts | 26 - src/debug_user_code.py | 95 - src/debugger/debugAdapter.ts | 49 - src/debugger/debugAdapterFactory.ts | 33 - src/debuggerCommunicationServer.ts | 140 - src/dev-requirements.txt | 3 - src/device.py | 121 - src/deviceContext.ts | 151 - src/extension.ts | 1101 - src/extension_utils/utils.ts | 233 - src/install_dependencies.py | 9 - src/latest_release_note.ts | 38 - src/micropython/__init__.py | 0 src/micropython/audio.py | 39 - src/micropython/microbit/__init__.py | 52 - .../microbit/__model/accelerometer.py | 136 - src/micropython/microbit/__model/button.py | 59 - src/micropython/microbit/__model/compass.py | 88 - src/micropython/microbit/__model/constants.py | 169 - src/micropython/microbit/__model/display.py | 369 - src/micropython/microbit/__model/i2c.py | 51 - src/micropython/microbit/__model/image.py | 539 - .../microbit/__model/microbit_model.py | 98 - .../microbit/__model/producer_property.py | 3 - src/micropython/microbit/__model/spi.py | 66 - src/micropython/microbit/test/__init__.py | 0 .../microbit/test/test_accelerometer.py | 104 - src/micropython/microbit/test/test_button.py | 46 - src/micropython/microbit/test/test_display.py | 185 - src/micropython/microbit/test/test_image.py | 283 - src/micropython/microbit/test/test_init.py | 45 - .../microbit/test/test_microbit_model.py | 48 - src/micropython/music.py | 109 - src/micropython/radio.py | 180 - src/micropython/speech.py | 61 - src/micropython/utime.py | 132 - src/process_user_code.py | 152 - src/python_constants.py | 55 - src/requirements.txt | 12 - src/serialMonitor.ts | 310 - src/serialPortControl.ts | 196 - src/service/PopupService.ts | 16 - src/service/debuggerCommunicationService.ts | 27 - src/service/deviceSelectionService.ts | 12 - src/service/fileSelectionService.ts | 95 - src/service/messagingService.ts | 37 - src/service/setupService.ts | 576 - src/service/telemetryHandlerService.ts | 556 - src/service/webviewService.ts | 112 - src/simulatorDebugConfigurationProvider.ts | 84 - src/telemetry/getPackageInfo.ts | 57 - src/telemetry/telemetryAI.ts | 83 - src/templates/clue_template.py | 16 - src/templates/cpx_template.py | 16 - src/templates/microbit_template.py | 11 - src/test/runTest.ts | 23 - src/test/suite/index.ts | 50 - src/usbDetector.ts | 112 - src/view/App.css | 16 - src/view/App.spec.tsx | 28 - src/view/App.tsx | 101 - src/view/__snapshots__/App.spec.tsx.snap | 11 - src/view/components/Button.tsx | 34 - src/view/components/Dropdown.tsx | 35 - src/view/components/clue/Clue.spec.tsx | 29 - src/view/components/clue/Clue.tsx | 158 - src/view/components/clue/ClueImage.tsx | 156 - src/view/components/clue/ClueSimulator.tsx | 304 - src/view/components/clue/Clue_svg.tsx | 1184 - .../clue/__snapshots__/Clue.spec.tsx.snap | 2202 -- .../components/cpx/Accessibility_utils.ts | 26 - src/view/components/cpx/Cpx.spec.tsx | 29 - src/view/components/cpx/Cpx.tsx | 104 - src/view/components/cpx/CpxImage.tsx | 406 - src/view/components/cpx/CpxSimulator.tsx | 392 - src/view/components/cpx/Cpx_svg.tsx | 3002 -- src/view/components/cpx/Cpx_svg_style.tsx | 302 - src/view/components/cpx/Svg_utils.tsx | 98 - .../cpx/__snapshots__/Cpx.spec.tsx.snap | 4666 --- .../components/microbit/Microbit.spec.tsx | 29 - src/view/components/microbit/Microbit.tsx | 130 - .../components/microbit/MicrobitImage.tsx | 166 - .../components/microbit/MicrobitSimulator.tsx | 259 - src/view/components/microbit/Microbit_svg.tsx | 1890 - .../__snapshots__/Microbit.spec.tsx.snap | 3238 -- src/view/components/simulator/ActionBar.tsx | 48 - .../toolbar/GenericSliderComponent.tsx | 41 - src/view/components/toolbar/Gesture.tsx | 71 - src/view/components/toolbar/InputSlider.tsx | 131 - src/view/components/toolbar/SensorButton.tsx | 46 - .../components/toolbar/SensorModalUtils.tsx | 176 - src/view/components/toolbar/ToolBar.tsx | 221 - src/view/components/toolbar/Toolbar.spec.tsx | 57 - .../__snapshots__/Toolbar.spec.tsx.snap | 143 - .../toolbar/clue/ClueModalContent.tsx | 318 - .../toolbar/clue/ClueSensorProperties.tsx | 216 - .../toolbar/cpx/CpxModalContent.tsx | 198 - .../toolbar/cpx/CpxSensorProperties.tsx | 71 - .../toolbar/microbit/MicrobitModalContent.tsx | 187 - .../microbit/MicrobitSensorProperties.tsx | 74 - src/view/constants.ts | 238 - src/view/container/device/Device.spec.tsx | 30 - src/view/container/device/Device.tsx | 42 - .../device/__snapshots__/Device.spec.tsx.snap | 3240 -- src/view/context.ts | 6 - src/view/index.css | 13 - src/view/index.tsx | 22 - .../gettingStarted.spec.tsx.snap | 901 - src/view/pages/gettingStarted.css | 56 - src/view/pages/gettingStarted.spec.tsx | 29 - src/view/pages/gettingStarted.tsx | 281 - .../debugger/debugger_vars.png | Bin 44993 -> 0 bytes .../debugger/debugging.gif | Bin 652131 -> 0 bytes .../debugger/start_debugging.jpg | Bin 51011 -> 0 bytes .../debugger/toolbar.png | Bin 4635 -> 0 bytes src/view/react-app-env.d.ts | 1 - src/view/styles/Button.css | 50 - src/view/styles/Dropdown.css | 24 - src/view/styles/InputSlider.css | 103 - src/view/styles/LightSensorBar.css | 20 - src/view/styles/MotionSensorBar.css | 20 - src/view/styles/SensorButton.css | 29 - src/view/styles/Simulator.css | 83 - src/view/styles/SimulatorSvg.css | 290 - src/view/styles/TemperatureSensorBar.css | 18 - src/view/styles/ToolBar.css | 182 - src/view/svgs/arrow_right_svg.tsx | 21 - src/view/svgs/close_svg.tsx | 26 - src/view/svgs/play_svg.tsx | 19 - src/view/svgs/refresh_svg.tsx | 21 - src/view/svgs/stop_svg.tsx | 21 - src/view/svgs/tag_input_svg.tsx | 27 - src/view/svgs/tag_output_svg.tsx | 26 - src/view/svgs/toolbar_svg.tsx | 740 - src/view/translations/en.json | 112 - src/view/tsconfig.json | 19 - src/view/utils/MessageUtils.tsx | 12 - src/view/viewUtils.tsx | 33 - src/vscode_import.ts | 3 - 279 files changed, 100734 deletions(-) delete mode 100644 .github/CODEOWNERS delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/ci.yml delete mode 100644 .prettierrc.yaml delete mode 100644 Source/adafruit_circuitplayground/test/__init__.py delete mode 100644 Source/adafruit_circuitplayground/test/sample.mp4 delete mode 100644 Source/adafruit_circuitplayground/test/sample.wav delete mode 100644 Source/adafruit_circuitplayground/test/test_express.py delete mode 100644 Source/adafruit_circuitplayground/test/test_pixel.py delete mode 100644 Source/base_circuitpython/displayio/test/__init__.py delete mode 100644 Source/base_circuitpython/displayio/test/img/group_test_result.bmp delete mode 100644 Source/base_circuitpython/displayio/test/test_bitmap.py delete mode 100644 Source/base_circuitpython/displayio/test/test_group.py delete mode 100644 Source/base_circuitpython/displayio/test/test_palette.py delete mode 100644 Source/base_circuitpython/displayio/test/test_tile_grid.py delete mode 100644 Source/base_circuitpython/test/__init__.py delete mode 100644 Source/base_circuitpython/test/test_terminal_handler.py delete mode 100644 Source/clue/test/__init__.py delete mode 100644 Source/clue/test/img/test_clue_text_1.bmp delete mode 100644 Source/clue/test/img/test_display_text_1.bmp delete mode 100644 Source/clue/test/img/test_display_text_2.bmp delete mode 100644 Source/clue/test/img/test_display_text_3.bmp delete mode 100644 Source/clue/test/img/test_display_text_4.bmp delete mode 100644 Source/clue/test/img/test_image_shapes_1.bmp delete mode 100644 Source/clue/test/img/test_image_shapes_2.bmp delete mode 100644 Source/clue/test/img/test_image_shapes_3.bmp delete mode 100644 Source/clue/test/img/test_image_shapes_4.bmp delete mode 100644 Source/clue/test/img/test_image_shapes_5.bmp delete mode 100644 Source/clue/test/img/test_image_text_1.bmp delete mode 100644 Source/clue/test/img/test_image_text_2.bmp delete mode 100644 Source/clue/test/img/test_image_text_3.bmp delete mode 100644 Source/clue/test/img/test_image_text_4.bmp delete mode 100644 Source/clue/test/slideshow_pics/pic_1.bmp delete mode 100644 Source/clue/test/slideshow_pics/pic_2.bmp delete mode 100644 Source/clue/test/slideshow_pics/pic_3.bmp delete mode 100644 Source/clue/test/slideshow_pics/pic_4.bmp delete mode 100644 Source/clue/test/slideshow_pics/pic_5.bmp delete mode 100644 Source/clue/test/slideshow_pics/pic_6.bmp delete mode 100644 Source/clue/test/slideshow_pics/pic_7.bmp delete mode 100644 Source/clue/test/slideshow_pics/pic_8.bmp delete mode 100644 Source/clue/test/test_adafruit_clue.py delete mode 100644 Source/clue/test/test_adafruit_display_shapes.py delete mode 100644 Source/clue/test/test_adafruit_display_text.py delete mode 100644 Source/clue/test/test_adafruit_slideshow.py delete mode 100644 Source/clue/test/test_helpers.py delete mode 100644 Source/common/test/__init__.py delete mode 100644 Source/common/test/test_debugger_communication_client.py delete mode 100644 Source/common/test/test_utils.py delete mode 100644 Source/micropython/microbit/test/__init__.py delete mode 100644 Source/micropython/microbit/test/test_accelerometer.py delete mode 100644 Source/micropython/microbit/test/test_button.py delete mode 100644 Source/micropython/microbit/test/test_display.py delete mode 100644 Source/micropython/microbit/test/test_image.py delete mode 100644 Source/micropython/microbit/test/test_init.py delete mode 100644 Source/micropython/microbit/test/test_microbit_model.py delete mode 100644 Source/test/runTest.ts delete mode 100644 Source/test/suite/index.ts delete mode 100644 jest.config.js delete mode 100644 package-lock.json delete mode 100644 src/adafruit_circuitplayground/__init__.py delete mode 100644 src/adafruit_circuitplayground/constants.py delete mode 100644 src/adafruit_circuitplayground/express.py delete mode 100644 src/adafruit_circuitplayground/locale/en/LC_MESSAGES/express.po delete mode 100644 src/adafruit_circuitplayground/locale/express.pot delete mode 100644 src/adafruit_circuitplayground/pixel.py delete mode 100644 src/adafruit_circuitplayground/test/__init__.py delete mode 100644 src/adafruit_circuitplayground/test/sample.mp4 delete mode 100644 src/adafruit_circuitplayground/test/sample.wav delete mode 100644 src/adafruit_circuitplayground/test/test_express.py delete mode 100644 src/adafruit_circuitplayground/test/test_pixel.py delete mode 100644 src/base_circuitpython/__init__.py delete mode 100644 src/base_circuitpython/base_cp_constants.py delete mode 100644 src/base_circuitpython/board.py delete mode 100644 src/base_circuitpython/digitalio.py delete mode 100644 src/base_circuitpython/displayio/__init__.py delete mode 100644 src/base_circuitpython/displayio/bitmap.py delete mode 100644 src/base_circuitpython/displayio/color_type.py delete mode 100644 src/base_circuitpython/displayio/constants.py delete mode 100644 src/base_circuitpython/displayio/group.py delete mode 100644 src/base_circuitpython/displayio/palette.py delete mode 100644 src/base_circuitpython/displayio/test/__init__.py delete mode 100644 src/base_circuitpython/displayio/test/img/group_test_result.bmp delete mode 100644 src/base_circuitpython/displayio/test/test_bitmap.py delete mode 100644 src/base_circuitpython/displayio/test/test_group.py delete mode 100644 src/base_circuitpython/displayio/test/test_palette.py delete mode 100644 src/base_circuitpython/displayio/test/test_tile_grid.py delete mode 100644 src/base_circuitpython/displayio/tile_grid.py delete mode 100644 src/base_circuitpython/fontio.py delete mode 100644 src/base_circuitpython/fonts/ter-u12n.bdf delete mode 100644 src/base_circuitpython/img/blinka.bmp delete mode 100644 src/base_circuitpython/neopixel_write.py delete mode 100644 src/base_circuitpython/pulseio.py delete mode 100644 src/base_circuitpython/terminal_handler.py delete mode 100644 src/base_circuitpython/terminalio.py delete mode 100644 src/base_circuitpython/test/__init__.py delete mode 100644 src/base_circuitpython/test/test_terminal_handler.py delete mode 100644 src/check_if_venv.py delete mode 100644 src/check_python_dependencies.py delete mode 100644 src/clue/__init__.py delete mode 100644 src/clue/adafruit_clue.py delete mode 100644 src/clue/adafruit_display_text/label.py delete mode 100644 src/clue/adafruit_slideshow.py delete mode 100644 src/clue/test/__init__.py delete mode 100644 src/clue/test/img/test_clue_text_1.bmp delete mode 100644 src/clue/test/img/test_display_text_1.bmp delete mode 100644 src/clue/test/img/test_display_text_2.bmp delete mode 100644 src/clue/test/img/test_display_text_3.bmp delete mode 100644 src/clue/test/img/test_display_text_4.bmp delete mode 100644 src/clue/test/img/test_image_shapes_1.bmp delete mode 100644 src/clue/test/img/test_image_shapes_2.bmp delete mode 100644 src/clue/test/img/test_image_shapes_3.bmp delete mode 100644 src/clue/test/img/test_image_shapes_4.bmp delete mode 100644 src/clue/test/img/test_image_shapes_5.bmp delete mode 100644 src/clue/test/img/test_image_text_1.bmp delete mode 100644 src/clue/test/img/test_image_text_2.bmp delete mode 100644 src/clue/test/img/test_image_text_3.bmp delete mode 100644 src/clue/test/img/test_image_text_4.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_1.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_2.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_3.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_4.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_5.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_6.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_7.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_8.bmp delete mode 100644 src/clue/test/test_adafruit_clue.py delete mode 100644 src/clue/test/test_adafruit_display_shapes.py delete mode 100644 src/clue/test/test_adafruit_display_text.py delete mode 100644 src/clue/test/test_adafruit_slideshow.py delete mode 100644 src/clue/test/test_helpers.py delete mode 100644 src/common/__init__.py delete mode 100644 src/common/constants.py delete mode 100644 src/common/debugger_communication_client.py delete mode 100644 src/common/telemetry.py delete mode 100644 src/common/telemetry_events.py delete mode 100644 src/common/test/__init__.py delete mode 100644 src/common/test/test_debugger_communication_client.py delete mode 100644 src/common/test/test_utils.py delete mode 100644 src/common/utils.py delete mode 100644 src/constants.ts delete mode 100644 src/cpxWorkspace.ts delete mode 100644 src/debug_user_code.py delete mode 100644 src/debugger/debugAdapter.ts delete mode 100644 src/debugger/debugAdapterFactory.ts delete mode 100644 src/debuggerCommunicationServer.ts delete mode 100644 src/dev-requirements.txt delete mode 100644 src/device.py delete mode 100644 src/deviceContext.ts delete mode 100644 src/extension.ts delete mode 100644 src/extension_utils/utils.ts delete mode 100644 src/install_dependencies.py delete mode 100644 src/latest_release_note.ts delete mode 100644 src/micropython/__init__.py delete mode 100644 src/micropython/audio.py delete mode 100644 src/micropython/microbit/__init__.py delete mode 100644 src/micropython/microbit/__model/accelerometer.py delete mode 100644 src/micropython/microbit/__model/button.py delete mode 100644 src/micropython/microbit/__model/compass.py delete mode 100644 src/micropython/microbit/__model/constants.py delete mode 100644 src/micropython/microbit/__model/display.py delete mode 100644 src/micropython/microbit/__model/i2c.py delete mode 100644 src/micropython/microbit/__model/image.py delete mode 100644 src/micropython/microbit/__model/microbit_model.py delete mode 100644 src/micropython/microbit/__model/producer_property.py delete mode 100644 src/micropython/microbit/__model/spi.py delete mode 100644 src/micropython/microbit/test/__init__.py delete mode 100644 src/micropython/microbit/test/test_accelerometer.py delete mode 100644 src/micropython/microbit/test/test_button.py delete mode 100644 src/micropython/microbit/test/test_display.py delete mode 100644 src/micropython/microbit/test/test_image.py delete mode 100644 src/micropython/microbit/test/test_init.py delete mode 100644 src/micropython/microbit/test/test_microbit_model.py delete mode 100644 src/micropython/music.py delete mode 100644 src/micropython/radio.py delete mode 100644 src/micropython/speech.py delete mode 100644 src/micropython/utime.py delete mode 100644 src/process_user_code.py delete mode 100644 src/python_constants.py delete mode 100644 src/requirements.txt delete mode 100644 src/serialMonitor.ts delete mode 100644 src/serialPortControl.ts delete mode 100644 src/service/PopupService.ts delete mode 100644 src/service/debuggerCommunicationService.ts delete mode 100644 src/service/deviceSelectionService.ts delete mode 100644 src/service/fileSelectionService.ts delete mode 100644 src/service/messagingService.ts delete mode 100644 src/service/setupService.ts delete mode 100644 src/service/telemetryHandlerService.ts delete mode 100644 src/service/webviewService.ts delete mode 100644 src/simulatorDebugConfigurationProvider.ts delete mode 100644 src/telemetry/getPackageInfo.ts delete mode 100644 src/telemetry/telemetryAI.ts delete mode 100644 src/templates/clue_template.py delete mode 100644 src/templates/cpx_template.py delete mode 100644 src/templates/microbit_template.py delete mode 100644 src/test/runTest.ts delete mode 100644 src/test/suite/index.ts delete mode 100644 src/usbDetector.ts delete mode 100644 src/view/App.css delete mode 100644 src/view/App.spec.tsx delete mode 100644 src/view/App.tsx delete mode 100644 src/view/__snapshots__/App.spec.tsx.snap delete mode 100644 src/view/components/Button.tsx delete mode 100644 src/view/components/Dropdown.tsx delete mode 100644 src/view/components/clue/Clue.spec.tsx delete mode 100644 src/view/components/clue/Clue.tsx delete mode 100644 src/view/components/clue/ClueImage.tsx delete mode 100644 src/view/components/clue/ClueSimulator.tsx delete mode 100644 src/view/components/clue/Clue_svg.tsx delete mode 100644 src/view/components/clue/__snapshots__/Clue.spec.tsx.snap delete mode 100644 src/view/components/cpx/Accessibility_utils.ts delete mode 100644 src/view/components/cpx/Cpx.spec.tsx delete mode 100644 src/view/components/cpx/Cpx.tsx delete mode 100644 src/view/components/cpx/CpxImage.tsx delete mode 100644 src/view/components/cpx/CpxSimulator.tsx delete mode 100644 src/view/components/cpx/Cpx_svg.tsx delete mode 100644 src/view/components/cpx/Cpx_svg_style.tsx delete mode 100644 src/view/components/cpx/Svg_utils.tsx delete mode 100644 src/view/components/cpx/__snapshots__/Cpx.spec.tsx.snap delete mode 100644 src/view/components/microbit/Microbit.spec.tsx delete mode 100644 src/view/components/microbit/Microbit.tsx delete mode 100644 src/view/components/microbit/MicrobitImage.tsx delete mode 100644 src/view/components/microbit/MicrobitSimulator.tsx delete mode 100644 src/view/components/microbit/Microbit_svg.tsx delete mode 100644 src/view/components/microbit/__snapshots__/Microbit.spec.tsx.snap delete mode 100644 src/view/components/simulator/ActionBar.tsx delete mode 100644 src/view/components/toolbar/GenericSliderComponent.tsx delete mode 100644 src/view/components/toolbar/Gesture.tsx delete mode 100644 src/view/components/toolbar/InputSlider.tsx delete mode 100644 src/view/components/toolbar/SensorButton.tsx delete mode 100644 src/view/components/toolbar/SensorModalUtils.tsx delete mode 100644 src/view/components/toolbar/ToolBar.tsx delete mode 100644 src/view/components/toolbar/Toolbar.spec.tsx delete mode 100644 src/view/components/toolbar/__snapshots__/Toolbar.spec.tsx.snap delete mode 100644 src/view/components/toolbar/clue/ClueModalContent.tsx delete mode 100644 src/view/components/toolbar/clue/ClueSensorProperties.tsx delete mode 100644 src/view/components/toolbar/cpx/CpxModalContent.tsx delete mode 100644 src/view/components/toolbar/cpx/CpxSensorProperties.tsx delete mode 100644 src/view/components/toolbar/microbit/MicrobitModalContent.tsx delete mode 100644 src/view/components/toolbar/microbit/MicrobitSensorProperties.tsx delete mode 100644 src/view/constants.ts delete mode 100644 src/view/container/device/Device.spec.tsx delete mode 100644 src/view/container/device/Device.tsx delete mode 100644 src/view/container/device/__snapshots__/Device.spec.tsx.snap delete mode 100644 src/view/context.ts delete mode 100644 src/view/index.css delete mode 100644 src/view/index.tsx delete mode 100644 src/view/pages/__snapshots__/gettingStarted.spec.tsx.snap delete mode 100644 src/view/pages/gettingStarted.css delete mode 100644 src/view/pages/gettingStarted.spec.tsx delete mode 100644 src/view/pages/gettingStarted.tsx delete mode 100644 src/view/pages/gettingStartedPictures/debugger/debugger_vars.png delete mode 100644 src/view/pages/gettingStartedPictures/debugger/debugging.gif delete mode 100644 src/view/pages/gettingStartedPictures/debugger/start_debugging.jpg delete mode 100644 src/view/pages/gettingStartedPictures/debugger/toolbar.png delete mode 100644 src/view/react-app-env.d.ts delete mode 100644 src/view/styles/Button.css delete mode 100644 src/view/styles/Dropdown.css delete mode 100644 src/view/styles/InputSlider.css delete mode 100644 src/view/styles/LightSensorBar.css delete mode 100644 src/view/styles/MotionSensorBar.css delete mode 100644 src/view/styles/SensorButton.css delete mode 100644 src/view/styles/Simulator.css delete mode 100644 src/view/styles/SimulatorSvg.css delete mode 100644 src/view/styles/TemperatureSensorBar.css delete mode 100644 src/view/styles/ToolBar.css delete mode 100644 src/view/svgs/arrow_right_svg.tsx delete mode 100644 src/view/svgs/close_svg.tsx delete mode 100644 src/view/svgs/play_svg.tsx delete mode 100644 src/view/svgs/refresh_svg.tsx delete mode 100644 src/view/svgs/stop_svg.tsx delete mode 100644 src/view/svgs/tag_input_svg.tsx delete mode 100644 src/view/svgs/tag_output_svg.tsx delete mode 100644 src/view/svgs/toolbar_svg.tsx delete mode 100644 src/view/translations/en.json delete mode 100644 src/view/tsconfig.json delete mode 100644 src/view/utils/MessageUtils.tsx delete mode 100644 src/view/viewUtils.tsx delete mode 100644 src/vscode_import.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 7bd16fe97..000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,3 +0,0 @@ -# At least one of the code owners below will be required on each PR: - -* @markAtMicrosoft @smmatte @adclements @abmahdy @iennae @nasadigital @isadorasophia @sagarmanchanda diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index ef9bbe450..000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,33 +0,0 @@ -# Description: - -Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. - -## Type of change - -Please delete options that are not relevant. - -- [ ] Bug fix (non-breaking change which fixes an issue) -- [ ] New feature (non-breaking change which adds functionality) -- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) -- [ ] This change requires a documentation update - -# Limitations: - -Please describe limitations of this PR - -# Testing: - -Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration - -- [ ] Test A -- [ ] Test B - -# Checklist: - -- [ ] My code follows the style guidelines of this project -- [ ] My code has been formatted with `npm run format` and passes the checks in `npm run check` -- [ ] I have performed a self-review of my own code -- [ ] I have commented my code, particularly in hard-to-understand areas -- [ ] I have made corresponding changes to the documentation -- [ ] My changes generate no new warnings -- [ ] Any dependent changes have been merged and published in downstream modules diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 93eb4fa78..000000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,52 +0,0 @@ -# This workflow will do a clean install of node dependencies, python dependencies, build the source code and run tests - -name: CI - -on: - push: - branches: [ dev, staging ] - pull_request: - branches: [ dev, staging ] - -jobs: - build-and-test: - - runs-on: ${{ matrix.os }} - - strategy: - fail-fast: false - matrix: - os: [macos-latest, windows-latest, ubuntu-18.04] - node-version: [10.x] - - steps: - - uses: actions/checkout@v2 - - name: Install Linux dependencies - if: matrix.os == 'ubuntu-18.04' - run: | - sudo apt-get update - sudo apt-get install g++-multilib - sudo apt-get install -y build-essential - sudo apt-get install libudev-dev - - name: Use Node.js ${{ matrix.node-version }} and install npm dependencies - uses: actions/setup-node@v2 - with: - node-version: ${{ matrix.node-version }} - - run: npm install - - name: Setup Python environment - uses: actions/setup-python@v2 - with: - python-version: 3.x - - run: | - python -m pip install --upgrade pip - pip install -r ./src/dev-requirements.txt - - name: Use npm to compile, format-check and test - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - run: npm run compile - - run: npm run check - - name: Run tests - uses: GabrielBB/xvfb-action@v1.0 - with: - run: npm run test diff --git a/.prettierrc.yaml b/.prettierrc.yaml deleted file mode 100644 index 5379f1e00..000000000 --- a/.prettierrc.yaml +++ /dev/null @@ -1,5 +0,0 @@ -trailingComma: "es5" -tabWidth: 4 -semi: true -endOfLine: auto -printWidth: 80 \ No newline at end of file diff --git a/Source/adafruit_circuitplayground/test/__init__.py b/Source/adafruit_circuitplayground/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/Source/adafruit_circuitplayground/test/sample.mp4 b/Source/adafruit_circuitplayground/test/sample.mp4 deleted file mode 100644 index ed139d6d50cc43f89c27392621f20d174d0bf051..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1055736 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

Aa@|$FDt-+LPp7ZlZYEj+U-s{? zKADR3&zcOdRx3$3$87U!PPpb?h!v-}!$veG^PT2DOEJI`XqkMPMYJjg3XI2BGj6OY z&bR}+Bf`(H$LoI(PgvJO_YdA=_HR zYxp^H3LPGeIZ#v#P=H;}a6#wV{)v1_@?MQ7ZJy~6hK+kAAWXcmf;QLn9hod^QqQc- zS1>+Q2c&hod;d2qX$+HI`zJg_N_T4t1?GP8z)%>UA@$vh0QNzLRwJ!a z=}t7vMVvfsx@J&*DX7Dh(#+xZ<2{T3=|y199V#^6OD!w(uAf_Gg$4WaNNTQ%{Cj5v)TUYAeOFQ!L=K zo{g1#s|y)AXplem%Q?*e?KY~AJPf_iVRTaBZ+vul2 z6W9#O(%8sMY}bT&NgOrkkOUFL#Z!#}ZtMn@@Ogj=q?s;X3LD z%^dDqd^@mJS#d7oHPjvho?)dTQ*B%id|gye%4Q09ALj*OS}jyBzP85 z{yX0zx4K#%Od^D0{+w7f>biGkyg3185V|-fnZLHJ?VD^W;x+!BZOarz?}0PESM3z% z8vX1IM7sS|;RYq~)qNG^CHvdX_SqFxIcu(Oj~Ay{-kEK$);sg>alJZ*G#EcE=YZ85 z*EiTq-8^OCj9|#FazP#d>1e^5Wg6hH2N`+}^NjzKkV$$my2+sWJy#420h*G%ga67? z?v!?g`MEr0nuTgP)^<||QsOs=?2CWRJmh*+P(~TSeLi!_52`DiK5OP5mWV64G{2P* z?pY{z))tkG_c;bciHw2`bwv4P$DX~kVY$hg^_lx5a@fJ8F~7Z{+YubZhrPPz$IgUyOINHZa1cL2T@(|v+k6assWYqzc0VA%-8V);er|8t zt}<>YgC?Q8@;K}10c!c9dDRM9)p1=bc69)}hg4$I`(Ua3kBKdq%dMJK+!1>g3 z{I?vlPY9zaiO(Cu9_lj)I?2dXOuS2P0RpTeZT*>)G&)XYFhwOA%qi1#7(`TUY;9Wl z=Yk$6+Sy7Gm`9!(J!lwquy@MWS)?wNYg$ui|M3)N5~g|@Ssu?r#;%J-4KQwpr9wGU zJj^^^G9u4=3(Y$HR)I}^`Ygxy&r|M~t$V%$S>D=;#4-SBc>KG%l}Ihm0M;H2U=o2+ zIP%F5O_Gxz(l7dO$6(#s7-0~bd=%Ti!Z9Hd$4BD}+OpIp?W=3Aog^G-K9B7hsp|*ghc#I6 zi!sTo#(=EV0C)nlz32h2f^DcVS}o zu1UD&?rfp)>12M62M0r={=?(pfxaEJ!=*#B zP5C?v6Alil2q#KCm75%kY@yj0(;f&M#$c|uDbhGh+J#EkbJabPH*r_+x&DFgWnG^H z{E^2XUmpqCq^ayYId#2#`MHRtIfKqBFqa#S^{1r<;>t+3TuJ$ec@TD&#h(`(Es6-8 zPlLtja2LKgq(r6wQLD4>RA&~WsGS!Z)&aW}O0hCkpaiKjd}opK5u;^7x|ucNWwt`= zeJ`_pZ5fc*>{nc6Z(;Z0LgreDSquq_PKr-~)}b7oTl^uJJ zb{d(;e=3>j2Np@!4R3mws<~xBP2SGC;+);{KWQB2uRI>|aohiztoZ754bf~wCe}0- z1FO8#ym}Zc^N7sTEwve3dGV|S!r#=@Nh`8hP%|d4m(5NB=6#2pBQO~TRbnL80ohv^ z-+e?0@^Wcn+LVAP>Ao?&cS6`i8!r-WhGH%|*}y;jGNG5X?_YmvCIB+1&)y)rPyJFF zLwvQ6$_CA6v0FfZ0ym|#Ybn@P&lY;(dA=6WJya?C!4D&@C*Y+?et2;{hUtULW>BM} zOJu$#3TENjh*+4P5ntUu>0-q?9iWo){l+xEUT`Ap6mNlH+q6_$V2mP8^QA1YDQ_s>KM{++eIhR4f-ruDDN5*Er+WvAO8&3n&Qr)dNr#J2fD7k@H=BxNr- z;7zh&+P2+h*{_~K311r0u-ZE*3g?S zEpOexZiV&OK_A4wAQg?czNqQ5fctoW z<|Z~CPEDoQiP!8*Rgj#cGd1c}DVH(^yE1p})GjtAsA!Dv_VMCGv#d}zT59{=CEl{b zJ_jgllRLbbqDoJ32MqFIY!4|5>DtP4c;Sny=GbXGIu&S!xE!GmMR*(7WxMxVpem2M z)p9hOf_-MqW=3RjSFqLZq*!~j+W(thCp2n)IdGb zN;;(ZgQ!uy@`bv5!aG3%G0x@P1-sXt>vU|26XH!jV+e$Snng}|3+tvM-La6JV&)yg zTlhS%^gpsxKns#Eq{SX(vE`jeJSTRkpWWm>u)r?mK|0JytN+W>Q0`VL7 zWqq!nYUNRkQIi-7;CS0@(Q9>_!ySSVal6Sc82vDI@YK4j8>^D^MsMc_^2(lgBre8!sM0BDd&Iv)R+myq(5^S^+ewtciH)VK8kI_hLON+-wcOc$TTsRL)dV{pM!4E<>*U;l)p z|6jsL#%=#B9!)#H;SUP}5WEs8zpQ4sG%?5N_aCzc-7EDcb@a(XhTG2nd%UVKt9#H@VXE#K+&VU9npr>Z z6?rRQv5h^^&V;=iQ(QsjlR=S}HkK6&-q-?TcEZQ_`Sfd3iR+vEOA*91k@ZX zBnuLR#X!KAP!<{uf`c%M8GYXFyP9>`D@?gaMB%C;!?A7q^?%Is-!IN@-{mqM4~3Dh z&G}K?mQTY@b7PN^eRg5-PxuK0U#p_6mi;U0>K3!k$kR}!l2(~LM>Ct4!YzCoe*P&?Y4Tzneq~sOpZ8(JA_8knP z#a706|3I23?0(+Qo`7mzf>ByRgOryC?CjA|(#CN!xm69~drO}Z2W5LhG>fpz8r*8;do6c1o0 zNv;tp6bglgp>WWcbR-J~LV|FxP&5=Mr~=k&zmHEB(chJG)+S4fMcR_IA8+)x)2jOP zU$5$4cIT*Pts33(y!2=Y=hhNqU+d?fJecG=jWm~D?6RG|uj!hfjr0Flptd;sG}&b6 zfnKEZelNjF&y5-gAPxi#YB$V(Ua+8hTH}v*O}-Yrvw9e>q)kf7Q_Vl8lz2BZR~7VM z99)&r@E~3jlF}FWAYRL50Wb5oRIKWVa)hE-5w!=;?f3nC*@XdNz*sOg3!Eq9cj! zn*WXdq;$n%-4?4PybB$Q*S#>>8c6Y5z}AMWKRXf5vL`Kt^C#(ch`kcY%cTXHqNHUu zzv~;o9?&c}6NUo8fiR#fcncWh5|tq@Rb@$`|9u~?M7_@MQ!%gUYlCF8>up3ZbMsbBTA z3wd~q+%ocP}NiPJ23M?Sk^X1OoQ-mAOz)Lv<7>?>Y`8>QsT3LY6qth4tev^4dd zoFZSdbZw&M+ZM^&LCG*7T&7Z*q0MvC_i)Kh3J*}#Joe(6)7X-^B9c9ADX_w@T26b@ zqwv1t3VM7l6zn8DZJ$H!K7YaT}-Ody;l^gH2cbaixJX{rD>V3FwKB@`=ph}@oHQHfy4 zDw;`A1zjULclN`s)@wVLC+*<` zZMtbf#SPi}u6!CO`j3@I99@A(lXjAwwE|$zIbXc8Q|zGPM^Lq&oJOM}2~pa{vMaP^ z)_cu-k{w<0ygpcZ?&K5T`_?abUf$uLypkwP7TAk?nQw$7_ZWQ*yLLw7wmmpa3fgi& zZzYF+O;_@KPBptn2p|`xzcq))7lwQj3ah9t*lC?#4O>buQLRU6w-OIN_LTOUdAg}# zER853o&fh<`ua7axi-brV}DU3X-)hRr^K(5e8A4Na)OlDX*v`-F}__AUI}T8T)B7T zqLn*M*V<10SXitC>AvZih^*^SSS|?34(%9pv)qa%Dk8Jd`ipX zxh86=u1w*@NtYlezxbo?<+oLI@9j@7B7NtNur=G{PIP+eqt{iFWB2`k|NrTCsbTuZ zlyGC~4;T0}z1Gk8t+>N4!~DkGsyA&`3*7h1^l4O^TVc-iF9J7SGF$o~KlE~)X@2~* zS?&)@?E72-a|XZ)Vz}si8a!9H1kl?wKWC9m6wD#N!;ATD1~`fkiQ^POeMILu2jxHs z=@3HLK!hkiXOI8?@r)D_g$Y7nprkYu3x-1hP`Fem7YPhn<2b^7S{PWZO1MZEmn9~a$1{4>?sX|en%zxm#d$z9*iGcV?ludeomOA#UP z#Is5~zJkXeT~W8=)O((IE~x(&amlT}=Yo9Haf`O2rlqeMm1WI8NJFU}>`D?88 z*B#eWnXSvRwRIP{t_Feiz9QNWz5bt&`2*h9s7&;ahpFt0*?GlJ{a^b(wew!6N&lIf zouBJIuiMg&EEcvXj?dLwX=p%d^s2gTCFq|^hQ2Lp$d>-0-#@*j=`qmQJ0Cn2se8NB zp#!j~#5-`c&lRqK$YHZm%f~dS8wuf&NuxFO7Lrg&bS+>XRM1-;h6M#^!L*nmv;<*6 z{Xh7h?R!A6AWS$576QV6uwZOd5QRb_K#0sQezUo~7G#1=#U`p-ted&du>4Q9)ADft ze!dfPvNgV6fA8h~snR0O58_AN^{&2)=<4!k-(QBt^Y;$?8kuhV_}DkL`Q-2hq%SVd z;ymzrX4E}VvN?#B{YHf(urU30|6`E^ya>?7yKJY08zrMI-TRjJ8a(}*KOaub`gp~a zjdt5Tw1ZEN(h9?g5%VZ9i04TPF58&t*kiw)4#~AoiV3jr)SCk0DJ>Ug6%QhImbmLc zNbP5p%lo{ER$3OUgtFqSBIh;xnp6k|3I&S+pum{0CQ1;3C~@MKx~ogwvMojAvgEl! z#rwZhlkM5tpHhAA`q^d`zxkd`w&=v=ukW&qAGh6Cmu{4+-6!(%mqDEZp@TzY&rt5_ zZrv8w+&iU?sa{SPj(aldtF3$GIHvrj?|0C>tXgj6V2v~^=}q#zG6p)f@sVsn1|GJu zv|pC*w_hl?ef7VaPHr?ow6v#FqFCPz=A?%lS+8bzO9dyyBYZ5aZ){jrO?!0zAv(ow zGeQbB2W9tzS-Jy&S&~Fq5t7B zOM(C9DDES=e#IQvi&;)!E?!Gs66@y|%o>Hpq@c?2!}m_p#zBQmCn!u>>ziUgt(oOv zps|!_>5vqU>;VZ-ZP(v_e&X0Dc?|`Ef{?IKE*T630^xwLTqqI=gj(wk_}}gR-*0OB zamRD@&!4|L;!A6uCE{~*7oYL}Y55*uqqrSd{wJNi^+fTcgT8@%djI5W(yR3XDbMFs zCwH~$s>^*~_~e){UcdHhBuGsJfU{T_TlVsM{O**r87j>)+m%wSI`sQkSlezk!sT?Q zQ?5pF<>MQL?3BVd02Vj~nurh*qyelAfN7^Ife67su@F)i3l4(;VL*^D6blAIp+JyO zBoR;r>xX}S@9jLV=i$8b%Zu^CNV}-3s}^(qth>A!dpJ+{tucR*`}Md79qu6fp6i(cQ%`L2`OMI3S7^HW z0Jrq~RVc0x4vTayi{FbwR`vw7KIV>h_Q_ReHYm}_d|)`j6G>@I1;0=u?5I&JDnWFL z-j@P0pz)di{(rwPpiDRm5(dG6GSFg$JJ#(w^*HX?X;D>iB~3|^riVNIqLyS$FK_L` z|8(zvPd{Z|zVGkzw>JO(D6#G}8#7~*{^gKrGU4AiqPI*<7OI5rH&s0(lFVrA!YR-C z?UNq~ciEK><@Rs0=4~9Ayb?~Ts~mw{@ajF4p8<%Jrf*kf|S)kXNolVM-;*Ni3VZ7SWp%^1%!fNphzNc3V58l=QS^N!*@{vO0>C2 zAU(hQ0SML*4slAE3* z#(s^hqpWOi40Vt|PWB|eAUW1b@Bs$$=TgGF;4?28Xaedj<-Yw$ca8)ey4|+`&Og-8 zkjRXWLg2#Cpc_hQg`Kv}m2t4TsPXJ+{#^b-^n*{W?Rf<(XW#!7&Oa+avm zGY!t}=?0*Z6Hg61eMhIzvGA)-6S@AAX_9xr671~d1N}Lu+tg`sy|x}s(mmTA#VhDb zZxbgWfBo9vY1yF@6j>r3ykTl{gHUG##B_|^s!Xb2fiq{q_e@Z)M3QHw z;xg*kW-g&)`DA) zIJi#nzsgV7XId=Z(bo|*kA6Y79W^BrnKcMMjC24 zBc?Pc1}RatPH+_1Y-yI>wYUIC!+4QY*;sk#VQpQ&ObRxN?-?GN_}#S|*-c0Hd;t6j~{zR_0oY+TdGAa|-i&VvN$19fjU*6kE5*0YMC@!68gX$A7 z@koMHH0D?D@L$n((=bdJJgafOPA-X|bb|nt^L@s#LYIfQ3BJP(`U_mByMj2cyhcZ9 zB55ln(r8_WZ6Q2Kz-B%jdOf5>!2zh4n)-7e>U|y;bv0d49K!+XFb&_%y;R!C(8BR_ z-*3OV8F*cFX90vCiAc%tjI2u1Qkhoq#gk3Rc^sWs+~9JrLEzgYxj(vF+hPw8J~u*$ zof-s;@xh`{10b=;LEidBirmV5p+@}|ybYKzL_0%&n z`#G*I$dKx63QK7Oi#N4TUP*$LgcQ_n*dkq8(Fo6?%hSy8P~T7k?qRCE#n3(~_*r1C zg4l7=(E$IlWF64lii%^SnATeBcBAAC-wNblBZ*%d&3e-RP_u&Lq`Aq0j*R z-tJI7;T*X`Ds{F{8vc|Cr7A`_xLFK|d%IoWCqb|!@ifvnBWPsRx<7>qHLjVwHw6R~ z0$hVi6ng$F=qrI3u0f%-pk6wI3Z*V+uVKU|{xT9+^~}R`X*(F1M7i_~e_YCJ@0=RE zo%mg0a);!*`m=73y6+n#VAJjy0SZQ_o6X_+^3-0rgHET`gg$*gch5lN#7PzVBR!@= zv`keg)Y9l@1fT<#t||>ON|jpp$6M~AOub1BKMA+CY=?ef5%UcjK9^9NapRz~wHa*) zXPzM+Mtn$v}pIX{c|I3i8)De zlVI>bpxwCI^n8a6j$6{Y^NxquJlBx0gG@^>YR5tTa{!P??Skf@+FSV7yyW7e)x_9> z;z(J9%r(C5|H4p?v1r;WCe<3T-%UuE#81$i^*pv0_EYNkecK@rFZ*8p`ZC(!#c0+L z$tw-vu|X|n@vRsyl&MRLxP!g4;tjoj<;cwP0BBkD^L&rUS2kJ{E@JB51Iu{xgu-%- zC|+nqU6n7|he#oUO(vsR0q{0JLhD(`^Wn0XpqRYNi+=%&0l(BwwdOC}FV2p9IvbdRP=H+B?f<+5a(nIvyHS=PxxXtemVe@H`+ys*|(X060MQG?Hanj#SzX&zsT^9r8wSd0>0CYHs1Y zh=~g}@lk2!e$|SCoVSV+2wJzMt5#)34xe9?wL}JW>7@jCuWlq6e#jgvnSi;K#fk>h zpjb}dd@;~j3uw9N^6W1R?F^T~>?$clOla;%=&eMIL?l(?%Urio3D)9wJ5ZV!oGv*% zpZ*ze-!)4(F*-Tq_LXfAHXi_y4XHRu&+Cum!im=|-Y{z10C9864$ zo;fm`kggNnMv3fk2nU|fKZVlN;Z16W6x9+-P>s$#ii#RHvuKO(KwGVy_ZsFfhOYV`^Cyc1iKI_Bu=Ajy?#%brjVF3BtXAi$2B~qnRK^yQrh4`}q?9x3E>6 zUFlR3%+DH^v%Cj!b&G_FC>`}yFQdnDV(_^&CChXU(ZsjZaPIpsURk*Ne zT0n$bC>&Z=%u7I;(%E;_3q`3@hUBd7O)y>m6$qa0Bkh6IISQIw6<1d))+BfbY8A;5 ze7z15kYI~#*JE{NdNa|^J8*Z9)ffpkOB-+SrpC&D9i45EFitmx079|rpC<=?OB5gK za+vt7jOhyQMQhWI>wxF=%==1D!l+-aMg63c8Ic-8*e5~s+9|OIq#CViC8d~$Mh5hz z7IX)N@`L-IAdZg$RZ5GGb~bfSin=34XsZX@g>p1?ET9M;R@C!Ut$fFG4i&yI;Vah_~A{|1QFb zO;s?q#pB#u@TWDco4V7@&kuCCk3ubshZYg0j$8+Lpxs&j0mQP*hnAO9hV|))fjo|y z5Q5?d1-;exi8|5ICl0|k9QQ82zr-0=?Ed&AB<_(YB9!gXK?+FBpSfNj#F^n^%T7(0 zHq=yS#Uk#)Q*9-76EiP-y#yC=p~A75Bcu+ZjmrmetIjQ9{~yg;O&e&O*j1iU|G=d^ zRZ}OAk6S&U@&xo;GJ2`sLOa{RuIAwcV@oDDSo!|@>~-%%iVEX2T43-{=S_%yJ=o@g zzsL3{a#9wx?(_wzeRLG#*BkqM%KU9ugV!K?Eya6Vc0D0N(I2}7TZy%Me&2IupitlS zGyRU6cbKZ4Ik$Q^6k*tMVLY!sqz(+*_8x2}T`iG19=%`^E%i(oM5)??ZU$1^!*!QA z;C01Odr_-8g60OeM+*t7@H?a)S1qGTc&A`!+VwlrW3sCqiFZcKn2^Z?@%scmV8#+C zD4=)gmu~3+nd%}X62?nXbFH)#kd}I#84rKq4#nXHnhp@fCDV(+r0w!ziaE`(OHHd)NfBx*!mf2xso?cPT+1m^W| z0zWJIuT=@viL6>+5AvDJQ_Sw5aZO!lA%?Z0RM8-IBu0e_eNXJFK>Z(Ju4M{D0}RM`6?qt=%9e>Qsh!m8uN-n6mr1hv97_# zgrozY&&BKe`nu<&&a57^pl9dE zmyy2BOgkF|OePpqUQdC?NF`G_S?-?)pz5xuUDCd$Wn1U$L@^|N8xgdT=d@o{P`+t> zmb|XB&_SB2eq~YL0aX;1+aWNIWA?fzXZ`Y-bfGl8hz7i~*o^hgzNrMfVAXC6qxOXP ziCG8Q{hekC&MWv9o3SR+gwUJJ(Nr^9Up2FcFChP6Stu&|sc$X^rcF_`163&5`v4+o z*?<84lm3mEj8QXHF6M(f6VGcC8>YiiVj?!{oU%8-%EF8PVzsHu%=V&rf*HP5CM9xw zr|m4Z*gYEwJd4ye5;?_TZ^~UEWF!+|99i#ad#yaN5K$GLN zeL0%=vK;@hRsYD|AHoyjgyj;EMp(JWwyjzN^$@Bd?1JXeTgvtE zGzW6wg7?Ec6~|vI;g8A>`x0nG)x*q@+C|%k<)HI%_keczwU6qa@vjiAlian?KXgK# zmiLX`H{|iijd6ceCv0@{=RG(apEP4#?P+m2v930FUmLeir-u1ww$YUoDWVhw z3L1N$B0HnHAOa!=4Jd3>p%ev~HD1$FhObVP%3q{M-ivS8mW5{v5Noo#Hh!dDIL3K? zu(=9VzLTs~yeyi~OM>djAxv z@wr}^PO;8~+E~gp&7jLaYGSB&T6E5QSm6Z(X{*uPAs$ z@2)O6OgVcGpTnb3$O81X0UF3-;q&5Nh}0L@ zX}IwBqn`V+-~Sf8W2xxu!jRBQS3%I5Ppp1TJjq$9b#rqAmQ(Y@k*=}2JmQrO&KTO@ zwnj=sZqWza(6lv$^D7KDrgu!#(aK%xdv zOTo5@U8cBi+6B7Hg9E^>jczfMQ&}W|L(+kY8KQ)xU^t1ocPJBp-l|JK8)q3YL3Rru z>I$E3N6sewI*#?OJT;83k*c{Py_Vf@5uz{w>jjehd;^Vj4xSvWlS@h zCKb&vXUXJdym6)za-@H0>w+E*rte=}l`}}Om$CCG0MolAK*s-_|zCK77PW6 zLSVpHkR}ub0>PlL&`J>r1VUjGJFf|aYF{@>yUk39UCWeIuzh}W{Snk*-Q#D5&40X? z)9kXfeV;QUBWHl}{AGXBsIKh$ch>x0qX%b-5u%Tw`O2$D1pLHMs|%Cy)_tG&y`R8l z&VQ7Whwtl$B!j{Y)38LZGmU8DX{~I94!5|Xc;CDH@TssDgeJ`43#`w3vm8^1 zQI4!fccks9C0KDc!$BxJdZzaJ3Q@@wQCfIfkh=$1&SCHExJXj~nJqv&_W;vS9}o^| zfgnm3tpJ2Tu#7B75($GLprBYZ78C`80g#}SC=m$+ROgOke0{#ESFfz(<8#lBGUlpi zq>cy9wO-qQGq$&zL%}tf8~H4bF(}rlgUv& z8Kf5l3zi97-s}!Th0SgR>*Z4UzJ=v7>Tu}5xe)@v_6t?7>$e}4I(t9I z6W4A2b+M^m%g=V=7*0(xvS>DVCVYD81}UaK{bGqP_{ia*~uUj~5U> zxL7b2BngiJVL(|3G6mOHix4cD;u+PuWudn-(YBkZCoY9V!8?qg~{XwItlZBF8 z7RxVZKcGalaGmqtN?15c;E^zJx&-FNlU#g)jyLYabtb%=ND%^e)w0&rUY_cDLq6v! zt*kTLz4xns)yk~j9&Fq)Z$Qm&Mww6MO$%~^A|5(fc|ERiw5q1X=PB^)q7k|i?2?|B zs0n{7Y;w_O%|HR7Ok|y zsWkXNh8x1+rwDXQDRV2?)r+# z!4>B;hoj^0b#%D0#CVLjq##Nlm32oo%PDl6{#bdS71NMV%#laT^s%V%+s)9Gm-t?8 z6qWPz@J^XIZGAX^Ju<+c9XET$%=vO+u`X81F z-~$NZMf5Cd8ZHUdjQvtGGw+-AF%`dQhk|3lrdvO(342xPGx$}-WahRLfbR_3&d@AY ze?WP`D$7@ir zv)JAxCz7!=j)e!NNQH8e6yOL5!sw~VUt5DxGvPQ`%O}k1scFtlXaf|aW`jstOTuW@ z&zPg6sKSF>SpcPeNzLMT(kFnGRuIknV+Wr5{NdhjM=KghN@KdVnLlM^hK|zvjV5IQ zwSumKrHz73T8`B&OoQW591bJm{UezG3lUGCsbVP1%iGj}X}@R(=wqmr7TlYa^$XBh!%)2aBrR^EC+ z1qE*0(2AReA7jAi*(5mN)lO_JX(E3oFvvO?`^Db&T0k$%N=!}sOr?;nW&LDc9L9b! zBPv}U`ovHEOnI5V2_2v8vw58zI%;YHomb#SM;6$d&x0$W_EvBmW49GH z95quYyAk~c8vn;*f%s;xD*d3H2u`nx#JQpb2z?P{lt{{{m1_cE=AYBMqAh_G|Nf`R1asn^UB3n+Pj4ett4!(d#4SN|^_RM1E?{O&pI*~-`tAr(Mpe}|4KjNpOPA+XjkqJH;hs#wW&5%G z)GAg~F7&J(u5QRy8$fTz=I^G%52q33^~R^HLY@JJz;P(hT_oWZr{QAtLnz&7H`X<1 zim1lref{Si|FG@fF$E)2<$?8r&7Zt);CBO4)Q`RJT(!jlgk(o7I+fFwYTt3t2 z3r-x3W@CFXM0HV^22U4;Ad^cXnv>DgC3hILQ%-G9l<9Q4K^-RkW$%s*gOPH6J7g|jkLSi~ESPP#!yhiTb12o_swSe=K>RhFQV z8z7_)xM4i`f^WzK=^-zc9^s#w0}n0nUxei_Fb+Vv`V{Kn(Bm8QrO~Ud3i>b=-u#^I znqRX?YDOH&dU1$RBqxVH#N$d;=s!LSPVQbz^gaNXAjry%CbQ0H{7;BVR3M8U@0Vw| zByskN;wL6(&Qz-|b%DCkv>ArZqKcX2cy^94Q4`mA@FbCDI#zw1xW+~LOgJohv`GH4 zJYbOZMOj*ybUCOXxySE4HXr415sJ@T7hv%DCHPKxvSS7bVy>w6_b<`iAs#M;GR9y& zd>}QT!+J!}`X<|yMx7%5Hfe^SVV0Ptn}sV!Rl9S4wJ-;r!pf}(*x|Umd}j}iQ@`Qo ze&fu(1$vLM)R1#wGPdo|5z;;5)CMcG=*r{tx!slNCN87G{@0<|);Y;EFkO!09AM7J zRvxRZISP_a2V(0$eY^+a8JJd-eV*JiLKJO(nlBf)8nLQjDj2%P@hH!dy9RpUR*Ep4 zy*WC}PKe28gvWUjZo|x6>1p)=E!p!q%_YRZ34y_#pN^>}m@9c(^aaI_Np1F+T3KPkr)V<)NRM#` z>|K_z6Y`1Y)Z1r4{-#nnjFHS;rj$*j&pyvjs-$f63 z8n~CnEw_Jpih{B9hx!TC$Vi%)RfE=}R#^VlRc&GcL6`=G4ciJSbJ56VYe`s`oVM3O zyNz5sz7Tp2o7C!gI}_i*v&xYQ7w}6q*-F4;uq_%X{s@$ErtTI$f*YZJ`MFLXbOS-5 zuRTE!@#k$iZfTwItS-94gm?Ockd3G9I)jRNFi&hXje~alg-3<3t#_j7WkAHicZV%E z#B98j7JrD+>G`V~lWawhwu2=J6SF@G;R-i$xvp-9^EI2MC~m(@{y-$}BX_||Y!hd5 zny^`YSTouUZh-rhS;~JJF5(?JZGhf@@BVhaqHKw;oZW~WVqXMaG;RJ@CTT|WEwlas zM8Ocz=9JW)Gq5)-eMVPuV@h`rTq-zB0&vB_)6vC@VK)kKIoRUV69qsDw?k|r#t3QM zW@Bo2&m!u#fuS}=i7EAM9z2v~F-J&7qv4?HAj-FE&m?<`e~nk=EoHh0S+y%zHo;EZ z6!VNiCl9^}%ZCYIVR&|B8nyxm5jE#}@0y0eWumbd11WAbnzhUfQCcup{lskHY<6Y- zDM;LMX*_ywKPSh3pD);Y`LF=(V4a=TIfPn{_3g7?2j_OW}V7;kH*Atkmk5>BC&KwL88^ zQJ>h)@FG$LI5d$6C1^xCOx^BJEhzC0X*+;{?2H=JQ7O7Gu!IpS% zJ$2+WiA}5ZA~`3iK8oWDfSm?il_sFtb%)}%KZ6!ybI8ZB5D#O3S7R9LcyWs%bFqoi zr%ov!ZM|yYk9Lz9#vP!ZuwWW~h{J^7TgT)JM;?LpS9kNw(D4%?5ECJ#TAnF$Q7e#` zfll+M(NRLMBgonf2R;H@4?we6=Okzg58`+w#Vu6g!xocFhSrqB+38!Ceb9N$OOzP& zZ3N0jMU_yLL^C*4cW0eN zH$qg-3`uJS?abaiGvP$>tH2B)=>yv}gA=6>BNS5;w3A*QEpt}kGgh!*)hO0mm9s*< z?;iQpVJ#KG^%$MVDaSMf@r}-Hb8oWQ7q!FN%STX_VCNb(JtGYeKMr8<9 z&qywluA0E+ZTm(VI8lXBcFhm^TCE#UKrU|y@+>OXgjqKf3TdwuW{zpr&mf_H9bTm0z()}%vC#}dk-AV;v0NCPaZnE)XQ z3HiU?{rpM=LWEGDXiOCf217wWxMVOE3x)z=kf2B^5(ucmA$)u9&35%)=X?DA^YZ?C z_xgC^Ni|$%^{kxG{I|8BzkU9X*n8h52bX;z^sYV6y4z0toPWRnB*PFo&#XIdC}s73 z;jcU3GM;4A|M7{{+g~3j1>wAf`frDP%Ie@1p@(apr9xz3k3!t zFp8VjGG}wnPhaDIo-X;j-iwl2h*+<8()|DC`P=cok$=>$o6t0zRD1vCr2T9azwP~P z48-qc_~S3u@v~P)_x(*T2s8Tg3owtWt>Y=bi_7#6@YmP)Z=_?DMAlGnfQZ~nVFt!6 zBWT!ld3?ty?p@Y94t}aaY>yj5ZG%ZUDQ85H`ouAKz)OzUiwzS3+;{;_*SrGK%799% zTnNI0fBN@-Ui5)vKv>ikQVdXHU+sCvjbdFY`}pon>aTj2S9g;&D#rtNUu3xYyLq0k zW?HxQa^xVBEZJt7F^SIE-^*(Q@e%{1#IRDj*=`jro?cdqob-ZA6Lp{(ky^dSyVEFh)8B zf`MS5$U-v+gn}V=Rg$>xLaJnyWDz8i^Ho{{@74SKW5%xyKPf%l9~bTPYyG)7t(blU zchmOmoHRVtKNBO5NrP!w9#`M;s_stPr0@9ovZpTD{G7IwoNe^avrYMP>mE~fXl&Lq zFz54<`?DYP{2TSKF`K`UNw3#VS`|4+7NcwW#L*77)pSZY^0nhG5zGnmu5Wjc>JNi1 zs9_yeR6FJ9@3{1($CGOA;BbN?MX0tEX$8+k{Pm*wq{+N`)`HCDqh*Z45GPYF%CiOx zfCvIO0RmJIY+4f@1i^rySTGb4g#@7>iVQ90Ni)4_nWO~r$J6DAQ_~9drCu4~B5qvB#1TmnzQahv_`|k#vI6*$@H3AZ#`#-n8-@u`mC>jz8 zgF%3xSTGg}1;W7~xKtz+2&}~S>(`v;*N?@``}x6`V8b4|Mr{}eo z`isB$@%^9q3BL3_fzYqUxqKJmw z8~(oETVSwOCLv$FdXwsO#hf;)Dn2$nrK1CVXsm3KQC%X!`Ng?J2>8HKumaNsiK+{L zhqUga5Qkx)0I5J$zgQ?H3<-k)V9<~-CJF`u!GOq6Y7!8n!s~AOcjMYh@#c8FPW_$g zE-vU=z;>3dY5#WWe&he2Im`V1?)3|&M~rWtrmJWM410%XUfv7rAJ7Pq(C?Pxt-sw> z$)u^+f3^GefP%D@{=JtrErlZiYFsq?KYRMe5-JfZQha}le|*P89XbODx1HTbGn7v1 zcQg8+Olqj=N+i?cumSD!-jlJ(wly1RxEGggfL8aM!Zr3t2Q6JfISZ~q-9!XsLHWO5 zz4LoOu-q&-3l##vpt6u86cGeYp?KYK&&R&y-btMB)=85zk>@Tu(hXZDDf;K`@K|V< z)9K6{p06x?Zo}cC`zel}V(Zyg;y+jJvP#aVd;?_cKh}D5kGCy+zWk=NMEf$knbCF| z1zBgqz>K155%O(MecJm9_L}m_M1i>}p%qMGB?7qgRGWxfD$>>hC*iUW*D1ziC;1~cN*svxn z355bbA5?(Qm4Yo`@+5n=arACWbB{JCuZUe-^K9bE477Z30F z%gr>%RCvhmMzwy$|DS%}T$xpu_14yFCbs)r5B;)9yrqji2KhjE`}RZAH(sEkzipZd zeO&N@uPCz2JFJ@RZCMvVAMvfP<{vRstj*n!u71NS*bnuKP&XxIi#-Xg)#^ zr2tE3(@t1wyHk`dFC%eQPspnbBPG{uFp5?cdJ{v6c?OBzb^FYmsafQ@`NzWS5e5u| z2m&|&01xd!n?@o({9RH5W2uc|EG(m@c9{aasC~3UI+V7VhsH&qa3`NwjB|p5CV??>b|uJd{DM58fDrky6ime7Sz$f0LWB{;@dR z8f}>ZHh3;@QwEC{gd#w?7qsY6*6cra@W)RBK9qjaC^?(fY;J&DJX(~E?}$;#vLfH# z%`<9{qMkPW%q5uE@gxxQQn2-}U}-iwMEiPq(Eu+`A;r`qtBo3SB$3|kxbfg#XlCVc znT(i9FByM`A-|;1Y7elom3w5s@Ju&)Wv!f+mI(0BX;(m(V$5%wyp*0lnG8zq+U1L7 zX*A!<0U$iu(Eb=M*vD;u+um?LACiwrbNs;GuSP2BXplmE!~BhNEWdX-T-EA1wGr`?x&b&>&0IL1tXT;ZoDFrdbLom}1U>lYir!+#u~Tp`u#ToGYBHE`-!$4yXC- zqrH&|Vr0+9rt88ad2=qfD<2)OmPO0M z@qPuSVJ8QOz!|lb%cm20v=GB=qvr1VO}4YoFlJ@cp2U4$-fH9;N;62XFI|Co8YG8T z8vG8!G>hG_eM0yMComx2ISC*eTL7&)1Na7S)1ea@(|INMUTL)Ssaz<3FjC(|c+mn> z7K#wn=an8^<{BmL9f-v~TULu%bui1@Bj?07)X~tN%=bok{-_1>E&$uK^=a$_ou^#TEi;qj$3B9nu%dr1I#PCPzySsgT1y`lE6DC~r;&W2Aebv#toPl=Ah0 zAe$`OE0nR9@=TX3RsTp)!3s~v{`q1~iG+gkfk{S6+%EaaZjYGsQR;C=FT=Z`UyzbP zQet02`YHTkU7&+GPhYDCcK&tow)(Y?^BOw(q z9!i-idJVGzj1s2(hAE8JbJ0pnrYWWPwy^T5Y$7AI z@MI#2f zPt&I`9e}bvs>rq*4j2J~pLW@=3NZV^VMPVXtiPy@mpy<5m#IzLw6 z)lMJAd=*(8!`hj@ShKtM7^40U_A#Kc6-O!GsN@vvZm@4roinG&{y}HPYxDNpO@M0Z3DtMm#VFklG-21Vl$d}*D2$V^o_DqX zhK-}yGzWVc>MNzhyznKT0fYq=C~9_uC0dM~78baW3R2&t{E8g{RpSLwbFWc{M7k7G zTmT9x3WJl7P+%>)WrahLa=vVY)%@duyP|-n4hoc}GHutI&fJnp-R`E&F0iF`RGZW- za=pe+lpkeYnzQ^k8^xg)VBJ2EDxmxKZRKGZ$o-&~1vfy6YvbO4Z_Vj1;~2*a=zh1s zG7>Y_E-5l9x47ozLH(==U|%vbsP=q{VAihL+~XJfl%p5liMpy#6fm&Qg!- zr?@(1{1em)kL4$dE7bNy8_s1YUe$@gN50(TR__=jFQH&fZ0O(n1*K{buzMk+fWJ{b4dwVTUp@R|Z4gw<^L*dYfRD9xDI*#5-UOBU z$&G(YVR7$%usPss{Zq*B$^4s0Bt9U4eX=~_ar7QTpI1u;3X&uVtXxv#ndh8Vbh2r7 zn7Ni+-c2Cr;89W^=482HcJVP1R{7`L<@F|=^_GJIkUAM}==M7$^L!vJVC7JoGEo~0 ziEAFX1doP#pgG8S@?`?(iKF6IG^WIj(+R(ev{|~hCamy)6U^YemQ7k_CsqmuDvN-M zJ3*GDKI=--vmEs*^BH8DbK5bqlQ5m!p{AM@hs9O`ObXe^5OvYzYYddB9oPn6cX71O z193^;D@F5>B2enWw0-Bp5Or|4z2fv6}(ZcuWhVYyP# z)1s+Xgk`_2BMH?fN)#7fyS8oWru0?(G`KH+zjFN8mH;^VSCUrPSnh+lD01%g=S`G_ ze#8@}2IJ!$dPx~#ePDn2Suc*t2{Iat!58%2rI1%Fq5S_oY=g6(9;mei-#4p|dp^`# zoSer()1aN+gHrB;AM~$EXNY{hy4c%yA&#xwJ&GY<<9uIS=N%%|4YM`~&bo3z;Zol0Aru=lS3{*VZ-f)O~A?2K&<}b9HSSqdltn zEfgW|y&D0Q zXpe~!%j}hP&o~`Fqix9mp6>sW{o;p&2<;J|@G)-h&1MdA)~4aw|+nAY7OfF87a@xE6xecmIU2*JrD!DIR& z&ExRmsjG~Ts#NR#Ostz?`WVqU&}!n6=hNCVfB;;g=ibfS(7p;kSGy<7#_&Bp{U%j0 zod)w%2|Qw-C2Au+!~2U8F05~1E$PH6e;~I?6b&eo>Ea}#XXPY9-)nY@W{{`v@)$Als<>b`#IPww<%PblR^B{j zP3uu#5>m66?>F=Ge5;Z2|E6M!c|+GRrdPz?5=vKMz=t9j`z+^|I{*HJ_G;pyZmumu zrS;+@H`ngsLqOB*D=WA%m+@-Q4#2rGi^HsC}ezi*yhiG@xCe&0# z2dHqfWyzL}o`V{(P=I;%d}?`knx(LxY)ghMpt=_i2=)tk@lTxccT9MltefMR; z5|c}vT~go~qi`X;q|99(y5btKSA zE$RE{3Bu4h+H-97l6FvN73TOCyK7SU!jgEQ>nC6OfeuSaYUx!lO;WHC7XbgH6Zlvc6G zDavMu>v|ZsVdKe(DZW$5cw5Z&ZclI|-|!Di2wLMj=y%3P4I@QB&8RA7Hqa;^v4TB> zvM3W5Kz0-ZcZn95aNDMcsthyF*J){*t~fXy^tRG1j61TcHb9?M4ecYbXtjEDs=T%p z)dhx;u{)qGT`i=_VW_HJJ*ONRV8G|AN{l zKd);uyOoD6{l*diWCZsVQ7rKL*2SNr2S2V(1LKDLo30MdlN4zakyv5Q;D@XkY@3ig zF^o+b6Au_mSv%aSB~{s3565cCG5w@-LL3mi}75_hvUl0V68^c6U@V@ggL}mx; zfNv;*(*OWa2j6CyP54H8lOS$|OdV5@z%l4ez;akGLE&!dHa8pnv)^DIpPZ(erm(%W z$ERdipq$yH8LaWy81xxLb87{cv&vhA3~`GJ^s$SPIdaaR`%_9C-CIrrYI~2mUvFmb zz~WI8nK3AOLe4b5R$=lh>TC+EYrDl8@K4MbN0?M_wT|^3Xo$5@UEgct48Y0N43)Gf z6P!s<+tS0RWf&jhL#0nP(X;?^i&0aVXt26PzOi zhj}ZDsN_05HRxwRG05s3<}^t!Mj4t!7bf|QywJ2dcbCY1>@eV2s|v=Zo2vDxiOHh2c!uP95Inar7FN6wS!L-;?WcP!CQ zrZ-&GkDdyd8@E-#sb?lb5#x)r=?P74p{ zp`KM@Jcn2@)L$jj8)MG8@!+#nj!*O(R>M4HUJ6*N0ll-&iS7NPYgS8_X|(BXIOYJ8 zs#5jQ87V_LUT_cs06+))OowB@*02+tbIu~uPbpH5VgA4R>Wv;HGe^^X79?{{c%^20p2C!?k}%FA-J--ijEK z$=^d#{F?TB*B(bfM*Sv)ek<>u%REXWq@mpCf~`#jnYOB7$oURx@;DpdK1Hj$zP%UG`vf=V zRVfPA_SUb_l|{?Lx*#AsgSY|$AdNHozwdCVL8Qe~>gI&bzM9ax zIC8Yxz0O;BnQZuZiW6ln|w#U>V9mr)t6`FA;Oz79j;x9RbeC~vD}vF z4bma2*BmzZ?-mOrK!}7uh%?MNc6>pnsEJdCQjQAVZn>oSD5Aig2kiLJ5WC-k>_34sTI_S%PgO2J)i^9>-5su17;Z zZw1->dU(o$%(IVa{RezyYLanT&SCP^gkL{cyv*-LwW<2{e$|c0HHmlWyHG<>rOXtJ z^=ru4kG4$Bf#!^W1foL)Kxf~xX>DyHr%i)fL0Q@tsMNTnhEWN^U=TdhFv=`M>x-A&rhQNbQHED=zpVlfzmr(-TO7&0LL0yqH%)EFohBn5*)VxU+s78(iy zfl#~WM&^~|uD%UTcvrm%!Kz!7N;=3za56eXT z^5dgj30ohUs&d`@*Z1c$|HK(ZHR1pJ?fxW5jhDVqS=V3tL*nJXb@MJY#bE2apr)tc zP48;Fjy2rhp?6&Oie4O?@4Z$E!Z77sWVE?@YxR^a&qLR-8`iP%@_GBCIY;xE|3zJE zc!jiT5`_y?KvNhYzj`6d10g{` zSST0?g#uv~xz~?7uU`Ke<34`5=KY?%r!%F_Gg&HcRmj&I4dV-TDvxOB%)BvX z*M3jYb* z8U=!ZV8EO#Dhmz*!9c*MHWms6!l59D%pxNQk>?e@C)#^%{A&5XIlilUtCH&GEg(BT zAnq%9f5`AZ^v(I3?ET`rX>8FxL0=6}i7R~fzuPr>hEHxY{JPpGr(JCSj@?>;|9FR6 zt+G*1&gqH#Wi2cxt{uctk6SnFjC|>WifLxALSi^-2F^X#<=Tk4xb!hqaty`V>-uVB z2kUb({?p}!$ofSI>OP5v3ciWA07Fdp27KOd5%v~TS?ib5qC?6Ef6xSNL45yip8tDc zAXu;#JP889fUu}67z+gip&+0|4}Lk_<@5ahmsdBxHM`nG;-YFQ>IB?1KlBY1e7FBY z<=5<;2&{1s#vI?NnP>M3wNL?s8k3e;wa;4!X@0 zp1mE|{`L7EAK$>O?e68m->fpgw`xqg@wkrhxA#V~;MVBUDU}m2LOgo;wZf>Cx+T^H z?(+C-9b}$gk?*tHY+SgFQNrRSiq6}@F{@wFDAL19tKV4?0eN?~l1CwB3S1t@q}oiu z|8+W2Eu@_;4G9O2vEQD|F>Q1yGFAwdYDYrS#m8_kQcc<-TyDH?{de~d38?U z;pg-w{ak--FaKnc@w2+S``_`~uVpv&VFgEH#4*mzA9zIgFG}BvUH8WI^Z#YxH(aeH?#lXK`A3-b+6~oK`c-m+btq_r z`<3!BQr|4AF9Y-&$aSt~6w!iW@49j4h>F~pudWd?O18%=b&N*zZAm~?)^km2v_nQ} zfrBFg0FD3v5)(n2W+wmL{7Tk@&Ln3;Foe3OmY@SZqO_i+o!#==8>BuIw4 zDYPD(Y0dc^$aYr*qN7jIU;l4WTpec)KX{gGjCOQUw2q*rb>x5?Nav2F9Srr(H>G)F zsqzC^6B_uM2#$G|k?fjqVEAvDM)x#>$aQ$PQlXqi66@-2isL}709^+Y`s!gQ12%@) z;-bz0bRbY`eMd5f$)`pf3;s8TZ(`JLJxwDEy6xDO+HHEWl%C(1ZwL1|ugLS!bF2Wc zWD2Aa;JW%SVOO&qX^iH+7ElRzu&Br$p)EjD`!htOk5XlGBtOANP*tUUhh#iU^e`vsx*w2rb`8!Gx4wOc)S}oC_;eD-b&KRu>$R8-xGd};Nvk7 zD-qn5bKhALD8&bvNsM=ix1k1*9~G&%UZm3md*99&Rq4DE_I4TATl+DRR=jPz$L`D* z{cOz2ieDX7<3~Aa>SOskd~oWM6b?NUgaPgU18kHTVhJ2{EJAjO28T3E4;SkdJr%1| zN?}FOurTs5emlujAw1u6)z0h+a$zr}Kw++X^MM{QP-JWn;BQNRPh^ULU4J#JL&kA9 zOmtiD&mZ)TtSI|w-x{DCT+-!2{DH6z6K|q6aWZqcFHdy-?dH0@Gzw+?o7m9Rdrmtb zI@I%b1WdK~U)xkE>+1kv=$%YSa`^(HV>3jym?sk6ooK;QH5YNX@q7pqE-x>cil(P= z3$gMX2avaXzjv=J2%T#1CU2Mm=O$q4tMr)~j}xY5z{wb`NEV5fi=oZ;>n-%cF2f?t znBTU3>y+R(z(xUh-zw`A1igd(nxkOU#i~ktt&zItI*-a{?mc1Dxujqh6C70xV_KJ) zrq|jOu{fQuS7J{N5{vr<@@6>-NSLW0VqClr26uf={BF<%>Qj`XHEZVe%b^wvY9AbM zJ73OiyDEP?2^|1ul7Z#aG~~OP9I*c(@SFejw1=bojA)RxT#+%i-Gw-k<=97XW4HRPpi;(wXjC zojUnw0So4_F|wtzlstSD`zuu96D6vXjwmjo0t5OSNa=HjZ;NNmETJbW-=Eo~LgVwO zOnA@$2tIDRF|EBMA~%|A`)t0++Re!6Q;7m^QNQ-aNaN?$ajBiD_I;vJLl53>{Ba^3 z9qWJ)2++L=qcA*Mju~`QZTjoYp%8k%eN`6ON(o^sGDQ^i!ioP$RV&WK+Z*2MDr`Ko zLvzPVDO&F=0P%$FUX`;zM?47ma*Ovkj3 z#D-GJNPqe$B*l6>UxEw*8@%aOY4w^7O*iZ z>;kj?CDjdxv{W_8LoPz#a3%68EJp)MuSfx=%22&)Z=Yan%UFAkLV+4w9M z2~iV>TPC@soo~bWA`R)mal zm8b5<#|X!Nca~ z{0!<%&-U>)1bc^1@qNvDgWSa@Py-n7SrlUQ00096jS+M``1@>6mns(w{)i1x_GFmr zf#JU>iKl?6o{~5HiaJJ9QH!=cHaW$ChO^NOuC4<3Q*ZNjI&F&2sZn>6ON;)2wJqLb zUl9msv5i|N$w!%sknzMa!3WOnBmA0uB->Y79Pn^bVm9FIjmewiW(B4?1h56-f(slz z(OL|lMR@GvNVF`K$s33>S1ZFPb^_$7<#FK2RSavFhyv0_8m*j1nM0?Bz;E@caPY)IYwR&7tS@h6yQoZnqT2gBcL(b z$=SM_NK{Y~tm5Sk1$PwFio+Qzc=mza`}*bF<9bN&o}$=%t--bQq-{2oBwVNyLF@Qo z1Dn7psafV7aNRnvDdIq!Nle@^F=a$?o3yc&z*{EgiC;=XJz;yhngz6#x>-GGV)PwT zRbh8f?IiiYX?0v3)%%r?>s|09lOuCj$;T znpli}Tq5?b&etQr&-h`M_t~=}+Kb)-UHo|}_;Lnqu`^J7%r`0SdnMnB_ArP>7qfB^ zr1o*?w^WLnkFR;5gEDqQo*Ih>HqL~9$x<~UT|U6Dy%)Vp z&dng&={GtL&Iqmnb<$-i1wRo1|D1BHa~X!W80YHE_A?k8j=jIJQEDDlOVJdR*ROm_ z{Fh3?MOIGhCYiE_szDT#vX-RznZ!FnQwqCEL_&Gu?4qh6m)+w#|JI0y>mLCOhj%V! z@TmKXg_*n=#As zwlxUTW3@pcuuPvz>7?xL1}n9W%goxpN@AR}FrF-TO!B{6dev9yJGkSE^f`SdU(i?1 zy2h@Qae=1?&H7*X{E&cYk&Zug+HQ2ta|5hpur+Apx^Qjj-SQvSN?p}MhI4SAXJbNQ zMF-BP`H@#sj)Od;r;(@MX9DXN-4n63*5$O*F`sqcLo-@d;Z67h@qF{n%Y*5^tP*$& zRZF%S#zwlb5vcS3{n4;UaP}y5li{n9~ilr9LPapxcXoIm$MsToZlrMTbp{`zpvtkl(LOl*J=ZrJ$efs&Z zq8_`1l54#G<+qBkpLS0hfKwEAwzYg~NDPEN%&{qEwEQme79L9=_=v>A9ErrNmY42l zb2Acy{NP}QetVTOHI4t z4iuexmbGna@DT@wwoLXs6MZcLX3R2OwPDYKezH60>pW>u7CE99tk^VjDJxULWZrwG zTX)w5L9!n0PyFkzW)c?aCTP9J$`~EfT^5s=*mV8QG1jpHJ^3gD;_6p|e}p9fv1)du zXPA??IAyUCRH^I5!x`X}3H1R5!`{^$EX%*(R?xUvdN+m0WWP71jvU52L2y1wYlNX0 zK3sm#O>x20fQnH7slAMzWid8RW0bKIhHUiNDb>bg0x5jk5b5NwF#u_Id_!`1UvrX`FMqQHIdYxifwgdtVxH?(hMRIw^xk z)?8pdc{?c@{5ME0vBqlm1EE7t-yx>yHg~!%i-A54>MHf49cssR#ECR0Llx7fO_V7x z^dGjHSx5zI?q<`1(pT=v`sM#if!rS5OKE$d(4^@FNpjfVu1Ln=Yw!t2zb=VzV#180 z6Pu%dW+(j~8`~7mJare`W=R)Ms@8Gw7PYVBe;bNE>fds-(Z1FtvZ}ko zEHm?jj6DCL&_+54N%3Ebej>%?;G19&3d}73gs-sjHutwz-5Rx~)!0rT-}Th{;7bM5Yx0<*T)}N*v9QVjtEhPaBuu;4AMuHdz z`{YmoNHy!O-pBS1pCj)ON17iYY-#CgB`s(aCjA2b@=fy{yCiX^k2Clo)0B)evs5Lc zde(!FVh7d4Yu3hP=*Ndy@Q-$Yeq(%>&AzSGdtr;HL%^%YDatpF=$-`7s%C;Kv6a2x ziY5PdRUdLglN0}d8gyKWNyUhS0i`=&?gkxVCVT=BIY|!V2%<$L<)qY{-;^Zy3Fyyx z1)6Yq>=V{hHE@DBK;}SuT>ucmUE|}2l@slCLNxkh0ba!0eQEJPTXt;Z{wGtvjOJKq z`S9*y^RygFSZiaGoBokuMsI-nST^g)>Y>cWCQyIar!-R$4?o)~r?mjO(dRrz;^^!Z z4SVE6yXP6T0i(&TX|P%K2)D1_SKQ6}6R zOgftMmmn*Pl$;C&2+pC^(LQb4I&4CcQf2Z`=K+W5*K{)t1Avkz2a?@Py0~pJFl*VD zJg{lj%s4q5rIrWhbiZPUdq5Ci3z4Dz{Xh!8JCW=9Jc0}Kc}oSIL`f8@_k%!iJTTll z%s0`FiX>teS99+g=}29J{u|t^87;+$cG)={C&9^jx0Nrw+TTBqqTf(Nu)Up$?girq zUd51L_4?g}clyDKe$oX@S$|AIo3yIQ^j=q%HjP3Z6qHm_ z;lB`{rcVDp!NC=VovAr!yhW3WJKwh>C;LjkWq>bh%lAz_aYyvU-suI0b5wWI`(F=k zq#LtQN_8D2XD|urW;-s=DeHzEcknbp>CPkyvJ^iqQ2kd;b4&?Uln48_T5g|$x>F&1 zC)|o4oJ%y!q*FL`!iolE05qp?N**O+Vdi~$4`7>E`W286>vu%JvR3kpJmP>@g}l?lyXH=OX2xUH>MGDYU4rne0Q z)?DTH_gnwZF8%oE!0*)jkur~l3Fwc;uHkOm!L*GJD`f=-(*bg8I6oA2QhtCl4BbY3gV7%j-`0_`ab|L?uo)y!@!K6k63K?_H4JIxkM+X?RPwUY(Qy3sN_d(YUt)0(UJ14%~mcmeuKQ9*Tj)0Y~7?GhTe0QATQwE-Oz z0$wU~02E*0#0aJlg#^Mt&|oYS6ovwUV7OQ)7zzc00brn1ND(1~N}+!LmUN$|T9xbf z_ucz%zAGmZBUGs^z%M^qe+TowU*e6g;%Ijdy=b$B?|}RahxImif2#C*--d7OH2QaS z<%O`%_qUbRFxBK`66A}W!fU%%77D^C;C{VihmCfifY+sRwu61!uhuj8KlH!t|C8U7-zrQi1+R9w3+|C*Y>8bl5zj( zI8L?`Qi4-5W4KazGoq#iJeloTAC2@iq~8$9Y16ATO-P18v6U-Ou@4A=KnNBJ1_H&P zu^=oc3lajtfUr=65fKDJK@vRs@7tDSwexh+QmR_Xq$N!O_I#j@_m1j*f3i>a@^#GJ zwR=1NYw-AJqqY7%yXjMQ%BnhfE7RGuSbOzZt7Y+J>lwR)TgW%rEv+tsILr2 zT;Iy}O;;jPieNMR|w7>Hmm`9s? zf29p{xGr^KUTv#gqOCcvZVvh)1V~}Y0`-ls1khZVlveRwR_9wxmcKv_(|iYxEv0v#XZaa~P>D_l zkn_ve^7*}y7~-j(#MW=Q!}<-r0*LckLl=Tb!2OjW(}mSK`6#u5x|9kb08iHf&$J1N zzz2+tfCFRJ{q#W!fl#1WC>9C|1j0bjU?>&~g@S=_u&68)83jTkFo;YdGYeg%_|AIc zC$EgjbDB+SE?VlLq#s0lzhfsqiJs4j|63o;?nUgOxq0MDKdEYw+O3~Ngs7l3ght15%{G6X?o}qqsZj~`}g4$ zQWda5-@b?l%7gp;zrOzTfnc~;P*xlTg92c{SWqS+5JEu{C|&b6H+4Gajkl><-4~Nl zF0M+IV@AH~^}KNVa36h*-j|9WU$m$FPW*Ih^Y!{E48mS&2i>1}d-mGI({J#n#K&yi zDaJegF0iUh{CzTrcJWFboW3aY%Gk;((llo!FI_q>#zB;MUEw_(jewh%6^x{*y0EdN zv2_aDg;I~%K>5y|CGX6=`p+)$kC6w+A*=Kd?dK9t?z*U{ncv&P0`L!x$SJ0+>O{N| zx`eFI6p1^=@?B9}g&}VXSs(|t90iF3V!&8v7AggTgdmBGFK^(fyQ<@DRY{PNq^pr= zsbINB9QVJc`}gSk`0nHTwWqQCZL3?;apKxN`g=Tj_Wu4W^VomHO@u#Py$t;{Yn!CM zE-9=-w?0^B{Y$m|UOVQMrs_&Kyt_72=3yF2pB%o8yLB6;2&k7GSmHTwm8YsZF5k@6 zLVEKRKDZg0$BJKg2POVapK!4p;1S;=!EN#bOFyr%wPK}g6XCY13>gRz1aJTV6M#XRh9W=W0V1F|uF<1f{i>pT0HxO` z^)l*WVbGsE+7xEtAz|gJnEO6j{mST|0qr$n@D)DeqlLp6oeXlu8lw#lvxLuU<3CO- z9=(U|Iuk6A$yGh*2PqocS%*(%%tsd)Op#d_QeR9ldHfWjd*C+gjB9h>kc}bPcVtEo_(n*P+=Ov<{(YaE(&CH+gcSMG%O4Dl_0}W z$XX+tt`R%N$ad=1grT`@u{uBHyQ-I_m-?h8>URc@SsJ%1S_vy8i8+!^Z~7GPATq_U z6+0#&(?DP%Uz>^H`d^cRez7A2UiR>?k7KXMM@1z;+1+3vefweoH6heRqWa)!0|rL( zk$V?8mBWw|9t*Q|MdIBgeC-1l_rt{F!z-!jU@MEsHxbIt*MBC2-}Q$4Dxoj{-Y74& zmN6ye1x4cWu-%%x53k2Vp{LD4DxrNakXD9M3LsKVTIW(I$qO8DfesvewA} zFr;Sa2Jm<{?H{oy8ACpb$bFA9geZ58$ucJvCz%(Ri}!;vexIekgtL6rcO7{z_bBw^ z#ON!#63y7Pa39<-K(j%!AAhEnOKv1iED_ZEzWxJl$b4UCOF1|lzz|!5(xFGcig_Gj z{kE>CMe52JC)rsE7aBjFyvOsy<^X(VwnOBXnJfE!=^vv|NK75WpZGZIe#~oK6?jfHI7WtfMg&rvKoK{Y17{i$(JuvAYq@yMIr<<;%&~ zsfeMizbLMZ)v)UpDOA+yO5HnfH= z&Of5{9KjYopj+5Mp31jcLOl?Ia~H|T)W6GNoEC2HEwos+RsI34Pl$?SGyf8z501pX zRhh>ud}b4n=CuH#AVu3uI^XtY_Tm|p98k!M-H=Qor{F+KXbLt;hj~fZCJad>EH+pH~LSQ-WDkE46m{A z&K-`!3-M8g>ln3}hXYk_{{vB#+`+eoQk!^Jlv(`hnUL+DmU^?AY8z z!1zT~mk}v-FpKptJ4V~#Vw%g)s5rxQrafTec+$v*Ohq(h#D`%1)8j%EQe#%w=W|U26E_8Qo@;`4n$KKDe< zppJ8b6`$zr4mo!mB)edo15cu_nsnwzfL>hiK3q&oj|_c*Bmmtg-WKP6~>nM_!*7R}jo0rJIYe-iH(hNB?4&mW(#+tmMBv$@s( zHb3PK%&J=dY%3Agqc^VmJ3H1|!Ru~i(nf1Gc|3* zFOS-ZgSXKp+J7)LrxsQ+u^{rLX4_V5`)pod7XoWY_cjw&G z43o$U=|Mo_t0P4w+ z(g&-N-a1{2Bq9it_(CBwwBx%J~qQVHgex=#bQe%Ob^*-%yrz9477at=Pl#f3+*B8VM{iYITkvFuce~8* z(b@?<>8d-r(Gt{#ogfE`gls$OTrse^^^rfdllaJO@9_6dMr8k^_!Y z9(?^F@t-uqG(9AFBv!)r3esZU(fU8BwDssh2HOz(!+z;a%0*P&EoP*lZilJNsP!_% zrF+FLHuiZm3QHL*yOJ6;Z+9~sNBNXwdy!OtLBopFDvYWcK8|nou7Vy3t~TvhR?_a^ zWD5Q|`Tkk@2J_w22ON0eTa=TGRZF4Kw6g4cn&)&dTyHTdVOH*;Xee5}8a@j$pT=Q2 zEpP+Su_*f-ep_(jHmJ*+H~8>5--j&4QE2cDKLCyj4Ik|FY!Zm3s4urrS1YiA5*v-B~lo5}V=EGm{UsoW39^*lEIQ;AhmkLhb;>N|=H`Sh0a=eO*&`4a&tc)mtuWj8A0A|9H zqWT6bClJ^5vtKbXTG13R3hca~l{m?hs6$@uF;HXfKYWX=9Y^~3838bfpd0j%s%2>f zAyhbe!;PouL_tp?j7IL$NqkPdYQOSwkal% ztJ~!@&>)s!-iUKnZ4gtRBRS?I6=?1yHNf@_?OK=rLSRJ1b@MFplv=E)uVR{(z9YKv z0V&8xxO-zFMO+v`txj>cwY466ZkJBy!v*nvby~VAzeeRs=dQ~m0ECYCzq0>Qg@+YXSl>xN9y#`w95nM;o|7NhqhL}9OY?mw-@Gk zRY`X&*I6SFQSU?XJ*w)GHH>Q4gFBe)_ielcD^Z0%obEC9U`G@=+J?axznXNqyZbzS zGVH|x)kT73aY%6mLZqoKj z#kgf#1k+GkJC-FD@rx(7UM?9X)({v$l&1qpfC~dLPC?#>N23yr9ufsORR4rr=9rjT zu{1hPtbcwQAvyjl7@2{OB;~C_0c#(U;Yat(+@A_V8;HHi-hO(SD)MK}C^@c6UBx*`kJ zFZ7=iKjxJ#{1040C!iu5C02`$z@sYtTgmXaYsVM04!0!dW=O8c5og(v65oO8;2M&u zXtK`!>yRn##;S<5aUhO94o!4M$76lyj8(Th@nMJUo3vBGj{5=|2NnM3zgB&=dW(Vh zQeXmsco6CkQ;u#@8oXP%A{CbBPP#aHNvSVB>yh@Y)39Q&RItarR2UC@ffkOLk--Jv z{68}toqEa!N9x5U=&(!6nVL)9V*jPmrNuftn#RuNvC>-V+FQ7A8cV;yb*HpZWd0V%nVpnv^<%r<}L1%nOCUhx2e$w-l@pF-sB~z6a9O0;r7&q331b5 z9I_X`m7OCac*}qAqswA**nR!a1NFIc^#SEbqGh=L$0c09#cm_$3n!K)^6bzJp50>( zP3tr8a8;FmoU1=5f>AON)IMP=PJwm=0Mgy6jNMq-8BsVlN%P=bDD(VXXTOe^%pXIX zsB$>542wl=yvP@p(BAeq(4lQGWE~ZmoWtBmM8-ye1sPTz`Q_Y%dONRM08cE@Cf+!` zJ$G*5tuci-TT7?S7Ns9uz~l}Z@)|@I9BaC=-;SH;-kP8>BgO+=x=;AJBV`OkeSs2H zpAMZxAuQ5U#f$e!=Uio>=y}uzh#OTf=2L-h+=dG0;TPBU_HIY44>f9vM(Mhd=(mTD z#ItqM8NU6$$%m1=8gV0tz>|Vi0EBKw81A%i;SxUkmpruVbakym=Ac+1w)9?gj#F8Y z0Vf~Dik(#t%XnAvQejEr!TC6USwD31>~r%GeJ4~@A0W18kV>3%DZkmk zn$9XyXxXEGJG1HYZZ%ZX8%+ZKKgwkTJTxo;$MPVfZvJ*mP{z&EiI$s_D)}*`RlPMI zLIfHpnZ50(`-q=yHDd%u^T-;3M%Jk07lvsY{fBBJ{_|)dY)uX;O?P+KNs;!WGOxbR z%qmctLzmu_FzQf%E$Op*35AI6i#ps&EBQ(iI%64dK1>VFy#-Za*xx(cLy>TpnWJO> zCb@B}$UWG_Jybcs98QV>@We9Nz56FK8NB)QpF6+!87$$!#{Hp}Ij=!Gu6htm7F{#R z{e%Fw{x4d%s-;HTu(2AxvHEt6J`r0|fqjV+VL?83JZjc|a{!cb=3zzgktyERDsRh$(80Ga-cn2eB-5~Z4{HF}PN zo&IbLywNSWj>d;^C|92Knwf9{w8{)!Ta(YogLA5*lvK*3-4=7v#Cy;2<~4G|P;%b- zf%vN}{gb*;HE@Q%1$L=c5Ne{6S-#EMhhCs>$6z)nUr&EPX9F-ovaN3Ygis7xGTExx za_ODUGc^Y!B$Nyt(3F%qd3g{oJrQY$AVp=!Q@9Ho9in6`gi-gsAK#r)RpGt_o*YW_@LrFFs}6B^0Rw}q9OO-OZZmF#H=jinCl+Seiq zHJX$~mTaR⁣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%0DXThCjUf28ZIq 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≫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

l{J&)}YQ*vBn(G1ylxHzv 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

^>&uqp0SB(s(nZAP%Ox2{`ej2 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

QHULVySZ}#~PuWJ^7tmFuh?r7A2=*(e)d45vEW8 zEPEUcCCcU=)~jdnN|8@*$U3?5ZP97f_+qg& z#v=8(o_Ut*F`m2(;W@_FOEu7yW1{C9@XHeHxF%&+(bJjM&$ej7r3H$REfm%8BzG4t z!@sE1rDfr0xtgs1E||jAH1$mOy=#xs>cHsqJv}A-`mdLBwu__NN69YZa1UKL)3z14 z7R<4)E8e$$w)^}$p+5*NaG zwA}2_K^+Mo!zkEeif`VFS4}~EG5-#GQmuO)SnZH=b>phP3^{p&VYL-6t`Y&!LWHDY zWc4#>02}P7)Mu3O;f0AM&C=vCR_lwXN^~)1hk5BnfUEiQKy+d%$?&8#ftLVnK$5>) ztL>5}!4WkLd0m7QrzuxZ41zI7j^HA#jb(d!t9Mn@;QB!QnB!X{bRIKW_bvm%?SK zXUZD8YDK~gH+H(~5k6c?AZ~CJEVKDcxDeo9h}q{VSD-17KTtfU;@$j7SQnSE6UWz- z)XBeem7wm}$Z@c4Ue^}X(f}rmy48Jy5?UFsaayuxK&Ystsdxx3ybfu%hSEgwpdJ{# zKrqo8E>0-q3nxbXB2@IfA^0zBI4yB1Uy7IBz`#_E7B_xDohTJh(O!C=z?nCKw@R_` zk{0`vzJ7a<`oJdI&%jeBQ5T`iugx9IJC2A34Xelv?Lxkkfhv>+_T_z9vOd`z1r`k# z<%t3*E3Kfo(lTM&4_*P#o+*QwRCnK8D`UJ{H{|HGF* zPm_QuzBZJM-Faztxg4F!n;20{NZOHqL$mJzWgs~2r<bd+`{suP~J}S7%*A z1N{7;XglM*K)C+&zHPwq2yu4;-vl*zXZ_wem;on9AhX-Wl&N*y-nZ$FseVNaIi;9# z;aiM@<7fLXJ@7`H%eTohsA*<@#zNbvQDeZLLL=7pynrVLhZrmcsoQAMPz*Wmyb)1e zm*09hb67JV|JR6jaxPZD!D2aHJqqm4bWRs}wYm3>M{WP2^zl=V2o6lP$6++3 z1`#o{T#!7SrS@8VO)l^?guYUkjy}GRsB-&y$>vM`biWeRDDC}?XlDY=h^8y+>yf%g zQSIWWRadBd1hajBiwT8ln8m5}F8MOk4)vq-abkv_i7a(FQ~gHBTGHUC#}kAUnGOml z3*r_*(Js~RaTjwuonqs)D${Hm8nBeC^~Y7Y|H9l<&aXf$s6K*#znT(lD|9T*S&)&3 zGPMucwLIMo*c_BOgxV7H5YORqRaRqe9#+wuP>N2NV<{>j6D_-)-8V3agB;5T{l{q< zqLjeAqraY`tAOq8KB7LZ3;2uT|VsqQqV|w)k|i)+p(HT1@uFL z`P`nFCE#BrWiqaSQH$u~Y%AdY=&<8f6dI{%nqxSe(#asN6zfFh1^V!fB6mWGVC4xz z#Y@d52Z01>If>I} z@qD(TNP=%GMS&oc8k2`Nz+36s^w4uRvfP!>V774gQ47(b{kqr=V-67q)U*d_co z-ibz2bSf`-Lpd>Cg-$96x}hJKD{eM>hG6(My%D^VyV)%|MHn(ULY8eqmw+~3uZ_z8D5l&V`lSPlr5zx> zDIMca`>9@yN1aC&PPi3=E}Z6sL#mqkckR#_RNLBsA?-eZTF|Q59xY@x;GsBeVPDB6 ztMmPK+4P2H8D2j05EMa=R5mWgbI0ekA_?+_26`ir0NvjA`%=?kDk%E?$qsf6tNEIx zExnJ2MwBh#Lhzoc#01@VB<|JNkUX$+<@U=8e-p={Tr%mh1(OlM<66K;w)X{tFAe&Kq$ct#G&$~HjHIYDRwA7Rmft$C z*IP6cU?QPIV>_y$(sLTo0-r!(Mu^LXqA=KAfdmaj1Uq9TsRb1E$l?gChQ-dy%JB7` z?|7}C(h_1fJ{lGGIrwJx!P);~vuZVaAG7eSly9Y-iuZW}=-htJK~F#BnFvAWWfVj| zWXVhSFp-~&C!9qL7peN_q_~O_MI^;Q)*g`;=zlB8iMUR^ovr z7)MU8;RSv_vpOvCLFd-sJHl{Dyg1PCc!Vd%%2^B9o>DwUTQQDzav zg8z_TwxtQC7N z!~4MPr`}{7I1^Hv$UjlC&Ea+;>!kdWt#mp~5gdv}cbuhmHOO<~vMAh`!YYvkTEz`_ zP>ESVeZucf#jGFRy^rTg9W11Z>NGPkP3k&51bsR|(Oqi0uuB#1IV6>`@F3V zFM~hlDHB*y!59mmi|;iTB*5rt14!i%b`Raf(iDusVI4FCcM@}8^7vrhA128))&P5V zxhkI^e{T=3v0G96ImS;bUErD{KPl=@pc*^b0K0iqt#HtSHP!r7? zDNqlKGIguG7N0^L&i_b1u0`9beB(5I{Wi58TkTNz%OKouRB+50Fj7z0qPN6;@o1B6 z3IM#<cM>!vj?MI3%qMX&)ELV1kE6y)g3gXgQ_9ijBB^1oM z_)h_OGX^{sG$h-k!$q1XwCpYAPW1O1!M8_?`i3NJ0U!{PIY3IByeRLJya=_CvJFIr z2bd6Ddm9>aEFOjn(~d;=D9kC0+8c)aU`X7GV7?!Jlxei*U!aZ&nUDHvBe!9<6V4E; zBzV7kEI)WhD0E};6wqe3bGFqNMom#LKIX-6CbOwNOBW=!MWNPC{39XIWs%ueK?*-)#BbuK&+{BQJq*P>z3!niGnf}Z+Fj=Bf^Q7LJ zyXZ>*$r7nDOsEvRAfJ4rS0hZnKv=(ciN?vPYBXE+*(GeE{tR215K6S}nn;S(&OC~8 zIV8#z1WSS$F<#FBZL`#eKb|MY)52+G-8me4&qG*X0@&j{OOKbLEU7w{Onifo>ah1- zCv~{iTr!2PI;pb9+_$Z5QLt;TO@+>*IAX6Bsvs!biLJOO@IR!>y3u~kmi$@q<@iT73KD|Ebq->M&-1^ z9-B2Mxt1zTW$N9gnw)ubbyJ+c8Um-m_y0p>YWk8u!9xqZbWHDE39^{lRb_6i@hTX9;?*=tt zku9Y{^cS+9@rB`__=i+Lh2wd|xo{MTBRlqu6x(4Q(s1KgHWNMZ`a$|SYpVFPXyH#W zyDG0ME#w4o-?{^<&_h5?+9s1IlbfY1T=0CpfEEYgKVnv^P6IGy>N@clztr`qoi ziP#HLD%UUdCZn9>M|Tuk7Jd3X0$hL|)^DT)-A2x@oXfHr!(C?L!miZ>v&!99H>D;R zdjQ}yv^x-l*8qAtiXy?dwF{({psWX>&VW7M&axx80muVea0|V46LE1u8b8fLR+FS7 zOxl7**CQQ(!C-Y8%pB)?-eq3);EQTTUs?k-%T-T1?8=8))75i_c(m& z=ce@Jn{2!ijeMznX}0=LY3sHXMXI;x4g3OngP+`m}5&4 zzWzWyE`69|IRrfb*a-p11%QwqpcVj)EBmKD*`sEh7ATW7j;~Z8?#C+z$DWoHvg+RI z7mcGH$XE*CLAhQDFEW6O` zG~SS}x%ag#4(%$Z@-c>DZDzLRid)4F>UBve3NIkfSiY2KDlA(DhnsKv5?fb8n^iS2 z=fbFH%c@;k)T$+bt$-pBDaVL+6X*3fCq`;$*&~uh>1ip|?JVQaYjk7(yPPHV~#WTiL zOtCS88i@!6P07_z}PX3Yq@QHZWQtQsYu@O||5B z`T1Be^n~N$ll>U^p#c2y#>YCt>nM2GLVr!_TK)LzJ;Y6YPf*!0q6m+83FA9%m-is6wmMf!rG$^o0TqB;%5_`ENHr7 z*n%H^+`j+w(Uy&oIsxnD^llXy+Mr;Ix7wI0$3?>zfy1Uw6Oh18r^4QcaVO1 zFqPGV{8ukg$wzcP#+;=f)lRJ$Kr{96Y+}%QLxuCc`dfyAU*imiY(@${5@)R0i2|+$ zS&IhOJq>Om$L)XwmbyOExCP`--&$fW9`~$6^83f5{35 zZqbY^JmpMaf}o5OeMU6f?{np^n*3Osr+zSx;(}4?6a3-PDq| ztc^~#xx+Pa2CC;8-*lzbT>vV03!+yg;Ue*882${e3SHwLk}zYvF;#G!YfBXK&|YQ(qKj?ITh!Y!_s;C^58VJ2XUFuaPdd>hks|vwL z0^~eNQjM-FVslaU@FqA|h|?h);T~|V5R}>x#ao6zY5@)YP=*fv=S|No&_c9VBGlRZ5{pCdXrFGUj47 zUmI9X!vRYJNU#hXp2s5?1Dedt>g8cBbk3OtR=wvfTQ#cDrL0ZXHI>F@#+j8L0b$h2 zrX&!7aGXQ~oZKj)7qZCcdxh(!?DUPjx2fHAWtm6?2c<%k1QSEp%A`SgF@;4@8`&+; zfHgsg6<}f!07UQxv#?POXjCL{1-OJpBywPT84TZS!KDp~5G%P$yB$LTTTReTzku6u zR;-tBcy`d0Lm2lIHeMIYlbu=Hc0SlITer{Xy=#wY0KkM-cesL8rJ${L2dE266UJ(Q^m;A( zOmu@w@L?5+KsXeA7cFGWml=^JqgrOmU^VrGUh}P zX~i8QT6!vf91)O^?jd2B+Kd6!mgyl0^n+1VCf zFwTwhnutWm)_}N~5hgi6(Y6jC9=J%OjNJ9hiR7qhNk|yLvj%gu$+VPFv<#rq`gk&J zfE%8cMAg-UC3X)d&UH4J%@`l9zUj;+u)ieO$+y zvMso>6szgZs1V6;SJOjx51*R*b|XUgy}*asnPto$r&(-~Z!_KK^x9UV#wR-fh20kT z$z>}f)-fp5q6bB$x{Y_Mgq6bnO-2L|wsGAoaK6h38nM|_a_xCaPRho(K2uajDUm}; zQW~+8Lr}T@ll$)98WM-)*__ROnPS9sRh_rXl*O&*bvQXl)&)8Q7Y08xyM>S8+dR>< zTv`YQbk(RQC%q0}jmv_M0@ZL{Snml|k<;4VMc-PT@1`1EW+tF9`t08|xY(vv3Tn!C@lj{90XADPykKADbH~ z$-3S%vY}}j^+CBuN+A2-hEe|S+`^lS?Jn(w7B5H^rC059iR|;#a*-f$oAMrbB@W}; zg42`e6Vd_+X~$1!u0O*x{EUu-Il=fxI}^S7upxv8F5dvVwLW<>M7_mN#Xk+V7DT50aGiB2cXZ82 zZ9i_fX)Cd!TBX{4?p~G|OOxogN!QBYUE|u~-fBW2zP3>0L7+VEE-Y9;C5(do*Mpr8 zpm(t6ZBxfC<`XJQm_4@_lUYOq(i{p?wrAw$Q8k<>+UBJ11jN`5Yb#2&D&vEAlE^O~ zlv6TgLk)>Cf}}jI_rZN}RzZgk0B7{DR0appSDlza#m)^CJ3h90YLILu1MfHsUMO}{ zKoR!_>k9}E`(OAIO$XanUcMj8v52!~dz5jcwIOC;ntIQv80My-zjtV1oca0s=|;R6 zYPFs!+YCzMB=qlsCAu3)uUn;B$$Pzv+NY|OL-q1OyRKG#CD=J4v0h(Y{*q4N_7M{p zcyL|^$6!rugf1Mdhcsh=<0QW5Rp8H&lyHB%aAA|{ONO02HF23l#<89(W^f5jhZIj59J9N3+uO3QZ@Caj$?G;iC^nE zr6$dO%=la_X$WpqhTE{xO;+vIa>m0F2mnkq(1QD-KKqVSJkw^<`n~yJoUe}^>@W4i z`Rm3NQJZ+7JYLkvTxeOQqCeC-m0#>F_PkE{5qcf?<%&Ne;?y}t9UFp%9V5~sOGr>u z$x=Y(Voo*e0(ZH#Q(89xoH+K_k~dKu#uzkA@h1hQ;nn^fj3?-a$zTM6LFBzF6mzTP zHWPgEeW3fh(~pb~mfbpk4RcRX66*%Zw9|3z{=9aZ?(>r8BM3cj=h&E?TM2_>ZVbIj zH-jToObKS}EQ$cq4=TX`fg ziCu@`>rd@rWEysnV5ak`9D<&N!XhZdI_He2yI|REz`lyHM+a)7;AT&9RH4sR@#A$=HJnmQ0gPG0? za)jf9L|_#isrO6L$yXZp-!*Pb8vTelQ7+Ou4kKRHyQHV(OzYh0t%B(cYOsZdLaWm?d|H2saF-9#P6ihS1%zJ-H#;F1+i(w zGT9^&4s9p13kyqqyVd796U5tvtO4N^)Q^1ZT6z@QyClUKKbL5{MAZW@P+huslR5ue zKOdyb{$rc{R5oWVayBFJ-35eg*(O=m$H@?pb1yNT8Hd&CZt=%vl!Xr?NUlT)BJ9C9 z7A^%BIU|_OytemL+#%k@R8Kc4ILE0X)%1+XS$De<$@ZbSg1F2s>fjAKq_m^ysnQSx z&+;m;(tJhcgxZ--!0|lOrgNFI)15k{#a~u>()I7O;9q2V2NHqNcDr&ojnb|JrzA#E z^1eltTeN7O{~((l?X<`c;H`U;voco4($SpyjduQMg`1fSFYslA=E}Y4cdOWqoFA7}qFFun@^F$BKJzmG$e#!)#fb^zItN zaX3=(;5KC!g=sMEb}f zaW%@PKTSHYG)>pLUTSaeP&Zo$H<#$2i2kfp;EY~8nyB^&wyB}mIG zps*f6-~d68(`O_4APy03ORUW6xJPv}n?7av8L53L@)5fpL{D6ne9}(P$lzA#nnw9P zov|~K&t)s3PxA-`O0pf~(IHQ%rv1A)J8c?nqTFNNvq=;jbMKkts09lEs)!we8(SCc zTCwIxbf7LaLkpSn4pX@Md8kig9N<3MdJ;-vmXFQ~D+F$TRM`tR3# zNr_2JIwmwj0S2}7eBdT+AEEnxrW1>}Gp94}AO4DjGxpMr5*$!$0A=HC- z199;tHx$%l19-Q%>+eW%kOe5q^l#=OhE5B>NZFuA(wx(-72;eK{83_XY4PFLKQ7&F z9Ynf!b!lsjOC0HuK#6+vbk;0e$o^X}-gwln#v~!kOSnnM_nLUDjARWC$R_*45RSAV zIb?Ra{f3u&P`=(Ir7D*?b>G~#lQQ`T+41)!R?eoax)qvpH>06lwd)HVNXZ6z%cqWr zpBhRJTg7V!T1(o%G6UKjOH&l7^9&Li0E8o7=x<9$d88mbFFV{73T!N7*_%2S0r78g zDdD?kD>ZlB!jq)_A2(DGxLsTf+a$ZcarQZRs2)#916T)rCE8pqISf9gx>NW+Vrfo- z7dy%MlxE52!Vy5agHB@MQ?42$@At>@@Y{N0s~w#qqZskt2HKK5E`QCbqlS08x9LDQ zkKd55CQL`^4trbGp$;V)h9lKlE!ouDS#{m3dYOWh#E`cWUl)5K)eMbxG@+vj{llr)~xq7AaI&ZMaU zO4s3`EJ{n)1|_Vdo1ZUFr9DLQ1NN2~+^rFqjPVt`zZKDXG7Cy*_Q!MNezp&BGq-WK z>{A@O0vOgWK#6r7A_7lw3u?_|zI!<=!9|z5) zMU%=&n78P6Uuh=gPi=ZD?9N=GN~whn2<1|)ltGn|1J~u3TnqxxjpQhAB;X0*BA&Ze z=|?vL^9LTadM!2l_Oa^-6r@Ou$$%Fp4d4wqZh7cXPgU!eVeom+HEOeEF62NSTf$yVY#U8wHOY>0lFVBA9Y{ca z%pwpLk8GCG&ZMI2s9|~zK|G+%G3=d)$4v#`dlN+an2^0t(U>N`LQ#UHBXC_?l8h7L z!i+>?#+4}mKxdBWP#JB%_rA9AA0h>+!U}XSmk?)GuTKIY9K;|iJrN{)8w<2hfPh4- z+b5VwQ4G%@&tGW7=<=EbXFUqLx8*IpZJI2fjef8V;bdWiwiOG|C%&S=-|T03JMvL3 z^m(s<1*_iFx9p?&5c0$RUJh5<7R;NOhnaHkz7;IsC3dwY5)-ePFgJpLWgd-g8EjK` zE7F#^$xG1xCw+p9L0>mbW+x6q7vI zc``nMZXYs=mFxfmzhcv9nYEKmK^J{jL{n!pYd0-fo>owUjlgM4^tKHb z`~k-UBUj<_1hwjDsyO8#7`Zq|3yDoWKZj*j?PEpJ5ill zx~S(ya#2TJ7h_jGFMW``)zbVbo;u{9Ct!!X)@!r-@JO!70}@mqjoUWDrbncfnKm7x z@qu@&`L?zX{I;girx*k|toXN~(`#X@TL3TKq6v<5Bxi!#h7cjsy&i)Ag9T1p z-F#Qo1A3y|fBzu8o_0LXP2a!YFt*7zxCh#Odx!PQW&i&|xt1P`yW;t3Fd;sy1DpZ( zi+eGNo96h+tioL9JvKC3BqAf z2@E0^cbBGLJaKd1%$a?7rF5jK&Nyv20eW|&xcG0|ewse_YrY>>wkxmA^ckM%@qO_N zyCy0nE!MO0#usdryO!>55#1xD;WVB7Eqs*|@-H*A{rr4=5A1mci0B|;0HO1({w@we zww18;Vr@sNtelze@gh>n}R3l)3Ng z`X=!hAVq-Bmi8BmhOA$;LCfEHmZqn(PZm!L;{1Uo@R~Wu`&OTAC<78>akA&O5+KH5!}s&J(D$qOa&^(~c_2?b+@S^|7g z_xC8l*7pc{90`j7V?bEw77_@ACjhH_YB%-i6ouksS{hnRfHyMdEq#|l)YL!X?)H5; z^?QHQ^3*PbR6Hr+KbNSj`VO0F$-FE-i{2k8sUvi-q>BLV=90TvV} zFggqgiveZGSSS_>3BrM3phzkb8HFV^*Ev!m*=UuTsFcq=>ZNc$n_m62c2m50=j$zJ zYt_5|dc8fKT^@USwRd?nXH}BlQFdSbq;3)F+!pm))U$B6Mpve~TsMBahTOf?gj8KJ zs*x+u;_cihAQ=k$QBTb;py#c5Yw=;Z-Om;v0f73BjO0gr4R}6!&BjroAYINv_cWpa zXAsB3G=6!P#;I_crp-*cKM#rHfRH5F66`U{R92_3!8EADFZn{UGup&8n0%S>K0Iv9 zmyOKS`@MwJtV~~LF9M!i)*Y{p%|A30aj^O+DRo+wTu1ixW8%0iXp=>XUEwveA5R?t zb$l}a&vx(#%M%6y!GO3}E*1<0gn^K-P%I=Yg@S`1sRV`*3*T9FdiMP_=D7QH=W~5+ znbpx;cdaWc;3eg*0&~^y@p?U<{w}5N|KzVp{_xdv7OhNr`?eeWQ>oAMU8{arCg-U` zqd;}&W3h14|D4}(-L==@e)}jN{#xRZv3dh|7sYCR$H&JCi?V${qRzIEdbaqg!4E9d z)+e?%V{nF!G-#QIr!z@@!Ia?5{@#$Z5qF$&_5IM!V5m9jYuUmRKmu9RfsWxAO6-;b zR-CN!ct*CIz912W20nX-|9%03L4dGeOc)~y0>ObWpe!gF5QZpx&0^~E?vr;E$!S+t zF5A>sLv7x*H{`ed_L1)k*4^b}ORWd|86FsqhsIUouY|rSO^NkmM2kG}#zGw)ohWl} zs!gM&l*;YTO+8N@8$XWt`fHN<{=Mp&46;ka8bQj{xZC1k0(6uX@@OU=BcishWva_; zyvLJ*2BZG=`Q#k#lqeUEZn75Wf_f+Vt%FuLBy{OyAC-}iH%FYr@om23~rvTH>k^u(-u)tU_79<6ng&>Mt?^5Petz^A-a;6JOS8@ut4dr&X z9EjZA=6gE<*75H0>dX7t;V0UOGv$^TXVstM3Uu?Fu-S%h!&k^J>RV)+cfVC=nk!AT zM*aTep~C`@^adQ3TQD3pRh=8B@-tyU_rFbT7uYfF?$3QI=iBDP|46(4ckFy`&Q220 zuhB2_o`oynp6>bpR{I9qrUyT}A9g6lybT`zu2db?wo#tY_trE<$&Fp}r_W+VTJJ$S z1I5__&;JQ-+=4y1{l_pyn2F+C`hpI*^QAFM>*ZU=>{*fSutb$1kOnf5OY!@WAWID6P^xBAu;$op4 zBRSlogD7{LS%{2R*hOT{Wg|4(A)sZ(u7HIRhj?JmUKwcA8_TJfv`&%mzU+Jcfl*QV z45vg{gUnycQx@j4xVY-vuJp4EYy)78Y~`a94oC|8J%7iFV>~Z)6F6{JGaK9_8Vcn3 z8dv-v$xw2aMQF=i|u4WeMp4hFe%Fq-Q3p+kE)k*;VuAp ze*&W6~$X|Kf@={c+e8OF%#Y>)6tba60Cwb+?-JGRDJPMU8)WkW7*?kon+A5>@ zibVu_)60Hrd$nzpX*la>{ADS1BUPL`g`mjDS@?_KS5`n@;H~3Y5QM;}jOYM6BN#copObP zzGd^%j&C#S8`LT|^evn0f{R82NC9sRA1E~omKQ6Kl5m;%hwH&l#3Vtl1smo*k;>hx zyi!OqP=)l62=UlWKM#Cj-fbv)?ABUPow8X8UweaX02DPb4J6fa)TJb93W-|jOfa6K zm9OQIRnf1%qPvOEG;iF+btSAebQFrahDr;OYh?3K=^X5Jp@Hkq=7}PgWPGrM@En|X z_E59uy5A|EIR0$&mFt~S2lW$_1aQ~NaxyXC7Agcg-|iz(qBmlpXaZ%ULtU`A13Y~i zAC^uw8q=ZL7ph9rsj1EY=$DctOb}le3ELOIy-^Ut+f<2b9_w%>9zau5DgO$ty+56A z_!tP1W)wV=yX0>vBa8IgU%Qekv)Slz!lcb9nYq?r9l#zTRLotj?!3a0^1z zQzhFEcK}GTj2hS%*lgxq!N`*fBY96lu|2>k0^5nK<%PmH!IH5nhQDq4T(PM6CWGRJ z@bv9ZzY!qsdoQO!zN+=4QCO##H_-U^?aWh(@9T#K)UJj7R>J%#YoMR%w7pocR0k$i zrwLOQ{JN|V3xtfJcZRW+H;OA=fu^ayZRdG=qItt^K{nP#0ROP7dFQgh(fHAM+b{D> zRzO(7gz(^0#`4@=>;v5#AXzNZPVV8$dRpzCQj;<~$gGWhphEFN6WDW=hgcoY-XYk@sBm;g5l6n?Q~mV9Z0Y%A6nK52eQ=bt_G?clUxRxruoKlYbDk_qlci`*Vynw3A~{e>+}Z*LP0 z@v5jRf13=cy_|2>yIteWdZc7OVjU^|N%mS`dx6|MDoAVUlW9qFaMc$hXCMp)UFYad z0j{%t4wRo;=y)Vm@F;9;xd7Z64ZkcwgIi+V>aaW*e<}{Y;xtB(bZIBBp*Zz$qpn8V z6dGUSzEirFV6dlDsZaJ2$$KS`U$1h|XZrQC&z+?R_7b%m-+c~(-&+zNtjnOqV`4sg z^QIK&jy5=&LhL!x$IsNxskCA#on%T!DC9gU-CBNab*d!AlYK_1=YOW%Ro7c4n{Aub zyx65zhMa-95gJ_n)?75K#OBAsd5Z)JeW`$QJ|E5Q#2qJDxy^5c8q0(G&B&@rQ^Zeg z|1@tv`w%OW^{Pk|9IYa$l&N~dH$y7%_w`p6;lpl>nw?~Q3YgvT!3)+K zevEM|`w{RFNCeP7uy01m%e$Z!Q|;9>`$%^mXW^PEdxF_Lrs8ZU;FE^$W^A zSX}cxui!mBtUx+k9SaU-jzPSK`4a6liTG`Cx;+3u0tY|UUxV3Gb+0ylS`-c4lLflv z%w`|V0q-W=WAi?2R+)`>ksAsTro|`Z{^;@0!17ued4Vu_-4Zxcn z1Jl>Y#z2O>Bj&&z|!?0A!GL&(m5)$_$R9V33#+Yz+_| zSFI3wa$m|K2!;b;>dI^F)06D6^+&wM0iXcj7%06F0MC6rJuMTcfo&Q7VcJGRPR+K z1_B}XJ%OPE0P>%X}bD7FCEc8sAT#n%JKPCm=_z)SJ(r|5>gDuLM~0?Sid#i|WE z!J@JmUn@7igNO2rPJ`&1C294&xfTQHFDXN1K-UzwLvn4;rO_R5FFp2C{SqLtAUVA>agZG+cfi*kDDPaZuV&3u<(&RZ?|oTuba z@KQ-q_i)T7wj!v9&Rmy63Pmv3$dx(8z{rpWtm2Lf=LV2TbGs{!hDdSt6>)4kf%S_< zJ(fPRKcmSr(?X)oin4%Hqr3PNdGxoHy4@?><9d%Mh{xr;c8V82$^dyVP2bofaJ{Qf zW?^WhKmVzt*DqF01V3fbX!3{pME-!3mb>wqVJ9XE_{Ty*o(QK~uSIG0>T+)oq>0i% z##@Mcp;@`J_37D7PZVtgcH`1kfi=1f@xea2p~NATT-cj<4KN0JMeUtY?J!us66Cet zo5T^=6fRBleiQ>Z!cqIU=R{I3gw}cb9fOSxOz+5wBs)yi^}!Y6hpeg8r76c=&jkcc zGki*p)lRzwM6C@BI)i0{I}Ap0k|wo9M!B9pRC~)HJ4lG^i+g+EI5bEku6bv1uj)E_ zhT0U3!pv&FaimT8pD<+OTgP&gQ+zVsrHA1#u zrR{h29RA$;w|@SX96&1f&mJ|<4KDM7;t&lY`N05Lv()?;Pi=YIDc!B)VDqT~T8vc! zy&)JB^2LMpKuBU1*~h!0!Rd7j6K&s8D|Mn$8)i|f=DczKykJPuMLN*0)~oc1 z;(_!r%M|ZWEZSD>LS}Flcf&eA>;n-oj<%1-rt9@5Uz|?^CJ;F&6D{QkoCz5oAx?s@pk+Gp)rd+mMBIx~ke6WJI2Z4Q37qQj>fOK+JhVu;Hg z>`GB{X-%DKmQ_?_6`!v)(YNy?RCe!jVlg$6XY=CXS`~{{4BY7zsXevP@EEcnuMNH_ zq(5VPBTDR)^?r3d!kcpE#*SE1)Qj1wxhUeBcZQ((pgbGCi+k(Mnspy@L_7z@o+T5`Z$nbSGr9LOuF3BSw598*)Ww{m2Wc28^ zo7yNI38Bmd4-0mM-*T6q3JGdBIfUEaC~GweJZvz#5rWCRFP8o8#wQ2Il*cVScbTXp zE~Y(;)X!SQXx{oR$wG15^{&T5-Nw~^Qcc~a^-Q}csOqIshn^>{qSLGBdg_rEiZ#X` zg{7UYU@-AD_Uf7|7!zjZUGQo8CeHX4gPNR6^UnvH_upD@3&A^NpXC}gODXUXpV|4Z zJnW%&DQp@1-lYk}A*-Bkt}d>e0^=ZYyEYr%9NC; zN#_)mT8~9q($4g$fYcA?*lPXuvhdz8*>m-&wIiG&thNFf>5-p=HPZ=v-sJu05x1e>%my`bxA@^qlhG@Yy7}PIpkSi*f$<{%Y!g zN@0zoX1e9<^4;yuL9JJ^el|qf%r>8YUenyWsoLzlP&h^BRwuf!_9oT*EO~zAJ;K)I z$77U^zv(^MPrU)o<)+~t+SCIwOe!OXpY9po&6B>q$}ZHA^Hy&Bi9NXxrn7qnH?{wj z8=FRz1H!5Fi{*ha9_G`I=18841)tXVxwZT0YL|pIvjs8pk6wEK|Ipsd$JBI`h<14r z&5NYh4@^FmN~YTwZQhId<+2=EuJl}F$}TJCtNDx7N^irwgPC*xyT7m2jiYwm_0OeV zKB{h8l0N5svc&)COERiS`|{N?Pl|bCLd$Z0%cq60luy$n?1@Bd&uAa|2fB5bw5AyA z&nx(`DSPXiWZ7&zPIsng7*!s_<>5}r+#szO&)(AyHty^8qLWc%Fp_P1fVj1Rd#seeo6oOAa4MB+wkCw`3X+K z@AbjOvwEier^#pf({{rpvq5hj#g3~z&Ap>q8R(j7QnN$3oR>CM?!ukSsF-q0!IoiI0S<*YqzRZcsdnvA-un z{!z*JFr)}Xa7hn;IzM&Oq$MN5Y?AwG!7YJ|#QbtiQB#==-k-IUdvT+XYNw{4@KxF4 zS2EaxW_A~N{TK9;<0Q_{=Wp#&`G*V~IhP$0h@8yKuc^Ny{S<#N_-kuo_gQ+-$)z=o zN@J@2#mnK}t4uOqHJRPUK5AP(o1I#k45_@vG$?W=BE)3mknV8?zg8&S{N0qAa?8at zuBs;!Plp8sqb?)%87X{r5Cq0yhnQ=dpTBNB%YXjh(CR{DUB}7Od4|%@ERwpUw^ZBv z3tDG63QKSE$$58X_=o_~QfdnH?X6w|Z5Rc@G34H9s?rcdVrH>W$6X}lPja0)I`K98 z(RHk={7l8vY4|Bf`^4x+>MN>czdgIe?24AQXKQK) zxl0p{89ApiDz)5wJt?k#7CEw_%0rPM6Q#Dt$EyzpTjoA&iz0J$K24pI9{twxQmv1P zp6s}^Fi^!(PEV`g)QPeD0bwbB4F3}$Bs8<}E+70ih;VGXOam@fl9#`d{5#v723^)K z=$a}Oe*DQzwDPH!af?a&Jzc=4RY+>vd$y!@{~x2zv|QVGdlDy#zE6F#-xk&L_j1iR zNO0nOdn~K(V^;rtO^Uy$!Az)r&(5M>b~WRZ^ZN{g#M`n`2PS<9NoHqt z3g1Y>(74a*FqC%%DMLAu7#|j8G~e)p)zPMkS+4h|su3Z6IEF3r3wBbK!H&Jj-L90+ zrBI$jcZs=WKewoi<-q*s@gdq*$W5qJJ}@NZnL1()UQap5^yOp{L;4r5YoJ zjz^3%cCSkar@p)m%fgDf^bA2~wZMk{sjwd}<4&A* zxgUAieW?GYnYgYZxw>|3q)l7&eQ#lnvlz*~0U-?_LH|Y>g_nG)tt{qw!&xNdl?z+= zG8M~u4*ix#eCpG^zw7e_ZJpX>HI}i0W~0O#@Z`2Yj_Vnp@0+@3u4Tb@hNL8p(s~|# z;gzi04ZKe6wbRN&%oeF~oBZ3gkB_3g#1bxj+?^i(Novf(D=bKqchcP<;vm5tm}PH- z#qMVBw%n!=Ec#1VxfG|EGp~Cx;C(J@N7}xX*X>>Y-rP$mZv01tsmiw4NzpuV$L1!GlXH2H(^4K`piw|-c=vDeCrMtDAsUwr7S#KjNh&Bq2*cB)Fxm}kfM0@=B zye2O^L?%7{K;g4%HM7{3?(>Y?sP*1WS83wjZlR_ATVe9bj+;J=r+&X8vh(bRX%+PX zBNKLhRZ($h8UFBacEX_!6Li1r#7`Tl@~PoeAX&lkh{ zasdh*jm{Y!1Jqv4E{+KVbsc z8-;tHdkY#aimEtkRIa8N%sSVJV#>3)#1|YspcFUdx&A_7|J5zVJ#%4-f+zKD{E4fe z9ZxEIFSMv6N1(mW;oDVq-nEY`3R0W(NK`6^#5Dq{;BK3rR$-bwJ*Zw-&R?^s zpR6qKX&5m(m$sFN{xCYVB-P5G^&rxAu)tu`-I-``ziw&&MxJJc!+<_ztN>Zz1+A`} z+ycznK4BKW7m_ItN*jDpdnNsg2HLX(^hOlD2m&DoTLHRD-#^R{5N0Y0UR}T5xw^&k2#0BT|!vm$}~S`on`U1E*OaUC8(g)3uG2D~!0J;QfyPYZJCp{5gAbVKm61kGR3y@OR_sD$1yqKIyGM~RGN@H%Qh)X1;TzUb6;pbjf*f(> zwpR1}ODeB~OEUhlXhc*d7_N;(=k8d}b2av|RitXAJ_%|x&T*_;(+YABxz9f%!&SDp z9TVo#XH<{HEIzM|hMj($$)TkfI#5p7x zzqWa>(Z_x6xZSPQIGp=yKc(H@bwmF4%56jQ7s>Qyr0OXq%z;FLGV}epYaiqe?D%4X z#)sS=QXjQlFiCDtT4vqS7&OnM%P0K)5`-PzlB^rUan|f-e?-_}r$M(M#EE5)JeP++isB1TsczlqZYdZLV2wdlTtf% zRR}vxL!oxFd7YI!*(Kx-QTW{n$G4oL?IHJW({*<=Wcjh-94Qaj5Bok+B6+~bM*Cy* z(peqrOBT(l2>WQ2D+;&o-*I;H@6d75mYKBDWqp{Q&&0&R!6TD*HSda@W6E<}7Pa*) zuWj+Mv*xhZMLVy5bk-W_)N0Ca+27t779FL%_a=BDmMxFTJkh!7TIL?j{cqyrvh{Hd zLbi{`^_893LtS0mz0NBJMZujZ1<~~R*IB#;I??o6Q5veJg{Ow|I3c(jn z25RGkj*AmrsQ1KfybA&g^#s;H3Hc4hpAKsGFc2H_=&`6LV+*4F&EflqKaGY?YR{*E>Yol5|jqzIR%iv z9msyNG?;L@iK~9{wn%lhfBo9rJpP7Ux0U*vJjRR#B36}K>0D6)68-Bu!$wXD90`bf zPnq3I`f{VPOP7G<|H>ZV%3WFb&9%A z2*?!8K78KJ1N3FJ3Iy_3g62NqjTI%LI9#tjx2GjNl)>jvpb>wF!OmEsS7W(9Q7yRB z?2q%z>E6V9-=51U%6MH&MzpMBqtb}PPdT@>E;aYNhvH`rwg24r=A_aJtgsY16UmWJ z$;NRsx8f-#5Nu)~M4tHMv#CcBi!i5Bkuavw-s0DtZ%&V0lqQWF$2+`2BGNfL{V?i% zcX6ny8r#n&Tb1(ru;y!sC>xny=G*?W^!D-MOVlr=l=+?!Dm!_-V?^r#4??29Iu@IWU6nxk9 zWGSg&Oh-P0L|WK|fo1;mwk*>Sb&*S6zOwKY&e$H^NSf$_MzeCpM#Im_sk=VxId(N# zwhBk7I~TF+H0Z1|((gtM6?te}G8o-kiCS5;E#rF^AY{1s?5cdkejuMe(@I7LuRov1 zMj`zvXRb%FcTJ)ld^cujA}2sFHZL~9=^-nFdfGm<;-9f8e&LZ5shDgd3~i0H)inK# zeOe?PTcuq1JQ(3*eT1#3R291>u>3kVBCK|7ZR5F0ul@O@xRbr_+{a2NV%?pm?*;n~Rpoa9WOwVA4<;>RA_YA& zVva7U8aueRs-&MvVOSq7HjRgt7mP(K1wSV-Z3(k*r8%d2^;`KBd+#n!Pv0z$k)n%f za&yYN9igBDj@@^39`#@;_F;LP4W*=xKCOemi_92RbMxo>kEH4B*l=|utPScqnVxYg z)Df^1+b0{JHw&3AGT|{^dVEKeq1WNp1zcUNBaTW39C_5NwGaQB=ED{7iv*1R$rzVy zzZ>7DzBl2tEn%cE##Py-W4h+>oa%+=&T5&~5kU)rfRmu#gC1G-xas3f;6$-0Z^4w? zaC*~Rf-@_3)xY_dU9QmbRZMl}?y$XhYs^ZP4~Hisg^TRRJs_cW>Wh<>sea+}8&X7-V?-KdMl z6y4nTDE7f`QjYgH<IhizSXNyT<(iIz7UuY_ukU|x+Irkh}3`&aXSq~(S6e12dNn1 zb_8L;*&TA`h%s-5o+rO&{EG17Jw=;JOlhx})NJXvJS<%;eC~ng@J(P#rH-}Ct81Kn zfaFQ%8?|2|p9Cr$h=?b&%~}+z_h~q1Zz2zh-`R77qek@3nW zF4g0;c~);nb@$OtPVy*@rTwP!z`ms&rl8(*V_CmTbtOpt@`aF=>hEKuOYs|q_MQ6E z$!5spp)H)WI;U4Np!fT4oQid2np|4FC0;*?UD`Mtlgp+q6;D>(%C31_e`EMwvcbq) z@_HEVGsDOEq+$G5ez?8A(v7vnH-y{8_3`cKCH99qQW>Yp#7nr<6Jq$EQ}JJi8CmV#@c3jSui#gP+H{NIZF2nD*mTU=)Qy<3;m@?gSCgso$+Odiw5y2ZO*UoLOUo9S zWv?fk3_WU_JX{|qSKg>dD%@?OI3d{dk(&9eV980;!IW#a=1+*M;m%Fj>Yr-qQKBSG zxXwnV>uB1V{4+R#Re=JtAw@ja8!2xsAZ>zr#WS#Xfu8%To#&^;rccq*DijxEN| zyQY{)gv4e$-;_hXYk%EwVXF3-PwR9^nm{|Vkw+x2`nugR$xls0kZhqYp z|NB>5y6;rD>BO3fByO`Z%%k~<;PhOd@Yk? z=K9qiG*_PD7;=dbvQxC2M78lXQU%7xbRNw7r|t7=Ss;>@TmsbuXAn(>>scfv?483;$SQ z`OQ?8Cav4GH=NW!rVzp7kyK?j`+DE=iHcv6GFNc>WR%q~$xQ|4)k?Oh8|jf@CdQ}j z^Fa@zrRL@3>TfP<^rS2l**4=5Z^clBky>VYPN>w* zIr)?vcZ*gA9C0HG^;Qq^MKkTzNz5j)D~``8=yg}ArO@dmLB6Nab)^UlG^G>&3@VxdtA!Yv_4 zQ1Owy*YjuAvOB2vTD`;L-^X~OIU|!Zhxv7;6+f?V9zDtqVpDF4e@%=q3Z%)^SCm2O zw@)%WndQu+Vq9YkTv^Pfx?XNWUEJDQE2nYOmfs6eFk$a4aW#8FE%nJsAx%k2M{vy@ z0o$5=C9csI~ulde`7XY zSxbSYd#!0^R-2}@ZOcF5BJx8cN_S0M z;`6UP8Sh=(nm!NS4ZV`&%qU-AVk_`8$lT?2*3Tl3Oh3k*@?~9_yQ|aV{B4S1qPOWg z6)91clHNmMq{@k9!C3I?s_uE!3EZIVQ4A!_Q6G80px+_*!^Y^NMCe`lx|A7Ilgx14 z&8MtX-YP@R$J9=HUibMGl=oU^HCwHi$7)a-vY|{b663$s-2{;vvn0*_bKmvSUU+}~ zB9xp$;D?$m_4>VkrFf;HMTxV){-Mb6<+hzkDa7lLaIa-jnj7crHRfVkk8hqhb*~Yv z(vR-6oZ-h%{klf2_X6pE!DU6!TXgTT)G+6j9qF95>mi}{kPS}Dt@d-7JsB7@J$Eyi zcwWsG5wqEB7Zk#4fTY!qlMwr-j=DN?eVkd0^L5WH9*YP%@ne=s(8PK54rUD?YF@MM zReieX+3Hw^(P@}d@aFz2w`dcpTl}dXWnO06QenA2FsQJPar72kovV@2AHC9|Ha`7{ z>BW$-urk*~29-7G*ZM8~eqT~5nU1GN zU%ko}u6l$U5mojn8ui@eyB6nj#iL--dK&NaN{#lpU5Joq0HyUi?9C(J5cI(^6Kj`*f5EuD;8&4Qt)9~qPfyn#SjcBi3`Mvx3Z%pQ{ z`gUfZ%rBFK`BHU0a_*JvraZ0dKf@8z6OAaNWm^W2WKZ1-%-uB<$;!pQ9! z?ZjO&J>{j5m0YF4 z*gsxlm~N_I9^_!<$B=ZOeVABn6mLQ;G-fTi>Nn-`y5W6gm%c}B%&}8kT_J9VZrbRS zCui}SAcS}($L}TA*3&OpDd%}^(Nx-}xCg;s>CTUf#M@K`3s6b#9+!WRKaCCJ0;2;V zPN%#_=MM1^>*7+cWKwC?0_Ci~g#UVClXbqAQY*(=)HKRdB7AuE!1L?&d~XVi`o8ET z%#X~iIy#H% zt6RbDI?rPX=NdwTx$-Gr%MDzgNk4H)Cw9M6TKV?L@%NFKDa9?4| ze?1LyY*TpIJ9AW3FBoNTIe<7t(4xqHyv3DhaGEk-w>oE^DP-tMY^9rABhCZtbF8)K z{bx5i6r4*l12cFIuqLOH2P5y>85?X7r+a4jlra>&q^?VRNWWC??#Ck5ZZlY!V{pAP z4=-k)bhjvU+%kn;Cgy$D&e3$tVn*(Vn^iX*t~F>1 z{8Eifkv)4tXDGszM0j)kHYF2^iQa=ekJVn`D=CJs=ma??8pH_TzF4&qjo2*+BUbV84O*{DH`6^`joS3nqXMlN6_0}u> zv@}N#|KxGsgTUANE8Y^>Rp$OhtM|r8tvM$5hdF;ncEo<4<&Gw=jTjXuq?;P;4`pm* zV3rJ(!^dD23uRF~J3nDa)img{ij1jnG#)C~CVbo1Qcz=baXIeL<3-^L-WVIR;>pO9 zXghr4?HXcZkx`nGTLSiq8E1x*EO^6=o&3kyCXFSy^#pV7ralU0Fo=zB zk=#A!FY90}siov9{7P?P|MQvcMXlpS`IZQhS*HaAC4XSfybPI8fJI18)HIsaC zjIb`Bpx2@|x2qnW(R{O7J~^#E<{mI6Fk5j5b<$&@D5z8n9Z?!&b}mo}7-}(@LRa%a1uWK)LZE>IKyqN(MN6K zyz9-7FzX}gPxpNCH#PxdV^3^*^rPx(5tb|EZ<-!H?wT^y+quCmY(aS`iJ4vto z;O2FlzwE2va9vFO)^EO!^GLQm!u`bZiQ2d3{Us8Jyrypc%Uk!W+mc_bruX=y?Iwu3 zOc`x}nTBS`70G5cN=xh?$@r$^Kln=HB0Y_*$i8Ay{q#$}cv)EcgZ#?Xlz4;7rT6SDKoF4)#YhmT*)1Mt-}D(MoCfs8Dg7( zbJ~ulf*RE$`(~4=MHNq(bHoZ01s)`zR-_pOGJm#zqRbnmOvxYrZhcpX<8lv8I&U&< z=Z)ZKZ}7yCOVflu_1cZxTTg5SK9nqtS+Z`Dkn%)5X^m5l-7^jrG4a&*brH)LpAZ@6 zR6h35eg1CLn7bl;`_>B{6>%qumWQY+N1*`aq@Q_@E=ebGEkh0)QmQ+11qt?mIdA+_i=h1aiC$?b$Hkhd+3~2mpB_zyRpK z|8D6%M+&PZJa#eIR9+0g@3jCr!DMyXKQ;)n8WOB{ok?wV}}5=1P|yo z|Eb4w*V@VBpC$nCvA4GQcN#7A;J&M(rHi$b4Y~~WU1xh2TbLmCasJcj-)6I0|C2{= z?O}s1gWk~jgx(%b%>SgZxjenBoM1Z9)64VEg#4oi5tcr8;H3Q7{%-S+0vkPSMVLf` z-u_=D{!#z+N_~C~_pZWLuVbjmF`Z8XDmy60Fyts#5OQ$#0em40Zzasf0EoNmQlYRk zwWrq~r^4i)9wMN-(P?sME85xU4c#*udZ@dDR>1Awx_?Pbc9`e?Pu8E;2!N4>0~f{x zxGwD>nE>FA!`?~Y0yTlvodF=)1^^Wd*@RE&QUO2)`=+9Rz=cFZ22HyG0IdU*2~h3< zK!*T;fd|SBD61jskU?mc5|kED%0mf%yORDg08DjoxUfxXMp*X<)-i&4=8)R}Fw;U{ zS(YML?g30I1HkA4)51{3!!pybJj|!N2J16GTLhs^&~_>{04QO*RKFl^p&s^+*$wTc zg#Ue^30?Lc=1W76kPfJW`IJ^r?+e=@hY-U$J&|+T6`(wNU`^|zjeS`Ua zP`X09YGE7DM>z1{rWt|xInY;zu+0V7XA&GI+$Vr#Q7@nrgZ`y~e&&Pd!8QBxpL#?@ zFb~>50R4=tgw(*a2mr+Jpe5ahZ4p2_;Nr(3fp)%z?Lz-iyn{fS$e}&-a7`0J{}3d? zIpPKY7q){3eN7DeCxYX+0Otdr9_F(^`2o&tFYMzwEE5CsgFK8S0RA2?gwxwWdN?23cxiU1-K!;05=m4;5Hcn-08aj4~zgjrVM~5=?(CV z83A4pHNcC;26#C_01uv|@h0Q|-mw|Lr!WTiLc{=H>kQz#xdZ%IMu1;(2jF)-2l(r5 zfPjbq5b#z20_|)-;1dT3QXK$6V;CTqn*&JHK0xvq1EgLnK!ykdWcqJ_EYbkTZ-W52 zB?kxz@BkqPJs^~u1B5osfbd=yAbfTc5atpC!b&ed*zyJt_U!}0sn>vTO&btlQ2-+H zQ9yKY84!sd0V1_)fXMhWAaY*?M31HcQNbP{`j!fahMnOd+XIMEo`9I^01)4_0>oBt z0dZ6pAWr)Yh|698;*LjvccVaih+R^e_sC9{*{JFx&OKQe+wdwe~SHS z3-8DOJ&4qW0<78pV-WFl^@it=|86>P-}=8n1n}sSfQbztnlQHfRbE}0wAgY4m}>go|49f z8cfo+I8b1q{rtaU!XW_g)C(~3|2qG(q7{FEu7?J#!~08*|Cb(Z*1zkJ{-vk>OApUs z|7nN$FFng&dal3pm;Tc8{iWysOApVD|LIr!FTLDfdilTf=!pAoJ7H}3k3E`y>9zjS z8~mj={7Y}~m)`O({oTLx_J8T!{?fburHALv|JdXAmp=3_{r&&yu@3%MEIx#j-v)uP z1Oev=0pl{(B%}e-1(|?sLKYz~R$@&-)*w3&bh%Mj2VRF^tw1^%_{cs<~S*%}>uaE)A7}PO9+4@f!3&wD)GsrLm#>GG7(EX$BDu$Fo8ett6 ztFUSyFs5L^^8{8I1dbgm5&~luRuiNG@*YwELAT!mX@oCG;28Z^$uZ3F=^+!HDa3njD#fd_%(MNmKpAn;n^Pd#*5^gdcb z{`h|NpE`f+gY$)+TdZ>^(R~p?p#RY}Bk&_51guvq!5d?V!35GyFAxt515Kf2)ImM-bRIq5y&}i}sTarqh1SObOi#8 zDGq?KO$9KKasZPg3t(PU0hrRY08>{LV7fX3%ovz1yb3VeH2~(k5WvFm0$5yr080rA zU^%7$tS8z4tDFNag<&}Ts?hyO0CAlMAZ%-(nGyg|8VV2tGXSyg39xC00XBypz*e9G z*mhX}J0=-mmlXo+@1FtoNdmxOt^+vA3;@Ud1;9yZ1vrfo0B6A-;1VMNt`HNz)p-nX zedz#haw5R3kp#G-!T|T665vrK06fwA08fVl;CT}PypVZ-mqrKhK12Y#L3n+&9R%=6 z?EyYF2f$Z41^9O@0Di0ffx!fKcomAT*5zgl^J+FxmzX zrUe7S5>7x^p9=`PP5|L>A|RX>1cb-tfQZN!5HaZkB7samq)-ls^zQ*8`xZbHJ`0Gl z;B{BCF(B$G1Vk$r05R@2K+M4oh-F3ru`w1P4xt3Z2~>diO%Nb%Y6isp_<(o@2N3Um z1}G%Fwz~KLpu{=>O63Tk%!&c(9=z^)ObXu?i~v-b8bG!81Jvve{K4!cxF#&Tt-auS z1qRMGe{vUa>X^{W` diff --git a/Source/adafruit_circuitplayground/test/sample.wav b/Source/adafruit_circuitplayground/test/sample.wav deleted file mode 100644 index 362feec5a6c6d167193fc975a2175264968ab671..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210158 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≤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 z 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

0`oAv;E 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 diff --git a/Source/adafruit_circuitplayground/test/test_express.py b/Source/adafruit_circuitplayground/test/test_express.py deleted file mode 100644 index 0732d9641..000000000 --- a/Source/adafruit_circuitplayground/test/test_express.py +++ /dev/null @@ -1,115 +0,0 @@ -import pytest -from unittest import mock - -import playsound -from ..express import Express -from ..pixel import Pixel -from .. import constants as CONSTANTS - - -class TestExpress(object): - def setup_method(self): - self.cpx = Express() - self.__state = {} - self.__state[CONSTANTS.EXPRESS_STATE.BRIGHTNESS] = 1.0 - self.__state[CONSTANTS.EXPRESS_STATE.BUTTON_A] = False - self.__state[CONSTANTS.EXPRESS_STATE.BUTTON_B] = False - self.__state[CONSTANTS.EXPRESS_STATE.PIXELS] = [(255, 0, 0)] * 10 - self.__state[CONSTANTS.EXPRESS_STATE.RED_LED] = False - self.__state[CONSTANTS.EXPRESS_STATE.SWITCH] = False - self.pixels = Pixel(self.__state) - self.__speaker_enabled = False - - def test_acceleration(self): - mock_motion_x = 10 - mock_motion_y = -10 - mock_motion_z = -20 - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.MOTION_X] = mock_motion_x - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.MOTION_Y] = mock_motion_y - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.MOTION_Z] = mock_motion_z - accel = self.cpx.acceleration - assert accel[0] == 10 - assert accel[1] == -10 - assert accel[2] == -20 - - def test_button_a(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.BUTTON_A] = True - assert self.cpx.button_a - - def test_button_b(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.BUTTON_B] = True - assert self.cpx.button_b - - def test_taps(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.DETECT_TAPS] = 2 - assert 2 == self.cpx.detect_taps - - @pytest.mark.parametrize("taps, expected", [(1, 1), (2, 2), (3, 1)]) - def test_taps_setter(self, taps, expected): - self.cpx.detect_taps = taps - assert expected == self.cpx.detect_taps - - def test_red_led(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.RED_LED] = True - assert self.cpx.red_led - - def test_red_led_int(self): - self.cpx.red_led = 3 - assert self.cpx.red_led - - def test_red_led_string(self): - self.cpx.red_led = "foo" - assert self.cpx.red_led - - def test_switch(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.SWITCH] = True - assert self.cpx.switch - - def test_temperature(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TEMPERATURE] = 31 - assert 31 == self.cpx.temperature - - def test_light(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.LIGHT] = 255 - assert 255 == self.cpx.light - - def test_shake(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.SHAKE] = True - assert self.cpx.shake() - - def test_touch_A1(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][0] = True - assert self.cpx.touch_A1 - - def test_touch_A2(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][1] = True - assert self.cpx.touch_A2 - - def test_touch_A3(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][2] = True - assert self.cpx.touch_A3 - - def test_touch_A4(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][3] = True - assert self.cpx.touch_A4 - - def test_touch_A5(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][4] = True - assert self.cpx.touch_A5 - - def test_touch_A6(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][5] = True - assert self.cpx.touch_A6 - - def test_touch_A7(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][6] = True - assert self.cpx.touch_A7 - - def test_play_file_mp4_wrong_type(self): - with pytest.raises(TypeError): - self.cpx.play_file("sample.mp4") - - def test_play_file_mp4(self): - playsound.playsound = mock.Mock() - self.cpx.play_file("sample.wav") - playsound.playsound.assert_called_once() diff --git a/Source/adafruit_circuitplayground/test/test_pixel.py b/Source/adafruit_circuitplayground/test/test_pixel.py deleted file mode 100644 index e1179939b..000000000 --- a/Source/adafruit_circuitplayground/test/test_pixel.py +++ /dev/null @@ -1,117 +0,0 @@ -import pytest - -from ..pixel import Pixel -from .. import constants as CONSTANTS - - -class TestPixel(object): - def setup_method(self): - state = {} - state[CONSTANTS.EXPRESS_STATE.BRIGHTNESS] = 1.0 - state[CONSTANTS.EXPRESS_STATE.BUTTON_A] = False - state[CONSTANTS.EXPRESS_STATE.BUTTON_B] = False - state[CONSTANTS.EXPRESS_STATE.PIXELS] = [(255, 0, 0), (0, 255, 0), (0, 0, 255)] - state[CONSTANTS.EXPRESS_STATE.RED_LED] = False - state[CONSTANTS.EXPRESS_STATE.SWITCH] = False - self.pixel = Pixel(state) - - def test_get_item_out_of_bounds(self): - with pytest.raises(IndexError): - p = self.pixel[3] - - def test_get_item(self): - assert (0, 0, 255) == self.pixel[2] - - def test_get_item_splice(self): - assert [(255, 0, 0), (0, 255, 0)] == self.pixel[0:2] - - def test_set_item(self): - self.pixel[1] = (50, 50, 50) - assert (50, 50, 50) == self.pixel[1] - - def test_set_item_splice(self): - self.pixel[0:1] = [(100, 100, 100), (0, 0, 100)] - assert (100, 100, 100) == self.pixel[0] - assert (0, 0, 100) == self.pixel[1] - - def test_set_item_out_of_bounds(self): - with pytest.raises(IndexError): - self.pixel[3] = (0, 0, 0) - - def test_set_item_invalid(self): - with pytest.raises(ValueError): - self.pixel[0] = "hello" - - def test_len(self): - assert 3 == len(self.pixel) - - @pytest.mark.parametrize("index, expected", [(0, True), (3, False)]) - def test_valid_index(self, index, expected): - assert self.pixel._Pixel__valid_index(index) == expected - - def test_fill(self): - self.pixel.fill((123, 123, 123)) - assert all( - p == (123, 123, 123) - for p in self.pixel._Pixel__state[CONSTANTS.EXPRESS_STATE.PIXELS] - ) - - @pytest.mark.parametrize( - "val, expected", - [([3, 4, 5], (3, 4, 5)), (432, (0, 1, 176)), ((1, 2, 3), (1, 2, 3))], - ) - def test_extract_pixel_values_not_slice(self, val, expected): - assert expected == self.pixel._Pixel__extract_pixel_value(val) - - @pytest.mark.parametrize( - "val, expected", - [ - ([[3, 4, 5], [6, 7, 8]], [(3, 4, 5), (6, 7, 8)]), - ([444555, 666777], [(6, 200, 139), (10, 44, 153)]), - ([(10, 10, 10), (20, 20, 20)], [(10, 10, 10), (20, 20, 20)]), - ], - ) - def test_extract_pixel_values_slice(self, val, expected): - assert expected == self.pixel._Pixel__extract_pixel_value(val, is_slice=True) - - @pytest.mark.parametrize("val", [[1, 2, 3, 4], [1, 2], 0.3]) - def test_extract_pixel_values_fail(self, val): - with pytest.raises(ValueError): - self.pixel._Pixel__extract_pixel_value(val) - - def test_hex_to_rgb_fail(self): - with pytest.raises(ValueError): - self.pixel._Pixel__hex_to_rgb("x") - - @pytest.mark.parametrize( - "hex, expected", - [ - ("0xffffff", (255, 255, 255)), - ("0x0", (0, 0, 0)), - ("0xff0000", (255, 0, 0)), - ("0xabcdef", (171, 205, 239)), - ], - ) - def test_hex_to_rgb(self, hex, expected): - assert expected == self.pixel._Pixel__hex_to_rgb(hex) - - @pytest.mark.parametrize( - "pixValue, expected", - [(0, True), (200, True), (255, True), (-1, False), (256, False), ("1", False)], - ) - def test_valid_rgb_value(self, pixValue, expected): - assert expected == self.pixel._Pixel__valid_rgb_value(pixValue) - - def test_get_brightness(self): - self.pixel._Pixel__state[CONSTANTS.EXPRESS_STATE.BRIGHTNESS] = 0.4 - assert 0.4 == pytest.approx(self.pixel.brightness) - - @pytest.mark.parametrize("brightness", [-0.1, 1.1]) - def test_set_brightness_fail(self, brightness): - with pytest.raises(ValueError): - self.pixel.brightness = brightness - - @pytest.mark.parametrize("brightness", [0, 1, 0.4, 0.333]) - def test_set_brightness(self, brightness): - self.pixel.brightness = brightness - assert self.pixel._Pixel__valid_brightness(brightness) diff --git a/Source/base_circuitpython/displayio/test/__init__.py b/Source/base_circuitpython/displayio/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/Source/base_circuitpython/displayio/test/img/group_test_result.bmp b/Source/base_circuitpython/displayio/test/img/group_test_result.bmp deleted file mode 100644 index 3dfdad5fce9797b69f25281ee08d44dad30c16e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeIwv5lQo7zW{MlRL$71ytYyoYNMK&LQ_ZN@H&)@%=`+aWrBJh&HT+Gjd zUw(r>BX9`l`H=A5KtRtoSo95tfSwNt?+pa>e1k>ba0ux6knr9>K+iW=^bLoAo(~D{ z4FvRjgGJwP2e1k>ba0ux6knr9>K+iW=^bLoA zo(~D{4FvRjgGJwP2|Eu&|R(dXt#jWRB({pJoZavqUo=anK>$%qS zTpEj8&$XuK(pcPjt~EWE#^TmjP0yvVxb<9XdM=H{t>;?Pb7?GYJ=dC^ zOJi~Cxz_Yt8jD-cwWjCNSloK9H9eQc;?{Gm>A5r(x1MWF&!w@r^;~OuE{(;l=UUTq zX)JC%*P5P7V{z-b*7RH&i(AjNrsvXF+YfaCk zvAFeIYkDq?#jWRB({pJoZavqUo=anK>$%qSTpEj8&$XuK(pcPjt~EWE#^TmjP0yvVxb<9XdM=H{t>;?Pb7?GYJ=dC^OJi~Cxz_Yt8jD-cwWjCNSloK9H9eQc z;?{Gm>A5r(x1MWF&!w@r^;~OuE{(;l=UUTqX)JC%*P5P7V{z-b*7RH&i(AjNrsvXF z+8JWb7|P?1oXUa(ETN#=hCp(3Fvvjd(7y-q;S>jvFl0(veDd!2xu*A2SA1oT`Q_BsJQuN!oK3Fx^r>~#Wq zUN`9e63}yL*y{xJyl&9_C7|chu-6IbdEKD8JWb7|P?1oXUa z(ETN#=hCp(3Fvvjd(7y-q;S>jvFl0(veDd!2xu z*A2SA1oT`Q_BsJQuN!oK3Fx^r>~#WqUN`9e63}yL*y{xJyl&9_C7|chu-6IbdEKD< zOF+-1VXqU=^SVLzmw=v2!(Jz#=XHbbF9AK5hP_Te&+7)=UjlkA4SSt{p4Sb!zXbGL z8umH?J+B*de+lThH0*T(dR{l^{u0o0Y1r!o^t^7+{UxC1(y-SF=y~0s`%6I2rD3lV L(DS-M_m{xmwbZOQ diff --git a/Source/base_circuitpython/displayio/test/test_bitmap.py b/Source/base_circuitpython/displayio/test/test_bitmap.py deleted file mode 100644 index 6e4e44fbf..000000000 --- a/Source/base_circuitpython/displayio/test/test_bitmap.py +++ /dev/null @@ -1,44 +0,0 @@ -import pytest -from ..bitmap import Bitmap -from .. import constants as CONSTANTS - - -class TestBitmap(object): - @pytest.mark.parametrize("x, y", [(1, 1), (2, 6), (0, 0)]) - def test_create_bitmap(self, x, y): - bitmap = Bitmap(x, y) - - @pytest.mark.parametrize("x, y, palette_num", [(1, 1, 4), (2, 3, 6), (4, 4, 9)]) - def test_set_and_get_pixel(self, x, y, palette_num): - bitmap = Bitmap(5, 5) - bitmap[x, y] = palette_num - assert palette_num == bitmap[x, y] - - @pytest.mark.parametrize("i, palette_num", [(1, 1), (24, 2)]) - def test_set_and_get_pixel_singular_index(self, i, palette_num): - bitmap = Bitmap(5, 5) - bitmap[i] = palette_num - assert palette_num == bitmap[i] - - @pytest.mark.parametrize( - "x_size, y_size, x_coord, y_coord", - [(1, 1, 0, 4), (1, 1, 4, 0), (200, 200, 300, 1), (200, 200, 1, 300)], - ) - def test_get_set_index_err(self, x_size, y_size, x_coord, y_coord): - bitmap = Bitmap(x_size, y_size) - - with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): - bitmap[x_coord, y_coord] = 0 - - with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): - val = bitmap[x_coord, y_coord] - - @pytest.mark.parametrize("x_size, y_size, i", [(1, 1, 3), (200, 200, 40000)]) - def test_get_set_index_err_singular_index(self, x_size, y_size, i): - bitmap = Bitmap(x_size, y_size) - - with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): - bitmap[i] = 0 - - with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): - val = bitmap[i] diff --git a/Source/base_circuitpython/displayio/test/test_group.py b/Source/base_circuitpython/displayio/test/test_group.py deleted file mode 100644 index f24ae0975..000000000 --- a/Source/base_circuitpython/displayio/test/test_group.py +++ /dev/null @@ -1,174 +0,0 @@ -import sys -import os -import pytest -import pathlib - -from unittest import mock - -from common import utils - -from displayio.tile_grid import TileGrid -from displayio.group import Group -from displayio.palette import Palette -from displayio.bitmap import Bitmap -from .. import constants as CONSTANTS -from PIL import Image - - -class TestGroup(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - self.dummy_bitmap = Bitmap(500, 500) - self.dummy_palette = Palette(5) - self.dummy_pos = (0, 0) - - utils.send_to_simulator = mock.Mock() - - def test_append_tilegrid_group_to_group(self): - tg1 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - tg2 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - g1 = Group(max_size=10) - g2 = Group(max_size=10) - - g2.append(g1) - g2.append(tg1) - g2.append(tg2) - - assert len(g2._Group__contents) == 3 - assert len(g1._Group__contents) == 0 - - @pytest.mark.parametrize("group_item", [(""), (5), ((4, 5))]) - def test_incorr_subclass(self, group_item): - g1 = Group(max_size=10) - with pytest.raises(ValueError, match=CONSTANTS.INCORR_SUBCLASS): - g1.append(group_item) - - @pytest.mark.parametrize("scale", [(0), (-2)]) - def test_invalid_scale(self, scale): - with pytest.raises(ValueError, match=CONSTANTS.SCALE_TOO_SMALL): - g1 = Group(scale=scale) - - def test_layer_already_in_group(self): - g1 = Group(max_size=4) - - tg1 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - tg2 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - g1.append(tg1) - - # should allow this, since it checks equality by reference: - g1.append(tg2) - - # should throw error for same group by reference - with pytest.raises(ValueError, match=CONSTANTS.LAYER_ALREADY_IN_GROUP): - g1.append(tg1) - - def test_group_full(self): - g1 = Group(max_size=1) - - tg1 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - tg2 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - g1.append(tg1) - - with pytest.raises(RuntimeError, match=CONSTANTS.GROUP_FULL): - g1.append(tg2) - - @pytest.mark.parametrize( - "size_w,size_h,draw_w,draw_h,accent_colors,x_offset,y_offset,scale_sub,scale_main", - [ - ( - (30, 27), - (63, 34), - (10, 11), - (40, 20), - ((244, 266, 23), (134, 26, 3)), - 3, - 9, - 2, - 3, - ) - ], - ) - def test_draw_group( - self, - size_w, - size_h, - draw_w, - draw_h, - accent_colors, - x_offset, - y_offset, - scale_sub, - scale_main, - ): - palette = Palette(3) - palette[1] = accent_colors[0] - palette[2] = accent_colors[1] - - bmp_1 = Bitmap(size_w[0], size_h[0]) - bmp_2 = Bitmap(size_w[1], size_h[1]) - - for i in range(draw_h[0]): - for j in range(draw_w[0]): - try: - bmp_1[j, i] = 1 - except IndexError: - continue - - for i in range(draw_h[1]): - for j in range(draw_w[1]): - try: - bmp_2[j, i] = 2 - except IndexError: - continue - - tg = TileGrid(bitmap=bmp_1, pixel_shader=palette, position=(0, 0)) - tg2 = TileGrid(bitmap=bmp_2, pixel_shader=palette, position=(50, 50)) - - group_main = Group(max_size=10, scale=scale_main, check_active_group_ref=False) - group_sub = Group(max_size=10, scale=scale_sub) - - group_sub.append(tg) - group_main.append(group_sub) - group_main.append(tg2) - img = group_main._Group__draw() - - img.putalpha(255) - expected = Image.open( - os.path.join(self.abs_path, "img", "group_test_result.bmp") - ) - expected.putalpha(255) - bmp_img_expected = expected.load() - bmp_img = img.load() - for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - assert bmp_img_expected[j, i] == bmp_img[j, i] diff --git a/Source/base_circuitpython/displayio/test/test_palette.py b/Source/base_circuitpython/displayio/test/test_palette.py deleted file mode 100644 index 413b61318..000000000 --- a/Source/base_circuitpython/displayio/test/test_palette.py +++ /dev/null @@ -1,31 +0,0 @@ -import pytest -from ..palette import Palette -from .. import constants as CONSTANTS -from ..color_type import _ColorType - - -class TestPalette(object): - @pytest.mark.parametrize( - "color_count, palette_num, val", - [(11, 5, (255, 255, 255)), (1, 0, (255, 0, 255)), (4, 3, (0, 0, 0))], - ) - def test_get_and_set_palette(self, color_count, palette_num, val): - palette = Palette(color_count) - palette[palette_num] = val - assert palette._Palette__contents[palette_num] == _ColorType(val) - - @pytest.mark.parametrize("palette_size, palette_index", [(3, 7), (0, 0), (3, 3)]) - def test_get_and_set_palette_err(self, palette_size, palette_index): - palette = Palette(palette_size) - with pytest.raises(IndexError, match=CONSTANTS.PALETTE_OUT_OF_RANGE): - palette[palette_index] = 0 - - def test_set_transparency(self): - palette = Palette(5) - assert palette._Palette__contents[2].transparent == False - - palette.make_transparent(2) - assert palette._Palette__contents[2].transparent == True - - palette.make_opaque(2) - assert palette._Palette__contents[2].transparent == False diff --git a/Source/base_circuitpython/displayio/test/test_tile_grid.py b/Source/base_circuitpython/displayio/test/test_tile_grid.py deleted file mode 100644 index d7e8ffadf..000000000 --- a/Source/base_circuitpython/displayio/test/test_tile_grid.py +++ /dev/null @@ -1,173 +0,0 @@ -import pytest -from PIL import Image -from ..tile_grid import TileGrid -from ..palette import Palette -from ..bitmap import Bitmap -from .. import constants as CONSTANTS - - -class TestTileGrid(object): - def setup_method(self): - self.dummy_bitmap = Bitmap(500, 500) - self.dummy_palette = Palette(5) - self.dummy_pos = (0, 0) - - @pytest.mark.parametrize( - "bitmap_w,bitmap_h,palette_num,tile_width,tile_height,position", - [(1, 1, 3, 1, 1, (0, 5)), (5, 7, 4, 2, 3, (0, 5))], - ) - def test_basic_constructor( - self, bitmap_w, bitmap_h, palette_num, tile_width, tile_height, position - ): - # constructor with position tuple - tg1 = TileGrid( - bitmap=Bitmap(bitmap_w, bitmap_h), - pixel_shader=Palette(palette_num), - tile_width=tile_width, - tile_height=tile_height, - position=position, - ) - - # alternate constructor with no position tuple - - tg2 = TileGrid( - bitmap=Bitmap(bitmap_w, bitmap_h), - pixel_shader=Palette(palette_num), - tile_width=tile_width, - tile_height=tile_height, - x=position[0], - y=position[1], - ) - - tile_grids = [tg1, tg2] - - for tg in tile_grids: - assert tg._TileGrid__bitmap.width == bitmap_w - assert tg._TileGrid__bitmap.height == bitmap_h - assert len(tg.pixel_shader._Palette__contents) == palette_num - assert tg._TileGrid__tile_width == tile_width - assert tg._TileGrid__tile_height == tile_height - assert tg.x == position[0] - assert tg.y == position[1] - - # alternate constructor with no height and width -> takes the bitmap's height and width - tg3 = TileGrid( - bitmap=Bitmap(bitmap_w, bitmap_h), - pixel_shader=Palette(palette_num), - x=position[0], - y=position[1], - ) - - assert tg3._TileGrid__bitmap.width == bitmap_w - assert tg3._TileGrid__bitmap.height == bitmap_h - assert len(tg3.pixel_shader._Palette__contents) == palette_num - assert tg3._TileGrid__tile_width == bitmap_w - assert tg3._TileGrid__tile_height == bitmap_h - assert tg3.x == position[0] - assert tg3.y == position[1] - - @pytest.mark.parametrize( - "w, h, x, y", [(5, 5, 2, 1), (2, 7, 0, 0), (66, 88, 65, 87)] - ) - def test_tile_set_get(self, w, h, x, y): - tg = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - tile_width=w, - tile_height=h, - position=self.dummy_pos, - ) - - tg_x_y = tg[x, y] - assert tg_x_y == tg._TileGrid__bitmap[x, y] - - @pytest.mark.parametrize( - "w, h, x, y", [(55, 56, 100, 1), (55, 56, 0, 56), (66, 88, 66, 88)] - ) - def test_tile_out_of_bounds(self, w, h, x, y): - tg = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - tile_width=w, - tile_height=h, - position=self.dummy_pos, - ) - with pytest.raises(IndexError, match=CONSTANTS.TILE_OUT_OF_BOUNDS): - tg_x_y = tg[x, y] - - @pytest.mark.parametrize( - "size_w, size_h, x, y, draw_w, draw_h, bg_color, accent_color, x_offset, y_offset, scale", - [ - (10, 10, 5, 5, 5, 5, (3, 0, 0, 255), (244, 255, 23, 255), 2, 0, 2), - (100, 30, 2, 3, 6, 3, (255, 255, 255, 255), (45, 45, 77, 255), 0, 7, 5), - ], - ) - def test_draw( - self, - size_w, - size_h, - x, - y, - draw_w, - draw_h, - bg_color, - accent_color, - x_offset, - y_offset, - scale, - ): - - palette = Palette(2) - palette[0] = bg_color - palette[1] = accent_color - - bmp = Bitmap(size_w, size_h) - - for i in range(size_h): - for j in range(size_w): - bmp[j, i] = 0 - - for i in range(y, y + draw_h): - for j in range(x, x + draw_w): - try: - bmp[j, i] = 1 - except IndexError: - continue - - tg = TileGrid(bitmap=bmp, pixel_shader=palette, position=(0, 0)) - tg2 = TileGrid(bitmap=bmp, pixel_shader=palette, position=(0, 0)) - img = Image.new( - "RGBA", (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - # without scaling, test output - img = tg._TileGrid__draw(img, x_offset, y_offset, 1) - bmp_img = img.load() - for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - if (i in range(y_offset + y, y_offset + y + draw_h)) and ( - j in range(x_offset + x, x_offset + x + draw_w) - ): - assert bmp_img[j, i] == accent_color - elif (i in range(y_offset, y_offset + size_h)) and ( - j in range(x_offset, x_offset + size_w) - ): - assert bmp_img[j, i] == bg_color - - img = Image.new( - "RGBA", (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - # with scaling, test output - img = tg._TileGrid__draw(img, x_offset, y_offset, scale) - bmp_img = img.load() - for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - if ( - i in range(y_offset + y * scale, y_offset + (y + draw_h) * scale) - ) and ( - j in range(x_offset + x * scale, x_offset + (x + draw_w) * scale) - ): - assert bmp_img[j, i] == accent_color - elif (i in range(y_offset * scale, (y_offset + draw_h) * scale)) and ( - j in range(x_offset * scale, (x_offset + draw_w) * scale) - ): - assert bmp_img[j, i] == bg_color diff --git a/Source/base_circuitpython/test/__init__.py b/Source/base_circuitpython/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/Source/base_circuitpython/test/test_terminal_handler.py b/Source/base_circuitpython/test/test_terminal_handler.py deleted file mode 100644 index cb9f97338..000000000 --- a/Source/base_circuitpython/test/test_terminal_handler.py +++ /dev/null @@ -1,61 +0,0 @@ -import pytest - -import base_circuitpython.terminal_handler -from common import utils -from unittest import mock - - -class TestTerminal(object): - def setup_method(self): - - utils.send_to_simulator = mock.Mock() - - @pytest.mark.parametrize( - "str_vals", - [ - (["potato", "Lorem ipsum"]), - ([""]), - ([".......", "123456", "", "test"]), - (["123456789 123456789 123456789 1234567"]), - ], - ) - def test_single_line(self, str_vals): - self.terminal = base_circuitpython.terminal_handler.Terminal() - for s in str_vals: - self.terminal.add_str_to_terminal(s) - - result = list(self.terminal._Terminal__output_values) - result.reverse() - - # output should just be the reversed version since all lines - # don't have newline or exceed 37 characters - assert str_vals == result - - @pytest.mark.parametrize( - "str_vals, expected", - [ - ( - ["\nCode done running. Waiting for reload."], - [".", "Code done running. Waiting for reload", ""], - ), - ( - ["TESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTEST"], - ["ESTTESTTEST", "TESTTESTTESTTESTTESTTESTTESTTESTTESTT"], - ), - ( - ["\nCode done running. Waiting for reload.", "........."], - [".........", ".", "Code done running. Waiting for reload", ""], - ), - ( - ["TEST TEST TEST TEST TEST ", "..."], - ["...", " ", "TEST TEST TEST TEST TEST "], - ), - ], - ) - def test_multiline(self, str_vals, expected): - self.terminal = base_circuitpython.terminal_handler.Terminal() - for s in str_vals: - self.terminal.add_str_to_terminal(s) - - result = list(self.terminal._Terminal__output_values) - assert result == expected diff --git a/Source/clue/test/__init__.py b/Source/clue/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/Source/clue/test/img/test_clue_text_1.bmp b/Source/clue/test/img/test_clue_text_1.bmp deleted file mode 100644 index 7ea72fe2cea4b656b69e41a9a262552dc2a18a7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 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 w^^Bjk^Sd3rc15q8XCwq88Il86E`aR{Pgpe zU%&nM^Us&p-ydIpfB)z2Hy=N|rq`d>zyJ2#$6tT{Uid!&0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7csfqx17^8Lrx|Nixl|FQTQehuwUW=`fOJ?-1vKe=I}Cp)Ke z{+5$(Px6^*b9*cEEi>I`XPaAR=36HBC;7~r%-NswlW*U-CvTh1X>#)INj@`eZf|A2 zWv2V=Y;)_(e9PqiB%hg+Is0>d^6fkKXHV{PZkgP-`BqQsZ~OM{c7FP9yQl4M^-p`Y^X>PxecqFE=5wEO%jCYzw|ZKC z+qZYO^V4_RJ#Bxhf7-L1Z@;(g^PZeDpZlC!CiiW=)zkXhzP-DhpT67fY5QCK)1K{o z`@L)qBf-M8P>dT!;XJ?);hztunO+0M7$+xG3ATl-t@ww~#}{jSz?E1x~nx!sog?9Bai zp7w0#Z{6SSobKB_w|ZKC+qZYO^ZD*{Znxz=J99ssr#;*GTlcp+r~7u#t)AB3_U+y6 ze7-xK+ikhe&fHJuY0q~4*8T0y>Au}_tEct1eS3F1pYKlRc3bYVGxyVZ+OwU%b$`2a zx^MT~>S_IL-`+jR=eH+wc4j{JZQjm**1OZ+)$VNjX@ASN{q)`J$+`7R_tVbIPv^WX zzs-G{xAUL%?(}!HJKKKR-|}rgeK&h@Zavfev@`S5Id98vbKmCe{Aay8{ax+Owx9O5 zeA`do&7PcF&vZZS%=~oD+w$Aow|P7NS?^ANSG%+Ar~NJ8_S1K>C+F5P-A_9=^4Zzu z?cde<^PZMz`~0@e?b}=XeD|dDB%hf!x3@B%ncTNI^KH&=TPF7#`Rr_S-f%K!&q=;z zp7i9mZEo-0+UL6`ohSLsw7I>N`OM_L&6#g=e%ms+-^gcYoAZW~IeSj>E%T%&zio4S z_trk&J?T8jXQs{Vt;}a8_ifI6oAcY2$^Aw?JKLN$oXpvCl5d$OJ^5{$+q<{+`R+;Q zNj@`eZf|8iGr4bb=G&a#woLA~^ZC}3d3tAi>sC+e-`-E}pXRskpY~7h-_B3(Z~5t+ z+dZv+dp~uU=C|*k_D}EM&QI@e`RSe8J*|IxKXsVqx9^|!Pw(H(Pw#K}>7Cm>t$%wz zb(rS2@1OQh@88Z(@6UYRmUCuK=KMD2lW*TGGrfPBe}~_jH|KnE+jjoshL*|Oa&Gyy Z&u?>X`FGw=@1N%1;kW0_Isfl%e*nkUw}=1$ diff --git a/Source/clue/test/img/test_display_text_2.bmp b/Source/clue/test/img/test_display_text_2.bmp deleted file mode 100644 index c08c37fe02c3cabf6a774b181a985bbe629605e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeIx(M`iJ5CG7?0DLn76LbLnJ0;(&z!!5c10!(skY(vma7bHF@}f98U7WM~e0@9~ zo^Gel>k#81#{1W}neHQsE8f4}O{b9wPXYu85FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAVA={0&mYRZNZFxmx&_rVcvbg`An`=pIM>L*G&I*ByPJBY*-*V zp*6$GAe35#m2rai)oP}HI}&FF&ut5gbi(!L)b6dBrMuepIr??$J7j4`jnA)ptC{g? zIn#;nL7+eDzC&vNTrShEd%1WIr|CETc|XSn@~;1vncl8n{g`pqdl1N;slBu`b1tiF n%cwRJoNFz0wkPlp`?(?K-s%q91OWj81PBlyK!5;&Zv{R8Ce|~( diff --git a/Source/clue/test/img/test_display_text_3.bmp b/Source/clue/test/img/test_display_text_3.bmp deleted file mode 100644 index 3b68886396ece1aee9d6df5771e9a874a2679c36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 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 E7mPcEsQ>@~ diff --git a/Source/clue/test/img/test_image_shapes_1.bmp b/Source/clue/test/img/test_image_shapes_1.bmp deleted file mode 100644 index 6719a7f8d6f1788d8c28c8c7a9d839f2cc4a8435..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeIuOAUZP5JbTN0i2P5f)%iLRAL1|IDqD(f>b9j+05RmuWcLaUQ0_lzJ{9f%JRQY z_4FR9P9s2o009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ j009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7csfnNw*yLO6e diff --git a/Source/clue/test/img/test_image_shapes_2.bmp b/Source/clue/test/img/test_image_shapes_2.bmp deleted file mode 100644 index ae1f7618d0b2a21643e1668654c47d3932eef879..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeIw+erjb6hzUh0r+hQMqmK`8>OijkQt2aBLbn=Agh@Mao`lQ*e|coZ};cxdA{DK z>;3qB@6O}(*Y#ZAzdxMs_vaty+&lyb5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBm_1kUYLpXe8x{m%kb%-8OJX7$@50X;|XW+wuAp0GL^3FtY3H#-r~ z^MuvWNI=gKyxEC>o+qr1Mgn?{;LT11^gLm8G!oEr1aEdCpyvszqmh7~BY3kD0XS!dO=Lp{HL_p6IR!1WNJxB0nCjxq&usRwE=sAKnI}yH2t@U*G1}uh-Y7>FfN{{Fwj#^UL(|y8U9BE*=C35FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNB!O<=lQ?mf3H z=qv)q3%oTvU8Z}__s);MJQE2l6nH85Uc>+V{cG3@*LN6!V+7Wh{CD1}K4zCpStKy0 zdHDI=cbgrIHy77;A+lR#LE&37D8Sm$pUV@T7gCaLYD1XQ6oo=R+|)NaEuiPLsP&oxdT#2Qofgn@TGV%0V%(%1^@s6 diff --git a/Source/clue/test/img/test_image_shapes_4.bmp b/Source/clue/test/img/test_image_shapes_4.bmp deleted file mode 100644 index be810780ba72a7f1955073e58b1f243f530dcca3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeI)QBoUM5Cu>r3&?ktkQI0V{?972l`JSbAOa&%Wm-m{?s>YJqk=MSpkL4FTjOyR z_V>TP{qy_b`StDi{@3ySzt{KQ4u2j$I=+sd|M!o>%lnVQ;qc@|fB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pkHwYXuUpHK_Z+&Ee%s3w&c_psx1_61#0nfMIoxnNIcQ;uz zP}a276{yV$WF;hP+S$$NUI}C+Bx~BrTWwY#Do{O3CWta@>ZJ_$Vy1ow6mMjy%NYuNY=EKx7w^gRzk9-o!y-7l|WWPvZk%P)n)~< z5|TCT?B;Z@1hNv6HErdsHY<>okgREEH>Z0gkd=_EX)ABFS%IvCWKBD}Io&IPtb}Au zTY0O^3S=cDYuee(>0SwBB_wOw%3Ez#AS)qR)6Q;A_evluAz9N_-fFV~SqaISc6M{R zR{~iH$(pwER+|;bN=VkUvzybs639wO*0hzk+N{7GCFJn*bm{G6a7WXgM)K=j39L`Z zDZ_`S!=<-#&euKKRtzxX)d@2>c}Q7LcDlG4$J8!uBzN2>&n;oTkY|xj4q)@_TjaSb%$M^l(#^4m zZ70vMt21~ZFrMeeoAWR4&u-DhcK273=l$*ck*|0*&%HP2kM7TI(T|+e>#j|nuXFNM z83OX0u_serCoq`j_J@rto;N&lT(|az{VI8W*wyax!p?aP``~!5zVPOUly({9*NYB| z@p;?}VfMVS=P)0y{Tz_659E30!QKAyC;mQoImYM556>IhuX-0J%JVMPyqk-Z=iRJ& z7Z)neyIAv{E^_lodwAYcyf(j9dET7dfrA3_Jcz6H3V{tH?O|iZf_HYNJnwAbkAJzF zMB2^y@q=_HS18YSvIt{z2@FTt&ADq)`dlk87HMI=b_Kq!S70F0!rZ$e-99JK8fjtv z9KNrf5NL|DFi$K;&#wr4`TysC`T6JPB>T_IzvAwDCIvp9YDu2lhu$3mKW?_adR!009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5(rAaMK_uB+ZYn9QdMd|qHxn4kZpxEFzL z0eS8g)o-PMJg?MucDH~$cZ=$`Qb3+p>N~qzK%Tor^;;<*&nxwv-7O%`-J<%f6p-hY z`p)hakmqhu{Z||9zO%ap=yi(uU-2(F5Evny2 z0eN1j@9b^?dF~d~Z>4}duhe&Tw}3o%i|V&hK%Q6XJG)yzp1Vc$TPYyVEA^e-Eg;X` zqWY~Akmr^9&h8eF=WbE`Rtm`TN_}T{3&?Y~sD3L2+j-Qs3F# z0`lA~s^3Zhd0wgS>}~;h?iST=rGPxI)OU8bfIN4L>bFuro>%HSyIVk>yG8X|DIm`) z^_|@R`Vk;NfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk a1PBlyK!5-N0t5&UAV7cs0RjYO1^x$f_BIRv diff --git a/Source/clue/test/img/test_image_shapes_5.bmp b/Source/clue/test/img/test_image_shapes_5.bmp deleted file mode 100644 index e5473f83d5742c6a45046fad223e2cdcdf3d1995..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeI)?Qvs85Qb4f0Q@EdBG>@;+xOKyDsN%NtC`lB2O+9} zKmYpi_pgW3tydtckgREYZ_e(OKvp4H(^lTrdIhoy$(pwJ=ImYxWEGM%ZRKsP zS0Jm9tZ931&hC{!Rv}r_R^HZn1+ogsnzr}m>|P0E6_Pb=tydtckgREYZ_e(OKvp4H(^lTrdIhoy$(pwJ=ImYxWEGM%ZRKsP zS0Jm9tZ931&hC{!Rv}r_R^HZn1+ogsnzr}m>|P0E6_Pb=tydtckgREYZ_e(OKvp4H(^lTrdIhoy$(pwJ=ImYxWEGM%ZRKsP zS0Jm9tZ931&hC{!Rv}r_R^HZn1+ogsnzr}m>|P0E6_Pb=tydtckgREYZ_e(OKvp4H(^lTrdIdIA$l>Yf+Si-GhNgWR$sac* zFki@9!-uECwXbvM^V4qX@(gn!Fj>fR$=4dL*WbpycpVl9oCMwiIkvUpV?oI;@7{0Y zp5C!N2wVuf1+rov$9LZAA1!|JqxW%7yLb@zB=8={ryn%^>33p&|C`C{Cv8bL-BRwh ztM>fOm@j&M-Y?hQCFUzVOFB8gJI}sG&-aS?de4%+ za~84N={ff53|UwdtO z{+g5Dl_8+#jC(TW*901SzWaxbFMQtck>hLE{;7E>6_*F0Oeu zFH+CDx$0fKP(APBn)mb~S5Ml9=RM`M`fJtm>f{b=6wq@cuB|5oR!rK5jfo51*_nFY z*@fSFxzGP!tkc`h7QSu`dh=(iB<;=l<{eD`a0>yKGc177^8&O-dP*76b`}>iJ7^MZR==_y+)_NVhKaJg&JVqS0q z>pkV7pH2Nc$)|WeeJ!K8Q_^By#=p|DKBaQJ^zA)9_k5gr+2i@eo?hajuh%h_9qn1` z2<)oo7t;Sx_V&XWX6IBcSIVSG&##=y}H7sXYRE?s2v2jKIV7eB-}w?f%is4LbFsfSwoqzc|Xj zG(NieenvpgdY&n-=TtrGxu>j|UG=Qzneuv0)w7;^%9`0#&w8FIujf=f>$#__nO*g) z=b7?)PSvxXd&-*GRnK~!DX-^LJ?purteIW)tmm2XdQR1|o_org*;UVao++>AR6Xmt zr>vP>^{nTa@_J6yvz~j(n%Py)dY&n-=TtrGxu>j|UG=Qzneuv0)w7;^%9`0#&w8FI zujf=f>$#__nO*g)=b7?)PSvxXd&-*GRnK~!DX-^LJ?purteIW)tmm2XdQR1|o_org z*;UVao++>AR6Xmtr>vP>^{nTa@_J6yvz~j(n%Py)dY&n-=TtrGxu>j|UG=Qzneuv0 z)w7;^%9`0#&w8FIujf=f>$#__nO*g)=b7?)PJOtZdzkDRBB1Axi!$by1oZqRCci01 zVB1MQU5u9_YtjjU%V0LXGJ)jGB!P_w{BgV_R}YfX1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oP8<@E_d! B4ZHvV diff --git a/Source/clue/test/img/test_image_text_1.bmp b/Source/clue/test/img/test_image_text_1.bmp deleted file mode 100644 index dee4173d2604b57b07aaabb92eb8c5b9057ffeb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230454 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 qN9c#uet_`tL{Z>z?f62Xr~^Y!@q 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 UFu(u<3^2d|0}L?0zzPHZ0zx#fl>h($ diff --git a/Source/clue/test/slideshow_pics/pic_1.bmp b/Source/clue/test/slideshow_pics/pic_1.bmp deleted file mode 100644 index 0d15550078f61eb5e68515958b9c3a79d376bbbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113974 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 G?EfD(a~m1} diff --git a/Source/clue/test/slideshow_pics/pic_2.bmp b/Source/clue/test/slideshow_pics/pic_2.bmp deleted file mode 100644 index 345d5820e11be986d573aab47bdf709e48ca9e82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113974 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 diff --git a/Source/clue/test/slideshow_pics/pic_3.bmp b/Source/clue/test/slideshow_pics/pic_3.bmp deleted file mode 100644 index 78ef7b8a23d5f92e06cffc87c0795af7f6ef884c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 330726 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 diff --git a/Source/clue/test/slideshow_pics/pic_6.bmp b/Source/clue/test/slideshow_pics/pic_6.bmp deleted file mode 100644 index d3e2540397b43a06c2c748ffe972047b8141ae8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115818 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 C7L5@A diff --git a/Source/clue/test/slideshow_pics/pic_8.bmp b/Source/clue/test/slideshow_pics/pic_8.bmp deleted file mode 100644 index 2746a30f812280f3aff4b5ca6992f753ced09982..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193734 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 C1~?P| diff --git a/Source/clue/test/test_adafruit_clue.py b/Source/clue/test/test_adafruit_clue.py deleted file mode 100644 index d9a88d731..000000000 --- a/Source/clue/test/test_adafruit_clue.py +++ /dev/null @@ -1,193 +0,0 @@ -import pytest - -import os -import pathlib -from PIL import Image - -from unittest import mock -from unittest.mock import MagicMock, patch - -from common import utils - -import displayio -import terminalio - -from ..adafruit_clue import clue -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS - - -class TestAdafruitClue(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - - self.main_img = Image.new( - "RGBA", - (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), - (0, 0, 0, 0), - ) - - utils.send_to_simulator = mock.Mock() - - def test_clue_display_text(self): - img = Image.open( - os.path.join(self.abs_path, CONSTANTS.IMG_DIR_NAME, f"test_clue_text_1.bmp") - ) - - img.putalpha(255) - expected = img.load() - clue_data = clue.simple_text_display(title="LET'S TEST!", title_scale=2) - - clue_data.text_group._Group__show = self.__send_helper - clue_data.text_group._Group__check_active_group_ref = False - - clue_data[0].text = "Lorem ipsum" - clue_data[1].text = "dolor sit amet, consectetur " - clue_data[2].text = "adipiscing:" - - clue_data[4].text = "e" - clue_data[5].text = "sed do eiusmod" - clue_data[6].text = "tempor incididunt\nut labore" - clue_data[7].text = "ut labore" - - clue_data[10].text = "et dolore" - clue_data[11].text = "magna" - clue_data[12].text = "aliqua\ntestest" - clue_data[13].text = "Ut enim ad" - clue_data[14].text = "Excepteur sint" - clue_data.show() - helper._Helper__test_image_equality(self.main_img.load(), expected) - - def __send_helper(self, image): - self.main_img = image - - def test_buttons(self): - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_A, True) - assert clue.button_a - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_A, False) - assert not clue.button_a - - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_B, True) - assert clue.button_b - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_B, False) - assert not clue.button_b - - assert clue.were_pressed == set(["A", "B"]) - assert clue.were_pressed == set() - - @pytest.mark.parametrize( - "mock_x, mock_y, mock_z", [(1, 2, 3), (0, 0, 0), (4, 6, 100)] - ) - def test_acceleration(self, mock_x, mock_y, mock_z): - clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_X] = mock_x - clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_Y] = mock_y - clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_Z] = mock_z - assert clue.acceleration == (mock_x, mock_y, mock_z) - - @pytest.mark.parametrize( - "mock_color_r, mock_color_g,mock_color_b,mock_color_c", - [(1, 2, 3, 4), (255, 255, 255, 255), (120, 140, 160, 180)], - ) - def test_color(self, mock_color_r, mock_color_g, mock_color_b, mock_color_c): - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_R] = mock_color_r - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_G] = mock_color_g - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_B] = mock_color_b - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_C] = mock_color_c - assert clue.color == (mock_color_r, mock_color_g, mock_color_b, mock_color_c) - - @pytest.mark.parametrize("mock_temperature", [-10, 0, 10]) - def test_temperature(self, mock_temperature): - clue._Clue__state[CONSTANTS.CLUE_STATE.TEMPERATURE] = mock_temperature - assert clue.temperature == mock_temperature - - @pytest.mark.parametrize( - "mock_magnetic_x, mock_magnetic_y, mock_magnetic_z", - [(1, 2, 3), (100, 150, 200), (10, 5, 15)], - ) - def test_magnetic(self, mock_magnetic_x, mock_magnetic_y, mock_magnetic_z): - clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_X] = mock_magnetic_x - clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_Y] = mock_magnetic_y - clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_Z] = mock_magnetic_z - assert clue.magnetic == (mock_magnetic_x, mock_magnetic_y, mock_magnetic_z,) - - @pytest.mark.parametrize("mock_distance", (0, 10, 250, 255)) - def test_proximity(self, mock_distance): - clue._Clue__state[CONSTANTS.CLUE_STATE.PROXIMITY] = mock_distance - assert clue.proximity == mock_distance - - @pytest.mark.parametrize( - "mock_gyro_x, mock_gyro_y, mock_gyro_z", - [(1, 2, 3), (100, 150, 200), (10, 5, 15)], - ) - def test_gyro(self, mock_gyro_x, mock_gyro_y, mock_gyro_z): - clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_X] = mock_gyro_x - clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_Y] = mock_gyro_y - clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_Z] = mock_gyro_z - assert clue.gyro == (mock_gyro_x, mock_gyro_y, mock_gyro_z) - - @pytest.mark.parametrize( - "gesture_word, gesture_number", - [("", 0), ("up", 1), ("down", 2), ("left", 3), ("right", 4)], - ) - def test_gesture(self, gesture_word, gesture_number): - clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = gesture_word - assert clue.gesture == gesture_number - - def test_shake(self): - NONE = "none" - SHAKE = "shake" - clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = SHAKE - assert clue.shake() - clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = NONE - assert not clue.shake() - - @pytest.mark.parametrize("mock_humidity", [0, 10, 50, 100]) - def test_humidity(self, mock_humidity): - clue._Clue__state[CONSTANTS.CLUE_STATE.HUMIDITY] = mock_humidity - assert clue.humidity == mock_humidity - - @pytest.mark.parametrize("mock_pressure", [0, 10, 50, 100]) - def test_pressure(self, mock_pressure): - clue._Clue__state[CONSTANTS.CLUE_STATE.PRESSURE] = mock_pressure - assert clue.pressure == mock_pressure - - @pytest.mark.parametrize( - "mock_pressure, mock_sea_level_pressure, expected_altitude", - [ - (1000, 1015, 125.42255615546036), - (1030, 1015, -123.93061640175468), - (1020, 1013, -58.13176263932101), - ], - ) - def test_altitude(self, mock_pressure, mock_sea_level_pressure, expected_altitude): - clue.sea_level_pressure = mock_sea_level_pressure - clue._Clue__state[CONSTANTS.CLUE_STATE.PRESSURE] = mock_pressure - assert expected_altitude == pytest.approx(clue.altitude) - - @pytest.mark.parametrize("mock_sea_level_pressure", [1040, 1015, 1013]) - def test_sea_level_pressure(self, mock_sea_level_pressure): - clue.sea_level_pressure = mock_sea_level_pressure - assert mock_sea_level_pressure == clue.sea_level_pressure - - @pytest.mark.parametrize( - "mock_color", [(255, 0, 0), (255, 255, 255), (123, 123, 123)] - ) - def test_pixel(self, mock_color): - clue.pixel.fill(mock_color) - assert clue.pixel[0] == mock_color - - @pytest.mark.parametrize( - "value, expected", - [(True, True), (False, False), (1, True), ("a", True), (0, False), ("", False)], - ) - def test_red_led(self, value, expected): - clue.red_led = value - assert clue.red_led == expected - - @pytest.mark.parametrize( - "value, expected", - [(True, True), (False, False), (1, True), ("a", True), (0, False), ("", False)], - ) - def test_white_leds(self, value, expected): - clue.white_leds = value - assert clue.white_leds == expected diff --git a/Source/clue/test/test_adafruit_display_shapes.py b/Source/clue/test/test_adafruit_display_shapes.py deleted file mode 100644 index 7be1c982f..000000000 --- a/Source/clue/test/test_adafruit_display_shapes.py +++ /dev/null @@ -1,81 +0,0 @@ -import pytest -import pathlib -import os - -import displayio - -from PIL import Image -from unittest import mock - -from common import utils - - -from adafruit_display_shapes.rect import Rect -from adafruit_display_shapes.circle import Circle -from adafruit_display_shapes.roundrect import RoundRect - -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS -import board - - -class TestAdafruitDisplayShapes(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - - utils.send_to_simulator = mock.Mock() - self.main_img = Image.new( - "RGBA", - (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), - (0, 0, 0, 0), - ) - - def test_shapes(self): - - expected_images = [] - for i in range(5): - img = Image.open( - os.path.join( - self.abs_path, - CONSTANTS.IMG_DIR_NAME, - f"test_image_shapes_{i+1}.bmp", - ) - ) - - img.putalpha(255) - expected_images.append(img.load()) - - # TAKEN FROM ADAFRUIT'S DISPLAY SHAPES LIBRARY - # https://github.com/ladyada/Adafruit_CircuitPython_Display_Shapes/blob/master/examples/display_shapes_simpletest.py - splash = displayio.Group(max_size=10) - splash._Group__show = self.__send_helper - board.DISPLAY.show(splash) - color_bitmap = displayio.Bitmap(320, 240, 1) - color_palette = displayio.Palette(1) - color_palette[0] = 0xFFFFFF - bg_sprite = displayio.TileGrid( - color_bitmap, x=0, y=0, pixel_shader=color_palette - ) - splash.append(bg_sprite) - helper._Helper__test_image_equality(self.main_img.load(), expected_images[0]) - - rect = Rect(80, 20, 41, 41, fill=0x00FF00) - splash.append(rect) - helper._Helper__test_image_equality(self.main_img.load(), expected_images[1]) - circle = Circle(100, 100, 20, fill=0x00FF00, outline=0xFF00FF) - splash.append(circle) - - helper._Helper__test_image_equality(self.main_img.load(), expected_images[2]) - - rect2 = Rect(50, 100, 61, 81, outline=0x0, stroke=3) - splash.append(rect2) - - helper._Helper__test_image_equality(self.main_img.load(), expected_images[3]) - - roundrect = RoundRect(10, 10, 61, 81, 10, fill=0x0, outline=0xFF00FF, stroke=6) - splash.append(roundrect) - - helper._Helper__test_image_equality(self.main_img.load(), expected_images[4]) - - def __send_helper(self, image): - self.main_img = image diff --git a/Source/clue/test/test_adafruit_display_text.py b/Source/clue/test/test_adafruit_display_text.py deleted file mode 100644 index f73ae3cd0..000000000 --- a/Source/clue/test/test_adafruit_display_text.py +++ /dev/null @@ -1,65 +0,0 @@ -import pytest - -import os -import sys -import pathlib -from PIL import Image -from unittest import mock - -from common import utils - -import displayio -import terminalio - -from adafruit_display_text import label - -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS - -# to keep track of test # to find right expected bmp -test_count = 0 - - -class TestAdafruitDisplayText(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - # Create a new black (default) image - utils.send_to_simulator = mock.Mock() - - @pytest.mark.parametrize( - "text, x,y, scale, color", - [ - ("Hello World", 1, 10, 4, (0, 22, 103)), - ("WWWWwwwmMMmmm", 30, 6, 1, (190, 173, 222)), - ("wOooo00ooo", 104, 49, 9, 0xEFEFEF), - ("!!!\n yay!", 100, 100, 5, (200, 200, 255)), - ], - ) - def test_display_text(self, text, x, y, scale, color): - global test_count - - expected_image = Image.open( - os.path.join( - self.abs_path, - CONSTANTS.IMG_DIR_NAME, - f"test_display_text_{test_count+1}.bmp", - ) - ) - expected_image.convert("RGBA") - expected_image.putalpha(255) - loaded_img = expected_image.load() - - text_area = label.Label( - terminalio.FONT, - text=text, - scale=scale, - color=color, - check_active_group_ref=False, - ) - text_area.x = x - text_area.y = y - - main_img = text_area._Group__draw() - - helper._Helper__test_image_equality(main_img.load(), loaded_img) - test_count += 1 diff --git a/Source/clue/test/test_adafruit_slideshow.py b/Source/clue/test/test_adafruit_slideshow.py deleted file mode 100644 index b82c953d0..000000000 --- a/Source/clue/test/test_adafruit_slideshow.py +++ /dev/null @@ -1,100 +0,0 @@ -from ..adafruit_slideshow import SlideShow, PlayBackDirection, PlayBackOrder -import board -import pathlib -import os - -from PIL import Image -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS - -from unittest import mock - -from common import utils - - -class TestAdafruitSlideShow(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - - # Create a new black (default) image - self.main_img = Image.new( - "RGBA", - (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), - (0, 0, 0, 0), - ) - - utils.send_to_simulator = mock.Mock() - - def test_slideshow(self): - - pic_dir = os.path.join(self.abs_path, "slideshow_pics") - slideshow_images = [] - for i in range(8): - img = Image.open(os.path.join(pic_dir, f"pic_{i+1}.bmp")) - img = img.convert("RGBA") - img.putalpha(255) - - img = img.crop( - (0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - - if img.size[0] < 240 or img.size[1] < 240: - black_overlay = Image.new( - "RGBA", - CONSTANTS.SCREEN_HEIGHT_WIDTH, - CONSTANTS.SCREEN_HEIGHT_WIDTH, - ) - black_overlay.paste(img) - img = black_overlay - - slideshow_images.append(img) - - # Create the slideshow object that plays through once alphabetically. - slideshow = SlideShow( - board.DISPLAY, - dwell=3, - folder=pic_dir, - loop=True, - fade_effect=True, - auto_advance=True, - order=PlayBackOrder.ALPHABETICAL, - direction=PlayBackDirection.FORWARD, - ) - - slideshow._SlideShow__send = self.__send_helper - - # first image's appear time is unstable,since it fades/scrolls in - # can only predict following ones... - - for i in range(1, 8): - slideshow.advance() - helper._Helper__test_image_equality( - self.main_img.load(), slideshow_images[i].load() - ) - - # Create the slideshow object that plays through once backwards. - slideshow2 = SlideShow( - board.DISPLAY, - dwell=3, - folder=pic_dir, - loop=True, - fade_effect=False, - auto_advance=True, - order=PlayBackOrder.ALPHABETICAL, - direction=PlayBackDirection.BACKWARD, - ) - - slideshow2._SlideShow__send = self.__send_helper - - helper._Helper__test_image_equality( - self.main_img.load(), slideshow_images[7].load() - ) - - for i in range(6, -1, -1): - slideshow2.advance() - helper._Helper__test_image_equality( - self.main_img.load(), slideshow_images[i].load() - ) - - def __send_helper(self, image): - self.main_img = image diff --git a/Source/clue/test/test_helpers.py b/Source/clue/test/test_helpers.py deleted file mode 100644 index ef8c7caf2..000000000 --- a/Source/clue/test/test_helpers.py +++ /dev/null @@ -1,32 +0,0 @@ -from base_circuitpython import base_cp_constants as CONSTANTS - - -class Helper: - def __test_image_equality(self, image_1, image_2): - for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - pixel_1 = image_1[j, i] - pixel_2 = image_2[j, i] - - if not isinstance(pixel_1, tuple): - pixel_1 = self.hex2rgba(pixel_1) - - if not isinstance(pixel_2, tuple): - pixel_2 = self.hex2rgba(pixel_2) - assert pixel_1[0:3] == pixel_2[0:3] - - def hex2rgba(self, curr_colour): - - ret_list = [] - - for i in range(3, -1, -1): - val = (curr_colour >> (2 ** (i + 1))) & 255 - if val == 0: - ret_list.append(0) - else: - ret_list.append(val) - - return tuple(ret_list) - - -helper = Helper() diff --git a/Source/common/test/__init__.py b/Source/common/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/Source/common/test/test_debugger_communication_client.py b/Source/common/test/test_debugger_communication_client.py deleted file mode 100644 index fea21211e..000000000 --- a/Source/common/test/test_debugger_communication_client.py +++ /dev/null @@ -1,193 +0,0 @@ -import pytest -import json # Remove -from unittest import mock -import socketio -import threading -import os -import sys - -from common import constants as CONSTANTS - -abs_path_to_parent_dir = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "..", ".." -) - -sys.path.insert(0, abs_path_to_parent_dir) -# Insert absolute path to Micropython libraries for micro:bit into sys.path -abs_path_to_micropython_lib = os.path.join( - abs_path_to_parent_dir, CONSTANTS.MICROPYTHON_LIBRARY_NAME -) - -sys.path.insert(0, abs_path_to_micropython_lib) - -from common import debugger_communication_client -from adafruit_circuitplayground import express -from adafruit_circuitplayground.constants import CPX - - -class TestDebuggerCommunicationClient(object): - @mock.patch("socketio.Client.connect") - def test_init_connection(self, mock_connect): - mock_connect.return_value = None - debugger_communication_client.init_connection() - mock_connect.assert_called_once() - - def test_init_connection1(self): - socketio.Client.connect = mock.Mock() - socketio.Client.connect.return_value = None - debugger_communication_client.init_connection() - socketio.Client.connect.assert_called_once() - - def test_update_state(self): - threading.Event.clear = mock.Mock() - threading.Event.wait = mock.Mock() - socketio.Client.emit = mock.Mock() - socketio.Client.emit.return_value = None - debugger_communication_client.update_state( - {CONSTANTS.ACTIVE_DEVICE_FIELD: CPX, CONSTANTS.STATE_FIELD: {}} - ) - socketio.Client.emit.assert_called_once() - - @mock.patch.dict( - express.cpx._Express__state, - { - "brightness": 1.0, - "button_a": False, - "button_b": False, - "pixels": [ - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - ], - "red_led": False, - "switch": False, - "temperature": 0, - "light": 0, - "motion_x": 0, - "motion_y": 0, - "motion_z": 0, - "touch": [False] * 7, - "shake": False, - }, - clear=True, - ) - def test_button_press(self): - data = { - CONSTANTS.ACTIVE_DEVICE_FIELD: CPX, - CONSTANTS.STATE_FIELD: {"button_a": True, "button_b": True, "switch": True}, - } - expected_data = { - "brightness": 1.0, - "button_a": True, - "button_b": True, - "pixels": [ - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - ], - "red_led": False, - "switch": True, - "temperature": 0, - "light": 0, - "motion_x": 0, - "motion_y": 0, - "motion_z": 0, - "touch": [False] * 7, - "shake": False, - } - serialized_data = json.dumps(data) - debugger_communication_client.input_changed(serialized_data) - assert expected_data == express.cpx._Express__state - - @mock.patch.dict( - express.cpx._Express__state, - { - "brightness": 1.0, - "button_a": False, - "button_b": False, - "pixels": [ - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - ], - "red_led": False, - "switch": False, - "temperature": 0, - "light": 0, - "motion_x": 0, - "motion_y": 0, - "motion_z": 0, - "touch": [False] * 7, - "shake": False, - }, - clear=True, - ) - def test_input_changed(self): - data = { - CONSTANTS.ACTIVE_DEVICE_FIELD: CPX, - CONSTANTS.STATE_FIELD: { - "temperature": 1, - "light": 2, - "motion_x": 3, - "motion_y": 4, - "motion_z": 5, - }, - } - expected_data = { - "brightness": 1.0, - "button_a": False, - "button_b": False, - "pixels": [ - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - ], - "red_led": False, - "switch": False, - "temperature": 1, - "light": 2, - "motion_x": 3, - "motion_y": 4, - "motion_z": 5, - "touch": [False] * 7, - "shake": False, - } - serialized_data = json.dumps(data) - debugger_communication_client.input_changed(serialized_data) - assert expected_data == express.cpx._Express__state - - @mock.patch("builtins.print") - @mock.patch.dict(express.cpx._Express__state, {}, clear=True) - def test_update_api_state_fail(self, mocked_print): - data = [] - debugger_communication_client.input_changed(data) - # Exception is caught and a print is stated to stderr - mocked_print.assert_called_once() diff --git a/Source/common/test/test_utils.py b/Source/common/test/test_utils.py deleted file mode 100644 index 11e7c8a2e..000000000 --- a/Source/common/test/test_utils.py +++ /dev/null @@ -1,32 +0,0 @@ -import sys - -from unittest import mock - -from common import constants as CONSTANTS -from common import utils - - -class TestUtils(object): - def test_remove_leading_slashes(self): - original = "///a//b/" - expected = "a//b/" - assert expected == utils.remove_leading_slashes(original) - - def test_escape_notOSX(self): - _utils_sys = utils.sys - if sys.platform.startswith(CONSTANTS.MAC_OS): - utils.sys = mock.MagicMock() - utils.sys.configure_mock(platform="win32") - original = "a b" - assert original == utils.escape_if_OSX(original) - utils.sys = _utils_sys - - def test_escape_isOSX(self): - _utils_sys = utils.sys - if not sys.platform.startswith(CONSTANTS.MAC_OS): - utils.sys = mock.MagicMock() - utils.sys.configure_mock(platform="darwin") - original = "a b" - expected = "a%20b" - assert expected == utils.escape_if_OSX(original) - utils.sys = _utils_sys diff --git a/Source/micropython/microbit/test/__init__.py b/Source/micropython/microbit/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/Source/micropython/microbit/test/test_accelerometer.py b/Source/micropython/microbit/test/test_accelerometer.py deleted file mode 100644 index 241f63df1..000000000 --- a/Source/micropython/microbit/test/test_accelerometer.py +++ /dev/null @@ -1,104 +0,0 @@ -import pytest -from unittest import mock - -from ..__model.accelerometer import Accelerometer -from ..__model import constants as CONSTANTS - - -class TestAccelerometer(object): - def setup_method(self): - self.accelerometer = Accelerometer() - - @pytest.mark.parametrize( - "accel", - [ - CONSTANTS.MIN_ACCELERATION, - CONSTANTS.MIN_ACCELERATION + 1, - 100, - CONSTANTS.MAX_ACCELERATION - 1, - CONSTANTS.MAX_ACCELERATION, - ], - ) - def test_x_y_z(self, accel): - self.accelerometer._Accelerometer__set_accel("x", accel) - assert accel == self.accelerometer.get_x() - self.accelerometer._Accelerometer__set_accel("y", accel) - assert accel == self.accelerometer.get_y() - self.accelerometer._Accelerometer__set_accel("z", accel) - assert accel == self.accelerometer.get_z() - - @pytest.mark.parametrize("axis", ["x", "y", "z"]) - def test_x_y_z_invalid_accel(self, axis): - with pytest.raises(ValueError): - self.accelerometer._Accelerometer__set_accel( - axis, CONSTANTS.MAX_ACCELERATION + 1 - ) - with pytest.raises(ValueError): - self.accelerometer._Accelerometer__set_accel( - axis, CONSTANTS.MIN_ACCELERATION - 1 - ) - - @pytest.mark.parametrize( - "accels", - [ - (23, 25, 26), - (204, 234, -534), - (CONSTANTS.MIN_ACCELERATION + 10, 234, CONSTANTS.MAX_ACCELERATION), - ], - ) - def test_get_values(self, accels): - self.accelerometer._Accelerometer__set_accel("x", accels[0]) - self.accelerometer._Accelerometer__set_accel("y", accels[1]) - self.accelerometer._Accelerometer__set_accel("z", accels[2]) - assert accels == self.accelerometer.get_values() - - @pytest.mark.parametrize("gesture", ["up", "face down", "freefall", "8g"]) - def test_current_gesture(self, gesture): - self.accelerometer._Accelerometer__set_gesture(gesture) - assert gesture == self.accelerometer.current_gesture() - - @pytest.mark.parametrize("gesture", ["up", "face down", "freefall", "8g"]) - def test_is_gesture(self, gesture): - self.accelerometer._Accelerometer__set_gesture(gesture) - assert self.accelerometer.is_gesture(gesture) - for g in CONSTANTS.GESTURES: - if g != gesture: - assert not self.accelerometer.is_gesture(g) - - def test_is_gesture_error(self): - with pytest.raises(ValueError): - self.accelerometer.is_gesture("sideways") - - def test_was_gesture(self): - mock_gesture_up = "up" - mock_gesture_down = "down" - - assert not self.accelerometer.was_gesture(mock_gesture_up) - self.accelerometer._Accelerometer__set_gesture(mock_gesture_up) - self.accelerometer.current_gesture() # Call is needed for gesture detection so it can be added to the lists. - self.accelerometer._Accelerometer__set_gesture("") - assert self.accelerometer.was_gesture(mock_gesture_up) - assert not self.accelerometer.was_gesture(mock_gesture_up) - - def test_was_gesture_error(self): - with pytest.raises(ValueError): - self.accelerometer.was_gesture("sideways") - - def test_get_gestures(self): - mock_gesture_up = "up" - mock_gesture_down = "down" - mock_gesture_freefall = "freefall" - - self.accelerometer._Accelerometer__set_gesture(mock_gesture_up) - self.accelerometer.current_gesture() # Call is needed for gesture detection so it can be added to the lists. - self.accelerometer._Accelerometer__set_gesture(mock_gesture_down) - self.accelerometer.current_gesture() - self.accelerometer._Accelerometer__set_gesture(mock_gesture_freefall) - self.accelerometer.current_gesture() - self.accelerometer._Accelerometer__set_gesture("") - assert ( - mock_gesture_up, - mock_gesture_down, - mock_gesture_freefall, - ) == self.accelerometer.get_gestures() - assert () == self.accelerometer.get_gestures() diff --git a/Source/micropython/microbit/test/test_button.py b/Source/micropython/microbit/test/test_button.py deleted file mode 100644 index 31e9d6720..000000000 --- a/Source/micropython/microbit/test/test_button.py +++ /dev/null @@ -1,46 +0,0 @@ -import pytest -from ..__model.button import Button - - -class TestButton(object): - def setup_method(self): - self.button = Button() - - def test_press_down(self): - self.button._Button__press_down() - assert self.button._Button__presses == 1 - assert self.button._Button__pressed - assert self.button._Button__prev_pressed - self.button._Button__press_down() - assert self.button._Button__presses == 2 - assert self.button._Button__pressed - assert self.button._Button__prev_pressed - - def test_release(self): - self.button._Button__pressed = True - self.button._Button__prev_pressed = False - self.button._Button__release() - assert not self.button._Button__pressed - - def test_is_pressed(self): - assert not self.button.is_pressed() - self.button._Button__press_down() - assert self.button.is_pressed() - - def test_was_pressed(self): - assert not self.button.was_pressed() - self.button._Button__press_down() - self.button._Button__release() - assert self.button.was_pressed() - # Button resets __prev_pressed after was_pressed() is called. - assert not self.button.was_pressed() - - @pytest.mark.parametrize("presses", [1, 2, 4]) - def test_get_presses(self, presses): - assert 0 == self.button.get_presses() - for i in range(presses): - self.button._Button__press_down() - self.button._Button__release() - assert presses == self.button.get_presses() - # Presses is reset to 0 after get_presses() is called. - assert 0 == self.button.get_presses() diff --git a/Source/micropython/microbit/test/test_display.py b/Source/micropython/microbit/test/test_display.py deleted file mode 100644 index 1055c8870..000000000 --- a/Source/micropython/microbit/test/test_display.py +++ /dev/null @@ -1,185 +0,0 @@ -import pytest -import threading -from unittest import mock -from common import utils - -from ..__model import constants as CONSTANTS -from ..__model.display import Display -from ..__model.image import Image - - -STR_A = "09900:90090:99990:90090:90090" -STR_QUESTION_MARK = "09990:90009:00990:00000:00900" -STR_EXCLAMATION_MARK = "09000:09000:09000:00000:09000:" -STR_SIX = "00090:00900:09990:90009:09990" - - -class TestDisplay(object): - def setup_method(self): - self.display = Display() - utils.send_to_simulator = mock.Mock() - - @pytest.mark.parametrize("x, y, brightness", [(1, 1, 4), (2, 3, 6), (4, 4, 9)]) - def test_set_and_get_pixel(self, x, y, brightness): - self.display.set_pixel(x, y, brightness) - assert brightness == self.display.get_pixel(x, y) - - @pytest.mark.parametrize("x, y", [(5, 0), (0, -1), (0, 5)]) - def test_get_pixel_error(self, x, y): - with pytest.raises(ValueError, match=CONSTANTS.INDEX_ERR): - self.display.get_pixel(x, y) - - @pytest.mark.parametrize( - "x, y, brightness, err_msg", - [ - (5, 0, 0, CONSTANTS.INDEX_ERR), - (0, -1, 0, CONSTANTS.INDEX_ERR), - (0, 0, -1, CONSTANTS.BRIGHTNESS_ERR), - ], - ) - def test_set_pixel_error(self, x, y, brightness, err_msg): - with pytest.raises(ValueError, match=err_msg): - self.display.set_pixel(x, y, brightness) - - def test_clear(self): - self.display.set_pixel(2, 3, 7) - self.display.set_pixel(3, 4, 6) - self.display.set_pixel(4, 4, 9) - assert not self.__is_clear() - self.display.clear() - assert self.__is_clear() - - def test_on_off(self): - self.display.on() - assert self.display.is_on() - self.display.off() - assert not self.display.is_on() - - def test_show_one_image(self): - img = Image() - img.set_pixel(0, 0, 8) - img.set_pixel(0, 1, 9) - img.set_pixel(0, 2, 7) - img.set_pixel(2, 2, 6) - self.display.show(img, delay=0) - assert Image._Image__same_image(img, self.display._Display__image) - - def test_show_different_size_image(self): - img = Image(3, 7) - img.set_pixel(1, 1, 9) - img.set_pixel(2, 6, 9) # Will not be on display - expected = Image(5, 5) - expected.set_pixel(1, 1, 9) - self.display.show(img, delay=0) - assert Image._Image__same_image(expected, self.display._Display__image) - - def test_show_smaller_image(self): - img = Image(2, 2) - img.set_pixel(1, 1, 9) - expected = Image(5, 5) - expected.set_pixel(1, 1, 9) - self.display.show(img, delay=0) - assert Image._Image__same_image(expected, self.display._Display__image) - - @pytest.mark.parametrize( - "value, expected_str", - [ - ("!", STR_EXCLAMATION_MARK), - ("A", STR_A), - (" ", CONSTANTS.BLANK_5X5), - (6, STR_SIX), - ("\x7F", STR_QUESTION_MARK), # Character is out of our ASCII range - ], - ) - def test_show_char(self, value, expected_str): - expected = Image(expected_str) - self.display.show(value, delay=0) - assert Image._Image__same_image(expected, self.display._Display__image) - - def test_show_char_with_clear(self): - image = Image(STR_EXCLAMATION_MARK) - self.display.show(image, delay=0, clear=True) - assert self.__is_clear() - - def test_show_iterable(self): - expected = Image(STR_A) - value = [Image(STR_EXCLAMATION_MARK), "A", "ab"] - self.display.show(value, delay=0) - assert Image._Image__same_image(expected, self.display._Display__image) - - def test_show_non_iterable(self): - with pytest.raises(TypeError): - self.display.show(TestDisplay()) - - def test_scroll(self): - self.display.scroll("a b") - self.__is_clear() - - def test_scroll_type_error(self): - with pytest.raises(TypeError): - self.display.scroll(["a", 1]) - - # Should change these threaded tests to test behaviour in the future - def test_show_threaded(self): - threading.Thread = mock.Mock() - self.display.show("a", delay=0, wait=False) - threading.Thread.assert_called_once() - - def test_scroll_threaded(self): - threading.Thread = mock.Mock() - self.display.scroll("test", delay=0, wait=False) - threading.Thread.assert_called_once() - - def test_get_array(self): - self.display.set_pixel(3, 3, 3) - self.display.off() - assert self.display._Display__get_array() == [ - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - ] - - self.display.on() - assert self.display._Display__get_array() == [ - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 3, 0], - [0, 0, 0, 0, 0], - ] - - # The second show call should immedaitely stop the first show call. - # Therefore the final result of display should be 6. - def test_async_tests(self): - self.display.show("MMMMMMMMMMMMMM", delay=100, wait=False) - self.display.show("6", delay=0) - assert Image._Image__same_image(Image(STR_SIX), self.display._Display__image) - - @pytest.mark.parametrize( - "light_level", - [ - CONSTANTS.MIN_LIGHT_LEVEL, - CONSTANTS.MIN_LIGHT_LEVEL + 1, - 100, - CONSTANTS.MAX_LIGHT_LEVEL - 1, - CONSTANTS.MAX_LIGHT_LEVEL, - ], - ) - def test_light_level(self, light_level): - self.display._Display__set_light_level(light_level) - assert light_level == self.display.read_light_level() - - @pytest.mark.parametrize( - "invalid_light_level", - [CONSTANTS.MIN_LIGHT_LEVEL - 1, CONSTANTS.MAX_LIGHT_LEVEL + 1], - ) - def test_invalid_light_level(self, invalid_light_level): - with pytest.raises(ValueError): - self.display._Display__set_light_level(invalid_light_level) - - # Helpers - def __is_clear(self): - i = Image(CONSTANTS.BLANK_5X5) - return Image._Image__same_image(i, self.display._Display__image) diff --git a/Source/micropython/microbit/test/test_image.py b/Source/micropython/microbit/test/test_image.py deleted file mode 100644 index 5ea150230..000000000 --- a/Source/micropython/microbit/test/test_image.py +++ /dev/null @@ -1,283 +0,0 @@ -import pytest -from ..__model.image import Image - -from ..__model import constants as CONSTANTS - - -class TestImage(object): - def setup_method(self): - self.image = Image() - self.image_heart = Image(CONSTANTS.IMAGE_PATTERNS["HEART"]) - - @pytest.mark.parametrize("x, y, brightness", [(1, 1, 4), (2, 3, 6), (4, 4, 9)]) - def test_get_set_pixel(self, x, y, brightness): - self.image.set_pixel(x, y, brightness) - assert brightness == self.image.get_pixel(x, y) - - @pytest.mark.parametrize("x, y", [(5, 0), (0, -1), (0, 5)]) - def test_get_pixel_error(self, x, y): - with pytest.raises(ValueError, match=CONSTANTS.INDEX_ERR): - self.image.get_pixel(x, y) - - @pytest.mark.parametrize( - "x, y, brightness, err_msg", - [ - (5, 0, 0, CONSTANTS.INDEX_ERR), - (0, -1, 0, CONSTANTS.INDEX_ERR), - (0, 0, -1, CONSTANTS.BRIGHTNESS_ERR), - ], - ) - def test_set_pixel_error(self, x, y, brightness, err_msg): - with pytest.raises(ValueError, match=err_msg): - self.image.set_pixel(x, y, brightness) - - @pytest.mark.parametrize( - "image, height, width", - [ - (Image(), 5, 5), - (Image(3, 3), 3, 3), - (Image(""), 0, 0), - (Image("00:00000"), 2, 5), - (Image("0000:0000"), 2, 4), - ], - ) - def test_width_and_height(self, image, height, width): - print(str(image)) - assert image.height() == height - assert image.width() == width - - @pytest.mark.parametrize( - "x, y, w, h, x_dest, y_dest, actual", - [ - (0, 0, 3, 2, 2, 1, Image("00000:00090:00999:00000:00000:")), - (0, 0, 3, 3, 8, 8, Image("00000:00000:00000:00000:00000:")), - (3, 0, 3, 3, 0, 0, Image("90000:99000:99000:00000:00000:")), - (3, 0, 7, 7, 0, 0, Image("90000:99000:99000:90000:00000:")), - ], - ) - def test_blit_heart(self, x, y, w, h, x_dest, y_dest, actual): - result = Image() - result.blit(self.image_heart, x, y, w, h, x_dest, y_dest) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "x, y, w, h, x_dest, y_dest, actual", - [ - (1, 1, 2, 4, 3, 3, Image("09090:99999:99999:09999:00999:")), - (0, 0, 3, 3, 8, 8, Image(CONSTANTS.IMAGE_PATTERNS["HEART"])), - (0, 0, 7, 7, 0, 0, Image(CONSTANTS.IMAGE_PATTERNS["HEART"])), - (3, 0, 7, 7, 0, 0, Image("90000:99000:99000:90000:00000:")), - ], - ) - def test_blit_heart_nonblank(self, x, y, w, h, x_dest, y_dest, actual): - result = Image(CONSTANTS.IMAGE_PATTERNS["HEART"]) - src = Image(CONSTANTS.IMAGE_PATTERNS["HEART"]) - result.blit(src, x, y, w, h, x_dest, y_dest) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "x, y, w, h, x_dest, y_dest", [(5, 6, 2, 4, 3, 3), (5, 0, 3, 3, 8, 8)] - ) - def test_blit_heart_valueerror(self, x, y, w, h, x_dest, y_dest): - result = Image(CONSTANTS.IMAGE_PATTERNS["HEART"]) - with pytest.raises(ValueError, match=CONSTANTS.INDEX_ERR): - result.blit(self.image_heart, x, y, w, h, x_dest, y_dest) - - @pytest.mark.parametrize( - "image1, image2", [(Image(2, 2, bytearray([4, 4, 4, 4])), Image("44:44"))] - ) - def test_constructor_bytearray(self, image1, image2): - assert image1._Image__LED == image2._Image__LED - - @pytest.mark.parametrize( - "x, y, w, h, actual", [(1, 1, 2, 4, Image("99:99:99:09:"))] - ) - def test_crop_heart(self, x, y, w, h, actual): - result = self.image_heart.crop(1, 1, 2, 4) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, actual", [(Image("99:99:99:00:"), Image("22:22:22:22:"))] - ) - def test_fill(self, target, actual): - target.fill(2) - assert target._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, actual", [(Image("012:345:678:900:"), Image("987:654:321:099:"))] - ) - def test_invert(self, target, actual): - target.invert() - assert target._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, value, actual", - [ - (Image("012:345:678:900:"), 1, Image("001:034:067:090:")), - (Image("012:345:678:900:"), 6, Image("000:000:000:000:")), - (Image("012:345:678:900:"), -1, Image("120:450:780:000:")), - ], - ) - def test_shift_right(self, target, value, actual): - result = target.shift_right(value) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, value, actual", - [ - (Image("012:345:678:900:"), 2, Image("200:500:800:000:")), - (Image("012:345:678:900:"), 6, Image("000:000:000:000:")), - (Image("012:345:678:900:"), -2, Image("000:003:006:009:")), - ], - ) - def test_shift_left(self, target, value, actual): - result = target.shift_left(value) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, value, actual", - [ - (Image("012:345:678:900:"), 2, Image("678:900:000:000:")), - (Image("012:345:678:900:"), 6, Image("000:000:000:000:")), - (Image("012:345:678:900:"), -2, Image("000:000:012:345:")), - ], - ) - def test_shift_up(self, target, value, actual): - result = target.shift_up(value) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, value, actual", - [ - (Image("012:345:678:900:"), 1, Image("000:012:345:678")), - (Image("012:345:678:900:"), 6, Image("000:000:000:000:")), - (Image("012:345:678:900:"), -1, Image("345:678:900:000:")), - ], - ) - def test_shift_down(self, target, value, actual): - result = target.shift_down(value) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize("target", [(Image("012:345:678:900:"))]) - def test_copy(self, target): - result = target.copy() - assert result._Image__LED == target._Image__LED - - @pytest.mark.parametrize( - "target, multiplier, actual", - [ - (Image("012:345:678:900:"), 2, Image("024:689:999:900:")), - (Image("012:345:678:900:"), 0, Image("000:000:000:000:")), - ], - ) - def test_multiply(self, target, multiplier, actual): - result = target * multiplier - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, multiplier", - [ - (Image("012:345:678:900:"), []), - (Image("012:345:678:900:"), Image("000:000:000:000:")), - ], - ) - def test_multiply_error(self, target, multiplier): - - with pytest.raises( - TypeError, match=f"can't convert {type(multiplier)} to float" - ): - target * multiplier - - @pytest.mark.parametrize( - "target, value, actual", - [ - ( - Image("012:345:678:900:"), - Image("024:689:999:900:"), - Image("036:999:999:900:"), - ), - ( - Image("999:999:999:000:"), - Image("999:999:999:000:"), - Image("999:999:999:000:"), - ), - ], - ) - def test_add(self, target, value, actual): - result = target + value - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, value, err_message", - [ - ( - Image("012:345:678:900:"), - 2, - CONSTANTS.UNSUPPORTED_ADD_TYPE + f"'{type(Image())}', '{type(2)}'", - ), - ( - Image("012:345:678:900:"), - [], - CONSTANTS.UNSUPPORTED_ADD_TYPE + f"'{type(Image())}', '{type([])}'", - ), - ], - ) - def test_add_typeerror(self, target, value, err_message): - with pytest.raises(TypeError, match=err_message): - target + value - - @pytest.mark.parametrize( - "target, value", [(Image(2, 3), Image(3, 3)), (Image(2, 1), Image(0, 0))] - ) - def test_add_valueerror(self, target, value): - with pytest.raises(ValueError, match=CONSTANTS.SAME_SIZE_ERR): - target + value - - @pytest.mark.parametrize( - "initial, actual", - [ - (Image("0:000:00:0000:"), Image("0000:0000:0000:0000:")), - (Image("12125:1212:12:1:"), Image("12125:12120:12000:10000:")), - ], - ) - def test_uneven_strings(self, initial, actual): - assert initial._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "image, repr_actual, str_actual", - [ - ( - Image("05150:05050:05050:99999:09990:"), - "Image('05150:05050:05050:99999:09990:')", - "Image('\n 05150:\n 05050:\n 05050:\n 99999:\n 09990:\n')", - ), - (Image(""), "Image('')", "Image('\n')"), - ( - Image("00000:00000:00000:00000:00000:"), - "Image('00000:00000:00000:00000:00000:')", - "Image('\n 00000:\n 00000:\n 00000:\n 00000:\n 00000:\n')", - ), - ( - Image("00:00:00:00:"), - "Image('00:00:00:00:')", - "Image('\n 00:\n 00:\n 00:\n 00:\n')", - ), - ], - ) - def test_str(self, image, repr_actual, str_actual): - repr_output = repr(image) - str_output = str(image) - assert repr_actual == repr_output - assert str_actual == str_output - - @pytest.mark.parametrize( - "const, actual", - [ - (Image.SNAKE, Image(CONSTANTS.IMAGE_PATTERNS["SNAKE"])), - (Image.PITCHFORK, Image(CONSTANTS.IMAGE_PATTERNS["PITCHFORK"])), - ], - ) - def test_image_constants(self, const, actual): - assert const._Image__LED == actual._Image__LED - with pytest.raises(TypeError, match=CONSTANTS.COPY_ERR_MESSAGE): - const.set_pixel(0, 0, 5) diff --git a/Source/micropython/microbit/test/test_init.py b/Source/micropython/microbit/test/test_init.py deleted file mode 100644 index aebbc805a..000000000 --- a/Source/micropython/microbit/test/test_init.py +++ /dev/null @@ -1,45 +0,0 @@ -import time - -import pytest -from unittest import mock - -from .. import * -from ..__model.microbit_model import MicrobitModel - -# tests methods in __init__.py - - -class TestShim(object): - def test_sleep(self): - # Save pointer to function about to be mocked - real_function = MicrobitModel.sleep - - milliseconds = 100 - MicrobitModel.sleep = mock.Mock() - sleep(milliseconds) - MicrobitModel.sleep.assert_called_with(milliseconds) - - # Restore original function - MicrobitModel.sleep = real_function - - def test_running_time(self): - # Save pointer to function about to be mocked - real_function = MicrobitModel.running_time - - MicrobitModel.running_time = mock.Mock() - running_time() - MicrobitModel.running_time.assert_called_once() - - # Restore original function - MicrobitModel.running_time = real_function - - def test_temperature(self): - # Save pointer to function about to be mocked - real_function = MicrobitModel.temperature - - MicrobitModel.temperature = mock.Mock() - temperature() - MicrobitModel.temperature.asser_called_once() - - # Restore original function - MicrobitModel.temperature = real_function diff --git a/Source/micropython/microbit/test/test_microbit_model.py b/Source/micropython/microbit/test/test_microbit_model.py deleted file mode 100644 index 4e06c6c36..000000000 --- a/Source/micropython/microbit/test/test_microbit_model.py +++ /dev/null @@ -1,48 +0,0 @@ -import time - -import pytest -from unittest import mock -from ..__model import constants as CONSTANTS -from ..__model.microbit_model import MicrobitModel - - -class TestMicrobitModel(object): - def setup_method(self): - self.__mb = MicrobitModel() - - @pytest.mark.parametrize("value", [9, 30, 1999]) - def test_sleep(self, value): - time.sleep = mock.Mock() - self.__mb.sleep(value) - time.sleep.assert_called_with(value / 1000) - - def test_running_time(self): - mock_start_time = 10 - mock_end_time = 300 - self.__mb._MicrobitModel__start_time = mock_start_time - time.time = mock.MagicMock(return_value=mock_end_time) - assert mock_end_time - mock_start_time == pytest.approx( - self.__mb.running_time() - ) - - @pytest.mark.parametrize( - "temperature", - [ - CONSTANTS.MIN_TEMPERATURE, - CONSTANTS.MIN_TEMPERATURE + 1, - 0, - CONSTANTS.MAX_TEMPERATURE - 1, - CONSTANTS.MAX_TEMPERATURE, - ], - ) - def test_temperature(self, temperature): - self.__mb._MicrobitModel__set_temperature(temperature) - assert temperature == self.__mb.temperature() - - @pytest.mark.parametrize( - "invalid_temperature", - [CONSTANTS.MIN_TEMPERATURE - 1, CONSTANTS.MAX_TEMPERATURE + 1], - ) - def test_invalid_temperature(self, invalid_temperature): - with pytest.raises(ValueError): - self.__mb._MicrobitModel__set_temperature(invalid_temperature) diff --git a/Source/test/runTest.ts b/Source/test/runTest.ts deleted file mode 100644 index 6d54aa78b..000000000 --- a/Source/test/runTest.ts +++ /dev/null @@ -1,23 +0,0 @@ -import * as path from "path"; - -import { runTests } from "vscode-test"; - -async function main() { - try { - // The folder containing the Extension Manifest package.json - // Passed to `--extensionDevelopmentPath` - const extensionDevelopmentPath = path.resolve(__dirname, "../../"); - - // The path to the extension test script - // Passed to --extensionTestsPath - const extensionTestsPath = path.resolve(__dirname, "./suite/index"); - - // Download VS Code, unzip it and run the integration test - await runTests({ extensionDevelopmentPath, extensionTestsPath }); - } catch (err) { - console.error("Failed to run tests"); - process.exit(1); - } -} - -main(); diff --git a/Source/test/suite/index.ts b/Source/test/suite/index.ts deleted file mode 100644 index c223a6f0d..000000000 --- a/Source/test/suite/index.ts +++ /dev/null @@ -1,50 +0,0 @@ -// -// PLEASE DO NOT MODIFY / DELETE UNLESS YOU KNOW WHAT YOU ARE DOING -// -// This file is providing the test runner to use when running extension tests. -// By default the test runner in use is Mocha based. -// -// You can provide your own test runner if you want to override it by exporting -// a function run(testsRoot: string, clb: (error: Error, failures?: number) => void): void -// that the extension host can call to run the tests. The test runner is expected to use console.log -// to report the results back to the caller. When the tests are finished, return -// a possible error to the callback or null if none. - -import * as glob from "glob"; -import * as Mocha from "mocha"; -import * as path from "path"; - -// tslint:disable-next-line: export-name -export function run(): Promise { - // Create the mocha test - const mocha = new Mocha({ - ui: "tdd", - }); - mocha.useColors(true); - - const testsRoot = path.resolve(__dirname, ".."); - - return new Promise((c, e) => { - glob("**/**.test.js", { cwd: testsRoot }, (err, files) => { - if (err) { - return e(err); - } - - // Add files to the test suite - files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); - - try { - // Run the mocha test - mocha.run(failures => { - if (failures > 0) { - e(new Error(`${failures} tests failed.`)); - } else { - c(); - } - }); - } catch (err) { - e(err); - } - }); - }); -} diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index 3d7f4f549..000000000 --- a/jest.config.js +++ /dev/null @@ -1,28 +0,0 @@ -module.exports = { - // The root of your source code, typically /src - // `` is a token Jest substitutes - roots: ["/src"], - - // Jest transformations -- this adds support for TypeScript - // using ts-jest - transform: { - '^.+\\.tsx?$': 'ts-jest', - ".+\\.(css|styl|less|sass|scss)$": "jest-transform-css" - }, - - // Runs special logic, such as cleaning up components - // when using React Testing Library and adds special - // extended assertions to Jest - setupFilesAfterEnv: [ - "@testing-library/jest-dom/extend-expect" - ], - - // Test spec file resolution pattern - // Matches parent folder `__tests__` and filename - // should contain `test` or `spec`. - testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$", - - // Module file extensions for importing - moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], - - }; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 83024d259..000000000 --- a/package-lock.json +++ /dev/null @@ -1,32342 +0,0 @@ -{ - "name": "__EXTENSIONNAME__", - "version": "0.0.0-UNTRACKEDVERSION", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/compat-data": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.5.tgz", - "integrity": "sha512-jWYUqQX/ObOhG1UiEkbH5SANsE/8oKXiQWjj7p7xgj9Zmnt//aUvyz4dBkK0HNsS8/cbyC5NmmH87VekW+mXFg==", - "dev": true, - "requires": { - "browserslist": "^4.8.5", - "invariant": "^2.2.4", - "semver": "^5.5.0" - } - }, - "@babel/core": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.3.tgz", - "integrity": "sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.0", - "@babel/helpers": "^7.4.3", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "convert-source-map": "^1.1.0", - "debug": "^4.1.0", - "json5": "^2.1.0", - "lodash": "^4.17.11", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", - "requires": { - "@babel/types": "^7.4.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", - "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", - "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-builder-react-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz", - "integrity": "sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "esutils": "^2.0.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-call-delegate": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz", - "integrity": "sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz", - "integrity": "sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.8.4", - "browserslist": "^4.8.5", - "invariant": "^2.2.4", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz", - "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz", - "integrity": "sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==", - "dev": true, - "requires": { - "@babel/helper-regex": "^7.8.3", - "regexpu-core": "^4.6.0" - }, - "dependencies": { - "regexpu-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", - "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.1.0", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" - } - }, - "regjsgen": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", - "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", - "dev": true - }, - "regjsparser": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.3.tgz", - "integrity": "sha512-8uZvYbnfAtEm9Ab8NTb3hdLwL4g/LQzEYP7Xs27T96abJCCE2d6r3cPZPQEsLKy0vRSGVNG+/zVGtLr86HQduA==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } - } - } - }, - "@babel/helper-define-map": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", - "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/types": "^7.8.3", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", - "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", - "dev": true, - "requires": { - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", - "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-module-imports": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", - "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-module-transforms": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz", - "integrity": "sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-simple-access": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==" - }, - "@babel/helper-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", - "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", - "dev": true, - "requires": { - "lodash": "^4.17.13" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", - "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-wrap-function": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-replace-supers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", - "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-simple-access": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", - "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@babel/helper-wrap-function": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", - "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helpers": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz", - "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", - "requires": { - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==" - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", - "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3", - "@babel/plugin-syntax-async-generators": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz", - "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-decorators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz", - "integrity": "sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-decorators": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", - "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", - "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", - "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - } - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz", - "integrity": "sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz", - "integrity": "sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - } - } - }, - "@babel/plugin-syntax-decorators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz", - "integrity": "sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-flow": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz", - "integrity": "sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz", - "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", - "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", - "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz", - "integrity": "sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - } - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", - "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", - "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", - "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", - "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-classes": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz", - "integrity": "sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-define-map": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", - "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz", - "integrity": "sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", - "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", - "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", - "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.8.3.tgz", - "integrity": "sha512-g/6WTWG/xbdd2exBBzMfygjX/zw4eyNC4X8pRaq7aRHRoDUCzAIu3kGYIXviOv8BjCuWm8vDBwjHcjiRNgXrPA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-flow": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz", - "integrity": "sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", - "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/plugin-transform-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", - "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", - "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz", - "integrity": "sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz", - "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-simple-access": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz", - "integrity": "sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.8.3", - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz", - "integrity": "sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", - "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", - "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", - "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz", - "integrity": "sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA==", - "dev": true, - "requires": { - "@babel/helper-call-delegate": "^7.8.3", - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", - "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-constant-elements": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.8.3.tgz", - "integrity": "sha512-glrzN2U+egwRfkNFtL34xIBYTxbbUF2qJTP8HD3qETBBqzAWSeNB821X0GjU06+dNpq/UyCIjI72FmGE5NNkQQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", - "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz", - "integrity": "sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g==", - "dev": true, - "requires": { - "@babel/helper-builder-react-jsx": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz", - "integrity": "sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz", - "integrity": "sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz", - "integrity": "sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA==", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.0" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", - "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz", - "integrity": "sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "resolve": "^1.8.1", - "semver": "^5.5.1" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", - "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", - "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", - "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-regex": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", - "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", - "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.3.tgz", - "integrity": "sha512-Ebj230AxcrKGZPKIp4g4TdQLrqX95TobLUWKd/CwG7X1XHUH1ZpkpFvXuXqWbtGRWb7uuEWNlrl681wsOArAdQ==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-typescript": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz", - "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==", - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - }, - "@babel/helper-replace-supers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", - "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", - "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/preset-env": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.4.tgz", - "integrity": "sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.8.4", - "@babel/helper-compilation-targets": "^7.8.4", - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-proposal-async-generator-functions": "^7.8.3", - "@babel/plugin-proposal-dynamic-import": "^7.8.3", - "@babel/plugin-proposal-json-strings": "^7.8.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.8.3", - "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", - "@babel/plugin-proposal-optional-chaining": "^7.8.3", - "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.8.3", - "@babel/plugin-transform-async-to-generator": "^7.8.3", - "@babel/plugin-transform-block-scoped-functions": "^7.8.3", - "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/plugin-transform-classes": "^7.8.3", - "@babel/plugin-transform-computed-properties": "^7.8.3", - "@babel/plugin-transform-destructuring": "^7.8.3", - "@babel/plugin-transform-dotall-regex": "^7.8.3", - "@babel/plugin-transform-duplicate-keys": "^7.8.3", - "@babel/plugin-transform-exponentiation-operator": "^7.8.3", - "@babel/plugin-transform-for-of": "^7.8.4", - "@babel/plugin-transform-function-name": "^7.8.3", - "@babel/plugin-transform-literals": "^7.8.3", - "@babel/plugin-transform-member-expression-literals": "^7.8.3", - "@babel/plugin-transform-modules-amd": "^7.8.3", - "@babel/plugin-transform-modules-commonjs": "^7.8.3", - "@babel/plugin-transform-modules-systemjs": "^7.8.3", - "@babel/plugin-transform-modules-umd": "^7.8.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", - "@babel/plugin-transform-new-target": "^7.8.3", - "@babel/plugin-transform-object-super": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.8.4", - "@babel/plugin-transform-property-literals": "^7.8.3", - "@babel/plugin-transform-regenerator": "^7.8.3", - "@babel/plugin-transform-reserved-words": "^7.8.3", - "@babel/plugin-transform-shorthand-properties": "^7.8.3", - "@babel/plugin-transform-spread": "^7.8.3", - "@babel/plugin-transform-sticky-regex": "^7.8.3", - "@babel/plugin-transform-template-literals": "^7.8.3", - "@babel/plugin-transform-typeof-symbol": "^7.8.4", - "@babel/plugin-transform-unicode-regex": "^7.8.3", - "@babel/types": "^7.8.3", - "browserslist": "^4.8.5", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/preset-react": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.8.3.tgz", - "integrity": "sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-transform-react-display-name": "^7.8.3", - "@babel/plugin-transform-react-jsx": "^7.8.3", - "@babel/plugin-transform-react-jsx-self": "^7.8.3", - "@babel/plugin-transform-react-jsx-source": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/preset-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.8.3.tgz", - "integrity": "sha512-qee5LgPGui9zQ0jR1TeU5/fP9L+ovoArklEqY12ek8P/wV5ZeM/VYSQYwICeoT6FfpJTekG9Ilay5PhwsOpMHA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-transform-typescript": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - } - } - }, - "@babel/runtime": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz", - "integrity": "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" - }, - "@cnakazawa/watch": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", - "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, - "@csstools/convert-colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", - "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", - "dev": true - }, - "@csstools/normalize.css": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", - "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==", - "dev": true - }, - "@fluentui/react-focus": { - "version": "7.1.13", - "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-7.1.13.tgz", - "integrity": "sha512-voY84/vRkcZGUHSwrPO6eEplc0EGKRGf06ov826NdzMq8s2BXoG2JMMdFNclFppQsCtcXOCPmfzwGHShJvGu5g==", - "requires": { - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/set-version": "^7.0.9", - "@uifabric/styling": "^7.11.2", - "@uifabric/utilities": "^7.15.5", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@formatjs/intl-relativetimeformat": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-2.8.0.tgz", - "integrity": "sha512-5T3m5hJSxXrbwtnFHyYBSbTjOXPXu+4NJ0MUu1LAf4fPEdd+pJZfWKuMJSWgFQPVMbLYq9NLvDWQda3hVe99sg==" - }, - "@gulp-sourcemaps/identity-map": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz", - "integrity": "sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==", - "dev": true, - "requires": { - "acorn": "^5.0.3", - "css": "^2.2.1", - "normalize-path": "^2.1.1", - "source-map": "^0.6.0", - "through2": "^2.0.3" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - } - } - }, - "@gulp-sourcemaps/map-sources": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", - "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", - "dev": true, - "requires": { - "normalize-path": "^2.0.1", - "through2": "^2.0.3" - } - }, - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", - "dev": true - }, - "@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", - "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", - "dev": true - }, - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "dev": true - }, - "@hapi/joi": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", - "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", - "dev": true, - "requires": { - "@hapi/address": "2.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/topo": "3.x.x" - } - }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", - "dev": true, - "requires": { - "@hapi/hoek": "^8.3.0" - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", - "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==" - }, - "@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", - "dev": true, - "requires": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@jest/core": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.1.0.tgz", - "integrity": "sha512-iz05+NmwCmZRzMXvMo6KFipW7nzhbpEawrKrkkdJzgytavPse0biEnCNr2wRlyCsp3SmKaEY+SGv7YWYQnIdig==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/reporters": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-changed-files": "^25.1.0", - "jest-config": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-resolve-dependencies": "^25.1.0", - "jest-runner": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "jest-watcher": "^25.1.0", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "realpath-native": "^1.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "requires": { - "type-fest": "^0.8.1" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "jest-watcher": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.1.0.tgz", - "integrity": "sha512-Q9eZ7pyaIr6xfU24OeTg4z1fUqBF/4MP6J801lyQfg7CsnZ/TCzAPvCfckKdL5dlBBEKBeHV0AdyjFZ5eWj4ig==", - "requires": { - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "string-length": "^3.1.0" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - } - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "@jest/environment": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.1.0.tgz", - "integrity": "sha512-cTpUtsjU4cum53VqBDlcW0E4KbQF03Cn0jckGPW/5rrE9tb+porD3+hhLtHAwhthsqfyF+bizyodTlsRA++sHg==", - "requires": { - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/fake-timers": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.1.0.tgz", - "integrity": "sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ==", - "requires": { - "@jest/types": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "lolex": "^5.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", - "requires": { - "@jest/types": "^25.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "@jest/fake-timers": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - } - } - }, - "@jest/reporters": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.1.0.tgz", - "integrity": "sha512-ORLT7hq2acJQa8N+NKfs68ZtHFnJPxsGqmofxW7v7urVhzJvpKZG9M7FAcgh9Ee1ZbCteMrirHA3m5JfBtAaDg==", - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.0", - "jest-haste-map": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", - "node-notifier": "^6.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^3.1.0", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^4.0.1" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "istanbul-lib-instrument": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz", - "integrity": "sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ==", - "requires": { - "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", - "source-map": "^0.6.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - } - } - }, - "@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", - "dev": true, - "requires": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - } - } - }, - "@jest/test-sequencer": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.1.0.tgz", - "integrity": "sha512-WgZLRgVr2b4l/7ED1J1RJQBOharxS11EFhmwDqknpknE0Pm87HLZVS2Asuuw+HQdfQvm2aXL2FvvBLxOD1D0iw==", - "requires": { - "@jest/test-result": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-runner": "^25.1.0", - "jest-runtime": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/transform": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.1.0.tgz", - "integrity": "sha512-4ktrQ2TPREVeM+KxB4zskAT84SnmG1vaz4S+51aTefyqn3zocZUnliLLm5Fsl85I3p/kFPN4CRp1RElIfXGegQ==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^25.1.0", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^3.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-util": "^25.1.0", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "istanbul-lib-instrument": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz", - "integrity": "sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ==", - "requires": { - "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "write-file-atomic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", - "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - } - } - }, - "@jest/types": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.1.0.tgz", - "integrity": "sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - }, - "dependencies": { - "@types/yargs": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.1.tgz", - "integrity": "sha512-sYlwNU7zYi6eZbMzFvG6eHD7VsEvFdoDtlD7eI1JTg7YNnuguzmiGsc6MPSq5l8n+h21AsNof0je+9sgOe4+dg==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@microsoft/load-themed-styles": { - "version": "1.10.43", - "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.43.tgz", - "integrity": "sha512-9RUeBMXPHbT/qHTRIQi9oQs3bw5JkQGBQ8ayjycq95q+1OUI9jBJPiJi2d8btpGdJWisVb3ZXxRsUx5u6f5dRA==" - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, - "@serialport/binding-abstract": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/binding-abstract/-/binding-abstract-8.0.6.tgz", - "integrity": "sha512-1swwUVoRyQ9ubxrkJ8JPppykohUpTAP4jkGr36e9NjbVocSPfqeX6tFZFwl/IdUlwJwxGdbKDqq7FvXniCQUMw==", - "requires": { - "debug": "^4.1.1" - } - }, - "@serialport/binding-mock": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/binding-mock/-/binding-mock-8.0.6.tgz", - "integrity": "sha512-BIbY5/PsDDo0QWDNCCxDgpowAdks+aZR8BOsEtK2GoASTTcJCy1fBwPIfH870o7rnbH901wY3C+yuTfdOvSO9A==", - "requires": { - "@serialport/binding-abstract": "^8.0.6", - "debug": "^4.1.1" - } - }, - "@serialport/bindings": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/@serialport/bindings/-/bindings-8.0.7.tgz", - "integrity": "sha512-IqudDL8ne2Y2S0W5fKA6wdgHCIA2e2OIaPVYhGy6duE6legNHFY+05CLicHAyAeTocXmHU7rVNxzVQrOG5tM4g==", - "requires": { - "@serialport/binding-abstract": "^8.0.6", - "@serialport/parser-readline": "^8.0.6", - "bindings": "^1.5.0", - "debug": "^4.1.1", - "nan": "^2.14.0", - "prebuild-install": "^5.3.0" - } - }, - "@serialport/parser-byte-length": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-byte-length/-/parser-byte-length-8.0.6.tgz", - "integrity": "sha512-92mrFxFEvq3gRvSM7ANK/jfbmHslz91a5oYJy/nbSn4H/MCRXjxR2YOkQgVXuN+zLt+iyDoW3pcOP4Sc1nWdqQ==" - }, - "@serialport/parser-cctalk": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-cctalk/-/parser-cctalk-8.0.6.tgz", - "integrity": "sha512-pqtCYQPgxnxHygiXUPCfgX7sEx+fdR/ObjpscidynEULUq2fFrC5kBkrxRbTfHRtTaU2ii9DyjFq0JVRCbhI0Q==" - }, - "@serialport/parser-delimiter": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-8.0.6.tgz", - "integrity": "sha512-ogKOcPisPMlVtirkuDu3SFTF0+xT0ijxoH7XjpZiYL41EVi367MwuCnEmXG+dEKKnF0j9EPqOyD2LGSJxaFmhQ==" - }, - "@serialport/parser-readline": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-8.0.6.tgz", - "integrity": "sha512-OYBT2mpczh9QUI3MTw8j0A0tIlPVjpVipvuVnjRkYwxrxPeq04RaLFhaDpuRzua5rTKMt89c1y3btYeoDXMjAA==", - "requires": { - "@serialport/parser-delimiter": "^8.0.6" - } - }, - "@serialport/parser-ready": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-ready/-/parser-ready-8.0.6.tgz", - "integrity": "sha512-xcEqv4rc119WR5JzAuu8UeJOlAwET2PTdNb6aIrrLlmTxhvuBbuRFcsnF3BpH9jUL30Kh7a6QiNXIwVG+WR/1Q==" - }, - "@serialport/parser-regex": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-regex/-/parser-regex-8.0.6.tgz", - "integrity": "sha512-J8KY75Azz5ZyExmyM5YfUxbXOWBkZCytKgCCmZ966ttwZS0bUZOuoCaZj2Zp4VILJAiLuxHoqc0foi67Fri5+g==" - }, - "@serialport/stream": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-8.0.6.tgz", - "integrity": "sha512-ym1PwM0rwLrj90vRBB66I1hwMXbuMw9wGTxqns75U3N/tuNFOH85mxXaYVF2TpI66aM849NoI1jMm50fl9equg==", - "requires": { - "debug": "^4.1.1" - } - }, - "@sheerun/mutationobserver-shim": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz", - "integrity": "sha512-vTCdPp/T/Q3oSqwHmZ5Kpa9oI7iLtGl3RQaA/NyLHikvcrPxACkkKVr/XzkSPJWXHRhKGzVvb0urJsbMlRxi1Q==" - }, - "@sinonjs/commons": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.0.tgz", - "integrity": "sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg==", - "requires": { - "type-detect": "4.0.8" - } - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==", - "dev": true - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==", - "dev": true - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", - "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==", - "dev": true - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", - "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==", - "dev": true - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz", - "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==", - "dev": true - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", - "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==", - "dev": true - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", - "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==", - "dev": true - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", - "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==", - "dev": true - }, - "@svgr/babel-preset": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz", - "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", - "dev": true, - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", - "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3", - "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", - "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", - "@svgr/babel-plugin-transform-svg-component": "^4.2.0" - } - }, - "@svgr/core": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz", - "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", - "dev": true, - "requires": { - "@svgr/plugin-jsx": "^4.3.3", - "camelcase": "^5.3.1", - "cosmiconfig": "^5.2.1" - } - }, - "@svgr/hast-util-to-babel-ast": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", - "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@svgr/plugin-jsx": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz", - "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", - "dev": true, - "requires": { - "@babel/core": "^7.4.5", - "@svgr/babel-preset": "^4.3.3", - "@svgr/hast-util-to-babel-ast": "^4.3.2", - "svg-parser": "^2.0.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@svgr/plugin-svgo": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", - "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", - "dev": true, - "requires": { - "cosmiconfig": "^5.2.1", - "merge-deep": "^3.0.2", - "svgo": "^1.2.2" - } - }, - "@svgr/webpack": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz", - "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==", - "dev": true, - "requires": { - "@babel/core": "^7.4.5", - "@babel/plugin-transform-react-constant-elements": "^7.0.0", - "@babel/preset-env": "^7.4.5", - "@babel/preset-react": "^7.0.0", - "@svgr/core": "^4.3.3", - "@svgr/plugin-jsx": "^4.3.3", - "@svgr/plugin-svgo": "^4.3.1", - "loader-utils": "^1.2.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@testing-library/dom": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-6.11.0.tgz", - "integrity": "sha512-Pkx9LMIGshyNbfmecjt18rrAp/ayMqGH674jYER0SXj0iG9xZc+zWRjk2Pg9JgPBDvwI//xGrI/oOQkAi4YEew==", - "requires": { - "@babel/runtime": "^7.6.2", - "@sheerun/mutationobserver-shim": "^0.3.2", - "@types/testing-library__dom": "^6.0.0", - "aria-query": "3.0.0", - "pretty-format": "^24.9.0", - "wait-for-expect": "^3.0.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "requires": { - "regenerator-runtime": "^0.13.2" - } - } - } - }, - "@testing-library/jest-dom": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.0.2.tgz", - "integrity": "sha512-Pl3si4eH88+5wlVz6NjecLfeO7PjTbbgWKwVZXUtBfrGuJLjGdUUo+O92XRu/59wft8HAmwvXHeMWpqWTg2Uwg==", - "requires": { - "@babel/runtime": "^7.5.1", - "@types/testing-library__jest-dom": "^5.0.0", - "chalk": "^2.4.1", - "css": "^2.2.3", - "css.escape": "^1.5.1", - "jest-diff": "^24.0.0", - "jest-matcher-utils": "^24.0.0", - "lodash": "^4.17.11", - "pretty-format": "^24.0.0", - "redent": "^3.0.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@testing-library/react": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-9.4.0.tgz", - "integrity": "sha512-XdhDWkI4GktUPsz0AYyeQ8M9qS/JFie06kcSnUVcpgOwFjAu9vhwR83qBl+lw9yZWkbECjL8Hd+n5hH6C0oWqg==", - "requires": { - "@babel/runtime": "^7.7.6", - "@testing-library/dom": "^6.11.0", - "@types/testing-library__react": "^9.1.2" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "requires": { - "regenerator-runtime": "^0.13.2" - } - } - } - }, - "@types/babel__core": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", - "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.8.tgz", - "integrity": "sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw==", - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" - }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true - }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", - "dev": true, - "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", - "requires": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, - "@types/invariant": { - "version": "2.2.30", - "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.30.tgz", - "integrity": "sha512-98fB+yo7imSD2F7PF7GIpELNgtLNgo5wjivu0W5V4jx+KVVJxo6p/qN4zdzSTBWy4/sN3pPyXwnhRSD28QX+ag==" - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==" - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-dXvuABY9nM1xgsXlOtLQXJKdacxZJd7AtvLsKZ/0b57ruMXDKCOXAC/M75GbllQX6o1pcZ5hAG4JzYy7Z/wM2w==", - "requires": { - "jest-diff": "^24.3.0" - } - }, - "@types/json-schema": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", - "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/node": { - "version": "10.14.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.7.tgz", - "integrity": "sha512-on4MmIDgHXiuJDELPk1NFaKVUxxCFr37tm8E9yN6rAiF5Pzp/9bBfBHkoexqRiY+hk/Z04EJU9kKEb59YqJ82A==" - }, - "@types/open": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/open/-/open-6.1.0.tgz", - "integrity": "sha512-sdB0OltczakZfdn5DYg3ZbHoQeYtU8Vbo4dys0U98gikn++M4gGDI02dzEWXPMP5uXGSjGx9GnK/yLlJMfGjlg==", - "requires": { - "@types/node": "*" - } - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" - }, - "@types/q": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", - "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", - "dev": true - }, - "@types/react": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.8.6.tgz", - "integrity": "sha512-bN9qDjEMltmHrl0PZRI4IF2AbB7V5UlRfG+OOduckVnRQ4VzXVSzy/1eLAh778IEqhTnW0mmgL9yShfinNverA==", - "requires": { - "@types/prop-types": "*", - "csstype": "^2.2.0" - } - }, - "@types/react-dom": { - "version": "16.8.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.8.4.tgz", - "integrity": "sha512-eIRpEW73DCzPIMaNBDP5pPIpK1KXyZwNgfxiVagb5iGiz6da+9A5hslSX6GAQKdO7SayVCS/Fr2kjqprgAvkfA==", - "requires": { - "@types/react": "*" - } - }, - "@types/react-test-renderer": { - "version": "16.9.2", - "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-16.9.2.tgz", - "integrity": "sha512-4eJr1JFLIAlWhzDkBCkhrOIWOvOxcCAfQh+jiKg7l/nNZcCIL2MHl2dZhogIFKyHzedVWHaVP1Yydq/Ruu4agw==", - "requires": { - "@types/react": "*" - } - }, - "@types/socket.io": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/socket.io/-/socket.io-2.1.2.tgz", - "integrity": "sha512-Ind+4qMNfQ62llyB4IMs1D8znMEBsMKohZBPqfBUIXqLQ9bdtWIbNTBWwtdcBWJKnokMZGcmWOOKslatni5vtA==", - "requires": { - "@types/node": "*" - } - }, - "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" - }, - "@types/testing-library__dom": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/@types/testing-library__dom/-/testing-library__dom-6.11.1.tgz", - "integrity": "sha512-ImChHtQqmjwraRLqBC2sgSQFtczeFvBmBcfhTYZn/3KwXbyD07LQykEQ0xJo7QHc1GbVvf7pRyGaIe6PkCdxEw==", - "requires": { - "pretty-format": "^24.3.0" - } - }, - "@types/testing-library__jest-dom": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.0.0.tgz", - "integrity": "sha512-Pm+2mvqs9sND247oMVJbu3QmPUqMzBuJbY5uHHYQdl9MXq5hwWkTbesw1sPIky52Y0sHksWAZnVvGLbdyFSyrA==", - "requires": { - "@types/jest": "*" - } - }, - "@types/testing-library__react": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@types/testing-library__react/-/testing-library__react-9.1.2.tgz", - "integrity": "sha512-CYaMqrswQ+cJACy268jsLAw355DZtPZGt3Jwmmotlcu8O/tkoXBI6AeZ84oZBJsIsesozPKzWzmv/0TIU+1E9Q==", - "requires": { - "@types/react-dom": "*", - "@types/testing-library__dom": "*" - } - }, - "@types/vscode": { - "version": "1.45.1", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.45.1.tgz", - "integrity": "sha512-0NO9qrrEJBO8FsqHCrFMgR2suKnwCsKBWvRSb2OzH5gs4i3QO5AhEMQYrSzDbU/wLPt7N617/rN9lPY213gmwg==", - "dev": true - }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" - }, - "@typescript-eslint/eslint-plugin": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.20.0.tgz", - "integrity": "sha512-cimIdVDV3MakiGJqMXw51Xci6oEDEoPkvh8ggJe2IIzcc0fYqAxOXN6Vbeanahz6dLZq64W+40iUEc9g32FLDQ==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "2.20.0", - "eslint-utils": "^1.4.3", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.20.0.tgz", - "integrity": "sha512-fEBy9xYrwG9hfBLFEwGW2lKwDRTmYzH3DwTmYbT+SMycmxAoPl0eGretnBFj/s+NfYBG63w/5c3lsvqqz5mYag==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.20.0", - "eslint-scope": "^5.0.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - } - } - }, - "@typescript-eslint/parser": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.20.0.tgz", - "integrity": "sha512-o8qsKaosLh2qhMZiHNtaHKTHyCHc3Triq6aMnwnWj7budm3xAY9owSZzV1uon5T9cWmJRJGzTFa90aex4m77Lw==", - "dev": true, - "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.20.0", - "@typescript-eslint/typescript-estree": "2.20.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.20.0.tgz", - "integrity": "sha512-WlFk8QtI8pPaE7JGQGxU7nGcnk1ccKAJkhbVookv94ZcAef3m6oCE/jEDL6dGte3JcD7reKrA0o55XhBRiVT3A==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^6.3.0", - "tsutils": "^3.17.1" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@uifabric/foundation": { - "version": "7.5.25", - "resolved": "https://registry.npmjs.org/@uifabric/foundation/-/foundation-7.5.25.tgz", - "integrity": "sha512-5PcqVMjXG1or7GrZHCWQ1SRNcCUV6lPm7OoAi1AKtVrSEi69g56VjJCJ7sqc/Q587ehDN6LqK9RhLc2IhQVO+Q==", - "requires": { - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/set-version": "^7.0.9", - "@uifabric/styling": "^7.11.2", - "@uifabric/utilities": "^7.15.5", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/icons": { - "version": "7.3.24", - "resolved": "https://registry.npmjs.org/@uifabric/icons/-/icons-7.3.24.tgz", - "integrity": "sha512-0CkTEgY8xwvNs+zUQcvWKLnuYxudjJfPI016385bqizE9dkCMyAfXer/7sgyrp6FjxNUrHGyQUKvdVoT3zSNYA==", - "requires": { - "@uifabric/set-version": "^7.0.9", - "@uifabric/styling": "^7.11.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/merge-styles": { - "version": "7.8.11", - "resolved": "https://registry.npmjs.org/@uifabric/merge-styles/-/merge-styles-7.8.11.tgz", - "integrity": "sha512-U1gYewj/j6ZGBSXD84Ekp+En4N5hH79TsK9hWJq2wKJKK3h0MKmY50WyFKWIL2/kS+wM7zIR6irK0xY+mfjB2g==", - "requires": { - "@uifabric/set-version": "^7.0.9", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/react-hooks": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@uifabric/react-hooks/-/react-hooks-7.1.2.tgz", - "integrity": "sha512-gFsjCeh+g0rZYSx13WIJcA2HLxNKiY4RQsxLuOq1cMsBgiUGix8ofMPd3S5ys+qfVdl+XwoqlV/25PgvIRrpUA==", - "requires": { - "@uifabric/set-version": "^7.0.9", - "@uifabric/utilities": "^7.15.5", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/set-version": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@uifabric/set-version/-/set-version-7.0.9.tgz", - "integrity": "sha512-YJL6WLBlFKDJcLSw1ihqW5PTFi2XMoluEvwGd2qtzp2IVbHvdbk7uIdWuTALo3dFNNqWPN8shSNUdHVATE/1jQ==", - "requires": { - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/styling": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-7.11.2.tgz", - "integrity": "sha512-0so6oM6d0WOogDiOxT5bbfOrkGEvhrmRukSrgr1mY/3tkQ3gue/XW4yus0fNi7H9R8wZa2rIPQaUcZBW3Hrc0g==", - "requires": { - "@microsoft/load-themed-styles": "^1.10.26", - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/set-version": "^7.0.9", - "@uifabric/utilities": "^7.15.5", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/utilities": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-7.15.5.tgz", - "integrity": "sha512-cjnhT7tTvHNXt0rvuajk5s/RQtSWFh2JfRhbmS7dTGfg3vNieoHg2EiNt+ulzKXxtdkFriXoFHRSNkTuV4/L9w==", - "requires": { - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/set-version": "^7.0.9", - "prop-types": "^15.7.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==" - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" - }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", - "dev": true - }, - "acorn-globals": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", - "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" - } - } - }, - "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", - "dev": true - }, - "acorn-walk": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", - "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==" - }, - "address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", - "dev": true - }, - "adjust-sourcemap-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", - "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", - "dev": true, - "requires": { - "assert": "1.4.1", - "camelcase": "5.0.0", - "loader-utils": "1.2.3", - "object-path": "0.11.4", - "regex-parser": "2.2.10" - }, - "dependencies": { - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - } - }, - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", - "dev": true - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "dev": true, - "requires": { - "buffer-equal": "^1.0.0" - } - }, - "applicationinsights": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-1.0.8.tgz", - "integrity": "sha512-KzOOGdphOS/lXWMFZe5440LUdFbrLpMvh2SaRxn7BmiI550KAoSb2gIhiq6kJZ9Ir3AxRRztjhzif+e5P5IXIg==", - "requires": { - "diagnostic-channel": "0.2.0", - "diagnostic-channel-publishers": "0.2.1", - "zone.js": "0.7.6" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", - "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - } - }, - "arity-n": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", - "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" - }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "dev": true, - "requires": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", - "dev": true, - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", - "dev": true - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", - "dev": true - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", - "dev": true, - "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", - "dev": true - }, - "async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "dev": true, - "requires": { - "async-done": "^1.2.2" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "autoprefixer": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz", - "integrity": "sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==", - "dev": true, - "requires": { - "browserslist": "^4.8.3", - "caniuse-lite": "^1.0.30001020", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.26", - "postcss-value-parser": "^4.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-value-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", - "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" - }, - "axobject-query": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz", - "integrity": "sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ==", - "dev": true - }, - "azure-devops-node-api": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-7.2.0.tgz", - "integrity": "sha512-pMfGJ6gAQ7LRKTHgiRF+8iaUUeGAI0c8puLaqHLc7B8AR7W6GJLozK9RFeUHFjEGybC9/EB3r67WPd7e46zQ8w==", - "dev": true, - "requires": { - "os": "0.1.1", - "tunnel": "0.0.4", - "typed-rest-client": "1.2.0", - "underscore": "1.8.3" - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - } - } - }, - "babel-eslint": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", - "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "babel-extract-comments": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", - "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", - "dev": true, - "requires": { - "babylon": "^6.18.0" - } - }, - "babel-jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.1.0.tgz", - "integrity": "sha512-tz0VxUhhOE2y+g8R2oFrO/2VtVjA1lkJeavlhExuRBg3LdNJY9gwQ+Vcvqt9+cqy71MCTJhewvTB7Qtnnr9SWg==", - "requires": { - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^25.1.0", - "chalk": "^3.0.0", - "slash": "^3.0.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@jest/transform": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.1.0.tgz", - "integrity": "sha512-4ktrQ2TPREVeM+KxB4zskAT84SnmG1vaz4S+51aTefyqn3zocZUnliLLm5Fsl85I3p/kFPN4CRp1RElIfXGegQ==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^25.1.0", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^3.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-util": "^25.1.0", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": true - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "istanbul-lib-instrument": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz", - "integrity": "sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ==", - "requires": { - "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "jest-haste-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.1.0.tgz", - "integrity": "sha512-/2oYINIdnQZAqyWSn1GTku571aAfs8NxzSErGek65Iu5o8JYb+113bZysRMcC/pjE5v9w0Yz+ldbj9NxrFyPyw==", - "requires": { - "@jest/types": "^25.1.0", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.3", - "jest-serializer": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-regex-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.1.0.tgz", - "integrity": "sha512-9lShaDmDpqwg+xAd73zHydKrBbbrIi08Kk9YryBEBybQFg/lBWR/2BDjjiSE7KIppM9C5+c03XiDaZ+m4Pgs1w==" - }, - "jest-serializer": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.1.0.tgz", - "integrity": "sha512-20Wkq5j7o84kssBwvyuJ7Xhn7hdPeTXndnwIblKDR2/sy1SUm6rWWiG9kSCgJPIfkDScJCIsTtOKdlzfIHOfKA==" - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "write-file-atomic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", - "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - } - } - }, - "babel-loader": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", - "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", - "dev": true, - "requires": { - "find-cache-dir": "^2.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1", - "pify": "^4.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", - "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-istanbul": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.3.0", - "test-exclude": "^5.2.3" - } - }, - "babel-plugin-jest-hoist": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.1.0.tgz", - "integrity": "sha512-oIsopO41vW4YFZ9yNYoLQATnnN46lp+MZ6H4VvPKFkcc2/fkl3CfE/NZZSmnEIEsJRmJAgkVEK0R7Zbl50CpTw==", - "requires": { - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "babel-plugin-named-asset-import": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz", - "integrity": "sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA==", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" - } - }, - "babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", - "dev": true - }, - "babel-preset-jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.1.0.tgz", - "integrity": "sha512-eCGn64olaqwUMaugXsTtGAM2I0QTahjEtnRu0ql8Ie+gDWAc1N6wqN0k2NilnyTunM69Pad7gJY7LOtwLimoFQ==", - "requires": { - "@babel/plugin-syntax-bigint": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^25.1.0" - } - }, - "babel-preset-react-app": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.1.1.tgz", - "integrity": "sha512-YkWP2UwY//TLltNlEBRngDOrYhvSLb+CA330G7T9M5UhGEMWe+JK/8IXJc5p2fDTSfSiETf+PY0+PYXFMix81Q==", - "dev": true, - "requires": { - "@babel/core": "7.8.4", - "@babel/plugin-proposal-class-properties": "7.8.3", - "@babel/plugin-proposal-decorators": "7.8.3", - "@babel/plugin-proposal-numeric-separator": "7.8.3", - "@babel/plugin-transform-flow-strip-types": "7.8.3", - "@babel/plugin-transform-react-display-name": "7.8.3", - "@babel/plugin-transform-runtime": "7.8.3", - "@babel/preset-env": "7.8.4", - "@babel/preset-react": "7.8.3", - "@babel/preset-typescript": "7.8.3", - "@babel/runtime": "7.8.4", - "babel-plugin-macros": "2.8.0", - "babel-plugin-transform-react-remove-prop-types": "0.4.24" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", - "dev": true, - "requires": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" - } - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bl": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", - "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" - }, - "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==" - }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" - } - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.8.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.7.tgz", - "integrity": "sha512-gFOnZNYBHrEyUML0xr5NJ6edFaaKbTFX9S9kQHlYfCP0Rit/boRIz4G+Avq6/4haEKJXdGGUnoolx+5MWW2BoA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001027", - "electron-to-chromium": "^1.3.349", - "node-releases": "^1.1.49" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", - "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "cacache": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", - "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", - "dev": true, - "requires": { - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "minipass": "^3.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^7.0.0", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camel-case": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", - "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", - "dev": true, - "requires": { - "pascal-case": "^3.1.1", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001028", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001028.tgz", - "integrity": "sha512-Vnrq+XMSHpT7E+LWoIYhs3Sne8h9lx9YJV3acH3THNCwU/9zV93/ta4xVfzTtnqd3rvnuVpVjE3DFqf56tr3aQ==", - "dev": true - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "requires": { - "rsvp": "^4.8.4" - } - }, - "case-sensitive-paths-webpack-plugin": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", - "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "cheerio": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", - "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", - "dev": true, - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.1", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - }, - "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, - "requires": { - "@types/node": "*" - } - } - } - }, - "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - } - } - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-deep": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", - "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", - "dev": true, - "requires": { - "for-own": "^0.1.3", - "is-plain-object": "^2.0.1", - "kind-of": "^3.0.2", - "lazy-cache": "^1.0.3", - "shallow-clone": "^0.1.2" - } - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "collect-v8-coverage": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.0.tgz", - "integrity": "sha512-VKIhJgvk8E1W28m5avZ2Gv2Ruv5YiF56ug2oclvaG9md69BuZImMG2sk9g7QNKLUbtYAKQjXjYxbYZVUlMMKmQ==" - }, - "collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "dev": true, - "requires": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", - "dev": true, - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "compare-versions": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.5.1.tgz", - "integrity": "sha512-9fGPIB7C6AyM18CJJBHt5EnCZDG3oiTJYy0NjfIAGjKpzv0tkxWko7TNQHF5ymqm7IH03tqmeuBxtvD+Izh6mg==" - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" - }, - "compose-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", - "dev": true, - "requires": { - "arity-n": "^1.0.4" - } - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - }, - "dependencies": { - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", - "dev": true - } - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "confusing-browser-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", - "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", - "dev": true - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", - "dev": true, - "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" - } - }, - "core-js": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", - "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", - "dev": true - }, - "core-js-compat": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", - "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", - "dev": true, - "requires": { - "browserslist": "^4.8.3", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - } - }, - "css-blank-pseudo": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", - "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "dev": true, - "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-has-pseudo": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", - "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^5.0.0-rc.4" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-loader": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", - "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash": "^4.17.11", - "postcss": "^6.0.23", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - } - }, - "css-modules-loader-core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz", - "integrity": "sha1-WQhmgpShvs0mGuCkziGwtVHyHRY=", - "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.1", - "postcss-modules-extract-imports": "1.1.0", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz", - "integrity": "sha1-AA29H47vIXqjaLmiEsX8QLKo8/I=", - "requires": { - "chalk": "^1.1.3", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-modules-extract-imports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", - "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", - "requires": { - "postcss": "^6.0.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "css-prefers-color-scheme": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", - "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - }, - "dependencies": { - "css-what": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", - "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", - "dev": true - } - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "css-selector-tokenizer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", - "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", - "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" - } - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dev": true, - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "dev": true - }, - "css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" - }, - "cssdb": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", - "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==", - "dev": true - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" - }, - "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", - "dev": true, - "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", - "postcss-unique-selectors": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "dev": true - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "dev": true - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", - "dev": true - }, - "csso": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", - "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", - "dev": true, - "requires": { - "css-tree": "1.0.0-alpha.37" - } - }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", - "dev": true, - "requires": { - "cssom": "0.3.x" - } - }, - "csstype": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.8.tgz", - "integrity": "sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA==" - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - }, - "dependencies": { - "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "debug-fabulous": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz", - "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==", - "dev": true, - "requires": { - "debug": "3.X", - "memoizee": "0.4.X", - "object-assign": "4.X" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "requires": { - "mimic-response": "^2.0.0" - } - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", - "dev": true, - "requires": { - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - } - }, - "default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" - }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true - }, - "detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "dev": true, - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "diagnostic-channel": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz", - "integrity": "sha1-zJmvlhLCP7H/8TYSxy8sv6qNWhc=", - "requires": { - "semver": "^5.3.0" - } - }, - "diagnostic-channel-publishers": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.2.1.tgz", - "integrity": "sha1-ji1geottef6IC1SLxYzGvrKIxPM=" - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "diff-sequences": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==" - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "requires": { - "webidl-conversions": "^4.0.2" - } - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz", - "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==", - "dev": true, - "requires": { - "no-case": "^3.0.3", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", - "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "dev": true - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.355", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.355.tgz", - "integrity": "sha512-zKO/wS+2ChI/jz9WAo647xSW8t2RmgRLFdbUb/77cORkUTargO+SCj4ctTHjBn2VeNFrsLgDT7IuDVrd3F8mLQ==", - "dev": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "requires": { - "once": "^1.4.0" - } - }, - "engine.io": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", - "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", - "requires": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "~7.4.2" - }, - "dependencies": { - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" - }, - "ws": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", - "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==" - } - } - }, - "engine.io-client": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.1.tgz", - "integrity": "sha512-oVu9kBkGbcggulyVF0kz6BV3ganqUeqXvD79WOFKa+11oK692w1NyFkuEj4xrkFRpZhn92QOqTk4RQq5LiBXbQ==", - "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "ws": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", - "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==" - } - } - }, - "engine.io-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", - "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.4", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", - "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.50", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz", - "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "^1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escodegen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", - "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", - "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" - } - } - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "eslint-config-react-app": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.0.tgz", - "integrity": "sha512-WrHjoGpKr1kLLiWDD81tme9jMM0hk5cMxasLSdyno6DdPt+IfLOrDJBVo6jN7tn4y1nzhs43TmUaZWO6Sf0blw==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.9" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", - "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-loader": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.3.tgz", - "integrity": "sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw==", - "dev": true, - "requires": { - "fs-extra": "^8.1.0", - "loader-fs-cache": "^1.0.2", - "loader-utils": "^1.2.3", - "object-hash": "^2.0.1", - "schema-utils": "^2.6.1" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz", - "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - } - } - }, - "eslint-plugin-flowtype": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz", - "integrity": "sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "eslint-plugin-import": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.0.tgz", - "integrity": "sha512-NK42oA0mUc8Ngn4kONOPsPB1XhbUvNHqF+g307dPV28aknPoiNnKLFd9em4nkswwepdF5ouieqv5Th/63U7YJQ==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.1", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.0", - "read-pkg-up": "^2.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", - "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.4.5", - "aria-query": "^3.0.0", - "array-includes": "^3.0.3", - "ast-types-flow": "^0.0.7", - "axobject-query": "^2.0.2", - "damerau-levenshtein": "^1.0.4", - "emoji-regex": "^7.0.2", - "has": "^1.0.3", - "jsx-ast-utils": "^2.2.1" - } - }, - "eslint-plugin-react": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.18.0.tgz", - "integrity": "sha512-p+PGoGeV4SaZRDsXqdj9OWcOrOpZn8gXoGPcIQTzo2IDMbAKhNDnME9myZWqO3Ic4R3YmwAZ1lDjWl2R2hMUVQ==", - "dev": true, - "requires": { - "array-includes": "^3.1.1", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.2.3", - "object.entries": "^1.1.1", - "object.fromentries": "^2.0.2", - "object.values": "^1.1.1", - "prop-types": "^15.7.2", - "resolve": "^1.14.2" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "object.entries": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", - "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-plugin-react-hooks": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", - "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==", - "dev": true - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - }, - "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", - "dev": true, - "requires": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", - "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "event-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", - "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "from": "^0.1.7", - "map-stream": "0.0.7", - "pause-stream": "^0.0.11", - "split": "^1.0.1", - "stream-combiner": "^0.2.2", - "through": "^2.3.8" - } - }, - "eventemitter2": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", - "integrity": "sha1-YZegldX7a1folC9v1+qtY6CclFI=" - }, - "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", - "dev": true - }, - "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", - "dev": true - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "exec-sh": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", - "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==" - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "expect": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.1.0.tgz", - "integrity": "sha512-wqHzuoapQkhc3OKPlrpetsfueuEiMf3iWh0R8+duCu9PIjXoP7HgD5aeypwTnXUAjC8aMsiVDaWwlbJ1RlQ38g==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-styles": "^4.0.0", - "jest-get-type": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-regex-util": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "diff-sequences": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", - "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-diff": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", - "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-matcher-utils": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", - "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", - "requires": { - "chalk": "^3.0.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fb-watchman": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", - "requires": { - "bser": "^2.0.0" - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "file-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", - "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.5.0" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "filesize": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz", - "integrity": "sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg==", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, - "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "dev": true, - "requires": { - "is-buffer": "~2.0.3" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", - "dev": true - }, - "flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", - "dev": true - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", - "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", - "dev": true, - "requires": { - "debug": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "fork-ts-checker-webpack-plugin": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz", - "integrity": "sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ==", - "dev": true, - "requires": { - "babel-code-frame": "^6.22.0", - "chalk": "^2.4.1", - "chokidar": "^3.3.0", - "micromatch": "^3.1.10", - "minimatch": "^3.0.4", - "semver": "^5.6.0", - "tapable": "^1.0.0", - "worker-rpc": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", - "dev": true, - "requires": { - "picomatch": "^2.0.7" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - } - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": false, - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": false, - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": false, - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "debug": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": false, - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": false, - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "resolved": false, - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": false, - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": false, - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": false, - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": false, - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": false, - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": false, - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.3.5", - "resolved": false, - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "resolved": false, - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": false, - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.0", - "resolved": false, - "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", - "dev": true, - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "resolved": false, - "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": false, - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "resolved": false, - "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": false, - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": false, - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": false, - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": false, - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": false, - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": false, - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": false, - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": false, - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": false, - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.0", - "resolved": false, - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": false, - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "resolved": false, - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": false, - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.0.3", - "resolved": false, - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true, - "optional": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "generic-names": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-1.0.3.tgz", - "integrity": "sha1-LXhqEhruUIh2eWk56OO/+DbCCRc=", - "requires": { - "loader-utils": "^0.2.16" - }, - "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - } - } - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "git-rev-sync": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/git-rev-sync/-/git-rev-sync-1.12.0.tgz", - "integrity": "sha1-RGhAbH5sO6TPRYeZnhrbKNnRr1U=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "graceful-fs": "4.1.11", - "shelljs": "0.7.7" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - } - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "glob-watcher": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", - "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "object.defaults": "^1.1.0" - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - }, - "dependencies": { - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - } - } - }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" - }, - "gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", - "dev": true, - "requires": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" - } - }, - "gulp-cli": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", - "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.1.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.0.1", - "yargs": "^7.1.0" - }, - "dependencies": { - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", - "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "object.assign": "^4.1.0" - } - } - } - }, - "gulp-filter": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz", - "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=", - "dev": true, - "requires": { - "multimatch": "^2.0.0", - "plugin-error": "^0.1.2", - "streamfilter": "^1.0.5" - } - }, - "gulp-sourcemaps": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz", - "integrity": "sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg==", - "dev": true, - "requires": { - "@gulp-sourcemaps/identity-map": "1.X", - "@gulp-sourcemaps/map-sources": "1.X", - "acorn": "5.X", - "convert-source-map": "1.X", - "css": "2.X", - "debug-fabulous": "1.X", - "detect-newline": "2.X", - "graceful-fs": "4.X", - "source-map": "~0.6.0", - "strip-bom-string": "1.X", - "through2": "2.X" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - } - } - }, - "gulp-typescript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-5.0.1.tgz", - "integrity": "sha512-YuMMlylyJtUSHG1/wuSVTrZp60k1dMEFKYOvDf7OvbAJWrDtxxD4oZon4ancdWwzjj30ztiidhe4VXJniF0pIQ==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.5", - "plugin-error": "^1.0.1", - "source-map": "^0.7.3", - "through2": "^3.0.0", - "vinyl": "^2.1.0", - "vinyl-fs": "^3.0.3" - }, - "dependencies": { - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - }, - "dependencies": { - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - } - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", - "dev": true, - "requires": { - "readable-stream": "2 || 3" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - } - }, - "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "handle-thing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "harmony-reflect": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", - "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", - "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", - "requires": { - "react-is": "^16.7.0" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "requires": { - "whatwg-encoding": "^1.0.1" - } - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true - }, - "html-escaper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", - "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==" - }, - "html-minifier-terser": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.0.4.tgz", - "integrity": "sha512-fHwmKQ+GzhlqdxEtwrqLT7MSuheiA+rif5/dZgbz3GjoMXJzcRzy1L9NXoiiyxrnap+q5guSiv8Tz5lrh9g42g==", - "dev": true, - "requires": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", - "he": "^1.2.0", - "param-case": "^3.0.3", - "relateurl": "^0.2.7", - "terser": "^4.6.3" - }, - "dependencies": { - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - } - } - }, - "html-webpack-plugin": { - "version": "4.0.0-beta.11", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz", - "integrity": "sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg==", - "dev": true, - "requires": { - "html-minifier-terser": "^5.0.1", - "loader-utils": "^1.2.3", - "lodash": "^4.17.15", - "pretty-error": "^2.1.1", - "tapable": "^1.1.3", - "util.promisify": "1.0.0" - } - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "dev": true, - "requires": { - "agent-base": "4", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "dev": true, - "requires": { - "postcss": "^6.0.1" - } - }, - "identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", - "dev": true, - "requires": { - "harmony-reflect": "^1.4.6" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true - }, - "immer": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", - "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==", - "dev": true - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "requires": { - "resolve-from": "^3.0.0" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "inquirer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", - "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "intl-format-cache": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/intl-format-cache/-/intl-format-cache-4.1.13.tgz", - "integrity": "sha512-d/1NI8ctPZsPJU3G6k0pIuydnebeck7hG+wIHJOJUJm3eZ2+3bcZCD34o/Mc18M5ZiEZei02xsMtp8g1IQc23A==" - }, - "intl-locales-supported": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/intl-locales-supported/-/intl-locales-supported-1.4.5.tgz", - "integrity": "sha512-D7oriM5x46rd7kNlSW0f9noIBegFr3ReIM6xlMpwH4lfIPD/zvBelPlCjR10IK16boGJG9lKccOvRAM8wzpbrA==" - }, - "intl-messageformat": { - "version": "6.1.9", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-6.1.9.tgz", - "integrity": "sha512-vnPujdP+gpWK/+GxWUo3nWRfrUj67/NAZoBNAyCvZ0fnfWh5jvIkKNr5ZZYewdZ7J3cEFLU6hYYgWztiCEFZGg==", - "requires": { - "intl-format-cache": "^4.1.13", - "intl-messageformat-parser": "^3.0.7" - } - }, - "intl-messageformat-parser": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-3.0.7.tgz", - "integrity": "sha512-L16VbbV3NFaiZV65XwOIH9fBe52TS2EkOR0k8Y4ratsgTE7KPEbcUCUrz/iEQwJo7BcWY4ohkZbeYZRgAiPR1Q==" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" - }, - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", - "dev": true - }, - "is": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", - "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", - "dev": true - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" - }, - "is-docker": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", - "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" - }, - "is-generator-function": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", - "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.1.0.tgz", - "integrity": "sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "requires": { - "has": "^1.0.1" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "dev": true - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "dev": true, - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - } - } - }, - "istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A==", - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-25.1.0.tgz", - "integrity": "sha512-FV6jEruneBhokkt9MQk0WUFoNTwnF76CLXtwNMfsc0um0TlB/LG2yxUd0KqaFjEJ9laQmVWQWS0sG/t2GsuI0w==", - "requires": { - "@jest/core": "^25.1.0", - "import-local": "^3.0.2", - "jest-cli": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "jest-cli": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.1.0.tgz", - "integrity": "sha512-p+aOfczzzKdo3AsLJlhs8J5EW6ffVidfSZZxXedJ0mHPBOln1DccqFmGCoO8JWd4xRycfmwy1eoQkMsF8oekPg==", - "requires": { - "@jest/core": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^15.0.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.1.0.tgz", - "integrity": "sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg==", - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^16.1.0" - } - } - } - }, - "jest-changed-files": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.1.0.tgz", - "integrity": "sha512-bdL1aHjIVy3HaBO3eEQeemGttsq1BDlHgWcOjEOIAcga7OOEGWHD2WSu8HhL7I1F0mFFyci8VKU4tRNk+qtwDA==", - "requires": { - "@jest/types": "^25.1.0", - "execa": "^3.2.0", - "throat": "^5.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "jest-config": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.1.0.tgz", - "integrity": "sha512-tLmsg4SZ5H7tuhBC5bOja0HEblM0coS3Wy5LTCb2C8ZV6eWLewHyK+3qSq9Bi29zmWQ7ojdCd3pxpx4l4d2uGw==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^25.1.0", - "@jest/types": "^25.1.0", - "babel-jest": "^25.1.0", - "chalk": "^3.0.0", - "glob": "^7.1.1", - "jest-environment-jsdom": "^25.1.0", - "jest-environment-node": "^25.1.0", - "jest-get-type": "^25.1.0", - "jest-jasmine2": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "micromatch": "^4.0.2", - "pretty-format": "^25.1.0", - "realpath-native": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", - "requires": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-docblock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.1.0.tgz", - "integrity": "sha512-370P/mh1wzoef6hUKiaMcsPtIapY25suP6JqM70V9RJvdKLrV4GaGbfUseUVk4FZJw4oTZ1qSCJNdrClKt5JQA==", - "requires": { - "detect-newline": "^3.0.0" - }, - "dependencies": { - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" - } - } - }, - "jest-each": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.1.0.tgz", - "integrity": "sha512-R9EL8xWzoPySJ5wa0DXFTj7NrzKpRD40Jy+zQDp3Qr/2QmevJgkN9GqioCGtAJ2bW9P/MQRznQHQQhoeAyra7A==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "jest-get-type": "^25.1.0", - "jest-util": "^25.1.0", - "pretty-format": "^25.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-environment-jsdom": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.1.0.tgz", - "integrity": "sha512-ILb4wdrwPAOHX6W82GGDUiaXSSOE274ciuov0lztOIymTChKFtC02ddyicRRCdZlB5YSrv3vzr1Z5xjpEe1OHQ==", - "requires": { - "@jest/environment": "^25.1.0", - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "jsdom": "^15.1.1" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/fake-timers": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.1.0.tgz", - "integrity": "sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ==", - "requires": { - "@jest/types": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "lolex": "^5.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", - "requires": { - "@jest/types": "^25.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-environment-jsdom-fourteen": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-1.0.1.tgz", - "integrity": "sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q==", - "dev": true, - "requires": { - "@jest/environment": "^24.3.0", - "@jest/fake-timers": "^24.3.0", - "@jest/types": "^24.3.0", - "jest-mock": "^24.0.0", - "jest-util": "^24.0.0", - "jsdom": "^14.1.0" - }, - "dependencies": { - "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", - "dev": true, - "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" - } - }, - "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - } - }, - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, - "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", - "dev": true - }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jsdom": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz", - "integrity": "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^6.0.4", - "acorn-globals": "^4.3.0", - "array-equal": "^1.0.0", - "cssom": "^0.3.4", - "cssstyle": "^1.1.1", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.0", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.1.3", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.5.0", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^6.1.2", - "xml-name-validator": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "jest-environment-node": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.1.0.tgz", - "integrity": "sha512-U9kFWTtAPvhgYY5upnH9rq8qZkj6mYLup5l1caAjjx9uNnkLHN2xgZy5mo4SyLdmrh/EtB9UPpKFShvfQHD0Iw==", - "requires": { - "@jest/environment": "^25.1.0", - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/fake-timers": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.1.0.tgz", - "integrity": "sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ==", - "requires": { - "@jest/types": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "lolex": "^5.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", - "requires": { - "@jest/types": "^25.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" - }, - "jest-haste-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.1.0.tgz", - "integrity": "sha512-/2oYINIdnQZAqyWSn1GTku571aAfs8NxzSErGek65Iu5o8JYb+113bZysRMcC/pjE5v9w0Yz+ldbj9NxrFyPyw==", - "requires": { - "@jest/types": "^25.1.0", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.3", - "jest-serializer": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": true - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-jasmine2": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.1.0.tgz", - "integrity": "sha512-GdncRq7jJ7sNIQ+dnXvpKO2MyP6j3naNK41DTTjEAhLEdpImaDA9zSAZwDhijjSF/D7cf4O5fdyUApGBZleaEg==", - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^25.1.0", - "@jest/source-map": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "co": "^4.6.0", - "expect": "^25.1.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "pretty-format": "^25.1.0", - "throat": "^5.0.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "diff-sequences": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", - "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-diff": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", - "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-matcher-utils": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", - "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", - "requires": { - "chalk": "^3.0.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-leak-detector": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.1.0.tgz", - "integrity": "sha512-3xRI264dnhGaMHRvkFyEKpDeaRzcEBhyNrOG5oT8xPxOyUAblIAQnpiR3QXu4wDor47MDTiHbiFcbypdLcLW5w==", - "requires": { - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - } - } - }, - "jest-matcher-utils": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", - "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", - "requires": { - "chalk": "^2.0.1", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", - "stack-utils": "^1.0.1" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-mock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - } - } - }, - "jest-pnp-resolver": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", - "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==" - }, - "jest-regex-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.1.0.tgz", - "integrity": "sha512-9lShaDmDpqwg+xAd73zHydKrBbbrIi08Kk9YryBEBybQFg/lBWR/2BDjjiSE7KIppM9C5+c03XiDaZ+m4Pgs1w==" - }, - "jest-resolve": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", - "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.1.0.tgz", - "integrity": "sha512-Cu/Je38GSsccNy4I2vL12ZnBlD170x2Oh1devzuM9TLH5rrnLW1x51lN8kpZLYTvzx9j+77Y5pqBaTqfdzVzrw==", - "requires": { - "@jest/types": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-snapshot": "^25.1.0" - } - }, - "jest-runner": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.1.0.tgz", - "integrity": "sha512-su3O5fy0ehwgt+e8Wy7A8CaxxAOCMzL4gUBftSs0Ip32S0epxyZPDov9Znvkl1nhVOJNf4UwAsnqfc3plfQH9w==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-config": "^25.1.0", - "jest-docblock": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-jasmine2": "^25.1.0", - "jest-leak-detector": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-runtime": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.1.0.tgz", - "integrity": "sha512-mpPYYEdbExKBIBB16ryF6FLZTc1Rbk9Nx0ryIpIMiDDkOeGa0jQOKVI/QeGvVGlunKKm62ywcioeFVzIbK03bA==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/source-map": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.3", - "jest-config": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "realpath-native": "^1.1.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.0.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@types/yargs": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.1.tgz", - "integrity": "sha512-sYlwNU7zYi6eZbMzFvG6eHD7VsEvFdoDtlD7eI1JTg7YNnuguzmiGsc6MPSq5l8n+h21AsNof0je+9sgOe4+dg==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", - "requires": { - "@jest/types": "^25.1.0" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.1.0.tgz", - "integrity": "sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg==", - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^16.1.0" - } - } - } - }, - "jest-serializer": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.1.0.tgz", - "integrity": "sha512-20Wkq5j7o84kssBwvyuJ7Xhn7hdPeTXndnwIblKDR2/sy1SUm6rWWiG9kSCgJPIfkDScJCIsTtOKdlzfIHOfKA==" - }, - "jest-snapshot": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.1.0.tgz", - "integrity": "sha512-xZ73dFYN8b/+X2hKLXz4VpBZGIAn7muD/DAg+pXtDzDGw3iIV10jM7WiHqhCcpDZfGiKEj7/2HXAEPtHTj0P2A==", - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "expect": "^25.1.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^25.1.0", - "semver": "^7.1.1" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "diff-sequences": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", - "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-diff": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", - "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-matcher-utils": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", - "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", - "requires": { - "chalk": "^3.0.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "semver": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.1.tgz", - "integrity": "sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-transform-css": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jest-transform-css/-/jest-transform-css-2.0.0.tgz", - "integrity": "sha512-KV5pD27qUltAVj0mZEVvqd+Ahe+WNPOVWKA1BRpIhBJ5OeUUOM46ivAznJrC5B1JrVNbMzWjPxnKl6QTsAAT3Q==", - "requires": { - "common-tags": "1.8.0", - "cosmiconfig": "5.0.6", - "cross-spawn": "6.0.5", - "postcss-load-config": "2.0.0", - "postcss-modules": "1.3.2", - "style-inject": "0.3.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.6.tgz", - "integrity": "sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ==", - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0" - } - } - } - }, - "jest-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", - "dev": true, - "requires": { - "@jest/console": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/source-map": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-validate": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.1.0.tgz", - "integrity": "sha512-kGbZq1f02/zVO2+t1KQGSVoCTERc5XeObLwITqC6BTRH3Adv7NZdYqCpKIZLUgpLXf2yISzQ465qOZpul8abXA==", - "requires": { - "@jest/types": "^25.1.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "jest-get-type": "^25.1.0", - "leven": "^3.1.0", - "pretty-format": "^25.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-watch-typeahead": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz", - "integrity": "sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.1", - "jest-regex-util": "^24.9.0", - "jest-watcher": "^24.3.0", - "slash": "^3.0.0", - "string-length": "^3.1.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", - "dev": true, - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-watcher": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", - "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", - "dev": true, - "requires": { - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "jest-util": "^24.9.0", - "string-length": "^2.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsdom": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", - "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", - "requires": { - "abab": "^2.0.0", - "acorn": "^7.1.0", - "acorn-globals": "^4.3.2", - "array-equal": "^1.0.0", - "cssom": "^0.4.1", - "cssstyle": "^2.0.0", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.1", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.2.0", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^7.0.0", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" - }, - "cssstyle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", - "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - } - } - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" - }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jsx-ast-utils": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", - "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "object.assign": "^4.1.0" - } - }, - "just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", - "dev": true - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - } - } - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" - }, - "last-call-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", - "dev": true, - "requires": { - "lodash": "^4.17.5", - "webpack-sources": "^1.1.0" - } - }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "dev": true, - "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "dev": true, - "requires": { - "flush-write-stream": "^1.0.2" - } - }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", - "dev": true - }, - "less": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", - "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", - "dev": true, - "requires": { - "clone": "^2.1.2", - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "mime": "^1.4.1", - "mkdirp": "^0.5.0", - "promise": "^7.1.1", - "request": "^2.83.0", - "source-map": "~0.6.0" - } - }, - "less-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", - "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "loader-utils": "^1.1.0", - "pify": "^3.0.0" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "dev": true, - "requires": { - "leven": "^3.1.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - }, - "dependencies": { - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - } - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "linkify-it": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.1.0.tgz", - "integrity": "sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg==", - "dev": true, - "requires": { - "uc.micro": "^1.0.1" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "loader-fs-cache": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz", - "integrity": "sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw==", - "dev": true, - "requires": { - "find-cache-dir": "^0.1.1", - "mkdirp": "0.5.1" - }, - "dependencies": { - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "^1.0.0" - } - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" - }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "loglevel": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", - "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==", - "dev": true - }, - "lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", - "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", - "dev": true, - "requires": { - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "dev": true, - "requires": { - "es5-ext": "~0.10.2" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==" - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "requires": { - "tmpl": "1.0.x" - } - }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", - "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "entities": "~1.1.1", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - } - }, - "matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "dev": true, - "requires": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - } - } - }, - "memoizee": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", - "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.45", - "es6-weak-map": "^2.0.2", - "event-emitter": "^0.3.5", - "is-promise": "^2.1", - "lru-queue": "0.1", - "next-tick": "1", - "timers-ext": "^0.1.5" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true - }, - "merge-deep": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", - "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "clone-deep": "^0.2.4", - "kind-of": "^3.0.2" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", - "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "microevent.ts": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", - "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "requires": { - "mime-db": "1.40.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" - }, - "min-indent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz", - "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=" - }, - "mini-css-extract-plugin": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", - "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "minipass": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", - "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", - "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mixin-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", - "dev": true, - "requires": { - "for-in": "^0.1.3", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-in": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", - "dev": true - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, - "mocha": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.1.4.tgz", - "integrity": "sha512-PN8CIy4RXsIoxoFJzS4QNnCH4psUCPWc4/rPrst/ecSJJbLBkubMiyGCP2Kj/9YnWbotFqAoeXyXMucj7gwCFg==", - "dev": true, - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.2.2", - "yargs-parser": "13.0.0", - "yargs-unparser": "1.5.0" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" - } - }, - "yargs-parser": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", - "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" - } - }, - "mute-stdout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "no-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", - "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", - "dev": true, - "requires": { - "lower-case": "^2.0.1", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "node-abi": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.15.0.tgz", - "integrity": "sha512-FeLpTS0F39U7hHZU1srAK4Vx+5AHNVOTP+hxBNQknR/54laTHSFIJkDWDqiquY1LeLUgTfPN7sLPhMubx0PLAg==", - "requires": { - "semver": "^5.4.1" - } - }, - "node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" - }, - "node-libs-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", - "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - } - } - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" - }, - "node-notifier": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", - "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.1.1", - "semver": "^6.3.0", - "shellwords": "^0.1.1", - "which": "^1.3.1" - }, - "dependencies": { - "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", - "optional": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "optional": true - } - } - }, - "node-releases": { - "version": "1.1.49", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.49.tgz", - "integrity": "sha512-xH8t0LS0disN0mtRCh+eByxFPie+msJUBL/lJDBuap53QGiYPa9joh83K4pCZgWJ+2L4b9h88vCVdXQ60NO2bg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "noop-logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, - "now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "dev": true, - "requires": { - "once": "^1.3.2" - } - }, - "npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "object-hash": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", - "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==", - "dev": true - }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true - }, - "object-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", - "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object-path": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", - "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "object.entries": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", - "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "object.fromentries": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", - "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } - }, - "object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "office-ui-fabric-react": { - "version": "7.105.12", - "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-7.105.12.tgz", - "integrity": "sha512-PUmhth8szgLzR6xoN4HkPA0aIahpYr6/sU5oPob5zPRXB2JrhOCnCL9lFsL7/xU0lCFf/OAdoH+ARvF8DcAa0w==", - "requires": { - "@fluentui/react-focus": "^7.1.13", - "@microsoft/load-themed-styles": "^1.10.26", - "@uifabric/foundation": "^7.5.25", - "@uifabric/icons": "^7.3.24", - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/react-hooks": "^7.1.2", - "@uifabric/set-version": "^7.0.9", - "@uifabric/styling": "^7.11.2", - "@uifabric/utilities": "^7.15.5", - "prop-types": "^15.7.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "on-error-resume-next": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-error-resume-next/-/on-error-resume-next-1.1.0.tgz", - "integrity": "sha512-XhWMbmKV0+W95yLJjT1Z9zdkKiPUjDn63YYsji1pdvKqaa7pq4coeHaHEXPsa36SFlffOyOlPK/0rn6Njfb+LA==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "requires": { - "is-wsl": "^1.1.0" - } - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "optimize-css-assets-webpack-plugin": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", - "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", - "dev": true, - "requires": { - "cssnano": "^4.1.10", - "last-call-webpack-plugin": "^3.0.0" - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz", - "integrity": "sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M=" - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-each-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", - "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", - "dev": true - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", - "dev": true - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "param-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz", - "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==", - "dev": true, - "requires": { - "dot-case": "^3.0.3", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - } - } - }, - "parse-asn1": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", - "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parse-semver": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", - "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=", - "dev": true, - "requires": { - "semver": "^5.1.0" - } - }, - "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" - }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascal-case": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", - "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", - "dev": true, - "requires": { - "no-case": "^3.0.3", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "~2.3" - } - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "picomatch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", - "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==" - }, - "pidtree": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", - "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - } - } - }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" - }, - "pnp-webpack-plugin": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.0.tgz", - "integrity": "sha512-ZcMGn/xF/fCOq+9kWMP9vVVxjIkMCja72oy3lziR7UHy0hHFZ57iVpQ71OtveVbmzeCmphBg8pxNdk/hlK99aQ==", - "dev": true, - "requires": { - "ts-pnp": "^1.1.2" - } - }, - "portfinder": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", - "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.1" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-attribute-case-insensitive": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", - "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^6.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-browser-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", - "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", - "dev": true, - "requires": { - "postcss": "^7" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-calc": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", - "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", - "dev": true, - "requires": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", - "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-functional-notation": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", - "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-gray": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", - "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-hex-alpha": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", - "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", - "dev": true, - "requires": { - "postcss": "^7.0.14", - "postcss-values-parser": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-mod-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", - "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-rebeccapurple": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", - "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-custom-media": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", - "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-custom-properties": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", - "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", - "dev": true, - "requires": { - "postcss": "^7.0.17", - "postcss-values-parser": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-custom-selectors": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", - "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-dir-pseudo-class": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", - "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-double-position-gradients": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", - "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", - "dev": true, - "requires": { - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-env-function": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", - "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-flexbugs-fixes": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz", - "integrity": "sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-focus-visible": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", - "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-focus-within": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", - "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-font-variant": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz", - "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-gap-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", - "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-image-set-function": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", - "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-initial": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", - "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", - "dev": true, - "requires": { - "lodash.template": "^4.5.0", - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-lab-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", - "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", - "requires": { - "cosmiconfig": "^4.0.0", - "import-cwd": "^2.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" - } - } - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-logical": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", - "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-media-minmax": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", - "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", - "dev": true, - "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-1.3.2.tgz", - "integrity": "sha512-QujH5ZpPtr1fBWTKDa43Hx45gm7p19aEtHaAtkMCBZZiB/D5za2wXSMtAf94tDUZHF3F5KZcTXISUNqgEQRiDw==", - "requires": { - "css-modules-loader-core": "^1.1.0", - "generic-names": "^1.0.3", - "lodash.camelcase": "^4.3.0", - "postcss": "^7.0.1", - "string-hash": "^1.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.26.tgz", - "integrity": "sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", - "dev": true, - "requires": { - "postcss": "^6.0.1" - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - } - }, - "postcss-nesting": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", - "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", - "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", - "dev": true, - "requires": { - "@csstools/normalize.css": "^10.1.0", - "browserslist": "^4.6.2", - "postcss": "^7.0.17", - "postcss-browser-comments": "^3.0.0", - "sanitize.css": "^10.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", - "dev": true, - "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", - "dev": true, - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-overflow-shorthand": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", - "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-page-break": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", - "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-place": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", - "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-preset-env": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", - "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", - "dev": true, - "requires": { - "autoprefixer": "^9.6.1", - "browserslist": "^4.6.4", - "caniuse-lite": "^1.0.30000981", - "css-blank-pseudo": "^0.1.4", - "css-has-pseudo": "^0.10.0", - "css-prefers-color-scheme": "^3.1.1", - "cssdb": "^4.4.0", - "postcss": "^7.0.17", - "postcss-attribute-case-insensitive": "^4.0.1", - "postcss-color-functional-notation": "^2.0.1", - "postcss-color-gray": "^5.0.0", - "postcss-color-hex-alpha": "^5.0.3", - "postcss-color-mod-function": "^3.0.3", - "postcss-color-rebeccapurple": "^4.0.1", - "postcss-custom-media": "^7.0.8", - "postcss-custom-properties": "^8.0.11", - "postcss-custom-selectors": "^5.1.2", - "postcss-dir-pseudo-class": "^5.0.0", - "postcss-double-position-gradients": "^1.0.0", - "postcss-env-function": "^2.0.2", - "postcss-focus-visible": "^4.0.0", - "postcss-focus-within": "^3.0.0", - "postcss-font-variant": "^4.0.0", - "postcss-gap-properties": "^2.0.0", - "postcss-image-set-function": "^3.0.1", - "postcss-initial": "^3.0.0", - "postcss-lab-function": "^2.0.1", - "postcss-logical": "^3.0.0", - "postcss-media-minmax": "^4.0.0", - "postcss-nesting": "^7.0.0", - "postcss-overflow-shorthand": "^2.0.0", - "postcss-page-break": "^2.0.0", - "postcss-place": "^4.0.1", - "postcss-pseudo-class-any-link": "^6.0.0", - "postcss-replace-overflow-wrap": "^3.0.0", - "postcss-selector-matches": "^4.0.0", - "postcss-selector-not": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-pseudo-class-any-link": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", - "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-replace-overflow-wrap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", - "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-safe-parser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz", - "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-selector-matches": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", - "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-selector-not": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz", - "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "dependencies": { - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - } - } - }, - "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", - "dev": true, - "requires": { - "is-svg": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "prebuild-install": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.3.tgz", - "integrity": "sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==", - "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.7.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true - }, - "pretty-bytes": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", - "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==", - "dev": true - }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "dev": true, - "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" - } - }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", - "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/yargs": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.6.tgz", - "integrity": "sha512-IkltIncDQWv6fcAvnHtJ6KtkmY/vtR3bViOaCzpj/A3yNhlfZAgxNe6AEQD1cQrkYD+YsKVo08DSxvNKEsD7BA==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - } - } - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "optional": true, - "requires": { - "asap": "~2.0.3" - } - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "prompts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz", - "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==", - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.3" - } - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "psl": { - "version": "1.1.32", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.32.tgz", - "integrity": "sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==" - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", - "dev": true - }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dev": true, - "requires": { - "performance-now": "^2.1.0" - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "react": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", - "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - } - }, - "react-app-polyfill": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz", - "integrity": "sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g==", - "dev": true, - "requires": { - "core-js": "^3.5.0", - "object-assign": "^4.1.1", - "promise": "^8.0.3", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.3", - "whatwg-fetch": "^3.0.0" - }, - "dependencies": { - "promise": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.3.tgz", - "integrity": "sha512-HeRDUL1RJiLhyA0/grn+PTShlBAcLuh/1BJGtrvjwbvRDCTLLMEz9rOGCV+R3vHY4MixIuoMEd9Yq/XvsTPcjw==", - "dev": true, - "requires": { - "asap": "~2.0.6" - } - }, - "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", - "dev": true - } - } - }, - "react-dev-utils": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.2.0.tgz", - "integrity": "sha512-MwrvQW2TFjLblhqpDNeqCXHBkz3G5vc7k4wntgutAJZX4ia3o07eGKo6uYGhUOeJ0hfOxcpJFNFk7+4XCc1S8g==", - "dev": true, - "requires": { - "@babel/code-frame": "7.8.3", - "address": "1.1.2", - "browserslist": "4.8.6", - "chalk": "2.4.2", - "cross-spawn": "7.0.1", - "detect-port-alt": "1.1.6", - "escape-string-regexp": "2.0.0", - "filesize": "6.0.1", - "find-up": "4.1.0", - "fork-ts-checker-webpack-plugin": "3.1.1", - "global-modules": "2.0.0", - "globby": "8.0.2", - "gzip-size": "5.1.1", - "immer": "1.10.0", - "inquirer": "7.0.4", - "is-root": "2.1.0", - "loader-utils": "1.2.3", - "open": "^7.0.2", - "pkg-up": "3.1.0", - "react-error-overlay": "^6.0.6", - "recursive-readdir": "2.2.2", - "shell-quote": "1.7.2", - "strip-ansi": "6.0.0", - "text-table": "0.2.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "browserslist": { - "version": "4.8.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.6.tgz", - "integrity": "sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001023", - "electron-to-chromium": "^1.3.341", - "node-releases": "^1.1.47" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } - } - }, - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "open": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.2.tgz", - "integrity": "sha512-70E/pFTPr7nZ9nLDPNTcj3IVqnNvKuP4VsBmoKV9YGTnChe0mlS3C4qM7qKarhZ8rGaHKLfo+vBTHXDp6ZSyLQ==", - "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "react-dom": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", - "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.18.0" - } - }, - "react-error-overlay": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.6.tgz", - "integrity": "sha512-Yzpno3enVzSrSCnnljmr4b/2KUQSMZaPuqmS26t9k4nW7uwJk6STWmH9heNjPuvqUTO3jOSPkHoKgO4+Dw7uIw==", - "dev": true - }, - "react-intl": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-3.1.9.tgz", - "integrity": "sha512-mQxhcFsYsj7O+k2Gsf1p+QaGhEdr+g7v5hYaa88dqar1m1xdWldEJjZ4JK/waHTp4zhVPoco4NQ1JdPkhs8HkA==", - "requires": { - "@formatjs/intl-relativetimeformat": "^2.6.3", - "@types/hoist-non-react-statics": "^3.3.1", - "@types/invariant": "^2.2.30", - "hoist-non-react-statics": "^3.3.0", - "intl-format-cache": "^4.1.10", - "intl-locales-supported": "^1.4.5", - "intl-messageformat": "^6.1.6", - "intl-messageformat-parser": "^3.0.7", - "invariant": "^2.1.1", - "shallow-equal": "^1.1.0" - } - }, - "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==" - }, - "react-scripts": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.0.tgz", - "integrity": "sha512-pBqaAroFoHnFAkuX+uSK9Th1uEh2GYdGY2IG1I9/7HmuEf+ls3lLCk1p2GFYRSrLMz6ieQR/SyN6TLIGK3hKRg==", - "dev": true, - "requires": { - "@babel/core": "7.8.4", - "@svgr/webpack": "4.3.3", - "@typescript-eslint/eslint-plugin": "^2.10.0", - "@typescript-eslint/parser": "^2.10.0", - "babel-eslint": "10.0.3", - "babel-jest": "^24.9.0", - "babel-loader": "8.0.6", - "babel-plugin-named-asset-import": "^0.3.6", - "babel-preset-react-app": "^9.1.1", - "camelcase": "^5.3.1", - "case-sensitive-paths-webpack-plugin": "2.3.0", - "css-loader": "3.4.2", - "dotenv": "8.2.0", - "dotenv-expand": "5.1.0", - "eslint": "^6.6.0", - "eslint-config-react-app": "^5.2.0", - "eslint-loader": "3.0.3", - "eslint-plugin-flowtype": "4.6.0", - "eslint-plugin-import": "2.20.0", - "eslint-plugin-jsx-a11y": "6.2.3", - "eslint-plugin-react": "7.18.0", - "eslint-plugin-react-hooks": "^1.6.1", - "file-loader": "4.3.0", - "fs-extra": "^8.1.0", - "fsevents": "2.1.2", - "html-webpack-plugin": "4.0.0-beta.11", - "identity-obj-proxy": "3.0.0", - "jest": "24.9.0", - "jest-environment-jsdom-fourteen": "1.0.1", - "jest-resolve": "24.9.0", - "jest-watch-typeahead": "0.4.2", - "mini-css-extract-plugin": "0.9.0", - "optimize-css-assets-webpack-plugin": "5.0.3", - "pnp-webpack-plugin": "1.6.0", - "postcss-flexbugs-fixes": "4.1.0", - "postcss-loader": "3.0.0", - "postcss-normalize": "8.0.1", - "postcss-preset-env": "6.7.0", - "postcss-safe-parser": "4.0.1", - "react-app-polyfill": "^1.0.6", - "react-dev-utils": "^10.2.0", - "resolve": "1.15.0", - "resolve-url-loader": "3.1.1", - "sass-loader": "8.0.2", - "semver": "6.3.0", - "style-loader": "0.23.1", - "terser-webpack-plugin": "2.3.4", - "ts-pnp": "1.1.5", - "url-loader": "2.3.0", - "webpack": "4.41.5", - "webpack-dev-server": "3.10.2", - "webpack-manifest-plugin": "2.2.0", - "workbox-webpack-plugin": "4.3.1" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@jest/core": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", - "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/reporters": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.9.0", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-resolve-dependencies": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "jest-watcher": "^24.9.0", - "micromatch": "^3.1.10", - "p-each-series": "^1.0.0", - "realpath-native": "^1.1.0", - "rimraf": "^2.5.4", - "slash": "^2.0.0", - "strip-ansi": "^5.0.0" - } - }, - "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", - "dev": true, - "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" - } - }, - "@jest/reporters": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", - "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^2.0.2", - "istanbul-lib-instrument": "^3.0.1", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.2.6", - "jest-haste-map": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "node-notifier": "^5.4.2", - "slash": "^2.0.0", - "source-map": "^0.6.0", - "string-length": "^2.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@jest/test-sequencer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", - "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", - "dev": true, - "requires": { - "@jest/test-result": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0" - } - }, - "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - }, - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "babel-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", - "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", - "dev": true, - "requires": { - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.9.0", - "chalk": "^2.4.2", - "slash": "^2.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", - "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", - "dev": true, - "requires": { - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", - "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", - "dev": true, - "requires": { - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "css-loader": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", - "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.23", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.1.1", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.0.2", - "schema-utils": "^2.6.0" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "expect": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", - "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "ansi-styles": "^3.2.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.9.0" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "find-cache-dir": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", - "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.0", - "pkg-dir": "^4.1.0" - }, - "dependencies": { - "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - } - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "dev": true, - "optional": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0" - } - }, - "jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", - "dev": true, - "requires": { - "import-local": "^2.0.0", - "jest-cli": "^24.9.0" - }, - "dependencies": { - "jest-cli": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", - "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", - "dev": true, - "requires": { - "@jest/core": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "import-local": "^2.0.0", - "is-ci": "^2.0.0", - "jest-config": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^13.3.0" - } - } - } - }, - "jest-changed-files": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", - "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "execa": "^1.0.0", - "throat": "^4.0.0" - } - }, - "jest-config": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", - "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.9.0", - "@jest/types": "^24.9.0", - "babel-jest": "^24.9.0", - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^24.9.0", - "jest-environment-node": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "micromatch": "^3.1.10", - "pretty-format": "^24.9.0", - "realpath-native": "^1.1.0" - } - }, - "jest-docblock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", - "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", - "dev": true, - "requires": { - "detect-newline": "^2.1.0" - } - }, - "jest-each": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", - "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-environment-jsdom": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", - "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0", - "jsdom": "^11.5.1" - } - }, - "jest-environment-node": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", - "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0" - } - }, - "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, - "dependencies": { - "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": false, - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": false, - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.3", - "resolved": false, - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": false, - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "resolved": false, - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": false, - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": false, - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": false, - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": false, - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": false, - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": false, - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "resolved": false, - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": false, - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": false, - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": false, - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "resolved": false, - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": false, - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": false, - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.2", - "resolved": false, - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "optional": true - }, - "needle": { - "version": "2.4.0", - "resolved": false, - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "resolved": false, - "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": false, - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.7", - "resolved": false, - "integrity": "sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": false, - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": false, - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": false, - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": false, - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": false, - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": false, - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": false, - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": false, - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": false, - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "resolved": false, - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": false, - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "resolved": false, - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": false, - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "resolved": false, - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "optional": true - } - } - } - } - }, - "jest-jasmine2": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", - "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^24.9.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0", - "throat": "^4.0.0" - } - }, - "jest-leak-detector": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", - "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", - "dev": true, - "requires": { - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, - "jest-resolve-dependencies": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", - "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.9.0" - } - }, - "jest-runner": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", - "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.4.2", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-leak-detector": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "source-map-support": "^0.5.6", - "throat": "^4.0.0" - } - }, - "jest-runtime": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", - "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "strip-bom": "^3.0.0", - "yargs": "^13.3.0" - } - }, - "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", - "dev": true - }, - "jest-snapshot": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", - "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "expect": "^24.9.0", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^24.9.0", - "semver": "^6.2.0" - } - }, - "jest-validate": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", - "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "camelcase": "^5.3.1", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "leven": "^3.1.0", - "pretty-format": "^24.9.0" - } - }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", - "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - } - }, - "node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", - "dev": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "p-each-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", - "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", - "dev": true, - "requires": { - "p-reduce": "^1.0.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "postcss-modules-local-by-default": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", - "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", - "dev": true, - "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.16", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.0" - } - }, - "postcss-modules-scope": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz", - "integrity": "sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - } - }, - "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", - "dev": true, - "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" - } - }, - "postcss-value-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", - "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "resolve": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", - "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "terser-webpack-plugin": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.4.tgz", - "integrity": "sha512-Nv96Nws2R2nrFOpbzF6IxRDpIkkIfmhvOws+IqMvYdFLO7o6wAILWFKONFgaYy8+T4LVz77DQW0f7wOeDEAjrg==", - "dev": true, - "requires": { - "cacache": "^13.0.1", - "find-cache-dir": "^3.2.0", - "jest-worker": "^25.1.0", - "p-limit": "^2.2.2", - "schema-utils": "^2.6.4", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.4.3", - "webpack-sources": "^1.4.3" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "webpack": { - "version": "4.41.5", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", - "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.0", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - }, - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - } - } - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "react-test-renderer": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.12.0.tgz", - "integrity": "sha512-Vj/teSqt2oayaWxkbhQ6gKis+t5JrknXfPVo+aIJ8QwYAqMPH77uptOdrlphyxl8eQI/rtkOYg86i/UWkpFu0w==", - "requires": { - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "react-is": "^16.8.6", - "scheduler": "^0.18.0" - }, - "dependencies": { - "scheduler": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", - "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - } - } - }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "dev": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", - "requires": { - "util.promisify": "^1.0.0" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", - "dev": true, - "requires": { - "minimatch": "3.0.4" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" - }, - "regenerate-unicode-properties": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", - "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" - }, - "regenerator-transform": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", - "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", - "dev": true, - "requires": { - "private": "^0.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regex-parser": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", - "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "regexpp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", - "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", - "dev": true - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "~0.5.0" - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - } - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dev": true, - "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "renderkid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", - "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", - "dev": true, - "requires": { - "css-select": "^1.1.0", - "dom-converter": "^0.2", - "htmlparser2": "^3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" - }, - "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - } - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", - "requires": { - "lodash": "^4.17.11" - } - }, - "request-promise-native": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", - "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", - "requires": { - "request-promise-core": "1.1.2", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", - "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "dependencies": { - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - } - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - }, - "resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "dev": true, - "requires": { - "value-or-function": "^3.0.0" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "resolve-url-loader": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz", - "integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==", - "dev": true, - "requires": { - "adjust-sourcemap-loader": "2.0.0", - "camelcase": "5.3.1", - "compose-function": "3.0.3", - "convert-source-map": "1.7.0", - "es6-iterator": "2.0.3", - "loader-utils": "1.2.3", - "postcss": "7.0.21", - "rework": "1.0.1", - "rework-visit": "1.0.0", - "source-map": "0.6.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "dev": true, - "requires": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - }, - "dependencies": { - "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", - "dev": true - } - } - }, - "rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", - "dev": true - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, - "rimraf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", - "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rsvp": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.4.tgz", - "integrity": "sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA==" - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - } - }, - "sanitize.css": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", - "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==", - "dev": true - }, - "sass-loader": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", - "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "loader-utils": "^1.2.3", - "neo-async": "^2.6.1", - "schema-utils": "^2.6.1", - "semver": "^6.3.0" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "saxes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.9.tgz", - "integrity": "sha512-FZeKhJglhJHk7eWG5YM0z46VHmI3KJpMBAQm3xa9meDvd+wevB5GuBB0wc0exPInZiBBHqi00DbS8AcvCGCFMw==", - "requires": { - "xmlchars": "^1.3.1" - } - }, - "scheduler": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", - "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", - "dev": true, - "requires": { - "node-forge": "0.9.0" - } - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" - }, - "semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", - "dev": true, - "requires": { - "sver-compat": "^1.5.0" - } - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - } - } - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, - "serialport": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/serialport/-/serialport-8.0.7.tgz", - "integrity": "sha512-R9bfNebs2dblYf5sD/Aaa7j8+siP4X7TGT02lqHM9DF5fyjlrPGXmsLw9+LKOz1AvjGjkxf2NzBVnDpqRX7clQ==", - "requires": { - "@serialport/binding-mock": "^8.0.6", - "@serialport/bindings": "^8.0.7", - "@serialport/parser-byte-length": "^8.0.6", - "@serialport/parser-cctalk": "^8.0.6", - "@serialport/parser-delimiter": "^8.0.6", - "@serialport/parser-readline": "^8.0.6", - "@serialport/parser-ready": "^8.0.6", - "@serialport/parser-regex": "^8.0.6", - "@serialport/stream": "^8.0.6", - "debug": "^4.1.1" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-clone": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", - "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", - "dev": true, - "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^2.0.1", - "lazy-cache": "^0.2.3", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", - "dev": true, - "requires": { - "is-buffer": "^1.0.2" - } - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", - "dev": true - } - } - }, - "shallow-equal": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.0.tgz", - "integrity": "sha512-Z21pVxR4cXsfwpMKMhCEIO1PCi5sp7KEp+CmOpBQ+E8GpHwKOw2sEzk7sgblM3d/j4z4gakoWEoPcjK0VJQogA==" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "dev": true, - "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } - }, - "shelljs": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.7.tgz", - "integrity": "sha1-svXHfvlxSPS09uImguELuoZnz/E=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" - }, - "simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - } - } - }, - "sisteransi": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", - "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==" - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - } - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - } - }, - "socket.io": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.0.tgz", - "integrity": "sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ==", - "requires": { - "debug": "~4.1.0", - "engine.io": "~3.5.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.4.0", - "socket.io-parser": "~3.4.0" - } - }, - "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" - }, - "socket.io-client": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", - "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "engine.io-client": "~3.5.0", - "has-binary2": "~1.0.2", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "socket.io-parser": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", - "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", - "requires": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" - } - } - } - }, - "socket.io-parser": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", - "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", - "requires": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - } - } - }, - "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", - "dev": true, - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" - } - }, - "sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", - "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", - "dev": true, - "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", - "dev": true - }, - "spdy": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", - "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", - "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "minipass": "^3.1.1" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - }, - "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==" - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", - "dev": true - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "streamfilter": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz", - "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=" - }, - "string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", - "dev": true, - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string.prototype.padend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", - "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.4.3", - "function-bind": "^1.0.2" - } - }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dev": true, - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "dependencies": { - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", - "dev": true - }, - "strip-comments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", - "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", - "dev": true, - "requires": { - "babel-extract-comments": "^1.0.0", - "babel-plugin-transform-object-rest-spread": "^6.26.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "style-inject": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", - "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==" - }, - "style-loader": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.21.0.tgz", - "integrity": "sha512-T+UNsAcl3Yg+BsPKs1vd22Fr8sVT+CJMtzqc6LEw9bbJZb43lm9GoeIfUcDEefBSWC0BhYbcdupV1GtI4DGzxg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^0.4.5" - }, - "dependencies": { - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "supports-hyperlinks": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.0.0.tgz", - "integrity": "sha512-bFhn0MQ8qefLyJ3K7PpHiPUTuTVPWw6RXfaMeV6xgJLXtBbszyboz1bvGTVv4R0YpQm2DqlXXn0fFHhxUHVE5w==", - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "dev": true, - "requires": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "svg-inline-react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/svg-inline-react/-/svg-inline-react-3.1.0.tgz", - "integrity": "sha512-c39AIRQOUXLMD8fQ2rHmK1GOSO3tVuZk61bAXqIT05uhhm3z4VtQFITQSwyhL0WA2uxoJAIhPd2YV0CYQOolSA==", - "requires": { - "prop-types": "^15.5.0" - } - }, - "svg-parser": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.3.tgz", - "integrity": "sha512-fnCWiifNhK8i2Z7b9R5tbNahpxrRdAaQbnoxKlT2KrSCj9Kq/yBSgulCRgBJRhy1dPnSY5slg5ehPUnzpEcHlg==", - "dev": true - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "symbol-tree": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "tar-fs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", - "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", - "requires": { - "chownr": "^1.1.1", - "mkdirp": "^0.5.1", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - } - }, - "tar-stream": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", - "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", - "requires": { - "bl": "^4.0.1", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "dependencies": { - "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "requires": { - "type-fest": "^0.8.1" - } - } - } - }, - "terser": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - }, - "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "terser": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } - } - }, - "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "dev": true, - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "dev": true, - "requires": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" - }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - } - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "dev": true, - "requires": { - "through2": "^2.0.3" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "requires": { - "punycode": "^2.1.0" - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - }, - "ts-import-plugin": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/ts-import-plugin/-/ts-import-plugin-1.5.5.tgz", - "integrity": "sha512-i0ULERaX+vycmASUeJFbAqx+KeMBAH+iFaSim+U9t05DxK+ZGpMCHT18zTRzTEh1dA6OWsHzVZmHgFKh5UTKUA==", - "dev": true, - "requires": { - "tslib": "^1.9.2" - } - }, - "ts-jest": { - "version": "25.0.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-25.0.0.tgz", - "integrity": "sha512-F+hZg3j7XYOFpXJteXb4lnqy7vQzTmpTmX7AJT6pvSGeZejyXj1Lk0ArpnrEPOpv6Zu/NugHc5W7FINngC9WZQ==", - "requires": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "mkdirp": "0.x", - "resolve": "1.x", - "semver": "^5.5", - "yargs-parser": "10.x" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "ts-loader": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-4.5.0.tgz", - "integrity": "sha512-ihgVaSmgrX4crGV4n7yuoHPoCHbDzj9aepCZR9TgIx4SgJ9gdnB6xLHgUBb7bsFM/f0K6x9iXa65KY/Fu1Klkw==", - "dev": true, - "requires": { - "chalk": "^2.3.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^1.0.2", - "micromatch": "^3.1.4", - "semver": "^5.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "ts-pnp": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.5.tgz", - "integrity": "sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA==", - "dev": true - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - }, - "tslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz", - "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^3.2.0", - "glob": "^7.1.1", - "js-yaml": "^3.13.0", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tslint-config-prettier": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz", - "integrity": "sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==", - "dev": true - }, - "tslint-microsoft-contrib": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-6.2.0.tgz", - "integrity": "sha512-6tfi/2tHqV/3CL77pULBcK+foty11Rr0idRDxKnteTaKm6gWF9qmaCNU17HVssOuwlYNyOmd9Jsmjd+1t3a3qw==", - "dev": true, - "requires": { - "tsutils": "^2.27.2 <2.29.0" - }, - "dependencies": { - "tsutils": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz", - "integrity": "sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tslint-react": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/tslint-react/-/tslint-react-3.6.0.tgz", - "integrity": "sha512-AIv1QcsSnj7e9pFir6cJ6vIncTqxfqeFF3Lzh8SuuBljueYzEAtByuB6zMaD27BL0xhMEqsZ9s5eHuCONydjBw==", - "dev": true, - "requires": { - "tsutils": "^2.13.1" - }, - "dependencies": { - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tslint-react-hooks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslint-react-hooks/-/tslint-react-hooks-2.1.0.tgz", - "integrity": "sha512-ccjyguEHGEU5rXikLDaQ6kT1AVo3C0HV8gi2MIJc7SbYAXjbzJkpbs4IXulgfqdEY1T6RnNSuGhyXg+2jTm5Bg==", - "dev": true - }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", - "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/type/-/type-1.0.1.tgz", - "integrity": "sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw==", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typed-rest-client": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.2.0.tgz", - "integrity": "sha512-FrUshzZ1yxH8YwGR29PWWnfksLEILbWJydU7zfIRkyH7kAEzB62uMAl2WY6EyolWpLpVHeJGgQm45/MaruaHpw==", - "dev": true, - "requires": { - "tunnel": "0.0.4", - "underscore": "1.8.3" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", - "dev": true - }, - "typescript-react-intl": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/typescript-react-intl/-/typescript-react-intl-0.4.0.tgz", - "integrity": "sha512-sCQN2YdWSaWNAK9bBezmqZStswfh0MMWQnIlBOn+iFBN4fE1m36fv1zqUaw33jTbQUjIaZ4N+NFbMfS/cnyIew==", - "dev": true, - "requires": { - "typescript": "^2.6.2" - }, - "dependencies": { - "typescript": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", - "dev": true - } - } - }, - "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true - }, - "undertaker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", - "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - } - }, - "undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", - "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", - "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "dev": true, - "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } - } - }, - "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-join": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", - "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=", - "dev": true - }, - "url-loader": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", - "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "mime": "^2.4.4", - "schema-utils": "^2.5.0" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } - } - }, - "url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "usb-detection": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/usb-detection/-/usb-detection-4.7.0.tgz", - "integrity": "sha512-HE9y5uYfA2ebVo64BrIB0OVNaVKZ2oWkadpTItCi4YQXyZ9vD0705iqQ3B7Rz8xevcrW/RNg/85E2o2JoPFmsQ==", - "requires": { - "bindings": "^1.3.0", - "eventemitter2": "^5.0.1", - "nan": "^2.13.2", - "prebuild-install": "^5.1.0" - } - }, - "usb-native": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/usb-native/-/usb-native-5.0.1.tgz", - "integrity": "sha512-FuKUVJmzgo7I6jclH0fCLuQLuOTg3jzzDvQwFgFWJM5Qe1L09snrl84adFCNvE/LGbCCCa4XjLuGGIgB7+zGQA==", - "requires": { - "fs-extra": "^8.1.0", - "serialport": "^8.0.7", - "usb-detection": "^4.7.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "util": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.1.tgz", - "integrity": "sha512-MREAtYOp+GTt9/+kwf00IYoHZyjM8VU4aVrkzUlejyqaIjd2GztVl5V9hGXKlvBKE3gENn/FMfHE5v6hElXGcQ==", - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "object.entries": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - }, - "v8-compile-cache": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", - "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", - "dev": true - }, - "v8-to-istanbul": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.0.1.tgz", - "integrity": "sha512-x0yZvZAkjJwdD3fPiJzYP37aod0ati4LlmD2RmpKjqewjKAov/u/ytZ8ViIZb07cN4cePKzl9ijiUi7C1LQ8hQ==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } - } - }, - "v8flags": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", - "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "version-from-git": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/version-from-git/-/version-from-git-1.1.1.tgz", - "integrity": "sha512-R8kAZ+EFJcqG5HGrfjk7bSBAWKB3AE/Dnh21llvNg6CWJIPJAKsYNLR7lvYrCwu33A3TU4UljPLpp577UxgL3w==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "commander": "^2.15.1", - "cross-spawn": "^6.0.5", - "git-rev-sync": "^1.12.0", - "on-error-resume-next": "^1.0.0", - "semver": "^5.5.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - } - }, - "vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "dev": true, - "requires": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "vsce": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.62.0.tgz", - "integrity": "sha512-KXtPBsdC0K27hmDksINyjoRl9BiuTB+ntmoJEDbbO3GIc+L3wfOclaSy8iYqddnpSA33YDkhKzKXhT0JGzrG/A==", - "dev": true, - "requires": { - "azure-devops-node-api": "^7.2.0", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.1", - "commander": "^2.8.1", - "denodeify": "^1.2.1", - "glob": "^7.0.6", - "lodash": "^4.17.10", - "markdown-it": "^8.3.1", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "osenv": "^0.1.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "semver": "^5.1.0", - "tmp": "0.0.29", - "typed-rest-client": "1.2.0", - "url-join": "^1.1.0", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tmp": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", - "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.1" - } - } - } - }, - "vscode-extension-telemetry": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.1.1.tgz", - "integrity": "sha512-TkKKG/B/J94DP5qf6xWB4YaqlhWDg6zbbqVx7Bz//stLQNnfE9XS1xm3f6fl24c5+bnEK0/wHgMgZYKIKxPeUA==", - "requires": { - "applicationinsights": "1.0.8" - } - }, - "vscode-nls": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.1.tgz", - "integrity": "sha512-4R+2UoUUU/LdnMnFjePxfLqNhBS8lrAFyX7pjb2ud/lqDkrUavFUTcG7wR0HBZFakae0Q6KLBFjMS6W93F403A==" - }, - "vscode-nls-dev": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/vscode-nls-dev/-/vscode-nls-dev-3.3.1.tgz", - "integrity": "sha512-fug18D7CXb8pv8JoQ0D0JmZaIYDQoKLiyZxkAy5P8Cln/FwlNsdzwQILDph62EdGY5pvsJ2Jd1T5qgHAExe/tg==", - "dev": true, - "requires": { - "ansi-colors": "^3.2.3", - "clone": "^2.1.1", - "event-stream": "^3.3.4", - "fancy-log": "^1.3.3", - "glob": "^7.1.2", - "iconv-lite": "^0.4.19", - "is": "^3.2.1", - "source-map": "^0.6.1", - "typescript": "^2.6.2", - "vinyl": "^2.1.0", - "xml2js": "^0.4.19", - "yargs": "^13.2.4" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "event-stream": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.5.tgz", - "integrity": "sha512-vyibDcu5JL20Me1fP734QBH/kenBGLZap2n0+XXM7mvuUPzJ20Ydqj1aKcIeMdri1p+PU+4yAKugjN8KCVst+g==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "from": "^0.1.7", - "map-stream": "0.0.7", - "pause-stream": "^0.0.11", - "split": "^1.0.1", - "stream-combiner": "^0.2.2", - "through": "^2.3.8" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "typescript": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "vscode-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.0.0.tgz", - "integrity": "sha512-RnZUhxEXYCozHtBAQwX/UISlw0JPqlv1I9LLl4++vcPDIvjs2Zfz2Inp8haxixS1sOTftHJ9kiecrwWF9S3taQ==", - "dev": true, - "requires": { - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1" - } - }, - "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", - "requires": { - "browser-process-hrtime": "^0.1.2" - } - }, - "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", - "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" - } - }, - "wait-for-expect": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-3.0.1.tgz", - "integrity": "sha512-3Ha7lu+zshEG/CeHdcpmQsZnnZpPj/UsG3DuKO8FskjuDbkx3jE3845H+CuwZjA2YWYDfKMU2KhnCaXMLd3wVw==" - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "requires": { - "makeerror": "1.0.x" - } - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "dev": true, - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - }, - "webpack": { - "version": "4.32.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.32.2.tgz", - "integrity": "sha512-F+H2Aa1TprTQrpodRAWUMJn7A8MgDx82yQiNvYMaj3d1nv3HetKU0oqEulL9huj8enirKi8KvEXQ3QtuHF89Zg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.0.5", - "acorn-dynamic-import": "^4.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^1.0.0", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - } - } - }, - "webpack-cli": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.2.tgz", - "integrity": "sha512-FLkobnaJJ+03j5eplxlI0TUxhGCOdfewspIGuvDVtpOlrAuKMFC57K42Ukxqs1tn8947/PM6tP95gQc0DCzRYA==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.0", - "findup-sync": "^2.0.0", - "global-modules": "^1.0.0", - "import-local": "^2.0.0", - "interpret": "^1.1.0", - "loader-utils": "^1.1.0", - "supports-color": "^5.5.0", - "v8-compile-cache": "^2.0.2", - "yargs": "^12.0.5" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", - "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", - "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - }, - "dependencies": { - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - } - } - }, - "webpack-dev-server": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.2.tgz", - "integrity": "sha512-pxZKPYb+n77UN8u9YxXT4IaIrGcNtijh/mi8TXbErHmczw0DtPnMTTjHj+eNjkqLOaAZM/qD7V59j/qJsEiaZA==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.2.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.6", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.25", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "0.3.19", - "sockjs-client": "1.4.0", - "spdy": "^4.0.1", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "12.0.5" - }, - "dependencies": { - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "webpack-manifest-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", - "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", - "dev": true, - "requires": { - "fs-extra": "^7.0.0", - "lodash": ">=3.5 <5", - "object.entries": "^1.1.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.4.0 <0.4.11", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==", - "dev": true - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - }, - "workbox-background-sync": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz", - "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-broadcast-update": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz", - "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-build": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-4.3.1.tgz", - "integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.3.4", - "@hapi/joi": "^15.0.0", - "common-tags": "^1.8.0", - "fs-extra": "^4.0.2", - "glob": "^7.1.3", - "lodash.template": "^4.4.0", - "pretty-bytes": "^5.1.0", - "stringify-object": "^3.3.0", - "strip-comments": "^1.0.2", - "workbox-background-sync": "^4.3.1", - "workbox-broadcast-update": "^4.3.1", - "workbox-cacheable-response": "^4.3.1", - "workbox-core": "^4.3.1", - "workbox-expiration": "^4.3.1", - "workbox-google-analytics": "^4.3.1", - "workbox-navigation-preload": "^4.3.1", - "workbox-precaching": "^4.3.1", - "workbox-range-requests": "^4.3.1", - "workbox-routing": "^4.3.1", - "workbox-strategies": "^4.3.1", - "workbox-streams": "^4.3.1", - "workbox-sw": "^4.3.1", - "workbox-window": "^4.3.1" - }, - "dependencies": { - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "workbox-cacheable-response": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz", - "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-core": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", - "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==", - "dev": true - }, - "workbox-expiration": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz", - "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-google-analytics": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz", - "integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==", - "dev": true, - "requires": { - "workbox-background-sync": "^4.3.1", - "workbox-core": "^4.3.1", - "workbox-routing": "^4.3.1", - "workbox-strategies": "^4.3.1" - } - }, - "workbox-navigation-preload": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz", - "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-precaching": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz", - "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-range-requests": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz", - "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-routing": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz", - "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-strategies": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz", - "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-streams": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-4.3.1.tgz", - "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-sw": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz", - "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==", - "dev": true - }, - "workbox-webpack-plugin": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz", - "integrity": "sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.0.0", - "json-stable-stringify": "^1.0.1", - "workbox-build": "^4.3.1" - } - }, - "workbox-window": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-4.3.1.tgz", - "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "worker-rpc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", - "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", - "dev": true, - "requires": { - "microevent.ts": "~0.1.1" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "ws": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.1.tgz", - "integrity": "sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A==" - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true - }, - "xmlchars": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-1.3.1.tgz", - "integrity": "sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw==" - }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true - }, - "yaml": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz", - "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.6.3" - } - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - }, - "dependencies": { - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "yargs-parser": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", - "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yargs-unparser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", - "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", - "dev": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.11", - "yargs": "^12.0.5" - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3" - } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" - }, - "zone.js": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.7.6.tgz", - "integrity": "sha1-+7w50+AmHQmG8boGMG6zrrDSIAk=" - } - } -} diff --git a/src/adafruit_circuitplayground/__init__.py b/src/adafruit_circuitplayground/__init__.py deleted file mode 100644 index b4bc33da8..000000000 --- a/src/adafruit_circuitplayground/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# added compatibility for new import structure in CircuitPython -# https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/pull/79 - -from .express import cpx as cp diff --git a/src/adafruit_circuitplayground/constants.py b/src/adafruit_circuitplayground/constants.py deleted file mode 100644 index 2c47a919d..000000000 --- a/src/adafruit_circuitplayground/constants.py +++ /dev/null @@ -1,78 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - - -class EXPRESS_STATE: - BUTTON_A = "button_a" - BUTTON_B = "button_b" - ACCELERATION = "acceleration" - BRIGHTNESS = "brightness" - PIXELS = "pixels" - RED_LED = "red_led" - SWITCH = "switch" - TEMPERATURE = "temperature" - LIGHT = "light" - MOTION_X = "motion_x" - MOTION_Y = "motion_y" - MOTION_Z = "motion_z" - TOUCH = "touch" - SHAKE = "shake" - DETECT_TAPS = "detect_taps" - - -ASSIGN_PIXEL_TYPE_ERROR = ( - "The pixel color value type should be tuple, list or hexadecimal." -) - -BRIGHTNESS_RANGE_ERROR = "The brightness value should be a number between 0 and 1." - -CPX = "CPX" - -INDEX_ERROR = ( - "The index is not a valid number, you can access the Neopixels from 0 to 9." -) - -MAC_OS = "darwin" - -NOT_IMPLEMENTED_ERROR = "This method is not implemented by the simulator" - -NOT_SUITABLE_FILE_ERROR = ( - "Your .wav file is not suitable for the Circuit Playground Express." -) - -PIXEL_RANGE_ERROR = ( - "The pixel hexadicimal color value should be in range #000000 and #FFFFFF." -) - -VALID_PIXEL_ASSIGN_ERROR = "The pixel color value should be a tuple with three values between 0 and 255 or a hexadecimal color between 0x000000 and 0xFFFFFF." - -ERROR_SENDING_EVENT = "Error trying to send event to the process : " - -TIME_DELAY = 0.03 - - -EVENTS_BUTTON_PRESS = [ - EXPRESS_STATE.BUTTON_A, - EXPRESS_STATE.BUTTON_B, - EXPRESS_STATE.SWITCH, -] -EVENTS_SENSOR_CHANGED = [ - EXPRESS_STATE.TEMPERATURE, - EXPRESS_STATE.LIGHT, - EXPRESS_STATE.MOTION_X, - EXPRESS_STATE.MOTION_Y, - EXPRESS_STATE.MOTION_Z, -] - -ALL_EXPECTED_INPUT_EVENTS = [ - EXPRESS_STATE.BUTTON_A, - EXPRESS_STATE.BUTTON_B, - EXPRESS_STATE.SWITCH, - EXPRESS_STATE.TEMPERATURE, - EXPRESS_STATE.LIGHT, - EXPRESS_STATE.SHAKE, - EXPRESS_STATE.MOTION_X, - EXPRESS_STATE.MOTION_Y, - EXPRESS_STATE.MOTION_Z, - EXPRESS_STATE.TOUCH, -] diff --git a/src/adafruit_circuitplayground/express.py b/src/adafruit_circuitplayground/express.py deleted file mode 100644 index 7f2857508..000000000 --- a/src/adafruit_circuitplayground/express.py +++ /dev/null @@ -1,215 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -import json -import sys -import os -import playsound - -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent -from .pixel import Pixel -from . import constants as CONSTANTS -from collections import namedtuple -import common - -Acceleration = namedtuple(CONSTANTS.EXPRESS_STATE.ACCELERATION, ["x", "y", "z"]) - - -class Express: - def __init__(self): - # State in the Python process - self.__state = {} - self.__state[CONSTANTS.EXPRESS_STATE.BRIGHTNESS] = 1.0 - self.__state[CONSTANTS.EXPRESS_STATE.BUTTON_A] = False - self.__state[CONSTANTS.EXPRESS_STATE.BUTTON_B] = False - self.__state[CONSTANTS.EXPRESS_STATE.PIXELS] = [ - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - ] - self.__state[CONSTANTS.EXPRESS_STATE.RED_LED] = False - self.__state[CONSTANTS.EXPRESS_STATE.SWITCH] = False - self.__state[CONSTANTS.EXPRESS_STATE.TEMPERATURE] = 0 - self.__state[CONSTANTS.EXPRESS_STATE.LIGHT] = 0 - self.__state[CONSTANTS.EXPRESS_STATE.MOTION_X] = 0 - self.__state[CONSTANTS.EXPRESS_STATE.MOTION_Y] = 0 - self.__state[CONSTANTS.EXPRESS_STATE.MOTION_Z] = 0 - self.__state[CONSTANTS.EXPRESS_STATE.TOUCH] = [False] * 7 - self.__state[CONSTANTS.EXPRESS_STATE.SHAKE] = False - self.__state[CONSTANTS.EXPRESS_STATE.DETECT_TAPS] = 0 - self.pixels = Pixel(self.__state) - - @property - def acceleration(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_ACCELERATION) - return Acceleration( - self.__state[CONSTANTS.EXPRESS_STATE.MOTION_X], - self.__state[CONSTANTS.EXPRESS_STATE.MOTION_Y], - self.__state[CONSTANTS.EXPRESS_STATE.MOTION_Z], - ) - - @property - def button_a(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_BUTTON_A) - return self.__state[CONSTANTS.EXPRESS_STATE.BUTTON_A] - - @property - def button_b(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_BUTTON_B) - return self.__state[CONSTANTS.EXPRESS_STATE.BUTTON_B] - - @property - def detect_taps(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_DETECT_TAPS) - return self.__state[CONSTANTS.EXPRESS_STATE.DETECT_TAPS] - - @detect_taps.setter - def detect_taps(self, value): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_DETECT_TAPS) - value_int = int(value) - self.__state[CONSTANTS.EXPRESS_STATE.DETECT_TAPS] = ( - value_int if (value_int == 1 or value_int == 2) else 1 - ) - - @property - def tapped(self): - """ Not Implemented! - """ - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_TAPPED) - utils.print_for_unimplemented_functions("tapped") - - @property - def red_led(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_RED_LED) - return self.__state[CONSTANTS.EXPRESS_STATE.RED_LED] - - @red_led.setter - def red_led(self, value): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_RED_LED) - self.__state[CONSTANTS.EXPRESS_STATE.RED_LED] = bool(value) - self.__show() - - @property - def switch(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_SWITCH) - return self.__state[CONSTANTS.EXPRESS_STATE.SWITCH] - - @property - def temperature(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_TEMPERATURE) - return self.__state[CONSTANTS.EXPRESS_STATE.TEMPERATURE] - - @property - def light(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_LIGHT) - return self.__state[CONSTANTS.EXPRESS_STATE.LIGHT] - - def __show(self): - if utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - self.__state, CONSTANTS.CPX - ) - else: - utils.send_to_simulator(self.__state, CONSTANTS.CPX) - - def __touch(self, i): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_TOUCH) - return self.__state[CONSTANTS.EXPRESS_STATE.TOUCH][i - 1] - - @property - def touch_A1(self): - return self.__touch(1) - - @property - def touch_A2(self): - return self.__touch(2) - - @property - def touch_A3(self): - return self.__touch(3) - - @property - def touch_A4(self): - return self.__touch(4) - - @property - def touch_A5(self): - return self.__touch(5) - - @property - def touch_A6(self): - return self.__touch(6) - - @property - def touch_A7(self): - return self.__touch(7) - - def adjust_touch_threshold(self, adjustment): - """Not implemented! - The CPX Simulator doesn't use capacitive touch threshold. - """ - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_ADJUST_THRESHOLD) - utils.print_for_unimplemented_functions(Express.adjust_touch_threshold.__name__) - - def shake(self, shake_threshold=30): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_SHAKE) - return self.__state[CONSTANTS.EXPRESS_STATE.SHAKE] - - def play_file(self, file_name): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_PLAY_FILE) - file_name = utils.remove_leading_slashes(file_name) - abs_path_parent_dir = os.path.abspath( - os.path.join(utils.abs_path_to_user_file, os.pardir) - ) - abs_path_wav_file = os.path.normpath( - os.path.join(abs_path_parent_dir, file_name) - ) - abs_path_wav_file = utils.escape_if_OSX(abs_path_wav_file) - - if sys.implementation.version[0] >= 3: - if file_name.endswith(".wav"): - try: - playsound.playsound(abs_path_wav_file) - except: - # TODO TASK: 29054 Verfication of a "valid" .wav file - raise EnvironmentError(CONSTANTS.NOT_SUITABLE_FILE_ERROR) - else: - raise TypeError(file_name + " is not a path to a .wav file.") - else: - raise NotImplementedError("Please use Python 3 or higher.") - - def play_tone(self, frequency, duration): - """ Not Implemented! - """ - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_PLAY_TONE) - utils.print_for_unimplemented_functions(Express.play_tone.__name__) - - def start_tone(self, frequency): - """ Not Implemented! - """ - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_START_TONE) - utils.print_for_unimplemented_functions(Express.start_tone.__name__) - - def stop_tone(self): - """ Not Implemented! - """ - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_STOP_TONE) - utils.print_for_unimplemented_functions(Express.stop_tone.__name__) - - def update_state(self, new_state): - for event in CONSTANTS.ALL_EXPECTED_INPUT_EVENTS: - self._Express__state[event] = new_state.get( - event, self._Express__state[event] - ) - - -cpx = Express() diff --git a/src/adafruit_circuitplayground/locale/en/LC_MESSAGES/express.po b/src/adafruit_circuitplayground/locale/en/LC_MESSAGES/express.po deleted file mode 100644 index 50579af3a..000000000 --- a/src/adafruit_circuitplayground/locale/en/LC_MESSAGES/express.po +++ /dev/null @@ -1,26 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-21 13:35-0700\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: express.py:190 -msgid " is not a path to a .wav file." -msgstr "" - -#: express.py:192 -msgid "Please use Python 3 or higher." -msgstr "" diff --git a/src/adafruit_circuitplayground/locale/express.pot b/src/adafruit_circuitplayground/locale/express.pot deleted file mode 100644 index 50579af3a..000000000 --- a/src/adafruit_circuitplayground/locale/express.pot +++ /dev/null @@ -1,26 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-21 13:35-0700\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: express.py:190 -msgid " is not a path to a .wav file." -msgstr "" - -#: express.py:192 -msgid "Please use Python 3 or higher." -msgstr "" diff --git a/src/adafruit_circuitplayground/pixel.py b/src/adafruit_circuitplayground/pixel.py deleted file mode 100644 index 22fcfc8ae..000000000 --- a/src/adafruit_circuitplayground/pixel.py +++ /dev/null @@ -1,133 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -import json -import sys -import common - -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent -from . import constants as CONSTANTS - - -class Pixel: - def __init__(self, state): - self.__state = state - self.auto_write = True - self.telemetry_state = False - - def show(self): - # Send the state to the extension so that React re-renders the Webview - # or send the state to the debugger (within this library) - if utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - self.__state, CONSTANTS.CPX - ) - else: - common.utils.send_to_simulator(self.__state, CONSTANTS.CPX) - - def __show_if_auto_write(self): - if self.auto_write: - self.show() - - def __getitem__(self, index): - if type(index) is not slice: - if not self.__valid_index(index): - raise IndexError(CONSTANTS.INDEX_ERROR) - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_PIXELS) - return self.__state[CONSTANTS.EXPRESS_STATE.PIXELS][index] - - def __setitem__(self, index, val): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_PIXELS) - is_slice = False - if type(index) is slice: - is_slice = True - else: - if not self.__valid_index(index): - raise IndexError(CONSTANTS.INDEX_ERROR) - self.__state[CONSTANTS.EXPRESS_STATE.PIXELS][ - index - ] = self.__extract_pixel_value(val, is_slice) - self.__show_if_auto_write() - - def __iter__(self): - yield from self.__state[CONSTANTS.EXPRESS_STATE.PIXELS] - - def __enter__(self): - return self - - def __repr__(self): - return "[" + ", ".join([str(x) for x in self]) + "]" - - def __len__(self): - return len(self.__state[CONSTANTS.EXPRESS_STATE.PIXELS]) - - def __valid_index(self, index): - return ( - type(index) is int - and index >= -len(self.__state[CONSTANTS.EXPRESS_STATE.PIXELS]) - and index < len(self.__state[CONSTANTS.EXPRESS_STATE.PIXELS]) - ) - - def fill(self, val): - for index in range(len(self.__state[CONSTANTS.EXPRESS_STATE.PIXELS])): - self.__state[CONSTANTS.EXPRESS_STATE.PIXELS][ - index - ] = self.__extract_pixel_value(val) - self.__show_if_auto_write() - - def __extract_pixel_value(self, val, is_slice=False): - extracted_values = [] - values = val - if not is_slice: - values = [val] - # Type validation - for v in values: - if type(v) is list: - rgb_value = tuple(v) - elif type(v) is int: - rgb_value = self.__hex_to_rgb(hex(v)) - elif type(v) is tuple: - rgb_value = v - else: - raise ValueError(CONSTANTS.ASSIGN_PIXEL_TYPE_ERROR) - # Values validation - if len(rgb_value) != 3 or any( - not self.__valid_rgb_value(pix) for pix in rgb_value - ): - raise ValueError(CONSTANTS.VALID_PIXEL_ASSIGN_ERROR) - extracted_values.append(rgb_value) - return rgb_value if not is_slice else extracted_values - - def __hex_to_rgb(self, hexValue): - if hexValue[0:2] == "0x" and len(hexValue) <= 8: - hexToRgbValue = [0, 0, 0] - hexColor = hexValue[2:].zfill(6) - hexToRgbValue[0] = int(hexColor[0:2], 16) # R - hexToRgbValue[1] = int(hexColor[2:4], 16) # G - hexToRgbValue[2] = int(hexColor[4:6], 16) # B - return tuple(hexToRgbValue) - else: - raise ValueError(CONSTANTS.PIXEL_RANGE_ERROR) - - def __valid_rgb_value(self, pixValue): - return type(pixValue) is int and pixValue >= 0 and pixValue <= 255 - - @property - def brightness(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_BRIGHTNESS) - return self.__state[CONSTANTS.EXPRESS_STATE.BRIGHTNESS] - - @brightness.setter - def brightness(self, brightness): - if not self.__valid_brightness(brightness): - raise ValueError(CONSTANTS.BRIGHTNESS_RANGE_ERROR) - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_BRIGHTNESS) - self.__state[CONSTANTS.EXPRESS_STATE.BRIGHTNESS] = brightness - self.__show_if_auto_write() - - def __valid_brightness(self, brightness): - return (type(brightness) is float or type(brightness) is int) and ( - brightness >= 0 and brightness <= 1 - ) diff --git a/src/adafruit_circuitplayground/test/__init__.py b/src/adafruit_circuitplayground/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/adafruit_circuitplayground/test/sample.mp4 b/src/adafruit_circuitplayground/test/sample.mp4 deleted file mode 100644 index ed139d6d50cc43f89c27392621f20d174d0bf051..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1055736 zcmV(oK=Ho-001Cnba`-Tb8l?`00IDMb8l^Fb8j+Xc4IMZa5OOh000PPa%E)z5DQCf zWMOmx0u&h(CNqWt!9ujx<=M}ocIrL#7uvn#&l;r6?*fbE_)(at;8ky=&PM@sp6`%G!eTMH+STGb7hJt}{Aebmp2(_oj&&P@S zU*hZb{b%O=wd!7?;^fXZD1g1)RsJiB{d@9%Q~rjpn@_)3s1n+=m=_WQ4fKC~DdNGs z^&|ceo8x~E&do!@_i99)*YTkEmijgi=|?Q%mhz6p*Bu}qcyEzkI(S~ENeJP6M*cs1 z9z{&^WuPHiuVRp?OB2^H&aEt@A^>-~0EjTA0+|)0LH&aPK(J6u6buaoL13Us!w*YVPD-v2`l5k0Wo}qJRGj*Zn{B{ipeQT+U_J?gPN%Kb8F^ zu>c@{e{zrC!uhQ<{cIa6$^8CrQU05AMx$>_ue@*Vy?c}rYtx5xrEBuCl9j2v1hxJA zanw+nYM96Lt^s3<9Z#)k7ARR(Q*B|O?e#@8M;r1~J&;(1sxlEm$rXT%glZIo7Mf|y zEf@h9P=9a#|Nr2eFcu62!o`5F;8Ye21%m>hu~1|oAp}BUYMGo&-m=-o;ft%zs;=&( zMKmw_zuIH!FG2F1-=Bu1`D*I+|GTAIRCPy&vi^K+@$=4d;>_~+60L_YShhx|$ddKb zJ^d7S5X1QAV*cO*pee2O>UKY_j^ya(^ zVA*Af2nSDg^h+hq)es`s7=MGbp)XU*3?lTvt|nbs)zEA*=%)@y+&&i_Y(5!O1ToC7vF}y{yy%`?Vr@(+4}q6d(UHh=^&(d{OwScS$DD z>qBjs9VG=f&hTFfsM1&P*=W|x$ZN_*MrkcNj2QqB1aJTWn*wEsf*+3C9ArL$-;43a zFok$3UMKfApXAb{%)-PU;$%-QGe)WZ{;U!e-8J`pd2I-IUb$ilD6ODTMZQ1ZY^FY3kjnzH%=Py z)na^{)i7YNS!*)2*tQ3(@l16E_?%gKC{S^#-9pTCIovH8OEJP#j+s^4M{r%dt}Y?P zMi!gWs~A%z4Y#h1QveE?HO#|5x@89A2W1j;|YzzZHq5? zS=0!y+>G*2@))5{ijaBHg+fg1dpN$5Cc7jR>ko&E0@^m%<}q96h@0;G-2%HQC)cYB z2_FO4{9C&rOonc&tDn=_|Q4h@;!k;tQx1rM%}qT#=aa3}7;)@wZA zcxoZ_NL=t0r!`{^hH4|HOTy6SjttjSFzJUQXMA5ji84RKLqy^0lG=7fz1Z}77b(2C z#nYOIcgn)6{Y8JcD5gbV>QhtwOEC0bgS5kctLk=}mxQ|X+}lEW$}k>6aPt59FI}2wt^GY7^uO+fDO%W za*oM~DE`3A<=v?gIbzta7}~LX5_rUayq%e2mBbO=~twuJv@IRt9s3(Hb zVo?yT!cy65EBXNjDLe?Na;_%)RPI5J9(hRV#WIF|rxcoaX^Jv1+pqPbGRd%9ivL&-rOePjJ*z#feLFUu)D3(( zq1VdO15h5InnbGDI=%- zoi!Y(_^q9H_B=hUK3RXV2aNPQr8QGD;t_6g)?!T5BbF*N_)Sy-ds5RwS#pPlU6I;9 zqiji60(Hwr7K{%zns1?&*5CGf8a@Jud6^gB!Kwd@0Uin0-hSWlP0!*W1KUC;l!qL4w}{4lZ$`n zhjL9*+dw;wf5n+#6i&4dP>ap+`0@JV&N2VQ1hUpGf#dYH_J0mW6_*}Bno^CNW%qES z`$JDk!tmtBqs*Q^vCNxT)=XA?_$qY-zEdr3x80nEIxir4IcBdk5BtZJpBdGT{?XA> zg~@LiN*u;s6Q8t~75$n=M-iP=J>lHmmL}Esy#PQi!)Rkro#tFq9XbhN!R-#Ul$(Ie z$pKtQ#nAf&dhDf;Uk`dGT4ID+_+AFQGFTb_MN$N1HyNuM#b%ivJx5SJN%?)A#%wL8 zjjU{>0yBPqR#IWRe&%hw{BF*AU z-)PoHJ?LR>Xpx>vL(mYY$hD4JMr7F4Z zguYiPtO6+j86@221YGmvzr+&V(sBXq^_6ZYt;!v%I_awuYF*Z7*BH3cg?n_E>M#^b z;G0}R-}!DnHRs@koZj~`MZ~Hf*EbQRYs1;hyj=%iVL^dduC_eNw{1yM_Oj-P=0`#l z5?e3UN59?|qomsjXm+Fx_XsdhkrR#;lB(K}Lw@zRAf* zltt^fyS{jSz2Q}1CZH4y)8L|pT`6lwjZCT6;raRxsWBGyF;oa8;A`npj4RDHEgEp@ z*GdchxZ`}!Vp#a^FmWl|MUjA9o9tc>zbXnsGvCDK0|X;z+{#_0y-1rlxjz_vq^UVa zVVfbXIdZJL>-#9|*gtQkO;E(QGA%)`sQps9m8(XyFDE5WxooMJgnlKeN63gZ7S=hX zM+S~E*Lh}!|N8o-V+OVt4BGt+*DiA;RnVR_U3`qxwtMUM^j!^~aK0mSJJ=T4))#$0 zfh%UW781LX--m&EJtl+~`f0C(IO`?oUEc-@tUbMfKXKbr4(HIm`U~kz$N+XIpFscc zGSCSeh2jk$7#)52pd^nO4x$XD%a7=lE)gpGDxt;*^(MTyyg+m+u> zjG3Z3kXyFSZAa~bpPk=jZ&*ZKpHQztW47&@moY`Zs`(Z~*B(Nfr6|nwLzc|W?^dh5 z3%Zy6BoV+XFxUTlvWuFK6!%=}H~nj|wl$hrhAmP%6$Tnr!$QWu=vD(WTQ-`EfUiJ9=M;(QHA zl1`cqXod-CZ!F^ftERVYj?OcVXt**sv0Wt0*NjR5c{8D@u?{BZVF4V*8^_KQh$r0! z@Q_cE@E_X1A%jzC1j~@q7hOIyx~~ri(1+MFm&16#n-Cr|17Z&+T^~d0pyqFVhB31e zmZcSEIQi;e!1R`D?j98<0ng7=F1*jiz&b5=EsnTtMhOwg4#)zqP;4jwoa2z`)YgUi zD+bpZOLlTZL<{N&pZagp66viSS7e`k_GD)*d+Ng_2qO%NQt3LX%+ja-lg|%nof+Nb z%mbPhv-bXU9Yw)B`T|SmH@}u_!GW_tVSCH8e5m_4 zJeczC*fjdxlm-?{kPFCl>y<)2JrtS3d~Vxu0JvuvX*=A-4(ZyIp1S7bMyiD#pj?$} zCpv0(vqQ_H$OfXqQ0fM&Si>{*Tv9d2xx0ir_Lc}fT!*V&fl3Sv(FS6w8W@UxY!}^U zNNAYa>N`vTNh~AMkM58c962hvBH+{&gRc;bMI z_BNd9*Bt;8c(r8D^pCU2Nw_k&spbc%$$t40fc8Z|+)-euOEmvrWe3;9b)(uD5j^$W z!6XfGSoQfZWA6lhnw$g!8+-j*ySO%1h@_2_m57*A53RNR*A1cyN+YleEs%xZpsRN= zTT1CtMlr0R@FR{KYE7_TQy`@z?%v)FB7&D#&OyE!+==w1Eoo^93JQ-ne<>N7&Adh| zl9%l<&=_sk?7Au!L)S?L<(~0tQbZvj@0P+2Rn|>8nhK#@`WY*J7}G-(b~H0 zdv!aPkO8`qVRK%0j=)b$H`;IVF%b;T%2-H4KQ3!INtg4qYYA0)#%Gy~TaSOfbAQZ6 zY*UezhMvs*^xoiIUF+Txy4(LbM8fzyOpkZt{lzYrk#YLSvlL3u5<6$gPquk@!i3XSZFVv4$C?{-4>G($KMC4gxWw}6Fh|J!%*}l zDf^Z!eFQ|jrS;G8T*k6>J{=50xwqFiur4I9=>5-6lMGSHTkq$PvE%qMz+5=yDB#MP z2r_~rNh|vJ?P#Ug_6ng51m*mqMEn@`-&{8D4=(Nwut(M3;#Kl}VpBEczW_7g8K4^d zJ)4I$aVF!y3q@5=A`;R?Q&#ABuIw+2@-9k)7%q~_Y-TZY-Fnub+^+InbXUtPdG7}> zF?~)id%`zV)uH=mUPyA=)UQ+td-Cg4F=U{0eT|)p1PNXk`|LfC%bvP1DLg_LxjQ(* zdrS;;6)(yd;T@)5@{?&9zPsbOkhOAru=TyXqh!2z9edvl8e9QFN7Uf|b#ye6Xyipy zxE|~08$f5v#a#ONYR2(*Ov!|cY_z-B#dj_$L*Qlv+L)4!hy{1s6V3hk&n!rK1L2Ln zg9iMqE!(8|adxShA3rEZODi;}roy>AgT*+A_#wegB#_7|al}4+Fi*NDQUr$U^e?@#si_pi*1!T4eYU<&Ow2g&zeR>5Q%T2nBtQLoRkF@I~6fJs6Y^hDZ7|8@_iNvbUSkx?ILxuTFWt1S=XHUf@RW&*1=Ypvqif8L1&_=@(BK| zL=1RxJQ7aKEljb|k4@&=#N|@nrKAbN{(2hYF0JOxuuX#TSSVXF{0J94OE8YvkVdyC zmr|IvkomZ|c%Vscww=16bR|oFxr$MYZvXe3yk>20N_B2>Ci4?F9cBa;hi#gy_+;sg z0i`J>IBhk{GT`7>XoqsAwCy7(QVSk&0gs1yV`QNU246+%e@lW{ju%0$5S=3S)M!gj zZSJPOQ9+ZR9thLMz zt8m>)pVtS{&?*u)@Px6r@Kj~YkjnY^YzkS#m;>Q+pYAT#0J>t!Tq!bj+@NB88{(Z2 zi`}n592WO<-w`?Ye43{RImTNYXAqT-lEDcBm5Sh$2)mk83?Km(?020@y|rvMbjBYf)dQNqff0au6suoatU zwu!E}r6&x5&1GeX(U@PqB0^1;`Be9@Vji{!Voe*rTZNw3V;MS=X+^G#LxY6VG=8Qx z8s`rG`5!pKb46#Y&y{B!qg$Re<#L^Bt$_2pXd^! zd{Silx*px?-di6YpZDuPu;Q(s3#az3x!?rgO*VEWBq@YeyI+WL$*Y5H$2_ul?34}%5ezA%vnYpy`RwSE%(~)ldB(mek4zcOap^1xX&y>*D4Y!w08-_p)bjNDKnyGGl12nbO z73{673x1St+6uVaJ0S#GT3OjIVScPcaMcCVBFrb{r%95s+DmQ4p6&85$JktHxkbmk z;_-SxX2AfUgqXwajnvpJ#weQj`Pwrjb|UrUdfnY0qkD^FRFadCR;I0li6#)Jj?9qj zh-DZvD?rGu;(L&%>jZ<+im;{QUzBkhyr!ZWG7IA4{M;Mf(AmOa8x0JWv&?ILdV)-i z-Xqx>tl6vks^D2~pAhz(o25B(o~@hVKK%Zt965Fc(xu;?SqXRAH~U%?ZM@JSS67%z z3XF}`Tkvf3eL8w@qxB)yA=Yf{gP^2$`9lQ?gUuReqa zM@`U?B?2^ADzHXXB$>;^Y};2D-0L*#INA)vRyFIO+SFAx@TLwM4@-TnJz31w={htP zCSAfLa$TBLRj8+;5~UI9tE!zz`_5u>*cb*|?Q^k)k~p3H%#!T)Mc>FDXCRV>B~#IS zP(do5?&r-EycK(0Sz|6g1Gzks-&vd>Cq)FyQ6Ek^B7$iqzF#3NGZETHItk?qf)HNh z%TNFjHbkn&?kDX;`#?U?=qP_Z)cB5+OBp%{F5x0A&^x|Zbu_p#%Wpv;qC@>e$?6z7 z^%A^aB66~r-y|E?LsIgPXMyuI;4cUhKf?Be*OHIcVCQkhrYK5g4AO4Ze3CQ~;(-9V z2c(o0-az;CWbM@w;TW^h2q^hJ=fgGdL|P|A&NixTO@BZwi%aP~Bx|9FR2$i2QkRu# z4G9R>N5lW|gWGsSb+$FPF08)3a}MR(5xS!S=u+pfg$a9DQD<&#>nfwddSh#guCuTP zw)X!YksfV?d)^X3U^MZ8wWVNfxQ-^dl?P1(wo2ZiccfB7j#j`p@J#`*t6$Mm!jUy( zue+_Y0`sT&0+%w!dd`k4z}`;WXu-&Ea8+l^zsPPC6KZ{*EY4-qxCfXcheS#SJ`E6* zU!mOv-Ur>)YTDGPe?qS7{B(CY8y47J@ULBFzOI)@f)UrplsJNib;2tH*G8^>Oxkzp z9fV_&Ke|6HQzs>>yTEOg2^>mviwgQU5bt0pz~(`%w)U_kh1g?b6Mz5eE})r6l(N!# z(>7aDuCrPJ-b@!Ph*1<1(*YXvohX^CZR3f}gCRQR=R$A%&p6RHRrPB!NVN=WaxPK= zE+OTnM-HF6gfYw-;3)AtXpslM^;Qp_X1LEfSubW#lp<~skQ{Q~*2QSK_Wm1;RVmC* z8l{#yPlmqXZ>`pTpMn{_^VpDa0VeHpd^0jAWp}8b_!eeSStm3Sr+u ziUR(ae2*hE@`t&n)Y&%XGJLD4@(yu-g0{SZdWYP?{!u;kuQdbbQb9#z z9&wFubskW)u@9gTn>$hymG?8YJ9Q8mRy9vz+(b|#&M9%|V}G;w-pDT~k9gaJMPMwRni^swTB}KYpdR?P@wo&&} z;L_f@FWu4mYi%Ca9^NZ5Tqd(npk=b9d)=8h4*njt2FvnoAsPnq_OH2U> zKz2`u6Ji`kfLftp{;ze^&;nAZ>%cogVO ze#m)I!WM)#2iD0BPtUvxRA=3~GxbFwRWL6sRS4Iefdp|^OTRI<;F8<3RWodw>Y=hD z5`%{yIE|wQ+S~P-PT}$f4c;1laMgIT*+)Xsq=qo7`b(a(fQd|An_hJw%LOXNp7TPa zuaM60H*t+fjeA+2KVtStv+J;bMU_OVBEtyMsB57oHpK zFjR#)A3wHHdj%&}8(|8{>e8nlL+Sn2-NQdwuvAn7>erYv6j@KyKN^0 zjMzP!x*#e%ekcIizk-HV*#t=aF~5rGmMAM5NfYXstEFNGl@NfNNpf2!hx{l!RFVv9 z@BBpZ)4PihfobiKmNd1`&^!2T$9Gi8)47q4Qh)LeI0LD%a7SjmluB^k7K?n3*?VKt#Qxh^!Z4G>x_;JT z_yTuqx0U+l1}45MwkL}goN!qB4Cqb|wy|YZ8)$}>TlexNvP5J+JZbl-D5ZH9AO%3% z5s&YgsT_K(-JebYnR4{~XAn1g!+jG;!O`lR;A>S-x=3pcQ~+4pF;tc>)~7OW`HNdc zj8myH&r1U|GH*?|z+5vSDKsA_E8SmzwG6uFGCIFTy%4OcMrbf;L$lN zQ(H;^#@m>5C_fmddNTCpp?U4N{r%A3x2VZhWQ#8ROHSDlF&pdtfjLvuXgQO2uhWJ` zKeakLV1Lwze=Qn5kn#q(;@rtRrNlqzh+4?>)p4tOhxzQCKpP5Zq%$VNc?{s0m<@Q} z01zr#u^|z28x@jouPo4#kF3{Tl%rz-`Ptn4kyieZ{PGmj=S1JY$pS3$=LHmQ#T=Oc zSib$+T)&(q^_LLzzTNGT5~S8v;4&LvQxoy_Z3=l_<79{Q7hJG9PFwQ^h#HHBIK4->sU4nqs$@ONz1AA@#(+P(KqtTgh_P1V= zsC_*j#ilBaub01p3>HrEcT=C?Grjq((A0&hG09wTk-%batOw+&XRi1eN-p0H!Hqi> zN6cP6C52OKSEq{Gj;!;4l~^X{({F7s2Va|wXo<>uABJijGc_Qz#QZCIq0v~bJ^A(m zR>_-^w2g|#)0xr~H8!Cuc~dZd*QpE?0FXwx1IB_MbxCvbT^{THB1Heui#=zVDRz)X zS`9;6S%%X@b@gJ=%60>~9{xO-?qz+O3?XiB8s($h_?j6*0zHZ{N0tfdZ>}Mqax!W0 zXl-oWJgINOT`L&`BtN@VzQwwBsH@w@TIa>hISc&uwiZ+CT^*Bld@MT-w4=kIEE43)U6=;&8w# z{vx&nZB|w_ujaBch~D5TgL8%>;t?k%*JgEQYg~CRm#XN#fpxI^>!@oj*1C!xXu``3 znnMgfVmi%D0za|YTPgy`VIZmaKQ`8&MV_j_7cV$CHSQ6=O(Weau|9`^ayVa;9bU(@ zTBuu*`Ah5-IUH<7oIfig@SQZSD4~i}(|3d~9t?g%+jn1j9E{nZ+NQ2ULFi#zkkOA0 z`?BH3*m3x*RO*}4!32}az@{f$$u1M*>O74%byTZ3Xq%>pWD)EvY>2mChNv^dJ0OQ6 zu*sLDML>cvZQHU3*+e~xYtg=n9m$ic{3nOZ)R8u!wL>V!ZApn$emAw9!7J;q%E1 zHj4fa%`tw+C-tm;aYX0OH5B#>btL|WP!<$+f2D7?6}fO_M6H2l+Pd_3#{UB0812&I zp4b#QSSRrwzCplmqKj z?BoJc!9-kpqCvi4Is71g*%fhunCn$YiSd_}KU{TMx`0hWGZx|elE0tGEdoyT zmZCWnpxXPCPEIwGyBt%q^;gU3Yg4)50N>$io)q{AGKWp$!rC%?pyFxGs#m-EMu)7p zgP--36faJ5L@Z_y6ECym;qt*Tmqt47pwtA0z6_s~@433bc5N^W!KebH%|fXm9QmLh zaH?TKUzh*H)F(m{ZFS2FR{?TK)^|PqZ<=W13PM%;>8gS_D9@sL1lUPGarWOQI~$K- zM$plYTgg}9SKyHX?Xz=e?4vr|MFxn=UU+*yHgh}q4}OVtgPKxqWT_=nP|)Y|uQlL* zLq<)hV}m@LvuG$dWhp8zIyPef`s08Cm=Wb zi~D3}Aswvif2g?HTUjdk6MZOiy-H}LQ5TJ34pwj7i=$GicC`%@b%86p_P2iJM~7{d zt7rfD_3tpnS6{DuR8H_M&OsL}{ID4#_(0N)ABmIq$l9J8uf98MDM^PHc3BqyMf1u{ zG?Rdb6{-X40ILAZyCf9(Pzmsb{A3m{h)UKHFRGaEojPjQZtGPIuEB7O->S?BphQ`6 z#|{GWxoeJl6!HcLU@xy5%Dpd-Q2%O*2v|pf!cHG8L|uwgohn4-(XdP1*65IQ_oOUx z-k35Sq48O(Qe^{sA2r#h zrpjdwqxcCO`1wCHK`8QKB=!S zR+y*sE4sc(r;THFKa;nPC9B+t@Jkz_dU){t1~jYpH_Ac3lw|z>oIAy<$wOV-@x;U2$b~{am(#S9^NUo`){XM1pGxwmH*&S20FoPr=YvXG?Ic zP$Kti9po0rhmqy>+vd^BykE$qyTZ;exc)-tsnX#^zs;_WcNLkkg_!5tcrqX|1=oS* zs%-b-5T<$#6Ci+Ohro`z-z5V|1vS8^MBjs&>0l8Ii;mz9L4p*glOw=fYoRcA9yhMw zFRYd=I#OC7{4o&82H#i_Cr5kulRnH{7U)Esp$}`|Twzy+lJ*LE3x;90P9S0mk!*YD z8-B)0bz~fN+9d}AGwfNdsQo550*A3V2}60EEi-eE3T?!-X)iAPzg=W^x7x%wvu?|r zx8Gb5df02|d4^&p9CNhq-p-F%kC`&eSS}KU+tYHS(pq75*j9&a?S5h(zNK2!TqgQC zpg^ZWty#IY9A#(I^RTY6ZtdRSJ(^(CIH1R+BmZNyn`XFk1FE$GU`;mS;j&V3^pySZ z>R^0~{>vcjB^59=N|KVqkkh&7D=RlEur?5hQd88+`a@4EV+#mg)ZdIHNsCDxWgH}g zMksJIk3eL!^PR_5iV2)YJZw|L8cq~WFr?$)+jg088hRR`dl;f&*+GJj93SCTxpCl) zkVT7kDjH9Uw~`4r1x9wm;ePU!1#eBD=GtWL!zgV=H@`N8JyPs-&M6)r3Z+|ausMo*Nh@Y*1NC9z_lI0EV%c3g_g>gw12 z`ynl5rQZ{EmmRPf{wO1YSmcGejgbCD%u;n4ER~+%!8Ba9T-=-^W+zQy4MoS5o;klW zSU|PH_aQv)BxKU1ynhMTwRGG{(1{9J4P8RDZkf7k-1)>1WH~(GP4whiK$ZK8cZKd8 zd!SmhsusOI*UDzsPl;n2>uC@&!fd^3kWI6k&GUzzZCdxnH-dNcd5}qft--jt2hMpR zd1DS}>SwNI`A4YAG4DBEM$}#7^|;3iUWvrvCZcYiW&4W6qjyCrOmnh+qa}~y?QCXh ziEDiWGuZq%OASn)CLRzJFP;)qwoKR|OA=H)G{p1g_i43?^n^oepmw*Wl&!M*!F0Uc zja8+Itjquz>F{`87ut}cM~s9}U`orI(E=D_bB;3j;}p13z{}|;*d;3a9av46iz-jM zVPZlQ56Ylbbm5w_>y^t0^d!az@Eguczy+->kDq?b?KnjrLLo5ST;hC^{G+HuBX=7J zWBXF!tuo6-tqax(yDx`ubRA^61N*rBH1JU&ip=ivr-B4@m+*q3@&Vmbh(z<|m~UV4 zmaD8*VOO7xK@l^&PcUngU&{VMpK0MYv~!-WM3~qT4QJJv?TV;yy4$4O1$n)UC+MwH z$nRQp@_?7*6X)eFI^0R4WW`#*a%{SqC771V7FSpp(0(PnlTT`185fjW%lf#N^eStj zb8n_%FWWN2@W*`y2Va=7?COF3V)S3oP73`4KYGZu?6N zt~A5kU&j>}-jtq2IqBE8cZsjv8HbY)<`i)@sX-ke1XOz%r8*6pOiOuI{rdhX(b4cKdAqwcYxC-m9 zKO)jE0+Ssz;Xxyt+bkJE_v-W_5R~!VC1Tc0csPRm}p9YSLptt zwinp#aCd^#&R->tT^L-L@uW)PL=UjN;q$GlaKoi99u)WoFUx}1Cets({y}>LHnGX& z<@cC+$8jS(2xm-jHa53XXpv)NzblbP)G3)Av}o*AKWv9?!t8`FT?FW;X5k5_Ztreo z&hisb!UjkwSoWb)z<{99S3BMJ6YFG>)zY|XB-hDAZ}kwn$80O-F)&RF+YQxE7tB@<2^VAHc=XwP~+qjc#knp6aI5Q9vj7w zHv!^(!BmgrVpP+X732=!i*ee}lzr)*s#M^^X>vV}IcM*^NrXUR{d+q2mA`l(plsjP zj~5ahlNX?>$O*m7=#V+G_J9U?{^&RNLj%Dw!9;a6#fG59+q>BZFJW;7PT>4nbeIB} z>E$YFGDw%my?7XzOP>fwR&I7(2l}*hPJ|Nf(p%Ir;H;WRo0a)BkU!225VaN*8{+Ao zII|?K=!K}aPdVgRbdJCc`oxSbNS)!dyrEe%j{##8Gh9*}d1FONO0Dk#1&JDRo3G*z zS#oKOwqUkDYmh>CuKE*tXDc2}KAjYIHP5O`n6P?UR0`j@+b_pPo$IK;6rXzsyc+%x zDGCnWnZplJ=C{e2DXA4wkIVmo93DtMwgvSG!*GCzXaKeI@z=$#e0Jcd0LttW3v_)- zMG4REP1adsejo@M2$m+nHcsLLu2VZ>YAd1gtx+6>h4{}9=oq8TNL_p4K?M#wt zq)+AUfpKmKPsQOBGNK}nxJgjge&yazYJL7F_4(&3XgPS(xX)oaBm(UEkupPv#1rN*a2w_T|OAX$xX+$qFtV#WK2jgnx@a4 zb-}Hu^*7#P<-WgP;x?gRY7Bm1VHm@@wi5@D=ahBoBIn^7!vc5Y-0s+ZeTT;r)_dtd zTE6f#ngJ&IzFlkT5AuEFIIQ99H1Gc<$Tx=7rp50@Xr;fVq=62#P=-=C1)16`-e~xa zp?GtQ*^+bvR(>u9a70ldC&u2;@7#OU!ApdK8mMu_xp@pBWH#8-mq{m1mR#mngLN!} zM7WTxp>Noh1Je@z)rax)GOx3<3w;0T*MfhJc+vugj1JPXxyR9&6RoSd9tzFta&xmK zZ1v;I^|S~1fXNG^E{V*-8whGpuxg9|vht$8yTrdFH0I&l^{S|xGW|M0q`?L>ejMsL^vI9F4p9(zXSLovsrik zYOe$3@Um`ph?&Z7^UO3HAAsIakF#uL@{)dn0t~VC!-r4Kfn(XnVtwf7dx}l@<@tD8 z8Y+!QTizqWPHgSByEGWkXljRolxWT3EkCgc084<(PZC3;2ft8vxozSXQ$~Q}kw1B> z8nPaNH9KyYcD5a2;@y;=9Q&JLyXUAKj?z2KD`n$CE#-_eaqS;*<%Te5PuwYH_`%KG zOQ9cWA8OfW`GKzvsM#k1aie8J>JcD@Z$4uY&lHU9CizVJZG5PL;CXG~k9sXhB~FuawTwpZd;+Blye&VIuZSs@Hu*yw?lP}C)+ za!I^?sLsZ>M*DBfdn2X$*Iy}ip<-1OnHrR(xC%AEGMVygBqoom$YNSIKueY0$09vR zDhnUB>NJ5uXqOpLsw5Z!apwv)uHdNE2(j|e)a5I(E*0H_@W9|hC{7yF!St`zw5*|* zG0qxY20=z(WZEjHmPg2b06%%a!vBrtN_kkJ%@0pq6u;pc_Fx4Mq;!>5W8R=~@GFEW zwj$HCsFKk1|M@zF16coT(%OAA5U%CT28Y_p=4<>}Cj>UDjPhwqqt}`rUEuP~-{|TG zHqh=AR9bbAOgQ8&!T_8ZdF!1Haa#U7wWad{EUt2W-@qq@^095CYATHK!?-Ga$=OnW z$wPr7mnJjNh|7*eZ4{aOFlW-5O)WGYS8RI`#0tw>Qo&7mBP&;BN`YG;h(*9nT~9QD zU~@h*q>;ufX~b>yI+(MOQh|UvG&u!b^Kcp-zQ3b?9cYfGwELrv@oS3OVl$sYf2{mz-`7TkL!egaxo@2(f+dcV;t$nV}m=#*0he4jxX5IO7ffW=aeq&DQ06e~0O zlgb2A_-9`iw1^9IZ>B%NdNwuA=_5A&GY#Hbnphc^mY|;X2b-I4^AJ|Bm@=!U+IJ2g zw>G6pl619B?4Sa*{(r9ZK_ z%o>j7tm|iU(jw2R6ah?C1wH2cBgOZ(59q-cTfA!h_c<_ zpf{a7+Cv;ht5ViVa9>eZqL&>Ai$vuhgjDjKyyCGFS*jC_iQKxoxQvfGG*uQuwkvu|aDt1x64(S+nCcS2@`^Lx2 z9_WqOZ>dzWmpfEhJDxFNS)}wO#4j`6Fgh`kZ{)Li8W9gjATfF^i#FZ%KGO8|`B7hm zM`Fa7YWzio*31s~&AA@9#C)_jtf`0J3y4Jb6-D2*YCS)|qGugSP?On-)L(;tIG~@J z*9kxhf3lFD>D|*Ah;@;|mH5(V>%Fl1j&4!nesRoieug=e3j18r43$0J3-F|c)5zE) zq@>%V=3iIB=}LqT@6&6T_ZrP7gGyw(7uHIT0Q8q6BgC`+9Udn8xh)I}6+2IRh~<4Z z&0z(yNn=ozj2?g8nf4sO?feiTmMVxB`5bVy#_KLPV665J@cQ(7OKO6Z@g0TKdu4bQ z!cPHHBhb>b9xh8TD!2$VQuK=&tGzU(Gk$X^w<9foi42Bu{nPLdpU;WV?z3zgTc~P3 zEpq*^6T{3Ky!+)pp}f8FK|9l1Ok78@;%jTW6}Jx;F9o_x5sx3U^+(j`!5|1hphfv> z(>X2v5)C15%hLVq(xd*0zvI1MZB@_5*j%x2Os%v|Km8kSPs?9xlEgOL(E(9(jOgIq ziv=u^AUL&>?CDEHx4GB=PQg%9HvoUo`P)Lo1J%?%{j=25>lwt--^x2F5X17dMGYdb z!VlUrD#uq3FS0e~LOz`Pu-%Y|5R0{8p8IQR;8=s^Imwn-$+sWDubTi%k(2`#eoY@f zY!e;%)Lm~m0$n$#lXFW0TA4mbrp)1&e7nK2H=(B$VllqsnXz4mvMQBdy?Eoh5C@O6 zXv=wj^AF82yp_+&Y@a7He6ZP=i8`DCH3utIIM(iU9tYz*?#I>M(nzcl4c{*>%8!|& z+@eS>7ph9g0PnUpr!%e?d(P1v;Krk!5X@YT>EK{mny@7}gmp5CLgwB~$@m0^3P5qL zY&gezB&7tytYLNZF9!S%ZTo5xf}jK_l&g+ zt)E&2Q?3y`dArea;j$g8YF`SFyK>K}gB__#3w)F7$bM_cO|K|CL?p^E5{xG9EGwL z!KJNU|Sb!xFIL`eVbMCOr=k{(nU1x(oSg7or2Y@{%$iscZ> ze`Y-&YPvjMYOE$`Fl}*yk%a8x|8{Sj-sL(iI^ixn*x=$+-prV(ris4CrnMS5XtmDA z{OJ+Q$SEq2AL45}zC?=>G4Ij``P+>l;yYyHaU*ytiS zFrjIuXgo!;v>9Y9QjNo~=M@M@JE6hcs=cQP~26 zH=63(siNss@ZpmYV^R7xhqHxhL=S) z97IgD0HCyMtl|$)%jyB!snaWIGQkkmY%Df2l5tRu`C&iO zFx()Wft}vX6hv^y+YD2t#f#c{4>agxsA3=ck^(21r+so?s07&KU`OR27iVO zL((p?%;DxyQq4zAlC#^1ei1;*#YXWo2+9A?*)z1}+5zR@t&0jpS6#?y>6I)pXCaU5 z$tq?zMjJr;_rt*&g{Lylal3y152B{gRNUl5F2RYkwavjT?SA>=Aj2a~PVQLBQ!Sk0 zOOw^gDJE*=Dy+)&7(!~PhZO8EAELUjlwW8!2she~g}?v3OS#5{t4JZ*W)n6XZ%;jG zODuKYH-t?Jf02sZ@2v(>5QnwCFjurEp7Bp!>jRtz_+n|iMb##L#U|n)Z!5MLiYezR zrw3cZc;_#nwychW>hA;a#oB2e9qD?g1B4mG7~}XlF(k~Wr-e}uX8>IJiIz$;egyJl9N&Q7RB1U#2XSCYL;8q~wXL-?iWaJiPef zpP>pUB$EJ~3X&kY=Rdm%LM@-EtZYu?mETQ*PI_Ts1#x`3leLx13FKeu6wvJ;;% zb$9#D%}TI0QHY?>MzF(F_?Nm0*wr0!#>LhA!RBs=?>hjrc|8m^BII2)`a=+TuKO}s zOm^_FG!GOVQ4RLd4T)L)S_y6PNA|p)ZE$NEAl6-*{#M_s$i#IH-LE`R0lH5WnCW8= zYRFw%9BK`V3^al7Ij0gTrW8!!FqG_)`f$mzxdEq=QR*0r+)^X5oAGM*PIF0lO(f3# zLJz5s+E7rHp!qwcmo())h)1D8dA3(A!|dXj5=8*TvI?=SR9)w`%`?vb{VdHopWZ5- zE*Pv|S^Nk$wlVe0eLlX1N5+X#Rz=W4z!fSq`2)$`kfy-Y8~LZCv>quqv;$&Mla^}X zEje+^SW`jMwGg#28<(`7d7$2kO=n$-7xf0|%ALYs3SVpGjsfHO(-CM}AdZW1eC|f7jVmPMTgud@RY9qP~i(XIWc#G)jUBI*?FVoCyj@7{}k? zNz&=^LcJX{oi5z_AjO`gzs16SNDIO1VA$DUKza{a?I(Ld(*|0&gvsd4O7>l}zC#nM z9qLHBOQu~_&~jVto2)2oRBjiUHqBf>VBUJz#!38 zgE(+@@Hw(XUc7Szu7SOlp}NdM;psvDvGrl`BoxZageo^)*TF$nIBB(0@6VF~GXJ7yP3Mc7V>&y+^#D^nm%((C%;zV=m~=7xJ702M zbppkcFtdpaPL`;6xkF9c5&^mei<(@Q@gE4{9zfDd0^c~UXx&>_sXZT{_eB54T?#S< zs8~gxm|v0~)8L{n6KTc9vH?uYXc}41b?JY9lz!>u(nUc&BXu!-ik?+#z0Mj)4$p_6 z>^;PQcIA~%%pzZIfu|UGPfaNiQiZzK^h#YcUadwRO|nn)zp(+0!h^5+JW+haOdS|u z(Ks}6{lbOAeO(lgf> zjoCWC=$kb9y!Te}L$R|%6TdL+Q_z?&4VnojzP#J2@1P`N4_oB~LS)q~`SiH!)`Uir zH#31$oaC)KE^Ug1u(CfiKwWUD7J&+ak}FlHNh!I_1Y58y6SazHoymvRZO?q>tft@O z6Bv(ob0z*)CHO3e#+FB?GM-FpDhaMfJ+&A0-kSNj^QgfB@WnoZ)V89mgc5){MaHBY z-WY7R(|IM!^6B;FVa|-X*$UDe`ifq)62Y+wU$6VrjJ||&I49)>#*8DkkeGASq?c(0V156a!%woD6yK7hm^7FItLSjG{ke<0FIP$oTlz=aCrEKO6)( zxlV)IT%?yV>5fU+vb0Sxj%8hX7@WjD?1%S?<*J-kK+!0Z1+yM4PDZ`b>aKr8N9<|5 z`Yf-xxZ0tA`p!;y@YR@3LPD6|&JC}M>I)PDWVv58X7FikTV z`g9m|Ux(vRbaUZ<)ITChrp^3^-1IXzEsGt{MA6?nn4RiJ!0!pQ+BCFcecWokYD*7mHK3 zXZd79%9|gca=pdm&7Z2{ouF3$kU8Zed2UE-|+%-2N9gHeW1 zEI%tZUJeeWzR&T4QDbZ47EjO-L|rSoEb9_pC0e`eA<}m#HllDGl!0X(CP%{C+R|H- zGHBZ896#5iGnJX{1_>5@CHr&Ln_V7PvlFA-xCLy3jCbU?roB$_L6Kw;9@%!}WOg1B zBi{G4_9$#Rj`rT1*Zy<`yhFJ6#6ubG-C}%=O?U1{f4E|=0RC}14%<9-O4IRqPaYSn@-A30s3BnFTx5G6uxE6I8J?!$>>JS1#Xw8r zL1muUG*%njx}2`dJ~@JFQBA$t-kX0=%DD$4&i$jtSY$=W1Nz+Vn*IXJJ(eskEuOn; zn{R4tB{Xej*EIFVu~i4cmq=xDqcQPiiwkBIWBHyzPaq=8_Kx&W7#ncEEMQN+Al* zqAWwoP6U`5Tv~>Kk1)MlG^CCeJlHKlWnum`ZL_Z(_sgl&5t%H6(rHhMI}f)BS(k5S zfRHjp_ooP+Df#g)_`_h)^-`W?Z?+h*VGp*+{{Uhwim<*t-n&RSBDAou^+uig>U?h# z48fI_Z{O0#|IILmBEzfQ^+I*Lb9Fb|^u{TsFe8rCV?lOHEZKU`_YoNct8j3DbdCT> z8Kd-iHUns5KQ7*#p#l8EjNON{US>#MCZ9Ztlr{jg^G0}z??<}Ppnj*`@KawiYH;tj znk&1GAEg)8CVCa=qNzNV#%SDcAug&?f1d>Xb|9lHV$!eis=EL>VYJKt$zw%0r!^29 z|83Z-$AOf8GDO4m!0@YMtpm4gYNP&ot)|>(KdZlaRMsLlHQy?dHtaWr*#*aOL=S<+ zmkTOwt7Ov_0H9@?mjoRS;nsik1<22JQLwQA$V}0%S4Ok*&`1e&49#jM^FE{n(YIQJ zf3wQc5seO{q^U{LRKz=gY_*+==zm`O=_#!X1Pl*b4*=rwpvGRymSzXVG_7gFIM8;* ze&pVaR7u2xiw!YMaIJe#s}K76n3YectH1CvoPxxP!5OxaXNGaV5(pOm(-9V7K#TNV57iR1 znAXap9%qWcWRC@_OxDE|6mi77_AQyy+Hgeb#Q9I8t~}*GqV{`f;9%76n$H3}A)*wF zL|LjMVfvEzNu_l#@AJx~=2j9aWE+Sq56kylaEYpoCA4s&h%(PHfDVzG-vyu_F>4(! z;jnyX>WEijoednT?}HZ)IAP08Zro9GKTLi0`|2MLDSYvs~+5Ah-Q9UU#cS^O}~0n{3}uAyTMroK0`7w9Bn# zFFt5n|L^Z_sjhO{NhW95l84o7{@H2)K!T+>g;orr2{Z z82}w8naWw`=Ti7bIqZH?eo#D?>J|P0EX36Z{Mo!uG5pPzYa3fIRNeKLR6Sa6&%FuT zqE#-JjCtx^LyzT*b_n||!!sgZDq+T~vMa_mHDr7+Xb0?h#>{f605>u)J zoN$+Y(BqE4`hqll|A-2vFosXR<+da>CBR%6XiuXX`1ik;g+@c#Xd?<@#~jZ;BJ#!J zGHy{QZjxjQvQ0(lRcE`66j(F2$p|tTq<39L25xIGxXzNC4x*_r z+xo?W1;^LKHChT`ctJT4O&FqxT&sAR3r>9`r{zXhRNN@xT+#W4(+!;b)dGT}2}5p9 zr@{PJCkom~IuNnUBhv6w&xx!)V!FpftnU|dL`=}(x{)GmeKZpLr|2a7rzDeW<6(b^ zWa}LUcNSt2D;yWWwCTNm@Bvu^4czGwJVHLRWUZ2ijFGdS0{?3_niSRbAU)0JxL#`| z`tz)icOfzlxPxXoh*ngbmki!tIb;?mA?(T9= zZT69Hq})gdpmhlRdh14VyZ_Oxi?D#Qxb5j6qRGxoE%elw7vR=$7RH{#O7TD0E0~^= zFhESNtD?f&I$NR)SYJ!7_}8EDoF^?n(;GjNe7{)z97q6iewg4=x#m}|t^$g?0-wMT zz7=FYB7%WAu>V(-3JxQWipTD24G$tO4GPF*ZjWo;jqFYR7G7gL;z_UypWpZ)#8W^v z#%-$Rx1Cg=J(JKFA^WK4&4I4MeCkB=AX&ccnmr`M=~L06PBKQzydZ@vBf%8dQ&`YmyThUh z-LrKlX|HB|$VG%{haOCp5Kk<-NO)C&*=BP{%#fiv zd*7F+pUQPID}wRRnsgjyF=nyTJVarz)90}4!bFL7jd9~k$J-v?xW$k0PBYYd6-=l= zv?J21=hpAW9?mN2u0u72{ms5uEcl~PL1I=3R^-jv?1(9-@1dL&LJYkpRnzMGhK70AjVEJtqy#=M|M>VW#zw8suI?c$>25O>ct1jU@&I;zivB15CiLBv(@1uu(YQe8$ zTZg2>fuh!icZQU4E97(8hsess4Wx43-&gqGh0UrW876n)QUllMHXCtVg*mj@P?>_$ z3bLU77d)tu&-+6apQ{7q{>VS#ubT5rzTrhQq^4@Gx5qg1JfC}nVOb-oyBLU=FtHq% z^wrva{baC&ZuNq-kDe2llr_}_AM(gQ7S@VP%V9k=B-UTC>7tKx07bOQKuuW_0lad2 zLqm#N%X{(?_b7^ld#S#ZcH;v(01_;J3mIpx;!t8dJyABs+;$C9tu+j_nl-d0i=|5rd-U_pzQn;~)USi_1!3u|ALSw&0 zH*DE>E+qG!tC-5h<{f-Vq{>Lr>h|{Z-o{xW9R4?6jxcrNhp;xY>z9<>3a*UivKAP% z5UtvUl&tIB-W7`dbwf5i>_#iM8Xm&|5Qzdx4CPX^?~0<0!dBx;axQhE4w!@0Q*J-m zk6ZH}1mLJ_*$?!{x8?Uu8?mT5^qS)xO9A8PT!4@!h`_N?Gq=zt|AWTVVa}ZXJ%lQJ z`=fX9hto6h03iNPS?r1f2F&U<0d=#+`;;gOwE%6ja;vATOlxh$@5lO*hfjW&65Sg- z3FBH8LTh3Kc{poA=SryQe^`J3KBP?IEqc#LAFeChcaY#eq!Wr6V28A0))V>@!e=W5 ztb|q8HPKz`ZoM0gTOg<`14mx<2V^a@7=`>P7Bmo?#KGcZEjLAc_k_-jo=?y}^RBd6 zQ-37UUIut>WqZqH2N($w7(Fw4;RI5TGGA8dX{d&P7mA;Fut!j!dI^2bDH}<@xM_b)8DE=4Y)9PA^dyZUP#)u&oA7Vfj zuXKe1z1vrt%Q26jm=m=X09&1^#eV!7(a$ct*f~sK3cdYOV#dhgQ>KWhu?eyHw7nr3 z1l^;D)|Cg3pY`~=spV5C@yY94`i94W;krNexCTq&IVFq9Y78_p7_Uwd`i*73&$eks?z-l29M;&zSQ0UR95zoXuJMOe3Jo!_311Hu zv3Wvm<{${_Z+u&G5mE;>)Pdt#NxU=^xa2e#$qxz`McLYAiI4EY2i) zQd^m;5?1`%Y2SJe+(uQ%VQhPUPK@R6PToelF=#@wK)`oG=I{mizIIq+{SLD>cznS5D)T{Fo?s5Cwe<#gx%0Il2P(7m5%P>YS{SBf* z-CpiMd5($(zXc!qAmOC!JS&|nU=zO@l^Y1;DuhQE@m7<|Kr=w;~?w?`V3nd&yoc z@hEqarXts$l`5GWUxv*tx|HIxQUADd?Qm~a@B3#O_E<0dZyHc`chgfPF>@$i=Jf(CCOKL{MO9^# zWygCo+jIXGv!NPNLjGZ^X^j*g2&Npz$PiuO1DTIlDSU8*Q*Y@mx!R@QV z;7tn5pXD%pdFyLUWn7`vn#9>>fbF|lcxTW=&E3kc)*0*dk*+wEDK2UeB?H`RbK{!W?Ya3FKGSPtuO% zqZZD0W7a#0w|j}W_*6(O)GsZjHe7F>EeM_9LnSEbtB2B=URd5|&NIj>^h?h_?l|57 zNr*NMZG!%of96upH6_osV8@;VS9|MEHl7y>wWV_9M_PZO%ueW~07GYYrE0!>Yh*o` z6e%-Dn>pMP_~7TV@$I_k6EljbkwC6QW;>q{es>m}3dMj}S^b(IV6I)bxx&%N55eb3 z3ZHNgQd5Y9oaVqn$IUuh-(QsC1W`Oa{VG@Yxt3GA(U1>O$V|#8^%E(2t|E~HnFwxa zSfrQpI`;FE4>&u7_w(j7OQMxXEOTWEJ#sDmffOlBW&Ao4_!IO8-z^*bbj1*KmDX^r zV{E&I=ds03n%}S38h&tn9-k>o1yAtD5hYvd?mEs1I0yD)fc-cBU=0$3=v>k}Im%%U z*um159qaGF$#fwBSiWT@w)u@MAF1rM9z}GPGvMMAW7F22t8+}TQNmkMc@X!GGL>(5 zb+>I0d8zk4SMSKifIqTTp`luOi`6<|+WHu{nMRxB#)a=cc$chhTfeMj+Suzf)X-BUNslA>lpfC>G_?J!$MoGRmfBjLpR?h!fiAT{< zOLm^M#ozE@R83KUwwFrVg#t9cV-tN$F7G*;#qL}m_&v01anYajRvk$r=HG3oETE%adhrLwOVyb1vS?pm!s03!g z?h-)w6?xBDjP~0aa({=7drR!hx)BCO=3@8W%SNN07s04dt<@MPXcOFNjX8wxETEO^ zZ&92|zsG-!=e#VbV^}qk47P|@=4W#gJ`>u)7Sipot$V5m z3j;KjvF5F45J4XkwA)DqN#gFPs~9%&Nx^w(P}40Sw>6Wp(B{flM*IHRd|s?HwE|LP zJurzJBuB#)=i7WWv?18qGgWiam6ErQUn3^*exZ z933LAYQ!a|JkGlSi}T)Y5{nmMF^MU>W{i{c#px)8HX?QwtY+M#n!%ia61S5i9X2XyLrT#EC0yWQ><5A@6(mr8|DjRYcVH~LSZv;pdhYhLZ5 zKES_3k{tpZ6;``=j%k(^iFkXmz7XemIJ(Sr%B+5T-hl`Z|uN;uS zBL0Yhp7DEfcmfxB3yUs^;(VHLSrp2GAxij9D(=>vvIVy}#Z%3iwy|+z7o$YN+PEeA zsA!Rw>XZE7Q!+@(0NB3b3=qXS0qU0d{>iSi3D`qB_I?d`ByuZFRo5=uK32D&hR@}z zDnoEM=QL}(s9mb3Qn2FClD;q%Ti=9-);N{}!f7gKD!p$>SxFj81UYFsZSO&I`;oW^<2nHDC+=uiyQ$*gC@kTof6JN8m35T;mV zF{T&itjBOvn?}#!bKf)sg-=W68k`N(!MnI(9JIADxlB0{Z* zQH}*a(e+<7`Lp)Rwsj4c1alQe7CKrLg?D=K!2F3IF*hL~2Qm1*C-BU(Z#-V3e*V;3 zXAnx(g7cYj^<^b<8fgx2Wh8ujFr^SVNI;C=FGm~XzC9yAb$|?I1Vp#z1wz2lfh6C) z!-BJSN`sH~8ZE=-+VyFpd4;VH0o(=mMf!bAHOLf7t>_T2Of7>=<`4Lk-ZyZ~m$!<;{n*3SKh(P!gOIQrR1_R(XoT?~-Km z2=Wo5cH|IqFulNkTXWIy4NHMq=jB#I$__zeXgTAq8<;9m$=4CW9GW7`D*=m5j8Ul% zn|g2O0n9{Mfshwx@MsY|ij99AH0h8xg{z}S;&Zdzh|C}Eu{GZUTKEy7 zp5{c+ef^?g=@{`d2-ID?1`9M`>adqB#tX0E=YlLfcNlW~gvMlQYD6?9*dVG1s7NhLQ!2)j;%J{5O9kcY+4V#+2zPx)L7ohpr#Xq_HR ziy|>=CH@K|>Q5f)6D?ZaeB9w?pyHRFzEb)l-V5M7aSc%VRTw2!DB9Gh{J@`DqXw1z zB?Xu(eU9R!eI*@I#OPU?EI=qpcB{G%I>~gT@e$9qFiM#m7*XE&0D}`s1fCO=kAZ*i zVmf_1PyllkU%4~fEp6Z6U2~W&C&XB;HeDuYN8~FRDLeNd`&`~~z|%l@W!b~Qsd-1R zNL7(S;*_oR;F}~oe_JeS0yw58vq^QsvI0H_G}v4%M`c;5$teCyH%6$yq;(x=3^Ohe zxmGn5aI^tX<=3^W^w%wK`i9D;e>j^qXpDR{h!9RbYu3xdNB~7731dUREyCf&!3VU| zBKU#z*esh&homqP>~uY2@E?G=rx-(f?A)N%6!M%UJzN|8iaAq3Q{UY>3E-G6Nj3Bc z{n#}t#?~yI139VAiaUqiXCYqF0NG?1ySC7*Bavhh3A|NbPIo`Uyzpt|$tS<9cZJT_ zDiQr;dxw6>96cZjd$f?{e1YJWGg8ZImiS3VMZhlT)wK18b1cpzG|BZf%CM9(9{z~6 zq{37qPnni{4#zvrb+jZIz|w&0j=iB!WU8;xSV2AbG;6gKYRMiqA@8sF>M2yx=sT&F zLy59S@J1dOj7eS*+lJY|t!sz#&1bm4{Gn+V>Pm|c`^?Qtj z&KF+Rf4C_&xd?j25TjD5mKAJdkNq z;?^sIv2k&W)ta0IJ*?nDSS2C4C9?xqTdf5;m)I{z*OT~oT@+r7L9EbNCqrw+586JD zF6_xp{K_Ly8ZCLWMtZ2K|IG2y7&92;qU`6iYm)Z74gVgGMrA<)&>%EQ>PYdHfJJp< zA0R-fWieF^x0~^nzFtID9&TJkF>ZpsNp&=p<4{UA|4+C657^X~!U z%USmMa>&!_A8J7mk9!}5q4Nv7dU+738zk93-AUs4Su>udQTXqqdZb@vAF$$D&p@)& zBf%T~J0b@}fJ<`wp}>E9FBa8SUQL}xn&G?E((EPB`^NKQiObfn1;a9kjQ>pTR_-SN z&et-9T+HR706aA;jp$W+_|$-!P#ZWLLV31bq4=ibX={D-*r?b3vCx`Jt2{5VYZh6jx*tiv=hI|G^W6{e! z6+3~|7AYlZryznJI>JX!G*p4QS`!QNw=> zEO#KoaC68@!EfT6>+OR<*nutz%8^rESr}sjzl2sSuAR$BYfFp;7!a*@ z>i}+7%dP+Q@TV&r4${J^sD|#X?6QcE7KR2m`1#=F6d(e_j+a$17F8d>j2;88401ao zdBND6jTxp2G93Taw5?x>r*Hd(B}ElvlTK)PLr5J5^R?Rv6K|c&1dPz&0-d6=E-+pCJIT4&(E8u==5nwA<3qaatuN2?B4Yl;B^u?>T(PEO2~oTb z>&9R9tIq8X`g@aiVLke!JAd0`JpKj|4KWPEMoM6E4J7<6=Dc@I=lJJm1>OG+xiBh- zIxMIfVwtE!B!Nf84d`h8Ct?8{3n>8>03KhTj~zYIdA=5eH_4JXQl%{DdvLkFuS?>4 zMx)aLlq<9D+y7nZ#y(>V{XOD% zWpJaat(@+QCXTy19N663(eiL2e^$Y@XVk0(W;QXK_A4-_2ES*m4g10O zF@bb0qfBBP1zFqXTwiyuk35KKixh>`@!S|z7rQ_43sW)(%?sPAHap9-@mFL+#(o)JZso|DxT(`Nvi{IXdE)`u!Y9mxDiB>Nc8?$t7NRAAyB(?lK;vrc7 z+xw|+VLUra0S4c1NH^PYp0)4p=o;el{lFjmu>3XDu0vk(!= zW{l;{#X#g$O4yX>&;F-+~&E6e6<1fF-G#m)DmM@~TrS({QwPc8lqdq;_oB`wsoiFXrF>gdVBa4#&gG9>j0(ak8( z{Vp_4J2QU`LD~-=p~{_+DWz@40_MoI%(;NOU9K2a5DYd0#^Swu1rVgs zJrZTiual%qd!|ax9nKP9GjQ(vQ=vK&{0&sn)91D68Gb?U!k-rEG=XRw?DR4bJw%Cw zI3s&W^cd&gwKL)bXsI5@D2zh4P|Oi;vVIgH9yFWSXV;i4iH{R_rLZ}G$B+Kz_{y0R z??cOa4k2rH5wwn+qZf(@exvJ9&mRshmjj~BuBuijk&rF<=R`7_8qi^$O)$3FAWGfr zgc!-)CY-HO=)D~}s$ej%TkoDP9ab&EQkI;Ly5mq4>5Vu+m;=DPjGED%vp-S^gMk}4 zhMY3|ZZN-ttUF~5jo$jB5M zKKFz20U6pJpf-+-&#z~b#TvQUh!ASC4byp#vboKTf3~UZn%Qr{X@Z61R?6WN493z5Un6fL@UpvHTTGM*HwO9m{zHc(fm5$H~XRy z?a_aM%pG~XaHV_sI-Qvw6}S`9$$ycD64RB)Ruly8nZYA0a1nm*?$fCm5{maCgmQ}P$z#Wo9eoHirm?hg!W$mzwfG0mL1^8Kst##)C>+bV2RP%}TYpCl z7@VF?DFi*=dpAUZ>m8n2AsdgO4b;c~_p95mX)BI`NqLn0_UMfk)@=feb%hHVqa6(M zB^QAA>Zv;4Xo|PpUqCjSD~T#`mEl6RS!W;~uHwi7>peya&bZut5mwa$$NYloNXFP2lJ(n2}_S&-=( zb3|Qk0*|YzCw`YI7w}yWsitDYqmUTZX~p0mk-c_#nlZd*F*1&aJGRUu-gs8t$5kuU zX1=X6**U;1?2I#j?benzdAmbvC!q)F zQDo!G>Sy0+{y zEsuX%My`)-259!RLjBuvHfjIBs#Z*S$x`8Bhy}G)36NI$j+2Sg?iGn|`R(Tu;@j|E z_bH%dI(z*QG{Kgqtu~lS&ezO`OSzabItTR#izCL=L!D}{X)t_L5PqQEz{*x`!3RvS z`!VJ^C=je_$nQ?yjjsAS<8Gr!#Jk6KH3N}7u)bdAS%D*I;4Ca;roq?im_rSGq%}@v zRewl@LXrwWhO7 z&B1u|M$0cVvR5XihR7bwO)wgqkjRWTgYY?qYA4vIMwj==NCIR^E}lx$lP^M-94pVR z;4PrcEvl*;#bE4+BT_*qgwq%VUk<(|630YwaWBX@hHAu;CaImI3@EYa2&j1$D!eIw z77>K6=Q1Qlja{-u!4I|7D`eY&X)_7x2^9CtA_^_LMA9X9*Eiofx!weWdiIB<<6$q4 z$*zB*K9Lap9+Q?)bjP5TFzRVGe#8Cf;&ep57GA>u+O8DW7$yxkM@LJ@ zr!aZgsc-^eV;XJ7?@~V)cPPkeIHtlUJUhO1&L2(wf|x?@J&2mfD@K@;p9bZL?!Pz~ z9N%)NKcYFq{;Q`hH8@qYpn?*2T{@Bq@PLoPr%CC2&=iYGB^=NkGI4V;+A>6_3gpxc zd~6E!h;igzjLo#yv#_22PN79cg~Yy9tD;Yvh9M0$Sj0BB5ctU>F*gl^|mEZWlPTb2COQa>0_FKn9<%IBCv{83B5s2#A1fXwGD6hTg00Ma> z%cZvKS(#E-x;Xof9~jIjaI`;Z0Qo*NY@LIS>w2J-LtWSy)y=Mn@PvMQ?1&(nx+Cz79{@yuA$RU00;8 zk`4@>dkhMJNIhVJ)mcIrwPhfVcv{F-D5L-&5z>HnkDSJ4;)`C*^bK5;FC{wfC55Q^1sL;KR|L9=#qU`;u39i z))U#1_yH^(`a!F7t~aM{t|FhE)x(nA3sx%Jgu0-$ob9<pvZ`iMyrL9Ev%V+kRepD8HF&us0kcT3wow4Iah~G+99lhTt6mvyFmnOPvDui1_vAxlmyP{3 zEX#gsGGnQ3?gSv77CU{`nNcO?&wTxTuP{sWQV1O8_EXaa`D>9I)SX@OfxdjOTpxQ~ zQb63gnkQ%#iZqhp@OUrBR`JHDN;4qs6|fRV6X`KmutT4|TRiWUBjLj>XB1`G*Bm%< zf5i|amk`LfeEh0y9Je34*VA3(byV$%N{ut)x_~Kq#%4QQKZ2cpk0HO4Z-8p)?iD*n zb9GF(avHWC-*1tl<|K{g*XrhSf++m>7E^Y+O>`zXMIGqMIPmv^nsyx%4Ui6o`tE2l-kEf=l25ccv#1CRJ5N!i=mcPZ3N#Kp@>W|H=;yvVfW+X4TQu0h#D_$s z6Bmg}kU$tdy1R!($RQEA!*@KRl!6FYw;}9&|9`ZTlpG%8NAatnyWoez2sQl1+ZTg- zbhhxPM{Puv>ZJwnlY9v#@Gy_%CZ>Z*_!ttMs&-HBD>vsHeNAO%H?aqb?iz4Y!x8Ve zz>+Rr7)l6Q*KdwvX9P3>-02f=HM4@4>6F#Hdo*R^u1+UyH92Na;eYZUU%H0<$G0_m3;8pQCmYD)&q$~;Q_!AbSBlx znnrb*-t`QJaqGiYL1Rb`UD|b&jLjP>uv*?=)-Mq(PV3;1dFxyqQy6ytu zctVaC-$+w!jA`tN9Gw-vW^UB<1|GM;-OAO=c63rh@JweXTfN?g!p zi9@>XYmYB)2(^U*Gc6gTsXrXO2Na%2X+HimII4(hzTR;)KAYIHbT)z2Z|_{h6Y@@E zj)c4N#>@eLlYLvN78Uke)g!u}j=>M$saLuh9R|f5biQ`~m3IvlbnKKswP5;lryEP! zCD=hYS@5pww`RgZ{Qij(4X!xMRst)nQup=T1;mfgiSYc&_P>O0h<2k~1HDcO`vOJk zEk-q{@0`JkH6h?J#dP_PhMlP!sxxRpt0yyy;Tz38^`z!XQ`F@y``$WWYaNP_+CCel zXS!++XTwLTg*z<&gOi4;)IO?CeRNv8=o|g9U~_968jnW++!0p~NLe!?EgX@HxJY$wLy1 zye_K((Oa>%3|95R<%hKk&IDTPe1{EH|DJ^b#KPQ=*NFnrJi=1LPx?6&)I4gva!;s+ zR(jI%>$V(UI|$JXpzw+HML1-?ouGEn=JNN!837e?YH&H_iA=8zzOe>(SI_c9Go6I` zkHw!v1qNk4Ldo(kqC?iq5NRE^bCHAXBAZz<-tkn?p_n#s1;c)(BRTh<3>>T8@RX449t3qAAs7-bLrSk^UMUDEQErt$Xnhyw zJwj5vg`H zn~vNqXj=>rru=fph;3M0;zwN+2UlaIYCga7GZ{buTog8(PS)9XBSAvvW6N=vfRqr> zN&E3cr79P~Ro*5D*fT3pGiSaf(x-s7=E~Q|GE>gL)OESgYG(a=pH`bx9w}n^x}&`` zh>o!wK`{~6Bnkrn3sbCoWdhg_eVATm-Rbpat%)EV*4~vqd-);xy;$vvZlt@0mbEfG zL>c!{M%_6iWTD{Dxh+Jn@fKt2o9{;9Q1h>mNgE*Dq3xGsa6Et26|tjeS{&G=EpfWo z#>r5)F$2t2wdeYY&r#bpR`0^;u@W-Yz^Xvg;0mTE?DbV+|L2r{StfEWZF z&+#b9pPnb4w$33Tf9`!1T>_tOeo~QCS<9}MlkH!!J&U_XQEOOmdY$2 zQ)M;Ay=80Z@I~b@Yt*ttc6j$1O3ZjsP5`F6uJ==ySTrbI$?Gze)1T?S|BLB~ajx2I zPxV2b!VROsa@gNHV488OWU$`s{e6*xSs{RpnjEo<3Yjj>@qpz}c$}&Uzp8 z_OPK(Q~S05%*i?^T7OdRvq*55PBa2EZ2KE4iJ=ANf4Om&;y}9yYxJxC%tAg$uf{pv zR#rGO)_p_c8aJ@uAf$&mP{&5uk7S>5=KAOy;_|4^7(1mFS@0NQXhjoKiY*T^P!oi-@u*_ z8nHMKogfe^HGZ0mp2RG|OXWRrD6B7cYS^vjP|-;Ex^!+fLL&$^M0yM55Kq|I;-P6W z9S)0Z5V{X+7g!LLMaDp^1scKw^%}^IydhKzPMwMWUv9dMk3>C$^5@co-mrY=f8y8d zQ7+p^>@Xc;{?(--G9elLEBr`Xa7e5RVSTDnW|GRb*5v$K#?Moq5|VB%wypTfEDvOn zg*3@f=QsvM0F6acYr{v^%J<*By~?KX&>|@?KkhA}DyeH(v`f-xD=Fn~B_6QbG^NM! zN~dSN#G_eO3>5;w0ty#;OGHUgs^l1tA5+Jd}7_g!2FkRI?G5J*PO{iiuD zdo+g@7Ib?UDZwzW7N@9#3Y_mJ(QAVN;eDsUMf6D)vWk0QD*=M^(yo=~IPmY_H(c>M z1&eA?tE_bqxY@wlTCb?&2~P4RUu!OP^%2m-*~-p#Str@k_pMIc-1x&={78zqBjh!Bt!p zfj;2<^v%p5g11oKJ)m2Ev3=OkOnt}ym^ciL<>^)TGl82+RkLHF;?5;DVt&(+&Mgul zxUBR`IG}cKIaa4qX8gA3c71FeT2twz`SP{0gywnuPJXSu=7!Il(i5d?cdGV5*@UKHTpxE;b6(|6c(}e^$VK7g z$`C+DV3l^;qINd7EJ^_<;k37=Wq#3NZiZ{G;Wtv*VP9^$)<75`iXRalB17raHBD!M z)U2l(K0-3VH*Dro)8oJxybv5qIbms|V%|wqK58iyc=n%^i&$}WL$8Y3(d__Z9EFI6 zPjb?-4@@-;d&FCx3=j6|dx^X{SGw+rLXE|2+7~p!W^(aXob~xyPG6~}`Sf8X8|G?H zDgsEh6yxYbVDZ*QH!{k5p@!sz1JJ)-!9mxl`&s{{C zWk&5Sd%%!5H43uSx99L{=5)J^yV|y`!razYt*QkEnR10$gayB*;upuCxI(Q2qsFZU zZUR)#=7ExtNl$1N>olt_ z98(jpVl=qlsAu=YxAG4AEHbqY@JJLw9L^KZB!ol{BIzE!a3*Lsej9uiZHCzhD3nXt#x&r+>zUaX zMTQi3=DR?q!$+m%3hF7kdrHwNgi!$@DZcRMCPBn5n7(2mfVjaL`fc~|Z)thVt&NXe zW71YTI%@zn;IOE&q`ek9#~?rxcQiPQMVPi$Crh_TMgg*FJ8i%BgIjB zh|i1t5HaoqhF4uWXKNKzHA&swH0A*i=hdkCW+m;M^;82~aoNpuGKXbr4Sl| zV}okIt-7x4hHNOknn0^AfRiUhri@&GxS#&lKPd>t-_`jK4^}(%)TA^HApMTWHVNOsW~YHWQc%uqQ7k$# zh_~c*hEI3EClw3R)FYi^N`g<=I2zzG$?6r`J3mw)kJl-;ep z9us(lz7%U_tr37>gVk2UPpD074r0>GV$qAFpXWXs9}_EeWgEoG(i*uE2TF?TC4fh6 zU*M9iq-$-^Kg6721M?E*uO2aEZz0o_1j%c}{S!NsO%5Jp8Z&>w3PpBa*PRSxb2Icz z14yaJ?K79sgT5sJY9nI(c1_njRy)y@MwM2^zghNr{yvcl56Uxe*aqK%x#TG%g z-NYR0?;G>Wa;m8-H-vx98cHdRKsy#~n1O(v0X=CU)O`|Ugqr=uX4a(Q|64UbBHUmd zr5_92z-BoN>8eIP0^Z^A1eW@%Y~$F-LRhdtvEw*^F~CDII%;MWjIJGIb(uT0RB8eVTadtsL}NlL+cNtKF?K{}fz2DlJ*NKq-t$X9J>hDCn)UB< zp|_ArHn75HPV}q*GT0!OQW(v6150g?4yDgV(|_crghRGlM;Y^)$cp4@H` zH4!35ZyjB=>_t)%gc?|N+8{xnhC3`3A&dLk+RXaJOZ9GNX!%VNQ%O*d==hS?FHf=6Gb$+q~+)&(9$-e;iz=d_`WZy#aa&N_RMJuc;kJl~NMg2=4qsT8{> zl-vEc7whP>k@C;T6!>nFKa9t?O+<;g{eY$xZzfOU?F`6z8_VVm4F-@)=ZTfzq8GyO zyt=K4d;FdPUa26DsB7=8m}c%E!F^R_$XJIV zEwIkN=b5VkyXv7))uOYTOZ&7I>D6|;*Cjt;jivG%>Cqa}95m-ELUg_q>+^|?@S3CR z;&rM^0wTz^X6pt}Ha5uRaDeQ|Y2z}>`e=YWrEHJ7wK+upp6k0j(O+;{P?f@?3W|Yp zcTqx$%03zxl{NKK1?js-3FL;AMMC`&^$Cn0sP)6K@yvQ+4-519=Im*xx zo7{8RBipm7atDpCfjrFC(H|N?1ECMDA?Y!#$Cfwoljc3(XGN$N%{)lyTDpeQ58GZGK z6&3tyarWp5!nElTJW(6s9-;Gs6)F{}XP4 z0!)w~(29q2x=g3f4TRTh2tA-|CVvB$>y`(|m*tpRC__p$?sxQV3tT~xeULj0B-=F1 zwfe)zAb}YN7exisBiFrSK7Gp7&StIGcny+teYN*AK+Orf*|u*yZr-}S@9Zci%IJIK z%25bR)59ErZ1NQ?=2bNZ$(N3Wx}Xz36j4|9$XNFq=RxH1wSRdo0vPFNIurmYhfXA6 z-15iCS+=#nfmL{u^k9wbO@DTa$WO8%Dspne2bpxYZIv_smAPWBb0y|a!Q5|AQpJH!bjC|~q-#5kF}hCK)Idl{WD+O-bKXa7Z_`7b^?Dct`QP8D z#kw|3J-vch-M2y|NyH0MrqW_TK-iVvO6P?tsDqBK_?V&Wqd+7ur$b{~T@=Ynk&jG0 z4&vH!)w^Kpldmm|MK-ecPQbc#8#h}V1-Gpr9A5jm`=vE%;g9_nrT5R}^`OjJKspHd zK0G_SN1%c}U({VZ3dzOc9EU|l#vX$0dH&g?@7}Qxl|W#cDtjtJn1wDMHw}rkYhA{# z0KZ^*i5$?^#r+;un+&2z)WW^L#rSjH0$#NuY|xi8bu(%~yJNn*^J(GQ2j`sqN5u0+ z?QiRj2i7Z4GOC*UqU z+k5elE;8V8-#On*fHFL<$Uh0#`NSN`6^}pP%}^#hJ#l;ETfW<#pZ=a90X@RvIGa4> zb!I<}GTAmA#*|75)}AFqAb`F_zEKT;l`66u64Ev0sg~=`ztJT7HY3A3(aQ zX%#GA@mxj;18&@PNA6K8)9Oo^y9YN8u=aH9!R zxXbDPjuh^l50+j@WEVz3tx&$Hcnt^E*3Ap38n-4(fNTqfS;!)NOd(L~fU`1@G4bTc zw2rQ{;-W$sK@6KyUT^x?CO>b`3$?}+%xK__h$;}ap{I;HLHAx-g}OXGQYDR|h+It@ zC}b)F-0#rIEiys5Yw)ntn&>mTBJ)u2s}7%YrKZSgST6-Nwgmw`e6_ z2FJPlWYvi%Ft30sP?;^BB$MR6k}-;r;9?*k@X#i@TA;>4zV3_EN7x9Gmr$GTWGY$Q zGj4m5ejP*sc7Re7e{RL7we^eXTm_An;BLX6w#wcLqn67C5ADi1=r~o#=vR{(6K1wm zs?|CI+R|6M1_w=4%S(u}>Xn->oM?WT-AhSjQZ%V$`-VVp4&eI@j>j5Zesehb%)zVW zK_WosYFHq`(PJs|gCf~e2^x%~v~r-X1zRz{N=E0fJ!Mo)v<%XitW7m<69AX&8itQv_B;&Aq(MPDF%Fjv-9iS_-}I)vLEZF0-Pd2znE|tQFw$k=__`|;L368* z%hiX|)qP9c0^F({zQusbV7z+V=vg&rTk#ZhIDepk+ew@McazNU6-9LnvqtP@@u0IW zz*u(Sa*M{WuVemlPV0*H&=T0`xAyx~J>^G zk0qYB0BN=ZWBkD9XRyTiPfQbRAKx}=f;efX;5u#Svk*SjOg|~k&swgZ{wk3Kc)}6< zkJ~ECqhWVVWy*0gqnk(yMk+SzayIuWMAPm41=mOcmbp$8GT5GdJZ4I?nM z8RGM2MGyYQkRNHCiqGpYXxLXz^;yMn*E0u<+>hG6;kn^LNO^6IfYDC=NU6-x-_6tC zVI53?pGrbT4CrFWzO&%ONj8Iaz}6wf6*pPHtksn_Cg4+gtH{DaHL5%BH3={)d!b_w z!Y*H5&)V$3P^_<$U~Wx$80rOXFRH}O(_zuZ;L7c7zG3S>Ys5eKkLIlLr81@`*WFgR zAA^ngi5FDoGL?w?pw;rsaF2oTt`r%6u!OKos0WD#7Q^PqMmKmbOX?Og{z(D-V<5T& z9<^)%BTS-|LXoUA&0c*CKAHJJKP!4jivNjamY=QGKf0es##Cfcl8cr|)hRn%t?;yY zkrQ5XJWc_njrkvE3aRnVTqUzhlaZD_6Tx3-%y%vgeH_7N$-oxHfq2mFriYk>Z`sK= z{~BO$ta@8o0ZHp$W9T8G=8d#*%*|(^l3u$chRA~at}e)9iW`>9&$`qRxva)-$FUH~ zb?U5-eAQ>5I6jQPAA^YF;1fs|_;v^YzidO;A~ow(?73RMA85K~x!UN^cwZ9vn?%gJou$+n^9tLV_=djX|rYGMUArBry8+|H|{f?2T9Eg-=A zdYzsjMTe`EhnT&>c=V-E^xk{1!97tNIxC zs?w9S1BgA|Hdd}mCmibi+W`!f<){RS=^MJ)N&vh(rmtV|oG|s~`-|#fuMI4CL}@#NjFGoa#TzJW;-@<7si#0q4mS4ktRMR9jj z@4-7T^9cF0Bz}|Ru`v{&;C@DkR-|ZzrP2FlY2rXi*mD)_FZ0@`XD^_TN)P@?L=pXi z7$=06H7O;%W6`!gx;sv*PrONSo+~XmFIMassgoCU=d2K91`f52ZVQ8Q`8n==M@mPo zv3vB1=?v}8mz>?tseEQ6PzlJ+$#9*GWAv_$t)H^ItC6Rp-MPhM3>irxWk`s!WWjz2 z!;c14Xf+WIRC@;yhR4IWtWkv+a^#+(@fOoGOeN2iMJTGBQOF`Ve)ql7 zEgU~B97j&;FI(n{*+}sqN1ji5M^boRE7d8sc~T>HPWXCV@5`^SbK@=UeQSimHxh~a zRA5+wml=Fs4&TmV*h;Ky zDehqh9+}Uakit*T@`VSd7)f*)UzUrc;L8|f6HR4)bMLL2^aV1UWc=GCPM)J&AqW44 zU>XKumU0S#-jxQ$C?KPfguxLrXo#sk0Jyj|hNRXrwgJSRdY6kf9h%t`J=j{CYs%QV zA&gUvp78Y3K4gvTUCE_8D_cW(xV}U80EX#$+_l#>Uf!cDVeYR->#ym;?p>HTvJzA? z38w}jLD2@Mnf;~5@iJWrNTpO^7iPk@wG=PD{zSR?6#&%&y}{oypQ?L~jrXdP6x&Q1 zK`}!t$zZnSxX2b&z%rAkQ)qv^vO^AmmvJzl{nSS2{#&9P{M0(PVO4l4>>a3b%e{ZC z{tN3+oJM86 zR~(ngPwr%qkgD-)e((RVBncmw<*=D}TU(x1l|7|)e^iP&Z>CSIvG|&f`=X+24+I3?{-dK;skn2f2%T4eF$~54>QvX1KYJ9YT1%b zmht<8g4twhm)rzY$@g9kY;qH~qd4Wx{-DTBAShAsdqc$%8s|mA%%}{QJ51h|f#Sc+ z2O;ApsdS2SQGlrrnXhEc>`qHHUbSe+OK8?*d2amI40PnZA3L^xROgm4kDt>|6V@0> zwfFQ&*1+Wzi8+>Qb1EDA#k)*_T0fGyLi9@i_mE-oT++j+1h12=GUqZbTU5f7QhF=u z$mm8G5=v?fM1qzqS-#o}BF zd&gjV2g}~6jH1O*K{uw4#N%RPG6Hbj8*{6=CH-GwN25wP$)b{kgH9DuX`5TcjmIWp z;~032yQ>VTCejGAI5fa_Xrt$FRCS7u`Xa{kFg?S)&L8G5R%+2ow0DgZiHFL8aKLE* zZC{Y_=R2Dq9L+vsZ=@Z58!wqDRP->v_JyM`nMzGNh&LtkPz_*?TT|1U=k#=|N@!A< zEsX(RP=bcz064b%?(@|Ls9D5o?^JN->;rEl(Gv&~&c^G0s3nDU#4))uDE96}Cbv(%d!BOUQF1#7@( znH_y0G4wO6L>vJ5Q7hiA3EGLprl|#pR8TwY1jCNA%J?4Z{w0{vA+{;Cp);-p@wDF? z;QnU7yk;p030Kwa4ZIJLSY`2?|HiEd7;hLoX!uP0VsT+ELq*E2qNs82O(T<$><$iJ z6;vyC#Q8y!SQc36$O0D*Vle|1w=jAd-%6-&Sz)}|<-(n@tXFqJ*3zt`tAHGGUR1hh zL5HR&X?5TL5rsI}$e=Y$g}4yYhZtLu3KRByQKMecr(V`cwmqZPrl6sK!|}siYsS}| z5Ky7I96|<#%xm{w$M#KjXi0~J79S^KpRAo70SrWQ6{m{W?+u}kCE)~$E_BcWv(Ks= zy6IzPXXma@XQR;b?1l($l)0l!6+r#qiG1#~HQ-fXe`vWomVyKVlCpT=M(`D+Z*Uz! z7HIab8F-P$*a4*ARNj2fm$VAjZfi|1UBG~JAWNKp;xB1jxrvpjCmW9=!!5bW4Gbp& z)MQla^6Px0;)B!U_?k8UG+-9*R#pozBp4YRe7*5d(p~Y#GSz1IoDMM=CWU@!4#jNG z`C0YbS3jwRbYTosAi11KvT5Q1%9b&;7WD&s+LQ4(Vv9*|6T`o^t8}>5Sc}Qp`XNui z${nbzJ@;R)31Ad%Uj60_n;$+|SdBz}aNgMG(v&EEMFVc{*rDIL4smk``#B_aEAE^e zjgMV$At$*XnRXPN4IJ8RoZLSOv zQ@330lpYhWf(F5Xce>;2cL6jU8RNRu&gs)YY^brhIDfFUce7%-e^D^$R$t82&nKi{ z0K>o3PRx4Mpm!@rm7oI?1B-o3XVa`x$k)Df4^{j)355Q4=ZBK~VPt znIDL4W&2778R3x7vZ2l-=lDULzPuepX^>{PJhn(W4FqPBb1v-G==Aa8bRO;OLH9hh z2K9MdJJtd1eU1e7vC{toja~o+g||~Qcp@V0^M{Lo@J^ev{R|md!8h!AZoZX@U!r}P0bq^HQFHTL znAJ%c^e5+fS(FTTh9gxZJeyENU-N=zj2rHyXH z(JiurZJGy4ODr2HE~UWL8G;W`^upM>>{?(8($YUhvWnhcLr;Z%EA?L-5>k^ve1l&m zgMmXTtXrNj1-=&yQq`YD9dD+#?F7}@Gqe2tKuVC;Hp7T_#Dig~2d1~sneW|a&Zg4D zG(}zqU$r5!dKo(uR0KchkH4$Sm2``XnvaEw*!~EpgDSAS$^c${oc05+)6lZ&^zQUn zYo+Kln88^?N=|xu@275a@2}$446FJT1W1r~S^NB9T@{i0^p`I9&8PvO3T+7kFNE?u z2ohM*OFs2l3gtiOk=Vf9F_$?!2W8jX=TT$_PB&$0)>i)wkTmr#4Amq&(M*)F+iQ7p^tNuVlKxS_KE7gGndeJBm=O_n zAUtH*z-Yyb*x->wLT&)LR;Cs@)JyPu8gyT6pOCs9i-$y=dEw*s%HIEcfl|Zw{MlP( zTAHRMb7t@=qpvO3WU?&FrjJF_euWCj$RNRwZwlX)=xtQ6AK2r#$wrOCh9gW04ds1+G^;NC1mXu z#aziI94^JS`vgjM`srfdsOK9p8r}NG4wlNhzeRd2~m>=tLE^J_W13+Ktk%hUhch7R4?%b2`n9AAo3CdjXnF7}V%% zTFxPI#}S^{xocUwZ&&ZKG(^zSjwo>dN0QcG3wn-6B$ja$bO$M5qrFl^Wjz2PZ_}IX zTeq`kt_$HL+!8JSCZ@lOjY{(Nv9$p)0U*dv!4Wq`lO2KDV-dRtOAvxA!+=zwzS|Ct2Wr7)jjSBhPJfJ6*gRr#on zPYAz_h;HPOnVurrDhb_;kG98zQ8ufHr=F}GF=I}kWNKj?U$8QF_H~i?@^P=7IRM|G zOpyGbPg)~C+ryfm3}9T#TqH&=$^s`AUP2$c4eV?d&d;{sV1 zpJL*AqA3vCj@jRG5%T-Y>2^cK>7tc9eUOT!<0*C|Iy1}eAu)ac4h)Zms4cXJ8_xK8 zk8w+@^;S(Qp8CP2A&Y-D0!^{}s z^bJRWyI2JudPiIFe{Z%A*mvtr6N_QytVV%Oi)?a0C>(spGBo~M+IW~q?=&u!<4FY>Vnwf_EM^C;n zWR@#o8Im5>#)VFP&MjW0Z)_w-<{JZ|&BaLxKdf5JYtbg=R-8FJ8vyhmg)s3Jy|S&t z+QWNkbW?PVX!1lAiseK>dPFWpYSFvo9w#(sphrAq=N-*bqnM0%9%Jpz(B!YWtNnmI1rBsw35*Gk#mubmHKc)xj}Zd&%u z)d2q&^yvc8ba5-QHfR$|ExQP;yvhWtP49mq39jQ!YJi~j?s`}Poh2$ldjx25*xr7r zCfbfz0>+wxe&I!nzr0f;z5?{`8Dfr*>iTrNFX?V#zda1x5T`N!H_;&{Ea?%`yEtf; zsbN{gN%BwsIOT{v=*EN%inLgoMJfO~lWj|#ff|u-$LIq<3Nj)Zoxy+6ui7A#84HU) zTfP~x9ijcGh<$i8B&o>)dWq-LrJ{m*2QpT=ws}e+pdo8HzUZ0OHPD3GIdXZDPgV(> zQ-5R_ngNgs$?>RliKIg?uBN+s8SZ%4 zOyazQL5yqNSk)T9Jv#NJu4ZSnzaF6Xfg)pe!qp(Og)j#x6!zUFKq`JynTQS~&3i!v z#r&Sk#5ABl$L87?GzIUNqG4O}IQ)82@`vZUkm^<0ctfGg@qG&;zT;;{{1`xf%7pkx zNg^DVz|5vIO_EI#+IqWzncAjG^WQw%Gx}`WXmh-QjIWocL=+1zcJYKbW(ig@t;f4N z#z@F!ME~Btt3x$5O$4mGA%_IL4;3+Rs99ufyXq z#CH4%CC_GfP^ePRA+~GB_%q+|VJ|~5^7l};W%W2bQ&b?NBrH;(bUZ|H0 zfl-j~VJHylHbT!|L@G6luS;G(YWjz-3;ArCOyQM?R*Hw%;Z$ zKAAUmV${y98Jr7TkQ^7GcoXqq&C`z;7H;>6(|;qYYA#d^#tUu0TGG{B2#8aN>)RC$qEhS2<622 zz&%r|%gqz7FH@eFajvV}4n`!rG!-N}#F8%SY;JQuYXIX~c6b2rjD~TIn73#dV;%7o zTn5Uc`#<~r4N?M!?6jT3%(-4*)%-0o)b=fatp!Z&%0zraCbiUu^=R%0N>;rI06@(=V|XtqTK)Ke z8)Z$n6In^f0wa28?dW|Q9#c2Zm^$*NBJGrbj$!?o47XX4lcY8^@YVp+JDqmvKpVs+ z&!PvEWIW7M@%Vi2(Ojp=sM`9(*dW?1G-cNB5Da=gw*7L~jqH#HKcbn*bCx^@ z?VM|^b(`eJ5xjP{r}jh%SCE^v1##+foulpl3Sn`BesBDBjb??IkPGLSR&QK`3%Q9SJ7 z_8_3bAgf%NNPY;WrOr0z5lStr@q=g_`vqHhdYM%Au+g+A@^^y0=9j4?e06k)GD8Y-_u3)psUDb_wl+r$W&@)b1 z1GE6$a2i(amdo+H5?-N0RY& zJS~lXt=a94k@(CcwH)TWwo#dh?JZ3_!gnV*?J(4u;VQiZ{$vK{;#wvl?Lx6(FdMLf z5fxgaWx!LJ?+l!KA%V!y2&T?C7R*?bRP6HI3U*SL6BAh4`HGokpPCr=c#5{aILnm9 zcWqYruYm}6AJkyDs<+(Ep}zH0o0vZEr8V0EoYn*~C9PqvIVJ4ViJs|9S2sfM@xa^8 zO?T~9oRbYQgUAf_IdYMu*@?Vkw$h$40eKNj2)4TNShAPzXA0@na7gd=_D> z0fo0~ue;Q2vWmYMnrWWcN1F% zB+gp4Y2q+~ymB63oMty}crzHU68Bg19Gr(vKvdZwK$#w!O*?t-#3r4WxyK)q&?7*4 z`wdm@Tqd9#i&yNeUxE-rdP!S{+wk186p^3Mkjir%ND+QAm#T^CHexlQ2QItIc4lRX zfRqo`aI=|At<=}~LL%RD+yKIiG+KPFB_ost1=vcg0`rK#Uh54Lg*hN{JEWPjG6@8i z=pk;{Z0iBBr5(9i${@=`RHn=BdGz%qbr|b!FdHmTOD!<|q$zdciTlm?fXb#2RfFla ze@jaC*=SAxKS030`E!2RcpK7#T9OEr&#t{5dWU4=sJ3}`-12b&5lksT2%P4ScJCyP z8ZYlC%ew!$2nva2oNi9pc5zP-BlYA@3SNj4R|NX4M41}90-OT*B4pkxYh^uh^yteq zrZ!+xgetHtD+S!fFy(JsU28#i#;v*ZHbAY9dPp-YwW%Za`EwrE`bjY(QU6Fuc=X@8 zA=F|Je&r3=+c22k|08I8YsC>i(9=O{a6Z4Q^i@}T@C{y-Sr-b(yjm|1SCgG43EKSr zl=x#g_~Z%7&MPWbKTS2zyF}i%5K81M13P;?-|8p+GtH-jn8r22E1N4^aQ#k;95_W> zS2g^>uG`JvP-i)$!^?lI{RT-KIZNrsB$fvbvnb3n2@7trHBFJIN}7p|<$6SI9h>XN z6SseA$a>3&0X4b56_1i2vfOY zA8)N#)CDHJ#riRg{`VDCi-aEooEc{mA2rxqy4SlxHSLRbiBQT&81yVZ7Z#5} zD$p*>$1G^@TX;homRUsiSfEovRixEe_)hM;e`6u_70wTNLC$ORTI#%=65})aS6^oe z;=Ic-&Brg1IrX8AZ8>;k@=3;s3m3&_ec<5Q$O!%Ot!R?2V6xtf5;#P5B*`FLLNGr) zwSdixdLnzK@@vHv%+Gt=x>QjYQn43wEW?9c(uX4}lt&whd+vjaRXcTQr?W1y*gCI< zw(e|R} z`t=$R1e{|eY(P0#Qk?e0;J(S`ErOIDfXZPNqL!8ge9b9p&^Y_md{|boUwUWPZw)bN zg&^PAW!rYkD!oel{Y2=8@tFT+q5E>zHEr7hmn@$&nYb?ayDmK_cTTO8&0wb$K^m8h zZ5F*Jp&ETAF$(CJMVWE(p+O@b`VoAe&FsTG7+VZ3i#Y}cheGj8_;R}AG+hpp_@F*LxLA>rk~B&CGUq%@M_m_{Efn6BnJ1CS1w8HrAY zu`AM=R|2{77Aah&tR~cW7ACS`LYm3N;KB_9-uf?)8SE1{sG-??c=}KCw6ybgqp+_w z)I`Q?75tH>)d8Pk!@UT%fv3k}1sf#=*y(1|dEzWYl=@}NcA-Y+YE&CyX;vq*BXia} zYn71v3>bm0cQalM$j@(!VdCgV?>Q)sUb-vMA(}D)dBP0MlcZsVVi|Bw+IBuq&6qyJ z@_tKbf64Z%!pAEVkMfNHu+|m>HNhJ3{l?)4nFoWe?&Qnj_*FoxzAvlY5B!&b4`)v~ z6S)NMXi%DB6~TdWN7xumwI?tl$|HLvW6dfTgshBW(y6kNCmt30iGJ(J%iC@v($(8d zc4p6+2XolKd~*FqL`#862f=dxH*T@;1`l*SG+9783Y`?%I;L+aX}ux$6?e`y5ELpU zbGMqHe(RZoZ84b8DpkSWQpuvOr2d)$OXmC_u1;VoBV&)Rq6J{`@@DzszQ;&AO@YdsTpc-3;`bJm2&sKO&$ZD z`E=?0=_g_Mg|bao=#UNc9=e&LJ~A-#WHXqV7;h~Rj8{WTgw|-FNB{%nw8ekbp%~3> zqo^z|i#iCGMSnzyh20mN#?=;5D)JweUG6}t;5UW@ZRGtfyH*mDI=%(11y4Ezbdttw z`f@7)M27qG(QS~R3@!WgjH5#odvNMR*rahVSq#D@nJ2wlIc>cSbJJ?!es`Cdq^~LyD;6?gdwJ7=0yaLrvvVm$_+!VH}_;m18X9&@2%=!??->n)8{paZ-cKT zBd+`hX`-HrUuZM@>5{uDE#8dUvr!HwiG-Zet;lCwE_hAjSy z3;qd27xLmO5*$fTx=Iv4^&KB-XMLUw00~@f4L%~d$r2+Zr#ZTfH<9>piJG+9Kz*Qv zpuQ84;#u5D2uiA>#yz&qQu}ybreJPcKjj?U$NnId3_1&aHJnx6w-;E+i@5o%99iTg z6?QcUW15@wAgZ?c$hRg@a5oQ;dY<$)kag-k@R{52>wfTUUfZhSa~M>$!0901L4b&L z7|1L%l6(HFLB404@v<>#YU#}QQ;Qly35Ger_+u0;^4pdB)C&lTM@QQ2&Zv3;T>pK) zQ?R@D_p>!TWZa2ai7_s=2$KQ(SLHuJ(BfYjow*eXyS?cCxv?XJKWn4!LdRoz@nMJO z*F+5-Fg^!dpbR2$6u_kuQ2Ki=?F8DHM=a0Z0THBRo>V8Q;O+%gp$71a} ze|pI>dG|qJW;Sd(Tg4))KSOG@OSM{;G#9Hd8A0a0^1A1I<#t!|sjk~bCmtUa@3f;B zTjdfIz1?8tO0*(iBW3cQXg0l{)=vn8(9y)tTBqlvev8yBc)UF_O_#dqotmgC9o8tj zbbNmv*>;V&R{ANxvM_=W)wP>t&(q(JAD(_%lRJaqxAES-g7)V(Es$W$J{8zXSA7S& zFhcVq>Vf~5kUd3OrKrk9lF4p2^#kJ=CnJl|Wk18@PFvZuV=x%dtgnu5d126C>(_4Y zCjHb4+#@EOiW1lVeunK89e6!8a~3_H4xytZ5h@S&vb3`Xt1T_k87u(&`D%52RhAaX z!@-WrWS+?g#-{qy=t07sqN*rCITuYR-AAU5k(YT*R^tv$(AytQjLq==AZ&xeFoB9g zh=S0S-DT3pgvj1v4fFHwDpbD=YStycZ*ty>{PzoEcwNR1)3-wT1L3y+SII2AfSj~{ znWwWV+ims5NyqBh^%Bd)(ph53>BYlRjB-P9jv`l323^dAf-djpEfMgoR3>a8ovj)S z3u+?MsR8w3bDjtax7U#R;R)!22zy*KhP31bd^>FLED;xrgj?uTB>tVi1vGG30`m38 zh~-JwwU!E%-lFeO1{Ni0;i(Hr_QG`pz(FCbx>LN0h(|YQ@k+g0FZ41;+|&hCtJVtE z`FGlC@u~g$od57hi&Aj&T!iru4a&}S+DIUy{;l(c7i#`#oQZ;}V+d0XW2|{(dx?Qa z21-RBQ{W7t&J^#v;#I)`N2A$J8x^=3gyadn`I$P0z-;>6fLUCk(VSeQw@gKzbT#$| z+zF8|eN@P$8fG%?<&VP3fqi}&7FyB6VwU55r^M#9NTw5ID#NdA7XfpCAjgAS2g$s{ z&O2^srt^1X>kMkYAdc&7s+_oR(&xV$U7a)m8>DvC=tRS zU=Z&8>Dc%`Jlzv1j_BavJ%Qc0wXNZ6sR=c4xvlad(!H0Q>EVu<%MEM4mfmT}K>!6=`ZRJ5eaCYJhhhivEwrl7LXoFIHW5Qq2 z_BfD0)K6mg({8pPMQ0mA_RAC(1;|y@lYX{*%XeeKxy@3|YUvy-gjky`t=Tk7Fv#tF7 z`*{m^LRZUc-eEiXouQm;^K53WZ@s(&hTcG%!RY$%fM!AY-YRot^TEqY4BmEWR^gf_ zc_(<4nG~d^NPMc$!bO42=@x(vIBfnXd-*VTa^l!V6cYoEGzz(fqI%>&GW3Lz95eZ0 zz0GVwDt62dA5ewQXLixX2J9qCjtro$?zI)~^=Cjid@KDVUf8F(W*{@4ND{^AE`)+? zq^Bjuwpcg0D1feMKn6LGa4+^eOeB4Qm>{jc70~w~#_O@ZH=#&vjWHuu$tXu}NDUt6 znBMpc>5WB$N^#m$v$eQv#%b1Q8-G_2mO;)s*E~y#@0@-@Yl%djTfvOl2p&dr;g?6% znU3v?WL&nq7tCjIgMPCYi12#Mt4I9-qosmV$yAAXIzA3cg1w3)?SPMK zH?vXPR};&)n|I1Rw^CF zXF@rrYdSY{+G?X8aUEnvSY;A=d`GazJlQ8;8-)5EEKP96O65U(5gcIxF4Wd~s_|>t z*26t^7qvxBNz9vaR{xWST`9II$1SYVxh~bf2A(wZNTbT1=_f}{WA%-|acs!MA2@!J z5>~+ATZI`up?o2%i&qS3UrNSU=lwj02I*%vo@_+c0?*1e2jy=o(Vpvnj-B0b4Yq+(>*k2M>1;ol$nbJ;aV&Nh z0861$yhMPnfW3wfNCqLDAgD=}tNUDBlQ5IezOhX?(|@h1d`>@TxWo=iyV~@nB7FRe z+rUz@-JzFS@a>BM|N_fJb*I-aouoaBeUu z#`w9?_4voz2V}^woOfvfu;r^}axfWpvP3ayUg>4tP}H_Jy}NTW8N&>VZ=oe4($5PW zWU|yCD)C|Vrl$F-Ojkav?|Hyh!5YZ2n&@zYs^JNJYTqlBhypa<-Z!~KCR@2I>N_|d zoxl{Q529Nv9sl5@Z;X2+)`of2He?w%&gJr3{T6FdA_OoZi8uUbbNJ2 zYf>%mA?O(1-rlf{loM}x)g#8Bn$EyZ4zr!Qzs|F;B`_{s+~owk!=sextJws$JSMpH z>Px7=r*4b=?sF7(a!9)yxQWl`#YBu160lSK#I_&kbgKItDG!^fZ`IiyDDp5ucb^nL z2uJxxX=zq96uz3`txK>;oJe&Es}L5|2Sbxc-+gZ5{aXtx{k}s+8%odBceAvzUzI6v(Wr)tLv6}l|?*rkHU#4vi#4ED;;?f`A^RUoULA= zCO>5E-bkd$)D)B;;7-TWE@hGyAD;l?MOR*jxPNHa{VuG$ ziJ0>>py67ErstY6Zf~r}U=y32%=SjE*Jo>=WhsX$Hg@7u83 z+G9=-4Q1vxM+a%hQRuhWYv$*W625(*PtwVQNL!*SQP}e6BMp6H;)5*f95jXg26R?W zC*7vgXSS|$G{ZLMNhiLNS{EAow?%Uykb5pv$SzU^VFb*IYn$1-PIl7Mj7R`Wq^1UQ zmNrBwh4cq^)d0AVF5@*wPg&(TvF>Q{fPMpv`P=+qbwxKslG}s%IHN6$)Mjia##9m= zG&m4vpKtGM!vQ|48M=fNomxM9uX85#8FZ&2{RMg}ey7tbw0%$;!8VF%AVTF(+<+JR z&+Vbuf43N;xH5#24oh+`XP7VJWoi?y zl2J85!-F6lQ4wvX)?nh z)e4!bF>i4-gabpaN0TzfxkssShlE54P6wL8`^?Xx=l0u*%PH|0$PR2d=;6#3^}}iv z!TAvJ-!`xuT_s!Su~IYNHpsvRAm`l}1WJ$U17su%DMGb1f@=az_)&WZIF|ym(N!L2 z`ftGLp^%Q(Pe9cVSt#MlT9&mO(lAl(Xbq+m$AI+|(FE}X2Zofl()$X&APoY!ko?ET zj4pSr5-+Ol7c}Q2$Tx=mZ~cjlPJc+KQV8OV5e$pu1^Jkt`6IyRA5v=?0`x(8*cs-R zgcE0xWk`~zBlZVEjybulx!ug;s+fUDUq9&huIXrE#oGrjLxC!VhOet3F`UHS8pmpN zrW%Y59^TgJA3ar6os3l1cxoZQ2t^(6)YT`M`Fm7vTnt}TfDLupI{*ov#=Ijw?oPV# zGS@L#Nh{KpXML=;0bWY4Wp2pVis8X1a*Q9Hx73v#&QOgG(|$UliQ@&%?`)|lX1NW@ z8#4io9gbQUN(+?B>4kC|d31Oh;X^e)F{mrb*JBAo#M2t~tvYVsJ>xG0RooaZZpwnW zV3qs{abGq^8U8m87Xy1edktm74|miA#;UezAOMVTCE}J`gz~l*>@1wJATLYh0YHAM z@S+bcAKo}s>`(Q05Gjo#a%cwDEi_>Bpo`LlG#ZMLm}Jwh7}r(H)vWQ1ZSa)zf`!yy zRH`3NWCKPNt_GHKy0&3GEHp z5-yz!$fv8OTWFt6%KO8ox28+JEyiRJt0t)3f>IM& zv*h)SFC|~T`gsoDB(4AzPaid>`OiQwmu=osC3afZCxm=qQ6m@gHoB1re+q>vD?y2D zi0?g#Ay;X`nSkZ+o(jxZ{YQSiHh1H!7W;0W;3JdJfU+LEc2^e{>k-tO`^BzVy2k)=Y@{f&RVtDHK-%c@yrjv9)C~b&AR)Zaml-qJ# zT89NlAhy`5XNfLyhsb&@rwIxZ-c#f$CRFMcMJ09{oZ`7!T$Tg-Q%)6EKwXUM>Tg55 z^EVW1$HQo@NsNApv^aX(S{jb_2+^~a^)H;TiQ(-+n+QJZc&vjt6spV#2*ixK;+dX0 zX2Jm6=3GZ}ZCyg&wKW1B2lHH^b0bLuSxKadzD~Yw&fGd(Q^a+ty*09@)y(f?;0S0H zE<`3;6g$(vrDS%5xJIurq~RIT>xLS~ut_gKcxh#8VI;9o;nnMsgZ`vM9F9%%pI6Kd z?Vcpgsl@!$XnT8~F0Ed&Qe@(&ULleNwl&{-;W*?h6Xt)+mY{)qWsEYY0zs z$WD4x=~wi4G|U4gyz&dm9Lt0YGaO!nBsqI!84M(yku(y$Ssj>S$G~LiL5&%OyO1>g zYVpd{TR0(Su|EPxQKHH$n&V{7VvoY>rtHX-) zw0JcJy=NF^xKU5>dHdN}Z^{=!+ zaa3lt2e=s+aP_iZ!#^s3oHNUgwmE3jxP7?>roP)Xo=LVqEp>>1alFaWTh)d?hJm}t zLJ{(-T*jWmvp!dG!4{nnsU*HoB3lg^ct;A!frZ=C+I5AxI_blz%ISP z_zB@lGR6+%)9d?7+=f2&e+J2K>OXpJ|6BgBMpN-T^3r@+55&@KN9UnoA5ti6Q1ddi z`K`~i^&o&s7A>FY^np<8zK|PPqtMfEdA^zyoL(a^;jK^7b-y{#VR~Rp{syu31v4&& z|5^J#md+;v%eeUWbE?-|{ALYcKIrp*l3av1=KKK%338!=cC6mO=K_LJ9SH7BRgDpO zk}3;R+6j_Ch>Qf)OuhPRe?knJrP1?=@eGX7DsC`&=y4hr(1ycu{RwD7kA7Yu;(xerz zE=eE0l>||X z9m55RbX1fSX9@?kHg4$*xF|YR&_TNg;S^a44_~h}2Ap@7xJOyIrezXh2Ycy&E}DTJ z_5Nx@PUE^#aOY=vrX2-JlJgR*Nw zM5~~18tZa>p=^5<$nbOkC-|+k(<_eIK_i5 zMNaN%f3lS<8^AV7IxgzXCcW#&-lrS*ZH!je5>6pg{hQt%MYvq)ESq((SFs-c86}sx zNo%IdQYq4ATaA>JWH=~$OO=czlpf;OLhwCEp{V)2qK|oZ@AMcOFbQF**k@nSLEm@R zt%Q;;>fxu$Lo3i+>2^|Z_)W)18=aq$r%$qz$)j2I0S}Z%F1A7WgP<8)c4sdCI{j)f z)wpj%=#)=pjpiIxl=Us{m$A_75B6Y8&*iTdjLp=w13>C7owZFa!y%j;QN5(Qe9v=b zZ@e`q1A`>^FdzLr&@d^h0cEkr-$|Iao`0M-}Ew8T&ZPg7P@ z50zv3Mi@5YbX`-~#K4j;Bj&^!G9pw*DIA>LJQKEwYrAm!lQ2dD2lr65QDO$(#c{J)2-%(wYdZ(MRd?8fh88} zDxEx9+hT{w6LJp$CU(>n?31@*aLhcETK~42p|5e}o-!(VM=2DZ23>PS1taE8AU-zj z${W&ymnkpx)Z+3qsl@5qOd?V17H8Quk|RK*{<-9c0jNd^;us(aT&>Vy z4ll50SMIm50mIssfyZYV-5Ktg;cm8-tV%M~8JcF#8eUiC^#ZDZY94=OI`3dK)$s{f z>wet!GkcRFve1CdR;N=JcEq2c;q3*XV(rk?X4)eEV7U%dG61{IBKs1JY)x1Yq8mJ?GAG;S=B4rwfaS zz9{Bv;L>emBV!^GWXLGbCeIISX)0(C?!1x!`m$JY^(5V-QHM-%6t*1yi zqumvS1N5(gWN%R;v%?N1Kw8HkYQaVI9YB_%_p`gh)tiwz_c>Z3kIR^NzU2@C;8`im zQPZz&JQ~}WPCK#9RJZNh3xBo(<^?frhTMi4ydfJMQhzl`{zzi^%cdV_3(35c>1)!4lej>o?p$xT6teekB4K#l zsS3TGxeed@nZuLXxFy>FSEp|G%|`^RdYEJc-ssU&2Bc+ry|;UiW+@qlML9aiw*s;d ziyvjI6r`(zyzFdf%1dq{9F_cOLI?^wlP7158n#6yISeNW1-gE#+`k=$vo{?wc{~eB z&H8ba$`hJy9A>CWbb^vHCpt`-nRza$@#>o1<(H?4^uZ*XVaX{T42Sn+^E9Hxkor&b zn95V}Ij$Gdtr^U+6 zZ#D08;3$noCXfp)&E*K3?4z6S0Xe*;j$+Kk(Y0We&_PpNUPv-X1C5+6^AZA2GP67} z+bwP@=rs_E$sK#IA9PfcL^g$r^L^t@2l!bKvjAgzr*x&@FPqX}dj`bhzZ^2!ofiFzyAcz?~bT=WZZGxKIiYug-2#x;QY=FhR6mBgHj-pF%L z)q`+k!l+S;HDe{rRCpXjf_TOh|5EtFub;K?aE6rL{}C)cYLK>Vo_*JMRyU6ZU>Jm`DsK+ta8WP$_uo9u5Ry5JX{MMh=!YOO;jjWA(ho?BJ>hV@%EUwyWXA> zA%11>e3evT?k!b3X+mC@+xmthhpBY=u}GdK)QT>sDuiTZl^y zsiyI)`tj9<;-Rc=zS(e3&!q#eVWIDLZi6-i)elYqf#%4>u}FVMHDEUJ;!kf}y`YQP zVVHF0$uxq9HRiEIuj^_VjLUdx7;3C70#513X$7L0C@-_Gd8I|D&Koh6w=XjC#P;^{ zL3IOZ4Wlj*obZGs-?rN~}-$RI!3tM}?Ni5~*Uf)=K+_>lcngzuOv9a;ubt z)oVC93{NL}al{wv)`*XtIZnz&Lj95eMgB*fi5q*-y$RS-wWR{6d{xwLYTfZ0eiaq- zyx zK7+SyQ2KN~f;0P^)lGz0A3sb*J)n*mdCYxf15YwXxre><(eyU50rTT$U*y6C=mrLi zT5vlNkX5zF?|W;?GX!U>eO_-#t*p30x^GN{Ud5sOB<$>L~QpFMMhcfXJ6Aag?^d` zPVulA2v^9jL4r6uh+9=^qUMlK-e*?~DAfWLBM2hl%9&6l-mz9V--{0#GDbDzI6T$P ziwHVtg879l0??{g@mAH1%-T=$STe4778LNyT84h*@?Fjm2yc}5(ZP@W&^4s^cS@iYLwtsH_X#?}L)g}AL3mRg`KC|GZ+T7z zz>}?X3v2q`$}o0@KlP39 zw(#WcXtSjlBo^twFmDy)`lT!+8!F^;>!p^n^Q$*C_N|)BcS9iwM!n|lXolCyU;Wuu zbs3ii0+19di`Ar>$TT&loZfb!w>c&Q_G$(Ehu<2SZ#uN(VvUh1JYAsHZt}Hmy@@3y zs^Vo)J1eF9I3>s_9f#4(xfTntQj!r}GxF??vEp=J@2N63Tx zf9xOa%-K`WBE!XHm;#TXw_Cut%h?h`G6X;=TtX#B*~GLrCpXNv0_Jdmmwo{>!Ly6X z*BvM|;lZrt%pY=5cG9nUA8>+kHq?bi=NxA&MxIdHw<8A8mKNb~{VLoh9=6#ebsoT69xd0U&fySF zQX;40NrI}O1cSDA&hl8^M%X~(p8J)qHpR$IU@7E7?RxGpYHm*_6bC;eS>Nj_NK_;o z)ZUIE7je%pA8lV1KIhB{t@`t)b7MZbI{Iw(4eo8=L`iyXK}Ih7b)R0+!OMiG1}^y( zOTeBJtpYUFOV>9u|zv(#4&I4QUM}*l9i2STn02But4jT(Q>;`C! zkvNzp4RJ+~TN;*EcgZX>knlep7d!L@hYW%#Ko-HB^~MPz-PBKhUsyi>+|%!>z*`nK7J7gZNYu-{ zMEBz(OB02MtnO)gtc2Mktx}Vi&?y-fKj|OzIPM1EEM*rvDqe9r5pVGiN^q4fi{3Yu zjc1ed63Yf-3q1vD_J3CP%bS1 zx7}GUX+kx_1>)B|j1%Luw@L~zetCYFaHeL~tLPrA#vH6!kqr96UM)c^ND(b`Kn)0| z13uB+3uw!shte9ssC5+d1(Kib$-fTS2{LN(OMqbbiTMf4KwirWX&fpzh#!~&WL+{L zFCf)94rQB?&(}Zdi7QrO59`)a-^2B%`Y6>^W|^!7A(4n@`Gk@?)WqTG3++gi&TeyJpn%dl!3J!rR%^8JzZN^mC9yVtVCsH59P{&>)m!CD`9BP-$O`J z6)L1*C2=}pr@0|rY4I#Q7R8<4E%4cHd#?(`ZKN=?te0Gw#BD&cbehu_^o{85= zL%dabXrQeU$ipKPV%2=D7_`XrYpA8*TK|MDZ=+E)^-so-#mnrW$ZaP;z&4Z#qu6?L zajjUpN+>^=FUMpO$lPuHig?Nb~w54ibvlzfj*a=sgPlO`M<{*@IAz zx(T_YoljF(I50UQ;CX&^A9~66C_8nd7%Vn9y4Q)af z>K=ZwJ>*H*f`s3GFQ8xrn^c8|bocg2=?rYxbMl|iEw`I-W=8`r_`X&uCT5$l%3+-N zN7Di3&V@V7kHU*Zc~^m%B{il?K=FT`?QFween466-0p*7AXgI3)lkL6GfMU=iZg0F zb@`S!I0pEIvxjfe&qwPWpg@*5osX}@{e#Q=&KSWDi&Our49yAUnw;w7QRW?EjbmfYH$YY@P#Xi_(A;VTmF*aa! zcR)T$+tPZfff^aRTh5X$OyK{{M7=r@v3it^oqNmS>UwL@CY)_ni-rZ3?-N_q_w2-y zRf$p_V{rxo)AO)X)eIcCq}A$mW^s2x@Las(ye6&>x8sfZ5jAb=zB%^RJyE$koWA{Q z7{|C&JxHLd3U7615<=lY-uop18P~_S;D%nvGc1R2^!Ocf)s(D1i$SPjfy_zUgp=3Z z3^C!NDS6!)&uua907E<+muCXJ4I79RpMhiK#M_XT<)<%Vg0e8dAMsjE953e({D! z!fmirt}5m3>ALk4F}@1%dvd{m0u@m?Is@dg4{>bM(!fiaiy~jRB<~_9N(Vuo#U-Om zH_}kv{c(KhyyHZSgBW{`z(>7BKfo;@;=ZYvu@7_Z=UY*x14M{fZ<}bweF&R%VS<@c zv3WXIU@zKo$R8@;ZTC}96l<;$ypV9}>lYhxG&2i{-S|$DuFI6FFY9Wm8sROGhH&PB zI{&e;O-4Yu+m@_N&oV$NvkQwua$v8$8{4+`%vcr+*Tt8zwE(&?4Nl}z4pFw&TRa$L z&eiL1`n0gCeA24!6<6=ZaL9kA!Fy?A(#*xgoziRY&SWt(U)FB;`NF!hS%LYz?VZ)c z%@ct>ET`I=&k+?~g}fas{Bvzc8kq37H?kEn?63Rs8iV&313si2uQB<59+)L8^9kM+ zOX6K!VWK8F{oCCbfVeeq&mMyMFG3yE;js?oQOGdBCYRI~afE-mJWyJOfwQDAwB&svDb7V4 z;eDXP2(D<&b=)tuNq=1AaOLb!@q^x}8qFCcfty$MBbUpI{t|VPc~8Acsxb39a~zWL zvVPS3iJACwS-iGMPFkZB`tevnw}q&1fS3(BX8vc{ozTxr< z*K(IOhvx6~a6rY{VRO%`K)c5#^~?&qS9@`dlgSvRBcBhjXsc6HGyup3 zwB@zFR;~|DkuV|zOJxevE{S6FZ7VMvD~ItZZ;Y~ZQU2+T72OG)Zg0QBVFVXZjnWly z3*!Ftx(1-LwgYS}4p@u4;*kyc3TxiifeiU_yrP}>tK=hqqcJhx+?xFHILW-Lukb*_ z7+kZWIT3_b{um@!3i$VI;0~0h#o}huW7RifhC~)fz2#(*^GoU9V&SRV*ep`#WNPwZ zK+mpVqd;q}7o|kYV5F~H0&G4+g7PI5N3&=J!-`0ia&W!#WzyPfa53c{EHg*reaeh( zRvEOMRRMjp$!@2o%$qp{;h$+~amu5X)6kJ8xrggFX3y1E z;+~?MAcO59?0{yQv#C;sz6>9w;vj+B#(P}=5R=lMsN>Z+K4MPI9x<1U#-(G!EB4YdiCLa?|FWl^^T|;3FOT*Gcoc-F(fn?`omvmDu)KGxR8kkfp6Der zrtUMz201_F8p3yRYm!q?@czN}RAr-0?r-Lem$sAV1fDD&KDt_pQd9%$3OY-G2hq2g zlJm*Syio$nI(|rr=zpmaJj|JCd^CM8xVDuSmz;PIB+wj2tJ>1Pn%8?@ywLo?!?wv>|`Xp=%*mQ}rC3Nv_%Z zF$6SLq4P%g7+Zy_^gg#>e6o#OLMDb2*tmM)D6BWaW9+h#zY>J#wF=9OD*wIdz(j-(!Kh>!p; zDhO0$!ul{1LiD^e4=&9OV;aa_p#g;)ocf9W z3Y`gTFwom7p9@X8$MO#PvSQK$=s)ipx>&nig8;8Yz?chGRL(8LU?|>;Q5_B;aw8_=Qsn%jON-e%$rEiM=@$R$PF>1z^R3pM zgc#auUNO!(WOD;F-)-P_ZKQ%81pci@*cj6U zSWkX9b#5XWg-w|_RPunpqZCMgEA8hfxYz>QMkAQ8WJ*cTVmMsi3hRY*3H8LK8D{ek zhc)Jl0Y6sD6ICsYVSeSgvtNR+LSit}DmRQ?Eu=j(FR zi;2`2o&ZJna_XWFmwlJjMBWU=XMc8cBG!CsA!~31>{E41lF{b4jAlzgCqTyVQR3|3 zlX?0?l4d04{TUDfyb)|qc7SlR%x7la`XA{E!_ZdSVI}uW?P}^_`AISwTHtzl`&3u&q!PSc zX0uv^Y)#4Eb)oJ59yL1wG}N=BcbiwU!rj!7P?FuBh$U(R9IyesX(v`9d@a}Yd^c5} z(vdHfQxK$wh4;r++?$ecR|Rk+UB2!ms-uc!v<6NC+51o;9*|lX?Jq8jk--v*_BNFj z%|-;YP))JMtp(R`@;>s%8(LcB)}m>a#;~}%NMlBmUwzC#*>e^cBMOAbX|EQoH~S+e zu%%CLG@iYf4Qcp<&xohFb27?jBub;hK(TP!trJtRGNp zcGyD{6$tDaggaR2l2ug0>v~>0Jes;EfQrIBHyP1)(y{y1(`T{zYltj25JuuEK=cWN z*#}^1k>9MpCz!t7vJ*NZHRmunR>&N`4DIi6Bi6*T|F|O*L!Bx5Old8w!^n4Row*ll zJ+mwx-xpgLgA9s4I`-V(0g2Kgyv6q1Kw3n@IIZAPH#`g_V!`W~fzHxfGs=Wjgn|Vj z4Mtt#ZNQuG^#80S_BkWBE^GAOSf(SE2?Jbx)N&Y-G_aO=HIC6pTXWMY`_;r^%BSJ5 zn)LY4^WIMwzrOcJ543W=KVdO4@XtxaIiF7Ynm=sX-H6l4bjjprQd!Z5It7@G^C6cf z^q_LO61k*-rDvWYe`O;z9dlsk7n9>o9+ym8h+XvF2a`@9{} zQ=dNa*A(r&d0&NXhIP#{`okaVophtsv}X3f(6bOtxsCAt1}K=*AH>!&+uktbzHd=A zyY+7Nb5Wh{L@&{;MRW|T=DzgdP4l@4XcW6=(W2Q@c^1;#UOoV)t!wkHq5nskJGW0P zdV9hB@qKALnZW0X)Q0LG{QleRC%VEVUmhAUEE|8kKVz!xMT)V4;F-*I8$+6L01;C#DCr?TxQkKu+^ktCY~O2mEi01^g&-@e5Fy zz22kpSMd40KWbq$Bq+_j3oM;gYRmbR=vPPI;ZsP|yrCLXc<{T%T0Y+lEeXjfypDFA zUqK4z_Iu*Fx2VTQ2gKx> zgE4a46=RF?JEkxKVz-jmQm>9Ah&VN z6%xUWR16T{rrUTkxJh!KOn@(>A>LV+HyaCoM&9yabg=AK-KOKvemSodlpyL%SY-%X zfVPb-8Pu9()L;(mrOG#Y5D zYn5K}p|FTPw7hg0xCH4zLe5q3>vzt6Z2mP?e`z6`lYbXg0cuB0DM_R^IXc}XdnI&P z9uhgLIL~AS=wY<332>hLIiqnoG@y(}!|h~LJ})=ID2>lG_{#UcGrya76aChS&Xl=4 zI9r6y+E;Zcbu00V^HMdd-?c36cllsNc$d_r1i|(J3#I*`1VVlPnP)O?W%ZQnNFkR# z@2UIq3up&;yq4gPb|N`uN&&G){vd=3bN8D5-8d|ayjDJFha+_AkGnMkQ#>li@Iv8c z(D_%hot4Xv-E&ti!xM)|ya-0rg}9d9+hP@OVWZH!Lj)dO4v->&fZ;Nz&4Pl^4_a?V zhfZSUuamVw-@1-xg`#rrXhMJTYc?(MNEz)FnJ2N!^3xz&(8n)ud3S`Oe-uQk05US) zMVq4^hVU3aysdMaEh_9uR|HQ&?>I^CjC z`w}?kjxHkOlD#6-qaY2<3U~e=Q#6K6qz#(pcvIo`g^w~y4!sq}P5*m7;(UuEgQ z_96vSJ&W(*gNg&?p~VdeR*Wssij;Iiz@AC2=_hrS`GOp2bI#bcjF1&@0G4gi?n&Oi zHYe=*0LcV-eA;W9-prRb%(w`&-#TIv(pOCc@mc*|SZn5Yl3?&dLPWW1x%+UG^D#Mp z8e9Dvr^f^&XltL}ED6S_L_sB#rQc6v85|MpgG)+1p6d-nD36m67FnlGazpRj&J|5Y zUXJ<;ib>poBhup$gY6>mrXu6c*a3*VPIzdH) zJfWLWy8-0HYe-s(xCE?tQaH+F7A{FT701yiUYm0W+{Fu8=e9%$30~mZiJ*3^iWG-G zC05Kmwb58Kj@((w8*a*6r2y-WaRGXZk#rrnIuB(7P#P>ppBr;SA*)jn2Swpfk(Fho znerjASLXRrn}()+vVGxZCfD@Y zKRMdxwUQ=>uR7*^TGKTLQHDB!2Jf>TSi6 zMx28rLcdWbA7a5Huf(w|z?tFm=zPcj=t)-;bEG4phtU4H+0d^s{CJdt7!(RA~_9#89VJB{>v_P(42B#Q8*0fx~)6@{mc3c6t;e;5~t8AmV35> z`xXrHmB0=fIO-NsSCqE`YJjWnh}|D4LI1uKU5GL+n`i?BLp=;s!Kbt#$Ndgmwxx9$ z`bdUALCIBuNNNqa&vNXBVXAnpy{(>&aYtqsoJwVd&BFj44s)qd@*s)G3^gl+;x{wG zXbySFq;iRzDF-jj;@(?Z^ugPND{_L_7<(P+eik2>b}Q#W{L6tJpeOgVSRjPr}{W4MHOg zW8inxLxz|!<};3qbJC&8M36cXIf!{Kg-dA-VY?U63hOPrU4T<1hKjUKAsipd1=nFN z6Iv{2OoAL|2pO|`1^0%!eS~wqNLv1D$U;``T9Kej+>_82%x(I+{7J!7qB^w;*Ry*n z5e!zP7#!ccTGSmdcodUzA_Y5EVhZi-VFSiQ^xHgmb+u;s%Wq~iR3%B1B4N@W({zk= zCnb`I8slRShTQZ2w@L<#_|okDG`N|^!f)bSIu^k{h=NqswwmW|>_sU$z|4@6Vo)oJ zSfZMF|elDayYV;PIK#! zD3Cq4=i%<_5a03r)fXrv^$g~-cI2%433~4!bvnbrXiNE+}8{M2qkgM4J@08to zpBn_{z8xI<+N``nApic|q&P{#r1h$5!$bCuNxc8+YK`wHHf+RnR+~ ztsi;*?O?lA%4eWJxK)Kj^eoKKnLVh&@?_mjJ!`fbJ@jw`8Gq2FR>&$eRwgIcIy@?Y zN3Mxss5RO@LSnA4bEEkXy2C7GC)#W*e^*m-xqEPUg>1rU?WJ^0{@J67aflOb!p>x| zT(1UCoP~VdD*?P2UIpDQbYqYh;6Z>l-T7W)A6sByLOrU!+t0QAboc!75w^=ZR>DZ} zV+tvFEg8Xv3C|u__YP3b^x)~LY_lUBny!+%*pY?$RqPD%F@+-}W@NYVPIO6J@IPtGMsa-<}1bm8?!6Jc+eyK60vYBNwTeEKtQf`A z5%_P-SzG;5?6oGi>kZ7krSY&iYKio72|I)9&&5&L>8dC3b%D;pdUyS*P174+>o<*S z%`Q$=Nx|YgimC2v{%jBXfLSXe9@hXcS9jS*mQ8f%H*-v^3rSqlU#OXm`?8#?L44GJ zeG}phxg>xZmuo~Hgwg>b2@#<52u6RB?JSx}sp)HMw>^oji;xy95gn6#N47(- z^uF!!o3GB`4^sP8$LLYPvYGN0N}l)~CMP1VPr&%cl7+fT58P?nbNkta;B%FJ_t4iBH1_ zpp}|*B^Wkn5uGc#{Dw09!L-M>()wJ1&FtBB@l?t-E%G*lGsm}qIOjC->k`7wO8PE)ZG4^##(puRwB2AAZluK4F&j8+r{kV=XKI44q%iW8lN%<)be)fE!Fu2&o`MKvNW0K z)UGG%RzLa}e(`To4NcSxJt)xyJ};nJo9>%ug>f&$JFJBy@I+UmG7?zj{_meDPq=Z= zK965mte|lCEl2@Z^zz17G>x&1hI!VR9N8!H4OdZ_I`1J(wX7W5yYp9ld`^w4d8Ixz z&w6wuqei;|DFxYoxJ?<`bzUiFQwV6H5P~W{=rPgG8l*Q(HOllS62i}s5pp*uXESEg z09!O|6g=mLjKJ1)yF}Mfs+A3r;CUh~_$&*=LZx2=ws6amHQ6`+a$n&u8wN^_JL^>w z%pu;Bg1zJA1knB)U6cdCwmu}wi)j5U#H?@)!L65chM6-Hln&vL6${Q9AIkk!QmMxW z7DH=;@HAYGv|v8-bWY=gC>?20nJG`W3tlsWIiV?@k#;dXs(h#2dQjn$3<%l^AAbz& z!u19xzyxm%sfVQd9or6ehvWK-rZ*+iyYH@FO0k?A?9gQz&^XXJ#tJzQ*|=_#SYcCq zENCkZ8|Ho~cPfI`w<^4orY4;B_taK&i4wE2<1H*5DIF`%2W(7<#WD7%^k5?K%dW0J zP2j~j^fJaundd1)mnF1YlifU;qmu(r92Vl|j173ckARDdZahLNMNZVf*xWX1IL0+A zew)>86YES|Hx~a-RdMv#N|16UkHC65NRj2!a4g%UyKWbAM%`-9DssYNbI3}qrXWJ; zbBWBx(-jYaCOvRkLvUwx9V;?AKr7=Fb6KBe(wpj_`NIG3l@NV(Km?Wk<~Ue*_SaA} zZdXLrb>AUt<_RWuzr!Z#D`D>qY3%P9<=dFOsr6Tvk2tthAOUc71`az`tVsz+GCSn` zyo5Y)NPyTGjWBR!VsW%N7qc1p7O&GAgzeNdpwl>V^iR0QeH)xg3K^q>;dAtSNb4+n z_aR%eC@{&B%?H~ETeuL94pG&r3cGp)9S4|>{sfznnfp!~9&gS9j})(fcIlFeJ3693X-7$l&DdC8{v zL$V9|Ov&D2BL>FBg9dulL-2NiU~m~QI{?{)ZC>#HSBY&`c+5Xyl(@6yBOv~QHn@W- z8wWe5902?=;hgwBb!3M7x3@hGWqO|4#;=RrG2lM?srCrFSET26)0y=J}fzew~FV*Gy=W;KhTEpuq5i zzm6KlP;K!>q(lDIz7D`pSQEDnU7y*13W}Kd&PejFqkvKJ(VC0_OQaw z5&$R!tE0!wwfXf>k>0uxm_yc}veWe{wCFNROgBctsj{g@@v-YFa30|9NXt=hk`Oi0 z6sPEEk_XdYEg9=g)1Mp{m2Ycp+_L-6&pqFo$4fVlIGHn^(TKqJgk z^!066QKd`HYw3~C&k^(q#Z1zQzFBo)()-i0mzz4-^2cOpLzy{cu&0q6jq?nt=L%r_ zzaBIxf?u+}k~F2Co&bKS*6fK72QZCUUH-oiJArId9ldZFh{Pm)#&YED+As}PH&-N)`)xyf~egf@)WlsNWU#Bj(N z#~-HH)uB@gp`0%IT#GajwzAjNgFh~ZtfzjZsiFj)a3>;tZ&uNqA{9&BO~C@-xEa`M z@lqV>xRh*|Fn4Eex>tZJ*9`QTN-itDe-MI>TIWJLnghG=Ld>Hgfzl20_8S9Ae50Ai z@7>dVbLAn5ySoFgHFJqB&L8?Drul7Q&ISSeSwCWoM;#-w6OjDPCK|%{iJ`r(rF-Xl zSaM`K(G6t>hMAesAm+GDp=*|;?A4HHPZFUheRT(Mhc}*R2 zXqfP#E1j+7zYqI?1g0xS27TMJ%|^RVU960hvrU4?BJ+*_!wXl1{PJNBsPX#@@?1wK zw|>kM5M_UiTNP`{e1yj#IJ7@Z*Fyxj1KxDs5C{&-?!l+PtqYlJ1g0A~PLxF6XlgFN z%X^g5dv~1+(&4%*C+i1mW#tikeLFTixah%?eVV3bysR#*UX>xXzSd_s4E6Qdnn4&M z=2*msBmHTb5Li!m7{=z%dU!xq5P=9^ViRxZ50d%f-$ zw+ED5G&H|Wxz|dBi$6gU2od!2M#+I38{eov#@t^m|xZ%8oKhn`0N z7LVU8Y#?_$kVS9VcSMg0RPLMuM`NvI1fB(^s{|#W(Z4`#-2o$m&w!ieT5g}iC^)coU9Jki^<`)u&5P~ zSYeDaegIHN;KbaW)RHb~xT5IcYzt&*2#C!lR-~rSqIhQ#W*&otX=JXrUDBO7gi{1u zrcdx?rTy&$P#^qYV!tPr4pPEuRH|1tVZbUAoCsBAw&Krb~@7) zNH4)Bhwv02U{g8iNPy)aMBBGKJ^<UpeAL+Sa zTwEQ_GPqn}mT~5|kBUo>Rt!9YXO^(Nfp={d-Qm7yWg)P<48Rd44h{&B>4czs(0t~t z`x{ZMf!$g*<%HMQq>c{A=dUpiwTF)x~Wlf_!h8HgNvW$Z5cqm_ z|JnA84GQTOt`qab!mYfV`dxxVJlWy#;K4ixaTuW+b5|$!Oe$ggP!?W=>)CiC+8xR= z`xA+5B6pm6SOeT$(VycuCu;9=$;61i+R@(1)e{@R-GX{Za=&t6FMRfe)x4=xFwKBa z12N=cmc?xb0&#+V|4JwSNl1~arq0*E=bSEzbQU&~IJ_P1)I>lGXcX}dOnC5kllSdA zPahph;Rk2msq|n~-}VpZX-*#4OHp`((J0jmSw+61z7@TAW8^+yYil>!tW*cBrsv!z zz`iy55zr?J@IuKyERl@?Zql3ex#S_{n|dGdy&b7=AziHwxNA^LXu#Ex6)9b9erG16 zN%vghMd-nefEc(?tDiyPUurJV+T6KM;PIR@-~3iJUcrGBE=1F-N%8%qi&@&hi&gTP zDDbITPd6Bv{Nf4=c;l3eepYF5f?=g#%g>1iuxZRIYZ;(s(jH5|vJDffeXe)p(>ZIk zzfG3ERt0&IaQc=?2iL$BH0zKzex>zn1AaP^;QQ&gGOc!3;!rDYOXGo3{a)f{9*4L$ zBcFA|!geacpJg#KSqf>rXxfQsKoQdJ`(tNlZMew?H2C~5ao!g5;6q>H%Hqi0t5_o} zEc&1YSpB}6Xwfv?O)%;-4%YU?|BCr`Le`_w4);X zD^}(#h?!aEKWnlzEhb{KOKk;XGzCHhnQ#4yqo2AAj$Canq4K_&0bWKGCDHgbTY5Ok z{>Q^f9{$YViZz5Z&ms@L*TQA#Y0B9ZO`gQIa{G7$vylFOjKUserFRS^+ zvbjR@<{R1nzW|Xv7}Ocf*?ZZA+G_m0p+5DcI)V`Qs)#14v;x-@A1PPN!bXH!x4L(Z ziLnX17^(Pzj4T#=4w*Hd-f;-}=~^dWb7)d``sO2wFXmo5%2`kp-*!=^CDC8z3^yw? zF&T?hJFa)L=$h>c)u`&nc2u(E27zETdnc_~$%ZQQ<)VvUm%ffkeOCp{odk_`>NBnz z;&P^4Y||6t0Cy61^1nWAZIJUPJv@?)4{0m#Sn;VzqWPfjoB{gcBt)*+R3VkT=HbLH%Dbb;XqAtBkMwL*BReJDK#1pk8cyXJ1~VcVY1J2AC7l2M$r zC!Rz96nXgl_`m7g)v|EIX^COVn=Q`&M=ql#L1;h5mlnn)-y+KgjLuj!6EikXannoD zu_T7WgU)DBgP3)sbvhh4suX%Od0=E~3w*B>=|M|5o6pKc49GS&Tk?mUu5ta}U+^1E z78t@B3Gk#()E#2UbIpEsboE^$otUGsXuWX2$~p}~*uv?`tj51NjxA==@BCcG+Yi!s zYZv$RM9MW+&}c`N(YN#fNLyF4yU)0i z+sp01r>F`GWAF+Z8G8CG74N$!RkbL5J1!>65)9jVf*TI1?t_eF8m3`I1>lVRW0aG< z^v~>17AE9&L$$Wly?KLn%e(XZl&n}fF|h}lGUmJpfFRqIP}A&V9yTu5j8Q)&8zd~u zj*kmyS-kfwFM$x6%lx%wWldBy6%kwJCil*XRxlF~mYFS@ot;c>Y~u5z9t zv*%H9mPXcVNLvgh4(QnKH{EU9`1#g135CM~rlrLP4Y&=(7Hq-#=2<&}KVC&J!;U zTu$r1^-2Xx2YeOrueZ@>It|kNAM<9^6*BUT1deRFSCG*_r8g0N_e~9Ik5=9gTk69;Si3;D)^6&%yP@i(4m!yG{CjN@9f(Y1} z9e|L>yCtj{h?wcq6i?BE!S})oBFMKAM02yHlyWmLQGM1v-129#D(ur-mqkCAZxS?g zZOoQk-_h^PYK%unV?lHtSsf0M2Nw}x% z=*I(e1fQ~XN<)i;w>xdA0FfM9Zye&UJY_#Bl6i(m!bX+h(thkhFNE7E02)~alT73# zVs`kE;2-c}&CLWS*~mZ-7u5^CL;C04n6BLy5PW2by>gTbMFqX_A@;2~XFJW>^QVT< z@I1xN4#rUjN-FMmto&_5?hR`26&)Be>vwJH{2?FrY6gd*}?*1a& zszAGYP32n=g4D9f(Sz$r1RyO=xFe)=xahVY^BHKTbr*#|H1+J~-?Vk|{ufxY=^4~C zlUtZ0#hjMCdD_(op_X{>4E*U&7^z;~cG?}1t0AjZ>yZUlF`kI%6*dt-@!=uKp0p@I ztSbM1S#}vLqQ&=y&hbW(WOj{%mB+heG|t#oDP?)bYG-G<7im2WA_QGxB0 zm&>T$bVv|uFN(X<2Fe1{*WoVvT*A38T zH$rH*$fmog&ST0NwX0+>7_%~gn$>k&R70pD3;5x)lEtIJ{q5!v<7Pra}1NH*0glDpT%S1=Anjdyjs=@uGJ7@)M6?f@j$IM z{_z&CG%3+5YxIKK$>*rk~XWX&Pn)z0$%O`j@&f>HP^#ffW_nA>g>vrIIeK zQ^!}tN;&6bR6*qmH1CEIAqw)1OG@8^pBAVVRx_g|!8mI(fIIx{JjA?O?;F`I; zRZ#@EgX5k&#zy04dbm3WiabGDAIi4cuuxhX0wg}05M%jL{JVjE_)!TnC+tTwNFwC2 z75Oj&+qzu$d3PI`k}O~d7cb)P5a4yerfD=0CNQl^ok|#Uu8uynsudzWAi_u~7+G{u zVG!%3;%*X){+S2aiyv6G^RHC09cU&JkTT3H94-=77T{PH-^3DU9adv2XzTD@)Oii7 zIcQeW7cd96u6iczm|thuKFYINzNq%BxQf*CQ%0Z54e=EPAs71V%Ag=WH<)Zrc-e?P z3ei%eS|&ne{W{jOFCBCnqZVqB%H&(Io4&(!Fio~>7Y3iPJgf^wH4RIB^R%lPt!y-I*-p5djhahE`ZEQLRkpIG z^nbgoRm>JZaogh4B%W#{JE~_E(R(h~AjouK<0DzJ^AtzGZ=OZoP(#&JN8th)c-6hG zSHsM?)h-9C)>+wtS3h~nx(%TkABgtyOk8o!B3sk>xWTrLvo5CI@cwXUXV?$h2aQ0_u{Fuf-!5RX*fI5hL6 zNJ)q@V&->^;IJtpOW)W(&DtA2x(K0i`@f1ZHXD$$($jWv0V=cSE8_OJW z`0`A7B!)De+_miy-?@RA-ahI{tdF3;W*!7c_Xl!1wV;~%M z6dKf;m@OxG6Xj?q%GT7CUm>bIb0g2O5 zF+A4!X9m8JkT2mVozW*27dKOd<0@OX-)UZKI(b#edlA6h;cDSK=2uV4Gp`}-^Xr(& zLB0PBu!SMsQ7Q06h2O3Y+iQR#TUPc{@*jo|k2a#?<`W4d*hd(YIg+FIQ3ed^S@{o= zAVNj1d2n|?=6W2}^?e!q*yShm_~1Gq;WmUoQw7_#KmBU$Fj>pd_chMkx4IqhLzWcy zydbvZ3D2xr#*C;Y(Q(joA1WuCY2nOy`wYjlm3j)&X4}*r#7hKGsVh(({YNBESF3L( zjwUsyE6)5>{jg}R*ENu*sdpyeAVWFy@zw*@ienScLzpYf5+k-FAGC7@D0S^;{dWIK z{k^4*<{HO}4BA=|%hLxDH)5QyDSMYW$E;an=hxLq<1RnbzS(3VRzup;-4Mj|Xq>vG z=N&w*A;%l&fF0`@M_Z{epgT=i2JC%x>w;4SqhXt=uIeGz-2?XW|3l2KCVz4GCDt zr4yM<8X-k7nad;svA!~GNbI4&^aQ7+%<}Y0|8skD_3>$z2E0OP==jvo!qSRBz(}(0zM{PT-!~+?5&eY1G6YDb|NM z)@ivbQirrCS*+>(XTK4`kNu#Vm3D)kMQYVILCW>!w`#w;#KD{`P{=310Iv$z@fyg_ zH0vtEnl|4Q&bN3X2L{0HUO#H-X-GWP0CxHVTs(Z)$nJ9-ewd)uqF^$@X$SFpa}VLY zt468-s$#u;az z_ZOVk&?Tw(d6TI{t30_}+HWKQd(i)Yc#706+X<#Oyu#n143|7-Ht$IpxLs)B{{_ z$hX#Tv`2P`+SggRqA9#agQ zyn_oxa^(mownSNHy&_2t-__BpdN-NbsF2Ga^@-2#jE13|98Pm}$4EBOBh9_Mn|0LH-x;mJ8 z*^tR%e>6WF*Cl~W`abno9hQ?$JXqo2PURbpwd(iRY)S7<+BIKTv|X^IfS=YOx9*3- z8n&Q%*RofwlNa^FG;GnDVA|oTZX7pffYKz9KjT5RyyA8e>^A(f49q_xUZ^-jClKF zEvKZ$@R9Ih(AB;PB78yvrbHuzl_j!IfiJ0JLbOQpXZ-^Y(M#Jpl-6hbx>Tv*)I)j?s3Fg%${6coOL3P=jba@wV5pRGTk0Kp_vR z&1TGex7Z=#1$<=#!{>IjJ(;XE?l2wl1Dncw@gTe-8x3V`$5SSCTD z!xwZ51+Zd{huR#b?WGR+?54Qr^vy;HS}0$+darerX${()t&GQz9-m};G>^s}ZFBt@ zOJkPrY^*46T=1|v_AovGW5eM^lzzCg54A6g9-rcCd`)H>IBB_cpe0|IUetw68Y_IJ zS9BKE3VZ)Kfi!QEsGu*8Mv ziQ#<9XTNCirs)kn1hG=Ta~GeuFt0jpJ#*3@TQ=VdFCI9eN}MmjZwqmsB`DOIpyy3D z=m9UHqwX~B*3fO*XnL6%K^L&){J8BZJ{cS-r$$R_co2AKU&QZ zsqMrF%+cn~V*q(GR+>(WoP=vccQ~kP3b{vzzhoz?@gGzFatYXo%CiizR4-q2C#V4K zPVg-IMlS`&GbQ%T*p4+NiJx7G3%Z-SYkRG%a$ZsVux0QE!X2n0GtRs+k5zY~^7aAd z4w!+>yWr-MtO_sJ3HyESg#kEVZG>yl*2BB&4kgbQ!2~gS!_5T+B+!Rss?$4bd{GQn zgn18y=6e%=#}LNU9)6&}>*2weTaZUj^)%S>1?vu(wO(1&smqagMQ{WH&-x!Pe7?l7 z4>273hr@Jb?c0WzB)l8&MuN_+o@+RC_wr4m*4j;`u>QtuL^1h0DJ5u=giFpuMiOo8G?PG{W^HKM zxvxJNeC_?-pNQ7i$OV4F;YOanj`69|Lu%j;PuZO!%hYUkMGDQHFXe&)GoMtf9c=-= zpC9`pK$a5BJIe^SN8Qob%VA@~+8)v9PPk-cB%n?fiBod2vX=_c!gh;Ccg+L~yn~$_ zJvK)R7N(9NeCdw&0thjE`*`)fe!Xdxi%;IdBSk%3lM5XH29(o@g}tpTrPFD7ywlK9 zn3i;SjV6GP0mf%<#v77|IAa|j8W@QdU9XD>7mT@qw&T_g<|Q9BWLZBnL>*1{;~9wU zXFH>I;Y3N$m+O&h_*4JN5Gty&O)mQ^m6byx`}E(l*q(6tG;@1VY=C!fq;&t-E}H;J zp^XvfW$+~RE+AFPT6oI#x4~0+#49%B(S}VZl-`-o9?vFjvonIlVPY{QR7wwbbX{|^ z~)TQm1 zs5?4E5Fx!08yDkOC&t|5(934C5wHCEL1EwoE!?8XVs$Sfp)uoEy^m|zTH^s|MZg3P zcA<8cGPZ)v1yATzB|x@)V{Y@Y+v+Fz#*0{|jQD@ByH+3s&W@5Tl$qnI<1teXjtAT0vBd=RKs_`wTn`nW&qD6FoFS8{LH(@N!^G;p2IM;9;xf$vs z`xx!&q=UM-p&WCWBg-~NmpoSinpsc8*VGB+uoIbvX!9TljGOv)+tai+tFL55g@ zSJ7cGZEBvBx)et0{XV>YpRBg*(0dpC#BPqz!f<6%t(XMYdAf>C%MrtyaX{JI&PI&> zrRM%WW2H23f8QJhlp;FACGz+ zvGCM>I(@pm>|GT5{FuC2LB_SI0l9>`DTTiSL_Fmz533Cwcj&z@Sw22c+~Kr0HgjAK zk1MzU_@^?~LO17ZgNkTy8~jw5ZkNQPjd3+;^6U-YLMsqH_a9gbW1}H-eO^U~J-KY~ z@!_+eAhhW)-qE?CK^{#O_NEp2KOcFQyy~JSne@poJ6QqdPGpz0<>JgRmm>yfGmli- z>5k9eu;jTPOWBGA%g7v@82j31bumDr;BClX2pY2}!zTDdHePL#y4$CO95L*~YD?1F zYMdf@)JhrA0^q=&8X|KwR?4*7VdWD)F}ilo8eq&^|327^I2EP~Ez^AzS!)AhQS>zi z)yMK@x>T?|Q(^OGYL-dRW4ZD4Q;7pG?*IWG65$qYCT$`-c9{gq1X{u76@J8IO_#Qy zCalp=CQO*AN-3Ru=|<{FiD3CWZHR3;jt@KyF6yr(8uv%1bLVGE-&G>Tgq#|Xe(kcUbHDw7Y4w1$~WX{uf2%R4Adz2H5+`t8u@88mMfl}%^veKR{=umn-S>yg>_j;sOQfFdyBwde zD{hXY#_KdFs9V^9BYKL`Ml2z#*vR{FpqfO|m#lWkoH$=mzP!pW9kA!_k8yZui?b(5 z%%-acvbEOwXZrdSHs8azD=&tbSLj+S@=)-0#sj?Tns?&$CLjIn{NV2V(U0#f+H>Tt zxj=Ui>oTySF_z(w36L#sm>Y4vo}iRlT_3`YB)w@!*{NYkzUHSDtHH#b=fh}FyF8`3@F}J9b(V^~>a@gDTfCX3F8;=BlL3>4c9k#^N$XJk?O zg(L}!1#Pf6Qi9}G=#MCc21J15%Tp_VgXE;Fyh=0gX)hwLgV4{D*B^kOk18d+BKS8h zX|v&9WDj5vRMD{Cs4~hHWQ5b(s$+l*DjMCsCHG)z+?3QlBo+(^A@)7VAPJOV!)2tv zVPcr~Pu9M5ef32qq7UoT*4y9pcxr%pxW3V@+Iohud?Zn-2;$9~vExbaM_l>mKNY4O zP{%v80n(97$S*zkPp%_od?ALhp>Uz-gUUo%z3lJB<;FW1FGH)%g#yyY1Ciles?A+X zc5N0A6YtFc0j}E${T3vWB9gSDrkL>-(Y8L<_2|&5zBdx;Vd*>HWeDj3b8M2)+GJ9p zbV2xYynSZ9s1{QSBn~Y~ZzXWHb>#S)F*UOr9Q>51ZW?Hh0FNO)^5(i&Un@zrLeU~e|C9!embR|dxLCqWO}TWL>yF& zy*vO=`QVqL@vH3BSD?j;K>2)ZuW{-?ev{oarbvxoaCb{&`P~8sim2hp${Z zy#o!xZp6%Llfj?@pMe7HN5qiMNMa5TW3P=YNaE{%h;r3LxM;S-QM8OHgK20OqU#mbYCZO-4n(0vz4C6wteFgI7+N$`4s z|J97fxzhHF6DAWp~BTMQBh!bZOit2X6-5o)%jz7?jyDQ-zP?w5SXo{7VttNw)J4@3UflYL* zyW0Ofs;JtGIYPWrBA8n~&wg5~yxsFQMvIl0xHel#>hEOR#{cG4x5maquuHi<(!y~% zN~W!UV?|!+^mG|`_a8!2;Vc8OIsQ8|k|3~N_}D0fe5>$gvF2-F9@6&a{Gm;CqB5wH z7~I!^m;1Zn_LFaL&4w_vYb!804fnP^% zei30dWOy}mb;G=^;g|~kHPDp{I91Jub}|u1Ke1KzIDG~wJ868=O-G<_88-nm-!SEJ z`z;}v4zR<`6+5lgohd8*dZ;{1-P`-!l5%yLF7O$ghM&7c9EF>y9Ibg{YQnV>nMGrC zuOjMu`i)4_Aj;ITsgf ziGyhEEKj?~WxtbmSrACfv599HdF z`jdC2qG50BZBP9))HV4kE`8$TK?zbVtpqmq41z(MAL^&v0tUFIj|(6jpJfAJ?<(EraX zWOtm{wVe<{lSgH&Q{3cWMuX;OiXfP$3Kl6)U}mVIj=~(u9a6Q6cNna3q?ppV;!z}E zSU#>o%pmz_yE#0-0%NzcanAi>} zbN?9hWy=lP)Cy9RC73*gCiQ*i8Lj!KrHSAAPI-j>s(ys@MH~Cf2JUhFxunrtn!#_; zl9gP>I3V`s{3;#A&JFm9T|M+259FDPEMq7ISs7x8O@4%}TCu9K8lg1P!G`kH07pQ$ zzgfNYA=t`6cT8jkWngq(voMGS?CH&7`=J(fs)NBy#jy6>AD(2ZSz#_bcAx?ePz|OR z5AVk8>k{%?mOl1UvZj*-Rs~(s*1Zd{RT&lyepI(?>1i|MP38HN{-sKO@Rpa#FkjA2 z^4^HR3ILYL512_jb$HC-tR<)B72edjVAVDNphSTsMV`9Z>1h9+T@2}swfzmk{R@h) zihhv2d|!a0@k0NQmGI5L49|`eUehuzmYUet>o6{SNc?;P`%F2j>LgBOxkBG1;`Ny9 zh|~wyABHg|l3+f>1#ohj&fGmhfuuQM0pIw!C@T!f{&-$91BFbk*DZ%bzBmV?(Obyk zf}nq7rfWMgbjSwmcc@XS$;Y1<(4Vx8J(x)v4IzC2a3e`w`SbqNRXI$<8-i>R!Q1gJETkv2UPITDcoDCjmaw* zgS)j5;?Cc~ip-CtsSo1K)UiHK_dE7YPWLboLZ1E?_}sgNROIae;H2MT;1Ar|7gj-% zA4w@nA(j^H4-RZOxjd^R{bvLV*GSy><2`_U$LHO_M8o}paIzY;uj0=M@ms}^c%Uz{ zN2So})G@#6Bqd=Rq>V2}RCqk!qp#^43>k+@z3Zha1e1#_15Ilb{1LeXu5n#b3hD32 z->W{V7(;cKw`XjG#3@FwE3ZSn%3VlA?Zgi@Mz-U!ZW3FSfSa0{G*);m;r52`YQLTn+{ zpdoWWw>|w6wsRZeY5^WWRfS&eH(I~##P>%H$wLiGfcSTnT!1UybRA6neK!)~|9vRS zQF015rt28pjEUg6cjMbs!?HNDYv6_KGu12X+i^)7Zx{+1u$xgo=i8`XPpap|im>8j z=8)jp@6uSk>CcLp|m^mh-dSK{c{v1REbAC&HJ#7lFUYg&XtiuHFY2T!t&zLr~GuXUm|C_3Qnci$8hnXvP zU>cqmH2vnZ`5px?Jd$m1eES~xk4@r6HFK4I_@h5NY`#eyPoGp8_UWDH<^&3VlEt;a zWT=s>t}*7Kx%KO3RhNm2b)gz{{RXcQyPLbm=w1S6bz}FW5F^Wh+O*(aNKy^eqOI;( zXDwzP^o_QyWH)4`6oN$2*1knC2uA2&k9be5DqVUCTLF#WR=Ky*o!V37)~i_aQh#h_e1 zDm-Z~ODW^yqj~9I%R{XLXB!1Og}GFaSv>iU2r??F%iE&rXp zqYL>%ngUg|vsMEEqTDw)YEDB=Vp)52puFg){NtpG8G6VlmS@-EIaVQ zcznyfGZ`=hst!Q#C^fO;bN_|Wf|3#X!`luuO{C9@ZoJMn7HA$xm?UgelqSjU!i|{= z_5Gs?r~C)s7Zkngd5J?&uIDhSWscj$UpxZ(q;zl9Lq2XvP+6#_nv5EaL{t#%<7wM1ND zAm0vN+qFL}1pg#e9$4bgemhHxZ}&<%=cyt$le913zj7~b0s*w%aN?dfzsZ~_0mD?J zqvwNQ-GNQDgL16c#*q?WCKV%U7ymCv1e_4%a!;8#lD|%;!lhP@b8Wn+b2~xIBP+xk z+)OVj^Y5cp_F66bbhfVFF-=6-JzB+VKfvRAP6m0o<0>vKP}iNwDm}LY%x|q>BrR80 z)mFC{FIg(9vVBk{M-!L+8Ine>(>-$^f^sVvqeB`a=JNM6C|Ojje@f7j&ryG6BcBb}y7pByzrk=Qzonb%jxDog+ThIy_XW_H+|2i=ibM*BtidqD95CBHeIKn25sb|f|w1wmr;M65| z0A~E2TB3k*@8v**mL-1x!`Lmv%nI*c_}bMuNA%5HRZZm`^PUJYQzry?9?@prp*M^CHCXE#kuQ*1^3ZR7$k zV^DwS&uh~I!h*eS9a_2;uv`Z;$`x%VUvl-?;1zVgH5B7D8?tyYSvm^1+xa)6LTys?kbXVKLM$i7dNkJ;j70}>|>B843~U2g1`hLXmJy?f0x1BC@> zxZ*uIQA^J2GMVS=O(Y9*_{+ftjS$;{{c1h70N)wIE9nnqe}rX#N_TmSdDaXQ$jn@f zB4&JGz9MaWTj12M$E1U724mS@yZT3M{?60+gxX`01#*#u*T`&^q4y>|nDoJ+n&$iY zV<|;|EE~_H8hBEiUtjx$XWLE!Gfds~J-Nx!@Bf}&5jjYL>x{NXe`))BS_V`guFuy? zQLp24Ip`%Xj?|*~#y+ zI$YbsmI>w;@KEz-xWX4yC%K+5e~e@Oq5Kq|8u}K(=**}ol*1D9{)*m|W*VlReJs?& zn?1R<)Z(nz2N4IS+m6=5XFy}AfdbMQds=Vr28)XYOCYDz)pIe$CNL4%OV9x4h&Ugl zTAs737HXES{#0R#bnLwUCW9OmNHG$n@wO2Q8qp%y$M&7vUgy!jAm2K1EKY~e2oay7 z_8J2W3`-dlpiR6~A>|zSeu(eJ;y7(rUw?gb{(T;`gpIq`aE3UQ@N;)UO=iNqR;R52 zW~Q_e(l@|l%Amj8B^%de4{M0fDfKF6a+PrWbKq(I^|(F}i;x|2hvlXeAAEGPxeAIC)7U zOT%>znu#3_ZHc`eOTj;F2hFoa(_p7hsw*wAQ=Y%CU+jOylbfmS3GC=L<8_r(+Hwe+gUqU|CwRRGrM(Z#{277Q9)* zZ#7L2IeOadi<<9Zzfl?G+;Qj|WcUO+LobOZP*3PJKOi?_2AIoppO02|m7 zRCWP8vDj%&lgv-1M^@2mM@fO0#4Z;UTpEX4-_2(s&t z6S+r(h>b;VF-rDIja*8FkB3=zqsfp+50X@;9VObNI^{iYLTmaMtj0-bg5*EulCu4klWU#W!zWY5f3oRsUWzEB-hyoA{Rz(6Ttba zEt|f1h07mn!80YC7V|E|yDc^TV?72;3?HaEsbReM>h4C)cf}sXQ&K2J4w2HUL9V$E zy03k)o1N~7O(DZEabr^Gkw*tg34Wp*t#M?H^-n)}IM`+0N?}b_BA$zW;uJ{S@znM7CrdP@j?p=^$xP9ncNBeX${Wc( zplO)3i#0%LB-0M-@$E0jTb{|1`-yqlR;yQ9h$70?r#)_2gIF3DN@7v|XRnsmgYhC{ zbY)s&XgbCHiQEi23l0U^Yb)TRE2d`28rL)O;?>cdcG6_vA za9KYY+NIV+Sh78|@u*x+g@yc3@pRE(4el4}AFiWwB5cQoatwQZ(WE<{wRC&@`k?uF zyAA_Pd~w$duuUU#adC=`$)nUPUZgv=i+lD#(t~R+F=R_7qu%UkaRgeuQ+EoguT;t| zE4OAVnA_GaiXjixf@0;X?@319#@Nm#s6-;QzLCdc0)3gTImY+HwYgzO@h z4$Ms)SJ#zCj-ZL`TIq9HC9kC73L|j}fqJ1i08)MyUI=2xBks>$y?uMLv|Y?1sWE%d zy3ifv{Ov|krI4eFO!0y#+7yi-7Ujq3VrNu6>AHJzAx{J-!&B!>GRa< z*OqN-kj`~#cql+|t&gq|(POun)Y=sKjHgS~0}6{u!+@52(Wg!&`LI{&T%95;Y=0%wwboTruyp(wEzoLLCWm9vRem*k+OwQ2a`j5KFUpnc>62>@ zWiZaR`{L@s@I`ckv_>5INT3?ZzJ7GHNHhXfZxNJ9qp9CX=A$v&x7bj}?Bh{2c=_fi zrV!2GD(<3v9z+;HLiSieu^Th02eTonnvT?M|ZbR8VF0r zMd(+i%=ukn14thIk*Q4|=Az&?65^*2nu^K23jSJd(Fr|wkX5t#>rZ#e?)rHD?$hl~ zZ3I735mxuF=nXu$(fV)Tah@5R;UTy9S>iwRRRV1B$W`--~;DJJ*z^;lzPb{@>KcE1JWu!*CrtUPhQyF=lUiURk7GOb-dWEA=PB}qc!7qDh3oJXTLfikR zQcobFnVz%X0mtB?9M>@GCdo#dJ0TTWSAMnv!4~vys%s(s6fv~Ilc;MFd@_(bBK1C}&RW}fQh?9h>Bon2 z`?t8gQvUfts)n(G5*h1sRVJmd0eaLO4)GBVOAp!SNLXK#K~9JEMTO6bw5%=qW#2m@ zvqizjaH48}1W`2S=NJxCdE^L7pn)Btiq-8`gOH6Va?D~zEjCb`X~g1OVKIrCt0Q!~ zR(fc>xlz-q{LI3$kcpU-TSbv-$aifNB|wIxp!MmYU1Qc->fP@l~* z93C1W2^C6-mX`wR(j|Oxe@F?cksKAqjzh$ZyewR{Y;OoV6gD!^!9pHgN#*+FlVZZi z4fo$Ljs)wZKo_+@?+_f*?{JxM#$~0Y zRpM4U(l2NZBf>Z38`0Izcw`Os0W&^Qbu{eZqrvUW@Xt-9EtD8|r^lw*{$goNH&J-a zG4N}3Q}NOM;q$1)Ug{FQ<|&npG&|Qq1#*27VE#s zVGHr9yfLC4!7rn!@G7%YFXq+lQ<&>`5y7K`fRd~@c~Wtde%?CNd0W4g0h)XW!~e!k z<_A3nvNUWdoSNv$6LbLc-#l<0X8r47kQP0Q0hQhRW+N0_{*SqKy~iI6ugKfpy)bkv%T=7#w68P$ApQEFQ`2 zz-LW?Xe~-8htCF~Gd_as_ggjykWo)9hspy?tLGLi!x763W`tPAqzp4BT-9dSy1RC> zZ_@qx2@94X2U+FXM^Hog1K=KZEE`G|nLrQcHBfXN7Z)+^@xH5@vG4^1){%P3L=!`E zaRO=Cj8)`3>DC(O>%_6klU4PzEQK}P5WBKd**J+7(}DwT4G;sNB5J7w{A@zru^Z)? zvuF+hSzb4!qI-G0w25G+s5-T9SXQky**83@diIbB zy8?}U=w#|em669de4(yoHoYQN4k=$LXaQEeJmox<3b@i!H_od}2?snwG+mzG`Poq-8g*#w^QtKoR`8K@Sj=l}F3Tqx&NITcH4Vt0&o(lXK zrGfmkTOQd>=qQB;VF`T`Tcij7R>7n~_m10Kd6)V!{`3HF`$zpdUe@Oe&++$`3yLcd zwu=QCtQnvYyN4{iyR=iYOsA2tEEi0Y+|lt|DmdRPk{OQk7eP}xzUM8Td+Z;UK>n2| z6i}kT=3cY3H05&RwU_75)iLE_be&AXl9RHgr4JLDMtUZDTdm>rS-|)F-SG-vdKVw( zeDBu1na4QF*HstHM00`+yrXYNq$n_l7T>ter*7$J$vgzBxcyON=Gp$D+f{Kz)aaX^ zr^40iPR4U$R&9xmi7)34rOoeNHl3hzf^9W)?!GX2&8Vdc(@1jBzStUzwehm-{YRO0 z*N{bOgg%&MxC90CWU5@V4tgV`bEfyvrf}b@lnmA-W~uh-gb$;SHv=mwn}5m}*W16u z2sZqM-wGQ7L!0I&VIP>lQAA{zK3NcD{ZCD*F(g+4>wGj%V!P5B4$kGz7z;kqaM zu(l5wUKDFIjU^OV*frmxVAAt@) zc_6XM4@Q%z#?ABVM=Vw5cB|3j=Ka35JnI+wJc&03wNsBjveEVpigL9nbP-pKO7;^< zv|0(DY9+S&3FplxTwX2hOwwgEV>U1lhNBEv<}MY%w~}r$>%@M>@y2^3R`n=|FT-59 zxRNKg6+D_$)H2_d9tG2!O!b^VYd%xSihF>Ns(MH3_pGd&p6@>n2kJ*$V3RtqYR3_qE66)By~XwaeFv_QE2`+A4em0zxk9?<^aj@9#=O%rOTAK(4@JhM z7SYA-MOs5uT5v`?xQuh$h?Q48K@o&Dl3)p!w9Rk51JYRSiOJo{yUkfZ$g zKRj&3V}&D~-s=;%Y^b60v5<@M(EtzS!HrOCM+ib>ej}?+j}tAqU-C0BH(6dWWA-}E z63tvwxFx{s{Au+Q%u{jPN9XP#% zqBn ziJuE?B>&^0)IG+@RBmBYr5qOXcaPx>^S6lXvrh*&R`rSporR!B7}>-Gys*Xj$N6&W z-pv!V0jBLPDu3>UY2lQt=T@fei`S^t$p5SE7yC_1dhd~n(Aj!QYY#ds&te2OGf+&0 za^Z9$SBPvCS}*4<-W^CsUtl!4Z`@zLWRy zsf4Vj?}Z^=N!(pedxQ5icIgm&0+mvzuAc0_=c()U*;)a%G8S}EJlqyWDkUpF#GJHHAZseKy zm~MTuIo{$Y=ZboI-Q$Z%BV$k^kmM{c$qNmfpqSs@rZIBI*pF2$Uj+pK-m^EZfe;o{ z)#+h9w8Gi(MH2}t-j=?sCVHOmWCmj(^ObpO-Tl+fwNnlAn?a@%i6{qd(J(2$>LEAC zk@skqKx{ut8gnKz@@4sKUP*w&&=f>ZKM01e80&3N3i%(t00H@Sz#l?@Y$Nq=8j>jG z|IcmJCI3*Xzf)WoSIGW-KlOX7%OmEv*$w99nh+BDI?YKUbW}6R(wQeUWuYc%^R2c) zn?HEeG+7^OZ+k0AQE6}DSS$djRr?0ZdRL^!03O1RHUgliJc>DJ+&~I{>wng7{x6Ye zjZMFfGa^5tOWYBvYpkjmBQY1Qzs{K04BVEN8!FTR2QtgF>v=$R4UwREQ7|}@Uj2`S z`lui}rh^OdEHl*&y-Ii{9=0A|e)H$PQO*F#VR1(L@{{%i)$cD@42z;4t_&4!H*)ev z9PZN55w$)LJsU`Uo5lHuozYI%=L)BV_OjoArU6V4^z5#*J7piErV#2~Q92+M$c01B zZJi_p!42-84z+S5j1YXaxdC|HIBSaNkO_ z`r_sFn6X%YRjxZ(Sh78*f3cju=|;c4z9)d6&|7CZ9!cKtm&H|!P4b;>{AApPL9B7q zD)EG^MD&Ba3Vz;5N?gW|KPm8B2vlaZ&YPPhOJ^3HNG1Jj{>{koXI(nh!6K|2I7+|G zw766NHO{5sDYr5zCu<~?(TY9*EE(EfI@eDH*Sx&Jhk>vTQ|Y50L7{8ft1S_)3?rMP ztRY49*^Dp514lu`vQU%hy-}*XBoFr7X8QUZbH_PXrJSebu;wL2nrqd%<&kSsgO~Np zf0i7ip}%RiIdjAU54!!0^lDS^dSa&)@1~Oo+5z53s5l)fs>_ z)ITW7ayTlgIP)FLT%cm25{k%6^ZffsK=Ci5IU&JN_cWxKJBE$+U+zTB`2I_hfnxhu z)9=3>nO$ON^RHRghU%Ck;rhfuF=k~|syz{T3hpAs(G@K*QX2m%9xPfH0YCgq_XkMY zi|AL@?6rfqllSq}e&08#L_VJ&Q5E0@Um;%Ov)gP;_YT_Ze$(k`cvkY3RPFCL7AB8Q z(SKiriQyvb3kediR4nsJsm^~m zBBDMx8?7ybT}CJ8Xam8VLI(R=k-@jbW&JxjDfrayH*^YKuIY;5P{g3}|n%zzhob?ioZxy(gmS&<#?&|f}78@p9u1w!MQ>qRRk(ilSEFP}>s_WFR zupxSdTc#m7x8#T$je;nQFRrr_NTT~v~pI95puQha8UisY3+vfJV&%ByecKU z00x{+2~zql=ya~Da=o!>tD^Npd?uy}w$Q^D)Bg;m2MvzEwX?QQQFkOG?L&@(Hdv+@ zB4o+hi%P9I9D3@va}mb|{0Cz%%$hXV`xX7>eeg9d?V}SesjS=njgu-k}q#f<$=$+F2Re2f4SQD z9^#a(Id>>i$5|R-H}cybFLVf(X9<`76hq_;j*k>5$uMP3g*Hx|)K0&C?3(?+fVZx; z@r@zXVngtUMqg0#yZVUgfrt?@p3x1vWYfYNtpJ1S+~5dGyi6V@D{4ANAcsnFbW&4a zam;)phDEnl45s6dT}OYU-?9%vzQO69`%gUZL$BG5+~;uKVrf@Dan$?nn0Tmx2diKKAV4F zrz~M?=;(>=uxa(WJ+5cDdS|$R1vU^PUR;IIxPD~RSu3v2`}fnCP)T}uvw2T%-VM{m z%IleV$+mEKQv;yD={I_IR#HZZz;MkBf_`m9r-lnxcC^n1DfJ@Zivx&Ue$Jm<;oKvbZ2-$z%W82wSFzGC zw2d3pS9y9ycGH@8_1=58+-ZKYs|%tyFl{wN1;vJ$B1LW7qlKPjcn0o)5;k-*f6{>s z)NW09pJo=Fju}-EeAEb+TMbIQ=K0i2C>^ZxVy6w!#8HC7{L?iy)UVWmDVIfoKL|FX zxeG8=HpjTZy2aVEFf~sIF6x+#QG((;x#n$aa2K@CSQvOO;{tu1fV~;3G3cXrPMzrX z8XviPl?fVyizUnesV3yZ*UL`zOIjqP1J+e5C22S+e=dLbT7!(48m-8s=V%RK z2dHvbY9=8VSf;uD@W%NP5BD&2-) zXXioct}q0j&$fXC*@lEU?{Fz(fajgijP3Ctz8^J1s-$@GHOpEDJy?Tt<@1*Y=&@4d zoVAS55|B(_6jNVB3SaT@?a;0!r?rQwwLMsKoxoPAA7{xcpikdrEc$|dRV-Qw`7Q@t zkaFKiuZ1VQ+^mX|afZpAiV~+B5?Uf*urfX^#;G>ib~(&Cz(T2_v&h?3YUPKtCd=yj zcb0nK4|e3QBNYG}_9Da@`5_cv>v@b+60=xl4v1M9R56DbDxDZmlJOPBu5P8eMZL&9 zY0#65NHqZ`4!L%)t@lpfr}S+@S>z%X53=T8X*N;AAG^1zcV< z4P$1l(3BbzmI;j3{tfzTwP!<<24?aDOyw1%^Q;L8bNXOz{-W;GIv~HFd;a8L(f7A( z*n#1AMc<-(R#4mV|KToB0z_j@yBsfdL=J2?QY(a{c*-K{Z#FNAOVu07d})%0w^KMu&esbFWIA$&45rbFXMQm0dDDK<8s9 zgb?gD62Bmb4I94Gw6}gvqOSDsmaZ&W)JeV?Nh+Hj!!8_v`Mr|Gw2(a?d1PJ@0z<)- z)Q@cM&9$fyU!e!i!9flcY)aC((4PgoIVUYxCf|@<(VQhhq%Zj6pnt|xT6U>;Z9$a$ zjzBSh?MJBx-j4pqZIED~8s zn<6{f5hbO<%9L=Okl&7#gz(sadvFT8Woo2z>xE!5TC?ZX+s1(L8Fym5YN25sA9wV| zmW)K*mX~$z#9HX~%iB4P$LBhg!9yz{-aa?u*X15qaHY$C8(zJGf>Nx1<8P_RKEcr5 zGn*bKhd%$0UJ!}Z#!XlhLsssm-Ee?BNF!c9*NULAf3kAvRF%$_`1yv@s-I`+Q? zH+U-iT9wGG;?S`2#h?FSryxaAH3wt>t;T3aN@)-veR6NatG~Ktd%p&cT_7w$W(N+t z1a9_IQ_r)dYXKqKE*;D%=JMms(^B@)HZE~<(-{8@9cBB`Sr=R;%#W4CvYN>Z#i8Gj z#NN~l7QW5yjgn?Zrgte(r~w;HcT-uZwr&LyI5r2!W?z%czS9PdUyDYxUHfIW8va%W zOor$daqhb)2kO)0pTZJioZu2t{0H0<_WCi2*>Q%7eV&s{eN5!lFu??Q9><=)vtetZ+21xURWlyiM zZeui@UzX$um&i8&j~%`{KR*G~^TNgoG(CieBvguDH}&Q>_LmIrfOR$&4}g}+$sWA> z;LsIZlrGcw6Qq^#t$0g*?OT>^ecRD6tU#lZq5IHG6D^)CfIfT3GLl zA}KXbgQ_$5D}N#awwhFffYcgMLIZC8Wnp5P7}bNEOSMf`P!cC;LwE-b%h?iBFycB# zA4zL}Xt4PLIC|UWY_L6eGMb}*g+gJ*FDKM4QV)!vo)Vib zY*xWzmdST3GUxY5len{n%OhfZqP!xGVVRiNJD&2rXf1Mpd|l8j!bPFe37vd*g$n>A1V>;xw-LdBD(=cL|QGgEI|6c7@p{Zt?O-uK8Z)h5n}>zAu(Gd zAcD;Ts6Xx0C~mZf9#J5fze^=ho;{n;y8U?meT3&J-H2)HC5hdE^^Hf@Uci{(9*Pv% z%ZRhn)WD?2Ro&{SKP8%P869|CEK)BJ?!)*Fvpvk_di|It6O~k=ZtP$#za!YstYwWx$N@2I%p0(m!_!zMIF*1GKGr8asU@-h`|>^_7UL28G*xc)JDc` zL(j_3qe0rJUVpkCLJd-x0yDGLU|I-B2<{r>hT|fxiNRkeKrIg~xwTeJ9r``&t!K1R4Ekx;=1qO!@61#GVs0pNT}6=N7{ApiW_kxzOS=9=$* z9m3{w)d7>c8(;A0pcO^>wZf2+hM@&{RJjzr*#)uJQ}fRAR@iJ?GilYF){=R_D^BtA z^(0y`eKyj>5nyhZ{*@f2%`FZD_Gw+`AhusTHeK;d-Hu#K2No!XhP3e!je!vO!-A*T z^=2l9{Su)I{DY}TtJc5mj~+&)nY4T4TG?m`*A8{JrsbK6Mh`=uKA7b(86`Br=g*Oj zRr3BZ`i>PsN22;6ne@KZf*;kzD%$fjRU#m2{DybpyPpvumu$jNZ~0`he1}V9h5+b- zJ7X

^=rY!V{Re{_(a9Rzu@IXBuQ%&0yPk5JUl<3Cd^_V(fs&c7@uk`sO9w*db2C ztMo>TWhGX~R>O=Kl?gevtt|epFWOW+*>L3CbH@u8RwW9qmQv>=$JVxHQ zW&+M+0#YG#j}Be1_ftaSn>g%{XK1`Uwt4}g@m9(C(o7sMXNT;Iz&>VUcBdM`mI6-) zrz_b+;ELB^ZR)XQu^XMj{O6993E5^~t>pWgy$TM;)6L+Z>Onn>B4;6;B^XWz?PSo8 z8-6SP=&Sn}q<|=sD3=5n9gEKG3ZQp@)rDa(CrZ4a@fgkO(12h!crfRlq2t6XtF-pMFdh z)7@=*^lm5fM0!o=`1HYGbxxPXwi6>iLTG&m*?Hh0Ovc zO{DIho>i>QzN_cOa0s}I;Ci~WkOL|u;1!(sCv-RQ3}J(q1!XPZ;*H#hb22&H)LTgy zfJ!=19a+XG1bd}_Xw&DG;8TIb-*F|#;e4i33b{>|tBUP^8qsij$3v|jm6hEZ3hmkB zUn#Oll75DTn_|58I0uzCLakyv#O6F#Qo&6xG^J54(E6c7HcjtSp~$l-#v_X+wDcLGBfBe#BzhR`djDH%q`-<<~6eZzGz(8+ma)i z0ULQEky9wpGzX);7KpDxdW_{jQhOq}n`q(g%4EIDP*;lm6f&jHchdo(q7lo-vrPn4 z9AqpD2OEHKW^1NJ|NPXNI4Wf6{rPIjL!ZuiPYjCZ_xCZyCip33fI%Iz;w8`B*ux?M zil6~Q>rlf`fWpWck$?cwcNz7hx!gC)=}F3_U5})*&#~% z?^CT3w8ng2ebz#yvbZhMW%Y-u1Ik4%`kOuiK z;2^lpnK#p>PYp^{QhS)}^)OX?I5$yC5abj&p3pP$vC94L^mQKFwkPY%$}KFH_wF<> z(umGod%L^VTq)vpwfN90H1~cOv>d4;^NagybG@0;iDE$(? ztP`$I>?i7Wgo~FSM!uJckobcP`p6M{_-xGyhX(-w3K{Wslgewb)FmLvi}^B%hA~(6 z*_a;!FO6mE(saSt70+<&;&4}1ftNT3UGlU{BGI$?KY0WiwsfhVjtl@zkD%5yYsSa8 zjcGt!CYiWBG7hw;bvK{(4rTL)h9_EU91%RIiepp9g9aF8X~AE8ZPKVZZa)%+B(*W7 zPK!5)7oaOm3Fx0xxVYZ)#NA=Lv@OGy8m@+|EHXSu$v73G!!02WS|CP6{QF0#)HG;k z(>?$nxR;Yv158Va`L?UKQvJ3xz3Bzbpr3|vHp}vjUD%Bdge;1P)S4A*XMuX*D<4Fj z#{!Ry6(br-rL3n^@lOP%?Dmb0Agzse2({$*>;6$xT+F0a&A+2l{~W{Q;~MwNo7sM7 zX^Cse+tP29OS`!^MiiIkTL4oUEXP@eSmSKT>FZ$yBJ)3?UfgkY~S;M4T%S zzM4XEo8XtTOeol1A!*51WAY)*{Q=f6Lu^oO=p=H>ScV+8n~zVj3-QV_(&;v5h~iM> zxbRU`+hrkCYtsd0fX$_+EJR1S1ZK7HHP5*XO?624BAMpxT>S9Stb$ zWh=c6yn~>&G?}s4T}rL`lMkSYjb=iarC3Mr^P9@#337oCTzpF!z53(1Tc)SW&a2g? zZcd=oM&AY}HK_YdP~1AYa4JVR@Z>)RW(u+nyZ@Emi5YIifq=ndZbaDHdC|UppCCHr z`t0NxiXC_GrM=Bm>tub2%uB#Xw;o?tt4o%_Qk4%8!{;lUyiK$gRa<^w@)1Z3Nn!aY zGB3zClX-TJy)XGisHW}iJ}^oVCcA0I`ze-0s{|H5P2=0s5Vn9Hu)zE*`{=iI#1r)i zSJ~!q3Rr9D-9qBX`#ONWTTNmoSRJ=?8$=<#Zi!C4C2+pnZjbhAICIURn?t=^Z#%Dz zJ|@4KYO7QxSEE=Z8FIa>dl!Vi#x+Yv{5bk@#8KGxEr8IbQ=XjdN=qB{VNvJM+&I*j z$BJWc0+9!w*G>vc_KxDLit}8Gh7Y99VCbIUcJjaNm>?#}6dgV>Dhi*~Q^g16Ce+G9 z_y$}4(dOm%2%?O>(^REHr3-_%RY}Fa8gSG*s|^~vAH!5-=)=cvvBc=0wfz(NE23|(0*FBH=fb*kL?E}po>1@mx0k$qMtr;G#;}W206t&Nk#>}79mhS#=wlWbeC1x2iqfyip`li`LL-Bc zaKL%W5Z!aB`WHOEazy1#3Q48T9#<H)PNO2!;PJx6DO~Ogd&}<1Ltg(sMdV z_T!gJCKyB-^#W1Fc9Wr;hNGBhp1mw0fSos23)5(}y_J+>+`a4i`PH{mzj`4Y#-+Em z^jhZd>MAV*m4FjNu8ujtH%Y~4 ze;*5I#CKzhUI+Fw7p<|J*ri&<{0ajEZ%9E>E~@j?DtyD?QA#oNY_jfZTVB5K7i!>k znCmh&hn1k?`g-HQ52{AP1fWb@(qc?&u|J3BEiIF-tV{Be0}U7lqtBd0mv+^hnam5- zoe4d;wte0aZTNaXF$Z1#L_B~=?6=(|Sd%%%>cZWQIFm1Aq2JSLUo8&HtVsWf>(aJg zG5RcPGZ#LKwYSrjL$=3bo!bWQOFzzA|@< zhSV(^pgJoJKKJaNI9SU@TtWTJpQ|6u*a@oZKEY5YdZROg%{0JCSg}I*qo>>^uZ_(d zsdpd>-j=0FJT^8vZGD_D7!QvfZK;9J60-G>Z8!ANdxH*}Bgnl+kFRyo)_zMQw%DL0 zIy!_GxbWoc-Dv*&$Ull%T2WZs2L!;m{#{1yoK2kXs$GIMi;=tP#tTpj3f-u+M$y6KG+PH=2|!nE7nmC3nAJ4I`53HHVgihRK#}vW{GRDI zN9ctngi#n(iQAxnm4@(l*RPK!Bj0uvPzfT6sPru*y*>*8?|z%43$PZ{4l-g40K|K@ z?^f2{1~F$Lfi1m&iTA&Fh|0x1x2@{vIFjH>#wEKDCo(lHG|;yT&A|ilK3KX5w1Bvv zVaPjpf*zv42eNL568?{=)<0@20?u=E>&YwDVg$uG%z(PO1z#9QeT986Mma}u9xMW? z%2zJP2Q%X}j%I+9k1D+@@t(8QW!A5ji9(=cxTwwPfBS~u=N=d>%Icq?GX6-qs0f+Tt67Lz3r}AyHdJB(3d%-9dao{HN?qhur-ilDzYwQ z^|=GU48~$ThUrAR!I1DLr7`SjaJD90={uBU!so|Y;=Gd{lXO?XDS|{+f%1x(azL;^ zBm@8|iXI4QW~=>CKGW1NA(fBBI{D5fO@)ZBiL`Zzf!693=4y8{QPaccY_ZO+^#OKb z2H8l|_!@_tM3IludF`unkyr3Uw61zFJV&ek&+ipa=ULB&M3kq~K(ukx5Z^5u**=Bo zxu4QS*AU>Bf5Qfw@%z3fw+$0nb&gQZaRrJdMoeun8O`}UyY4QpZR7HUH!XXq1#2Ld zqJi~1zg>VkbpWB5W@Hjs7o446sOAeftXF#aZd=HH`D4%026^AG-wA?R1)O9}dz`7P ziRbG{t;EdTj~FL*%(h%kPr~AqE>};St#^@Y*|}Cua@*cJYBKKC2)V=j0$j6BoSb~) zLs)ia`N-3VK8fm0n2^m>g88*BHTjsZw9m#&;{!d%%c#BRE2PSk>?IH+4MB*|`mE;Y z%Y)GSeXfIGQNEjvsC}T87j#Ba>9Fw84<_aLpIq`ett)?hd8Cl&fHsLSIyxwN>Jb5o*gwB06z?6JeY zw@;pM%ja%az_WmBwtB&(oJVUzi?aMS8C~U?(&R9f<8dyS{J#nY$YnykcjxO z_OP;0*Z1OK zey+Z0O$s$^^xZ2-Qj)g$*(+L*0>4s}6Q5Ma)M=Qg0x-AO8V7-N)J|T!OtD);+()n( z;9b*}5^$V+9SGg40D!0}Ka2*e8r}))eta6@Swotf3B+W{iQstNv&+vUMNZH!Dix9Y ztgi8eKP1Kgyw#Oo2=gXhsLwusVrD8%(i!@n4iUOF0wqfG%FQ?6dNU(L23+Z}%9u|d zW+_WJ-D2=L#QJ1qNLl8g+-nm-DszcYBU}A#b{t!nL3bmCIlYG8)OOvH^ue~uyQWy;-75aVx28;IEI)~0C$(Zd3) zZQ$x4mvY{ZjRyCHNa&s{D%ey~!XkP=mY*#SkKTkHovzK;n>FliNfbDx(Xt{tbW$Ag zp9_uxlBw}FN}Q#MT?mX-Ak^gcRZRZ8&>(FA|BfR2DrRATy1%ju<+O1Kny>9Aaotyj z1FMnwTVQ`D*SuIX@QOA+`dGP?1keJu9YUm4<+70W_^sR9uFA4B-SOW-H>pT1ljX_O z12@>>JAiOq$@-P=;VvP&7&HBw!r~_Gj3p1|9)X^NH4-Xyfw zXASgH_aLc#FD=5MRcfyEFVp&N0poX&G_W-4ho+Pu=i2oXKc;HuP-IuteM;@}(Ij~(Gy zlg{BB)7x&K7{E;b3FIN(*tNd9k~N#)L~?>9HemVZ>z}}pBLBo;H9CsfKCn@A*o20$ zm5ImujYQTIkGp-Q48eakgn?Z~ogM=DskwuX+`Z`X>-a*Qp2^6x2`tPxRjG=Qaq!JjlfG zN3#oT1?}3EEwinCr-RI~tiDe2P zUZ{6aO)?h^NVj;Tp^hV>LS*Wj-b+bt3h^&zJ|viayd)Cy^67LYoxm8Qk(LeV`U~Sj zOwcsZfMRD~_46c+PjVol=@r#-S})`r4ME>o42(GpN9{6v*(2Y_!t6$h0at{40*0uf zh+r%H-vqsi&Yl@WP-U3L5cuHzARpCo)ydbqGhMmTHGK}94HM~ zUx(O*Xb8_AjC>vB=Ji;MN@?7Y6g>O1LqouiJ|z8X_2tRk(LQnmHLMDQX)8Q_J?IwK zqTz6Z0~Zck3PAMKALxaq4;|cDX?ICWePMQ&k#?e}2?~M-T zrS@I@bU1xsxB+;>@BVN)bX5|l2=Y4~**|;+G?|GymD=pnQ%((p}L6q9J`9ve$&0YnOeX~3E4q9eC7liKGG_+knSX0Xlqv%ViQHTDk462(n%s zVLIHcInH(TC;nCk$hmcZ&hrCd8{>bXjt(Z)a)Y{XOE!x`aeCJ+eK}n*Y%iOUAGz?r zp_Jlfi6VoL)wU{bqoq@U-s%@k6^~jX+(*FAY0@`ElcuLPsp3rs7iX!#OvHFmi0@>c z1BU)UI|dYiu-Mxjwt@#VVYaZl^Zg1Y9&oE8jvAH+uJ4~ixPtRGI?-#Zbf)YjQKsr3 zC*D3^%}a_3v@8P9*d7XpHlar%we0bY1Va6~!-+saYYaXWs8Jh|EFo2?1+x}*oo}W4 z3VGvq921|6c+xc*|ND0by%M3nvC-x$CX<-dN+0reqqbALx7~EP+`;dI4Ux!o z)}(|$BeDAQ*~|#O3vVEUkD~1d!c2P&v>DceGI^^l^&eZ@MI$%ysknb@Gf=r;YESqj ze*Z^1fx{amm4&8TS{Ym^;{5gCWDx#Z|M44VO{BoCU0-pf8HXqSc-uE#KFVHUDs$C4 zqq%Ci4hlMM%MD`vA{1tA1apQKllor>7&Z@zvTFC>3FonTAwArf+*=A{tfFymfGAg0 zA}XB0vWFf-5{x7Hta-~752C6zRn$*PW0Zf^uJ{^9J>@d+aMFwJN5H=w@Z#9WKT4RG zX?FX_GApnVX@N0aA=+L4_SVAv;y=FlZP_)~UG-Qf(yM$PC;2!DYxnzL`fHROYrF-B zpF3ss8QzX>?e#`W7NKbZY;gYY8OpUmozz+a6+u3 zz-=-Q@lnoo1N%91sm{kZIMnOpCZ6V#N?VT*kDt#;h6)veQXD{vJ zAe^B_lz8z?hTw};Wgg=(1)aJk3MgYWN-8orz2L#on-mEPCVcu0a@E>v80?2oi(;|- zIdV3i`4uO@__ql7x^z3Y2ip;#Cpr)62#451Ivv0o&4`SXWof+Mr)erYEdRu?@DN3{ zLMi9F$bj1XQU3flJEdqN4nB`$u|&BWV)R~Wdtp#G#Xwo-KxMbUD=id_p`g>74I%J_72^ zWG^#~Mw~jfxIqFwc?HYj{vEbZ)bj^aWk4yV_4I@LP?z-0>pxMbo?>1FCNECP>1y~Y zF!Tp&tJgC;YC8}!hy9D5VrHUbjE1iuDSj97WCMI~(oP@DhTE!c+LV4d?II-{f#&+4 z#MrPow6#th!c#lS`ZCF4rwdTYWxOp6u|%Dg6(wan98IoSngh6!(2(B7gR6+tVc~OrhH&uu@q8V(a{uZe--?e7@xZX)ME% zPA2aM$s7|AtQD!g{`!pW0rFCff2Yuhj|ykrH|68U(R(a(UFOw~|7sk!UBfWX&bHJO zOYQ?0P&~AKp!-xe;qb9{ZMRuvZoVl@-Ux|V3;+^Q-Ynm&5dJZ!?LI?(pXBz{VZCi4 zZryJ!t6Tl)5|kO}IB2rV{k!g2D3tQ?gZC$9giIEF;`%&FSK2S(k_bhG7e#}^r>R>M=84!_kQ3aJwcp0Y(FUvk8+DX zu82jC>qbCbx?{^@SB+`}AWnz=C6m$+<6yv^G(K91SqKYW)*^K?kowq4_La%r6|Pk4 zw11U6gO&`9tb&Ey>sKC@=kFWu3Gf9iFxlYL-s@QPETg_E6@s4reB*0aGb$&sY9$9;hoTt$WFMyyp_u^lP5h}xY{N&uZ z7y16ll(cZ>ns2)nZE+iIvhjUzH=DKhxhA{Q%u?fuz|`C1k$;dWtoyFWzL)><10;#V ziEx%EH4!y_(zV5!@Q7)0s;Dcg7|uK={1evaea?5?qSi= zPLm@db`d`o6!W+?GM~zV@R)Vump=LkVC?rJUo4qUnF(I^P9Lpl;6W4YVH?1o_UtT5 z3CHpw<%%vSi;^3l)LWhjvVWYT80$Hm6DOV1|aCmSj0oughY!#75FMX$6 z_X_3uIMmXZj+0jEFmO?ezh;VODW&#+=Jx6f#kf+ zhXs7}_G2@fSye(sb2q@&%tSMsQ9S}bda@i-MMV2>nLTFKf)4JtDkue>P@qKQDKNvF z=R<(`BT}|y#B8m6njgp1yT`d!&&PX_0u!b!60MMdzz>FB>*wk!7Nt#4$OvYY-cUHQ z%n79oq*jGY*0Zpa2!2H>5YJc*GL@|W@;Gh$*ID8|VT5Z&o8%#3-;6MhgS2lpt z`jDenoZ5<3W6L7=^~b`AybN5*NVJ3p`ZY%`)xl_$$5DO?*1x+y zW2$b7TzQakPss^Wwg>+I!@iGFy_F8X#=7stT5|oQ%HT31`H7xxQ7r`NY=5Ou6v&c& zR3cr_sR(bs&o}HoPsj?@xQ`!3-I5*Ae@T7_?pOSM`?O5b6|hf7rG(n}>6_)CR^p9F z?0b2U$DbYmvm_s|zq&)93| z?%8T_$$Zahs0Hxm;6<;08C_2GZolu~{7VVr1u5mB-*%L4##K^G1I-|`z#6s=&~{dP z2&;veWmC*gWu@o3gZ@v;)y2^6X)Rek(h(n{KB&+8`IAy|QTgX=Hn)76miU=|^DJM- zmJ(Uhqp+waeTwErzU67bcCXn7{W|bR07ispu~)wk+v0PL$_Nx)Rl6m6mug<2VcvXb z-*s-^{;ljchGD30vKr3a5k|3ybom*Lhr7ET!A$KO5SuSzOFwa-C{-G|%7@vFgachR zEMLNxjS*Z`wbpp6bb~Ma-uCU}SXhX$yukH=grzByFD31zy(Hunwc}fg3e!Kz=VPt^ z$juP7^pgp90#A0_|6#E&aoG2{6Un^n;Nh*0le5W{ORnXjQ%z75Q=Tt zuVIE}h%0Gr$h@}9`e?ZFh`XZ~{K)5Ih|^)m7dU>ZiJvnosA zmf*>OP-$`Q@`+Skeozqoa6VU6?P{iL5z=-_SPf;}&XQ7{pzqw=;Rhp-p;vQzBA zYSdinWEoDT~X{8;M zr*=63PTkk@I986k(NX-Hv{IQO@NRg`!ynUY8wQud=vW8f+Br26;y5RiS;G+JT_U?m zUO8h#rxokquk#Z1)EhXsp^ws$VCqh=y?SpmO;-{*!}%!{P0@0_m6|5jD6?L<7}+v_ zU)pKB^L6#>#O_}E)~K13BLJF+wDh7{Ct%zsS`q1d!`?hmXc08)*DEKc34Iph4d( zZMq#T;YD(4_=xg33tuU1+;az_Fn6`lmvL%Z(MRzyy&sO*B=zU}ruLdXTS<{oSrgr< z2OAuMrf*pPTb6IE%=IAAGA>W342IXL9JsfMdVwXnWGdJ8ODuuo>A8N~^h4TPP-5Fe zkLLL52qTF4RGjmSm_K~_{r%3$*>f~T^nTgj;4MB z8U4mKlW<*=r4w{a+$EuIw6nBAHnM}IU&5+4jz7R`zu=;KURc9pP5|6d!efUSRj37i ztj1AIZmL1h{0Oeo?SW7A`c!=ugC``HecqLQ)K5G$9ZWmH?M?Nh@YeVbJ)O{AHgIHn zDYYNL7Q5?J*V5mkcjUyFB!v=IC%h)sH#4bzhSc&lmI&p3imBC0DaK=2>+uo|JI+3e zh(h{DBRZ>IoK$;9=R2sz?yHnVay8KBy(>x}3pIHzRy`ggr~94x()7#3U{fBy0S9q% zv^e~VtsaHSRNviFBa31V|1cA(O#yswXeiMVBdsXl3LM&_@ffx@lT%SuFUhpjBaf8g zNmrVG%ZV|#vGEB^nBJ(ZJFj-}=TkVQ-OT>3iW5%l=b((He+a5reJO0njZM~5k>veq z0C<)KP4KEKDhX>-PU6ofO-9)k_~uQNBNH|>#`HJ&Rq7Qs6Y`jPirW2!Gb{oGf{F3pOggf?a5TBNbyVWW=HUPVoVMO%8dQU{2+Pe0u zdHS!LjEwDR_Q|lSLctTF$0e2cilQ8aV-R|cp&v5u&z+>Mfpn(~EM}tLC?AJ|7m)Lt zsMo`U=t!#f+%;l=M6L{=o==qH70Ata)}gPry0&9kd)n}q^UXy`73b4X_hTz`m|c7T zF7jjlX8vF!$)}=T%36^+Sr+TOR>)A;u!PGdlnF!J`|)H)Er-x*9lGNk#46W4^CHIJ zID|_BW&|CFb!OOMNesXD+aqXTHo}iP{pW4?J>BoL&nSN1A}h5)K%kW+yHq|Z8kxD; z(;WM6YsF;NL`=8`pn4(%edNkZZ4kU_W8PKftyPnVES2_kXTpGMhAxFrKrJ`zktU5xa)T z4NoWGPBVxpm+NGs?TzmIGX+BVa9SXZ=Ze{rRD$;iyC!mp{)Wg)i>r+ZH%hO}Xl7Ul z@p}hsm@4+v8hlWv3;xAx*h(oQ-}k?aA`P>l0zsLFx3wRj2T`MA zDIorode=4}qTx2A9K2Z415B0@i)VpRUg9VF{D%|Y>l+s971Jb|Rb5~NWrH1XK!>IM8mH7M51KVG)M+k|YOhs3jDjHv;y3AS@r3^;9is=*PXjq1l0~5 z=#~;K)%AfRr*gbqo)W)A*5%rk27a@BS=w#xcK_EQW~mIjxQ8ejwh6kXsMp7ifinm^ z+rEG(4J_6i+#`CwsWk0kce%SgvgAT@Vf5Y$vA-QHzB@ShlAIh2gtkW`Mu#+ zgGXF$=eM*y%TgTI_a~e%^DaQ-90{#5=W1u}Rl%yiQPfc(oo<|kP7%XU7E;}Fg(_Jp zgOUn*^Tc(QT;CphxL&TP&nWZWTqm6QC)cpd{l*$8k0`TN^{!pqgyunyqN6Hds&I7= zOTdqIL|H~D>{d$#<&s+=&Wf~>ljT1~3*_mk5%3X*^53t4^ikpq_bbQnIVmE@@$;T6 zHIxoXGO%KCs(;k1J_?QeLgC4r4DuF0R^KLE*lx#OEpc$$;fVrbDk=;V>$SY}v zlH}c?Mpr*(-=NnWBAxkmD=c^eYxX{PjnyqIxZhXA#I9pI%4ABfxAb_VTgh31%#;F- zzPj|b(GS~D;(CZ`+Ind^7qKtVt5=xw0QF|s(CKH{=~t#GQvcX({lnAf<>C>%!c1-= zPH)Fe{3o;N`)p$G3y`+?npjmx5ZcYMq<$rg81BX|QUDA+VOmPjn}T#EP^-cwFW$UjE49hUPE} z4r=Ioe2DdV>cfrt+pK(ky`<9_huDfz_gCvV^HZToZi|+Clq6E!MBHACpolY1%`!DJ z8Bo1iGsCUh5Ab1o^#X@8JC&`0FUeyOj3>|(!b5ZlL?ZX7q4xJLtw}4@t zx)kpENl!NDw@f-v%U&sRO zKE&&SQhU$_4I2@nyA)%ehx!qxHK-)gdCwxM{c#B&2~qpjAw2v9Mf}FPYmQkj1a`V} z#*FtsqSymr+Y+x<2`3dTmrd%Vjqx+V)P0lL7_Ow-$(Ld)L^IiZE{!));XUST2Ac8T zUL?vV5jJ7^6_`H0PHC`*9QnvEvhdN5b$J?JLw*z(r@pb^NSX5(-Qe=vJjarh0xAEQi7gP*Oo&I%h(yS3JUNR0~}#xdmc$ zHVGtO*m|ZcJ@+4yGn@fZjMgs89D$o4wCbL~Fae{Og3{6P+bw%L`0m@|SqHvg_S`)Y z(pMDmAq$UB3i?_7`E3QyYp3U6sI#2mSPFp+H(A~gz%yfu(b#Ax7*~|5s+J!!F-;(c8Oi&Y|7dM^d>>=iH>>vmZ*GIsH zFSxrDSFuoH^L*NT{9kS@*S=r4E#)Y|nFD`q*7u(9Mv-z&VJyD`pT}X_dIhlEUa}5_ zpsx}GadAY^$cGdu_uMm!OtH?YC9QPIyB_3H(4t`CE%$A~zAym>R3J=h69xjofUuxU zH3|)af>5ALB9}Vd)UIz;Do%L3kyfe3^>Ic`1T>lLchlFGf55^VF&sQm4Zi{?s$8 z`lasfASp!U=G;;{dP^5Vc!=y1P*tf5lJ|&3xG!Qt5(SC|r73V1v1lv^HVg%VfncDR z(i#c|1i_HNSV%Go1cEDj>ddTa>&ISvFEZ{)th&3bvR6aLrg?R6_ zZyuNNkof6Mvga6K|EcKe<=XhC)JFjN@f;;!>Fl9Go;&TIN9~?I)*_Du&%<*ZO|!R* z5;}7~H%Rm|I=bRte?g6pF7y3K)MsiMp__ue71!tNq)8!Jm*K?O4ydy$71Nz5#xy}2 z^8JG;Bsp9zcoroHEo7vc!V}UtA_6j?+J5{0|G~i6P(~aDg8`txSWp%c1&V_bm_$Yw z8?7tb^wz0;>or(4lSRZXivai^)m8WT|F`-e(rU(DmValv_FmBLUODEV+Q)X5&7K<6B;oYKO_rmRsqmD0bjOsYX?x)@3%HWqq;9uGntFj)^42!*Mv0i715e51c|if z(+D?fg5a92qR1qfmx_&k+YQd(?Y@OoLq5zOay&zAPiXzL-`lggU-X-(wWgj zKW!ow$;S$HL%(%}M*Y`c&YY&3V>IJD<&9TFgDs?>%-obJ^%ltz*+G&M+{AGx|UA6l~Fg$q^AoSzL9lFI8O! zdaSk!dXOg9eXyiS+#F!6fd64+v|a3;Bv$lYp;Bxz`Feh+4#w+pnUSF5P#qSb&7d0> zlx^D6e}wF_O%|cv!}wKd_mqh9f_5S4xt^hv>WH%JR*^|4pcA)@G-x``?hO$;p#m%Q z_@Ui6ZfDeTyzncd&QD#tSAZx=wz@yD#=|+H)$l4lkc!hWz=|;iWgV&&hsdzYZdBkR z6o_i|PbpPCm`A!I0;3SXA|PPdr3s1>LO`;v^~BQ$MEr6+^uK2QF0YP8kK))A_-A;f zq}Rs43>>H|b`&rg`*FV@C#8+&h;Va0&>N}Q)2QM3yNj9_=30=A#F;Pwvtsl{M1CjC z?lnK9WbRRLxbPz?9;azVaf{3;M*PmPTu4BDr8Tf9V~ zuvy2RTb_1i_5SE0f8y$EFLwoH%5e4iljQn-T`r~h4U z`QBnOO)u6-qe;Pe2h*&k1pRd5C&szxpx8{52LXI?;XQLu+o^-p26fgYu-SkWr78&m zuyb&v5E6kidI+VUZV>>smCe$7FNP+qN{!ekJK;sZ>u+YePuvLp2(}D}KfsOv00s_0 znkFRw1+W3yt1Y-)3v+{=R-`9xRP1n|DO})FEtx@ysOKfVuwv=BTP4>a?FIn5C!G7W zZ07K2QXO%N!gJJXiWJ$(hDXir?n9k;vlpzp(VB7jcz#hhu1=MwGSy*GSbT(%pw z%30flB9j;(_&3I`D+_>*it4P#$E7WXeQgQ$W~G;cP#PTNo5!P%6s%l&sN$(l4js|h zd1JRTI&s)shJBtuQie8n{araqHqi6Zc4FYSQ&BztEw!c!P%*j%gEH|wa&^OxUkM? zd^kopMpWD9fFHeas~zcFo3aBUhRY(&aGVg>U^{TYNYgYyzS@htR((DF_1G7lRlDlt zu&bFpS$@e8ZNhZSWe&SF5)dXmjBDdNgq&Y;Ocf zs6+q<^*Cf)CY=%o#uOY2yc1^*s|@32q0rNG@~f0-fd>r9j!4d$JW%zGwm=E;6QE9Z zsCOY^+Y`PGOTAkMF-GQ}lw`jgK!#S=4ESn?s9-i?RrqJH)+8S<;cFZ}-&%;~rVVv!nmDTR6DWTD?Q`2+P zU14K%Vzl>ZyNiBR7IOl%k!qm1Q!J9hf^?4Ki;ZTqurNuZNccCV@AbFZt4V0; zzXCqIO-hF;OJ+EVsWl)kiZDoxl(jTmNe7?ZR_UtVh3f3r0ldGBzcsZvO0d-klpuRiEBV-we8vmRO8lKs(`UJ8pB>M@k3_ocEt(^5 zlDak2p%c9A3~3SZQ*_q3iNkD)%|N<0;G6dH%ggA)8a(b$I`sLWYDjoR6FmiXG&f@A z;Otx5vKP`%sYZ;AMS}=8CDB54=-W#gmMDTB4kNCtybp#&Fm_zfx-?`%)`dv}^}0gd zXsz7pn>Gn}56F~*N2{$rSQyCG#xUG-m!LfzlWYLKouaK~dib$RsbykUAY(!0ug7}3 zvmAcw+K+0n)?v2k5cq26A8VLC_&^=WIB}dny9=Of%aF1y>NI71sez;n?duv0ri}W` z3`vRaPN4bX(TC6f4=N%`$wT8)J%S_+p*tFvFlss%h#t84iH0 z+p%iKt~1W(%Bckft-q=SS*S_{`ZxH2(mUvFP8zh}dm%?7ZX2B(gSHDc{9W zt(vxhLb)PX`w?Su0X!@BuiZeMF>33GiDqiWc&2GKFUopUp4!OFC`L!YFgmXoNJsQKKGIA}u7|#2LnS$#Uf?>LI{ewf!%;4Y-h8zS3a=gJK|XfdKlG{*9VU(J3_~ z(7DeEoTrgvv=wIDwL?0%InJXWX)QGizEEzlG%_eO)0-AmVBuNQ8GLx3O>Ef*!dbHk z_Bf!tH&%CV$LmWOpOd~_0~OF_ur0lVcG~X`)%(E*roRU>tBKr zo4lKhlB$8ERO`-Jwu_M2JwF-z#dV;K5A&{|M2VRPxT#z-iUXV!uV$1_7fzX1oCfUNOw*~nZBSgY3 zJvQz5Cf=SL+-iJVNP;z%;}Ua^VhO;@zig;w8JaUWh;C8FHLsOeVWHE0K2(Hx{7V+)N3<%E2RKZb`HJ6dz78qmwm z2cLJVCB&Jo5OtY+aiRaJ2i?BT&khY_`~bbWG>(5-5P_^D41VZ_ojm$$|r zCz63CTIN)fndd-x=9DThnJEHFi@Ts_gMnZc$t9d&O0WSxvB+Y5BA#w(Rix!_Yh&&! z`KeIVyyU_8bY0D>d3e3HY#B9;ZDd-^;w~@r`~7b#4T7BdpI%~z1#HyZVxz^ z3CR3A`$v+OwagaB9`jWQ*wMS!)J}IaZ%2Z!W=w?QRV7qfcWkJNw!;31u&z*=AkxN| zkVTfNX$9y&?f}Z{5Cm$taw3wddgWC@*tfhiK^DwT`kdPl42LJ z!(#|3dv6I|x|c!rkTD>cZZup7T7vxI|Ns9I!a*=hC@K?$1wvrJkV+I1g#@7!m_%j~ z3%(lL$B*A8d;5ES+WY!yoJlTAR=G6+Y}A_9{hH77UjqJUZuPv?Jo*&)mX^|A8VIBP zi_$?;9l&3cf={qf&j9@W-wkEfa$Z52wSP(l;P}n!+zcp@q<{D*it*$^r5Z(nW3->`l#7tBPtOCB|$b@T!hGAjQpez*(g@}P- zC{Sb(V}`H1o+i4U`uqIms#S2kW~+*YUik7J?mr$2%CFXIYI^)I7r=H`dfB9{oO(Sz zH)> zZEz+GFQ{+2LnuhylqN$~K53~*d%ATg2C1psY_n+g#zkVK%>XLbIub4ft!S1QM>`27 z0ydz_U;qEV!MI>7I135{!+@}$EEo$41jIrRR3dk`c&RF_D(f|sD)UH^$yX~l6ZN_U z$*cA9`}D=p{Hpcu?|T0IUspB${J3rE{7pw-+S!LheG95vuX*G*2ZzC1u8~baq;}l? zzfP$#U0Ut6;Wky&wll&C1ZDmyAztC!eOg>>)LU}~w*P=`bVPTcK zK0EXo{XgPZ6WgnOLq`le;h1mi-+3x^be;*T9l=69p-e%u*T!P=6Au4$v8PjgxiYii z4y6*mhBUj)6QGt3H`j*yZV&Dj3oDg6Z|ogNd-*PICN*=fvlbzQ*tm=$8WGlil zrgy;Ql+0tp3@X$4d!mp%5Q?}Zu4Sc;SIHZO42%c@H~;_$WkH%oB>w<~S}3p-T1R%# z;kYwNJpnxZKqWMg*7@K*)&=+^NcDJ`^$DLRB~`h+XlRY$n2WAx&i5+Bcg6JiYn>sV zbN!?l3nU+CO(i>dBLsmd0-$D@K@D%|hqjE>a@%-Ta2m>!tK8r6%$-QlrE(kH)~VmU z!y;HD`AWl9{fD2`F$+f`ycYxzf!Zjy9vWC|ULOZICrJM5T9%e@&w@~UOq9#U?8+D) zQuKf3Ca$XD#UfYF&FG(%vb(RLm) zMWkr6Te*f?0D4BHUFfnMlk4cIVek?cOGEg&JRb6q%Zw(0p%T++<5Rm()LFV?r?Jd* zQ-Xs8c?nUxPvMqkzuGTd&O$B1eHwRAy|fe^t1z`Km%A%hdy;rL-MeK!HOi}X}gnbx`W7??Ku*xf3q^8v^m0@b@uvuWI{k-bKI@D$`4j}4WW=((3nKX@%$M-oYWR||U(04U_@VYp+cmIi5QA7(AmxFDz zdc6)p7-h~cdUe;0#`6;(br%s@R#->!xAgn5gOy?DK~3)ikVb^}WmwBwdc@!~l4vlb zy%{srDMOnhBtO2Yc2wmLf+mnJ)>$Q#e{lMpxPrcF$6?e4fbcul6~oFu^WUAS=>sm44mGEO7$=5RId=(j z{7DM()dPBUneHv_n2x7oC| z&sY~*N@_T8n%U)(9K^6v28|pt5CpvkT-!UbOarEi)h}f(rwVDnzm93oQ=UcJE_&H2VOsySRPtjs-<0L zj(tMpIsPc`uvY6?gE>!AE`2Nj2AdL>j7Wpj>(OV1>um4w=qrM!=Yz4&Y-d}FgT<3q zpD-bZGjUN&H+mK84&I390h17f>AY(r$eP|FIAqAA+MWi2PwPu*ZC_r9nwiUvL zO1^ELzz;W!YwT3*6t2mUA0JR%G?J^@#A<3ghVva;lt=u+-0qFaD7g1W^tDE0sMNh&L=0^ax8ea4E2=CJX>JZ$L#DzIKQPMbj z>Mvn?E`!S~oIPIgIA9n?saP`K@)6{n$9|`yyfPA)ym{ zVlU&OmSO@qo*1RTW~N7^mI~X`(FdlP1tbdS@zgO|X`U98(hb)zh znG30Ek~CPjH;E?Aed~34tY%*~s6UJ(1P1XT5L95+e*}ms%|A};$vm1O`+6aC)d;2S zj&tc;{Fhr>Scc%DzuW5Is~L!muM{ORyhPjP6h>8w(qU1Djp8y!8;()lU_-3`g3iem zB|$B()4Nf(>eoy7>q}poZ(ivI+n0s=`8Z++7WY$W(Z}m^up=ER0omGfvB@wCM;3E^ws{2?6s8-&pKF*{? zI%OQ$0qU$uN1Xr)*MkK?Y}i9=Xkgp=9Rlkwz#67a4QzD^O^=PNTVCHO?5 zW38UeB{O1asW)UEK5(eHKtuw5dXX;>>5xyqeebpzhg zTFYSa%s@jDH}$?T3_Nyd53pCF{(vW^xF5XKYs)hv-|AKgN^#*&YU$#uorDVP`D>w@ z!dC;%z$8p)_v7x(tJjqp{VHEO|iVcs0^iH-PQUMu{u2 z1GFltW=^BUB}&*Wtg?4qHPNU`nTK!z3~itvcv33Q9se|}UZ~nnIv6X@{DQr5U8-Lc z->m@-6dWuU3l>8`VZc~Y78(tPgCPjaB37zrpLx#-H`AM%+`P7GnrkglV!doOcCTQs z-}B3sdb(fpzg`pkr=a0~mkT{jTo6ane-cyR()bm``$9zL-|k)3NHcKMk27u_CZYVF zZ5LIjKN)%T(_12%EnI0p5Ui<)S{UFpp<0?mWc4H2vkjQWem|2}*oa;G6>KyDgwFEK zC_@KEDovo$pkJOYb z3gk>oSFGdsaj7#?t=fN88lI4|L+_4OJ4RS+N-&^i_YMJrFc(hiiBRT9F9pW(1R@u( zxOYMwgn>|)Sac){1p^^rIG8XL3k3q)2r4J$X z`cvaSWA&xWm6q#A#p^g9+Vt77_)5fguVD%BhmBL~hhn znW-d%B|#s2`n;a+bw4b;ysP#5|A`Hs>4B%ZqF2FnW#E3Ay)@}cyvW)x9DpKUcjtE1 z_x6`>YT3q1v$Fmf;uGxAyItY9xix=3REg;Hl^e890sI&rgg8Rw7S^6qRs6E9X}fvl zhlPDB@B?$G-bC?!joSg8+@TLap^gtx5JDX2N>7K2mPksQRX&#@DMJ#7v%!w^kG0>XhYU@R&N4FbbKia;;NyL!3F zDkf_;s*BA^nm~bH-0-LCyB$Tvzb_Ix#^1d@|7&W|KWeVu(z-gj_3)6h{QK;Ays4<4 z`+{NmYr3rTredF=+$zDQ(Yyn{iEGt_+h#5^?w;1j{eKSee@*wt(`ZS0!{t5~R3WCY zx{}!K6^K1nqPtuFL7R8CPglG3YD2xBrIfnp>D+4OIZ~JR9x7WjD*Hi_(o2n^OA7i^ zh6{It48oNAZB}-TV5$=132+P<01yOl0SHtX5E=^(0>MDYU@T-I2vn@&pFQU{(OhpO z-bqOa)zJ$B?Crl*J#E)c()7{O{#1YGXIKBH-(;Muw+8cA028PEceQ_8(OI544LRIo_~0x+_xGz$;kfuy9vMK*w0<`ukSr#%0MaHCm|^ zS5`Gg>2*Gy{|=$${E+UGcF!T(1T=;2e1ja{>c7KTk#VR#U;qRC9mWG3ANMGsc#PHq zkU~B5$>8%kdrY`~>&e5S1N1aP-_y7DBMPr^XpbvWXhtgGP|Ye{D#*2k>v453g)UO7 z3KFWtvT||XS=Q+H^o=Ciq%|_ z;!C2W=qJyv{*?R!_+O6x27Wkx-nTFPpD6qOjG*q`V>JC0uR6UeF7=78QP=50`^`7W ze7yf(1D($G4f?p917opu{IIX5)@b2wYHq+cJp%D+@JtRbmrF~3Xy0E5wpEkPJ&5jT z4ER%qIc%1KRZV0OlQ>f1uu=is?%qVErA1u8?o!B0{&l zHqHLL{as~+`b+n#+)uKaG}yvVcz=uLU6;WEm-G1LI)$lS`0B$SZ;!LDE}xxVjNGy# z0W2+gHgz%ct_M%`AENW049&Dt=(`NUL&X9t&?vDw6?(h5yw0&Z+4tI=LydCo^8f5^ zR~^l+pfc7`_fIXu9Gg+KMBxdJWujG|`YE}@bC_W9loog__^MXCon(>|vR&c1WOe8D z$NAt0HwzvGL14j{=oShLgdre^h$1%?zB~B$t1mj;YhvQHQ6w3v=ttJKzimFgou1$O zetv(y-X@aQ*Y-K11OG0c9W(F9q#4~^J9T(F@scuzpR9#2q@Kg$^U&LPsd3%aEP(h|XX_QW4JixrXv1_Mb*|zo%N1gj& z1#UykD#`W3?rx^q@Lkzvt3gm-&v42A=kDGDtHq~&I);w{|5oZ}d zUH3Z7d5bJ#qq~EIuMpfbw>HtuBaYQ_3tMMp&k48J4uQACcz;aJ4s+OlVtHh+N;qm< zm8Czv+pM@I%Zn_Nhd3vBCSSEpjNYsdr}Xp$S1T}Jy@)CZi#vel-JuFM&g|r%dg5@{ zOUMpOvzxm6^zQ)=bfisDwL+n!@2KGu9$O$Qdb9?y`>zjl73W1Mn@u_PEQuRX)iRum zuz}Itc;JZEFm^Opc*sid4Z!WA5kY`N+b}C#X==a$*&|JvEnhSJ9pdKJ5h3D}ezR~7 zJ9Ez5+ih=)4LNpXcmjHM1xsf>$XL!y^~ zU5I6{n(XCx@ESh{LDfVkRuB`Ibi0|b8ry4@BfKaPv?T|)wE-u(*Hk<>c%K&@z#ATf zVKT%SKgmhwlSFw)q9a;R;=PiMwz5f>I<-tw9BdDcC;({Gky(D|0PmK9is&B^Rsb}9 z(5vbQ#nMOh1N=r7ZyNIwl;eIa|CODJ(C14zRQa;z4$#}jhREbkEl7XPpltDE9~LrA z8akK|BR_$SX)GVX6b_Xmme@rN6Q3uy(3Nsx5KZi>P+;i6a%`1!j~OZpLd{q*~PPMOjfyFm$qW}^a8gA^U|b9 z#Loe*LtTOShydy-5)-N6sVEO9y-!eIc_&Gl$5U%zeW4?Dh?TOVw24Vee%Wjs_~K-( zM%K7`sj|=HWWCDgpOEO1?se@3_Q~mw?NVEq!5XoL*2FCQjki}Y0&MtVDY5FBTBYq+ zfsD9dV~R}|mO6cX1!ctA&DL4;&-Osn-R_)M#Kr4)s~8RXs+kgeMF1Mb*ea(YHfwul zg}ZtgT@kjS^!d$qEFjKB`i?sGaCdyNc+^xG@l?!oflqf}_-9ZW#f!D@2h46m^p32+ zkgWgL2efUEiq~GlBlVsP=RQ9Zc6fKR$onQoMKlm<=CdKhxv@awAk%SS6XCFo(p-<+ zWo^>4Dk#H-%W9~v(N}-VMV7Wy(Kuh;Nc~WUMI~a1`wOg+jKJrI4;82gN^0+ZRD*z1YisZn&vJZLrkP;A+9h&UMR&`Fn z54`K|dE`psz_?sfm=;*T6q1?ianeg@Mu1;PEt`ds$W%Qt|K1N+qvZ7~s@AKfeTD4+ zg9lPqcGsSv&0^K6`noA(gS`9D7)7ZbA)<-h+0N^c0wGGPGqkf^`Nc0b3&s|BEtn2n zIVWELn-0g;03y%G?!A_Bm8?@zI=3N@oD=+MP9LPRRq3UgLzD(|I7}K>@}OGi7cQ{6 zW?b7+vjeWzE?_H_hfKi*x3khV3_Nt5PaD4MxP0f)>!1UzEdLdhNb0||>!)hr!FKqC z>=gV_>Yu>vPV|@qZdQF@lKVn2&F_4PIAhvvqm1+U)jc0V2r=5Qm*)ec&md3Y3mU_d*#T9!KwpIc*RjX+bij05~;dre>LXMmlC2je98B`2m*rBS6;p0C+q83-lf|Dv(CfX%(RX zRW17%z{$jjg(l1I;p_!`-{cOEH;-0ez-5_7J&oGm-(rx>o{4H5jiA(ZOx}r$o8k4_ zpWYdwM5RN@CWZ*F;GAS4D2VZ|_>cwLD?toJm;R$6om_W4%l0p684JrDGR&y8%lWp% ze5aL3ur*V!2rZzY!1HF&x!-hTn+mwxCK1z#&j3(`)=?I)%=7i%fCXH{%WneY&7E_x z{G)uu(GF8`YmL=6zGiSXDYBbJrouA4t1NG%tYuUOpgf~MSwuycd(oW6KNH$&YrMV$ z-0c&R25B*Qe!`D%E%D7QpG->f*#2;2b=1_5&4 zc5{84$5PurN`COuxBvd9eUUZr&S%X0-(3P+iVBq#T(}3eX%YA3yy)YSc|rTpAQGyb z|A%WAqN<;Gp^0;Epx*wjFr3*nAUHQ=G1zWGHk4 z_$=Ee+g1qTu=D~EqKN&F+POOYEr)kBGGvmDR=f zy?O>JXRYVQoEuRTmTC?pfQb?R{yUf$kXBZsqIn-(1U98xz<)_?q3?C$=dC3N6Zu zP{i9+lY~}tOFU6$LYgXKuZx7DH&l+!A_Q*6lQ5bFlr=eBy_mIL<=K~>sq#n!__ z@k|I)KcoK>M$H&3kr5PSmBzU1i>E==y$sYkf;zAX!24(|FR4{bv?04hh2p1o~3V>U$}HK$!RKQKzYOqdvkpqT1DrUhD_8(iouI+ zPLVk)>$`%Jwt>*^coF@pTilH+`~SVcqXwfCN|jZvG!iQ3RMj_Am043?K9-g*m2zK} zA>k1x7JhO>oU#@Ki#JbaJs2d^ROz)jT3d^j=+XhGdJIezDzX{0Ez(oSS0j2Hhw;QX0`qA$0ocgw%aKnI>?b^0e;J%@ z?tPYS`7v0d0S|X1edbq4QKjvfpj;j4L!$+f6;U-TIsP!FxMM4;_=71JSt@H&)btw` zrE|n+SDB6hwCGXxw*hqM-1vKr$A8!Gt?6OYc<9gO_ZrV5LzPA?^XE&S+UWePtw!&s zlgyNtT3>Yy%J;ZNl!R}R3CiZLY$;Z=rR-7g3#)3E6lB|?;+{_GLFNj4Ml!3@B>9S( zhG~ZkR;jy7Bw-@ZknNgd>TogDF-bc28*>%xZz4Cj+Nkh2(v zg-c!H_LsYwy~QFcSJx+({%>lvbjnP)by>qqiT-e^TfCbdR1EyH^aJa^9{MErJp*Os zC_Sewv~N7eWg8~c+8%JSYl9bQ#2}*Rpy>h$$PU{g?iQA@XYgsP86Bl_$x}b#oqXAa z{k9e`ZT{Rq=?Z7`|Ke!bqXn80B8;~+t#z$U@Byy_tDkKzR0lF~Mu$-;<9n~r!LS9` zE3w&~9BkMens-)Dku$dotb^gjo*l1^h?x{yC2-z^{3UJPL|Y|$_;Nx*<7E2d*)Lw3 z-Q%4GITZ$B-YP zkP09vOd82QRRLbUbSLbts6ok;lwyRd8Qi3OM9{Ul+Z2`-3dn$c<>7Bd=ngpxjIBQff6#CGHBYj; z<>7U}v$w5LHNthyvp!P)+CMpYMRSO$GTy34I4bk9s}VT%IMQmt9B|AT>w$nnFgb-ybr-Gsptv)d7*wiCYJgFe*6&HoY!oCsJ%!RvTM7W?PMO> zNN<`G=~Ya2V-cs@P%pbPF}e}Qt}%(RcY{r%Zedx9x%6SUzYq?1cmG^4mJ z*W)c^;WVX<29Stksi+=u2|{ELsX*8@y1_%7i+Bl103Da0Klo^yXi3X3%QwLV0a7Ze zd!!gLApZh5000TsL7Ijp{{Yot^F}(LVDj|oR@os z=hY&{Fq}sN=hY}?(4al!S;A4<6bbt1RKF3Z|EauqD^;@UGjiG@ZWEc!-RDEa`SwkK|N1C##g` z33|NEg}Qv-bmd!H?L&&A*5G5@8&>|wdJLG8;SpcX(ncHcb@=z1s&2Xw(!^yF|JGR; z^%w)KXpAJW;_)R0Mz=UD9+Ib{(xP*k9+-ClZL0w)SyNu1D|EEKk%T(ClgW@Y6xJ+1 zc!_*KP~ciTT_=9X)7CT`c2f_QSgWJk68;ZM-9d6Jy6E=)iD7=o1DV^6A(BPtrrYt~ zxV&E@#L5b25@Bh*uj~F3=yk1(amr~K=BM9+^*Nr*rFmvJkq*vP~wfm{hf09hga&9;727x*x59Q0+p#n9(*rUca>MHDWo0Zl0DKqeKs4SCB8=>y!(r4@JUo;C@|);T4$Cc* zP~Q0nqGVrareq}a;>;<65hj!=;oVxNKlk|L@reQTT=znl%@V$mZGe67wgxpzv)}Y~S#e$OYGAF}NbrDG&&TGoxc#~J%Pl*4{=C(9&zyC_ zzA*G0Un-{4aivsGk}w_;X44F&2H$uCYyRm_uq$aU@#ilza2uPr zWrMiMdvEmHylX9EJJ$tfG5fqySMrwMek-xeHCq_r4azuIF>FT{F8k%4s*$0n!RZ<3 zXQ_f5oy~J5CF{VLz-)>y40RhW16XtiK0i3{8vGnwkN{Cl3rZMQX@s>$Zw|-8UQ{ud z>8`j_9MIY~`qRGLG}J>od?kmcHNx-A{HWyO7Ql!v3r?(voGR4u`V7&c!Dor|$;{23 zIl{~Ak`gg~y08to>D3tOp>n=Fw-{&%RJL4mlt8OhJc_#BecP*=9ELHezH3b0PhSau79b_Bsex z>jM3F>hBnba_$3TKjc!EiTnf?0H+L@jc3JthREiEp1yu_Lgqc=qPpMFspt>g;IyIN=N9R1LHv+U4E&E8udnx$Z%sUWzQ&I`=F*?^GeUb38=%? zbHGBP!mo!|f%Oh6)x6Iciw8AV#6>tU*RCYTB^Q|WTM^GGGM zG*%-^&>}cgQZ$m|A8hEG5G;fr8B)8=$u7O*0{J#dWViqi^%AFcRkM9`7Gle@A^BHF zG9NCXz#vZvPyuw&N&YC2nmm&)YyjHa#6ywKMEjR3r?-rMNeGS?L*JM|#u^{v{aWDu zvtSJf?CROgb>(?4KCykXtWeM+Im+tC2^xTkp0fYnj2rJvy>kQS8o3qDL2g7fwQvu1 z*Z%vD5x2QyaxlwY`2=08L%Fhp>?R6LG69uaZo%!eNQ{*l3|WgKk(@VBF`6+QE}KVc zwqNW?K#Xs_JXffZ6i947$AKJNr?mYaF*XFnLQ{CM1q3ab5Yv^M9M1FMZ2?nKTcwB> zFwGMw_=+>g9y%}&+Xok17%Id1;xv2r*`-!x@$)Be0ZdBT3d5RA%$Q(C4}f$mM{1(?eB=5Pa>sZ^8p8 z^jm7KGvYXjAUV$Hk+{O7m7e2pw4UQ!X6ZD|!JlX#HiPJ0dL+lL7P&{g7JAp`P-8df zO)LBAmM&j;XF}TXfV_WCx1@?4Fm=y#@NO&Nq71YoqO3g>K^*x#+TwM1?@VHR_=yI`#1ULn8nu5X`3qC zYhI;~fYdl{IZYnsIv3K`SAwhi`B;57$1_BhABKOns(+Ma{%R=DXmoF-+!c2KRW~ia zaM%x|TyEL$0r53zju>PlFoV z2^o6t>u=dyE}#FmiP2M6!jv|KTxrncnH^(vRbvggOr@@%q^@A<&OH*O2)s-M-A!-c z=)Rs~UurD$gbYGKTueh>xORBZEAXEsjyrpb=ZKIaGQ&hW7+zHy)1Xf&goH?7iz^C2 z1wh1>C!1R}&EZ;0g*m0_!*gaWbY;{yypx@n-d|JhX(qPa_X~iMT{4Dv z_|Xf(_HRDj}t>mogJgiL)ULz zPw!sgivZ#^p@IaYK`JRzXw9b=uLr+&k`dE-S>-6{^yz1(VFUTNTj*Y+w@LDd!ivbP z<4jha_$F{=hrwZ)>c0RPL=38glO`vc=;0F+YlJaZYFBDpdaQF?3)Lk~NLb%*!oRxo z2va|&{}V>d7%Y(y6lIe2#~Qhs0PX&fDoPElW#~eGCxyEwP~A&gT}s#QOs!&%7#7>{KM`kJ z3@GI)r9f}yDM4yfw6^lEEtM&yB&k!lMO=F4_L8B@NKjVtQ=HpRfw5X z1Dw_zqconf=JspGnRhl$H~hvghpHCZt8)EwCFjts;+jMaB^nG`o8%SgYdn0B=A?Kg z(20PE!<%+H5~6S_2nQ+JcYdz&z3KNaD1*y#l0?r<0+fuR%ZVj1UV!H3fdN;EBeb_U z3~)eHL7MT4Mq)6X(gA@bP#UeV4dwzd2f9&MqB2B@#epyz9(L!PsPA`N(zj%9OSE}- zO14P+q<)27wqCQ#)>dmvdEaKy9hb{v>SQnulWK)+Ae-PJ z1ZAHN?9YqGoqY`S6Or()?6d@Rbd>lxET|q9vQv2_9p+xw8lBWx{<&X1d}}Uh0{$G~ zJnAafigi}Ld0^H=y?ExU8OHlbO;sk;aBM;}hQv7!d1~;_ZuqCxO@ks2@FRc#{+a%b zm^5IsLPScIUEN&OyoH-g6}C$Z=~~PyJ>@@AKM8C+^b7VXi=5ZypxF)$Qn8%TH%i0B z^Xiz&@NKtIq7&bi{OR0Io~wejcb+atrpoIq#-$2RHGxv8tGt#?`RQjIaodAqPm^`~ zX0dhXZ1CBf{r7ohlh-zFg_7P9ScF(%Da4AQo*ZY}fY6pzc8>DZ(40P>h4 zSb8l-*T!<>!`+4~IpC=FQEtX^>Wxt8Wl^>03&nss`#o5oF%cDlnyfK5ZH!*YI7weN3_l&p8TsrK6^pgiTv zVQA+>X#%GRO|ye&;sp96w|wA!gM-4Pjg?<1s6RVum6AqZr>Q)13Ngze zyn`ElYD`kZXOU}&_-%>|R)FZ0sDn1=ZB>S=akAi|HH5U&DHdUsbw9mAvMz(Z~mpvdokEYSYHVxir?(6}L zHM5e$MzJ1(k_sJvT7I+Br8ILpp@BB|7r^Tcg`bn0#$>A_yk7d5VzLunuFGp;4f z0pO2&#sSB41iJqhhj=2epQ-c-`h`zH!neI7!)%v?m~(P<03@yVJ^u^JC%4jRsajFd zGtjvIKklDhpV!0n@zwOz`~Cd?1|ZSU!rrGVzi1{4?{hX{%femen}Q|HB40+?i`pVr zNP>Y9j8-vO5$18qg+itVsotxRfyHAtRfpJ10mAzwC4SMCyY?4z%SG*wL`-ZRm0HBl zi68~=Bwz@L!HkO_20}8DDuM~HWI_G}Z~y=d3_+TvCja!ONz~6pR1y|I>79?bVXVCW ze~Y51E19KVr)^Rorj9KG{i}a`w2Wg1?`JzEu(&+kS}tAYiEG03OKg3%sA3s6dH?Y- zBh82O4EyUfF*E{*`%KrOJb+)%n&O_T&oY3};sDSGx_l~~!!rw7F7Lc-7-SRw-j=9; zy;s#~C@{Zm%?DutvQK6#|7q?oIQoh?jhycz`T_&DuYt*(Q4!-}WaY4P0wW(@<2>9K z+i0#v=62**QH0%L0WR+Y4P-})6-!8{VGm=%g zdoRT(EH19%*KFM#%ESOxgWY7D@>1_e4Bep8+QS^aIj=ZAvrAf(_PMDmMcou_x`%*< znTYH*qGo4DMO@fmZcFs9#*q7~p)rzhMhK8cN465M)KxKJPx{z@p*)qWI=U{?AkRta zf8FK>V0Q6C_&TLI!`45t7SVCCZ+1Qs4U8Yq=HQrE0=AU+h3mG2CntW99;-TNB*;Y3 zr5AHA5HhQ`^2QUrpqX2heBY>(v8EpXKH+(AniHbJRuy&v*zGcZ27w zo1(L5WQ~AmwG1pw=a#7hkc$47fMH5x8~vhC-w((dkJpu zecxC{S-FtUmS{gXlRZ$0_LvTC_tCKaTo)099(qjNg6^zdoCO^`@sbVFON{S(j4f*1 z!sjW*qQ^d$7eV_|QB zfc#a;yW^gaFBQv%Rdwh-+nz&5uDwo0J8`sd+ddADA~K5?;y6fhm~V$X6`cjcqX8PtMYwQMi4;gR~7H6}3E~9-I$TKMiQjeT*b8 zeXi?}BxA%QLtOb~>rB+fwKrxhla6AQA)AxC!#EpRFj-R}20+b6?PO5_0`HKSE`Dxx zn+vsGO=N;4f8<^iR1&3Jzb906L<<6o&x@MSGm1gUbQYnHDTH8RLp4uBW3`v%kH;~8 z;K(gg8dZG_p|?NE=b=QW#^(quKtdrY63Ic76uzIz4r($^H0*2f6>Sm`$8%Cvkekm6 z$8&{iv>(U*FO_T%rNHt@kufF&7xR_0axWZ#X>#V{W_laxVNH&x!MX@s%>vxx?Db$1??mYqFD{+UK1vb+GC2l zoPij5yydu+cdKs;cW)ni>kbr37#)hg=3CrUk4dvYj79hY9m&I-(ueLokzbvxcovYg zI@W>BtB7*{SIn;lt`6vrXTe(`Ptn0#PHERVO>oYo;}DH-?|&|(sZKd--PQ=QXCe=J zB?$Or^hGc6(Y2{>WI$B(0;RDT@ETVI^X(~-IFT}rN^*8US~(`gDpm;hb)%8GhAkKQPQ8x zDDvAk5sw^DXY(a$oMpft_mstP_FT*8pS(Mb8JLn|Yd7IuXo4I5mLz|Y2F+7}0en62 zIBGA_WCD4bwo_(0$rrWAha56o9$)k3_OyD;E(UC=U#%Ou>X&vzg=x=6*eEEBDY|*r zN{PAZv3i$-3ujnIvORG_Z%iGb?p5?>)Vjji^vlNzAU}JS0?@BF8gQnW(NwH zhrnh!n(Ct@mg)9#bFkhgF$Zb^h!nr-XO(5W&V>Q}X-nLO%P)i95uU`dX z**4DkP!-)%OZ_65cdjAHM&BO}6wI&=4{%T$`d~SsSmtx$D6@cb9;ISEf$dm~Fi#?S zQ7XrlsDK(8?M3(0G_Z;K~zkIOn;bZ}KSt*Lpe`&(wK(WHMFl%o^I7%2@j z)RdN%{I4N+_r3gTMD8V=4o9$Hh$GoPMinL% z*t{h#uhOQ)kX?)lGVf}Qa#K_~+l@RWzZ*S84Z;nn~(&d_&}W#Sf!3m z?L9|08U5E|j(yC!1XS$agbRAG**C7RGn+M)DI4b*zKX^()yF>YFmNtg8W$@>$0PC7 z--9f29m2XE!VGj$j_YPDf2Qd(`KeX3borsg>NF{TTY?L(FL;%m7NMPVDii!a3?`XPqA((%{#VpijfP)?g!Z04Sm7l~}G8tTpPsmCr}eihH%XTQtqB z?uwGm_Kz5tHoa{iJ5{XWnS0jwMdrG$M<|K77sQigehb4A zIbnfkuvVTE58bLh2+wc$MHet%dt2k9hT^<^cNJl6gva&GG0K}_t=BDYo z3_tzh>Lel;-G#jd)kHiQwv(PZLBF;xK@8mkZ0mL(Qo0yqc!_ znS|S=S^wQ>Ksb|8egsIXUk*`3MJ?dSxaf&t$W~;fxh5+!GHtE^X;282<^d3QP{5F? z-dBv``-W4*^2%KUf8p-gPQ52Ck}cW0f++6lC2Vajd z^$8ujDtw(`$az4+ifbp^ZMtwYtDzD5;D%W#WRE@!F+IeZRicc6&y9Cx82n@|o~H85 z^?@AhPlO>5y}$SxPY19w!Y<)SanUNczkxE_p z$0R6lNP{rONH>NLwx1mB&@MrlSM2eL^R=QBqCtiuSuQD|-JF_CwMt$oyce)zQ(;tp1?H!;m zc?ILU^hg9P#uX4BNi!3*Y)1OHN$*kg>D(3u98oM`bJh`?tf1-h!L9S<_@Pv6pfQJ}hR$Edl0@LAXk<&o&Q)lP)g*z3##Io97# z1Xu)Lk)ZdIzMl8q3QkjQI!hP9Rn1p`k}4B;!P{`C(CF8ukorHq44?)#rRV)ZXm73w zRgS9dE%XtKk|Xa`HAse;yXl0$W&nt{mMQz;xpPoDk2-tqA+jZ#lG}OA;Q;=X{**>a zOsYvPYe8h0)>G>W?aFZ1`Ix?H^``E?XAyZ6HxvE+-(F|z0Q||HcF%WXwCd_~_LV(* zy|Qe;0qGF<H1KaGivdN^=<(2-0iP74ic7s9C-c}9$X!Z z|Dvki+Lzb~Z*EKS5Bi^))51R+*U%pQ75y>bRAJgp>R}Vc>&Nm-G3TP@`frC$biY{9nn^Fm^W&WF>!^80 z%rre+S+f?=eT`0{&dN=@J}k^$Q3i0@t3OMH*5jcY6e#A(HuC1VU@7mwQCTEJlT`Ry zLW7lJ|GF#sKDs4X(R}c{&y2)rKi~V+D0XPELaB9^eGB}JM^8TjrTBO5mfliNG`Vb+ zEwP2f4;*^sGNvgZy!%bFs`yW$-)N~97P38>S9Uh@vM1i87O!8HRQp|YnW=0A;;A8M z>oinBuXghz;v8nAt|^QM7fu91S;2>FFrug6sxUVfwkk$?!zhO2;Ea?QsZ0V;ff*2y zPX}={sZRxSaBFSSm>u6L9s7wZqco<|7*s5}THg%kPhk!I7zCl{pFx0Tjk#%il|Z^` z+Dz>~izuVbXe^YHu5d6JPp*Y!ii3JDOR{xn?deLIT2pN%E1tzWXO80d-lw=DuHEi- zrgV6leWctTk1n%|03Cg+~w;&-T8#J&o_XJvjjRss-$-6ZfEbfsL1ynL*pDIj4r7eS?xR464Z8XLD z$aKYmx%~DMvTE+94A0mYR1@M_J)I4Xy{C9SGgmz(5T$BGv!`uh;$&R608=#KgYO>6 z#UD>d3_i@*blIQ$OYlk?GE@ieu3U&7IhZdfp2VIQy{kGA zunT$_PaY(@-ZyW*%20`YrAp}lKso99MCY>bpNsLYir?;>%(w?(r8>Th1NR_uaq&J{ z4)|VYvgZ`KT7C9lRIkhazVPYh3s<%&dU)vK*L2b|O4^NYHdNaQ{6EQ~MzRX6(2!-+EyBMGa?0tHv@h`XLUq#mk4mi!Sw zmXSJWs`*6!!l>DG$X)zz27B$Ab~8r>O1mBEy$s75Ludh{McM)6Lh8Mqv@P3kGi6>+_qm%VDr6VKn6qpH{)`Rlx;F~~Ms z-CJfgONeIpDgG6BwMxUq-^sexSXRrmZP@jE`*6z6gT>#|)LB7u-h1n@L@-lG+3Cph z|BPwBEKsK0q-sMN-TRDerh_*vN$=3G3d1lnc!xlkIu$Y=#Ikf^5O5eApg$PFm{KIm zY2od?2g3`II?TTRd6PKR?McMh(JpYAszMwM3uHNWhv7`leS7JOO@LWq&sQVZ^L|-Dbf(I~f7S*LAqnSW= zpNzMqHN}<*lizoOR;47?XEWQZOXtFa*&yZLE|FXt?&T@8&Y{DjHLC7zYX5<*5%zH2 za~$Hy_;^<_gCY;`BY*$^5LiK)#wPzcCKMn~l4Ua!4OALVFF2)?c0E>umH@jvu{H2@ zOYM+GKiEZ=ehK0XCJ|a!GaiTUn;O+z>W|N%F?N0P)dVq;GvU+22~pJ-)B-5l%MEy6 zyKqr%KX@PV8PUQA(Hz|x?c^aLC6)Q+*-E2G5fyz6qNA>^`yJsNzZOb!U94!)n;uPF z0N2deYyevjse|Mzv3hf zjV4jw<9&OEoZ+LkiG_BXk~7;@AShg?v(JlL`j=(`cnFsd<f)N7)NuqR72+8J%bn&{@8Gte|rsPabe*(PRHvl{vH z>sl%u%ppWtP+WN8=bNvv-3D+k@U96F8D`750C^8KuCmP}1~@Z@VO5B24k5S-+u0b6 zgH?{x!JK6}N<39g#~Z*TRHpd%Vm6{~F~Ct`WIt|jo%?8?vVeKTyo|xW)T7-{1&61< z#aof{N^10kYTDE1xgj5S;~n{>8o8~h4vJLo

Aa@|$FDt-+LPp7ZlZYEj+U-s{? zKADR3&zcOdRx3$3$87U!PPpb?h!v-}!$veG^PT2DOEJI`XqkMPMYJjg3XI2BGj6OY z&bR}+Bf`(H$LoI(PgvJO_YdA=_HR zYxp^H3LPGeIZ#v#P=H;}a6#wV{)v1_@?MQ7ZJy~6hK+kAAWXcmf;QLn9hod^QqQc- zS1>+Q2c&hod;d2qX$+HI`zJg_N_T4t1?GP8z)%>UA@$vh0QNzLRwJ!a z=}t7vMVvfsx@J&*DX7Dh(#+xZ<2{T3=|y199V#^6OD!w(uAf_Gg$4WaNNTQ%{Cj5v)TUYAeOFQ!L=K zo{g1#s|y)AXplem%Q?*e?KY~AJPf_iVRTaBZ+vul2 z6W9#O(%8sMY}bT&NgOrkkOUFL#Z!#}ZtMn@@Ogj=q?s;X3LD z%^dDqd^@mJS#d7oHPjvho?)dTQ*B%id|gye%4Q09ALj*OS}jyBzP85 z{yX0zx4K#%Od^D0{+w7f>biGkyg3185V|-fnZLHJ?VD^W;x+!BZOarz?}0PESM3z% z8vX1IM7sS|;RYq~)qNG^CHvdX_SqFxIcu(Oj~Ay{-kEK$);sg>alJZ*G#EcE=YZ85 z*EiTq-8^OCj9|#FazP#d>1e^5Wg6hH2N`+}^NjzKkV$$my2+sWJy#420h*G%ga67? z?v!?g`MEr0nuTgP)^<||QsOs=?2CWRJmh*+P(~TSeLi!_52`DiK5OP5mWV64G{2P* z?pY{z))tkG_c;bciHw2`bwv4P$DX~kVY$hg^_lx5a@fJ8F~7Z{+YubZhrPPz$IgUyOINHZa1cL2T@(|v+k6assWYqzc0VA%-8V);er|8t zt}<>YgC?Q8@;K}10c!c9dDRM9)p1=bc69)}hg4$I`(Ua3kBKdq%dMJK+!1>g3 z{I?vlPY9zaiO(Cu9_lj)I?2dXOuS2P0RpTeZT*>)G&)XYFhwOA%qi1#7(`TUY;9Wl z=Yk$6+Sy7Gm`9!(J!lwquy@MWS)?wNYg$ui|M3)N5~g|@Ssu?r#;%J-4KQwpr9wGU zJj^^^G9u4=3(Y$HR)I}^`Ygxy&r|M~t$V%$S>D=;#4-SBc>KG%l}Ihm0M;H2U=o2+ zIP%F5O_Gxz(l7dO$6(#s7-0~bd=%Ti!Z9Hd$4BD}+OpIp?W=3Aog^G-K9B7hsp|*ghc#I6 zi!sTo#(=EV0C)nlz32h2f^DcVS}o zu1UD&?rfp)>12M62M0r={=?(pfxaEJ!=*#B zP5C?v6Alil2q#KCm75%kY@yj0(;f&M#$c|uDbhGh+J#EkbJabPH*r_+x&DFgWnG^H z{E^2XUmpqCq^ayYId#2#`MHRtIfKqBFqa#S^{1r<;>t+3TuJ$ec@TD&#h(`(Es6-8 zPlLtja2LKgq(r6wQLD4>RA&~WsGS!Z)&aW}O0hCkpaiKjd}opK5u;^7x|ucNWwt`= zeJ`_pZ5fc*>{nc6Z(;Z0LgreDSquq_PKr-~)}b7oTl^uJJ zb{d(;e=3>j2Np@!4R3mws<~xBP2SGC;+);{KWQB2uRI>|aohiztoZ754bf~wCe}0- z1FO8#ym}Zc^N7sTEwve3dGV|S!r#=@Nh`8hP%|d4m(5NB=6#2pBQO~TRbnL80ohv^ z-+e?0@^Wcn+LVAP>Ao?&cS6`i8!r-WhGH%|*}y;jGNG5X?_YmvCIB+1&)y)rPyJFF zLwvQ6$_CA6v0FfZ0ym|#Ybn@P&lY;(dA=6WJya?C!4D&@C*Y+?et2;{hUtULW>BM} zOJu$#3TENjh*+4P5ntUu>0-q?9iWo){l+xEUT`Ap6mNlH+q6_$V2mP8^QA1YDQ_s>KM{++eIhR4f-ruDDN5*Er+WvAO8&3n&Qr)dNr#J2fD7k@H=BxNr- z;7zh&+P2+h*{_~K311r0u-ZE*3g?S zEpOexZiV&OK_A4wAQg?czNqQ5fctoW z<|Z~CPEDoQiP!8*Rgj#cGd1c}DVH(^yE1p})GjtAsA!Dv_VMCGv#d}zT59{=CEl{b zJ_jgllRLbbqDoJ32MqFIY!4|5>DtP4c;Sny=GbXGIu&S!xE!GmMR*(7WxMxVpem2M z)p9hOf_-MqW=3RjSFqLZq*!~j+W(thCp2n)IdGb zN;;(ZgQ!uy@`bv5!aG3%G0x@P1-sXt>vU|26XH!jV+e$Snng}|3+tvM-La6JV&)yg zTlhS%^gpsxKns#Eq{SX(vE`jeJSTRkpWWm>u)r?mK|0JytN+W>Q0`VL7 zWqq!nYUNRkQIi-7;CS0@(Q9>_!ySSVal6Sc82vDI@YK4j8>^D^MsMc_^2(lgBre8!sM0BDd&Iv)R+myq(5^S^+ewtciH)VK8kI_hLON+-wcOc$TTsRL)dV{pM!4E<>*U;l)p z|6jsL#%=#B9!)#H;SUP}5WEs8zpQ4sG%?5N_aCzc-7EDcb@a(XhTG2nd%UVKt9#H@VXE#K+&VU9npr>Z z6?rRQv5h^^&V;=iQ(QsjlR=S}HkK6&-q-?TcEZQ_`Sfd3iR+vEOA*91k@ZX zBnuLR#X!KAP!<{uf`c%M8GYXFyP9>`D@?gaMB%C;!?A7q^?%Is-!IN@-{mqM4~3Dh z&G}K?mQTY@b7PN^eRg5-PxuK0U#p_6mi;U0>K3!k$kR}!l2(~LM>Ct4!YzCoe*P&?Y4Tzneq~sOpZ8(JA_8knP z#a706|3I23?0(+Qo`7mzf>ByRgOryC?CjA|(#CN!xm69~drO}Z2W5LhG>fpz8r*8;do6c1o0 zNv;tp6bglgp>WWcbR-J~LV|FxP&5=Mr~=k&zmHEB(chJG)+S4fMcR_IA8+)x)2jOP zU$5$4cIT*Pts33(y!2=Y=hhNqU+d?fJecG=jWm~D?6RG|uj!hfjr0Flptd;sG}&b6 zfnKEZelNjF&y5-gAPxi#YB$V(Ua+8hTH}v*O}-Yrvw9e>q)kf7Q_Vl8lz2BZR~7VM z99)&r@E~3jlF}FWAYRL50Wb5oRIKWVa)hE-5w!=;?f3nC*@XdNz*sOg3!Eq9cj! zn*WXdq;$n%-4?4PybB$Q*S#>>8c6Y5z}AMWKRXf5vL`Kt^C#(ch`kcY%cTXHqNHUu zzv~;o9?&c}6NUo8fiR#fcncWh5|tq@Rb@$`|9u~?M7_@MQ!%gUYlCF8>up3ZbMsbBTA z3wd~q+%ocP}NiPJ23M?Sk^X1OoQ-mAOz)Lv<7>?>Y`8>QsT3LY6qth4tev^4dd zoFZSdbZw&M+ZM^&LCG*7T&7Z*q0MvC_i)Kh3J*}#Joe(6)7X-^B9c9ADX_w@T26b@ zqwv1t3VM7l6zn8DZJ$H!K7YaT}-Ody;l^gH2cbaixJX{rD>V3FwKB@`=ph}@oHQHfy4 zDw;`A1zjULclN`s)@wVLC+*<` zZMtbf#SPi}u6!CO`j3@I99@A(lXjAwwE|$zIbXc8Q|zGPM^Lq&oJOM}2~pa{vMaP^ z)_cu-k{w<0ygpcZ?&K5T`_?abUf$uLypkwP7TAk?nQw$7_ZWQ*yLLw7wmmpa3fgi& zZzYF+O;_@KPBptn2p|`xzcq))7lwQj3ah9t*lC?#4O>buQLRU6w-OIN_LTOUdAg}# zER853o&fh<`ua7axi-brV}DU3X-)hRr^K(5e8A4Na)OlDX*v`-F}__AUI}T8T)B7T zqLn*M*V<10SXitC>AvZih^*^SSS|?34(%9pv)qa%Dk8Jd`ipX zxh86=u1w*@NtYlezxbo?<+oLI@9j@7B7NtNur=G{PIP+eqt{iFWB2`k|NrTCsbTuZ zlyGC~4;T0}z1Gk8t+>N4!~DkGsyA&`3*7h1^l4O^TVc-iF9J7SGF$o~KlE~)X@2~* zS?&)@?E72-a|XZ)Vz}si8a!9H1kl?wKWC9m6wD#N!;ATD1~`fkiQ^POeMILu2jxHs z=@3HLK!hkiXOI8?@r)D_g$Y7nprkYu3x-1hP`Fem7YPhn<2b^7S{PWZO1MZEmn9~a$1{4>?sX|en%zxm#d$z9*iGcV?ludeomOA#UP z#Is5~zJkXeT~W8=)O((IE~x(&amlT}=Yo9Haf`O2rlqeMm1WI8NJFU}>`D?88 z*B#eWnXSvRwRIP{t_Feiz9QNWz5bt&`2*h9s7&;ahpFt0*?GlJ{a^b(wew!6N&lIf zouBJIuiMg&EEcvXj?dLwX=p%d^s2gTCFq|^hQ2Lp$d>-0-#@*j=`qmQJ0Cn2se8NB zp#!j~#5-`c&lRqK$YHZm%f~dS8wuf&NuxFO7Lrg&bS+>XRM1-;h6M#^!L*nmv;<*6 z{Xh7h?R!A6AWS$576QV6uwZOd5QRb_K#0sQezUo~7G#1=#U`p-ted&du>4Q9)ADft ze!dfPvNgV6fA8h~snR0O58_AN^{&2)=<4!k-(QBt^Y;$?8kuhV_}DkL`Q-2hq%SVd z;ymzrX4E}VvN?#B{YHf(urU30|6`E^ya>?7yKJY08zrMI-TRjJ8a(}*KOaub`gp~a zjdt5Tw1ZEN(h9?g5%VZ9i04TPF58&t*kiw)4#~AoiV3jr)SCk0DJ>Ug6%QhImbmLc zNbP5p%lo{ER$3OUgtFqSBIh;xnp6k|3I&S+pum{0CQ1;3C~@MKx~ogwvMojAvgEl! z#rwZhlkM5tpHhAA`q^d`zxkd`w&=v=ukW&qAGh6Cmu{4+-6!(%mqDEZp@TzY&rt5_ zZrv8w+&iU?sa{SPj(aldtF3$GIHvrj?|0C>tXgj6V2v~^=}q#zG6p)f@sVsn1|GJu zv|pC*w_hl?ef7VaPHr?ow6v#FqFCPz=A?%lS+8bzO9dyyBYZ5aZ){jrO?!0zAv(ow zGeQbB2W9tzS-Jy&S&~Fq5t7B zOM(C9DDES=e#IQvi&;)!E?!Gs66@y|%o>Hpq@c?2!}m_p#zBQmCn!u>>ziUgt(oOv zps|!_>5vqU>;VZ-ZP(v_e&X0Dc?|`Ef{?IKE*T630^xwLTqqI=gj(wk_}}gR-*0OB zamRD@&!4|L;!A6uCE{~*7oYL}Y55*uqqrSd{wJNi^+fTcgT8@%djI5W(yR3XDbMFs zCwH~$s>^*~_~e){UcdHhBuGsJfU{T_TlVsM{O**r87j>)+m%wSI`sQkSlezk!sT?Q zQ?5pF<>MQL?3BVd02Vj~nurh*qyelAfN7^Ife67su@F)i3l4(;VL*^D6blAIp+JyO zBoR;r>xX}S@9jLV=i$8b%Zu^CNV}-3s}^(qth>A!dpJ+{tucR*`}Md79qu6fp6i(cQ%`L2`OMI3S7^HW z0Jrq~RVc0x4vTayi{FbwR`vw7KIV>h_Q_ReHYm}_d|)`j6G>@I1;0=u?5I&JDnWFL z-j@P0pz)di{(rwPpiDRm5(dG6GSFg$JJ#(w^*HX?X;D>iB~3|^riVNIqLyS$FK_L` z|8(zvPd{Z|zVGkzw>JO(D6#G}8#7~*{^gKrGU4AiqPI*<7OI5rH&s0(lFVrA!YR-C z?UNq~ciEK><@Rs0=4~9Ayb?~Ts~mw{@ajF4p8<%Jrf*kf|S)kXNolVM-;*Ni3VZ7SWp%^1%!fNphzNc3V58l=QS^N!*@{vO0>C2 zAU(hQ0SML*4slAE3* z#(s^hqpWOi40Vt|PWB|eAUW1b@Bs$$=TgGF;4?28Xaedj<-Yw$ca8)ey4|+`&Og-8 zkjRXWLg2#Cpc_hQg`Kv}m2t4TsPXJ+{#^b-^n*{W?Rf<(XW#!7&Oa+avm zGY!t}=?0*Z6Hg61eMhIzvGA)-6S@AAX_9xr671~d1N}Lu+tg`sy|x}s(mmTA#VhDb zZxbgWfBo9vY1yF@6j>r3ykTl{gHUG##B_|^s!Xb2fiq{q_e@Z)M3QHw z;xg*kW-g&)`DA) zIJi#nzsgV7XId=Z(bo|*kA6Y79W^BrnKcMMjC24 zBc?Pc1}RatPH+_1Y-yI>wYUIC!+4QY*;sk#VQpQ&ObRxN?-?GN_}#S|*-c0Hd;t6j~{zR_0oY+TdGAa|-i&VvN$19fjU*6kE5*0YMC@!68gX$A7 z@koMHH0D?D@L$n((=bdJJgafOPA-X|bb|nt^L@s#LYIfQ3BJP(`U_mByMj2cyhcZ9 zB55ln(r8_WZ6Q2Kz-B%jdOf5>!2zh4n)-7e>U|y;bv0d49K!+XFb&_%y;R!C(8BR_ z-*3OV8F*cFX90vCiAc%tjI2u1Qkhoq#gk3Rc^sWs+~9JrLEzgYxj(vF+hPw8J~u*$ zof-s;@xh`{10b=;LEidBirmV5p+@}|ybYKzL_0%&n z`#G*I$dKx63QK7Oi#N4TUP*$LgcQ_n*dkq8(Fo6?%hSy8P~T7k?qRCE#n3(~_*r1C zg4l7=(E$IlWF64lii%^SnATeBcBAAC-wNblBZ*%d&3e-RP_u&Lq`Aq0j*R z-tJI7;T*X`Ds{F{8vc|Cr7A`_xLFK|d%IoWCqb|!@ifvnBWPsRx<7>qHLjVwHw6R~ z0$hVi6ng$F=qrI3u0f%-pk6wI3Z*V+uVKU|{xT9+^~}R`X*(F1M7i_~e_YCJ@0=RE zo%mg0a);!*`m=73y6+n#VAJjy0SZQ_o6X_+^3-0rgHET`gg$*gch5lN#7PzVBR!@= zv`keg)Y9l@1fT<#t||>ON|jpp$6M~AOub1BKMA+CY=?ef5%UcjK9^9NapRz~wHa*) zXPzM+Mtn$v}pIX{c|I3i8)De zlVI>bpxwCI^n8a6j$6{Y^NxquJlBx0gG@^>YR5tTa{!P??Skf@+FSV7yyW7e)x_9> z;z(J9%r(C5|H4p?v1r;WCe<3T-%UuE#81$i^*pv0_EYNkecK@rFZ*8p`ZC(!#c0+L z$tw-vu|X|n@vRsyl&MRLxP!g4;tjoj<;cwP0BBkD^L&rUS2kJ{E@JB51Iu{xgu-%- zC|+nqU6n7|he#oUO(vsR0q{0JLhD(`^Wn0XpqRYNi+=%&0l(BwwdOC}FV2p9IvbdRP=H+B?f<+5a(nIvyHS=PxxXtemVe@H`+ys*|(X060MQG?Hanj#SzX&zsT^9r8wSd0>0CYHs1Y zh=~g}@lk2!e$|SCoVSV+2wJzMt5#)34xe9?wL}JW>7@jCuWlq6e#jgvnSi;K#fk>h zpjb}dd@;~j3uw9N^6W1R?F^T~>?$clOla;%=&eMIL?l(?%Urio3D)9wJ5ZV!oGv*% zpZ*ze-!)4(F*-Tq_LXfAHXi_y4XHRu&+Cum!im=|-Y{z10C9864$ zo;fm`kggNnMv3fk2nU|fKZVlN;Z16W6x9+-P>s$#ii#RHvuKO(KwGVy_ZsFfhOYV`^Cyc1iKI_Bu=Ajy?#%brjVF3BtXAi$2B~qnRK^yQrh4`}q?9x3E>6 zUFlR3%+DH^v%Cj!b&G_FC>`}yFQdnDV(_^&CChXU(ZsjZaPIpsURk*Ne zT0n$bC>&Z=%u7I;(%E;_3q`3@hUBd7O)y>m6$qa0Bkh6IISQIw6<1d))+BfbY8A;5 ze7z15kYI~#*JE{NdNa|^J8*Z9)ffpkOB-+SrpC&D9i45EFitmx079|rpC<=?OB5gK za+vt7jOhyQMQhWI>wxF=%==1D!l+-aMg63c8Ic-8*e5~s+9|OIq#CViC8d~$Mh5hz z7IX)N@`L-IAdZg$RZ5GGb~bfSin=34XsZX@g>p1?ET9M;R@C!Ut$fFG4i&yI;Vah_~A{|1QFb zO;s?q#pB#u@TWDco4V7@&kuCCk3ubshZYg0j$8+Lpxs&j0mQP*hnAO9hV|))fjo|y z5Q5?d1-;exi8|5ICl0|k9QQ82zr-0=?Ed&AB<_(YB9!gXK?+FBpSfNj#F^n^%T7(0 zHq=yS#Uk#)Q*9-76EiP-y#yC=p~A75Bcu+ZjmrmetIjQ9{~yg;O&e&O*j1iU|G=d^ zRZ}OAk6S&U@&xo;GJ2`sLOa{RuIAwcV@oDDSo!|@>~-%%iVEX2T43-{=S_%yJ=o@g zzsL3{a#9wx?(_wzeRLG#*BkqM%KU9ugV!K?Eya6Vc0D0N(I2}7TZy%Me&2IupitlS zGyRU6cbKZ4Ik$Q^6k*tMVLY!sqz(+*_8x2}T`iG19=%`^E%i(oM5)??ZU$1^!*!QA z;C01Odr_-8g60OeM+*t7@H?a)S1qGTc&A`!+VwlrW3sCqiFZcKn2^Z?@%scmV8#+C zD4=)gmu~3+nd%}X62?nXbFH)#kd}I#84rKq4#nXHnhp@fCDV(+r0w!ziaE`(OHHd)NfBx*!mf2xso?cPT+1m^W| z0zWJIuT=@viL6>+5AvDJQ_Sw5aZO!lA%?Z0RM8-IBu0e_eNXJFK>Z(Ju4M{D0}RM`6?qt=%9e>Qsh!m8uN-n6mr1hv97_# zgrozY&&BKe`nu<&&a57^pl9dE zmyy2BOgkF|OePpqUQdC?NF`G_S?-?)pz5xuUDCd$Wn1U$L@^|N8xgdT=d@o{P`+t> zmb|XB&_SB2eq~YL0aX;1+aWNIWA?fzXZ`Y-bfGl8hz7i~*o^hgzNrMfVAXC6qxOXP ziCG8Q{hekC&MWv9o3SR+gwUJJ(Nr^9Up2FcFChP6Stu&|sc$X^rcF_`163&5`v4+o z*?<84lm3mEj8QXHF6M(f6VGcC8>YiiVj?!{oU%8-%EF8PVzsHu%=V&rf*HP5CM9xw zr|m4Z*gYEwJd4ye5;?_TZ^~UEWF!+|99i#ad#yaN5K$GLN zeL0%=vK;@hRsYD|AHoyjgyj;EMp(JWwyjzN^$@Bd?1JXeTgvtE zGzW6wg7?Ec6~|vI;g8A>`x0nG)x*q@+C|%k<)HI%_keczwU6qa@vjiAlian?KXgK# zmiLX`H{|iijd6ceCv0@{=RG(apEP4#?P+m2v930FUmLeir-u1ww$YUoDWVhw z3L1N$B0HnHAOa!=4Jd3>p%ev~HD1$FhObVP%3q{M-ivS8mW5{v5Noo#Hh!dDIL3K? zu(=9VzLTs~yeyi~OM>djAxv z@wr}^PO;8~+E~gp&7jLaYGSB&T6E5QSm6Z(X{*uPAs$ z@2)O6OgVcGpTnb3$O81X0UF3-;q&5Nh}0L@ zX}IwBqn`V+-~Sf8W2xxu!jRBQS3%I5Ppp1TJjq$9b#rqAmQ(Y@k*=}2JmQrO&KTO@ zwnj=sZqWza(6lv$^D7KDrgu!#(aK%xdv zOTo5@U8cBi+6B7Hg9E^>jczfMQ&}W|L(+kY8KQ)xU^t1ocPJBp-l|JK8)q3YL3Rru z>I$E3N6sewI*#?OJT;83k*c{Py_Vf@5uz{w>jjehd;^Vj4xSvWlS@h zCKb&vXUXJdym6)za-@H0>w+E*rte=}l`}}Om$CCG0MolAK*s-_|zCK77PW6 zLSVpHkR}ub0>PlL&`J>r1VUjGJFf|aYF{@>yUk39UCWeIuzh}W{Snk*-Q#D5&40X? z)9kXfeV;QUBWHl}{AGXBsIKh$ch>x0qX%b-5u%Tw`O2$D1pLHMs|%Cy)_tG&y`R8l z&VQ7Whwtl$B!j{Y)38LZGmU8DX{~I94!5|Xc;CDH@TssDgeJ`43#`w3vm8^1 zQI4!fccks9C0KDc!$BxJdZzaJ3Q@@wQCfIfkh=$1&SCHExJXj~nJqv&_W;vS9}o^| zfgnm3tpJ2Tu#7B75($GLprBYZ78C`80g#}SC=m$+ROgOke0{#ESFfz(<8#lBGUlpi zq>cy9wO-qQGq$&zL%}tf8~H4bF(}rlgUv& z8Kf5l3zi97-s}!Th0SgR>*Z4UzJ=v7>Tu}5xe)@v_6t?7>$e}4I(t9I z6W4A2b+M^m%g=V=7*0(xvS>DVCVYD81}UaK{bGqP_{ia*~uUj~5U> zxL7b2BngiJVL(|3G6mOHix4cD;u+PuWudn-(YBkZCoY9V!8?qg~{XwItlZBF8 z7RxVZKcGalaGmqtN?15c;E^zJx&-FNlU#g)jyLYabtb%=ND%^e)w0&rUY_cDLq6v! zt*kTLz4xns)yk~j9&Fq)Z$Qm&Mww6MO$%~^A|5(fc|ERiw5q1X=PB^)q7k|i?2?|B zs0n{7Y;w_O%|HR7Ok|y zsWkXNh8x1+rwDXQDRV2?)r+# z!4>B;hoj^0b#%D0#CVLjq##Nlm32oo%PDl6{#bdS71NMV%#laT^s%V%+s)9Gm-t?8 z6qWPz@J^XIZGAX^Ju<+c9XET$%=vO+u`X81F z-~$NZMf5Cd8ZHUdjQvtGGw+-AF%`dQhk|3lrdvO(342xPGx$}-WahRLfbR_3&d@AY ze?WP`D$7@ir zv)JAxCz7!=j)e!NNQH8e6yOL5!sw~VUt5DxGvPQ`%O}k1scFtlXaf|aW`jstOTuW@ z&zPg6sKSF>SpcPeNzLMT(kFnGRuIknV+Wr5{NdhjM=KghN@KdVnLlM^hK|zvjV5IQ zwSumKrHz73T8`B&OoQW591bJm{UezG3lUGCsbVP1%iGj}X}@R(=wqmr7TlYa^$XBh!%)2aBrR^EC+ z1qE*0(2AReA7jAi*(5mN)lO_JX(E3oFvvO?`^Db&T0k$%N=!}sOr?;nW&LDc9L9b! zBPv}U`ovHEOnI5V2_2v8vw58zI%;YHomb#SM;6$d&x0$W_EvBmW49GH z95quYyAk~c8vn;*f%s;xD*d3H2u`nx#JQpb2z?P{lt{{{m1_cE=AYBMqAh_G|Nf`R1asn^UB3n+Pj4ett4!(d#4SN|^_RM1E?{O&pI*~-`tAr(Mpe}|4KjNpOPA+XjkqJH;hs#wW&5%G z)GAg~F7&J(u5QRy8$fTz=I^G%52q33^~R^HLY@JJz;P(hT_oWZr{QAtLnz&7H`X<1 zim1lref{Si|FG@fF$E)2<$?8r&7Zt);CBO4)Q`RJT(!jlgk(o7I+fFwYTt3t2 z3r-x3W@CFXM0HV^22U4;Ad^cXnv>DgC3hILQ%-G9l<9Q4K^-RkW$%s*gOPH6J7g|jkLSi~ESPP#!yhiTb12o_swSe=K>RhFQV z8z7_)xM4i`f^WzK=^-zc9^s#w0}n0nUxei_Fb+Vv`V{Kn(Bm8QrO~Ud3i>b=-u#^I znqRX?YDOH&dU1$RBqxVH#N$d;=s!LSPVQbz^gaNXAjry%CbQ0H{7;BVR3M8U@0Vw| zByskN;wL6(&Qz-|b%DCkv>ArZqKcX2cy^94Q4`mA@FbCDI#zw1xW+~LOgJohv`GH4 zJYbOZMOj*ybUCOXxySE4HXr415sJ@T7hv%DCHPKxvSS7bVy>w6_b<`iAs#M;GR9y& zd>}QT!+J!}`X<|yMx7%5Hfe^SVV0Ptn}sV!Rl9S4wJ-;r!pf}(*x|Umd}j}iQ@`Qo ze&fu(1$vLM)R1#wGPdo|5z;;5)CMcG=*r{tx!slNCN87G{@0<|);Y;EFkO!09AM7J zRvxRZISP_a2V(0$eY^+a8JJd-eV*JiLKJO(nlBf)8nLQjDj2%P@hH!dy9RpUR*Ep4 zy*WC}PKe28gvWUjZo|x6>1p)=E!p!q%_YRZ34y_#pN^>}m@9c(^aaI_Np1F+T3KPkr)V<)NRM#` z>|K_z6Y`1Y)Z1r4{-#nnjFHS;rj$*j&pyvjs-$f63 z8n~CnEw_Jpih{B9hx!TC$Vi%)RfE=}R#^VlRc&GcL6`=G4ciJSbJ56VYe`s`oVM3O zyNz5sz7Tp2o7C!gI}_i*v&xYQ7w}6q*-F4;uq_%X{s@$ErtTI$f*YZJ`MFLXbOS-5 zuRTE!@#k$iZfTwItS-94gm?Ockd3G9I)jRNFi&hXje~alg-3<3t#_j7WkAHicZV%E z#B98j7JrD+>G`V~lWawhwu2=J6SF@G;R-i$xvp-9^EI2MC~m(@{y-$}BX_||Y!hd5 zny^`YSTouUZh-rhS;~JJF5(?JZGhf@@BVhaqHKw;oZW~WVqXMaG;RJ@CTT|WEwlas zM8Ocz=9JW)Gq5)-eMVPuV@h`rTq-zB0&vB_)6vC@VK)kKIoRUV69qsDw?k|r#t3QM zW@Bo2&m!u#fuS}=i7EAM9z2v~F-J&7qv4?HAj-FE&m?<`e~nk=EoHh0S+y%zHo;EZ z6!VNiCl9^}%ZCYIVR&|B8nyxm5jE#}@0y0eWumbd11WAbnzhUfQCcup{lskHY<6Y- zDM;LMX*_ywKPSh3pD);Y`LF=(V4a=TIfPn{_3g7?2j_OW}V7;kH*Atkmk5>BC&KwL88^ zQJ>h)@FG$LI5d$6C1^xCOx^BJEhzC0X*+;{?2H=JQ7O7Gu!IpS% zJ$2+WiA}5ZA~`3iK8oWDfSm?il_sFtb%)}%KZ6!ybI8ZB5D#O3S7R9LcyWs%bFqoi zr%ov!ZM|yYk9Lz9#vP!ZuwWW~h{J^7TgT)JM;?LpS9kNw(D4%?5ECJ#TAnF$Q7e#` zfll+M(NRLMBgonf2R;H@4?we6=Okzg58`+w#Vu6g!xocFhSrqB+38!Ceb9N$OOzP& zZ3N0jMU_yLL^C*4cW0eN zH$qg-3`uJS?abaiGvP$>tH2B)=>yv}gA=6>BNS5;w3A*QEpt}kGgh!*)hO0mm9s*< z?;iQpVJ#KG^%$MVDaSMf@r}-Hb8oWQ7q!FN%STX_VCNb(JtGYeKMr8<9 z&qywluA0E+ZTm(VI8lXBcFhm^TCE#UKrU|y@+>OXgjqKf3TdwuW{zpr&mf_H9bTm0z()}%vC#}dk-AV;v0NCPaZnE)XQ z3HiU?{rpM=LWEGDXiOCf217wWxMVOE3x)z=kf2B^5(ucmA$)u9&35%)=X?DA^YZ?C z_xgC^Ni|$%^{kxG{I|8BzkU9X*n8h52bX;z^sYV6y4z0toPWRnB*PFo&#XIdC}s73 z;jcU3GM;4A|M7{{+g~3j1>wAf`frDP%Ie@1p@(apr9xz3k3!t zFp8VjGG}wnPhaDIo-X;j-iwl2h*+<8()|DC`P=cok$=>$o6t0zRD1vCr2T9azwP~P z48-qc_~S3u@v~P)_x(*T2s8Tg3owtWt>Y=bi_7#6@YmP)Z=_?DMAlGnfQZ~nVFt!6 zBWT!ld3?ty?p@Y94t}aaY>yj5ZG%ZUDQ85H`ouAKz)OzUiwzS3+;{;_*SrGK%799% zTnNI0fBN@-Ui5)vKv>ikQVdXHU+sCvjbdFY`}pon>aTj2S9g;&D#rtNUu3xYyLq0k zW?HxQa^xVBEZJt7F^SIE-^*(Q@e%{1#IRDj*=`jro?cdqob-ZA6Lp{(ky^dSyVEFh)8B zf`MS5$U-v+gn}V=Rg$>xLaJnyWDz8i^Ho{{@74SKW5%xyKPf%l9~bTPYyG)7t(blU zchmOmoHRVtKNBO5NrP!w9#`M;s_stPr0@9ovZpTD{G7IwoNe^avrYMP>mE~fXl&Lq zFz54<`?DYP{2TSKF`K`UNw3#VS`|4+7NcwW#L*77)pSZY^0nhG5zGnmu5Wjc>JNi1 zs9_yeR6FJ9@3{1($CGOA;BbN?MX0tEX$8+k{Pm*wq{+N`)`HCDqh*Z45GPYF%CiOx zfCvIO0RmJIY+4f@1i^rySTGb4g#@7>iVQ90Ni)4_nWO~r$J6DAQ_~9drCu4~B5qvB#1TmnzQahv_`|k#vI6*$@H3AZ#`#-n8-@u`mC>jz8 zgF%3xSTGg}1;W7~xKtz+2&}~S>(`v;*N?@``}x6`V8b4|Mr{}eo z`isB$@%^9q3BL3_fzYqUxqKJmw z8~(oETVSwOCLv$FdXwsO#hf;)Dn2$nrK1CVXsm3KQC%X!`Ng?J2>8HKumaNsiK+{L zhqUga5Qkx)0I5J$zgQ?H3<-k)V9<~-CJF`u!GOq6Y7!8n!s~AOcjMYh@#c8FPW_$g zE-vU=z;>3dY5#WWe&he2Im`V1?)3|&M~rWtrmJWM410%XUfv7rAJ7Pq(C?Pxt-sw> z$)u^+f3^GefP%D@{=JtrErlZiYFsq?KYRMe5-JfZQha}le|*P89XbODx1HTbGn7v1 zcQg8+Olqj=N+i?cumSD!-jlJ(wly1RxEGggfL8aM!Zr3t2Q6JfISZ~q-9!XsLHWO5 zz4LoOu-q&-3l##vpt6u86cGeYp?KYK&&R&y-btMB)=85zk>@Tu(hXZDDf;K`@K|V< z)9K6{p06x?Zo}cC`zel}V(Zyg;y+jJvP#aVd;?_cKh}D5kGCy+zWk=NMEf$knbCF| z1zBgqz>K155%O(MecJm9_L}m_M1i>}p%qMGB?7qgRGWxfD$>>hC*iUW*D1ziC;1~cN*svxn z355bbA5?(Qm4Yo`@+5n=arACWbB{JCuZUe-^K9bE477Z30F z%gr>%RCvhmMzwy$|DS%}T$xpu_14yFCbs)r5B;)9yrqji2KhjE`}RZAH(sEkzipZd zeO&N@uPCz2JFJ@RZCMvVAMvfP<{vRstj*n!u71NS*bnuKP&XxIi#-Xg)#^ zr2tE3(@t1wyHk`dFC%eQPspnbBPG{uFp5?cdJ{v6c?OBzb^FYmsafQ@`NzWS5e5u| z2m&|&01xd!n?@o({9RH5W2uc|EG(m@c9{aasC~3UI+V7VhsH&qa3`NwjB|p5CV??>b|uJd{DM58fDrky6ime7Sz$f0LWB{;@dR z8f}>ZHh3;@QwEC{gd#w?7qsY6*6cra@W)RBK9qjaC^?(fY;J&DJX(~E?}$;#vLfH# z%`<9{qMkPW%q5uE@gxxQQn2-}U}-iwMEiPq(Eu+`A;r`qtBo3SB$3|kxbfg#XlCVc znT(i9FByM`A-|;1Y7elom3w5s@Ju&)Wv!f+mI(0BX;(m(V$5%wyp*0lnG8zq+U1L7 zX*A!<0U$iu(Eb=M*vD;u+um?LACiwrbNs;GuSP2BXplmE!~BhNEWdX-T-EA1wGr`?x&b&>&0IL1tXT;ZoDFrdbLom}1U>lYir!+#u~Tp`u#ToGYBHE`-!$4yXC- zqrH&|Vr0+9rt88ad2=qfD<2)OmPO0M z@qPuSVJ8QOz!|lb%cm20v=GB=qvr1VO}4YoFlJ@cp2U4$-fH9;N;62XFI|Co8YG8T z8vG8!G>hG_eM0yMComx2ISC*eTL7&)1Na7S)1ea@(|INMUTL)Ssaz<3FjC(|c+mn> z7K#wn=an8^<{BmL9f-v~TULu%bui1@Bj?07)X~tN%=bok{-_1>E&$uK^=a$_ou^#TEi;qj$3B9nu%dr1I#PCPzySsgT1y`lE6DC~r;&W2Aebv#toPl=Ah0 zAe$`OE0nR9@=TX3RsTp)!3s~v{`q1~iG+gkfk{S6+%EaaZjYGsQR;C=FT=Z`UyzbP zQet02`YHTkU7&+GPhYDCcK&tow)(Y?^BOw(q z9!i-idJVGzj1s2(hAE8JbJ0pnrYWWPwy^T5Y$7AI z@MI#2f zPt&I`9e}bvs>rq*4j2J~pLW@=3NZV^VMPVXtiPy@mpy<5m#IzLw6 z)lMJAd=*(8!`hj@ShKtM7^40U_A#Kc6-O!GsN@vvZm@4roinG&{y}HPYxDNpO@M0Z3DtMm#VFklG-21Vl$d}*D2$V^o_DqX zhK-}yGzWVc>MNzhyznKT0fYq=C~9_uC0dM~78baW3R2&t{E8g{RpSLwbFWc{M7k7G zTmT9x3WJl7P+%>)WrahLa=vVY)%@duyP|-n4hoc}GHutI&fJnp-R`E&F0iF`RGZW- za=pe+lpkeYnzQ^k8^xg)VBJ2EDxmxKZRKGZ$o-&~1vfy6YvbO4Z_Vj1;~2*a=zh1s zG7>Y_E-5l9x47ozLH(==U|%vbsP=q{VAihL+~XJfl%p5liMpy#6fm&Qg!- zr?@(1{1em)kL4$dE7bNy8_s1YUe$@gN50(TR__=jFQH&fZ0O(n1*K{buzMk+fWJ{b4dwVTUp@R|Z4gw<^L*dYfRD9xDI*#5-UOBU z$&G(YVR7$%usPss{Zq*B$^4s0Bt9U4eX=~_ar7QTpI1u;3X&uVtXxv#ndh8Vbh2r7 zn7Ni+-c2Cr;89W^=482HcJVP1R{7`L<@F|=^_GJIkUAM}==M7$^L!vJVC7JoGEo~0 ziEAFX1doP#pgG8S@?`?(iKF6IG^WIj(+R(ev{|~hCamy)6U^YemQ7k_CsqmuDvN-M zJ3*GDKI=--vmEs*^BH8DbK5bqlQ5m!p{AM@hs9O`ObXe^5OvYzYYddB9oPn6cX71O z193^;D@F5>B2enWw0-Bp5Or|4z2fv6}(ZcuWhVYyP# z)1s+Xgk`_2BMH?fN)#7fyS8oWru0?(G`KH+zjFN8mH;^VSCUrPSnh+lD01%g=S`G_ ze#8@}2IJ!$dPx~#ePDn2Suc*t2{Iat!58%2rI1%Fq5S_oY=g6(9;mei-#4p|dp^`# zoSer()1aN+gHrB;AM~$EXNY{hy4c%yA&#xwJ&GY<<9uIS=N%%|4YM`~&bo3z;Zol0Aru=lS3{*VZ-f)O~A?2K&<}b9HSSqdltn zEfgW|y&D0Q zXpe~!%j}hP&o~`Fqix9mp6>sW{o;p&2<;J|@G)-h&1MdA)~4aw|+nAY7OfF87a@xE6xecmIU2*JrD!DIR& z&ExRmsjG~Ts#NR#Ostz?`WVqU&}!n6=hNCVfB;;g=ibfS(7p;kSGy<7#_&Bp{U%j0 zod)w%2|Qw-C2Au+!~2U8F05~1E$PH6e;~I?6b&eo>Ea}#XXPY9-)nY@W{{`v@)$Als<>b`#IPww<%PblR^B{j zP3uu#5>m66?>F=Ge5;Z2|E6M!c|+GRrdPz?5=vKMz=t9j`z+^|I{*HJ_G;pyZmumu zrS;+@H`ngsLqOB*D=WA%m+@-Q4#2rGi^HsC}ezi*yhiG@xCe&0# z2dHqfWyzL}o`V{(P=I;%d}?`knx(LxY)ghMpt=_i2=)tk@lTxccT9MltefMR; z5|c}vT~go~qi`X;q|99(y5btKSA zE$RE{3Bu4h+H-97l6FvN73TOCyK7SU!jgEQ>nC6OfeuSaYUx!lO;WHC7XbgH6Zlvc6G zDavMu>v|ZsVdKe(DZW$5cw5Z&ZclI|-|!Di2wLMj=y%3P4I@QB&8RA7Hqa;^v4TB> zvM3W5Kz0-ZcZn95aNDMcsthyF*J){*t~fXy^tRG1j61TcHb9?M4ecYbXtjEDs=T%p z)dhx;u{)qGT`i=_VW_HJJ*ONRV8G|AN{l zKd);uyOoD6{l*diWCZsVQ7rKL*2SNr2S2V(1LKDLo30MdlN4zakyv5Q;D@XkY@3ig zF^o+b6Au_mSv%aSB~{s3565cCG5w@-LL3mi}75_hvUl0V68^c6U@V@ggL}mx; zfNv;*(*OWa2j6CyP54H8lOS$|OdV5@z%l4ez;akGLE&!dHa8pnv)^DIpPZ(erm(%W z$ERdipq$yH8LaWy81xxLb87{cv&vhA3~`GJ^s$SPIdaaR`%_9C-CIrrYI~2mUvFmb zz~WI8nK3AOLe4b5R$=lh>TC+EYrDl8@K4MbN0?M_wT|^3Xo$5@UEgct48Y0N43)Gf z6P!s<+tS0RWf&jhL#0nP(X;?^i&0aVXt26PzOi zhj}ZDsN_05HRxwRG05s3<}^t!Mj4t!7bf|QywJ2dcbCY1>@eV2s|v=Zo2vDxiOHh2c!uP95Inar7FN6wS!L-;?WcP!CQ zrZ-&GkDdyd8@E-#sb?lb5#x)r=?P74p{ zp`KM@Jcn2@)L$jj8)MG8@!+#nj!*O(R>M4HUJ6*N0ll-&iS7NPYgS8_X|(BXIOYJ8 zs#5jQ87V_LUT_cs06+))OowB@*02+tbIu~uPbpH5VgA4R>Wv;HGe^^X79?{{c%^20p2C!?k}%FA-J--ijEK z$=^d#{F?TB*B(bfM*Sv)ek<>u%REXWq@mpCf~`#jnYOB7$oURx@;DpdK1Hj$zP%UG`vf=V zRVfPA_SUb_l|{?Lx*#AsgSY|$AdNHozwdCVL8Qe~>gI&bzM9ax zIC8Yxz0O;BnQZuZiW6ln|w#U>V9mr)t6`FA;Oz79j;x9RbeC~vD}vF z4bma2*BmzZ?-mOrK!}7uh%?MNc6>pnsEJdCQjQAVZn>oSD5Aig2kiLJ5WC-k>_34sTI_S%PgO2J)i^9>-5su17;Z zZw1->dU(o$%(IVa{RezyYLanT&SCP^gkL{cyv*-LwW<2{e$|c0HHmlWyHG<>rOXtJ z^=ru4kG4$Bf#!^W1foL)Kxf~xX>DyHr%i)fL0Q@tsMNTnhEWN^U=TdhFv=`M>x-A&rhQNbQHED=zpVlfzmr(-TO7&0LL0yqH%)EFohBn5*)VxU+s78(iy zfl#~WM&^~|uD%UTcvrm%!Kz!7N;=3za56eXT z^5dgj30ohUs&d`@*Z1c$|HK(ZHR1pJ?fxW5jhDVqS=V3tL*nJXb@MJY#bE2apr)tc zP48;Fjy2rhp?6&Oie4O?@4Z$E!Z77sWVE?@YxR^a&qLR-8`iP%@_GBCIY;xE|3zJE zc!jiT5`_y?KvNhYzj`6d10g{` zSST0?g#uv~xz~?7uU`Ke<34`5=KY?%r!%F_Gg&HcRmj&I4dV-TDvxOB%)BvX z*M3jYb* z8U=!ZV8EO#Dhmz*!9c*MHWms6!l59D%pxNQk>?e@C)#^%{A&5XIlilUtCH&GEg(BT zAnq%9f5`AZ^v(I3?ET`rX>8FxL0=6}i7R~fzuPr>hEHxY{JPpGr(JCSj@?>;|9FR6 zt+G*1&gqH#Wi2cxt{uctk6SnFjC|>WifLxALSi^-2F^X#<=Tk4xb!hqaty`V>-uVB z2kUb({?p}!$ofSI>OP5v3ciWA07Fdp27KOd5%v~TS?ib5qC?6Ef6xSNL45yip8tDc zAXu;#JP889fUu}67z+gip&+0|4}Lk_<@5ahmsdBxHM`nG;-YFQ>IB?1KlBY1e7FBY z<=5<;2&{1s#vI?NnP>M3wNL?s8k3e;wa;4!X@0 zp1mE|{`L7EAK$>O?e68m->fpgw`xqg@wkrhxA#V~;MVBUDU}m2LOgo;wZf>Cx+T^H z?(+C-9b}$gk?*tHY+SgFQNrRSiq6}@F{@wFDAL19tKV4?0eN?~l1CwB3S1t@q}oiu z|8+W2Eu@_;4G9O2vEQD|F>Q1yGFAwdYDYrS#m8_kQcc<-TyDH?{de~d38?U z;pg-w{ak--FaKnc@w2+S``_`~uVpv&VFgEH#4*mzA9zIgFG}BvUH8WI^Z#YxH(aeH?#lXK`A3-b+6~oK`c-m+btq_r z`<3!BQr|4AF9Y-&$aSt~6w!iW@49j4h>F~pudWd?O18%=b&N*zZAm~?)^km2v_nQ} zfrBFg0FD3v5)(n2W+wmL{7Tk@&Ln3;Foe3OmY@SZqO_i+o!#==8>BuIw4 zDYPD(Y0dc^$aYr*qN7jIU;l4WTpec)KX{gGjCOQUw2q*rb>x5?Nav2F9Srr(H>G)F zsqzC^6B_uM2#$G|k?fjqVEAvDM)x#>$aQ$PQlXqi66@-2isL}709^+Y`s!gQ12%@) z;-bz0bRbY`eMd5f$)`pf3;s8TZ(`JLJxwDEy6xDO+HHEWl%C(1ZwL1|ugLS!bF2Wc zWD2Aa;JW%SVOO&qX^iH+7ElRzu&Br$p)EjD`!htOk5XlGBtOANP*tUUhh#iU^e`vsx*w2rb`8!Gx4wOc)S}oC_;eD-b&KRu>$R8-xGd};Nvk7 zD-qn5bKhALD8&bvNsM=ix1k1*9~G&%UZm3md*99&Rq4DE_I4TATl+DRR=jPz$L`D* z{cOz2ieDX7<3~Aa>SOskd~oWM6b?NUgaPgU18kHTVhJ2{EJAjO28T3E4;SkdJr%1| zN?}FOurTs5emlujAw1u6)z0h+a$zr}Kw++X^MM{QP-JWn;BQNRPh^ULU4J#JL&kA9 zOmtiD&mZ)TtSI|w-x{DCT+-!2{DH6z6K|q6aWZqcFHdy-?dH0@Gzw+?o7m9Rdrmtb zI@I%b1WdK~U)xkE>+1kv=$%YSa`^(HV>3jym?sk6ooK;QH5YNX@q7pqE-x>cil(P= z3$gMX2avaXzjv=J2%T#1CU2Mm=O$q4tMr)~j}xY5z{wb`NEV5fi=oZ;>n-%cF2f?t znBTU3>y+R(z(xUh-zw`A1igd(nxkOU#i~ktt&zItI*-a{?mc1Dxujqh6C70xV_KJ) zrq|jOu{fQuS7J{N5{vr<@@6>-NSLW0VqClr26uf={BF<%>Qj`XHEZVe%b^wvY9AbM zJ73OiyDEP?2^|1ul7Z#aG~~OP9I*c(@SFejw1=bojA)RxT#+%i-Gw-k<=97XW4HRPpi;(wXjC zojUnw0So4_F|wtzlstSD`zuu96D6vXjwmjo0t5OSNa=HjZ;NNmETJbW-=Eo~LgVwO zOnA@$2tIDRF|EBMA~%|A`)t0++Re!6Q;7m^QNQ-aNaN?$ajBiD_I;vJLl53>{Ba^3 z9qWJ)2++L=qcA*Mju~`QZTjoYp%8k%eN`6ON(o^sGDQ^i!ioP$RV&WK+Z*2MDr`Ko zLvzPVDO&F=0P%$FUX`;zM?47ma*Ovkj3 z#D-GJNPqe$B*l6>UxEw*8@%aOY4w^7O*iZ z>;kj?CDjdxv{W_8LoPz#a3%68EJp)MuSfx=%22&)Z=Yan%UFAkLV+4w9M z2~iV>TPC@soo~bWA`R)mal zm8b5<#|X!Nca~ z{0!<%&-U>)1bc^1@qNvDgWSa@Py-n7SrlUQ00096jS+M``1@>6mns(w{)i1x_GFmr zf#JU>iKl?6o{~5HiaJJ9QH!=cHaW$ChO^NOuC4<3Q*ZNjI&F&2sZn>6ON;)2wJqLb zUl9msv5i|N$w!%sknzMa!3WOnBmA0uB->Y79Pn^bVm9FIjmewiW(B4?1h56-f(slz z(OL|lMR@GvNVF`K$s33>S1ZFPb^_$7<#FK2RSavFhyv0_8m*j1nM0?Bz;E@caPY)IYwR&7tS@h6yQoZnqT2gBcL(b z$=SM_NK{Y~tm5Sk1$PwFio+Qzc=mza`}*bF<9bN&o}$=%t--bQq-{2oBwVNyLF@Qo z1Dn7psafV7aNRnvDdIq!Nle@^F=a$?o3yc&z*{EgiC;=XJz;yhngz6#x>-GGV)PwT zRbh8f?IiiYX?0v3)%%r?>s|09lOuCj$;T znpli}Tq5?b&etQr&-h`M_t~=}+Kb)-UHo|}_;Lnqu`^J7%r`0SdnMnB_ArP>7qfB^ zr1o*?w^WLnkFR;5gEDqQo*Ih>HqL~9$x<~UT|U6Dy%)Vp z&dng&={GtL&Iqmnb<$-i1wRo1|D1BHa~X!W80YHE_A?k8j=jIJQEDDlOVJdR*ROm_ z{Fh3?MOIGhCYiE_szDT#vX-RznZ!FnQwqCEL_&Gu?4qh6m)+w#|JI0y>mLCOhj%V! z@TmKXg_*n=#As zwlxUTW3@pcuuPvz>7?xL1}n9W%goxpN@AR}FrF-TO!B{6dev9yJGkSE^f`SdU(i?1 zy2h@Qae=1?&H7*X{E&cYk&Zug+HQ2ta|5hpur+Apx^Qjj-SQvSN?p}MhI4SAXJbNQ zMF-BP`H@#sj)Od;r;(@MX9DXN-4n63*5$O*F`sqcLo-@d;Z67h@qF{n%Y*5^tP*$& zRZF%S#zwlb5vcS3{n4;UaP}y5li{n9~ilr9LPapxcXoIm$MsToZlrMTbp{`zpvtkl(LOl*J=ZrJ$efs&Z zq8_`1l54#G<+qBkpLS0hfKwEAwzYg~NDPEN%&{qEwEQme79L9=_=v>A9ErrNmY42l zb2Acy{NP}QetVTOHI4t z4iuexmbGna@DT@wwoLXs6MZcLX3R2OwPDYKezH60>pW>u7CE99tk^VjDJxULWZrwG zTX)w5L9!n0PyFkzW)c?aCTP9J$`~EfT^5s=*mV8QG1jpHJ^3gD;_6p|e}p9fv1)du zXPA??IAyUCRH^I5!x`X}3H1R5!`{^$EX%*(R?xUvdN+m0WWP71jvU52L2y1wYlNX0 zK3sm#O>x20fQnH7slAMzWid8RW0bKIhHUiNDb>bg0x5jk5b5NwF#u_Id_!`1UvrX`FMqQHIdYxifwgdtVxH?(hMRIw^xk z)?8pdc{?c@{5ME0vBqlm1EE7t-yx>yHg~!%i-A54>MHf49cssR#ECR0Llx7fO_V7x z^dGjHSx5zI?q<`1(pT=v`sM#if!rS5OKE$d(4^@FNpjfVu1Ln=Yw!t2zb=VzV#180 z6Pu%dW+(j~8`~7mJare`W=R)Ms@8Gw7PYVBe;bNE>fds-(Z1FtvZ}ko zEHm?jj6DCL&_+54N%3Ebej>%?;G19&3d}73gs-sjHutwz-5Rx~)!0rT-}Th{;7bM5Yx0<*T)}N*v9QVjtEhPaBuu;4AMuHdz z`{YmoNHy!O-pBS1pCj)ON17iYY-#CgB`s(aCjA2b@=fy{yCiX^k2Clo)0B)evs5Lc zde(!FVh7d4Yu3hP=*Ndy@Q-$Yeq(%>&AzSGdtr;HL%^%YDatpF=$-`7s%C;Kv6a2x ziY5PdRUdLglN0}d8gyKWNyUhS0i`=&?gkxVCVT=BIY|!V2%<$L<)qY{-;^Zy3Fyyx z1)6Yq>=V{hHE@DBK;}SuT>ucmUE|}2l@slCLNxkh0ba!0eQEJPTXt;Z{wGtvjOJKq z`S9*y^RygFSZiaGoBokuMsI-nST^g)>Y>cWCQyIar!-R$4?o)~r?mjO(dRrz;^^!Z z4SVE6yXP6T0i(&TX|P%K2)D1_SKQ6}6R zOgftMmmn*Pl$;C&2+pC^(LQb4I&4CcQf2Z`=K+W5*K{)t1Avkz2a?@Py0~pJFl*VD zJg{lj%s4q5rIrWhbiZPUdq5Ci3z4Dz{Xh!8JCW=9Jc0}Kc}oSIL`f8@_k%!iJTTll z%s0`FiX>teS99+g=}29J{u|t^87;+$cG)={C&9^jx0Nrw+TTBqqTf(Nu)Up$?girq zUd51L_4?g}clyDKe$oX@S$|AIo3yIQ^j=q%HjP3Z6qHm_ z;lB`{rcVDp!NC=VovAr!yhW3WJKwh>C;LjkWq>bh%lAz_aYyvU-suI0b5wWI`(F=k zq#LtQN_8D2XD|urW;-s=DeHzEcknbp>CPkyvJ^iqQ2kd;b4&?Uln48_T5g|$x>F&1 zC)|o4oJ%y!q*FL`!iolE05qp?N**O+Vdi~$4`7>E`W286>vu%JvR3kpJmP>@g}l?lyXH=OX2xUH>MGDYU4rne0Q z)?DTH_gnwZF8%oE!0*)jkur~l3Fwc;uHkOm!L*GJD`f=-(*bg8I6oA2QhtCl4BbY3gV7%j-`0_`ab|L?uo)y!@!K6k63K?_H4JIxkM+X?RPwUY(Qy3sN_d(YUt)0(UJ14%~mcmeuKQ9*Tj)0Y~7?GhTe0QATQwE-Oz z0$wU~02E*0#0aJlg#^Mt&|oYS6ovwUV7OQ)7zzc00brn1ND(1~N}+!LmUN$|T9xbf z_ucz%zAGmZBUGs^z%M^qe+TowU*e6g;%Ijdy=b$B?|}RahxImif2#C*--d7OH2QaS z<%O`%_qUbRFxBK`66A}W!fU%%77D^C;C{VihmCfifY+sRwu61!uhuj8KlH!t|C8U7-zrQi1+R9w3+|C*Y>8bl5zj( zI8L?`Qi4-5W4KazGoq#iJeloTAC2@iq~8$9Y16ATO-P18v6U-Ou@4A=KnNBJ1_H&P zu^=oc3lajtfUr=65fKDJK@vRs@7tDSwexh+QmR_Xq$N!O_I#j@_m1j*f3i>a@^#GJ zwR=1NYw-AJqqY7%yXjMQ%BnhfE7RGuSbOzZt7Y+J>lwR)TgW%rEv+tsILr2 zT;Iy}O;;jPieNMR|w7>Hmm`9s? zf29p{xGr^KUTv#gqOCcvZVvh)1V~}Y0`-ls1khZVlveRwR_9wxmcKv_(|iYxEv0v#XZaa~P>D_l zkn_ve^7*}y7~-j(#MW=Q!}<-r0*LckLl=Tb!2OjW(}mSK`6#u5x|9kb08iHf&$J1N zzz2+tfCFRJ{q#W!fl#1WC>9C|1j0bjU?>&~g@S=_u&68)83jTkFo;YdGYeg%_|AIc zC$EgjbDB+SE?VlLq#s0lzhfsqiJs4j|63o;?nUgOxq0MDKdEYw+O3~Ngs7l3ght15%{G6X?o}qqsZj~`}g4$ zQWda5-@b?l%7gp;zrOzTfnc~;P*xlTg92c{SWqS+5JEu{C|&b6H+4Gajkl><-4~Nl zF0M+IV@AH~^}KNVa36h*-j|9WU$m$FPW*Ih^Y!{E48mS&2i>1}d-mGI({J#n#K&yi zDaJegF0iUh{CzTrcJWFboW3aY%Gk;((llo!FI_q>#zB;MUEw_(jewh%6^x{*y0EdN zv2_aDg;I~%K>5y|CGX6=`p+)$kC6w+A*=Kd?dK9t?z*U{ncv&P0`L!x$SJ0+>O{N| zx`eFI6p1^=@?B9}g&}VXSs(|t90iF3V!&8v7AggTgdmBGFK^(fyQ<@DRY{PNq^pr= zsbINB9QVJc`}gSk`0nHTwWqQCZL3?;apKxN`g=Tj_Wu4W^VomHO@u#Py$t;{Yn!CM zE-9=-w?0^B{Y$m|UOVQMrs_&Kyt_72=3yF2pB%o8yLB6;2&k7GSmHTwm8YsZF5k@6 zLVEKRKDZg0$BJKg2POVapK!4p;1S;=!EN#bOFyr%wPK}g6XCY13>gRz1aJTV6M#XRh9W=W0V1F|uF<1f{i>pT0HxO` z^)l*WVbGsE+7xEtAz|gJnEO6j{mST|0qr$n@D)DeqlLp6oeXlu8lw#lvxLuU<3CO- z9=(U|Iuk6A$yGh*2PqocS%*(%%tsd)Op#d_QeR9ldHfWjd*C+gjB9h>kc}bPcVtEo_(n*P+=Ov<{(YaE(&CH+gcSMG%O4Dl_0}W z$XX+tt`R%N$ad=1grT`@u{uBHyQ-I_m-?h8>URc@SsJ%1S_vy8i8+!^Z~7GPATq_U z6+0#&(?DP%Uz>^H`d^cRez7A2UiR>?k7KXMM@1z;+1+3vefweoH6heRqWa)!0|rL( zk$V?8mBWw|9t*Q|MdIBgeC-1l_rt{F!z-!jU@MEsHxbIt*MBC2-}Q$4Dxoj{-Y74& zmN6ye1x4cWu-%%x53k2Vp{LD4DxrNakXD9M3LsKVTIW(I$qO8DfesvewA} zFr;Sa2Jm<{?H{oy8ACpb$bFA9geZ58$ucJvCz%(Ri}!;vexIekgtL6rcO7{z_bBw^ z#ON!#63y7Pa39<-K(j%!AAhEnOKv1iED_ZEzWxJl$b4UCOF1|lzz|!5(xFGcig_Gj z{kE>CMe52JC)rsE7aBjFyvOsy<^X(VwnOBXnJfE!=^vv|NK75WpZGZIe#~oK6?jfHI7WtfMg&rvKoK{Y17{i$(JuvAYq@yMIr<<;%&~ zsfeMizbLMZ)v)UpDOA+yO5HnfH= z&Of5{9KjYopj+5Mp31jcLOl?Ia~H|T)W6GNoEC2HEwos+RsI34Pl$?SGyf8z501pX zRhh>ud}b4n=CuH#AVu3uI^XtY_Tm|p98k!M-H=Qor{F+KXbLt;hj~fZCJad>EH+pH~LSQ-WDkE46m{A z&K-`!3-M8g>ln3}hXYk_{{vB#+`+eoQk!^Jlv(`hnUL+DmU^?AY8z z!1zT~mk}v-FpKptJ4V~#Vw%g)s5rxQrafTec+$v*Ohq(h#D`%1)8j%EQe#%w=W|U26E_8Qo@;`4n$KKDe< zppJ8b6`$zr4mo!mB)edo15cu_nsnwzfL>hiK3q&oj|_c*Bmmtg-WKP6~>nM_!*7R}jo0rJIYe-iH(hNB?4&mW(#+tmMBv$@s( zHb3PK%&J=dY%3Agqc^VmJ3H1|!Ru~i(nf1Gc|3* zFOS-ZgSXKp+J7)LrxsQ+u^{rLX4_V5`)pod7XoWY_cjw&G z43o$U=|Mo_t0P4w+ z(g&-N-a1{2Bq9it_(CBwwBx%J~qQVHgex=#bQe%Ob^*-%yrz9477at=Pl#f3+*B8VM{iYITkvFuce~8* z(b@?<>8d-r(Gt{#ogfE`gls$OTrse^^^rfdllaJO@9_6dMr8k^_!Y z9(?^F@t-uqG(9AFBv!)r3esZU(fU8BwDssh2HOz(!+z;a%0*P&EoP*lZilJNsP!_% zrF+FLHuiZm3QHL*yOJ6;Z+9~sNBNXwdy!OtLBopFDvYWcK8|nou7Vy3t~TvhR?_a^ zWD5Q|`Tkk@2J_w22ON0eTa=TGRZF4Kw6g4cn&)&dTyHTdVOH*;Xee5}8a@j$pT=Q2 zEpP+Su_*f-ep_(jHmJ*+H~8>5--j&4QE2cDKLCyj4Ik|FY!Zm3s4urrS1YiA5*v-B~lo5}V=EGm{UsoW39^*lEIQ;AhmkLhb;>N|=H`Sh0a=eO*&`4a&tc)mtuWj8A0A|9H zqWT6bClJ^5vtKbXTG13R3hca~l{m?hs6$@uF;HXfKYWX=9Y^~3838bfpd0j%s%2>f zAyhbe!;PouL_tp?j7IL$NqkPdYQOSwkal% ztJ~!@&>)s!-iUKnZ4gtRBRS?I6=?1yHNf@_?OK=rLSRJ1b@MFplv=E)uVR{(z9YKv z0V&8xxO-zFMO+v`txj>cwY466ZkJBy!v*nvby~VAzeeRs=dQ~m0ECYCzq0>Qg@+YXSl>xN9y#`w95nM;o|7NhqhL}9OY?mw-@Gk zRY`X&*I6SFQSU?XJ*w)GHH>Q4gFBe)_ielcD^Z0%obEC9U`G@=+J?axznXNqyZbzS zGVH|x)kT73aY%6mLZqoKj z#kgf#1k+GkJC-FD@rx(7UM?9X)({v$l&1qpfC~dLPC?#>N23yr9ufsORR4rr=9rjT zu{1hPtbcwQAvyjl7@2{OB;~C_0c#(U;Yat(+@A_V8;HHi-hO(SD)MK}C^@c6UBx*`kJ zFZ7=iKjxJ#{1040C!iu5C02`$z@sYtTgmXaYsVM04!0!dW=O8c5og(v65oO8;2M&u zXtK`!>yRn##;S<5aUhO94o!4M$76lyj8(Th@nMJUo3vBGj{5=|2NnM3zgB&=dW(Vh zQeXmsco6CkQ;u#@8oXP%A{CbBPP#aHNvSVB>yh@Y)39Q&RItarR2UC@ffkOLk--Jv z{68}toqEa!N9x5U=&(!6nVL)9V*jPmrNuftn#RuNvC>-V+FQ7A8cV;yb*HpZWd0V%nVpnv^<%r<}L1%nOCUhx2e$w-l@pF-sB~z6a9O0;r7&q331b5 z9I_X`m7OCac*}qAqswA**nR!a1NFIc^#SEbqGh=L$0c09#cm_$3n!K)^6bzJp50>( zP3tr8a8;FmoU1=5f>AON)IMP=PJwm=0Mgy6jNMq-8BsVlN%P=bDD(VXXTOe^%pXIX zsB$>542wl=yvP@p(BAeq(4lQGWE~ZmoWtBmM8-ye1sPTz`Q_Y%dONRM08cE@Cf+!` zJ$G*5tuci-TT7?S7Ns9uz~l}Z@)|@I9BaC=-;SH;-kP8>BgO+=x=;AJBV`OkeSs2H zpAMZxAuQ5U#f$e!=Uio>=y}uzh#OTf=2L-h+=dG0;TPBU_HIY44>f9vM(Mhd=(mTD z#ItqM8NU6$$%m1=8gV0tz>|Vi0EBKw81A%i;SxUkmpruVbakym=Ac+1w)9?gj#F8Y z0Vf~Dik(#t%XnAvQejEr!TC6USwD31>~r%GeJ4~@A0W18kV>3%DZkmk zn$9XyXxXEGJG1HYZZ%ZX8%+ZKKgwkTJTxo;$MPVfZvJ*mP{z&EiI$s_D)}*`RlPMI zLIfHpnZ50(`-q=yHDd%u^T-;3M%Jk07lvsY{fBBJ{_|)dY)uX;O?P+KNs;!WGOxbR z%qmctLzmu_FzQf%E$Op*35AI6i#ps&EBQ(iI%64dK1>VFy#-Za*xx(cLy>TpnWJO> zCb@B}$UWG_Jybcs98QV>@We9Nz56FK8NB)QpF6+!87$$!#{Hp}Ij=!Gu6htm7F{#R z{e%Fw{x4d%s-;HTu(2AxvHEt6J`r0|fqjV+VL?83JZjc|a{!cb=3zzgktyERDsRh$(80Ga-cn2eB-5~Z4{HF}PN zo&IbLywNSWj>d;^C|92Knwf9{w8{)!Ta(YogLA5*lvK*3-4=7v#Cy;2<~4G|P;%b- zf%vN}{gb*;HE@Q%1$L=c5Ne{6S-#EMhhCs>$6z)nUr&EPX9F-ovaN3Ygis7xGTExx za_ODUGc^Y!B$Nyt(3F%qd3g{oJrQY$AVp=!Q@9Ho9in6`gi-gsAK#r)RpGt_o*YW_@LrFFs}6B^0Rw}q9OO-OZZmF#H=jinCl+Seiq zHJX$~mTaR⁣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%0DXThCjUf28ZIq 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≫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

l{J&)}YQ*vBn(G1ylxHzv zGE1j#HAu3xn`&kVqAvXI_58p>qe|&Qe1w#mnklqPU!Rc&1@tX&>K!LH&_D!LOr|3o@$V<$LWic%PnOD6{A080(F++Exm)76e?TEdj5c06=W+LE&orzItv z*Gq!IP?pHDLuC2~H?onST>gUuruCMc>-kkr9_A%_EoyZ~-H;IWHvi6qg2Qdp{{GgqsOG*Vg2824I->|l zL&Q)i61b(-vY5u_#Yi6#EGs{x@|RwMKEyDI^3X2VAl5J%%QXX0IH@f*(yH%g{G%5{ zvBs2>_>!dYlrNCX8jbng(b8zk`m2elY4D`^_s$4N*~Al&sPzf}E$d7A+=iImjnAoq zsm`&&{tjh8McHF8K0F+LmF74KN>@50Pe;(!$(4O7Q67h{e;1jnsxhZNORp7T)eQoE z9Vf_Mb4BkM-vg2>88Wn>3l=lAwvV5^kGjlXCfY4PDkg>1wEB}wm$~zgy0(>%nnd~2 zN;|3@xM2`L-;}_JW3I}kMVF-9tWqty!S!r;GYsFS!nPd1#^nq)t;8fLmYkLWd(o@G~&G^`?(=Nz7`jo%!+7%(R2ebKwV#Gk`u)dbfQ{+(5*LkPEgwr zo^ppp1pNfsz!Pq;-GO{=v@RXB zvr!VXUXaW>9Vb#CQzVUzK2oqZy#Grwg0sGQWVVj;uSBXY;x$6ZEp4~49~^IDQV;*& zREv2Y!)G7yN)Am8eWNDV{M^}%d$h#L+z;`6TF|O9&xa5a;!`xiUQ|c^@3Ku7Hn9K; zg+!rv@*toI6X#M-bCQDHOyI~dsXMKqJ6>?*+>t!E`@MIY`Qo*Dzmknu^KpMG*OC#L zFQYVOjkJ^ukSLb3Um1BN8!&Io#mtFpdC3LU7st$V);l_Wy6kB~vqVN2iE)}mgYuT? zEUY#*cAUAxn}S^;{sj3<1}XtET^L-ZPkn4!`8f~TN+;BYHwoS(o%kD%F4Ig|K&YkQ z{P5vTo`9-NYEb4NEO8IR$=#g}q%(-WUvUrn_oc)Y@V|}yEm0LR*3NX~{;b6exN2KW z;MzUCi2co5eK7`sb22)4oF0(S^fCdn0l4 zOPU~)kDPKbJ<6?`^=oStQ>ZcWp{1crQs zHw0J!pEvR8MefXkusOJCt_p|)-aOs+vNg2R$8-Io`GL0gX)SJO_o#{)Htm?OO0^3p zUM-fKa)hV*&E!s;lz+Y%?({C-~CsBIlkP?j%3>w+ZZ?WNui7+(n0 zjj@UN5y6sfe(v0P-CLV}90?39!2Zd;!47ss(!(9V3a!g(^!xr&3|PUubadM@AQ*|T zpGZYmXs3B+<{fdH95L$~n^A9-41ozoK_ZMnQCk)L;JI#nzmO(at!pSv-J}&qy}6>5 zE;6EgD{+GYd!=ojuR-tNwQcf!&xOrMh(i+uULjp_xlA|4=74~M@AtgH*9}bfZ|jk9 zhk{8VnFYcxKm2;U)Jr6^VGt1g-i*_t))l4G#F}l!gCvT+pEAY5!l}g&llY>@EqBQH zpKc&(tHcy?X$XwSGPfXv9_?2`SzavV(BH_OjrKg*Q%G^5&gL0$KNP5LJWr}Nl40*J}myJ~GcRiU9N&co$?puY#eHE=SNw#zV#V^9~i zB#0TMa~}K7l~`hXTk;YK0K~kk9PTW71JX^_*|JIguZO#_DQ;W!uS;LTn#C(v21Pyo z%6Mn3y0?Em^p?zQZK&nHlx&{@l&b9#nMHCV!@98UA0#X{*xu8NDXDZiMNpk7k1d!< zx`t0hiLg&({`$by8;~}I=u10Bk@oe05j_i_zls0YU0-e4N zvyT6MbDh&qGg4+v0cs;5n4j2vR#5kPlT zU@{~Ng@oZ?xKx4@2&wh%pFO``dhee)_s?wKS*q0QBZoX~)>lL5e(&d-7wIo^FPna* zFQ?)^`gk{&hLmc45LCaDUsW5C@?0k_-_%#}T)(8-HXq%>>Sgc^+64lfo=*1|oz52w zz&b7LBJ?R46S;mJmBROnN(bTi)%3>3DBnK|7PvnxSj(pVVIT|ITMMT}#HTpeBz)l{ z#lebH1Z7nwAyAiCE@22{3k3qgfw3SgC=G>zfsnvZOcWsqRO5TsuNUlPYbSk8+$Gkc z&`Q^l^6iiD2<7@Ty9&?e^>>HARTS}-U3JMb-9jJ=c>T6pM}IaIkD>(>c#E@751xPQ z1@E&v`V7298AfO$lYF=G8$R#;pS?$;rYX3R6Gqqpr?~H7LyQ!U(knoux{kMPTOf!W z)>Ec+QixGG%$3~-M7qJJ0Axn-raBA*l6-Kc2(*kVxQUfB!ieTrEX)L9Is2>M|Nj30 zVZc~0MkEP^0id!FWHBp`6)}xUN|j5MNoiV3LiRJmC%?%*uO#&QKgPRh{iR3z{WpKk z?q43wUAk)YW#9O&ZzeNu{C$Be>1Xxpo}IYrv#pGFE9mmzLJ)mqtWs|P+SUF3c*c!e zD!2UU`_dk8ep2>EUSCARD`uE?Vc%cZb!23CF?d%+RYiW{HMVA=wv|TRKnpPcqFrcX zL3%J9z*p)ZUKVw)cSL(xGOt@hVTq79rExcssu5Elg^NVqP0*OMFsBI?=Ur8ni$X~- zPV{A9&icim!B{XR6a|X`VxU+m6AFY(>*c!CtIF4U7gv*dgp*NIAaRn7cmDn#$HVe# zxq5!RJyfji8Xlh#9ACfw!*CCytF5Z1r1E6mjUFxAMqYHPKdM`|#;<4C^P{!4`~IWy zn-D4ekEiAa+6gV)wV~2oy=Su7W}aQa52*aq0r%G|VF!;H!8UWn^n~ALh`(kpvL-1cxgMFEhNlBSj9uO)`K|cCjq;~SRYDZi zwp3qrD;=6slk+D8?2jf4fCvIO000-PL7L_wzuk!!KPNQge+<7tN?s| z?q<1nUUmLn%x{7~ND_9}Jk?7Qv-W1S>sq1fLrMP~6gGExeOmdooDf5wXA z`QHGq$pq1IXBqA^3Q3-v^^YnTeb?Zo$=*4WO0lo{Y zIj9F%9fl_wJ07u4wz;pYJpcfY!(48k_j*8vQZ6H+BRAMHR*D$lSs`Ie`aF3JI83e_ zq`d>GUxD$Q4F0!9r<69t*$iNz*!r&7>PA~p$dm7wWW<`m7d>N+ zQ5MAc!=9}QwEhm53yVtike@}LP*|38pf5_;jTHg^@m^IPb~e!XQ!XgR_3nsFszpHG z@<{ZjfA^14+v5#&xXKnNJ;29NYZJ&=J|9w+Pdr1(XEpcXF`y9wmEQC-EOWe4G;VOX zX@bhpa?XpY8F%fd?MLV6_!1UHMME}J+S^I>NOh$Zz3C#aL z;Q<|R*Q3QU%ZP`>TE;kS=&w1bb#2aKbw>~V0W{#$h)X>cPIi$pqfyuW(yML=tCMyT zuj8s!$up@ZJ;8#2)tNGNDMB|}_kr;lo2`;0RU5T@4h zrOtd;L%Qo}{|&C~@!LGUne??i`+4U-*3)PC(`nNrs2K5&N(pw;SOt$s{gv6p%qi$? zU9I0h?STqdv$!*!k@&z+`nS0BC;?qT?#h=+tsKVv%Nj#&k(9|~>yzYu4tVD}D+IX` zz9ki@yiN}n0~O60(y9uBqAxsFlDfEvOckuBgjU)o1XACOOARA+;R`+VRJi~*E}keg z-xl6}`!; zxndk0R4rj#ZYh!|5t_fYI;DN`qcow%=nJ89_mzy=p=TA?FkANAjB%h_X$`(8pW|jf!m+ zby>^F5pUDlZf4!rIEcws4nuNXyTOgW*PPD^+d5Jj>^ zqORyFWuXgKwa2N-rDu8r4@fD{?=uET6_gA0h6B5GfdGB1EhYUT@GGqYEEZkvL)f}- z#PeLey`9H>We0yWfYaPwjbL)`=&3|<`!Ey?JR?pzyeBZQQ~IgRl*{d?qFWZH!Domdut=@9-PGKD^u*kMp>&*g|@lLU0p#od}f8fJ1Bj~qdrq&+1 z<|%h7$5IMdoVhr{zU$}0b-e*ti-8Ju(}ip^&AnyF*mmv{hw`eUBb-kj-TTlC3y#^^ zcuuFnmrInfJX58#An3YHr0ET1OmSVvl_CJn7TpiwTjb`Tvn zpU#o8^CePq%mfvNNrGex3IK}Ma!o1*1L#c_y;>aDY-G4Do9{j7qi2(@u^5w`i)3v6 zGb_U^?NSg%VGKm7>_&(g+1znLmQ-Oz@FKp))aj;FO|zILIB5q3#9%$E<+MfYO^V6Y zC%YCWQ+SRFgwd}IUxC&A`U+qrF;U6Aod1EA7E~;hjdI!jU(RD3gbkiCpTvtzp)Olf z-FX+hj0Yr^-vCiJ90HdYnJ4g_zKBx9;!}5c5SnG)=z-u>Uv@*J)Eo~&sQ>%RhqF?? zf9^CQ+h~OlNt88H&)oreBB!86(?f>bko^J^R+awi&Oh|WDnuPf-6%xo)vFsQ(+5b&a2e-I1~hp4qeVTbvc|r5P=ywL$dS=L=zzsV7#5 z9r1Z_TO@dHR|L!48v&Ykj~0b)Rn`df*t0nU)}hQVwcFCZVB81L)#D1|)24p%A$&8f zbL&PBjqT0ABP&?JE8{Xak6VUUh*^{b2lsARvVeTOPW+9@3ls@G7U_@Zi|j^=u#-x4 zu#C2^QWam)hY6$4fHQFTx+z;ByufkMcg1p(@naV%@iK%MYtQqORT-(5_m4e%b?L?eD7H5dM)oDo}=5v2QBcu#+^Ka~&cF zV2*$siUZZ?nX{U$z0gzYfBYuHx9Ziuuo+^Wh&_Nqqm?F?y+$f5%}rfiedY?iFMx3# zmWDbE#+MCgIQk zj>T*F@>UW*?FcavRzTh$(T09G%+z1hbkBBGujo`wKsWG*ws*J_+air;!T|-JzLrY& z(R(2aAB%@E^5OcD$e7~|h=Wmplg+54UIbMqnYO{2#M3ia8aBk7x&Dc__`{(cpF_%O zH&V|IDCH7gA+@$nhrw&PJ5aE79Hp+escbkk@Ww63Y_iy%D>7P4~xTQXNO6RH*eB^u-%!n-m>FFpjIq8L7$ zS!TVUR{W`(RqOk^gW5xAh5PFoFm8X`wrqwBGL*5cJfIa~U(IiZr(#AIcLw9Q!QtRY zMjY4#H%%%`xV2Mzb~BYBF#|0OT}6!cUR~u(Mv9c`^w9v;Cq zcDdAkhUV#T)0V8OZ)9LFc-F}SA;_Q}xI4KePE2`FPfn4Bi4$BsCUk2qA}gUm)cAQc zvhZy!hIysG(^0&(l2h80%)Qze0Pm@|$p;2iB)uEXff4{PZ*ASicw0AV?^R~RaDF zA%ZHLtQ#LPs*B`mKMHsQc-P8}_1=)fg+rgLM4+>SD>sc(6!_3J80Bf=oBTNwn>1@s zNs6emn72fc$u|^B$zdKvX#GYxa^aatkJ7a$IvR`oQ$yWLheW8nhPg^^oTs~MqV(j8 zmv%IWihHO+0A+23)l7*Wlz^@lEh-96*riERgNE0@OQUeY+`I-zbs5(v`Fs-b16!kd zWCey?+L=C!qV{&i#mHa+PcFxhD;H%RR-cpF&v`=54y30;N)F{_FTqQ6+#0)Hd=n6N zSoaU%U65hu;$STOyn!bv%u6XDb=y=3cjs0i63>j){@nW6+`jap&W zPziWRQxTuMYK|A?i`qdPUVqjjh1HAN_MACMUC=Kp4`;_GkYctd4E&xjVTQw?tLv!9 zCf0d$MIyIJX8T&3fK#cy99jSz48j~d7@N*|*Zq4@Hs@Z)uS_;U;Pv&QTG(_mhrX|I z$vxS&B8rPViH4R(&rR0X>dNXdv}EqkcPO0kS4GW~TroI|XpGf{1F!r721svK|8sTJ zpB9TgjjuTHe9z8AI66599M5DPF8JY__u zY_G2W3(e-Vr>ElALV}|>ESbW12uSOFC-AdRGtM1-KLv5C2|Jsq;n2CwWS%Qh2RldR z7yxVCoFp}0FbJPTh0rUIR5N>5q)bWp#|9!O z9cIGXhi#^j)C(Yl^EPqaQ?X5#PoEci4PV`jV5;XiY8rwN`Yn9_-3OeD>7m(T@4pw$SCYau__h zeAcuwMRtXYAZ zS0o??vfit)fYcsgFj?(lz{jsEt8{;?X29rQB`%?Fc!48`>YEwpAExe6C!(WdFlH`% z3fFK=f}-m+>c67aeLPx3GsV9Ruf_PlH~Nf1Pm!&skc*{n;|EW*?2_+&s1fEtKIrs$yFmq8psfGJ9yweAiYrjc+*s(cCNV(GiCI zxm2nS00nJM98Jv#nX;C!cX4D!#flks%_w`^Y{Rudr3DtU!F~rWsT4BzSN9U1!qYji z>#padtD^L}W}-0u#xgT?T<(QPlIXkdemHx#TtG#kISc}tJm-lv^9a82VUBh0t@_m)hA)Zp)* z)yGKPRuh$H-WFUezVQb*WB|;G(;fNWUO{b>CdtSsvfva_6)D5LH_REcsDg-Q^0K&a ztn(i(p|-Mbjqhkfn=zQa*7>+kDK;jhn}*b)bCz6NQmDJXqXRz_&mOyb2EDoW zd$iAPouLa&ZHz}bGsas-@%MX#Gd0xYYISh0=%I-%icj-tk%lKj_zL-ap96D%0wz_J#lqLchc<7vwbTn$Di5;gZ`m z`A|G(!Fhf34Wc8FEb>;B&y5BdBx{RtZ!3i)SU^ zD38D1T6mXDZU|SY;=pz4*`$POl3u8OBHO!fVHd6e&8xH5!jtYPIEHvRdc}rz5TS-j z-RK*rkwJ#N^I1il1i^1m5J{6e=eKclSva4+VmGKgzRZd`o>7YGwby7kKbF5!i&(P& zVGP-3PYv516yO41Bu4x+lQ}AAY^B=;JZNo0k`_4+A}~!~f3EXB4!zoN=or-FCQWqz zWzPPUrsH?kGeO74e6=&PpI2O%Ox(aVUYH4BDQfv1s~`)Rq|H_c7Z6pU4tHxoOD&CQ zc~_qn!gvSh%JRxTWduDybsl*}1;fA!KM%?_YKBJbx~Qw*_3a1aT2^|Gk;&X+Y{P?Q z?W-@yF^xY?6ip-2cB{+>koi1rMNLDy7O^e#Xuq;7Bf+NIU&K&ss8wvZ5B_hGOrJ*( z4rCCH?EvdQ6u;kDHm!_4iY-NRExh7*XxlrGl8|W#Bv-x7Rds~L>G2Mno7*+Pl8SOa z%mYII`^5S+=H7-51i5i0N0(eTm`KX{Lc7#U zslt-vNgf&j+1tuWcltg(8Hrf)HZnqX(4_2Mo`llgfNfMdjkKTn@gUpT1n<-#;kdJT zr7iwI=oQc|c=?or(B9?Ms{)mm|kG*wGJ^QY*x^>g4%TWIi?3VRloVneiS-?K9EO(jN9 zbEGYgN5%ydn{@eY`Pil&&VOvd3HcO(i$EpTns;#PS^Z)CN-}1WfE(i+S>52uSbpS{CMqQP;^6cM;NQ!J{{)cU z?yd}kUqoS3EN)_J<5_Y#^a(&%N4w+fnx@q7WXQgiceDzd0_Ctw!XQv~qnQB@Q<7xG zLO3v1C8he#L)_Tv`FRFEZ}K>o`G+OHK~#erEOO_x;!gQ52^t^aQXtn_Ng84TR#o)8 zyaGNwK>+*|5G+^|4g*18$gC_F3yFf_P`F4c6bgh$VG^^_yXRWstH-wUe$i4TO;ow6 zh1HM6#+2!~sO{tKAGPrnUnw{Q+d9@)iB2!Ruym(4<+A>#?~8f5sD;Z+3wJ6MhQ6ov zR7Gn1KGd6a?Cnut?{7PAsJ-9W2*8SFyKndO5w`Cvt#IyBK2MIml=*ZKc|~1sK@`^u z*Kkj3ny<7m!R{WT2e|wc!#LT#aWuYxs4X(=2)%4F zRwt9#DMkAaBoAh1 zg#@pJfG~Sr;sgo1$+0AF7CCqEs`yXLO)PIRps2kZRe6?n9N-IXc3xM%2@rq|Q@?J9j! zf0+07-KDbg%etQQYCT#$eEt2tAvAe&>#r~7j_)MjN#%Pp3Y(8pV*QkF%E~)j!s%KzBQ(G#xRU2c3q)qh##Gt@fFcu62g9BkeSTH6k6v81eh{z%(V}Bo> z68V*R5fu`m=8}-m|KZ^t8h3U7yVY)eJ{Q~HKSuvuF;f@y?(68x7~M5xar{xbMDO_F z@t?=d^@`$VP`c7_=~;25Y2Ecur3W}@uDoTI&qr6Wd%aoLZ}y3YpU*aJ%W_?!y8A~i zXmy`uw)fbnO>@UNPssmC%m1M9aFIKoB;@}_tN88v0s(q!kGUS7^yzt9Vm%+e7*!IF zG%-Vu;OdQ@e+9W)WyyW2`7xklnT9`I$s-8TF|Z;dBJ#DNDM`xxV-R4-0DvQa0Q3|T zEEE$8Ljht)U^E#Gg##ghFiftDJ8*zteLOVztDy;m(@)~ zI0hK-dj^(#E@l-~>~3?5xIu$iw5C|;A5@(udHa^7hKs9rbf5m zV{uv-R?{Z0FMC(8Nl4d!<8->h0~fgV*v({%#@nCMlmW4RSfD6=yM_e4R`e#fucdG? zArK7D4lyWJK;N=}z0hX>jILP_hCrB9EGQcV!hvAGSaui+g@}Stm_=`o4g1u-r+L<2 z&$X&d;V!I&lh}N#^{;|xzj|7yzMoi)8Tf4t^`UQ1s6PP+rF-TCm+!1<+x58c0RWj7 zbQI6||KIo!&inXKNkE4xil^l;$^@aWYtY~9sB{LIr~h5t$2FZT{VIyOy27=6ROzwbv$@Be*iU$*Ss$e^<`QGn+a(CAWRE`6Bx~Jw+Ki`>W&GWjbb^t>Z~! zr^bnA?|iF^DW+uX@7m%lwBbDUz%lV$irb!`n@NSSb+LL^Nq~~g)y#Kt{^>)Se;*>J zgJ)A^+Dtx(@VQ@apN(7>(}P5WZi$T8M~yg0WYsRo#zTam1#c-vwX{~x1wF95i&NGI zv>N2aan&_zPH1o!OW_s{kOvUyqaZ} z`c^8_$bUGCY|qo9ta0s*?xwWvuE`Hh8X}%G`Y7$L*R9kZE|yT7&Z|#9wasU`Ym{5B zaoehhUk$^}v6R-RTJJIw0@Xi@RkRfb9h>SE6AeQF%(UuWSXS%Hn`~sKQuB;BQc$jB zr5}ZpWYnk6K#LA^L4zOy0FD3v8S6ot1|q-PtS9G7vM-y@XLwrf2%n~-xC|NXP{Y$L z+v3DZ6Zeo_d<=y*%bNnJW@kB!paPBE+{*Grz^aT0Sqm8MqEO^V+LK2stUaFxBm!c` z=RoC*#v>P=M+eR)OrtsNPIif)$AeUyj5OxtOfZa=d)n0RPXUKfg-ImES}4IfpG+o5 zmqsT;Xb4=rAO7@pq-`{Hg}{i&12d73*n#j;ijfq{h!H2D^ylFy$`$Ooxvpx$WpVDH$+(qXB~{rgJx-^ETz6QZgM%_^0XZ-Icy8?OZ*l_+MC zNOk%?V?d^**!Fk=)~Zx31!2({6L}OT)kdZIZXdIcO6L*(Yke3F$2*=BNOJt`1JexMuLUxuL;rD!j3UxUkyFQ0DgM`AJ?~ChE z9T;XARgt}_NeKV&7}7mJ`G41CHH}ZW=V_>=~~@ z7H=X#*xQi^?-OLMR8SDAlaNf&c+wv2h&q@`m|gxeURsnwDWM8-VKFQJ-X-7Beaa|p zg~l?w?MgK1dUJh`c~U7sRi>qd2~juWtim8bIanO*vjt+dwBmM$VP`vCdoPlIy8kxM zrhm&2HkgNz4OdNiV9^df$ViJeS2z9~&Q;5zeJWfj}DP_1EOj{Klm+^KU67!2?+eicTz1gAzV z*@gC^u9DnKI$`#l>V|7Ir4kRWV^{G9WhV_J7G~+T&x<7%6%Xw?9}cvJdP>(++^~&j z3<39_Z(LYkM=;y{FL$f}RpG9@`eeU;I6%Jk0~L!FN!N@Gq==`-jTHp%sUsBp z#BGhF^f&aN3*0s;pXW9mTbJ~DVs+JUtBLFG*)K5#`wmlkV5i6$8LZ0`Uyts{Fj~D` zVbm-G4)&G@#da`=JGyD968wO{DCS>fZ!WW(XQ}cWG=%)24gm>Tq^n!HDH2Yl$?LL> zKYg%8nJrgf`rQutxWDn;n6w@fd@@K#R+dXA&#TufwtvH6%8w58!PX4Q742CX$Nc%N z^~VWc?A-?UMoKjD`x=d?v`&%#oM*EM8VqGX`^GRazL@U5>e8u z^la1{Ll0Z6CvAuE3R%`zqVEb%Qv|Rni^v4T6(KBw;>9~A-J437lNOyPHJiXeq!1hV z(U@KhmoRyCL|aKc9p69#ZL>*c-5%X>!*|Ih#(J)?LbJ(7XTS9WDH(wR7csEc0cNZ9 zVJ8C%k-_n1N7#{lvO)u!qewCzrzouBA^^5`a=9HQlN2FIr#&`P@n#Q%s*Gwb*QZtk z-L_)0dKwj`rQh(uQOsWMgTCIvw#B$o32qGISn>+nbhl3HZCXYUmVd<69y_d4-KFN& ziWshOa>qG+A2)?+h}*q>%cZ#?IBrj&B|&&CL~PV^;d;8TT(R%OOPU>{?IqdG|CmEv z#k0!-{qAYc1oVD@3tpEX8sk57pvRa(8}&a$L}7o2kgB3)0^ zYj+5kN}VN!s2~2pVZES4*IKO&d2AkJ?b9|d&bLAz%+#dZRnl^5jLDFW>i=gJa%@=# zw9?+@9p)2kK`QcA2a8tT5b=9Xq6|&>+0Kb+nI*#esq^P&1^8M8*r)I1HC3I)SmdqL zl8$#r!eKM;ys#$Tt@l@4G(eM>i&-D+!770EK}9mIS}xQ!OJdbSG{HEO@3RFr(C7Pd zSMGG1WU9?K|(+)?q5-*{?IR^uL9b9>JP|n|>pu$Ra+@)q&~d6xmDh+FT2( zIoNPnocQDCOL9~CeY;XF)w#ED6)IUdh7#MyfQdORe)$Jp-sCrYYQ$k?eUujt%)VX1 zqYsFSLS_xs>JtnBnA8@$1^!claX|ru&(VcW$3%<-XzNis32LbCJwJ{9>I&zx{cD4a z8Bb6sk+cQ`ITILuk!?GtD4ux|P28_1n?QzZp!{%WB%-+dqqKV#6qX8?6FF_d8};Ep z2AG8ZEY%B>uT}=ef&4(K5eQATL-3@+gKw!=4$R#n?npu0 zRTy|QQu?5`{EVE`z8-8wlL9NsU|?b76QKnpsvehkOAz%%h61ae^3QR*7t8qUe41R> zP|~eEeyA7eMQycRPF%-#IoV_DF!@s|-&dgY@JDIG3HpQ!}+{9@lXx?}Hh_flgLTSin zR#jDdaT4>rbY>;~W2Dj5Ep`j|wL z1m!Ps6AH`|v%NzkeG2vWT(IS_lS6twK+`Kvc22}#iUNt-(rM+3I&E8O! zWd4@xPTG=jQ3GKuBV}W4DM-hl7_N^Qro^)q?7#~)3WJ4mmE>Eln|h0(6I-Wp)& z7W@X?b_@8Hkq>d&k8shDgNFvHB<5%fthl$#4MfT9JoLO(0?=wIP6R#;avTL9Fl(ApKXtBB% zPjEdV=k?aEa65D|chB9-A+gpqB9lL9`j){(i7qIE=**zwVMuLe-XhsDxjZGEx6xgC zu{j8e}GKgZ@_iRf5Xeclcb2axrgfbrJ;-{P7h790;R^j)U4 z*48SmrzHM{zfH((vyc`xbjj>hY8Z#qTHS(ipwKxRQYox&O>L{EfQquPtp=Bc3p~2W z!>Y2sbIm5B9UU-M6V;M-P&QA2A^2iMRNGlt7NAakoYxz4$n~L)INRnV%mVjXznZD< z47OQGL}mrcG}iZ;%Y32NHVX?1ZAoJyk3O>K5A%X69O=Y_PQPm_IrF_md>gfWki$iP z`ZU`LbP%JrmxuLMlaxGBWL3P5<`Z&GYO!+q`gTbTUkSllP|Dkyz=zu3=TICpM4lBt z0QX)97-P)(GX5XkTSa?abX|3Vx~4yr9Ch%u2`i!** z+E2Y9PN7ZRKivgZY6d`FS-b2v+e4MF1XeLoSrc83I*& zN`Q4~Z!WMsA#B|7>XtAuFYoj-hZA9+G4r7P=cfAs%@p+^*twN3jxNE;HyU32h-O7+=9nh%MC-*4IT9*)o6 z*_w-X8gzkq@y+(3Ag11q>y#)Pt^(%Ht<|L8*UJI3)gJK_5FryIxuV(qi;kw0c{)}p z_FX+20JFe!;Dsi=Bk`nnNbU(*)wS64Jq~B4;Gafvu*sV9F_6W0oDy?GB8Ix$31zV^ zVo!N#Ll85Shc1UmS>&C$L&}vUR}m=}EY}gVqM7}`#)!bB6AaOqYHbhv4X!YL(c_iu z>j2sxq=s*~xX^|~T75US8`&?hZFxJ~M%Cf@;}7Zjg*yJPY0Xl8absI|4G$nm`mOd` zfkDC#bUjHahQD2W+#(u^KYnNX_w6i zrD)I-%6XnBsp6~=OZ?nugMlA0 zC%9){*vYUM7)+ORHl)KeV%b#uyu%=W`~DGkz2v1bE>lm?K_<|90eivimS#_b+rcg_ z*{GYXYO^^Hm7Xv_%WS!fGTb2ZhtO@6vE0*ynyJy<;~SCwV^fmQ(^?_jDg$ys1}nd} zp8f(+Sd#Smzm&>yb>L*`vPJQ2=ccD^#eV1upJOo5#?MXh{uzR z-fJqq<*hxmZ@sbm0x*f?!cRnh3ZIoKUiE$Rt&SA=f}}R~b}k>$T!x(?M7hQBdg|Mu z;q#2p%avWUQSjGRg&|XELR%@{pij|t*lRF8Kd?vdt$};k14cP(+5I!-0)b%n!XsxW zdN`=rHj9BD@s{hB^DA>{xfd+1vq~t1fir`*XCwms;x)x=Ri?Rk7aNhL5p$`Z9?<7L zA(#ho)i6mIVc^O4qj9ihhkyh^QZ1oa>piq5pt(;{QK$H^6f?(VG^AAyQ9f8SnE9L78 z@_wMi>?kJ^6?XdA9o=u?KGC$Hby6z|-I5^;!hlxB%)*Qdm6~{2X1MCmSlM*omf5$oe9WzqZe>&;>%JRcwomairRlkX0c za1sI7ygaYz;PihBk@gWC2qV_F4@gn7SX9F?V=hWX#>GT7_X0AlI2qFI-C(Xzd1pW|Me16-!fBX zZ5UHsXNoIrEC}&y(GfgoaoY_0tMaSUQkcrc&mYJTG}Sw#Qr7)gJWvokVCv^7maE@R zJ+5$^xDFoAOAXN4E*2`$ME>-mf!vb6)fAhmEc>ZAhXM6TidkDfZUS!W>uFk?WyrW2 z=|Awk*I>&pMyKzrw;cx56Q+B@GEq?&{lvgoIX2b+e|E?BytYm0lD({0? zQwzG=dv>m?EWt3JV!#fxil;@%Q~U81L=>!b^z9|PZmTH%HMiSJ`u{?xekkeg(DV^4 zbJ}@|yQKRf3&2J8KHi$-N=Lz}u$!xX8b9yVK4S?Sfbas*?H!UAX2bfOc&A9JIiRO} zn^obRkS>#&r{&IPu}o3S@F3Heuhu4(sL$3X|JL%dyg2V(oV+XWhWo?%Ur-y`e6MQc zly8OUko8E^#t`&3Ae5%-&DC$le+BdD=0n>k>lG(}{2FR5Shfzd$a{l*G$s6AG|zBO ztD`+-IA!iwphHW0J~a$B`# zoKUQyel1qJK@Eh^7~3~Rs`;aGP0lD}Qo_nkKORnpGuPZ1f5ll?M>t03X$0uQV<|H{ zmShrVEhA#=R~RDaYRHW2DT-3bEjABW7$>s1wK{t>dXgT)sFQ}Miov<_`9N^!av_j% ze|29zDUuG>Bt4cTOssLtbPl+Y?sjPTy|94^1B;7TwsG4J{00x9*q#0WAjmQP#KXw^ zEtdtS3Jd|p{`?9W;^MUWqoUm#b~@zhldcj?dV%{SSc-xP)Aw5Lmec$Ta^H6kEWwp zVCEx08yi-0&|ZO+nFV(;rLyQw;t_7b2AsPt+v>-`_x1P}%zq8;E+<@)1z~PQUO{v0 zCgZ;F@J;HSbFo!2geD^EMz&Hv7qT0DzUpwx$Ig65WSjUt{3jd8GSN}V{1aLe!I<1A zj(*ktM--l*aTz&}E=8X-DtAu|I~eE(q9?Uh@Q3&GzvL)gt#=hvDU#J}*3=u4g?~EJ zH#jGjPdU@fN{8Iiby?G%-^a&y5veRo7Q$Aqmn2)kKJ$6|+BV8zg}< zMvk42#c*g#1duhw@yk(Vfzy2+-I6)s-5WLM4--9{&@9{-7`l>zdOTS{bS#btLmKrQ z4-NSfcH>@WZ-N=02>8DMBD*o5NdF7z`;6T-ZxCr_-mPaPVsivKIR+;6M&?HO^DvX8 z98OLr69f3TSoUzC8)lodBT2(uh(<@F&;f@HaL>X&_>=CxUGREIs`IYIq`1Y5GV@fj z`_;}b@>g17?Ksp=G{_rQvqRilB+}l-*rdZ_#@cW?I3ij8kW7S~ori%b-I`$!h8=1l zVZ_+Y7kgx2KXUtRZkj`(-=C2vEV&2h8)|}=U-T?eMwH-Gj?HN&@dW*e4{nAk-WqCM zg#gg=b-uBDMN>WNk9TrVQ~E(k3tq;9Dh#O3-Utu;SWedFWK>KX`goDolz4A$bwX5H zfJ!Clzdf9)10Am(cHivefMpXJX}KgzjPE*vgQ8s_*2FZDr|wGyYdA@Lyz<P2iqVqv zkY@&=u;&Jma8f72uaNo;Oxl0r$?sU%Z&g6F1|g zRZkW8U1$9!v}w1lt9#Yd02V)8h$>@wCG@{pafdx(zJV4?fT2!mLHOZWXSjfe;nO4W zOQz%lJH#Z-D{I+6(O0`ub?5lQ{L|8=c=y3Sf~#`2E(D%{px6s;md*WJxbC-M_5rol zgqqmD6o0JGzNIW^o{EZ09vt@BM&K4lSH<5jxSbxs5GnTiIySv7N2|TINvxVr+xghi zaHoIilldB1vFU71u!31hAL7pvZOQ_@H6eWfS&5QY56U@eG9Q=-Yfn~RY+Sgd^6eg_ zsbhp3CY#k6e$bGkj5^GeZ$`Vh=OrW~K^a-hzWgyOWxYv|F}1I+B|bSwF0!VvXJK&a z3OGSH(KM*GzAVGn1${!B}o9#R8qL;8B_+}Pf zyOxrzg}cT|0nD2yY=!p%8P=jx$VvA_Zfn`cVs=-9?PE*Q{IF5|Tl^OCWe=`%uV1ue z#j)|281^pM!9Pk{orw8*H-Dqfwj$9j<)#eNF2OaRM-Wptm2xq3m$`NHeb6XlPH(hL zfsg8{5!7wZ)3!Lu??y2hcn=2JBT-#X!+A3gJ5)LTgdVQ|q1^7f-?#3%TgS;sWd#n3 zTmb+S5KKo61&KjGuw*tC3N9F%lmR{2L*vk23{s7AZr=}4ABI&LZt)2z9}Cz0P3dC>kJ z_&;m+7t)@>_g?pV9?wwz+m*v@z4rO2V;+>hn*1Bu<9i7W`+wk2#}At3*xyY?-%wLs zw}!vqO7Z8&zRKP|-?Cy>3WulJYM27+*6pb!?z@X;_Ur&7$}UMTLFH?(1mhXXviD_R zuHqqLCxRqX>JxZS1hWE}0C?(x0DmzkSSS_@2?qg?u&hiN5(R|eK&XgH5mUtOSF6_* z-u%8lr=4$7W|mx+xeD?>Mf&eUl6}N|5j5RoexdO%;%E^I^c8-8!GgDkax;FLGt=Xz zc<2^ODDR>v|4b2*N5kgRIKrN(x&L^LVM=aulo+0^ zZZ7t(-j$gq3dZ-)ie?V7vS5K4ci3dUiG_0@sN4^{3a1iq34&OQh|ni~1gw}5g$L&P zPXATy0>Xf>U^EyT1_HvNK-e%Q3I&9LV4z4S5jg}x=6b8=Q+#FKWL4yn5iNI@&lREY zDtKt6tv0XdzT;2y(C_$zoYcNPSbLL}TzL1*iQVNUVVF(52R3k?E75s*Z0eru1LTDayV zN~x+Eq`0*uXnvl)?s#X_;s58iS-yT&gWdA-dT}K8s&!afPx1KweMN6d?7G*-zq?RK z>e@aWyxYGC-RDiZZ}MYCtUG%>{X56k*L)4y=DGx^pSPck+>U&@O&+>CRITG7J$y`S zrr8FY;+m$nse$3^mM|9Kgd~Wxy(!#i@=#Vt09#WD0%a+sI-^zM4k93j)GAMvQI&Mx zT2^)V)KO9dhShx%qDeB`{aj5IwA|Ml5rHw7V4!3w7YqePBQXhF=QA^(ioEZO?|$5JwOZ;fT)dMsJ~~=IjmGUY zhiMBFVAd9lkuOuh>j_0ry(-%l_uwORy?!- z5{PYgtOr0mGQkQ54B&T>O923ZFreHpBnu8g!Emr_EEx-hhT%ZCNGK8sgiK)&m_RDt zar$m~jPI^F_3c)>%gsu;THVaB{g3DV<@EohJA^g5hrg+Fw+*JJCm+TCv!^)pVeB^} z;EF$4kIX80Qgq{v7rQ@A{hcGM&yt(pJutqvQvsZWxG~?m#|fshI{EaRT^v&Lto9gp zTxS~Q=+XUg#lo|nCLbKG_H9ppL$ zearngdk+?m+3W3^xw16-`f{o?b?4%-7(JU)YB;|iNsKxu;nM79Vx8U0yNX%$RB!!! zw7*P#QeM)@Kbdw1-(QMW6NHCWf3Gu0$z7~mu=up#EYC0*$;bCK8i9bf;StCr@VLltQLtB(A# zzoJd@_iNmK7z?4N1y-QaVOul!ow1jz%@Nd?eoe2cG5iLA{{Nf0ku43w?JWaUBZMVw zeBr+1p1E}Jy0RDwt~b2NPSuVS8nSj$Zgg4#%1p(zN$!`1VU{cA;N=hbGfJPX&93dd zrv=bn7;Q+P*$B$TtG?9KO02DW^0Y|yQV<3VfCvIO0008YL7OHcKRn|xu-vXqZ(7Ai zd|O=T17AAtg=Jtg)zG5wR6^dsg#f5pup6rAf*eRe#*2*xOCfFqk*`ZVeE+QRceTg8 z-X=*vXjW9Bl!d-&c5*~^S%U+vH(#9V89RWogP!}v0~T1bDS7%@$d4-7%JNj8$f3z8 zOT#InMXhfWt%p+F!8r*63&4pQTT3EE(eI-)&(%cJDV?LIpVs|N{8g_GnhD*tgvFunM!S$wxC zBbVlli#^WBwFb*|^and{fu`$jS$&aG+abFOA!eQ zaVG{8xw+i(ID>G^6#DE;X~dMRP+v~Vz7^kwB7kRL}3w_ zL~ovDSB(1RYuA-{{AEnmS{JT;s+y|cJYMNEmzS|U_OaUT3;!Fd6VUf7xRd} zw|SsAeQ!18ujoI~gE}8VK-vyBFVu5cvPDbDM%BeUBVVa36gM1x4q+MNoXplIt&S`$ zgE_sqZtk9Zbh=)ph55=U3m4#_BIPtxf95Q#2gk z_doZ(-+@=#;s5m&uUYW)$Xorp4t)A2QGuQIwbkC^h-K&7pDI{? zQ-&lVblq<%!JgAa@Qvf}b73k9rdI0iCTfsjQlTe?z=5<L`hBz8{8u zE(a^-N`f7YHYT#0R*6>(Aba4gDgggiSeU?0`+_i_|Nc##`oOWEOgIY$0>Plb*iaT6 z1p>i9uuvosF$4m<=C3R3-sNk>aZ!8KRJkixA-!ySDL>Bc9*l0voA&;HIcrL*(AR&8n7W7n*=NOq3qM*(aq;lwI`?;aBpX1L+(o%` zm;=|(>G7kMoQEmuT4jlE+e77a{g!;gj!yc4R$-<4-`*?q9VhqVrW)N7n~R;BkIs*3 z-#R%~iTDj=G60Z)pL;$%C3$c=V9;eHX~TCr`l!RX8q796g`)t&MyYnPF?F&$0COY8 zay!Zegn@#v=r9%x4TAz)z4j{hGjd~dUP7ny(q6-m2|_p zguO-^S@3qDBE%hsH;qxBk{bu3=GUwv;*F`a8Z&J6oIcMx!Ufx^5|MB-e zd{7gCQ)o5)sUW2nhPuvRDs2rz{nh@rVCpqrpMu81Maf@4GA-yw>zgXHHa$p{D<(48 zEiJu~?$%Yh^o(Yd(bd}Myec~O^8mq+0RTq;`V<(577PYL#Gs&DFdGU5#{odNSc)MD zghXKyv)#8j?Ju7E)bZ_CRmV4F$y{ctL=nh&zMW0|9$z|LKZ2eZb(2-@5xdKPKEIlQ z@U7mneN57bZKspU8%K1%SHl@-eShrREtTnaWMBa4MGP+orYqR$?EY_kd$p>_f)yUR zpioqx6l`Sb=!~Z!nFR`syd2G7NDc7k>B`l1rEOoP?N@MV@|@DE1w4iT#K&OI5PNG87AiLg7%D z#AXo*gh=zfZ+|@gy*zL0!=F6)uOA%Vyz;x<)s-|p5&93z>J3WUSFY+j-PrS5_hoG! z#CrVr9sawF{clw(_~MA=c(Z5?Uz_C(b9sct^e@|b`Y(Bd#liD5l>pR9^7e?p1p55W z{ybuEHa|lRxev>QP#^806Pje0v`{684Dkhg!UBo#gVza|Lt{7{?ruO3XeJy5g8@*m zkTMn>g@Yl0u#hek5`_YxAc%}2GYE|*jLzQQf42Gds`d4jmzP{*l2;ij>)3r`_GjE% zTblVl-g=7H*~WVkjeqrjOwadzT+iCLM0>qJ+pnJX15%KsHA-9kx6Z&)lU}e~)gDif z2#EA`=x?-b;Qibhh)mR3f zA_#?d=;mBisN=h&l`i?!+)j9^=u@SA-8X&g`TYFBA%GpNqWk55ui zk}olu88Q7{MD2sQ9Q@e2K9M(*?jhFO5Jh33Ufv zdD(1eDXa_I47zW!KNtVU`mg9hH_zUy-Qu8|44>umBj{f2TE0I2{*V0Q5S{9kso&KF z`8%m)m5ET#rlbR;fM*Aa{lzn0{m`L2gt6y9rAW^%3nzAz#V)iFmbE{~9#Bvg3=V?9 zfiP$=78M2t!GN(4EHwy(f+HY^fGO`^A3L3Qbk^l@l#9zmlT}eDd~@@n?|FR8__Ty) z?zTuyuO<$EBfUy~uAaYR4tr9GG#LDPb#C43?VHK#)R?;Mn1g+pqGiNsJDMz$QP?4( z$ji6>!Yf!_CTA+#Yv%qQZve{8v)9l3dN4^l>d&I$#~dr=xfhiyH}Lci!GA};)JB)w zm4xM82sQ3gE03N)(QBlu;*Wh(x&Wd{+#{?IgyHhBg37qY zRo);8PL{|uA=|SuGTN=!G5{b5-~a#<5<#0rBR}A_+v6WA)RLQ#?GU+T;geU6+%VC~ zi(}wGc77{b`wBk$pG#{|`1F<70;>hIS(UuXOe)bw!RFoQwP;W|4qJX9B2_a9QCF;6 z_-KX&t4`vkH&;~1`|^c4bbCvM!hJ1a(pmi09SE4&(V&g1^|o&Uewm{=VE)GUYfYa1 z{F*;7SUX1MYrcysucPqraKi?&;cUKS>qVN+TwGdCOuj+vl9$m#al25y-(-!N&YhUV zN99B%mnpNxnt`HEQ45*XfUlq!XxiOb1s${!eH=Q2bwTwWMJb+X2lU6FsAAKUE;nKO zGPz)gSZD9GH!o*aeVEX9de6L=Z$wz}U{<`nTnU}x>OOf4bwx_A9TudGZB><=^?AI) z;~GUy<`2@x87S`l?+6P*n|&t?7I?IRNfTkyV729eKW?6WrSufW39fm)a?`0TJFps~ zYz6qk$}^AESY#?CfWokPu2qGIVZ$g!&0kEXI{bd!I%6?xZnRFV7Rj;EKkynDt$$(< zh>WJm!(Bb&u`xB|naNyhnv(+rz-q=uBv=nV2gKuKZ%qrTu>ev+BFV)62QuxRW`;GQ zw{B@+aFtr+0&&zH_9S?D6?Yt-NYm(Va=sUm1xHNbgp@9&JE6st>M28{_C<)+xbzd` zK!a{l9HA+faN9T8L@xID05PMB6Mlcz0Hg}y(CPf;)fVjDv}*(7M+{`d%KN+F5+Vt@ zM4H}fI=p0<&4&C*zjAm&mzz?^ZVH^(w{JLmE5sU|7iCu6zy-)%@@#lgI()!7XMACC zvXJiemWSNgX z6|#Rx*31qwsz?X;W|VeAEiwFu(3(F}K9*MU|1IGj3qk+e?bf4@El#CtbuP0}UldIn z8V+rCTL?@{urE0A&U+cr9HzqGZ(QR+iWHW!L+Vw&s2K;xGXdD3rB#uJv(U>yGP64I zua#zs`?l!p@ev9n(f4}J`eb#I9F`^YJ~+w^cly-l6I;Ot5MjBZ;A1?d_fO@Ya`QX7 z?yAn;fX!9(mYAd;v}0W4oDZ7}{iG;|tHK=p<%r?JJ&$1m1VZb+xkk=YzbIe>;LoSa zgc)WFkVk;E(16L561+@MvMcp_iQn;K^)#@=8&%EFYUq#!iKkK8&F_vmd`a(@<}dA_ z(3Lw@FrD7m21V|xLON8qVoE==2(zA`9S(;$xI$1iG`Ig~OQ+8uE5&0p`Xs@`$1NrE z4V`h>HlIL=k?h?#Hgf7CfhhoSe3!R+43;9}D5}ewvDz4iM^uetMiAatrzA&d8F>Tp z|K1s+WEtxRM8oAt++f_pg0&OuWxfBGvf||QSuXs;WEMAtfj4a2aWL}sIU>E6Q=VZ# z>GEq|DfcT|q03t(f#?NAaC-`vdX$4bRfR}EMaaAZ2R#K!O~t)%9W#Jvl!UK&Fj)8J zBwCNZi@g7mFiQy3R4br9C-iTJZpLUeIiI~me6iXZJn2{eeY7}Y2PM+ZFbEn2dW_M1 zYg`r_cJupa-N_P2Vz;E>_qlWQa2__v4_%7|1qAx#QBPAMWN9m)niF4anr&)D1PH?@ zFfVDHP4>D7Q^Qq3r`SQ;7R1Q)7@&)2J$$3}o-cr^=xvpu>0J6Hg%8p97o0~KJ1fT^ z&=ANP?yJCxZdq)&3gb|x?P$(-r2_JeWbkcwhLbzDW{ZE0upiixIy~PuT)=a~tSR2} zo;IDHlPsoJ#sPaFm8J&(HjrOXPBoUemsxPFjZ>_2k13zh;qy9YK-z^_l!5%c9^P5lKY$tsn=Csim?3hi@)i`bgQ;&;MXAf2@S7dJXqb0iw*@hY4+i+&!S?J;c zWNI^VZ9wGY?@j1;z8X^?=LpYe&C7oi%bdDPQXz;J&>(=~f2HbRj*RBXBnC?j4iaMq zQ(TOmw|1U`@M6#^9=PoCCIV1p%!)|ltd=ab`;#H*(mohv(d_d+dIf}-=PW5^yNz%U zEu9rBq*Ouz(^rLcM?DA*$zuJ(?yZ_6*eB3|s*pOXgp+YOca>k(ZME3&lS9fIvB&RHDBX?ta^u#8bnEtR)SMF!Jz2SG}<+bmJe%63?Cb#e z=Os@hAe|u=$P?#d6px7X<{caCN&Gc5{;SI7Ki&ccmuNAephz zra6TXIUXnFRVz}%C0H2*?N?-=zQ^M^g(^^v`SA$erg@XZRt1zBF&l?X%oG9x#(QhB zi(joP1QM!u4TX6UdxKP|<%~>flrL7v4)SCc$$iDpI%57Ym8SdP5Agl?7{IiTbK*aV zFc*r!{WZrGA>Vl##>YJaI~<`*t{w{8jh=osmt!;kZqlI3-0VXQbhtAh&&x30%cVv2 ze1-6A=xuD1cjqWq`3A9?Y=HXUrJqnm#2qyb z*}hPW3j(mOM)U6YJo3X@Sfkf}zq^tXx-z;jYW%^(FSXOBwLLJU+Wv6WoiYSOXdCXIvfwWSVN-#lv_13bzddC^CHAB)`r%VVH zrw>V-L5n_Lta!irwOY$5a~OqY774&5z+y>>QR;vi4sFt6jZ*#0p#b4P9=`;$$z7qN zYEol;2Vd`R;cx1V^TIt=tVbJW=B5g&)<#&Q_ZYDJx%M}6_@lKUMkT`vchrdQ}vf4 z8$Ee+27rk|;QI(?ZmRlrWTRWST|KI8x6EeRX;@-R{fofZ8z_|Ef265$u>c9|mLMix z>1Z-AHT)X43IAdXDZM5e?klq|)7GhFIYXR}rxq=0(&cvze2jM&w7Hr|)(#C+@i;XIf&sgO9psUBgCUA$2j1fG8O#GR)r^R?W`vr^d_YL zEHsPT9`<>1BMsy+31ISJ#N;tB+3yXiA9i{&sY;0r8T1y=$K_o+2JE~KX@m}ZaV@ku zt*b4vp8@ve&kMi4Y+2fP*$%}H&8a#+@Du=Qb*1%-xL2Xs zi8rNh;2pA?iYkH;_hotPE;9OlBH!>d9zFfDmnQZIY?>zpcTVi1R=o|iDlX<9;YkM8 zQs+ZSD$m@mK>`vcM}~S$qgZxOJ9`YbwLLNDQnCS` z1m|d5^J3+GdFIEj<1ismunC{hX3m=(?m-w%%9Ri|arMo_v49l1ae{b1fe{*`&Y~hP zHnfdh(@*z371^6jm!3PaN*Mq;;A0U#th2ICVFt_KIltPZUcj@>bjG4vGNk_(X%FJU zgX09`>e|evd5Mdz$RV^Dz)uG)w-4hfqrfdZ# zz`-EzM9(-4%cXaB+|Y^n5`*a z_1X@kZ6BTDPKbMJCc>gC_8qK8^&zV$;amSXpJ)8=*>upvvg7L+12valp}r=}nd z+$q!IF^=c!2OR>tyFGwP20fadTnLC?wEwbND!kMc2;N9oLcxJH|r z_EuFq?;sA|ky3a|B2Vl8)h0fn#x9Nw?vFd6zFFVp%P({9)2d~?&cc^3JX`vTP$~2) zJXCuO@dp$izeFQGB+d|imgC=uFfJ-t>Cut*e>s^LDno*7=P62wwJ-&sXCs({IFrv$ zEur3(Bv~hM**{OB5mX*S^Mvn+;@2n3l_AN@Djc-E6K7kaKm1l|gu;h8>~CY7;Jkeb z2uTqe0kO$JeaDmRzs6^nyZRtW@*v_#mh@~0Is^{%7{4TDcjC~DvM|ka>q@9xMzY7L z{zSaxIfdqy_`9quq$(GAU^h`v_@oR=v{Q*Z2tp9H*5*skdZj&({KVb3H1v^!TFQvl z=c9;y3V>;}?|un}6}4BZsa5>pf6@%;OUa^j&o-iF34=}dbTSo3v;*(l6fxs|+Z;P@ zx|6UV;9!9fXy0Pjr{Zqq)empDP%DO5vd^R03372GEeZZ8qjS-!leOgfFXCojPW?|9 z4Op=Wa>VEH=c24isvN?jUp1Q_zc1wV-#HAj5c@`?Ci%2R_AsNG++lq+T@}9yK;i@! zK9gFBIDwNxQnnR7j4 z9}8yK;J1EI>b-c%c@)e@8Za&w_z-?x7yi`NV*xFNu7E87{5rP!A`Tf0Nk~Z2VfM_G z+*&IC&;iosT>dXZIC3vkP>@&GXw}=IHI`2=>}E#bbodV1cCrp2aG8Zh(>Pk=!)?}+ z@!k4lvFdd=n|&eA%{@+>jEB&f9XAmi(U2#A)8^aqt94M*TcO;SDR#jR*2MoJ^k+T?9wx14SSz!AQiRTS;*5 zWP9@YBQGW*sQ&2ce&01f_$5FM`4xpebS08&8bvP--C$r8Q^J&A4C*<+o>vZ8bjIm; zzU=@4yi7UOfNup}lrs@(4*O@}R+w-)e!8~*vUl!P>u`5V|lV2oWbd|i^1 zEjfg^O*Ne*NuR8{QO8lI=1t4uDtAsp1-Q>-0nU`PtLaBgi&AqJ-WJDPDa-SX-rH-L zu`CU!zlAcaTZLOfxO_R~S2`m_t| z_mI9p{8flQ7j$X!duQfKH^6^StP?(;I$IkDvnoJEKEIsCc;+2PHlMKXvYe?^x`?Oi zXDF%0^Mxf zdSEp!)TTdu5}qH`wpt6-$AR!Z|CZ9dWOOF@ABTZ|<>apoe|G}r;8iVuUMdp|t_6Bd zdRJTr>%CGi&@V4{00cMWsR7>ZA>#`GKfD$IDdyw}U<1qs5kUqa11Op9gdzn(VL+Hz zP!+BjxKK_wJ%eajkN3 zEe$U2qUvj(q>oWt5d;fcjUfZ;J8syMGbH|fUvn+`ujaM;E4abc`!A`uly@_VBw1`R zCZu@$YZX);Odw+L=|nJT2kr`I_W;Dufo?$aJ8>%AD&y1e&@2bb<6|{*>(`Uk9tw%Ib3czlZ&89UVO1pGRc; z57W3Ofj1wjVM3|*ua&6cm!rPBW~PVM_j~j7^vI`X**SH2Gu1+*RFf8)E0`*~&V#gI z6Pq+wykvt4X0m+;e@SadK|PY=dQsf$*TkykpN_bJOb*aeFXj+ykiIDgIuq-p)cjkf zzUMuiToVE-0znXvL}VcgZslv3UhJtU7erm9Qpj0Rm z7@?juo$o!ePabpY`1|13H+M;GVl|o?k@@@IsrXF#sr!APE8}Mn=zBhw@|*o%i$Skk zf*QKgbD6I?<%+noK4r8Io=P+My)~#sLHAPxmaD+?*`Gb$J?P`$v@J1Nj{g;{O!%F| zFGPKu-jt0#ITSo6blN1!9g%&C>9I}0|AhrWGEL3k-|X`s7yi=2$9!0towNS z^PBJ6&(3>azsJAFI+|x1#zvdqY&7Tj5!3WG?|+V~=XGoTrT9;fqkP78e+Lh&aV{}) z{wo+XrM$hpC+S~Xf|rx@tkFD}pSu(E4iqi@)FLX!qwj4%Yis*z=IX>V#Gv1OOiUYzhJ9I>Z=2@WqNi7qr1l7EUXK3k5=gVZe|k77PW4 zVL-@eC>II^!h=wdTq1J_gaW6IPahmtJ^gooKYneb4+Kso!-IyW;ORrs}GuDD**ar;#-=M(Q5BNX#!Upl9(KO)NhzR)jCz=QNT$ z*6*K(+TD!Q+%=MipG*M#Wm!DxJ}y%frhW67Oj3uRS3?$(U4<1X5#7e>pLt{hfIPDY z9iM0cF(}m_$pAd$M76>&pohPDf7`&ZAWRq&1_Hr=uxL;g3zmN2`<1kLq~;e=Y)5%lGNJk7oxQ zy_IWuPN&WLDJ(#`?a6iiZ5Ga$Z(p1+Q}U?7fhI#8FP#E^p5@u{ZW9sX{UJP%D8L<{lToyn@u9EB zU^)B0P&19HFuHE3eG{hkC{IzU?wchkb6!Y{z5pDg)TPz&^ragz-+PJY{^&iRU`!|* zh62HXuwYCW6D0&;Ac+Vf5DR^z%Cu&=<9uSSs?sfJl_-DQuC+ZsKklFX2Jbeb;HZ0w zuK#l5|H78#3VT)e^`U1s+uig3KJ}~%{JgWh?f7xSd$QVTzvK$HSa+=X@$+}-t8N|t z2S(R`c1`%Bs;2Oprg`q)Pqr(cs+*~x?4Qw>XF%Zc0ba6$Dd&A0YpRJSB|fNNa}0u8 zue)UhJuWC8j`IDHvE_PG?k8J$6ZzgdCKP#JN{rDG_patkALsf=aqR;QrA7!g#=Yk_ zTJmEG1jtM(=UHA%82}IjZ~y=mOhKDwBER&kq7yLjR_IA@nJULq8Z4%oO@Ne^*SFYK zUcp+6s#+s%y-8@|!Sj@Abx>ULxOdmy1@Ok8{lUcB_E32XeoA)u0PK#S{pT6+Qceyd zh`;EtOPJoR06Xy2RV%5yhU1lk)!Q=atrE1t7&k0ZqWHFp_wDk}O(HLbRkIQgWupxacgyt5Eo_gqeSYZ+ zO|_d;%bhS$;+La7?0#PKMzs|r3~rIB5Q}wklGTXUxDWv7q7jT_kPSCD%a8E#B$v zQ%3P*Rm55(X^W-PPPbcW;LRz<11v2&a0<-3G;Ba3o7r?zez61S$sAt3xnLE>*SnZB z(qKNpcwE(Tp(z76_eXzAYy01I)sBZyX4xGpV7u36A=Ug@jk@Xeucsl$qv!LW{dMtb z6`LBeEhE8{kc_%|U25f!lCS=Iu?0v2WfiAXbHic>*a4{O!*YH96Mr%uCLG_#pmRNC zDK)7)=XdtO5xX;Lc}q|) z<%5|62oZTZFyHj_rde9>t4llzJ`>JEac-SbWgfZVqa7@q;PNjtO$!<(o8bPJJZbVc z@&ilzYQ1yI%goRo>18gwd$kJ^Ye z7cY@m0VYG5lHJ6aZMw1TVlGoULIF9Ep-nCdbEa}l366o0?2O}zzVQ3yUX%o@G%2pWG$d% zzie89oj~(%6q9okGH(WO+?19UCOAj~gY8M~FrD0b#oNv*NwKhzW5%=uypro%+SA4tDWdO5*zNcJg?-oiixKkN7r9W_Wd;bfzB? zM6by;ay*-|QoH|d6~TG;J3X@C)~{3@J2w=?t_d*T|1G6L1rxMte0{lj14h)Nq0L&0 zmqT9Kp5<6PpeSnpE2>u3s5v{ZJ!*GN_;X*3k6y0zW&WeP==w2aE!IKW53s;(G5y?b zEkc5W!vzKk>z4IWb!%Tjb(U;Gr;`h*V`E$`#hJ_3eLv7#%x1>n^nGieOy72Yfg0c1MNVvNw{nF0Q804C%ad-do5zl&FlzR` z<`4udizDqSTAH5Dm8_Xk2;gXHU^iDT?n||CO4(+7{~C%=o9$GttKsQz|6U&d<0%zl z*$4WMB3kg1$R#@#B=L2RQIQsp2@`fKI3n$r z07hS)#2_xX$QboudKBzPFf>dn+x2U6oGxfBX}8Gso{KZ6;*)~YMp8kCry-uYwm#Ag z!QCu%3;4eDxaY3o1})ktf^2{h`W?5zTw+|Hxm}0luyc_=1 ze)LB#$g8Jq?4%C2dgbK&s3AGC;MpBCY3o?T z%7&3)+rZb!Wg+vV%2+x)%VZZX9v{GM+I0YlRf~W^ulhd%e^<5!+0MdVT@Z)Z)kSDz zR5~${eh)voJrp;Tj9QF`=u_e$Me1i3DmjP+`1@txfK_45lm1}2hYjXA*GtL;;hnV; zmwqL%ua6$-UFr0TJ7m~#i`vPQ^;LA#qtW(+*s*75zKevIIw3J z>eB`--Ty85VZEZ}xuMQU8&ZRE3oPW)QHueEz(|&J|Ch7`zb&NCY z=c^jd_qv5**4krm7BRLpuG__1=a#{l>Y-I(+lCt~E4o09!Z3Qxk6AcmX+`l3M!73h?R04!)+Edac1Dj7krMZ1*!h2czOc3pD6 zeQP<;s>=c-OZ}1Mdz}ah%JK7?n90O%!-$eIJgQ(^{R-N1&(%yVZ#uvJBsUWo+M%wZ z+iPMAzyL%vFmk=br|55H5M*%uRF~RL$Fwh7;6IzD-y3&lV1Ve5Lm`t2Y+)YDxR#{R zcI81th#j}P6VZJz&|)CyfH)&F!>_n@FkzC}k^}-}<4O26-{6E9qcg0#2K=}m6sj5# zJbb28Ly^DU4}WR4o6<6NxNW5&rRz|jPGf1B_-N)f$;^NDGd9tg%`-!O9=0&yqkc)jK>q5X^9{+-%ekpd9SR0d%8rUL* z!Q9W{R$u?m%x1uumZ-T%EnBPf(!k5|9=snieYrc)4AK5}_jchCI}O?J;c4{>XMaDT z*fTOMJ3pb(LRT$3vn@+v+=S=#*!=mz3|HFkKE`#W4HC;eBKsKOyO&aDMlrdZKtb$C zuvoiK6aK|Bt1lrW>z4fLZVeM*6i`7REg!a}L0M*RpX0;QLl3CRN7Y zRx3R(wJ_# zixyFDLc{-;$+34BJ}O*`7p2bRr3NqdY9F~~J^EhAUiVW&vhvMY@UFpU82HFRUbjB@ z#GfB%l*H;=oc8IAUdG?uGDd!&yP~NA*H6-MX^3Q2HPx8-UPKdcoUjb*OPg_f<^Zdu z!FWEw*UcTx8A?w|RuK)?nlmmmB2wf#5j4bj1*=8Q4fUZKDf^PSCd7JEFhc8d)l1?$ZxcA!;oN!bB~6eWBlu^ZfD0YbJ7)dz9f?~R>Y zd*31Q0_e{s75{!2Ya}4BJ$yJ>k6E%wTQU&EL=l$&O~;mA;_EJ&b=%NeL&a}7*`lN^ zBBBDZf!*HTzwZC?6#^$!8v4ot$V)}QT|%m8Urxo+uXgth_?GU@CBqtN@HiVZgYBwu{m3`EfY8BH0^82d< zu*%WtisNIL#|6mDy*RDrNc=wGkE%Bi*GfLDDXDeaawx~3ZZpXY!%-)J!BWMs z?sX|pI@Le8lVQPT!l^7AHl*f3uxq#cV9?r@qvUt;`R5#UUyW%v5`5Olx<>#Ps#4?l zt)=hci}k_wj852emE({^WA-*R?jqlGtv6fZ1!;M$glzV+l2{f_Rwt2e=bp+SQ88e7 z2GC_KCYWw0_<@!h0sl1m9z^IVCaM|1;uEx`?s+CGe1M$#uFBGmxSf?O57Z3?gcchp zp-#tnLE!9e-I`YVw>5i73%_uy*PQEMY`=p=ny3Vt_1Z)hiBdh#EMYp4ASquF%Kb8Q z?JzzbC!E~gQX%>IW>=ZI0o|=CY{rG3;1TrB0i|#$3gxBd+hGMrU~tC@)k#2ZP1Xx0 zf$#a2mNh3NDtZ=zX*?m96Mw7;`mXy*jR1zwNf;8XJUP4IxY)4^_9l^JC}P;?-cD$g zcCb``b!QE*BcOeyAc~U5&st3FA!kL$4Sa;?tioJrPs#%bCD&te>qaoF2C}3vrn{Gf!wMw&1!Q$XCjUg zXJzNc2ppXA5MMec#v%{DG^>a|p7sE5AIS~F8_oNABqp_|IH26jV=4+IX=7u4B{%wD zidA))^ajsanmiP0o78xT)b>f5D@blHLfd|sMVr25x!InHv=XD0F_QSqy&D_*@EZMY zO-)$)d{fpb5JFF)LV=*K$MNId#**dw6O=+$IA^%Wzf3r9?gh#w2dUxt9OBznfz>Hf z(6w{%SXU9u{QiH=ai(kLGFV~Q*KQI&WTzx7N4d8vtw86W-9D(HgRW1H*V92fgk*qc zQl{BO`sRy8_&|jI zNdmJn;#>@ozf}3ns?m5e+%1z{AVyFyTd2SB9vxCN15`z3hks`SVP-(v#b$CFoX?M< zxs|v6Ceg^1#=T8EPOP8GWMQV49PY=`Lv6Rx01l!mLUbNeNX=5}M_85WD?LhX3>BEn zO)lQuzDZ1ZS!W^(O95RzUg z(PvCIrMqmzh$u4L2pZnSI5={)8uoHU)%=P-@b`<=w&JP-6^Raug<#_q4NUm2dnI4XqK=?;w% z>NM|o4ZQYyYG1H2-=iln|(wg)ff%0*1zxI^g^%LSD951rBD2@9g!F{a5 zj3>D64Gt!$d!R1hiqo=Y^_a~BG4rz58(9#rVsjRTA^vea8(@@^k6 z-a|Ihjw2j|YDyAdJ>VK=MGoMyIQgm(+fn&v%8F^uU|k(NScaF2$5~p7x)No!H*{z9 z#3*n+bER9_pBy`uB(1Ik%`uvXBDgHE--tjV67goJer(CR4P{#CF;f;~$48ZkqF?QH z4dOUlHH?<^n$HyChky50oI2wuyRTb%EcqjAiYf*@`)x++d!ooVTl_LeGvAcReesef zT6auV(;qiaJ0(ncG}jD&gwcT{-06D`Ho3f(il!L_@+vR zYg~1quIO=lP7|80lc(ljvy1>705!c5J&*;6ka4=f4f2GK8!~*sqOeVE8|45rEM|{A8p8Wllt+aHqz1f_{#uDWHWCeE<1k!vv7-@Gr%xNC2 zZCXj;YXkmU`qi2bwCoar3(AJzLX@6Qs=`Y}`bJ?}gxMO$OLg|?rp~CNzLLndK`3@K z3L>z+p;vc{{;cE+6vwwqg6O7qbqQOwUd>By1HaV2N;%_-mp^zt)};!jGBKoIu3(Z) zas#n!gGaE(46>Cr4LQiL(bBZ*adAd9H*|JS7`?89A-yFq>u@$)cotA+no}yM7+Ax{ zMUqJXMA)*i5f#_B0AdUuzjhV36LNL$9GbGIp<31iTMOT$rX+P$T=_d`s)teo%C z*~y_`5oC6>Nb!YXP*9bVFk&PX^}?UdXzM z2u6_;2*E=6))S1|DFFBs6et!74g*1ANKh~u4TS>&K(J6Q6$^!efl&xdB8L0k-0!Y9 z_0O97|4(giTh{dBomI=-#ArPJjJy6V{U`MyXuWi;J3a+@_Vm=#ZJ*D2`TyU7EXvbn zq-(y2IJ901 z%ewlK7$pKuu7~mAcG;Pm+mB&6AelVs=Lw98-cgkh^Ir~g05NnRAwyEd zMVZi25CI5KYqf{n>*ClZ6bXew!l58oC>Roj!oh&ZkTMnwg#w`Vqr1LW6-60q(=QLEdzh3CXg3|`CmyhZEC2)+MG9mz5m z_$9u!h+oupQsJ>ax{3i-&8eu-ErCA}Or?Uih#qgi1OYr;m~2o6yMj=H2m%#?f?%NF zNH`J(gJF=UP)-&Sh=ySj7({>;b@Qt6&mSAVx7B(6zGT+@yRBVGBx^G4YA=g?pLu`p z^`Gfm-|N$F=pPIIAKL#uy;Ww@(86T?Q^v4rtp7pg&L(j`#`H7NPq%h{uf~11@|yfS zRK3p*PG1)x8*8qvI-SZ8QuQ%!=j~1Oo7o4!XZ3o54WhzgmxV(LkSc&i6c#P(@Bg?M3km|kfUsbU7z+jl#(624w;Vzfm3x|JF_?W>izuL_-m72!e5R2?w3kukLtOHvYz?c&zG*={;Dq-G5;s0 zmp&E=b6Sh(|GxN_^LwVko9>5_Sr@SJfqAx({fyq1tGwlk;5A$&KK_&ipS)xI1_cIS z*Uz9%IjoEu^s2LDIZu+l?A&%xhA1eL(){;EOUq4?yJ<4e|8(e$4s#eA94#c^y?W*c z<|GP)!+|hhEEo$V0>MELgy0st-dA3((l>P~El~+AqL6mc#pm$t$5~^r;;nN&<6GhL zpZU+p>Dg=F!32o?^GWB=?^4_SYPN= z3902$e zn64HK27-ZMK$tWs3x$N?V8~D^6cGqQVG$Taj`z;v*AAZlety5FwM}PUI7D$#d0-u@ z!(vsZOz#U1$6M9b1OA~_{f#ue_OIdd_#O}<#Jb!6KyJ=F)9194*!^!D@yNR0Us0Sq zbeAd(DFyPOd;EWh)~t1=KA*vs7suM&Fz26GW)oESHLU)&F*B<#m2YvT5uKUgy~;@v zx}_w&R6k@0#+o04&?pN<2>k(AeEygKmu%UHAPK=RY1j~j2f2IyTdpO7fncDRFd7pD z0>OaDP%Ii0h5~_buvBgp34}yp5tu|KAq!r2`JMXxeZ4+@FP|Uj`TOtJ*S}Lbt}mTc zaO-43B1hDz7 zGC-=l68!ghW8wLV>pf5m%@H2o24VKab&zW@%%gV#hK?T0WS&?XiN1%iQK&}1wW6bXd^u)vTk6bl7H zfl&}d<`EDD@y~4My8It+->f4{u=K4j}iWbu1GIY|2lS6_TF2d zKdFoK^R)Yr#fn6~t}Q*6HspI>$b6sz&Y+lFufVm0qJMwI+7j%Uz&wA?+E8LQ5>o@% zArFjqF$M3N)_J*C4!EUj(={p26pC|NK)Vv&=G|Nx%bKc{sDynV8B>V78DJK0${+{FeVBZP;1ibCtE7(HC%IA<<%{6 zLX$()Dfo*`$Nx>){y&`jmK(mF&!;Y>aV0gyH#0KAdVXD3eZQJD`MST{gT?7ijo3zn zmBfekHWKkpMGP7_lF#bhT<$>NJFmnD-%MI~I}gKwaQ_`j$}e{l zuC!j;^AG=gHxM-!`ME!vd+gj|V3XY1|Jgrk2gyMm>3f^@RapIAAmw8wLeIfU;1; z5jllCU1wiz2}c<*6D5&y^@?7D^P{+q_g^i)iu--1#ku3PoE>{Q9TclN{NMgp`t4iQ zROkmOXq`{*=FK0zjKQop+O`nc_7nV!bD?oAFE-U$=5uGN@`QmA(aVUos=|qKjv*`~+2XiLKP?Ke1vlQdGp5D%u$Z?j(QsCd7+u#SKV&e#^?0K( z0f2dd2v6&n8LIwC41yiPcXcZ>((5piST_T|g38PKEIFC}7I-q0Jh-*yi`y$%3(~E3 z9V-&FVv_9toOo-Pk_mw5omchyYVUw$353~8Hw<(~6n&W?Rg)0svFn~bXwo*gJ8qt@ z@^mKOF4y_NgCi(iL9YOt>jmyZ(Juc6?$gIrH@XNDl7cho?3(HjOk5=F9j5rigyK@L zoI`XQNWz$b^Tqo+eqmgG7~nj#`kYSbb(I~c`+?4f_-J#C97ROsf1^E8T{zD1%BAR4 z8tGs!s7K7*;2=x&W~4rkOGwmq8W5 z$xpMGmX!_iEL{$2Sw}+l6rQd^*JCJBzpV{5JX~+*V^p7+|9DgoE;0L$z9B_ zZls0jyk~PU<|9LKOe{TzkIe6O_idmfJcD9r$+n5+P5&|KxTMcg^duN$_kXl6dDlyB zJ!q(ka#Iid;LH5upWs)7bt^LFcF@V1%^$pA$7VBUFDwycuD}0*{K|Zep8U4NXcF_~ zAcZJt6xGqE^}+77X`&lsb(|7sJXA$d6bmDfyv?L?vRR;L7){9p!$F2UJF4qe8+GQP zkNFFA3!8lNxDBe`KXl+HADQnli-r6b#x-ahEnbpJ)w6UYd92ruxQ|z8jhv8>g|qs} z!FwTZh5BV@eo{;sY!{w z_xpr~Y)+`{--jvKerR{ba z%T~L;_Mk6`6&!CCIHSn?)j>&C4r|l)_bT4ZGCk)WS>|$}lGtlf<8u3kh3je_KP-pj zDDcdKB~g-Xsk4Z3=)7I*aIt1XB%8m&YXwgi(a4 za*uKQbQ8*Zp&FN*QfDK2INA$N@me_RM8MPMZ<3P|fq)j_je{#X7?U#fB0^0!Ydg*S z&5NS_aAPH~j`T1_t)Y$n)Ng`6>K6LYA_3&PP_?DgUfv&^&P9|AvoQfX2%QE`l_Q$mA%>LLS~?kyggdy+X}bC z1RvOC zD+-p0Bfaxv!hS-=?XPMFehhTZna%*O_mb*NsqGLPE_nwzvxklg-uMM+nk?q}U{aQE zw(fY?)X_o+hixhTNTHv>P95YXqzSF2q=|-TTB&PnKuA6b?!4w(j+*@uEzQ8_wYFE>Zvd`k3}af_Vi`o zsYI)&?>qoHNmNUcsIf_r)s89}>&RTmZdHrsN>4@(GM#(uBX`;Vda1(@C7jKgu!dQ)I$Oliz`fswvfnXIf!d$dPW#xuv z@-&81TskP;C zs(Z8uRbCu;#8;m(JwyKTu>Tu{#A1IP3~diUtldG&fH>~{MoW%K^s zvYjJquCD~V^ESf|6U;D8Qu8%}1mK?V)cXYQABqhGvhDvCL!Rdb`vS8RDjBWne1vkih zZAf@LnCZIk;pRNg);f=PCC-MZvsML`P7`Q*2Yu}5FGqoE zqi5U_6usMmBLFrQT3Js#n{;r{tmOW%S*!MzaxdM!D$F|_9(5hZ=G z#|?XVuf=D&X=O}?_btQ95D08G6v!ke8&l>57oooQ5k&TJ^r9^EftCTq6*=DX zJv6^6E4x)4S;`4nqPga);t;+1A$`V!bVp!&F%6^~#3N+wH>+%kk%IGuTHphST+XCP4O~r*a>!pB_^i2^SN&lN zvPT$1ven0rJEU@yeUG$srL7o#B~-p{mAuNS*w<8kXPIDX&kqO;f&cF?cjO>dwW|;s z&Hs95DUsAh7TGlLs5~iPDPMluQ|oRJ=mVBMxfFB&@9s`DPPF3~`BUM*HN?<__vxR| z*7C_6+3&9MN{FPau+V`MsQj=UbRuXd9lv<|?3K9OJmFj?4!)~?v|cJtJB!O+7V&6aW9uoRvN>4AX`qN;o)xmjnS z+|4KZP}(dfePlKcTq;wa-@2p~7!x&YwXSxsR@ESs`|kjnIUgm*U)_;gDf_VJLdLX_ zVH(C~@^=LNp;X0U&C`IU%EhD=*NO@F{*m`I>72Dda*={YFl#+f>j>>fyXrP)MSgHg z`FTzy$6jyW!LUj0LjJeYJE1{Z{7BW)4^m12I5C1}?$eG7)=&fj6Ievvy`8uZJ1Hi` zkvhCt~s9X2hewnlUdU#lbSK=~0Z4swL!J zR5lPZK7Y=wweuB!S9!^A(Xa)L8vDfi35ZISn%7@Acw?TCCTS~u0vj7RtCy$c{(g(N zw6U1HlVV}NcSG`_t4M9G!GY)|Ti&<*#ghWiZ}Y+H)1qQ)T__qV4hK&vEZGHxwV=;w z=^F8lLje=HC0nyD7-jkXiP?LPP0*rj_7weGNfNS;6eVH=A*aTy!^bUZeXJ>D~=fHIXx0w@L;q6P1cM) zontWT$qrIkwNR``-fnpRc!E_5CGEb50gHX2THSb{FfJp*yH(uruG{x449P3er}fse zVN48JoriK?z4Fk_foLprk|2s!F|-q#m%Mtn9YHZi)NFx)f?5ixTt)HmkY%ew7z%n0V{*{Uf}X}hys6`hgdUe_0) zXN`S0cp_nIm}QYJt;5KrGV@s@x(44zH1QG^{m@7GqR(xnN|LyMo;Wv%DSmXTw;QZZ z+nENX!)E66Pt6VoA1lFkYzn5otPOS=&hY{cu%(A05&b@EF4xM3?&A4$nzG_K2)w}& zOB^&+2IBOTKz9%2Wxgo|!C#^855wO|4OJ1P%`+SLoye(lnEt=i6)k1wkYz@3DKm#4 z;+7}@<6tp~9WlNQaa>N(Q^a*UH<=rH%agI<2j$*TkzoC8&03>*dV3F>Lqy^!6cMcK zgAi@jaZGsGEXD?f%Ny5@=0LIpo*(lFt{CjXnr?I2XCt(HAjqAoy-RP_9bx$9=){D6 z)e)wsdMz9x9FQ2A@W4ZP(u}QxX1f{se2p$z#>|onBDUu8EAZTsGnpXk`kx=nk$8mH zW`wF_BX8ys&{vA>Fo{7Rz6_XW*viGG6XDlm(RChpS4_))@nUSv+64lB{9YG~*vf!L z@Y4H3AnMrw3NzCm&otronS4eI)BIv)_?!y9^)#PXf8PhjN@Jt2GfBvCu3q%$=fa=@ z*DP;#Z3XyLQB;K(ddN?X|s8lIcDZ61b7aOB> z2R)Nf0SM}QkmDBIt<=?13&(K`$gH5>Lk{3?o&4#;^K}$vUeb?Z!RDo_LBxNG;+w&s zKC+L1?@vs%($s73kY6}zu9*x`Rvf!W`bv6SnGG=#(B~p50A7C3Cs1*QM1fh(kt-@I ziQYX1(?i+?P*5O@Q9;;;Ih8hEV4v<5vKUnrY#0Y?7no=%fNq~@--U+eV}-tvVy8Xv zpTa14O6g<4L{VVV=cbAP{Xhc0hCb!O3zN2FNe!Ss`tgz=%{nFc*JrSm!%U5rN&8$r$$^sKtOd?YV38jvFuU}?&= z;^U@FQz-kzZ4B>3YzCO!bjG7U zkvH0=f$}D}mD6oP+7@&*UpVlaPaaZ;q2vu^k}3zUxu1zMGd`#Ul(?;AYR)TMnZ_aX zG|U4Tnb|$I9%WJ#I0cJ;S=pvFS#>-ZDZlp>>CnmZ#6%H_pfb(t$Z@(ygS-TG<(CGG zc1Lt0t>o0a>lEDrZwk5}vwAGZ?Sd24U(D~ntLj05Q4X}i-5z2S7)ALzUJ&(57Um`i z#}A@^4@0rf#o}cJUu0Ali!7N=`wylfu46iCR9Hz)>JDYl$YA-1STVXU$ueNT&$al_ zQy2_)G^S(7s~{-9jm>Dma>&<{e3g(@<0a@%h~1t}F3F}-Hg_&xJBA)9&*J#)KIn3ZqFxd<@V)rtmYx`D91a%o9EyXZ|u9s2abUEtc%;!p%(M2jPw2l*s>4~cM8%zo*TVO zZum#MF`l%$?_r@&a3#T3UKax#k3#EO_?PfQlB+7h+s>nXj(~5$G@Sta6c8pA3kd?j zpvYJ#77Yo7L4hz(E))xef`L&GOd>M~ncnky=hvInd;M=;Z}j=jx#OQSl1qkZG&JAq ze3op~{|i4P&g1o3;{WRVX2n|KGkV#%WI;8)vD-ck!IqF0rhoVN=eM5}YcR#K(u45Q zKLR>JapK*dVY&)4>v%g=S@@7cff@Yl1?%u_uP5L&f?E9(Dctuc!0Ev4GZPj3=fKT& zD-^VL%Jut3;(Y-+0h8MEs4WN!+jDFx0;|oaSdv))LKGL%fA=Z)q$>skLSUe%G877i z10iuBWGEL41w!F55JV;sLx*_x-|t*+?bn_9^Ht~9L+8$6FRFhw(;yai1 z5(0l?U)_Rgy8M@2s?iZ5BYxQ+eb9tA`hd%?8O!J=_No%An5xP^aak;VbG9F7!3u30kJrcE))xe0-`XGMCK72&U#nQPrkGB z?R|qhc_B{^`p*&2{}G;}ZaGuAsO;dS@q9Oq|1dAA zV%^_ z;uSa+bRT3pkZk%S<@5h4xAcEEr~T+l`~Ka1GSkQF=z*7p>O4N3zt=ogiT@n;uYV`; znQV0CfjCtAlfzfqt<@zn^sTM2w^v_Y`?t+$dQ*oADjQr5<~rs9h>d{O%_NRR3>piM z`nez6IX55Nkl8?qvQu>5=S~9{e!w2Sb_G3lgD4&V8rWLtJmQ8?!8y#1Re9L8 zN}%pK_4*C#m-1E=fRD_gvXpzq;K7gq07n4?6cB7Q42FWiK(Jsk77PZ1Az;W*E))xe z0-->th$0gRp|7?^d;h0#?|gfIUxxbMpB)Ihx>cGVEd7`Nj#g@;9iOk)^*+wqg@A)N;HkH`hPG7hh+*#cKS+hlcn9o^k)QXFqMugE+^REnO(7{C**pzZYNJ znwMgR?CN?zTpL|EEA-lR{+WdczHCud#zs)?kg18pZiwXTq{`NE@iZY(r9N;9L{c=L zx&pux_%Q=z!3M(77PZ1Awe)?OcxCbLcu_&P%0-81i~UP ziWgqB^UpqiUSFTbH}m}cr(N~WReHqK#+vS5gRgYtLKl$IpbV;{yghA=g*B6npBf_ zJde(4AE3Patl0&5AE&*;E4a3%D@B_pL--d$e+I6&zx{d|5`9lx0A5+bfZ=5Utz2&X zR`HIlOV2_|+n<7|`^@nKOQ166vX&8kG@rG_#smtj?OPPTm>Bu#kii34~1Nyp`9z%f!5Ko4G~7rP_+%er*4bW}crpT39)KSM}K5b$^LB z>PM-*mcxb?$yP0|h6IHvCp+{jS-G)#H~i=$8lJ*`UVar0HhMNYR@HwVuBzsN`TFG4vc>O!B$JtBe{mGt$XYh=>7rISx)vio_70Ix8$)f2tT3cl5 zqZ!_y<94y=R!L>qc5m)!rmJpaM2+2JxvvR%%uyg#&}GIF<}wKE)d#+zKhBXI)xV9+ z`;V;1h~M400B)saPQ)*@^#fJvTy&cid9m+hokO)|AYeA|pxUP`! zv6fJXUu-XJ+mlLmhGE;Q&~Xqk1GDXo?5wNP^}Q=!iu8kj#mkXdfbiG3kA$3&Vo(1{ zKMx(U-QE~BEuQWQjV;9S$R`uch)24ce111(^}DDzxz1?||BH_E%nFml{1-KKpuGWj zMLmmSzFe&`Xg{3S5!_J`z0t)=$LfS#XJ0QmjX&M%fg+>aU!-B8T$7HHnvy4Fc7vT# z0ZyO)0r9^x8r1+up0+dCK@Q3vgYO2#b=iQ;0Zy5XhS1M7MJeTJW)KNn1)g|mZ5ddG zToL#yU9+McU%;|Ns*O?f?C3I=VV}eGEhnBDdwu{gz!w$KXq$iX=xnMD^<(@5!Jka{;W$6^2~#qNe>;w{W;Nj~?u z*;2iRta-P}45K#L<^&Eb_A|d3efm7>-^Oz+e- zU)yrH5Ctf9bY&nl#-(Fv`JfZXR|U(esgqG1ajibfeccc%SGWvK$S!Bi6}8IJYw;fA zdft(#!44gcy6;s}d7;+}Lhf^C334mVWWN{a-BK;l%(-kbqF+RcJ&ElEaC?wi6|9P23q#Oy&e}j`m3pa!<`1-Ein&DkRx0onSg1g^=BIY4XJ(_?3^f;wh?N9b1mrt zNIz6%98QxeW*&0BSKxWZ3#a9Xts!@q>MXYUB^80I zb{L_Ai4yn?41t-H(Qloc53kEN)uJp8P`w`*QdA+u4BW}&cW*5m@qL3NAN~n)KJXH? zO^&4PwdzR?i5kG*|^8bDZb>bT;_g@#B>H`au01i|d zS3K4a;5h8*MiCcfL=iu+5QvJBgk*?OEZ3?4XXB?hxklt$t9{JpF4W`;2gq$8K1Pwp z^?BmdI@Dl~SdMj^pvPgWAmLss*32P*wnyi3 zN4V~IZ$Qvfld}l+Vf(DjxbXHr5C)~8^%$0XpohH?dMzbDviVPiUnPM)NN^HKJusB(>Yq=_vs4>`yzA8Yfsfk_8W0`2% ztU=TJQNz8>8-*-pI`*{vqt^&FU0{2|Di%vsolhl~YFLQv8#F5LgFuGC>N}nGqBw`a zqC?PXuB+kd!i0r%zIZ3$=x=chM4?TNKQ$;JETePbUQD zn0OltJ!z2&Lv*{aW}`))5h>2g9~=D92MTX(%!Y@;OH3|f*rbJAsyz!J?xB|dX)1T; znLc>kq+;Ny+o1rLZ5Ge$4G-eTgqFN0{k=jZ9y#IkdmEC(i3Z;NI$093!KU?U&bNxw z{dfvxpEL;fdL#!?tk?!JW%5oRQ&b&Ua43mt;C%}T&~}gw7DC=ezp>x`rD_-kL=}Jk z(G~lX^9p=BBTR-XAZp??^aMA4|9!A^Kz$x>n{Sz}*QbNj*umectr=kz-+V!bOZ@u@ zWB9&eMR7^+4MO|c$}|A_o?NaE=D<6h{V%m6F6VrX4)28(t(MOh3p?_%bP!n={@mgK zlrt03+C#XdzRnj@s1Z0k+6R6LPaLy~%<^LxN2UaLxM!`)H{*-3wQ#f25_@3y+ z`i7t0xuQ1I%Wp>#TjtwXO`i1HEHexX`yMqwlQxfZd8ApT_!0RF$neSKW})AA_tcNH zy&BP#M44mJ>UWC5@nN*_5HO`~dI!59xiZW2j;b44f~udF3`?mpL}WE=c%}ZSipr5m zae=%^Y)smK%2o;Z7fryCzAm zCsZ5U<*}PhfHd*WnbfQfu5*mBL#zX3wRRQiavP^!qV8@<40I1LLC;%9%biMA$j#>A zj-yE0f(rc_+4o6VIdr5!A-g*=JSKY-;Steuahz-dPj+(2i1j=R!~cEB$dzhcGzcm- zh({l50m6nWz6)O^qCe)UB)}bWuFG)2wyk1qI9c_!FgYn~u=eSn`59))djAHrE=3V6 z^%v_*+3PaebW5acQ&meqOqv5zoD<$j!v%xtI{K0#)oL+eWxq*-+lE4BGwA;qY_MST zMG_H$6d8)>Wu0Q5yoiQVpg)YnVWXI|5v|biCu7CHgAh7i+PMzKB=BtjlYCWEJ3!XD z=>Klb$|euBaliw+8%MK^Eqp(Nl&0!BiivGcJP{UMsGV`wn4Y_d_Nf)at+M z2BwY^*c=21p$`TewD* zY|NN$MQd>}GV`9ioX*CPVangZe=<8qmGaeSav5l{p8MS)eNSawG1gxEN@rRObOo_> zd;`?XK!dh`xHc^%AS0$-*SPF?A}h~FF_IGXpk(idC|#9Y2JBq8;kZ7g2wYhYh}UnL z`htFp1KEM`w~&R*M?yCj-Z6H^U-Pc%@?=^AfJB`puTU-uv3!7C@P$s5^}oQ(J7C2$ zv2eJ?vp$Bp)BYnXL)J(YWmibo8WO-~oziH4t$pDY2ueL%H$l9ZWd2{LqWBJUJ1uAJzp6!t?!-)RoIB%+e}`_Yi%iX$!UG}VzrU# zGqjWRCx?;-mRx=Rgk;7$>PYVNQUY7bFR$(wdt%GCZy(sO4zeVEq_YTVTH}UOY$kOS z$Z^|Y^|0q;X2W6xFTcy?g@S?UG)$58W}<;R#65+ju=sMc4Z-uRU+tV)VeikMbU(VSi-!0Jr=LOjwE|huVz_$`lYM?1sFwr0*7mfL3Ve(cLvKWk`kG za&dpmd8www&s)l>4&!6K29BW{y!iPI9vpXkkJ=J1;nb}g2=Z27@|~`1ovEcD*PF6Z zZf#?6$ntUxXv^RiX&%8 z4j2wt;805&rp;-dCTtLpd(et!<8;oMB3j*wZQ2T){v$jW3H#?C>-4 zG_@u-yCD!_*s-2%gZh^vr{%G=0n{ z!p}iIr$Wv`H zVh%ggYc5+OkmsI|mE<68+Xj%{PR38|`l0qb0f;f^lCy%;oYZ7`U@}LpJ|Bkv?P|Xg zO+#*^>sRVm=Md1Uus@!%D0J`7kkI-$?SQO*FsxeP^YN=)g`(V--;l0y?(T&urJXyM z9)~&tC@=fWwtJEKWTwZ}lM4fQ6-^yhmA5aZ><$s&?89jLw>H+IV6)vtF#Gr>9JM)Q z$s0b7Y=Xt0lEKWMFWU0F!s#ExG-z25#v%6icXJRq!>{sIU-JOg7p}!A)L@j*YRAYQ zMOvu*lSL){0IQg>MK{^qKH(5QkfRcVosGga#)1|E{ZxBqm_zmN3`OR0}vs}AMdbbdSCp+BR+v7 zqSA5n-DSC(6YpkOJ4HOftcw(B6o`=V3kPm@Ec4Owh$ zj}cciwUzGc?=X9To!0*lYfhssOAn0mY1a=L6DJQk7F3&6JH6tA32%^lb_+~N5`bH3 zB!BSz>%;6Ar`0rGE+Aw)q#NE((WWtpjvjIikq9X#}68-AGVGg%E+F(Uk%l z-y@%DAj_HTh#!9i6@1MqIWXfM=9<6JKOJ55(EFCd_*&d7yCD10D>JZVf$>8l3LLvU zRi~dTdsaC)sl^k~3y|VJe3y%-f>LF^nARZ*_s4X|MW+Eg2F)8%6chgFE@E~-*<{vq zD(4bWys(0fZ$a&6;^@}<{j}-*N`9bUHv8fSHRbrVeXuT;dYc6CK6zYi-cjUp3Rdc& z(=mvxjyGEyrlktdg3)a-9X#8V<`eF=`6k8)D>0+5Zk7@6FP+{``YibXuVJ3lzl+|3#qB*oEMC~?B{dH#>!Gnbmv?6)+$(}t@RTc zbAtW(r>tM9k?fk~z4K_#fj6e#2oVL{Ncig;K`!^BpWAojv#zXb9xdp&58oqHCha_5&+RX!c;M zD2?BHLZyZ}tqJyQeO| zfe*dP6uLLFtwoIiV?Bb5yU$~pZFL0f?pviZl8BqzcJbi8m+r93Q1g{7Go=$(UX!|A zrduR}-Y884yxMc>0|e;G__&R>d#6?1jhk#Yv*VkHov7MwU$|6pZ$6dWu$ME#QGRa2 zz~9E5O)OJLPAS&6wfg5E!4BV;M?q1vnwC5R4Tb$;!HY44p=G55Q7k`55H0nNX49Eg zbHd0E=^AOEjuEKJGqzT&vtZ5t!fCOElC<3S5={bs zZwbdP;+N}jfYRB>d(6j;qI_q5RN?p#!3>TA^?)-hJ`@`AkCKW3ts&rRh--pgg{(-T zlAup0{s?Tfn}YTliy_FJfja(H65Td>@l-eKf&7%0 z19z3Lh7fB98(kL`h_?_uq%;m=soCn4zfbG{$jw>khhH>^*JhmRN#If9T7@JcQ=f^- zoDRUE*CE9<5!?4+l&+pGMt+poa&8{WKc7EzQS?h{a*bNzDi!e&WV-X1mzpGk>BKqw z7@%yzG{Fy}>@OJLeH`$2PLi8g+r?RqPc>ww?F098d5p(3or%DCXCJ*>4lm!vD zyXW%C=8{;dvZ8IYZr@ufL=5A^TtoBX9SHOHJ0aGTWh~E8^5okwj-OrFJZ~#_?C5GC z2ku8$BA3TDno*N5Je^sfSJPmp5Vd}ANp?aCahN7c64r7x9JX>t{hq_XbGzU%)DC{v z^Ap3EV9SG_Gv&K1L~9-H9*w9Lx(9b(NU^CN2c^+3gfqB1j6Pm|4*UR7_gCfI@_f1a z(A?MLau*dliLNwQRsR8FCFWz#@=Bg^{5_|t)lDqGg1x+RaYX4veR~vi&q|9FAs)rg zo!UXv&c}L9aBiGZizZ|&3~t+OysPC0%JheZCs*5=VN z{fTMby7>|g{6Z=%&|w=6jHi^bJ_pB~>74LE&}RppJ>Ka6{uCHW6blZ7!9h4+EE*Ms z#DQR-TqqS11cW6pi5bs=z5MYXKd(O@+x@>a=f6GhMcUIfQ-E8Gi`oBTb?<`oh3UP# zhT*sTlUIEa?m7Ox=X6;H!`D!lFH_Y)cjml~jGq|6K(J6w7!3&m!hpC~QW^_|f`M?LTqG3>go0ra z7)1|k-1R;0@o&#feEz4 z7x3+YJ^t^3O<#MPuI3E=MciLo#$Grs6g-f%{rmOS%)Aauw@2>pwHO{VH zMyEVMydY}k3@NEn zvX(!V9diuGDs@s8D-19SR#Z%w?lIgGpNtFhPQ?KjP*cBu-)-O=EEp3C5W%4_piDFi z1p+}3kVHfg8|(OW%}w;A=IcsC%d{?5t2nD2+F!j+o};O+-}LX9tkQAo?0ZMGFX1Wz z_A^!FQWnI_wf5uJ`R0&?P3LHbUp`lM<8+jK&$i!RWWT77WW6P|lfC>bJbiUrb`$zL zUL7MdSiWaJ9+!?7vyzV-vp#e#d@jn7xc%3F^$n3or8Aqhn23nE489W|qp$T@nt!#&$X;7{7 z#2=W@CJY6G0idwpEVK~}PS>oK_v)^1g;lcEDqTsPB&eDlP=CLs?}XkvKNR@9u3z`^ z@Gnn?+pilvDNsA3)b!Nt*7_hZ&Rk)yAVgrNzo>YlZ)vc$N~CYHyMI#oarMcsTScF74RoeWRWO=xf) zH!s*cYJx+%jP3H_FXcSZdSHdW0C19X5#H~P=+$nQh}CHJX1rB_#dr{ns9HENt&CU2 zxCRV>2m&|&{1g}_6blIg!Jx=kNEi(T0>OaTSTGa|g#zJWAc#Vxe5UKv>x}j1iTV1h z*81l~q1Kh_m}H?L_cl(&Me`{agT}qHDB<2o^C*B{8!P|y!L5p)%`dT z(Tpq%7R$R!F}d#<57~O8aJCQA=zT9W$?j~L^f7QMqWhdcMBv2SNIL^9Ira=&!ubV` z@NiRy=1uWSOS&%x0w{9t?vX_iq;4ZQg#S1fB^#{)gM7lmCf|d`hSml-<`d^dGF3NYcDP( za6c3AKg<^XCr7_WJQr*KK0jIWP|<%mK-VSg-`h75qcRCcl2W|3AxD_)vSInH- z_(1OY{z5rOf?cDaJ*I2YX<2=6k}s`2?K)vHt$HG)YxcmMBfzZ@`fm$mA~Wl+9M+;o zs$QTJs5L`U>leX=AdJC|AeCzff}n8PmF^Gh6cUApL4cs>G8PpE!l7WGTr3v~3BrLO zh)g0=2#5l$=P!PI>)XEFchADQ=j+w8NybH4VR?RA{XWL)>+|sI+$X)newqDW=YQ$` zBwBSD=hZU8EWS>zgLXmP3;$fI2GZo_6}7AXC$T;PT^YWjD;^$e^&g8*9%C0{a~Z3? zybcE3)sF_QN~wF*MOE>;@NS~>x4>N~J)&z{roIg`{-Y|QxLE|a6K^r+1h<_7bjT}6 zf_?Y`_mc@=Mid|8-v9gf1{4K{0btNra1;v$13`eX(841Kndj`jV{?jY#n%;5@0ONww@Y#6iP*2j)#I^4>cj1~swR%y zB9=iKTLF7cv9wC9u{~?T>MD5l)*q$8`2xg%uxLyu4F&|kfU?j;5kLj66L{a(b#*99 zsFJD|scHlI;&&hS@g5qq6Eph@==$C_`p5Cv)zq7OB!^Se#nfRO%a{|;XVdGx`xP25 z?=HUIUOKo@*7P9i`B{HhCKmOOHPd(XaHtz?*kH&RY*a2)@tfyFQB|Y`RQsibhmsd; z=#vb$ryyIYgK5V0f^4=QyD__d0nzRN{uiPg3xYGJ$MUBY)90tEzp8Vqqct&D-wz^b zw<{V}H!hw-7iTHDb&)wHnHf=oAOZl6000&TL7T=Rzw^Mm+CTVU8df{MCFb|a4{(JD zRQ^%_;zrR^#s38=3+UcQX~iWiDt+#~GFgQM>yQAgO*zPSZjnhCu5qi4yN760%xHE4 zT5FSr_%O18!lB!VkmE2|Q!rw)-I=pK7IULWJCRFWy&HWH<_#!Z@Pyn*P2%*M_GQm*#g751!p%dI(%Y7zVhmM>SQ3Jxaf3#CE-h+ zs-%QfngNrPib3fjb9`{2sSiIEM+BN!1&c@ynT47Vo~5?Z6yFI^@Q!Hf?(`x~T13d$?tbpy zf*QJ0Xy(|GYlhm)8#>YBHT-4Lsp;VZXr`qvCu7fQ4v|kip0XgKy9>z=$QcRCc=imI z4St-az__b#pfY`Uf2Ghz-OP!-YY=?#!6oC{%H06C2)zN@y(TI%lqivZ&s4GV=3z;h)D5$fA(})V+D5uI6hzTwifBQS0Nuogj0?|I>e`=+uA=}V z8$dgFcS}#c+?uoehM5vitc!VsmT%+gF7f1_hmKT5?_c(rR!e{uM!I)LLA+MTW~h!_ zM`I8wduT^7o@Xwo;i->eAH^XL0u+8g1Tsa4m{hv4%B$fzFqclU%j5iRF&PrsDL|Td zGeA-H=c=tqFj^u7|NRG?T=Bj>hnky!iQK2l?lfjEpVGT~Sx&7dKWD$~H8azPC6LlH+4CZ` zv>CRdd^V8+cTJDX$cb8BW+4F3^X^{-2c6y(IgRW{LMmk&jS$U;1luqD8(allo?}uop79_G+p<~!>dl=I}kHoF@Usn1k z2A`l4@sdSt1{}N_=+VmBFxe0NkZU+O52x?M?ccUIfSOiqdM;oD9d|7!$_}UzbQxn9 z&8^GZRO9d{N)k+C2$|Bto8;E@oo{*qysN#f7ntlw!GG4xE(Sq*Bu^BQyS1o#);vxp zp6pr37za@=+S(bjJSuermME}_?R$2e2ox%0p&;=THXf3lnb2@$ZHzEtnQU6gHH#dW36#7H-=au6FC_1gPBg?MUsXgu z4OZHjZXf_(w1O7YjnL>SUjelShLs%k$M4Qw!$$^hK^TJKne$qrnNIkvv8UnSK2wuf zHD3pt!q_Gf9cV2Fu=%^CvM1Cf`hh!3sCXa`&#tt)aLWo%5Df@G0U>>*c=8?; zFrNDenIKW1@f0gWHQGggmr>9QL5a0l1EG_l!Vs&bvF3(f+0s(jYUo*Lm7ZEMp+qb< z7D%q-PdC2MagAOrrD#bS4)~%A@l|Pk&yJ8#QxmG*{PrI2=!zD7|eToFL zCunU*`!5U9VZJ7xLHVJ$r*a>aFt}0C>G+45D!hggoTsV3+FctUQKiorz#!eaSr zl29#038nQSdaNlu-7)}&&(LnJXM-7UbEks+rC#WuRD}|!dzU#JZ7EIKqp{Ynb|4kO z;G4bi)gUtW4)%z^DL&w|>1cAjZ>+P?QR?u7j_-V-IJjoTJ}g&%04%BEH4K^-h+*Rp z3GaC{Q!x-A?M55ZMMZ+w5$49zlrnkcuBum9#f5JyT=fjT0E$HEFPjkLW^rmf{EY-3 zu-ySREBf^S-~|`dM2&v%NNNxatRNlx=czmFeO#N>Cwq%WHC5drGgNoPGUY;f7ny^g zA?7mVy&?b7s!W)XI-VnWVAt>nw66bU6&C2=zxZVys}tbHVg#reKQNnzduXosQ^UY2 z@<>vn+OH5xTjwMbp*?bQ%MJ6>h^FDLx!c)lBmutNp$?Lib#zwnLb(a>UoE7*2q!Zt z@l+XI)>RN4Vxo#gMnZ;dnSb>Znt()}b-@z?@&ivo0X7QE7gpp<9qAn+?Ot!caa3YI ze(}Yn@@dENcSS%yM*EfxrLX(pL+)cyXTW7Y&c}BjcUmi(6I(e)8M*rfb{=Q&c#+ze zf(2e16{h6%a*nKpmH>GG@Iqy(ec{A-TIk+TQnebxsHV8J#~z9pxhbT6;U`UIi0ajw z|G*nm&i-*5;ae!6$np4&a3jF|Mvy+KA^FatW~u(xXNRenfg-eQ|BT19br7NX|M&(3 z-(s*bA_4d#>>4$91Hb1g#7Bhv8n+*^^R8zb;hM%U7T!oyD&#e=pvzzYzv>~cS&e%g zL$l?JD@~7*)J5j$e}tFI_L&O#c&uA6nON%$Z~8B(kVdQx%h$w2(g`VrmKg6-1FiF@ zAA|;J(JrXFKP<7?TUuCI)2NEz;}_q1`I3s~kQ-nsJ(+Ab=AIkPlNP-4S=M96lpTY8 zr*?sAScBTOmbbaIL(T>Mbd?`?PrRv3tWiNY6&ZNVE6NQ=s*YeSDk9mTW+8tf()oR~ zIeE_ra)_oiX%>W|MHS!KB0i>^1u$#gx@Ro|$sH%jgq_>*hc6`y;6N3giN|CMc6>)l zu{IlVGE#Vau(?lXEh;+psrBK@yLahEMQA8Pa>0oLvy9Wgx%++o zjIri*`>ReW42Gjbv$nv<(KiLW1mXeZMPF@OQQ zE*3n5la00Vi9)BSJg=tYk&l1xQ{?or zv;Y^d-~qR_*q`^WS%9FouRm&ApZkPUdU-LTKhh+2YLxv4E6K(2~8rtb0ABz z%`Azmccuj^#o!OQYkfBXA(8)_2FwNoL%c?`rm9{IKc?!C{trckOL;*NfV#MOchMEw zA}QGShN9zJF<2V)54|gkS3iLho|KW5T*;)W$clb024iSUNuxzi7-p4&|Cr+tQ!Xf-7Fc8xCdZC!RJ^(RWO%Ks9u`F zs3uu2u*Bq*e-YN4eCV`PY~jS+2NuP*7Ogx@wx`i+_a*HGmrjACqwxaY=&nd&65QA` z&0qgu$IcqC*Vvp3v?W#VV@rzCP|s-nf)8!jaiit#0`JZSV)k4Um3+%@#*}vNU_Bv> z!X|IvM>$8PPZe1H0$#w}Q77aTmq|pM0iFp?#iW-td~N3fZXr!ngWvKK*B3GMXR2t( zy2#O(J*yN4|Hx(06iRGWy+eEsP2No>#IbN86gn-%O!fvs<^P;YG{cgPe7)LPOmBa1 zmXM5`geVb1DKouQj16x%F>y?eS`ITy)UcE$OKDO~otCju&0ZxO#&l2Wn=4ahWC=O_ zZhpc9hxK0<_*W;1%%Dd_h5x(_DBU*~i?iKg?9`FJ$3%NPkcU&Z{yJr$)w-C{C4p#@|ntlw0k@MFG}3Q>(w7#U;|M#(C^7dfmW}W9;!qVzmIn zJYq9l|F;N6PY><@#druHgGCeNV^Cyom%!v(El=SGK3?9?v^IULKDuYHMv#Fde(a`B!*i@3F&Z+iSnK88?{)dP?~YoJpIDGU zg4#Ykl1p{!M`+}jf<*OGeCJ0EdW~sOPwP!+Bx^;Q!ivvx zjt^R2_+}9>&%iEhDG&#%-98(T|H$kZpsfS+uU99~V?}oSscyl^v5f60Q9+~>esqrM zr!WNiln62}jTFXGh^;wHbWDZs^5?}}A6G@pV-fw-rObcyek8=UP+!(1-nm@^Lw#~8 z)aIEO2C(U`KL$vR0U`??vM9nFTz%^`WpwKv8SaAQcPuAv(YL zMFppskJ9zPF&~+zt_>uPne~_Hnl@)RN!O8o1F*9wa@Wv_jG)6N9{N^|Fp`iVP=_?T z?DIwi*+UN{J|x|QR5ml3rf62s*?O7v(2XdVM$Oo+X&N67Z$ks-nDdV^vUyiSRHMS@ z$!f~*zQbSw@DpPPFD;oCbUYd%i+9bQ#4yH0%@Sao%KNjf0y3QhG4>7GnDMo?00dVc zY1f47@i&_vqKWJ9jenm<*7ss@5wDBK#6-X^#GQiW@k>0J{DXi!$2wN|K{RU^X;r^W zH|HYe4-I6T@!4xj^Rq{DP7k!SJE1VaHj|McWmXc}NKPllau9aqA3=!Y6gg0)VdrGD zWs4Blj$_Hc{r~Bd{{4b4>_mGJNI(KX!!v;uUUJ{myUw$HjwY#hnbdCY(U-R^!1gvD z!Mez~ie03MN&~Xc-6Y16Za}<<7vf?I2hG{!R=tWDRRo!mlJ^ucV%a8|;rzXBYnZxZ zMT@?7hVm_eK)g2=FLG%?OOX<$_d9; zoBf&8Yoni)Tqw~T+3JLlm$`0DM1Gy6TMNP%?fSU4$rL`3mqsGfLB{w#|JSF6%EYe} zJ2cpBhFbG2Svy6uUkly@$OoagpeD7>lbq;)2~A7~em|NXz0L)9CKcE1B$b~Xn<}!8 z)J^QSA>iSCtTHOdLeACu--TfzfXuGr4eb?E9S0Jo!L@2RqxGs9D8n3_>-y z`|AyTP8i9PB};BK7gF&cWBI>=R}`nG_o%p7K|-S%>Kf&A^14!oVWhE2%b|4>VhgrJ zG5|_szQW3TNsZ!%G}A%)u=B;7>|43F2$6koG)MIn<_(%T;t=m^_xS!r_M;Wh{7GE5 zR}tO0p~pS$X$soFKaPO-pUpEhfyTBJ&zUC(=_{IYt+=MpD>UQ=Iu?LvFBO4my?^oW zQDdAL|uTo{=H9Vt7C)}=4fnb^F!EUoDL-r!2ch^s64T6;rnhKd#Z$-<B5*UPc_U?4UeaV<-|e6$k9Zp(Br9wrQ6<1jBq-@`|=*N z_xLs&k3BuF-E6MXUVv|+!XtVPo?-^HYFW8OrTzw~$rrE=Pu5DVuh{pw(2`SKW*K2G z?bByRL~y#nEGHxoq`XdrRX!RjK?{LuLbWL~k_qHx6%M>-t-nI!Dl^{xDJ@E3Y9TVg z_UGoC9QU0DX1^H_58v3LALIDk1?#=NMIkKT^Ke+EEJdGjB6x;r07|f!pE4DU*xrQ1 zzw{F|6uU|UcW8W@+xxV0DkL?0aLYIaLXf6g;M5u|YypwX*xD*;8F>}*d#ETFZozi$ z59XW&o7amU!=G=jWijuzG&936Mjw5OoOyRF`Y1&c`f`@k{PO|mWST?F?+VP)Repg8JpXKQmsrgJ z_!JN+tGd%wP@N4H zT(!kKPhaykY@_a<(P*kux2j64;)a<<>Gf@!ujE>fe)yFI*dC?M4P`b=Hf3?{ChPQe zfIqKW8F^z9^Z?r|TK*ZJc38d5&dp~Ap;Q>@iFz1Q@Me8!vGzn+&m zI8Q*n+jY=O%?}98e_i}Ur(5(*Pg+f6viHsr>2nBcE zU)!C3j_d9E^PayMzmHyXRh$~BCPjhg$n;qwf3O`s86EC`ua7rki{fx0Jhjx;DzYd+h)8TG9ll{*?|B1Z=fZ@xAPq za2fw-n8lYcd6sjy>e&;5Dgg6948Kq7^b(p2cs}4}@3X+-uH0Z)|Anogp0yBDaGu7%~7L2;cw!7REuF<|4oOgT6t?s>jMS7E`$Kj?CvL z$SmU>#frEPV-?b7cHoLYedZi0V6%jNOS(Cqp@BmA4SanBvn#Cbn0*>D4yy{WXD*tX z9+NhI*R*XJ&&ly&Zseb{Clhdf0ab^cm$2_`|v! zgWO9BDGA0kPaT7q5Y3FX>Upj1bKYFY=N7{tInYjCna-;AAzbur{=%JNKru2hWPQ~UfVlMR+- z2SK@YdnrXG&8h{$*dBehR_?wuzAC#9VsdMqaSolNzV~#8+rEP3?kSQHf&0Z6P}$Kd z5L~XrIL*Xt)4lX;%ia+-(U3tG)_^`h0CCkdP2j>*Y-QJUepOd^=)Z`uiH(Q$i(qt; zXb*p(*JZ@RluKwo$Nsq7@wd>Oi2y=cQ1~)*`k=U5{vC+0#Y=q!{0-E&ruR|J&F=y6 z40;rR;wEgp&Y{B{Ea$BY$$=*`o{wL|=MyVUUp-02wd`!;yqnbKnGnY6Ush+3KIuW+ zd{vV8+ePIEZbyEqs)cb!QRRJTu6ckbgnrWT!wIV}P!YmXM`jTA!g=@Vi{I13ERSpX zWVNXq-P-xpp1VgpZ|ED$ag;wFz?sw9aV0U}3+o6iF2q!XvgnOx&@03hezKRslsnC+ z!*{q52r|i;EG^8ytIxUl0e+gYYd6>kefO_rd*{C9a)TuX!O1Z)J|#q1dqi4~GzJC_ z6Enu2kVqphGFeS{W|jR*fps@C0&l=CB_?%5fyd+6c zP(P&#m|!t)cUC!-bx1jwhn=0#HtYBGuRSKHF>$oCxVOlqPIat zadvS1?f2~|oqt?)y@^EC_i*%uVh6YUrH=BaTp>PcoJpt)#Sxs8Mor}r0iM=bTM|6(9`z6>|}z{8lh4l z-}eCk8O?QX3xERNs7iK^8R6>e_rz zCD`Lx7?$p90Tatr0+(d4iwdau_#RZYuLe|@pD41fMA+VqzlSIa2*5fzE!!cXg4h|S z1e06yS}&IuM6g!b^|M5(L1Q01pL+e1JZK;IKg6|(+Iqs6|e{hZ!{_lhS~~R z#2|S6QqtTXk%VGI%j~yeOR%nWmhsGNe1)P9sX}cNi+TO4d{SuGKiPqfuv%(y4EV+R zaoJ#{7Jh5bjnY;41VU-~=KJa==hRhV5?Q7{Lbdr)7?h{wuP5#i0>y32Lcn1i0?Y`B z`t-4^P!)r?rEqPue$ytD{xU_YvV2hn~x+G)EY1daWqo01> z9Sxp@r_v@+`~!db9L&za#VB@*3vcPwcds74HjC4Itwjn}bb5g#Fn8efn_Wv|YXf%a zYA_1T>ZKq@3?p-PVW=;#*`f~{qm%7(ve1M|%Td63&J$n}@s91`L;Fie=U7JHnR!CY z-~S2;w9n<2hcUOKbB8BnqvX>!E+uc*x?nlChrKBq;}wb%lXWa~psUA;OK?zs`-MUj z{&M%z>(fx1PZl5zUMfOZmV205cz&~M%vkty4%qS*b$vJ_iXp$S_o#P#&*kSXGiq!G zOf402lS}HnC~UZW_)5LRxir6q!+iaui6*IMIj`8?6v6O)HDmCUG2-QtK{Ip%>_I&>-<{_;E>Ju%hq z9l3miI{!78#CD#eiLsvUc-S#|l+yZi0akNxQPfpuI{0EVbO-wj?yysB+*qLU@Hb~A zJ(>Xmc*Smy8!|O_-L;IFiv5Z$nXQY46rK*t1xe2cHmMy|-ncHHKu1I^(KG7fP?o||m1y8)vAEiif6&%F{cNs_4Zl3p|;E9aAstA-<8eFEL>2?RJ;9ZqVoUOEq%Y_MW@G^a2@l*Yzekv zSA?d#OBhD0ZYhnd!r?T-OCq8`!*6q_SVx@ehgRZzHoW_OXbs~>06fS`Nx7+x@c)?? z&fxHP`U^%y2+%>QYmll8(M4U(w3_-wU9QbrT;lsXi_Sqbgk1WWDv?DXqmO+=}zoC77m@ij0HN%M78Y-kkCY2mBeRxvOS+Tb@7FGeLGsYN+Q7D zsP~V|j2V&|*6r9g5U8Ta8XFPtYqa6$mL8Ys(_Q&a`21+GBnq8bdzU7iwWNz(Z7_}_ z&i@bDlT&x%^KALq;5iBCxO@MG{S-Y$b52Jnz4Q=V zrj`-#2UXs#vM>86bHg2eQj}FI+D7R)v1n5G4B8RK#RQkADr#AJT)63m0Sd1VAu1?l zpKx@;?x;hcJw;qbt_3sg2f^+Vj1=o18I!)wn(b)tww{Gij5|~#&#`7>Gz+255#r5k zI8A^hQ$)8{ZC=e{bo8FE_4RPQ=B(AH|$2s&MRNIU|J>e3M&y+ zvviQ-yu&J@=CU}jeGQYY2y>2c0iV{OSR+_;>!6C{=uPr*#pNI^I zhvL{x-HjgPq^wmlf%e2?vHP@25-Tsl6cqcs%sCst;9^)e_-$RQ#Ta^kKfWs{_P@i+ ze&)C|EpLH~+TQ2M$zuBG++Xy=i+TGZvgXBFT_ysMV>!$d5@INEhxQWnNOSjSbx zH61LKEhxcD!RZEyW|GxWV5kAprf2gPSi|Y0Z6uH1h8$Oa8u{cTHU4gOc7wyaMEEce(LD|7X7``GKc5WC59lL=zv7M7Gbhh zA!Io(LL=k$L^Zamp3gsjJ52`&K0BO(>w&!)Dt#4}M7iFVh!z)JQSr5ubo`Z8z67Z?-alug~iLl>ObuKrwk1QDnS2)%zP>mpT zMwXx}!ENHP)8XO*+PnhUjB1&_=t}597dsYtfP;C~v#Qgo)m0^xEte0k3fY`M|7CGu zH61k~ZlE{?y!6kDVd(Hu-OTe(n&zU?dBi-}LxSUp#4gUnNrzn-9B&~rWFHfIa}|Di zC`ta#g(ShS#Hp`Bl8|CGK0+}Gntk8dU=U=8`79HozTaX~RmQAZdfy$&k8&3r`oJrA zifrA9@_pe?8{(kq*LD1u86M0#J|00Nh;tpzHsJhi*amz3Uf{P7sZ2IiKsK+IEIm~M zFag)E@6pn|RB;Jw4{v_0*f^$hk0BdA4Ho3an*oBAB6h)UHp^&8@*Pm$H1A|Vqc>P_ z$)FdW`7t>*_Xaq-bCAa~FS&ah&|%Qv&2>Iw*uWJIAW*7)80qA?6d@H2j(>^BvronE zxA@ZAfacf5tZGU(1w>5n$lrO?ca{)|fMvo4B~xtKK}6LBmR%WsN>t_T#$FboO=bmZ zn$nubcqN}+zu;%1ak8gGUvzZ5C4K0l?f$K({;MU7(2B58-KIZy8-|a%E-!Y#IIU#A zd^BgUib%2t$aw4V6yRC%^)6{6PvgXX)i?QDy8v=j$fSs`?Q z&pY9*@Lp1OjCU%MZNm$l)OHufPS6Llz>)b5eFN((LJlu`$M{EZuYXd2?vG;PPvt~! ztkflqect2U`i6ik#~K}C+B0w|1`?c3VX|>>daXSY>@)4Dt>TYx9hRzKlA!>CFCZJm zOE9A19qwtvP0_0#BkBR(IBKqBz53$$5SC17d!8StO|Zg!`{{}qTqcY*$Q=W+k;v}! z345@u*il_Fe>PGWY@w?n+tfq*v1HDw$Na3UE)rGuiwQqrV> z+*`rbg49j|FQmlfizC@A5Y;I|Z}S39kkkIaq80`=vJ89CzI8k-g6yJ|5E3L6Ym-fd z{1|CGYW?6E_S|Vek=wx(HNQf{&D3BH%ILqJ%Ym3b^qH=&75rs4smrmDQBt?#p}aC$ z?MGjcYV`oC*o0NC{B?`jMIAg$jXs7OPAz~<^dzLK*oV#sz?i=LaIrN3yk-L0B+bC# zUVdvoI{W=Z8R^_wJlv&l#5F%3gKI^NivP*0JySq3IIIcJNRp<4Va@3mtyxsbGXyz!w-HVwc->)gt|%e0&M~ckw>aZsA{DAqgWf& zez=(-fuJKmp6Ic3o$u-vjO)`t0MEJ+c%eT3Kcwe@wfHS-#n&e4Ia}Y9w=X&CvOm0IGr!xG(mcSiVlT4n=5Zjgr{3N>%A3Dm=~1#~@f(6}~{XwFLNJ^S5;Gy82Vkv(Gj2l_`TIRl>kn6p7O5PXV}8 zj3KL3c4coA01mgejF^UayM70eZSavOV)>9LK>1iJ+7ZMEQ9M8pY7Ubo(b>Lld@jS;)b!Cv`H z8yNNd;uVIf@O};+EG07RK1N5o7L3AkaeQ~CaiwGK zsu$6Y2wN2bUP#7mBQ-tbswD40*C=zdT;+bd!h2p(14LHr03TAArSPV$ly{tmqHIpg z11vaH2mR0V{1@m~(z42H@P6cU#6v+*_Ja9-2mFx=;hQ5qUCe$?A%VJ%csS1DU2W0m znurr*I-~&YrR8;Ut(^WE6TnevmPIUTC^y7L2t#$O|Nhp3`{;v+9;s^hZzj>53~B0R9vVEEEd`0>YrkSV|fa z1_MG+xKJ(>3WWrrK#+u{5hA|HefIM;^YLEa)BJb7H+jV_R;IUgCWHJ#%ldD*|MWio zIkWK}evhFf+H2eSL`6b#E{M!9dcUB~B9Hv%f_LfutCa>-{01VG{}C_qV|x#u*_ds> z{r{bS<+Z<;A&<3o)ZqhCW#%rG50X{IZysNbm~z(2JHuG(N=)uyIdHs0_UtwuI!_IW zTwa460e`U#q5;J4aamMAXqjg5(Pqm zP@q&sQ5l3t_RP!g^!{#m_50_3|GwJq1e~tVU_XYeP(&OtY z?ZJ27dMV8N-(eJSgT9x==yOdosXjV#-WizY=ArZSnxtBT#_XZ#%4hS-;)An)WG6o& z0}ruRAB{<7iyZ$TrmPhE5$%vlgh~3pTbLQW4MCr}Co|oqAl(uo#0P#LOWc&j!88!1 zK@fpqpjc2E3k3qffXG-d8Vm)3;Xt@hN)ro&!a)@PU*q)Lzt3;po~8SLAL-+tJM)sV z?zjM_#QLoKP;{KkhGm`9x=KM}~krr4)v*9T~ImialH?*@wX zX3GBl$;(27_=Bc`$g;Bc5jlmgOY7#f=jP_Q*M4(4-IZw4L>4`j|3}~adAy$9HS-5x_ww-T z^Ypq0_4btcGV_AN&71w_%OTk8sd-PIX*`GvS45vw2*F9=KfZi3ThS0Qe4&^fBQ=;J z5gUV5<=;JVE&JN=k$<33!qXUv}gd!k_z%0$)H~!z#TU{0+tgBp?L=J+UUO&I@vqt~t zuRgM7@%QY!ose&87;B>w#eahA@O_pu>2>3;pa1c$zVH2hy(E@d1;AO(mZ~JRr#>D! z)Knr zU3mC!&yKm`qDeJIs&F5abdNuwKmFsY%>({()`!uQ2X^Us&dA}d?(@+EL;BZ?rDj%F zNA=E6NHCxQ5zM_livOnM%H&SSU(tdW{2+V5*KgiV^ZYglt_k_OzF+5T1+dO=)IHuB zv!yEJ@D)>OnC{cxF}{;303nmQsPx{9 z-<|cn`I&cnS4y$^Z>0D+BJBD@d(Hiim@IZ)+oXy_E z=eb{L?xazN1N~b*{lqRO^nO#-Q?=VudK^2C0scX&^-P#O+AIG~@IDRZu2?a?`y1zI z3g^Ggve^)>`*NlJp7@qFFV0isCbTmyA*F^f!gtnXvmYclQ93<9*j*x?DT53Gt91fh z%n*Ppav@s)j3__-egFIKs3r^zgF<0JXfP%e1%iQLAw>ogJxN)1$z5lUGZ!*RMx?#z zSHS+8|Ie4Fu?re1T(AA~zI(JdW6QsHs>hA9Zi6gr91PFxtHo_%}iA4mNMZFG!LjI}(uIJU=B3Qy?g zy)Ad|R{uJB(}QuZB;JhWeNb@#Bjf$WHF<_{2l2)dSSp=P$moxg2RBYU@RC583;j8iGVI!r0jmcAuJYAGs4SrIDV z-&%{$H3rp)S*y|eXZ7As!bB7(Ub||zFC7S(!nopp+~=;jOqR=EJG0U=dZdlgP0}Vt zDpQV$&$$^-E$LoSl8*IeMv!8RC3`WNeO8Rd41fp%H~;_@>p_|ZB0ux2k!Ay1eOn2b zT;ehBZ0o)sAm&gGNJh5AB z+5d7a2Woz%6_#qmW^>>ni<73HlWPc<5<;Q^>d%FuD9$eey!WGJQA%L|4MN21CHuc~ zkRo7FwMt>H&*R8M85IBmHwW4$0%=SoVI2TPDe;fdJ#Ok~VC*zI?Y8jebtMwmBn%zp zVX|=7nvHcgj-a>g7##!jbw4>Do$XNirF^vt_crDb`s}i|k~#M#lm0zbXMA#Alf9GE zd@NCToY%|bw4a5S4~mVr7v=vjum;%T@jmM*oW40>ML*=Yk&W843}_tZ~(tsMcwkv=N_@9&J2hEzdDtd(s> ztP^r`%Y+*ZU#2{(3q${5$9Dv6#fsoX3o^R*)e(UYUzy~z1um$if59axZ;e7z2mX)c ziQTASh@j^cOn~y#Bkz!qaFyL9HDX+ODk>jZD}7r|PD#$vdVceWbu?=!J6F|hwL+mc zsQ5ZmfD#)5bO(k84acz-Y>)r_#SumtEF3q_s;OTro_(q*Y8CiZz z*!3+MKA$JU?MdYYbMpYpGmo$dyFNZKHTi?B{U}*!*x)KA1w;25V;RXcgmjydhBY7n zd94orvL#ctqs0c^ivkP2R=YF=XfOEm7ddAj`PF)6*^!cD`VDF9bZ)j!!ErKmMIhVC;1aIgk>KtvRbRl@bNu?1OQ$a%G~`^c znTF)7dn2M=M0IsxdJ>u0>AlsibtCR!>_^$T_rKB#8d*BW7V~9|i$mJR&~e`0ZMt?w z6cohYE|1l>Fl`(BHU|jIcODSmHh1GHpflCJ#;E2m7b*wpbVt z%zTl|KBf`tVol$gBw4ZjxkQt zFz~lLh853~A|7QkTA`H4_a0SU$PN=wlq+u{?kCGt&0PN`yagGPf=7(mXJ}cb3WB^@aQ%pHyBd7R8HrjADY7fs{}2>59?wU7R3Z~l(wE$fyTI4gf7z&+-|7q zk9tR0in(M3($W`$H)vcB5J_JgOgtX54B&l`<s_l{O)S1A%6q&M<%z|a?vU|V=zg*8JdFlT9@qR21d7Ta}& zY0xtpl7pDdw6hesZ=jCLLGfcw|5! zYAl^_iU#$GR)lWqmP0g{iv{PdUgRa{LmKQu1nmsK(feZo#< z4rZ{|Clu&59&9ZW5a%}jDA3X(w{s3RB>BX}R0~&cCXK*k9>z)7^1MtkBk4#1tcZ{g zwGC;&jl%M4i#(v+F33OhfGzXOF-t@CAVw;O=GChyqV;;r&1o^Kzxv4|&pI zR}9+Bs8^so&`lV{3);FE0}lKgYpMm{ze7PjwU%sQ`)@DyUuQjtK zxyjqdFIN#32(W&LJ~%1Rwj&)4x}mnaq$z?mHhf;yxIYX8}Xxm0fUC zIUP0f8_@fk*M+};V}nhdU3OG2br;B~jqP0a zB{9~7tV;wd^=9>gUEN~zAVqrxA#CEwUI~bRo zFtsgp+*k--L^AOSBdw~!s24C@d)Li{G1R_O^KZ=__}u{4xkaL*jbs72yqYp8qhL)n zju6YbR2`BN`~(@D&wg0WKgUJ4CplX0P{0NBhR7feYl_j+P-bJ-NavrL(Vh82)$K6`N*Qv$v_cbTDfO(yWzBp>x5)db;jvH%;LP$L38A|0kK>|k;E0|)_Md@^=(>Js@MSU z2D8h-ze%S0&NWF8fNLpL zOzWlB)NLcvn*TUuN1q}FqA7wP%hAcm2 zTz@+wPs|e8q-MY_7m{+9+*3&pUh{rtkZM;$ZYxcmg=U@@d9<{!==&^{SLRQHwY`iR zEi{i8csfq{C4|mBvr`%+=~fh1-F{{n5ZXeBFhd3cK=*jHa@nF+8%J#m57^MJ2_8Ts zYpebsJkR-%k&pb&uVWDKelH%nUM&^Ji1GuQ4B1aY{knNC2H8YoBfHvfJycJ-&JyWX zijG-nwJwz!t)my%jVOb4|k2TEKwd?;!b0FI4Xi?|shv;7;;3yOSK z+gedr&8MwlJc#$pH5X6YOOr$dK?9bynu2;$U$%EbZHr+&_u^fhJV!c`q?ijoQgtl5 z@!pldgPiH)yMTJ0OMXGn|@MjjR}-LM_peu#j(+D zW)A_tj9nNenR1HO)CC!p^Dt#=AlqA8c(OtpH(g_$X7s!DUA%`5AjESV2_eLLPAL@e zGhgq-0S7QtB7&m@0I7(DW1AweZEayYG`dX7M}qOn>rW4tGliX(e@_6(63pD7EdH1PZ zQGFQxt1s!@p{+rSu*g~maC$6h7_A)&7;AGHhvbjBJJvu-t^9V>rYs;zS6=%#6@^uP z8EIvtw%y4alI>d%K+SQ9wx#&qF-`JRh{+sq9C%;pN4jVu?VRJqQXopyF#uz&U41=$ z<1j-Nv>|V}X`de)K6argK8~Hl3r}ku<>~jO=*!uZDOqrs&K>H8IfG6eqhF{7Ax)c0 z*nT-=z9H}oLl3!r%5PSm@`Xd#!J+Xx5ow8(9fz+?H#Kzm2D8@q0HK2}MHn8Nk*HLs zKa{K-Dt2msP8X^#co0I*JqFX- zyZc}sCJk-I_Q@cBN0-zA2G7hOA}TnDc?w`GuUa*Jz%sx{cdv}zQ_FtF%Gb1p2eG1> zw#usVYf&~e33+dYG=7yOoGD04yfCkTo%-=#m3_81gPnj~9DA9p+Pn|_CT;N@wX|(m zVn$w(`{)2O-~A?!e@W)Tam%a-4KJ{iK!B{9U9Cc>d_99b zQ{FqNfU+Wb-PK+Y{Kn`EmC*K)O+Sq|+?s?6P0Wevukw~S&v$9leY%1-V83oY!E9J{ z#^s7{kl-19LOq$-0V^Yc(K#rqrI2ge|Y4ht(7#j^IgEag#}nA6aNIlo+)KhSbb zinFkkBm&Lid&?!kLlRk_MpUK~e~SMbJ(0Bb@8)Hqgm&y>lfHrp2l7HS?i@LxirW(n z($k!JLeo$91ycF`#$!i}f3)a6l+dPI^l6X&Lmv+u{Lz=eQk+lq$A>uoqovw-Cp6Jx zFb8kByRG3XRo|P%=a+Rb4ET=i!Ns;DbD518O=rc-4R*r^;%z6Q++?<#|-{9Z4Mx-aci*^nU!-~pzGxp`2Cr!?$; zF382&d^ z=eKY?V;Bn~JIV>zzguHVi=|?zhHztKkc(GIRgds(bTTtwX`%2xHK76#*3n=*l5Gl= znL+b0M#f2pbcx&kJzvXgxNiLaGLWU%)Kf=*m?)KTfIO+H2}oW$KA>ACxQ8Pc5{K%I z<+S6v`<1h-oW|XH7JFqBB>V{|X=1~7|NP%PYB?2KilGibq+Nj}sCEHJ?d1i-`ROpz zJ?N$%=RN5u;xV!iqDvbFDtIjPjZ^dg8jW%}LGoZLcY4W$3(N%rFHfj(!BfP5Edw%+ zMmjjmE{9{`L?%Pwm4$cbE&aH$z0sH!=;(cUVAPp^8pSkl;)`0P66E1H$@73dZ$v2RxWG- zNw4ke4+ZC7blaN=H3n0jPa>ns)A-Z6zJJms_Y{BB6DZ1q8$V9lAHr}uX58e|hOU7y zo_)&qBbAdx05*Lh{WyMwyXIog)$aitvidrdF6x z&`)zkAg(TD75BZrVjQ6kz`mR?a&zo`R|w-PY84|QPsFdjH~>_L`(20W)2fFnhTl&@ z7ZJ(<)?+9mOp&2vUg3&FbB;{)ECf0pFV2?#YZx45LtqXK(cimvI9HXRi(S*wp=m@n znbX#vk@Mh0rcOM)-csjkC*iaEz+l!F&6Rc8m7xe34Y!ZRN|jdX5KQg*N_Ax+N9jpE zCC)z?nJI}$&*tT`@)XS z8u3l&X=xv(renc_J>9X#0G+7%QW$l_@o=lv)V^m{uk}yinSW67>ywK-k8<^S!zhN@ zZR1>aQm7toE$fJ=f&s#}M6iq$(zll6R8x$iWYPT1<oR;rHetPHjSx3)| z8RV*N+zC?)S&F2kh(b2mza8GVo4#O4!R0p~=09`j^3D2WGzxp|QaN|Bhq1PnidoEE zt7Tfgjz6K zta@fuf-ch8NAIJQS^lx+A_u_Kb3k>6ijC1&za@G>ljaP)(PJM?_=X??t z{Gp)=5{wt#qX9;XI&0+b0>H{q!6&di$8@tk(fUq>_BvurB510fAe}DjlT;w+x>zeN z>?rS-o}ne>Df4*$to_tZhyN$dC?}RUXGeZ1R_+*VBYZ(?$jdD>k*SOJtFv&|&&~~w zO5!Y}(G09rZ5Z)}aP{u|tHiKKi0)Doh2&WLHFb|nu9vCXPz2eHz5|PHcEpt32VfcR zxqarTn{WS43}s|&MKMM5EYc_cu4+Rukr_(R(#&V7jG&Gh-JSxv!;0%jQ40QwXVOcV(12ExIR zuv{n?3JF9(Fp8eDc)z#Ne*cZnx9`sS=Z)%AUb9QfR|DgJGcBJB_ix)^^mpvua#!lz z#XSDmDI>4R^Iu#)IUjNT8&_6{HK==cmKvaZwLzgS9^}WTVM)!V5Mi&28u)rb4-?#V z1S8p~FSno*5gqR*yyA6;5QPWh{6Bu~9Rk5Xs8B2@426P$V8CQ7D-wwUp+KleDi;Ze zLSYdYM5Yp(=2yS(n)_?pKTqd#kAG~s&N#^?T};G>G{Ozc^dWljhIZlG zIe(qz!T{g*Ai8IctJvR4ve`YPgr$FHc7e4StzkK2Cjc|S-JmI@Fv?UVbr4cOC(GSH z59SsM1%iQLSZF8~3I;<#K)}#06bgk3K@=E7Ko;kWzqha6xX-uqQ~Lh<-{036b()#x zDHWmq5#{^+G5HQLSD6njej7jBMLQ$^zR0~VuyIXK09VqoL>*O#P4@oIHc9Uq9#Qk$ zvY!4gnUyxaxRyV^ZYNq~6;8L`6}*mdRF}hKq)0^e7IG=x_uyc@FP_+_({&1czdXnj zx7JWqM8;dLh#Tkzm4zfs9mK0ZCkTQtpr8Nu-#@>gSTH6O27>}%z?e`P6BPo(L8wS7 z5j!fYTkiELwZ1%kcU)B6=9f`56E4T{wRbCJrXydYpIvV1LyEW3Y^?16CFxV7X!K?I zvLjwtZ>LB9(O1-)a$W`_`AZm}s1bX8K6UH<@1p;x7{9~4pK9~8fA_|2oXT#|=ik)7 zLCd}es_Eo}a6W?!z zTx*RKpWl`K1m84jdm-MtL(SF%xIjxaaZoa1r3cPIIN>*Dzz{zXzZ?u0= z;~8r&$`jgR)e}>1D5@#Xv=Buk5@&FMsmFT~2l)HCP|B9h^R?vW+X4>_!vZ5aBd58l zPZs>HxDrOugg5Z2CJcZG0yqHn6c8*F6AptRV4zqo8VUu2VqnNjE))xe0-`|>MN0i9 z{=NM^^_=Th`hTCC^WPOENW0^5p<`c{cmE&i68U;Y8VT`VRGk+6H|5ehyVd;;IeNsaS`LiYMycU}@qpFWA?m(hx<4SCocOQ%!796ifp41UX#|BRC_7 z1*y_%LIihLSYgZM62gr<^LYv zudDlU#QguC8oyrNJ-M!>YdEOO&IiYI+U{-NH+%2$59Ym;C!4D1{s#t(zaH#?fQXXr z;5A4Ji_|`xby}9SEIH)JUR)ccjuq zV4gD0%h49u0)O{kZbFmQgd6Y#W26Tdf!s-PI7H30^pFtAi8CJhF{!a%^7 zE*cUA!hv9*h$$j${&&yEzqgK+b2_L>oNylR(7vA+rS15E}NRdEr&e8_>yyZTl5?-XJjv^4hlD}uD zukeez^GrUy8~kQRf2wIoWeZQI)Dov4`OQGivIqZZu2X}~c7)GncIP%4NL6vNL_vl{ zLmh?4GKN?yK||C8-~kv=PyJ{1f8Y=-7#j+N!GN%!Oc)IXjDmo$P%IY;gic{=)$HG$ z+OK!Mw{bt?t{|^vnG5?62YH{mtE9J1%1Cjljl92R-Le zdi!>LJh~(^o=k`R%`D;eTgMzI~;Y z*GpW?c?=~p^g1Vd+ELBRmu2xsEi>6o^;AyKNO1mm7}uDY`)~hETAjKCs1l>nnwl6) z7<+EDwd)lVk8LU)cR9P=qD=9f?Km^u5<&(V;;fXN9Wq*raLVMBGZ0{%Fv?7341fp% zH~;_^UO}2BB0t!baIJQ5@Y;#MJeO+=Wj13 zwDbQz3ye908r+t_ZB8dwoU@GC|l zG}KlwmI4{{ zy7hzJE|5jb$5|D zxeYbINM%%`vo&O!EEi`?aYekolH5Wnr7MfqK9bu?97l-q1=|Rp$H1-LM%H9P>aaCl|N@VUxXw%?n3!JM#`iGE^Z-z9F_Ml(;jw@?$S^tRE!;jq8T}@mfN8d>Dku ze!&N>#SU>5M6?~kp>eg1U(ZY?MOZ15Wp$xpeH`0PnWeX1QRha)teNPjLan{?vopAI z6ln^0M2&Y**W&pi90Mh_NEm{K3nFB;Fx550R{t5+H=|3ni`SrLboI_GV6GkM3)PSd=J7?&`gt z%Y3?;(cnF-qH%o)&cs_J3;mI0$n&WXH_Se|bnB<>1rf{UJV99qr%=p=hC(rNh{!-t zm%DbL4()*>35^LQtk#h4UsCm~E5MVp(mTVJ2$+c5oUVM?Czz;%ngW!Aelb5JUSvBa zyqA~N>rXFCW8_WS;bca447uTKUX#<%kI)ITI|ygRv-YFc^8)oaW2~=|O+gnQfUKJg zW1xc3mLXUcrFQl=_*4dkaAAKq@T0pKLuTw$8lB`6%AA4$g<7j z{#POn5ARn7Wh}QYyU1{8_j9hmukls5L|>@pD}Zw#@14zGLuOZ|(;_@qOBu$F5EtsKgb!gZ z&k4m|n6_PX^B{Vr?LMV?OqW(%-ZZMsc&h++yG?t7;y8#;mn9`RHJ7qZKd6Qn3LP`S2TF^?U6$H{igN)N2jd-eyCvIpNh`9d&7)xZa6p6dO}Ee2BdQ^O8>);QSKd9^p3t)N4Z-n}lz*<> z+XC0cjpSwwclp&PP6KHSsZ8vw3 zhO80$GOvvu5nJ1qknX$!nK{t&VcYXkxpS*YK{65wg<6sKXs|kW1dYLtc>$*X+fkNz zKmB@$h6)FEYRxO|5^vZ5bpEx*h!F>8+~<6xeTTYU{@Y>W2Dm41SpNL> zZdhm?0Mq}ERq5$cjabF}jO!B>lfR}44W1$y)BH!ctk9|7X5Cjdj>&?~JKCsH z8I+-n-`P;Ou{j%8jD@YCN)s~=R1Kth)8RlOL+^(28>0NC?0=t6G-_ZVIMigk2^@_a z*o`!u$fH1`Du*he(dHd4NE13H*E^V9dX_10@4>2v)oHsIxh(+4X$Iq`ww&2!YVg)L%+Ae zpaoSwWtvB8m!hPVNk!ir2?7$c;NPi~?E47AXX>=!bFDvfw}_|r+RKcIQjg$(X_v&f zO17Hv;PIMYR6bCbbt(B+DBvR^QYtvJ*7@MW>?glVkw{mNvK}zcJKz8FQbD5vT2Bgv zbV|5Svc`(G{}Iny+vi%T?87`%ZxjfLGSGHsenIM~B734iyyn#3HJ5SNPTQ@1-Zh!h z)nnxVb-d@J5*1ZrF;T1adZarBEP*h+&QGvQZnP9k4j8dErN5ZU zR2~e>qG}EWh)kIMd3OI!A@fg4(1sA1xiP8dWKrr|?sb?p--AtjH_DofzIQ zPAF@3)uz*GZUJZ5nP(XKbEAt6sDdqJs`~<&D>e=(;suPoZ}Z|VsCW%Vmpar$x8l8s zm7D}8C`>+SO?|j!O%w<_g)U0)68K*w*`|EtrZr~;AA_T?!}RY2>|(LW?99~wbi2Y5 zwjnF$F;~xbbbtq>v!>Npv{U6~7ntkZR={zn?`@Ha2+BiKZdRpat9Lr-j_!4x7jWny zs_M~}`E1?OpJO2&oX1DSY-Pr+eFpqOZkkc&`aU=3GJiH}z0~vWn!m8Wn90*!T)(gW zg6WR|xD00!wAHuUiqx={Q7m>w5S^`gTphuw&Gz+ME7r;PtM4(vm~X?`{*pkWnWQw& zG_gGY`i}kf<{TN7#=4Ag_WBVeXuDYfXWif(uyxprVI(dB-gsuFz1m#Vg~N$O&&e`^3( zf^NADK0GCwhb^A{=BK-pYTD^TWNP&42iPoYXpz$tK_j^rOx=Lc-B>MMPrUS>LO~Bn z2#0+u{)532@xSJ3ep%%#H))MI>X!B94MIh70=rph5nA>29;h#5Ovh476G}=5(w(74 zOMx!xa$9GT7DP0?Nlbc@FvvCo`82_#4}>bLofg3IqO_asZq6*QO=v0IVn_smWl{!^ z7s|KvzwD6n)5No&&JyfUF{BLBZKtbnfe%cKwks-Of(f<+?9z|RoEm)|*D7(&?QMWQ zsc3`DcJ_skUkyYB#V-^gCQwNr&fBuJ;uFhdVc5a>1|iUy1esMAzgw2YhS-ul5jd(a zZcby`G<_iXmW8K2@h_}BZrF%1!ISbdNVPRBKTjWaByO3zMKYn1He*_xOELU<1d z79T%YovX|4+?s)3()GUtlG2X|!1-PUl$o4bXThuBsvIDg9%^@a<p1h|nOOY}Jgtb{Kte>28b8}aaWA7tKjPWwhTYugggmH0$nQgA>D$Whb7XmI zV7vEhz_eMOTN5pbj}-ToIk=O^GIpXr9`|s6Rx}YJQEp+!G=Mn_P6G>G|JBz!A}BX z>M$L2RpwX+;ualK|6no)P0-Wh+A5+BIX>q(j%PtF|C=Jjgr6qao)44=^AGHwVCBkt zKk-hU4KTKanv%(+;CGJ-QPz?&l|hSO2kcklDzt^{G@EvG)Hyj+bRnrbfH>K}kREpo zHa3(ef@*QoR++5N*c2i*pId|-DP*si{@2Oh^7bjuNk`d@3K%0D6Klu=Os($qI@cu9c>fGx;NNeoSGArq7vf6(IFSi_(w2$BnPP^#cPhS}Fkj<|vz)gs$pTh^99;G}(%3!+w_G&or{`0jza-?f~ zAZChgiLb+p_z*p4N9XI}4EvRQl*OkSK8406eJndwhr@kGzHb>V7fFlQKEAcaCwLnI zabzyeXy+TDTz0kis%v>Xc^Cgcse(h;2=+E_wO6!52-n@A3*@2aOTqNznpw+}A`OW7 zr0E+DMZ7m8fvE0Wo+G}3rc+rG24$669G#cB;7nC;TPegC2A?@cl?b-ISd2WY&sR1$ zAG%YJd!A&yxvIRAOy=3N^_9o)GHF)L{I>Mc;9_V6;iF0NG(I>YcjI+ygWW*zi+>)> zC->F$FK_Vu%Kvkv5u?X$4RDmuInYa)uQ(KBSOhj_@Qf0FwCZFznZvddK<-uE=h{A> zFPsm=0hSHKhjBM~_b8trE~wZuJpq2XK!{Zkv|1{#>iG(-ncT-yW;)$F)&JsXlY4^% z;uk#HlyCYbEzm-X9_pJz{+p$VeU-X`jH3TY?54Dwae{>tfYlzB2-Qy#6#rA27mmD= zQC`$k7j_(ifMA426oas%&T2$I8}y)^wV~tSzk+?~Qfvfn{YaL~jzY}+K%@y&K9gD- z;V0usTU}^v&wiZj*p91Oyy-?*FH>G}`)w3CnnW&dL)ACIF~7F~i6M#fTckIRHSbH* zb-6jia>Uta)c#$QJdETgNwxXzb?dJBr~zVi>vB(^a$EGuH8%A^%GE#fO@FXB zggv%wiOtEB`Nm5Q6!NyO@HDw~SK@3VqM`z6wWBzsgB?_>v!Z8@_9nF9?EDy3{Rho= z5ej5gjf{>>b(xp1GhkB~K#J^D=B^-G7PWBrM0seQaRyiL4kaH`YS%BBc}o!=?A{Gy zgTyu9Mu(~A>Q1(Y#_a>owLa2hR8}zJwXGqSc7bG-?-_X#=44p0ZDvr{rKicD=*!P7 z`3MN`np9}RcPh-2$ZAT{EA9*c0{BSQL@#`D--75D8T&vr|Mw4xs!@}9SXa*pn2_q+ z3%J}7EsM-h^d`UwOGj0Qs$4G6U(7MMU4?CgfeSGj_I(gWxG`?_r&+_R~g@oTuUxp;j&Q#RqNc`xwa7I&Wd# zLs_5E%UkbIn9aQHY&+dVfi&s%L>xv|`MOAdN??^OCKO8mUQp#KuCrA=>?dU7t+$Vy zgE8KFa+gJ6;0eMG&gNqUUe*jd#0p=Fjpx=Q#3+4Kl7Y>=*yJ^%UXW=Cn9L*i*-Cla zbh|ZzE+fj2q4|W`<8~rzVCz#j`^GsENBCJr&UzN(=3M?%&&~7T`(308jHZP&pM&y~O!qD{p2_8j;kw(fq87c80QwXVY)TA;heBYWXf_rMg@WN=xKJu22?R`G5;yN$ZQlMW z{r?=_+xPD}@8iYYO1W^>8XpY!zy0go%PsYLP@Y%yTeG|Mpf`LXm^f2kiQFL+(v^1p ze|xinaD!xhVPQw+G3YEFC`}taz2XY4C$&t5IbK$OugVG87K!y z{L}#mP06>!or~-m^396i2|WOs8B8x3W&lXP?$t!5h_o0`uFzsmHGI& z_V&8->(7sD%hp|WmQzFce?ELaZ~39|-DKaz_A)=)^zAh_6PX!-{D0V#06d>Kb9|`$ zoAVAH6Ib#oT@RI4(4+kFL+Y(B?JdxsUDZmbcgwtdN=)CHJACaic7nD$zc>@l(5IZ~ zx=~B{YCsn?uW#7Z3}}&sbPEyU4K{!h{o*24P+1T)KnUacfP!G4lt>p1210^hxM(aY z4TVDCK)6su6bgibVNjSw02e**ud~1O-Tr?2*XjK4IOmP(q-sfxWpoQ);{J&Fy#6;` z_HV-eV?PVpzx1K>G)@1@SrNhEMcVaDMmf&^kKC!13rZ$ccl+xb?l7<@w>i&NE}p2F z0B(uOs^{=He-CigwJwoqI}n()d3M2t7`EBajzT(T+Q0-C96gbw!?}rA(Li^UQ3ie8 z)(EH@r^0|1o$#K`y#f)voj!ie_3tw6zxENexzRP>`ty*Bb|`@XW-Awv=T#ea06>YmEgORK|zif$93&R6+TL0b)SdE*lI5g+XCJ zSjZL%4MIT^08_)yhFq1qx~r)wt5Tv)DJlaF1>W{%-%t5pkLUB{Ki$@BWcR<%_ltV` z?#Wk?)mw6P7g#2LpX+Y?^%u>=X?~*kZ2e9Dw9&S<3!sd>S5NC}G!8!Drtbe&bJ5kL z^2S{k$+wOh?(16Vs%_Z~A5Ui-=fDsSeh10*j2dJAne8@S$$d8kLXda=t{d6=)z#IE z0j0zS&&wm{)pF+WiOCT9~Fr^xVNn|!61R+61`~Uy{ zi9)DYG$slPgn>}dm?#qq1w!FM5X>Tnx2HPS_WJg!{Q2{rpZ4^=eY{Q0YNwjsuPatQ zkNB^o{~PPiX8+=E#{5{D&zpVAPje`eEAKtL!RK>Lb@Mu%7LUgJdT90vnbu;3y&udA z{=VM;j=dluhvhMPw=+Qzui-_9tD9^T!|ImS;ysLAE#Mgw*XrqQZP+$GCn*63O@O|7 zOffkezt{oPUw~i*?Ut`U^FBg2?as0uwW<`3I&3J zAgE9(6A+*R@yEZP56-?N{(kw#?e(txyW*&qT9=krk;{kODd+Tm*2gM*3ZImF@E_9u z3GviFs-D1mpG1Nh&^q_R`^?b7_6~A7yip2>3g2;SR;(-5({sqU&RF|Q>o|i=P0;`-aWbkzB6MsZd1JG*Kcy|xv?`)mc=Ufao8QLkN!8K5vF6{0r5Vvtg) z3MtZH0k(W%0T@nx=l%2VJ|I{yCKL*S!Gq9PkR~DwL_rd(oz}g-E;46TuYWl*=36U@ z)!y_?kBZOzU1<7b`o4R5s`gy3-^~+taBuH#v0bZt!f-25$549_DM*mYN}E&ehj19;(zNy$VQOIW1{vCqQ!My$ERLsZqql=+I2RvjEF^J7w6ERK60Sdcml4TAw-z*sOQECm9>K(LS`AqfOX zovS5E;%;O~HzK9)gqD>m3i%(WfBUoIhrQ6()M=A%Jew>&2fL3#@9*2!6m?dtesJ|$ zvgTfI{qpz5lec=x{ak~wsG&PP`FC|uIN|x%jeL5tniI2D$+aaC_`a-7ElHIg^x|4C zTwz_f6J1k{O405v8nZrJ*r%y5&Zu%Ri|7|7#gCGI` zjsO4@b3vL$B0uCgx#-*bpRxo3k(a6`dHEQy09=+6ysvRD%l_S&%~)2Evn@L)WGW1o zqLRlTHPrFGl84-Ke$73~kyc8CfBHaB9MoW^EsvHqo2xUvSm#GpjBzMu&4B8ImCb(> z&hKd4tn_rVt5Jio>|c<^BlJn~cL-iMyyBkQ(y~(9lj3yTePb5WaXHTngRvaSOLJMjml_s^F7Js?{0^alkt?nS z!&haS8&j#bCbFi=p<6czSnnG#RHaEgfd`+{8WEdtI#JGo zGwoH23n2LgZ3YC&G&qV+Z3gH+WylLC7}83JV8KJihvONx_wSSo@rEFm!GXP|pO9AN zQ=CzZl6{m0`<#d4^y9h$VQV_S(TMP!kWFc%A_L{#tt51ATF)E|eKIa>8K;;lQHACO zEBdkgJ@Xs% z#7qv;x<#>Bdd%pPJnB$pgJzmC{lL_9C`Z7ohQkr5m*WPII3OH=G%ai=Z5ZevS!Dvl3m99sUQ%&Ny( zKs`f+G2aBBGxrf&R&du}Mo_$f3BgN9dbP>RHSncyWQ?1?$!H|LG3r;Fz*meBHQinX z_$v8z-GQGRC3=F z)9&OrUzUd=bYxH9BOz(}IA>EOygaI*P7v;Oi%(}|gF))_wGwyhWtj4%Rfn^b7;JIv zmkNS`MUK=IFVUL+=D@~<>ZdhOTVLWA?BSTOF^?6A=Z5BXAZvQ@Dh<@*YrFK$%qFLj zx682R+Ets_uzo%BQ;>GW*Q%=;5|A7n78EG798XFjG3CY)f!AC$;a6_>c2KTym(`tf zHHJfxJ5bWHse>z?_W#DYxe_-wW>da!PX$P^Vpo~@p=S< zpWvb-SJ|%geCDVIUmla=H68T6@<`H#ZAOqL7;kw3sK#6Kh8LR>dL-P!2BE@k?)i+s zvaaN@I}o<1rT9)K`02%b%C<)Vb|yJx*%20@+&6JMMqF-ezDys0jXrsY{Zo`(<3+^AmO8TZZSXnsZT;%xlz*Q57t`#EZBhPJXtH8I82#sGn%aPD~v6wQbb^`ChDN~QJQxV9myYG4(<3c9yo`y1 zdv`l()#w=62p=!Wgu=X0$e6K6Fc=IO!H<6;WtM;;BNlq}d07RYFyrF2B8N5*IY z?y&U_j(b+Yj?4>8Te<{f+rej`=li<6$Q1Yp&-ZfTEo@z^Q#S95fu|UDo}sZ@1S z1+>DjG+8Gkgs2NyoYG^0rMM$e6cwD=uuY{SkMEYN^AShg{1}M+4*p$0fk?Ccaq;Ad z9MoKnU9IdWn&|xedE@R}y{|Z(o26Z`BX^IMk*Cbql>Fd^i`H9@ zai7@hPFyAn=Phap!BnT;>y_Puy>o+O1)lKUQqQ(?mczZaN6GgK{`K0g%9l!lhfOBh z_y-`c@A;-y9|tpvpz&XdZpF|0oEI6Y7JnXcSa^^1fs1-=`sPS%m<1N6Msk<_ zmC}~2*66RL9QrdkV9mpCKIQ7$x-e2w^UmZC666cnt@(Zy+azsHM=&v=R_+B*!&1t; zP#+By#v7Z3M81f~GuUX3!cCF{G3eupAeC%a#a!SZT}EV;ipMe_(c|1NZB?$ao1YQz z2Qf3l)D)w6rUVrB45q%8ICsdp)E*jwIiGV`+Z~NQ-Qds#<{!(~Rf_LQCTXgu3ydx! z8U`%b(uQ=^dzZ@}|D@qUf$?mr5o)$rgC&v>nVgLk?@HS`J}KgIBB6g7qZRddJhl!p zUL_Fr!sgH3-yC*jiJSKo7vpu^ggVPW5hc5$eLk4R+n1qV1OF+S^xwNXoUP`=DrZQv zr2u2ndF2&aQQ%p49$Vg*ea_yQwDi8(B)?yLEK5{DFr4zTHVjFRt$JJJ0ik6W`qZzC zQpeLtN;gx91eGF7yvU$4A6Gt8>RcDirjRA%h)l#u~iKMn^q(yFVjbzur`i79o%_u%L^8fFaTm&f)C1=Ahy%*uHcN%E(7m5B&a#{5QajBMm_%+TR#aVPz2uOA1g{FDgSjnY$F`35JJEnR> zusyy#B!940e__%YuYkT*%X(5(?EXZ!WRh!p_d3xt!(86Jeq`)Fv3JoGPVFnZlA{zD zFp0%Y2i~MEdt@EPFv@TxU}p4+s!+`C0IU=kU+ugaJB6c;Z^po`9I?T59y*Coi&1{v z$PnHR%?{}34Y!;ELd4Nxtf!5(ocOl(fgAO-SWP|<#47+8Et26lyM1}{-Z|mq0GcEV zBmKrsFBs8{@!y8>baYBVAgX^J<Gym9Q>2v4K|0;;L>Rla+jGWRSLy{L@7k1u1Vn=GkRYH*|SI$ zI=frDB{Y~{hat%>sT!k(^FTvl6pvHP#0iQF<~j zVTKu3{~`n%_m5g`@Rv}ZT0A{FZz>*PPxr&|o^Vid zU1vmW$H)O>Pf@~RIKM;e|A)BH=pu(fOr(B56C8Gkb6|B=o~3ZYbP#3T(j_br^yxQk zX^U^w0Kp=PgIFRzB2JD0C1R~fEt8aAk(`o6{FfM#H297iZW;Tp_H}g~w0{~vZOG4O z{x(zFG`;HZhU(PJUtm2Y{S?l_RzkcXVxR;NOuy!<wvnfm_q9K2I;*zp=w)FTu7NrwS2y zpchBK3dwoicrDYd3BX=h!+j)rB&$8(d~jnM1BD#GTO(U}?kS~8CurIIrf|4DGssk* z5|t5NX-&Z#YU6UP(o+5DpDs4W{29%Z^-O4|iD`ghj4DS~}>t86O3H-Do z(BzugtrF|yn+~NmoIv7hu|Mxdy9r>dg~b>tI}qgCWYWiNHrwJrr*45NJjt$Tre+=F8J`PUvK_q}(5jLjzpCE<(&nSh0`O*cW{Y z1;Ep+khZ33Uf467{yc9;U5}8&bqmWWm9MN%L_CL-#Qw^68c4?cJ^a?Q|3OE&DXVe7 zw?oZ$=$A?Y;~ih3Ss&I#^=ri{!xVRn5W(Z&&d8k`%tJiImQdZB%Tz7L-&hj7pke| zPr04T*yB%pO+DT^=tpwDKiKn{*1K+) zMC&16;hCgPv<*&JQ9Tqu&G3yrgRC@plR!WyiFd9c&`u*Wm6%r6SkRU5)jzD_M=nwC zY9ods{=+6LYpsOUi*%3aj|d?fHNEUMCZew<3pHTiu0|JucNIDeP!^Umj`T{_-y>!O zNLg~${cB&H24F~VR+yT%ZWJrPP!R|l5bCf6kvzS8HVID|qqc!$qtu?U_moIVnDW?z z=F28#&^X{r5V&47Zd|p0U-~b*~5Cx9rDk0Z{6OL12If z>gsy?#mvV2d7i#d`SsR#?@=Uki?RPo;KS$cnrhkQ(5ubxqC~a*jRe^nCoO)|z5CJ9 z@8F`4HDSX6y@gGr!ij?sspW*tHzL%x!s6oWn~;lpqILz*;!h$q+qE(2$;_Q38&kzI z2|$k6F+&4)T4de;U0lm&>NqM>ZC7Q_Jg(B5Wa3-l%RyYGyjZ=E-2nxI5WZOHQNF{L z!fpXfH1mMMK+d6U=4R3GBzUfB_4(7jBJI;dq=lLV{FL;hUDNC1GFC%U``=V?(bFwy zxtY?ol404IZgU~I%c3S)O!L2=_tbUzA_N$Q7H#eepL!TNX?XxyUaHx1KQb01*&_}> z?*B4l$z<}nAD*xi*)2~l^T0H^l+XK_Ew0IUZF)QGybvs`RsCJXK#nc5e2J7R*#?En zvvNv{J^3fI$2yWSFI1AanfXkRz3nc4lJ7){1#%iw>{+iLH1s6_FjCyMFe|o@@0G}gligV~#a)d>m!xcwp+_;B2b z&GzJtN{WD3>+3P&s^de?mXne^sW{fMpsbyZlpo&XC;E9z z%c{*&D5SI@^as#Tp=M6-YGDbF8LO zV*MZo1g<_8wUWspGT+JGB=pI<|>!8;{%ZsrE;M% z&IGY*o!&eu%DUIg_GS&T>NwNgQaYw^8H?h_4nzn<8MpG#d}-Q#D|NOD?rz}Z^Xvs9 zyb4Qkj4oQlg5(fr(yxH2P`3mv{0j0TtpAol@TFx+vYU{(B7vn7P<<@vwLm7S&+*Da zgF~Dcih;nk{dz*P)SJkkK#;{(s~qii!GA#$ZS&pXQ>f&xEgy?^Y;h_B z$@7qkxjrx6&9!(2pfQggs429_miq#i@V@OYfQjTXf#$CK_7ZptMv}YiRPtc4h;*wD z$OS>~tj8SXs=9tptzfrT*gqdfPkCS}yGR8(_w-RjAV8AbyyKv-L+ynPz5G~SaatsC zA1uK|@t<(|(|vWy+`T^pfdnHtDA7jSbjWd(FZ$)JF_{n3Ko_e(0R|KhOf(CIgu|eq zm^38|g#zJVxKK(I2?atSAc`H|Ctt_co%heStMmSy^Tzny!d+daT}}tXzGS_cuh&n{ zXSg4^^fua@DZks_z<4?nN6vo<@?YQU8sRon5qJ9^@5V6@YSVgo{t$g?QsjT8!#09- z{ssL7klC}tfe6Fy&2d`LeS(btFKyue2GJFNzZ6hEk8%sOl(C+Or~5R|dPU`VIh->> zX^@si3Ggn}V1COfi;*F;6463}3+M?7tvJ>&0SHiE{ZIe=;Y=(v35A0}kf2ypCKU$5 z0dSyPC>0w8LP1c8j3PGX>QCbT#!u_?>-zuK$FGkUmsfE(n_gAK3&^v4%`<$+qipso24^{Ju6`;yBv zJ5AuHU*|?Ws)L3d-qe;54%xW+fY=Vr#kW)W(YKX%7@@ z0I~&+bWk9OaRKJV6KVp@=%x_r777JIfpEZROe7120-->_WG*BN1p>iAD2yVY3***b zt$!bT^W(>!AIIXW+nzhoX;iczsn2#NxWpsor2IhK<0D5ELVI3xZLMB7hNv1-|y~{`vKS zfq^ifG$;!S0>OZ=Xe=lT1_H%FFi<2B2?R{d?@Z3Ou4Jp+xm6OZ(q3w!tY4$`Br~RG zX!Uvjjfad*_u*I=*-4MTv*F#(ws&U?p1+3<{N`oN)7|9$9!g2jzrLzGJ=3!Jd^zdR zGKx$)Xk$LTU>vlvr^E8-_1U+&Te+77&iS-=S%lJP6z|PqUU%gi1U1z4{KjGPC{pJZ z@cD-g{!MB+rpR0EKbhBo=vQs19Zu|y05qxni%nadc+~RBM zuWRc@JR=61663f^c1HAqe)DisJ^k#sl{ZIev9J)QR-M(ABDqN=wn&C}?nzirq46aTQ!i(n7hMbZ9~!G%2o;^o95elC%9NQKbiE6=A?rcGzkhrp3>g3r1aJWY z6bvX93I&3JP{3p;78MDDLa@MGC>IM620;}&-V>bjuKDw?kM;jO`18!oNm?3|OW=PS z&7V{Pj3rocUoFIm=o(Zyfr5 zYroY<8I30@=3ZZ#)zPV8(0TBKe74l+vyxpLAqY!2MiWr|IoqF47gkO)_+ky_4){{L zR&G6N>Dr){zdBv9|CZAjnk{ZHrx0u2EBsLsj7%hAC})}6Hjy&jdDH|ULE8Jj|Nn?! zpjaps3I+o~u$WLR8VrR618|^RC>0BdMq&{dM8_Vg{lED7{db>lJWt#Cp8p=byS2?^ z)XhrW=sv%TXuIpLFQnIO@BZ_B3;Mki&eMX|74cg)$u!T2lF=cD=^HQZ)e;kd5E;pS zzu2A0-v{{T8}1Cf|`dS0+E*-6$Zt{DM|z_ zVhKvh%zz^b4S)Mr?sMxNLqTA`STGhH1_Hr=uwX103lRdLV30)%&sy7jUgM3{{<+=N z*aM&#@o`X_kNB>f>kg?OZ+EI zMlmu!IOSk;Pw1j^|6VPHYO2ZYmpNKhl87vm;+*VxuJ8892eupug9Bi|STGh01%m-$ zK$z$j3Iv2FbDO-^F>;B$NrV?#%eYEtbY0&+j~ej^m*e;zC@wcvqlfP<9vn^XI za=+aGV8{S~BY*$^7!X04W+wm59~Jw5{9MQ`nQ#`f#?(uD!brw^twREk|N5#f~_mYT@#xnQxQ8c4{1&;LH&WMpSXX$2mx`gvUT8_4Xu*gV8 z=x!y>a*X>*aEgsXzE0+Wu8d^S?ofL$vu2Z9kF;0!0OKXdB^v5-O9eW!u2@^`S4F@kQ<%Q7mCq9;<6QsN7IkA$%;f50OYBtU8?*jaElax; zGm&b_S3lWHK`a0k>KMA=L@Xe92ssyQq&I2lfaFvRj!=;F;DJXpozh1s(C>TK>&ed> zRmh&4cFQ7(=i>blvB<1tT_ldrrtN;6r8lxds4<~{PG;cV>TbF9qBP*u`2?7om6@>z zSX#2QsPm#%bjyc>n8~(o*3IMVpC5?m@?7TkFUgng{=^&en2#Pd!t($zx;ofG6JZ(T zQrd3@LD8D{txPQ;FS6*##%u9OFt&T2W#ZOmxisJ zrg|>Px^#4ba%wHrNqLXzUw&mf;2=o`+r%w|HYHnC%2ZnrkT-*4KM|Ggo?$V@arKN;!9ltNM-2SQK*s_~qA_1_i0`2+k+oufp zpv5?5+aO#Ab~Ky8CtAjd0C?o9%m%$g8xiZbe=gfKN6<}06IJV}Z?sTYHbgsLtrsz^ z^;A~E%37M9QB=P8vS~0YwqC+0H5}JHj}#r3Moh|~K+G1=J@Yhb1<@{ANOXC&mF5n( z1(u_tM%N~i^-%s*+a;xy^@cj96py+s0(($i>f zTTY^M1ue%?HxHyM!=gOwNy1M-oWx>^AzLG_9#>Ii*+JDzg%9cG54c)1AX5$7O;uA$ z$?A?@8l0U4tGxXo4gh@&HP!!Q|3GR}YOsuQR)lld^VdSG5;#x61B~ECka}FEukd+e z;P5DKDE_~veJ_dj^zLX}JP=0L6U`#f4SZf|?xwgG%~6gQ-@Wc$wEf25=6UIuRKaL__t^SY9J?h zeQP8xLBpf3$Lf-E9fN(o-_egBv6May!D|x`uOmZ_VIPJ9?XY9|#5=kSF z2G-boQFIH;L6$AAN7gx|JbT_l{Dr-G&n2gUsy0RLqX<%}CK4cW9U1=sU5pepMWpcm zKX1XyC*qXJBqgTZ8>h2;o_{iHQJ0q`Qtk?@v((7?JyR2->N&-u!w6?uqrJoBa$Cb!8TTm;#)#|E(o^odlO=mj1y6g%zan=k~% z@H`8HcJ|~wF0#U~cmZ^O0#T?8ce)_ItJS9+0)wR$ob=)14jr zwfqW<)4%L5=La)IuVIgo*G_0Y->8Bbix*jdPTkh<)kL|6u}mZkR1;2Kck+mkLW*5i z8uqK83Pur$g~MWKu|mS}$(~D^4%801d&Jv(Va25S4Ktt48GFmoxwxB7azXBEG4mjc zK~Fo$_zXTjDmXh9m_^OA*a1qBJ|iDtnr-<03@5e4aR5rNTw;7xMrr%_2YDyqpe!C- z&x(`aAR(xbVi9_-tTSp9Hkx(>+I6*ipc@$v?P@fgLe;HOu5l$PQ$~(As`J zWrn}w>V2o7r^vnNa=I-s3`E=~l~q7D{n21&Y@&mcJ}(H(FaJZ;KeRX^;Wuv})HFgv zm%}$!)&hS(k3(9!IE)p;x^VF1S?=0ej7`i)-eBZop|=Kt@UquDVrUp~{gSzZ>y330 zP{XFaac|<16ao~CpE%Q*BrPm{<8JW#SVj%SLi z-wVK&OGkafrh0*=L10|S9b#AkoHx~pX<7oXfXQ>P3~hfvpyh3z9PR0*|((bRI9wH=q_~pTAuOC(@y2* z{;M7?al&{%eQ_DbAM}3Bvy={z#!1tZF0tb3}f=TynROmQ7bWd)2yPeY{#Iul3P))JhXrDMQykGl zW7B8me0+PQELojd3JhOVzFTYQa+;5)k@X~2ULprjtPI90Swg250bKC`RL4Zfy>g$P z0Nx>F`aK?FuF0SAc=M(wIvjp*ye8XP zylNJ_3waKRTHTs+<0L=gS?2QAqA48&wgI@VKO9{2ms;hYS{fP1)>WZF$XMI72omg9 zb(qYG|Now}BD)NwI0wS*R2J?dSE2q>J5gSQrJK(I`<4sbRN{7!!VsDg$e5G3*H>1+ zwGnRE-|Q24cqu1T7-W1XaBgNv+Z-5U8}}}RiX+D8s!gHSa)*-E4EkhK|M)SK zRZ#tEUd3`)`YJua7EN$YPjtj=sm5Wpw&7LelR0k)ptCn;`b=g^!>+Q^THDr4!=%1; z#0qAWQPb0wyzC|_V|Q2#qqdIt8cHN=n$@}7$y&;zs@Uur`_<{zWc4#Ma_>?sNP!w! z;@30kn+ou~rVFsiu1Y(I-UQYh#I=bhxeAT*U1t2_*=#9XM3ViWEWPvDWZofnHsHIr zTmY3+&i!UzsDKQiNp^UT@%J(7RoD>}W-{Filvr^q2rk9X%EVylAmEfZ)Ry*EWdc5w__Q4_r+YTB)gj zN0If{#8J*aFZpBAXFpdVf$M@j_17{{Cp*eEB1(C|UgM3DNU6w?Yy+-HEt3^KDyw#O z;U+k>wiR%kDq5XAqr;*23S~GgpP4V#!_w@9=pWsc>kiFDnlBa($7WtKSuS7IuUH6b zHjK@}S-rd53WLx7nAjv!Ll-AuTDv=yvVYy!y`Y3}?>UY#(#(TbD-B(x-}_NfM}f3* z$G!>xQ}hZn2eNnKX~(k#oO{Gu9iMK-K%Li^M`U4sq0y>n$|=5h_r;AhuIqJ@FTo5Tnnn6&LaVE*4NKhX>yytxAIeR>kPF8;*yA zoMPfvPC=+8iNL@|i{in`)gXT@PSUHa>K_9cml!O1cbbbL9VBc644v*`Q1v^l6h=_A z(}^aFz=+oLF&WMpD}}Lo_p0q|sF}K1P2ARCIP6u|!vvF#%Qb#sS2-HFZ{wM5<9<`9 z!4IEk3X4QqRKqT3vW)OT>z$r17b2L8TubYkdSHLoIkSxtysNFifVKr6?ut255r{AE zwb(z0?(_DVAd-9sN3I+{GI%LZk)$=~;7)43aD&;%b}XpF90CatwZZ0HCL3A6igHs} z_EW899qV|^!(N9}RUfkWTR4ina=X?`9hn8t|L(F=80)Q-ih??r{Pt4nIzsQ-dfm5md{y5skp*zJ?~_J9>BX-|1oit4HhX8VGH|p!@<)=Lwz55;yi5^+UyKK zz;UGaVy%7ZXOEiQ7l@FeP`wzAprgLv)lza(@6>AOEZhL?2f>wvQTu<3rVGw()ZxV= zJCa(nSz;0DxDo~5Y+*`b?nRCo#WRYg_7uI!{A|I5QHMY)fsO(-G^ON^{qB2JF>IuS zqrI2gA=>O{mE3eUcj^2)DGwWxX0Z%IkDnlJ?lVSefMPVg#6ZA6M->kDZ5U~B(M3dV ztTd^9Stsu2_S%u51)=q-S1x63FHm!vEz=?Ac*jG>^ho7-e^nv^)=FYzEP2a=ws?zF za0*U6HN)_J3qML)Tb^|L>QZ!~*m+xOK!_0UMyCqLT}_z@a*foUIR~j(zq<156eV3_~!_v5ESylQocd_3dmOqkbmLR-%b z%~{DuFL)j|lCoy2XJQLG*bGf0fGVm;Zw}WVkpdTHaeSiL62AcSGZiv$ln2px^a#l< z=Z>oE>2<+cVl=29v8b|);TG?swU9R+MYn-MmD=oU;Bs^)SizGS(iZ2Tbo4!5eXfl< z&<9VUdV${?+PDiO@~AMcm$1lR2vw38rkm!q2nI7%UFImeEY>mZ%nqL&v(-y$gm&ba zB}^MdSQxj0>0`h(MPU*{O@g?%6XT`xfvjpyJFGMd$pPO|ktB!S>0|s0siko4#_!6v zL*-T&Xd-u_TytwaSzsOa0wrLWwRVR1^0~GDKOwH8(gu+(=_|3~oE|+4YL5z8Q(YzW zafW;JZIQf*tGQ!mMnGxpS^K*83*Y?5?|L7GEBn}egKI9_d`u>yfud*zUfc&p}?^*JfUl4j?aaJx9R83(f@{&5#R=jlTAU30{ROUHP;|q`0Sb&m_VEy${v{%fEBBEMO?Uw)dRjX zBx?=%9X3J&Tz=8e7=vhl>k*Dn{rp117)GT}Gcuglc7RmPr2ZZ zjXIie!c>9YOtWc?;4)V_At~>;yc$WC0?9o$AFX+Ebr-ySX?1hU-)@VKmGmCCP&bpx zZC!%L+ysBsR5g_Ux=>i?lFciaq!rl=yg?s{g%kHDUBAmpklqLVnu^ z1t0WFr4}C%uFaY;-T(i_U>p_RkEUiJmW#DYiwSt>{>PzGX>zcq7pRA+Tbjp@s+`>y zwGYw^YG}Ix^=ChsinE|2Jhf%iL!lbb{HU=>J8al7(TB;MBgE0^gk2icW`YzHZh?jp zNidl`oso#V6&>)nY_W3@gEEY08DIX{v}ng_v@QPhIby#Y`??>#8i_>N(`gFksY^z> z>|+)4@|i5V=j&m1$XOc7Eu4-&;uU9feha@N#uO$$%L5wW%M_7F$BVHhZL_aEFv3rY z9iTvjuLw(K3sdym^}JDq_`?%9no=mtk@-mi#RZx31SAY++r_3As>~|NFRWZ~bn3TE zY37$it)psUQLwG_8Sd@As7HIh7p!5a%JCIZqd(Zu7Nux%ei5ASFxLDGZfj7@bWno; zC1><^Aw3Pp@!{f--kx(ZzB`Q7)L6>Nb~093`$&0LI=L%Y9&wBNcVY3%?jdLDAu}aJ z)W>HxpcnSzYdHu|`X}eU=<>q)tGzxXjh-nzRVEZK!_E6{nhwn$rwu2c^FG)!8tM>{ zYK7C7mgSoVYtNn_Pf9^1?b>w}IA4dOCncR?l+)dZu)JCFOd$}dW-g_lGdmdeKTZ>z zQHSe_s(ltwib=&?Y%dWzPKi+6*t!v3DN?bR^n{Z- z5kVACBPJfZ&Zy5cz;T^nu&|8p=0T443Q=fuzkomuIa`>T(u#n*ClipKo`Q0KP#T+l zvr(WH>!dXA_TP!d&I&pITJ2Yitam1U2GrZQ&vEcrFLi5` ztQ`{In3~W)KqUt}_(S8~V3ozO!p@in!1BXW4P%ZI{EnXDW)--B4xjwXps!PD^fSWo zjV*UB_&8oR7#IOg?m1MM{NKg3FD{PCA_bKL^2c(JE{4apFi^H1Hb#;&B z0vM?H)3>#pJ)V`oL5i9hNIo%6P{pL3F4f82N;8KOuTztxnzFmSG-)JZ4JGoAt6}KT zVZXm?zT>BoA^Kyz_oW3Y%??eSPdT>pdZ8dxkQO&dG7N$yaL#07DC;0bP!u2{Ir`lj z*0nZ~Q_%myC5?c1X?|el6kcs3+~>u9rNdWc$ammyIf_sAMhpd{?lDq z>0X)ssywYs-2Q_ae1Z4+{Vb|IKP$t>h8R~zYKU0QBh>WE|2^`iQxm-!FsyCq>kK_I z1Z&Q-Z4$)GhA&Ii=F_Tz8b_``Td?U=o&=MlM+sWW7^osZ75z^)yT=Gs8~oE8wmpeprBYVDH4T*;Zc}KDia8Z#w1p^y=V0QP4BPMdBp^T1air&_@;?>Sd+IySf|s7Z zxBEth8nDx)eus*EDkH;*(@jTQE1~vWY1YYGq2~hyd`sP!tDvuzOUPOa`hNAP|Ta5($MuVZfMF77K|30Wh#oDijF? z0%8=koxATGb$Or>~^S_NUq3r?6)vIx0PZ@>^D}loieIe+$~GlUpRB6tFzU0F+8lltt9678abt z^v*7#BDVnuqc^g%iC4#hCo83Fcs%lS|E<|bsWcBd))?w z{d5WC7CQ9hc@w*eu(TATs&!u3W)El<92JEEV8Ey_77PWBfncD7BoQzLUGJ>kaH+W! z=aeL${~lfct{b9Yf9d-cf6ia_Zg?eWm9S@1usy<+ffj`JSrsX5DV4%A>^si|5E{=oZyJ zon4A9sZE{tk&pyaZz}&}SpPoc8fWaQFq!E?N=TjeCg(-XIXuCeQXSf-cb*o!5&dV- za}$E5gYSjjx?LN_O*2a>+fjlC28{898=eA}>#U;&LIeRE0UDS7%o;FRL1Ki+mY2m{ z>7aQ*VYuURObi=*eek}r1EV0CX@A9klwQm^D%V}rH~*slhqi^>Byp{4gV+m8 zo25r-6D$on1j^__bMQ6vYaDBFi*S~z;0-}X|AZ&pF^)QfS7qHxuU+c!>NIvbzU$Db z=wo@fy&A8>7PlJpORrJ#TG}=!HRRA>V|bqUo@E3K_jv(5L`4F<#jZ3Z4~iA0 z04F8Dd@Xe0az>LusZ!nw7RU?E_VG$-qWZm(HFD*85SkHNd z#nhd|pzp$S;7@^`4+aU%W9qV1<@KRu5*rvs5!@I6P*7kH_GsCn#tRfmM1d;$mwZ$P zchP=m9T0Pa4Uvb08Ks%u8rEY?MuyKT`*d3^QwLP_@SRL|N^i`M?swiIdG_n`eFiIk z%5c=UhptpFRcQS@X1ghF(rv?xZPux472Z!0Dzh+qA+0Zer=ud!W(EOYO3 zY)oAXIP{X(y{BsJh(!s5Y%N<@1XN0H^UuUq3@IFR&a}64^oWfw`~RM(*{21J79dcm zB$J93&qsgTRP7b+1Wwg`guc~{?wPqZODj{h`FYzRHfHRzSHb!WZ34}8RjA5>$>|lI z$tGi+#(MkAmfHiK<}k8agP$5k5s1cf^=hfggR8$ZB}FsSX~LP&%tTsE9Og86(JkcL zGDpR{0`FAWN()I$p&VOvY3JW`)O)M$?!Q9Wu1RbBUq*?;Rr9afupCLjd1kj^K}let zqeR6PL2bZT5onj!j0-W{0E`&IC=H+>h%}^x9kLiGNgAZ^^1#F2U`ENOtuW^=UzdM}*Yi$253uJYdd*?>3J%-l zduGW~Xu`jx-Qf2v8#b6;uYuZZGIc&=lA6JFxZ3$XK5i#&ht0zar~8drRnUi z+sF4=P7d~V*AXn;8to0Hsfe6L;HkN`ryQBMovlm330rEGQF)0BKwER$ zWmXV5--;Ey2^SPg6_FlHg8#u5Nyrg6ShUsK`qCuk;UHlPXZ=M{ZKf=SY}cL5tHaK| zsT2JQ=p5L<(p+e0h6v|Jlo*FV}TBa+-3ZIZaO}eLNTAD#;uv=u)kfc z{U2_1feNA}P3$wi(NFn+_M6nElw-0T!ezItoI?cl}WN~CGOgFP6 zK2_x^`F7?5k6ZG7D1DZPV-gNzeJD^ZB2nv7+BzH(2+)Sy)(=I(J#?>0jS!FKLxA~P z9+=fauVo0X?xHRTp%bPM+{aUQJZtHo16+0%euEM4!|D<*TQIm=8WLR9`gbr^!}|MH z%<7GoRQMfwV2KI;U%dE>ZN^c?3!Y&sp5X(0D!r+a%q3~)%k~~{;q~s6@;sE0mGMtl zv8OqgQFW$~n)PLU46pz!%v?ATSFxo@*EuIRl0MeV-Yuj*=mk8Cx&fV<)&Gi_#cv5y z#EIVIR{)%x^59c5fZ)MYw5^-$DQF3mAmOWf^^5&L5q%25=6a$=-+iY0KA`5N3$Ylk zGL&*7{6DYZ9bz$53lV+BAANL!4l~$T4l~N!?*KM-ZXl?@=Bps;Bb~-G>N}%4EuuzM zzUywH%0c202SvvnH26JFg9sLha%GWB zYivG7PU!?Mq2QiwMr9Bz$g3cV!d5*03#Rc^1N4!NSd@Y(htTzS zBY`t|4Yx;+nP5GNBQLYo-@TOa*3#IPrblSW0FUPD6f=@RQcR1vjFuC>BX#@s#$r$G zp^d?Spn|@G#A)CRkk^sJ#g12o_%K6EB<=x`d47#-()2VPNhe^AII zhQw=b%~T~4W;-+5>#q@yp$>{{TXJu`lncGCv_T2?v5u-{B|FVhG(H^y_2ViqkH8trIIf4!+sP~Xvv&=xm*k^7&mmKCQJfhtH#^nLeV zvwQg3qXIPhVztXSl+px>Urup2H6?Hy4HIQi#-Rs~n~k^h zK5l5pQ*5$8g;Rhn+dq^WQq#R|Ch7345FE;Z(pBM)qR@|pC+UUQoTkPXh8`(US+`am z7%xrf2jq1C$5BMaPU6o=uHK9%?aD!m6$x)H5d##4G5BG3dE*I~73cF{j56WaNMmdg zxmej}8}(vs?pN#Noi6Xb=h--+QthL)WcRbSUY zJ3IQ2Q^hUZvV)}-qfrRf(XC{wVnwE%xtyjyFjdCIcb`|zO4`T$9}{%L3Ua(oBy#{b z&OuW)&_k`puksTl6Es~)4A+O@hYN!q_5G7Wm|KrCA&s|Lv0;%!k~>O}mO2S=jb2_?K?c(1v{1BjYFOs`UYbu_2kfF(jUAO$b__KyJS~TCr za@gwW*-B(u39w1sukJp~3QWR!pc}8eY=M9D+!HgVzD2myT z`6x)Hj|WAF77UmPaR_qo$3wf*!8O~k)X;P$n?4bAb|HndaEZ0mr+ou;E_6uCNT+qw z+OGX%-0MaLBqed@AxB%vjnJN53iz0KGhBl&OC~H3_ggYmo=^$3VdCG1G*sd5PJ2XW zSSUGyicMcUggE1pCB(_mZu%NX4L;)_t(3rl(2opR?}YAaJKQJ9;1K6Gu?w@;9hl9m z>H}ZXatY5H%YF5m4s5D-ra9H(@(_q0=AyTXR}xQ+p2FT9ko`Wf0uXw@m&U0dfA~#+ zTc8bFTaxiv`Q;C2c8N19!;@H-(~u#0-Ax0Q&GUvvUZd1dlC}*P%28ZDjY3>g*SK>3 zn}EYxjX8vOPV0=5yJc}Ho!iMTds?p-{FO+v~O-}E5pWkEKH>s)yk8!a=qgdQwV&fm94@&lmsOC@`&WTr;y4S&aop3(6zIm zeBKs*i#{Pzq^aDql4k(f8<_9IQ)LkF<-Ag2Fe_mK9YJ{7$s zB6)ZXuXz(5yJ-^8hxsO41DTYe=-hTMw@K$tL#-!D<#)V0NzzD-ITnS%5lw{|h7VpN z!+0ClgBu{f9hbo>4x&=8^khUW0luv1I{n~M6qMUAsY8r^JN%>`WNH;`5QN3CMQtTr z&O<?JUN{GVZ()WTQAKBX1xWC_J8C^)OxS3 zW~xE`4nRkySs(6?hZ!qgO4Dm_pqHUdZLV62@_pmPxDI#pJJv7g9!zhg_T?-PkITj#MBk*!gNh ziFhe^7FB*72e~mUuggz{`jt0!+KM#*b2O3z1{572nXR7<7f+6LR-IsPXSxi2Gob_{ zoQ~?Laj*yE38DH;bs)NZ3bdzVQEEl>{>pKTA^D)_03pEpINjsH{*)!1C+)vv|E4LbVjT!2Q z=|R*eZ$?|IXHjdYavc!zHts7PaLL+F5-QX-uj-0NRP4?`*}jBma@yg59o^Pc`OzzM z0{(LXQXK@{B~>4)oKl-{!pbjRv(_a9t7b)@t^{+n(o8$ag0Yzp)Hq&g!@L@iVsdV; z1U!5f50-)bet@Fw+ZgH6MS$pq$pZUjm^@k|Jk#gXk1~HBhE*nnO*z1=D)~Zf{C<1& zVLG0ZwI5E#snq$K%NBF-GhU0gn=HImGLbQhn4cRUZk(^i_CwYoaXbP@lP(Gjpbsyf zGj#-uuQoy#k+aTMGaWGGY6>>S+-1)Tx$j*w9Wonr2L*O`3R?P_9q*=Y!o~F(mL{n( zX{8m?qW>*+g6c#r-q+MT$ZYh&!o=|R<8>xcuwqd69UH`nn%WiU6_T=xs}1;m1=yvZ zB^&2pe_F38lErdAClcSJYv0KnT=yMZL+=v`ZwYzJk&Av`QUzKkK|b~%Y|x3x7uco+oE(MPCy#%N_jQ?mv>OJjPL1E<9xlBsd3f@ zp1Q^rH<0EMCm5CpUO4Q`aL=tZB|b+vK+~m_fq^BR>h`~U$*Kx)aEZ4-c3<47m)J#>ui4lTo5QA6PAm&EDOlsCfg7Yfb2sNJ!0FgtVv z;6MgL!c|48iBT5Htzuz@6oFTttZF>QOy6!^=45_Wygn20_Eo@!gmINhz&Q6R9Z#W%_0SpyR#Xel!{Zea>!L`PW< zc@`C>1KIq;x2ZcvXpMLgj1*Cnl65C>cIrFl4-y}e>mkbnvdk^sFu&;m!hyl1H5tW2 zIm*4pZHD_#OpNhS;fxtZ-W>_XfoS5slFj!L{@j?RPAtomXg};C&f{>ivDG>S%EwRA zkd8IP_D9k%idoG&SW)BB%?&sKmt~fpYwpVIoV_+y;kiWkm$T?) z36e&l3zRRMdCPmlNW^_jRMg+7tmOP)vIc**del)jXP(=3BHIgYp)u$vOqPJxh3W}Q z%~vA9!qChwF%&38zl=}Eu#IB_P=dXQ#?yK-Es}ygF_tK z2$$N#wgIs;u?Pywb!8V6OY=WFmI^Se9HnRM5EGz1_u7@JuVHHc=RqO!Q%bdpP@ zJz2-UPhu_fDyHNxD#skxF=PeD=$+h>0}!SvPmr9;0dV7s@Iuht;luS-PHH2KH3?ov zhv+iBF}LfiADR=p)t~uUP{hJUMi%o6%gO_+vI!*>}T7z(rq@Lcb_hmK{<#n#2 zTWC=&?I*G5)wGaYn~{$s;5y+2(7LrhxZxcIWrimiA1U@Zbw#Q{bW@pYUWVgQ)+~Uv zdk0`h#4Js$SjPYIoJ2Y;<2sn@jux#~Bnn-?BdLDPH>RTE_iUmKK;4x1qeR}JaDGLp zO^P;)+Xl(}j3o%xtn7Bf%P=^Z__;FPxhoZ|3*qcM|0Io zX!6wJcHwE5&ezIr%8WByRLYjNi^CE@FE z*~TsZhG)pI+{%2!!Zeb1!1G$?ZsLM&1yK5JqN03U`~KY!p@VD(@vdSQ9nswm5nvFu zkV!)Jf?sUfFY6z71PVkgqW}kNrl|Nq%jGz5t5Ek6_W~-Ec-k^pdO1<3QasI9(_nA$^MpEN%(wXwz?6EiZH zoZU-y2-R~hYz=V^c9PvjL6*b7MqLLg?P`NGoh`CUY$ebW3MY0`&|8+gAIeV5X#1JuK+-g0 z^5}#SS@912%|F16Gu>n1uT(I7uTD(p3F5d|*qHI*dsdk4nIgBMjB7)+AzI3pL4qC- z37R>YztjiY$pC1r8Ef-spQ9QAQacmDc%zFh=#De#L9*y_;Ql6jy-b+9+i_hxni#G@ zc%gwmm#yc&u1iniRCT%Xm(}lJ7A3e@uk@ns61bUBK;MRBdgC+=Fk9EfFMMwv?x5fZ zlPCajiG<~&${ew$PmU->`JvGQaiI$@o`Zmy??~OwW1mI%o=emjZv;8l7Rzrpg7979Cl9;l1J(m%~v@8WeJ&xRYa1ydv~s}-jf9oBIf zp$&7>9{Uj^hjc5j%ezrIsoa((9J(Ia2ZB_G7xyTSx5Sp(WS21Q)==K-Pm~T#WV7Lb z$?TStj4>NXnjHD63dkN#t@)vi$Bgt=F@sygXawXumhG=SgpzNXDMy;ok_AORCzsi< zP>!DBQgoMsDrB@(8p1KMgCvWk>5R$Q*CartRcH^+x!xK?GInV6J@e(|miz)MHq0$nZNvZG8J7qh0EG@w@YDtfTVlqPze~ zi1n>1!0|PpGsR4ibzRAHjaN-r)TxI=63>0hqVa-@z*I3*Hp@V>D7eg4!9j;r;|R4x zgDG5TX#Y zFdLQwmV%ZOJ@1$mTFnZ=YvK7vZo$8i$^IXi-%CgN{~ixYHy^_rVH&ynO8Z?NH%`~_ zw)|~;>hAro9k4M?qF&KbSB$*?s@G+IX$;>&)63vGU(qUXmQ!lo;dM<{ohWO$BO+`K%PMW9F-KZrZ`-R_qP|7*T;xg(az`Bcbx+zCB z9`R6NF}-sMSD*&Hk_2@*KT-u58I;h~pfad5p&&b%%Ef+ina*fi5mTjI54B?ZH41X< zxhw@opEFLz-pg}w#wqGM@NvtBzt`J?jR)<{Ec4OJd)$)jm!8#o(GjHofA4i6vMTLz zz^@7WLSMKi+Y@?mtjNR%@L;`*WA56oCxP>>GozDt%<}%zPOj0h=)2y9Q=ac^<6a@D z$ItajPJI)xM#gQ^pJRg8Hz1- z^xENap&kG#C0(gf&CTQyFiYx25orOaMQ-Qw=x6n$pM zpF_S^%R z&g=_49W`w&y)Y~4o5|meSO2}b6EE)_3g8^W;SWp@Z2?D`@pj;{x z8wEmvP@qgC6A+=}$G5MEl{0hoXV34AZ)==;`QD_Hijv30d#m_URa+{Sd+gfzFL%TD z`#LD;3J_d|eNMUm@2}0_PvL?!%}?**B^G{iZiXT~d>`tdTRL~$rTL%r1BIbJG5|z` zG$o08>o~8@DK_K$LbI)zdw=YnIvm@@p205+x>fsIKn6PftbJx|AXTs4go-XUl97xE zjO7C32c!WhfeTP~HoyG2;808y3km~5VIW{M78C}9A%LJ{C>IKpf*~-7Od@Bk%Jchp z^K)J&#=o!g@AY2(cW*ncB-b?52jV`S`~JH6bve2m?``a+d#nCrA?RPtC8i^~-dcj; zp8fydtHbuxM^?*F9m#UYqH*{>V{D2$9slK4dw+ct;{InoG={!@$r&RlFYxe&NGBMZ z{r-)Si}*(Q4{->JsDvJvipq(&UF=<{2lr6N0-okjuHJy80Q`x8=&&~JL|a@J8-R|& z$xI-SOjr{Rg26z*Xe=2G1p>i9uuv*A3WS0pFo{4eeQ}r1KE(Iyiuw4f)^W}21mLAy zA4mU#`5x!<&)h5Kvi0~mK6<;iN^ah7_{*JMZ1!xYAJ=+Ll`OCR^H=3pF4x^#mN>=n zeuJMBQdCjrTi@UiEZFzmCh`8h3vfQKXua&rJt3n%c3a_BxL(};-@CIZyu>OIETVIS z{hiy)hrm@*?(W}&McAcq=3!vA&>}bFlW)c?goTp(b|Dj;Lb<7sHu+T*f-;Jz1Z_dz zz90Ype`C;KEI1Pe13`eX5KI&)2u@*J+`jtD%GLK;b(@k(NpeY2o<|H*)z5#=N8gS= zFOOuN;qqdBY^Srgq`n%qrQ+PydE@a$_?F2$B+#as4By-yRxxktF|X=>QQ0Kg-Csp| zNdo%|x32A9%jy5vYvA6AufLr6hM|JRyKlbufBE%3dA)Q4{Ud%E{y1s<7f$<6_Fo4} z@iCsyi&#wu=(wfUgRr=rS&3Z;Ru2+sKsni&YyGl9*Xw9!R|j4Pn^HLz3TqnJ6VAzksslAi$`qAy{^m%H} z9DBO-S9FotucPB8bNhb#=GEQ4iEzG4(v)*ald`%-tn^=;($A54>5yN1l3R$M-1}R> z9}noZ+hA6c<)S{<_>TYSfcDL!^w}M8(a&UGJ(qIUnN`QVq)dF%3$YWp7P9Fx zwokt)^3b6yH@79Pc%bP%4Spz)OYxsoCsS|wxB~`81OXfX02#|cnx-cI`a5Gv!=a8q zm+Cak^{j=)i)@6}a-|HRGwGa-dyBNE z4*$-CyW;+nh#C&<(uM|ZdA<#Gp^8V+UAJC~Px=l*G|Dcj`g(%>qs=6OyJ9HRoM8LJ zl{KcSiXDbH7w+Ws3@$xjVxOMtFaRx_3-7EBu4{sHiFZ}FgB3}_#B8xIOcGh~I)nEe z0k$)wk-W@@G5h0gK+|(c=<87!em6LX^*=K+Qxsky^bF5Cxf9Sj>N^uH`lgurI2fvc z3L)uHAwcC5*HJ3WQLGDtFd9?Z=*ymT(|O*wo{tm?A_x6F5uJZ z+-Lbt<{%D!E19oFw6KY%XxV}D>DTc`%GtItCE`zWD4PmZVV_!A&K`?4VTC)l2f|k6 z;o`I#9aZ|Fgix%sAleAo)9+sg>Jn>&AAPvt#EhbVt;T3+%SHCz2(keBa6y6?T;FhY z42y~P^+7j_mkW}<6-_Ng&zjrOcc^XJz5a}b26f8| z4N(FHfz4L&R5M?X#o|bb>aQc;4Qa@FF`%uzHlyJ`X4h#WW6iFHGEoom$47)tN-b#8 zw5*OZB0?Lzn!O_GH##oNXT^Zm((1kC<^yZF2cKlEeKpj@{t1K4yr<`S8or%$!(Wnt zz}ewE329$C6;j>ZRB-Vx**6KZj1t<}*AEd56yq^14kz~I)v^FfNC~pqFTODsI z`jDLz&%La-ap{u+dfA!95Boc&2exh~?V!QsPcrEGkIVnxpAeJJ4+mUV^P(uA0a1Z8 z|2K|+WZSIOzuHyM{8|3C8XU7`Oh+J3iheWRYvzVB9f$f~n0PzV;of(>lH?V$_gI70 zm&`j=eL8kwS^W9eJS$i?oI)0Zj(kI12Ei5H zog;xg@Xlfyl2Hss0ZK^+a&<4bf+I&M}4x^qwBym(H4 z3D6QJNS&wwtAK6%qXC7*b0mr%$4%Y9X)k*~1=reBWiM_f7wDbFvK=z)rY1-JIqHbJ z>#t@u6~Y=eQ~-G-Mq>;jFU#7BK6rq1+1Sen_k>SFWSnbZDu5#pDq#=(8gMuc`P+1A zmQ4ne4)r9URS5&w7Sipx?QhtA#8%L$R?-B|PLO-9`*sHLnk(Ew?m zCzba=#TI7ph`LKVC7=9^i-tK4WOwjt675VXu||X&Y2aCgX*#dxq#)coYXjEED~Cr| zq5W=!FuBaCluP%abw)38C&!&ywg)GQG^mUvBvIt`hYtODY;&!zY$y$t5YqoX^MWMV2ENe0m|_tu|ZpyMJ(u5M3bB6ECC_bLFw!b`67fvWa;@yV+u^KtlpBWn37+-#8g z&k=9)KzsP~E1TEM=J|d6&xg*_$_ReCVw3|+`iM{1{!whgH_slDG=(l;9g(X0Q?C5` z8pm!!jJYC}H)YPsWe1C+#}E77%|hnBx>cuYn`a3{L&B-nOrf0srcLcNNJ*6coO}0G zeq99z@;=mcmw~~VE{x_XfVz}=@rPAsuF0HwVbbrl#LmyQb?veU@t__WnMyp&Y(Uz zgmFo#SW88BY(WzXWNr(mt(3CxK@besymt&d%byAxeXz=f2{f>%<BwkU?YW8)_bAlUcEKF;_c5gi>d`J`dL-I6 zX0>?fs(F=F{*W5r=Dd_AR7JE$*F6!(JlWr(nu7OywU7;Pin|+40<1eKA>9XtxjuW8 z{(K z?$>0cQGlg{Ux9+|_?7SkOQ^2v17N+y0*C-`-sxKdFVA%)yIXtfjQzZ3B9oz4p)8w5 z1TI9|lZ5;US;iw{yf(c}D=^8oOe3QC`$KOLQAEpR$99(BO_FgB?`CV(D*0L>(e1tE zU|CLPB`jF)H&Iz;p58rre=(qofU@UI&Cak*Qkw^bG_(`7uNkL824#2)& z!dRF{l>$RecA-Vyo>vu_fLY?&On^SOo<%^TOLCTF)Q&lYYeO^HTPF zjG<2OKV0O;Wd`X0d_aT06OnEwyD+5>GoPyzWqcAz5=P<8dKiLfa5-evqn)%@dvGIqzM_{oWZARbi}aEHus)bEfV3w9-9 zs|oxgmmSUd&o_&udOcLyjnmxE^T8?23p!s38noHnvV|wA%~%J}*G3vJtUcpEbY0>T zznuqKO5zz#IZS~z%F^KzFi+TQt;J$0pX~Z=(latqN@4-?6T5*wH^tTipZC#hhg=rb z;RZcD)v711?#c~DzNJ^b2iL_lbSkdh-OGNI9Ydrzd@duH-L}>#+OV^yJv4biOlkr_ zWm#Ah-x(bdSnDk?Fdy8KLcnOfa)JON!qJj2Q2oZ2iZksqV7hsPFB0ylGE`lPXOVkW z31qShhT6=q#g8^-VJ;*qeq6K767jgQp-pet8hHVK_i1m67rXdVLP(!h6?|iG_kN_H zw3LI;!Da*UXyvrw+{7O}{^v&lSn^!8liW|FZu6I?&GTf8N!xhP zU?(HRE>k9+c;~#)e+`7k7Ku_sk1v4YdmS5>Q7;K&S)!k+L@;d63uSRdYeWJLkE2Q( z?2r&VcOR^pNiD_cE|ln9!a0-o9bf_Plfi+`#v>sBi?fGVqlj}ZLj8i<0@130uAb@G zQ^wT-A>*!F65M%&Zw+Uywd*gTuQ9|Bh$Qvq2ag9?-Dezls&auLu9FhOmI2vgL8RDd zegw=!K#gx(F4}p&!TB7ZCmgvD(uoK%cS1oLmD_Y^rIm?8kLl6FeAAa>*FKXU*J*SM zclG&5c(-}b8Eu>x`70+4Gb!Vh+IgXsxYYwD!mO-|Br@{iDs6nk>7fXqar%po&83mN zO{q)-*Jz@w2qj%8{^1;J+2FsZwUo-4cI=y5f6I#X_w*t?!5k$(;{)Ussmt<1;@C1M zp~)UvABVYwWkW0sToQ6s6W5UdhzZ&72nzU zoZBP)45EMO4{;KUg(Bf34#PRm%Np!m)O#7W?Y<90FzlXr=&6rOs?NMa zBmSqIQD*#}gG59p66mrmbri7>hM4i*CE*cmm3KPu<$^qkDU8f1C0jkgj$+Clr!)je zR$kLb>Fq@;MBQdt+j#JaQ%|zoXo;&ubrLF);9Y%=?^>Qb5Kb;ZXSj+b5Eu8)i3D@p z)ez5P5jUPJSPg$dKh^FWo+1zPUIAZ3C0JppZ;9v^5Clktd*zpl+RQ~?ka?W5+!%3U9x$?u2hEJTL#jC~9nkUB&H zcgIIX@#V~yvk4~P2K21%l8f2Rlh;^zf8ok#mg`o98VPyLM8-YB9#5oYa>tXz94ijd zGn0xuJ<9*XFF;6vK}?S=!*f3TJbe|eVBLlx+l%VcwDeTsZEGs~Oaj@G=zAR;Nmb$Y;5{?a#cK%wT%YS<8s?g>YS7HwAmn9t z`0>6S?l(f6Afy)ujGJAYyp>-{bJ4&W33ztY+CUug$vVbbn=8JQp7F)g^Or{PTO|64 z0>Qv;!Wvz+wH4bp*&2W@1Bgw`kK8Lx1<7L_k|h#He~ZHJlUPWVU1w;O6-g@1X5K#N zUl!>*Us&5r2ZN;)C~U>_VRb6L0r}m|qJ$BhRfaXbSvP$CL#Ypo6S~U@m6^vkI}Jnd zj({{ecAT`bv^S;`?4)fkJEh<3ua^TvN*!*5Y@JFH3(pbgE*76WEz&t|RC-jfYRwSx*z8p#m~ESj4vhnjplz zQ8$`XN3qc?!rzm>wXB|$r(7^-Xk&Jnt+5%;?1Nb|i){vE56+HfrjhdNt5FjC?#;a- zfHk>z5cS%Z)EbhQB$KULr}{UXku9!M_d$p|jO}zd_L0B#_|O2*>>|(Y11F4uxjGVp z6%(NGL_U30Oy2;&i? zV)Saz47A$IyTH8Wt3hwdOXYV+O4HH`#wtEO_!rEMHHgVcEw%fZx_cCS69Df~`Px14 zLnGBwA?FyMrK=^6LqxSdOdoFhg9L=JMYAh6geN9GGb+#djxuL@y>FKEEB7)$Qc5*&r zB&0dV;%PYpQlz93OCJa# z4qwk5geb(vLsqY09Aa$nq*c1G2bX0oJ5`E@2v`7M`#5YqK8q>NUXZ=eIY&`ck6`5Y z$UCV5MTRQ2XmdwRZ~ncK#L*R#lOpT14r}BRyb6$#u)%MM^J8b6cj2=)aC7)!Gi-`C z_KdzIe>oc+2pwhIQO_QQw=a=4sdE1%$jQmvvwAdvcl1YkH)7K(yh8O021osFSU(T3 zP+y_CR*>lUhmW~0A#Ce!gw)#4{<*%}5k=4R@IA+6+cm|`Db1y9uJOjG%5CFJOysB_ zYALJa-~=AQQ^|X5-KL+cXV0-NUx7ZZpU19aIXT2O9jU`L1@%NOMUv}P?B8V2i~s9Q ztYZc&d>|KXw@U?gSTSEPYXGIyDnTb71#N8mI$QO_FuqVwf3uFLRG`oQ2m`t(UEMe{?`pueD((RtSy$Mog;&-yi-!vQDZz6#)Kiq(C8E`B#%8Y?`{q#kHkBx@PuQFqVcO*J}hnhDGqGEKFG-Rq2N3L^qMWDX|HXhx zvp{jZ{Y@lw_KE^C=p2anqXsHtVk~uY`Oa}z?pM3OBH?!xP&(61wtc8^1o#N%sjHS* zD}xuKg|9VopT6h^y(QBf`l2o4ph#8Bl8AOcQb|W>{s5%H6&HpL4c{t%i<1kjG0(36 zkidAtlNZJVef8Rw0uA;VjN@~c0aZX$@xYWb(lnd-B@{mfB02cZJq^ZqZqW^!T*hW` z5T~|5fYpS4I7G30CKUIx}!@G=W(1-_%l> zy$345Tsyo=-Q$_QOuSumX>NNtm%~}cbVytvsjvW8BwZ?Q#_5JxYz`j#dMUhEcuJTD zdHp~D@&ekkOYU9%upPgSLcKHDg??pQzDP3%tESXl$p6Vq@TPAAGV9WHZY>zB{%V_k z{prSNal3Kzv>Y#(C1*oW3`ds?ebq0aJsJUkX|AhH!zK)NALL6CiwI?m!=Dh9e1HXM zTSsT)mgf96`K&q*fr_Vb6FO?)dOG#w5*b4V?UcsFpL>K>$s0#bs}A3xG;4(=<2NrkCX8iJvRQcmltTD`YrV?4vt^zNuXf8z&kh#_jnRTdvf87JN zm;E;W7sJTd1kQVdK%yw`m)q7UWv}Ww-U6-W59xN$9w5MY{4-=mJ3&cv?+li;u4$$s zdWeKWzdr@|fX$Xld;cl~;uYEj;vmAaLmcHyWSE{#G~24oxlKddS!$q_3-q$77qAgI zE4dGwSk`Pk)uyZKF4!;6{JN_jSt}*PkUc>2y=E{LmeFwPf-Tf1ib;Z;5yHP6;IZbT zEFBW_^K^}H#!#^{D4gO0az_ypNfpH{=TnUOIZl&H4*@Mb_UjGfEEEv0YvEJr3Jw+u`%N zERs;h#%s@zALYvQi+WQvEQCa?uE2jltpF)!SldphvV1eK|HE9qsY2p7C7X!CQ@O3W z^LtHr{qJ&DAY>6c)wtw2{fd4?cXCyo)T`Qu6Sc7?Z22z)J<3-Fmk>}%LQ2no1(L1j z2LXu51u&K;xdnKY=R4B3ENO6D-xu#f{zi%LI*WwEi*TJS0g3;qdPqqrjvYYbRI#TE z5*<-RB6`J&SCH^bY7=@aN!GwS^2rhT9mpX-aHg8uqLo<0pVCE+-v5*2qUnHy<$sE~ zej(tTB7^=Rbyy1<77>6zK2LBo?U2Wl2|!TFHVhdK-%lk zF@El)#(g)YdJczcSN!g3w=q}tZ-bqFwEVQYVj;zee;dyx(O;aVNs6uu*$^HlWvDiq zwC-^1Y5599Q0{O$gg(`zA7*TQJ3N(a+GhVk8OOEazc!aZiouwiWqONDe%U`S>38^+ zaXml9sF5tbO#)>})KgpLLQ4wFGgkhFAotHQQB98(oug?>i#8oc&Tz=%YH(X9?buW6DiqEhBRh1`x^ys)`81%AT^V!PV&j5EKwLCJYI} z!f>!;G!zsGg5p6aP%0D&g#s*l{~zi6f4}E?)_c#_iTr;4IKEuz$B#8+;#71$YKx+H z5O(Rh|6Z97G5loL<_dRDj$g<~a}d-y=Q!hh$S@mK;)vwC_^VVmD|uw?rg)nPnBAyz zsPmQ7SoLAV`^dJk$Fnu8wgc||+nq1#bnUJgvfh^3z9jv1&x1YSAUJpw`(D6$m~2?K zV8<{jB#5ab0I4LzYyk*Rb)EbDp5f3eGzx`-L4cT0EEo+1f}wDrWJnnb1;l|+kW@kw z7@3*v&F}huin{&3)1Pnc`uf+OpN{y8&0SWKx2+F_FD_%sKPT-ESDWj-nqQ~?;jq!> zMs=2lle~fm@QJsxFOS;E?te4u+odsoH}UgYtU!09en$}}K4Q{K{{1i|bh_E+g>z(W zxu!fQsip_#JAIoWKOJ~{%Ku)Q_i~w*3`Ye&T4pLOsQ^0 zqT*gLAuaSCmVxi@HkE~CD?-M|%CJpu!9Q&XQ;W9cO|McD2`~GxI z|MPH7@WAYxf^U{Sd-Li1cvp1U<(%W%)#wb5e*1sx=K7-3_kY`I>oWGa>AMYn>M>0{ zU$hMA~h3ay?@I5f#EGR(1?n+~iRJ(@ghi}zVxzAI?($t|ShYf2)yZ@P1jOxyX(sR?>R>zHut%<4ztQT9yr#MM4Ydb&5~ul}?VIO28O003Zn90TdJ%G#d*B1c6|< zR45t@1qQ)TxKv0J3WS1#FpAv&Z^zI2d*>SG)8pFzuj^IUiHqaDx2vf%y685dzhT~s zrtQ<{bCLh7`kr5F+x*Dq^EVEWPh0YzFMaN|V9(Z&yZWV>w4IL$dYE}ai{$sT=l%~c zpCKO&)YVUCci5(kA(n9J`JQFi^g@-NMP=T(U7vpWLOKM9X=neM0w$(lnK^~#P?SQT z-Z=n7Tv-4i3J&uA=cD`qg#y7as8}c(421&0K)8@lHwp$q!EvbsCJ_mUO7-K7tMvBv ztM%qTKfZVP{W#xJ7sgcc+Um#XKkV)=&^=dj{MY{JewMynsJhFK{w-bSq4rT@-zWQ+ zFZ{f#4tuY{H=tOVPdEEvnW?y*Yxds!!a*R3wPTOL?dodc7^!b2(&{FyXmn~c< zi*lBroKx=vAQkVxNI5UiLcatZMt=Y+5IoPht^pEC0=g-z7X|m1vH=FdfUuA(7!n0S z!JxoUEE)_3LqR~WoG29wg#=*~7(^%M%3tSPE5EFK|F`Yb#cEzHX+*zZ`ZW&ZR&n+Z z{j2NcRra9&%jDtnz&=tTQvON~btcHE0@qb`qMn-$KNG&$HJ%9Sv^7pWDm%AD=DL5Ed6o;D2PgAXKe+qlW%5|3@NbN|G5G%0cYC?)DSEKM z1f&|Q@w15t$FsJ(>q+IhnUZs|e+J=6NH)lNRs<+9#@lUkQ+epT{i)e~R@_e@(xsQF z3wk%Il;HaCy_^j?tI9jAbl5wiwJ>f?szTZICa-1S=?Tk+12cJ*g02F}-Z^P#+@=v` z-58}SW(Twj3IxJ}Fkmbw4F!tN+;JL>2&1|Q|ZUS}EXe&haa znsX)2jWgF82)(YYo&|WP|+g*KMEP!lRbKdR>l)g0SoZ9eN@B?fz;{d~CL7Tz&<&ordA`Fe5 z6<^|t3Au?DE|o8x@hBl~1LX8icdHErMdt2Et!HSLjvYn9k!~+Tmz0xxlkYElq(~y_ z!)r(LjVLJ0>XQqVEH6AJekNLif|y5efr6bqGM6M@wDhNihreHRntdb6)N>d0W}z>& za?Wu!;&6(QJ2H`(DB1?D05?-XGZ9-nyrL`{E8$rmK&#ed#eyp&`hbb=nGpwxghWr2 zZ$)ebJ=>+#d8$NtCt%NyIE>?T)q6cF9%G-MxqEX3jBvJH-QMVKE7@TYP zzb6Ia$4cT=P}UzBT$@yC8C?`u2=;%Hi0>(5(XYOAcFrvyS7(U_SI#xX26*6M_)gny z8;MmouJu}-)>jU^G{&_7_O*qw#9F>ZNgp>#iB5PnjJGNY8Nv1??sY4$auVLtfqq9x zDARQP@F4#bqytsAT~S}38St)17`YCt$A~cs5L@6Y|FDqw-<%c~`#=2RE4Msu3>OqR zs%G0?9_gQz>*-XAGlq=^-I)q6#4yCW$VHP@cg`nN{)q%MFl*HdaYOp{6jZ8khh6r$cgOt_((kLt!Fn2#NtgR zbt;~=2C@nXq}57r7zzHiWiLu+{m2#R0T08j?AwsSkUw{2FIn+o7@j_?>RuTdNTLp7 za9c8>+r$91Bjj>V1kTNHqJa2!73gHS{r`6=4KsZtb!Boml!jcvF2KAS;J*Hm%?&8D zHl*Z~=oSfVhQH%HK8~x;trDqr!RY!_Fabsk zK9>&qGD25qZ`{H=-m2y>){h8<2r)nv-jaFC``cFWY}?7_0V4Q>DO$$`jNsuh+7}Ss z01`7@?Yei6iMtYKeN*4eJJQ06VugJk!^9y31TxoEBjnb@{!G|zga;8#fu=sc=R!WJ z%2WRHKMP=@4aDLbpDIaRe#JZ<;$=>Uo7k;K(W^i%8=I{IFl4$^1E(u zRj!-^H$i6Kpr)yxmXEO3R*PW<>iBFBb@$t6p7l>V$nd9J1i$4QT0RSE(iE~k_?8y- zOrOj|i*q~wM6i?Q3OPTq^J7x3WXrN}A~U4mrhm0SEGAahWP#sGQjjI$%}|N?%sp&Y zBPD|QM&-9}hUe5F3bx7UZ&Lh78E{SpM*Og8NI}R60kd~htxb;Mu%IZB7ZB73ZZ>Ij zUM`?K+#N43b6Nz{C%yDSt1Dl4UWd4@OrpmUf@5q@s2Pe3BafSOdz!%N{|%|ena*Vh zoBMOv)|^TQ3WuF@@S!eHtscQR&i5^}AHjTbyQw`-Li{%6IR%Mp?+XLZMeQMeVmd)h zQ2_lBl>-K@JwGbmE$6+S_t0~kRMST<)@0xUf#l;nL$ zkNUP3O8zO!MRmE$M@5TRjC}FwDOL8`vdu^<5pH35U;cf^*J8bR2b|Te9Y?q*fGcyC z^8^{Vg~+E&_tvP~-jNN{TNggZu=SgBYe73PU3%zBY%WE+0mN~U7$R8-BL$o#K`!+{ zv3YqkGaoqx2r)R*V+`}?H9FBxyv~;pgwAj!F47d`Q~ygsiW7{xb7aP>-7sr=Ep@-h zv!i90--m6Rdd&&TUw4{Kj#N0!aWhzvR;rt)M+u&D4vBAYx9BvoF%7mD$P4)|#ZFHP zi{U05B3VGswWBsh?jFg;K^NgTTk~?rJ?g%{@KJ>f<2V?W$R-_voT?PItcLQ=CLhR3 zgomj(DdQqfa;ERN6*^n?R$ z;TCpe29qdnV6@M!%w*8tTs03aCR~6UdQ7h}!Soi;)qGXf{*Sqmqo zVVytZSYoHt1j~H8a5sWX8ElfYC$kaElFRf!u9`9G7;z;kNf7LCwDR?Xh_^2ZYy=uD z1Hy-%P)We!dp&uw0>wtiDyaiws-Tl*U3K$`LZpZi-3$DRb86#{wmDoG^wvIkh1lRB zf2{vQv;Jee(X2!TTxUV{pIpMWAS&8F+9&b8tqE~w1Q?(zc!*Z0g`AhxGd7zU*psv5 zYs@1M3na?#@xFz|SHcLK-H}le&jZb0v$)&xnQNCGH%voU49b++-7u!1-*A#cfLLEu zHRF%2EEdnf#oyapZWTtxE7Wax|GUP)*Zqjz5|98&d{qc89ndz4@M#ojfRb~9H46&w z=dPt+#+Sf^D0!mJgQDO?TV|K*cn*Xv+3Ckf2^_`8jXq zs8oFedz9U2rKu!lT5Bg3{bI%4#M8ogfkAmN^Ve;`e&1~O!9 zk)Q*8QUqYDBG-Enq)W^HmIeRjFL+E|kx)?`Da>}5vx-97)gAp^hGtam5&zNCXrGHz z=+I)N?exT9GUnOC)c85i*%YkdX@hU)p5quZ; zg4O4+b9^_+*CoC($;WQhI5$DeyRk^DHbRs;VP2Gi5Ho92tVFzXR^rrTBP2Y_xbndlvO(a3PWu18il0&0N`s^No~f zX38m7j<7(Zr`GzQvcqdt@%tF>rSz0ni!1Uw18t+`myb$RBgjsCrY1>eyL&vGvW5q-N=-h&n7V;mr=-MYCOdlrWch{UKc-5$ zt5CgI60w~V*>&h`-ucmkBbQ(VG3nWr>sI*V9hR6Ls)Kx+W%=+gJ*N!s!$L_bn~m2Q zyoE}7)~!ttF*ri0_sUPc*@daSQC zM9;wUi~Ru!%X0lGx>K~p3hZObh5X1w+NzD*7NU}6gNJNgiul)`J(aPccul@b9U%)5 zQjYhWC;etmRF-Ww#cF=Yj5NC9H(gd=RK=*FP8%^UH8m!-LGwLS>L?-VIyd9sm}*YIGkbmi zP-5_rrWdlq`^x}_5RFut!q{nSb6Axxm=g<;=14&i(P#3W^aNM<^ltG081dy~w}DV` z3>!Kec^~Ssf^(UOX~&bGZNWb>&2g{=^3?qyNBjCJx8lXUs3y>vX`{CG9*)q)GKnCa z1teU{YdsMDt;Pc3frlg%fdiL0dtB^b;5xKBM%07AMqG6&c zVmiypl0g=?m#>&%RYhEq9Y~MGSg0Or=0t)p{xj>676_#{}lcRJIK_BtxN5i}-O1fAvpXG{>);;P4z5o+3T| z7Oxo~u-t}%o9w*eRe!ztA&P?lq`_fv^L$Jf4c53k^X@dsIj>-N5k9)Yr{9^ zn74!d^y zMl&bhi`M!FI&t`9J2GfsIGYH3T5Aiq41T_1hwu&^-2sT*8=?XHC^Rb|!S(!Z*5#Kn^Wgct8?nBT7zY>{u zaN02okjuCewD&i7vF>iX5g1{N+VHCFAU0q(Hl%?yVOcyN!*MI`e4u{w1(^1AZW6f9 zlkCOkg^q>qmtjPNarcZ9L+sYjhY?FSF?O1qc$^GpL0r@jQH7CUJKDSRQ0-!g#j)-2 z&YF*Dgyqd^6Vz(jf%5JL|2a4yw0`N&$hUG+ywP)$JaFe z;wL#VL^%>H5}Fx!=0gX#{xT-es%pv?Wz@|uoDlW=za11>Ta(EUdDi4T!err@ftCid zqt?=p0)cA48+Y>&Glq|tl$$daQ*N2ZH}#{ep3>K;adaFZ{b$2#cEB9W2TC063Hp}Piur>@_V6g{7G|Glqp3HGYFPZVHPScfaVjr^Z9ybPgc$%MJ zi=PBnjM!LBvN@F{FO&Xqrx0~;A%2W1J*8yhGhGKfmeF3#bz{))zK0A7j=&xrtiRID zRiyChkfWm7gL(nV!JmIax)`Vt{k)gW~ zC0x^NW%Wg%Y4$}W3Nb701MM!#@06DVJ;hHb)lVyABxlS7R#$8tH27UlDYV=VZNc(i z>Y&P=qG*NEl0Nyc3~{Omn+$@7zJ90`>l+5w1MVaomE6$Vwy~rE7a4G1+&p~(mXayD zk6B7mVVgXud?*_i$(VAq%JogPh3u0oxyDajoIBd8h5kaur*IhiU27Q-qrdmKXkUK}vCiZ05w&RG%q%cRp~ou!Cj7wA{QbX(2gyO|#&JWzm(%3)PQRSx-{g?7x{<2 zi6ppcls5XBAYJgUQD*b=I7nWGsEFJ>nfW%A(9}b##StF$=RZE;+1`upYsu+iM5PHB zuWSr`uNBZXQyoB~zb*&p9jOR~`V<7x5YiC*Ft13OGip$wty&U4AeZFcv@XIjRLd@= z!fOIM5-Zrns4=xB@R$lpld9m@ixCM9OL^dQ`-g>->?}xvq;00Mkx{?74v&b@>G6Krj;ftIbP*nJvV6rv3}f*A}^aP#my` z+3QX&WYv#P7lDGHoI5r9%p$Y2TC4;GAen{lf+fh&O4%ikj%$TeZ|S?=-1y|nuK(>K zR?790z}^Q+AT+=g@i3d4(`oRs#)Shaj*g*&!r6w}(=?BD%1$;Zt!?7nDwdWWZK9YM z=}0MZuq{xjQa{p4;qEYn!-;`ibe;iKCcL=L=~yx$svz&Rlax`90st?+q>ix)OkQ8hsHiz zA8YCZHL^}Ef3nQvTAN?WlX6 zI7v8v3|ciu@`jMh6#Uxuc+*t$gjf2_YylqN%gQV7y-~1+J~c~WyGQk#mk4`$F>uJz zYJF_s%R}rHumju3X2?eJZC;k9A%}_-mpjcs>n6A-KFoOwmEz>Z1|(ahV8ED^PQVN{ z`tEsPfN$zJsF#f-kB_cjQDqi*z6AaxFmOI2Dg+K^mi7}s7bg$RGg=wCgyDeZ{I_Yo zevR5(3?i{Kzdq>xX|SQ=zO;gDM_f1&qXc6;aye4uwT~yZ@%hD;+^p&A6Bm&9HywU@&G@@F67Nky3;MPJ%{iNSPQAr(xB)Um@1xz4;iZOKq zZ_X6aFf6lzW9xx%gP|rta$8fD3+8?N59Txf;M6AiPU`$DbcyI9r}D^D$SdkV&o)pH z9`i3ofM2y8;Jo8-pAav2i$^-I#5I&*Wd`Vd;AQJZaO`g*p8uv^ z@K+Sz8gSiQLy$*v-1yYrM zTGsS_PS{WHB#(b_TB$i_?dpBvFLkM%L2&c2t4z6(;9M(cHOxm~&dVS}sM$YHg+bh2 z3xyrxLrJZYSL^$?FjJhZB8|rY2-fi6L@C?*SqLV-}A*eEj)tp5Mw^#4y)?LGIO zt>5YOdDl6(_V119a^-cM51TdmufsoC$@^vfP`zjL{*$TRzsPug0jt~d_}-4&LRIG9 zmw43vhb90G{`bJ=TAqi4j}E?x!*%X4>p(*z*zOx&bn}8P$m;fL+gzBe=C>11#K(J& z2LFfgtN?4?+vCC{PBvV269Ppk`*qjKfWL%lKwNVqdlAuX{Zjb1qG@ zVhywqS^#<0I|H~MoB?ZG7_fmTQ<^}8K|ok86$=Ig!+@|*Ru~M02;o4eSSTk5q{6Sa zS@``s_SN&_@w)l^c;f3Ox$Ac|ms-ouK1cCBf$0OrPhMWa_;|f;*2ez*G7PObV0JinUpe*?~Mt?)9}Z%P&h{6UA06te{{>6>o`O%v^vv;nlw_TW{C}Tz zvFPYk@0$7_4IpKLA_LZu54+BG%o226@vN3**1t~`cwI#DA(QEMLyHfjo_e~6Ja9F{ z#Rmn{y=1xa8xyDw-%yu`cM|~^P+z~Ff1O@XENTo1g#uwvSg;lf4TOOpm{cMY2#^AP z(0A2ozPFp{bjfujXw~NU*!*XAcdNgLw%_MJ&7a=mnfAOrz`t!cuJ2Ykg30e!n_5pE zP1RjqZJpNTqjatuU)@#QY^1(3eQfTj3hZy+Du+us26D^^aTBPz&xwT@j)x8KfuFGc ziK6<>Pp__MIlRDwp!xvs5fqr)n_hPe5L2>;3IW7o5Cv<~W^Bll4ty9_O#|lk=eL(w zOgmUwiLn|_ZF@WNm5bDw!qkn>gSNk8A#t)@?E~V4g92eeSTH6O1%&}*AXq382#CTV zAc))7jc#{!Wz^?d#o|X$QZ}sc-TyVDjg)N<~yE8#Xf2(i9#i<#% zxsvBk_jO~kz8}s6dIWs?w#nDG@uSVcuCJc~hA2`rQ_qiYd*d|IU%_iX5B2?+gumyQ zv|AkyF3Gk|_vV&MME+WHJ(F?!d5-^<1tNb+(Pe{PNg^KAKm-9C000_{L7L_y|MIff6fz4aZ@xe&qiSrezhX*h|LGWPb~Odd&}OGgU?AxN zNX6DNM}|D4(Crb_%_MI-1I7-_g?fYpAhj)n7{sC&gwfqr85{~EccUHEDFo!FK|@ZO zD7Msd;!i5o9q$22Q8Di65yoAUPurpkww6BskuD>zE7x^)vzpf1^km@Dw;25c%Tg~a zG_Hnu@pP_qD)=@>QHDpJFng|Qz>-0@kV7m~4r?@JKBtd9eQod@7Z|=!-kGFASXMP2 z0hyiK(28ViFu$45L~+IAEBcf0jjN~n?reXy_9I9W$43AI)OTvC=p7-yyBLS61lS6d z1y}_@BE%I>;>A1HX+n+EkNgJ8$0G?CF*(wIKi2qw60|NaO|H`#iO#|#9nj*eu7g#r zl%Hdqt>V7y+P!5JO2e=jP(;kLEVlF0M!yM;;8{;48O9mOr(U}dcOd|*&9u>Cnqd^K`9 z{TwV1g;$8_P+!jOoYGvC1wq`9kvwq8X>~%U#M?r+qzVo#-aF{EpWYt!O)Q>BOZ+w( zc;rv^)wb~Y6;`6*ik?^b7PP32l3Qe#NO0}-e!xNylZDDxNXs8i8U*2bz1MH_CtbM)(=aIxa&k-2Mk=R7o$Iti3(r+o?GW~#X$a0#4G z&XlGu-Luh*wJ0mhciCtfyAv15cEr*MG<>`C81i3@0ai++9{UggBrh#3y97{?Z{TkY z&xi~&N-N)|578iadE|1I@U@zv`3q%{9X0T+-MTs9TtH1Qdu%`5q??{5Azr!BvyNbcA7`CCV|H+)P|1}Oc-O3Trzo46=&9Okxc%-QFOq+tePUKQ2xEZJ0fBG8ucj_`36v`PQPGSD>}rk2&PIqBA6Sqlb2Nvs&$Y|nc}*n|)t zWQnQn#ds0VXj#*I^%p6P-)*c<;tJ-u1|wHD;@*zVoHGP6>B-$D7efGw&oLP7Y0-~e zpGyp69v(YHTOyCX<9`aqEENec=h^o?3gl(!R+4h0V+45oRpHzz29Lm$R~~b&*V{0A zrZx5{Zc#`UQTQ4aH4?qwv{eT1x=DiYFC)s<9xZH!Nt)?=NVNw|B%JhKS|!d7@k~-q zW;8=V;sZy&CSm1@L=ekMdx||V%y=!l!?7!Jm(Xxv4vxcf`AS0RzYTH?Mxk;4ho~Ez z51%Cg%Y@TE6X7AZpy$0z0Uh`wbA9|>jVwL}bM~rcR-qs~l+BX-d(Le|_U|n_ofuC> z$;lmqZ?Vi$_y7BUBiTMIO#Qm@YOuuJt?G5TbOh$)`ejtNQ-vE37*E-OdI5+v=B7dJ zg2!EexFwyUc`}VNmsr}GmsRp4nGZi zAe~ovpo5_DhCYevdN5NXjRg}wP^3C&pmzhb=vfvT+4d!|K{ISEp1wXo{osx+7!E7( z*#>lU>N%S^0&J76jyF`J3O1I+t&PhuAI!_3Ehkcl*$r7XDDLiu!X!eGCbtC^5F1NF z97tbc0x?bx07|&oXhnTBbdRznfS;2x8&hc}>*m`WJAuH;%~p z$L{>16j?#KEf|K!m2Pbt_HeqBYq-cXoDLJ@@oetQ-Y*yEmrKq)+Jgt68P>6)daUh; z-QT=uJy32Q75{DKBxRgywky9S)`?ij`mrX>0U;T;|(5Tm?++h(IC{&M8<3)ZqC;}dcO$n z-v2E^+!$zfrx7>eAJ8x=b^*2QH*oPw96M!%=jUN9(MoF|dqGTM z3aS6HbV=fBd1k$1-@%n|a31mnf`{-tl&N$j{_Di`oVgC7$x1*I0Hi=$zkrDQEPIRa zk#Zu-O21=7-3TTX7{Xz&Ha66ixV!ii(D<30U#aQ|U9v-|dx>ITSM;smakeTXWNbjJ z-m^R^V%vl&TnR>6MHD8?a(Tt4uZ%Cid7JgRX%Gj>@{>#iKqc_ZJit%j(KapIC%{9>A+G1 zuTg?^RyugYxfcJTosGNN5p8RFWLYgO>MXa!?9NPN9kwcZC@|@TlWOL8+B%)Pzv5`i zj*#R}`kp-h31o*WDLnSx1t0$Tqjwrv3UGBb0}eN{{Qd)DOWGK_*a}B6ZfX2VpP{&G zm?oCJ?McY3%=fH2tB>laEg70+_DUvRrs=d49~C`fLMu4 z*8nG|f$DaOT41lj@`ej4z=|a8z3)_6DUf!E4!@*2nFqI-Pc8}Qca?f!E(FxRr(>Pyu9VV^+FC2Lu9jUzp)SL|t{B~mHo^3n})k{6qqP^-R_kuSc!BjH~XhQ*K~ z2zS_sRL5#!!=CaBG29mZH>8BGtBI>~zR&)?i~Q-L&bUg;hc&vc7;1!VNefAT>anx| z^Zd*blhe%~=KeYaFsnCr;vgu5L#)mxE?$<8$sJ^%_dd5zN4bFliq`JmN~my)wuho(BC9jxkD!GaY+r~l?!@emB7+u2IcVno^p9gp!fIl0LdT#j{CXgZ{7HcgtHh2$YTGs`eLJxLN}vDulT z=W~r=B6YroY?WF3k3v5o)6PtXzrY(^^NE~ZX>njU-?;?*T zZGC*p%eM>r?Fy-;b_qzp$c`^t7ZJ6aHnR1(MdJw0+%aRHg_o$=mPPo&{ju-O0*pA; zie@UyvfS^TfNix@+;O@~Ir20``<|jva-t(Vg2aj=Bvhc78Os5-C8nBW5n{G~&o04# z4++AJP-kQc1Y{+J?U>%wOOCs3pYi4n^=v4AwkXz#AJNCM*=k&575`cW#ZpcE~@NQy|o1?NBmTY{Fa#_)5&0Kz{fLYZ(B$r)&LzJSj66|L0r8%PNR$Ls@p<6JJ~!DIu!%u?{vi;>CdgW z5rho>NdUixC{vU;+;T@(#V<1P(cEJGrCf{e~9pCo0+)|6BHnbqQ4E z0(uHZ)G=JzX)WECr~zf@?GPIGt*JTv?=T*UKM4!k%^cwi^^9XV=ET!A)Rj!lZ;HhF z*7kCcZwmWMNF-h%YFm$M(b~RRpNDw;egX`f4ghzR$H$Mcq70cSt9AWoj0Z8Yh0?0&A9C`^;)5{@US^6 z8Ph*pVH#|-z|VEobIp)&cAb91Zf5<-6;)#M1zRBIs3lS_ItT@5zwe;YVLz>lMXLacG^b&^CDGpAjcHKG+q9B>pTLu>=wVpuzS^o zNAs#;!S`~(3I1?kA3CK&Re=FJD!6WPOE$+vPmQ&>kALgf3Ug(P-=zud#x4%iHx5+q z4m|)Widd@(G+Ei~`o2Mdj6n=C3{tI|cl8`Ky$M&SGX^a?Xq0atfcz<*eQJ(6QBXBC zS_XP=Lf+A9xdsmfIVPzj16f5pXnwk(E{A1HIne4|gPEItNo990D(P?n5F4+!Kg?%F z!I$dV8K<~)uaJsGcP4Q3&X>}ic&gn9f~#U@h@H6c8a0<69v=E=!xY~B{2hFSb3(%h z=Hm~t=kb);8E<1=i2e%Nob`2gW)1S2lPg(FBD#{Ru-IJ4NOHMgtH8IHWd-*PLJjAb zf5f4(U6_U1BLHp-iV_1R!N7V6P@oWWBrh$P2DzFNe^Sghl8=Mep5SOrHSi>rWQIZ} z=0Jx|IUiSo)c!rz5_Cg{Sqwuz5Eli&e|h3gTrs2=EihpW1KZ^sZ##kgqQ|1@1Tq73WkM}gbs zj0XelI!J4Y1n{}exkY)wbnS)gIX8Mg13*57;><#0(BaCo98OOhxiqh227==)BO%a3 zZDu%By=10|eAj_F$(o{^X{KW7(WtJX%z&o0RT1Nek)~m)|1O=)L6*zal*z3P+_9t= zBz$dE+kTm>YS;{HqTQ$GVtAX~u`(~%od>6Bn+x#0VxMEhH zX4z>77@OgyGhNG6JxMs-J z1BbWBDTIv@&#nG$b(i5|^VbPRb8V(J z`6C_%90>Db5jgjXLl8qhq%4-jg}fAkBri>8iin4k#=E51ors;)ljM3qC4;}fKK{+d zX+07Nzsg8v1hb_ujGmHZLOtC#OoHyIn)&fG!Ym55(wc`)q%v?dkk8ZFb3sowCN?`S z{Wx7+OcSK6xvuRNB4@awpX3kuxRfqdrebY`$Q}Vn9_6rR#%Qu(=G?PqfG6IF!isx2 zeamgo-?}IEZj@8m#{=W@V??nGldC}x`yY4 z-Z-ajsP>1;(?;4iwfKDYMBfm!BrzKm80$c8nV^u->fETu7_b^%!ix1VWi-fYj9 zIj02o6W}AKj(W4Ozx4B(;GdW*n6}7v9=n(gtOA2nFhucLqUT(6ou+HvTje%d&-X4+ZfU?r8jtI{ zB73dq>~-IXAGh9{kF`(C`qhIIUu?*Y{n3zzCto?TInlGecd+=VEY!c6BPk4ALVfw3 zYn#EklHpJ+84HA%yMl)^xafT|2@A!!1Brw-{jouuVfVL@AWs_qFI?(n~Fb1H;i6N%ld(8o;|@^!d;kbSYJ6k_Xl~?ygtkEW5hE< zS?+ki*xAX4GuJmKd`U&zoctpAOptfH(sH43SEj8UAMcDa8dtNUyrrY?iEsmH75$_J z$dX9(c4qWS_`BD1>M@6C&8@d}LSi{RmPT1=hIDP;oCg{ZLSlKD^T&Y6eqYQykE5@m z9s$2E=~{9^`1@8<9~X9AR3a78xWcabq}FAl!K+SX?IxLR# z%xv-~0v6GYu`NxOq*<)1hr7|U0fo+IaZoTAjZ)mrOU8kSB}H2DqT}I;CUO6HHACGZ`m8SN7T9KJzDMD=Z%=`GT<$T$+Mef`kYQoq=?KLKGk8bl)bJQwjxwgJ9TTEIJE?1mQr) zU?>?11;T+)kWelW5sXG*5i9ie&OLnn`quwHeP`SC`+hUuOSo%Wy5pOt1N?t1^pDKH z@c4XnbXy1FPT1nMvj&<@_4ktd(tqF3^tVpc`R?>B8)?6IBc%h$HaiSkqiVXwWpER-oc0sFgwXRiRZ z$QpiRn6@!xI9_1o5PH=IlTmiCLa@**I0}UV!l1BFEE@_2M1g>ySSS?=4MHI>iWTGW z>bL9hC42l;{-2KLw{OP|Z_!=0Qj z*!%L?@WcDnd&j_Z5EQ3yj?fIE=0UxWBfxY(@j z+WNw;4#N&=$|W%mTYc$v$*G}vi+JjHIYl6(Zclb!wA_im1O+KEe6F!XOB%L9#X{LY z{jxA9at^>F3J>qM?*IGih6Le&u%Jvh6AFUGfgo6j5(uR|Up{~5FY^DJ`afK8{iVah+X2;kycqB3(B0(CKE2sgYLYHvve`ZI z^1lDK8Bd8vu38*@Fgo)WzKHvG(6g-+&y5cknNr&$rWjbX{;l-?#BmL^7RtezsS{Nw z;PW?Z)9lXVI_N}5*=0qU)YtL4wj>is2jgCS0n{7!Fk)fm^KuVsXCF~56GY3D(4!`W zSiJ_TDTk75(%d6*^h!PSv7~qJ!{7(TEE$6VV8IwL77K=g!$7c9C?XhzLL^TG_fq9= zhaUdU_^MqJ<5eX|1sXeBuc!LG_;{hsw#n!0=IOWPRs&1BtIL@+Uyozeb}MR!w?o&t10JdVf;W->~MTe$ys1Q$s1zTTD}x)90J+;`pz&p7HZGaw-HSzfV$5 z0t@%+p!*WzdzbsAf;mA=LH3{@XDpnlKpWt~rlKE|Y^76RQ?`qs`r0IP`}Ki?AOZl6 z0U#6@HX0O#0>VKsU``Yhg#zJFpj1p03WUZheZ7A_r}_78qipUtS#xX=D{N<`xOHeWK| zcUr$c@2`W=3bbwbpKFh#H~q)%r-Hr<+A_y1sV{C8uWsuzqps6CmE3AT6%-3s4WJ z)E3ffKoHC{3k3rLVIZI^6b%N#!GN$(E))v|2%-`gM5lajUHbag-aOC0{C}sXUEOH~ zub*wD^bc=7U3Y(2)PMEC@_b#A{(3*re!u$H-HfmIav65V^&l=1jaT-0zDXTh?Hg&g z%(M=3ZoUS;bPkP&iw{fN-g^=CTfZ2WuJnTlJ7`?DjccF^k~N1eT>NdzjZfSfd^0M} zE!b)b5c{U-bgQ~&seazP|D+Kut|Uwz_ysXr>jFrXBS5u!%#`t1xm7|F0x+QZzy7}e zzA&IH7z+vmL4dHJEI11u0>VJBP%07#p!;jSFT>lLqWpQOGoL%SxmuA@riSJ6esj>_ z;b-7s_rvS;;riwmrtG_qX1|VGXfzJPtiR4Vzqi84^;LJx2dOytee({k!9Q2`D%V{8 zSlpTd)w@orGSWBtyw~@7z4|*YyQ!7oIWDKR!rcdklQ&P6VR22-r4fzt*;1oc5mQlV zUpIv}$Z8Pb*E|9-JQoqGue%&#e4*E^ae8AZs<>s)r0t;8=dmepev2f$CnTNQ=Pg2L z$z?FzM4<}O_oia6gCqge!oh(sV2l_Q1%m@&K$wUY3I&3KP>@8V5eq*xUf%M!qEj?R zT2n_ADoSuaIX}|(3wJ-a_|!9D-68(${4c-LKXm+-c`>o!7iWj*@ejToQ?2Tn(+kAr zzRvIK^CTe zVe_Zcc~ZjJ`WX8f#-}iFO=9yr9x$~MkPxCzGKqdmcwEN$v>UEV`RY<+h|UV{VPX1r z;NBkhtl}&A>(F(PeL1!6dFf-`4n623(>3`Bl)0c&$mXCOd~mf@f9%Ei^1c_7ZbI^S zsCVl`1paXHsUy+01k{i#ge*d6L;O<()q_T^W0S29eb#!ll<)&QNx_OT(?6xgQi^AZ z=+HeoGuf!>DN{27KqM>Eii##|45?!b%oF%^)p*|7A0BAKj^XlAqkxE4B|@929T(`C zSV%xK@afGxtv;n--;>n4>WDSap(rlq8;^ycc-^Y>6lT|g8?$XKv56eYy+2%+nYR3d ztwr4Q2W#^kxWxgrYJd5hm)m~2FHS@KDA)V?`ML@md80n*Dphh$k&Cz1^-mKqFag{{ zTf_~5tUmpUeha3@O(d9X1VM~6I4)h%o9bk6X3&!>ky=)Q|vmZE++j=z|x7YuZgDc>EF9@b32o4%ups$r_J+CB-k22~OJAvHj*K9PSW!SJp&urW5#st<3b zS2P`}_SwxaO6u+G_5l=4;3v#s4FxQ-*_xw$qRBWeFV+dTmWjt^Sw3I5nw>cc_{J9Z z6%x{Ew{}4C$29uNp#fqmTbm6SE7|B;^f8rwR~s*4>k7u z2dK%_Y1B{NV+a&o4XkfV&4?niLU5%e_C^rP$O$9Io}DcmM4X&_#$+!Os7A9bc|so* zZc;7xNB>yu**wT;*Z1Y>D$~J$4n&2YD3zlQ7W`L2*tYXTuNu z;d@BM8Xy}rX*ax-04V`4Fv61@=VKSXSBBhhI#a-kf9d_Gi}Pq|SYRFGuhz^_AFMia zKf(cQWlpP<3s!J0?eej$9s%mF=>tS463L%s$$ z(&2$Nu>$#G41!m3ClXY;(zH=00#8P2FFI2o?4tvJSSbshXN4&jMdUb6#iKd`A9<4_ z7nGmIyiN%0Qq3h}^^?&Mat3iXF*N>`p@*F@s>|cGL+LAsBs=Ia;`6_(bC^T_SJki) z_h}`hM#JWwgf)@O%O`f@pzBOYQ7J$@GfbP+Vha@T_h;Sz@c z%`cW2zi9w)z-gKRoej}M*;3Be80%qn*-kiRi5SL*CAs4-Y8J;)fW;5!RMEV^q#CIl zrR3FuN^Aq^UY-X|JNAZgam0Re^0l3_RT|?7tYhuxEEN5xN&c-#fW)Hv$5m&#q-T5& zNcL-$^8n@gg{i@6c9oS%sZC17s;ih^WAI_mZ-WH8D$g>Dl{*%Xb3bDrsmkowC_?He z3kvhD@yR7B(p%p);6c@rog?u9??M)KOO1s2X*2I87t!f)5AHlvkR|Y81N=QVL9BE=v0BF{eOK)!|`VAD**PXEe!4Ib?^>7{kg$#A6{ifuIh2edEOA-4b^v2GGSsoktb9Wa{mxKXx zn5e3-hpfYahjEBoywehDKSS8A8k%xMT1ES7X4rm1F^=^`xDlk6d~IXJ=N}s0JSySN zh>PMo=hD#aZpd`YB~(p64N3N;UalU^A`QfOd!PJd6D9m*LSb;U@DAs9qzjB;MGRS< zA4N<4N)h6d4d5%=mg9~PCw}4s%pkg@dYvb4pF?$pS4zKCjV~TZF(9=24q_i~tH6(I zMXE`ODX%0zR90!epBy#Ln}rUu;%nEy)p-TBoIi?4JqXuOLM6x#9;Az&=%0X?GX;`h z;ak+O?&U7Sk&ql%nN^|GTxfuiH4iwgBuQGdwMG8DK|pyUC}81q z&^IEzDS4wk?G^V(%c&Np=h_xuRDt;f$!{Q2?^PK2#oE%=OmtuZa1`)vY73N^#~*1W zR34K}`L3qH)qOsJqS;aAh@9`zu3hKOVBw=5`J495YzGo}BE;jCv1?4~inapW3VJ>C zs3}aP)5%TYG| zVS+IdE_<{|CTt8YBoebfAmYELPlI@I5xMdL5p5~j-+0|kvKGo zP6`NZ=S}+Ix`E8GZx%?`Kw7zVH7^MQw#06V1_e4vezel zFOSNAMZuG#cN40}m5Jnp!b;g4)zqcpo%e&d-*i%<2bhSNdH;BHCFM}TLob80O|jJ$ z-$R{L^r`CCV*A|$G{G{s-7dpcK>MkPCqv@{+@`#jZJ{OY`6`*1pN}{YQ7#o)1au3L z>i_w7cYX#kVAuw6>6XNP zXV-rFKz`nsw|0i+G&WMUJ(=pl$GU7{btF6^fEX=E&|duX_Q!|5cVG`|$gt7}VYM%; zn;k#%Cs_VB@2x~uc*`cfSoXO48Emv~6Cj{;pL$~#=S3SkwX8-=Gu{4S>6~E zgL72Z^??0zU>7tdBMQH}_3PfcclCg+BmE3=#UFVbb9duE6p*N4_3+^w+qfvi%K!y; ztaNpUw4d}@Q<5*qSwB~)Y{X1?NprJeVB461v$eVaaZZxrFScpc$N=I$$i3${O@``` zw&PaHDSw#PsuTd}mmQ)}^eykg_-DbF0Jmi2T>kVwWs56!ij~XJ%Z?wiD#z@GI-LDZ zOAoLbR%gI1>Z#E@5;oEJ^p@!D$>p#_0Cm1khL4_L(|-vJU;u~a z1Oxp%9Qd#mY>v>A16vW8pAl3@(@fN=QO?IJA&5N!bWd}MW>D&%DyVXV%<6UWAYkh-ns0E znFaa_|MpAa>||i!_FQ8Q{yxL+gbbm_K7Ay8cQwYDZx&LF?!@Nmuqv#$pG;>K&)1UA zeC%)$KGI!)`H7y49fMgyLNwXUI-|=*Gm*y_N?}f)vYzc+fnp$7ioIZx1% zO*_mAx{uBQulG44ZX9c&RUKK563{X)eC@VPj&-IF7!zL`w#mztEChOK5q@<|L{$BN zH_upu=p~i~4a7r%?v+2{77)^t5@(G`vk@xykS_?%gHY#1x6Sy<1j5N zyNt53l{eahrx{nOTH+YxSXJ#x^&%4)pY7PL2~ zFu)M<(MQX%x+3dpf`Zb&3nfw2Q>Y(zu-jXm7)U5~Y#WQ?;{mc)|s z6g=hMP_pmJm#Co~CeHFl+ExE)gNa)(*dnkjG%DAJa=YbnIS9$JVG1EN7&~KcrR>tQ z?sULE4!wGcZs`ZNNw^-oRO+-?h1mujg<%O;*Krt4>fQA);gMCyl6nZ1JlnhARtg4l zGoVFmcEsH9)(Pf0^m2`Jl8BKGGmzODI|o@M58GN*%T6=U{rWsG!7rs-XVd^YXiEzzc)na$yTp|Yculi_{_vxz7;p3yU>aJ zo0EfA)&nOKZw3UpjI(yDt6S4%?O~b*-H(1Htb7?YYXlKeS|!Xj=}!I?nS;dW>*19e zjpbtJ`sZy|u4;e}mn6bXZ7*6+j=3#HqM&knrtaKpLq#sG{h4=iJkDzc#Ro(ciibR< zJVk-C3o}XV5_YcJvUyqxxON=3nZjBLvnaiF5-zRFsmFYi8}D3ho`T49I4ir+;)}?Vf>6LLOnf}9gp%n*!d+tZsd#(ZiF`_?@1L6t`l>^ z0ySU8T@?p0wfLN*e+ru}j*${aAK>&_>hahq)y*j)tF({ULupQK(?J$P@KpzTDQYJ0 zG^J!oa7SyIH|i*HT!`QaeSkH&bfJFS-3l~by@`7mIz6nG5e>L>fV~;ZskV%_kDFC* zBy{eR{^Q>!^+qA2uyyQjtrc#4d~LX|$m5b=X{#WOtN^lo&FUXlfAQVL92aMuZkC0e z*c8S+5l~1%^?_E9Ay-a8O|+lJ*_!j^ACAv*DcB*?6q+q9`pR^wo87ocsDU>H4-`QC z2>%|F+#fd>X0=xH;<=##YoU>EY8yVt0B^MTZ3-xET`vcR7C917kV4bAJ8d4|1M+^1d-qCGmM6 zbrQw@97M{am&9K&qWBjuMy$g?Xk_&&~}ksdQ0Q2 za{S#wvx-JoW;63bbxp2ixVAMi2GsMU)A^to2X^e+(K29Fh%v{Wz%CjmqM1k{D3QDu4-04Pk;Tv9KjGv%R*T=wUvYv>1sk&@ zxEf`?EnfZNEHfl=;vJ?IMkVi!l~f@{Lf0QTz<3P`yJps<3QMF|Dm4_)ba?M*X$he5@`!zs4m*SB_?Z_ChGT@Fx2Ba3%WoW>h)RVQrb`|l*>z% z&5C7)2Q;Q@&r}65a+QZ|3yKnQ=wwWTy}aiTe${t(@g-(ZJ8ryc*769t5_|Pxzpq^c zc10E_nRd(;YCblSPtAP20^w1@>3urb173aN5~XS0)Zysyv9^7)OB}U75XGGAM@8Fb zl6O7TsB@@nY91-*MtzlUpgfVNu?+8iRr#>O)0i?m?fi)t41Q752eKm@s8%F`TH^vK z4C9KztIrL9Ah*9ptT2W@{5=- zJe!b{mEX0q=<)GNX!w_3;V6R*@7oGBoak|m1~32M8^aKYkY{hG&1DsrxSYc+Pngi^ z_b!B5r0cb?yT_x}j;gM%%n1b_o%+oQxWO|owLzBX#=!-+iNc&z-oReGT$~bW%6tJ{ zQm)gcbEjXg>;H{Hqleh)dPKR z4;I7ZWTRBC7fHrCSTEpgBQ|#15uw!L3oL;tnqAQ{_{V^VD%nMNV@X;54=(h<#K>h{cn}tR+qyn2(#^SQdsS9+;6AyG+ z&crdyO!*C zE@5Y%o=gq z!*AmrR=4wTI$lFXE&Ncl@_x6`CDk&npyjtxWe6Ea$G{HHVZ`(6l2_+y`{HnHv3Xag zwIQuabZcrAcuc!3Fa}3Au!;l94W3s|lPO$Wv|sxo`b!&)F6ro}v`KV(+|rn4xNzrA zXQ={$PfHwQ+z(C%vswlHwN%gHQe*L|BA#6SYLFng)Xc25%S(z_Ib$~Vwhy%o^MvHn zY*cN{lo$7#zesrJCq)=}0+XtQKWh_1}!?&}uudgm9DTLcUB+sAt~WnGV@o;)7D zvJ!5qYRG8i_5=hxHU7_&?>W8=9zNIPc6gg*jua3w41A#?-d27 zmOr4~>$;;lg_AWg!|uFXN4ESe^1Q{8VX}SRP^X3L*ZoU9I3zGYnS=8|aC{FycQr{G z^j})}X*zeb;OaxBN!!QQYgF^Bx)=rcUA*E1u{B6&UKp(rNm$RwaNDe8@&@d@E!LoW*n(n-TgAPXa>yba-r}%k93g z`#o9VLhLSsYy4MYA~e%+1Yn?kr*__RvTNkp^1m2bvyWBGZ!!`I!uT>hUn{vnXN zL*Uz(Y7Bp8`w)8F<=g*Es>XLtazZh(RK2$}9t-^B8FN8A3i-*~2uLWz>Y5|>AK5E_ zR+)~pN9w(Xb|@ZjO1~Z7Q9zG6is}T?uI$&W&bpOei-~|#g5O>y;Vw74=MHWg9BpJ( zPTMRKQ2{ri1>klcM6os*W>nhfhlD*OB5^1nc zup5s+fEqWU>JnhmvZrwqk6nDpJ)YsCWAa;*TyN|;=T?dhxO9TE(?{jg5&sE%Dd#U} zsKsLhfT1@D=7hu{XQHJi)&{{UtD?JjU?d1CnHfRJdEGx_tH5fVn;&RBEjCYhiL#yG*i0S~bb<20#j9|?EvGasM*0}W zq(rr{19EY z!l6K@P)rjFghF8;n1v61|DW6U?XSP_yz9%~@ojgRZ*Lmko^^9g@xcCB-{X9lM|ck) zcNp|9Iz1@s)s0}~=oW`T^^92m^b_7o{DwaJwiY_QkV60Py{BPbzWhY$r_xil$B5PS zP%WSgp#eFmulqgkMkU;}qAF0<=l^}oa}x9U_F-B~2w%}vf48~px!k*81nE#_LyId->+^(0!j{tp7K(Y2m_?GNeH zXLM<`u4-=DBH47OZ9rXvCS})$`v_0Pv_iN6Za|Oj*a@O1?E}EZ4EW|3%b=^6A=pqB z3Vlp+%dh{7dTuWuiJ>izrUem$p-e;wYcrj;v8 znJFIty7w12T%$l1*1xy8V!4^SCn3+m?z2=FXUIhwo9r5U_M~m^l`uQ8@y>ySv)A_j zLG;-PZ?;EJIsQ{11zNU;9`YyQjq1xNkFS#bpBU8Lmv6wi>o)n}@lP~9%d?aO)F#HQ zUh=F|-FEiIn`%Daa14+vq;^0z?e%Jcu`ha%7oCMKlndrqeLzMO9eV%&|M%7#g@pm2 z!5ACXUY^|}-9|#+OQzEH z*%B$}?51)1xnb~^hdDbmNxZB5y!v}pfBm2DwdLi7QRe;gqRwyi?C_J0juScX@75d6 zy4SDEPp@h5xTEhkY)(s~JMK-^jQtM#odNJ}uuT{G4k_$PerfSK!q^!wrF2G!WZwsr z9w*?pA|S3GbM(-2Gg+{z_i7Q+tv>YSt(6%n>*c}i!hCt_MrkG6bh1~Li;yXr|Gt0IFHBR#`}V>6T|uD? z7C&=D>dyBrGyD%DMt#?uHy{HTn_y%pMyuh~{%20y% z{({TY94B!Ytf+g#}t>Xe>V4#>Z zCJG6|AwbY4Id{pI`j`_JP1@6Pwu_-R}-te4Jf zf%)Ih$1ksc`Sg1o@ZH7VY~Ks}Uk{7jC5(U?MB zs+D3p11do-7D!MIYYlk2pzFv0Uw}Ul5bhQn1%pC>pja>(3kHKBpuk)#DGP;yf*_!b zBBwRy*PqV1m%e?s+ou_pvhz}|qNMU2jvjxxUHfUt1QKxW?OOHOmP3FNb+|#CK z$>j#9kFUiczcYW{#Cp6DJdC_%N=RlH@>r&M! zG!L(3dc8htK7CgEF0PAl-3ssNlIh3aRsVjsW9xJ}%Pu#^A6TxktK+L1UXRS~KYiN{ zt7-D<-rjoa%fokQA$RVdD+g2V(InNsn%rKD{k^#ro3Ni5?l6+)et9TonyTCsb62|Q zO5z=L#e599Z=U~E__|BrP>cA7dAVo=#g3E&G1U9k(z79x5>)b0kFv5+g>iANt*92Q zj?|3&R8vD*iO-r-npBNZo{Z>`ua02$!9c)Ra2ga5g#%-tSSS_>2!beYzi)qUS+2Vw zSC$5O0ygE3(=U&#XN)6 zwQt^U$UhbRl1hqsZuxaHpOyS9cAh!e{fXGfg6sR@d&;BLZ+|t!=rs`6IZ`Nm; z2Okx{t$8VKGDh)rKb)_M3@GYN`Y9SV?38OlV{El>`Y#lu$D5qNgCGI`jsO4~=0Te# zEC15k*G<{u+e*4L0@9NKuLi%&*#--dmL7H_M6LCsX{HabgKUS{lt?$?6tltwm+q#3 zD)DO|sobfUyJciE!I`)eqejL-00#okcOtsA54{H%&Wc82r$QS=ZN)y0MNi4nAj23} zHR*(QbC=${+SfEf(z6GqFw~1!_n)Mk{k;6y+4|Kl>Mc^9M5d~Mk}qBW*9-M<;q?Rk zZwA3x{9aJQ>ev!Vh(3*8T~P~6l60mpf>{8ag7To*iT~&)ZH;|ag(% zp+6FKoUTy&#=@FkSvyxIWVm&g@Dxoe( z_o6=rHT2H{=4#KBtC(CF8Y00@2hl@X)AYSP^#77fM#9PFP4Lf&*pTjudQxq$ynyb50`h{Xo+^(R(_If~V zb@F!Vm88xPdEr*pZ$sOD*jO;6xPomV-Xg@5V7b2bcu&-N{g6EY?zXjAgD!ge*L(D`t8U!_N%?s5Qw=1*{9hz@uyAg`hZiO@J|tO>D#;EWDbNFyOkd2AWM(uFOLh$T@b572cMjQ9N2 zBs0*Z4aYXl9ikDn`zmQ5Tls16X2$q+Y!tQTj;5G>oruaeiazwUzP47v5baoO!n;M8 zu|N*$T~--TtMHw7mVN0)WzWM;%b#*%TFuz>xk`uYt`&;E3*l$mmh~&1ljBJ1%nVDI zJ7p|-9j>HX75MTo`m{M}{IH?|JHbvSxIZSiPg(k-V(gtNq^eHiFsdA-lAkxnYD^u~ zI1isY+Ju)DU4p$O8J^7n>Rc+Pfu_m-@V^`VN4UG}ksstQp>o0?*aDn&$>N@yD9yi4 z>Fk|ns;9aYJmw7Jh>K-ec4~N3u5y zic`LZ<()hTXL=baM+zG#COtlSv5%fz|43ok*2I1cv_8`Cs z-M5x`mht!{4>XR^y|RN5<(-JSVwWUa&z*5gVBDP56M8MWss%v)#cFC?$}gLT zh2w@=5;4Ht4ow11*ts%w(`91bhKae(Imqhmf0=?m2F+JOJvI_x(P|9us2@940Rg*| z9FX2=Osc7EGb@HGPvNosCVgtGXn&i5$XXES0|05@k+CaP{N{;An5rR#h1@v5?7ici zOb68CGV9_%p((Z8qhS!T^yh-PuZ5RuA1a#a@U@xSp!$?(@5=!u`q2^JSFCYNgG$ zA~w+K7qi{Bkdqc8s7xV&C)-tB*0G~!rPoOlf;W+rL?@Eu!^rKMM?s8(3AIB5%5SLS z%BfPrQ`U5mu|_uwRQEctxGtOTe(www-myL9j{YGRQlcHI<~B6rflqANhqH%kK3PaC-nDpaxJeFgKmuLZ|$1Ug#D)s6nFwnc_c z-h75vJOq6KoN%%2pmrC|%Q`4++Oc;}EJwRPhA6XYy5*hTw$rgOcwP!FwR~l|+Wob0 z-$kA%%bOKL8v1ZnG*>mY5x)tF{gs&hU@~)c)?lG0WhRNYYEy~qbu|$(yTnhW*}-2+ zCLA{oLDxpmD>JTKIgw7JBYc{_97w#NU;uIX=AvyH&w5B!Hlgne%khG_EV3ChUf&yU zja{QV){K8PE-e2c!h(;^o_X^*#H@3KR?#RFJhJt<8xzI@=r<9#B3F8Na3FJOP^@Fn zo+icJ_g`OY_Kopbmu7}qRfYsU2aDD_)Pa=(FV!7g| zXxSNOegjOaadW`T+vnG2z%J%3od?HWr zh9+u%2;N2foWYv^o)s^_xUyV#)5jckHI;83l%)dDkn6YB!x7W8?Kcmz$wdh%d7v>` zR<36L+HbBA|G;%N>WMJdFQ^%GbWYEvnjU|*=P(HN@$XSWM1yRn0<=-)H_mTNNmY^7 z#Uclgh#OUNStY|QpOG#?&a1Ll9dw{VWsxpTqE&&9Fd2X<*<_azI2AotL4!iLwUZG; zMV5 z+lda=oRt43p;xbO>IhJ;MlZWO58TF336G`H>0M8FGtQOeDTn^BMfcymfHF0A2bSav|lZsKJ)*x*Ru~j4SMZrd9lj z*a3u>G>BPN=Uf95fCvAp3Vk|}E)%IL_vpQxDT6Q0KHU{Xou0Eq{v#^7PhM@FVVa;=T8rwl;L^9|fS(lO;q{(PoeuCfJ3L%|uq|A#Ccl8EqmNN35^$Welos;((s zsiyH`xt_CT2BA#z^sfL2P#xHjB59eZt6SrK{4E*#TkjC5e;uPLatv1 zjXQw2kC5&PdAPBY%;`3)BH=DD6fRYGn9z6f@7j80A2`3j zTr9}w-=M%JL{4qB`si06I=VzIgJ%pKLu@)VOj(bS+#2f%A;4;19g|Gh2=#$H*b1K2 ztK9OE zoi>P?Ei-z59TMR^o$fz52*PrJF$+$B9>f8CjiVR>`0X@UoucG#X4qI4cFA!cLfR`PALgHJv9t0U)x-oalGQ(re zEPN(NuMqXeihfKMMEe3B1B5cXdJ3A`z+xEOm-s_NdiO-Iq%0%#-%&YV#dl-Ho&sTF zjgxGjiARNUu+`E!I*$cga7D)@kut&=}_qlc3ZE}lz%u?t|~ z2Xaj8*x`dT0Celk-BOMHWbqqT(|R1x+A2VjxcJ!k#%-$qJLk=@>n*#us?jn7cPFwJ zeSL*2DCYU+BiWcy8U9b!p~GQ~_0H%vm#J$1H?kX^Kw4wwH=~vY_N7oGC@7I%I}s3H z1pjf>^jtJ!TXcj0uuA^kd&&!0`ImtnOS&EN86ie=%auBEPxs2 zynpxoZOz*(Yw9a}VYjprzhN%<@(&_V`Z8}4OCMWlC>V4wHAYC`By9KcE>NW3z1mY& zp~!>7SoCmz9|Gn z?{c6B)WI42u99A68x%@*#njl=z`{Sv+_9bQ-^D7tSqbXB;6Q~uGA-eR4} zx!9MC6lE~@5Mk-WQLZk9^W!x+yp+}f-t;SAv4Gb4@8Ej$WSzDJSoW- z*RS%M#-fatV134ib*LnII^V{&slmMmN8_6|>S)88JANi^ATDr!>Azhc$83-3SJ9D| zc`)|-K6~tLA>pCr+h@nOTaQ+j>2c$W$@)ngH3lSez^6E*e%_9+D4RKye!>L~76X11 z4jH4eXMUaM++@I6`LES7l$l26E%#MpEtU;IaVS~8AgZSQn#wiq%ZbK>=V|Lf1!fpF zwj@6l?|>(G0>#qek~&kw<0$$+t<&!ay${&b?!~xk+!@a)>FEw_!EgA=i)q8Odd_sT z2W?D;Fua?${yUKz3u@0HbC3-%=$eD|01Qi!$r>q$%T7g?oyu3EmHpTf0WP`Skhk|b z*uKldd@44|85;{hQ^6}8GlAVRIKaw(C0RN2pl>W^Y8#6^xB~CtzWj3tOnrcK@P`g_ zZ18I=k#06C<-WX9%Bc%Vyl&&pD^}b zq%Za0knfmCMuF#4834c|TA{017T6T%6~iq*>xt={lHS$9ni{WO2AQAYx>slQq-lZl zO$A4AbR2Xk0W{gA^4M$7CVQY=hcH;ji!(15o1w7>x);DV^6J;nNSJ_jsQ_L5;14j+ zLFXeaU||#ROaKtE1H@ReYKs6@&r{TZX(p)V*uL6d3?DJe!t!NIp2^uHCvy~geO7%K zpf(Zb`3aBL*T3F1#wrHO?-hiQqgeLIZF;H+MZZYda$`PU$8ta74m>k{Q83081*yP4 zGOh7FDDtV=0-Sp6J#uk);`oe_LfA)EiTPVHxXqGfNjep1vFXd`@}zB4Kqp5899zbm zEiPB25|IlPgB#8q-tOpJXTSa62hrw-`W?ABe3WYqw$`FKk(g(pRfstp&*Jqcv&Q`5 z4i^V!Tdwe?_mQ&^=y!7`(G(#uX@ZD<#h^mgS`ml0WB|{jpLV2y*0lR2N@|RAYseNO z{SIbtEJWlkC(rdNhtiEzn^VAsN8RRKXxb7@Uk?yD!JIU}Bi}v4XhecU{8uGzQBwGV zVw-3y=KPYIK~qCfE>0@x@T&scq6w(dH0ZhY#XN}m4x%bgXMlaoUADK*L1q~o>HQ5R zO+)qdTD;QB04KRr(Wu+lWF2h?*>iJscqdpm!7W58KES3%TDYIEbF4>8&7cX=1RCx& z^R_+*Sk3wLSKY_X53FAFA@|EkntmvpIcaB(?(qRM!0SYwnd$Xz6-?oh82#veCsESg zo7kq#wv^t*)oUVR>iZw|L0k7RNfMuys@qx%IQOZU-wxjCZFt8o>U$jx}~{ziYgS!uLwX!sX(SV;T~@z+ymL88wQP_nQ)+VZh+r zIHD8xY&#uUjSs)5jEg@}vaP5b^(Ru2XmpWRt*=J)AV5`sckCRa0l-n5IRm0*1+wlP z2d8*7S$QL&MZEBGd;n9+2jKU4_cYoc0pY|KJ*Y@;h`bu4DP!!R0yEf`kp9(?pt#sN zt#m|Mo^-0ylq@M$*UXd>>-TT6DR|ybYokQ&{VRDSv9DAV;Em!d;LZ>KOGj%Ke%|$) zgLklzN&F<$DvD2SimExJJ->Sb!6{Z456WVtVL0}ifk*}+hV-BkkBu~kOQO-)eq+)& zsd$_)IZQLV#>rN=Q}AtZPj4?Ioy0MF)e8{}{oi-l;gD0Eb4amYG}2=E&fNwoPaG9Z zXfl+e0RN}!XzdPNX>D_MTlG47yCr4h+01# zhjtf*())MT6?oOP4iNQwebPxqkpI5mn~6eXZ=`*)cT6ZvsyG@@<_5IcerZiWQIl!? zDjK;{Afejf%B6R;UKc_h4h7t@_096X|eEvZPWcMJ;)nM9E$Ig;2Sn zd)pB>EN+)W;jo(~XyTs27rfR3FZp3nexWB;q`zh+?3n#r>X}XRSlCOyThLeT$~KqrsTW)0hmf6!mX2*9(X zhXr`8Nmx+-99IeQG%b6BMhhnzN&4!`3!MGke0)LuCnL&W3jf!bF~5;6m}!%470W;| z)=}rVZ2Z8e))ZzrjRu56_ra1hf{yBW6=psc;S!a>z72PFPY2E&fBfF=U}8Yc#BACd zy5VB^d8+=p|4mx6=Wh?TVj`7p_)LWDG8NRv(q`)cx+~Ld7#@}s4vBsQ>3H&%6@@V} z1WI`kd?0kf0E9oTgYfm=S@7ePeDPV9clPIhSIWP2#}?F4bvM7Fi>^8xHnjh@S?O>L z+|qoUYRmjx-`F{)?Ks1^BZFLE;Y9^4VA)`L^Sr7*YaM>|8S4n(5E?E#1PyR2{@pw{ zLa-s9x(*rMugitC%FSP_?{1-z(V}zFF+1z6Dd4&>)Ro_C+Wa9>eRdVMAl%~=NonuW ze`Ygi`$uW9HgFzb{x0V0!!J7vaM6e*Jm0}1w54}~v>LNvDl_gBY!a9N{D?c!%C-h` zkFcG?EA0+!uar0pnI55qaHlyH{C6$g!rgh9DqH9kN7Lwl6+Oo6UD{A7 z0rs18n#xyKR{>6c$xnqjV&XcWS5TDKhUOCBjX|>9?qcf~LzC4^AmBC*af43cf}b|o zXs*ZZMoY6<3Vqs~2lzr;GMg*5(=6q0R?-1+LMJjy9>knwB3+wt$m*ZYQVS#E zob`Uu@2Ok9m)Z1wFT3Bq26a@vc%kq_a(aVvjv!RvNnqHIc0t20VAIgx%nP@)>7kF^`ajkZjp z<*k+4xbB2R4zX<&+&snPOUvWJ+MiA0wP#HM(P%4Br zWeM5DdPc!zLh#!jxpPA62vZ7bpdF22?e^Sf*K_cJV12Qh{H#2r_%fAetL^bxM-bjAO{0VEU{Fe(j&hM{1%XigRjg#w{)s9Y!&3JF4iAc%}2 zm(KkA|DW5Z*XP97RXVn2s-@NE8@s(#YuGn%yH4TbfBNL`o7woj|3~>h$J>`t*CoX9 z;9pK>|9DoEdVBi3{}0IjN3_KS_CCHVUzcb&{!Q_$`leU6RJ{LZNyGbTC+WkNIJFnH zwD%aREfIIAp`8Ms=lsW}1i@&{-{VTeML0ep7byTmRpJRm2c29XVgj%LgeW>*cmMzJ zj5HGlg92cnSTYt2iNe8fz+8wI5(L6Q6+LTvpJ({zUOW5y=NjMFc^bH0x7OsOf%)qm zZSdd!Ez}44c0B%dcSJM%+P6&;?Y|QMy%H}E?f>4hrvtuV;uh8a<#B&kcLcVHBaQ6| zXWn_?bMoglFuXsTKm~g*{9Ot~l*`h3h_ciOwL{xI>zID+yJ}#fbqSEM!ca;qMubH= zg+QOD)~Eq4!0Q@^uHc&2D+&S)grb0;XfP%e34=nBK-e%93I&3pK&Vh6V-Sg*>*wS1 zeth%JYI9t1QkNHztkkHLnP7#+bCulj?Dk;mXE9F+P9f zgFqjl`4(FhsQVjCjbrHf!4Ouz9Jh|6qu1i>JnMF*^_&Ffit zCM2nQvg%f@=thUs`AdJtProN|x7($mvg(um%F^ohcz^!U8i$v6mt*z&ylhm>WJ)*r zd#O`vIC$r?+49}hX39Ky%cEAimebRZbiQIq%Kwci7$$mX0r09|q1MqHBnwpPvR9ks zfyS4PyD=MN+m9zTm@%$Zi8_C$eTzm6+Kj*Mzx`|j?3{{=Ch{Z}I4q`vzn0MFNn5{X zIhDH1xHlRbc9Iv+<(EBvsG`586U?MwTe#%iR zl`iqPO{ah{$YpBR+onFmT}A{T+=rW=l@;0~u+Xh)!{AzM>~*_x?j)J`I`KP^)O!<`q4bRFh76N)A1?Re{aauf3T=GjPvBo`1*qXf3{UA zW}s2rPc%={=)%|K+8|cCxP3oP`s&c)PZ96M*W_8wi~66_ZI<;_U0LPuy+?7psibVD zu2V!&h7k%H@?h1-2*W62xCG*`Dknt3q;Z6h1d;&=P*9!!_qpJVELsx<0>YrMWKb6i z1;W9QxRfpw2?YWoFo;YdXXmZ;>+=5>&iniRbk><&bLN$9x$7p}ApFdGH(7r@t4^T1 z``;t8{%#&>Ko^^l>j|NC{?GaiQ&9K^1y9y+C{OwAr$ue}h(bNOhdw0rL$h~xD$62EVWd-&R18T(c+yGO}Y?8ne zx0o7X$TUDIQ8rY84#9A+pez~;35Nk-$Y?Sa42A;Xkf2y96buD|p+Jg2Cv{%mr0b`O z`uCZ|e0rL#O~b0TO1lTnJHK5L|ITn%&>yW+?tJD)wyKZ#*>|G>d=<=gpHob3|0k{) zK!4A4+0y1Sf3<0kZ1kg=c%k+D`f0ky({}02@BXrroArU_rU@rzDWAKZ;S3kr6K9{d zMj(wr8Jr=Vzf&`)pd(O)&+?wYl2AN%3M~`6mwvHn@tg3#$EY1}g4JhPWP-K#XZs*9V}bn7|l zrf@%=uUejuO+vq}To3*Ieit_(on9g+YW8<;xQ{ibHqpCT3m^0EvpPLr16CRv6Txwy ztImB4eZIavv4Hg^Fg+yi%GoT_&1|R3Ji9S^vbBF~Eb#Sj?#D(MglBzWqtLQS4?OpR zRE0xgxclC6$LMzcE0#?^3NM=-Q!N*}k}=+v`z+nhek-z|pzfED9m1lb#$sw7!g&;G zASHEIBM;k-1Y-@$aU|l#!LMwKE6HN9_TD5Xd(ONKKbDD?&o2;qK(VMS7!wA9!=SLx zEF=pF1i?^{R3;HH1-|R8@4g91JL*)VLQ9%ttD*GjIn(3EuYP`;{uleqFXv{WOxU-! zG}*)SalZ+leY*YHK79@B^>V^XJDr{nog48l2#)NwRZiU>9_c^ka`R}GMV46XYjjKa zFVlZ3+y3Ml;jb0z1kEu#p%jq&!N2)|ibQK${`(C>+=hPrn_>JahLu1-&ZmPp-*>E~ zP82@HmW-mvb5*Hq9^&_G-d7xBXhw9L53;&pS4B|fCvIO000}^L7PS^ z|Ir=X=blH=8W8e8`GB-s-HWl?k=mW%bGq6yA|wqL^kJbj#_e|KZfvj^Ry1(VXR{B& zWB>3a$XQ1DlO)fye1TlvRpTd2r%9w@7FBV2j5(U3MZ7$NgAk0bpNv%?33 zGmRwOM^)dAiXLD-&t{{_v2Qg5=VR<`rfZCqCZu}9$pkJwpnaFt86jVe;Jhc+^j-IY z@E~?a0g+;r-}KuWNc~aO-td`5Tb$bG6|nfOW=p|~qTk8LcvwScGDE8-TJhacxaL6E zL9&7Zf?j!&oM@T`1|5(@YITg+f(2;--tZ)2z3Q&eX!CIVO72-GP6`EXfKY&atAD0Mur|L^4)%x zI)v4U8#J{3Lm6?RuZT3n2>U{`n4z^XWyjgvh)RqjA}_z5^cLcItz7=$jeEbK$JQjn zbG{q~s>CYUDj4^{B6GXua8%{O`nK_*ryNt+nXVmEpe@NTtZs|ie|ijhEbeOnK>~?j zo^#@T&yJmFEnXAw2ZQ0%I+PV{_K&pca3f*rYYmvkiODE(8(5>r1J}oO!6+YpQ&_M! z8GyVP2IoxY9MvzZ93*O`Qra}Y?>z=ITs>>#&2paYcZAXrsJM_qFo5cW&%l zm^FL$ut!KJw&fb92N##L(||EMK@iN(w4$%fq)7j5_?8b%WZT0-0`7tll_60^LgNgS z#PID>iVJO6Pl?}`zf+6%chn+XxYKmL9sh|TETTp`I}(xRi@5{$S^4fpVEN|?OXz22 zIx2L5qOX`i3l!*23bY3B6;`Z2fzp-t`J&zJ?QrSF=`_4@=L0REV$Yc;I#DfWfBcQG zfVehh_I8a6&!Gz($pr2RCSgH5n?R?rV%Pxr*%_6b{~S#v002av&EZ}Jv=CCaQG8%$ z{*vzE%Ads9;AN$pr1B4}_Fke9YNLE+YHCpIO<;9-P~v?x;83#^&he(e406_fuRUiV zjS#b%f*@&>gYS!WgSFRNnyn$pRHP9LJ_OOxFT(^u^ET3b)-t`VirxS!mzJy-lZlz4 z0CzYx0VJ~OvqZV$h(17xW-oM%b&jRYIyO=>k$0&3qf`xsvcu@59n#8vlYi#V9wL6i zu7`v#vdIYPLoKW}`^Nm9>b+@f!~Kgft5a&fykH|JpQ2;VjtH5`Q`s|sV(1cOn z-i{ILUaP4h0oy7j{&P~>EC>pHtb592nq{nrYE%)9 zi7a@K5jpzBZ)J0gLYl!NvkKAt@GRqP!Rc*imleyIN$ogHn76;sGQ`AERONw+g=Gu9 z>#m*=W1z(BA0isKLnp&RvV&5WZ753!3by||i zEW zQ;H1%%L7`WKcRmv=l$8$634(11Y&=bGv zzeW^E2epTiAMC}CfP1m4zvq-Q1v>VUA*efhB{3G_Nn--pSwu!EfWw2bbnQByU3xuy zo&60qmH-$Ak_(x05IS1f{+mv627hIoThXOQN$d33j})jbR2@`>VNJO~wG>!w)Z~w1Hsz4q!`JzgwS(U}4*o-P8LISG8M?Lp0P-cAK1~gSt-l z&q&$Ka#<5E&0H&ab-j+5fk8|DjL@Z~b5(5Ll>FSwf^+;h*%C&|bf|50OeBqGw&`0% zwR|DM4U`6W>|yBC<;87dRoY(QjpCuEQcECuzUK{c93lj3@OnS@Vom!kpD#ic|B#;Lu;cSG{i ztC#S*q-iv~qvX)c-}e5>O0vrAUpwmmFK2 zJ`9oK0sxh*Os&;pl*l`e(Afd3-U20?m+bc&rXTeA3{1_^)>T1O5EkW-X-A(eVE_-n z&D8#Wwv0DJ8$G3aWiuWTLDA&{?NA{(stP0jkqzolDRc z#<6%PUG@1JC$q%V(;uZyk*hgIP+(G|)3jv5uY+{)emDx!2#Dg(#q$m-QuvYphud1y z`2PR(7U7j|W5o8QhxTF7Ch(64lFJ?1tN@X4461v* za_kCiW!nUqyA^+E%eNfx>4Egnk!y`@Aa-g*9FcFgXGHkdyu1mVb3+t*J)gT9dP`cU z>6xAiGjZkALUL4rgYUx3_Txm2*of~ehk%rVckq9<1DHK{B5ph2-zw}SiaxohpfY)lC6yl?J z6xlaU9hEM#f$P6Hzt+kD0iDOdPw4TZE8YOM zv)QLU^GLZwc;U)pT-kP84qECwUc!SNX#A?_maun?Iw45=F_M<8VZ8Jtk{7dH4wQFN zjkQ)BKr7oWcKPDz^DfvU31@XD@dAB@Bf0t6{RR9YYfVFk)O`N(#bmWrB@T|(v-;{TI3JAzlc8=`=e0rbAo@r=bvwU9kohLeSb+?(Ot zc>Q(7@}k~arfZ+D5wDSUeeBsO*kIv2T(Mu_9BcWu<$-HEj_msZOhBqXGb8@gLDz-X+#8jrZn?gfOScB zPL-Tjb2@1T1kYTTbyTP>P6it5{+YP%;+%Rc!O#D~!30T(`DEmy=FK#qcBPB%{(1!V z;!UoA79W)lC(3g@3k(P!y@8Ft6t{rcOwDkK4;FXbC*B-A=N*oVyO@?co9Iy8=RS}8 zak}ucawJC5T45F9&R4oFQTVyK>e`&Vyq}tq$Hq#)UW87X7p&3UB6{jv`rA0o^^L%U z%MWA?pkLc6!z3ap%PG7FLl;t8JW!xl&gI;6a%oAYRBf!XD5U#w@G_!@8f~n{xqb&o za>y)SFbZ0?$2#l)D*)iF9ca4L`ZE?{otH~?l_W%D_EXMN*qmd`P->?cZ@-fJK1WjZ&wuwxUDi`3yjnG=x>=! zrA0i85H|lS0bqA9M6;6uwRYo2Xa@E^>~rtrOyR6XIVp4G4{1{yJ`7ZZVH zs41kaj-@PI^Pwz$@6?%-(05#wIDpyWo5Ao7MXl#T@Pa+IhM%Je5mZQw??v?j@6g7E z1_Wx>ul`QJUB=44h>oKvd7_krG$C>01eOAvo|Z^!fsEyGD5d{U$|(*Py1J=50yHOi zHnbdh1G}nnH}cS`xMmKmlp3ni3QmKPY_tsudsK69+>`wvTT0}Vd&oI;JE;jS{Op>z z@}0<^p|lfA4@i6O-SpGLAy&v>Tf~JA{!A}S%^zw!DR*TK#+=4PKq0`_+@YMm&@FXl zWU|Ula0Tz@==vBsRIq8j?5}K?54nA0)(F&FdRN?fTJBl?15f7hIldu;JBHT|VrdDd zbHsu!(JM{rB^rq6RZ;?k!03SPYBZT3qurqfA=!L;UL0e#F{6w2P*bOxk-S-7f=}!eVw!&9&-0WvshyFgL zW#2gHzD|)wOgXAxghJ zOAHSi8|%fCvd0p#$W>-9@+Q7=7C$}6PS7usKgi*@?xF|d@^LXWh&8?1H&SAb6ZQ+{ zfOyPlXrBmBX@Sk}VVGd2cD*q&-29t^$~|PeS=h=(XH(bOU(j3c_T-yBMJl&Tzha<9 zxHkd{QZ1@_7a>p)S^<1^n2BVUa>ElLQ48pSN8)cb;r+{Pqw)9&NFD&PZ(<53zAIHe zmN2lGUDIbwmI=5UvQss3^kvS?=tG#X z{jW#2)L%CsHLVl&2W2^oYnrv!x$D@?#yaR+nTZ@#bf*T8OTdgNj&TnyNB_=TJpp)6 zCNRXkvPN8E8+}{}zSBfepU`@4W6|q~Bh-iGA@-2x&P(Llxjy%#I-<$NfLVh#wgW~ zW<_FRxFnTel~1ZY0eIw%wTR?-BdjG-j4c%HAK!0AR1!U0!|&O>SHwOsc*}N=Ot{i% z&$zWl`%NinZ$&YkDjRe=@sf` z9VAV62v!GyQ&E#^YFzU?+b77wRQcA>Zt&^YrH0ATAg{@6YdRHJd^95lvre51&RE}a zsfct&jiB)m!y<%dy#kz`B3kn*f=fY$j%GPAAV4x-5+W-SAQa#2W=de$`~8&*S87`% z<|XVKtX5+o@K4=SQPZ-+dv_v=t+U%CpT}^a5bkohB9oXp|lN9aeD~V_HwMW%d=sXjc_f=u{UnjY_z0}+~F0NLRBAJ48 zVD3U0o(qX`90k|MJtfi_4-epCdXkX-vc(uzy!Z+>PMCV*VoQ6 zV-IDOV$A*y<(g9Mid*C7ViZxWkrO>L?0yY6H(RmOA8rQLa9^p*-~^zodWjaN9I|cE zXdFjl_v|>8EY9)!-rGY9h>`m6k=!lCpJCIIl5|a6h!}P|e)Rqgj~y*ZBDvqsvzcm@ zUF*F~{u<2NOKy1{Wb;;b4_=T3?x!#eaf22LTluB3ZpfNKPGoxR=UFeUCIKaNE<9iV zkeb3n%?UXzp{&WmOeh&_yj?zIRf@V@G;SnbEtCHEmpOo*5lR9Y*PhJZdYW>l`cj#4 znTs{&Q8~I^mp}#1*_z*kDw!O8Iu`H|eVkJ+jMf#bjEr1CrPKJUL<74Ie~>Lo1o{Oy zZf99Ctc%@0H<03K02Vh;3@NrUTyB1m!O;Vuu?=id0f$^76X90sZF$R>MA3S*bu4%B zs{yKG2}?iFx?w9LOcNg`68Jd3R$6Bvdxr#4)*i03sr+z%+7*zRy^s^&4pK#Sr|)~f3;V&HrVbQ;kxja zaa>5c_kVyJRN2mo=V;^D@kG&}-A!$Tf<|P;aI-B*JYLHa$ibNt#_i+kZnJ8X-=hNx z<&SB~B7L$CeS*o-$DBJ2>Av9FW=d{s-Ef~ip|2_wl9p+0=0Sb+`pvO64%1Top7dVu2mD8`i`gg&?t9E5j@5fV}B_rm$#TG?Myr*u|2XL9xg~V8vj|1&uw++iSACK$A>ux zv7cCRP`XuhEFUR10+$tDHx0B5DC;i;VOHEL-xQhmqNj%qJtT>&l7Va5m}pmD76PJQ zTH)7HaX<;&m+6Xx+)5I5Q%l4EGYP`R{_5Ugd%*S~OW4x@LCpPkngy9 z4SG_t6C@NajR=BdM*Ui4)`zE2FZScylCMHl%#U2RfbJ_{+G7^D2kn`J9Gcny<4LLn zwHFU)>jUB%rve8BEuMt|yN0m$1Z7|Bq9p0f>Kw&qjrb)wxr%%SKqBS~Lna8DBcy8O7N-*yhk!ABcHQT9ZFti_MTZhJf1qI$$QaS#bolu`)HOK%$PK3E2>n{WR9u+ zklk+W3RA|vSp>qJQGU=Lo;0d5<=w3aneZ;Zdp6Q5gH~Rkn-*715j@Bg`D&(?Lj3+J zhhN(-NGqP5>uTCIGRh!$pr*aJ@cnLte^_H41c__rf3TfrNP@%=mTIROX1#MgZ_FOd zUy{m`!|x@y{~Mx@#8~95wcq3#L~sqNH#^#d-fa&*q4ZmvNxFwfHu?rqH>Nt$3kh_` zg5uH5r?KHeiB~9>@5mV6FN-*HIs;n)+x3v)pH{uG7PY8Dh|k>8A%A?(cMH9y=N#8n zjXE{e(@@Lj@Fq)L3hRjo^691BItLj|;{gd-IpBq3)?RR#*HLuFc_q>KT;3WMbFwpT zxEDhhF;Y%2%11n>pY*FIZ8sx+25AUsa}E8E3Je77C>E(`omGr<=ag;j6==(CeU0?CNt~&Q{aF&$2<-S zbt%p#65Iv(YvK-2^^m*v(I#$;MztQLJ-*{6ujo<1IZp)tqc_e8s49k|40IV+3bR(_ z?OT9i1am6yLt3KV?Q<`X)FC_|ZzC6NMaVmwDxQ7-u=2uI0tGUG{dG@wKSnidg%Zq} z+$ZroJn+^bj0G|2z#)eMET0s)!=vs5>Z~C1Ebw0(!m>k5d>iQ6&VgtwLm*n0TSOTz zw9nRj&0qB+yM=p3E1m!Yt|tIY4~RPHBZj8xt+#L?H@YeE9pcT5rBYWPGTlaMWR(aa zVHUw9Kfl@Mf#GVl^`AvvW=ym&6x`G^bl(?E1y$#IpNr>{&sRSB%tr6E7oX+%I-U3% zM>&Q4BPGw~kS%lot_N-Hc7`X?Xw|3|79~MZv*>r_9;IqZJHfKb?GVtOQdJ^17D)&; z>uEz99swp47%(dh1&aZoz*sI85(UD6P@t436$%7`V-&wj_5PnXJow);k2$}^--(r} zs=S-&#x(d3pxNJvVt>=xG3(ktMC;-Z#rO7#atYl;{i zPr6`dzrY^1H{;*?7|S(|J-X=(+nzd6(~9B+^JOm^`1*1$5&%_S#$kJz;wB0C_vLzm z{vat~Fd@MtCq1%lzBpqMZe4T*x{fT)~E6%qu3B`}F! zH=iCqXY<#-`~7@+>R0RbFHLyj`Zpr#$Iw0np}u^a=hmCdAbY<@Bjl*Rrrw_U!=&`E z`JVw04|b1w3Rp?h)&&241U|OG!@5k~zsYxOf4_+v{F@X#PYyTShAyM)=Rv8AT<6E% zYnzCIXa#ni0|(2tMc;z7)8S^TvL)y<1|~}iM_@pkJHMe=Dw>FaU2zqKKrMS&KtrHd zC>aY1g#lqem@+5}1_I(?I8aU!3WUNb0GaRYf0y{@eAk=zuQk_pyS%0GQm(UBK61Oi zrdQ2N%1r|K2t7x+#L%b||EwBMzJ8`P`{mghRe#R^or-?0g5jEr2>+ylTA44bD9 zx7!gbAI5i~=>JI~*Ies63S3kCwhfw16A z8WRQr!ho@mEENfaNI?;~?sM($GwYUdm7GbN;Zcj@P;IUS8t2yZeY^8NZ>RY*&Jg{- z%Wcoq{qv(r&{N$f z0DxO`7^|mk7;_7DYuK}dW-XN?9RtM*^O{=#GMdYmg!NNssHjjgP5O)FpSE97>+LW6 zAFcjJbmP5J*Au^cs-5%$n}#JvHRy{y2F2jr-!%|oCS~m9puFLUf)!b`^Nd+7iT-IC zDJt0>$SJP#2c!!L!vSGXSWs3B355Y*z*uM&5(t7P0JqLf&G4$Ot1GSRoe5QKO-;z5 z|I4hC$>~VzKj#lGr_)33^!z#O^mKz!1dZD^e{;EizX37g_o1uTtK2(_zJBJeJ=9qF z^8dY(%2saGvJ=}PWHmpvUTvEzx5RQ8*q(EjLd(HQe&qA>-)Swq1?a%cB(h$`1IO(@ z`eDNQA3?HN-n+)@1vu9x$}O^~QdprO$Nd{(gZSj|1R2c5BKYt0843!^mQG@eft2pXWPBc)RC?Q^|be{_OX-bd@e4+3<6bh3Rau2;F4M4AxPrxD0IHAxFK{VnmIeS2TnIvg-s@BU*9^izFsLjT z3JL>3VAz;0Mhl37qCk*@h7l|0t=Av77v;YGx9hGid2+QBz9h-MA_e51Kl^{6TdMy+ zo_pKz&j-@JDgM|EsAbpMraNFsP{kkWPT451`S1(dW}Vj9$2Wi8s&dQI_M$;IXc!OI ztIBd^Qii6V9oOj z*D(1Hj)0)G&o19VBn8ErePL>%Tr{O*K?>X;&@3kn1%m;gu;54<42A#DOZYObQ1_#c%Y*VNzd)R#%7M+^^t`^mpXUxKI*X|JQG zr2p4<)xb;dAB@!D$muM3Q*{2ot&@KbLF?U{yVmYxzr5WLqtS8&bwW;o+_8bN{^|stSbJlLkg3dotS}pn5BR#^CiY27_l!Q}4 zQ4J#A1&QLhVo2H|TR=t>9<%-a{&&O+4g$e}u%JvB42FWifUzhn6bl9d!XT(bh7lXa zy(KPG%k%GE+{sGSDqPWfxX}O9{(Zlnul?EDe;HhOI-TCWkDHYpULW;r(#@B_=_@Th zBPQaj`~OE-K50}PzyI=mZ}lK_L&Gwk7)4R+VoYd@ktHN}bA8fw>RLDYWc+*ffr zF%^|q-)aJLivQ6xPyYPhl4&Hs!pf-S#2{MyT3{EvOGW1wnzaU@T+_1VTX)m{;@Htv!5t^SqZcSrsZ1HFH&UDrkJmd39cYMsigAl{Tu`6)>Vi>`~S?HC`?#?uWzx5dtpPvUhmd2QEB~s*(cM( zc22KP$??l(QhRr93uwQo-OFrmGFw_mRRHf1{;y{w#w8>J6)cRPyaH~ zXk!9y-!7?>;XCKeUgD{Fc8x@HV6*@@12=n*WKVlx>9AH!JQ05{Y>_ulXk+(iCYxf= zE1tZ!N(l%T6InTHl{^5EV-JVpV5j0slBZ1V2rw;n`?C&|+6zxml!=~iD6rviC;SF9 zSXD>ScWmHRE7?ROXkXjS2!BuIZc<;SlnO72<+I&BM!EA|*|FYQANv9@&Apc}Po3(q zN(}>e15()y8H$5~BGOCT@Q1xDxs@r?dSO*YOtwmwoUMdj?Jk#99ch2{2CjcC}C}vC!)@Z>9D-=kI+*6w&zyQGbAnPlOVQno+dnIiV8g%6kn74 zdUcdD+mh{4I}RtNKCfwEZm`!c)3a%RZ`OBNaX`(ieO~TW&r}*9Vw^*+1q5+b__rf+ zhg(2YF- zBo)+PU^!SDvi4Un<GOLAf1?ZO%0ZO%{7g*`Jlsmfo zrk8gipiG&DpuiqA6k;6IF=YQfoji;mECPaDD!e6a5%WxGEe5Zhm6`O@9*?`B$F1rY zN%9n$KXkp7NQsc5A*gc=9&xDG^dxfIl1BCLFgP^Yd&L6=v|8C*yhNIMJZY5FGQq5N z<4Plh^Rh{B!N30RMf~kM_=LOGgSpVZ|4i;L(Xd8$ztu!5P0B+(EWBiHC(aV?l8Xe` z?}n>-#^Bj#Fm{Iz-3@YZ=f&oJRc`S$Y6r9CXmJnChecP!1=M0=X29f8jwvAU_cc6y zsH%YdS?b{o{Wclx^B|&FSJwGJbX+6nKwg_ZslmpP${+-Y1jCscZu=+jkF@|gCzRqlVr&zhg_Y!xQvnpSC%hBEJTGObUgZU-<+lN^H@gbSaBB-D&E?% zHaAwvt4dH8hg<({EQ!i7w9l3G1PttXN*B%M&qP`@vJ9c-W~^dDkS0PAm4FUa+{;QN z31duS?MbP0;x`xS0#$CixSlhL;%W|)kGnLB6Sur{=xX#F-FCF-!tocNSre>y=dYXQA7JGI*90+!)=_YRT@ZAPCFIRF4}ky zGf_{rv>uIG>x4(JyB#xth%mCgi4Yc}IO?L}Ti!OQYvV_jMZB9ru4yudIGi7Y-7uZJ z*j{h=RPC*A8B?_1-@p*aAEzfQ)zN>oz~6gvK^03dVjrS!z9t0)HG=wo)?#RDDC5Yg zYIWIIzE=Dz_dm9=Rp-k_x*_hb$6O7rz2i2t!WT~r-OBG6O&=`+Ltkaq#@`XRksKbc z3w~eD7x=8T&8nj}Qv}_)X){ledUXR6A>o(n#jW;+8l?)G>~>Fo^?8y1v2u|o_a`C_ zpZaeSU7ymv%e+g^#+h$9VW`!Pw#9$(_F~!c{wZzvWO%QEh8IHy#Vq(eMyo&)b#IW~ z(`el{M&%OHdpu;63L(oN#Sh?%a;-~ka-FNEDsm2_wfY)eXv>YiT>%PaBBZ5O4f;1t z09x;}c2JMiC_l5|dLfjomTek6C1Ji&JR3pl)vUX3U&z{a3ynp=)J{MJMhyB&PNBa) zk2~Ul{%GR!|3GK1)pAp}_I4VBzry^@G!;pf=*RJfnl0n9Bz|iHpxJ%Qs$?Qb5tKI+ zzyf{m^jduPw?FoeASS>DIqbHE~jdid(rSctowPXuA#OAANRghUI=D) z!ZXoG?Vp4TP=&K#^m8(}L!sf>Lvi+$L69Sl20`TQ%^q*6Y?Q(@KS76`g z{$^?l?<)&)5}afa^W;rM_QIXEpFoRntT9$M>N#xTy^k&C8Y{xz-bnLi$U0b=TD2hp zw9P+AUPt0hP6I^O6|-+w? z2qExJ?lMFx$yV4M9M;%lQA0<)hGYl7b*B_!CC@)dB(J1kqT!~b-)g7<{o&F(VySR( zMf{$+#@8T&V4!=C46R9q)8o4~f6&_cwKgh(jqnjQB8<*}2uBmUo;bJn>XN$$avaBw z&L4$O)pTG*3}41mQ>jc^0m7jy6LBJj_!ay9@Vw?;9S^4eaz4qPAvx)_-z_@hio@dJ zePXh6r8RbQX|ltkT;%Nh6Sr)kKH9(o ze3-T>t5m~uR}I3VsnB*#C63Royg68}x}O2=J;eC-&v6HNz*1(HzX+TB3Vu^a87v5^ z=)QBGX<zCMuI-f)!Oa`v-zx&T^3h)QDg(8^0KeHccCNiDZd~;7G8q`n8sySPC1m7g}>-sQh zgim(TyspVI?Is?;HTbTJZAu!=R|>)c2ke>=G_(sK8?B>Wz>0}yCI23Jaah7O5a zFtRAmSy$TVc;CSGk4ec!OSyCh(OX?h>f{hJCWT#xuzc`L&!PgfpcV;cWi7%&RW)48 zyM*+pbE*3Gxy7nY=gkQ;aT7G9Sh=)nfZ|;ceJ2<27Aad z>X(ryZ7K!kH7Og;*RQ5 zxb#p4%_4;n{ZmOigXci z`DTP9#Kb!O;inosjJyxBVwzfszf)SF8^R81-lqUU^+hx7jsi5$oh}djp<`~X{XQxK5nqaSBeH0h*rgTh3(^7|9-fHxBAWFOZIW5O83`V~JgF5jm z>sO@9=`i2#{5;6Q6mJ*@D?dm`!_I$q{craq%;_DW1xIsazF6Yd^XX2Uv4$&K5-3&Z z7dC;I(?Tr9?uk=0I_ZyhLkqnn*F#Przsg|iYq49%k1QV%-XHn6G{F~h**|4oEhiaO z!a=~W)A|ju0`%(}=%nLy&Z*vUa{y~b2I*)F5XDdlR(}r;U|Ge$k3Q*yDoG|#*qrh4 zLykV{F$JFq;Nsb=^u7Jb@pq8#9}CQX9u&+~)Ya*hRGa;p%p9$ce_9cu2KGf;UUhIR^(p>QPk$E5lpTrqZg_uRya zE6e}_0_T?(x4@WJ-P(^<8S`ad`vJ;;J8m$XgaqK=nKfDN^mw0};-0fW7&8Xu6BspGAr?JcAC%03)#{C-r2hvdvG`kz^9XsB*Ey>BG>g!L-`frO zJqO6%WL8p*k^=p>>n8RjaQ#V_32W3FR+$FmqL=<2kPZspi7%-5Q46!W-9Q;qjLJF_ zY(WIAcaZraq0-h43=?ae?)5!MSyQ&=^V!*S5&u!)=BYs5Q9E94Ks08q-2cyM%gAzd zE)bK`rlg)*74!1xL!cuaK76iGXaOXl&mTcxVeq3)wkBo~-$I4GMSC5Kl1U-;A94wD z42I^0(sCmOUwxGnSXR`k*hfm&t0Jk9omXZi2B=5l1Vf!iLVOAn`P7H4TDV>{J%`WhwgbwCRAmXV4*72{hNV>kriGckTcrD(Oz)a+$5(Wnk#*kzau zBss}&j;tr3Ic?PXTWJ}Oz#x7kR2EqA4JW#v(InR|$(Iv97c|M^paI%N-%7*p{>FIs zpgYJFF#h5*+J|!?o$p2cBZXJCMiCj__j^&5Bc+l5w7#MtM)DQ0czTwi=*TkoN?Cx! ze*_*c^S>lT=kV^80FBOFc&~9DJZbtY16pFeF8M?bPgx?9rVSpy9ntoU)2mCpVa} z5Mvjc=wD>KE$I1}0?Mp*5s?IW=W>@kh$Ng0N^Htvc4F85aduM!bI z58N2vBojxK8M^2LWT>K)Zg%DwK_8sKVkJTDK);5He<#1f+TIoHmD3pwX(P3oN zk9w`9-f;LyuRuRO>fU%-qhZh0p#F@BqxhOTg4%GkGF95dJ&=R8`tUMR`=hULlw}Q?XE;>VbB6gJdKc_yk$A)f<>G9lk7SX$qJ^=LOSu|tbaF7Tbe;W=s}{OdNWlM zZ!slKf{fR1aJkh3)&eMg=|~lrYxP(1u57GcnVWtdXOj4P_zz;*?=|mE*TNXum+FY? zkT-8V&R=+FT$^=v7D|dIzE9e_PNrnXjw4QZUiDCfj0A`%fK@#6)FfTg*t^Ba9w zX|eFDrxiM^yUJ11uDV}xHMDQ_)Oo8#+Zw{Az~TM@z)8GBwc3uw9i23pJvUd!*b-U5 zfFjz{aGA@qUQhqBF)+wAYjQAio2(534;aZFS?s>|us0&u>OrSNR+G*H>3h@wjZ@fs z?ZNfT`t?fP$j?_ZW0?Q9+YY-XxS1JA>Q@^C+Lc6MBob+lmhdtey)YMTvl;K%H59d! zpo#^&xx+>kU$%?jWU&@>hb3ou19uNgtq0`}8McefOAUb;P?<+izvw(GhzKRJopYD` zP6^6VL~z~sqMnXxK0~wY$qeZ$?)QdlM^De5j-M$#Nvaa6$UxH2A^YUzAx7hJ?cE*B z^;C_T=KMV%oq*F0O}G1qt9f_!t-OvfciH(TEpOmYb@+JL;xrq#Y*iY{b0edB#2RKQ zEu&7a?^ViYn3lLA{XnX@fs=@r)lf&O!KG$8tWguBZB30Q9yt8#?0Y6Mk+!iW>;elG zNo!bg4kL>&2A&F!k;C+9e%$wq-gqU2S?P z?d9YzOL@N8gY9~Qb@<-%+cPz;G8A+fH+z-&|E~QN3w%u94wbB zAB?wJu(?+@LdXhGF+ZyE5+5YWbFmH%eGDJpu-m}7zueKVuV_2y3r`x%v z$caU9-UZ!$+WJZ-v04nO*L2Ccr*lkGg}Udyx;49xW5*zY=n24yKmoJYY*zJEJQxdE z*RRWrAEpNv2#tS!kpmo!$zucs=0Fo4BhcfS3aC7;^s>K}UD)fH!`=EHou#I7j&^S- zXq|qj(auzgqxPj%MU7I9Z4UDvKSR(S%5m2KIN`WZ^>o&}y4563t1e56;MxJoWG8!k zF^t`;P2v*b_?Et2va}DMprxZ_9xqDi!E5Ic=2)%xriEHFqP(0{@rD1}8#xl3v~@^9 zwBByPn*k<7YS`*W7?2Ox5|U#Isk(_QF$43uYVp8~OZ`hGRTvR1P6F6()+zaN71Bka ztUH~MpCSGHaicpgMnf=s7XUbNpJPP83YF8snZ+oQvrGIR*P(u!@HP#_z^o<{REi(7 zHyUh8F@}qZ-Jj@}d_5=z1VTEX}jiyTy z*Wnx8#X?9Nyc(Ydcoiof+k`{O$KU2Whrf8w8}6Y1C%Td?e22A9C+qEGDi`jma>zyX zfZ~fC>F=qdp@b>fKGVwiiW?yCw9-#BVF^LYo%*X0Yl$Ma~ z>Id9Kc}ZSQ^()v%&j*X3-fl~=Kj{V;bGG)T^iadqa(1V&-1Rj~)6YxCTs$Q54#(%N zOvv(S@FtDxZriGQ+TAro=1;gD8=lPl#|LqfvfwcRiN6m;8}m~6Ph_CUuP*BjKD@VpmwXar=o|0WwwiK&qwbN?fF@bRVU%NMX;B3Yd}5y)|BG3 ziP|c-)AUh{1I$U5berY57@Vf`JnPN7Dv^~7>XPl3DbvS)vc@j(;aO_%%Zr#Z1^V4c z;?9?gW7DIP|Cb>n!$I+4Rek{LTeV6dMTMS_Pxod(@B^VySxJMeSaaFu=EX5}>Avmp zzb!4xfg+TqI-*Jr(cy`lyw%qOI-AiMu|1;1*UUa>AhnMS)kB+t9c+6}aLwtGzEcDg zdBg|9#*r1c@zc~>o5HFGkqq%WhD{cC3ZzOeXCU#bODTBaG=9Iozx>;w-g^tPr|Efk z-E5`O6gLP}6dd?bI8R?}S_tPro2V~qV!UUBk=-UABMZ!qt?Q&Sv z;!`M_T-gcLgK5h(03G1EVoi0~_eAtLpyctn*!4|{x$ia2cW*}`kw-AYUsM2G13!y4 z1?q{!8kjcfwsG?VQ*s@XgxC1u44AJIl5ExN1Aq=Jx|<*Al>$*5&O6YSawq7l?U3gr zc{a)<-9sxGBJf8?l}*|H!sbm>m_`?#Gx5EKWKE_`WuwN(U7hQipdshMK$yfV}&6X+`@?-@7u%R$L zm56K^NHziFdIxHvVIsy0%$a!cq2@a#1`Ig7?k`_M0+ijoOdtCy$-97^@{k@>?p4ye zO4|8jaiaZEOsLz*sJs*nX>7t79)s;uek=WxTKR9_I08SzWgmbbV9lQn@Kj91v=Rxw zri*_x=gWxT7w*m9p3&LCtTwf5B!EANjg4-))2&NGz|0rh<^)ndlbY2vogc%26YVcj z&Qut#@@KfkI!rs{UsHKx%lN*df&cZeSGnKp^ur8CqiLBPc(|ymX`~&ReFZ4Yk4NQ>5#hcIDUW; zo~~f4@guDtJ#r*hOD}$!v$6C`<4*7+I|5kzAj|Lg;64f;+M1sAN)hx6*wI@CQs4nB z6c{u_3k1S}FrZkD77B#Ifl!!GL?Z~b{XV|m>FcT2J@(`4*1fpDnIyZ*&NGT$ajgt@ zI`AC1=LhUwT-X0r-}(>U{)_4V!tC-$U0&N~)8GPxo_{nilc3z__|{*WAK1m|%EUfb z@jFTw>GO-CtzFPx-f#a~KtJ5(voC){d@&l~bu_Z&M5_%$c3E5z1#IC^RfrY176la( z1;~~r1R+7ocRlZ~gg~%RY#R*)!hvB(P&OtLg@WOLxL7DA5eQWMK0HbJ{(j!t@4v^| zy1et@B%@lXd+VMe55}LT|8M{QDNm8So#eSL`hL5~sN5K9mGfJ7eYgLR0lcxkL;&|g zO9bHG#KLdg)`hgo`}M?}+Cr8yLF}`^8RbRg7>h)q0Q-$0DV@9fWLoR+*oq)<(E?ZQ zX8>XvDuEtnnb%>KFu8YBLwuhZ_bPt1Li-VL+%X z8WIJC0$|8!GA9cK!l7XxSV$rWsqXRo*X;JUcdq*JI_uXPxMr^AXBBDe3wi&&@ap~T zK_vf^ec0D_{(;Jw!}vo3g)z5i3GkAZ9|5eoN+M*d84PMc>xyQC{=235S=m^kdX(XEjw7T5+>Eth=^63A*dV_-h!|qaBpx zK(@ECe)JyuZJHGG#4#sv_o7k3`nibW>N3P7mj%HqZGL=3lyq$trWE)uJg4= zDViIffxh;#PM@}*J)mH07z+l1!+_9WEGP>a0>wa(P$UsB1@BkCJoCh+M!Dd<%DlY0 zTuE0$_0e)`v$fLv-80MW%ecXRzpqwbk1u7C!>Q9d*=rJ57|QQo&EA3j<}%i01ScbvbC1LFWk`y36K2h&}`M8Zj7Fh;qWGD@*!S&~@brl;PO) z1xzR|{VP7pUQwcvt*wF@DeDuDgpRX3@3LWoAOZl60UQ(a7UsqOvE?EHduR!+qA~j<8UcRZcC57ee(F}= z{7h-p>OfIsan$I!gM#U)_35H|RfTLovHNv0NrpJ-MUqAe?=y?nIg-6FW9fBySH0{h zn=83I^oe6;0Jq-|l7fpu0qmf80ay!?-UKrag8^XBU`Q4X1_Hs5z?>{83WWl}L8wqd zr;m^0{QUgS=eKi?eZF|sy>O{2O;yT>d;<5ElgoYw!|nE*<`>U0H(jbfF?#fP2=8}W z4yrV7uAy4W{%gZfnDT!RF1KR8=K{Sa@%jy1tB-8bw8r0uL0&|B-`v&+zWO}e7=u#u zEOl3IGfJFQeLeo2C2#gb*59TVoMRoN5@|X$PfwRn!fRKKG(OhKTSCe!df-xPw!&O2 zLJSz95)xAeVNUx-%o8q@E?l8-BMJ|*{{NjnnGfw16IHZ%!>fngxTWDz66viEs% z_dNTxTBNC$O-EI^q=9=+*=!+`quKv9dRO-~7X18-z0cMD_Hfhv1*WSWOxk+10iCXS zzrspPRGxa`9=}ee*WCf-^cU)nxbYe49a3t#PQ^S5p9)%gR#x6%^urmXYD*ttIHU<- z!Za|Z?amZ-X3RUU7WmfT-t#(XqC2X8l#)!Q??knj@9x_Ard~)k9v8_(ETwX`dpA$* zs;MnNe^|mg!>=57XSo7L<+q-T_A*RZM=VT*K9N;I4t8Oz7PMCH{J?o*P@pUr3kHJ1 zpukv=79s_LgCL2(FS3(gKU+7dW$K}k3%Owfg{Avp=JR(`{(Piw+_{~v+{5~++gwuV z`RCZ5+19K3c4?E3OFMNHVxMG_eV-3Z#lO+nf0x2bYubIe52kEVy3>Lk32F?evc7uf zszieygswiatoMPq5fv zhKH3K+@&TQBH+uuRd}HgjMtQxm9eKR6x5_6IIVYkO(fyZmsXOC)a-=PwKFL4`E!GOkPAU&--2f+9pmswR?{ zF3*0c%p~@a3~_R}->2m=PCdcrsc6Kg+Qdi8K+BVucgVVNLc*=Ha&aIomMLlyqb-Yf z;tkVw3?)jO?BD^`2emX^8EDbzI*A!^4h91OK>z!?NX^xR5kiMRr4Y9Nw@ewv%Wq%y zr+fY*@fZla+AxrjF1BJ%)nH8?s7g`jm!o*sJ#wb`@!Bi-JtY@;WHkDjjb9~UK-K9K zHLv8%Whs^QSvWQg`);?~;Nc0nPZKtkVDpisdB!#??j<;$>K&9}as&ySqM5>6h?nHw zB57I^>O3*e)|vpFvQbz-pdW@-;5#JjjUNMP9dsr&g}6X<0MGOnan{v<`(jTZT`}u` zCgG!gR2Gp@-wxhi^A^!{lv_b1>DR}O1ifguiIzqRC7D5s*Ir%U4~uay#6J`tmn_Dhab=U!UcB4=`5 z{FD?T%%iV`c6c?|?P3fv+fPjY!an$=vjErLv>mwFAj-?tj35UnSNv&;QS6#ZVl)&VI_{}L5CPi7!R*pbKxJ1Zc!cqBGh@ZCd(q8Ctl19AvbQX2s5K`qKW?_A+$br7SbV4KKknAc)8H%)9uz@4JiW6t>a9;R7^y`yK%I%+?Sj5Jr}k zFKSOgmdAeWNJ1}LF;lOaeIKx~+{LWUXWHu%YJv^~%8npB()fM{8fe0H#aDl`ncy)b zLc&vt5#^iRhIo9ZLnP-IGr78mfc0+vWcK@a&LBbIR^=pe;i?pz5J;^*Nz9uQ>ESA} zpmjQ=8+}!I);oKe$MT~0j%!p|DQ`+O0`R$F1Ig6x$D^#*%A*u1b-ZhRcD1=0dy7Z2 z{8kEXP*IZ%40VX6_4U@En1vwU|L3eUr}T z2(>N=Tr}i_a`kFk7v-h$DNoP(nS?trQ>_)F#*4y@Y{MtGNN#>^!<426G5ASRpH8(UhTj!fZ85hg+!S%aZx&H@DHeuhWK5ebEr-%9ppvuZ zb_P_awJVIu{C^pBb6rxz*5|~9pDL~U~C5)+0 z5^ui)Ev@+LLQtFCUce+*YQOIGH>R`WdlV42Nc8uBNZp8igwKjflKI#oQ?_80W_|3i@9E%2x3y$Vt*;q-X_#y1IOM*)xph=)N7Sc2C-F zx&;s8Nc3GF-Q_qO^ZNW1t-IQez7LP7BWHB-5yTJ?9m>8+cxm8wnQ<_NYx+9x6g)wj; zr>#Zn+3V+Qv@_y;j1ry~oeI9ys>7`#7Fg z#+OwUbQpT5dIQGv;z`_bxx(JqHHDlV0yto=SvWGS2%h#i$<}uG(nZ~sX4Sh|fOXU5Fb6+Z#ZG8| zHeI10vn07QOs@tRM*+m`^lakG2-ZQrV!^CZg_ug3@s;j` z4Mw-^s>8E@j8gsc5{zZ_i{R_kOfr3Diz3e+;bFdgGpOAZev!Xjran>*Ryblwx9N91 z4khV0vXzSUs1AXR6 zx#3D<>|7(T$=M@1wszN7%8+5S4aZ9r$f?6FDq2HtYF4ixl~hiG=WT}CIjAO%N4UCp;U3s2`37**qOCp@c z=Bk!C*du4~y6F?dAQ{ol)}$hpl%pCLi`^>tg?wj> z6>>iLW(3^-HsAW6`84DCnp0&ZxHE{I}RRbO~Kd-j@pN^WR62uxLZ!MdR%}K z#)Y+NaIm*s7==Y{e0k%FNZnSa={O3kRI#`d_UNP>_vp}HS5$K!HU6wU%sWjeyB5kc zE2_L>!O-O1E3(aiHFEEAOI0DN)xPZpKhW}{0}{nky49y>_PL*Ow77p_r`^pENcPR4 zOc~#7X-XM@5BZBvQT7^}eQ0G!_11)@xptIAq-K+>%Om|tqDg1Q2H&fm^;3GlTRP6g)Zte6|PmylLYb$Zz{-wn~`xDhYW4WN<8YRC1B#_siIDk zYlE4iuC7QQiTXDbm&+F@Uh*u93NE(HLyw;+q6?Lv1vg}mm_8yT1Z>%r(P+aGG!(x| zOBn!4#cyQNxZD8=iZ=M=3o6TRESfKCV}!e%dv*)myBTF0iSPQ#rZPUjdqunpUD|(= zL+=3MXHKh^+Q2D?bxyZvu^}U!I$@l27i){Q5K~+yHcYw;!LI=Il~Q=NOKwS^0-Y@O z_~;4HEvnI`F?y`3tLIz)lHZb#%;0i9%hAGIAczYVL+*TsoSN~F^(hyA&;OoWxNCG- zEx2OPH7bXS(Vg{q=?CAPRb`ju&-wA2Q|AWtB&aED=*N#D9!RgKZZf0DK{|Ihrd9uO zW?dN&kLVa%4c*P+qjKQ(?<@&b$N`z=X-Nw4ySWvw8S`AgnI253ko|m z{al{NzM4)&wF@7A^VmgO=3=Y6PB+4*%}5*mW9fgz_? z5TzX`Dz=Ry&cMmd#@PUmyI1760Vd7Uk>1FNX*}V`u+PW0FKBBPeZPq;s<@Y)0BS|~ zW;n`CLGp1TDIOih3r5UMyotkXe+mXIcc-f)itI>M-1az~)Yc)iFPMQ*_NvT6Ztt;w zpob8sP+~|!WA45BY+dB2A&Df|4W?hztqbb+nXvrZaXim~p+waKzWK_(ev!q9ptPH} zPBD&4#X|lVy3_x8SM%*y6t=;)0G?3BBnngYb*_x9mP>~uH<&NVBlSCcP*?Wmr>3_r z8LJRn8s025E&kF7*i@{vLik&sFS4RH4RWz6MZ8nj5tA?A`6&#rKGPo9G%I@+kX90X+Vz8e0&x>Vo^nRDJtPS|DxrfSG!HDbo8NeN8rqR&o=3Zlhc zEfWAd90{HXm1PHxR$m^Iwotf5$4$>ZK{(Ec;QXVVVhTT;Cf~5WS6xSRg}Ub@5^R9_ z$6~d3@)W|SZBaY#tRNDRfZt~8pFe*bfVDmUGr71Df_^kA2(+vumAb=^{7)Cy@e2PX z^lnZcGuxe-yWRrjgSKy-RmdB@igl)6kHabwIEbK5_NjS{Ax6kHbqh5#if~9keSouE zD7msP*9NLm_N;qBt$w8PXoVTll{sha6~al>WNh24_NO4cZatf$VtQmakA~2c!0_GO zs$>Nml+}RrJ_{&MKuLAUGKMN{;{>w_9U_|)G{z3FU85mKdF}w)2*|vB&@Q(a7WoQA z3bu{cAo-a&{n`qSqpFxyVyI;@TVZ-*aADOT4or2{Q% zq1Er?Dld@G^J;=EhKr-g9dndS`M5znjw@mn6951wYD-|#lh_h3z__O1vq&z{zrx&9 z-H+3aQPrgW-?%FI-B}m9j&xkmGPUExQW&=VcxOcLmj?;a*)~iRs)33(H*W`vmZjC& zqnI6~YWILr=~q}!7+J{|9AP-5oTP2mxP(|`(_Qr~@Xv~8f82Nxrig*&|Gmn#z!7)4 z7PHqsAy=yO-?zqiO*Lq-UPM@{$jReT^65fGwA%6_W=cSVGRbdEk-rni!Mv!W}WJx@DK_X>TAs5 z17lRBc1KG|CYF1H3Eok zs?IgpiTPF<b^ zO1z@@ePO7L@wqRGJmFbR=Z-~Uh@}j|J_}SlI}Og=S# zsfnAw*mdTOk?T}k@RVuUdp=lri*SNrmQD`d7ka})0_CW%;{hGiu1ye%B-Cr<=L?X> zCnK`YiJNc~!n3P}`1Kd9mjCq`#seO;Yg?Lj(Emg{pVC|DQh`_ICi1fPKjy*metU4C zE*D4(c>C>nsen9EkE*kh(yP|)KaPa0{pTi#M5KagDd!wjK?TSYV|qUA)wSPF>rbkl zEIjZv4CsPjU(ze|St@hPOfKvbh+#&eiB3-)pmHwN!eJ-B!+cq+W8QC$ep53NfZppJ zW=1R+z1T=Sc8>9)Yd@5cm2%YpU*f?I7jPvl%QI%g&3_JD9DZ1Dz; zxfl2=p{(SxvYciLeoSUwwbvt%D)-F9i01MNJn;Y`mw}J0v}Sat3JN*c<(YTF1R&*Mx$2+0 z7rlZ5w0CiK)skvQ#OP(LED^{*UDni+aIxn6-uE|7BQPaiqywcZ^%cMGUTU*r%M-J= z&8hNlyGTckzy3&XthajejxSFkQ2{NBx@G=nrg4TGf{VOXH;SMpw_`M5rDH-Q~34~q=BCWzM^k4#@j^RV83hCy(^6~KHZ6Cr!r1z z61pQe3*`g{1T50pc&PWOqgi#h`I-Q%t}cXpA|Z?Mf6u2Vcz=)V!F|h+h`L&*xJC_! zOR@C%*&*7g15;3xR~+>y*Be=HpPcR_JuW8b4byNc90gGHpRPNovW;&7FhRJg=z}2Pwj&T*wUHVHG6hfF>+o|~Ki?4fiU>5v`1KM7> zI1W;(s^I>#>Dv8p&fx8(s%I&Qo#N}|mJ#Ad7E%iR^Ue10Mr4D1?!?Oa=fE+W$xIvk zMJBrdPTCc|rs^f`EO-8)kPj9ND*6qf1DQO=sYd#&l@4(l@7Msvhr9qYM=%a%gX@KN z!|@Y~MasM9M>cVmj-0vIFwuR%YcYDT>TqjWI)EX%0SW2xdesh;s~Yr9lpNJb1?$Pz zzu*c)77{CNg0uWooC)+acbEhTMmCZH=?|XzG0n0S7t?_lhTVTHQZ^eBog-05FI=B| zQ0KshtKp*SS#aK>{|#Dx(z|jfeCQq}??pU>K*sp*(Qd|uwFt4USR%@u!W0wZLI|8a zpaS48eet9knT1*okr9T$ifK6o?DwQT;sv3&;R=k%R3k!1k62!dXp zaxQa2<8z}uSMrKwys*x{bcYE3|Aqj+{A~$Q5j1#(LaeY8iP3uR1D0d@P0!J0SEID{ z5=45UGFG7jsDdk0ypQ_igC1Yq+T+Uya=^+-C4&Cq;)Xmw6sVU8_#LlSqWM#|xX5(`pPby`2d6=-v8SRdcbQ7iNlON5qkn+^u(H@~y3kl|p zV$@NznQ@yQcT`oHDcc^IcVH{!g7|u4=2@=`BO!MqQ*oxt0>QFDsv0@f#1X@;?G!DCc*`;lKWx_Z5IzGVv_uVx$Uq)4&yER zAHSI5k5{5VngP0q>E*cFq@n{tlWi4M&bdk#qn67bDNYS@r)7}9IYQ5rw=ak`%PNl? zmfQpIWT_CP*gJzxCs%N`T+q9L&;Tx`Is~6>!i(tS|U1aK)EWS5xV#)=UZm!|v>0o=s>yweSOomP+4+1(B zPkV5mbgf?w{ra9ct;*{}!e(~xO2dCQRxSp&u>!b*Ddq@MI@UG1oTflxRLGRjt$3GE zV(U@3?|GhbQ3j^C<4d95<}>yn`Tvnd8=3W7EW@FKon%O+m@ zR-^gD9*a@}6!+SDH9+1*b7j9QgMipJ(2mhM9y2l_u2Li=H6)s5a8Fc`Z<4@@b9`pfqv1-cv_Zu!Uszdc88A0uX>ODG)` z4GEoDs^neT_mNT1R!G$>!cp#19FZ@8d4FYhsfbKw3SWE3aPDfj`r&BQ0N?#d8%cZz z-+ZT_Fe)b{Q%MuXOm!!DV_k%+L+DLO=T3zCo=rZQj)?WwXUN4%Hj6w@VioQ;|En>f zan-^Lqq7N@anTg@HhLBt;CRJ(0(Cc;j)%ry@oXuy;us_-A|QdRFlxi}1&Pxk)n;}%*D0S-xm*hvC1WJD{kTrG~%tnbS<3^BnL zD5c!Q?<-mZVExB`tOwq|!6JQ4Nla{?Cb|}j+YbLe9~f(7cQeeIba&cBgyVeV9w_vT z*r>zY5uqyv$g$+5F^@p29JDzu;1>x2N!bfccZ!~EBgW73UjinJ`L%9Rz9PnIP`e@A zgv9MK6Gl!|&_rriX%pL@xl}0F4@$^31Iu&>(Bm(G4i|=M$-r-*b-%TmV1L z{v?cKy2$N8c1kyPwqN5gZjzVY4&d`0QralyqsatZNf3tbYNzp@IuH4hq~M1-PdY-~`98`EbVU!;Pmd zz!yee+ZoAl*PMkdr$TT@I_;T>z#^k8@Pg5J*B9ch=OY1Vr?B4VxK~KQXN+%s-6mCR zF0|7sY*6n92zm*o=y#hZ|SR@3zjr z4O{dD35N+#M1I12Whc;+0pkK@@Li-#EX`wAyD*YzW>HiUHn*MDsgwOh z#?hW`JH?m?VLyfd2nycp8a<5bkGWz8=|sHSeXQ~plwFBRk9=;N`a;D3U6$qqt2jWm zK-J8YH=2N6UK!G+r76`;Ws!M)|!Q6MH9~C@oeWI(=$7}h&FAy}- z%N`dd8-!Xh>?P%N@`vk5j>|g|oD~bp>?N!&if{exqxC6;;184V6qz$POj3-*fKYnC z$z{+0V+q&s72}F<`7t$B-A~bZH>PP#67}vTdUYSuq+R_~eF~6xyeaXuDoD|g#5=u0M2jG4 z?{ixFY8=Qh_AyAvO;~NZ(^89^vkA02ls|gKfi!Yd9t#B~RI(z9dq77pXfQSn1_Hx? zu%s{=3x)#0kg!}V6cYr3fl&%u>&KUix2HBaOj?aSJ5@?&nsAwfeZrC&v zPDMg$G`{K289iUV=@TRSg)CIo>M_>IM{?>Bjpi2C0T@ts{W5 zDhn0_!a%T4WD!Hhx4fyBQ(WBTsgeZT)~*tw#BzP_qaI)Hjv0kW)!gvAcz(MG^COcg z|LLd8>eb=rj%+Rm_a1qOA{(i~fVR44n;kRFVRP!vYyN(3f9q|29eVA<-F&E(`O{jS6{v;*L_diql z#n?0sKpLoad4wO}X{}a6I#|m^{jn~xbIiP46X?KInUGr}PlAMzh5uw;&GFAAi*?)w z#0wS!L1DmbEEppi0>MDAP$U!y1W@m3HF-)>hM5;CehrVbw$huFZ)jE;d>*;vamPUhR8Rf@#i~ zHCo-J)kph}5G3P-`O@$oNqg?sz|mM_B16lRNs3A<_v2Ghh6c9Qc4Ih%%PG9MtiF@zY@t&Ri>HL4qlCkTE1kQPF>IKrSAxEv`gl=MP zeT`-xk1pci1pKfDBJ+2Hnpwm|d5h1WZFNznJaJTyLJI@F zF41dfx|g>IBW9Ha0-`{u%pxNgjKU&%lC`~jW%D@iuN-O4uQgXU!dDq8IvBo><(e0jU;jIHQhfZS z{Ke>gTl9C%&J;hNXO`zQzksmAxb@`|@{1VQRv3C;hvCJ_)FS!tyT~tZ{AFSvO)Bp5 z&L=Obrd*3EaTU@ouPTZAf2weVl5)ADBIdo0pA=2!NzA@FMQYwF22<8()Jxa(X2&ET zOlX)!CQ)I0ozS9k3rGSop#Izcr~ke%U@RyL27>}%z*sOA4GoP!V4zq?K{9FMQrD-TtMp4?Qo^^xy))JI8UB z{(m_v^6b)m)pt+7FP$x=`E`WeUIW7|N%HtKPj>q{9NoALp0n<9VH9n`CkNv)+@CL% za$;xxf59~lpzQf?gv-6!`RAH?Y1qwM@}{&%Nwe$TO_*l+{X^Y5%_s@aB^5ETJqvO1 zCS zH?xYOV`IYmShdAj)AI#XoIlS)H9;)eEUkls|cWpA&T ziKdMOKv32>5BEAS1e%`@JvtQJZX$tfM{Z)UT!xBBho0rn0-7H^SxT+Z5ui#l1HB%! zD4CH~(axvHu<;-D5^EgmdnX12d!jWtcG2T644{oQ^%^f>jejk0XmVjx+Ra_5nvZmQ zv=U@yQ|s-J3d#-4W#(y>ALrmylGL|Lll@2@fy8U>(avJIO|he%Ewsag4pFe^CfE#= zFS)X&emDieNp2+8KjD~{yXUO=D^w;0_orK9W!I;&yR#OvmfYcjv}w_1E=TU~LgvV< zyNGPyd@WX1W+DHj(v=gJaJlhc=lJ3cdLrEVELj-1ABYyZ3MjJB!1wVPIyXEy1eS;lTazGJ+=xLN*f55D1DDdU5P!#)>>r6>TSe z47tN1hj!u^-17B;i}6eRgKNd^CT@8BVt9&V8}H`wr!s5LoMTqDHq9+c*bJpQ1C0^e zY=m{|kNtV??Ot9M6`dgk+ULMwu2QQYN>b4MA1EC?4wfluz!N~{8FCBzfD(Srhk~xm zIBA%oE_1)Kv^=CVUy_tByGy~Q6P&S3bzCnr&tkNWq_%1K;)nwcf`OUC(nPvq`RyDx z`6G+*`(LFKM(Xvqfq3Z;7c{GB(^xvalw9EAP&yt-I^&{Tr{mNM$XQI7m{7VqkRA+H3 z@$sQ`ZizmaF!$ft{pZJ^hv@F8izvr)NqVcH%1+Rh}0e0H>SwpD+2y6-c z_5jGRS-m#j>e~df>ZQaLS&5aW-k=Xu-6jxWJ$Jip_uLyW4nwr;9B5`we;WRpdo!h{ zWy;`)NUyb#JR_*d`cw%}nVf)=0^zSsiS}ZopLeuB9DX0ZS$+z0d4x9*o_2p)bq6_# zAT~WgJ4>bYp#rIZq)VVa2dz3Oo=K7lTyWXcU6?txQj+GxMDNRzlFM!K$95K7=!xrj zukH4q;G&q=tQgFWUXwnW-;^}LZI{p0K9Byq!C(!M@&(&K1A0XHg}dC;PgFQ{&Bvt((HITf7j@ zKNv5gB?IRF?Zj?64r@WI1vK$=DJiv6twbdF}0Y)BIjBbIfzA77iw1Rc9eu zKgQ`5)U_Bt6R4%P{XppBu#YgxOE^4^X>1&cKfZjGU+0Gyl#Jq~q+~kZ9D@sKbs@&l zul4eji>5@16_5U)bqgNG43-1`)&`_%>Bd@{zu(lvQ4YY616GQ6LB`<$S0Q9WbeS)_Nw!4+ zi8h`S&^Mti#dPsy@eIjNpsIk&*QZ|8k2W2d%^z^6-lPLZv`+nEV*`YSTWnmj6=slv zx`S%-x`C#{;uuB0GqcMQw^4)mb?nc+a?>QnF83>dRqP6r#pxMQ!y=(dvGW<{-HqN1 z2i?p!WqR_!+`D!DCe3i5EIZBC79S~gd)hvJ)Hfdoiex7yUhudK?K1ji?d8j;z<{U4 z+Pm&8C723hl0kDeT~sOO{f!o~M**Po>}fXd$?@3Ov<^`z6oPUutx8uBNU#s~g~%#D z$0*|yyRfjaH&T1IXl|Ls@_WalRTpya^y0$-Xh8Hpmw3Q>NB4W`vz$pEMyG9mXI{Q^ zx{2LcZPO^XPn><3Ep&i-!v2j{uRUr_7|C*&Sk%n}0h}6G2fkKHRAz||+`SEZa}-te zmDL%h*gEH#R`#_`XqemIyhcx<1+i@8FE1BR?8^B1hq+32q6->{C6P?f@a!1brk}Y0l<&tUj^&kL;+oAK?@3nK8Ah03U5+W^LaqN zfRM}S7l&42jM%-hax6Fb??RJZMbuEtcIg~gkC72ebM9IcKA3OM(Bqeo(e@4Q zTfpZnA$o>bu7WA)u~MU%@v2JZd<$aZNbsoRhlPpmp|CV-%Iq}0WhL)P*b*h;yW4kA z44UcZp?-sAx^7_VCqdS`p-|*RVxRRe&|)6ssK;blosIfXH zKz=W|t4e=#V$@ZZ>o~~N(x9*+4>d~pj&T!)5sQwPx$otzkGcDGgIzF*s3ytXB+aOM z41yq)`LuxSV|fIX5A4fS!DJBu(H&gunqLvxR@arxf7UxS9-0smz%BEqn&K$~oR6yR2y(;Baup|J28EhL(K1xkhtsOmpXEoOc+Skca$JvgE}0BFkzhC)CfWxfEmfr zBlStD-jzRaFT90p{v>I5-JG~5x~Nim5CM`zz2kf+#l5unC2s`oG4zo}3|(9f-i=LR zMVP||krl?wg}U`XJ(f7}IYFTLlcEvxRjA{UTV+G26aP=kp#E73O3SAi?AIEl5rdfA zYNa6M`G%zjo0YPE)OE*DWE;|lFUZ>oi1gd6fy3O)@82Yq55GP(<&HuJ_Dly1>y9A_ znv;b0xk;xHz18I6-G~{jA&Gi9M_#e&XD%xabB>o!fi98fJ(2KfjK1)DA4 z;T~!6JLRAox}e6u#Zz9w)WU-_RdS@10wj@-@Wj2*!8lFl18^=KI4 z(7Oj3+FWLHE~<_R-VZQiI$d1>Mg}>SV-u<&Vh$bvyH@rEy9SeVn%|I4bB=+3ay1Sr zUEbIGuKFc1{glB74VP|z)#m^>j>^!}L;F!vJ40phcoenO+uZ1D0(Cp!)SQiH*8%A3 z8j}t3Rrzavz};oq1v5N->c3Jkf!c{1BlBk~M;^s5NA#>;a`AQVbch>+H2lC*1NAdk ztWfjE#nzl`cvnWjL z-?i2mE2s%I-}Z+QOAR#W*G9SP9wpcqOO4|3)C}ha(BJ^U2c5KIujE?4`q}&>eRreG z?eaI0$^)Xc1~EE{7~;Fn5GjrNM^2;TpqZP~NfE2|I%$ln{-d62zbkvps?D~L`Tde9 z<9hqkdU7`EW2f;N3o}~Z)UWH=7y7?Q_D)q+FfL~5PYi85-oir;?ClGX$dENc|6V{M zB%}fJmm#kmw+OpJwe#LQ)uxYeFW^m0b{l;wDMy@_xFytL#Ampbaa** z5DCgm#KI#*NT=jK6cDtp3|=O;08P=NxH4Fk^L_X8uh=p@)(C&qnnPiQ7ZfCkEoC$Eol&<6Vp-MZLNeg)BTduiA%rHrbeH zl8MS=2)&Ei0!qLV8ni*Pk?T+70vh_*>hjr9Z3BiQ?s1ic^#g;0Km}IE2Yg;GV#szN z&+%gaq*VI<{}OyOPMr`zLO-cEzH@HLY!63OoSun&(Uq~OuK{z1TY(f!*%TfOl7dIveNP&8iy zF92&YJiXs(HcxF^t}z<-qM%{@-Kkag4(#qgxwl)T9Fe#+P7a5-4p2?&qjg>Zc%5o- z0m6gG7u9ONL}ZZ-Ejz2BAzxLpzJ;+=RsCb|Y242~44kQNyhL{{4iL=(&^9JzhfAi| zrpH9yQNc5ajX}kOYjqArj{M~`!&5N}254O}&WM3|)Q1$ag|q$gHBvYo*^B>^bfE@| z=?Bc!;_rJT&=<0VxU}9FnFCCZ3zaC9g`_k(zylhIB^L(Td;ltZH+Nzy%rh42r~>Iu zQPGw!>Qrcz6IvFD?p@v z3f^=(9{?su6Xqo{o(^Rb$Jd})uRq>$R&@*CKQT@u%Q!T6RawfU$I*F6wUpmazBfjxIqd49542~9%s_i32m$l~v z9ea8wrYO!;xc(2*|F!+qT*vn37idfUP2Mca#tQtWE!qt{2iJ4>G*>kGcw@a=vAS+3 zdrmx5nK=?dw2OE6@<{Q+e;wV4;hGEmZ+1P2r;@z=jowGDhRBo)pVTEARVV<9JNE*& zsyZK0c|uJ#W`h2qJcR_Rsm`)4bawpwS5J3TN65#WqJTf%;J!_ErG=|FR=HJsVsFRI zcbjPLzbDn6IOBv;kO7{utc8;*ZoJXES z4%H1(HR@ju!O+ay#YVNfTX-bN4=T(O^@(V96FrX0A-1ClIYP<;i5?y$UES|DZ~Q|< zrOr6<6$DsD*YghM`EZJ#UH4HXVnF*=iIsx9KN09$KX@nYgjeeX5$oT)DZ}+Q!1^Q! z$0t44IPY_wND9S24ulCdK)r_SLCVk)-EL$~8YMX_+mNCM59#fgYNVGuF1(Tr8<`UA zAa`(x02XT~_N_F)UYot0j@5i%`F%MbD6%=haTj!x$kV1MFkRoHaiN*zmJ;TRPG2CD z$q$UOY63HZuGGZ~A=K?lfcfhr;C~XoCGnNU!f8Z-`mI&CHAAP$&GGODa(0HpQ*nMt z6IHG_xGIztR(ZiSc7sBcdd*0xdQ)kEM$5ijHjgN&03p%L`NiC~IzcvI)vJV4oE|3a zqeii8;i&?ymWU$i^OECe`V-ucW|R$!i+t4MBb;t8YB_+2?rcGkfCIulNPEAea95uK z$@9Cnabef?bNU{-)V-0HTB#g;S=^O;l-Hje3w{@Rg2lA7~*7VCJ`AUFunbma|P zL7?ZF!{rvg*wGiW!#NgvuubG(_hd0Kb0N`sttc4t5>KFOiX>5V4Mkcc_%;=Ud6SoQ zT6mvg7>VXuouZv9aFT(I&GyQFYh~h@ucupSCVYNMpqay=EI{24F6s z`1_{4wo>FOLE!|s9La=-ZJt<+%!1O|gEE{6f>zG7DP!f1;=KJ*k}6DfJq@uPIP zS=kR0*@0Qqo!V>CD?x^a=)fr{ctK-qlcS)%SLoOlyn(8HDU1%V;4GfSy^|H^-l1J? zd)SI7F!(~VK{!15M7!V-KYM<`Soq$5dHEIWNl2xGZ zhay~~?oqM)-BLqHrA0Hzm+#637s(9jHK^z#T$U%BEgMLOPxwy~M+5G1_2#Pe%6TS{ z>M#d%;XkJ##uL>R{**TL8zkq>gvXv>?VzUe57r;&wReI_2EQ();zd;J>W@leD9JIXI@CD?KYXN!2=5*G}m zr~fWctqmMg)|~l~Caw}E9<`f^yXC2;7a4l(I9PTj*a%H(=ymoFAih~d$uzjBQ%;ZA zvTnCoGr1?yHXQ&biNOk{J`m{e~QJmTVKtUP)QA&{tFhb8+IF<6b@^03n0!OR|xDlSl{ z$7vqmL{}HIIquf$1&lNmA)WUkxoy{;LMJ#k%d{2B9WJ(_YIA8PGLL z(c(2;iKM_eBv!4bG9{hP1tr)|#J%!lXpchT8bP^3d!?AC9j%Q#@eWZn#eQzIEWA?? zv-ns2w7{~nLAvivxDwRuR&)5-huQ@Oe_#Y7BFPq3X=___Gy_i@+Ms|O7d;(?A@|xr zCrkro(??W#AWga2+*P(s2Tjpy_2D6}FtW&1lc~PDK}cW;^%4T)T(7slgwgGLf0z|1 zi`R)u2==*WXCM2|J!`m=IQnVGx{;r8p$uU@Y-hlG0L}UM6=&C5&L@d_gAg0Y*Jnwm zkA3l>ETNka$>IF*{>lf&zZnRaXfH%4w z1}7FuSmKFV=*T=O7Z<0ME<{(neMx^`fHGk@X*}O@kCWf?#{U>oQ*hGIsv>_a+{PG7 zx{0PN2WtMNVn6fxr`HgsoS4C4EC%B1G$6ZD0+09dpqc6NvYwVmFPq|7{Xj|{8;KO? z@0d@Vun3W=XdZjzagET1K=zB#r`dNT?C^Jxvt}zaYF*}iO)#_h#MrU`xfMR6xUFS} z?y+Leyfzx%2sV3X;?6c$p0;F9Vg2sVcW^L72yw+b158^dD$Yl#=_?mXBGQ%mi4taG z0B0z&bhHuo;!8nT{!)o}1EL?ooyy|VGE&(k19U__N)e$0h{}>>EFDkDW z*AacDVK)Thdd4)cjLk+ZFgxhuO$~%>?iVmaxx7XL%c}gszPkjh>LY8y9z;S!3#WiO zB^$^3uFfXm(e#tjxGIOoQG1MXol}GV1z|dQ=kg^ePf@<#FF$a|{WTi!WlDQU!7WF2 zvM{J*n(?#tcYyF9zbt5A@NLmSL`Oh_NV$eaibEfy{%47Nm}%(F-$e0gug=97yHfh4 zGBi(pB;Q;TfNJs@^hV{?QnYz^2m<_BJ-K(GfF|C~n4L;C*s0{_CxS{&lwjQopWKJXY+R%uOpWF!mxlM}^> zfKX^adE1^b;;eZM>@hIf2>w46n*a48mhi-zWOlke4-pXH;Zaa@h^|jtJd2ZwRz^+1 zx5l+25z_P1VCYLd|JAPizC+#319JDW4CCG^NmIy7WBsUlQS`HauO!BR`~Gm&J&z~S zzzNhm@|mJ9lnE2UdBL;xamWkG)7Z(0gUMMn6XuMq>h%g7l8_tgSb(&aMb)=dv@yQl zRW4sZa$v%E1CtfeCbQ$=W-Oxeqh2C?9?k6J^WM!GT+ zc0O((;7xPI0;eHVu%ug}?8%^koLDBgP;RdO)5LD+QsquN!ijH}=>_PMrytBoeZ`Xk z;zzp7Ni`uvtuHRiT6>oTVBbi?O23fivWLry5w1>KU86V*I?GOqO6>Lw3G9@!1kP94F(Wu zkA*eLZ$%t&Pu_0ki#Y0=$PEom>Ms??4wm;zNPSSBRmtwkk^5VPGydbW?tCJEJ>T=6 zp8@%-bct&4<{}i^W7$;tgxGaJa?h#dR;-?S&f#~YQRxUat8%vEq9`Qx zO+7#0rJ+5?D?0a;M#z8kLg9X4;2tO9(d&c=>>k-RW>_mNlh$Ibib>8taon3Cc3+Sa z>#ESHs7Ei*UxG*ci}o2b;HMAB8szSxP~!@rIdu|(f(#UiriU{)p`6ZFZKfPQoP}-s zql;3tuV_uuWUw8B|87=-3R|^anLv__9TyJ4(om96Rk-`W-N*evO~OSD{MO(_^H?*f zln$ssI=-GX;;fI7E$G`p52d;};G}E*0`47gD~rOYYU24IuKNY%oOQx$^h6gIdC4FD zw)!9MdEg>c^M2wOX9{0B6fU_TLewoRSuTl32(7rijDp(<=!#*RJPJta+wkc4*Hs)A zJ+ZjG`yd(trU^~^Lz-AO{+kILM8IYn6{@3@F&dm4yhRN|oocD05D@p0RoIgNuRnVj zTdeStLd#~K3|+~L{orGzpD}*>eJ;nMT3rudy~oSLA6HrKAr3KuP-`_@OpC(t{1gS> zPO+TnCDJXZ|A!>`+rnw7WNc?v>qp1q}^jzvY?t6t$;C4R!RL8_M9vpI}m1 zj3&Gz$A;JzrzgZN?#kPkC(2fFH4j_2dV-Htkz#?V>=T~TMN?`n)DYU@&NON_b93-> zGsmqlC+rZd`F=@E0fag0FGy zh9=u>`*0I1m%M+i{CBy0AS^pg&fS(DQtt|4ydL3BziiWOGU1_yv)+yeB_c!-iT@VV zPUo-Cg*}gw{Ze?9D5ltG=ZH%D!Md$C6x%>gUd?6tPrI64e*lpb!8+_>Ge{g^U1}4e zj-`d5vs{$3 zu=EBrUBqE;_qH;wn`8SNZN`aDw*_XU(0vM8)ces`V7@nMYsvf0Ud9G24zHm`ooWs% zGBVf%Lp5;eE*Cg#h*TGz!tOV72Rpup&)=bnr~Q!7s?AHSx-$N*SjIwGqHW^KVZf>x zvy@YC5>DSH*Ug`6QSj9ebE0h}lEsq+dc!bW$Nez0he!x09*%tegJRd#7L>>2Lf$ZLZ80Wzi=qX!6^vyY|^gIqEoXHc8!u zAbojkqtS#W=b74z&=P4Y?yUg64)%AIT}ZeAE}8z#7%dc`G9=4d`|n*>3GhEu(Mak~ zgS>Q#zSY#+{My-%&LozPD}&)pu6M?ayv(VMohF2wsz%ZSSewW6hua?_0}lhTzr^+P z*qSS_^GP0$o^{|HPe@iAF_$3T2gcD27qlhgEgY;utt&cmO79K@QiP;60Jm$rB}}3< zA{Yq4Gt8}2@%L*Ask-Va+K#R^fK~~%o=dkKrn84#b83OSu`zER-1#waK`5ZsMpnY{ z&)B`0B#jD|3#Hrv-4qx=L_iRxe|^?M%tmNLnNs%W&i$@u9y$`}p>!ByifLUIed-L+ zUafi*EqrlCI`DoEaktWm-eSHy;;g^k55`C1gYm)AgU^G`gZDZR}{HB*IVIZr?Y)p9>{HoAzXW`#+WE~cx>u6O#4y5Hz1 z7ltkOJoDKU$6~p*a*t}!kL}RPwa|0%{~IPWGcE0KV1s)7gq#$&uJRhvS6NH;9o5#J z%4e&0zva(Htr^$^(AO6d^svT_5CwzPEU=PmW4Du3zSS~00#gY07jSnvX7ME zSz`qmTyAQ-s61Fr|J1higR!#t?G|^Pd~R`W$}Xre`_2~~HXO#1y#B+MZ#+R5i`PAq zo~><~{jtpVE~#yEGH+7HvlT?_dv`}ib&as7d$RFxD)M^@TW&5c!bIoaS17t1um=0n zJ;K^8jT9lU+s&!autO7^j-6*7*^D7t{cT@v8$LeQ=51DEx7U7j`|{|vPW||_l*WK7 za6ow^Nh`k6oU{mdkfIERihssZD1P4cZ@-p@``bMN*Xepd_<#M@SVP-k@ay(fV80py zyg;)f7|#XX8$7{i*^DFuJj@r?>|GLt>9}PcJz3s3tCDjsbmB4usb#tWd81x*AM?lf z(@~MT-L8^X&U8MttNXv9uoqS23w(y^+Vks4GEj08xeS&H2ZG$7G;dg2HL8bt&m4_? zqc`z?3XROUE&4s_V4rK|>Tk!$dP_Fx*z>sX-~1&eN9CxfYX#R85;$65Z7|$7w%H2T zObgz&eCW}NDCoS^RU{IlZ3-zqni7j5Izs{F+w7{G9z^}SD<>SnsJ_VQJsx}RqjhHE zP);Q~TELS7hy?V)0P30w1A7^nxS|AN7Lh9kL?7Ts0W8!YG#DcZ1mS?W7$`Rig$7|j zkVR$}=Z)XTKaW+sUlP3euSqUSi^mqrpp(FP_>Au>aptqI=`+h$34fCL+Pybw9qnw` z|7>6D!r<<`{2@J-zJX`-qtN~Pz4Z?63Lrz%^7@8H>;S5tM?U9B$n}1Qqzz3AP2hR| z88EnjU%X|?Jh$2h3!%u^BLol2L_@rAvjD|lCM*(9VNBo~g#8!-7NGZV^Y(nrSYZq& z3k3rKprBMNCklxM;UNe}Dia8h#NjyQt9eseV&eN+jVx$F~jxtRfo}x{snDneU5ApL47+-5n2ELkcguM(;FtLn$A7*1IRaF z?dsfxaBHtCnYzho=Rd)>3>Z`J#3|4XQ6`>cB}PTe>DYmo z9sonb|5BgAVm_7iW{OA(mfyg6x&FAQ5w!-Vlg@qp<--DCz^E`53JM+3pZ_h?$?}UE(f=+sjfm{J z?ESul^x=0u9}c`aX&x8(x9@xLZkuT<%8}NX@2{B=T2A(j@|%5|1EZ%npB|$;ql8L z50EAt5rYAtFlaC)VhDsIFo@qahk8t_ysiM1t=e7Mrbrjay3#lQ{&)F3S^{i7pZT@T z$^Lfuq2ljg`g7|f(p?o#PkMQ-h!dFqDa1*gn#~{g+pj*&eO{T1Rk-I&mhxc*piT;F*1XDKiXMaN zkgQwGO`)o4uFJG5A1Y1}?E*DO^SFr6kaIf|iKt8@){(cv?p|#|*2S@uwqI~kjnSuB zy;+gC?bo;%GB6+r-~a#_bwQiPKhXX}?v2;mq+eo)@ZVMBy2YnBkp4nq4nKbOGaW#e zEruy7)pvy$f{P|5e7`zzMbFXGP0R!6QSFmjrOV@lHu+J6)VgGFatYRn>(Pv?!kJ z#Ob>Nz%u&0iTr?Mnm6&mh}SvH2}d-=IjzQS_h={+>!$+dHo(8rgWXA1${g$f>HvY* z1Js*6J6z-SIl>#$CbtdlYF1Q$N&IHZKo4POi_F2droA6bDilg)BIFi1ZUA@qLs=w2tP|~gP{u7pNTelz+(hAENj;i;mNQsoYZR$S5u}RY>PnJTAiMC?FNhCz2~R(e=Cp!k zd$hLrAJx^F=Ov-v-E=QRvn13p!fV;Sev4XnK{Lk_s2uf{4Z^!5(+c4`YUk%x+OrA(TLRiskI{DZWGhPas4#hoPnP1!RUT_ zdI>F@woM5J#pXV_(lOqUpG_Spue?N3M^qA@uO$#eax|7g@X}=2>H27;s9qf}!pV;24UBk>PcQ>WLu~`1ewt|F=lsbvbHkr zmll$fXcH{06{K2j2+rE4hig`>#%zf}^v1CJRu2x8bKZ?k-y;rF52%7$X#E?vVp zc^sr4+n*LEm_n#k8&_UMjPNJ*Fb8w375&%ClqgnS6p;Y*g|^!VN`4JoIP94oZ%Dx@ ztziQ>3+Tv|JFwt#Y6a%cB-Iu?OnlHrK8Kxkrb<)>JWMg^`E#Hh3We<4IJKN>dg+NA z5m|lv$D)GD83-3K&@Un!#WAbHNrJ-9n?7 zy3CSt+u~CC3QC}4O_}X_|MT76h*0ECr$cY}^aw-9+6C=<;s_^b+N`6(QfZ3gD7;QS z1%)%^az#2n4gXG~(KNYjSDR22Vm_uMkopJHnDymJt;5^`NuvgfE^Wha{}{Sp;RRtp zzBNbucnI*ZPxcOXHi?;YQo))@n@X#`^EUGuV>ylbg4M)ioj!%>4X}E_-lXy7<%)I5 zU+-31=&ve{H$ac-P2t}l?yY6JP>G}wDZ4C3>JZ~uNnwV&Im6a$-nIJ1XZ63or=XWw@s!TB;iW-zLMJ68QTx57CzI~FJ6GrGt z9mPu+cvX|+xZWMjj+)el@FA5YTFvjc%Fo()ezunPCrKbCd;kiHF zl0~!Vi*%{O^PLM0Rqh&v57x-WPk9amC1^TCVE!2^XJQ%aZCN|D76)( z@)ALo>NK1gGv#fx9K4}i@R zh-fiJ15J?*4EE6b_ymnfIvLK7HnoCrYbW(6nToFlS%;_T0CPJ-0fIuf5}ALtr4smo z{6#K~lzyJ`fa12Jjt3*s5Ft;M$q}U*=xv1cz`se3=j?*eW_3xeHVmR#5ijNVjw+N- zES}#-{w9;i4u5wQ;N83X9ptei1GkX9N?It9J21*iA;W`wl>CLlOt!0yF3z5MeZOE? zUTK)XB1p5bafr-DZfqRGMF~@lUwrTvZ;YXA&8NAinXa%PNSg;W^hC0ADFV;W zlqWR?Sj?XcGk$r~yZ|adC~&amGCND=|5U7x*fiASVIUKO@?TcX#C%FDVxu8Wb18|j ziT<}14kj%<^^x4S1Zq3pnWs5RBJkp-%62hPQ$k>$ZPxRB&1+e0dKA~NEcJeZC`Iua z%JAFhB%-2~-z8gNT4^JI2yn(;t-8W1KI9$VZ?%=6g73BaZAbI1@YtHyy}3m8q5hVt zt!?kvom7Gy0CyKGwsMP&QYb|+axUq*kdM4{5U4rG=XqMA^*ioteCDuyf{jP@*F`nM z$U(DcVc&k5jLpwgs#?ghNs$f+wxMZl7W<6?U1}LV0%*?kB5|B=?ocz z&o1JbX {qQqag;2y=t(v+xMC!@zDu!L-%M_&)xPdLsxMzm(flTB+yTuC)2ifmgKsi1)5O8JiO~2wgo6S60lFvj z24&8U?0N;$7pn1JU7$h9W(E`8`&5H5`sapLZXVOR;C?@&UkRo!tTf_Rl`kU19e4n5 zK#;%n4aT4a(A!T>OK(GY!aaR0>3wq-_$VI@@#)p_N6=wq1doCyC183UzHSe?y*qVS z)!QLeKP^p1e=4`q?kqr2s~$Cqd*&q<0dkgo8ee$HOxk>&pU~&j zjeFY&(;$0gZAb_JF;#JP|K{%F(oXwJ*t!~0tbe)4&CUWbX4Oh#E5HFW#q*;nW$)^5 zNQY@4-1V?k;nRxaZBI0?*kJ}o(k?80IOCfF100Jb#r@gnAuI1UG>o+c)gKT~;L`E% zw*vtiPM&hREL``WA5R0o%BWW_k?f$ZTWsJcUPJ0+m6+HAGtGiqbyjJlW3&E8uRGxw zRI$*vNgo32{I)i4dPiSH*su(6_7qjrd-A9r9yFc++l6z7j+Jb8+K3JK8adqp2dNb! zC(9&_`iyf!;O@xdaDoh=9Djkm@{(BX8?8-}W=`&Lz`Jfay3JMXKUJ)8OZEoqdCp^Q-?J z_;y@_Eo|4QN*d_^eP*k+560Gextk*dB5aU}_kfr{9Jy<+A?ijrSm=QtBB1;uHJButeBh>Afax zLE`yA$zFh#wGby99(N@|-!6#5;&s+^6UvV5GF(cTtY7INRIqS)+i5>88n^3hU|JCA z&v^U>wxc5_c5RYpVCfPAW~T)J;;rk-38VgL-WX>JUCx!GPOo2cjXtJ9-o~1OSDwM0 z@4DCOL<2XA(vTjKYM|kVUDpGRYHme)Ety)`2CZ(70d9asd9bpL*(y($Ec|(1`TB7+ zjcxPZiKa`XuI_aJ^BQ6q6MNvNcyo%sM$Hc|mYOEX&Gxx!(@Xq>u#7Or^gPCFt>Uny zAf%70hBbn5z8Dkv(<`GjP2saJ_}#YHe@xVb2uj-89@dz@M)dlX3Ev0>qP&RNx(m;~ zZ<@v<^rohBaTWqgxP1LoPAiV?-aC1&MDX7~lMgjd%Me9%a{Ze_CMw)hF7Eg{ z4t_HvY+>{fxl$FLxpDS2RrtZ#DzcKEI8r~qNBrWk@tfjWl7{f7k|fZo*Jv~}Ho+-o zPe{^zD^bl3iQcmFRX_Vr(eg6n`I_ndXQL)jK;BUm$cq{3p`&iX8m?jvPZ%pv$6GHH zD+;Q&OJk(5Jb4K;E0Z=MtGeSbz=Z0Ret z6OwIrcCk0Tm~z1kAPesu^k`ce zFwUp}l4RiD+?iIXU7E=F-4IsSj{buNw9(iWRswHdpM&DBl>?Ti1c%{}g~*yH(F+kP zaFZ0v=na(680>}vQtEx{nh4q(@T88}UT7wIvN}-o1)4w&ooduP#T@+k$>=;smpB|A zz*0jeU64bQ!|9m^iIKgspie+1xcsU=w!{CRM z5Rc-N?8l4)B)c^F2Pbc;ml7Ml4%%P$#g-$Y7ZMjV5qe9xt`aRf@nV{hhXKUb%#AWNUfl%CqSDlP2FJ+ZY~Da6r7U@mHDb^%xSh6hxB%SwQe~NciE&2{Mj1TFhMT z^5D-^Vw)_g9cu~IeQ1uD5-;C~L^XS-;c4{k!UkN?lqt)@SkH4)XB)S#s9cDF9dGg} zvfB{R88s^_Zs)*?xx+IPm~ru@q^l$wAXSlXEN6Di{czi=eY~-4W5>yWB?ewF*skE{ zlkBa4aL4FJ{%Ego2V70FXgRrTl03pHjO*K2;-V4H1HY z6WE3;sJL1m6m`P-F>}WM=6;(v#e>t(9zYHN6C8}_GVu)wU9xq%M7kwr+s4#wreW3A zC9{nfh5tfPuYe#K0Y69UFVBMXLrk)kQ&8cC2(w~)cHB`)4|HXu=z(8`nkxm`fr`E6 z{-~jypBjZ3lhFjC8~Wao;hRts$Y&RW;loaenhCkD&<&2QrnhAD@K7}~lRgx7n>$EMwggz<8qikjjivDiNp%i=G=x;9nnXLo87Cr( z4*%X|ISgy!#bDXxcTJx}f%fAH(L(%rJn286`YPQ&3!PA@Q!e)9WWwy3(V?6Pq}h`hwQu86RMyC3aNnUqSx2jIL8f znHSAH3>(*AN)ZXGP%!XFk>#uORV!|v@9C*r6lADKDtP7oR$ z1FE+!^agYWt(i-x-gisLQjoM=mSc@C@r8d2rX)Jx z{-sZiD2Hp;isqjuRxPJ<$!GqeRE)t^a>xSH&B7sE$uUTgbS>nA6jw;RpB8vkbTO(8 zC$KVd585Ml@rdYayS*(=zB0b?I;sU2^Z6Bf4XIpA*#kTQ<$aKB&7pMXztgL1ILB3D z6aYO7AiFkr9k5EWf=eY?rB8locttaIK1|rg7YiDYQ8IAT9&myA{^TJwxc8(VK-UrX zH=y%Y_$jcW5e&s+J=+|KR*JNN?UAU^i0mXY2UN2NBCipMQW`aHUD@}QeXjNtUI8X8 zZO4)IlV=9^+$>+dkThxPX^x^gE;AOXc*gbYbr`2S`U`G<7St(wO}qW|#OP9<*M1Ju za@65>_XpdFvbs+XAcd3X${rBf?=zG4bkpitM7khBrDI=vq3sBW-+4A-IjOz^<=Gnx zC&(}9=Z^czL>d%NJj%51uo8#JDn>@Wxu-FM;b+o$+skg=ib`>67s|@e0V}V+sHHrK znP6Ut1dN_z2zdvXo@J2~o@-S^jrSQ!3yXYTnd`$kw%Z2%L!bEe>+pgw5~(g(l5$I* zjGjCPYl)zPl(3I(VLHty$f?^JWAZR`^-z*W`cq;juxMEHLpce))n`>C^)FtCS40<@ zh4zWbZYx^cO|tAa(t)JH>sX#F?QXtVeEgyXZv=G5cr5vM8BP&(q>x^u#Rpl|+p9a= zEa&9|fu$(Tc`8hfNk9Hplw&YfggpQ#yq~8x5608hYbOIe8#bhntitb*R5C|Vth--o zWDdr%f?g5c@Y%mM^1qLoO9PQrfpt0u$w%{apE;^Va|KD>3Rp#euZ2NhOa>eX7iI4U zWzXEb1M%g|B5?z~sqYZ~A+GP=<1BG8#G*4Nu(K!;q1`L|*m6Yu#`tM~p35WEL5@_q zR*^qszy+6(gK(>R;!a+vz@lyCRimo|Askg{iX2S>{uBKyV(eC!H<^%<{lRtmzp)<6 z8EeydhRtWMVRU1aXTS_#P9I|(t9mV_4S`zjSGQkz>|J(O=qc(Re*+px&+WD8bb0&8 z8J;;V0pL}<_;q;%r1rS_b+$59fFSaMxpI^9D%Q5%=NLv|>xE2pGNnf{JJ7txzXzZp zK6I~7Y|4#<3zGtsCumLYxj)w^I29Ofcbw>u&_%*~qqD$F2H>0GJ=4X*p@r~*OTPD(H^u+I`$9?k+F9I+XNicB3`Jg(@) zbBDWQLShB-&IGoLmu&eJfjJZw^Rx+7O1HKk_rizxX+8u0|I`6+*GsI4{XKMfs%#AD zn1)hF>>o#$Y@>=(7_F8N1PJH+;Wm{YXHM2`ixv4H(`)G+Hqg{}im{B=utuni-F_ay zjxa(!H!194g)R=0qrj#+VtO1dbN<%Q!IS)31|dY(F(+I-?xY3Preyw{K=i9<)lu61 z2RNInVBAcL<>e$y->h)aA?JcQzO`l<^s&t_Q@M6O+EsT}mU;Oi`OA{GPj4L3@1pDa zO=9z&XCt(Q+gw3^I*3mSFn-Fndw7CtAK~>L$>DWrbVFykVQG@qUpcn}x)174!|5ZW zNC)J?%loWa{A$3=eaU7snP6?V1``}*FHgEmzrtZ=C zD(Uz&ZEtm_fM=IDjhms<1};CM;>lmArL>ZcIaIj-B4As5Y&iUbD7k&=u|=$w)NCBT z^~MOr*v!A>hL>{?lV2QX7O;FH@hd^^y_^212BbakBPd*u>>N4fwP-iI;37CQ;N#60MJeL_OM#*!H~e5 zOcWZ0f}%i}#AXpg^!@*Be?OmTozirkb(_}Ls->!2qgW5=Q0O_=n){mBT&;#3{70Uv zUtnGPaC>GpKS}gCgK}keUv+}tp^wI2(`z5g4e@)gtB@hMh3muB3EfoPk@xol9Mb)e z{Bual!QJE9<6k!OyV(S?Fh-kUddfh;v^iRU`~Mg*Z_p1pThIWmXf733kQQ85)BuDi zC++UL-t!O|3kCxrfuLB57z~91;b5R#EENj{0-F>EVZ(C>bb!BU9`#AtJA77~tyr5jx-x3s< z_UN9WH^kZ~R>Tqxf1;XUC!_?YG&H!i5dQ~V_RIyj_Q(@tK1)F2ZN07*w%JFbP(x_? z?{**nLyP6Lt8>qr2iXunAvyy1PpL-bJCdLRiRt}jDgtVQ0idv)EEp3R#KLf}P%0z} zh{QoKsEi^*5^A*Gv)NZK)!$spx|MlSn|p6BTmru%rTqIU&nJeTPv0&7qW@h2H&S#z z((CqWi1PyRiXoT&`#DczE$+a{>nV*3MmYOh4YHyFUiigbs~R0nJQYs-^DL)Nv)uRW z+>$Sk!8DA~n*PV?vQ>9Q`I$=m04-Wro}D!PeqUk=1`2$UbZStIzY^pMaN5%zkNHNUga^of>3I^x?k%&TFpy==$A~;kw*z z%>3R(ImVF&n%QUYlGFV0pBvZkem&!Rn|{7GCyM$)wb-X&8UQCWN2u1^>oHAtfHWJIMqWq=Gzw!}Li-#USV8{S~ zBY*$^A!|XK=0CY7WKR~B6EmdP$LWvkD=dUso!5OGGa!^0LO24)%tjy}rmtxRC0{E7 zpra)mHcp7{%5^LaMW#OQrk2ORBQ5bXQeq%Jonans6JG5#olutxi6!2XM?{P zG!GPI?IeebPf-c$Y@yy*3O`_>{ClXieahuwZ0G|PbOsYp++WVra#4>Rm&q{^|DeO` zz=*}9ARny~vZyC{2=<*1nI248<==P# z&vX@f11RkUzbaTq<3)wY2aIaqtMQE=0B$S2XMSR1aJ9csN36wVL$DD6(3)^)a@Ns- zhd7i{dy;~MFSbLH6`rh7jgWs@3%n}d>NclxDW7HIQSoj~uh}57-=@g)Vyl$*iOZBh zOYEGHhwR8{mwq9^3J$c3C8okwxoh)iCs1u-KwQt}-4pm1XuKZQgNPa|I&s$Te=e2s zH3v^?mbGd<9ghu@Rt0|BY9$GRN&-Go?Y6?l7r9p%*!7Po7jyN{xdQ-puwso*7;D7{d1 z47VP&u*?-1*v|K9M}LLup7E5>z@ARoaC5tmM&cR0b-hmhW&HRuYqD0E80GtT*g8A<_lZVBeRP zjXPlM=XD2({R!*ifLqd-8$SCX^Pe8Alj=TI#4B1)GVv$5w?Ye)BxSz- zZtM;k7SwHQlUr6SE+Z%RDgc1EnGnbysI?OL7ufH5;?(L(Nac+OurG1&a@AHFu;N`| zodGS*>xXH)16tqRlgsui+!ZJhxZo6e9pd8kx;4!pTrD_QZq}f8vvxkwsp1?vB3!9o zi8}|$K_T;8A0sy-jIJ&;bUOkklJ2h1p3H^9#`_T;>Rgi~`wP}TCf4(>fd_#d-={b? z6z_qr@f?QuY5zvXDV{5cX-~LtOB$quzqiLfSwHsnBa+n=Eh!Y!r^wKU?j_-+a<;LXINhN#4LEj-r zB<(IBU}b(}`?_x+BL59Wxb11Fj@@B^8Qs1d+57jvW`I_=FLV)2Ehq^mouKWo3L54k9|TU;|BkMs<(70F2)X zw`iv0Z*rTXPNaq?4N%s=*!lrp8l(kGtBWA2S1*hM$Famp6_k~t*GMH0ROgkVw3)X( zgY(f5SO%U=R>$05qK(9kPcITY98mONd0H}=YRPu(*SG1 z4i1}~PDKWMUAF%mwW+H95Z@7XveoSr47@n6$GE3O{FP3W)XC!SPGO3us3w1t{1nbC zW#b$v)IQs?HU#d?G;>(>x~7U$;Hfx(XY+^;{)Bqy58o$%v#&Usg6MeYj6{N9E=DV{ zCSbCC?!1dXV)dzQ61^q3{q3M2%b1ldt{5S{Oeg+hnUL5U?L(_Py*%tbqnFgtVDTh+ zOOE}RLxW(vZfrrPD_sZTpi-gSnqvpy!z*pqeJoOjG(z&|jObApqOM-J6VRWGJ)3>5 z0UA7@hGC0!v^SRNMoz3Q#Bl3cB)F6TE@IR19VYaxpL{OxTsL`>jS^HH4M*FvN!`L6cbKMI}mM zOT4`n81>2~q?p1%>N+TW`v2j6{HxozA}ER2Y+iad*gp-SX_2jwV(a4h=1CJ|N!O(Q zo(s9n-~h;&4~+-$%QB41LB~~oGCXz) ze)JoCkXQ{-k$SmeH*EpP@RLfaw8?4nT4tKQ3XSICATYQ+2rsznCX?hy&5RnDqwr$} zuSE&kQU%}$Wks5(+K=eZX?+%}OpDnjb|q6OJTRk_BO_<1iAnzP`>dSEnaT%<*rmnU z$eCzQyO(=kIry~(4Ad=8c54*b%xpBg*MIB21N^pZJ1BC3RVPdwdboUtUWMnmA1*;9 zYN=1$-Ab5110W?6)_iqY_P#C~$UOY?@s{u~Esv_h9kg@i>%r-7c;2Naf5i!wt=1iu z$atnz!11MMo%)E)FZB*MfX&8v#R7!E@n|>} zI6J7I*H&=vRII^B!qiS+aYJdH6SMO9n8-f?f<0h9#iRt%pv^%>P8GMnIh?d_|wdZ(z#>sZrZV%5yX+U$|js;P#DFXxzkaey_n z1bd)Hi#no7%>)sG3XuZfwc4=G1uS}uCHQ3)&agJuwI<5nppsStnT8PjVBgjX!y-?T zjiMZ4Ja$*$kzX;J6gNJ^HEv*DK z(Jwte+hHvd`C)ZM^E4I01Nv@r1?I?+)@d72$gv5ntB07Hgl2WpB+=F2Ywb)O`H=E! zo!37o0QiDUAvVgj{)~40_4UYs4mK(dr3cTu>s~)~U3Sgqzm1sGC7!`Zu~6=%#^o%Y z+!2X_T{o?3A^Q`YX1Mqf4jL0G+$fHZ`3i1*jnQDwTAERI140xYgSAL#thoH=CRo*> zJ`BidiN(B~uCQQ`P)ED?)`+1^(ZA(h-GA6yr@J;4f=$NF%mh0Tpt)XBitx|ivW7Nn z1?cfz`Ssh*B|xoy;J^A=qF@bbqZF~1abz`50N45*=&*3kWY!8eVIAif8(yNvzZ}n2 zPy$w*y{OF7#`80)3-AJvIEl$1*++0z9KY>rML%6f7i|8Ij{MPxeIXKEXXB~KrtTPm z;}sQWc7J3y6HH_0%MK!zy8fSk1l)64BVTIA!4HV%J6l;XN{x7 zUt^>Ji%2(MXsUt)^cd|HB~(>%uY_{;MMH;IX-`()^;v8_`@v+YVzWe*JV^LFeA{C^ z=~Y@|KTOPU41RYS31XxxzL)S`aQBo|lkxuX0B5f&R3*Q303$?OpzL{q}ey= z3jpKF`by{-d9%yG+q@GMg+R=%S@MNjil_RS5Lyv0Nt4Tp)tlUzwjVhWM(w*bcYunX zO^y5_d-<*gBIPHxlr7(Sr%l@rb5I~5^q=KwHSGr0A1F`CKKf;)b&;6=!aD1pd%%X= zI-*R)kZ-}Yz;5%B<~n^s=IpVfh!kS8fO~(vxmh)wvWv?6)lBN9OGthph8P_R`+u2w zvflpn2jy$g6nkTOCman-VA|)~QymBWRGmDl*roIC;yo^i1$=FML?9na8z!Z&c^NSb z8R$QQYlom^M6vKZcjW=wsN&4CMzc*xbNR&tDG|SYkTV!usx^gAj@CL;4TG`Sz)aRq zgzlMPso|a@^LB^K`v<~r7?t#+aN92_Bh&ssarCR$CYEhV4Cit_Hy$#Mr?wEu zd+Lo!Uq`#R`Vp9s?v0W@K=7GBK(YBt?~5r;qyWQNnB~_JS<-A?<(M8pDzDLVXNRDA zV>|ZnJY(Bc+ifTSH@E=T)Ql-joSMa>u0v(j*$6Wj0Y!d$XUuE!*qP@C3C_iU$SSgl zk3Zg)<}Vev-+*P#A{!_WTeO!WF6$6lN`mz5#4#A-o+z2n{zYRWs`V5GKO8ge?~*P# z0K%|o?zfcHvCXn1Ji)#H33gN(vb#X{v&9l&{CZKe;+XnL9C+DzMo#^F%K8ICJC8>~ zzT)B3HenWStUp}|rqR|)@S3)(7h@2hyIJF{y`aZq|EBy$kT$dzXjQPInbQBKb!)Zy ziOk|J;Rg`TD!J+yXb9WxW|QT1W!O`B&*AS0~&1!M0xV zvX2MN5#6g09=QDy0A{kSE~KU4x~SCziI;Jr2&|K^x`Je);KcV7{@;fmab?P^yxwI! z_e7e3kMAA{UxjLYV_pXqjkpNLBEGV2;9T-H5k_zADU>TxleSGndmq&kXlp&%i`#vR zWcSOZrtY60eh_{0CqIZ@vV)k)@(8KG=h{Tp z28LuQWJRzk{wU_?2K@lCVbySz_-Tr;>}l9Y0O$}yP^}ZXAdVSY73$QNxm3P;a=w+x zW9` zx+X=H@E9qIAyfd*R0V`!4a!i{H)AZ@aGSpw6BnL-N3wB@b9^>1XZ-$OvY;dBmm9<` z)GqO7ZPK$_{K?-mm6*UQ2FQb!xb6#sTZ8)!$`lWoCWGg1@4G=hh>)2KCFv@S%Mnp7 z=DRDe@8#pw$vPpLtT1%<6s%G@^`wTC%ySgoZ-M32sY>c!om?;MbZWJ7Qy${JD-w|q zD>=<)NS$U6L3DFhFg6l0dBlNqC18QvbR z@+MA9f1}XVm(+cZ_g)tOx9Z}YA8yi@CT0RA8oc{RvvhVYcHag5bEIX}YvR2Hf|Vxe zPHjzkp7PUenc(H+Tt{*>ou^j6*K268Xe@6LIH9Q_y*>}Z5@H<6eh>K0rIL+bgb7Es z6}*>pNfU0`g%Wlf3WT281Z1ab|Fe6WQO6FDZ^-rf#^?vE0i97Ek}PFAMV!;fb5z=o zQ@CAvuGbxGOM_)1H;*SCq|HkUOYy?CxIQf6uOoAUD-RI_zdqc8=wj@1uD~T{1!Z~AU;%;(3=vR=8TA0 zav4^g)}pdeo7|ZYVJ^mzhE430zvO$p1B_fhvi>C0C8edfnQ7P5ch?s1nJ?mcxmJ_| z*yAHro0y@8vj`a=wLLrX^Vck(4ZEg)Jn8>n^lM(?l0CkT4IBnZhKKWpUBCX_*Uyz4 zQn$)BR=HvEyj*g_Yy)&7F%*5X459pMp^Dk9+m6cWOgeT|u@RXQgKAP7xAlg(Kcz{w%= z6lJEFS9~?^M05VP0}>?}&}%pJv{_v0`d!Lvph)$#IUhsQE$`u-ZqUvW8K`2x zV~y&T3b$z7V+~{2o^UnCxe;Y4?eGLYl!$=*f+dTMHpKn=$6*ffH#?iF2>Gr-FQl-@^9WDvUBJEt)W$PcVlF&GxLgJ(2Z6%5?WHQmLY5SkHxL+uU zNvWYPf=1W6AtvHpsqZ}olDR-u#S_`pd>4Ojn@5NHt8q}nJ<9J5P}@TTC+~Y-XCdGG{CYkcZ9V3^BuZEO z)v{@@SrKarP-+78q_-|?@^sq9a@^wr`2ype`|yhcmaeB<<_C>m%}+BO)(vV_x-ux1 z*v+Qr>hWDXk%C;7#wa8!`QiOr>Cz3k6k!ZCes!U)eD=}HHAwxvf$p^$0BfO=7Jx@? z986lgE1^BIa`w|ZW#;b#TtoPge2a}UsX0FG`zeRLFbYR1Qk$^gTjui#k9Xo=($Qc2 z@wC0=(X8HHO24*$6a>|!Dc^#@qsGuHW?>o59_KjAgD`D76Fc15blWgL#9dqf*qZQB zyMY>|?IlWGIy%o0iWu{unN>BK--zEYu8QsE4z;@r%99MA~Zhu!!nVeEFG&IbQY9_`LGOI|87>EbClAMVFR5zuidVtkhp?^e z`DsAv39hUNYQpypinsg3Ng_ibseDq{>N250sGY|40dD2ipJUxq-VacM+fEw7ducF` zKV8byj5b1ff*dUxD}F-m6L16VFJx|S#BJa$3H?p@y_s*vzS1PM^LoO=t{RkFd;_-E zi6Q6xRLu+WojN!4Rj~bbnKyQfUK}hhJRsznR1QD4@3|8H(Vf1=w!!z>m*{T7jrVZF zN>=1n$@&Kg3&E+gBkN`2ju1b|XI>;YpYIdv?4h7Ce@}~fEONLl?B8v<^Y8sy$*$~B z9w5v#@}S61ObB?t^@n|k)utRY1@#+5%<RJoH3c=SQ{vDx2Rq&j-&Qc60`Y z&MaazabPmceBPpT!xrU7!3PaG(&L6B?z}~5PoxvRg6)SPG;7wjeIZRAq#X)$oRaeW zeDG2%hW>@+Y@acFhddBC!2&dXclN(10!-SIs`34Bo9=9jQ($-DF z3LsqIL&NWFz?tq_UF2CP9YB)aXX+||F;-FFw<=UspWRZ8lg~KQ3j2XESfj8U4qG&D z0Sw=Wk}2`yUAE5Mb|?HA-g_}nsTmW?0~M8@@(T7ctfu3zN_;_RcKR0eO(o;xq0hE+ z&;fI7jF1qo@wQOcsB3@aLsXfL60^0b_;>uQh#AHLWfjmo78>vIto|4IP#)ea9=;lI zd{E(Fn}n#Mr9kjMqVzIoV}vj0O(?#KUKRom_Bi={AU;%!@445Pfyix~OXX(FL$H!R zVNS-;8BV}VUdflrzngK02rQizpxkDPu#Nc;)IX7A+Icrr;R{(ikL7KGV5X&h6q#r*BaaVXf<}(j07q z>y{^h#^9C#!%{t#iVrRBJh8P^JMz?Oo&k9@>VQW$kMpw%!imr$5gMCyn+F;MzBB+i~OGja9-tjzFO0Y!_3LYFRtI!n2YaNS zVavNAc0_&vi%i`P2vRt&o0XW%5Mq1=R!JCx?}X!RTaRqxKdDHg_Ga?38EFG;2d@@C zpV?);V*za}@w=ZVEWY}xc_FU6DnKH(aYx6l#jVqXavWtiV1jCEla2}0Fq6veB=6?G zG5Wepp>+cof?E1^322-s;%??P0D`bk9zgELq9T?~-@m{nB%g*b`pwo4vd$Q-*qK4W zWH=k~j)cA8-B0mg)Q8AETjz_y@V_%YpO;-xI{3|;5>oMGBX3@2N#6nCl*{u4R;xQn0v@ggIdy%o36ew+_d z`4R(gF;vrVYy{o|u^s1j`4kEGd^9^Y$a?vEOeM%@GxX}nSuP9OZzS*6$m4ULy{YU6 zHc@F|AY-8U0Q`LXYvLX@X6)iv_Hs!D;;X7U3%I>>?}X?jzZfFPk0B(k5jNoD@q?=! zL$^0os6#fI5N5i3eI5t1W_G zzh0c=ecYAXJYx$pR(gFHQ{8~Z(XFfE?OC*?^;VbOv}nj-epS2UaO@+5;8=a*a=bkR z(Hdf@2Ag3i$N3Kqq}~h~Y`i(S$`F9xIZFLVcHu>fu-DK`HiqJ2>8@ z55B+K2}uvyy8H!jU41)@k71YV<2xREPx>u?8p6HGUHZD>y>lVoQ@R!8c;w zLUjN|1VWrhJT7$cruFQ+lYkZCF(amm`S9~!5}1d zeB=uVY@Eed6Q&8wRIRLoeGh$+McK#Ehg3gC?*HnlqE@&-*bBnckscbVQ{Z>(a*Etk z$I~T_w(BxG7;g-ZtT=3drED!mqQmF9r{3^pMV4q?tbcV;+MkxG?9j$=c_=Cldrxmab<4M2V`3`aoV#SD}rDw{X*e#hU%iY!tOW1z9 zN@^)%^>{j!Pf06^w*iY3v=F?i@6rihTfcXFpq1;)3=_o<&9w&c8jOXlnRNUwokylr z8k~82_9Q_~$)a&5w7+imy6=Qcfs!PW?X?cAAx&OzW2qr1t$Q{91s#R-O<5#Kct1ck zbR%HS)~WcO6+Sh9Fp82T{~2u zTo3JlPN7O0e2u-`7wJ48u%fBAhVvWzH!Lbu(;yCy_M6EJDR&~!=K$1$pR^=ZB&!?t z!*h6oY8Sb&f3RqIF8^-OGtCD^j}$Y7g4C_M#rK<%2!1FZVRmJnYe)r~4Jcj&N#@t& z$Wh8-VcrJa++_2XVO<3O9pZ;l)dffc+5Fxup4f(jxHCsntcIKK@-{E?Gt1x(7~yt- zq>?$X>vn&7R6^kwU0oWDl;C8AD5q^sS_z22~Y&&FxZz3yk&w@d5pOY`3R_C5QCKfr1C z;xUKN|5tTd$Wwf~{cyHCesd7rrauggFVp>er6mpg`ssbxEQMnojmw89xt=Mp;#&Ir zzVEkVCAax>n7-(}l+kGLW>TtYD=(D+d<~%r)*{QL08kqbcpwH~sV{f}5}^8pd+znk zNN6w?4F&@tps-LZ7#xX0;bAyfE))`l0-+#?OoB5B1j2PaN8GMw6W6n>=gC*C(|vgB zj?Ho>{WqRc>#M%lY}B7bXV-NoG~fUG(X>#N{7PZOYCi@}tQdT!-?PGa`YkmJ?sg@i zm2R7W=p;(KTi1AATn@hbKNJSqCn zud`r*aQMo#3b>a?rln~FU)=aSp;VTK+^JLOTo}LrsrUW95O>4??ynfpG5{)-)=)yx zN)2&IIz+B#D^V2uPy}T`AAaxs|AwHj;4B&p34;NkuwXPM90i2|K(LTZBnX89Cu=KL z>#lFldf4lG>jtrLIH=350yj^`=lb(Y{}sym|8Jdjz0JPs&Ca@x*Ec?FVIEyD1LSC< z8ZBSF^2(~&ULW22zLHDdvPw1d+VVK8s=cm`CF{^#x@N*}fYmeaG>b24ThMi0FfFRRABXB52#$z6!vjd0T@mrT0|oEc=qhYQtZ5RrYF?GK{lz21-@C@?Av1%m@% zz?g6v3?l(DOfOIQ>%#Hh$NuU~cgPp%wq4j| z@REGIjYeC0SzaVG;VkGJdL~{|^siUJT8Tp0@9~)8NsLxgul?NbtJXiHYj)S$X0SeHq`c7*?*$-UFNTEKsxyM32G&VP|1Jy>I&ve>s>In4K*Z;-615m z=P#N@41@>*H~}u1{>>OI6rnODOO1WWsD0gL*wpmoZR<)MleT-i;lBAb z^u&gnNAQwDDZ|?)^=yPSD;r zaG*f==CM7{`PN6Hq*jnf>4S3ozNCRAo!gJ#ne7c&IVJ?9uR|k3G{-{H(_{kTje6UIH!5%bpZ_09-2A ztzaHY1yAFX{_=bEJ^G%W*F}q6Ytyh)a7jL(*5;`msd;j69fhSkMu+;xko|9cwoP)u2$jZwL0S*~f9oyYxJ2AjofaxSF&tbW!JG!cN7;tS5~C_zR~=k$hun0)+=~(4&A#c|dg<5H3?63&?ui9kJPntv4_A&p zzsZxUjdxO3)HNf;kF^JCea*juRApR_z;nY=?-LhjQ7_89YgBbp#3vn)D%x|R>jZ;X zSH_cL=#ezhP17Xk684Axf9&}3a2);_|Gb?)Oc~ere=aGkHLcI_7tncf_IOExn`X?y zxb|)cu|9kJ2X~Sf?T)AP7nX>#P)jVkkw{Fe71=foivBz=gtaP@ogNHv8 zoP~$B)gi4baPPRDN=BBymRohi`h<>>|CVX1?K$bM{Z8FR-;Zfnwarer@#vj!FOwP< zamU)^$IGS;Chyld8dwKSyF?;UxMo(H8#^wRix>pqd?-MwRl+Fbu#g^rQQCg&P=h_T zQi5otFwYfP|HSG7f^9?>Nyh>!=4#GMxm-glU1*JnW>IBm6bq@TA~fWI)K;|NscxBq z5C9SG%{Xk4X(ft(V=C)7UbTFsp6*_Vryw2i|HK&=7d>AMuMOX@)bRN?dIkSRkm!^T z79}~R*!1^%QQol_Dn1|@`|b+P{{rp3P|>E2#|1x5UeT{YyYa!aiim5hZf_XcsuL#N zCt+hQd^2mR8ze-5*pFbty`!_aBMXIayNZJWl9OTPFEl_ZD`6b?b*#iu4c8PWR&F0s z^*NlS?-X`Rl3o&Q>(27#M*y`1rXp(&2R#d6M{-aIv)H3_Y61o;F1j5UG9do~H~;`3 zwn3T(Kg_;&GWS_awxj1bfX~evd**pZ3RyTlz|aIOF4Z7C07nwa9f-xY6xG++53byL zQfeHB29ZKk#~X%s%H;BaI&5t8bHGG{Ce5YaXa>b*1W(ohO_r>pHvFlb`1TIPPT17C zl=S$SFlF4G7U?EyD?H$oO)Kcp%FpctscoDjqotp%$B=w!od10S;SINq57r>Sa1KwV z-y~9ihr)6a^LGRJ`U0^uGC0>@$hb+3nEdv6igYY0oPlGw>26{7djC1Bn>zPY&QA>` zN~q~(CIPQ57+AdNa*~YoF(~-x4ArD=hjP$FJM$O*709~V8S|&Ty`gKqvKgB3F-7c( zCbB*x)cv;@WEv44!f;2!lN-#P2&I7?r->`z$bmHmyI&W$_c2w0j?c%TusNWKxiGv) zY%Rc=$o!pP#e1g#c_J>cR(neINll&Xr#aQA_a!W=>YRH2m-PVh^|soF^$cx7(Wh;| z^W+?X(Gph`vA$hU!{f_j6FQf$-htykQQ~ruY?vcBpTNDlBfk~Aj2E?Az4-JVeBaKQ zUoN*&)R>C#vtbuQzZsyscZ^HdII_I%Lc9wSI+*o8;o$7t!CxuQ;nYy*5o5+bT0zjl ztL*06;852^ z4Vq}hnLtdDEKV+3xHQ1+`MDY9JO`M(Ja}xWY?k~w9vGzYT4iFl&5$) ztLF~>-suliPk^&m#Hv-8wN#WkC1qXMTAo3H_Te~iPUhCNv$Pepqr~u<3&^N$pfyGs zozFEs&EI`G7WTR)mNS+_i;@$PVik{)4>%fI-M^ZA42dwh+a6-JASCPg?soU0P7QC7 zglWzzFY>oKMh0t%+@#FP(+St&;qGuKMR%zojqC8CU&YW5F6OcyNbrEHDA*B!wUKpq z5-hrov;^a&+WOI?kXLLFsX}%lL|S?^*)17BHT4F63Pn%ufz$!dA^&@p922U?~sBETl|tny%%zTY#;J zoVEy>R;2qsI9yg_OB|K$msR{Y`m99t5x7*|l5c6LE2?gS=uW98O`aSF}_~%8IUP#`8A|wRb_OF zq9fghZ0t}d@O>MDvQ*qWG8uYrqM|~jsS2?N<6`c3Ynz8+{Xu2v*3sBthE&5wtF(Lu@nAde0sj%N}}Jz(Edk ztEKstEuB-MVM5DSqPO2^?(^qeUNq~HnN5?~@!e&^;kOW*P)W4pWuB@RSu`$TY!6I3 z5)Ek_<@UrIpdxvcO~8$-ma|vPx{2xC)y9MzPVDDR`T%C&)pTWCb=qn|9|dum4+trD zzh9=+-ZU)7--9-DX0MAPZpt;;i@leH501bJBfzR3K0BqF^O9xrHv|e&foRX86A6vnX7QVH1{aw~%#ev*2X_KLbcBkBC=H!P}e zpYBMJnt=-{FA0~*w_D8_g_1n2bajuo-XQ0S}%~xa^XXr-LqNWZHVJAPi1QbV7Jn)X3i#iw-y94-BUFBu% zr)&2X4!H2kHod?Tn)(lhk3Zm08d6}6q*Khkcp`KoQ543U^D{KW(s4goV?j3nFyr&< zjHPB%<@xEZYAH0QZE{M9S69x7WGauaHxqV02gQ&#Gpqey^b!~nce}DORs`envH&*Q zU4-Ppu#dL4qVqq7j9J0K&8rAdO|;Ulot6}bLa|CyK=4=lnZvGXV!?sQlAXV^7XcQz zy_Rqn`-0SxaJ z?QBE!n7K5hv1rUT!;dPIj9V{{pElYlVqUy4-rdQeHaR&f$)krbJdiTlXHk7c5s0jm_dT=0n5n(kaY_q-`rYkfY|6}I`1!=Q*5Je9* zHTkYnp)cM+cRkNOm$JGzpdXD;V1-rqjTuEVdRZ_opD`a}B~aB64#O z-BS4zq&-jse-EVnhi$K?4j>6ZJO7{s9?jglq9T;^v!cjz6zit|+kfN1L%=T5NM}TM zQ73WXVOlHZZ|3r~d~*V84cbxMzVYo>+KBc@>4?G zjBKnc{AFhM@!1LT3jCBOil&W!9 z&Vf(}ofA*O0nq4zp~p@6mjZU=r~Q4Y^CbIs*9*VS98f z$cN|<-=Xz4Sa2IP#A^>|!kmSKkn97+y%YXET4WuWF~5^aQ>1z%2?H`RyB=>qD{m)J zgfgCs*v+T~Q|@jS`&FjG{%}8e0<^KdIKPI*scBJHECXX59H7b%+1PoPXrySV zw`hFHkzvXSElytL8K>6T#|{r|j0ys}5!|j(N7773tOj# zUUICSOVfBlA;?zGPgac_l3AeUwH_S=Cf_(|Ire-_z7-|sDz{U@7A~Gf_!gYDMP=&4 zK-)CupG^J5g=F6KTkg2@l9V?9Amane3gWC049SX3OzM}gWWV|gX77xqzDUXHj%9+= zp-wN+3YV9+jRJ~l;-Y{Z!$3M0MGC|@$_HcSZCXIe392Tq_BRwBlbd<4?4K5 zvzLA2C5*^wSIz!`gx-8T2#^;Zw3co0ej$vhx#mXq#j@d%l?>{ueXN+XeKE1ubOc<} zaciENl27`VJqi=anzukRKt&EC(eI)5oA2!vVXfiV)@Mmfs89MLfDkAsyS6EGTV%a< z=CgWih_$bl_-5Yy|-NTZ~O%R+u{Ocr5j*1lpr#h%!;*6-(u%hqF!bbfu=Hf^2;_KoPG$!fj5GvRHKfS*PPMUA+qs{bt3(zZ!`9}9I{ za}Jn}RBwGb;N#~@RRMR_uWX5h%Ex5+Yd(EL{!^_Eh4Be+E4X z^<x|{(4b&;JhkD=BhlZXz%%ZMhs3zyLtX+pj? z1AkUR9AAwRKUq_{$}F=CfPMqYT;x+4`D&~|^= z@0raGoF)1cX}wZj&Qa2jnxGllv9@J%U4>2~5Uvv1&R`FJ%t*yg2ZEO@rPLB*Ff+TZ z^Z8)Q&XY%i9>^VO=By+El*OgjU4N0``hFAJ}DAD|57-Eu4ouF zE4Yx?+m39%mMa%^8k~q+rAlPr(~}w^*X3>EFoGc|#wqQ!n+(W4v@F{b>O%Qbwem`y z55N|^c=eWojh{w}^W!sLg<8Gx=?ngc<7-w~3@N+a7Jx8*G7)E3*^HonU#ro#GS*6XJ&;3n@GP zVhUfguItZRPZA%(CjS^!Y8~8OFYQ;!MQ6{$`0{3c7EIli;3j?HcG+tKQp+j2}L)N zTgNj5F+futa#j+wyCX*V(wzHu`0W!!&lK$u%l4lJd~c9)xSsWqBt*}$`_LQ+6g4{q zL|!@oG|Wj^8ztbw=pT3k=66Fc3YpgmDhQvYSf}drOS7)|G~&GZmwa%h>jZRmUlOho6wDEOfG;0kT=IAbmpZwh-c$7V&$kS z6Js{=LR0M<30VbhGYG9v=3zsOOh%k`{{WB5w60&OP_2NAlt95ZY6Bo$S7S7xpEmw- z+s5myGizh*Pg z>;Ce`eVH!Pi%>Z>7gEDQEFy|K5J4%zw0e9~MTQ z<}8+qq;G^@kU+->iXW+iVStN*JL1kMcL8e*=F7NH>DmN;lyZlRSzjyUcew(a@Sd+F zv0LHblaSrC+;F1P<5jf(@`f6w@y8K=qm1zb)1I#YGdHte6VOXbe22TiKv}J#{W_5@wMO63POP3M10>u($qzmL4Q4n$<0Rxx8N9z+=x`8zz zpNBb{c-O?7rEVf<#Cl1kx)odkFl3smMFP>QVDJq`fc_}i_fbu$Si}+U7dbw(%~VcS zNzrr5yIpTl<=HV@?H4Y%R{JS$y#{hGiR@D`D00Da-Eimox6UI5{_=U$YbrMC4Ra-B zl;H==IZtbCdhG_-n>LzBiDPaw%@_Mq7$#wr6MtP6rCs|XL2s4bA?+N<|8S-^FZ|X` z$mmO>H{_UJci}O!MAM9iBA=Ny7`B&!JLb|=h0-%Xti}IuPZjw^X1~jBmapls3a>GZ z{_b~ro1Bilq6v1-v%Sm$;8U#zbg?PyBQh#E!vhY?BL5KN=JKPDep60!`!M}u{JQBX z(J!(Tw{vlr;!oGch5xzWku=E+cb2hHcOxE^OHTf6^%8_OqO0v`$x;RtW8Tpwa5vS+ zw49y#u1{)WKSJ0Y#xe*KjN^$7?oixjX$^2=UNvyb9=UTFj-q4UgQErnv^A+{?MiRy zvf2dvq}3lbT1!@C4^c80?9 z8s0mQ65J8Gm;g?G)L`^LowB6NRuJS2MTiQvQL&DgyMRka{lzf3n+%T>?nh^}4v0f#&fP39N9dbVg2h<<=crui-vjsu0(*5p6Nb zXuY@jU6*E86Wc+XV`i}vJ2?`FD-Hs6|VbkH_t4awTV#h zrNPwYU0KmypI;Vl=#%yR=@x8E$_&=ZVp=R3KAD^K{b=G~6eH)PmrBhHPk_VsI+4J1@XpIDd}qC(2w)GN`{ z#!zm~OH#_>=+kP~W!6u$VnL7F9YrgGSl(+Yci~s3?{qZ*)3q9HicGehg@hS8Y{m5`!~mrH1P(3KwT}7wkh`iqM;KYf z;hY_#?hw){2GXj{_HiO4p?m_oZ7Gt{B(h!4am$0rl> z+qV)M9;K>PjDta7avKe9r%O0ZZ%CSa&;_qA5sH|i3~H7a3?tw>k#?^?=bhvhh>^X; zO}DBxH!~77J|f>bG!p4?AaARslM{N!{W01eAb7`D^jd^jR>4SJ8j%howr0)L3sHk< z()?#_tOa|uG>y6dp0%F)i*u0TkN*&b_rhnb)`e;wyE(HA0XGyg{-24lN|? zu@5JBI&o-P4vc35H4WHlui3hJQ3kmsu?YpOmVt-?_`un>8V+|GdQ)R&qE)CmmMf)a z>e1L6sIa^x=k5xK@Ik!!A^lI?yGHC<>ZhgUptni77@3&QYFzKXoq9nL$$HNbG57PB zC3Uv%C!ZEczg0jEL48&vIm6{!WJAW$DaR~Tbv37JqYfIOO|R-MGSL71OClR6ht9|5 zX9!x)pFuZqJ9W$-ugZr5v56(Hc3S>v(S;jK81Jqg{|DT+hg%;!*`?Mb?cXtkaFvXl ze-x%Pi#@o*?2>}sIP?p#lkr0gasKeQv9~s!k&kxQqb5$8+M=1GuXD2Ma0nt-;T^kP z0nmN_uNJQ-T~6TUN)#P`oDh%@*{+%iTV?L?%^L>mNa-)<+B$J0sMk||1NgXd{w%0h z+|ilt+VySe8uWseFW-sLyQ%oZWB-Z(Uk-hd+jG;HXq{wLn&Cm?v4y^AVso?=MCP{R zs3(Ph7+k$G5^jj7$JWQ;nD?-`FS}LwK$i$6>4&xUoIB3r6GsHS6txvMO!O z2`Uj!LwfDlw?6FJ#7#uI2N5MsMb|p#MV%^(;ygH zRY_=JBpo#_xkR@+mvQ-qFsuq5tlul^vI+)QZnCiv`}^W*&d?Yi>v)!T#jcye%@HHs zB)Yv2n&&lCC7TKEh(oC=$DvKu(v%$DoejB34$tIs9~6$r_v%f!w*Y_q%wiWDpF63?J#o*}k$7cO>5tJ*VY+OGr__7N;7_y84;Unw z*zdE|y_;(T6mg*vFb}#JX3H2QItPzqf-aq#D#MW?t?}m@lXTUA?Afc<74C82?_NmW zW)lysIk8e7)GTw9)Z%b)jOxjo0=I`>$s2*giAa8;U_$u3Usz9Yd1DC!yYGJ0{TG?FvI=zrAj9%;8c&Z)p*EOpeVL~7@5u~o3(|QKaOq>`zU1_ zkp(`?8oJj?<2ta4F;MAa3*EGfxx=J!TEP5sm`pCK#4Q^L;?)stsQgkJ7Y<6h`VvrJ z5|Grs;$fdndIHEzw9uki@+pb5kd@>8ndw6fK@n{vuH*+7*jF~iQgs~S>&*>fa7aj@ zCcN4zEdr+cY(`$>S_s{Yt zSDXq@8HE1G0W{PgG&mCx!vbKSSV$!cg@S=lkp+)jZoZsVXEUz5d}}i5Wa6r|yPAZ7 z9S1quiuPXxV%co=b9$$4{Y9bQ8%2LKGI^thDeBr^fc*xEjad5#5+A>H!CboIJ_ld` zL1uy1$^EwP=*&DZcVFLaZO#4ib(kdxGGpC56_@t&!Z!r({=}>@k3vkPOuN z0J_%==z%e@3jv})Yyd*kAOFAK?zyQA1_Hr=&{!}O6A}c0aIl;#Bq0byVGx)^#|)`| zeoUL4bM2MJ*)6G6o@PzhU-Bk=XX`h8bNqdC3HhhWkJ?yFQfQhF|9!2&!W4a8 z*q{sR98DL$x$rzMZ0}+TJm_97l!d>2mN^%w%ppvZ=iT!k@MqMK0n|U~>x$hYS3^LS zW-I#9^zRb^3rkZ_6{Zc=@4rJZ(H$#^e@hDP7`#7&Kn)=%gzrdQbiqw2AP41xX2b$s z144o@kSr<_1;T-Fpjav-Aq2!DFsMY%eYdW9-<@`6T>Eq8qb^jfRyXZ*tLQ7cb^brz znUl@jlc$osH~AVd{Wbq;=B$4t0s`#1$RL76hrgZKSMNG9>hShgILDL-{fyV+q)I$@ zwlLPC+b#yP;`X`99fc@< zQ7zxwsjvW{K_KNi63bvxghb;2*oX+)gTLF`bGr)xps=8<7z+-B#(=R9Y7z*Df+R4v z)0@f0O5>T5@4X4TlQ@#{znH3(>^LmrEuIlB`5*PJHzRW&#Z~p$B^UVd_4W{~c#5AD8*cP4|u18_2?R_5V)9=6^L*;@S~5$>Ni|XcgI^=;?Yej0ON6U_{_H(!TZgtgl=k7~ zF2U`sQblMoKdooo*M}~zLj0?_=NdnsHl5m!-4*<$n>jara<5|@xMv1>?7!<}dZt^v zysVP9JqXFPCbz>e(oe5Uch@ewXF2GF2~;iIGjK^6r0D4(+_cZ>c49hH`VXz2>{R#{ z=d@D-niq$yDn7!~`6%B1^G`<|>3&V)-Tr3j`1ww*Qpo}CF2?SRCy!xNd&s;oJPi@XVz3!WEt#j2i zR@W2*|J_FNN6!AS2K%@1v+9=KFI&a@YASUno7!06SC>#dO|Q<~Mf#9^rN4>2?$oV* zTpBYDw_1^ed$CM+EBiw}$7u4fc~9kMOM6hC%^MbW+rKCUJ7cO;qyJ)Xqb*=jNn#03 zK;=#d3ohaZI0eNQ3kph=1!MsTP=D|L_x9zeP$mrq10iBiU@{jA1;T+~xL7Df3Iu{A zFo~I@-QDos{~vC+@$Jo8qU%vR;_o}u1$WIWvuZZFUOvwba8?hO+ABo5ILVRozh~+M zKp(gKWgSD{|F=iZKIb%}-1`!KR=Y>1*aztXjXh0L8EBn5-LIPVH8oYxT*6WR)%xG9 z39IpYY1=TxE;P9{8p49{<~z%%ea>HHr4*I4GLdDI+UevJ`+5s-fK?o;nL#0$goL!8 zoIC)p$5;~dI2#%RA#pHVEF?OFf+A5EM204PcSQE@h}^HLUIMNp-%*(T!ac>G>OMv_ zerBpCfIi>Ozb~t1T5R>i#J(tX7v%jcBz?NCg69_0#%eq24z6TuXA7h3)p_PWZ|P5! zz3|&=UI_0yQUx;7lYTqMnvQe!Gl7oJ7uM49NmL_YpJ`Za4rQ=vqSx3g08YHUxMrja zVe@i`1!Baxlq{kkXo3fk1k>(-j3_;~oj+&r@)`>Ug293?XfP%X1_r@^uwYCi3k3*4 zK#)YH7uT)HnroY_Zu5%CQo{3vUV}mQ9Qot<)xIhJy_LEgALECE&qvoNb$6}blg!zS z8oG-@`1m7WjBMPVJe$a0hhq)xA_WRR6lIjmXvIpo9C3H~b>598M`?onFEVNlB)a#s z?JDW5X_zYS?r1pWKyl6wPj`Or+jSe2yw1Z5FYqbn^KaS}_@Bvn@j=vl9!a>TdN)l@jVCxk!Tlyw6&Lq3-S9rSf6=_c7>D z+3*tR#v)FAT$DI(@0}f1+;{2pdA<>20Up;T$7s={d8GGwUqzd3)sX+sP)nWmM;dCc z+w;xV-%o65Ql;j8S_5*%ks%)=7%)8-5Q8Kv^}|qzD;s9_C_5RJG3@vmVA2BVqDf9EAB4}iG4-|$(P#bt;+;pqHA3gn_nx-!SX4VkeJ65PJY?( zRkUvR9SpQi(NsW37Av)V(T{(BCD=vp!D*oD0ll8cEx^^uAYeb&(|NYxf)6Ul000Iv zw2Vrp6wkj&i8lBs<<-Xz#zzM31*yctSnjacM5%RTZS(0H5Yf_F0Hq=Fq-x@Ubv7nh z^V}X7bya$?CXCCLwgFE^`EyS1Hv2P2&<_g^R`*E^quJw9}yv&lzS5XeW~)IGF{I?7;YVZTmguV>*|%P1*Fnn^XE?##>7IVE0g z*TCcXi0`9YrFvdpGc#FO7&<5Z*ZAFvRbP3+GmN28e771C#i_u`p~Be*Rw{)IP!6{c zX%SWcQB)49$8w0NUN?6{DpWE(50@3;?%q>Lu9i+xEgVnL@RaI%eKJy|^R55!0+(Jd ztH4S8uy4eDgXk}KZWl-NZ>VG6I+$(L9PxjJya>nr-=PH4B~{#FUhLjV9==ti*lwh{ zuPNN==${P>snIJ53w*q6b;!GIPLn%Ta&SL?_%~J>cm78QEr7P7*FFYX^ixrF1VHyI zF6OC5cwD%*(y8kul?QN`E~&>YoCtDnLgEGTyc)mkFciPN8OwbS+@V0l@#Zox)ENG- znb#2S6KAX2ESM1vE*-%pfh4-A)1CE&yFDCi5>$U_WRg&K5$Ub)LJcVx&_eunEbN$D@a;aE6u zF1(8jlPB}3CWm~VAZ)MgfNXIGjKGK$7bBGPpO*uhU_^#hREGV$m|t%!o=Rnvj9O=N z8i8b05BdY+DKtI`e;V`4bqa7aLDB{2$imcqy;3lPvF9p9Pa5J6wqtsF2L(TYh+1=%aw7YIoJwCrqypf zcfsDb(Xt`B(uexBKew9k(yR(0VA@|Y%2w|w-Lu;Zv1a24p`hhB`3b0D#;VOur_0M{ z*jLlPX_hKXyVg(hE1ADwVe>OCuRVnlZ}rjk#8q1De++xH?|DX7Jq-QhlTyD?hc!oS`0R~i*(q#oV z$(8MD5`3HgTaynxlnucJh);f#hKhyXi_+Q7Wm~A3kbwW%B;b(rQ~&b2Uy9IK25BJe zpFuM+Y+1mAaxz)9Z<+SL zMr{y1J@&W-Q<}^g*{=5*)C#V}Wj=rpyVJC=0jRs0#%0I+!RMMMs2e~M^om6UR#*+O zZ3ioF79V>vL!$OaaFCMZaj?I>JubFxI;cP z*O!H;+N;zsy&`~rahYY~xBTbo=jRDXSvk*dddC~wBs>%hCscnBVrncSvYM}hJTLNT;vddODQIsCKUe61hXCfr#8Ph=zB@=FEpq{AQubx2RF?JbZG{ znzYvXkGcW-m&lb7ux@?RQ{Xs(<@}q9{XKfu7)?@G`|0}85)MAk8FWTXMj5!We$b|@ z;;c9M<|gtdcfs>^M;OUF9{s3tH2IOocGHuIi(ec2cu5%{kUzOdr?y*qx7!a?uWkvQ z9?>aKQ9idp0%Zy@8#HdYsv;hBV;^koA}1x-#+aj==}R8(Q?yPTNNhIDntBU7EjZ96 zbjHLMH+25X64dzNaWw<()nBPWM*>!eld%Fvppm5-GizutAnf6&gUy;f560>SS&2aF zSM)EviXLmctkdpTwm^KreLYdPi;gi=^YZa~IzAX3x764a${e198bynQ4N=do)2)TF z{ZcFJrkkNvrNJm|7rZ#nchwFBN9oUlT;sMm70q7&{ydx!oi)|7{av2OyD~@pyQg$& zW2iCCw+mxuBcsN%!debGVWa;3JT5;pL{hW7F81g{Y+BJ9)+Y< z(ZCRSqNFP24WnYM-&X>7eg}NrCh(QUxV$^`#6?kgRVYMEU+@2cbR_!!-o;ilm4_@P)>3ec=oXQd&Bih=(K3);O|&!bA~{VcpiCAutOx zuq2Mle~=fs8>3j5wSu-NGCL~;e*U9mFow~#AmnABAmMgx+K^B68{Xw>IeTABB1yo) zny^Fuwjz=$s=&eCpGpz1@pkka1ndG{DF$CI9I?TLMv}KJlAf3pfbJq8ld&!`+wCn5 zl?=UCw)t!xV&!xJTLyH@;oYZ*7MWsnBgLCb5?Aklp%KM5B}W()c1_5nW zK+rR#3TNp$2%y5;7vU45MRMCigdMg=+dc>8sLyH3j&(i(5xD>sPOq<9tYFSb~xS`vZo>{beWPtN*O*m zWq4Jhk`$3%$rLBw!C-5$fg)B|kJej>66Gm}dUPJh=E_%3wb~PlTQG z%R8^&yR%_SzwRR)pXG~NQN%QxN$Pxc4ei`EZ|gna=q(Q~suFzWqgQV@<&WA=kNX0*>t) z9avw0QEw}^DcjMemC78{`n;Kr*^`9SKVK2cTA#o(coygO;=tvx7eJjBB1 zq5t9ttYz6!OcGG}p& zX%#!!PDZt+7qTM0-Y-ab)ud@NbNKIf-VX=7MW(_dz&3i9IY(}0%KL;V`;Px=Zr1-0L+hafPE6RQ^Euuc9!vp+1>=!3G@ zc`%aaOGf?Kts8klc9}}SL_tWKtQsIen4nowebk==yPG#rX!x2_Mr+mUOGykx5Bs61 zrv=lp_dYCUa6uote`6K=U)oOk1WqK;caCmI)3@L+g$B$g+_8aM;AX_r+aoLQuCKh|Z` zdN1m^SaGf1L6@oZZNL$f=g}%+l{5Z&gl^6q96Nz~I?hzm9QuIy@{&x}>;OWZ;hJQ% z-ky%7OftTOC041(0AX!Y`-Eo@Qhcee0JAyuz|IDBw3cqe?2J6R40q{&h8`685jF_D z*hS!Fjm<3!zJXmTBwEO_Yt0?5ZcwqLB@fDdx(glRwMj9znOP4yQ}zkA+44x)jx4h3 zhxV$Mm=g%5m>X}er5xPMN*QRzs%-kqaGMbGk@cU6ssOQj4qt^D(@t}W~ zC9&Hb@38xZ2+W`=h_TLU2NcJ+m!WwLBGXEo!x!Gio+@zZ!IHT6f(5zS`RK0e3Ug!x z^r=e+(|ArYt1m#ug=_3EIfL5b3=ux>L*Z|B{PaJ4-D~BeS8ZWcHmsu1LA(6Mo|7z= z=Ti2?FHFS~MXm80K>VNc21IJzJbRhk*%aqQ!gGZ>RWLq-sO^+*+%P)!F5jEhqgoug zLb++L5G5cz-M+z&$Zldd`eMHdGW>A@Rah`+mVkDIYOB&Uv;X#cXQ*%x4b@{?2)Vya zV9$qpXC@gqcwJ|5o9zX~)&Vg|K{m6mIxRMCJ-YPTy%MAp>g~>Ai#_c##tVu3n?FX$ z7{oNyWmQsZQ!f~t&{9!ohF`f*<ic)Mv*N_NfTrwzGUHftqogs^8sM5)SxdLmGN z1U-ASyw)*Y`=8;f3{e_mF#LC#jT}HM0%kcA2us1 zk&h1Z?G7CVLpD=7JI0Fr=H|;0gbgTJ`;kGPljY`EB7Vz7I%QYXjyG;HF#89cGUfkW$604rMCqMl7A3KRyy{aiKjNEqk}$d5COR@E}P2rW@gNoD&3w*D)2}< zb5d)mA@JzV9`M0giQBTxHP~sS~Ivn8VJd1haZbHKq-vIu-X%EZJ0~a zrUl0RuPCLTKIU?to)-Qn+{vK_+6Uo@$LVeq=7J@_=N+e-+648MAl`)SxaJ{8*nRsy z*WFdd!ub8Shs14f9xRd(2XKC&)#Pc{}uQjXjye)C3e-e3spLz;lGoD!~q|WM4pK>^39|P z25CN{{;@9t>cKNlL|Yj>yUPe|j&4ei<@#$ue*IE5n$!y$mrxrYMA! zDT?3`J;4t90VI(Dn1r#SvIaZkcQuztKO9kVJSA8769tltQVgK=mizP?Yt2V(FuWxc zSQ|f#6=7*w5>6@|H(0{9N)12IYy)mOz4TKfTN4E$+uSrB$TnMlJ_q}|UwtIFH5lgl z1i?JkFM~#hE#`Yd&_k#0+$`eo;Yx%2w6qo&{CP5c}H4+L+wi~Kf7pjYP`NZF{r@!oNiU!Cd4ctguddcoemh3aEWz|GeYh) zz=*_$oZtg`3#EVhz*(WnXJ&<(xB`Py%qWfr8yKlP?ovj9kdeuazG(HtA+=iD?vzwW zwiZYbxD)I@dHsUJi*ONkB41qk{PBSg%y48hd9K?6`BpHF2#VmiUP!Kt1V=ydzc{H0 zel^Q(5s6EI0VEVCb{Gp4#R5^FlxR~3vHgBMI@Nvs=f4kX-^W?AC8hJmb(WW2z|T|l z`T&1%zD)S~U%UIA`ZrH#*SUwKJuAo5lAm2?`{ke9+~@XN?;YT5nt#?;rlZ_%DdTv9 z(iPSS^{dOfrme?o)-^L8w-L|1Ms4Pc%MZtOQl}tkZ%0mCkxSiYl%8PEj-vakafa~7 zfKW)YI^ZOf0WE_Zz`cM%6d$WUzyGb`U8 z&65gH(AP)$IAAMDKeaA-a0`c%#LJvZ_xJAsdr%e(CvkcM^r0bZ)$On&;4~;B2?D~Q zIFK$B3kAZ2AfSvQB?y?pA$>D=_wipG`R|RyM7ndYE!MgXdo{1A^Nj(o^>?7~ z!=a5wc8#CSpQ@~LU)@PT-{<*VIf3S9?dU%l!R_h6)9wF%h@>aC&PCY8*|%sOk4ALg z`$Ah|r%#B;nogMf{?tVj=Dg+yVF#77QylnY^-Tov!Wb~&F|K-kdP)FMsPXqt@g;bF z&Q}D~R4)-IU7<9?Cx}bh&=ZIRVL|`B|KGoafv{jy7!w8t!GW-#EGQEdLV{43NFoym zjpw~~dFG@qDoL85S8}y7#DM+Ak(|q4^Q*J=eXXq@LhhUBmEq;FqjjLrCo>)%S@-@Q zzIJJA!KCzBs!HMmY=`Za$6!^{4qN=AcYh zkO`P3i172+^U;>npCMqH-uid;*JgRZWu5>Nn?+CDn#M=3m30PAp)gcYPH(?A-Ncz) z`UrIR&u~?E>8iCTDdCr!@Ty#FO*Id`XT7&JNu6yaJ!f1W1boUf#Mb;x)wA=RZlz~+ z^Wy)zAP?{w3<`q*V8GZ=Dij5U17M(7Xe9{@N&BxX61R>{)PW;m&4q?h< zK@TH0HHu$zl`Hk zrWeat0zWRBHy^P?&_wb{MyAlUSjmvQg0I7X_fQ1Y0L_q)DC7WyC_YsGUH$U(C<_Jy zL14gGC@2h#!hw*$SS}VC1cHH3kVGaS34}^vUG?vsSKVGW@!ubR+x7L6tw7w$RXXaSpW7A^0{IxiA70LA;^75Qb z0SN6Iehi9p_JFC^##9vuSB9nxG=&+WfR@+Ui&YQDs=>Fdp1(FTsE|5i22;sbuEJM? zZr^g0P$TDkbaoWq`szdwP+0+XQgNbX8zK@0`ueQu30MtsY(uIlGH@2;yWiwf#5_b)E)&fR=-A@A|~-?Cqt?&cH~ zy|E1chyG&3rXDgM@&ojO)#dj=g(=UqpH7!`k7vcdyGV5}6gvEVfQWt?-aMwX)px7Z z90p%SYFCd&{GaN|$Jtoaq&-^1;!7{Kz$!DpH-64L4dHJOc)Ca2Eu@`kYp4I1WW-}o>{A@lA`kEZtkM$M_bZ}0`_UY zZvDG1mX>b%_f?tp{`$0=HTr#Tr~3M8(KFXAoV+_XY~}3x_^^Y&DUg1%`_qC5u_oU) zVB*(L_pf$zEQ_;zbC&G8?5Ixsx7j?@dMc7ztoP5}ldTCb*P&(|G-4I8Qz&hq7&9A2 zGVNgW$SM0)tY3geeND!m~u}q*W?;b;|GOHl*YO-Ki*nKvy$%e86vE% zx=~lK(UFZ0IwD{& zZ3pVoJ@%1m=g>8BX?T-ccA_qq^treAU*+Zaff}LVzqM)Bf|ClS09~JpzN%BtzSl(x>+;(NA1cIVzDwIdnL*bvJ$DG81YJM{JS1 z7m^hm?NAHCSI4T$hl9{v!oOs-qEtXD3-TCP9HC1A(hx~VsCjuojM(y%mmXrNXEM^? zRMkNM8{yZBfDkneJ|&_!wGP6oVzhf}wP!G-(7R2g zTU+~f^l43N-DF7gs{jz5m(2+K>cO?33j$6+a7Ud0d#!mC$$RaynwoSX-79@FCS%&? zYTSLOJ}4$!hYL?w$=r6~ig{>L3)&HuQkARkt?Vuka0W(py?q1NMF|%sFEF+hc^`K$ zc~}SwJMqLM_VRi=wBoTKQSyTpLBTR0Y3QVyJM%IuOe#J|5hW@`_Eo(8wGs8*3rzuR zurZC<8U2cv6JYXnN(+QL6EHZ&-Gl^fEjWg}s~}@A*OO=nHURF_fgJBAKh&g*lG>@< zUc9xLC^A^ny=T%LYmBm2>!}Hmg_*~~X!YK$gPGhJhs;{v|mEn!u&6;f!_ag4&r%k2Nx0BkmkO@?&gB`Han7bKaz3?5e zN6E(*-cGK>qGPjr7+y#7F#r+Q7@kDq5F$_^0XCG$YD^tktPOZ6O}^LHHjJ^%tr$Dl znNIjfV+c^b-SHj)IFQJx^bgcI*uz<(H=B_UyouPpzdp}w$K0xAcNVe7R|<0X-K5?E zjJdohos_?4eOF=GKED!QqOOf6gF{d06x@{XS3ZaeV2Bocx!$vR z&!+u;48KSYa$s~cp<>)rDBLkYdK;?EmjeteZXqdt%wGekrYLT&WxIxn_mEkSQHQVY zp-Q1|F&@M5A|_cQxBt^4)dP7LSL#@65ICNUK%a5@rw|)1HKPlw-N9F3HulfA;sbqh zZ>P!4Ild#j*{?_sHxaM-A9Q4nY^$#HE^FK@nJ4}VSlR6M5bTkDHRMBbkgzr1*b@d# z4bc|tC&yI8<*YY>|Ja7*?m>Dxnj!;acPG|zeUoNT_gVl01#`Z<4u^?bWwZ!HK!V$r zjx7BEdD?YTIS9bWsid;|Zp)$yTN?vVZ>~uH(WgdpwO+^QVk-cnp7zxjZpNUh6F!HG$! zSC>p=V_zCPz%O`bfdc92N5XFJc(kVwDrdB})l)1sX|>+v^mmko(^U$}M!7;}r50OU z19)E^y&aF z!%Arna*52Rk(ek4hmM|w3!|awjdG@Jkro=V+`Jvd#WD@%Mq6RbqGAU2pJ2KrM`qVj z7}L8(6zaqUl7dLHLX6PH8j=Tb(*Gte}7|K_z@B zMg057sH>wWNNbQoLg8K(41B{jof(`wp%X%tV$OtSzI@Dn=h<49ofc8=oYUnfWG+*`Wy1?+^dre+&$hYF>TPIjFi*Uj{TV@;*E0lhK*) z_DzlZ^!T4e)wFzb$3I)tu5`F`5kRZFB|LC6PHUxnd@y~(>zBlGUZ{rv99PSr^s z#^an6qHD zpjapv3x$ILV7O2!6f%UuBru8I_ir3ew%qs`1^Fdnm_e0jXihJswkIOPn>N=F$;EjJ<~k?Tl=QJ@h>kbF0F6UYK+Wc zpYxcChLHbh-};(T;;}JKcC#N_)9V93Jw0-_Chk(#vOd1Rgg8^W`s7yE$ z76OAHm`EZc2#f-)HRI27>)mbqd+~WvRFao9R~al-`D6PB|M*|+uaw)R-FD0I(DZJ- zT`YS-s(QSCF3&FTGt-z9i%f2tGe{(NeZAVPjjgjtcX8pIAtW0VkLsp!pO0bH)Ogcj zRMX$rE_UPBkhQoDLc^)j>}*h~=|T3_ddo|F@&p5x@{VKt%kYt1=l-!gie>6+dam#* z1b55xVm5k7#QSgb9BKBfo}|zDp&(LuOq2A!82`W@S#{QLT8WKz7D7v#*r-n<(&^Y(%3S0M$T_+0dC-AASi zY7BIX(X~EwX6KgkRj^(wJcEkT38_2>)Zt8mlJ6s;`|{P<#ZxEsFb3MqQ%{Gsy>81? z={G45@0q2k1Sju5+e!TA+w2qlUz&0q(u2Oi!0noE#~sjy9EOCOA#P+mi;ZXncgGIm zi(M7djvMe}a0*ik_=G)C=XG$j6vRPPW{noF%-H$styLiy7 zt>iX`6~7kfyFjTp8m;|L${6)2*TqQID$<;IT;CdESf)l>6zaZQKbk_H$PgarfW|$+ zgj7aZgwYX^AYD!;68F$&BD(_j`~H0G%#o|`y8@KFb_ca6;n~m0FUhsxi&Jf-CY*nd z{Z@Jm{uR}*R!w@|Z0DlMvuN-0%fB0a0oa@T+GC#&maeg)jbaf-{t{I6t}NyOpW!c_ zTE~NCi#JK~i(nqOl~5gX6uL?4b_pzj2EMC{Yn$FK()xK2ZE25p(6if6ad4y%d|g&< zFYM&Ctmd}a-BPneEyGUP%~yExMihe|XI=$%z6|zo%6KC&VtTYUmA67!>_(IQf4?{Bgen~dg%X|-H8Ip}-`g{x(p_Pc~h zzY*N7KFJC8pIOM@aACAhyh{ipkvD4(Y!=Ce*V5)i#foaW)DX*wF)_{#Aw6l4(5q^G zjX4*bsvsVcDz{V+zmKlERUVv2Y}07QPR~^Kf3xrjXKr4vEmrkR@8;m|iNNAQdsPQa zlpV8N!xFsP;1GMNxCjuK+{xr(8SSj0EVT?mutx@{#Sow@#AxBFwyb*OWsBirQx@EZ z99e&9-nOuB-hlqK#_C9uuFa6|{0F0?t<3OhVs<>;T_0vAj;B{b&r;20X;W|cWaScA zqsV=o8}&!2BSuY9J6OBsphR0;)6m}4PX+=rxEccnL?7Ts000@(L7HYS|Gm%vg(-viT(QmOD%hOihd?qzgE$EtfU>wc z1Ug56(>K3SU5Qp?L43dIdrqWN zEZ*YGDTxFL1$YsE9Z4gDZAb{3Ou??t7JkwPxvl$E+fo%{SK=Cql-p0#2*?yDD|BZV z+?F~Rd=QkR&nSvICI*$UHM7LVNbtdXy=#SB-BD3~B){|N4C5RnAzvE{e~hJ)Eye zb*zCHdx_(6a-KsY4294-E+_&Xq}k==9SbGSfSkj|6uh;tdB<Br%Pd)2dPuz9IwJz^}YphS_Nb3`oxmWT#2q25DY)F1-`gs( z>b5l?ZHtiOhSR$e`WKqsYi3l!(w}ilW9S>Y81Fg*?ms~;XBPRl9m~&_B__T2rV~zW zvuM`;=z;2`{AU}+11YSa(i)LEG5v9<8@tz^w&E3o zXH0+&3gB#-?U^vux?672-FUn$eLZRyL)BpU#R(xSm8pptA8MohXL1}T-!MizMr~!) z4ns_~hpzbq>QDSU_9a;o|*7+k7~X58qygDlai2D%`ANa1rqI8 zY#2K}P&MpRs4qFFh%w5dOb~7GA#AE>=%k&jeZ2Z7k7w)XqQjjl`*2a4qU6+RJuNI7 zAL9BQxg#Vw{9Cju}4xk z6~b4CX&k_ZTlEQOy{6*rMRkhK!j8$GTE$P8k;l1h>*ik>H_f{g5a0-tu8p+}@=F>T zW?E&9$!vQDoI$oP8n+$37Sa{JPX8M@#a1ad$DEO?mS(G0@@UWhvYsr#wI;xN3^j>y z5ZP*ZrM~M1p+Z08zqy)~%_W;88YL!)+mK7k+9q8zk&V1B-0~!~iPrc#r0_`6ow6MU zC^Opa+Yg#O)#|HHC9J{whl@|*t@cd26}@MMMy1ma{*#M7{<>Z<1@+aMc(H=b-`yn< zpq$Cad#kwzl#YYM5t!846i=M|(ApQX^Nd~DchnABQTE>_#BEJVj}O4$C=Yy40P zB#1*P>jgY}$x(g(F~1!?Fv_$GtYTo-Qjknv@TXpIooKo_SS`Fl~cP-Sa{(PdDOeq%bBuPU8M}A7y#RFZS zeleXZGO@sQdHb*_GpvF@$zfL$@pVPAn}-_^k<=|f@Zr7e!f*^LNeNqgtA5OO05w$}M}}ncJu{@QK?R>gN%l0m zxtm>b5Aa-DR6{$s>?um5F;B#-6}$<`<;MA(uP1)EZF=9_ArSESm%Yqsy@^rTbq>@k zK7VYB_|hkTy%PPc5R|K%to*x)TJPdMJP<|TGsrX=k(4kTm$$(B(T;}z-Y0)*r|KKu z;5FnKOedGaXz2)&E&;!|azjF?;l@{jEhkSFISMtw{n_JRk}^BwRR7^_qTvhebR~wL zrLzczyvm9DMEFr4f1@fn1u;4dR0goEZN@8fDa`8uA>yq0M3?g6s19O3JAE?gQStym zPM!+y9aUJMQjC@it&9iy*$J8jTUP3UdzWxXeI7{u6zDB0L8|`NgH{OQwM!`C85M_1 zk;G>IFO<02AmguGvq(vhXA8G#T5jEibjzl7SNfg2)lu#7?D+gT9-Bo18tASq;><U3DXZ6S| z27HWVGZMV`LKONwiIH%PNA3f6jWPysFB59AVK)O@?idSc)%}XgNdZ=s4@WmYzY}^> z>Xnxo*8z1LR3=vR1~vt8kY8)fNiYTe^SO67bN2a{6?QN-A??WpBVwXv-%XYZW?L{( z3?=&izQT`h*p|=>p^5({dQky?8X@gQtBF+X{%~*j7=|$s7@gpwN(AMEWyolW#J^dv2Kd&yN$a^ju)&?v% zx#(d6WrF_3f59UgpC_p+90Qv|Pd#Lj6o^DZeR!2duA4(fF~7D$<2OqAeT)h9|L?obq&qO$zQ-elhR$IQ(89F8l0Yg zS~4KXOw3tly`@o&=m3Yrme%^{XIZv}6?ZRGXCt@ul?jI0NoD2na5w_hTmMQPv-cq? z3*MWOd7{CM!HVGM)x)WiK`tVNxsdst7+liG!Ij#j(K_Q(yJhR5*qpMY26G`UiP$pqI5qeSQgLmYrO6RB z{2GK;9_CL$JW<9a%^Fnt`ZhSc^T1Z8^=ckjvRFN4tUp~D=J zZFfdF#XkH`K4OHh8>M?Ylm27r^BM9K6z;`HMK!U@63dn5f_|Mv#%>idtSg^gZK+0fU;gP3u1U+SDze_pP6dE>m)&l)91(kID`Qx$~$_&|6` zEWd-F5+*&W{|sN>=)=9L>5F31%)l{vFFW{((G|PKO{QZzom7bN$2oMA6!M@Qnlb!n z`c5O!H+%DS3p&k`Sb7pdKE!;=5;K!T^OcCALIxl#7DqwRm~Mui;%6 zb=}nKpz?LNhn`ul`tbHXk9!QbuH)*S19>@)hl@IO|J0h_fhHY6ix15(2u-s5S}Obb zbNJ2t+B|2cvGL^yY|d)ykPpJWo69J#GlOFx*|i zI~S$!H<%Rs%d*lVPyM)ndyQ}I-;8v1=zRPKPT+}Sc$tB5YtGJ$Ao6NJ#o@6#+Qg7T z{#-HEd#d_0CB@w)R&&N*~Q*m z0!-YMoLrB|g}DkpAMmq2%V(V4!r4q!2qZiHBo z?zF8Av*Cp7*v{xZY$2$R-r_($U}cuFvP;S;>uwH^6fqnfQa`trtVua|tfxalCkkIJ z!7c84+`m#q>^yHttD5i*Wk=fgLi;G%%?!?q?@VMzWyAjiZCb>%a zGQAOp01w~KJv2kl(7Wmv+;9`zi6P}^KxjrrX;R{C??&44>_Bjvp6>_;HYdr?`Gp>u;pBm6-B$NW1DhThow>o%^)_^cJJ=Ki7S2dn`)$PJ zZn*5s5uHEF0x6+EiQ~SB6p+#ZZHq zA34B}JF5@|s$x+fU0~`1AgAFzc87400nqXN7RJfWTamZoH5;5Kd{hjf7_w#{1lW!p z&)op@BXqu326)Zvso+;&ILEv_0PuK5dSu7jc+0oMeKpy| zs|~ae*meoF#}7`n)%&*}JX7zm{bz*dHSc?S%=B`5E77g52C=lZsHY6z^Hp>z3-zpK z0i~jKXCfi(dPojnMd6VMrH}te4wpo;`oUqI zYMMKTn#=C*$X_q{RDJeMNC7o5CF2Hj!eerv*?7o)%y@Z9Tx&e2iro{c+PyP1nn3?DNJ(A|HE`C;E0j=w^PcST5C^vdbgK&>1BKakONbu z!3f*3Ji_<&MI8hOc=cNP5cTP3biZuql}&;-PvSp(e8M({9^fzW#aSTD#V9OW;Q~oq z2owp`WES%W1(JbZJTv}rvPgu1>y|V74-0GyTp${}e6pmV!Wuh-V7wEYmsUBx=GF=+ zR^t3Wp;vt+eqtJNJs|2TkVvc|88_J?@)I2=Urn+C`aiP{ljGsQ0}c`Vi1}rhS8@J> zR3N=&lWE@TK%FLiz&eRKZw3E>nuH7O!2Z9qHjSu-T9XK)D1IEOjYkHEzlZ~JO>XNIEW;{5A+kcRhXfHHX?&F-7FXczJqye%{QIBe%nt8S z+$5YW`J_!Iv(#Q*?WDoZi=G@qlj_V7?Wx-a{Y{JDd&|W*IS7Ys|1Z$376k%yYkWSZ z$}99(;t&5)QV{Z!^RQ=ATta=z+oUf-I6x9}XroA^OZqrFmbPTHV2KX(?t^(fNwm@* zY|&bELNo18FH4*PLfZin3KdJ4T(0OO=3R2i(9;5lzn&=iN|TTf*KS3s9c5__x@zIc zY`(%*eM=9@vph2C!0;$Vnj}@8VtR@?Zg%UkUBCuSF3p%6W(wSE*~C_utb<^fo>r=R zT^$I;po6j4h5kg{!v?H}v0G3LU;q)Ll#8Ei_@%Mvc!W3d@;W94J0!3~3~sI*@8e=0 zwuF+Y@<sYG5D zIEdT;2geO%@YKQE#q!|NQj(FX#(Mlx5Wkwem9$?{`>k|#6A@(-yN+=mO zo0Ll^nb=R1vJ}&kl8Bb8eB^$6ut;zCFpxm@3Jp8nb05q23GT%hsvdC5n&b6o_7p(tqeB{k;M30(a=F2`OzfH{7_$7K; za4{zOu^`d3nE6a_t3Ywff>EdJF2#hxEg+;192&Ub1#EFouZc*d<48q{)WcmLc%uhp zu4LyxSJA!#=3?kipeA6CGYlr0c_v8gV1VRAli3XPrDHHM9PH>9H9%_XU!idA#T)1h zqRv(xgi7ujypC{=9$*ZC190%&;TI&6JWY2$KxS0(sCf1?R$<>%T>sfabOty}l0R}- z^6HBQo7%wWPa$f@ZF9!pfSSzNJ!<5+^f7P5_^GeNkDEyuY7Z@g95;-zZi)ZMy^?2| zVKb6YNaN?m#&0eOSQ7Vz&QIST68SyPH~5Suypjv7TXz;`=0dkroXJRkA>rkUc$-$1 zx_C(Bly9+$%uErlQoCsAJoMe_C}^Qdcalq>3PuNJ={NQy{!&l{_`rF?1DdX5EOVwh zY$Rh8Xc>nh1mxC=NL!X~vKL&TJ+p~|Br96l)hn~&Ef^p`2Nc#n9Z_Thy2taaiv?0Ufga;~@=}o+7ImLHJZdbktes06X+j~{`QLGWgTIFY4<^xSE=6<@m!;MV_{l}+g zZdEGmO*7fbi8aN&_hu{Y-Kf_rR`bA?SluXB><0~BL?-8h1wOw922Kcim}HnKs_Zw4 ztUhY?a6B>nhrV5te6=+Q7u42L0{ljnE&{iGss&c(=D^F4H z%HJ&jt~O$7fRImapEL2D&+5LDc!S$VZ{(E!!)1bMrIOkt8B+ZNAS6btvj0c%dx>?K zVEAbY92YK29uRJxK&x6+z8m;sJ~MLo34Eyd)mY_LI9LhQ%h3F+(7+x}qsR|+%uYta zd107u1uTMqc!H#mZp`_JGAAQXBXi;6TS53?1L$mZeWOUog4h$U4LoCplNO}dg`gvL zKRY~;mfhD=#IK&yolC=lrL5=V{%*g0hXQ+cryC))wo)_ep0NrA3@G}}Nt4!RV>V$} zww^twL0%X4j#W!ZB#Mez6@TQ>QQEn~0lvne0V>oWbQ=o=0>Ln_pe!T`g@lG6po}8N zyyM@FJhzo6ny$5&R*6}yOx4;zey*N4yFLrmy4?@|f9jsq{Tp^QK3qRgqL!=lrJeOh zz>$7AqPIEa)X6aYf`B{l`V`NF-%?@fUsaJ zBnuJ(;bAyXDkK>N1fdX^g({NssXY4g+>dWuO0KsjTY2XEb;VSjggcNQQzP~D-5<^# zL-Tn0SO50gclyq9TKgpg|8yZ)NWV+)3n;wLoyxVl-An!g3%?rd^{DPKy<@9+p3oO& zB0~}Q9z2uP=u4I(#*_3MEmW2;>4X)!DVyV+L-h1(5D#|tssSI(zcOkg9iT5b2tR=Tqb7E3JC?s^gl{>g!6K z^~O}43_oY1>`T;n*H7{CfBB!;O{(q>yD2o)L+|cfQxZ)t#9b}rUwrG|jY1!qUl*PBrApreD z(_L$VTYQ=_iQ>1hq(Dw3U1|eEcu;Q$7O-9*M${3%zd!f*8Vm`81Ytm!R2T~q13_UR zSZEds1VVum7+(A(UU7}hbLVnaYEdqw)Z(fd2|0J6?bG~xo|HVFUaw5_&21e$+@nt9 zdHx5GDqcHm^Nslb_Y9}Ko8jj7H9fwqw&n8lTbeNScNQJ(X?5|}M0GIY^I3zN6+yuy zQ_n4>eV+Z;;)l_)^8mC@^bg|Ic;ROwyR(9|QUK9iJF7{=J$xdoq=Z8|tZzQSO zb19Fq?t~Kt!$E;iSS}V71_Z%@F_0`26A1!B6aZg5e0`TB=3Q!*P`u)jTTSYNUiB_t z^BjC$2kFP2-Rtvvw~;c~Gez6X&0N_U3G9Y$zusx4Uz7M9DYbP^w@*#VTZ_V6EiN=m zM5Eu^NUc{!CVmZXIqh|q)F`MyrM3|vXd&~@! zPu*d??7gf1Lci8DjNMG&W-HKN3|Du@!u8P<&Z}KT=Av;l)r6FyyoBpRI!`uMV8M}r z07n5N6c{u{3I#&KfiPe!6$%YPfng|6WEBYnNMRDcOPl?A-*q{+@8W9fomV=EmGLp9 z*0eG7`#SM?mG|TPQE#*4Pou#p)Nd5!TsRq_?E4oXOM`8*ud+G6(Y10ti{98d6wODu zTW=RHIY$x#5>2RtLeww#cI6Zi7^~#;kW%2T->|ojE!?J|Ncp&Q(ObtNW{8|wppe}2 zjS1R9(xgFex1ge+P3uZ?HjDv43>RUjFF*)FgIs$5-TyHGp+Hzp7z+vl!EmrpEEEfc z0--~YR3c*tk-2{y&VQbKYkhU|_wmId>a|mfbJlAm0DZH+3jdT5{;ulxPY3_DE${U6YAksC`XAx;F;|P|>JNA79`~~w zfB{~CFe8}eWbYrJJko>K%W6k8=8;J@u8sI6k=a2PNm^0JEg+;Va{#>J9)MDW!E<3d z)GtZ`PD4Rp&{&8T3=zV@K`>Ct6bS@EViY%7?8l$K_10Z$RmNT_HJZ7+>XKK$ue@^F zxB33{59RsY->bKF9sjDo@3YSs%y;{Yz$&Lk6;jThZ71l%ux;9TrmP>e|BRCTf`OEO zFkAhg8^?F-)D`+EPH=?(`$Cm=k6&?pM4Q8Rx+z?=LBi$C+knObFrc~J|JVD(NN7+R3x$IMV8CcBDiaw5 z#6b{*<`#L)@tWUUxZG8yYNhk6y;Pb`Wx)J?^VT{n>piCZ3F}X<+e25VrQzK3e2>RJ zWhRfk_e-zg+h`8N?p@qCVYcW_aV8S$?zdla^NhVXU1EAI?Z)-OXk(WCuc`4rjDE}T z{x|M8kN?klSay)iKJ1c-VzQIbmG1nwR2D_)c@&|hShRw4G`mQdvj&@%{I?>`k7HL-1uTRuVaZq~^!v8Dhv|7zu|j2i<^VsqU`!Yd1_Z)^ zFkmbg3kC#%VxX8P6$%8xK@+|8zrX3K<9Ax!>wIL%QdBsrl914RVS9Rw2mbSY-~9J# zT8zxR-u*wHbepQ~*X)zDKHvS6_BHzW-=^pC%oRF$zi&`@hX8fj1Y};8FaBSb`>irR zJ9BO{a`B(IET!(E?VXflwN)&W?BJM*_5;((G`@=e>HMQw_J3BdDe!G=FtuGJ1(D6_ zQweqVG4Q+28{4l;Y>ciho0H_G4<^7bD{ybVUyfnj!Z%n8&wU6icY@QT*(;hC6Zgia zc@@Kk=wYSpLKo|R7%~7L2;cw!9iKs(hA;oIy92h^c%oo_6F$K%7SZYQ`X>p@azHRj zI`U#pYRMWmU&G^{-TsQIKx-I4$rz~TIIE!TF2xGGF=CY;BjNhN?k>+?{Z`1&^4aN{ zyx~nz6!LNVhowat)Yy)~$+2C73#+p&yZ|ajeMuKa)^t}YPZ+Sy)5L4~_@MN>^$TcK z4-=pK;&ZBQ`xYcTImOn)l_$wO=32Gi{)lWP%Yu3^b&N>T`~;>)y8)}{jQNtDVx!3& zGZ;{wHq#c|ShX}3b*Q6w&?}&EO50)ink9dUTK(vYp9K! zhRqcg3+JKA0YdJBw1!)rLz;I=Gy&kVv>rc;HnxgqM~tpfSMVy35a+>kE@gwt$!oyNCbB>)qdsu7TyThvf8C{AuOeQ@cwxomd?k-;x5YwwbA)ym|t87n1r? z-a6P+5d{LeN!zykoJ(tYU2MfwzTD(ThCT#GC0tc~2hgF~T5=fjM^QY78Sk<>x7MN? zWF5z=htTV^c+D+fdH$0d1TO*B-UFT=Hs+T5@Zx}(&(X5Fhz|h3BilQp%FNK$iCd?t zI{f41Nr}T>;ODPjl;yUm*Plh*@4#d3iVc@FevrxV+C$84UpL0R;*p+=2OVgp6MWb7 zEq~3IIMs&US_pkA;+9T2mcIFc1}Wik>AucXlb+HNO5EN{Ggi{SN4liTt{ zBA#pv!hOQJBjR58pLpQA1LF@L%|>75*EVhJhGLS!A(&N1g;}vKQ1{s$doaH#``4|W zsE8sqNXKnPqq2KHml*{QQYL>Zo<%jM1YONph=wt|tK4r+i5gdtlY1pSWnP?e%m zF}(#b!hbx_9^aS3=6-(kuWf&KJNOEwdlZa#wVNug|G1a@vXiNg49$Hl?l>Pe@}_H# zCuoE}21CYdZ{0PI00tIBxb1JlTD$xXHt-k1QIbHmn(pud)6Rs%n+eRE4zrNcXLy%N z57vl+vVkH%)X1xa50F|3(3?rwE0KwJgU>B}d61|t&&3RsKo2o<1LGhpxUN)X_Jt6V*L@b61n^!`~VYUi2@8Ak2lw=6lj zFuSQ&t}xC=$e2^r^nyS)uh<$U?V4datG{rAwU4Gf+{~n(s`59)^14=rI1imW5=%_* zx+_d+7{%f^uq(@I2HN~e)*-h=tHCyKZ0a-VWf7*ll_erT#F<|otx&p8>Y2Ry>6kHn zOB!Gqb3QWBAV%2#r#D3xI37LC;M>AZSOdQ}EaX}|g;K|(P^i0neybS{XaLchFC&xt zAo|XFr>Mu9{v=DvR{V%!*qn2dP4F2^Lz^xX5z!G3o4}A>+KU;N>@frb$DH>cJiC?x z1BZ^q92F%eco+?M_9zE^fsF2K;~hzq-_1d9DnqE^z{#4%dj=m>4-4m;5|Lz)G`COt z&zNspkDV0qzYy%e997;3)~g$jDMxwBa;}SZRH*B!HEby!hz(_hcej zmT}~{i?-?3^Vi$uoj^`&)rkD$@`hofKM~N(Z7|ph)f7y~!y$waZhoqW@(Fgr@$nu9 zwq(Q6xSZlf?`5{QDY!~Y0#^%dB%kD;HdYIc=havg3$qlRQXKIY3-Ie_I9NL#(1uh* zR>uOb;l?YY?76TCXuBL2h%5g3)8|gl_JEjwW|?h&TU4J!fv(FiF$v;pdy+$3K%pa+ z#J=edme{0ocY#gIG~)McY+zVWj*Fe#&xzp6m}j3ZBCH+p9oB(b@7mR8{p|dfmYvlt zXRV$IrI@GruT=%l*1V5agrmB%`DIM+i;EbK(zBICwLEtE-i;GS0G z9Ka4|@#fE6!e$;4?Vt

^>&uqp0SB(s(nZAP%Ox2{`ej2 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

QHULVySZ}#~PuWJ^7tmFuh?r7A2=*(e)d45vEW8 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 diff --git a/src/adafruit_circuitplayground/test/sample.wav b/src/adafruit_circuitplayground/test/sample.wav deleted file mode 100644 index 362feec5a6c6d167193fc975a2175264968ab671..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210158 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≤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 z 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

0`oAv;E zHnbnSV)lWT3K{$_;LnffW&edU>L993%S{V!ys7GS1A8`x0#MMrCz;GOBFtv;Lr)=h zbVqVZmm`~WS~#w>8;&}A7u4CCp_i|wdq8!l?y~EgE&=N7vGr$b)D`;~W0YR0MfQ#w zXK$(QxJxv($5j=(PZhAcR3_X#64?zZx?QP4vs8UC3)LetQ{6U`)mbxI9XCVNZZklw zH{H}y(_YOmP1RUaOARs=Rd-WZwKbVk1CvD6G%-~PFlTP_TBbL5WFoL;bhB3)y;8o{ zbD@zA0cUoXM|G6kt}DnTx~QC@Gs!_ZvFxOy$-3Hv74+LMyM7fW(Ko}0z8-#3|AY_J zvG5$&bEn!Ju2fs0p{@@Hsa0V|wKQy`=7r_e)UYrjjT#mvS3_W+>Jd`aF8m@Jhwo&K z@G+S5zRVk51&>~kzlEnH5C4*%f&=n#uv1`=LQn#cFB}u(1?y%AhX!fG z!9mincaSjrBZwEa3x2`=B4Oje1vP^(s1|$)$_1~3GQpFeU~n(U6I>251*Z{*f)v4y zAZ4&FNEFNu;sw(Yql36XKSYn<*Pvw(D`*}h460+gYLFCrh#wTk`UQei*h{7$TaYEl zjK67ve2Bt9>YxN(Er(aD1&M0b9RhTQ-9p(uRhlPVHVZq>0SSt7s77t8VI*10fJh3bvq(kJC)q>)( zVo*_54(iIHnd_Lg<=ZPpHk$vXIU>ju+gyH>R z%ag%3c^Qm)GZ5-2RQ;DhBJ~Ll<^W2+400$Q7E=+NwXtya{u;JbiNgLWSvUq2g83># zxD~v5QWXgAf?2<+3So3GYdYOLEUP<)QM!LPSdR=B>Dl2?FzF+G5IlM=OmCjR7y2da zW@5_e;LcqpAF{t{Qkj-AsqHUI+DS6XuD~e719CCy<@-_1_}Ah`?2$FbaG6jaFQSUL zy3jb=!}B==`sQpk9y;eNcU-M?SJV#Zo5!3~=g_O%aOw0zS6aVv)%8!;UR&2sN5^=g z_+$Zkq^-z$|HAn8%en%2q#Ka;x(zY9H~GbkLiRipJ=r=^(Ci}>%>`1=JVLGgGwEi0 z_&yWD^O+rf&ywKGTHb!s!8>dEcsJn%eF3lN53|bSc9)mP9`@4MGhQKk#Vd^-w4S~1 zwX!e0p7xzL%zpN!LknF5l-^=FJz%3l2aQATqvw5TQ&DYm(`YUqP2|ea9IhrU=$g}- zt}|`shR~jFJRRzm(Am&O*SRC~Fe+FV-6Q(ceWTwU2eT%`ogh8SLyE9UqylS78nI4b z))A)2OvkVW&3u_WFFmeae*%6Jc0E$=Ps;C*C0Jdcm} zBH+`6e7%>J@A9(olU^}?%`40CKjI&}Hr#lOnzKm)KAUx_yu`czXC7qNAaqDM_$7p z&KvkscyoU_Z{u&{UHqfGn}3-P@E;>S@Ugz-WBiz6il0=>@Uw{7elaoEuPhdUX_xz* z#0tNU*a((gz^hyQ17f>>5^+cD@n492{!ekxkN8LY1pZ%sYX5|v&p+cA_b>Q0 z{9Aql|F+-Wf9`ih4EDeIqy3-$B%i^r8VjuYTV#`;8oZh@a?mdnIqH{)T=c6(uK2Yh zkNqZ*C;sn|&whu>HUD=^9xKR$LZ|imZ$@h-}6d8zSW*+am=roinmCk~XqC zk{oT^$eu_Xv=l8ztNh&&>F{qjYYf;|`GDCb9tAxcH&V190-cw|Ks zW81)A8hP!niQM&9NB;5GNA~&~A}c`t)BIg<|89%4_xDHY;P{H5&FCMF#Ps(?eh56j zOB{?`K)VO+DzP6f_TO)O#m{$<%BH6{-NIJ1B5=+bhcTR)DV@%{RABB2( z&&UbhHL{gAk1XR2BC~i|)XIxR`tz({&oro)$Bk6rUZfcR?q^1Jl!D)aQh(ZaY`^~z z-1rd8c#BQPnK=eoRbPJtGOT5+wLgb7_9r3Z8pf*l{aA6o6D#JoVmbYKEQenidSwZg z($5CxN?H~N3>wd8jDa1wvwOX-W|4On{?D_fwYS@p_g0w*alX0bs5$AJ-s6;B?Ls}reb?jNNByV!s(ZRu zx`lhA8=?&(tQzRu&W=uGa6PU?>9*lxGxaA|$93-nt%THmt0^?BP$AFafYGR+(Sb1VdFX^GP;?9$MVo zklD;}8Pgn;KlK*y=}LK4FGL-GmRzRC%ZYlV?63QSO?%4*`VU!Aw~_gE3z=4gL#P1=qrP!9QTjo#4u~;heTEyrt@{v1f>_XVV};iP5&j#*2%iKt zcp0$pGdNZuD5icv#DfByB775M3Lk=m?*)azTS3|IY*0Boha>$fXc-<3{s^~$3pWL$ z!WK@5<4 z95^cy%lwF3p!mW;N|`6ff;JO~KC3JhWC!hMm6g!e2(p0(v&p82R+#S;RAQlHD4{FH0L2Y?3XeAE^E#==qH+)ll<+)%e zzO`xcQZQHIsbunMutnYjW8MkQ%csG8`3x-iHqi1t`0+cq(FAD~4RfiOVF?vKtN=~3 zp~@OISNX!Os!Z4iy5;7=^=e|cL(K^fAxrvO?F_G~gW)}OA$*~3 zK?i*iO7$&_rGxM{xK`5YxH7v=D~suDva&89o9ME#y{;zv;Vd7gTglnFtK5tV!5%$a zUeVL#Lp?|S(3|8hW`|5^PRJtWlB{O#$@Zu;3^qUI91~q_Hi^{VCX2df3aW3WvWj8r ztCY|$3)z0SLWjfYJrfm-1!@Ew;Ir)xwG7$lc6(YKve(oZWU2q!7wVaPuU^@YN?WOj zGjQl|o!CWmY8O-IcJXx~L`9cI*Kw(J6f)lKE{7iAit353l%5AR-RSD*-L9qn8`<#< zFzPcmLVt5JH6crM9I`{F2B&5tH*`^OYI&k{UBXRklFD==`OF|v-i#y7%`DQzEGLu9 z7Bb%)B74nga>m>wkKugBz%vrt3NO9=)hl5$dUb6)eiPf*ood9 zyTbcyH+#bU<0W_3ygcr;SK0maTDn-YmrF(`x?HHk7o*!<4SK<~pm$ss`ppfcl#HXv z$b6cOtU?WbGp$1o(@x|B9YikCDdYxSLGICA|c3LnD#XDX*}>|5uSpqe+73NewU6LV-Wu?7{tjkG&PM+_GyFe3LNyrj2rH+_oQ z{CoOB{J`Co!b2L9C5FQ-i=T!Sf}gYs6r=i3k2?4@Ss(v*HWpRJh5isIMN@FsU&>DV z8`%y2ID772VPE_g%=tetdLuSZ5=qB1L<*p0Uz-<%^IC64=-#9{xU*zMmJJN%nq)Hh{N;Xjf1#h>U*wlYTh^cN*Y@Z7jr`gE@BUQ(4}Xf^%OCHL@JHhBAb*bk zC${S2ul2k5s66`z{g(c5KgvJtH}tRj)%`oz`k7zFf8$s3zx&mE=~wh4k(z#VD76W| zYsn)G{dAEQeh#R%c_Q8XVo+{NM27hlBa{6qkvV?d$V$IqWUJpavd?cBIpMd9Tm=E& z1p&YGdq+O_gTbUjBhDWKMjRW74Q~7mESVs(D3TDYnJ|LiV2x}y;{lA17b0Iwa4 z`~tl+M&u}%^+Lq>CnF#ID`3mNBX=-*?4o}na?(E?*$#%>=pTv91xHQ-U-k!Yb_aVl z@Mq%q=U_D2h)5=XU?j2MJ>p@6+E394tXUHpXHh8D1u>E>O=PaX$aE1a(qA~gqxk7J z7q9(F;;~;6DtK0L-cKV=__2{KaAXgk`9}XGU+&-Ki~TcvmVb=T@VD~`{u*Q>3-}0s zA|K)p<%9elyr18W_wt+ao_-D9)h~(2&pZ2Bc?UlkZ|lcHWF|P%jHg)+@ zuRNdS6-H$wBmcuo!kcPsBPB0zLE{t$-dUGkTvCWCM*x=Fu;16n*7-&?~M9J?^U04Xz+v;4;#2?l<&m zK3qm$yc+Jgm)~9W(z;XLFK!ol!PVX)JKsBH$9UWAP;a*F;0?8{z4o@2SId_43fm%H zYMaW7X_I@O@D#iUMv?R8E!l1!kd@{0a+(e#y=g%b znVKY~sX%;_j|4gk`L2_Z7jRzvrz6lzf4Cd^i#w+ux%2-Umvk9ydCVQqN8CZZ&TZGr z+y*@jF~TjY~}L4w-e(RhOw1 zW`>$)#;NgUpc-y^s6R|=)!sBv^-MKY*_2YnOfHqpq*F=FZz_)QmDbm(>2UTQNQ^KUE|3`=3 zs%78smFyNil)s0U-~l)y>xG+Txp0{*9Zr&k!qGBk*iB{$+rbA=SEdLnLVqnRChb+7mMhh=t`V88m;V?f~AU`XIE_bN+pxuR9b0NHYs!=8DAHZ zNpvMJXHA(~*TdP_LRQni%NF3wF37U_fi)-S!E!pXueExj+@>eX6JXBEdXapfm&uQM zqtrOte>J;MVK^>xnPak`xgs%cQAU{uaJW2|!_5ad&3uu|jg@=ghBg)AYTiaX>u$|Rp+ZRuA8?N@-si>MP0E4bq%I;Kg;2zKFE<+=I z38&5%)eamw)Wt)Oky)>Ch4p?{OJ8&?(7W{4pWPVkk!5iH?9drdQ!h$xLks<=8^hn( z7QNJ;B&!(%H_;qY*Q_9|kU{q}N6A>|p>yFbT4!F71LiyV+i>r;iGeZhsl3o+^n6>) zOM+f9ldTEuvx!&5w)dLYo?b^g%o}JYdE@MCZz+1%^>!1ubGLWV9`~Nxf4uMZh8NA< z@shZwUUv7&E9TyM_1ssl1){Gr-bfdEv(c`09^L7zcid5W$q9NF@zzDaqQ6i^@bDWF zk0vAuX>yVZcY@S32gyN;k$ki`DNU=9O0+7eOB<5rG>UYiZOH)Ig-oIS$wE4W?4px# z=a@|%(N*LN-Atmh!z2wm3mx^r|CEnz%%IjE(_6yQdIwp4=%rPmk+y(`w6B*Ewfww% zg;#|i^jg75)|$c(r3IU{l+IyE*8Q1@ z{Uc5zF0d=&2D>00vRmRgyCL4NyW%I}JM`2De;^otBx3VB;#dAqB;)r*8Z66%Wx4rn zkss5g_zh8k-xD>^HsJq?mi(IN%CCxE{E`^PFN#V0f|!R`%P)%^{Jc1U_A-_~;^)K% ztfw#?U0fH5#3hkM{3{A!x{|mn>WN#Tm4G`{JQf4QQ!!S&64S&xu~2*vtHpP*S$q?_ zgb@dY6DI`oPYWMx8{NMlV*9s69RHa}0IrP(zD?}E7s>taBB>vWls@rO`oH)o{Fr`v zKaroxPwHp(Gx%xzEPhr$ubgNF4W&xSz^6UBqpvxBaTll5?w&2r_epSDlUkg;* z5YZSqZCgYKf4JYn9}D^&=l2Ku_6H3QMGW+3;FWoZIsOo^@NkgypWxvE{(7vt8GG7- zZ4Y1{`?0T6An9X%1*pO05rzD#c>g;%##??8|B)XXK@n2C^xuld{uA*E|I;V_8S&gd zf_4WS73==zoVepp6<7UH;tJI0^Ke<5@>`3eetl4Xbr63EvDGguR{7b)QZVK`A7j-0 zIAWB~#4xxu`uIP24=CO3{WrX||AaU8AMkqqeJJBMcoqK|FYlk{CH;S(p8t(F#tZmI z5C?cJe<#oFZ{<1tb!eCK?EYe?>$7+^sOfq95j=}O5U=&(S^eL6X1^ucsywYwmV-N|L)GsKH*{;9p_SQHIHFJEY(F9h+bKTL zji?ALMV2;KYzBYMM#eT0p3Tm*y=X$4i*mHO$V^^y;UGBVi!nd_75qI%1Ks+r@^xgaG5WKt~sB4r<0J` zjwKJ#gIuS5$r;*}?5Dqz9keM~Lu--+v=W&`i;xjCFBwMDlRwZqwWSdfMSr@g^gmag z-f{)#NtXq^T2i{m#iWxRq5Y73w|0-cYVNd`&!Lj!R-<>E>3u`Ce#dqPo7O?*Ue23q zGb59a?{%@%Yhd4!67~kkU{8=Zb|W(X1>~t2NiLdR=&755O>2@FrV#nlWFeiPd)9_c zrJVWca+&{J3UkNBG3TLs9&?}cHuqSsch{hQp3+mHYYugrb#J#&w|BF3Gu$<5xgk(A zdg#Kg4eIyJp>)*M30w`-@ymldOF#oHtY6x^`ku|IuiFgzj7_8WgEjZq_by>`4(r5fkB+I>_#7QtCkoec}BYls_g7C#CrgC(QXTg1n( z8}!PaP}PSh8;(;EIZZ{Ai`1`jrHU)JsO0j1N-U3oF)ylgP~fx6r}(BntAf(0LdbSX z%VfxYvO=*h0p_fZjHsnjcV~l*+eRQF+Lx(%2HvI;*OZcqV5} z+gdfVT~s@;Wgk0A4S{cSyj`T`+I4CLuD&hym^z53Vf>9N^qPIA9^>l$fU8;Bc)0R& zq6a8|?6aEA@0#c`t^<0BLAt3MuRFOVy06=WUgQWk^rD{qzux7&-h^t)K^NN`cNxrC zm($#I70?USF|S=)^TG8pKip{J+#JKnYV#Y}gC6UQNlX4U>Bw7Ckc6f%iEb;AWVSNN zV(XETwl%3{+mqI|H|b;tkl}VT8E>bNC3Y^^XjhSa=n?<12gx;ij6AlN$UA$Ne6#-% z-+dtwXGtO#$4lW7ds$sBr~&!BQm&R)$u;)syPjT@8|-y*v%Nm(g$KEV-eh+PEc(n_ z<)pV2+_}f4rRPwuzXome5o-1CT|e~hBcMPmroWMm==D$1oVYubA}?tTqQIW9SbLI^ z4J7#(etne9BMsO}(w=Q6f3o9v;@<_bkliEeaR=JR0&Ia7+PsO z5r-wg$cm&Q9U=!yfqH#nQI;h`%|3}}jQRE~q3FR9i6QJ)F#+q(V{yew7Dwztdz8fz z=MWDOZ!jMqe&KP&Z#;p>iZ(Y-BFgZDq83jrqIe3?foBlCd3rIF=Mdu&vw428fEN&} zcww=LmlnHtIdPa*2aDDa=Xpa!6LFWf6c2eP@gM&KT-sNB;e)}Z!-Xd%gHNZ6IAXC# zB9@AjVk0?`hzKM}*htP{jbF+)5N%fPJb#dEP& zyvG)A#aZ!2Tt@o(52I2<`&wQ{gGIw4_LAz_%R9`Sr<{6r}ImI8}ot{v+{&~S{~g`$bGP*7J~mo zrt$`7#&hur`s5opLLNb*e8Bz^SJ`%)J!`~Cwp8qAGm!m^6|31`oL#-ZmL0_u))HA# zBQc0o68E0iGoRRTZG(16q3yU)zbqW3sj+Mvs z1HX$a;u3wrPe9MyLvQfS^b%i2|K>C4Q9hCG;{E70WO6Hb6m-o7s6JGn!+0UupJ$^T zcv9Mg$DuXhjKME-dinV?WQVuFo98_|4a)n*_INMZM(++=?wx0Ip>0m{cCyjlGB(&- zfJ|~M>*|eS?YthWrPrM`@S<34uNkZC)qtzKDl6obWO=+2EVGvn%$gm{nwiD$QZni# zL;XHJG}74YE{UKAq3i^zESoVhaw&At@#F~|fJ#hjas^EK4=qd%(9~onMo_MRM!JaJ za}&X!gXwB`LT9>WsK+n&}EJU4sE9kZBRF_XzZrXM+O z+Ms8zLw0~m*O{DTt@)KK1(z;F@4vu2cazLLH^cnx#+t)!jM?IbniX!4ndN$z$%uit zQ}jV}aZ#p)YiOD{D3Q2}R74bY1x*20z+`h-O$LWw$8*U{JQvpp7crib`m6n<-`Lms zvAqpO{TCW3)Jc0#Z?hYqlP=Tq>~uZOj?w*WKi$=K*NttIu3_;TF}AeMWsB-$HlvOM zu2m+w{%j)pfeF95k6t||%GGnQ$jn5nHoT~@u-CDl`%Q{B>8z@Dkpah*Wz&~elj&DDJU1MK+|+Ub9? zuYL_B>JBQQw`DDTUKZ6Cz?>&R5r4^F^#LeZJLN~U8} z6zI6990A%L4XPamk{$lP$Swzgg@=KIhk}QPfPsg~42V>CJ(U~@1|B67VB7dOzSwx@ z*w}9j99uNJ2g9@pr%Mm-`y-q!HMGjl;LLB~Quz__Ib0>*g=^$n@a5}p3t|^oc^}#% zh=1h!@FLc`i}mhfn-B6UT)#5(pg+b|I!vrQnMrYc;&6$on6kEtgKq>+xrHV<6fsey z0!L<&8&p<#Q00;5kuBUo=I~0Dfo54r`nsx&0gW;xYT;RRYgrHukTSZLtgU+>BN-yw zL8I&hW*i8|$WUY`lk_S%75e02xJi~kmEWWf%MJRhJb<%kpS~%N1)!Ech{Y-US5x=XsriEH(`l|h=w>o3SsE5eV-k5pF>Q<|`b}Pme9YE%HPSv)T zRg`_E`r7~0SgX}SOY~-&Kp#T&;-bx^A0pHI2#1ZawRB8)JQKUFIwPK!lp7V1;%*L{ zI?LcP-=Z6$g3{ETM789)?%-~t2LBEY^lzxc6Z9gn%`g|=jCUE$1ee`RcO}ehSII1L zwas$(yIJEpnys$C+2e+TSErkQ+uXrhF+adByXmx+!6bIx>?;RCIYx_k$E+V!HBQSo}> zrqYk_hz4#Q7<4Nb^dNfs(_qkRv?zH@E0h0d1GuqT5l8>PU1K0g%*LXUHlGw?%SbsW z9Cg`Wq%}K_O50s{M&FXD><3xGgtwmk<{biuo@6<^yYPy>z&NK*tOi2t<;Tf$DO|&6AqpkT%FzQ#Y8}5#sd4%=`mv-aH=m4I9_Cm$5 zKhI11@lv!8FN>&!+J1e!-i-F-t#M~ z0Byie(x&_hya6{b|CZLpUA+M(tSOJq8uLVGGq6THCu_z_uqa-Mwd9RhE8dE=<-J%N z-jB8C6If?HgLUGISUxkZUUi(MePl-9;3X)aGKKXfOJJQ3s3OVi4wr zVQRP-BSwpHh*?lsXCUT-To+*J5-~-r!YeD#t``$AJwa>&4{yY>?O29qMT#A0cca~h z<%hA(A;dAnNij*B!fO{WeGba)MQnQ&>s-b1J6QiVUb~0(9`^MB@BJ9Z@eJ?z1jqFp z$MqELOOW&n9O-k>4bdLcO%aVST^Ugx>*qt{z`CiheIjfd5s!r7PsAsv)lZ>T-$eYw z?~46Uu-8MeUdnGmk-jEIL3#cIN_0DZR@CQbL=}Eg6y>Kx4t_+W=6{LAd^gnZJ%aMh z;w#%E-m-P#DO(|Kvqj=ETOiJYBTukd$V|pVr<@3;93i%`Az}k!J?kS@AeKRmU(DKx z`K+^80EK=EYYpD4FUBFpuo_|%t0?|t<-|Z%RCEPzc4xUoOE70EmR2+XZ`Nk9p?Ag- zrI_J`n8exlo@ZvycoKGxCtz1NWyg6)5AsjQ((clg{5GA(|DvP$J~*q_&_DQW+Llkk z8Qz;#<{fEi-k9d+m1rioUy|d>`HiQb3@&WNocEr+^q#Y4;LA(iRXAt<-s=J2-I~Cg)#ffgDIy+Q;!=nuLHUd~0}%8BG(`X@O@JD`_o4BfLLSxO6#xyX8lL+cz&3G~jN z$ckUW$$rNbMlC)UJ?fIsLtx4csN}46KfHy|I;Xo^-W1f}hq=Ap2)Etq?iP97+#Kkj zV^9Se=rwSEcr{&HxRRQ9#a&IWuq*FncE!9*E~l5sW%6RW6dp$w|I^0s-dKk$|0lU( z-;vYyDcNi9kxljrnP*Rv8FoMU)9xYt>{`;ot|0a8EK-|!euu7T`JQKcbbMSx~bv>_%zhn-Dmw9Jf*SRL;cO((68-9)a?I( zW_lQ!=`Ov|Zqf_Dqm%3cJ=jjs-NB@-?GW9__RSMX?*&S{(JG`6x%Xe;O#U{lZL z*I!K*{mCTP_e~P8=`Z>e;&1a)Z8zW57V{Rm=wmg@;8$17Rn^~|QXNq1Z)UcuN{EtX zmC6iFH6^sv=onw6^mz3eaZe9df9wA0fbOkU>ds)%wraF)se0)qs*|pxYU`S+ims&c z=~61AE}@d>{3<#))~GD%t4gJwsTAstim%SAIO?PlYOnItcJ&=R`b92NZ{<|=6pGmc zIb7Y4gVlN2N1Xxz9hM!`9@$)Nmrc}aSreRERm}q>O$Vb+1fLEBISrF(R1ffJU+`!L z8B=uvf3`-nly7A-`3j_X4{=M@m*-?Xc|z8ehd_?IWMjESHj-;)6S-KnkP8trWP8wF zd(dAO&>(&XOa2K$93*>Ut{-0MhBZ3NMTjM`1Ju}7asya&yKD-AZH=fe|B+Gh6yD`J z-r)+`yU=Ct%i4%4@}aCIpP+pqD}shA;pi&K*Rq2AfcZDz*H4~G3JD`UE%{DJj< zVA*#t?*Fwvq4WNfRi(uK6qYH>6IDYx{EwKbDI-vqg{lQ2uOp)&;$S+qsx9N=wZw=d zP@Yp`{Zy)&%%G~uESS%ts>uA9&JT_(sVd77s)DQxb-E(d>AK*{dT3jyvf$BjvK!`m zV0r-78IJi0XlG%&rPzKw_PG=LJErQ(Gl;t?NWKR&{|3xsOZ$MLdfhEA#0I za4FA&TX_*Q&h^M-c7aO|$vOIrT&4e&JHVcQ>yPr9)?iJhKIx>&hi(}IJel59NQAc<+ak9!;_TkeT*6Sz(_bUO_tz$pOo}b2gTD z!zT5f+VtK>o8Qym)o88;bkhc2M%T_O;d*-&p_MjsQ@pNjp*PsAgI2oNTjq{=+uarK zguCZmcQ3uC=<$DoV=0LR?`SeS!znc_Nb&%vU{oyYi$BugQ*=gJrA9%ZP=lq*V+%==q7c3Ed%d%3#iqYu2 z8cl%OeLCKWW&?W`h5}TIqprtS(^`Blt<8_pX8bbl&iCo>{3&h8f6z8uA)>K%JTAC0 zIqS&Nfh)5yJW~~HSs2q5SQoHoTV9KG1%I~VO<8x|8tb*kd>7V@_rd%C@aIUxXf}{f zLd;|%_yRVZFJ=?@dNz)4X4Cj?HkBV_Gr^~`_*piOUjdWeVv9JQxWk{bCHy_&8(Yo| zTfqrm&7&h?^0hnxm^C@yz|-+vJPY5(^YHz=AfhNg%q#Nayb?df8}f6!9>30i=ht{^ z{*ZU&4>+Dn#Ru{Cd>H@E$Af7na!=qnRbnBJEmreHVB5rED^CMTOD7KT>>#$>;vCN> zZa}ZS1;%~OONdvzEU2!ukpJV|vceaoz`P|zd{I^;6~&;-78Mype$ZfU{LO>8ELbBw zyacI5b&zpgkr1AO7@%VzT7sC{iXXfql-_RQ1@8qnLLYIR4}mjb5Z-;1IKs!^XvX8H zrim?ls#wWqfgNXwIeea&&gY5=d?{i96y~L3AYTNx!(!0|)1A<^Lfeurgd1X^sLkhy z>U=)ZB;@tr zyr>Bltss0}UMN-^?u;VhGs`Ppvs~gC%P4Mv7ypHVevTyolO_;{SWK~<{UX*uqg>AL zNwXh(3j2yP;vFBtp7Xx!1@FLa@HXrYZ^+K`YV0&G$Byy>Y(Gb(nx|kJcr3P(bGDd& zr!)C~bTWTHhx2oE2r{K^d@JqD7vhYaj zORp~&voEXewPoeK7GTTrxVe)|D_u%L@a-Oci)xQE-=5)AsW}-(Jg_`>aR9*UzIkX3vO535= z_??Udm-eQ$NFQ2>w4o(QJ6Z@XpnRl0O-m}!G^7kNr#F8r-llVxDj+4ebl+k2$HJ&PXrD2YPvTNRb6(sm}vV<({J z?n4sTPQI4y zw9)#eI~cTyD+66LpDFJ0LJ!SslDpI<4)jn07X4~tm>2dJbHfsI&T5QTl6tHCsMjFo z*jMn2KG(zSBi$Ewu`c$eZecG$3q7N&*ps>}^wNTMzs`ocURt{zcg+<#7Vd`3&eT85 zIOw9o^<(p=zGu4Y3#L8zvxPoj>gdg;ie6(%=y|4)o?i=qxVoxh2&<~APpX!Br|PT6s-e24ny71tGpeaNp`z4h!_+JgBts;yeC znyE#qwVI(?AeyT&Xh&k%P;Ap5(GUCSsv4-y*k?Oc2U}OiT9s5?RT*=oR5evXRaHe) zX_Xg|UFB2R6n?{7WmV}hl^B1Ms5C0BN~(TC!~#{v!c;W;{Y6Db3(NffrihB67{bb5 zm6pG$A2NXo!Gd383QVU%n;DT^eUdrU2U+C*M_KhA{P$7T0F^gD+Ys|@)MwciZFjW2 z)jK&5j#vSCop{$?|)e-XqHqxP!75!S08X( z-*J=$?uhQ$+HpFUnu>O|&Zm|k^H`18rVFdxm_MS6sbg?+oYO_2sF%UnQWV)tW%V4( zU*fFzs4L)Xst?C z%_FL%IjT^1ha>u$8fxyVVK{TAn)iqw;83HM8KKvjn0l*8sCSqY`Y)4SA2-=?Mda02 za3x$dWpJfb(@#uo{lPTS-%T?xX*(Uww!;#+3hH}wMTd zxazvw)w++}tjF5j$Q1WtwBZT8(w>In=CVGF3dd#pP~Skc<1MNl@9YolJ3P`4BOX(s z7f1{DPk!j0f zpNl**rBU6fPdwX-L~LJ@6l{rKpM&PP61=&E)I`m_r9FpU?k*XOUT?JhPUiow7mV)h zvA=moY)bEv&4OMsm-osRhs&vq$6Ph^qV+HqsTusBZM{OSt5?DG_3DBzo4c`IXE)g! z;AX%Vx*WCmHQr+Aq+8s6^wNKUGcS2pFox+qRE2lo&F|>J1+iW%@(WEx648t#In7V9 z&@$-tYmic?$Jc;*Q4j8|wsbTcT9e5jx{Qp)-DL*dOP0`MWGy|9yUcBJggypqe!(b% zZ%{tC_m0N&0-D$(P)lOs*-r^sUR2{sp)ywqSJB!5f3B;3T#m%FIE;8B_z$flY6C@B+Yd`qEpUCI z49|#S%jq+=mA+$p5GQHCE>g?x&}jS_jm5v>j<0A+@M~uN8_NNT$Pacc0;(tuZmkN+ zsLY$Ox}c7Fyc_h?q0mo9LOY!ej-3s@T@Q}k0Dj%edhjENe^?)Wf%WG%*`NGh=%_Ej zvQNRWpV$!a=@=fe(fkLPmhowb89W-F#bfgYJT9Nl6Y-Ti8DGv*^G!S>-@>!I~Kll|soZsX__(eX6-$I<@bNCIu zke}fz_+`EZ+ib-8JF%bL{3t)b{{jK;#NUJbAHErDZO5xCvGp>jx{LU~IKG=ua&Pdl z{1G3+@A1L>KRy6-+>5`%yMf2}C*Gca;EniK#AjZEhr9}+4A;CAmpm_bJRjz>aw0Nv z%hO^$8K=-GLmm(FF|bYyD8`h3Lwp9gf5fNr_J8pW%=ZPl;XC#a3iLhxAGq%oyT)Iz z>mdGf{0aE)9^wud@D4P^Yv90}h|_F4KhL%yOW45wV(a;Swi>GTV!jpG!D=YkOOZV+ zVAJ_jd<)~)czm0~d2d8dd~0p-twkXt!THN8BV#FzZ@BH$qgSN#IsV%=6J-Q5}fOQ_^2}Vw|PXsD}yyet*mh*ni$TcH8>^ zz4IZmxw~u!GPt$gIq02#A=BH3jBg9->Z@2MTuIHnsjMDq>{Y!1xJrAYmfntKLybL! zR~HVO%6N)faYm3W{=|6p_ap`UpNZkbiLmR0!wLQoJ;4{S=VQ8++@Tv#OJ4@Z_#*Nb zokq6Nab!ImPL@FnosFu>RN9e@rp@6nZwT(Jj-I6)X@RUyav7V3S|GY z?GQ5A_9P>rc@D8HpaL`^U2P4xs49?Vwlu0$`AH3%o0PJdNfDcp3bPYWb5<#~jKdW<~;M%|`6fJGbIRk%AY*Cn8tX0&s4N~kn3?PTrDC@|?L{oD-J zH_SkN*7VkgO<&xVyX#e^hhAv9=xL_29&Xy`L8b$E^mpCCw9-w%t+jAhu4o$T5~h~U z4}Q&TD(ZBmlul@h>ewc~W+tnaI*b0Olj+wwg?^}G>VI_{eO_~YLQ}n8|3v-%lUl3a zsm1!anyH_tN&1$;Q?b+_eNFYy7gc9{UbWOG!KDAFI{FBR=ZLC^D5DRlLK@G&LgdoB z!KXV^2EAXU)!S4GEK8|(s>FI1=xHxvD@Y1HS-o9FFdqx+bG-+#TTyJMpt@SM3FNg) zeN*ezd$kQryFtB1JXPz|BefcAyHec%!QNEM)Mdm4wHTW160q(9^|zX@j;n=W-nr@! zmLFAf)IqGX53e1-HoMhQyu&K&eL42LN$pT;@pmh@coW`j8)EzaUR{MXm#971!+z{x zznZBIt7+;lH4*J7bwrK8I}E|z`>WGn5|+(Dy9mqi8<=V{vWY#&DvrQ4d>ShFdEEef*+|{j zO`)1csn7a%)X3YwS=%;s?%hgEKz5?WPmK^^yh} zXHHx>1>uA#XBR^IT&1JzR$O6wbPxL%su8E~L<@|xM`k!58R8oIR&TMNp??~E)G~A4 z#x&P$d~?qxGp}uC^WJ7R(iVgJri6)xD?XvCYm&N_aOZR|xm-UmXn#0&CYcJTs5ExV zOf$FEbU=;0r#pfg{Ymr~*UdEaEQ{S+v&wxmJDg|tJKvsi3GF49+}?Fr>~ojbesIOn zBUQEp+!+H|bt2LpJ=Y&LD;Z>Sq2^wkOtc@QnUIt^T_`4xi`+@{7AelDKCiwfju6I7JG$2zuZ|7(to_b@^OgD_0y` zS{Xjk#@=w(3cYrBZ;l%TpXfMmy_@A7bSuE7o6*A`@E%~C{d0^u{q7!k%KhiXCSSeZ zi1sprQ8PgoEkiQkj*%70MRD4al%u_%SPUYq=mdf%&f~7K0@bx$xYHbj9(o?*?*Aow z=o50Bek50^A-AdUUeZL~Cz{d=X-+R16qmTHBGi>SURv;I9^4HJv3{uXjqs|l8D0~p zHqD`jb_9d|fxBp5cG4TnZo-Ln8(jL@o6f#?Q!w^^A-Hn^`<1R{N$CofiLM8CZem60 zW>$jkVb$plR+}DTQFK3RO^>lIh#vF|8%$5Jq4XS^NYAn<^eUTAFSDieCR;;qvCZ@$ z+YP<-AmVTOg`K0H*uP-WyOcmnjlp03k4F>oZ>V%eSb7jfb{>!A0dW-MsaOeAQOl#6 zT9p@Jb$D@BpI2cmcn#1=LvUyd=&bF*p50Kx?+5N2f*1wXoQaqX%2^5RbQPP#cdypYwa`wN@hN->sCN#Z$>)N4r(kL_ zsCPW(hN2w`PVJBA4f5=cH9KLt4Yq2=7vo(P!)34pu^5hn#W;%Pyg26b@}-F7P<0pM zD3|c0m`{S~SlCBQ%oC8chxzYp0a$Vle~b1R6y(QO5nMrmx z$!3!~&;8sxX=@^a=1vE%Kz^Cp{6e*y=3Z6d$MQrGWr!k*ICZ=V!H@Z!8Zp0UR;Pj& zagK_&AFgBL^L z#r-Ot*It#tYZKhKfh%b_8s;MUvuUR*1$TPEoy_3F`jS8Igtb?{on}}AuEd(^vr}2U zBMb1_2_RxBz}1>pJ#;b>MWrF4O0F(Dak;uMfe7 z?xF#nq`ayxil{OoC;9pGWL@H`3?i0FAifbDN6BAQ7`-QQjAxq=-0EIis2+a4BeF8ku?y4ot}pT)?{=VPu?7BWC7$;&6Eirzs7{VP&XUGIy> z^ib*a%iP4HUVuqYiEC!JIAgZrbyty>pHG$kR9JK@dguVb{8rJ+v=%{B^#@YnU&oZC zy5Ao)A-C{@KY5Y~IeK4_*k~Ki{D42-TC1PipQsZ*^%WTOjD3w3`i6?F$9j{EWVE=c zmojoN`#?{(SM*4GQ4h9ZXrp1U=V59`kHVh&$jI%|0d_mKUT3l)*h3o{h0w70%$y6U5*ojzb1>2;>AUTMndS*Em}X!7d8CX4RNsMmoJu$76eYni`p zW%I!eKuh&UL(K-arlH<65t+g`W)C%_A?|Oz)P1ApxUcmDH(ZZH6&iv%)XzPlySfJ$ zl|ytZcb#tR&enBd)H?2HUC|v1gLctH-44368%XxDHdYorwYbji=3u1HtTVca(N*K1 zI%zk)`_qlOFMRTaeHV^8J_4PA|Z#Veo1wym|s+I^=2W9`@98w|i>CniXAUH^HK%Xp6JX&t31y z?`}rfTZ^stq;x|du@FyEES|f@6W3jh&br%G?_c`=;8f`@_QY}LdVElwle%-D>_rgx zTr|rCR6NXs%$Iob(H2ITF5xcply_HP%i+q^*ecFWh^Gn4bu+9D7UXXAbaJzb&h|?B8{M;>Ewnq`i)frDnW1)>U-LW+ zdf9W8U+5+gMFhXt6Za;w+3uim-bLfQ?=k$ELO=1ugBz3T7oK!ff@IULJ^A!IPeJ&x zjQ)!9{)ycBAD-;+o2n2CZ<4{+aohpun1gg;cbrb@PJk!paD^>Eyd@|?<-PiUPV-63QtCc&9=OdP$;#MfI)3cbsu(GvCJWMu9Q*)Xo_R)fsNQKtb$J^*Pxr+7 za@UW*1B}NL%&-Ub0{C+|(QF9$_8oYU-FTE!_Pq|n(_FFt@H#G)KXLFv3C(+(%KWw& z@k}|4wO5AX=MpXrVRmat-iyt%<&a#5D5q3(ZimjCo62 zh|Kqpmp?`}=)Bp?oTbAtUh@?dOux+o@sFH*Jo{OsvQ}iX@uZ(kO+{38S<@E96PJ=f zmZvhqpd)SD7zUkZhsrf*rd#ZP@~~ZjXI}?{ZbKhEDyb%r-|Tg1?N#X`9?2Bqsm#o1 zkV|}$Ma5rP1}3c`Vyi~Xt#2)oF}pP_nYGM}EV-HW>aP}{VyqBl)h1Cx?MK--$!K#) zwBT7!-58y^k)I!;{*k{Ia*|4drIK@0Zn;3^m1|Uaxk^=*+f`G!MKzZPR8M(W^^^Q< zK^dwh%d={>Jg=6^n`*ths&>fx>Y%)!$R!~T>$ zj#R#mqmnQxr*@L4EKVYogAu#1lU5Z)D=iDNR$~;eiC)^&DXy9^x_5G_s4k551D%Fy zu+u_~Lpz<~bWt;$o@$XZOf7|B*P@+nab~HV&Qi4xc0J^5SI3>B>V$JjopY|K^Ui&U z;5mHz37z#9eCzFmJMo-HPAccNlg)YJ6mT9mC1}ez51ks$Q>Ov1wRT=O9az_wwvQ9( zjAH$0=eaZ4dF;%lokhEZbxU|{6`u=XdA$QSI}y%y=dQDxcCT~GIpExPjyl(|n@%Wp zoc<~2h7;yobI#H~&$_eDRp%n@WtK1VnQ;0yIJR)-4qLj*mLBpig1tWCh@Ls`*w<^8 zK4M=uzF*E;=b!V&F}$MC9AkUEbK;}sCPBqbLA60zh&dB&R&>aG@MHn6hbYGno#Ip^ zl=cdD%41c%u3=Z5x~Rgnv4&o!p!O56;Bl&QkDw>+r@x=-+?}-BSl$$4Ezv2d@}<9$ z_l5A(4YxkLnWomyVAooeuD6>{d4$eCB9U)F0PY&qH~ z=`|L<90*?yrQeTeqBl`RFOIjP<3}~H9}z@;cr_QSn#-%AlM`0W2BT*4^5Z*ZanhlC zriV*YppvKbl1?I2^JHEhVaq4*=3V&mB5ZjEuH37%vrGMR)~H|3GWCrJ=#w)=y?27) z$wBI+)14@&BTU(psHma3;#B2IDhE#%C6e;vO3Oinl^(S}g<3^r%3{Y$&7n$Vit|HG z;E8A>ooBM2bB}DoZF1}9WIHEJHf4@c17{DB-FjIW&MfB4C)%4SbCQ?O<&0#m&;Xg7 zc}5AH4$`4|+p5O$r>ainOeOBBQruw$NOr@3wxpVhZVY6OY^6S6FZ0_n= z>J<^_V#Z18tHS#44Fe%#%sQOzA5oN^db-YP8Sa zD|*_C zqO(0I8ry@Sw%shs*bq_J&J#K8G?C7Z5ee)-W`y=2>TfT;Py_nd)D!pc*ypI|KZOV1 zjwjy?hb}e=sgjB>rW%hOh7Q`_e6Sr+AljJ6wy_DfHOv)T1$8389I^gpkIiD%qf)G8 zlvr%znwe;(J_GeUSO*0sivwPW6J6ws4qQC zK^9>f5M9*WD<6 z4aMj*6?CV_?H_a>=)ExOF88|Lh^hpa=r!o7>&W#lareNrJM?VSr@7?(r;+oY>Mn+H zr&Aj+6&-d2`s-jl7_GIJ+Zk()?%D+XwU%!0R)Kj-Ko5nWh#XiJT^qf%fg4{}bG@Mp z*RAOOb}PFd+;Z+Kx4iq*EraG-+6~9fV`o`DMti_5?(TL=xZCJ&bOYQF+LbIXc1yYo z+@kJW*3IBOQ{2MtIJX$)=Z;`~u$$K%;QG7$(RF*dx!fKscXhM7o#?l7v$$>OH*+(% zjcFUY>D-#EtLbKRE6`R(11{!fV^3-MR4%rhnWY^3%SkV{o7yelrgZbUiQPhO0=J0k z=;i>Nagc(110^QG^rfw8@?>FSX-@%U0JssTF=#!Dyb5B>) z73l3(vH*7eRb%SV!xZ$3WaN;oN zeyn>P+P@BeUZ!H=DmnEFL<3jh&kLRvaODPga})jj^!K4upW=OCEMMh4_jxVSy+&UB zisvKS`^NT+d)pIBhm%vk&rG)mo>XX+IbhEGw0`;xdgm)oDIMi$0DIP=KC`v{Mn3%y z70G|lGzC$P@r=~5-D&XW6m-m`8219KnabU)vye~E3~%OlPwKqxIb96a3_#s4N9A)B zuFx8&{f(&cZ0df4L5=Q+^>JgHK15%`xWdO0iA_T5oa^Q?^U1G=z@2N{;^fiGQGH$A zoObI{>CzaTv$c8Pb}&!fUgjP4%?&nxc#@izo(_XfF-i3jlL^bL*P6n5E4JNK;cl#f zHP%;53w?t-^oi+9wari>$qD+G;TgZ=)P3R2l+<=+v3tpS9A@U?d9omvb$wW~g?*ws z63q^<-*mA3t!EPL&c}PKx5>;-o56&_nOAH`t6Rx?k26Iq{qW)zG$QCu){M7UWbBH_)~W)t(`_rsWnMI3uZ#K&8v zvo}OWw9kU}37+z`C~u=g4f{njB*Jfo4$4!esQ2`igKZ*|frN4b^XR9OiCSc{q8j9o z8*F~L4cli+!k@+A&x-OQ)%)Ra>Oum0n?P>!sDx)R7}*FxoyZI!?5u1d=us;V5O z>dO(Tt(>4b${DJ^T&RZ06>6f~pk~3X3*=t44rbjV&!|Ii>PdM|U6hgP79(i{Y7Nx~ z>N6wkPc&F>mB8_dVbav7M>(DBaA|Ip-zf&0mQcl=N~#hJS`iJkhSNl$VyXsCkZR)e zQv6jx)fNtI?~I03C&8-IRBva#;;B$-n6pataYEEcXQK*s_NcMs^e4cj)11?4s&f%q zxP;wDw|xN1zECTi4{9}xy4LxFj_XoC5F3*8b#^)_oc&HpXP=YBIppM~pBI`e=^TMs zk2qDK$=WQ}qiyD#a9TPi;nq`5H~QVN0rZE^j&x4LuP2=GEYILQ|FOIv#=@LstXmC* zu4Vmt=bW?2Ipgf0-NCwj&IR^(o;_V*FXwp2W!`<6HJ4br0ur?F56B^gSMwnGlp4X`VU9DCqN?ao(cBmLEI>>7A>Ic>BpaK1y@f1J74 zO!#)1^B4O5=Zte)zR5plgkzndtQ!dT_N49YI56UGr?cZlUfktuD6hu6r>-N>HU;&U z)+ys?rhK4@he2~i@bHds0Yql72&)_ zUwo==p@Ls^?x_pT4I&J#E$0GU7)E8sDXKh?R+RXSDDojH1jby#Rj~}t zT*#F&7v+5p)gM#1ie@^U)p)0+n&bp>wbW3fx#EU!^$j5+>g!~|QmSs~nO&V&s-5$l zN|i5U1|rZW@4=H7;mJ^0)j2?pe6uX+tdaS7O0Si1Y)b)eCLtR2B^U2aF5b#fLd#*| zx9lyx%AQzz@mjVP?`3llDQk+yvX;0fON(&qI$q@x%y~{`!;_@Lqa=kv6T+YlUdE-m z=qH(*_jVB(n>q3hl}ESjSb3g$&l9ldJ}Q%T;oSAj>%*@vQ-y)KH_Fp=HzjqEOw)@~9>?MgUwj)-Mv2#uHi zhcfUPh2R~YI}*j<9$b3G)I>wACXSe5Vi&5yMw0^_H9IVyUbO(fswalYmNhWW;esAXJmu5PdzHuloWAza;Q13VW^eXhx6^wXOO&c`P zHhKUo+7Bje$EeuaRMvG&NnIUOc6U#>o!wKk``wQ2LDubZJGfgR&dm_#YWgdo&gIyAmgl+6Vb)ey zOLq)58XM-eU{9^wfo@Y+wLN=j&Zj!iYt6roZWH=V+%9e%_S1m2hTGSz=Jvz}z^(n^ z*5Phh$hRC6T*@5}Ay0s!r$fgxY3D+y^J$l`yb`uu#qtK;zn=GPg}}G-nSH#zi*<*w z<7_h&N*OTGO>0B|hh+gKpN6{yb=|$9Q zt|YQq&6Tymz0B1UuD4-(-G^LNkM$9B%}}DEGiaMR{uq zM-jnIH5K)2Qwi3rtwT(GBE1HBuW79hahIJm9k~m;>+7bEeoA!s)CB9#W{mz}CR6P_ zlS-O7RMad(2VJ8x*mXJ=cXR=w%;ID~DpIXenR!Kxn9ttC-X}8>!IL$f;|Zc*&rj%~ zf5@I_W-~fwnN48U*ra9~5$%4P$sD!$@F@P~GP(Erwk%$zCf=s5`C?m|KQ_q3Lhp=A zrF$CY7^Ok)%p?ATOXrZ;Sq+zNhD&$h)sCWro`FlRGgtne87E#+rSyU9&@ZZ%l-)r7 z{UFb2Ixf=N3nCw0)89tmL7#~V_8lzxjfnoY2(pT-l&>5@7HX(XD<|6w%qq5R6K3P(tESF_uh)GD=-y zp3@DH7uCd%Q7u5d6D6r5t-y#^33a75R$nEPP08CgXAV=4$}T&i#Pnp;?4e4?0gR$U zR25jXo*W00PExJq6l|XAjHcREE?0fzYBgN0!?vplavOF44fT+kD^I8u=&7saML6}g z+RjLPNIpSNeXK6Xci0Db^^3ZPh8ih7Fsr22)XVup=FvqZimg&Oaj@hnGa71k6sg?k zr+$vVDnjnRgi{`7t${UE)t%<5E*aGN=(Ip%ZRXT;nmYASS{pinF>6{tutCsl2d9qH!>PoltDwD> zbNV~w;nxz*FsGCg4E2tI-NrcqSbk@cQ_z{>_+j~B+I-GbCl92U70ZWZM5E2k`i!t{ zPDnBX>oU`(WjVbw$4NsQ-A|20_fzm%a%Vd2OeZn4nVfYA*=9nPqgx-AKju)-t%=`bXgj}tfjVBs%8-Z%;N0M zblzZ5sN64!7T(i7gA-p6H9Uq9AF7E&3=^DNY7D>37}#@EjGam)UcC<7S%Zp^Do!C)hAXLz zlbI_iHI_u>hUEDQ0R0FwD)s>r7HMv$* zB%&)SSE_=>B((UHiPup}nR2E5P*-x_)1!f-HIv4G98l&YzeGYa#%xJj} ze%*wox*T?$gGKY}NYtA_jIv!#J=nFXZUVnnGi7u|6QB#5BIu?CbQZFXso+vrQ_>J?W-T@*!sGb`l5E-6WW6|`W4dn;ckUvmtjlwTZrTtn&@-pLp^kd zK@9`-J+~K3+eKf6Xs)@f^f|Yoz5?N#ajT)dR)RQ6=@SspQP&T?&94u**&&iF`mmb; z#!aF3yD2qKj>6)y%wGg|z4RVeLN2bm7wvQ_Y`Poj+U4@pR|sqmwX1vJQ|4dOMna(x z*h3W5d%XV^?Jf5Z1a}C6JLq1ZJx6;E);q~-r&$iAJsk6IKfQy{;9l$yTi?fC4!K)s zx4K6l#(nN4-nSMDVf_kNafN%-UB(s`V+*0+`D}5H8|KcUKa0K1gdwM}=jqra_l7$W z8;9aM0gfE&K7xTG+)*5LaE!gAed!M7TMfmAP?I)wVSIQVXfm=jY4A!p$ll};8}MFROd004*Q64uj=023%PXd>h%i0H6Fgs(2}TPY zP4&`Ls+i`Wh0e!IuEo{~Kf8na&po2F4aKXT6m{{et?Vt)!QRK~J{JS*OEC(Kbdvoc zW}=ZUB=TQ|PPzdvy$dy9KTj(;0hgZR$t72L-spXD_m6CO`N~$p^VgE!$!bXvC=Gm? zK(xj>$h4xn%!DqQOAM9;#0XhJjDkg{pk~aLwZ#ImX-iQ!*2*qoBZ|ikIYjK2qZwT$ z!K(j>vvRSxDOY1#&`5WZ=RbxT5=x%`s`w#qkn4|NlzNML@}6A(AJh~hm}?=^sf03% zN+YwYjIsdgjlU`^OQ`@^T2+vh$r{#VB(0;G$!4mJY{@9wUUie5VbI=c5X?G72CJ!Z zBwFb-M(3$&C2G$)M%is-6ZgWZhviN*(*tOx$JI4B^&X@4V|3IP=kIIMnIU|(6 zGZLM33Y0OEb}sE=Y?UhHtfeks3$O1`#Zc4=K{kaU96z|Uuyalogn9~~zWI~m&*$8w ze+zp=|Dno*N|zVQjcS(%ipuSL#-h-4zteu(R)~IKtQh~7bBa1;VbjX=tI^h`tYgB>5<W zoEQ!>UV!{Bz>BAd22Qf>5Nh^8`rFYRcM>IRpk1RnI4e|;vjBda4?oUQZTZ!jI1^P1 z6!1Wzia>Jb4XD|y>vV%9gQ(_cr7Dv{uY`JD!KtN6ITciC^5})hqZj8Y$w#$vL9Upb zxw3LG9!U-O81^5$0SiZ*X;AQuF0G>=al1ajIDMsxe&M!(h$9L}a~S%I`@65o|9totvVtU`Y5x=3h|1T(p)1K8Eg)K-W5dN%dq+$}^BjQb$n_F;=sEC z-PYCZ^mpAxf6&eJd)-(+(G9WM`lha_ujxwqtS+xZHPoq#=)KxsZ`FD9dd(A~bb7r= zr_=LwGCd6&uYL3=te;kTkTz~d{TG(~0mFWEo9Rz(b#&a?P)j+Ox0HU0n)euvr9Kws z%|x9+8dx_W?3)ZN*Gq??tDbW`D5U?~Gw|wB_bb%-8kT%ZKLUFMtKO!)19L|6=~b4` z(uUC<<6kJOc?ixt$a{A4+3na4UfqQ9x)}@M6KnY78dTYpFy%_Nx&m7Q4KITwmry;s z1cqD!KQ4wNmvA&o-M^Tlm!eg!fU=ijtKCHKTrzaRBvkfhgz3_v7iQC2m@&4UN`|d& zZZyMu5V;?0m!Ez~ecUagQB0xw0Q!|+y|R#fRocpY``Uc_TCiUOeG#_2!r8k(mBe)- zf=lR}w}=idqgLO7H7`?1aTmMh_91#0gc?3r-$&KH?T*wB;LdyG&>y=05narM8y9ib zm!YDE=vS!XZumhRUE=qz0SyCy!ptECm%lvFSCHicOe?+TH_EE$EL0`5qbAS%r(j=&f=wR82+{=^OByB#d*iv zq)$ZEztKcpqU_kVFvN>H|@k2C3b0IJ)U@C}6BQN2c;N%FumA??|-RceEc-jsD76%7cRB zrRJ&FY7xA;P^DDMRc0)!TBY);waQM6h8Z+9X&~ z_%LORMXIzgB2U6p8Q{cpR4Qb2?!acZXm6@)&Q;c5p;F=;>n_lqgxyZF{uu2MX#W7D zzlYa$z;)Yb*HiJkk#!+N11o7)vCRdnTSPmT*JrS=|Je3Kl?qEsQ~>RwZVzR-Kam7~ zp~vY-rA8Nyv$KkiZW-Tc&GEP7yVS=T6M58Bv0%*D%ng!orXc#T{GzTZLYtrSk)J3f zr~1w>{zGNtY@|}3xeDH^xSXkYoKeY{m9!qBo3Gdxl=#;&LOquc)e|a6?#ghku5hBF z%V?cf)iE^8190VTm~x9eMn&{tuF8FCvD|~YzghSLJcCtjBC=ZWWhL2->Xwe=MqKWP|Da1B((GAQDSO<&FXYSHs6pCr)HT?O=jx_hEBaI$KF4&&tFuLeoMwU%z zqaiU2+Q7`UmC-+Iz@R13Kg*czj7S}AVMeT6rXiJJm2Eat37xbcR>&qXnXzn)W{IpX z=56=`wZu=FGBP(XD^Qyj zQfoRF&GbK1s43+9$7_FhG%pOA6-$evlm<)4=pUafrZ<|ag+D#;=TBW_-VI;HM}X4^rhf`C)#=DglqlXK?vMmmG8OTW6#r0dXD(%E%Y z+VbqLEZZ+bTatYihl7j5!-aKj&C|AYeyjlha_fRIy==5Ov>!)Sm?O*2Q59p0`Pfo% z_Ug}`0(4?NnHsiE$a|9VdO}^4b;VGT19TGFI9LK*8b!G{>q=wHsE%2#6tgUK75J)^&%@yHah@i?*l! z21kB&`$6qwlgXiffg?Zjl!PzTWPYJ?;xo$iH*)D;(J_C(lt0O%|G->#3+%WNUfj(# z_i9HUVZX;Y?(-b)d5-Za-|Z&f?G9)CDQ7>D^YE549mN^_taI|q=g|K+n+k0*7AzSL zwLKx0!W5@cqztNi8J!!JEMO|YnANZvTw%50%my%KBO;*YT!k%&h+4vz9jJcp$n3mc zdW7j7!Nykb7BQNy47CBZi@rh z5xjAjeT=;p*XMg`aew9%<3AoI{hmr@)X9voD5aW7Myw*21e>sS(&N8s?QJqJB zy)L_w&+iPIc2^Iv7qS=gqk5?iXtH17*&mn-1sIstTMbY?kY!>u7#ph6(xz6!RW{aT zg*NkJ{%Vv8P@`2TtUTmdNsUvr)HGF7O@vox!L2h?8`^eIXa_YPUY)PHK%&F2erhG0 zx=IDB)oKbJ;y9r0z zh$F1ay1IO`s;sNV(U#^Y%VEX&&H)^)KS%DTPN^KUIXUXgoR2i>D8{UJ+Jv0BIJ6E& zF4aNxTkgj85uxzRFYJZnTgYu(A?wrwxmI05le~&Hd0Z}0#9wL``s8joQ*FT364@*x z4?YK*E{Bp=A5A{J9}52fX6*GOa_XUixbm8zS2mHYV9dr`;Z2FMYN|4_7J6nCKaE4hI@(*Fy0!2HyNd z&ixzn-QSUSe?e{MQ=;X&Xr4F8y906QbR8XOZ^72uS1{-cv6!0A zIrg5IO}1zPo^T@7OvCMI>PEx*i>LB}}@M4AVTAbOx19lhHxPV8caT zI5Z#glrq}RSSx0OHWvxeL*v_8uxWWAYzf%35T4v0kDiTcs?6dQ`S}NEq7UHEJI0IW zLJ2tak3ES>aSFBKAe!htMvL9%4kJal-9SaxYU)H+kX>8A9HzN2=~R@DDQ2S`XO_dO zi^=8BMD>_qyE8gNQ9qM+0>T^YHW*$P-mQyW&T0kf8eSIaQc`JR4s7Nmsy% zGs*{;)eyx>)Ts5N%M*QiuPy)QwMf!n(4BUTnD=ZC@Qo zzX{(f+8VN_Ks`)1;2hNFDC%)E_4NekeFp7R6y&)O=xmmkL8gm!HNII*y-ru=TUO^= zSJpdWYo5ix*{GzC@j7$i^cngW>0g0ruhZVs74>c2^O*NXu>1njeZl8nvhF?Gi$bmb z$i9EFpRXL#Klc3{h9|qMf6+?Qmgu6n_M*DO%e1G;xC82Ucby0YJRwSW64L`!d@#TG zK%G7&LK)7LFdEhzN5#iPs+A|{QvCWQ;KV9sJ~mI+LxHc))zTbQp1&(WPJM%h%!rD% z>0zk${LKlNb3a$*QLfITT%{+-tDn(pxJox-+qi1?5MdqQYCdTmk_C9EFA#-Y<7&T6 zR2E_0FsJ>iervvAKVeQyB@2Im!o(t~i)G>w<;Ay&xr>sRG(>bAUTOzu38iko)mm_bzEbR&P>2OV<|S&xxKprdSO^6f*gKIGg-aHo$n ztL+4MbE?^D|1&%6EOU?uHrmeEmDqYB*L8S}t#Ic~a_~E_19+7E=AAu?cR2-ro*)Br zj_CJ1p65Dx=nXv4eJX`+!J*Gha&qq(nS+!`yy1y+QD~#z@nGM13f*6rR5J_H%T`7g ztwrXiF4i1fv^n|sAS&lO5~cT{qN$%KWrq>HkHTY4CNDo754u3K!8#Gy_aS%RAMZMf zjMI2L?hJbhRp6XhM*cp8*`eF9-RPr7;n9=!qqu@{aDyz?W9HgFv2l2wXk2(S3F<>i zw9pL9na@FnEEnoTAx4X$C=~(BB8X$NtI^(j$vYffD2} z2R{xoHDXf@mxzp{4{A|rEHNW{2Dmh}>Wu;vZ37v#hr+MHvY;BrC_WyQXd3J~jgfsW z*~z(#_)B5d<)}%ku}yI5Ml{u3%&FP~85|&+848~shfU9+KwYA}42Rxy6T_*=Rd48LBr01!XebyO>Ibt9 zg^v2GqG}MT+(1(ro_H3&QZAaeM z10L>0+Z#6S!+QtN4q&^%sIf!&H=5oU+HtI(z`Cite+KOg+Ih4yX&3SS1=wQx%h~@@ z`m5RMD*EeGPpGmFZ4daj3mn`Pb+`+(*@1os`mNM<)dB)-1(7ymxhX{22y(6mIX9rK z#p^ZcSEsGWYn6FV8P=DiAEBnldrGdZGa6CyN_Gn82 z-TKnTh2j+^`5rE8_*c&67n#Q|^B+7p3!a<`OHNa-&>0_MkK{P?%hBovmCBcxJ$Hd$ z?<|qVael#L{KET*ME3BDZ$)X}3^%Spc@IH{TpDA|;LPS&BPvIttrk~VZ8cg}MU}5i zR8)bgl2R!3(a}->`eqT;fvd3{I%P8=tX487)zR5d_Ono#k`4|{2Ztt8Wr@m4a77oD z31QK=}&Ly8dmAiMcSR{kVsSjlidoL== zd%~XWL@>JNFxiA^o(5Pw5rpp932P36w!muyQf*!r{j(PJp_T9|WvTutiI*vY2I|Mm z$lQ3IY(&JF$;qc;K72ANh7zEKdXtxrC11mxPs#2?N7DDGj=vQXT}O%wuxA)i_bF;Y z4-<(W!u#z)|J;uDxfPGN)@~H5@sdmI3OIF%m_-hLIv#W!k^Uqi{vkFP>jR_q7Tw88 z1=;p^*5;x)x%h^7F}!k4k;~>lImk%PJ~i{3QsKGd!>Msm z7YLj&4^>*f%rEmrwSTV(EK&|%@32$d@?!BYm?nPH<`^N zlfm3G=}fpuX)c-M=AubrPMHMen2BqSns{cf@ix1Sm)T@wjIBg-U1eOokP&Xs&4x1esI3A9iTT4)I0R)!vG zP&-f_q9{ZCKmc@680PhZbMsL{kONIND~eTmC?pM*1R_ZSnRuHmaO_%WXgxaXDky0! zl(Ym}3A-+aq?Vw{Ez-|mwugFwzOU!#Ti8wb?K15})`!uaLRmdVdqmID`&qZ2<(;%t zD(EeIZVSun^+IeGq_>2vFJNzrAizZ|MYk(?bs4rs&(kaTnv$?R#2-ox^4+TD=&LDui5zh95#$VTe}v`1oWj6THr9bR%) z-qC)b{mLg|Ay1O%p7=gfsRY-V-~@fbBH3Akt?TO0&dKRWoJ1*kw<9zTl8knv8@*A=3%%t0i%D#uHj~%+ZIY@M~hb!h7+U5a0igp4v8GZ6U zl=|6l=0eo^MO-PXxKdW3;BV&Y*+^b|7grPU9<%oDGkfnox%3Fw^QpdQo{>|3O?C7e zX7{~A|K#bu<_k5R->{!B=s#*b|5C-G%oj2WKaG$1jaie3=q)jKO$y^n4n3~TU=mX$ zlbon84VI4j&8%2X^iBSL8<~nKST*>xF4Z#)xhtDeP16eNKvts*dT4jk9Bs2B*1?WJ z51oKbM-!b1r!FMoTxzBfrB25iEQUE3Vj)DbA@&gY`O`$LVR((p<`iBe%-*5e{1G|& z2r@2j@G!5bM*nWU+fUd(D%Cw`qYj=amQ9F#>G4SRXw9uKNA2tmB9AlS>$z+yhFvD{ZdHO|Y zqapSH*{M*x@EP>b^LXVe;tUm17wt`P6}8|VdHef#@aK5&m&_Xd5@X-RKfJrKt`I`P zpNbK|2R+n>5rV&CFA^|fBtgYUP9;|=G|}|r(HMcb-x2ikL2MqrN;4OUT!+AYZ>8UJa3-#ddggoBSj8N(;|=%j42V z9%B?f1G9!PDqoga^e33RBqPQbdqMBu(PBkq`T2|&uWmfNLzoPU0fI$ACY<-2b*P~p9NOSML!3vpQ^woO3_y49c5HObimRv z{Yt7VZ7E2$ER0u)^`&U5(MB&-bko)1uy(r^6BZ6w< z=H$)m5sftFSB_TD>tMCeHLLOKS4CMbrxwDNbBSnX5z)*-r<@XF(NRu5YB>FPDp__S zpIk6#W>osjY5-S6H>`(D3WFv?#ZSPzqPWa^_d(Tnh^8c3sFszu`pRP^xhezX7wIqG z%Dh~$+2m8AvPdjKCYASO60US_%!@1Ez?OfpZ&bs4#9om*e}%630KU9O6nK+6=L(E@ zkvw`BjLEYt-w~3?U+Ly=REGlnP{C8sT!Yv-WiMy=kD!K1lkMD zvnTA?K{O*D-;64q`eaM$!=yFQMysHWRzMpqO(jo&48U6y5&5MbUL>c;N+o()s(wOv3x_?gkR1xc z3!XvuJVsUhK{7~tV9>305uR~@SVIne1^l@Pn?qzj6Yo0J_9uex4wrT$)6`ZBB}3H% zZ`{k)he@l(SPNT*8KEWd%6=#T{#XuC(Pky5pB~Sh49}f{D*iZla%kF0yt`{N+21y$ z{f_KEej_pPwEtU(X`i^}l>J@gAzUr~%MudwH2;2!f-mIqXZ-7!n- zEoLZOL=(NjsC2?i#73Zm1T!l2hg*BwUFf2lP+hi|HfXEOsSaz*NLGiD45gPk(%FoH z(-{$`ngDcGf96g3p}yosjme5-W>!O5+s~wAbW8!$CSatD%d7`4v{%XK=`qdBA5+JC zHi725sbXH3n&uttBU2u$U>=wNbIp`7H%u{e)|A8w!>Wa_0!{=VmKE)y--bktp9?_5B--DQckNN*GpNhbqphQOUiAVY>pAM&giS`CtxXczV zv*k9$qv(~VV98L<+9}T7ah|AfO6TFV0<80c0}H}~ z#c7MPz5-U3ehsV&Y*+`YMKsaKT;vzKh>m$lw>Fot>!{|Ji9l`=iCot`Im7+v51}0b zJC5e;kHRKkllXO}60OWeou36iE`lEyo44>L&ullJ$gh7!=lssIk-jt2?k`&BUwBhf z!)a0U9U>_27`w|=br+U=U{aZ9L{l$_u-=>0CW?sbyUAjHnLJ$Oxs4)M?rr^y4?LNW zNG&PaW-42jyQ3o2*Oj?j{ukBdCwE?yJ0k!qL-bbxjk5}OPn{U+17r3lLovj(B3cY0 zhu(?&c`xq1o7nrL$p)#KA)%-MDuPs}((J?J5-#6#iDFtQ@&&_%D4 zB?*T)AK)b-(M4ZV7y1s*@r7#huW+ZwJjau~x3TOe>tlb}gw|t|T0wN|ix={x$|yNr zDcUkp@0pccdtP$w{1pzO>B@Mu8n!Hz@ip*nsEY7sE87I#YzA+3gg4t`-Nhgx^x?4R z2r@+z@S0Poq@QLdQGq{Q%wsOoa%>GXqwC<&9d?b_36mZ`7d^xiNKV0}r}4^{@XnXv z(%X3JyLjuz)Q?7c?^opP-&0BT4JQ3+-wO{+>S6x9BmN0*Jbzq9fcSuEk{Bk9=Fxaq zT6EFWj2M|wHnPH`IT=m-dE%eHtR#wKC1BEWs3BEg(#ojiIt!NW!MO(w9 zZOGXNp`>)9l8nDADEc$1^+Rb1CU-wfF5`JoYtd0RGU9D#^xMVgcNhjeh@GMC^bDip zb+MfK(dCS!tH>yZpz5raFR1~D5*uLB9r6cU`j-*bpy+tZy)fw^8DAcSNsr1DFlu@j zHH$ojg~Fv_vH<MkreFIr*9+e#gy1Y{;p0%nz!_I#poj=$=84Hcp8;Xmz*yyye$Ugg$ zh4$s24=SRsqCx`xjf=&B27Oct-j|y9r{TS6A?0*@DkE(cW#KD~(@_WDWt zP3DFT^P)NCg}4h~d11r?=#P0(j`Km~`C!F7>L$y#u^aR+Vwd5z)7V))e^O>sp{zSD zvq1SdsG!J%Wrh*6K>n#wtuw=kDan1OLz_&6lARhxq=r|fP)lSIDlt;1`9uaYhz91s zd{bn6HJNB3+Qy-zPsGM@CPrexoRuMP-~en8XRJ3-M?a#FuBh)_IFmteVF%7~8`|db zD^biZ*@$!8gvg~9kxV_#d3ChN>imKg`3=hOo0R1@3E)>R&aYfRK7uD7awXo8xoC58 z#bx4m%^-bPW92pSsUM@Mj;Q z!|pI>H=@NLvKj5=G}v+~x%Khf*(0eOA111CSJxyTUy-P@99EiVGZp2|F9LTKz!T)f zD`dm6pogYI7fl6sCdPXtKoj-BBpDaQ9Hn1)oPXE{p~PpQiJDz9IA4jJKgM{ft9Y#& zM9^o&9dhk=sfxcsp8X=#NoVkQp?JQ7@a9guVKj5DL-SlsMblC$o95fGG0ZvD4kl0E z2XERFuiBA_z8%(rYNsaT>FeNu>)?qiz?v0B9UFj`E`bJGK$OLb+U$7n4CLxFz?sRZ z;!iHJpns-?JyY9QRQF3%1`Tiiv+?W?Mue}{%YL-VzOkC@nFp2Pk9mMf@qp3e2F!WY zzBiW`RnFLFs2Y*XK#0KZnqBrDipN#6+1_C8(s^dcUO*8!jXoMm?dUN^tbJtj_A`R* zU^Z>EZD3@Jwv~)_tIO=%;nfn;0goW*(br zCK4`vU@Dv2rc{hwgio)Uq9)7~F{h262{r!aFr)o`Y!9RVc9SW_)(XR`+RHI*;epy(x68)02<#r0f9!O4;h5m;=D`B9&@U7xoxl}$% zzL6nI9m~Y#`^4gV#e$X`S|?g{g9`=US3|=ZHgqw=r~Y6bc<~3E_?ODsuQ20p`d`@N z7xwgxBl$%CBS#ShLq^3cr-Rut@oh3e;aO3nvtYSkxm+ygp)G*<)AxhUi$Lpzd4CC* zuLPejMO&8T3Roqq8r!bHd!x@@J+@PeGueo3H{@8F(r?0-K#6uJk+6 z_KNwH{^`DazrlQ;!JLIroRR2Xaw6wpBIjT-=VuoEnI@@OMD#J2D_}XcgsUQiD`Xv4 z2G8p?Tj}qBANSKgjCy~RtLQi!8Aksss{SRDm#E0k+$0jZ$CdYpEARF1$6YsrXmA>L;2fgE`P`99%mAXpK}3fmYzR8%Rx%q~ zV9)*LKcdL_+|`T8h%C2fh&s;`eO@6ie-jUI2mZXzbD1KU&G?k3YP_a`=Og?Xh5aU* z@`Flqi#O3!`gjxJ`q+0izWoe?eznPA(RB8&&0xLpQr6}|2hD@GDoExg04r`Y!=c&n zZh1vDGCVbG5j4-T%t0zIT9BJ>jVBDUwMAEWlxNVBYi~!!CFvQk=lDTqRou%`(!$~ozZ?j8tGm}{=G6c zBYQr1Q2H^-7p7mF5x+EgYBZCUg955T1J$5{nlNcYIJ5zz&=~q_0fV-JCp%*8;l-}d zMR%yLAJ!l87z%j|!-hkC6QGj`(8)CDWCrB&AFMbRZd^cr5ytatFwK#=Fsg+~HH_-T zOld23%GhYC5@jxqIs!W$VfiG4bP~-q4Atx$1a+QuSD~xRtiJ(S-Q>M@Ss!f?sA~@( zu4k-&#_~(-IrfJ2@30SS=M(K`w)L6z7XEfIV3Vb2Na`=SEJg+t?URK8f;m?Pww zMJU9HVvhO|M;w7Y;I-&)a0j~=^X(F%Wya?l$K~55P*<=^^v|;HJfA-m(~rxU@`YdH za`t@TRv(_+P=2L6B~wq?Il^P!K`k-uJuv_xaLB%p99>CQ%0{U5qA`e9t>wjIrO}|dSNELF|%Hp zMmbf`2lU(odTxaLgERk@5%^7S|HVw~hFtkgv$XR@!387Ym=SW6?2e2kW8~V0;mo&; ztN|fouEd$|d*X1R_~l%TIo&LAx*Yl#BXhJE<{~8dSHq&flB)2i^dn%DNivz0W)SC08A?H{nUCa-#FtfxGn4%{k}>ii@>Jw*ByHqQ zByr?7@_pn967zg}40As4rsTh5aqgHg|LQrTA7plJ$+us#&hwIN&xP0)v+9kJujSnj zdhY$Oy!$S*@Exq)7xM1wS;2MQN549>j3Zgdk!I|J#Xx(rntjDUyRf2N<>cE$hQ(TX zmg#jf{`xF!eJh-5iiK8Xfh&m!l)|Q^JyTyqe!dWS){3a?EO!o;`)O7@qcx>zS@vY! zLz=>qrHOIs6Cw{05{u=IJ&5HanR$k6JVe^qFR}Eoo8qE3V@YEdV~JwtWAS5WL^F91NZ`i=PLIZ=`m`f}4B+8< z#XjWumWskGknLL_A~Q#HW)?3wowuAIE9m`)7_^d@Xc80(Kc4Yb@c30GpplT;nAkN^=q<|uSXw88;X%O#-sIl^!hw|Ju%XH^7?h; z_3L8N>X@`PsTMsItrGiRQzl&qm)uA44#0KXKMRh@`7>w`kUA2l3X<(Wj$r zNNds@=Qc$!O+>^Ri^0~5rVphS>Zyrvs-m5$sHeQ`3dpgvW6DOK(t>m(g>O!y6)Aml zN)g_)(cJdsu`idu$?9*j`n-(lGW)I!>eDKv4r?-r>}K*;Ph+cRkml2e=W=yM40QTYpC2%`4###(hU2ypj&HG zYxSLMx5LQ6EZ`08?W^3I48)cF>0uai5at|1k8-{fapq(a%qV8k(_E8xapyctzQC1z z&lO%mFDGkUz16PXT32eVE4Im%`rLK?(%taOTUTF4laNG{u@NWF9(L!`aC!u$vru4>C|}bC6XwR!L&c z&&f_X_FYzbAB@h39g$-{ZB}_2dtS5x=d#%6ZO0Z@JAaoEc_=&bPz*F)Y(Lq> zTAYwc`6`w=X01Gn@pSC6Y|G_XuGnoB=7(6Jn5WEHnNl(^C0Lw_Rs~gLg{olBy0Ijz zRch-vGhoe(I5P*%%oAxNFW-@6>mo1TU8biy4(%^D-=75>ibF@p2#qyEpAc)sT6Qv% z?+}^k8Ty50^7CSEVa_2e>sTxFM_HjiMGk%{>pMp@U;%5qSaiUXK-P;MWucGCPMu<{ z&x;&<>y0H>tem=uKfhzye_`Q&Cx5Z_e_1~oi(QL6od%$xQ1gu-avZFHo9*l1N;T1{-UHqTg#hiu4GHjG;?mb!|E{Dh}m zZ$0W3>rubJu6spm_K+i1qaBO%lVR*9K025Ti@Ppsc$*jgi5I@(Dcw8D53NsqL}I*k z{J8nnn=Zzui?QhkVx`M@{S|T9;?{&xKvXh6&tC+i7DEE1F=`p{)R)9otB6ikC-tyu zZBeRM;*KDU1DNzU>Ntc)Pl%Fz9rp%a?JCOE18wv}9(|RE#0Bxvi|FM-+$dBs0i8^y zC*#-I%G1ewJUdg=Y!P`+4D@~bmeQ-#uT&SrOFwel22r(7=`Bddn|ebnci4CR{E-9*yY5%pEAyP-u_G14`1#s8Q6e@X3CpA^(y5!VZj zx{R~F@oAUD_`V@$G1nCgb{d0S6p1~D%g*4kZ!p_gtagq*jor>-x0BfJEXqEHV6FMp zn)vwfiFija;8&RM2>v@_J0RxG9P`7+&8Tt z?_xxEGNN0{ueT&kF==D+G9IlD8CKd5$Ia!vHtVglPBfmy6 zMSf;wZn8MHaO!0<;cp^|BIj76lU5BKmyAn>c zJ>v<^Q*!Y~J%er`7hf-Fovpzrj>yO~G1aMfb)=Z;*w_^w@FF?GBcA3FPh!zSyyRh7 z!acm^u4n@uv2pB+Xm#GPHZNHr_KD2mT0Ht89t~t!^m&=WJR&%`aO^X@Y!*?S4A!Wo z@$^JWl1xnXNqPP!c;q-yphsd`kD?=@e<8xV%D-Zf-;{r#zmsLZ5$%Obdx=bSi(ZKK zL=0UKL`Q7e1)H|PrX57GT19t8TZoyq#HgOVG-}R(rh;;M zI<4c=DyQ@JX|yPvx|FU@I;~3KdZpIdr|73#(^RfwN@tQv`6*|W%C%1A3{ywj`&;u3 zDHCgAp*SZE9T#rrkX4hsb`O9|0@6EEEC|&Ct_{zXD2~7}O*9@$$xaSbFv4I$Lgw-n}jEXUG@8doBHz8V4&#y(Qo7uf=MAR4O z^o*mC^}hJ$vS{nrifHH9Dx+Vipo%0BfX z{aDsvWKd)iOZzzsyF*rLkM}(t@|^t~`_ zrFp=TIJ5#O$1_%w9juH)tCKo$Yppe1%R_GDAvb$=|4Y%E9X#hAoO;Nb(?h)J3A}oO zXFZQuFYvM#MSQM{wO-?We-v;19=HCYe1}K=)0%*X)};QU9ET9&iESlDi%E!Is6qrI zWJQOggfZf%qs36i%jb_5t(s(I-rHiRQ{!F`-7JnEONnfj6E~|AH%|t3p7`n9xLP>3 zF0yQlC>x^5W^qf%^0=0mw>8}v_jV8g?SVMDAC?W}uCKNAgl{;9*-tp9 zv*_t`s6P_-`xx_nNUxz+*cX(S`1t*w z<<(blB}%!@W$9w>WKmb5h$|D!Y@Tx^a+^csGoQ##XLALzDyMN3(z^;N=oIc}V)rv4 ziMSH~V$4Sv^KL}^ocw|3nKC;utl{Md6! zADdY(XVpIR7LbK_a}i7TF5aBsNz5r^yqM@X*`eWP>O(N+TUO5ZlBe%3F4_few#S>T zJg?LoZ#E%~SlL?QqP48NuPho+(Hoh|kswm=0(m~t8EbZ7t=r(tc2-(7lb3I0O=y$Y zQ&#XN_g0gn;-v{i9-^^2vG`W`-;Y&Ot|ChD67KXXc(HP%Z0tLp;a048>{`q(lHk!x zyv1p929qA+K@P`qkgT!2v1elYL_faZVYbP(ZIJU{&-<(s8Tk;Oe#k2=m6=?IG{qh4H%^BtM0-+dqp;PpusPcH%H$< zEuHXaXDr$g#dL^%K$hXx_sBvr4{6NCSMSi%tQ&Yc+Ke>!t*;@aW^($kBd1rQBh?L4 z9*QUjp_I3j`z!Y&eI3`=wx_qx9+^i8^l<2w1AH*i~L$8}WS!RNHY&F$@L=lHh% zwW8b5EyI7!?P>4mrncJol$Q3k^eKS^^{voh8@erSYK3jv;ik6g+S46SbZ2Y1!}Z+hT2^c{#+vo8W+RdF#-W^boxXA1F1kiH zT=^TW=MT>QNAjC1a>tq9L(KQdBljrgY!k$K>wyFHzyVluuvybk&kzl&Ft{&7`bWV!W9aYd$5*li52! zGm433mj%it3zSDJw4fF8&#{2TNC_6Pte9v8dHBk#WDV@;?eVfk^TkQ$lJ_y`5|(s1 zCSC1)Piy4s*W%JmX7`)%=r)R5IH0=@fA7AbDW8!!=>5qXtu~jUgc^epZxvv zq8Pi~NO4|Hh;bBlRN@S-e=}b@9^{7`2VaNC#f4ix_IJP*U@D znPdVpdINS2Oqzw{5gW}$p0hG7A0{m#Qd5BEEFp4JL8sWR{NQ=1+w>n8_BZVM7lyr09*DKZ zc<#(A&KJN#H5|EX%Dee&y--A%*ZiYTz^E-8(s9rrUTH%KvA!^5XVq#IuwZv z7e^g~PrWe_D^W z&TXx4TH%}4(W`v(XQ+A&@kUvUJcb^D*+x5VD7qbCdl)^C40f#b8RRo(^?6(`$MrzE zz3qFG?qRzl-I=s=OeeYx-NxUvw6BHoD~@gIvm2{>1qZ&2oL{DEtE-`nHMFIoc2q&f zWo?(&){@GlNO9$&uG;fhF~2MEoVx6;OCIN%)fLF*s$_I^GAXBZCDOWnDV+V2p-k0# z-ZrzDswYjbT6vs2`Z&F7l-bWHy=?@h9AY*!*gDR^*zzr0*+*`DfF9b_dd_}kQeCV< z=`PaW0b6zu+w4eMSgF$1lY6gP)7e6NvoX$mEu5LHS6(Zdur^ZH>Xzz8NewGqUh<4l z71@O{erdO&RWK!#OPlc(m4`24&FAxCp7~`Y3W|B=wC*zx{>)-TW;I*PZ2f0?8H}_T z^eO8BzN6;m8dv z`i&Xvg-C7|#5LrPOn;g;l}z=1`Y~4RkGDcUKAG# zEyAM|Bn4u}ap>t-9U+|=)f%H1Eu zp@%%%bVRIlkJWGcWFxoZ(H&OAZH<-_M}2`8E^1}l^P)Y^^3eIbgDR)>0NHTrGqKg4 zb6P`I$mM^CPnRNsrJ_*FM5EppJAF?+e=#EX3Lk9lq& z${XTr7ctLe9CQX%p2I{ZqZ3fdIMgzRcw-cv-G`xe;-{VTHhlF3*+Mqq+fCSNE#6v( zwN_)WHCSvJ4*QUNK$ejA5X^j>wuqjMXy%dW_-ziEg6-bMbd%LhMm}R5Gs*Tayf@1J z;pzs{!_*B7r8B1OPHX4u|v`CAbd8Q9!if=HyXo^u|3K5Xv{WEOmLEI>oA-}GiULd>-)O1 zYVLZ!>MWbN{;xUvrlbW{Z0_l?=B`X2tz4~^xUm&pY-7bl3$uU@u3{VP*uhn8=Zy)S zTW&+-vsz<%8XU!s0 z@a8NL`dND2EVH4xVFW*uSY=j{-3%!w$shYbZ(WK%m*~Bsv!rZnwbjw9tn>U>`4c(! zkHtMd)B87=g>5h^+al(9&DMt8#4W}|zn zQNGKJbC*$nFqV-u$QZKc5pmA*R{ES~EiU8GOR*QM?s<-sHM=b)H~&)XPOLl&Q&kMK z8mVVx(95KuIA{|y@dKW532%^yXGjtG zoO~%i|0U1yrP%1+NLJn>YviCP#}P5oW04}HAWkhwUJ&7Uk=H4URjXjtDmb+ksmU`n zsUJYf0QGFnqg#uPaER@ zF+M%`gpsyKgr7FeIsH$DV6nmW_s3;}=$=@15H9PXzAu{Yj#ztOx$gMvO|;zAzBjR4 z7yCNWo`?yhjbmElyS9$;UIkZRKA9^FO-Pm$T6OB78XuTP_rFo-02dM4{*4 z%eiC@zMSO>&vvC}k^e=k#oFD0X=GMh3GE3Y+J$WwbUp>NtAHz!%T>+e+;b>rcg8^^ zJcx)tt(?}Gr*maexC+T#(s+_sTz*0bRkBw=m@eamve)rg~))4B8lbHVS7^hjHb>NFB4Q+MX+_5x19Y!m0Sli%j5H$h@HqAg9&O}_fkv^v zc!fK$26(hO&ry@-sLqR263M6%`<4f}Bwl(}MB_}XBql9Jiin36iXD=_-@*Ir;)yo% zM1C7jTr_*^qgbZcCuF(I+%oaf#d7%z#Y^Y%X0tKsJF&#E$ua($ryGM&N5me>3_jp7 z?|W+Eu4nE4#H7FYt)@G&i9hkMKZy8z$K&3TalGcKi)*;_qR7w{TzXNI=o{YpEN^`d zlb$7>1>u2<;n>1-As!h`i#Qz-FFlG)50itUQU^q&_T$ps%KI>?H$d_3Nn&3jiml#+ zvxRI$8yk_wX7SWdG3t7(x>n?C9Xk0KrF?=_*Pxa)Sal_m`6zlFM_nV|l1pN7=dsm! zWO)v6SxJkA=0%UHJBlz5;jsOfERenGcdFY?wqmtyxNVE_CVIW?4Vd^-th^T2t+D+v zE?#NhD)mc3J>93y4CQ^>3)C;RJ=bvyZO>Mor#w@67Cl2v@c%Sh)0E$)-=?Rio#cCh z@&tb|-X}~%#iM=a1fMk8zOg=iv`-&Jk8zHpoZCpP7^yr0RS(ySkyD zLtU@IhF>7rn|<_7+q)dU-*%wC zQnyRp3Evs)Kj}M#p;fC^nz)6!Aw13rYGcPVb59OoU=VgGzWVwkW-(hCoQmAdD*1KDU`|?a;e-$+hnj`#gX< zzY+&M>?Sj1fC8On%QDdEnl`uVVW?xx{L81JHL4P;O{*sA6)3JZN z;o<=njfsaw@o41N{Zkhx~&bFGwL%rY*LEm|Qy zx)h(TF@yhDjPx@z`i-pWW_kOqX8C^cNj~21=vnD>&|8>~vBt-+=~>qKtd;r~$rV=n zy7i^E#Y=w_P57DoCbDo(%=B(-E-&ydFEC$3ViB+K9uM(BC@CUKMJ-mzq^+`o>tj)j zPjKjZo@KoV$3}6{Eo76}=q|E7QdESa94RfHT7eg;EaUbPPgF1RwTQ{-NCQ!kM!Z&I z(oDqUb(y+Wq9$#4wGLRdi!5F@jM@XQ_T~NF5?dW0+As~X@ZbfkGc6!%`JCudQJ%es zUyLa!+Emo4x?)J6Bm(euC*J)$xh$G=8L!^3Uf?FL|090=9tr%4U4KIb_vpXHVE;x2 zkLkyVA--p%;}B(HY?OpfjxbY-ex|`rsc_WOw$o#%tYURpZRbFkd64I`_$r_6=WQ3n zT}5oafW1o4C9zp)WpBq4y=yL#*BZ|@Lt5<-S97`*3TqWt9lzD4>!8(obOXAfIALSb zz~8)Pe`ED6uwPT!dv=st`q$nO%^lrNsinPb!kUiiI{KSVzRT~aV&7)Cx0SMYAozrC zj_-q%d-&{L&Z)QhKI;4XS7N=Y8MvbOAcQHU&}Z zoOEtfoSn|1tO6Qi;c_(syiJW^p=N)G*@Ho<5zPzKm-40{6 z!a zLweF-J!yBOnjTrn?CB-F^F=*1kTQC&Y`dd743mj?%dBp&oO&;_yfv(EVhOcQWntT+%j{ zax1I3(J$F;WJy2uj?lH@p=)HGmRS+C5|1t>%UIs|a8<@1C7-@UYF17YPrxv)h zDG%}*Px30y(g2q>5dHA0@#KWK>Q}tZ5gunZ4|EW-ZjsyHDWaa=CxMg z)aAU`61n|FGI?`(w)s5V47~b|nCcYFI!3f*GEX>+jEE(Q4d5N$B7JzwK6E$Uv$Jv+ zp0q8m+L~^KRbLTjZ6@De55G3%dFx=<+M+!*Fl-eW$Cr5JioA1q@0}_g%4N}~D=6Sn zv>=Xs4#(!_)pLu*=AyG>*R0kDWRc0tgk>}0*VH_}JS6Hkf?E&Dv<9*tjqFDydlAWg zl(G}0>_II%JS(*`dKWj{!$*J6zu5j2Q~iiCzsFeLDc{6b*HPv*4EC+^c^q~g zfu5#MsyprYqZsX^9+E(zV~P4Ka}r?u-?_CzvzeR?$Z%W z_<&A;6XS_PCd7t`#UB&XDX?O)*hlXCXYTkX*m9%T=4axXo5|{gyXQ{A6bKvnT$3v5MtSym`kO&%dqryeGTx5O+S5dynDH zDBesE8y|~{y=?|K)y(f5Z_Ai1pZ>0qwva3``j*Br8~hpd^$Xw4-Cnx7Of zyL>+OCC=OtinB4w4~cUgmO(i#$Nsf!%2_ea3wZN_RX>;T<`t}YgO&K+O!o(t<7bxR zSJvc@Sj*6|++$(>iFKBjf5VKpyWD(F{MnmT8Xzt@kd+!5OGVOKk(5y;D2q%`Hu8-3 zfaZ}Q%7Z_jW9cNX8y?+-Mfb3< z`&iqf3i0fM#;Y{e*8!v zGi1r;cwT8XS;%9|!=WFLCA`VX$kUPKo-p{Be8kIqCi<}vgKiWF*(@ru6@zXUCE1BX z_hHaIk=ndc4Vkz`Vy7?T(bsvcrlc7!)|#~E)jINOZ_-_{XfG?t`pWRV75SOm!Jl^{ z!?EcYT&lH^@x0_TS;481eAz*6e%OVS;3tzC5m3oETy!ldTG2_25-KAH%pSDai_=`z2c&&V?!;v3FGT_e)dUI;MI~DePN)Jzo zKLdHvEG$VVvmyy)44%NBadPkR@aN;m+v1tSjh1nd2a&l9q%FE-;QevLP zjr!tZp3k!c&zqeF)*)ZyQ)@#%mOWV$$sG9*i>?q8{hu{S!?Gm9ok@)0#3VsvI?MAv zYZMjtyvsU0@O;rPVxE7nT0gR6Kd@rAtoyu5E}C^;3awp7)~+4?Y(?5&&?Z(TwO}3V zl183asw;C;Th6|^RZP|JX9e-m3f}cp#w@=q3;TiJ3(FBLqmyN5(E7ge|<%#y<(fzn|H`&fp zZRN4P5J%mBOE-#`tc?}r?3u9SgGs#>Y@@?`?EDcYZ z2AigiIg8jhnZaSa>IhzS;D3zTo2Tth-sF9Ih^uxc9eLvpn6)(z-CFrIx|z&lBf5!I za1F#=U*^qgiw;%e*{g{bStT1vc^AD)t>}igybOt<|Q8^uoc#5P%7%6dX5;}?cM93o^(numE`!ISQ?Ht9dr_j(b`b6{* z+Psgu?xW1R)+OG-Vt3U2j?aD$^$`sF70NnD3~2ul(%<9C9dbqYnFSmQCFU&SnKdLP39w%> zSNaJvh~%#Hlgdw-VWdz_?~bIhoxvSS7dvUzaaIiTv>C`5clJU!Bgx?o=CvK%^#XYD zS-I^(?q)&TC1Tfcr{6@6-Ox*}=sCAA=XIR|JT#sialWzBp?aR+>#g> ziDed&8!0Kw=2C~FWtNpQvyGs+vGhh&HnGkuMp|}~Q=Bu85%{bTm^-${X#A9XWMpnK zbKEH7vB6C83#0eT*o#JSMe)umvL97R4YSUdacCVQzmYYe!RUXLMR<)hK+B53d=PGgU-O9 zGcf2p)@`0y^#}O#J+cggu3!N_#GmU}#5HE)8)D_n*vsL~N-Sq3G0)moKUMKue0{V0 z+N|s=R_ZsAdvE6bOfAGcn}?S8vbgA3miY#`$Wq_5O8>i%L;Hw-4q?#;v*@T!-u?j& zy-yyAG(48^ieb_JG3Zo!Ht#Ug^YgQLiiMF>k#|Ke-V@1KEJy!A$f6l}m0Y+qD;~|q z)8rB1C@4-^nCE$3)T6jqX$c;wtek#1UaA6JmDj2q+0Bz3wAOT|_{#ICD(^N*C*;?{NaXY^*#qR)B$ zFM0bN_;iQ5J;-3cx`QFJX27diM7J_o%@^=$76g(Fvt|`X%`W$!Q$#FB+*RCqOQhMKYWL4yUt?PoDzF30Ah^Wek+$hUxF^4iYtUq14z{|ov*II^(+^I*l` z)AEr*zAc}cg1#|-_)S^pXM9qyoyliqurDK>o=!_r`J2@Cr3$40o-F9B3OM8E==^bs zeMeH?pHM5G5bccbEaUsus4E%g*he@oDE~`8aOEE<|B3(Z+Ya;}wtuI8bG3hR=YFz% z%bmOF*qih<`+_@o(H*=P$>q*wbBA+a%xvy>Hhh^CUuH3T$sBi>KAk(SJi_rct zNBqO=>wzBqdt?e3k0VEuQR0+A@0as1bNeAOgzioH8!^3&p6;YuxwzM$?SBFd}FqKL9FwfnfEE#puh?qWd#q0{P`Ly z*~HAeKC9UPgH|VXSkxMF^;KBdN~8iQFJB+b^vjs_7q#lX7;F5Tav>|B@`;5$OLAe+ z93(5toms@-X_h>l>{SNQgcRbUX=Jw&W78+`X97`%fJNi5X;j4V5%2IXs=JRv|Hh+t zc#hwce-f?uG4v$uL$7jKMB|z)+Bdw-1>WZj?{kJXIv(<9;GF`g$y?P5J=QjnlI^_L z7CHSdc(e7PhqLAllde@>!Sk&WZCU1ds1K|^T`c;tgok`r%#`opL378Z$ppTmJXOSI zg7PGB(=jy4#-i!?v8VX6FQQ;SAeA36>yK#VNA&W8DB1Uz^*coKgS7y+$t|pULqzQw^0|t9u8Xr? zA=jg65RP9Iz^<23(q+VS8M_AhiuD1PP}SvV6vri`ALFcNdHS7kiRkC z--z@s#=DCL|D^x4{X6#i-M(KP|2z2=2mVC=j9`Dlhd+ed*Ad|rawFWnCUX0ut*hdV z-;--t@uq#({KZu@*B$k(BW@^P^hsC9x1s*c_D{a;58FZco)-K;|Ame3s}EZCmu>H_ zwSC?hTyiGoqW{qGG2bICi*uHN#KVIL>EP@Gs!u{Erjyf2W9MD5>-h59P^WclD%+Xt zOY16U46pPJym?I=)7#=*<>0R5p!2v>x!slEjyCai@#9 z`{msIGNSPn!=CWas*peRjz{6FrY2n%OV*FY=*MO~5%ac)vGRmDTs%E5ksL!jy)PMB zOQ?q?(>s&tu}SsRr_2dc>A|T`TRLMhjq#ZQwPn`RGscGN`J-b`>;2ix$g&y@xiDv* zP-bDtsYcA)SP?V1{MfUIQB*Yc9=2R;2Kc@>=7&b&vRE1H`BGS3XLPQ`nj7)uMx%9; zSmsuYxz)^aw|M3*>o@m@@~WBUD;TsX{%mfA@PN4FLKY{w#46+lp&nQAxBCiTLg z{aBAaEXiONWuO`EP#ijpwHbj$C$K!D$Ye9(3G(sNaOf1)=^ZlDb4u^Z+RVYBqPDU> zSxE*Qnv?a*f0aZcFvkC^SY7J<0 z*0+}UXFb-qp17y@1wOqQ% zY&){antqqbhDW07ua+& z*@;be@Q^#O={}xwmyF>7jCwHAmgnr~IjT;$)hYxY_9Q+%F2Zw$=RGIlbKco}!z*8K zCYO2Wi_YLG&+S=b9(n@LJ=wEX)9FBF^5V1c>>OTwF_xWY`#lW%p7Ju@e>qu=Yu6xx zHF$O{Dp-pMHi*e?Knk0Y!)8po9Yt(aw-3i|SAT%sgD?)Ejl;@E(Z?~{CnJflYa&#W zP{b^;H2{g?&P9@7*C)|VQsk2&EZ;&bSJ2A$w!c@tMgK&;Bfpa0$S=s|4t*z*GVU(< zliYXg{YWb0m5NRg_b`$giKQf|ND5?@N=!C2QcD?@5-mpcF2ztjRy=0xEajNanm$bJutT9K;d z=#9(`EkSPliQdFOr?C)IWK+hQ!A@j7#(GYEG>bBtWf>A$nS@#!F=j;(acOTn+E=Eg zTWF>3m{I?UIRon@2W3{>&TlHUVBuO5(OQ=7qU_MQ*lR4{%b2vGY)~C>QF$2aKfhun z_h8QhRyb|Pp4-jtx3Q+O+@yq6PDR7n|2kH86$br?C0-gv1+s~e=CU&X8JVdpB(vy2 z+E8Y*;&X85R91buCsL=9z~WD2`6uJiu~>Ax$i!ILu@M+_xVY#j@zA%FhwvZ+NIyIp zc$Dr~v^Nj)CKm0+<8<~seMcUsgJ?*5QIQsyw5pE? zKEJ5wPkz4aIkD4x__QGZmXE*7>x^pAJIW5q*~DRTID>3_V|Hipj5ErD0s?v3 z**wjkW+3TtYDQ;}p1)0xQPVl2RCJnHW70&#sXqO(DAdcSp$>YeiFs?$)kt;qFNKm& z>z{B|@%jBH!g3iAtP&Www7R0mq!=109E+lzh%<;r3xpDJ29Kiom9wFly!PdcJ&b0z zog?;dG_%N9Hj-K0(lz`XTuTz5OFX z_z%W?L>@*H`1=I56WERymIED6YyZW#OojSKVJU`l{e+Xcf1@#Vap7M)2>&X+Z-}Qp zfp2`mrv{P`#V1ym2*)My4M}W2sfEcM6SOD=o_mUNBd#=(wlVWg&hWESi(f;rnv?j=b8G*LGf4A-{4Ug`7hH+l5_`BIE^USIl;B z7fRVz!rck(OlfzkTr8nGm)M<5NRlG7BqD-O>a$O}%TMaV$=vDWdPHiyAep&XD*Ze) zof>DR)mzdV4;l2Lr;Uw_dQ=v3x}f|_tgGJFSugAs%c%$EMr=9t%)BI@UYbvDEr`|% z8h?clTVdQ;C^k~-#_RPHjf9C>IF+8MU%gGKbdN;=0gOU$w?O`MQh}M3k^(VFbl<{*` z%g?e1-)i}{`0|SKRV}@#^|!S2N97;1`e!Zv!#MmME&r|6e;BimjMs-+9wYIr>5OBg z5@F6nI5P#ym53Efk2RB#%x2!H#XU1)&Zk+vte7*q9D6RznFn(|%PJONB@2YUtE_el zG0>LSvlZ!pJ3GpDb(Mqf$kO*@`MZ+7tbZ@;IRK0H!JdO<$NJJkvF9KjW0+{hC?3T6 zGM*$I|Cf<3e40%aVc&^Gdf8+pYqdB+VnH1L?4MQ!%-nmaM*ZgPM(-7ijh z7=s?hqlZHd?aagW=YhNPzWx96$b)$30X%fTqCt5quRSVqiN1(OFY%98wEmJayP@^h zl&@jZ8|1p}Th8D%-+GJB{Z5?cJM{2_GyB1r{G{yHoamKk;v?lXqEsJa*tN2r>*&vL z>qd0332|(;Z!`J`WSi}6_U*LRUgzg@AvtO@zsRl2WV+(l~tn8)08 zHUDyT??#Sj%^~{_(YtLQ(3+iOm+hUteQT(H5##@z{OpeYqQCy&?gn@JwmbccyMNQ& z|50zajoQA`LvE9x$9%8?0l zfnSp|dhBuI@T6XR+_*fZM;|jzk6_KiWWRBHDALmi>80gwXz?3b-bvqThcnx2eQUan zzSm64U!j|8af5J_eMGM_>Q#aS5i9ix7#HK9|i2c2jpI*E*B9mblaj$$E(hmsz1rZN6f8<#1yIGGkFL&%8` za$*u+i=WWqsF`w{Ip!l4>mRK7H|urZjQSpn_6Li0$4vWI&%OV`+Wlzu{T;cDHLu~$ zn_`~dDqoR%KX1l6zZUyED))YrH9hQEq=Pa~2kG7TbC)>i4iGqO|}Fl%7VQ!A&!s!u6DiB*%a_KC$(6NeUmLFfhIi={@yP#^PQ zk3}E<;UWH^?~#W*$ZvezT^{9^P)1?WvAoPM9%nQr9l!$(A^k){`twTtaA^-b+8dX4 z6*=iCV$#vm3!U+3dmgR5ynQ?6mR6g!6K!e6`?ci#8i|=UlMQSrBJ(O9ZNN)55;v{K zdwNF=y@GdL!RIgGVV5AkMV^9Kto$yS%lmqYi+3(B6ZxVRm)837bP263iBpT?(PGY^ z7)C9w`(h)(lL=EjxL^IOL z_Uj^5ui@LKXrqY;RU>O%>!XmD5y#8uq@Mk?kV#Ea9n;ptu$7go(G~5lO3EXeikP+x z{UXjSBc@vl?Ub^wI0`Cl`voLa%)UTBXWt9xrywb;oSzg_pWm_hMcWG6&J)%rp_7q7 zC)e7}(Qi;gjl;I+G`HQd0GPn>?&f>}--KKS`34pgyUyO5tptbQa0&PwEU( zs7tDqPtnQflsGIoNvWL5{xtTa^nY49_&@l|^!B7xn^{dp<)`UPbQby<^?}amGjb|t zcVuolx4+8kn1bqat9#Dp6`%{!&)ZjsF6z^YI400V?JGf-^jRf*dTGa$v|Too46b-4 zS30Asp4r{VOh4m}WWkzQux3t@8O7zMv+9f4!g3?!dN{GM{f%AcSG34`c|+YI_N-oz zUymq23X(#4&hz?sVY-MORMc#zgdX*R9#))`HeQM$xfk`s;(A^gJ+!R2XIT_ij#M-s zEN50#jl5_aR@aLw>(SMaTy;cO%Q*GBxa3_UWG-2#zb(-JKG6S`7)2|z`~$68O;(am z_1QIKlUA?QpSNMnjb@Qwk}Yxtd$e*pIiT#EZC>wqMxy9>sh$Z&9t{*(yf?uE9<9L5{JaCs@@}tm@a+j($r#K}A;+6{sOX5J){1xwcGJeLPy9m3~EbtD$wF z0h=~u&0DhOEm-!}xU?5y?|75T3=(*;**NuG zj2g%y-flkmfX7=bUb-BsE)geP5qiVGL)K7NSM0Qoa(({3p-kbcyk;YwwK)oWm2Sbi zwxrwgv~5Lq+LKO*uM2sTC+^BS_u`#<(tT|AMSlZ$?LoZvV0A;0-$>;VJp33Qek?s+ z6lo%_KQ(d!AsllCC!NVLXK2`WdAogIAe$YCXNP^eG4C#9vsc|-+xrpGe#ac5 z5BZxT_8&%?$88@|e-s}d_u0o#(%1g(YsZ}QS!a|3Ij?-${1?BVV&XJ2g zUQ&1YKYa~JT~xl|9Ih%~vG=NDuZ6WY)n9e=b^n6D3iM^4b|w6TtB$!D ze&Q8%XO)9v&iLC4TI4rq|7+b1+;~fCt~-+-LVYZ3@pWevoLz9HH=Owm<(ux^EoXm) zzU>}fBez|#E3VKDSM92MeZ%%8_xpx>f010rl$Yr%`pgwq`de53qC4>oIgc;D)t}Dl zYZu(D3-md6^_)9+R$n~lj-JwA&+4xy-RV>Gad-ZdSmtpvm#_5iWAqU{<|sL+_Z%?} z_8Av`Bh399r)A@{YNQs8)Uu&kGE_?kyZ;09*gTZ%DRbHcGdIWRPJOn zbk@SQdVf3psDoCvR&I@iThPt%w6agr6^lZ?=D$`di@2<$nU9%(cWQyzgo2g=J2m5(1p`Wy8FjQ-v% zK_4vI6MJ@NA-dzvH_T$+l$-B>MLV-BZCR4mp-!O1F|o}@tkWYF>!DcZ-+1$H<$Kn6 z{w~&ehx};f{fk+5z@9&viC>o`y3P7srmx5p1s3rIuI`OWzA%G>8L`_ID?=O9@`2C}itL9`&S)EQ-}JfkTeA6W5^$Wn384?_k` z%GxKup@~@k1Xwfy7EK`Q<+)GRf1bSjTv@VN*mD+dF-rtvI!`i9u6{E1oWhe#=4~d3 za*V^EMnCc&5QTRDbf8rx*J2TK!269NHIycH!ar@NOOC?BB$o z9YtO`iNv(=OjAeRv8CL78@g2(so5wpvxfKFg!ESM`=9XlD|yzHSak*QHUVC?A*qK+ z>seb`i>}Gn)pkaHwVs}dE2bg6nV|=-_Eo1}Ce<8Y2NhMfuexKZ zJGQF7sjOVZzVdWs$Gu1@D!*ud8OK+!uaxa_jxFu;O4%->T*`4J|Enveu7vg#ri+I< z=YKk{vkvNWJKOxuJfE{HU^~C*js4MA+GCsYGzbUV-th!3-$~oIWSF~M`eu;jGuI6upa&>K~;`kcAshaxQ zbXEK6DA%Ox`MjX6u2uwf^?ZAMx*^?|eoYG+`;4Yq^s2h%TG(7&pj)bIsb#H|+qrga zl{;!#2d(Vl`o5|B2Hj07{eFa=QJz%PTPo=LmGq#>dQc_fqK4k}lAcyePphhz)zAy8 z(>3+Vx_V<>N?XqsHJ3r?fHzx^ zjz&#eGr3N(%4`x}{q#6AZarNgl2TVyo$ z9A-8-MhtW~_MBu?k2b=+aa7B%7*{uxZ)o9dt^Juf-9R7?uf7il$au|0J@!wVi zJPc(iE3*oJu4HvqSrfX-On5a8{RD%0-x~{-j3rB9W}U*!+B-{Fuub^$OIB^W8TL-G z(cSnn&<8Q-9t`>weGqpZrH{)P9W_Hg!-}3}InQ9w^H}s7mi4?@{uP$iyFc*eOQHdl z=qmE?H85vQQG!~c2KAI{v)+v{sQ0djCj6m%4~zaSixor~{$=_9r60?7#Yj9JB92ds z&&MScl}Ny@tn zyzSV@$m1RLZ=;PF_D!c}+4pX!_dA3AVR-?)7?~`>O^Y$r5`Xu;?PW-28KPOLeg(Q& z>2FukAFKZm;jE?C;NW$R{Rm;MrTy+9E;&Y@_)m^Iga64Ebz2eBX7Z)a*`j`{Wn`8e}yWeFNRAfplMWJ>B0P?rSft?WLt}YT=u7S1s(Q+*wa=r$4l(+h}oHt!$~) zt;lOy*OY!m%NmDzrjfD0$e3>SHkRMe%t1D}9MXXtYc$=otHyV46 z6aO4S##>d>-)QxwQDdQyy1cfZRnDcwIgOVbcry#DkVWgC(bDuJBS~p|rPtErTK$yP zCS_fc8jDGklOW_LjLnFa#@F&F-i*oQJjR^=Sl9Uvi}e=^c8>+S$C~}ls{O*c{lv-z z@;!@pTdw_$2wlXo`Ll|MW4o>fkizj{&^&nXIa|3Bsa^O z%c`d!0+3BPJ4>Bad^Cf|KsJ(w1f994rgi8>0^775jye zn7~u+=G(W0(i5+C!K82UrX6|LH+j?!*t8>NZ7;gh*;5wn__lUDaVr_gR?4mE=KNsG z&|@#c8UHWuV%vqh`fPe0J%gv8Nv4O=h<;h?8#|NwNV_2)T-RB=%>UMQCiO^7zB!QE z=%Na#?To5ueIS+j^(xMyk~4TIlpd(0kGgJ%r3djFh4}SFtqv%ryt62;T#haqN;~DY zsHe5S=Aec_?M*l3HEL8I_`gav79fLhH+rQd(SE>q}yplD13JrNzn0IGa+= zB-k#c#bq2<&RG<9W)*Cg#YpAtFB9ro_SMqHs_N<}*KkaA<(ep~igFF-R^9$8&a2;Hc{UqKbbt!cV9getLC(RmX9)99PRR^++wp)ptxix-My~ zuC8O6sH^WAn>g05jnkFvtLPq9#*Z(dvp`pLrK-~9T)FD5&`Y)}yMmQ$S5~f~k5pE! z>PlDAhibYLRbBmB`czeSsHQtqldgd!>$p?Z+_^fWrtMnpY(11#+ug0F|N7;2*KWA| zer1x>(My`>9S!uFM#``1F%8UoUPo+=k=twJb@Hm-)>5x~9bdLmZehH&(i2Ba5vWk==CbkN)1kS*w{=XVcB!>5>XLs;%5*WSlS>1~AcH+lvd zIRh}~5V6jHIfoflgN(2-M%_@OZWQJmi9g4fF-{2OYkmK;R-X;obE+BUbeWDRM)GVU z`yG0&kv<2D&cmSdjQ&M#eX@Qf3^B=@<_`cA>}BE zuuO5RRD9MdG3%AU%J@WdGTfPrB}>M-c^jwa=XbGYd$6hZ7F)TLjih58v&$G|4O#RA zt9X>0GGjk&)%-bZdd>{~0!#W0i+T}{USeUdvA6+`-k@*DMBP@tg-d^Cp#w|popr2t z8Lnq45LQ)wRk*5JU%Wy-Y817`aVu?qZ2xK$wKkL;^j5M16Ky3s zwDe07Y;Q(+JG5>Ky-jPj(qDwzL3twy_H7Bv!T(zvv&mn5PB!`f^ROoPl&$uB9_n@f z>D4|ds9zI);um2ngO;rDw`+V`(CXj}Rw*y@Hy>(kpqJTRu6~JQmpf*G`sL~u*j{Yk z`|9S|zkn>#in;3N+dqpeR5wFQg8gsPLESXxFwJq3oNu7VxfXt}EWC4L9WySxqo26T zpSiOiqq5J!yF5gBsC|Q6(}Dh`f7nY_>-(#Xh2>~%wO+JLFIuh#E!ERLFiw`!?;A%! zZ~H(mTojf&Xl-kCZT04s?s04Pys5fYTK~HK&_exd`ikGTz?@U`__=!eRLmK0=VYT` zlF=~9Ge#3I=VZ(|-YS@}w#OMkqcG^mnlBchr=<^<6Bq73r{)b$XeA@E@xI<(R$GrS+>%i zysU^xOPFn!CV>?!jzvr2&=*+6A}nMPTw2I%y&y|kkOh5KO!Qeinj4P>v;J%(C(D~v z#wnXDR1gu!!dho!oino5=|u|Ch>@mNP8C}4ZLIeuvCvJd`TEexC&Ho$S^W5-4o{Fc z5<_$G=zn;K2uA&f_jsu8UvZYZ;w*pLzJuiM@_~Ve2|UXWyw2~T*I9%^-{pxGh>gzW zm1gr!b7bhIij&SEQ+cp=c(SQjbV?XiInLV!(G_p@=j|q7(orHWqj|(}m~=Qj8lU=& zL4JKV?-_W`U3~veUh_+ybgS}~P!HsJ2lBf8dE)+}KKEbNfg?c7E8wI?L5~eE$dfI>bZPYNH zOvFE9k;E8u80eAcVubPtv@sY5jX)rS5XcaOGLXDQ2B4Gy_V=TEW2ym;>HeSYf?Rr& z|Euf1s-C1k(sSU8qq3^Y?<0^v~NoNarG8PH8bP&Y^_}Jx^$He z$<_?xzCqO2VO-6%Te`=wy4KoFt*DiiT~EIOD{F1#*J-zLH?H$MTfpXQH^As?=8m;? zw_5n}cY}7@gb$@V*}`3ILvMvowj-_5-S5ZN*ERczZUF2r!Xes2;0S(0L^}!&Pfzz2 zd$YYgdz-#n?S|X*-DF?iVHdQAx7+J?+9`n@@yx)x@yrg+#=X84cC^#(v&-(a^X|3d z9&n!Sb9TC7ZTAuX`a9bk`b#2x*|VQ3%GWXEm(woq;VrAT|Ejt-X4lt_?~8{H#5bco z1P&m>{8b@1=Wsa8$r<6)jB<(|@n6J@hGU$rF*vAyxznlqitQ_reuH-|7VX#M2P;_Y z^e)w2BFYuc!ZMMs67>qvt`+r4(QbjOMZ48mS}!YXciy&(bhoH?$soH#`@3lOY47vC zc+mOWFVZ8t*pJ=XIE zx5(Bzl3XTZUnW~$iF;n{>%x_!DZZIy_ro&#;gs-*P_REGR&T0YFJK$14Foi7-z z@z9&$Exv5rtbLQe!ADhTue#i(;@qavbWnjh`U-Lv>4<;cYo$e(Ms9Ifo zBkkgAN>sEisj8i$qFta)pRLl>!|H0Q-wjm3x~U=##7PI?q9KF*@0*6ImV;GK|Nfx% z6)Nl1siKa=Lr17zQFTYEYk{MD1$qoe9hb0$D&3B>^d;yf_BQy(Eh_n~&j zn%715s`eWq%G#4s`!&(M?y9e|zahdmMEZt^-VnhX7}%fTYvfh@<~7m$+0|bY$!qWx z5zI|8M|(CV75Ji`+3+R5XX_9BRk4Njb*k1N@`?1g3s2~K0><5mI~8~B zaegQ6+!%8|#{MWA3&+CId`2dG*^`)SFU_XEqWz+$GS~ik(Gz(I&SiVSlMCDP_Tx*Q z=uG=_7KS#9KGV~Fo^7`MJk=9_!5*H@Hq*|SmUc#GdN-@N-~IM4ncG3r?WAYzt|`vP z#I(y|=XJEo_Er?_!1h*iyY`J%*WQZS(qq@Q#5r#v*V`xU65kwccaOz8N8+8M;Un-7 zyfaS2!%oFe-1A{4Wgy-;%*h$-&8>erQI|Mv{`DZ=J$sYBPFgP~uV><&wMAc#oM&a{ ziu`OVs$~^t+3VHq|7cgYn#$hcDqBfKkymu`E8?6LL|!3fgj@V?<=e{)?MP&ccCtrX z95k{?E7HPWTw3Cx&HM$Xxy;iP54}zn3c1P~@*icVD{<1RWv|P9AN8*_k-ak9E^peu z;hw*0@9;LhUAEhXgJxNN*7u#&WTh$=m29c1wnBAVqBckSdlhd9wzo)~{!Rt_M&15OP5%nx zTL?c-@~A5M7#X9ojw7Q~*N0Wx(Fx~afbXij|780ozWNVU_iYvWEmim})%h=MZ>rY* zeQE99A{<}^{Z;$EYG!|WUy=7tG8;#kNoLWf<1WwRw$qY4B+?#OL^shs1iOf~r&T;C z!mgt3qONxqbvKdTPr8WqUeP`vs(ZEX7u7u?y;oFsi?$P<&=KB^H*{pXC*k0v-zloQ zMco1axEo8li`*&7yOQ2ZJERA_H=nNB50Ng~J;;OXJ?NcbXZiyq+V`^EZ@vsW!jAaQ zU9Nn0!n^c$qIJNmGD`;@ck{TzPe&3S9Z3g2cauADt&XXEdm0x$op7}9xd%_{l-qYd zp4LfUU}ycEjk}+8rgurUTdd-?qz68LsrG&&C#3mXYXhJ z0c2p3+ugl8+|j$>?VkIcNru6}Y!8zW+M`7}LVGNH*owxI(PR`EZv~^>qo>`Q$H+v{ zJwcup`LiN?Mtcg09S|}j>D}z{Xm^M4w$lT4$JSy;bx%8Nj>un1G7wYiMTXdoJ?+e) zq>nQlm2YXkC*pVP6aNaOvl+Z{gq=Uao7p2|q_?$E{!5oJPRB@ZZ`mpN0)By8 z#tHgL`)g4zhTq_vKaj3z{Dp5d+X#dM-K!i`S( zR?%+}^-gSf3)wCD?I|0)AtSsgJB0i-mwUeJjrQ-d$vm9%9rB*+@&VrYzHAeGbDm7( zUkcTZ3{{d8PgyH6*B433B>wrO47Vs{yHmWWSJAHMyJsa5{Ie4NS;Jd=%_J+l$*+(- zSHU$h=`XVD2C^0x-AFde#PL;Ni%h%?AN4Pe;+~CV>q~t9Y$9V{O`6E)*UI9N(VLPh zQ>H)0c0~5iC;K0h`J*}<$4v|QqUhhMqc_JzTjHS2wcEm$sge{|P5hg7zIL?pg`+(# z+8QUl-FMJ-s!vp<+wjsm@X!v4n^uLvOKV_tRaLGUq?U?SQ$;&7Rk)~j58$B>`dfWh z@*sZN-B+2ODq^=(Aum)h8__RTNiR}4FT?nnBRQ{+0p9m z<5nC=ue6G8STk9z>^}L zN+ybEvK36h8=lpk3MYwVvM45rd>WbJ>XWhSsqk45O%=r?vrnf_aph^EnJSX0sXabn z*r$_8t{OPSm7jwX{XDNdkxVz+WH^o26z!>gPfoU}Y?Eoz_(W?moNCMzb4-U}nL(Rs z5sBM zn#Rnq>RH;)S@A6G8SchR_=39=cVV{YH&y!uIGxP&OlP=@Gu*{#?&|Yon!7yHKA7UJ z$D6_wPh(nobLgu*(2Dxd`&vy;?Y^Wt>1W<9R@{qEJk_vuf!(aIGrZ3V?j@bHJBd8r zVD5o;T2V(U?BKcF4)5@cZnc8;`fe8ajqEqVcA{_NdA1gDOL`ltXl@0qMDAZe$2*7H zy+d)!VToJDF2B}luC|&hMIGGoa;vypq?d~NGT7J(E`d#8W07BEA2twqBT?6d^#ruwy|qRLX-1mLBG=)c*U2u|=(|?7xmNbMT=uyZ|GX6Uyh8g@-$4CK z_4s9c1KsBv=N|u6((kg|E?I6D+=*XCd#kLt-JAJVnQ%R>xsj}sB{%r)xk}bt?XO9z zWYSgM;+M;;D`eJXGVW4u`#<5IOMUlToU(5PS-1jDS{{}m@pYgSDTj*|^_QyBGI!DR zHQ{sLL%+Z`Kb7gfko_0P{GaAlfR9v%1-^?0&S#qkKTcmN4%7ExatGDD1FFbgEbjnz zw=40`zx&D&JoN9rlfJGJy@`KDMS4SpdKC|SB~`0m)ZXDqqP+kQi1w%0-sjr$vAmD4zj^q= zhpO%eSVm(aW9TFGjf4*;c}RpkNKaRO5O3}2%3ZV{a>ecm`x`q%J8&SMzHk7a zKDgTe?T3=Bt64MY!`3rN7k$y+MPE0)F{T?X)lFpGajo#{Zgh8j-9*t7_v*^OC!Zea z=Yce95B6SZmizd1P5s^3dXpa5XK#JI&DYPkK5YHi`mhav{pka6yi7W~&-aop?(4m5 z4_M)S+V@-e{iz*{ekgk|{J~;-ME}G5N9hlV_Gq@za2$OMpE0icC>bNV32fu6;c@sl zd}%bx7!N%!)^dun%wz3q-3o^T(#rLUdQ%RV1ykB2@$ zyN{jI4-T@k`rBaxos&U!-C+6;z9$G&Yv@mBRutC>&Uw~`M< zJfCg8=!0)Auzx3*I@M zOmzxp`5XH*C-Q~FKjYix>h$(FC!N?eRf%v2B-k+lkYlP>PB zJw@TkGFdU1t&IP@(MjIAgM*$d{-oQe03c33|I^Q zJd2zu>z<2yo-5;?2hYbxYvZAHW#kKG={lql9$HTZk1q!eaL|kV|7W_09@+j9nf_uN z^a}q)*5%|6D#FzX3#brBRE0w7TvUsKsz(ksS6C$}sB#olMT%(`S096)o}}WG!0b*| zH%r5)K3O%o2^VdxTD4cLZp2Y<^_}zGx}hKu%K>n8dh+Py^G z%L)Q}lb%-4&#HP^ML*KZD*9MOZ_+PeYt_A#irx;kP1skh?Qa!>MBU#ihQfhXG)VLV z@zlX0A7ll?65fS9+|8#G{T}W6F^qe(AH*)A-7Vp0d|5ZK zy5d-)$MYB`qR0Fm1IPM3*3Sfequ~?AjOP6)`xstX|6|(Y(k#(8mW(vhI9%%lj-hAm zC#^rmJ>!buGm$>tm7XNyMfMcG38H&Kw9n|9Ao_`XAG5-zt#pD_Katvj{rL|}@}y_> zq`oKJrC|9_lgHiJCp^Qa+{p><*fa1kclinUxc8fQE0_QuBTtb>-Tf!*r^nLU#Qh1M zvhT)ta!-0vV?D+3p4=GwGx+5wPkVfNBe`8)2dioC?%Zaco89-|nC%jdrjH>b6UU6V zoHitT^BIYi4J8lTX~XTjVI=tG5c*JOZkU}n*lrzyclO6I2idXx64$&MUPUgkvMcP9 zCaJ%x6VW&A_IPW%$ZCUcHn7(krN1(CPA8_WRh>^Ru&VQ{`g|)6{&|iSo^6G-?A`3` z@D9B5E+;W~=N;*k2Jft5zgM)H(-QZ*5$9~@WZ&r2w{+rzgSJZC^Avh9S)jCY6CS}YT-rj5Cpr_-d)nG+gwJJVZft>F9 zXnC2pye|Odv`@iBPtlGnT{30q|H$Is(ElT=f9)?@pW~Td$nO8fMZeG&S^o>RPksMf zfR}#m3&lrlpXGAVkKv~($A^iN?pG5J>feXmMP>P2wTVjeyL!1xJGkgB)h4*;cI_=H z&}QvTYVAh6bc4Ufty9g`u}4)~!?s#oUan@ZQrVWNd@I!JAL&2oU#trLNMEE~C0C?{IM1Xce@ zkw0z)Pl@;mkv=ZU32=h?`k3gSNcbxK4VC^i_?quzFOgUD&&CX1#tdGBFTmOCQ?mR{?n4jU8Qf3**I*4^B+aM!`Xb7@{On;8ta&*5C>VWXakhwJ3=TIE z1`izlU+k&B4|#|LQ}3m}m%9;cy|??{+wIdNFNgIp6*^>cdm~+*&Furd;GxEZ%a4+V^Aas1bJ97&~ty8Eq$ywex~wj`OxO20l&# z$2)K1?cB%h)bV!o<2dJ&Z~}bBx6TQ6_(b?L{u%ltry}0crr@5>Iu&t3p2bI>OWgD8 zgwHui&pBDoJ6X?r^PB0^&BQ}zC;qwIUj9jYwbQqX{6b&jgsz6`tYV$jY_yV1=~VyO z>HfR7&bP?l@zJ+sfOtE7PgeLR9vU3<1MPTgou9bpLFaM56&!>6M4T7*JPd<-9&>i{ zrmVCuWu?M0Rw0?IFbVEiG-a^wWVRo0(8am3M0Wd;ES33|;-M>K!k_#_Xq61P60Vdn z*W#vYyuq)PK{t4tUyGA&lxa6>Z;)ko%D#cW%EsI9(%mxhF7mr9y<67a3-`+8`(*3` z3G4gP&`8#AB*R}U^GBw?R7Gg48eHbkSE@FD^jEj5eHXn>Rr(XW9uI9wZoosYPZjD^RjHgxRgtZts&zW4tS(nltEg4@rNe# z#wzTks%sM!_cHB^Rp2YgCEC}pT|ur^k)wSz+n?aI906m8*Bcoo>e#I$;rEyBBtZ_h1tD z!A=-R7wvnokigEENf%?fCVh}A4bdKgR}6Obp{@|N5w0-6RfoYrW*?f1gV_d=!Dbl3 zKE%&(5e|k!lRnUxLG%HsFZ@D=(gw2+HFJ!KQA2oU`fxpAA4UQnPB;kfiuM4u!P)~! z;2<2VU#{K{CmX2058f93eet!yY&~(f0k~iI^~Dnhz@AAD7CxT;NUM0veIE_SSp697 zkYMoR+=)z&c2^v+8*Z547G9W=yF8Dtj?w0j0S5AijA z06lE|?Xv!C1MIr^ir?QE>gzo9A-(O+Ud~@H=dHWl8yvH1(l556OW7L3c-v}Z$JW=^ z$Ojby0Cq(RC~d+^R9IOra4*Lz81w&0+9 zWx1Ux)1Bk(`%K*QY#H!OauzOH11~)zWz3B-<_6hwtt`4ud!3BB%D2(gIOs|l_h)~Z zS|$4~mvvXj#y@E<^@U&w`SHKmy12|8ytJsV2gMRD!bKO!@L%Dl-{GMP$+s!{=a=#G zu^(5{^7@u~RFycc&K*tinXee1swDqXJwAa8$VYhShpNha6=sohs7S#7p19 zN#9nz-tkQ|@GW0h-oZ(lM;T2 zpS;cf0p|F&zW22Mp}M~d{|3YMSNK*gzM;bZ6(4%VxW8Zmuh3tIuaTF@tNLET5?;a{ zUUH3DSi>CSXVPEPKZ8Dt&kXu=B=o6R#teLGs{Sc(8vSY9YbqA<6t*&%-?Q4!U@Vig zpVpqJf1-Jw(EpU*k6|!RvOi9Loc08L0-p)SjAt9Koyjae_u#JOHussSN!=om^F?iK@G8zw?0LLbMINNak!}t$j8xDsV7wkIb3RXQ# z#3RfzRK&x`U^0RXN%o1!KGdp*S;;UsDEUp~^DN)!e^z@6oPu*t(LdGP)AdbZpUFOn z{sIhp=+nhK)BMx<#~1DyqJ9xR59jEg1!s%(C4O_r%k;T?U$*Ag$twxRdCH-W^OVQf z1&^lo-{4>9fnocH{x_}e9T+?1pYF&%tn8mw{=SvG$2QM1oTvR^!l&)ZXXww^sT0|r zh4Dr;*)E<=CZ;#7f3bgI&wOQn#18+D=)WZ2TFqBh_l?LG<>Gf%ANn^|ur%3Ub*kp1 zlk~Ibmy+dH^AlX@#I4l+MYOA|Xl=r`oYpv{@8F+*OQ&|D_BN~7NVcaF9(tVicj@ze z7o8^qEWknMWx_SNTy%ZnqNmELmA%ndNVrKh4cUTw zZt+&X*_-|@?QL+kuL0ZP?>OmB**Li8ZrpS~J>#M0$?kRN7s&b-`r^<))(;-q5ch1r z)vC4c|E?&-du}b_0 zK7U}p5?-l#U(I%n>U}L+;Pt6}zX2U|#Qk@SSUFr{AF-C-YB z?CI*g&D={gJ?Op78hTGx>67q;-i_W(Uk|?Bu$o?cx?(>j``E ziQeA4duu&}L-l6si$C>X>zigC=y%LMNdEw1`logez1`_u@vz?7o$<05`v9KSo&F$R z7ExqudyxKqWPoQd5Dv7;z+mbF*@CGLwBr8mOlIo@?`Dgy(DxX7hxR>e?X|<+!8Pun z2m8Mh-Ud4uf2+RR#Bqypw^>tQygA%rT)bsuU%mTzg8e+fUY=}U_I{pnd@b)!?+N?b z84r2-z3hq}c1KUFs|Qt*5IU)!k0(Oz%#=KiMvam+FrR@e|WOuPCXySf9pGwt&8tuS_dZF*fRKbIb-;~c9wC*jSw<}FT7 z@XU7U4X=9Qnr)r3b~t7mC$F`W7;l0t{Keu1C$gmz8>g}bY?e-GIV&q?W#!n*SXEi8 z4LpghtP@{UyNvS_Z>6PjvqEv%pon%6D=H#u6mkahTUCDNE}zxpx3awS0wNFIc}!M1 zhHoC0d5+_jhZ6TZUxqqc=Bncj`plHIe#0&IrMK-fWVy4vea9PkaM0?q;2E%r@1@mY zH4@pevTRuuPdzQQH{zV@$uBbPIvI5hT!o9S!97>W!mDKD75)al+~4GXmZ5`({)~Gr z_E)W+an2v$PqO-A?WHpO586K_%%8IU_lc9{(ayn5kEv@>6^^QNd2!T3sah;lRTlYc z+Lx-z*DA=D_-EJ_rmq{nt1x?1oZV{XZj5iIDzi)F*$#KAMq6`nlX|<2zE-W>qJphf z%{IYRD%*P1Y?V6w3+A^{J9z3(`hS5xs(`E5m#TpnuFhpKU(g>T?I;q$uon{0t^z(2FS zqVF~MGILnf+H=TEJS!Oc3v92XYdm9>Q`w$jd)DeF^Pgz7;TICNseGRyQ~6FL zlak*n@O5*%N?uRxsc^EpI>jB1c7}h}_gB&XHR1CK|6#R%)Bm=}-yv^{`yIBw!}npd zKQ!iDtC_F=J*$himJh5V@FP)vr0+v3`Xu$uva9B3$J^0M&ctlHDt6r*I0vVkoB9`8 z#TWWR|2Em?+P$wicdy#9Z}@)sx*hvk+SOlc$L@}uo$dbY1T3|JpG3UG3YNnkV0Kd8 z_D1(MTb!ymQE`&yC0_Z9Xya{gt<|ixf(>Ln+a~%(dw#RMzm2{{wA;0}TfsIGr+TMo zcZ+(r_HK~|-`p+QJ#4>;b|2e5`ayWeY66c~-9eE@hB+p}quTjoqT|{*vQd6~G9P}K zUj{3{o}UzvxeCczMN{Tlg?lciuawzV>suw${lfN(Y`2ze9a%36Zh#wP#!a%}CRuW` zZ>3vh$<1s#WYDd?k?xQ|x5==(=-c71-tKpKyWcJ2{wf3SA-iSc11T%lklkyr)so%M zWUGmHo|)RmW%7eKY94j#h%XFzeStg%^U;qdJeTbPRiienqngywcL6S1hXhBhr^?i4 zuj|W40}^^eUqZsxP~~cv`pc`a#q^g~jY`2Xu&jDoTD3Yg`TYSmy*Tw(WIIj!RCT+m zN_MK6T~)h^idPv{Q_HKRzN=N%YxP~B+BQ{bucH4^`x=$^S}V8~hy9ZkU8_Q02b-$W z*CktR6}C3}`6_HZKD85GZ)HtI)hyW>C2X#SHno}?U^9`nAkD3&ncCUXDw>P5rM?#0 zH?XxSR} ze#cMiTx^pte&1wNyM%3FOCxV)Ye}Nj!uT7pxt0mr!*=Gljl{TH;4LuxqJ67qZ`8gm zjc*PklIDDy<5D-kSZz!4C%!S}kL=C)Tu;9)_210rCjIT%+PRyV{hBo9X8t$3yEnUw zH|x7a`$o2#?5nu5H+d2_xzjhXXL5!9%hH%OSX1=3<=f8FyUCMj;|WJQd|KPPH}Yu( zTf;VKM_dGBhcsrZC*r_5BCgNg2wuRyp-5}GaqFs|zva;&Q9;fCq`sMmAftTTwmyjk- z+U4XTa;ejG3296&^%smrPHbaukBzk(CM*rhkdjtYGM(7E-aIcPb)4i2o%jp1>p9&Q zIO!MQr00|Kys4f`YRdv=lk;VYGi8zUWQ{Xqkh8tv){<$?lvQfNvt*l^q?YfWRbh46 zsjAFWon8h1tOie)!K%w-74Xa|`c8$FaMIK9(Te&`h2>?v3Nl~?*|0n;>utO|DI;T+ z_10b*mVqbBo~7U^{<2g;MlGFiqwky>Q}!(=^Olm0i@;(yYEkyc+=XT7f--hN8N8sZ zT}T$sfdyb*e))0Od@x_qSF){CF_x0K~}?`;m@kbPpZo@68evDsjBm%_7at7 ziT{4|2eLS~z1UZf?^UPoeJS}?wfasK`&Lz3L|>%JeMA37)%)6C_P)SX7pZn%CVh+Q zwSg`A)~kSxvp3xuh|G?;ZRu=k)B7WahKXAnlMEZWhe_;#%GWO$K`~-_wK>rlG z{n*a}_=!0`fgh!x_gLqd?S0xj@}Ai~FyfzNp4K~TVR?`K{(o^E{X_ll`-$Hl`2DUi zG0(e6e-DN=^ze@U_i|@>SNjv~!1=E50sJ6cF=mP@$Luj%$a^CAN1E#+d?;)m@n4W^ zfnj?)t@vZi?-QQkzreVU&7IwWcm6-^xC?PdKGnZ~d@jmQjs4tApW|Vlir@>Je}TEa zH20_azv2HctN7Zr|INP8xc|Wa(Blby$7i8yF4F!=dy&3x`G1%2eHcFT?2r@qk#^W) zw}k%!JLm(p1$NoIw8NJ1U6%AuoRN?1v`^{t?Yz&lL;uW}1@uqt)@*047Trp=HCC`% z|1SwYx64ESH=g)!eP7!B|7Kh0R4ml~$_dG23q4ND7Cu`<6}Z)24%}uBZ@1!YqTHcx z2frOw@GJXH`YwLE^#%UUmPvM+f472tR`omCqrG3`d!7D+&ewi;z$!uxTh)GN@F+Ye z(xYrgMS8@l^2kKTQdU_byR0LTb=Jv7k%iWh_1clGHn4AyxdJ!A^|IFHq!*R>3a}NI z4GYO|rDV#&`bx>3h1p8umPOf0!IH9VN%qp@B<+()X>v*~mQC#gvTWG)%es5C_rU|Q z@d0=c9+Ig85Bn-`NX9-)KO%!icF&{|E?P-NsH6&1&TUs#F{-9^PQtKA1z{o8rf4n}QfZ3O3+X$F6j70itEDBii>p?pQ~$ZD-WhCx=Oj4^o|5{{ zg|$<=tV&i^y8?R|Rj(pF@N`mvlvgb)=_`jPROWZ83Rx-n)uq?tSC?KtwZmRbg{@?c zYW%C|tIDT_YFu5Ft-)3!>Ged`K(rT#{37iOv>RJNJ<^b^p}Kk@dm|CoPqy>;pGB{o zu%X!+^J$zuEBA>Z@yp!%>by&kNW?2XwjN%jV* z|01)8Wc`h`>R}d*%+P>egVb}0t2Xv?5&K1c8tc8t=!;-u*u?K9$=--|F|UU7=#O#H z8)KTVM=NFz?@My~E=j(P*kkS{sXu19)adZZ{2JguF++V^sfnI?I8^x8XK%>60sne1 z#>CxdNUsB96?NI;&eX%HE->STF#77i`tUp$ckCQk7lt1F=No$-jQP$^^ES3eE+ui7 zFXbOk;$m_UTa%=pOFxHxP8!n~#*>b|hW2Yb&Bk^?Jmrh%7m|iak6jbHqlSp8>#HG> z>hx;#n))ik8vLt}s`{!Lce*I5>Z>Tis_dtVx-yB~dm39MSb=^Tzf+AVC(_gDCnr1~ z#)*iN@INeTC2?xXiuh#FmV>3NpbYy-@FcdA?AcOQP#PAa$4M-zUBU`Vh_WawmZUmP z8TM*UcMZ1cPIFZ!xdyC4s^OS%`YWX@P)Kxn*$cuPw!9?2)kTKM2Xn0CxJ;DeydH(e zWv1iavX9D2c|;vt^C&rjGai$zj>vk4^&gV?4$5eUWWq!A{qO*vgEHklcpzoQu$_#P zmhyM|QnFzw+_V(ExC~heH!ZGRLUt{tFEVgpekF0zg6t*f`DNN-`txfS)h-}g7p52F zlOrPshAkgX8`=A~`V-kcFaI2U`DOOw>QheY%kWszH>e;n$3_)q3;&I{=SCG}J$<7J zvz}~Ffnv^IRHm@~LSL^6t%d8z8urjv;iSK)Qma+7khLn?YE^Kx$`*YqwAZBePF3qS zwq2@N^zTf4D@475?Pt|=CEGF)uF(ED*|(~U+sT$(*=Fpf#y9k(BwU%RuVh=rXN9UB?VnZl zmD)cg`{IPr_cMLDzOV-_gFj&gOU?I_{vX+XhD(!u5$iJgx5;x^uHO%=OZoi3=LbDY z$zmgaWLuJE`i?#H@LbHcM9*UF@DEG0qxXAUp?4EUeVt2)Ei5(ZV*kNG{j9nV`%`n=V zMY}E8R-~Q1$(47czQE=BmZx1Gwyh%jHDR2L<@$f2NB>%M_~goTa(40Eon#eU z=Tt3+8`25fL*K)9k8yj+9?|Zn@6#XlIN{NEK&07;4&1=LDfgsrhkpc^I}+Rp7u1^srUX4y>5k)nQdqgI`rwt3kq6 zU1YVAtqKgE(^dRR$(~{5q}O1pp*P0V5KTx;zSaCx7e$RE)nNG5NVb{@E19>tkuiTY zSQUm=Emse$o;<4aubEoaFpHWz;yT&rYN;pYubDeXtu#mI5kd9TAAQy7HIh^}HuJBg zHzKZ;ED?EiSBNO9;yU471^ahdL{-5@V-4HwFlr*l2omAbpDoH=Z__8G1UDaT=)5`EKW9E}xx3pPfhsF*rZCqgN z&QeK_9b1X55ER^tcr{}bEVu~k>lNMu6(_h{k zrzR|_ot?lqb#a2@RK|%dmoPspVm0~MqCZE}kqJUCAhH55zsT}gQRspBMG;vcZ_=YL zGDS&PTGly9`=pe8^3ac`43%Z2W3tpS{PL(wcTAQ#s_&>QcO=;(YZcZmMGB?t7y4m7 z2V}>ieD)i6ge@}Vk(6O$e8Hq2fCr7+r~hDXradSt?=kj3%D~}Q&>T59X#p5nIWls7 zWAdfUeL!Z9?0rynk4(N-_K*HO^ga51H+B!(F8<-WQ+vPmPW}6}cd+eOC3eESFsesX zlHXL7U&-$OwvT8Z;deyeQR5E5Bk(Z4gE0K}C4Cotr>pGH|EsFDmCtVa_GCN6zK89g znD)Va$#*Ni&^PPb0k^28JJ>dp9Y$|f4Y%{m@YhsDcktOHimhZD*~l+^*K2Qwo5(h^ zZiZXa*zgT~7kl*Yn zt;rUB8)$*+;ilBLIgQ`UV}0`5V&0ILVFKfqjHW?qYoUnx@ zeqxTTe%ATf4%fpi>@hNa$BY|UH>Ekk`^2~y8`iL$7!kAoUt4ySxI%WV=#O@c+~G>= zjr^5uJ&8NLi7oC%+=-ZZ2aLJ5Yj4*6HCflgSks2oA5m|`k>crWOBi=B#%@Y?Ddvs& z;z@;lSFZgx_J}2ROZbMwyn*3!;>rG={9l$9!mD#lK){d9ujF_oXo@g z1CJ*EUuA&bjEk%hef!uW8|>BIEnDp4`+LeNhg~tU&QadS*&=fsiN35IBTLguBx~S_o)~pf@+>K?xKdo>q=cuy7@5rzaYTHfm4s#f4~G3jZ#LhF zc~9n_#Z``fab9I}JtMMH^u{{Mv6av+t6jp(r|^t;;ts|2WA!Ii6YYqsxbfvlJj-%0 z<_UXTE$)1F2jgDF46*XC$6bj#9P?#*-0dXP|JJFdCU@0dUInCF1svBpC@_oewmk2%8sC|k^Nl-CjS2S#-}#&#$d4<~XTx%Q`P9@N^Ku9fNglRd5*ezB&QHRgy&_N(j>`F?tKwOCoKX`i1M zyPsb+M;7fK{&9tfcb~{&^qzFZU=9)A-lSz?V~#AsgD|d>^c!;_(T*Z z=8D*}yO>3j%^9|cI9C38$H>*j}Z}3{EoYk%^jBP&csuR(OJ}C zJ(#W?QD(OI9Zxf&h-=0g0z=Q9a?F{vV+C=SVsy+D*T|lJcF!Y@*g1h=Kb*YcX~y1- zd5^FLmx@{9Z7t>qzu2+yJhB}gck@`%Vn=5?KX_NH?>IfK7X1-t?DODgF++9=j-(jk z)WuJnz?eC&(;U}|Y!J~zf5a2>#~C~#qBxTgbBu|*lH-&`bdhml<=M&1=FjWohF4(3 z7Gq;Q@jGHX&O1(2WSQ)AN6g1^=ZIJ%TZDuy)~%WJqbb&iEizo>tH@B9U-U&gj~o~G zBCnhqYsn+WWm2%i_^4kk*$WHI2&87Awh5&#o2gi7|Q8PXX5p zt)Te=L(j(}e50Dg=-{jocktp9KEZNh?wF-O@{e)()A+b@#PUC%(6j$5m?DWv6*VdD zUaTqN3-1##MJr~Ddza7esCMBMkwqNwe{rpdDn@2iGp-xeGww=^i~AK?!Q^=?Rnb^a zcI_p3y+i8%|i$6koFW$QgLXLgq&=BWEo@uS|ydqs@Mo1%@81=7{ydNFr)N3*MC zyC91#vqUTrLwLpS%p;%^(fo?-L_6F6>Fv6@WJRugwJi!)-)u9J3mQ9s`0;QZ+dn8 cY$3JVUfudChB&n0(zfL_@xMI!|C{aq0XbYVK>z>% diff --git a/src/adafruit_circuitplayground/test/test_express.py b/src/adafruit_circuitplayground/test/test_express.py deleted file mode 100644 index 0732d9641..000000000 --- a/src/adafruit_circuitplayground/test/test_express.py +++ /dev/null @@ -1,115 +0,0 @@ -import pytest -from unittest import mock - -import playsound -from ..express import Express -from ..pixel import Pixel -from .. import constants as CONSTANTS - - -class TestExpress(object): - def setup_method(self): - self.cpx = Express() - self.__state = {} - self.__state[CONSTANTS.EXPRESS_STATE.BRIGHTNESS] = 1.0 - self.__state[CONSTANTS.EXPRESS_STATE.BUTTON_A] = False - self.__state[CONSTANTS.EXPRESS_STATE.BUTTON_B] = False - self.__state[CONSTANTS.EXPRESS_STATE.PIXELS] = [(255, 0, 0)] * 10 - self.__state[CONSTANTS.EXPRESS_STATE.RED_LED] = False - self.__state[CONSTANTS.EXPRESS_STATE.SWITCH] = False - self.pixels = Pixel(self.__state) - self.__speaker_enabled = False - - def test_acceleration(self): - mock_motion_x = 10 - mock_motion_y = -10 - mock_motion_z = -20 - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.MOTION_X] = mock_motion_x - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.MOTION_Y] = mock_motion_y - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.MOTION_Z] = mock_motion_z - accel = self.cpx.acceleration - assert accel[0] == 10 - assert accel[1] == -10 - assert accel[2] == -20 - - def test_button_a(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.BUTTON_A] = True - assert self.cpx.button_a - - def test_button_b(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.BUTTON_B] = True - assert self.cpx.button_b - - def test_taps(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.DETECT_TAPS] = 2 - assert 2 == self.cpx.detect_taps - - @pytest.mark.parametrize("taps, expected", [(1, 1), (2, 2), (3, 1)]) - def test_taps_setter(self, taps, expected): - self.cpx.detect_taps = taps - assert expected == self.cpx.detect_taps - - def test_red_led(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.RED_LED] = True - assert self.cpx.red_led - - def test_red_led_int(self): - self.cpx.red_led = 3 - assert self.cpx.red_led - - def test_red_led_string(self): - self.cpx.red_led = "foo" - assert self.cpx.red_led - - def test_switch(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.SWITCH] = True - assert self.cpx.switch - - def test_temperature(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TEMPERATURE] = 31 - assert 31 == self.cpx.temperature - - def test_light(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.LIGHT] = 255 - assert 255 == self.cpx.light - - def test_shake(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.SHAKE] = True - assert self.cpx.shake() - - def test_touch_A1(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][0] = True - assert self.cpx.touch_A1 - - def test_touch_A2(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][1] = True - assert self.cpx.touch_A2 - - def test_touch_A3(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][2] = True - assert self.cpx.touch_A3 - - def test_touch_A4(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][3] = True - assert self.cpx.touch_A4 - - def test_touch_A5(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][4] = True - assert self.cpx.touch_A5 - - def test_touch_A6(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][5] = True - assert self.cpx.touch_A6 - - def test_touch_A7(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][6] = True - assert self.cpx.touch_A7 - - def test_play_file_mp4_wrong_type(self): - with pytest.raises(TypeError): - self.cpx.play_file("sample.mp4") - - def test_play_file_mp4(self): - playsound.playsound = mock.Mock() - self.cpx.play_file("sample.wav") - playsound.playsound.assert_called_once() diff --git a/src/adafruit_circuitplayground/test/test_pixel.py b/src/adafruit_circuitplayground/test/test_pixel.py deleted file mode 100644 index e1179939b..000000000 --- a/src/adafruit_circuitplayground/test/test_pixel.py +++ /dev/null @@ -1,117 +0,0 @@ -import pytest - -from ..pixel import Pixel -from .. import constants as CONSTANTS - - -class TestPixel(object): - def setup_method(self): - state = {} - state[CONSTANTS.EXPRESS_STATE.BRIGHTNESS] = 1.0 - state[CONSTANTS.EXPRESS_STATE.BUTTON_A] = False - state[CONSTANTS.EXPRESS_STATE.BUTTON_B] = False - state[CONSTANTS.EXPRESS_STATE.PIXELS] = [(255, 0, 0), (0, 255, 0), (0, 0, 255)] - state[CONSTANTS.EXPRESS_STATE.RED_LED] = False - state[CONSTANTS.EXPRESS_STATE.SWITCH] = False - self.pixel = Pixel(state) - - def test_get_item_out_of_bounds(self): - with pytest.raises(IndexError): - p = self.pixel[3] - - def test_get_item(self): - assert (0, 0, 255) == self.pixel[2] - - def test_get_item_splice(self): - assert [(255, 0, 0), (0, 255, 0)] == self.pixel[0:2] - - def test_set_item(self): - self.pixel[1] = (50, 50, 50) - assert (50, 50, 50) == self.pixel[1] - - def test_set_item_splice(self): - self.pixel[0:1] = [(100, 100, 100), (0, 0, 100)] - assert (100, 100, 100) == self.pixel[0] - assert (0, 0, 100) == self.pixel[1] - - def test_set_item_out_of_bounds(self): - with pytest.raises(IndexError): - self.pixel[3] = (0, 0, 0) - - def test_set_item_invalid(self): - with pytest.raises(ValueError): - self.pixel[0] = "hello" - - def test_len(self): - assert 3 == len(self.pixel) - - @pytest.mark.parametrize("index, expected", [(0, True), (3, False)]) - def test_valid_index(self, index, expected): - assert self.pixel._Pixel__valid_index(index) == expected - - def test_fill(self): - self.pixel.fill((123, 123, 123)) - assert all( - p == (123, 123, 123) - for p in self.pixel._Pixel__state[CONSTANTS.EXPRESS_STATE.PIXELS] - ) - - @pytest.mark.parametrize( - "val, expected", - [([3, 4, 5], (3, 4, 5)), (432, (0, 1, 176)), ((1, 2, 3), (1, 2, 3))], - ) - def test_extract_pixel_values_not_slice(self, val, expected): - assert expected == self.pixel._Pixel__extract_pixel_value(val) - - @pytest.mark.parametrize( - "val, expected", - [ - ([[3, 4, 5], [6, 7, 8]], [(3, 4, 5), (6, 7, 8)]), - ([444555, 666777], [(6, 200, 139), (10, 44, 153)]), - ([(10, 10, 10), (20, 20, 20)], [(10, 10, 10), (20, 20, 20)]), - ], - ) - def test_extract_pixel_values_slice(self, val, expected): - assert expected == self.pixel._Pixel__extract_pixel_value(val, is_slice=True) - - @pytest.mark.parametrize("val", [[1, 2, 3, 4], [1, 2], 0.3]) - def test_extract_pixel_values_fail(self, val): - with pytest.raises(ValueError): - self.pixel._Pixel__extract_pixel_value(val) - - def test_hex_to_rgb_fail(self): - with pytest.raises(ValueError): - self.pixel._Pixel__hex_to_rgb("x") - - @pytest.mark.parametrize( - "hex, expected", - [ - ("0xffffff", (255, 255, 255)), - ("0x0", (0, 0, 0)), - ("0xff0000", (255, 0, 0)), - ("0xabcdef", (171, 205, 239)), - ], - ) - def test_hex_to_rgb(self, hex, expected): - assert expected == self.pixel._Pixel__hex_to_rgb(hex) - - @pytest.mark.parametrize( - "pixValue, expected", - [(0, True), (200, True), (255, True), (-1, False), (256, False), ("1", False)], - ) - def test_valid_rgb_value(self, pixValue, expected): - assert expected == self.pixel._Pixel__valid_rgb_value(pixValue) - - def test_get_brightness(self): - self.pixel._Pixel__state[CONSTANTS.EXPRESS_STATE.BRIGHTNESS] = 0.4 - assert 0.4 == pytest.approx(self.pixel.brightness) - - @pytest.mark.parametrize("brightness", [-0.1, 1.1]) - def test_set_brightness_fail(self, brightness): - with pytest.raises(ValueError): - self.pixel.brightness = brightness - - @pytest.mark.parametrize("brightness", [0, 1, 0.4, 0.333]) - def test_set_brightness(self, brightness): - self.pixel.brightness = brightness - assert self.pixel._Pixel__valid_brightness(brightness) diff --git a/src/base_circuitpython/__init__.py b/src/base_circuitpython/__init__.py deleted file mode 100644 index 398a3936b..000000000 --- a/src/base_circuitpython/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -import pathlib -import os -import sys - -abs_path = pathlib.Path(__file__).parent.absolute() -clue_path = os.path.join(abs_path, "../clue") -sys.path.insert(0, os.path.join(abs_path)) -sys.path.insert(0, os.path.join(clue_path)) diff --git a/src/base_circuitpython/base_cp_constants.py b/src/base_circuitpython/base_cp_constants.py deleted file mode 100644 index bd93e5576..000000000 --- a/src/base_circuitpython/base_cp_constants.py +++ /dev/null @@ -1,82 +0,0 @@ -class CLUE_STATE: - BUTTON_A = "button_a" - BUTTON_B = "button_b" - PRESSED_BUTTONS = "pressed_buttons" - SEA_LEVEL_PRESSURE = "sea_level_pressure" - TEMPERATURE = "temperature" - PROXIMITY = "proximity" - GESTURE = "gesture" - HUMIDITY = "humidity" - PRESSURE = "pressure" - PIXEL = "pixel" - # Accelerometer - MOTION_X = "motion_x" - MOTION_Y = "motion_y" - MOTION_Z = "motion_z" - # Light/color sensor - LIGHT_R = "light_r" - LIGHT_G = "light_g" - LIGHT_B = "light_b" - LIGHT_C = "light_c" - # Magnetometer - MAGNET_X = "magnet_x" - MAGNET_Y = "magnet_y" - MAGNET_Z = "magnet_z" - # Gyroscope - GYRO_X = "gyro_x" - GYRO_Y = "gyro_y" - GYRO_Z = "gyro_z" - # LEDs - RED_LED = "red_led" - WHITE_LEDS = "white_leds" - - -CPX = "CPX" -CLUE = "CLUE" -PIXELS = "pixels" -SHAKE = "shake" - -CLUE_PIN = "D18" - -CLUE = "CLUE" -BASE_64 = "display_base64" -IMG_DIR_NAME = "img" -SCREEN_HEIGHT_WIDTH = 240 - -EXPECTED_INPUT_BUTTONS = set([CLUE_STATE.BUTTON_A, CLUE_STATE.BUTTON_B]) - -ALL_EXPECTED_INPUT_EVENTS = set( - [ - CLUE_STATE.TEMPERATURE, - CLUE_STATE.LIGHT_R, - CLUE_STATE.LIGHT_G, - CLUE_STATE.LIGHT_B, - CLUE_STATE.LIGHT_C, - CLUE_STATE.MOTION_X, - CLUE_STATE.MOTION_Y, - CLUE_STATE.MOTION_Z, - CLUE_STATE.HUMIDITY, - CLUE_STATE.PRESSURE, - CLUE_STATE.PROXIMITY, - CLUE_STATE.GESTURE, - CLUE_STATE.GYRO_X, - CLUE_STATE.GYRO_Y, - CLUE_STATE.GYRO_Z, - CLUE_STATE.MAGNET_X, - CLUE_STATE.MAGNET_Y, - CLUE_STATE.MAGNET_Z, - ] -) - -BMP_IMG = "BMP" - -BMP_IMG_ENDING = ".bmp" - -NO_VALID_IMGS_ERR = "No valid images" - -BLINKA_BMP = "blinka.bmp" -CLUE_TERMINAL_LINE_HEIGHT = 16 -CLUE_TERMINAL_LINE_NUM_MAX = 15 -CLUE_TERMINAL_X_OFFSET = 15 -CLUE_TERMINAL_Y_OFFSET = 5 -CLUE_TERMINAL_LINE_BREAK_AMT = 37 diff --git a/src/base_circuitpython/board.py b/src/base_circuitpython/board.py deleted file mode 100644 index 8bef9ed4f..000000000 --- a/src/base_circuitpython/board.py +++ /dev/null @@ -1,128 +0,0 @@ -# dummy class for references to board display to work -# https://learn.adafruit.com/arduino-to-circuitpython/the-board-module - - -import terminal_handler - - -class __Display: - def __init__(self): - self.active_group = None - self.terminal = terminal_handler.Terminal() - - def show(self, group=None): - if group != self.active_group: - self.active_group = group - - if group == None: - self.terminal._Terminal__draw() - return - - # if the group has no attribute called - # "draw", then it is liable for updating itself - # when it calls show - if hasattr(group, "_Group__draw"): - group._Group__draw() - - -DISPLAY = __Display() - -# default pin for neopixel, -# shows that this could -# refer to the CPX -# or CLUE neopixel pin -NEOPIXEL = "D00" - -# ETC PINS WITHIN THE CLUE THAT MAY BE REFERENCED -# found by runing print(dir(board)) on clue -A0 = 0 -A1 = 0 -A2 = 0 -A3 = 0 -A4 = 0 -A5 = 0 -A6 = 0 -A7 = 0 - -ACCELEROMETER_GYRO_INTERRUPT = 0 - -BUTTON_A = 0 -BUTTON_B = 0 - -D0 = 0 -D1 = 0 -D2 = 0 -D3 = 0 -D4 = 0 -D5 = 0 -D6 = 0 -D7 = 0 -D8 = 0 -D9 = 0 -D10 = 0 -D11 = 0 -D12 = 0 -D13 = 0 -D14 = 0 -D15 = 0 -D16 = 0 -D17 = 0 -D18 = 0 -D19 = 0 -D20 = 0 - -I2C = 0 - -L = 0 - -MICROPHONE_CLOCK = 0 -MICROPHONE_DATA = 0 - -MISO = 0 -MOSI = 0 - -P0 = 0 -P1 = 0 -P2 = 0 -P3 = 0 -P4 = 0 -P5 = 0 -P6 = 0 -P7 = 0 -P8 = 0 -P9 = 0 -P10 = 0 -P11 = 0 -P12 = 0 -P13 = 0 -P14 = 0 -P15 = 0 -P16 = 0 -P17 = 0 -P18 = 0 -P19 = 0 -P20 = 0 - -PROXIMITY_LIGHT_INTERRUPT = 0 - -RX = 0 -SCK = 0 -SCL = 0 -SDA = 0 - -SPEAKER = 0 - -SPI = 0 - -TFT_BACKLIGHT = 0 -TFT_CS = 0 -TFT_DC = 0 -TFT_MOSI = 0 -TFT_RESET = 0 -TFT_SCK = 0 - -TX = 0 - -UART = 0 - -WHITE_LEDS = 0 diff --git a/src/base_circuitpython/digitalio.py b/src/base_circuitpython/digitalio.py deleted file mode 100644 index 604db72c3..000000000 --- a/src/base_circuitpython/digitalio.py +++ /dev/null @@ -1,17 +0,0 @@ -# dummy class for neopixel library to work - -# original implementation docs for digitalio: -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/digitalio/__init__.html - - -class DigitalInOut: - def __init__(self, pin): - self.pin = pin - pass - - def deinit(self): - pass - - -class Direction: - OUTPUT = 0 diff --git a/src/base_circuitpython/displayio/__init__.py b/src/base_circuitpython/displayio/__init__.py deleted file mode 100644 index a926bf965..000000000 --- a/src/base_circuitpython/displayio/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# Displayio implementation loosely based on the -# displayio package in Adafruit CircuitPython - -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/__init__.html - -from .bitmap import Bitmap -from .group import Group -from .palette import Palette - -# references to img and bmp_img are for testing purposes -from .tile_grid import TileGrid diff --git a/src/base_circuitpython/displayio/bitmap.py b/src/base_circuitpython/displayio/bitmap.py deleted file mode 100644 index c913dff2b..000000000 --- a/src/base_circuitpython/displayio/bitmap.py +++ /dev/null @@ -1,105 +0,0 @@ -from . import constants as CONSTANTS - -# Bitmap implementation loosely based on the -# displayio.Bitmap class in Adafruit CircuitPython - -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/Bitmap.html - -# The colour of a certain pixel is interpreted -# within the TileGrid instance that the object -# lives within. Each pixel is an integer value -# that refers to the colours in the palette via index. - - -class Bitmap: - """ - .. currentmodule:: displayio - - `Bitmap` -- Stores values in a 2D array - ========================================================================== - - Stores values of a certain size in a 2D array - - .. class:: Bitmap(width, height, value_count) - - Create a Bitmap object with the given fixed size. Each pixel stores a value that is used to - index into a corresponding palette. This enables differently colored sprites to share the - underlying Bitmap. value_count is used to minimize the memory used to store the Bitmap. - - :param int width: The number of values wide - :param int height: The number of values high - :param int value_count: The number of possible pixel values. - - """ - - def __init__(self, width, height, value_count=255): - self.__width = width - self.__height = height - self.values = bytearray(width * height) - - @property - def width(self): - """ - .. attribute:: width - - Width of the bitmap. (read only) - - """ - return self.__width - - @property - def height(self): - """ - .. attribute:: height - - Height of the bitmap. (read only) - - """ - return self.__height - - def __setitem__(self, index, value): - """ - .. method:: __setitem__(index, value) - - Sets the value at the given index. The index can either be an x,y tuple or an int equal - to ``y * width + x``. - - This allows you to:: - - bitmap[0,1] = 3 - - """ - if isinstance(index, tuple): - if index[0] >= self.width or index[1] >= self.height: - raise IndexError(CONSTANTS.PIXEL_OUT_OF_BOUNDS) - - index = index[0] + index[1] * self.width - - try: - self.values[index] = value - except IndexError: - raise IndexError(CONSTANTS.PIXEL_OUT_OF_BOUNDS) - - def __getitem__(self, index): - """ - .. method:: __getitem__(index) - - Returns the value at the given index. The index can either be an x,y tuple or an int equal - to ``y * width + x``. - - This allows you to:: - - print(bitmap[0,1]) - - """ - - if isinstance(index, tuple): - if index[0] >= self.width or index[1] >= self.height: - raise IndexError(CONSTANTS.PIXEL_OUT_OF_BOUNDS) - - index = index[0] + index[1] * self.width - - try: - return self.values[index] - except IndexError: - raise IndexError(CONSTANTS.PIXEL_OUT_OF_BOUNDS) diff --git a/src/base_circuitpython/displayio/color_type.py b/src/base_circuitpython/displayio/color_type.py deleted file mode 100644 index c56347315..000000000 --- a/src/base_circuitpython/displayio/color_type.py +++ /dev/null @@ -1,12 +0,0 @@ -# Datatype for the items within a palette -class _ColorType: - def __init__(self, rgb888): - self.rgb888 = rgb888 - self.transparent = False - - def __eq__(self, other): - return ( - isinstance(other, _ColorType) - and self.rgb888 == other.rgb888 - and self.transparent == other.transparent - ) diff --git a/src/base_circuitpython/displayio/constants.py b/src/base_circuitpython/displayio/constants.py deleted file mode 100644 index bca672472..000000000 --- a/src/base_circuitpython/displayio/constants.py +++ /dev/null @@ -1,12 +0,0 @@ -PIXEL_OUT_OF_BOUNDS = "pixel coordinates out of bounds" -PALETTE_OUT_OF_RANGE = "Palette index out of range" -TILE_OUT_OF_BOUNDS = "Tile index out of bounds" -INCORR_SUBCLASS = "Layer must be a Group or TileGrid subclass." -LAYER_ALREADY_IN_GROUP = "Layer already in a group." -GROUP_FULL = "Group Full" -SCALE_TOO_SMALL = "scale must be >= 1" - -SCREEN_HEIGHT_WIDTH = 240 - -CLUE = "CLUE" -BASE_64 = "display_base64" diff --git a/src/base_circuitpython/displayio/group.py b/src/base_circuitpython/displayio/group.py deleted file mode 100644 index 5acc1f2a8..000000000 --- a/src/base_circuitpython/displayio/group.py +++ /dev/null @@ -1,354 +0,0 @@ -import base64 -from io import BytesIO -from PIL import Image -import adafruit_display_text - -from displayio.tile_grid import TileGrid -from . import constants as CONSTANTS - -import common -import board -import sys - -# Group implementation loosely based on the -# displayio.Group class in Adafruit CircuitPython -# (with only the functions needed for the CLUE) - -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/Group.html - - -class Group: - """ - `Group` -- Group together sprites and subgroups - ========================================================================== - - Manage a group of sprites and groups and how they are inter-related. - - .. class:: Group(*, max_size=4, scale=1, x=0, y=0) - Create a Group of a given size and scale. Scale is in one dimension. For example, scale=2 - leads to a layer's pixel being 2x2 pixels when in the group. - :param int max_size: The maximum group size. - :param int scale: Scale of layer pixels in one dimension. - :param int x: Initial x position within the parent. - :param int y: Initial y position within the parent. - """ - - def __init__( - self, - max_size=sys.maxsize, - scale=1, - x=0, - y=0, - check_active_group_ref=True, - auto_write=True, - ): - self.__check_active_group_ref = check_active_group_ref - self.__auto_write = auto_write - self.__contents = [] - self.__max_size = max_size - - if scale < 1: - raise ValueError(CONSTANTS.SCALE_TOO_SMALL) - - self.__scale = scale - """ - .. attribute:: scale - - Scales each pixel within the Group in both directions. For example, when scale=2 each pixel - will be represented by 2x2 pixels. - - """ - self.__x = x - """ - .. attribute:: x - - X position of the Group in the parent. - - """ - self.__y = y - """ - .. attribute:: y - - Y position of the Group in the parent. - """ - self.__parent = None - self.__hidden = False - - @property - def x(self): - return self.__x - - @x.setter - def x(self, val): - if self.__x != val: - self.__x = val - self.__elem_changed() - - @property - def y(self): - return self.__y - - @y.setter - def y(self, val): - if self.__y != val: - self.__y = val - self.__elem_changed() - - @property - def scale(self): - return self.__scale - - @scale.setter - def scale(self, val): - if val < 1: - raise ValueError(CONSTANTS.SCALE_TOO_SMALL) - - if self.__scale != val: - self.__scale = val - self.__elem_changed() - - @property - def hidden(self): - """ - .. attribute:: hidden - - True when the Group and all of it's layers are not visible. When False, the Group's layers - are visible if they haven't been hidden. - """ - return self.__hidden - - @hidden.setter - def hidden(self, val): - changed = val != self.__hidden - self.__hidden = val - for elem in self.__contents: - elem.hidden = val - - if changed: - self.__elem_changed() - - def append(self, item): - """ - .. method:: append(layer) - - Append a layer to the group. It will be drawn above other layers. - """ - self.__prepare_for_add(item) - self.__contents.append(item) - self.__elem_changed() - - def insert(self, idx, item): - """ - .. method:: insert(index, layer) - - Insert a layer into the group. - """ - self.__prepare_for_add(item) - self.__contents.insert(idx, item) - self.__elem_changed() - - def index(self, layer): - """ - .. method:: index(layer) - - Returns the index of the first copy of layer. Raises ValueError if not found. - """ - for idx, elem in enumerate(self.__contents): - if elem == layer: - return idx - - return ValueError() - - def pop(self, i=-1): - """ - .. method:: pop(i=-1) - - Remove the ith item and return it. - """ - item = self.__contents.pop(i) - self.__set_parent(item, None) - self.__elem_changed() - return item - - def remove(self, layer): - """ - .. method:: remove(layer) - - Remove the first copy of layer. Raises ValueError if it is not present. - """ - idx = self.index(layer) - item = self.__contents[idx] - - self.__set_parent(item, None) - self.__contents.pop(idx) - self.__elem_changed() - - def __delitem__(self, index): - """ - .. method:: __delitem__(index) - - Deletes the value at the given index. - - This allows you to:: - - del group[0] - """ - item = self.__contents[index] - self.__set_parent(item, None) - del self.__contents[index] - self.__elem_changed() - - def __getitem__(self, index): - """ - .. method:: __getitem__(index) - - Returns the value at the given index. - - This allows you to:: - - print(group[0]) - - """ - return self.__contents[index] - - def __setitem__(self, index, val): - """ - .. method:: __setitem__(index, value) - - Sets the value at the given index. - - This allows you to:: - - group[0] = sprite - """ - old_val = self.__contents[index] - - self.__contents[index] = val - if old_val != val: - self.__elem_changed() - - def __len__(self): - """ - .. method:: __len__() - - Returns the number of layers in a Group - """ - if not self.__contents: - return 0 - else: - return len(self.__contents) - - @property - def __in_group(self): - return self.__parent != None - - def __prepare_for_add(self, item): - if len(self.__contents) == self.__max_size: - raise RuntimeError(CONSTANTS.GROUP_FULL) - elif not isinstance(item, TileGrid) and not isinstance(item, Group): - raise ValueError(CONSTANTS.INCORR_SUBCLASS) - elif (isinstance(item, Group) and item._Group__in_group) or ( - isinstance(item, TileGrid) and item._TileGrid__in_group - ): - raise ValueError(CONSTANTS.LAYER_ALREADY_IN_GROUP) - self.__set_parent(item, self) - - def __set_parent(self, item, val): - if isinstance(item, TileGrid): - item._TileGrid__parent = val - else: - item._Group__parent = val - - def __elem_changed(self): - # Ensure that this group is what the board is currently showing. - # Otherwise, don't bother to draw it. - if self.__auto_write: - self.__trigger_draw() - - def __trigger_draw(self): - # select the correct parent to draw from if necessary - if self.__check_active_group_ref and board.DISPLAY.active_group == self: - self.__draw() - - elif self.__in_group: - # If a sub-group is modified, propagate to top level to - # see if one of the parents are the current active group. - self.__parent._Group__elem_changed() - - def __draw(self, img=None, x=0, y=0, scale=None, show=True): - # this function is not a part of the orignal implementation - # it is what draws itself and its children and potentially shows it to the - # frontend - if img == None: - img = Image.new( - "RGBA", - (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), - (0, 0, 0, 0), - ) - if scale is None: - scale = self.scale - else: - scale *= self.scale - - try: - if isinstance(self, adafruit_display_text.label.Label): - # adafruit_display_text has some positioning considerations - # that need to be handled. - - # This was found manually, display must be positioned upwards - # 1 unit (1 unit * scale = scale) - y -= scale - - # Group is positioned against anchored_position (already incorporated into self.x and self.y), - # which is positioned against anchor_point - - x += self._anchor_point[0] - y += self._anchor_point[1] - except AttributeError: - pass - - for elem in self.__contents: - if not elem.hidden: - if isinstance(elem, Group): - img = elem._Group__draw( - img=img, x=x + self.x, y=y + self.y, scale=scale, show=False, - ) - else: - img = elem._TileGrid__draw( - img=img, x=x + self.x, y=y + self.y, scale=scale - ) - - # show should only be true to the highest parent group - if show: - self.__show(img) - - # return value only used if this is within another group - return img - - def __show(self, img): - # sends current img to the frontend - buffered = BytesIO() - img.save(buffered, format="BMP") - byte_base64 = base64.b64encode(buffered.getvalue()) - img_str = str(byte_base64)[2:-1] - - sendable_json = {CONSTANTS.BASE_64: img_str} - - if common.utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - sendable_json, CONSTANTS.CLUE - ) - else: - common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) - - def __len__(self): - if not self.__contents: - return 0 - else: - return len(self.__contents) - - def pop(self, i=-1): - item = self.__contents.pop(i) - item.parent = None - self.__elem_changed() - return item diff --git a/src/base_circuitpython/displayio/palette.py b/src/base_circuitpython/displayio/palette.py deleted file mode 100644 index b954d982b..000000000 --- a/src/base_circuitpython/displayio/palette.py +++ /dev/null @@ -1,81 +0,0 @@ -from .color_type import _ColorType -from . import constants as CONSTANTS - -# Palette implementation loosely based on the -# displayio.Palette class in Adafruit CircuitPython -# (with only the functions needed for the CLUE) - -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/Palette.html - - -class Palette: - """ - `Palette` -- Stores a mapping from bitmap pixel palette_indexes to display colors - ========================================================================================= - - Map a pixel palette_index to a full color. Colors are transformed to the display's format internally to - save memory. - - .. class:: Palette(color_count) - - Create a Palette object to store a set number of colors. - - :param int color_count: The number of colors in the Palette - """ - - def __init__(self, color_count): - self.__color_count = color_count - self.__contents = [] - - # set all colours to black by default - for i in range(self.__color_count): - self.__contents.append(_ColorType((0, 0, 0))) - - def __setitem__(self, index, value): - """ - .. method:: __setitem__(index, value) - - Sets the pixel color at the given index. The index should be an integer in the range 0 to color_count-1. - - The value argument represents a color, and can be from 0x000000 to 0xFFFFFF (to represent an RGB value). - Value can be an int, bytes (3 bytes (RGB) or 4 bytes (RGB + pad byte)), bytearray, - or a tuple or list of 3 integers. - - This allows you to:: - - palette[0] = 0xFFFFFF # set using an integer - palette[1] = b'\xff\xff\x00' # set using 3 bytes - palette[2] = b'\xff\xff\x00\x00' # set using 4 bytes - palette[3] = bytearray(b'\x00\x00\xFF') # set using a bytearay of 3 or 4 bytes - palette[4] = (10, 20, 30) # set using a tuple of 3 integers - - """ - if index >= self.__color_count: - raise IndexError(CONSTANTS.PALETTE_OUT_OF_RANGE) - - self.__contents[index].rgb888 = value - - def __len__(self): - """ - .. method:: __len__() - - Returns the number of colors in a Palette - - """ - return self.__color_count - - def make_transparent(self, index): - """ - .. method:: make_transparent(palette_index) - """ - self.__toggle_transparency(index, True) - - def make_opaque(self, index): - """ - .. method:: make_opaque(palette_index) - """ - self.__toggle_transparency(index, False) - - def __toggle_transparency(self, index, transparency): - if self.__contents[index]: - self.__contents[index].transparent = transparency diff --git a/src/base_circuitpython/displayio/test/__init__.py b/src/base_circuitpython/displayio/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/base_circuitpython/displayio/test/img/group_test_result.bmp b/src/base_circuitpython/displayio/test/img/group_test_result.bmp deleted file mode 100644 index 3dfdad5fce9797b69f25281ee08d44dad30c16e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeIwv5lQo7zW{MlRL$71ytYyoYNMK&LQ_ZN@H&)@%=`+aWrBJh&HT+Gjd zUw(r>BX9`l`H=A5KtRtoSo95tfSwNt?+pa>e1k>ba0ux6knr9>K+iW=^bLoAo(~D{ z4FvRjgGJwP2e1k>ba0ux6knr9>K+iW=^bLoA zo(~D{4FvRjgGJwP2|Eu&|R(dXt#jWRB({pJoZavqUo=anK>$%qS zTpEj8&$XuK(pcPjt~EWE#^TmjP0yvVxb<9XdM=H{t>;?Pb7?GYJ=dC^ zOJi~Cxz_Yt8jD-cwWjCNSloK9H9eQc;?{Gm>A5r(x1MWF&!w@r^;~OuE{(;l=UUTq zX)JC%*P5P7V{z-b*7RH&i(AjNrsvXF+YfaCk zvAFeIYkDq?#jWRB({pJoZavqUo=anK>$%qSTpEj8&$XuK(pcPjt~EWE#^TmjP0yvVxb<9XdM=H{t>;?Pb7?GYJ=dC^OJi~Cxz_Yt8jD-cwWjCNSloK9H9eQc z;?{Gm>A5r(x1MWF&!w@r^;~OuE{(;l=UUTqX)JC%*P5P7V{z-b*7RH&i(AjNrsvXF z+8JWb7|P?1oXUa(ETN#=hCp(3Fvvjd(7y-q;S>jvFl0(veDd!2xu*A2SA1oT`Q_BsJQuN!oK3Fx^r>~#Wq zUN`9e63}yL*y{xJyl&9_C7|chu-6IbdEKD8JWb7|P?1oXUa z(ETN#=hCp(3Fvvjd(7y-q;S>jvFl0(veDd!2xu z*A2SA1oT`Q_BsJQuN!oK3Fx^r>~#WqUN`9e63}yL*y{xJyl&9_C7|chu-6IbdEKD< zOF+-1VXqU=^SVLzmw=v2!(Jz#=XHbbF9AK5hP_Te&+7)=UjlkA4SSt{p4Sb!zXbGL z8umH?J+B*de+lThH0*T(dR{l^{u0o0Y1r!o^t^7+{UxC1(y-SF=y~0s`%6I2rD3lV L(DS-M_m{xmwbZOQ diff --git a/src/base_circuitpython/displayio/test/test_bitmap.py b/src/base_circuitpython/displayio/test/test_bitmap.py deleted file mode 100644 index 2967aa632..000000000 --- a/src/base_circuitpython/displayio/test/test_bitmap.py +++ /dev/null @@ -1,44 +0,0 @@ -import pytest -from ..bitmap import Bitmap -from .. import constants as CONSTANTS - - -class TestBitmap(object): - @pytest.mark.parametrize("x, y", [(1, 1), (2, 6), (0, 0)]) - def test_create_bitmap(self, x, y): - bitmap = Bitmap(x, y) - - @pytest.mark.parametrize("x, y, palette_num", [(1, 1, 4), (2, 3, 6), (4, 4, 9)]) - def test_set_and_get_pixel(self, x, y, palette_num): - bitmap = Bitmap(5, 5) - bitmap[x, y] = palette_num - assert palette_num == bitmap[x, y] - - @pytest.mark.parametrize("i, palette_num", [(1, 1), (24, 2)]) - def test_set_and_get_pixel_singular_index(self, i, palette_num): - bitmap = Bitmap(5, 5) - bitmap[i] = palette_num - assert palette_num == bitmap[i] - - @pytest.mark.parametrize( - "x_size, y_size, x_coord, y_coord", - [(1, 1, 0, 4), (1, 1, 4, 0), (200, 200, 300, 1), (200, 200, 1, 300)], - ) - def test_get_set_index_err(self, x_size, y_size, x_coord, y_coord): - bitmap = Bitmap(x_size, y_size) - - with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): - bitmap[x_coord, y_coord] = 0 - - with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): - val = bitmap[x_coord, y_coord] - - @pytest.mark.parametrize("x_size, y_size, i", [(1, 1, 3), (200, 200, 40000)]) - def test_get_set_index_err_singular_index(self, x_size, y_size, i): - bitmap = Bitmap(x_size, y_size) - - with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): - bitmap[i] = 0 - - with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): - val = bitmap[i] diff --git a/src/base_circuitpython/displayio/test/test_group.py b/src/base_circuitpython/displayio/test/test_group.py deleted file mode 100644 index 3e4b3601e..000000000 --- a/src/base_circuitpython/displayio/test/test_group.py +++ /dev/null @@ -1,174 +0,0 @@ -import sys -import os -import pytest -import pathlib - -from unittest import mock - -from common import utils - -from displayio.tile_grid import TileGrid -from displayio.group import Group -from displayio.palette import Palette -from displayio.bitmap import Bitmap -from .. import constants as CONSTANTS -from PIL import Image - - -class TestGroup(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - self.dummy_bitmap = Bitmap(500, 500) - self.dummy_palette = Palette(5) - self.dummy_pos = (0, 0) - - utils.send_to_simulator = mock.Mock() - - def test_append_tilegrid_group_to_group(self): - tg1 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - tg2 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - g1 = Group(max_size=10) - g2 = Group(max_size=10) - - g2.append(g1) - g2.append(tg1) - g2.append(tg2) - - assert len(g2._Group__contents) == 3 - assert len(g1._Group__contents) == 0 - - @pytest.mark.parametrize("group_item", [(""), (5), ((4, 5))]) - def test_incorr_subclass(self, group_item): - g1 = Group(max_size=10) - with pytest.raises(ValueError, match=CONSTANTS.INCORR_SUBCLASS): - g1.append(group_item) - - @pytest.mark.parametrize("scale", [(0), (-2)]) - def test_invalid_scale(self, scale): - with pytest.raises(ValueError, match=CONSTANTS.SCALE_TOO_SMALL): - g1 = Group(scale=scale) - - def test_layer_already_in_group(self): - g1 = Group(max_size=4) - - tg1 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - tg2 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - g1.append(tg1) - - # should allow this, since it checks equality by reference: - g1.append(tg2) - - # should throw error for same group by reference - with pytest.raises(ValueError, match=CONSTANTS.LAYER_ALREADY_IN_GROUP): - g1.append(tg1) - - def test_group_full(self): - g1 = Group(max_size=1) - - tg1 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - tg2 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - g1.append(tg1) - - with pytest.raises(RuntimeError, match=CONSTANTS.GROUP_FULL): - g1.append(tg2) - - @pytest.mark.parametrize( - "size_w,size_h,draw_w,draw_h,accent_colors,x_offset,y_offset,scale_sub,scale_main", - [ - ( - (30, 27), - (63, 34), - (10, 11), - (40, 20), - ((244, 266, 23), (134, 26, 3)), - 3, - 9, - 2, - 3, - ) - ], - ) - def test_draw_group( - self, - size_w, - size_h, - draw_w, - draw_h, - accent_colors, - x_offset, - y_offset, - scale_sub, - scale_main, - ): - palette = Palette(3) - palette[1] = accent_colors[0] - palette[2] = accent_colors[1] - - bmp_1 = Bitmap(size_w[0], size_h[0]) - bmp_2 = Bitmap(size_w[1], size_h[1]) - - for i in range(draw_h[0]): - for j in range(draw_w[0]): - try: - bmp_1[j, i] = 1 - except IndexError: - continue - - for i in range(draw_h[1]): - for j in range(draw_w[1]): - try: - bmp_2[j, i] = 2 - except IndexError: - continue - - tg = TileGrid(bitmap=bmp_1, pixel_shader=palette, position=(0, 0)) - tg2 = TileGrid(bitmap=bmp_2, pixel_shader=palette, position=(50, 50)) - - group_main = Group(max_size=10, scale=scale_main, check_active_group_ref=False) - group_sub = Group(max_size=10, scale=scale_sub) - - group_sub.append(tg) - group_main.append(group_sub) - group_main.append(tg2) - img = group_main._Group__draw() - - img.putalpha(255) - expected = Image.open( - os.path.join(self.abs_path, "img", "group_test_result.bmp") - ) - expected.putalpha(255) - bmp_img_expected = expected.load() - bmp_img = img.load() - for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - assert bmp_img_expected[j, i] == bmp_img[j, i] diff --git a/src/base_circuitpython/displayio/test/test_palette.py b/src/base_circuitpython/displayio/test/test_palette.py deleted file mode 100644 index 8b0d1aa38..000000000 --- a/src/base_circuitpython/displayio/test/test_palette.py +++ /dev/null @@ -1,31 +0,0 @@ -import pytest -from ..palette import Palette -from .. import constants as CONSTANTS -from ..color_type import _ColorType - - -class TestPalette(object): - @pytest.mark.parametrize( - "color_count, palette_num, val", - [(11, 5, (255, 255, 255)), (1, 0, (255, 0, 255)), (4, 3, (0, 0, 0))], - ) - def test_get_and_set_palette(self, color_count, palette_num, val): - palette = Palette(color_count) - palette[palette_num] = val - assert palette._Palette__contents[palette_num] == _ColorType(val) - - @pytest.mark.parametrize("palette_size, palette_index", [(3, 7), (0, 0), (3, 3)]) - def test_get_and_set_palette_err(self, palette_size, palette_index): - palette = Palette(palette_size) - with pytest.raises(IndexError, match=CONSTANTS.PALETTE_OUT_OF_RANGE): - palette[palette_index] = 0 - - def test_set_transparency(self): - palette = Palette(5) - assert palette._Palette__contents[2].transparent == False - - palette.make_transparent(2) - assert palette._Palette__contents[2].transparent == True - - palette.make_opaque(2) - assert palette._Palette__contents[2].transparent == False diff --git a/src/base_circuitpython/displayio/test/test_tile_grid.py b/src/base_circuitpython/displayio/test/test_tile_grid.py deleted file mode 100644 index 1f2d9d5fa..000000000 --- a/src/base_circuitpython/displayio/test/test_tile_grid.py +++ /dev/null @@ -1,173 +0,0 @@ -import pytest -from PIL import Image -from ..tile_grid import TileGrid -from ..palette import Palette -from ..bitmap import Bitmap -from .. import constants as CONSTANTS - - -class TestTileGrid(object): - def setup_method(self): - self.dummy_bitmap = Bitmap(500, 500) - self.dummy_palette = Palette(5) - self.dummy_pos = (0, 0) - - @pytest.mark.parametrize( - "bitmap_w,bitmap_h,palette_num,tile_width,tile_height,position", - [(1, 1, 3, 1, 1, (0, 5)), (5, 7, 4, 2, 3, (0, 5))], - ) - def test_basic_constructor( - self, bitmap_w, bitmap_h, palette_num, tile_width, tile_height, position - ): - # constructor with position tuple - tg1 = TileGrid( - bitmap=Bitmap(bitmap_w, bitmap_h), - pixel_shader=Palette(palette_num), - tile_width=tile_width, - tile_height=tile_height, - position=position, - ) - - # alternate constructor with no position tuple - - tg2 = TileGrid( - bitmap=Bitmap(bitmap_w, bitmap_h), - pixel_shader=Palette(palette_num), - tile_width=tile_width, - tile_height=tile_height, - x=position[0], - y=position[1], - ) - - tile_grids = [tg1, tg2] - - for tg in tile_grids: - assert tg._TileGrid__bitmap.width == bitmap_w - assert tg._TileGrid__bitmap.height == bitmap_h - assert len(tg.pixel_shader._Palette__contents) == palette_num - assert tg._TileGrid__tile_width == tile_width - assert tg._TileGrid__tile_height == tile_height - assert tg.x == position[0] - assert tg.y == position[1] - - # alternate constructor with no height and width -> takes the bitmap's height and width - tg3 = TileGrid( - bitmap=Bitmap(bitmap_w, bitmap_h), - pixel_shader=Palette(palette_num), - x=position[0], - y=position[1], - ) - - assert tg3._TileGrid__bitmap.width == bitmap_w - assert tg3._TileGrid__bitmap.height == bitmap_h - assert len(tg3.pixel_shader._Palette__contents) == palette_num - assert tg3._TileGrid__tile_width == bitmap_w - assert tg3._TileGrid__tile_height == bitmap_h - assert tg3.x == position[0] - assert tg3.y == position[1] - - @pytest.mark.parametrize( - "w, h, x, y", [(5, 5, 2, 1), (2, 7, 0, 0), (66, 88, 65, 87)] - ) - def test_tile_set_get(self, w, h, x, y): - tg = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - tile_width=w, - tile_height=h, - position=self.dummy_pos, - ) - - tg_x_y = tg[x, y] - assert tg_x_y == tg._TileGrid__bitmap[x, y] - - @pytest.mark.parametrize( - "w, h, x, y", [(55, 56, 100, 1), (55, 56, 0, 56), (66, 88, 66, 88)] - ) - def test_tile_out_of_bounds(self, w, h, x, y): - tg = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - tile_width=w, - tile_height=h, - position=self.dummy_pos, - ) - with pytest.raises(IndexError, match=CONSTANTS.TILE_OUT_OF_BOUNDS): - tg_x_y = tg[x, y] - - @pytest.mark.parametrize( - "size_w, size_h, x, y, draw_w, draw_h, bg_color, accent_color, x_offset, y_offset, scale", - [ - (10, 10, 5, 5, 5, 5, (3, 0, 0, 255), (244, 255, 23, 255), 2, 0, 2), - (100, 30, 2, 3, 6, 3, (255, 255, 255, 255), (45, 45, 77, 255), 0, 7, 5), - ], - ) - def test_draw( - self, - size_w, - size_h, - x, - y, - draw_w, - draw_h, - bg_color, - accent_color, - x_offset, - y_offset, - scale, - ): - - palette = Palette(2) - palette[0] = bg_color - palette[1] = accent_color - - bmp = Bitmap(size_w, size_h) - - for i in range(size_h): - for j in range(size_w): - bmp[j, i] = 0 - - for i in range(y, y + draw_h): - for j in range(x, x + draw_w): - try: - bmp[j, i] = 1 - except IndexError: - continue - - tg = TileGrid(bitmap=bmp, pixel_shader=palette, position=(0, 0)) - tg2 = TileGrid(bitmap=bmp, pixel_shader=palette, position=(0, 0)) - img = Image.new( - "RGBA", (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - # without scaling, test output - img = tg._TileGrid__draw(img, x_offset, y_offset, 1) - bmp_img = img.load() - for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - if (i in range(y_offset + y, y_offset + y + draw_h)) and ( - j in range(x_offset + x, x_offset + x + draw_w) - ): - assert bmp_img[j, i] == accent_color - elif (i in range(y_offset, y_offset + size_h)) and ( - j in range(x_offset, x_offset + size_w) - ): - assert bmp_img[j, i] == bg_color - - img = Image.new( - "RGBA", (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - # with scaling, test output - img = tg._TileGrid__draw(img, x_offset, y_offset, scale) - bmp_img = img.load() - for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - if ( - i in range(y_offset + y * scale, y_offset + (y + draw_h) * scale) - ) and ( - j in range(x_offset + x * scale, x_offset + (x + draw_w) * scale) - ): - assert bmp_img[j, i] == accent_color - elif (i in range(y_offset * scale, (y_offset + draw_h) * scale)) and ( - j in range(x_offset * scale, (x_offset + draw_w) * scale) - ): - assert bmp_img[j, i] == bg_color diff --git a/src/base_circuitpython/displayio/tile_grid.py b/src/base_circuitpython/displayio/tile_grid.py deleted file mode 100644 index ad948cfde..000000000 --- a/src/base_circuitpython/displayio/tile_grid.py +++ /dev/null @@ -1,280 +0,0 @@ -from PIL import Image, ImageColor -from . import constants as CONSTANTS -import threading -import queue -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# TileGrid implementation loosely based on the -# displayio.TileGrid class in Adafruit CircuitPython -# (with only the functions needed for the CLUE) -# this version of the class only supports a single tile, -# therefore, get/set functionality is a bit different. - -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/TileGrid.html - - -class TileGrid: - """ - `TileGrid` -- A grid of tiles sourced out of one bitmap - ========================================================================== - - Position a grid of tiles sourced from a bitmap and pixel_shader combination. Multiple grids - can share bitmaps and pixel shaders. - - A single tile grid is also known as a Sprite. - - .. class:: TileGrid(bitmap, *, pixel_shader, width=1, height=1, tile_width=None, tile_height=None, default_tile=0, x=0, y=0) - - Create a TileGrid object. The bitmap is source for 2d pixels. The pixel_shader is used to - convert the value and its location to a display native pixel color. This may be a simple color - palette lookup, a gradient, a pattern or a color transformer. - - tile_width and tile_height match the height of the bitmap by default. - - :param displayio.Bitmap bitmap: The bitmap storing one or more tiles. - :param displayio.Palette pixel_shader: The pixel shader that produces colors from values - :param int width: Width of the grid in tiles. - :param int height: Height of the grid in tiles. - :param int tile_width: Width of a single tile in pixels. Defaults to the full Bitmap and must evenly divide into the Bitmap's dimensions. - :param int tile_height: Height of a single tile in pixels. Defaults to the full Bitmap and must evenly divide into the Bitmap's dimensions. - :param int default_tile: Default tile index to show. - :param int x: Initial x position of the left edge within the parent. - :param int y: Initial y position of the top edge within the parent. - """ - - def __init__( - self, - bitmap, - pixel_shader, - default_tile=0, - tile_width=None, - tile_height=None, - x=0, - y=0, - position=None, - ): - self.x = None - """ - .. attribute:: x - - X position of the left edge in the parent. - """ - self.y = None - """ - .. attribute:: y - - Y position of the top edge in the parent. - """ - self.pixel_shader = pixel_shader - """ - .. attribute:: pixel_shader - - The pixel shader of the tilegrid. - """ - self.hidden = False - """ - .. attribute:: hidden - - True when the TileGrid is hidden. This may be False even when a part of a hidden Group. - """ - - self.__bitmap = bitmap - self.__tile_width = None - self.__tile_height = None - - if tile_width is None: - self.__tile_width = bitmap.width - else: - self.__tile_width = tile_width - - if tile_height is None: - self.__tile_height = bitmap.height - else: - self.__tile_height = tile_height - - if position and isinstance(position, tuple): - self.x = position[0] - self.y = position[1] - else: - self.x = x - self.y = y - - self.__parent = None - - # unimplemented features - self.__flip_x = False - self.__flip_y = False - self.__transpose_xy = False - - telemetry_py.send_telemetry(TelemetryEvent.CLUE_API_TILE_GRID) - - @property - def flip_x(self): - """ - .. attribute:: flip_x - - If true, the left edge rendered will be the right edge of the right-most tile. - """ - return self.__flip_x - - @flip_x.setter - def flip_x(self, val): - utils.print_for_unimplemented_functions(TileGrid.flip_x.__name_) - self.__flip_x = val - - @property - def flip_y(self): - - """ - .. attribute:: flip_y - - If true, the top edge rendered will be the bottom edge of the bottom-most tile. - """ - return self.__flip_y - - @flip_y.setter - def flip_y(self, val): - utils.print_for_unimplemented_functions(TileGrid.flip_y.__name_) - self.__flip_y = val - - @property - def transpose_xy(self): - - """ - .. attribute:: transpose_xy - - If true, the TileGrid's axis will be swapped. When combined with mirroring, any 90 degree - rotation can be achieved along with the corresponding mirrored version. - """ - return self.__transpose_xy - - @transpose_xy.setter - def transpose_xy(self, val): - utils.print_for_unimplemented_functions(TileGrid.transpose_xy.__name_) - self.__transpose_xy = val - - # setitem for an index simply gets the index of the bitmap - # rather than the tile index - def __setitem__(self, index, value): - """ - .. method:: __setitem__(index, tile_index) - Sets the tile index at the given index. The index can either be an x,y tuple or an int equal - to ``y * width + x``. - - This allows you to:: - - grid[0] = 10 - - or:: - - grid[0,0] = 10 - """ - if isinstance(index, tuple): - if index[0] >= self.__tile_width or index[1] >= self.__tile_height: - raise IndexError(CONSTANTS.TILE_OUT_OF_BOUNDS) - - self.__bitmap[index] = value - - # getitem for an index simply gets the index of the bitmap - # rather than the tile index - def __getitem__(self, index): - """ - .. method:: __getitem__(index) - Returns the tile index at the given index. The index can either be an x,y tuple or an int equal - to ``y * width + x``. - - This allows you to:: - - print(grid[0]) - """ - if isinstance(index, tuple): - if index[0] >= self.__tile_width or index[1] >= self.__tile_height: - raise IndexError(CONSTANTS.TILE_OUT_OF_BOUNDS) - - return self.__bitmap[index] - - @property - def __in_group(self): - return self.__parent != None - - # methods that are not in the origin class: - - def __draw(self, img, x, y, scale): - # draw the current bitmap with - # appropriate scale on the global bmp_img - x = self.x * scale + x - y = self.y * scale + y - - new_shape = self.__draw_group( - x, y, 0, self.__tile_height, 0, self.__tile_width, scale - ) - - img.paste(new_shape, (x, y), new_shape) - return img - - def __draw_group(self, x, y, y_start, y_end, x_start, x_end, scale): - height = y_end - y_start - width = x_end - x_start - - this_img = Image.new("RGBA", (width * scale, height * scale), (0, 0, 0, 0)) - this_img.putalpha(0) - this_bmp_img = this_img.load() - - for i in range(y_start, y_end): - for j in range(x_start, x_end): - x_offset = j * scale - y_offset = i * scale - - x_max = min(x_offset + scale, width * scale) - y_max = min(y_offset + scale, height * scale) - - curr_val = self.__bitmap[j, i] - palette_obj = self.pixel_shader._Palette__contents[curr_val] - - transparent = palette_obj.transparent - - if not transparent and x_offset >= 0 and y_offset >= 0: - - curr_colour = palette_obj.rgb888 - self.__fill_pixel( - curr_val, - curr_colour, - x_offset, - y_offset, - scale, - x_max, - y_max, - this_bmp_img, - ) - - return this_img - - # helper method for drawing pixels on bmp_img - # given the src, offset, and scale - def __fill_pixel( - self, - curr_val, - curr_colour, - x_offset, - y_offset, - scale, - x_max, - y_max, - this_bmp_img, - ): - - for new_y in range(y_offset, y_max): - for new_x in range(x_offset, x_max): - try: - if isinstance(curr_colour, tuple): - this_bmp_img[new_x, new_y] = curr_colour - else: - this_bmp_img[new_x, new_y] = ( - (curr_colour >> 16) & 255, - (curr_colour >> 8) & 255, - (curr_colour) & 255, - ) - except IndexError: - pass diff --git a/src/base_circuitpython/fontio.py b/src/base_circuitpython/fontio.py deleted file mode 100644 index 3c7e567bd..000000000 --- a/src/base_circuitpython/fontio.py +++ /dev/null @@ -1,14 +0,0 @@ -# dummy library for adafruit_bitmap_font to work - -# original implementation docs for fontio: -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/fontio/__init__.html - -# file taken from adafruit_bitmap_font's examples: -# https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font/blob/master/test/fontio.py -import collections -import displayio - -Glyph = collections.namedtuple( - "Glyph", - ["bitmap", "tile_index", "width", "height", "dx", "dy", "shift_x", "shift_y"], -) diff --git a/src/base_circuitpython/fonts/ter-u12n.bdf b/src/base_circuitpython/fonts/ter-u12n.bdf deleted file mode 100644 index 390d0a1e8..000000000 --- a/src/base_circuitpython/fonts/ter-u12n.bdf +++ /dev/null @@ -1,25240 +0,0 @@ -STARTFONT 2.1 -FONT -xos4-Terminus-Medium-R-Normal--12-120-72-72-C-60-ISO10646-1 -SIZE 12 72 72 -FONTBOUNDINGBOX 6 12 0 -2 -STARTPROPERTIES 20 -FAMILY_NAME "Terminus" -FOUNDRY "xos4" -SETWIDTH_NAME "Normal" -ADD_STYLE_NAME "" -COPYRIGHT "Copyright (C) 2018 Dimitar Toshkov Zhekov" -NOTICE "Licensed under the SIL Open Font License, Version 1.1" -WEIGHT_NAME "Medium" -SLANT "R" -PIXEL_SIZE 12 -POINT_SIZE 120 -RESOLUTION_X 72 -RESOLUTION_Y 72 -SPACING "C" -AVERAGE_WIDTH 60 -CHARSET_REGISTRY "ISO10646" -CHARSET_ENCODING "1" -MIN_SPACE 6 -FONT_ASCENT 10 -FONT_DESCENT 2 -DEFAULT_CHAR 65533 -ENDPROPERTIES -CHARS 1326 -STARTCHAR char0 -ENCODING 0 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -D8 -88 -00 -88 -88 -00 -88 -D8 -00 -00 -ENDCHAR -STARTCHAR space -ENCODING 32 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR exclam -ENCODING 33 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -20 -20 -20 -00 -20 -20 -00 -00 -ENDCHAR -STARTCHAR quotedbl -ENCODING 34 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -50 -50 -50 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR numbersign -ENCODING 35 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -F8 -50 -50 -F8 -50 -50 -00 -00 -ENDCHAR -STARTCHAR dollar -ENCODING 36 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -A8 -A0 -70 -28 -A8 -70 -20 -00 -ENDCHAR -STARTCHAR percent -ENCODING 37 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -48 -A8 -50 -10 -20 -28 -54 -48 -00 -00 -ENDCHAR -STARTCHAR ampersand -ENCODING 38 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -50 -20 -68 -90 -90 -68 -00 -00 -ENDCHAR -STARTCHAR quotesingle -ENCODING 39 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -20 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR parenleft -ENCODING 40 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -40 -40 -40 -40 -20 -10 -00 -00 -ENDCHAR -STARTCHAR parenright -ENCODING 41 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -10 -10 -10 -10 -20 -40 -00 -00 -ENDCHAR -STARTCHAR asterisk -ENCODING 42 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -50 -20 -F8 -20 -50 -00 -00 -00 -ENDCHAR -STARTCHAR plus -ENCODING 43 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -20 -20 -F8 -20 -20 -00 -00 -00 -ENDCHAR -STARTCHAR comma -ENCODING 44 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -20 -20 -40 -00 -ENDCHAR -STARTCHAR hyphen -ENCODING 45 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -F8 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR period -ENCODING 46 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -20 -20 -00 -00 -ENDCHAR -STARTCHAR slash -ENCODING 47 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -08 -10 -10 -20 -20 -40 -40 -00 -00 -ENDCHAR -STARTCHAR zero -ENCODING 48 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -98 -A8 -C8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR one -ENCODING 49 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -60 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR two -ENCODING 50 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -08 -10 -20 -40 -F8 -00 -00 -ENDCHAR -STARTCHAR three -ENCODING 51 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -08 -30 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR four -ENCODING 52 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -18 -28 -48 -88 -F8 -08 -08 -00 -00 -ENDCHAR -STARTCHAR five -ENCODING 53 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -F0 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR six -ENCODING 54 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -80 -80 -F0 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR seven -ENCODING 55 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -08 -08 -10 -10 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR eight -ENCODING 56 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -70 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR nine -ENCODING 57 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -78 -08 -08 -70 -00 -00 -ENDCHAR -STARTCHAR colon -ENCODING 58 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -20 -20 -00 -00 -20 -20 -00 -00 -ENDCHAR -STARTCHAR semicolon -ENCODING 59 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -20 -20 -00 -00 -20 -20 -40 -00 -ENDCHAR -STARTCHAR less -ENCODING 60 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -10 -20 -40 -20 -10 -08 -00 -00 -ENDCHAR -STARTCHAR equal -ENCODING 61 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -00 -00 -F8 -00 -00 -00 -00 -ENDCHAR -STARTCHAR greater -ENCODING 62 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -20 -10 -08 -10 -20 -40 -00 -00 -ENDCHAR -STARTCHAR question -ENCODING 63 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -10 -20 -00 -20 -20 -00 -00 -ENDCHAR -STARTCHAR at -ENCODING 64 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -98 -A8 -A8 -98 -80 -78 -00 -00 -ENDCHAR -STARTCHAR A -ENCODING 65 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR B -ENCODING 66 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -F0 -88 -88 -88 -F0 -00 -00 -ENDCHAR -STARTCHAR C -ENCODING 67 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -80 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR D -ENCODING 68 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -90 -88 -88 -88 -88 -90 -E0 -00 -00 -ENDCHAR -STARTCHAR E -ENCODING 69 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR F -ENCODING 70 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -F0 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR G -ENCODING 71 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -80 -B8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR H -ENCODING 72 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -F8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR I -ENCODING 73 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR J -ENCODING 74 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -38 -10 -10 -10 -10 -90 -90 -60 -00 -00 -ENDCHAR -STARTCHAR K -ENCODING 75 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -90 -A0 -C0 -C0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR L -ENCODING 76 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -80 -80 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR M -ENCODING 77 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -D8 -A8 -A8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR N -ENCODING 78 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -C8 -A8 -98 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR O -ENCODING 79 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR P -ENCODING 80 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -88 -F0 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR Q -ENCODING 81 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -A8 -70 -08 -00 -ENDCHAR -STARTCHAR R -ENCODING 82 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -88 -F0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR S -ENCODING 83 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -70 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR T -ENCODING 84 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -20 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR U -ENCODING 85 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR V -ENCODING 86 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -50 -50 -50 -20 -20 -00 -00 -ENDCHAR -STARTCHAR W -ENCODING 87 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -A8 -A8 -D8 -88 -00 -00 -ENDCHAR -STARTCHAR X -ENCODING 88 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -20 -20 -50 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Y -ENCODING 89 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR Z -ENCODING 90 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -08 -10 -20 -40 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR bracketleft -ENCODING 91 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -40 -40 -40 -40 -40 -40 -70 -00 -00 -ENDCHAR -STARTCHAR backslash -ENCODING 92 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -20 -20 -10 -10 -08 -08 -00 -00 -ENDCHAR -STARTCHAR bracketright -ENCODING 93 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -10 -10 -10 -10 -10 -10 -70 -00 -00 -ENDCHAR -STARTCHAR asciicircum -ENCODING 94 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -50 -88 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR underscore -ENCODING 95 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -F8 -00 -ENDCHAR -STARTCHAR grave -ENCODING 96 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR a -ENCODING 97 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR b -ENCODING 98 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -F0 -88 -88 -88 -88 -F0 -00 -00 -ENDCHAR -STARTCHAR c -ENCODING 99 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR d -ENCODING 100 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -08 -78 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR e -ENCODING 101 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR f -ENCODING 102 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -18 -20 -70 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR g -ENCODING 103 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR h -ENCODING 104 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR i -ENCODING 105 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -00 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR j -ENCODING 106 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -08 -08 -00 -18 -08 -08 -08 -08 -08 -48 -30 -ENDCHAR -STARTCHAR k -ENCODING 107 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -48 -50 -60 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR l -ENCODING 108 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR m -ENCODING 109 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -A8 -A8 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR n -ENCODING 110 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR o -ENCODING 111 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR p -ENCODING 112 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -F0 -80 -80 -ENDCHAR -STARTCHAR q -ENCODING 113 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -88 -88 -88 -88 -78 -08 -08 -ENDCHAR -STARTCHAR r -ENCODING 114 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -B8 -C0 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR s -ENCODING 115 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -80 -70 -08 -08 -F0 -00 -00 -ENDCHAR -STARTCHAR t -ENCODING 116 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -20 -20 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR u -ENCODING 117 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR v -ENCODING 118 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -50 -50 -20 -20 -00 -00 -ENDCHAR -STARTCHAR w -ENCODING 119 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -A8 -A8 -A8 -70 -00 -00 -ENDCHAR -STARTCHAR x -ENCODING 120 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -50 -20 -20 -50 -88 -00 -00 -ENDCHAR -STARTCHAR y -ENCODING 121 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR z -ENCODING 122 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -10 -20 -40 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR braceleft -ENCODING 123 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -18 -20 -20 -40 -20 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR bar -ENCODING 124 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -20 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR braceright -ENCODING 125 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -10 -10 -08 -10 -10 -10 -60 -00 -00 -ENDCHAR -STARTCHAR asciitilde -ENCODING 126 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -48 -A8 -90 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR nbspace -ENCODING 160 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR exclamdown -ENCODING 161 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -00 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR cent -ENCODING 162 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -70 -A8 -A0 -A0 -A8 -70 -20 -00 -ENDCHAR -STARTCHAR sterling -ENCODING 163 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -30 -48 -40 -F0 -40 -40 -48 -F8 -00 -00 -ENDCHAR -STARTCHAR currency -ENCODING 164 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -30 -48 -48 -30 -48 -00 -00 -00 -ENDCHAR -STARTCHAR yen -ENCODING 165 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -20 -70 -20 -70 -20 -00 -00 -ENDCHAR -STARTCHAR brokenbar -ENCODING 166 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -20 -00 -00 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR section -ENCODING 167 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -30 -48 -20 -50 -48 -28 -10 -48 -30 -00 -00 -ENDCHAR -STARTCHAR dieresis -ENCODING 168 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR copyright -ENCODING 169 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -84 -B4 -A4 -A4 -B4 -84 -78 -00 -00 -ENDCHAR -STARTCHAR ordfeminine -ENCODING 170 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -08 -38 -48 -38 -00 -78 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR guillemotleft -ENCODING 171 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -14 -28 -50 -A0 -50 -28 -14 -00 -00 -ENDCHAR -STARTCHAR logicalnot -ENCODING 172 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -08 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR softhyphen -ENCODING 173 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -78 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR registered -ENCODING 174 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -84 -B4 -AC -B4 -AC -84 -78 -00 -00 -ENDCHAR -STARTCHAR macron -ENCODING 175 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR degree -ENCODING 176 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -50 -20 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR plusminus -ENCODING 177 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -20 -F8 -20 -20 -00 -F8 -00 -00 -ENDCHAR -STARTCHAR twosuperior -ENCODING 178 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -30 -48 -10 -20 -78 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR threesuperior -ENCODING 179 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -70 -08 -30 -08 -70 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR acute -ENCODING 180 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR mu -ENCODING 181 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -98 -E8 -80 -80 -ENDCHAR -STARTCHAR paragraph -ENCODING 182 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -A8 -A8 -A8 -68 -28 -28 -28 -00 -00 -ENDCHAR -STARTCHAR periodcentered -ENCODING 183 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -20 -20 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR cedilla -ENCODING 184 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -20 -20 -40 -ENDCHAR -STARTCHAR onesuperior -ENCODING 185 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -10 -30 -10 -10 -38 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR ordmasculine -ENCODING 186 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -48 -48 -48 -30 -00 -78 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR guillemotright -ENCODING 187 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -A0 -50 -28 -14 -28 -50 -A0 -00 -00 -ENDCHAR -STARTCHAR onequarter -ENCODING 188 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -C0 -44 -48 -50 -20 -48 -98 -28 -78 -08 -08 -ENDCHAR -STARTCHAR onehalf -ENCODING 189 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -C0 -44 -48 -50 -20 -40 -98 -24 -08 -10 -3C -ENDCHAR -STARTCHAR threequarters -ENCODING 190 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -E0 -10 -60 -14 -E8 -10 -24 -4C -94 -3C -04 -04 -ENDCHAR -STARTCHAR questiondown -ENCODING 191 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -00 -20 -40 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Agrave -ENCODING 192 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Aacute -ENCODING 193 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Acircumflex -ENCODING 194 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Atilde -ENCODING 195 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Adieresis -ENCODING 196 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Aring -ENCODING 197 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR AE -ENCODING 198 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -7C -90 -90 -FC -90 -90 -90 -9C -00 -00 -ENDCHAR -STARTCHAR Ccedilla -ENCODING 199 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -80 -80 -80 -88 -70 -20 -40 -ENDCHAR -STARTCHAR Egrave -ENCODING 200 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Eacute -ENCODING 201 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Ecircumflex -ENCODING 202 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Edieresis -ENCODING 203 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Igrave -ENCODING 204 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Iacute -ENCODING 205 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Icircumflex -ENCODING 206 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Idieresis -ENCODING 207 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Eth -ENCODING 208 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -90 -88 -E8 -88 -88 -90 -E0 -00 -00 -ENDCHAR -STARTCHAR Ntilde -ENCODING 209 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -88 -88 -C8 -A8 -98 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Ograve -ENCODING 210 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Oacute -ENCODING 211 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Ocircumflex -ENCODING 212 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Otilde -ENCODING 213 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Odieresis -ENCODING 214 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR multiply -ENCODING 215 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -50 -20 -50 -88 -00 -00 -00 -ENDCHAR -STARTCHAR Oslash -ENCODING 216 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -74 -88 -98 -A8 -C8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Ugrave -ENCODING 217 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Uacute -ENCODING 218 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Ucircumflex -ENCODING 219 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Udieresis -ENCODING 220 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Yacute -ENCODING 221 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR Thorn -ENCODING 222 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -F0 -88 -88 -88 -F0 -80 -80 -00 -00 -ENDCHAR -STARTCHAR germandbls -ENCODING 223 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -90 -90 -F0 -88 -88 -C8 -B0 -00 -00 -ENDCHAR -STARTCHAR agrave -ENCODING 224 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR aacute -ENCODING 225 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR acircumflex -ENCODING 226 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR atilde -ENCODING 227 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR adieresis -ENCODING 228 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR aring -ENCODING 229 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR ae -ENCODING 230 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -28 -68 -B0 -A0 -78 -00 -00 -ENDCHAR -STARTCHAR ccedilla -ENCODING 231 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -80 -80 -88 -70 -20 -40 -ENDCHAR -STARTCHAR egrave -ENCODING 232 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR eacute -ENCODING 233 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR ecircumflex -ENCODING 234 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR edieresis -ENCODING 235 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR igrave -ENCODING 236 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR iacute -ENCODING 237 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR icircumflex -ENCODING 238 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR idieresis -ENCODING 239 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR eth -ENCODING 240 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -A0 -40 -A0 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR ntilde -ENCODING 241 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR ograve -ENCODING 242 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR oacute -ENCODING 243 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR ocircumflex -ENCODING 244 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR otilde -ENCODING 245 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR odieresis -ENCODING 246 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR divide -ENCODING 247 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -20 -00 -F8 -00 -20 -20 -00 -00 -ENDCHAR -STARTCHAR oslash -ENCODING 248 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -74 -98 -A8 -C8 -88 -70 -00 -00 -ENDCHAR -STARTCHAR ugrave -ENCODING 249 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR uacute -ENCODING 250 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR ucircumflex -ENCODING 251 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR udieresis -ENCODING 252 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR yacute -ENCODING 253 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR thorn -ENCODING 254 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -F0 -88 -88 -88 -88 -F0 -80 -80 -ENDCHAR -STARTCHAR ydieresis -ENCODING 255 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR Amacron -ENCODING 256 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR amacron -ENCODING 257 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Abreve -ENCODING 258 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR abreve -ENCODING 259 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Aogonek -ENCODING 260 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -F8 -88 -88 -88 -10 -0C -ENDCHAR -STARTCHAR aogonek -ENCODING 261 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -08 -78 -88 -88 -78 -10 -0C -ENDCHAR -STARTCHAR Cacute -ENCODING 262 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -70 -88 -80 -80 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR cacute -ENCODING 263 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -70 -88 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Ccircumflex -ENCODING 264 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -70 -88 -80 -80 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR ccircumflex -ENCODING 265 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -70 -88 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Cdotaccent -ENCODING 266 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -70 -88 -80 -80 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR cdotaccent -ENCODING 267 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -88 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Ccaron -ENCODING 268 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -80 -80 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR ccaron -ENCODING 269 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -88 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Dcaron -ENCODING 270 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -A0 -40 -E0 -90 -88 -88 -88 -88 -90 -E0 -00 -00 -ENDCHAR -STARTCHAR dcaron -ENCODING 271 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -08 -08 -78 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Dcroat -ENCODING 272 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -90 -88 -E8 -88 -88 -90 -E0 -00 -00 -ENDCHAR -STARTCHAR dcroat -ENCODING 273 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -3C -08 -78 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Emacron -ENCODING 274 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR emacron -ENCODING 275 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR Ebreve -ENCODING 276 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR ebreve -ENCODING 277 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR Edotaccent -ENCODING 278 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR edotaccent -ENCODING 279 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR Eogonek -ENCODING 280 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -F0 -80 -80 -80 -F8 -10 -0C -ENDCHAR -STARTCHAR eogonek -ENCODING 281 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -F8 -80 -80 -78 -20 -18 -ENDCHAR -STARTCHAR Ecaron -ENCODING 282 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR ecaron -ENCODING 283 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR Gcircumflex -ENCODING 284 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -70 -88 -80 -80 -B8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR gcircumflex -ENCODING 285 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR Gbreve -ENCODING 286 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -80 -80 -B8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR gbreve -ENCODING 287 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR Gdotaccent -ENCODING 288 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -70 -88 -80 -80 -B8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR gdotaccent -ENCODING 289 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR Gcommaaccent -ENCODING 290 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -80 -B8 -88 -88 -70 -20 -40 -ENDCHAR -STARTCHAR gcommaaccent -ENCODING 291 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR Hcircumflex -ENCODING 292 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -88 -88 -88 -F8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR hcircumflex -ENCODING 293 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -80 -80 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Hbar -ENCODING 294 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -48 -FC -48 -78 -48 -48 -48 -48 -00 -00 -ENDCHAR -STARTCHAR hbar -ENCODING 295 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -F0 -40 -70 -48 -48 -48 -48 -00 -00 -ENDCHAR -STARTCHAR Itilde -ENCODING 296 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR itilde -ENCODING 297 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Imacron -ENCODING 298 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR imacron -ENCODING 299 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Ibreve -ENCODING 300 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR ibreve -ENCODING 301 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Iogonek -ENCODING 302 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -20 -20 -20 -20 -20 -20 -70 -20 -18 -ENDCHAR -STARTCHAR iogonek -ENCODING 303 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -00 -60 -20 -20 -20 -20 -70 -20 -18 -ENDCHAR -STARTCHAR Idotaccent -ENCODING 304 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR dotlessi -ENCODING 305 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR IJ -ENCODING 306 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -88 -A8 -A8 -90 -00 -00 -ENDCHAR -STARTCHAR ij -ENCODING 307 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -88 -88 -00 -98 -88 -88 -88 -88 -88 -28 -10 -ENDCHAR -STARTCHAR Jcircumflex -ENCODING 308 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -28 -38 -10 -10 -10 -10 -90 -90 -60 -00 -00 -ENDCHAR -STARTCHAR jcircumflex -ENCODING 309 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -14 -18 -08 -08 -08 -08 -08 -48 -30 -ENDCHAR -STARTCHAR Kcommaaccent -ENCODING 310 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -90 -A0 -C0 -C0 -A0 -90 -A8 -20 -40 -ENDCHAR -STARTCHAR kcommaaccent -ENCODING 311 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -48 -50 -60 -60 -50 -68 -20 -40 -ENDCHAR -STARTCHAR kgreenlandic -ENCODING 312 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -48 -50 -60 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR Lacute -ENCODING 313 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -40 -80 -80 -80 -80 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR lacute -ENCODING 314 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -60 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Lcommaaccent -ENCODING 315 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -80 -80 -80 -80 -80 -F8 -20 -40 -ENDCHAR -STARTCHAR lcommaaccent -ENCODING 316 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -20 -20 -20 -20 -20 -20 -70 -20 -40 -ENDCHAR -STARTCHAR Lcaron -ENCODING 317 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -80 -80 -80 -80 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR lcaron -ENCODING 318 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -60 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Ldot -ENCODING 319 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -80 -90 -90 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR ldot -ENCODING 320 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -20 -20 -24 -24 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Lslash -ENCODING 321 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -40 -60 -C0 -40 -40 -7C -00 -00 -ENDCHAR -STARTCHAR lslash -ENCODING 322 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -20 -20 -30 -60 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Nacute -ENCODING 323 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -88 -88 -C8 -A8 -98 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR nacute -ENCODING 324 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Ncommaaccent -ENCODING 325 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -C8 -A8 -98 -88 -88 -A8 -20 -40 -ENDCHAR -STARTCHAR ncommaaccent -ENCODING 326 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -A8 -20 -40 -ENDCHAR -STARTCHAR Ncaron -ENCODING 327 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -88 -88 -C8 -A8 -98 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR ncaron -ENCODING 328 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR napostrophe -ENCODING 329 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -40 -40 -80 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Eng -ENCODING 330 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -C8 -A8 -98 -88 -88 -88 -08 -10 -ENDCHAR -STARTCHAR eng -ENCODING 331 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -88 -08 -10 -ENDCHAR -STARTCHAR Omacron -ENCODING 332 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR omacron -ENCODING 333 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Obreve -ENCODING 334 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR obreve -ENCODING 335 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Ohungarumlaut -ENCODING 336 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR ohungarumlaut -ENCODING 337 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR OE -ENCODING 338 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -7C -90 -90 -9C -90 -90 -90 -7C -00 -00 -ENDCHAR -STARTCHAR oe -ENCODING 339 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -A8 -A8 -B0 -A0 -78 -00 -00 -ENDCHAR -STARTCHAR Racute -ENCODING 340 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -F0 -88 -88 -88 -F0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR racute -ENCODING 341 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -B8 -C0 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR Rcommaaccent -ENCODING 342 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -88 -F0 -A0 -90 -A8 -20 -40 -ENDCHAR -STARTCHAR rcommaaccent -ENCODING 343 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -B8 -C0 -80 -80 -80 -C0 -40 -80 -ENDCHAR -STARTCHAR Rcaron -ENCODING 344 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -F0 -88 -88 -88 -F0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR rcaron -ENCODING 345 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -B8 -C0 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR Sacute -ENCODING 346 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -70 -88 -80 -70 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR sacute -ENCODING 347 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -78 -80 -70 -08 -08 -F0 -00 -00 -ENDCHAR -STARTCHAR Scircumflex -ENCODING 348 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -70 -88 -80 -70 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR scircumflex -ENCODING 349 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -78 -80 -70 -08 -08 -F0 -00 -00 -ENDCHAR -STARTCHAR Scedilla -ENCODING 350 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -70 -08 -08 -88 -70 -20 -40 -ENDCHAR -STARTCHAR scedilla -ENCODING 351 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -80 -70 -08 -08 -F0 -20 -40 -ENDCHAR -STARTCHAR Scaron -ENCODING 352 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -80 -70 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR scaron -ENCODING 353 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -78 -80 -70 -08 -08 -F0 -00 -00 -ENDCHAR -STARTCHAR Tcedilla -ENCODING 354 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -20 -20 -20 -20 -20 -30 -10 -20 -ENDCHAR -STARTCHAR tcedilla -ENCODING 355 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -20 -20 -20 -20 -18 -10 -20 -ENDCHAR -STARTCHAR Tcaron -ENCODING 356 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -F8 -20 -20 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR tcaron -ENCODING 357 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -20 -20 -70 -20 -20 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR Tbar -ENCODING 358 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -20 -70 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR tbar -ENCODING 359 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -20 -70 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR Utilde -ENCODING 360 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR utilde -ENCODING 361 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Umacron -ENCODING 362 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR umacron -ENCODING 363 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Ubreve -ENCODING 364 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR ubreve -ENCODING 365 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Uring -ENCODING 366 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -A8 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uring -ENCODING 367 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -A8 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Uhungarumlaut -ENCODING 368 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uhungarumlaut -ENCODING 369 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Uogonek -ENCODING 370 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -88 -88 -88 -70 -20 -18 -ENDCHAR -STARTCHAR uogonek -ENCODING 371 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -78 -10 -0C -ENDCHAR -STARTCHAR Wcircumflex -ENCODING 372 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -88 -88 -88 -88 -A8 -A8 -D8 -88 -00 -00 -ENDCHAR -STARTCHAR wcircumflex -ENCODING 373 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -88 -88 -A8 -A8 -A8 -70 -00 -00 -ENDCHAR -STARTCHAR Ycircumflex -ENCODING 374 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR ycircumflex -ENCODING 375 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR Ydieresis -ENCODING 376 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR Zacute -ENCODING 377 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -F8 -08 -10 -20 -40 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR zacute -ENCODING 378 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -F8 -10 -20 -40 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Zdotaccent -ENCODING 379 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -F8 -08 -10 -20 -40 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR zdotaccent -ENCODING 380 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -F8 -10 -20 -40 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Zcaron -ENCODING 381 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -F8 -08 -10 -20 -40 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR zcaron -ENCODING 382 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -F8 -10 -20 -40 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR longs -ENCODING 383 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -18 -20 -20 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni0186 -ENCODING 390 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -08 -08 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni018E -ENCODING 398 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -08 -08 -78 -08 -08 -08 -F8 -00 -00 -ENDCHAR -STARTCHAR Schwa -ENCODING 399 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -08 -08 -F8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni0190 -ENCODING 400 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -60 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR florin -ENCODING 402 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -28 -20 -70 -20 -20 -20 -20 -A0 -40 -ENDCHAR -STARTCHAR uni019D -ENCODING 413 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -C8 -A8 -98 -88 -88 -C8 -40 -80 -ENDCHAR -STARTCHAR uni019E -ENCODING 414 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -88 -08 -08 -ENDCHAR -STARTCHAR uni01B5 -ENCODING 437 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -08 -10 -F8 -20 -40 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR uni01B6 -ENCODING 438 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -10 -78 -20 -40 -F8 -00 -00 -ENDCHAR -STARTCHAR Ezh -ENCODING 439 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -08 -10 -30 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni01CD -ENCODING 461 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni01CE -ENCODING 462 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR uni01CF -ENCODING 463 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR uni01D0 -ENCODING 464 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR uni01D1 -ENCODING 465 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni01D2 -ENCODING 466 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni01D3 -ENCODING 467 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni01D4 -ENCODING 468 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -ENDCHAR -STARTCHAR uni01DC -ENCODING 476 -SWIDTH 1000 0 -DWIDTH 6 0 -BBX 5 10 0 0 -BITMAP -40 -20 -88 -00 -88 -88 -88 -88 -88 -78 -ENDCHAR -STARTCHAR uni01E2 -ENCODING 482 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -78 -00 -7C -90 -90 -FC -90 -90 -90 -9C -00 -00 -ENDCHAR -STARTCHAR uni01E3 -ENCODING 483 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -70 -28 -68 -B0 -A0 -78 -00 -00 -ENDCHAR -STARTCHAR uni01E4 -ENCODING 484 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -80 -80 -B8 -88 -9C -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni01E5 -ENCODING 485 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -88 -9C -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR Gcaron -ENCODING 486 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -80 -80 -B8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR gcaron -ENCODING 487 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR uni01E8 -ENCODING 488 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -88 -90 -A0 -C0 -C0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR uni01E9 -ENCODING 489 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -40 -40 -48 -50 -60 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR uni01EA -ENCODING 490 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -88 -70 -20 -18 -ENDCHAR -STARTCHAR uni01EB -ENCODING 491 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -70 -20 -18 -ENDCHAR -STARTCHAR uni01EC -ENCODING 492 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -70 -88 -88 -88 -88 -88 -88 -70 -20 -18 -ENDCHAR -STARTCHAR uni01ED -ENCODING 493 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -70 -88 -88 -88 -88 -70 -20 -18 -ENDCHAR -STARTCHAR uni01EE -ENCODING 494 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -F8 -08 -10 -30 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni01EF -ENCODING 495 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -F8 -08 -10 -30 -08 -08 -88 -70 -ENDCHAR -STARTCHAR uni01F0 -ENCODING 496 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -14 -08 -18 -08 -08 -08 -08 -08 -48 -30 -ENDCHAR -STARTCHAR uni01F4 -ENCODING 500 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -70 -88 -80 -80 -B8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni01F5 -ENCODING 501 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR AEacute -ENCODING 508 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -10 -7C -90 -90 -FC -90 -90 -90 -9C -00 -00 -ENDCHAR -STARTCHAR aeacute -ENCODING 509 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -70 -28 -68 -B0 -A0 -78 -00 -00 -ENDCHAR -STARTCHAR Oslashacute -ENCODING 510 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -74 -88 -98 -A8 -C8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR oslashacute -ENCODING 511 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -74 -98 -A8 -C8 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Scommaaccent -ENCODING 536 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -70 -08 -08 -88 -70 -20 -40 -ENDCHAR -STARTCHAR scommaaccent -ENCODING 537 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -80 -70 -08 -08 -F0 -20 -40 -ENDCHAR -STARTCHAR Tcommaaccent -ENCODING 538 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -20 -20 -20 -20 -20 -30 -10 -20 -ENDCHAR -STARTCHAR tcommaaccent -ENCODING 539 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -20 -20 -20 -20 -18 -08 -10 -ENDCHAR -STARTCHAR uni0232 -ENCODING 562 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni0233 -ENCODING 563 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR dotlessj -ENCODING 567 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -18 -08 -08 -08 -08 -08 -48 -30 -ENDCHAR -STARTCHAR uni0254 -ENCODING 596 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni0258 -ENCODING 600 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -F8 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR schwa -ENCODING 601 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -08 -F8 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni025B -ENCODING 603 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -60 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni0272 -ENCODING 626 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -C8 -40 -80 -ENDCHAR -STARTCHAR ezh -ENCODING 658 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -08 -10 -30 -08 -08 -88 -70 -ENDCHAR -STARTCHAR commaturnedmod -ENCODING 699 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR afii57929 -ENCODING 700 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR afii64937 -ENCODING 701 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -10 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR circumflex -ENCODING 710 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR caron -ENCODING 711 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR breve -ENCODING 728 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR dotaccent -ENCODING 729 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR ogonek -ENCODING 731 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -10 -20 -18 -ENDCHAR -STARTCHAR tilde -ENCODING 732 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR hungarumlaut -ENCODING 733 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR gravecomb -ENCODING 768 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR acutecomb -ENCODING 769 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni0302 -ENCODING 770 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR tildecomb -ENCODING 771 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni0304 -ENCODING 772 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni0305 -ENCODING 773 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -F8 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni0306 -ENCODING 774 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni0307 -ENCODING 775 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni0308 -ENCODING 776 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni030A -ENCODING 778 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni030B -ENCODING 779 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni030C -ENCODING 780 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni0329 -ENCODING 809 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -20 -20 -ENDCHAR -STARTCHAR tonos -ENCODING 900 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR dieresistonos -ENCODING 901 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -50 -50 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR Alphatonos -ENCODING 902 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR anoteleia -ENCODING 903 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -20 -20 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR Epsilontonos -ENCODING 904 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Etatonos -ENCODING 905 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -88 -88 -88 -F8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Iotatonos -ENCODING 906 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Omicrontonos -ENCODING 908 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Upsilontonos -ENCODING 910 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR Omegatonos -ENCODING 911 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -70 -88 -88 -88 -88 -88 -50 -D8 -00 -00 -ENDCHAR -STARTCHAR iotadieresistonos -ENCODING 912 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -50 -50 -60 -20 -20 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR Alpha -ENCODING 913 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Beta -ENCODING 914 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -F0 -88 -88 -88 -F0 -00 -00 -ENDCHAR -STARTCHAR Gamma -ENCODING 915 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -80 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR Delta -ENCODING 916 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -50 -50 -88 -88 -88 -F8 -00 -00 -ENDCHAR -STARTCHAR Epsilon -ENCODING 917 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Zeta -ENCODING 918 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -08 -10 -20 -40 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Eta -ENCODING 919 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -F8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Theta -ENCODING 920 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -A8 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Iota -ENCODING 921 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Kappa -ENCODING 922 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -90 -A0 -C0 -C0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR Lambda -ENCODING 923 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -50 -50 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Mu -ENCODING 924 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -D8 -A8 -A8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Nu -ENCODING 925 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -C8 -A8 -98 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Xi -ENCODING 926 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -00 -00 -70 -00 -00 -00 -F8 -00 -00 -ENDCHAR -STARTCHAR Omicron -ENCODING 927 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Pi -ENCODING 928 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -88 -88 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Rho -ENCODING 929 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -88 -F0 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR Sigma -ENCODING 931 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -40 -20 -10 -10 -20 -40 -F8 -00 -00 -ENDCHAR -STARTCHAR Tau -ENCODING 932 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -20 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR Upsilon -ENCODING 933 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR Phi -ENCODING 934 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -A8 -A8 -A8 -A8 -70 -20 -00 -00 -ENDCHAR -STARTCHAR Chi -ENCODING 935 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -20 -20 -50 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Psi -ENCODING 936 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -A8 -A8 -A8 -A8 -A8 -70 -20 -20 -00 -00 -ENDCHAR -STARTCHAR Omega -ENCODING 937 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -50 -D8 -00 -00 -ENDCHAR -STARTCHAR Iotadieresis -ENCODING 938 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Upsilondieresis -ENCODING 939 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR alphatonos -ENCODING 940 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -68 -90 -90 -90 -90 -68 -00 -00 -ENDCHAR -STARTCHAR epsilontonos -ENCODING 941 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -70 -88 -60 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR etatonos -ENCODING 942 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -F0 -88 -88 -88 -88 -88 -08 -08 -ENDCHAR -STARTCHAR iotatonos -ENCODING 943 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -60 -20 -20 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR upsilondieresistonos -ENCODING 944 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -50 -50 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR alpha -ENCODING 945 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -68 -90 -90 -90 -90 -68 -00 -00 -ENDCHAR -STARTCHAR beta -ENCODING 946 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -90 -90 -F0 -88 -88 -88 -F0 -80 -80 -ENDCHAR -STARTCHAR gamma -ENCODING 947 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -50 -50 -20 -20 -20 -ENDCHAR -STARTCHAR delta -ENCODING 948 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -40 -20 -70 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR epsilon -ENCODING 949 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -60 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR zeta -ENCODING 950 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -10 -20 -40 -80 -80 -80 -70 -08 -10 -ENDCHAR -STARTCHAR eta -ENCODING 951 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -88 -08 -08 -ENDCHAR -STARTCHAR theta -ENCODING 952 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -30 -48 -48 -78 -48 -48 -48 -30 -00 -00 -ENDCHAR -STARTCHAR iota -ENCODING 953 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -60 -20 -20 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR kappa -ENCODING 954 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -48 -50 -60 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR lambda -ENCODING 955 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -20 -20 -50 -50 -88 -88 -00 -00 -ENDCHAR -STARTCHAR mugreek -ENCODING 956 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -98 -E8 -80 -80 -ENDCHAR -STARTCHAR nu -ENCODING 957 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -50 -50 -20 -20 -00 -00 -ENDCHAR -STARTCHAR xi -ENCODING 958 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -80 -80 -70 -80 -80 -80 -70 -08 -10 -ENDCHAR -STARTCHAR omicron -ENCODING 959 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR pi -ENCODING 960 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR rho -ENCODING 961 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -F0 -80 -80 -ENDCHAR -STARTCHAR sigma1 -ENCODING 962 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -80 -80 -80 -70 -08 -10 -ENDCHAR -STARTCHAR sigma -ENCODING 963 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -90 -90 -90 -90 -60 -00 -00 -ENDCHAR -STARTCHAR tau -ENCODING 964 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -20 -20 -20 -20 -10 -00 -00 -ENDCHAR -STARTCHAR upsilon -ENCODING 965 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR phi -ENCODING 966 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -90 -A8 -A8 -A8 -A8 -70 -20 -20 -ENDCHAR -STARTCHAR chi -ENCODING 967 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -50 -20 -20 -50 -88 -88 -ENDCHAR -STARTCHAR psi -ENCODING 968 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -A8 -A8 -A8 -A8 -A8 -70 -20 -20 -ENDCHAR -STARTCHAR omega -ENCODING 969 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -50 -88 -A8 -A8 -A8 -50 -00 -00 -ENDCHAR -STARTCHAR iotadieresis -ENCODING 970 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -60 -20 -20 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR upsilondieresis -ENCODING 971 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR omicrontonos -ENCODING 972 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR upsilontonos -ENCODING 973 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR omegatonos -ENCODING 974 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -50 -88 -A8 -A8 -A8 -50 -00 -00 -ENDCHAR -STARTCHAR theta1 -ENCODING 977 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -30 -48 -48 -3C -08 -C8 -48 -30 -00 -00 -ENDCHAR -STARTCHAR phi1 -ENCODING 981 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -70 -A8 -A8 -A8 -A8 -70 -20 -00 -ENDCHAR -STARTCHAR uni03F0 -ENCODING 1008 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -C4 -28 -10 -20 -50 -8C -00 -00 -ENDCHAR -STARTCHAR uni03F1 -ENCODING 1009 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -F0 -80 -70 -ENDCHAR -STARTCHAR uni03F2 -ENCODING 1010 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni03F3 -ENCODING 1011 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -08 -08 -00 -18 -08 -08 -08 -08 -08 -48 -30 -ENDCHAR -STARTCHAR uni03F4 -ENCODING 1012 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -F8 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni03F5 -ENCODING 1013 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -80 -F0 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR uni03F6 -ENCODING 1014 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -08 -78 -08 -08 -F0 -00 -00 -ENDCHAR -STARTCHAR uni0400 -ENCODING 1024 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR afii10023 -ENCODING 1025 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR afii10051 -ENCODING 1026 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -40 -40 -70 -48 -48 -48 -48 -08 -10 -ENDCHAR -STARTCHAR afii10052 -ENCODING 1027 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -F8 -80 -80 -80 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR afii10053 -ENCODING 1028 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -F0 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10054 -ENCODING 1029 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -70 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10055 -ENCODING 1030 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR afii10056 -ENCODING 1031 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR afii10057 -ENCODING 1032 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -38 -10 -10 -10 -10 -90 -90 -60 -00 -00 -ENDCHAR -STARTCHAR afii10058 -ENCODING 1033 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -A0 -B0 -A8 -A8 -A8 -A8 -B0 -00 -00 -ENDCHAR -STARTCHAR afii10059 -ENCODING 1034 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -A0 -A0 -B0 -E8 -A8 -A8 -A8 -B0 -00 -00 -ENDCHAR -STARTCHAR afii10060 -ENCODING 1035 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -40 -40 -70 -48 -48 -48 -48 -00 -00 -ENDCHAR -STARTCHAR afii10061 -ENCODING 1036 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -88 -90 -A0 -C0 -C0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR uni040D -ENCODING 1037 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -88 -88 -98 -A8 -C8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10062 -ENCODING 1038 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -88 -88 -88 -88 -78 -08 -08 -70 -00 -00 -ENDCHAR -STARTCHAR afii10145 -ENCODING 1039 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -88 -88 -88 -F8 -20 -20 -ENDCHAR -STARTCHAR afii10017 -ENCODING 1040 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10018 -ENCODING 1041 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -80 -80 -F0 -88 -88 -88 -F0 -00 -00 -ENDCHAR -STARTCHAR afii10019 -ENCODING 1042 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -F0 -88 -88 -88 -F0 -00 -00 -ENDCHAR -STARTCHAR afii10020 -ENCODING 1043 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -80 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR afii10021 -ENCODING 1044 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -38 -48 -48 -48 -48 -48 -48 -FC -84 -00 -ENDCHAR -STARTCHAR afii10022 -ENCODING 1045 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR afii10024 -ENCODING 1046 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -A8 -A8 -A8 -70 -70 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR afii10025 -ENCODING 1047 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -08 -30 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10026 -ENCODING 1048 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -98 -A8 -C8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10027 -ENCODING 1049 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -88 -88 -98 -A8 -C8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10028 -ENCODING 1050 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -90 -A0 -C0 -C0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR afii10029 -ENCODING 1051 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -38 -48 -48 -48 -48 -48 -48 -88 -00 -00 -ENDCHAR -STARTCHAR afii10030 -ENCODING 1052 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -D8 -A8 -A8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10031 -ENCODING 1053 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -F8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10032 -ENCODING 1054 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10033 -ENCODING 1055 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -88 -88 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10034 -ENCODING 1056 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -88 -F0 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR afii10035 -ENCODING 1057 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -80 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10036 -ENCODING 1058 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -20 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR afii10037 -ENCODING 1059 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -78 -08 -08 -70 -00 -00 -ENDCHAR -STARTCHAR afii10038 -ENCODING 1060 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -70 -A8 -A8 -A8 -A8 -A8 -A8 -70 -20 -00 -ENDCHAR -STARTCHAR afii10039 -ENCODING 1061 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -20 -20 -50 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10040 -ENCODING 1062 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -88 -88 -88 -7C -04 -04 -ENDCHAR -STARTCHAR afii10041 -ENCODING 1063 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -78 -08 -08 -08 -00 -00 -ENDCHAR -STARTCHAR afii10042 -ENCODING 1064 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -A8 -A8 -A8 -A8 -A8 -A8 -A8 -78 -00 -00 -ENDCHAR -STARTCHAR afii10043 -ENCODING 1065 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -A8 -A8 -A8 -A8 -A8 -A8 -A8 -7C -04 -04 -ENDCHAR -STARTCHAR afii10044 -ENCODING 1066 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -C0 -40 -70 -48 -48 -48 -48 -70 -00 -00 -ENDCHAR -STARTCHAR afii10045 -ENCODING 1067 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -C8 -A8 -A8 -A8 -A8 -C8 -00 -00 -ENDCHAR -STARTCHAR afii10046 -ENCODING 1068 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -70 -48 -48 -48 -48 -70 -00 -00 -ENDCHAR -STARTCHAR afii10047 -ENCODING 1069 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -08 -38 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10048 -ENCODING 1070 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -90 -A8 -A8 -A8 -E8 -A8 -A8 -90 -00 -00 -ENDCHAR -STARTCHAR afii10049 -ENCODING 1071 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -88 -88 -88 -78 -28 -48 -88 -00 -00 -ENDCHAR -STARTCHAR afii10065 -ENCODING 1072 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR afii10066 -ENCODING 1073 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -80 -F0 -88 -88 -88 -88 -F0 -00 -00 -ENDCHAR -STARTCHAR afii10067 -ENCODING 1074 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -90 -90 -F0 -88 -88 -88 -F0 -00 -00 -ENDCHAR -STARTCHAR afii10068 -ENCODING 1075 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -80 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR afii10069 -ENCODING 1076 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR afii10070 -ENCODING 1077 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR afii10072 -ENCODING 1078 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -A8 -A8 -70 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR afii10073 -ENCODING 1079 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -30 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10074 -ENCODING 1080 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR afii10075 -ENCODING 1081 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR afii10076 -ENCODING 1082 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -48 -50 -60 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR afii10077 -ENCODING 1083 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -38 -48 -48 -48 -48 -88 -00 -00 -ENDCHAR -STARTCHAR afii10078 -ENCODING 1084 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -D8 -A8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10079 -ENCODING 1085 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10080 -ENCODING 1086 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10081 -ENCODING 1087 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10082 -ENCODING 1088 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -F0 -80 -80 -ENDCHAR -STARTCHAR afii10083 -ENCODING 1089 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10084 -ENCODING 1090 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR afii10085 -ENCODING 1091 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR afii10086 -ENCODING 1092 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -70 -A8 -A8 -A8 -A8 -70 -20 -00 -ENDCHAR -STARTCHAR afii10087 -ENCODING 1093 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -50 -20 -20 -50 -88 -00 -00 -ENDCHAR -STARTCHAR afii10088 -ENCODING 1094 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -7C -04 -04 -ENDCHAR -STARTCHAR afii10089 -ENCODING 1095 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -78 -08 -08 -00 -00 -ENDCHAR -STARTCHAR afii10090 -ENCODING 1096 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -A8 -A8 -A8 -A8 -A8 -78 -00 -00 -ENDCHAR -STARTCHAR afii10091 -ENCODING 1097 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -A8 -A8 -A8 -A8 -A8 -7C -04 -04 -ENDCHAR -STARTCHAR afii10092 -ENCODING 1098 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -C0 -40 -70 -48 -48 -70 -00 -00 -ENDCHAR -STARTCHAR afii10093 -ENCODING 1099 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -C8 -A8 -A8 -C8 -00 -00 -ENDCHAR -STARTCHAR afii10094 -ENCODING 1100 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -40 -40 -70 -48 -48 -70 -00 -00 -ENDCHAR -STARTCHAR afii10095 -ENCODING 1101 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -38 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10096 -ENCODING 1102 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -90 -A8 -A8 -E8 -A8 -90 -00 -00 -ENDCHAR -STARTCHAR afii10097 -ENCODING 1103 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -88 -88 -78 -28 -48 -00 -00 -ENDCHAR -STARTCHAR uni0450 -ENCODING 1104 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR afii10071 -ENCODING 1105 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR afii10099 -ENCODING 1106 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -F0 -40 -70 -48 -48 -48 -48 -08 -10 -ENDCHAR -STARTCHAR afii10100 -ENCODING 1107 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -F8 -80 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR afii10101 -ENCODING 1108 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -E0 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10102 -ENCODING 1109 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -80 -70 -08 -08 -F0 -00 -00 -ENDCHAR -STARTCHAR afii10103 -ENCODING 1110 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -00 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR afii10104 -ENCODING 1111 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR afii10105 -ENCODING 1112 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -08 -08 -00 -18 -08 -08 -08 -08 -08 -48 -30 -ENDCHAR -STARTCHAR afii10106 -ENCODING 1113 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -60 -A0 -B0 -A8 -A8 -B0 -00 -00 -ENDCHAR -STARTCHAR afii10107 -ENCODING 1114 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -A0 -A0 -F0 -A8 -A8 -B0 -00 -00 -ENDCHAR -STARTCHAR afii10108 -ENCODING 1115 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -F0 -40 -70 -48 -48 -48 -48 -00 -00 -ENDCHAR -STARTCHAR afii10109 -ENCODING 1116 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -10 -48 -50 -60 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR uni045D -ENCODING 1117 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR afii10110 -ENCODING 1118 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR afii10193 -ENCODING 1119 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -F8 -20 -20 -ENDCHAR -STARTCHAR afii10146 -ENCODING 1122 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -F0 -40 -70 -48 -48 -48 -70 -00 -00 -ENDCHAR -STARTCHAR afii10194 -ENCODING 1123 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -E0 -40 -70 -48 -48 -70 -00 -00 -ENDCHAR -STARTCHAR uni046A -ENCODING 1130 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -88 -50 -20 -70 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR uni046B -ENCODING 1131 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -50 -20 -70 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR afii10050 -ENCODING 1168 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -F8 -80 -80 -80 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR afii10098 -ENCODING 1169 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -08 -F8 -80 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR uni0492 -ENCODING 1170 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -7C -40 -40 -40 -F0 -40 -40 -40 -00 -00 -ENDCHAR -STARTCHAR uni0493 -ENCODING 1171 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -40 -40 -F0 -40 -40 -00 -00 -ENDCHAR -STARTCHAR uni0494 -ENCODING 1172 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -80 -F0 -88 -88 -88 -08 -10 -ENDCHAR -STARTCHAR uni0495 -ENCODING 1173 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -80 -80 -E0 -90 -90 -10 -20 -ENDCHAR -STARTCHAR uni0496 -ENCODING 1174 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -A8 -A8 -A8 -70 -70 -A8 -A8 -AC -04 -04 -ENDCHAR -STARTCHAR uni0497 -ENCODING 1175 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -A8 -A8 -70 -A8 -A8 -AC -04 -04 -ENDCHAR -STARTCHAR uni0498 -ENCODING 1176 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -08 -30 -08 -08 -88 -70 -20 -20 -ENDCHAR -STARTCHAR uni0499 -ENCODING 1177 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -30 -08 -88 -70 -20 -20 -ENDCHAR -STARTCHAR uni049A -ENCODING 1178 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -90 -A0 -C0 -C0 -A0 -90 -8C -04 -04 -ENDCHAR -STARTCHAR uni049B -ENCODING 1179 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -48 -50 -60 -60 -50 -4C -04 -04 -ENDCHAR -STARTCHAR uni049C -ENCODING 1180 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -84 -A8 -B0 -E0 -E0 -B0 -A8 -84 -00 -00 -ENDCHAR -STARTCHAR uni049D -ENCODING 1181 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -A8 -B0 -E0 -E0 -B0 -A8 -00 -00 -ENDCHAR -STARTCHAR uni04A0 -ENCODING 1184 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -C4 -48 -50 -60 -60 -50 -48 -44 -00 -00 -ENDCHAR -STARTCHAR uni04A1 -ENCODING 1185 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -C8 -50 -60 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR uni04A2 -ENCODING 1186 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -F8 -88 -88 -88 -8C -04 -04 -ENDCHAR -STARTCHAR uni04A3 -ENCODING 1187 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -F8 -88 -88 -8C -04 -04 -ENDCHAR -STARTCHAR uni04A4 -ENCODING 1188 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -9C -90 -90 -F0 -90 -90 -90 -90 -00 -00 -ENDCHAR -STARTCHAR uni04A5 -ENCODING 1189 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -9C -90 -F0 -90 -90 -90 -00 -00 -ENDCHAR -STARTCHAR uni04AA -ENCODING 1194 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -80 -80 -80 -88 -70 -20 -20 -ENDCHAR -STARTCHAR uni04AB -ENCODING 1195 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -80 -80 -88 -70 -20 -20 -ENDCHAR -STARTCHAR uni04AE -ENCODING 1198 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni04AF -ENCODING 1199 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -50 -50 -20 -20 -20 -ENDCHAR -STARTCHAR uni04B0 -ENCODING 1200 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -50 -20 -70 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni04B1 -ENCODING 1201 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -50 -50 -20 -70 -20 -ENDCHAR -STARTCHAR uni04B2 -ENCODING 1202 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -20 -20 -50 -88 -8C -04 -04 -ENDCHAR -STARTCHAR uni04B3 -ENCODING 1203 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -50 -20 -20 -50 -8C -04 -04 -ENDCHAR -STARTCHAR uni04B6 -ENCODING 1206 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -78 -08 -08 -0C -04 -04 -ENDCHAR -STARTCHAR uni04B7 -ENCODING 1207 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -78 -08 -0C -04 -04 -ENDCHAR -STARTCHAR uni04B8 -ENCODING 1208 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -A8 -A8 -78 -28 -28 -08 -00 -00 -ENDCHAR -STARTCHAR uni04B9 -ENCODING 1209 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -A8 -A8 -78 -28 -08 -00 -00 -ENDCHAR -STARTCHAR uni04BA -ENCODING 1210 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -80 -F0 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni04BB -ENCODING 1211 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -80 -80 -F0 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni04C0 -ENCODING 1216 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR uni04C1 -ENCODING 1217 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -A8 -A8 -A8 -70 -70 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR uni04C2 -ENCODING 1218 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -A8 -A8 -70 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR uni04CF -ENCODING 1231 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR uni04D0 -ENCODING 1232 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni04D1 -ENCODING 1233 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR uni04D2 -ENCODING 1234 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni04D3 -ENCODING 1235 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR uni04D4 -ENCODING 1236 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -7C -90 -90 -FC -90 -90 -90 -9C -00 -00 -ENDCHAR -STARTCHAR uni04D5 -ENCODING 1237 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -28 -68 -B0 -A0 -78 -00 -00 -ENDCHAR -STARTCHAR uni04D6 -ENCODING 1238 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR uni04D7 -ENCODING 1239 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR uni04D8 -ENCODING 1240 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -08 -08 -F8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10846 -ENCODING 1241 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -08 -F8 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04DA -ENCODING 1242 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -08 -08 -F8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04DB -ENCODING 1243 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -08 -F8 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04DC -ENCODING 1244 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -A8 -A8 -A8 -70 -70 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR uni04DD -ENCODING 1245 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -A8 -A8 -70 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR uni04DE -ENCODING 1246 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -08 -30 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04DF -ENCODING 1247 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -30 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04E2 -ENCODING 1250 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -88 -88 -98 -A8 -C8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni04E3 -ENCODING 1251 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR uni04E4 -ENCODING 1252 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -88 -88 -98 -A8 -C8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni04E5 -ENCODING 1253 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR uni04E6 -ENCODING 1254 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04E7 -ENCODING 1255 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04E8 -ENCODING 1256 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -F8 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04E9 -ENCODING 1257 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -F8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04EA -ENCODING 1258 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -88 -88 -F8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04EB -ENCODING 1259 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -F8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04EC -ENCODING 1260 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -08 -38 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04ED -ENCODING 1261 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -38 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04EE -ENCODING 1262 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -88 -88 -88 -88 -78 -08 -08 -70 -00 -00 -ENDCHAR -STARTCHAR uni04EF -ENCODING 1263 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR uni04F0 -ENCODING 1264 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -88 -88 -88 -88 -78 -08 -08 -70 -00 -00 -ENDCHAR -STARTCHAR uni04F1 -ENCODING 1265 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR uni04F2 -ENCODING 1266 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -88 -88 -88 -88 -78 -08 -08 -70 -00 -00 -ENDCHAR -STARTCHAR uni04F3 -ENCODING 1267 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR uni04F4 -ENCODING 1268 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -88 -88 -88 -88 -78 -08 -08 -08 -00 -00 -ENDCHAR -STARTCHAR uni04F5 -ENCODING 1269 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -88 -88 -88 -78 -08 -08 -00 -00 -ENDCHAR -STARTCHAR uni04F8 -ENCODING 1272 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -88 -88 -C8 -A8 -A8 -A8 -A8 -C8 -00 -00 -ENDCHAR -STARTCHAR uni04F9 -ENCODING 1273 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -88 -88 -C8 -A8 -A8 -C8 -00 -00 -ENDCHAR -STARTCHAR uni1E0C -ENCODING 7692 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -90 -88 -88 -88 -88 -90 -E0 -20 -20 -ENDCHAR -STARTCHAR uni1E0D -ENCODING 7693 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -08 -78 -88 -88 -88 -88 -78 -20 -20 -ENDCHAR -STARTCHAR Klinebelow -ENCODING 7732 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -90 -A0 -C0 -C0 -A0 -90 -88 -00 -70 -ENDCHAR -STARTCHAR klinebelow -ENCODING 7733 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -48 -50 -60 -60 -50 -48 -00 -70 -ENDCHAR -STARTCHAR uni1E36 -ENCODING 7734 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -80 -80 -80 -80 -80 -F8 -20 -20 -ENDCHAR -STARTCHAR uni1E37 -ENCODING 7735 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -20 -20 -20 -20 -20 -20 -70 -20 -20 -ENDCHAR -STARTCHAR uni1E40 -ENCODING 7744 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -88 -D8 -A8 -A8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni1E41 -ENCODING 7745 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -F0 -A8 -A8 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR uni1E42 -ENCODING 7746 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -D8 -A8 -A8 -88 -88 -88 -88 -20 -20 -ENDCHAR -STARTCHAR uni1E43 -ENCODING 7747 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -A8 -A8 -A8 -A8 -A8 -10 -10 -ENDCHAR -STARTCHAR uni1E44 -ENCODING 7748 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -88 -88 -C8 -A8 -98 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni1E45 -ENCODING 7749 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni1E46 -ENCODING 7750 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -C8 -A8 -98 -88 -88 -88 -20 -20 -ENDCHAR -STARTCHAR uni1E47 -ENCODING 7751 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -88 -20 -20 -ENDCHAR -STARTCHAR uni1E6C -ENCODING 7788 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -20 -20 -20 -20 -20 -20 -10 -10 -ENDCHAR -STARTCHAR uni1E6D -ENCODING 7789 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -20 -20 -20 -20 -18 -10 -10 -ENDCHAR -STARTCHAR Edotbelow -ENCODING 7864 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -F0 -80 -80 -80 -F8 -20 -20 -ENDCHAR -STARTCHAR edotbelow -ENCODING 7865 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -F8 -80 -80 -78 -20 -20 -ENDCHAR -STARTCHAR Etilde -ENCODING 7868 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR etilde -ENCODING 7869 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR uni1ECA -ENCODING 7882 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -20 -20 -20 -20 -20 -20 -70 -20 -20 -ENDCHAR -STARTCHAR uni1ECB -ENCODING 7883 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -00 -60 -20 -20 -20 -20 -70 -20 -20 -ENDCHAR -STARTCHAR Odotbelow -ENCODING 7884 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -88 -70 -20 -20 -ENDCHAR -STARTCHAR odotbelow -ENCODING 7885 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -70 -20 -20 -ENDCHAR -STARTCHAR uni1EE4 -ENCODING 7908 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -88 -88 -88 -70 -20 -20 -ENDCHAR -STARTCHAR uni1EE5 -ENCODING 7909 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -78 -20 -20 -ENDCHAR -STARTCHAR Ytilde -ENCODING 7928 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR ytilde -ENCODING 7929 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR uni2000 -ENCODING 8192 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2001 -ENCODING 8193 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR enspace -ENCODING 8194 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2003 -ENCODING 8195 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2004 -ENCODING 8196 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2005 -ENCODING 8197 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2006 -ENCODING 8198 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2007 -ENCODING 8199 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2008 -ENCODING 8200 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2009 -ENCODING 8201 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni200A -ENCODING 8202 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni200B -ENCODING 8203 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR afii61664 -ENCODING 8204 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR afii301 -ENCODING 8205 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR afii299 -ENCODING 8206 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR afii300 -ENCODING 8207 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR hyphentwo -ENCODING 8208 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -78 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2011 -ENCODING 8209 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -78 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR figuredash -ENCODING 8210 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -F8 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR endash -ENCODING 8211 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -F8 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR emdash -ENCODING 8212 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -F8 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR afii00208 -ENCODING 8213 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -F8 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR dblverticalbar -ENCODING 8214 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -50 -50 -50 -50 -50 -50 -00 -00 -ENDCHAR -STARTCHAR underscoredbl -ENCODING 8215 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -F8 -00 -F8 -ENDCHAR -STARTCHAR quoteleft -ENCODING 8216 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -10 -20 -20 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR quoteright -ENCODING 8217 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -40 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR quotesinglbase -ENCODING 8218 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -20 -20 -40 -00 -ENDCHAR -STARTCHAR quotereversed -ENCODING 8219 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -10 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR quotedblleft -ENCODING 8220 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -28 -50 -50 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR quotedblright -ENCODING 8221 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -28 -28 -50 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR quotedblbase -ENCODING 8222 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -50 -50 -A0 -00 -ENDCHAR -STARTCHAR uni201F -ENCODING 8223 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -A0 -A0 -50 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR dagger -ENCODING 8224 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -20 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR daggerdbl -ENCODING 8225 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -20 -20 -20 -20 -70 -20 -00 -00 -ENDCHAR -STARTCHAR bullet -ENCODING 8226 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -30 -78 -78 -30 -00 -00 -00 -00 -ENDCHAR -STARTCHAR ellipsis -ENCODING 8230 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR perthousand -ENCODING 8240 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -44 -A8 -50 -20 -40 -A8 -54 -28 -00 -00 -ENDCHAR -STARTCHAR minute -ENCODING 8242 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -20 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR second -ENCODING 8243 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -50 -50 -50 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR guilsinglleft -ENCODING 8249 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -10 -20 -40 -20 -10 -08 -00 -00 -ENDCHAR -STARTCHAR guilsinglright -ENCODING 8250 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -20 -10 -08 -10 -20 -40 -00 -00 -ENDCHAR -STARTCHAR exclamdbl -ENCODING 8252 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -50 -50 -50 -00 -50 -50 -00 -00 -ENDCHAR -STARTCHAR overline -ENCODING 8254 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -F8 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2070 -ENCODING 8304 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -30 -48 -48 -48 -30 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2071 -ENCODING 8305 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -00 -60 -20 -20 -70 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2074 -ENCODING 8308 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -08 -18 -28 -78 -08 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2075 -ENCODING 8309 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -70 -40 -70 -08 -70 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2076 -ENCODING 8310 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -30 -40 -70 -48 -30 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2077 -ENCODING 8311 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -78 -08 -10 -20 -20 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2078 -ENCODING 8312 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -30 -48 -30 -48 -30 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2079 -ENCODING 8313 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -30 -48 -38 -08 -30 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni207A -ENCODING 8314 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -F8 -20 -20 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni207B -ENCODING 8315 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -78 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni207C -ENCODING 8316 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -00 -78 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni207D -ENCODING 8317 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -10 -20 -20 -20 -10 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni207E -ENCODING 8318 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -10 -10 -10 -20 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR nsuperior -ENCODING 8319 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -70 -48 -48 -48 -48 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2080 -ENCODING 8320 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -48 -48 -48 -30 -00 -00 -ENDCHAR -STARTCHAR uni2081 -ENCODING 8321 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -10 -30 -10 -10 -38 -00 -00 -ENDCHAR -STARTCHAR uni2082 -ENCODING 8322 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -48 -10 -20 -78 -00 -00 -ENDCHAR -STARTCHAR uni2083 -ENCODING 8323 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -70 -08 -30 -08 -70 -00 -00 -ENDCHAR -STARTCHAR uni2084 -ENCODING 8324 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -08 -18 -28 -78 -08 -00 -00 -ENDCHAR -STARTCHAR uni2085 -ENCODING 8325 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -70 -40 -70 -08 -70 -00 -00 -ENDCHAR -STARTCHAR uni2086 -ENCODING 8326 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -40 -70 -48 -30 -00 -00 -ENDCHAR -STARTCHAR uni2087 -ENCODING 8327 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -78 -08 -10 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni2088 -ENCODING 8328 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -48 -30 -48 -30 -00 -00 -ENDCHAR -STARTCHAR uni2089 -ENCODING 8329 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -48 -38 -08 -30 -00 -00 -ENDCHAR -STARTCHAR uni208A -ENCODING 8330 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -20 -20 -F8 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni208B -ENCODING 8331 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -78 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni208C -ENCODING 8332 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -78 -00 -78 -00 -00 -00 -ENDCHAR -STARTCHAR uni208D -ENCODING 8333 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -10 -20 -20 -20 -10 -00 -00 -ENDCHAR -STARTCHAR uni208E -ENCODING 8334 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -20 -10 -10 -10 -20 -00 -00 -ENDCHAR -STARTCHAR uni2090 -ENCODING 8336 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -08 -38 -48 -38 -00 -00 -ENDCHAR -STARTCHAR uni2091 -ENCODING 8337 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -48 -78 -40 -38 -00 -00 -ENDCHAR -STARTCHAR uni2092 -ENCODING 8338 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -48 -48 -48 -30 -00 -00 -ENDCHAR -STARTCHAR uni2093 -ENCODING 8339 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -88 -50 -20 -50 -88 -00 -00 -ENDCHAR -STARTCHAR uni2094 -ENCODING 8340 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -70 -08 -78 -48 -30 -00 -00 -ENDCHAR -STARTCHAR uni2095 -ENCODING 8341 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -40 -70 -48 -48 -48 -48 -00 -00 -ENDCHAR -STARTCHAR uni2096 -ENCODING 8342 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -40 -48 -50 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR uni2097 -ENCODING 8343 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR uni2098 -ENCODING 8344 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -F0 -A8 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR uni209A -ENCODING 8346 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -70 -48 -48 -48 -70 -40 -40 -ENDCHAR -STARTCHAR peseta -ENCODING 8359 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -C0 -A0 -A0 -C8 -9C -88 -88 -84 -00 -00 -ENDCHAR -STARTCHAR Euro -ENCODING 8364 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -38 -44 -F0 -40 -F0 -44 -38 -00 -00 -ENDCHAR -STARTCHAR uni20AE -ENCODING 8366 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -30 -60 -30 -60 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni2102 -ENCODING 8450 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -A8 -A0 -A0 -A0 -A0 -A8 -70 -00 -00 -ENDCHAR -STARTCHAR uni210E -ENCODING 8462 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni210F -ENCODING 8463 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -F0 -40 -70 -48 -48 -48 -48 -00 -00 -ENDCHAR -STARTCHAR uni2115 -ENCODING 8469 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -C8 -A8 -D8 -A8 -98 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii61352 -ENCODING 8470 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -94 -94 -D0 -F0 -F0 -B4 -90 -94 -00 -00 -ENDCHAR -STARTCHAR uni211A -ENCODING 8474 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -C8 -A8 -A8 -A8 -A8 -A8 -70 -18 -00 -ENDCHAR -STARTCHAR uni211D -ENCODING 8477 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -A8 -A8 -A8 -B0 -B0 -A8 -E4 -00 -00 -ENDCHAR -STARTCHAR trademark -ENCODING 8482 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F4 -5C -54 -54 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2124 -ENCODING 8484 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -18 -28 -50 -A0 -C0 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Ohm -ENCODING 8486 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -50 -D8 -00 -00 -ENDCHAR -STARTCHAR aleph -ENCODING 8501 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -48 -48 -24 -68 -90 -90 -88 -48 -00 -00 -ENDCHAR -STARTCHAR arrowleft -ENCODING 8592 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -60 -FC -60 -20 -00 -00 -00 -00 -ENDCHAR -STARTCHAR arrowup -ENCODING 8593 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -F8 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR arrowright -ENCODING 8594 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -10 -18 -FC -18 -10 -00 -00 -00 -00 -ENDCHAR -STARTCHAR arrowdown -ENCODING 8595 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -20 -20 -20 -F8 -70 -20 -00 -00 -ENDCHAR -STARTCHAR arrowboth -ENCODING 8596 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -CC -FC -CC -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR arrowupdn -ENCODING 8597 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -F8 -20 -20 -F8 -70 -20 -00 -00 -ENDCHAR -STARTCHAR uni21A4 -ENCODING 8612 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -24 -64 -FC -64 -24 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni21A6 -ENCODING 8614 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -90 -98 -FC -98 -90 -00 -00 -00 -00 -ENDCHAR -STARTCHAR arrowupdnbse -ENCODING 8616 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -F8 -20 -F8 -70 -20 -F8 -00 -00 -ENDCHAR -STARTCHAR carriagereturn -ENCODING 8629 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -08 -08 -28 -68 -F8 -60 -20 -00 -00 -ENDCHAR -STARTCHAR uni21BB -ENCODING 8635 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -30 -50 -94 -84 -84 -84 -78 -00 -00 -ENDCHAR -STARTCHAR uni21CB -ENCODING 8651 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -40 -FC -00 -FC -08 -10 -00 -00 -00 -ENDCHAR -STARTCHAR uni21CC -ENCODING 8652 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -08 -FC -00 -FC -40 -20 -00 -00 -00 -ENDCHAR -STARTCHAR arrowdblleft -ENCODING 8656 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -7C -E0 -7C -20 -00 -00 -00 -00 -ENDCHAR -STARTCHAR arrowdblup -ENCODING 8657 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -F8 -50 -50 -50 -50 -50 -00 -00 -ENDCHAR -STARTCHAR arrowdblright -ENCODING 8658 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -10 -F8 -1C -F8 -10 -00 -00 -00 -00 -ENDCHAR -STARTCHAR arrowdbldown -ENCODING 8659 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -50 -50 -50 -F8 -70 -20 -00 -00 -ENDCHAR -STARTCHAR arrowdblboth -ENCODING 8660 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -FC -CC -FC -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni21D5 -ENCODING 8661 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -F8 -50 -50 -F8 -70 -20 -00 -00 -ENDCHAR -STARTCHAR universal -ENCODING 8704 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -F8 -50 -50 -50 -20 -20 -00 -00 -ENDCHAR -STARTCHAR existential -ENCODING 8707 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -F8 -08 -08 -F8 -08 -08 -F8 -00 -00 -ENDCHAR -STARTCHAR uni2204 -ENCODING 8708 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -F8 -28 -28 -F8 -48 -48 -F8 -80 -00 -ENDCHAR -STARTCHAR emptyset -ENCODING 8709 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -70 -98 -A8 -A8 -C8 -70 -80 -00 -00 -ENDCHAR -STARTCHAR increment -ENCODING 8710 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -50 -50 -88 -88 -88 -F8 -00 -00 -ENDCHAR -STARTCHAR gradient -ENCODING 8711 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -88 -88 -88 -50 -50 -20 -20 -00 -00 -ENDCHAR -STARTCHAR element -ENCODING 8712 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -38 -40 -80 -F8 -80 -40 -38 -00 -00 -ENDCHAR -STARTCHAR notelement -ENCODING 8713 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -38 -50 -90 -F8 -A0 -60 -78 -40 -00 -ENDCHAR -STARTCHAR uni220A -ENCODING 8714 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -80 -F8 -80 -78 -00 -00 -00 -ENDCHAR -STARTCHAR suchthat -ENCODING 8715 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -E0 -10 -08 -F8 -08 -10 -E0 -00 -00 -ENDCHAR -STARTCHAR uni220C -ENCODING 8716 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -E0 -50 -48 -F8 -28 -30 -F0 -10 -00 -ENDCHAR -STARTCHAR uni220D -ENCODING 8717 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -08 -F8 -08 -F0 -00 -00 -00 -ENDCHAR -STARTCHAR minus -ENCODING 8722 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -F8 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2213 -ENCODING 8723 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -F8 -00 -20 -20 -F8 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni2214 -ENCODING 8724 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -00 -20 -20 -F8 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni2215 -ENCODING 8725 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -08 -10 -20 -40 -80 -00 -00 -00 -ENDCHAR -STARTCHAR uni2216 -ENCODING 8726 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -80 -40 -20 -10 -08 -00 -00 -00 -ENDCHAR -STARTCHAR bulletoperator -ENCODING 8729 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -30 -78 -30 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR radical -ENCODING 8730 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -0C -08 -08 -08 -88 -88 -48 -28 -18 -00 -00 -ENDCHAR -STARTCHAR infinity -ENCODING 8734 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -50 -A8 -A8 -A8 -50 -00 -00 -00 -00 -ENDCHAR -STARTCHAR orthogonal -ENCODING 8735 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -80 -80 -80 -80 -F8 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2225 -ENCODING 8741 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -50 -50 -50 -50 -50 -50 -00 -00 -ENDCHAR -STARTCHAR logicaland -ENCODING 8743 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -20 -20 -50 -50 -88 -88 -00 -00 -ENDCHAR -STARTCHAR logicalor -ENCODING 8744 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -50 -50 -20 -20 -00 -00 -ENDCHAR -STARTCHAR intersection -ENCODING 8745 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR union -ENCODING 8746 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR approxequal -ENCODING 8776 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -68 -B0 -00 -68 -B0 -00 -00 -00 -ENDCHAR -STARTCHAR notequal -ENCODING 8800 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -F8 -20 -40 -F8 -80 -00 -00 -00 -ENDCHAR -STARTCHAR equivalence -ENCODING 8801 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -00 -F8 -00 -F8 -00 -00 -00 -ENDCHAR -STARTCHAR lessequal -ENCODING 8804 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -10 -20 -40 -80 -40 -20 -10 -00 -F8 -00 -00 -ENDCHAR -STARTCHAR greaterequal -ENCODING 8805 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -40 -20 -10 -08 -10 -20 -40 -00 -F8 -00 -00 -ENDCHAR -STARTCHAR uni226A -ENCODING 8810 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -14 -28 -50 -A0 -50 -28 -14 -00 -00 -ENDCHAR -STARTCHAR uni226B -ENCODING 8811 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -A0 -50 -28 -14 -28 -50 -A0 -00 -00 -ENDCHAR -STARTCHAR propersubset -ENCODING 8834 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -78 -80 -80 -80 -80 -78 -00 -00 -00 -ENDCHAR -STARTCHAR propersuperset -ENCODING 8835 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -F0 -08 -08 -08 -08 -F0 -00 -00 -00 -ENDCHAR -STARTCHAR reflexsubset -ENCODING 8838 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -80 -80 -80 -80 -78 -00 -F8 -00 -00 -ENDCHAR -STARTCHAR reflexsuperset -ENCODING 8839 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -08 -08 -08 -08 -F0 -00 -F8 -00 -00 -ENDCHAR -STARTCHAR perpendicular -ENCODING 8869 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -20 -20 -20 -20 -20 -F8 -00 -00 -ENDCHAR -STARTCHAR uni22C2 -ENCODING 8898 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni22C3 -ENCODING 8899 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni2300 -ENCODING 8960 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -70 -98 -A8 -A8 -C8 -70 -80 -00 -00 -ENDCHAR -STARTCHAR house -ENCODING 8962 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -20 -50 -88 -88 -88 -F8 -00 -00 -ENDCHAR -STARTCHAR uni2308 -ENCODING 8968 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -40 -40 -40 -40 -40 -40 -40 -00 -00 -ENDCHAR -STARTCHAR uni2309 -ENCODING 8969 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -10 -10 -10 -10 -10 -10 -10 -00 -00 -ENDCHAR -STARTCHAR uni230A -ENCODING 8970 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -40 -40 -40 -40 -40 -70 -00 -00 -ENDCHAR -STARTCHAR uni230B -ENCODING 8971 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -10 -10 -10 -10 -10 -10 -70 -00 -00 -ENDCHAR -STARTCHAR revlogicalnot -ENCODING 8976 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -80 -80 -80 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2319 -ENCODING 8985 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -80 -80 -80 -F8 -00 -00 -00 -00 -ENDCHAR -STARTCHAR integraltp -ENCODING 8992 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -28 -28 -20 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR integralbt -ENCODING 8993 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -20 -20 -A0 -A0 -40 -00 -00 -ENDCHAR -STARTCHAR uni239B -ENCODING 9115 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -10 -10 -20 -20 -20 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR uni239C -ENCODING 9116 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR uni239D -ENCODING 9117 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -40 -40 -40 -40 -20 -20 -20 -10 -10 -08 -ENDCHAR -STARTCHAR uni239E -ENCODING 9118 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -20 -10 -10 -10 -08 -08 -08 -08 -08 -08 -ENDCHAR -STARTCHAR uni239F -ENCODING 9119 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -ENDCHAR -STARTCHAR uni23A0 -ENCODING 9120 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -08 -08 -08 -08 -10 -10 -10 -20 -20 -40 -ENDCHAR -STARTCHAR uni23A1 -ENCODING 9121 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -78 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR uni23A2 -ENCODING 9122 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR uni23A3 -ENCODING 9123 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -78 -ENDCHAR -STARTCHAR uni23A4 -ENCODING 9124 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -78 -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -ENDCHAR -STARTCHAR uni23A5 -ENCODING 9125 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -ENDCHAR -STARTCHAR uni23A6 -ENCODING 9126 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -78 -ENDCHAR -STARTCHAR uni23A7 -ENCODING 9127 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -0C -10 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni23A8 -ENCODING 9128 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -C0 -C0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni23A9 -ENCODING 9129 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -10 -0C -ENDCHAR -STARTCHAR uni23AB -ENCODING 9131 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -C0 -20 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -ENDCHAR -STARTCHAR uni23AC -ENCODING 9132 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -10 -10 -10 -10 -0C -0C -10 -10 -10 -10 -10 -ENDCHAR -STARTCHAR uni23AD -ENCODING 9133 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -20 -C0 -ENDCHAR -STARTCHAR uni23AE -ENCODING 9134 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni23AF -ENCODING 9135 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni23BA -ENCODING 9146 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -FC -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni23BB -ENCODING 9147 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -FC -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni23BC -ENCODING 9148 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -FC -00 -00 -00 -ENDCHAR -STARTCHAR uni23BD -ENCODING 9149 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -FC -ENDCHAR -STARTCHAR uni23D0 -ENCODING 9168 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2409 -ENCODING 9225 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -90 -90 -F0 -90 -90 -00 -7C -10 -10 -10 -10 -00 -ENDCHAR -STARTCHAR uni240A -ENCODING 9226 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -80 -80 -80 -F0 -00 -3C -20 -38 -20 -20 -00 -ENDCHAR -STARTCHAR uni240B -ENCODING 9227 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -88 -88 -88 -50 -20 -00 -7C -10 -10 -10 -10 -00 -ENDCHAR -STARTCHAR uni240C -ENCODING 9228 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -F0 -80 -E0 -80 -80 -00 -3C -20 -38 -20 -20 -00 -ENDCHAR -STARTCHAR uni240D -ENCODING 9229 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -60 -90 -80 -90 -60 -00 -38 -24 -38 -28 -24 -00 -ENDCHAR -STARTCHAR uni2424 -ENCODING 9252 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -90 -D0 -B0 -90 -90 -00 -20 -20 -20 -20 -3C -00 -ENDCHAR -STARTCHAR SF100000 -ENCODING 9472 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2501 -ENCODING 9473 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -FC -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF110000 -ENCODING 9474 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2503 -ENCODING 9475 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -30 -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2508 -ENCODING 9480 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -A8 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2509 -ENCODING 9481 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -A8 -A8 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni250A -ENCODING 9482 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -00 -20 -20 -00 -20 -20 -00 -20 -20 -00 -ENDCHAR -STARTCHAR uni250B -ENCODING 9483 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -00 -30 -30 -00 -30 -30 -00 -30 -30 -00 -ENDCHAR -STARTCHAR SF010000 -ENCODING 9484 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -3C -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni250D -ENCODING 9485 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -3C -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni250E -ENCODING 9486 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -3C -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni250F -ENCODING 9487 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -3C -3C -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR SF030000 -ENCODING 9488 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -E0 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2511 -ENCODING 9489 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -E0 -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2512 -ENCODING 9490 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -F0 -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2513 -ENCODING 9491 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -F0 -F0 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR SF020000 -ENCODING 9492 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -3C -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2515 -ENCODING 9493 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -3C -3C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2516 -ENCODING 9494 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -3C -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2517 -ENCODING 9495 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -3C -3C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF040000 -ENCODING 9496 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -E0 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2519 -ENCODING 9497 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -E0 -E0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni251A -ENCODING 9498 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -F0 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni251B -ENCODING 9499 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -F0 -F0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF080000 -ENCODING 9500 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -3C -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni251D -ENCODING 9501 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -3C -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni251E -ENCODING 9502 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -3C -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni251F -ENCODING 9503 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -3C -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2520 -ENCODING 9504 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -3C -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2521 -ENCODING 9505 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -3C -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2522 -ENCODING 9506 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -3C -3C -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2523 -ENCODING 9507 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -3C -3C -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR SF090000 -ENCODING 9508 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -E0 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2525 -ENCODING 9509 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -E0 -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2526 -ENCODING 9510 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -F0 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2527 -ENCODING 9511 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -F0 -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2528 -ENCODING 9512 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -F0 -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2529 -ENCODING 9513 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -F0 -F0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni252A -ENCODING 9514 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -F0 -F0 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni252B -ENCODING 9515 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -F0 -F0 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR SF060000 -ENCODING 9516 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni252D -ENCODING 9517 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni252E -ENCODING 9518 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni252F -ENCODING 9519 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -FC -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2530 -ENCODING 9520 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2531 -ENCODING 9521 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -F0 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2532 -ENCODING 9522 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -3C -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2533 -ENCODING 9523 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -FC -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR SF070000 -ENCODING 9524 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2535 -ENCODING 9525 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -E0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2536 -ENCODING 9526 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -3C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2537 -ENCODING 9527 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -FC -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2538 -ENCODING 9528 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2539 -ENCODING 9529 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -F0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni253A -ENCODING 9530 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -3C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni253B -ENCODING 9531 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -FC -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF050000 -ENCODING 9532 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni253D -ENCODING 9533 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni253E -ENCODING 9534 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni253F -ENCODING 9535 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -FC -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2540 -ENCODING 9536 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2541 -ENCODING 9537 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2542 -ENCODING 9538 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2543 -ENCODING 9539 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2544 -ENCODING 9540 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2545 -ENCODING 9541 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -F0 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2546 -ENCODING 9542 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -3C -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2547 -ENCODING 9543 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -FC -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2548 -ENCODING 9544 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -FC -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2549 -ENCODING 9545 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -F0 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni254A -ENCODING 9546 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -3C -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni254B -ENCODING 9547 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -FC -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR SF430000 -ENCODING 9552 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -FC -00 -FC -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF240000 -ENCODING 9553 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -50 -50 -50 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF510000 -ENCODING 9554 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -3C -20 -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF520000 -ENCODING 9555 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -7C -50 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF390000 -ENCODING 9556 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -7C -40 -5C -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF220000 -ENCODING 9557 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -E0 -20 -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF210000 -ENCODING 9558 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -F0 -50 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF250000 -ENCODING 9559 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -10 -D0 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF500000 -ENCODING 9560 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -3C -20 -3C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF490000 -ENCODING 9561 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -50 -7C -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF380000 -ENCODING 9562 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -5C -40 -7C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF280000 -ENCODING 9563 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -E0 -20 -E0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF270000 -ENCODING 9564 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -50 -F0 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF260000 -ENCODING 9565 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -D0 -10 -F0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF360000 -ENCODING 9566 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -3C -20 -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF370000 -ENCODING 9567 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -50 -5C -50 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF420000 -ENCODING 9568 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -5C -40 -5C -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF190000 -ENCODING 9569 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -E0 -20 -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF200000 -ENCODING 9570 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -50 -D0 -50 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF230000 -ENCODING 9571 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -D0 -10 -D0 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF470000 -ENCODING 9572 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -FC -00 -FC -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF480000 -ENCODING 9573 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -50 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF410000 -ENCODING 9574 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -FC -00 -DC -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF450000 -ENCODING 9575 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -FC -00 -FC -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF460000 -ENCODING 9576 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -50 -FC -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF400000 -ENCODING 9577 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -DC -00 -FC -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF540000 -ENCODING 9578 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -FC -20 -FC -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF530000 -ENCODING 9579 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -50 -FC -50 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF440000 -ENCODING 9580 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -DC -00 -DC -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR uni256D -ENCODING 9581 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -0C -10 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni256E -ENCODING 9582 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -80 -40 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni256F -ENCODING 9583 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -40 -80 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2570 -ENCODING 9584 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -10 -0C -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2571 -ENCODING 9585 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -04 -04 -08 -08 -10 -10 -20 -20 -40 -40 -80 -80 -ENDCHAR -STARTCHAR uni2572 -ENCODING 9586 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -80 -40 -40 -20 -20 -10 -10 -08 -08 -04 -04 -ENDCHAR -STARTCHAR uni2573 -ENCODING 9587 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -84 -84 -48 -48 -30 -30 -30 -30 -48 -48 -84 -84 -ENDCHAR -STARTCHAR uni2574 -ENCODING 9588 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -E0 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2575 -ENCODING 9589 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -20 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2576 -ENCODING 9590 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -3C -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2577 -ENCODING 9591 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -20 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2578 -ENCODING 9592 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -E0 -E0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2579 -ENCODING 9593 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -30 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni257A -ENCODING 9594 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -3C -3C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni257B -ENCODING 9595 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni257C -ENCODING 9596 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -3C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni257D -ENCODING 9597 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -30 -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni257E -ENCODING 9598 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -E0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni257F -ENCODING 9599 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -30 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR upblock -ENCODING 9600 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -FC -FC -FC -FC -FC -FC -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2581 -ENCODING 9601 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -FC -ENDCHAR -STARTCHAR uni2582 -ENCODING 9602 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -FC -FC -FC -ENDCHAR -STARTCHAR uni2583 -ENCODING 9603 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -FC -FC -FC -FC -ENDCHAR -STARTCHAR dnblock -ENCODING 9604 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR uni2585 -ENCODING 9605 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR uni2586 -ENCODING 9606 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -FC -FC -FC -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR uni2587 -ENCODING 9607 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -FC -FC -FC -FC -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR block -ENCODING 9608 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -FC -FC -FC -FC -FC -FC -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR uni2589 -ENCODING 9609 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -ENDCHAR -STARTCHAR uni258A -ENCODING 9610 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -ENDCHAR -STARTCHAR uni258B -ENCODING 9611 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -ENDCHAR -STARTCHAR lfblock -ENCODING 9612 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -E0 -E0 -E0 -E0 -E0 -E0 -E0 -E0 -E0 -E0 -E0 -E0 -ENDCHAR -STARTCHAR uni258D -ENCODING 9613 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -ENDCHAR -STARTCHAR uni258E -ENCODING 9614 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR uni258F -ENCODING 9615 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR rtblock -ENCODING 9616 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -1C -1C -1C -1C -1C -1C -1C -1C -1C -1C -1C -1C -ENDCHAR -STARTCHAR ltshade -ENCODING 9617 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -90 -24 -90 -24 -90 -24 -90 -24 -90 -24 -90 -24 -ENDCHAR -STARTCHAR shade -ENCODING 9618 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -A8 -54 -A8 -54 -A8 -54 -A8 -54 -A8 -54 -A8 -54 -ENDCHAR -STARTCHAR dkshade -ENCODING 9619 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -D8 -B4 -D8 -B4 -D8 -B4 -D8 -B4 -D8 -B4 -D8 -B4 -ENDCHAR -STARTCHAR uni2596 -ENCODING 9622 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -E0 -E0 -E0 -E0 -E0 -E0 -ENDCHAR -STARTCHAR uni2597 -ENCODING 9623 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -1C -1C -1C -1C -1C -1C -ENDCHAR -STARTCHAR uni2598 -ENCODING 9624 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -E0 -E0 -E0 -E0 -E0 -E0 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2599 -ENCODING 9625 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -E0 -E0 -E0 -E0 -E0 -E0 -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR uni259A -ENCODING 9626 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -E0 -E0 -E0 -E0 -E0 -E0 -1C -1C -1C -1C -1C -1C -ENDCHAR -STARTCHAR uni259B -ENCODING 9627 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -FC -FC -FC -FC -FC -FC -E0 -E0 -E0 -E0 -E0 -E0 -ENDCHAR -STARTCHAR uni259C -ENCODING 9628 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -FC -FC -FC -FC -FC -FC -1C -1C -1C -1C -1C -1C -ENDCHAR -STARTCHAR uni259D -ENCODING 9629 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -1C -1C -1C -1C -1C -1C -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni259E -ENCODING 9630 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -1C -1C -1C -1C -1C -1C -E0 -E0 -E0 -E0 -E0 -E0 -ENDCHAR -STARTCHAR uni259F -ENCODING 9631 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -1C -1C -1C -1C -1C -1C -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR filledbox -ENCODING 9632 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -78 -78 -78 -78 -78 -00 -00 -00 -00 -ENDCHAR -STARTCHAR filledrect -ENCODING 9644 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -F8 -F8 -F8 -00 -00 -ENDCHAR -STARTCHAR uni25AE -ENCODING 9646 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -00 -00 -ENDCHAR -STARTCHAR triagup -ENCODING 9650 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -30 -30 -78 -78 -FC -FC -00 -00 -00 -ENDCHAR -STARTCHAR uni25B6 -ENCODING 9654 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -C0 -F0 -FC -FC -F0 -C0 -00 -00 -00 -ENDCHAR -STARTCHAR triagrt -ENCODING 9658 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -C0 -F0 -FC -FC -F0 -C0 -00 -00 -00 -ENDCHAR -STARTCHAR triagdn -ENCODING 9660 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -FC -FC -78 -78 -30 -30 -00 -00 -00 -ENDCHAR -STARTCHAR uni25C0 -ENCODING 9664 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -0C -3C -FC -FC -3C -0C -00 -00 -00 -ENDCHAR -STARTCHAR triaglf -ENCODING 9668 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -0C -3C -FC -FC -3C -0C -00 -00 -00 -ENDCHAR -STARTCHAR blackdiamond -ENCODING 9670 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -70 -F8 -70 -20 -00 -00 -00 -00 -ENDCHAR -STARTCHAR lozenge -ENCODING 9674 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -50 -88 -50 -20 -00 -00 -00 -00 -ENDCHAR -STARTCHAR circle -ENCODING 9675 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -30 -48 -48 -30 -00 -00 -00 -00 -ENDCHAR -STARTCHAR H18533 -ENCODING 9679 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -30 -78 -78 -30 -00 -00 -00 -00 -ENDCHAR -STARTCHAR invbullet -ENCODING 9688 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -FC -FC -FC -FC -CC -84 -84 -CC -FC -FC -FC -FC -ENDCHAR -STARTCHAR invcircle -ENCODING 9689 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -FC -FC -FC -FC -CC -B4 -B4 -CC -FC -FC -FC -FC -ENDCHAR -STARTCHAR smileface -ENCODING 9786 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -84 -CC -84 -B4 -B4 -84 -78 -00 -00 -ENDCHAR -STARTCHAR invsmileface -ENCODING 9787 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -FC -B4 -FC -84 -CC -FC -78 -00 -00 -ENDCHAR -STARTCHAR sun -ENCODING 9788 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -A8 -70 -D8 -70 -A8 -20 -00 -00 -ENDCHAR -STARTCHAR female -ENCODING 9792 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -70 -20 -F8 -20 -00 -00 -ENDCHAR -STARTCHAR male -ENCODING 9794 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -3C -0C -14 -70 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR spade -ENCODING 9824 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -F8 -F8 -70 -20 -70 -00 -00 -ENDCHAR -STARTCHAR club -ENCODING 9827 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -20 -A8 -F8 -A8 -20 -70 -00 -00 -ENDCHAR -STARTCHAR heart -ENCODING 9829 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -50 -F8 -F8 -F8 -70 -70 -20 -00 -00 -ENDCHAR -STARTCHAR diamond -ENCODING 9830 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -70 -F8 -70 -20 -00 -00 -00 -00 -ENDCHAR -STARTCHAR musicalnote -ENCODING 9834 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -48 -78 -40 -40 -40 -40 -80 -00 -00 -ENDCHAR -STARTCHAR musicalnotedbl -ENCODING 9835 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -48 -78 -48 -48 -48 -48 -50 -80 -00 -ENDCHAR -STARTCHAR uni2713 -ENCODING 10003 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -04 -04 -08 -88 -90 -50 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni2714 -ENCODING 10004 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -0C -0C -18 -D8 -F0 -70 -60 -60 -00 -00 -ENDCHAR -STARTCHAR uni2717 -ENCODING 10007 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -48 -28 -10 -10 -28 -24 -40 -40 -00 -00 -ENDCHAR -STARTCHAR uni2718 -ENCODING 10008 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -18 -D8 -70 -30 -78 -6C -C0 -C0 -00 -00 -ENDCHAR -STARTCHAR uni27E8 -ENCODING 10216 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -10 -10 -20 -20 -40 -20 -20 -10 -10 -00 -00 -ENDCHAR -STARTCHAR uni27E9 -ENCODING 10217 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -40 -40 -20 -20 -10 -20 -20 -40 -40 -00 -00 -ENDCHAR -STARTCHAR uni27EA -ENCODING 10218 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -28 -28 -50 -50 -A0 -50 -50 -28 -28 -00 -00 -ENDCHAR -STARTCHAR uni27EB -ENCODING 10219 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -A0 -A0 -50 -50 -28 -50 -50 -A0 -A0 -00 -00 -ENDCHAR -STARTCHAR uni2800 -ENCODING 10240 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2801 -ENCODING 10241 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2802 -ENCODING 10242 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2803 -ENCODING 10243 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2804 -ENCODING 10244 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2805 -ENCODING 10245 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2806 -ENCODING 10246 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2807 -ENCODING 10247 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2808 -ENCODING 10248 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2809 -ENCODING 10249 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni280A -ENCODING 10250 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni280B -ENCODING 10251 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni280C -ENCODING 10252 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni280D -ENCODING 10253 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni280E -ENCODING 10254 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni280F -ENCODING 10255 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2810 -ENCODING 10256 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2811 -ENCODING 10257 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2812 -ENCODING 10258 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2813 -ENCODING 10259 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2814 -ENCODING 10260 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2815 -ENCODING 10261 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2816 -ENCODING 10262 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2817 -ENCODING 10263 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2818 -ENCODING 10264 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2819 -ENCODING 10265 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni281A -ENCODING 10266 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni281B -ENCODING 10267 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni281C -ENCODING 10268 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni281D -ENCODING 10269 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni281E -ENCODING 10270 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni281F -ENCODING 10271 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2820 -ENCODING 10272 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2821 -ENCODING 10273 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2822 -ENCODING 10274 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2823 -ENCODING 10275 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2824 -ENCODING 10276 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2825 -ENCODING 10277 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2826 -ENCODING 10278 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2827 -ENCODING 10279 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2828 -ENCODING 10280 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2829 -ENCODING 10281 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni282A -ENCODING 10282 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni282B -ENCODING 10283 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni282C -ENCODING 10284 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni282D -ENCODING 10285 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni282E -ENCODING 10286 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni282F -ENCODING 10287 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2830 -ENCODING 10288 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2831 -ENCODING 10289 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2832 -ENCODING 10290 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2833 -ENCODING 10291 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2834 -ENCODING 10292 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2835 -ENCODING 10293 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2836 -ENCODING 10294 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2837 -ENCODING 10295 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2838 -ENCODING 10296 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2839 -ENCODING 10297 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni283A -ENCODING 10298 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni283B -ENCODING 10299 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni283C -ENCODING 10300 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni283D -ENCODING 10301 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni283E -ENCODING 10302 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni283F -ENCODING 10303 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2840 -ENCODING 10304 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2841 -ENCODING 10305 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2842 -ENCODING 10306 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2843 -ENCODING 10307 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2844 -ENCODING 10308 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2845 -ENCODING 10309 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2846 -ENCODING 10310 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2847 -ENCODING 10311 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2848 -ENCODING 10312 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2849 -ENCODING 10313 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni284A -ENCODING 10314 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni284B -ENCODING 10315 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni284C -ENCODING 10316 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni284D -ENCODING 10317 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni284E -ENCODING 10318 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni284F -ENCODING 10319 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2850 -ENCODING 10320 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2851 -ENCODING 10321 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2852 -ENCODING 10322 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2853 -ENCODING 10323 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2854 -ENCODING 10324 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2855 -ENCODING 10325 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2856 -ENCODING 10326 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2857 -ENCODING 10327 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2858 -ENCODING 10328 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2859 -ENCODING 10329 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni285A -ENCODING 10330 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni285B -ENCODING 10331 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni285C -ENCODING 10332 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni285D -ENCODING 10333 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni285E -ENCODING 10334 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni285F -ENCODING 10335 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2860 -ENCODING 10336 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2861 -ENCODING 10337 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2862 -ENCODING 10338 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2863 -ENCODING 10339 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2864 -ENCODING 10340 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2865 -ENCODING 10341 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2866 -ENCODING 10342 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2867 -ENCODING 10343 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2868 -ENCODING 10344 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2869 -ENCODING 10345 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni286A -ENCODING 10346 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni286B -ENCODING 10347 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni286C -ENCODING 10348 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni286D -ENCODING 10349 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni286E -ENCODING 10350 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni286F -ENCODING 10351 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2870 -ENCODING 10352 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2871 -ENCODING 10353 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2872 -ENCODING 10354 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2873 -ENCODING 10355 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2874 -ENCODING 10356 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2875 -ENCODING 10357 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2876 -ENCODING 10358 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2877 -ENCODING 10359 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2878 -ENCODING 10360 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2879 -ENCODING 10361 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni287A -ENCODING 10362 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni287B -ENCODING 10363 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni287C -ENCODING 10364 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni287D -ENCODING 10365 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni287E -ENCODING 10366 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni287F -ENCODING 10367 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2880 -ENCODING 10368 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2881 -ENCODING 10369 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2882 -ENCODING 10370 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2883 -ENCODING 10371 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2884 -ENCODING 10372 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2885 -ENCODING 10373 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2886 -ENCODING 10374 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2887 -ENCODING 10375 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2888 -ENCODING 10376 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2889 -ENCODING 10377 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni288A -ENCODING 10378 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni288B -ENCODING 10379 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni288C -ENCODING 10380 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni288D -ENCODING 10381 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni288E -ENCODING 10382 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni288F -ENCODING 10383 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2890 -ENCODING 10384 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2891 -ENCODING 10385 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2892 -ENCODING 10386 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2893 -ENCODING 10387 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2894 -ENCODING 10388 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2895 -ENCODING 10389 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2896 -ENCODING 10390 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2897 -ENCODING 10391 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2898 -ENCODING 10392 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2899 -ENCODING 10393 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni289A -ENCODING 10394 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni289B -ENCODING 10395 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni289C -ENCODING 10396 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni289D -ENCODING 10397 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni289E -ENCODING 10398 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni289F -ENCODING 10399 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A0 -ENCODING 10400 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A1 -ENCODING 10401 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A2 -ENCODING 10402 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A3 -ENCODING 10403 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A4 -ENCODING 10404 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A5 -ENCODING 10405 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A6 -ENCODING 10406 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A7 -ENCODING 10407 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A8 -ENCODING 10408 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A9 -ENCODING 10409 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28AA -ENCODING 10410 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28AB -ENCODING 10411 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28AC -ENCODING 10412 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28AD -ENCODING 10413 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28AE -ENCODING 10414 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28AF -ENCODING 10415 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B0 -ENCODING 10416 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B1 -ENCODING 10417 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B2 -ENCODING 10418 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B3 -ENCODING 10419 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B4 -ENCODING 10420 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B5 -ENCODING 10421 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B6 -ENCODING 10422 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B7 -ENCODING 10423 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B8 -ENCODING 10424 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B9 -ENCODING 10425 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28BA -ENCODING 10426 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28BB -ENCODING 10427 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28BC -ENCODING 10428 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28BD -ENCODING 10429 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28BE -ENCODING 10430 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28BF -ENCODING 10431 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28C0 -ENCODING 10432 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C1 -ENCODING 10433 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C2 -ENCODING 10434 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C3 -ENCODING 10435 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C4 -ENCODING 10436 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C5 -ENCODING 10437 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C6 -ENCODING 10438 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C7 -ENCODING 10439 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C8 -ENCODING 10440 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C9 -ENCODING 10441 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28CA -ENCODING 10442 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28CB -ENCODING 10443 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28CC -ENCODING 10444 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28CD -ENCODING 10445 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28CE -ENCODING 10446 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28CF -ENCODING 10447 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D0 -ENCODING 10448 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D1 -ENCODING 10449 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D2 -ENCODING 10450 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D3 -ENCODING 10451 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D4 -ENCODING 10452 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D5 -ENCODING 10453 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D6 -ENCODING 10454 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D7 -ENCODING 10455 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D8 -ENCODING 10456 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D9 -ENCODING 10457 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28DA -ENCODING 10458 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28DB -ENCODING 10459 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28DC -ENCODING 10460 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28DD -ENCODING 10461 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28DE -ENCODING 10462 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28DF -ENCODING 10463 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E0 -ENCODING 10464 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E1 -ENCODING 10465 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E2 -ENCODING 10466 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E3 -ENCODING 10467 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E4 -ENCODING 10468 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E5 -ENCODING 10469 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E6 -ENCODING 10470 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E7 -ENCODING 10471 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E8 -ENCODING 10472 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E9 -ENCODING 10473 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28EA -ENCODING 10474 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28EB -ENCODING 10475 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28EC -ENCODING 10476 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28ED -ENCODING 10477 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28EE -ENCODING 10478 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28EF -ENCODING 10479 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F0 -ENCODING 10480 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F1 -ENCODING 10481 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F2 -ENCODING 10482 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F3 -ENCODING 10483 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F4 -ENCODING 10484 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F5 -ENCODING 10485 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F6 -ENCODING 10486 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F7 -ENCODING 10487 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F8 -ENCODING 10488 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F9 -ENCODING 10489 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28FA -ENCODING 10490 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28FB -ENCODING 10491 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28FC -ENCODING 10492 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28FD -ENCODING 10493 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28FE -ENCODING 10494 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28FF -ENCODING 10495 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni2E2C -ENCODING 11820 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -00 -00 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uniE0A0 -ENCODING 57504 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -90 -B8 -90 -90 -90 -20 -40 -80 -80 -80 -80 -ENDCHAR -STARTCHAR uniE0A1 -ENCODING 57505 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -80 -80 -80 -F0 -00 -24 -34 -2C -24 -24 -00 -ENDCHAR -STARTCHAR uniE0A2 -ENCODING 57506 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -30 -48 -48 -48 -FC -FC -CC -CC -FC -FC -00 -ENDCHAR -STARTCHAR uniE0B0 -ENCODING 57520 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -C0 -E0 -F0 -F8 -FC -FC -F8 -F0 -E0 -C0 -80 -ENDCHAR -STARTCHAR uniE0B1 -ENCODING 57521 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -40 -20 -10 -08 -04 -04 -08 -10 -20 -40 -80 -ENDCHAR -STARTCHAR uniE0B2 -ENCODING 57522 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -04 -0C -1C -3C -7C -FC -FC -7C -3C -1C -0C -04 -ENDCHAR -STARTCHAR uniE0B3 -ENCODING 57523 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -04 -08 -10 -20 -40 -80 -80 -40 -20 -10 -08 -04 -ENDCHAR -STARTCHAR uniF6BE -ENCODING 63166 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -18 -08 -08 -08 -08 -08 -48 -30 -ENDCHAR -STARTCHAR uniFFFD -ENCODING 65533 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -88 -88 -88 -88 -88 -88 -F8 -00 -00 -ENDCHAR -ENDFONT diff --git a/src/base_circuitpython/img/blinka.bmp b/src/base_circuitpython/img/blinka.bmp deleted file mode 100644 index 0466a02d426e7aa64e8bef4656187276c6f963e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172856 zcmeI&F-ikL6adiG*3K$eSxHb31<@c1!CtVjxAF{@dxX@f0)ppA?I}D$ZV>;@m}Nm2 zOK0JQ*=5)X%g@`-=QG)d$JzUS(|xYvn8vaBIrf@K%$jCD)(;PwbfgPT1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0Rn#t++I$v&hCGomq+dL=yf-``JcD)1p@yrus&`FW3`*d zq?@<%ml)5d^N2Gt{NJM$0D-c=V)7CrXK$atIgRsq^Z60gyL=O?1nLpEIX_viz9Mgj z=Sb$1IG53^jzu7{T5%rB!xCp%AQ$S`*08fthO%0}KyEx@ zw^`d<|HBetSs?FqL^7+)Whkrl3-lXz!^%9I*Z&hlNT3&pd`|zN^lxso`Je9o3nm0c zB#`zrV$ZqVZnx`sys*)|k2IqAg-T#3khe9WL`ObH|16n@IOby%NG(TKq9yYfAD@_; F<{QoHq!<7I diff --git a/src/base_circuitpython/neopixel_write.py b/src/base_circuitpython/neopixel_write.py deleted file mode 100644 index 341215f35..000000000 --- a/src/base_circuitpython/neopixel_write.py +++ /dev/null @@ -1,55 +0,0 @@ -# overriden neopixel_write library to write to frontend - -# original implementation docs for neopixel_write: -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/neopixel_write/__init__.html - - -import pathlib -import sys -import os - -import common -from adafruit_circuitplayground import cp -import base_cp_constants as CONSTANTS - - -def neopixel_write(gpio, buf): - """Write buf out on the given DigitalInOut.""" - - if len(tuple(buf)) > 0: - # if we are explicitly given - # the clue pin, that means that - # the clue is definitely the active device - # because the constructor for the - # clue is what calls neopixel - # with the clue pin argument - if gpio.pin != CONSTANTS.CLUE_PIN: - send_cpx(buf) - send_clue(buf) - - -def send_clue(buf): - sendable_json = {CONSTANTS.PIXELS: tuple(buf)} - if common.utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - sendable_json, CONSTANTS.CLUE - ) - else: - common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) - - -def send_cpx(buf): - buf_list = list(buf) - ret_list = [] - temp_list = [] - for idx, elem in enumerate(buf_list): - if idx % 3 == 0 and idx != 0: - ret_list.append(tuple(temp_list)) - temp_list = [] - temp_list.append(elem) - - if len(temp_list) == 3: - ret_list.append(tuple(temp_list)) - - max_index = min(len(ret_list), 10) - cp.pixels[0:max_index] = ret_list[0:max_index] diff --git a/src/base_circuitpython/pulseio.py b/src/base_circuitpython/pulseio.py deleted file mode 100644 index f69a45836..000000000 --- a/src/base_circuitpython/pulseio.py +++ /dev/null @@ -1,16 +0,0 @@ -from common import utils - - -class PulseIn: - def __init__(self, pin, maxlen=2, *, idle_state=False): - utils.print_for_unimplemented_functions(PulseIn.__init__.__qualname__) - - -class PulseOut: - def __init__(self, carrier): - utils.print_for_unimplemented_functions(PulseOut.__init__.__qualname__) - - -class PWMOut: - def __init__(self, pin, *, duty_cycle=0, frequency=500, variable_frequency=False): - utils.print_for_unimplemented_functions(PWMOut.__init__.__qualname__) diff --git a/src/base_circuitpython/terminal_handler.py b/src/base_circuitpython/terminal_handler.py deleted file mode 100644 index 83130f0b0..000000000 --- a/src/base_circuitpython/terminal_handler.py +++ /dev/null @@ -1,108 +0,0 @@ -from PIL import Image -import threading -import os -import base64 -from io import BytesIO -import time -import collections -import pathlib - -from common import utils -import board -import base_cp_constants as CONSTANTS -import displayio -import terminalio - - -class Terminal: - def __init__(self): - self.__output_values = collections.deque() - self.__lock = threading.Lock() - self.__abs_path = pathlib.Path(__file__).parent.absolute() - self.__base_img = Image.open( - os.path.join(self.__abs_path, CONSTANTS.IMG_DIR_NAME, CONSTANTS.BLINKA_BMP) - ) - - def __create_newline(self, str_list): - self.__lock.acquire() - for string in str_list: - self.__output_values.appendleft(string) - - over = len(self.__output_values) - CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX - - # max CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX items in output_values - if over > 0: - for i in range(over): - self.__output_values.pop() - - self.__lock.release() - - def __draw(self, no_verif=False): - - import adafruit_display_text.label - - # no need to check the active group within the Group class - # since the caller of draw already did - splash = displayio.Group( - max_size=20, check_active_group_ref=False, auto_write=False - ) - - self.__lock.acquire() - - # since the text starts from the bottom, - # we need to find an offset if there are empty spots - - # handling of output_values already ensures that there are - # max CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX items in output_values deque - num_empty_slots = CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX - len( - self.__output_values - ) - curr_y = CONSTANTS.CLUE_TERMINAL_Y_OFFSET + ( - CONSTANTS.CLUE_TERMINAL_LINE_HEIGHT * num_empty_slots - ) - for output_val in reversed(self.__output_values): - if len(output_val): - text_area = adafruit_display_text.label.Label( - terminalio.FONT, text=output_val, line_spacing=1.25 - ) - - text_area.y = curr_y - text_area.x = CONSTANTS.CLUE_TERMINAL_X_OFFSET - splash.append(text_area) - - curr_y += CONSTANTS.CLUE_TERMINAL_LINE_HEIGHT - - self.__lock.release() - - splash._Group__draw(img=self.__base_img.copy()) - - def add_str_to_terminal(self, curr_display_string=""): - - line_break_amt = CONSTANTS.CLUE_TERMINAL_LINE_BREAK_AMT - - # characters until forced newline - newline_expected_val = line_break_amt - out_str = "" - new_strs = [] - for idx, d in enumerate(curr_display_string): - # handle custom or forced newline - if d == "\n" or newline_expected_val == 0: - new_strs.append(out_str) - out_str = "" - newline_expected_val = line_break_amt - - # if it was a custom newline, no longer need to - # process the character - if d == "\n": - continue - else: - newline_expected_val -= 1 - out_str += d - new_strs.append(out_str) - - self.__create_newline(new_strs) - - # only go ahead to draw the screen - # if the terminal is actively on the screen - if board.DISPLAY.active_group == None: - self.__draw() diff --git a/src/base_circuitpython/terminalio.py b/src/base_circuitpython/terminalio.py deleted file mode 100644 index 58abb7fc4..000000000 --- a/src/base_circuitpython/terminalio.py +++ /dev/null @@ -1,15 +0,0 @@ -# overriden terminalio library, which uses -# adafruit_bitmap_font to load the default font - -# original implementation docs for terminalio: -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/terminalio/__init__.html - -from adafruit_bitmap_font import bitmap_font # pylint: disable=wrong-import-position - -import os -import pathlib - -abs_path = pathlib.Path(__file__).parent.absolute() - -# load default font -FONT = bitmap_font.load_font(os.path.join(abs_path, "fonts", "ter-u12n.bdf")) diff --git a/src/base_circuitpython/test/__init__.py b/src/base_circuitpython/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/base_circuitpython/test/test_terminal_handler.py b/src/base_circuitpython/test/test_terminal_handler.py deleted file mode 100644 index 22a8986af..000000000 --- a/src/base_circuitpython/test/test_terminal_handler.py +++ /dev/null @@ -1,61 +0,0 @@ -import pytest - -import base_circuitpython.terminal_handler -from common import utils -from unittest import mock - - -class TestTerminal(object): - def setup_method(self): - - utils.send_to_simulator = mock.Mock() - - @pytest.mark.parametrize( - "str_vals", - [ - (["potato", "Lorem ipsum"]), - ([""]), - ([".......", "123456", "", "test"]), - (["123456789 123456789 123456789 1234567"]), - ], - ) - def test_single_line(self, str_vals): - self.terminal = base_circuitpython.terminal_handler.Terminal() - for s in str_vals: - self.terminal.add_str_to_terminal(s) - - result = list(self.terminal._Terminal__output_values) - result.reverse() - - # output should just be the reversed version since all lines - # don't have newline or exceed 37 characters - assert str_vals == result - - @pytest.mark.parametrize( - "str_vals, expected", - [ - ( - ["\nCode done running. Waiting for reload."], - [".", "Code done running. Waiting for reload", ""], - ), - ( - ["TESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTEST"], - ["ESTTESTTEST", "TESTTESTTESTTESTTESTTESTTESTTESTTESTT"], - ), - ( - ["\nCode done running. Waiting for reload.", "........."], - [".........", ".", "Code done running. Waiting for reload", ""], - ), - ( - ["TEST TEST TEST TEST TEST ", "..."], - ["...", " ", "TEST TEST TEST TEST TEST "], - ), - ], - ) - def test_multiline(self, str_vals, expected): - self.terminal = base_circuitpython.terminal_handler.Terminal() - for s in str_vals: - self.terminal.add_str_to_terminal(s) - - result = list(self.terminal._Terminal__output_values) - assert result == expected diff --git a/src/check_if_venv.py b/src/check_if_venv.py deleted file mode 100644 index 45fd3dd2b..000000000 --- a/src/check_if_venv.py +++ /dev/null @@ -1,11 +0,0 @@ -# from https://stackoverflow.com/questions/1871549/determine-if-python-is-running-inside-virtualenv -import sys - -isVenv = hasattr(sys, "real_prefix") or ( - hasattr(sys, "base_prefix") and sys.base_prefix != sys.prefix -) - -# prints result for frontend to read -# 1 -> is a venv -# 0 -> is NOT a venv -print(int(isVenv)) diff --git a/src/check_python_dependencies.py b/src/check_python_dependencies.py deleted file mode 100644 index 6c51463c7..000000000 --- a/src/check_python_dependencies.py +++ /dev/null @@ -1,36 +0,0 @@ -# from https://stackoverflow.com/questions/16294819/check-if-my-python-has-all-required-packages -import sys -import pkg_resources -import python_constants as CONSTANTS - - -def check_for_dependencies(): - with open(f"{sys.path[0]}/requirements.txt") as f: - dependencies = [x.strip() for x in f.readlines()] - - cleaned_dependencies = [] - - # getting names of packages from tar.gz files - - # FOR PRE-DOWNLOADED TAR.GZ FILES, ENSURE THAT - # THERE ARE NO DASHES AFTER THE ONE THAT IS - # AT THE END OF THE PACKAGE NAME. - # So, it would be: - # {package_name}-{trailing_verison_info}.tar.gz - for dep in dependencies: - if len(dep) > 7 and dep.strip()[-7:] == ".tar.gz": - last_dash = dep.rfind("-") - dep = dep[:last_dash] - - cleaned_dependencies.append(dep) - - # here, if a dependency is not met, a DistributionNotFound or VersionConflict - # exception is caught and replaced with a new exception with a clearer description. - try: - pkg_resources.require(cleaned_dependencies) - except (pkg_resources.DistributionNotFound, pkg_resources.VersionConflict) as e: - raise Exception(CONSTANTS.DEPEND_ERR) - - -if __name__ == "__main__": - check_for_dependencies() diff --git a/src/clue/__init__.py b/src/clue/__init__.py deleted file mode 100644 index c34e9688b..000000000 --- a/src/clue/__init__.py +++ /dev/null @@ -1 +0,0 @@ -import base_circuitpython diff --git a/src/clue/adafruit_clue.py b/src/clue/adafruit_clue.py deleted file mode 100644 index 059573021..000000000 --- a/src/clue/adafruit_clue.py +++ /dev/null @@ -1,852 +0,0 @@ -# The MIT License (MIT) -# -# Copyright (c) 2020 Kattni Rembor for Adafruit Industries -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -""" -`adafruit_clue` -================================================================================ - -A high level library representing all the features of the Adafruit CLUE. - - -* Author(s): Kattni Rembor - -Implementation Notes --------------------- - -**Hardware:** - -.. "* `Adafruit CLUE - nRF52840 Express with Bluetooth LE `_" - -**Software and Dependencies:** - -* Adafruit CircuitPython firmware for the supported boards: - https://github.com/adafruit/circuitpython/releases - - * Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice - * Adafruit's Register library: https://github.com/adafruit/Adafruit_CircuitPython_Register - * Adafruit's LSM6DS CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_LSM6DS - * Adafruit's LIS3MDL CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_LIS3MDL - * Adafruit's APDS9960 CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_APDS9960 - * Adafruit's BMP280 CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_BMP280 - * Adafruit's SHT31D CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_SHT31D - * Adafruit's NeoPixel CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_NeoPixel -""" - -import common -from base_circuitpython import base_cp_constants as CONSTANTS -import neopixel -import time -import array -import math -from PIL import Image -import pathlib -import sys -import os -import board - -abs_path = pathlib.Path(__file__).parent.absolute() -sys.path.insert(0, os.path.join(abs_path)) - -# REVISED VERSION OF THE ADAFRUIT CLUE LIBRARY FOR DSX - -__version__ = "0.0.0-auto.0" -__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_CLUE.git" - - -class _ClueSimpleTextDisplay: - """Easily display lines of text on CLUE display.""" - - def __init__( - self, - title=None, - title_color=0xFFFFFF, - title_scale=1, # pylint: disable=too-many-arguments - text_scale=1, - font=None, - colors=None, - ): - import displayio - import terminalio - from adafruit_display_text import label - - if not colors: - colors = ( - Clue.VIOLET, - Clue.GREEN, - Clue.RED, - Clue.CYAN, - Clue.ORANGE, - Clue.BLUE, - Clue.MAGENTA, - Clue.SKY, - Clue.YELLOW, - Clue.PURPLE, - ) - - self._display = board.DISPLAY - self._colors = colors - self._label = label - self._font = terminalio.FONT - if font: - self._font = font - self.text_scale = text_scale - self.text_group = displayio.Group(max_size=20, scale=self.text_scale) - if title: - # Fail gracefully if title is longer than 60 characters. - if len(title) > 60: - raise ValueError("Title must be 60 characters or less.") - - title = label.Label( - self._font, - text=title, - max_glyphs=60, - color=title_color, - scale=title_scale, - ) - title.x = 0 - title.y = 8 * self.text_scale - self._y = title.y + 18 * self.text_scale - - self.text_group.append(title) - else: - self._y = 3 * self.text_scale - - self._lines = [] - for num in range(1): - self._lines.append(self.add_text_line(color=colors[num % len(colors)])) - - def __getitem__(self, item): - """Fetch the Nth text line Group""" - if len(self._lines) - 1 < item: - for _ in range(item - (len(self._lines) - 1)): - self._lines.append( - self.add_text_line(color=self._colors[item % len(self._colors)]) - ) - return self._lines[item] - - def add_text_line(self, color=0xFFFFFF): - """Adds a line on the display of the specified color and returns the label object.""" - text_label = self._label.Label(self._font, text="", max_glyphs=45, color=color) - text_label.x = 0 - text_label.y = self._y - self._y = text_label.y + 13 * self.text_scale - self.text_group.append(text_label) - - return text_label - - def show(self): - """Call show() to display the data list.""" - self._display.show(self.text_group) - - def show_terminal(self): - """Revert to terminalio screen.""" - self._display.show(None) - - -class Clue: # pylint: disable=too-many-instance-attributes, too-many-public-methods - """Represents a single CLUE.""" - - # Color variables available for import. - RED = (255, 0, 0) - YELLOW = (255, 255, 0) - ORANGE = (255, 150, 0) - GREEN = (0, 255, 0) - TEAL = (0, 255, 120) - CYAN = (0, 255, 255) - BLUE = (0, 0, 255) - PURPLE = (180, 0, 255) - MAGENTA = (255, 0, 150) - WHITE = (255, 255, 255) - BLACK = (0, 0, 0) - - GOLD = (255, 222, 30) - PINK = (242, 90, 255) - AQUA = (50, 255, 255) - JADE = (0, 255, 40) - AMBER = (255, 100, 0) - VIOLET = (255, 0, 255) - SKY = (0, 180, 255) - - RAINBOW = (RED, ORANGE, YELLOW, GREEN, BLUE, PURPLE) - - def __init__(self): - self.__state = {} - self.__state[CONSTANTS.CLUE_STATE.BUTTON_A] = False - self.__state[CONSTANTS.CLUE_STATE.BUTTON_B] = False - self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS] = set() - self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE] = 1013.25 - self.__state[CONSTANTS.CLUE_STATE.TEMPERATURE] = 0 - self.__state[CONSTANTS.CLUE_STATE.PROXIMITY] = 0 - self.__state[CONSTANTS.CLUE_STATE.GESTURE] = "" - self.__state[CONSTANTS.CLUE_STATE.HUMIDITY] = 0 - self.__state[CONSTANTS.CLUE_STATE.PRESSURE] = 1013 - self.__state[CONSTANTS.CLUE_STATE.PIXEL] = neopixel.NeoPixel( - pin=CONSTANTS.CLUE_PIN, n=1, pixel_order=neopixel.RGB - ) - # Accelerometer - self.__state[CONSTANTS.CLUE_STATE.MOTION_X] = 0 - self.__state[CONSTANTS.CLUE_STATE.MOTION_Y] = 0 - self.__state[CONSTANTS.CLUE_STATE.MOTION_Z] = 0 - # Light/color sensor - self.__state[CONSTANTS.CLUE_STATE.LIGHT_R] = 0 - self.__state[CONSTANTS.CLUE_STATE.LIGHT_G] = 0 - self.__state[CONSTANTS.CLUE_STATE.LIGHT_B] = 0 - self.__state[CONSTANTS.CLUE_STATE.LIGHT_C] = 0 - # Magnetometer - self.__state[CONSTANTS.CLUE_STATE.MAGNET_X] = 0 - self.__state[CONSTANTS.CLUE_STATE.MAGNET_Y] = 0 - self.__state[CONSTANTS.CLUE_STATE.MAGNET_Z] = 0 - # Gyroscope - self.__state[CONSTANTS.CLUE_STATE.GYRO_X] = 0 - self.__state[CONSTANTS.CLUE_STATE.GYRO_Y] = 0 - self.__state[CONSTANTS.CLUE_STATE.GYRO_Z] = 0 - # LEDs - self.__state[CONSTANTS.CLUE_STATE.RED_LED] = False - self.__state[CONSTANTS.CLUE_STATE.WHITE_LEDS] = False - - self.button_mapping = { - CONSTANTS.CLUE_STATE.BUTTON_A: "A", - CONSTANTS.CLUE_STATE.BUTTON_B: "B", - } - self.display = board.DISPLAY - - @property - def button_a(self): - """``True`` when Button A is pressed. ``False`` if not. - This example prints when button A is pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.button_a: - print("Button A pressed") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_BUTTON_A - ) - return self.__state[CONSTANTS.CLUE_STATE.BUTTON_A] - - @property - def button_b(self): - """``True`` when Button B is pressed. ``False`` if not. - This example prints when button B is pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.button_b: - print("Button B pressed") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_BUTTON_B - ) - return self.__state[CONSTANTS.CLUE_STATE.BUTTON_B] - - @property - def were_pressed(self): - """Returns a set of the buttons that have been pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print(clue.were_pressed) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_WERE_PRESSED - ) - ret = self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS].copy() - self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS].clear() - return ret - - @property - def acceleration(self): - """Obtain acceleration data from the x, y and z axes. - This example prints the values. Try moving the board to see how the printed values change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Accel: {:.2f} {:.2f} {:.2f}".format(*clue.acceleration)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_ACCELERATION - ) - return ( - self.__state[CONSTANTS.CLUE_STATE.MOTION_X], - self.__state[CONSTANTS.CLUE_STATE.MOTION_Y], - self.__state[CONSTANTS.CLUE_STATE.MOTION_Z], - ) - - def shake(self, shake_threshold=30, avg_count=10, total_delay=0.1): - """Detect when the accelerometer is shaken. Optional parameters: - :param shake_threshold: Increase or decrease to change shake sensitivity. This - requires a minimum value of 10. 10 is the total - acceleration if the board is not moving, therefore - anything less than 10 will erroneously report a constant - shake detected. (Default 30) - :param avg_count: The number of readings taken and used for the average - acceleration. (Default 10) - :param total_delay: The total time in seconds it takes to obtain avg_count - readings from acceleration. (Default 0.1) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SHAKE - ) - is_shaken = self.__state[CONSTANTS.CLUE_STATE.GESTURE] == CONSTANTS.SHAKE - return is_shaken - - @property - def color(self): - """The red, green, blue, and clear light values. (r, g, b, c) - This example prints the values. Try holding something up to the sensor to see the values - change. Works best with white LEDs enabled. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Color: R: {} G: {} B: {} C: {}".format(*clue.color)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_COLOR - ) - return ( - self.__state[CONSTANTS.CLUE_STATE.LIGHT_R], - self.__state[CONSTANTS.CLUE_STATE.LIGHT_G], - self.__state[CONSTANTS.CLUE_STATE.LIGHT_B], - self.__state[CONSTANTS.CLUE_STATE.LIGHT_C], - ) - - @property - def temperature(self): - """The temperature in degrees Celsius. - This example prints the value. Try touching the sensor to see the value change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - print("Temperature: {:.1f}C".format(clue.temperature)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TEMPERATURE - ) - return self.__state[CONSTANTS.CLUE_STATE.TEMPERATURE] - - @property - def magnetic(self): - """Obtain x, y, z magnetic values in microteslas. - This example prints the values. Try moving the board to see how the printed values change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Magnetic: {:.3f} {:.3f} {:.3f}".format(*clue.magnetic)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_MAGNETIC - ) - return ( - self.__state[CONSTANTS.CLUE_STATE.MAGNET_X], - self.__state[CONSTANTS.CLUE_STATE.MAGNET_Y], - self.__state[CONSTANTS.CLUE_STATE.MAGNET_Z], - ) - - @property - def proximity(self): - """A relative proximity to the sensor in values from 0 - 255. - This example prints the value. Try moving your hand towards and away from the front of the - board to see how the printed values change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Proximity: {}".format(clue.proximity)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_PROXIMITY - ) - return self.__state[CONSTANTS.CLUE_STATE.PROXIMITY] - - @property - def gyro(self): - """Obtain x, y, z angular velocity values in degrees/second. - This example prints the values. Try moving the board to see how the printed values change. - print("Gyro: {:.2f} {:.2f} {:.2f}".format(*clue.gyro)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_GYRO - ) - return ( - self.__state[CONSTANTS.CLUE_STATE.GYRO_X], - self.__state[CONSTANTS.CLUE_STATE.GYRO_Y], - self.__state[CONSTANTS.CLUE_STATE.GYRO_Z], - ) - - @property - def gesture(self): - """A gesture code if gesture is detected. Shows ``0`` if no gesture detected. - ``1`` if an UP gesture is detected, ``2`` if DOWN, ``3`` if LEFT, and ``4`` if RIGHT. - This example prints the gesture values. Try moving your hand up, down, left or right over - the sensor to see the value change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Gesture: {}".format(clue.gesture)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_GESTURE - ) - gesture_mapping = {"": 0, "up": 1, "down": 2, "left": 3, "right": 4} - return gesture_mapping.get(self.__state[CONSTANTS.CLUE_STATE.GESTURE], 0) - - @property - def humidity(self): - """The measured relative humidity in percent. - This example prints the value. Try breathing on the sensor to see the values change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Humidity: {:.1f}%".format(clue.humidity)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_HUMIDITY - ) - return self.__state[CONSTANTS.CLUE_STATE.HUMIDITY] - - @property - def pressure(self): - """The barometric pressure in hectoPascals. - This example prints the value. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - print("Pressure: {:.3f}hPa".format(clue.pressure)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_PRESSURE - ) - return self.__state[CONSTANTS.CLUE_STATE.PRESSURE] - - @property - def altitude(self): - """The altitude in meters based on the sea level pressure at your location. You must set - ``sea_level_pressure`` to receive an accurate reading. - This example prints the value. Try moving the board vertically to see the value change. - .. code-block:: python - from adafruit_clue import clue - clue.sea_level_pressure = 1015 - print("Altitude: {:.1f}m".format(clue.altitude)) - """ - # National Oceanic and Atmospheric Administration (NOAA) formula for converting atmospheric pressure to pressure altitude. - OUTSIDE_MULTIPLER_CONSTANT = 44330 - POWER_CONSTANT = 0.1903 - WHOLE_CONSTANT = 1 - - altitude = OUTSIDE_MULTIPLER_CONSTANT * ( - WHOLE_CONSTANT - - math.pow( - self.__state[CONSTANTS.CLUE_STATE.PRESSURE] - / self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE], - POWER_CONSTANT, - ) - ) - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_ALTITUDE - ) - return altitude - - @property - def sea_level_pressure(self): - """Set to the pressure at sea level at your location, before reading altitude for - the most accurate altitude measurement. - This example prints the value. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - clue.sea_level_pressure = 1015 - print("Pressure: {:.3f}hPa".format(clue.pressure)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SEA_LEVEL_PRESSURE - ) - return self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE] - - @sea_level_pressure.setter - def sea_level_pressure(self, value): - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SEA_LEVEL_PRESSURE - ) - self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE] = value - - @property - def pixel(self): - """The NeoPixel RGB LED. - This example turns the NeoPixel purple. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - clue.pixel.fill((255, 0, 255)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_PIXEL - ) - return self.__state[CONSTANTS.CLUE_STATE.PIXEL] - - @property - def touch_0(self): - """Not Implemented! - - Detect touch on capacitive touch pad 0. - .. image :: ../docs/_static/pad_0.jpg - :alt: Pad 0 - This example prints when pad 0 is touched. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.touch_0: - print("Touched pad 0") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TOUCH - ) - common.utils.print_for_unimplemented_functions("touch_0") - - @property - def touch_1(self): - """Not Implemented! - - Detect touch on capacitive touch pad 1. - .. image :: ../docs/_static/pad_1.jpg - :alt: Pad 1 - This example prints when pad 1 is touched. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.touch_1: - print("Touched pad 1") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TOUCH - ) - common.utils.print_for_unimplemented_functions("touch_1") - - @property - def touch_2(self): - """Not Implemented! - - Detect touch on capacitive touch pad 2. - .. image :: ../docs/_static/pad_2.jpg - :alt: Pad 2 - This example prints when pad 2 is touched. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.touch_2: - print("Touched pad 2") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TOUCH - ) - common.utils.print_for_unimplemented_functions("touch_2") - - @property - def white_leds(self): - """The red led next to the USB plug labeled LED. - .. image :: ../docs/_static/white_leds.jpg - :alt: White LEDs - This example turns on the white LEDs. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - clue.white_leds = True - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_WHITE_LEDS - ) - return self.__state[CONSTANTS.CLUE_STATE.WHITE_LEDS] - - @white_leds.setter - def white_leds(self, value): - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_WHITE_LEDS - ) - self.__set_leds(CONSTANTS.CLUE_STATE.WHITE_LEDS, value) - - @property - def red_led(self): - """The red led next to the USB plug labeled LED. - .. image :: ../docs/_static/red_led.jpg - :alt: Red LED - This example turns on the red LED. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - clue.red_led = True - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_RED_LED - ) - return self.__state[CONSTANTS.CLUE_STATE.RED_LED] - - @red_led.setter - def red_led(self, value): - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_RED_LED - ) - self.__set_leds(CONSTANTS.CLUE_STATE.RED_LED, value) - - def play_tone(self, frequency, duration): - """ Not Implemented! - Produce a tone using the speaker. Try changing frequency to change - the pitch of the tone. - :param int frequency: The frequency of the tone in Hz - :param float duration: The duration of the tone in seconds - .. image :: ../docs/_static/speaker.jpg - :alt: Speaker - This example plays a 880 Hz tone for a duration of 1 second. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - clue.play_tone(880, 1) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions(Clue.play_tone.__name__) - - def start_tone(self, frequency): - """ Not Implemented! - Produce a tone using the speaker. Try changing frequency to change - the pitch of the tone. - :param int frequency: The frequency of the tone in Hz - .. image :: ../docs/_static/speaker.jpg - :alt: Speaker - This example plays a 523Hz tone when button A is pressed and a 587Hz tone when button B is - pressed, only while the buttons are being pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.button_a: - clue.start_tone(523) - elif clue.button_b: - clue.start_tone(587) - else: - clue.stop_tone() - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions(Clue.start_tone.__name__) - - def stop_tone(self): - """ Not Implemented! - Use with start_tone to stop the tone produced. - .. image :: ../docs/_static/speaker.jpg - :alt: Speaker - This example plays a 523Hz tone when button A is pressed and a 587Hz tone when button B is - pressed, only while the buttons are being pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.button_a: - clue.start_tone(523) - elif clue.button_b: - clue.start_tone(587) - else: - clue.stop_tone() - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions(Clue.stop_tone.__name__) - - @property - def sound_level(self): - """Not Implemented! - Obtain the sound level from the microphone (sound sensor). - .. image :: ../docs/_static/microphone.jpg - :alt: Microphone (sound sensor) - This example prints the sound levels. Try clapping or blowing on - the microphone to see the levels change. - .. code-block:: python - from adafruit_clue import clue - while True: - print(clue.sound_level) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions("sound_level") - - def loud_sound(self, sound_threshold=200): - """Not Implemented! - Utilise a loud sound as an input. - :param int sound_threshold: Threshold sound level must exceed to return true (Default: 200) - .. image :: ../docs/_static/microphone.jpg - :alt: Microphone (sound sensor) - This example turns the NeoPixel LED blue each time you make a loud sound. - Try clapping or blowing onto the microphone to trigger it. - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.loud_sound(): - clue.pixel.fill((0, 50, 0)) - else: - clue.pixel.fill(0) - You may find that the code is not responding how you would like. - If this is the case, you can change the loud sound threshold to - make it more or less responsive. Setting it to a higher number - means it will take a louder sound to trigger. Setting it to a - lower number will take a quieter sound to trigger. The following - example shows the threshold being set to a higher number than - the default. - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.loud_sound(sound_threshold=300): - clue.pixel.fill((0, 50, 0)) - else: - clue.pixel.fill(0) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions(Clue.loud_sound.__name__) - - @staticmethod - def simple_text_display( - title=None, - title_color=(255, 255, 255), - title_scale=1, # pylint: disable=too-many-arguments - text_scale=1, - font=None, - colors=None, - ): - """Display lines of text on the CLUE display. Lines of text are created in order as shown - in the example below. If you skip a number, the line will be shown blank on the display, - e.g. if you include ``[0]`` and ``[2]``, the second line on the display will be empty, and - the text specified for lines 0 and 2 will be displayed on the first and third line. - Remember, Python begins counting at 0, so the first line on the display is 0 in the code. - - Setup occurs before the loop. For data to be dynamically updated on the display, you must - include the data call in the loop by using ``.text =``. For example, if setup is saved as - ``clue_data = display_clue_data()`` then ``clue_data[0].text = clue.proximity`` must be - inside the ``while True:`` loop for the proximity data displayed to update as the - values change. You must call ``show()`` at the end of the list for anything to display. - See example below for usage. - - :param str title: The title displayed above the data. Set ``title="Title text"`` to provide - a title. Defaults to None. - :param title_color: The color of the title. Not necessary if no title is provided. Defaults - to white (255, 255, 255). - :param int title_scale: Scale the size of the title. Not necessary if no title is provided. - Defaults to 1. - :param int text_scale: Scale the size of the data lines. Scales the title as well. - Defaults to 1. - :param str font: The font to use to display the title and data. Defaults to built in - ``terminalio.FONT``. - :param colors: A list of colors for the lines of data on the display. If you provide a - single color, all lines will be that color. Otherwise it will cycle through - the list you provide if the list is less than the number of lines displayed. - Default colors are used if ``colors`` is not set. For example, if creating - two lines of data, ``colors=((255, 255, 255), (255, 0, 0))`` would set the - first line white and the second line red, and if you created four lines of - data with the same setup, it would alternate white and red. - - .. image :: ../docs/_static/display_clue_data.jpg - :alt: Display Clue Data demo - - This example displays three lines with acceleration, gyro and magnetic data on the display. - Remember to call ``show()`` after the list to update the display. - - .. code-block:: python - - from adafruit_clue import clue - - clue_data = clue.simple_text_display(title="CLUE Sensor Data!", title_scale=2) - - while True: - clue_data[0].text = "Acceleration: {:.2f} {:.2f} {:.2f}".format(*clue.acceleration) - clue_data[1].text = "Gyro: {:.2f} {:.2f} {:.2f}".format(*clue.gyro) - clue_data[2].text = "Magnetic: {:.3f} {:.3f} {:.3f}".format(*clue.magnetic) - clue_data.show() - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TEXT_DISPLAY - ) - return _ClueSimpleTextDisplay( - title=title, - title_color=title_color, - title_scale=title_scale, - text_scale=text_scale, - font=font, - colors=colors, - ) - - def update_state(self, new_state): - for event in new_state.keys(): - if event in CONSTANTS.EXPECTED_INPUT_BUTTONS: - self.__update_button(event, new_state.get(event)) - elif event in CONSTANTS.ALL_EXPECTED_INPUT_EVENTS: - if self.__state[event] != new_state[event]: - self.__state[event] = new_state.get(event) - - # helpers - def __update_button(self, button, value): - if value: - self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS].add( - self.button_mapping[button] - ) - self.__state[button] = value - - def __set_leds(self, led, value): - value = bool(value) - self.__state[led] = value - sendable_json = {led: value} - if common.utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - sendable_json, CONSTANTS.CLUE - ) - else: - common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) - - -clue = Clue() # pylint: disable=invalid-name -"""Object that is automatically created on import. - - To use, simply import it from the module: - - .. code-block:: python - - from adafruit_clue import clue -""" diff --git a/src/clue/adafruit_display_text/label.py b/src/clue/adafruit_display_text/label.py deleted file mode 100644 index f7bab0b7f..000000000 --- a/src/clue/adafruit_display_text/label.py +++ /dev/null @@ -1,280 +0,0 @@ -# The MIT License (MIT) -# -# Copyright (c) 2019 Scott Shawcroft for Adafruit Industries LLC -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -""" -`adafruit_display_text.label` -==================================================== - -Displays text labels using CircuitPython's displayio. - -* Author(s): Scott Shawcroft - -Implementation Notes --------------------- - -**Hardware:** - -**Software and Dependencies:** - -* Adafruit CircuitPython firmware for the supported boards: - https://github.com/adafruit/circuitpython/releases - -""" - -import displayio - -__version__ = "0.0.0-auto.0" -__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git" - - -class Label(displayio.Group): - """A label displaying a string of text. The origin point set by ``x`` and ``y`` - properties will be the left edge of the bounding box, and in the center of a M - glyph (if its one line), or the (number of lines * linespacing + M)/2. That is, - it will try to have it be center-left as close as possible. - - :param Font font: A font class that has ``get_bounding_box`` and ``get_glyph``. - Must include a capital M for measuring character size. - :param str text: Text to display - :param int max_glyphs: The largest quantity of glyphs we will display - :param int color: Color of all text in RGB hex - :param double line_spacing: Line spacing of text to display""" - - def __init__( - self, - font, - *, - x=0, - y=0, - text=None, - max_glyphs=None, - color=0xFFFFFF, - background_color=None, - line_spacing=1.25, - **kwargs - ): - if not max_glyphs and not text: - raise RuntimeError("Please provide a max size, or initial text") - if not max_glyphs: - max_glyphs = len(text) - super().__init__(max_size=max_glyphs, auto_write=False, **kwargs) - self.width = max_glyphs - self.font = font - self._text = None - self._anchor_point = (0, 0) - self.x = x - self.y = y - - self.palette = displayio.Palette(2) - if background_color is not None: - self.palette[0] = background_color - self.palette.make_opaque(0) - self._transparent_background = False - else: - self.palette[0] = 0 - self.palette.make_transparent(0) - self._transparent_background = True - self.palette[1] = color - - bounds = self.font.get_bounding_box() - self.height = bounds[1] - self._line_spacing = line_spacing - self._boundingbox = None - - if text is not None: - self._update_text(str(text)) - - def _update_text(self, new_text): # pylint: disable=too-many-locals - x = 0 - y = 0 - i = 0 - old_c = 0 - y_offset = int( - ( - self.font.get_glyph(ord("M")).height - - new_text.count("\n") * self.height * self.line_spacing - ) - / 2 - ) - # print("y offset from baseline", y_offset) - left = right = top = bottom = 0 - for character in new_text: - if character == "\n": - y += int(self.height * self._line_spacing) - x = 0 - continue - glyph = self.font.get_glyph(ord(character)) - if not glyph: - continue - right = max(right, x + glyph.width) - if y == 0: # first line, find the Ascender height - top = min(top, -glyph.height + y_offset) - bottom = max(bottom, y - glyph.dy + y_offset) - position_y = y - glyph.height - glyph.dy + y_offset - position_x = x + glyph.dx - if ( - not self._text - or old_c >= len(self._text) - or character != self._text[old_c] - ): - try: - face = displayio.TileGrid( - glyph.bitmap, - pixel_shader=self.palette, - default_tile=glyph.tile_index, - tile_width=glyph.width, - tile_height=glyph.height, - position=(position_x, position_y), - ) - except TypeError: - face = displayio.TileGrid( - glyph.bitmap, - pixel_shader=self.palette, - default_tile=glyph.tile_index, - tile_width=glyph.width, - tile_height=glyph.height, - x=position_x, - y=position_y, - ) - if i < len(self): - self[i] = face - else: - self.append(face) - elif self._text and character == self._text[old_c]: - try: - self[i].position = (position_x, position_y) - except AttributeError: - self[i].x = position_x - self[i].y = position_y - - x += glyph.shift_x - - # TODO skip this for control sequences or non-printables. - i += 1 - old_c += 1 - # skip all non-prinables in the old string - while ( - self._text - and old_c < len(self._text) - and ( - self._text[old_c] == "\n" - or not self.font.get_glyph(ord(self._text[old_c])) - ) - ): - old_c += 1 - # Remove the rest - while len(self) > i: - self.pop() - self._text = new_text - self._boundingbox = (left, top, left + right, bottom - top) - - @property - def bounding_box(self): - """An (x, y, w, h) tuple that completely covers all glyphs. The - first two numbers are offset from the x, y origin of this group""" - return tuple(self._boundingbox) - - @property - def line_spacing(self): - """The amount of space between lines of text, in multiples of the font's - bounding-box height. (E.g. 1.0 is the bounding-box height)""" - return self._line_spacing - - @line_spacing.setter - def line_spacing(self, spacing): - if self._line_spacing != spacing: - self._line_spacing = spacing - self._Group__trigger_draw() - - @property - def color(self): - """Color of the text as an RGB hex number.""" - return self.palette[1] - - @color.setter - def color(self, new_color): - self.palette[1] = new_color - self._Group__trigger_draw() - - @property - def background_color(self): - """Color of the background as an RGB hex number.""" - if not self._transparent_background: - return self.palette[0] - return None - - @background_color.setter - def background_color(self, new_color): - if new_color is not None: - self.palette[0] = new_color - self.palette.make_opaque(0) - self._transparent_background = False - else: - self.palette[0] = 0 - self.palette.make_transparent(0) - self._transparent_background = True - - self._Group__trigger_draw() - - @property - def text(self): - """Text to display.""" - return self._text - - @text.setter - def text(self, new_text): - # APR 2, 2O2O -> - # Added manual trigger to update text since - # on-screen text updating is a lot faster this way. - - # Previously, the group was set to auto_write=True - # and each letter in the group was individually - # drawn and sent to the front-end display. - if new_text != self._text: - self._update_text(str(new_text)) - self._Group__trigger_draw() - - @property - def anchor_point(self): - """Point that anchored_position moves relative to. - Tuple with decimal percentage of width and height. - (E.g. (0,0) is top left, (1.0, 0.5): is middle right.)""" - return self._anchor_point - - @anchor_point.setter - def anchor_point(self, new_anchor_point): - if self._anchor_point != new_anchor_point: - self._Group__trigger_draw() - - @property - def anchored_position(self): - """Position relative to the anchor_point. Tuple containing x,y - pixel coordinates.""" - return ( - self.x - self._boundingbox[2] * self._anchor_point[0], - self.y - self._boundingbox[3] * self._anchor_point[1], - ) - - @anchored_position.setter - def anchored_position(self, new_position): - self.x = int(new_position[0] - (self._boundingbox[2] * self._anchor_point[0])) - self.y = int(new_position[1] - (self._boundingbox[3] * self._anchor_point[1])) - self._Group__trigger_draw() diff --git a/src/clue/adafruit_slideshow.py b/src/clue/adafruit_slideshow.py deleted file mode 100644 index aa1fb6b65..000000000 --- a/src/clue/adafruit_slideshow.py +++ /dev/null @@ -1,407 +0,0 @@ -from PIL import Image - -import os -import base64 -from io import BytesIO -from base_circuitpython import base_cp_constants as CONSTANTS -import time -from random import shuffle -import common -import board - -# taken from adafruit -# https://github.com/adafruit/Adafruit_CircuitPython_Slideshow/blob/master/adafruit_slideshow.py - - -class PlayBackOrder: - """Defines possible slideshow playback orders.""" - - # pylint: disable=too-few-public-methods - ALPHABETICAL = 0 - """Orders by alphabetical sort of filenames""" - - RANDOM = 1 - """Randomly shuffles the images""" - # pylint: enable=too-few-public-methods - - -class PlayBackDirection: - """Defines possible slideshow playback directions.""" - - # pylint: disable=too-few-public-methods - BACKWARD = -1 - """The next image is before the current image. When alphabetically sorted, this is towards A.""" - - FORWARD = 1 - """The next image is after the current image. When alphabetically sorted, this is towards Z.""" - # pylint: enable=too-few-public-methods - - -# custom -class SlideShow: - """ - Class for displaying a slideshow of .bmp images on displays. - :param str folder: Specify the folder containing the image files, in quotes. Default is - the root directory, ``"/"``. - :param PlayBackOrder order: The order in which the images display. You can choose random - (``RANDOM``) or alphabetical (``ALPHABETICAL``). Default is - ``ALPHABETICAL``. - :param bool loop: Specify whether to loop the images or play through the list once. `True` - if slideshow will continue to loop, ``False`` if it will play only once. - Default is ``True``. - :param int dwell: The number of seconds each image displays, in seconds. Default is 3. - :param bool fade_effect: Specify whether to include the fade effect between images. ``True`` - tells the code to fade the backlight up and down between image display - transitions. ``False`` maintains max brightness on the backlight between - image transitions. Default is ``True``. - :param bool auto_advance: Specify whether to automatically advance after dwell seconds. ``True`` - if slideshow should auto play, ``False`` if you want to control advancement - manually. Default is ``True``. - :param PlayBackDirection direction: The playback direction. - Example code for Hallowing Express. With this example, the slideshow will play through once - in alphabetical order: - .. code-block:: python - from adafruit_slideshow import PlayBackOrder, SlideShow - import board - import pulseio - slideshow = SlideShow(board.DISPLAY, pulseio.PWMOut(board.TFT_BACKLIGHT), folder="/", - loop=False, order=PlayBackOrder.ALPHABETICAL) - while slideshow.update(): - pass - Example code for Hallowing Express. Sets ``dwell`` to 0 seconds, turns ``auto_advance`` off, - and uses capacitive touch to advance backwards and forwards through the images and to control - the brightness level of the backlight: - .. code-block:: python - from adafruit_slideshow import PlayBackOrder, SlideShow, PlayBackDirection - import touchio - import board - import pulseio - forward_button = touchio.TouchIn(board.TOUCH4) - back_button = touchio.TouchIn(board.TOUCH1) - brightness_up = touchio.TouchIn(board.TOUCH3) - brightness_down = touchio.TouchIn(board.TOUCH2) - slideshow = SlideShow(board.DISPLAY, pulseio.PWMOut(board.TFT_BACKLIGHT), folder="/", - auto_advance=False, dwell=0) - while True: - if forward_button.value: - slideshow.direction = PlayBackDirection.FORWARD - slideshow.advance() - if back_button.value: - slideshow.direction = PlayBackDirection.BACKWARD - slideshow.advance() - if brightness_up.value: - slideshow.brightness += 0.001 - elif brightness_down.value: - slideshow.brightness -= 0.001 - """ - - def __init__( - self, - display, - backlight_pwm=None, - *, - folder=".", - order=PlayBackOrder.ALPHABETICAL, - loop=True, - dwell=3, - fade_effect=True, - auto_advance=True, - direction=PlayBackDirection.FORWARD, - ): - self._BASE_DWELL = 0.3 - self._BASE_DWELL_DARK = 0.7 - self._NO_FADE_TRANSITION_INCREMENTS = 18 - - self.auto_advance = auto_advance - """Enable auto-advance based on dwell time. Set to ``False`` to manually control.""" - - self.loop = loop - """Specifies whether to loop through the images continuously or play through the list once. - ``True`` will continue to loop, ``False`` will play only once.""" - - self.fade_effect = fade_effect - """Whether to include the fade effect between images. ``True`` tells the code to fade the - backlight up and down between image display transitions. ``False`` maintains max - brightness on the backlight between image transitions.""" - - self.dwell = self._BASE_DWELL + dwell - """The number of seconds each image displays, in seconds.""" - - self.direction = direction - """Specify the playback direction. Default is ``PlayBackDirection.FORWARD``. Can also be - ``PlayBackDirection.BACKWARD``.""" - - self.advance = self.__advance_with_fade - """Displays the next image. Returns True when a new image was displayed, False otherwise. - """ - - self.fade_frames = 8 - - # assign new advance method if fade is disabled - if not fade_effect: - self.advance = self.__advance_no_fade - - self._img_start = None - - self.brightness = 1.0 - - # blank screen for start - self._curr_img_handle = Image.new( - "RGBA", (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - - # if path is relative, this makes sure that - # it's relative to the users's code file - abs_path_parent_dir = os.path.abspath( - os.path.join(common.utils.abs_path_to_user_file, os.pardir) - ) - abs_path_folder = os.path.normpath(os.path.join(abs_path_parent_dir, folder)) - - self.folder = abs_path_folder - - # get files within specified directory - self.dirs = os.listdir(self.folder) - - self._order = order - self._curr_img = "" - self._current_image_index = None - - # load images into main queue - self.__load_images() - - display.show(self) - # show the first working image - self.advance() - - common.telemetry.telemetry_py.send_telemetry( - common.telemetry.TelemetryEvent.CLUE_API_SLIDESHOW - ) - - @property - def current_image_name(self): - """Returns the current image name.""" - return self._curr_img - - @property - def order(self): - """Specifies the order in which the images are displayed. Options are random (``RANDOM``) or - alphabetical (``ALPHABETICAL``). Default is ``RANDOM``.""" - return self._order - - @order.setter - def order(self, order): - if order not in [PlayBackOrder.ALPHABETICAL, PlayBackOrder.RANDOM]: - raise ValueError("Order must be either 'RANDOM' or 'ALPHABETICAL'") - - self._order = order - self.__load_images() - - @property - def brightness(self): - """Brightness of the backlight when an image is displaying. Clamps to 0 to 1.0""" - return self._brightness - - @brightness.setter - def brightness(self, brightness): - if brightness < 0: - brightness = 0 - elif brightness > 1.0: - brightness = 1.0 - self._brightness = brightness - - def update(self): - """Updates the slideshow to the next image.""" - now = time.monotonic() - if not self.auto_advance or now - self._img_start < self.dwell: - return True - - return self.advance() - - def __get_next_img(self): - - if self.direction == PlayBackDirection.FORWARD: - if self._current_image_index == None: - self._current_image_index = 0 - else: - self._current_image_index += 1 - - if self._current_image_index >= len(self.dir_imgs): - - if self.loop: - self._current_image_index = 0 - self.__load_images() - else: - self._current_image_index = len(self.dir_imgs) - 10 - return "" - - else: - if self._current_image_index == None: - self._current_image_index = len(self.dir_imgs) - 1 - else: - self._current_image_index -= 1 - - if self._current_image_index < 0: - if self.loop: - self._current_image_index = len(self.dir_imgs) - 1 - self.__load_images() - else: - self._current_image_index = 0 - return "" - - img = self.dir_imgs[self._current_image_index] - return img - - def __load_images(self): - self.dir_imgs = [] - for d in self.dirs: - try: - new_path = os.path.join(self.folder, d) - - # only add bmp imgs - if os.path.splitext(new_path)[-1] == CONSTANTS.BMP_IMG_ENDING: - self.dir_imgs.append(new_path) - except Image.UnidentifiedImageError as e: - continue - - if not len(self.dir_imgs): - raise RuntimeError(CONSTANTS.NO_VALID_IMGS_ERR) - - if self._order == PlayBackOrder.RANDOM: - shuffle(self.dir_imgs) - else: - self.dir_imgs.sort() - - def __advance_with_fade(self): - if board.DISPLAY.active_group != self: - return - - old_img = self._curr_img_handle - advance_sucessful = False - - while not advance_sucessful: - new_path = self.__get_next_img() - if new_path == "": - self._img_start = time.monotonic() - return False - - try: - new_img = Image.open(new_path) - - new_img = new_img.convert("RGBA") - new_img.putalpha(255) - - new_img = new_img.crop( - (0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - - if new_img.size[0] < 240 or new_img.size[1] < 240: - black_overlay = Image.new( - "RGBA", - CONSTANTS.SCREEN_HEIGHT_WIDTH, - CONSTANTS.SCREEN_HEIGHT_WIDTH, - ) - black_overlay.paste(new_img) - new_img = black_overlay - - black_overlay = Image.new("RGBA", new_img.size) - advance_sucessful = True - except Image.UnidentifiedImageError as e: - pass - - # fade out old photo - for i in range(self.fade_frames, -1, -1): - sendable_img = Image.blend( - black_overlay, old_img, i * self.brightness / self.fade_frames - ) - self.__send(sendable_img) - - time.sleep(self._BASE_DWELL_DARK) - - # fade in new photo - for i in range(self.fade_frames + 1): - sendable_img = Image.blend( - black_overlay, new_img, i * self.brightness / self.fade_frames - ) - self.__send(sendable_img) - - self._curr_img_handle = new_img - self._curr_img = new_path - self._img_start = time.monotonic() - return True - - def __advance_no_fade(self): - if board.DISPLAY.active_group != self: - return - - old_img = self._curr_img_handle - - advance_sucessful = False - - while not advance_sucessful: - new_path = self.__get_next_img() - if new_path == "": - self._img_start = time.monotonic() - return False - - try: - new_img = Image.open(new_path) - - new_img = new_img.crop( - (0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - - if ( - new_img.size[0] < CONSTANTS.SCREEN_HEIGHT_WIDTH - or new_img.size[1] < CONSTANTS.SCREEN_HEIGHT_WIDTH - ): - black_overlay = Image.new( - "RGBA", - CONSTANTS.SCREEN_HEIGHT_WIDTH, - CONSTANTS.SCREEN_HEIGHT_WIDTH, - ) - black_overlay.paste(new_img) - new_img = black_overlay - - self._curr_img = new_path - - new_img = new_img.convert("RGBA") - new_img.putalpha(255) - advance_sucessful = True - except Image.UnidentifiedImageError as e: - pass - - if self.brightness < 1.0: - black_overlay = Image.new("RGBA", new_img.size) - new_img = Image.blend(black_overlay, new_img, self.brightness) - - # gradually scroll new img over old img - for i in range(self._NO_FADE_TRANSITION_INCREMENTS + 1): - curr_y = ( - i * CONSTANTS.SCREEN_HEIGHT_WIDTH / self._NO_FADE_TRANSITION_INCREMENTS - ) - img_piece = new_img.crop((0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, curr_y)) - old_img.paste(img_piece) - self.__send(old_img) - - self._curr_img_handle = new_img - self._curr_img = new_path - self._img_start = time.monotonic() - return True - - def __send(self, img): - # sends current bmp_img to the frontend - buffered = BytesIO() - img.save(buffered, format=CONSTANTS.BMP_IMG) - byte_base64 = base64.b64encode(buffered.getvalue()) - - # only send the base_64 string contents - img_str = str(byte_base64)[2:-1] - - sendable_json = {CONSTANTS.BASE_64: img_str} - - if common.utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - sendable_json, CONSTANTS.CLUE - ) - else: - common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) diff --git a/src/clue/test/__init__.py b/src/clue/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/clue/test/img/test_clue_text_1.bmp b/src/clue/test/img/test_clue_text_1.bmp deleted file mode 100644 index 7ea72fe2cea4b656b69e41a9a262552dc2a18a7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 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 w^^Bjk^Sd3rc15q8XCwq88Il86E`aR{Pgpe zU%&nM^Us&p-ydIpfB)z2Hy=N|rq`d>zyJ2#$6tT{Uid!&0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7csfqx17^8Lrx|Nixl|FQTQehuwUW=`fOJ?-1vKe=I}Cp)Ke z{+5$(Px6^*b9*cEEi>I`XPaAR=36HBC;7~r%-NswlW*U-CvTh1X>#)INj@`eZf|A2 zWv2V=Y;)_(e9PqiB%hg+Is0>d^6fkKXHV{PZkgP-`BqQsZ~OM{c7FP9yQl4M^-p`Y^X>PxecqFE=5wEO%jCYzw|ZKC z+qZYO^V4_RJ#Bxhf7-L1Z@;(g^PZeDpZlC!CiiW=)zkXhzP-DhpT67fY5QCK)1K{o z`@L)qBf-M8P>dT!;XJ?);hztunO+0M7$+xG3ATl-t@ww~#}{jSz?E1x~nx!sog?9Bai zp7w0#Z{6SSobKB_w|ZKC+qZYO^ZD*{Znxz=J99ssr#;*GTlcp+r~7u#t)AB3_U+y6 ze7-xK+ikhe&fHJuY0q~4*8T0y>Au}_tEct1eS3F1pYKlRc3bYVGxyVZ+OwU%b$`2a zx^MT~>S_IL-`+jR=eH+wc4j{JZQjm**1OZ+)$VNjX@ASN{q)`J$+`7R_tVbIPv^WX zzs-G{xAUL%?(}!HJKKKR-|}rgeK&h@Zavfev@`S5Id98vbKmCe{Aay8{ax+Owx9O5 zeA`do&7PcF&vZZS%=~oD+w$Aow|P7NS?^ANSG%+Ar~NJ8_S1K>C+F5P-A_9=^4Zzu z?cde<^PZMz`~0@e?b}=XeD|dDB%hf!x3@B%ncTNI^KH&=TPF7#`Rr_S-f%K!&q=;z zp7i9mZEo-0+UL6`ohSLsw7I>N`OM_L&6#g=e%ms+-^gcYoAZW~IeSj>E%T%&zio4S z_trk&J?T8jXQs{Vt;}a8_ifI6oAcY2$^Aw?JKLN$oXpvCl5d$OJ^5{$+q<{+`R+;Q zNj@`eZf|8iGr4bb=G&a#woLA~^ZC}3d3tAi>sC+e-`-E}pXRskpY~7h-_B3(Z~5t+ z+dZv+dp~uU=C|*k_D}EM&QI@e`RSe8J*|IxKXsVqx9^|!Pw(H(Pw#K}>7Cm>t$%wz zb(rS2@1OQh@88Z(@6UYRmUCuK=KMD2lW*TGGrfPBe}~_jH|KnE+jjoshL*|Oa&Gyy Z&u?>X`FGw=@1N%1;kW0_Isfl%e*nkUw}=1$ diff --git a/src/clue/test/img/test_display_text_2.bmp b/src/clue/test/img/test_display_text_2.bmp deleted file mode 100644 index c08c37fe02c3cabf6a774b181a985bbe629605e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeIx(M`iJ5CG7?0DLn76LbLnJ0;(&z!!5c10!(skY(vma7bHF@}f98U7WM~e0@9~ zo^Gel>k#81#{1W}neHQsE8f4}O{b9wPXYu85FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAVA={0&mYRZNZFxmx&_rVcvbg`An`=pIM>L*G&I*ByPJBY*-*V zp*6$GAe35#m2rai)oP}HI}&FF&ut5gbi(!L)b6dBrMuepIr??$J7j4`jnA)ptC{g? zIn#;nL7+eDzC&vNTrShEd%1WIr|CETc|XSn@~;1vncl8n{g`pqdl1N;slBu`b1tiF n%cwRJoNFz0wkPlp`?(?K-s%q91OWj81PBlyK!5;&Zv{R8Ce|~( diff --git a/src/clue/test/img/test_display_text_3.bmp b/src/clue/test/img/test_display_text_3.bmp deleted file mode 100644 index 3b68886396ece1aee9d6df5771e9a874a2679c36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeIw!EGK#3EEoHUAZ9dAfDA*k9DaP9Kfizb z>yNizKi^)zUthmJ|Ns5;_T}}z*U#(x@6T`l{{Hs|{}LcTfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjX*gusvPpLUh*fIrqr*q+3NANaLgjn=;Ot46nf zZ%^XFTl1$Mw39v!aQpo_3EPvn@OJx8KWHa?8sPT(brQBGapCRupMKCz`ZU1p_v<8V zPvXMc?LYmXo%Csd+wa#&*q+3Nx7&aEK|ATw0Jq<-ldwIB3vajo^n-TNrvYxiUngOE z5*OZX|LF(qq)!9fe!ot__9TZ~Sgg1ZSih&2oT|wUPWH++xPHQHu5+p; zH#pfV+u-^Mv$@Wxn%v-IuWWzt~|4NmsTHn@JmY_4;v zCO0_QE8F1u3A4G*shZs2WUp+4>nF_SI;U!KgOk0o4X&Rso9mpa$qi2S$~L%u!fdW{ zswOu$*(=-N`U$hS&Z(N*;AF3CgX<^E<~pZpa)Xn-vJI}EFq`X~s>uyb_R2Q6e!^_7 zbE+mcIN2-P;Q9%(xz4GY+~8!dY=i43%;q|$YI1{&2oT|wUPWH++xPHQH zu5+p;H#pfV+u-^Mv$@Wxn%v-IuWWzt~|4NmsTHn@Jm zY_4;vCO0_QE8F1u3A4G*smeB(`DDGas*jp5o9mn^ujTh$XBt`6?|uEhOJH&rS+A@r z^T~Q;Rart+wZP;qvR+wLJ@wUT)+?*J%HZ$s5t!UX)+?*ZOtM~CRhCdyEik!@tXEc5 zPknWo^~$QQGWh#@1SWTp^~$O;ldM-(l_gYF3ry}J>y=g2Q(v8Cy|SvS4F3KefyrHD zy|SvzB)LbeM` zzOl((?NBb&3GP9%ILFC_BAbYe$)z%uq?=Dch%*~^bhhiuiweAb6#bWHb6SFaK=dl49w)n(sOx$@`ES|A$3DPsZv~PJ^ z0eQad(?0Tx$@3$h{kC6Po^SiKkNjft{K#jY^rcHgmyY>+E{!UeFPxl5soqSW1ZnA* zDV9c+%NI`0qf~DuP=d5{%oIzb%H<0u=TWLR6DUDiI%bNcQRVW5lk+Imn+cR4Egdt( z(x`Iz!pV7*>U4pnb(Uz*~q=QnpJaeuI9iA@VPBxZ$%jKnGd7#o;s*X<<=wxH5w_IL2 zmIo@mrRw-(flfA-dduadV|k#`TdIyv7U*PSskdBSI+h12y`}2-WPwgLI=$IEPtMgm zS@qrmoosY^vud84t9i2Oy#+ei==5gQJULhMWYv2Mbh6Ru&8m5FuI9MfV^F+V}+&6ialCD6&nQg6AOkNF8oZ@#QbfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C79wqSY{r%_P7k>Aj$G-kPV)BJc8g)cqV(RwoeB=py z=!F9NvN3V;g|J2)5tx{|eLEj{0v~#zz`kruoO~gyQAY$Orf%QPN1nikUMR3H8xtpA z2y4_4fr+WxxAT!F@Szt9?90Z)$rr*Jbwprd>h|q?jQXbSAh#>B}@Ozp=7CZ=xR&c~m_0!@K^*_b%FiK+d# zz{J$;+xhr&SfDAeFB=mlH!-yz7nqp3eLEk24hu8|_GM$@?w{Pd;&tZY4 zz`kruoZQ6Jeq3N;>h|q?{5dSp6xf%IiIba{+K&rNOx?bnk3WY6ngaW>F>!JeQ#%0y z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0yhx& E7mPcEsQ>@~ diff --git a/src/clue/test/img/test_image_shapes_1.bmp b/src/clue/test/img/test_image_shapes_1.bmp deleted file mode 100644 index 6719a7f8d6f1788d8c28c8c7a9d839f2cc4a8435..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeIuOAUZP5JbTN0i2P5f)%iLRAL1|IDqD(f>b9j+05RmuWcLaUQ0_lzJ{9f%JRQY z_4FR9P9s2o009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ j009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7csfnNw*yLO6e diff --git a/src/clue/test/img/test_image_shapes_2.bmp b/src/clue/test/img/test_image_shapes_2.bmp deleted file mode 100644 index ae1f7618d0b2a21643e1668654c47d3932eef879..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeIw+erjb6hzUh0r+hQMqmK`8>OijkQt2aBLbn=Agh@Mao`lQ*e|coZ};cxdA{DK z>;3qB@6O}(*Y#ZAzdxMs_vaty+&lyb5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBm_1kUYLpXe8x{m%kb%-8OJX7$@50X;|XW+wuAp0GL^3FtY3H#-r~ z^MuvWNI=gKyxEC>o+qr1Mgn?{;LT11^gLm8G!oEr1aEdCpyvszqmh7~BY3kD0XS!dO=Lp{HL_p6IR!1WNJxB0nCjxq&usRwE=sAKnI}yH2t@U*G1}uh-Y7>FfN{{Fwj#^UL(|y8U9BE*=C35FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNB!O<=lQ?mf3H z=qv)q3%oTvU8Z}__s);MJQE2l6nH85Uc>+V{cG3@*LN6!V+7Wh{CD1}K4zCpStKy0 zdHDI=cbgrIHy77;A+lR#LE&37D8Sm$pUV@T7gCaLYD1XQ6oo=R+|)NaEuiPLsP&oxdT#2Qofgn@TGV%0V%(%1^@s6 diff --git a/src/clue/test/img/test_image_shapes_4.bmp b/src/clue/test/img/test_image_shapes_4.bmp deleted file mode 100644 index be810780ba72a7f1955073e58b1f243f530dcca3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeI)QBoUM5Cu>r3&?ktkQI0V{?972l`JSbAOa&%Wm-m{?s>YJqk=MSpkL4FTjOyR z_V>TP{qy_b`StDi{@3ySzt{KQ4u2j$I=+sd|M!o>%lnVQ;qc@|fB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pkHwYXuUpHK_Z+&Ee%s3w&c_psx1_61#0nfMIoxnNIcQ;uz zP}a276{yV$WF;hP+S$$NUI}C+Bx~BrTWwY#Do{O3CWta@>ZJ_$Vy1ow6mMjy%NYuNY=EKx7w^gRzk9-o!y-7l|WWPvZk%P)n)~< z5|TCT?B;Z@1hNv6HErdsHY<>okgREEH>Z0gkd=_EX)ABFS%IvCWKBD}Io&IPtb}Au zTY0O^3S=cDYuee(>0SwBB_wOw%3Ez#AS)qR)6Q;A_evluAz9N_-fFV~SqaISc6M{R zR{~iH$(pwER+|;bN=VkUvzybs639wO*0hzk+N{7GCFJn*bm{G6a7WXgM)K=j39L`Z zDZ_`S!=<-#&euKKRtzxX)d@2>c}Q7LcDlG4$J8!uBzN2>&n;oTkY|xj4q)@_TjaSb%$M^l(#^4m zZ70vMt21~ZFrMeeoAWR4&u-DhcK273=l$*ck*|0*&%HP2kM7TI(T|+e>#j|nuXFNM z83OX0u_serCoq`j_J@rto;N&lT(|az{VI8W*wyax!p?aP``~!5zVPOUly({9*NYB| z@p;?}VfMVS=P)0y{Tz_659E30!QKAyC;mQoImYM556>IhuX-0J%JVMPyqk-Z=iRJ& z7Z)neyIAv{E^_lodwAYcyf(j9dET7dfrA3_Jcz6H3V{tH?O|iZf_HYNJnwAbkAJzF zMB2^y@q=_HS18YSvIt{z2@FTt&ADq)`dlk87HMI=b_Kq!S70F0!rZ$e-99JK8fjtv z9KNrf5NL|DFi$K;&#wr4`TysC`T6JPB>T_IzvAwDCIvp9YDu2lhu$3mKW?_adR!009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5(rAaMK_uB+ZYn9QdMd|qHxn4kZpxEFzL z0eS8g)o-PMJg?MucDH~$cZ=$`Qb3+p>N~qzK%Tor^;;<*&nxwv-7O%`-J<%f6p-hY z`p)hakmqhu{Z||9zO%ap=yi(uU-2(F5Evny2 z0eN1j@9b^?dF~d~Z>4}duhe&Tw}3o%i|V&hK%Q6XJG)yzp1Vc$TPYyVEA^e-Eg;X` zqWY~Akmr^9&h8eF=WbE`Rtm`TN_}T{3&?Y~sD3L2+j-Qs3F# z0`lA~s^3Zhd0wgS>}~;h?iST=rGPxI)OU8bfIN4L>bFuro>%HSyIVk>yG8X|DIm`) z^_|@R`Vk;NfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk a1PBlyK!5-N0t5&UAV7cs0RjYO1^x$f_BIRv diff --git a/src/clue/test/img/test_image_shapes_5.bmp b/src/clue/test/img/test_image_shapes_5.bmp deleted file mode 100644 index e5473f83d5742c6a45046fad223e2cdcdf3d1995..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeI)?Qvs85Qb4f0Q@EdBG>@;+xOKyDsN%NtC`lB2O+9} zKmYpi_pgW3tydtckgREYZ_e(OKvp4H(^lTrdIhoy$(pwJ=ImYxWEGM%ZRKsP zS0Jm9tZ931&hC{!Rv}r_R^HZn1+ogsnzr}m>|P0E6_Pb=tydtckgREYZ_e(OKvp4H(^lTrdIhoy$(pwJ=ImYxWEGM%ZRKsP zS0Jm9tZ931&hC{!Rv}r_R^HZn1+ogsnzr}m>|P0E6_Pb=tydtckgREYZ_e(OKvp4H(^lTrdIhoy$(pwJ=ImYxWEGM%ZRKsP zS0Jm9tZ931&hC{!Rv}r_R^HZn1+ogsnzr}m>|P0E6_Pb=tydtckgREYZ_e(OKvp4H(^lTrdIdIA$l>Yf+Si-GhNgWR$sac* zFki@9!-uECwXbvM^V4qX@(gn!Fj>fR$=4dL*WbpycpVl9oCMwiIkvUpV?oI;@7{0Y zp5C!N2wVuf1+rov$9LZAA1!|JqxW%7yLb@zB=8={ryn%^>33p&|C`C{Cv8bL-BRwh ztM>fOm@j&M-Y?hQCFUzVOFB8gJI}sG&-aS?de4%+ za~84N={ff53|UwdtO z{+g5Dl_8+#jC(TW*901SzWaxbFMQtck>hLE{;7E>6_*F0Oeu zFH+CDx$0fKP(APBn)mb~S5Ml9=RM`M`fJtm>f{b=6wq@cuB|5oR!rK5jfo51*_nFY z*@fSFxzGP!tkc`h7QSu`dh=(iB<;=l<{eD`a0>yKGc177^8&O-dP*76b`}>iJ7^MZR==_y+)_NVhKaJg&JVqS0q z>pkV7pH2Nc$)|WeeJ!K8Q_^By#=p|DKBaQJ^zA)9_k5gr+2i@eo?hajuh%h_9qn1` z2<)oo7t;Sx_V&XWX6IBcSIVSG&##=y}H7sXYRE?s2v2jKIV7eB-}w?f%is4LbFsfSwoqzc|Xj zG(NieenvpgdY&n-=TtrGxu>j|UG=Qzneuv0)w7;^%9`0#&w8FIujf=f>$#__nO*g) z=b7?)PSvxXd&-*GRnK~!DX-^LJ?purteIW)tmm2XdQR1|o_org*;UVao++>AR6Xmt zr>vP>^{nTa@_J6yvz~j(n%Py)dY&n-=TtrGxu>j|UG=Qzneuv0)w7;^%9`0#&w8FI zujf=f>$#__nO*g)=b7?)PSvxXd&-*GRnK~!DX-^LJ?purteIW)tmm2XdQR1|o_org z*;UVao++>AR6Xmtr>vP>^{nTa@_J6yvz~j(n%Py)dY&n-=TtrGxu>j|UG=Qzneuv0 z)w7;^%9`0#&w8FIujf=f>$#__nO*g)=b7?)PJOtZdzkDRBB1Axi!$by1oZqRCci01 zVB1MQU5u9_YtjjU%V0LXGJ)jGB!P_w{BgV_R}YfX1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oP8<@E_d! B4ZHvV diff --git a/src/clue/test/img/test_image_text_1.bmp b/src/clue/test/img/test_image_text_1.bmp deleted file mode 100644 index dee4173d2604b57b07aaabb92eb8c5b9057ffeb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230454 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 qN9c#uet_`tL{Z>z?f62Xr~^Y!@q zpWpua_2vEFx3|w9Z=Zku|NQdu``fp-e{c8y{_W-G=f6Mv{O^yq|N7_w0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3_P`g*Voq{ zt3EFat*tuK`#xXwTr2Cg*UJr7pvYmaI9q@{jKJle)e9@yzkMqpVctq@1wPzd45LypJkq@>uBv~d-(g;nc<^% zoV>r%MY8Urtgm{mm37-|&Tqnz&E)-+?=V^SQPx*I*UGx>Wq!{XIGVZS{WEoquKlWY zkDmJ(pYM6sJ$<=rPS4qU)>P|HPtDfM`Tt?Euhm>tt0&d#yPhl6A34{4E2_DwR!_>+ zUC)*3j~w&6HISN@ZRW`LR6VJjk+XRA+N{m!Tgt;-b5cF8)}Pe5b1rSv-4f)@JlA<>9V5sh(Hs zPwHH99y`m`Tve+l<@2uRO7%z1wcmkiuBz3Oa&^~prTQbs{B8}T=4G2X@;y~gDre*@ zp1n3}Gy0bDaMzqv&#Uz(buKxNo#kq-s@0S7dDnBL`XlGs??5$I)#^#Py6d@8{gGpS zw+2%4vdtX%o~kF6GjbNsUYoTUeM@<`Yfh@?)%ueAWay3`g>Ph*$>$y_>k#p^L zpqi^{^`uT&e!Zx%N9y%~iE}Qm*cLu2g^InBT2|)VypnN4}@(N#%^3#k1FDZARZx z9`2fx>Up*Pq|PPhv9nywRkeCjKJR+2RDa}L`yHs}s#-lMS9d*Esy}ibJHM&^-_`kD z&y{-ba?J16Kx$sLnIqp*^`vq}&f?i?vo@n|)jXu?N#&$^o~kF6lRB52$Ify!52<=m zIVqp1dQv&5bICEkTLUSdshn+XBi~c?q;f{i;@QW}?6&{aJf!ML*}tdiN#&fa-}*W;yL}hcJf!ML)jXu? zN#&%hrs_%Mq|PPhv9nywL#m!sPRi%XdV2QiU6VS$oH=ve^B!0BK2=XDCw2Cf_4Mr3 zyC!vhIp(*S>#@+*?p=FwQfv0=X!lm`)%HBPrfQO7ew(!(3vKP*wI?UFX0MKRZ{=QX z&!cOqCOPJ}S?jUT*6v+S*^??$!1@x~6K9V}6^p9t&;l-nAzuwPvr5c5mfg zZO@}?swO$+w^{44(AMr@SDw9EJuA;{ zFSC2rK(%?PR?pdfT5kqd8mKle)#_RKF6?FY&l;#UFV*Tf+fVDw;7SA4=A~LaE8m5^ z%>G#e)#jyIJ!kuAy%}6-pxV4tt7qlAu$S3CYoOY^RIBG~Kdm=|D-BeemumH_d>8gI z`!fvm%v5U4jQVAoi)S{Fn$4b^XYRAJ`<%O>44h}c{+`!suJwAh0sG6;Y*X@`XUhJb*K4lzdbR=k z%hYUB^1WuN+QE^twErVDs=H^@O>2mI&7gku_p924k+XCbBQ>hKXVgt=i0k*LcdzxX z+J%v`wErVDs=H^@O>2mI&7gku_p924k+XCbBQ>hKXVgt=i0k*LcdzxX+J%v`wErVD zs=H^@O>2mI&7gi|{Tgv!^*GI!##J?{vov2CSJiNqnbN28`ZU{fnlFt@Eu{I`O>(wuDGKqJvpx@vpuKz(zw(@nlFt@>xw(is$L&^J==4dFO5rQmgY<2(z@b~ zru5{zp3L@~=1b#J3u(SIF0Cu>Jga(r?DcHVX}&ZromrYMjZ5o_JDSpy^LjGdbDA%W zOD&}N(zvv)xbv*)^|9BpJ&)w8?v9*Q^RDt$an6ob^yGRyneBNbUv+ontnyantKytp z&#IXmXENLKNWSXs$XPY-Dqj`n>}W+#uGf>>n#pk{vptXG ztL~1RRr9X$RdLRaR`le0J(=x!cD~e1S~rbL>x#Rc>78aW+w<&v=`7N^XZo@eJvdz02p>0NPl^=bxYdmhPG-A&KZzE=6tyW;Hc)eOw`Jd&@vo1Ue8t@5RJ z#o6Dh8JO*PBwuwmJxlvqUFWmg9<6%sU48i8 z*Z#e;%JXh@?ZLJ8;I8x8ZI4#H_pUyC?`!|wS><`Ry7u7OdvMqJ?6ya%-g{RczW23% z@2v8?TU~o_?LD~be0JNTRqws458vDG9R?U+fB^;=V1NMz7+`<_1{h#~0R|Z8HL&X6 zV|T0DJ0JJ#cFVwSd$j7ktr_^tj`kW@<$1Tdz4LL;Znq5VwnwYp+nRyT>}aonRi1aN z+dCik>~_n*ZhN%qy{#Ge%#QXNSmk-Qy1nyp&u+I2?6ya%-rJgi&+KTgfmNP&tJ^yt z_w07dz;1iA>b8d&9dx4OOaanEkI4D7Z?tKQq1fzRw{uYpybcdOewANTBb z%fN1XwCcUB8TibO_8M5_dAGW~^Ks8^w+!sIN2}i3nt{*kXs>})o_DL;J0JJ#cFVwS zd$j7ktr_^tj`kW@<$1Tdz4LL;Znq5VwnwYp+nRyT>}aonRi1aN+dCik>~_n*ZhN%q zy{#Ge%#QXNSmk-Qy1nyp&u+I2?6ya%-rJgi&+KTgfmNP&tJ^yt_v|(U3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb UFu(u<3^2d|0}L?0zzPHZ0zx#fl>h($ diff --git a/src/clue/test/slideshow_pics/pic_1.bmp b/src/clue/test/slideshow_pics/pic_1.bmp deleted file mode 100644 index 0d15550078f61eb5e68515958b9c3a79d376bbbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113974 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 G?EfD(a~m1} diff --git a/src/clue/test/slideshow_pics/pic_2.bmp b/src/clue/test/slideshow_pics/pic_2.bmp deleted file mode 100644 index 345d5820e11be986d573aab47bdf709e48ca9e82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113974 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 diff --git a/src/clue/test/slideshow_pics/pic_3.bmp b/src/clue/test/slideshow_pics/pic_3.bmp deleted file mode 100644 index 78ef7b8a23d5f92e06cffc87c0795af7f6ef884c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 330726 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 diff --git a/src/clue/test/slideshow_pics/pic_6.bmp b/src/clue/test/slideshow_pics/pic_6.bmp deleted file mode 100644 index d3e2540397b43a06c2c748ffe972047b8141ae8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115818 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 C7L5@A diff --git a/src/clue/test/slideshow_pics/pic_8.bmp b/src/clue/test/slideshow_pics/pic_8.bmp deleted file mode 100644 index 2746a30f812280f3aff4b5ca6992f753ced09982..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193734 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 C1~?P| diff --git a/src/clue/test/test_adafruit_clue.py b/src/clue/test/test_adafruit_clue.py deleted file mode 100644 index 0d7204205..000000000 --- a/src/clue/test/test_adafruit_clue.py +++ /dev/null @@ -1,193 +0,0 @@ -import pytest - -import os -import pathlib -from PIL import Image - -from unittest import mock -from unittest.mock import MagicMock, patch - -from common import utils - -import displayio -import terminalio - -from ..adafruit_clue import clue -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS - - -class TestAdafruitClue(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - - self.main_img = Image.new( - "RGBA", - (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), - (0, 0, 0, 0), - ) - - utils.send_to_simulator = mock.Mock() - - def test_clue_display_text(self): - img = Image.open( - os.path.join(self.abs_path, CONSTANTS.IMG_DIR_NAME, f"test_clue_text_1.bmp") - ) - - img.putalpha(255) - expected = img.load() - clue_data = clue.simple_text_display(title="LET'S TEST!", title_scale=2) - - clue_data.text_group._Group__show = self.__send_helper - clue_data.text_group._Group__check_active_group_ref = False - - clue_data[0].text = "Lorem ipsum" - clue_data[1].text = "dolor sit amet, consectetur " - clue_data[2].text = "adipiscing:" - - clue_data[4].text = "e" - clue_data[5].text = "sed do eiusmod" - clue_data[6].text = "tempor incididunt\nut labore" - clue_data[7].text = "ut labore" - - clue_data[10].text = "et dolore" - clue_data[11].text = "magna" - clue_data[12].text = "aliqua\ntestest" - clue_data[13].text = "Ut enim ad" - clue_data[14].text = "Excepteur sint" - clue_data.show() - helper._Helper__test_image_equality(self.main_img.load(), expected) - - def __send_helper(self, image): - self.main_img = image - - def test_buttons(self): - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_A, True) - assert clue.button_a - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_A, False) - assert not clue.button_a - - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_B, True) - assert clue.button_b - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_B, False) - assert not clue.button_b - - assert clue.were_pressed == set(["A", "B"]) - assert clue.were_pressed == set() - - @pytest.mark.parametrize( - "mock_x, mock_y, mock_z", [(1, 2, 3), (0, 0, 0), (4, 6, 100)] - ) - def test_acceleration(self, mock_x, mock_y, mock_z): - clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_X] = mock_x - clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_Y] = mock_y - clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_Z] = mock_z - assert clue.acceleration == (mock_x, mock_y, mock_z) - - @pytest.mark.parametrize( - "mock_color_r, mock_color_g,mock_color_b,mock_color_c", - [(1, 2, 3, 4), (255, 255, 255, 255), (120, 140, 160, 180)], - ) - def test_color(self, mock_color_r, mock_color_g, mock_color_b, mock_color_c): - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_R] = mock_color_r - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_G] = mock_color_g - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_B] = mock_color_b - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_C] = mock_color_c - assert clue.color == (mock_color_r, mock_color_g, mock_color_b, mock_color_c) - - @pytest.mark.parametrize("mock_temperature", [-10, 0, 10]) - def test_temperature(self, mock_temperature): - clue._Clue__state[CONSTANTS.CLUE_STATE.TEMPERATURE] = mock_temperature - assert clue.temperature == mock_temperature - - @pytest.mark.parametrize( - "mock_magnetic_x, mock_magnetic_y, mock_magnetic_z", - [(1, 2, 3), (100, 150, 200), (10, 5, 15)], - ) - def test_magnetic(self, mock_magnetic_x, mock_magnetic_y, mock_magnetic_z): - clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_X] = mock_magnetic_x - clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_Y] = mock_magnetic_y - clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_Z] = mock_magnetic_z - assert clue.magnetic == (mock_magnetic_x, mock_magnetic_y, mock_magnetic_z,) - - @pytest.mark.parametrize("mock_distance", (0, 10, 250, 255)) - def test_proximity(self, mock_distance): - clue._Clue__state[CONSTANTS.CLUE_STATE.PROXIMITY] = mock_distance - assert clue.proximity == mock_distance - - @pytest.mark.parametrize( - "mock_gyro_x, mock_gyro_y, mock_gyro_z", - [(1, 2, 3), (100, 150, 200), (10, 5, 15)], - ) - def test_gyro(self, mock_gyro_x, mock_gyro_y, mock_gyro_z): - clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_X] = mock_gyro_x - clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_Y] = mock_gyro_y - clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_Z] = mock_gyro_z - assert clue.gyro == (mock_gyro_x, mock_gyro_y, mock_gyro_z) - - @pytest.mark.parametrize( - "gesture_word, gesture_number", - [("", 0), ("up", 1), ("down", 2), ("left", 3), ("right", 4)], - ) - def test_gesture(self, gesture_word, gesture_number): - clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = gesture_word - assert clue.gesture == gesture_number - - def test_shake(self): - NONE = "none" - SHAKE = "shake" - clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = SHAKE - assert clue.shake() - clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = NONE - assert not clue.shake() - - @pytest.mark.parametrize("mock_humidity", [0, 10, 50, 100]) - def test_humidity(self, mock_humidity): - clue._Clue__state[CONSTANTS.CLUE_STATE.HUMIDITY] = mock_humidity - assert clue.humidity == mock_humidity - - @pytest.mark.parametrize("mock_pressure", [0, 10, 50, 100]) - def test_pressure(self, mock_pressure): - clue._Clue__state[CONSTANTS.CLUE_STATE.PRESSURE] = mock_pressure - assert clue.pressure == mock_pressure - - @pytest.mark.parametrize( - "mock_pressure, mock_sea_level_pressure, expected_altitude", - [ - (1000, 1015, 125.42255615546036), - (1030, 1015, -123.93061640175468), - (1020, 1013, -58.13176263932101), - ], - ) - def test_altitude(self, mock_pressure, mock_sea_level_pressure, expected_altitude): - clue.sea_level_pressure = mock_sea_level_pressure - clue._Clue__state[CONSTANTS.CLUE_STATE.PRESSURE] = mock_pressure - assert expected_altitude == pytest.approx(clue.altitude) - - @pytest.mark.parametrize("mock_sea_level_pressure", [1040, 1015, 1013]) - def test_sea_level_pressure(self, mock_sea_level_pressure): - clue.sea_level_pressure = mock_sea_level_pressure - assert mock_sea_level_pressure == clue.sea_level_pressure - - @pytest.mark.parametrize( - "mock_color", [(255, 0, 0), (255, 255, 255), (123, 123, 123)] - ) - def test_pixel(self, mock_color): - clue.pixel.fill(mock_color) - assert clue.pixel[0] == mock_color - - @pytest.mark.parametrize( - "value, expected", - [(True, True), (False, False), (1, True), ("a", True), (0, False), ("", False)], - ) - def test_red_led(self, value, expected): - clue.red_led = value - assert clue.red_led == expected - - @pytest.mark.parametrize( - "value, expected", - [(True, True), (False, False), (1, True), ("a", True), (0, False), ("", False)], - ) - def test_white_leds(self, value, expected): - clue.white_leds = value - assert clue.white_leds == expected diff --git a/src/clue/test/test_adafruit_display_shapes.py b/src/clue/test/test_adafruit_display_shapes.py deleted file mode 100644 index 8c1c3c303..000000000 --- a/src/clue/test/test_adafruit_display_shapes.py +++ /dev/null @@ -1,81 +0,0 @@ -import pytest -import pathlib -import os - -import displayio - -from PIL import Image -from unittest import mock - -from common import utils - - -from adafruit_display_shapes.rect import Rect -from adafruit_display_shapes.circle import Circle -from adafruit_display_shapes.roundrect import RoundRect - -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS -import board - - -class TestAdafruitDisplayShapes(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - - utils.send_to_simulator = mock.Mock() - self.main_img = Image.new( - "RGBA", - (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), - (0, 0, 0, 0), - ) - - def test_shapes(self): - - expected_images = [] - for i in range(5): - img = Image.open( - os.path.join( - self.abs_path, - CONSTANTS.IMG_DIR_NAME, - f"test_image_shapes_{i+1}.bmp", - ) - ) - - img.putalpha(255) - expected_images.append(img.load()) - - # TAKEN FROM ADAFRUIT'S DISPLAY SHAPES LIBRARY - # https://github.com/ladyada/Adafruit_CircuitPython_Display_Shapes/blob/master/examples/display_shapes_simpletest.py - splash = displayio.Group(max_size=10) - splash._Group__show = self.__send_helper - board.DISPLAY.show(splash) - color_bitmap = displayio.Bitmap(320, 240, 1) - color_palette = displayio.Palette(1) - color_palette[0] = 0xFFFFFF - bg_sprite = displayio.TileGrid( - color_bitmap, x=0, y=0, pixel_shader=color_palette - ) - splash.append(bg_sprite) - helper._Helper__test_image_equality(self.main_img.load(), expected_images[0]) - - rect = Rect(80, 20, 41, 41, fill=0x00FF00) - splash.append(rect) - helper._Helper__test_image_equality(self.main_img.load(), expected_images[1]) - circle = Circle(100, 100, 20, fill=0x00FF00, outline=0xFF00FF) - splash.append(circle) - - helper._Helper__test_image_equality(self.main_img.load(), expected_images[2]) - - rect2 = Rect(50, 100, 61, 81, outline=0x0, stroke=3) - splash.append(rect2) - - helper._Helper__test_image_equality(self.main_img.load(), expected_images[3]) - - roundrect = RoundRect(10, 10, 61, 81, 10, fill=0x0, outline=0xFF00FF, stroke=6) - splash.append(roundrect) - - helper._Helper__test_image_equality(self.main_img.load(), expected_images[4]) - - def __send_helper(self, image): - self.main_img = image diff --git a/src/clue/test/test_adafruit_display_text.py b/src/clue/test/test_adafruit_display_text.py deleted file mode 100644 index 922230275..000000000 --- a/src/clue/test/test_adafruit_display_text.py +++ /dev/null @@ -1,65 +0,0 @@ -import pytest - -import os -import sys -import pathlib -from PIL import Image -from unittest import mock - -from common import utils - -import displayio -import terminalio - -from adafruit_display_text import label - -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS - -# to keep track of test # to find right expected bmp -test_count = 0 - - -class TestAdafruitDisplayText(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - # Create a new black (default) image - utils.send_to_simulator = mock.Mock() - - @pytest.mark.parametrize( - "text, x,y, scale, color", - [ - ("Hello World", 1, 10, 4, (0, 22, 103)), - ("WWWWwwwmMMmmm", 30, 6, 1, (190, 173, 222)), - ("wOooo00ooo", 104, 49, 9, 0xEFEFEF), - ("!!!\n yay!", 100, 100, 5, (200, 200, 255)), - ], - ) - def test_display_text(self, text, x, y, scale, color): - global test_count - - expected_image = Image.open( - os.path.join( - self.abs_path, - CONSTANTS.IMG_DIR_NAME, - f"test_display_text_{test_count+1}.bmp", - ) - ) - expected_image.convert("RGBA") - expected_image.putalpha(255) - loaded_img = expected_image.load() - - text_area = label.Label( - terminalio.FONT, - text=text, - scale=scale, - color=color, - check_active_group_ref=False, - ) - text_area.x = x - text_area.y = y - - main_img = text_area._Group__draw() - - helper._Helper__test_image_equality(main_img.load(), loaded_img) - test_count += 1 diff --git a/src/clue/test/test_adafruit_slideshow.py b/src/clue/test/test_adafruit_slideshow.py deleted file mode 100644 index 1f966b15a..000000000 --- a/src/clue/test/test_adafruit_slideshow.py +++ /dev/null @@ -1,100 +0,0 @@ -from ..adafruit_slideshow import SlideShow, PlayBackDirection, PlayBackOrder -import board -import pathlib -import os - -from PIL import Image -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS - -from unittest import mock - -from common import utils - - -class TestAdafruitSlideShow(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - - # Create a new black (default) image - self.main_img = Image.new( - "RGBA", - (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), - (0, 0, 0, 0), - ) - - utils.send_to_simulator = mock.Mock() - - def test_slideshow(self): - - pic_dir = os.path.join(self.abs_path, "slideshow_pics") - slideshow_images = [] - for i in range(8): - img = Image.open(os.path.join(pic_dir, f"pic_{i+1}.bmp")) - img = img.convert("RGBA") - img.putalpha(255) - - img = img.crop( - (0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - - if img.size[0] < 240 or img.size[1] < 240: - black_overlay = Image.new( - "RGBA", - CONSTANTS.SCREEN_HEIGHT_WIDTH, - CONSTANTS.SCREEN_HEIGHT_WIDTH, - ) - black_overlay.paste(img) - img = black_overlay - - slideshow_images.append(img) - - # Create the slideshow object that plays through once alphabetically. - slideshow = SlideShow( - board.DISPLAY, - dwell=3, - folder=pic_dir, - loop=True, - fade_effect=True, - auto_advance=True, - order=PlayBackOrder.ALPHABETICAL, - direction=PlayBackDirection.FORWARD, - ) - - slideshow._SlideShow__send = self.__send_helper - - # first image's appear time is unstable,since it fades/scrolls in - # can only predict following ones... - - for i in range(1, 8): - slideshow.advance() - helper._Helper__test_image_equality( - self.main_img.load(), slideshow_images[i].load() - ) - - # Create the slideshow object that plays through once backwards. - slideshow2 = SlideShow( - board.DISPLAY, - dwell=3, - folder=pic_dir, - loop=True, - fade_effect=False, - auto_advance=True, - order=PlayBackOrder.ALPHABETICAL, - direction=PlayBackDirection.BACKWARD, - ) - - slideshow2._SlideShow__send = self.__send_helper - - helper._Helper__test_image_equality( - self.main_img.load(), slideshow_images[7].load() - ) - - for i in range(6, -1, -1): - slideshow2.advance() - helper._Helper__test_image_equality( - self.main_img.load(), slideshow_images[i].load() - ) - - def __send_helper(self, image): - self.main_img = image diff --git a/src/clue/test/test_helpers.py b/src/clue/test/test_helpers.py deleted file mode 100644 index 429965aaf..000000000 --- a/src/clue/test/test_helpers.py +++ /dev/null @@ -1,32 +0,0 @@ -from base_circuitpython import base_cp_constants as CONSTANTS - - -class Helper: - def __test_image_equality(self, image_1, image_2): - for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - pixel_1 = image_1[j, i] - pixel_2 = image_2[j, i] - - if not isinstance(pixel_1, tuple): - pixel_1 = self.hex2rgba(pixel_1) - - if not isinstance(pixel_2, tuple): - pixel_2 = self.hex2rgba(pixel_2) - assert pixel_1[0:3] == pixel_2[0:3] - - def hex2rgba(self, curr_colour): - - ret_list = [] - - for i in range(3, -1, -1): - val = (curr_colour >> (2 ** (i + 1))) & 255 - if val == 0: - ret_list.append(0) - else: - ret_list.append(val) - - return tuple(ret_list) - - -helper = Helper() diff --git a/src/common/__init__.py b/src/common/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/common/constants.py b/src/common/constants.py deleted file mode 100644 index c0592c7db..000000000 --- a/src/common/constants.py +++ /dev/null @@ -1,12 +0,0 @@ -MAC_OS = "darwin" - -ERROR_SENDING_EVENT = "Error trying to send event to the process : " - -ACTIVE_DEVICE_FIELD = "active_device" -STATE_FIELD = "state" - -CONNECTION_ATTEMPTS = 10 -TIME_DELAY = 0.03 -DEFAULT_PORT = "5577" - -MICROPYTHON_LIBRARY_NAME = "micropython" diff --git a/src/common/debugger_communication_client.py b/src/common/debugger_communication_client.py deleted file mode 100644 index 08db21b89..000000000 --- a/src/common/debugger_communication_client.py +++ /dev/null @@ -1,104 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -import sys -import json - -# WARNING: importing socketio will sometimes cause errors in normal execution -# try to import common instead of common.debugger_communication_cleint -import socketio - -import copy -import pathlib - -from . import constants as CONSTANTS -from . import utils -import threading -import os -import python_constants as TOPLEVEL_CONSTANTS - -from adafruit_circuitplayground.express import cpx -from adafruit_circuitplayground.constants import CPX - -# add ref for micropython and clue -abs_path_to_parent_dir = os.path.dirname( - os.path.join(pathlib.Path(__file__).parent, "..", "..") -) -sys.path.insert( - 0, os.path.join(abs_path_to_parent_dir, TOPLEVEL_CONSTANTS.MICROPYTHON_LIBRARY_NAME) -) - -sys.path.insert(0, os.path.join(abs_path_to_parent_dir, TOPLEVEL_CONSTANTS.CLUE_DIR)) - -from microbit.__model.microbit_model import __mb as mb -from microbit.__model.constants import MICROBIT - -from base_circuitpython.base_cp_constants import CLUE -from adafruit_clue import clue - -device_dict = {CPX: cpx, MICROBIT: mb, CLUE: clue} -processing_state_event = threading.Event() -previous_state = {} - -# similar to utils.send_to_simulator, but for debugging -# (needs handle to device-specific debugger) -def debug_send_to_simulator(state, active_device): - global previous_state - if state != previous_state: - previous_state = copy.deepcopy(state) - - updated_state = utils.update_state_with_device_name(state, active_device) - message = utils.create_message(updated_state) - - update_state(json.dumps(message)) - - -# Create Socket Client -sio = socketio.Client(reconnection_attempts=CONSTANTS.CONNECTION_ATTEMPTS) - -# TODO: Get port from process_user_code.py via childprocess communication - - -# Initialize connection -def init_connection(port=CONSTANTS.DEFAULT_PORT): - sio.connect("http://localhost:{}".format(port)) - - -# Transfer the user's inputs to the API -def __update_api_state(data): - try: - event_state = json.loads(data) - active_device_string = event_state.get(CONSTANTS.ACTIVE_DEVICE_FIELD) - - if active_device_string is not None: - active_device = device_dict.get(active_device_string) - if active_device is not None: - active_device.update_state(event_state.get(CONSTANTS.STATE_FIELD)) - - except Exception as e: - print(CONSTANTS.ERROR_SENDING_EVENT, e, file=sys.stderr, flush=True) - - -# Method : Update State -def update_state(state): - processing_state_event.clear() - sio.emit("updateState", state) - processing_state_event.wait() - - -# Event : Button pressed (A, B, A+B, Switch) -# or Sensor changed (Temperature, light, Motion) -@sio.on("input_changed") -def input_changed(data): - sio.emit("receivedState", data) - __update_api_state(data) - - -@sio.on("received_state") -def received_state(data): - processing_state_event.set() - - -@sio.on("process_disconnect") -def process_disconnect(data): - sio.disconnect() diff --git a/src/common/telemetry.py b/src/common/telemetry.py deleted file mode 100644 index fd4a8537c..000000000 --- a/src/common/telemetry.py +++ /dev/null @@ -1,35 +0,0 @@ -import sys - -from applicationinsights import TelemetryClient -from common import constants as CONSTANTS -from .telemetry_events import TelemetryEvent - - -class Telemetry: - def __init__(self): - # State of the telemetry - self.__enable_telemetry = True - self.telemetry_client = TelemetryClient("__AIKEY__") - self.telemetry_state = dict.fromkeys( - [name for name, _ in TelemetryEvent.__members__.items()], False - ) - self.extension_name = "Device Simulator Express" - - def send_telemetry(self, event_name: TelemetryEvent): - if ( - self.__enable_telemetry - and self.telemetry_available() - and not self.telemetry_state[event_name.name] - and not sys.platform.startswith(CONSTANTS.MAC_OS) - ): - self.telemetry_client.track_event( - f"{self.extension_name}/{event_name.value}" - ) - self.telemetry_client.flush() - self.telemetry_state[event_name.name] = True - - def telemetry_available(self): - return self.telemetry_client.context.instrumentation_key == "__AIKEY__" - - -telemetry_py = Telemetry() diff --git a/src/common/telemetry_events.py b/src/common/telemetry_events.py deleted file mode 100644 index a140c823b..000000000 --- a/src/common/telemetry_events.py +++ /dev/null @@ -1,65 +0,0 @@ -import enum - - -class TelemetryEvent(enum.Enum): - CPX_API_ACCELERATION = "CPX.API.ACCELERATION" - CPX_API_BUTTON_A = "CPX.API.BUTTON.A" - CPX_API_BUTTON_B = "CPX.API.BUTTON.B" - CPX_API_SWITCH = "CPX.API.SWITCH" - CPX_API_TEMPERATURE = "CPX.API.TEMPERATURE" - CPX_API_BRIGHTNESS = "CPX.API.BRIGHTNESS" - CPX_API_LIGHT = "CPX.API.LIGHT" - CPX_API_TOUCH = "CPX.API.TOUCH" - CPX_API_SHAKE = "CPX.API.SHAKE" - CPX_API_TAPPED = "CPX.API.TAPPED" - CPX_API_PLAY_FILE = "CPX.API.PLAY.FILE" - CPX_API_PLAY_TONE = "CPX.API.PLAY.TONE" - CPX_API_START_TONE = "CPX.API.START.TONE" - CPX_API_STOP_TONE = "CPX.API.STOP.TONE" - CPX_API_DETECT_TAPS = "CPX.API.DETECT.TAPS" - CPX_API_ADJUST_THRESHOLD = "CPX.API.ADJUST.THRESHOLD" - CPX_API_RED_LED = "CPX.API.RED.LED" - CPX_API_PIXELS = "CPX.API.PIXELS" - MICROBIT_API_TEMPERATURE = "MICROBIT.API.TEMPERATURE" - MICROBIT_API_ACCELEROMETER = "MICROBIT.API.ACCELEROMETER" - MICROBIT_API_GESTURE = "MICROBIT.API.GESTURE" - MICROBIT_API_DISPLAY_SCROLL = "MICROBIT.API.DISPLAY.SCROLL" - MICROBIT_API_DISPLAY_SHOW = "MICROBIT.API.DISPLAY.SHOW" - MICROBIT_API_DISPLAY_OTHER = "MICROBIT.API.DISPLAY_OTHER" - MICROBIT_API_LIGHT_LEVEL = "MICROBIT.API.LIGHT.LEVEL" - MICROBIT_API_IMAGE_CREATION = "MICROBIT.API.IMAGE.CREATION" - MICROBIT_API_IMAGE_OTHER = "MICROBIT.API.IMAGE.OTHER" - MICROBIT_API_IMAGE_STATIC = "MICROBIT.API.IMAGE.STATIC" - MICROBIT_API_BUTTON = "MICROBIT.API.BUTTON" - MICROBIT_API_COMPASS = "MICROBIT.API.COMPASS" - MICROBIT_API_I2C = "MICROBIT.API.I2C" - MICROBIT_API_SPI = "MICROBIT.API.SPI" - MICROBIT_API_AUDIO = "MICROBIT.API.AUDIO" - MICROBIT_API_MUSIC = "MICROBIT.API.MUSIC" - MICROBIT_API_NEOPIXEL = "MICROBIT.API.NEOPIXEL" - MICROBIT_API_RADIO = "MICROBIT.API.RADIO" - MICROBIT_API_SPEECH = "MICROBIT.API.SPEECH" - MICROBIT_API_UTIME = "MICROBIT.API.UTIME" - CLUE_API_ACCELERATION = "CLUE.API.ACCELERATION" - CLUE_API_BUTTON_A = "CLUE.API.BUTTON.A" - CLUE_API_BUTTON_B = "CLUE.API.BUTTON.B" - CLUE_API_WERE_PRESSED = "CLUE.API.WERE.PRESSED" - CLUE_API_SHAKE = "CLUE.API.SHAKE" - CLUE_API_COLOR = "CLUE.API.COLOR" - CLUE_API_TEMPERATURE = "CLUE.API.TEMPERATURE" - CLUE_API_MAGNETIC = "CLUE.API.MAGNETIC" - CLUE_API_PROXIMITY = "CLUE.API.PROXIMITY" - CLUE_API_GYRO = "CLUE.API.GYRO" - CLUE_API_GESTURE = "CLUE.API.GESTURE" - CLUE_API_HUMIDITY = "CLUE.API.HUMIDITY" - CLUE_API_PRESSURE = "CLUE.API.PRESSURE" - CLUE_API_ALTITUDE = "CLUE.API.ALTITUDE" - CLUE_API_SEA_LEVEL_PRESSURE = "CLUE.API.SEA.LEVEL.PRESSURE" - CLUE_API_PIXEL = "CLUE.API.PIXEL" - CLUE_API_TOUCH = "CLUE.API.TOUCH" - CLUE_API_WHITE_LEDS = "CLUE.API.WHITE.LEDS" - CLUE_API_RED_LED = "CLUE.API.RED.LED" - CLUE_API_SOUND = "CLUE.API.SOUND" - CLUE_API_TEXT_DISPLAY = "CLUE.API.TEXT.DISPLAY" - CLUE_API_SLIDESHOW = "CLUE.API.SLIDESHOW" - CLUE_API_TILE_GRID = "CLUE.API.TILE.GRID" diff --git a/src/common/test/__init__.py b/src/common/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/common/test/test_debugger_communication_client.py b/src/common/test/test_debugger_communication_client.py deleted file mode 100644 index fea21211e..000000000 --- a/src/common/test/test_debugger_communication_client.py +++ /dev/null @@ -1,193 +0,0 @@ -import pytest -import json # Remove -from unittest import mock -import socketio -import threading -import os -import sys - -from common import constants as CONSTANTS - -abs_path_to_parent_dir = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "..", ".." -) - -sys.path.insert(0, abs_path_to_parent_dir) -# Insert absolute path to Micropython libraries for micro:bit into sys.path -abs_path_to_micropython_lib = os.path.join( - abs_path_to_parent_dir, CONSTANTS.MICROPYTHON_LIBRARY_NAME -) - -sys.path.insert(0, abs_path_to_micropython_lib) - -from common import debugger_communication_client -from adafruit_circuitplayground import express -from adafruit_circuitplayground.constants import CPX - - -class TestDebuggerCommunicationClient(object): - @mock.patch("socketio.Client.connect") - def test_init_connection(self, mock_connect): - mock_connect.return_value = None - debugger_communication_client.init_connection() - mock_connect.assert_called_once() - - def test_init_connection1(self): - socketio.Client.connect = mock.Mock() - socketio.Client.connect.return_value = None - debugger_communication_client.init_connection() - socketio.Client.connect.assert_called_once() - - def test_update_state(self): - threading.Event.clear = mock.Mock() - threading.Event.wait = mock.Mock() - socketio.Client.emit = mock.Mock() - socketio.Client.emit.return_value = None - debugger_communication_client.update_state( - {CONSTANTS.ACTIVE_DEVICE_FIELD: CPX, CONSTANTS.STATE_FIELD: {}} - ) - socketio.Client.emit.assert_called_once() - - @mock.patch.dict( - express.cpx._Express__state, - { - "brightness": 1.0, - "button_a": False, - "button_b": False, - "pixels": [ - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - ], - "red_led": False, - "switch": False, - "temperature": 0, - "light": 0, - "motion_x": 0, - "motion_y": 0, - "motion_z": 0, - "touch": [False] * 7, - "shake": False, - }, - clear=True, - ) - def test_button_press(self): - data = { - CONSTANTS.ACTIVE_DEVICE_FIELD: CPX, - CONSTANTS.STATE_FIELD: {"button_a": True, "button_b": True, "switch": True}, - } - expected_data = { - "brightness": 1.0, - "button_a": True, - "button_b": True, - "pixels": [ - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - ], - "red_led": False, - "switch": True, - "temperature": 0, - "light": 0, - "motion_x": 0, - "motion_y": 0, - "motion_z": 0, - "touch": [False] * 7, - "shake": False, - } - serialized_data = json.dumps(data) - debugger_communication_client.input_changed(serialized_data) - assert expected_data == express.cpx._Express__state - - @mock.patch.dict( - express.cpx._Express__state, - { - "brightness": 1.0, - "button_a": False, - "button_b": False, - "pixels": [ - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - ], - "red_led": False, - "switch": False, - "temperature": 0, - "light": 0, - "motion_x": 0, - "motion_y": 0, - "motion_z": 0, - "touch": [False] * 7, - "shake": False, - }, - clear=True, - ) - def test_input_changed(self): - data = { - CONSTANTS.ACTIVE_DEVICE_FIELD: CPX, - CONSTANTS.STATE_FIELD: { - "temperature": 1, - "light": 2, - "motion_x": 3, - "motion_y": 4, - "motion_z": 5, - }, - } - expected_data = { - "brightness": 1.0, - "button_a": False, - "button_b": False, - "pixels": [ - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - ], - "red_led": False, - "switch": False, - "temperature": 1, - "light": 2, - "motion_x": 3, - "motion_y": 4, - "motion_z": 5, - "touch": [False] * 7, - "shake": False, - } - serialized_data = json.dumps(data) - debugger_communication_client.input_changed(serialized_data) - assert expected_data == express.cpx._Express__state - - @mock.patch("builtins.print") - @mock.patch.dict(express.cpx._Express__state, {}, clear=True) - def test_update_api_state_fail(self, mocked_print): - data = [] - debugger_communication_client.input_changed(data) - # Exception is caught and a print is stated to stderr - mocked_print.assert_called_once() diff --git a/src/common/test/test_utils.py b/src/common/test/test_utils.py deleted file mode 100644 index 11e7c8a2e..000000000 --- a/src/common/test/test_utils.py +++ /dev/null @@ -1,32 +0,0 @@ -import sys - -from unittest import mock - -from common import constants as CONSTANTS -from common import utils - - -class TestUtils(object): - def test_remove_leading_slashes(self): - original = "///a//b/" - expected = "a//b/" - assert expected == utils.remove_leading_slashes(original) - - def test_escape_notOSX(self): - _utils_sys = utils.sys - if sys.platform.startswith(CONSTANTS.MAC_OS): - utils.sys = mock.MagicMock() - utils.sys.configure_mock(platform="win32") - original = "a b" - assert original == utils.escape_if_OSX(original) - utils.sys = _utils_sys - - def test_escape_isOSX(self): - _utils_sys = utils.sys - if not sys.platform.startswith(CONSTANTS.MAC_OS): - utils.sys = mock.MagicMock() - utils.sys.configure_mock(platform="darwin") - original = "a b" - expected = "a%20b" - assert expected == utils.escape_if_OSX(original) - utils.sys = _utils_sys diff --git a/src/common/utils.py b/src/common/utils.py deleted file mode 100644 index d6d241b2f..000000000 --- a/src/common/utils.py +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -from . import constants as CONSTANTS -import json -import copy -import time -import sys - -previous_state = {} - -abs_path_to_user_file = "" -debug_mode = False - - -def update_state_with_device_name(state, device_name): - updated_state = dict(state) - - state_ext = { - "device_name": device_name, - } - updated_state.update(state_ext) - - return updated_state - - -def create_message(msg, send_type="state"): - if isinstance(msg, dict): - msg = json.dumps(msg) - - message = {"type": send_type, "data": msg} - return message - - -def send_to_simulator(state, device_name): - global previous_state - - updated_state = update_state_with_device_name(state, device_name) - message = create_message(updated_state) - - if updated_state != previous_state: - previous_state = copy.deepcopy(updated_state) - print(json.dumps(message) + "\0", end="", file=sys.__stdout__, flush=True) - time.sleep(CONSTANTS.TIME_DELAY) - - -def send_print_to_simulator(raw_msg): - data_str = str(raw_msg) - message = create_message(data_str, "print") - print(json.dumps(message) + "\0", file=sys.__stdout__, flush=True) - time.sleep(CONSTANTS.TIME_DELAY) - - -def remove_leading_slashes(string): - string = string.lstrip("\\/") - return string - - -def escape_if_OSX(file_name): - if sys.platform == CONSTANTS.MAC_OS: - file_name = file_name.replace(" ", "%20") - return file_name - - -def print_for_unimplemented_functions(function_name): - msg = f"'{function_name}' is not implemented in the simulator but it will work on the actual device!\n" - send_print_to_simulator(msg) diff --git a/src/constants.ts b/src/constants.ts deleted file mode 100644 index b14d875f0..000000000 --- a/src/constants.ts +++ /dev/null @@ -1,555 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as path from "path"; -import { MessageItem } from "vscode"; -import * as nls from "vscode-nls"; - -// Debugger Server -export const SERVER_INFO = { - DEFAULT_SERVER_PORT: 5577, - ERROR_CODE_INIT_SERVER: "ERROR_INIT_SERVER", - SERVER_PORT_CONFIGURATION: "deviceSimulatorExpress.debuggerServerPort", -}; - -const localize: nls.LocalizeFunc = nls.config({ - messageFormat: nls.MessageFormat.file, -})(); - -export const CONFIG = { - CONFIG_ENV_ON_SWITCH: - "deviceSimulatorExpress.configNewEnvironmentUponSwitch", - PYTHON_PATH: "python.pythonPath", - SHOW_DEPENDENCY_INSTALL: "deviceSimulatorExpress.showDependencyInstall", - SHOW_NEW_FILE_POPUP: "deviceSimulatorExpress.showNewFilePopup", -}; - -export const CONSTANTS = { - WEBVIEW_TYPE: { - SIMULATOR: "simulator", - TUTORIAL: "tutorial", - }, - DEBUG_CONFIGURATION_TYPE: "deviceSimulatorExpress", - DEVICE_NAME: { - CPX: "CPX", - MICROBIT: "micro:bit", - CLUE: "CLUE", - }, - DEVICE_NAME_FORMAL: { - CPX: "Circuit Playground Express", - MICROBIT: "micro:bit", - CLUE: "CLUE", - }, - SCRIPT_PATH: { - SIMULATOR: "out/simulator.js", - VSCODE_API: "out/vscode_import.js", - }, - ERROR: { - BAD_PYTHON_PATH: - 'Your interpreter is not pointing to a valid Python executable. Please select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application', - COMPORT_UNKNOWN_ERROR: - "Writing to COM port (GetOverlappedResult): Unknown error code 121", - CPX_FILE_ERROR: localize( - "error.cpxFileFormat", - "The cpx.json file format is not correct." - ), - DEBUGGER_SERVER_INIT_FAILED: (port: number) => { - return localize( - "error.debuggerServerInitFailed", - `Warning : The Debugger Server cannot be opened. Please try to free the port ${port} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.` - ); - }, - DEBUGGING_SESSION_IN_PROGESS: localize( - "error.debuggingSessionInProgress", - "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n" - ), - DEPENDENCY_DOWNLOAD_ERROR: - "Dependency download could not be completed. Functionality may be limited. Please review the installation docs.", - - FAILED_TO_OPEN_SERIAL_PORT: (port: string): string => { - return localize( - "error.failedToOpenSerialPort", - `[ERROR] Failed to open serial port ${port}.` - ); - }, - FAILED_TO_OPEN_SERIAL_PORT_DUE_TO: (port: string, error: any) => { - return localize( - "error.failedToOpenSerialPortDueTo", - `[ERROR] Failed to open serial port ${port} due to error: ${error}. \n` - ); - }, - INSTALLATION_ERROR: localize( - "error.installationError", - "Installation Error" - ), - - INVALID_FILE_EXTENSION_DEBUG: localize( - "error.invalidFileExtensionDebug", - "The file you tried to run isn't a Python file." - ), - INVALID_PYTHON_PATH: localize( - "error.invalidPythonPath", - 'We found that your selected Python interpreter version is too low to run the extension. Please upgrade to version 3.7+ or select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application.' - ), - LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT: localize( - "error.lowPythonVersionForMicrobitDeployment", - "To deploy your code to the micro:bit, you must be using Python 3.3+" - ), - NO_DEVICE: localize( - "error.noDevice", - "The device is not detected. Please double check if your board is connected and/or properly formatted" - ), - NO_FILE_TO_RUN: localize( - "error.noFileToRun", - '[ERROR] We can\'t find a Python file to run. Please make sure you select or open a new ".py" code file, or use the "New File" command to get started and see useful links.\n' - ), - NO_FILE_TO_DEPLOY: localize( - "error.noFileToDeploy", - "[ERROR] We can't find a Python file to deploy to your device.\n" - ), - NO_FOLDER_OPENED: localize( - "error.noFolderCreated", - "In order to use the Serial Monitor, you need to open a folder and reload VS Code." - ), - NO_PROGRAM_FOUND_DEBUG: localize( - "error.noProgramFoundDebug", - "Cannot find a program to debug." - ), - NO_PYTHON_PATH: localize( - "error.noPythonPath", - "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again." - ), - RECONNECT_DEVICE: localize( - "error.reconnectDevice", - "Please disconnect your Circuit Playground Express and try again." - ), - STDERR: (data: string) => { - return localize("error.stderr", `\n[ERROR] ${data} \n`); - }, - UNEXPECTED_MESSAGE: localize( - "error.unexpectedMessage", - "Webview sent an unexpected message" - ), - }, - FILESYSTEM: { - BASE_CIRCUITPYTHON: "base_circuitpython", - CLUE: "clue", - PYTHON_VENV_DIR: "venv", - MICROPYTHON_DIRECTORY: "micropython", - OUTPUT_DIRECTORY: "out", - }, - INFO: { - ALREADY_SUCCESSFUL_INSTALL: localize( - "info.successfulInstall", - "Your current configuration is already successfully set up for the Device Simulator Expresss." - ), - ARE_YOU_SURE: localize( - "info.areYouSure", - "Are you sure you don't want to install the dependencies? The extension can't run without installing them." - ), - CLOSED_SERIAL_PORT: (port: string) => { - return localize( - "info.closedSerialPort", - `[DONE] Closed the serial port - ${port} \n` - ); - }, - COMPLETED_MESSAGE: "Completed", - CPX_JSON_ALREADY_GENERATED: localize( - "info.cpxJsonAlreadyGenerated", - "cpx.json has already been generated." - ), - DEPLOY_DEVICE: localize( - "info.deployDevice", - "\n[INFO] Deploying code to the device...\n" - ), - DEPLOY_SIMULATOR: localize( - "info.deploySimulator", - "\n[INFO] Deploying code to the simulator...\n" - ), - DEPLOY_SUCCESS: localize( - "info.deploySuccess", - "\n[INFO] Code successfully copied! Your device should be loading and ready to go shortly.\n" - ), - EXTENSION_ACTIVATED: localize( - "info.extensionActivated", - "Congratulations, your extension Device Simulator Express is now active!" - ), - FILE_SELECTED: (filePath: string) => { - return localize( - "info.fileSelected", - `[INFO] File selected : ${filePath} \n` - ); - }, - FIRST_TIME_WEBVIEW: localize( - "info.firstTimeWebview", - 'To reopen the simulator select the command "Open Simulator" from command palette.' - ), - INSTALLING_PYTHON_VENV: localize( - "info.installingPythonVenv", - "A virtual environment is currently being created. The required Python packages will be installed. You will be prompted a message telling you when the installation is done." - ), - INSTALL_PYTHON_DEPS: localize( - "info.installPythonDependencies", - "Do you want us to try and install this extension's dependencies on your selected Python interpreter for you?" - ), - INSTALL_PYTHON_VENV: localize( - "info.installPythonVenv", - "Do you want us to try and install this extension's dependencies via virtual environment for you?" - ), - NEW_FILE: localize( - "info.newFile", - "New to Python or the Circuit Playground Express? We are here to help!" - ), - NO_DEVICE_CHOSEN_TO_DEPLOY_TO: localize( - "info.noDeviceChosenToDeployTo", - "\n[INFO] No device was selected to deploy to.\n" - ), - NO_DEVICE_CHOSEN_TO_SIMULATE_TO: localize( - "info.noDeviceChosenToSimulateTo", - "\n[INFO] No device was selected to simulate.\n" - ), - NO_DEVICE_CHOSEN_FOR_NEW_FILE: localize( - "info.noDeviceChosenForNewFile", - "\n[INFO] No device was selected to open a template file for.\n" - ), - OPENED_SERIAL_PORT: (port: string) => { - return localize( - "info.openedSerialPort", - `[INFO] Opened the serial port - ${port} \n` - ); - }, - OPENING_SERIAL_PORT: (port: string) => { - return localize( - "info.openingSerialPort", - `[STARTING] Opening the serial port - ${port} \n` - ); - }, - PLEASE_OPEN_FOLDER: localize( - "info.pleaseOpenFolder", - "Please open a folder first." - ), - REDIRECT: localize("info.redirect", "You are being redirected."), - RUNNING_CODE: localize("info.runningCode", "Running user code"), - SUCCESSFUL_INSTALL: localize( - "info.successfulInstall", - "Successfully set up the Python environment." - ), - THIRD_PARTY_WEBSITE_ADAFRUIT: localize( - "info.thirdPartyWebsiteAdafruit", - 'By clicking "Agree and Proceed" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit\'s privacy policy' - ), - THIRD_PARTY_WEBSITE_PIP: localize( - "info.thirdPartyWebsitePip", - 'By clicking "Agree and Proceed" you will be redirected to pip.pypa.io, a third party website not managed by Microsoft. Please note that your activity on pip.pypa.io is subject to PyPA\'s privacy policy' - ), - THIRD_PARTY_WEBSITE_PYTHON: localize( - "info.thirdPartyWebsitePython", - 'By clicking "Agree and Proceed" you will be redirected to python.org, a third party website not managed by Microsoft. Please note that your activity on python.org is subject to Python\'s privacy policy' - ), - UPDATED_TO_EXTENSION_VENV: localize( - "info.updatedToExtensionsVenv", - "Automatically updated interpreter to point to extension's virtual environment." - ), - WELCOME_OUTPUT_TAB: localize( - "info.welcomeOutputTab", - "Welcome to the Device Simulator Express output tab!\n\n" - ), - }, - LABEL: { - WEBVIEW_PANEL: localize( - "label.webviewPanel", - "Device Simulator Express" - ), - }, - LINKS: { - DOWNLOAD_PIP: "https://pip.pypa.io/en/stable/installing/", - DOWNLOAD_PYTHON: "https://www.python.org/downloads/", - EXAMPLE_CODE: - "https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples", - CPX_HELP: - "https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart", - CLUE_HELP: "https://learn.adafruit.com/adafruit-clue/circuitpython", - INSTALL: - "https://github.com/microsoft/vscode-python-devicesimulator/blob/dev/docs/install.md", - PRIVACY: "https://www.adafruit.com/privacy", - TUTORIALS: - "https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library", - }, - MISC: { - SELECT_PORT_PLACEHOLDER: localize( - "misc.selectPortPlaceholder", - "Select a serial port" - ), - SERIAL_MONITOR_NAME: localize( - "misc.serialMonitorName", - "Device Simulator Express Serial Monitor" - ), - SERIAL_MONITOR_TEST_IF_OPEN: localize( - "misc.testIfPortOpen", - "Test if serial port is open" - ), - }, - NAME: localize("name", "Device Simulator Express"), - TEMPLATE: { - CPX: "cpx_template.py", - MICROBIT: "microbit_template.py", - CLUE: "clue_template.py", - }, - WARNING: { - ACCEPT_AND_RUN: localize( - "warning.agreeAndRun", - "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk." - ), - INVALID_BAUD_RATE: localize( - "warning.invalidBaudRate", - "Invalid baud rate, keep baud rate unchanged." - ), - NO_RATE_SELECTED: localize( - "warning.noRateSelected", - "No rate is selected, keep baud rate unchanged." - ), - NO_SERIAL_PORT_SELECTED: localize( - "warning.noSerialPortSelected", - "No serial port was selected, please select a serial port first" - ), - SERIAL_MONITOR_ALREADY_OPENED: (port: string) => { - return localize( - "warning.serialMonitorAlreadyOpened", - `Serial monitor is already opened for ${port} \n` - ); - }, - SERIAL_MONITOR_NOT_STARTED: localize( - "warning.serialMonitorNotStarted", - "Serial monitor has not been started." - ), - SERIAL_PORT_NOT_STARTED: localize( - "warning.serialPortNotStarted", - "Serial port has not been started.\n" - ), - }, -}; - -export enum CONFIG_KEYS { - ENABLE_USB_DETECTION = "deviceSimulatorExpress.enableUSBDetection", -} - -export enum TelemetryEventName { - FAILED_TO_OPEN_SIMULATOR = "SIMULATOR.FAILED_TO_OPEN", - - // Debugger - CPX_DEBUGGER_INIT_SUCCESS = "CPX.DEBUGGER.INIT.SUCCESS", - CPX_DEBUGGER_INIT_FAIL = "CPX.DEBUGGER.INIT.FAIL", - MICROBIT_DEBUGGER_INIT_SUCCESS = "MICROBIT.DEBUGGER.INIT.SUCCESS", - MICROBIT_DEBUGGER_INIT_FAIL = "MICROBIT.DEBUGGER.INIT.FAIL", - CLUE_DEBUGGER_INIT_SUCCESS = "CLUE.DEBUGGER.INIT.SUCCESS", - CLUE_DEBUGGER_INIT_FAIL = "CLUE.DEBUGGER.INIT.FAIL", - - // Extension commands - COMMAND_RUN_SIMULATOR_BUTTON = "COMMAND.RUN.SIMULATOR_BUTTON", - COMMAND_RUN_PALETTE = "COMMAND.RUN.PALETTE", - COMMAND_INSTALL_EXTENSION_DEPENDENCIES = "COMMAND.INSTALL.EXTENSION.DEPENDENCIES", - COMMAND_SERIAL_MONITOR_CHOOSE_PORT = "COMMAND.SERIAL_MONITOR.CHOOSE_PORT", - COMMAND_SERIAL_MONITOR_OPEN = "COMMAND.SERIAL_MONITOR.OPEN", - COMMAND_SERIAL_MONITOR_BAUD_RATE = "COMMAND.SERIAL_MONITOR.BAUD_RATE", - COMMAND_SERIAL_MONITOR_CLOSE = "COMMAND.SERIAL_MONITOR.CLOSE", - COMMAND_GETTING_STARTED = "COMMAND.GETTING_STARTED", - - CPX_COMMAND_DEPLOY_DEVICE = "CPX.COMMAND.DEPLOY.DEVICE", - CPX_COMMAND_NEW_FILE = "CPX.COMMAND.NEW.FILE.CPX", - CPX_COMMAND_OPEN_SIMULATOR = "CPX.COMMAND.OPEN.SIMULATOR", - - MICROBIT_COMMAND_DEPLOY_DEVICE = "MICROBIT.COMMAND.DEPLOY.DEVICE", - MICROBIT_COMMAND_NEW_FILE = "MICROBIT.COMMAND.NEW.FILE", - MICROBIT_COMMAND_OPEN_SIMULATOR = "MICROBIT.COMMAND.OPEN.SIMULATOR", - - CLUE_COMMAND_DEPLOY_DEVICE = "CLUE.COMMAND.DEPLOY.DEVICE", - CLUE_COMMAND_NEW_FILE = "CLUE.COMMAND.NEW.FILE.CPX", - CLUE_COMMAND_OPEN_SIMULATOR = "CLUE.COMMAND.OPEN.SIMULATOR", - - // Simulator interaction - CPX_SIMULATOR_BUTTON_A = "CPX.SIMULATOR.BUTTON.A", - CPX_SIMULATOR_BUTTON_B = "CPX.SIMULATOR.BUTTON.B", - CPX_SIMULATOR_BUTTON_AB = "CPX.SIMULATOR.BUTTON.AB", - CPX_SIMULATOR_SWITCH = "CPX.SIMULATOR.SWITCH", - - MICROBIT_SIMULATOR_BUTTON_A = "MICROBIT.SIMULATOR.BUTTON.A", - MICROBIT_SIMULATOR_BUTTON_B = "MICROBIT.SIMULATOR.BUTTON.B", - MICROBIT_SIMULATOR_BUTTON_AB = "MICROBIT.SIMULATOR.BUTTON.AB", - - CLUE_SIMULATOR_BUTTON_A = "CLUE.SIMULATOR.BUTTON.A", - CLUE_SIMULATOR_BUTTON_B = "CLUE.SIMULATOR.BUTTON.B", - CLUE_SIMULATOR_BUTTON_AB = "CLUE.SIMULATOR.BUTTON.AB", - - // Sensors - CPX_SIMULATOR_TEMPERATURE_SENSOR = "CPX.SIMULATOR.TEMPERATURE", - CPX_SIMULATOR_LIGHT_SENSOR = "CPX.SIMULATOR.LIGHT", - CPX_SIMULATOR_MOTION_SENSOR = "CPX.SIMULATOR.MOTION", - CPX_SIMULATOR_SHAKE = "CPX.SIMULATOR.SHAKE", - CPX_SIMULATOR_CAPACITIVE_TOUCH = "CPX.SIMULATOR.CAPACITIVE.TOUCH", - - MICROBIT_SIMULATOR_TEMPERATURE_SENSOR = "MICROBIT.SIMULATOR.TEMPERATURE", - MICROBIT_SIMULATOR_LIGHT_SENSOR = "MICROBIT.SIMULATOR.LIGHT", - MICROBIT_SIMULATOR_MOTION_SENSOR = "MICROBIT.SIMULATOR.MOTION", - MICROBIT_SIMULATOR_GESTURE_SENSOR = "MICROBIT.SIMULATOR.GESTURE", - - CLUE_SIMULATOR_TEMPERATURE_SENSOR = "CLUE.SIMULATOR.TEMPERATURE", - CLUE_SIMULATOR_LIGHT_SENSOR = "CLUE.SIMULATOR.LIGHT", - CLUE_SIMULATOR_MOTION_SENSOR = "CLUE.SIMULATOR.MOTION", - CLUE_SIMULATOR_GESTURE_SENSOR = "CLUE.SIMULATOR.GESTURE", - CLUE_SIMULATOR_PRESSURE_SENSOR = "CLUE.SIMULATOR.PRESSURE", - CLUE_SIMULATOR_PROXIMITY_SENSOR = "CLUE.SIMULATOR.PROXIMITY", - CLUE_SIMULATOR_HUMIDITY_SENSOR = "CLUE.SIMULATOR.HUMIDITY", - CLUE_SIMULATOR_GYRO_SENSOR = "CLUE.SIMULATOR.GYRO", - CLUE_SIMULATOR_MAGNET_SENSOR = "CLUE.SIMULATOR.MAGNET", - - // Pop-up dialog - CPX_CLICK_DIALOG_DONT_SHOW = "CPX.CLICK.DIALOG.DONT.SHOW", - CPX_CLICK_DIALOG_EXAMPLE_CODE = "CPX.CLICK.DIALOG.EXAMPLE.CODE", - CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CPX.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", - CPX_CLICK_DIALOG_TUTORIALS = "CPX.CLICK.DIALOG.TUTORIALS", - - CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CLUE.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", - - ERROR_PYTHON_PROCESS = "ERROR.PYTHON.PROCESS", - - CPX_ERROR_COMMAND_NEW_FILE = "CPX.ERROR.COMMAND.NEW.FILE", - CPX_ERROR_DEPLOY_WITHOUT_DEVICE = "CPX.ERROR.DEPLOY.WITHOUT.DEVICE", - CPX_ERROR_PYTHON_DEVICE_PROCESS = "CPX.ERROR.PYTHON.DEVICE.PROCESS", - CPX_SUCCESS_COMMAND_DEPLOY_DEVICE = "CPX.SUCCESS.COMMAND.DEPLOY.DEVICE", - - MICROBIT_ERROR_COMMAND_NEW_FILE = "MICROBIT.ERROR.COMMAND.NEW.FILE", - MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE = "MICROBIT.ERROR.DEPLOY.WITHOUT.DEVICE", - MICROBIT_ERROR_PYTHON_DEVICE_PROCESS = "MICROBIT.ERROR.PYTHON.DEVICE.PROCESS", - MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE = "MICROBIT.SUCCESS.COMMAND.DEPLOY.DEVICE", - - CLUE_ERROR_COMMAND_NEW_FILE = "CLUE.ERROR.COMMAND.NEW.FILE", - CLUE_ERROR_DEPLOY_WITHOUT_DEVICE = "CLUE.ERROR.DEPLOY.WITHOUT.DEVICE", - CLUE_ERROR_PYTHON_DEVICE_PROCESS = "CLUE.ERROR.PYTHON.DEVICE.PROCESS", - CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE = "CLUE.SUCCESS.COMMAND.DEPLOY.DEVICE", - - // Performance - CPX_PERFORMANCE_DEPLOY_DEVICE = "CPX.PERFORMANCE.DEPLOY.DEVICE", - CPX_PERFORMANCE_NEW_FILE = "CPX.PERFORMANCE.NEW.FILE", - CPX_PERFORMANCE_OPEN_SIMULATOR = "CPX.PERFORMANCE.OPEN.SIMULATOR", - - MICROBIT_PERFORMANCE_DEPLOY_DEVICE = "MICROBIT.PERFORMANCE.DEPLOY.DEVICE", - MICROBIT_PERFORMANCE_NEW_FILE = "MICROBIT.PERFORMANCE.NEW.FILE", - MICROBIT_PERFORMANCE_OPEN_SIMULATOR = "MICROBIT.PERFORMANCE.OPEN.SIMULATOR", - - CLUE_PERFORMANCE_DEPLOY_DEVICE = "CLUE.PERFORMANCE.DEPLOY.DEVICE", - CLUE_PERFORMANCE_NEW_FILE = "CLUE.PERFORMANCE.NEW.FILE", - CLUE_PERFORMANCE_OPEN_SIMULATOR = "CLUE.PERFORMANCE.OPEN.SIMULATOR", - - // Venv options - SETUP_VENV_CREATION_ERR = "SETUP.VENV.CREATION.ERR", - SETUP_NO_PIP = "SETUP.NO.PIP", - SETUP_DEP_INSTALL_FAIL = "SETUP.DEP.INSTALL.FAIL", - SETUP_AUTO_RESOLVE_PYTHON_PATH = "SETUP.AUTO.RESOLVE.PYTHON.PATH", - SETUP_NO_PYTHON_PATH = "SETUP.NO.PYTHON.PATH", - SETUP_DOWNLOAD_PYTHON = "SETUP.DOWNLOAD.PYTHON", - SETUP_INVALID_PYTHON_INTERPRETER_PATH = "SETUP.INVALID.PYTHON.INTERPRETER.PATH", - SETUP_INVALID_PYTHON_VER = "SETUP.INVALID.PYTHON.VER", - SETUP_INSTALL_VENV = "SETUP.INSTALL.VENV", - SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL = "SETUP.ORIGINAL.INTERPRETER.DEP.INSTALL", - SETUP_HAS_VENV = "SETUP.HAS.VENV", - SETUP_NO_DEPS_INSTALLED = "SETUP.NO.DEPS.INSTALLED", -} -export const DEFAULT_DEVICE = CONSTANTS.DEVICE_NAME.CPX; - -// tslint:disable-next-line: no-namespace -export namespace DialogResponses { - export const ACCEPT_AND_RUN: MessageItem = { - title: localize("dialogResponses.agreeAndRun", "Agree and Run"), - }; - export const AGREE_AND_PROCEED: MessageItem = { - title: localize("dialogResponses.agreeAndProceed", "Agree and Proceed"), - }; - export const CANCEL: MessageItem = { - title: localize("dialogResponses.cancel", "Cancel"), - }; - export const SELECT: MessageItem = { - title: localize("dialogResponses.select", "Select"), - }; - export const HELP: MessageItem = { - title: localize("dialogResponses.help", "I need help"), - }; - export const DONT_SHOW: MessageItem = { - title: localize("dialogResponses.dontShowAgain", "Don't Show Again"), - }; - export const NO: MessageItem = { - title: localize("dialogResponses.No", "No"), - }; - export const INSTALL_NOW: MessageItem = { - title: localize("dialogResponses.installNow", "Install Now"), - }; - export const DONT_INSTALL: MessageItem = { - title: localize("dialogResponses.dontInstall", "Don't Install"), - }; - export const PRIVACY_STATEMENT: MessageItem = { - title: localize("info.privacyStatement", "Privacy Statement"), - }; - export const TUTORIALS: MessageItem = { - title: localize("dialogResponses.tutorials", "Tutorials on Adafruit"), - }; - export const EXAMPLE_CODE: MessageItem = { - title: localize( - "dialogResponses.exampleCode", - "Example Code on GitHub" - ), - }; - export const MESSAGE_UNDERSTOOD: MessageItem = { - title: localize("dialogResponses.messageUnderstood", "Got It"), - }; - export const INSTALL_PIP: MessageItem = { - title: localize( - "dialogResponses.installPip", - "Install from Pip's webpage" - ), - }; - export const INSTALL_PYTHON: MessageItem = { - title: localize( - "dialogResponses.installPython", - "Install from python.org" - ), - }; - export const YES: MessageItem = { - title: localize("dialogResponses.Yes", "Yes"), - }; - export const READ_INSTALL_MD: MessageItem = { - title: localize( - "dialogResponses.readInstall", - "Read installation docs" - ), - }; -} - -export const CPX_CONFIG_FILE = path.join(".vscode", "cpx.json"); - -export const STATUS_BAR_PRIORITY = { - PORT: 20, - OPEN_PORT: 30, - BAUD_RATE: 40, -}; - -export const VERSIONS = { - MIN_PY_VERSION: "Python 3.7.0", -}; - -export const HELPER_FILES = { - CHECK_IF_VENV_PY: "check_if_venv.py", - CHECK_PYTHON_DEPENDENCIES: "check_python_dependencies.py", - DEVICE_PY: "device.py", - PROCESS_USER_CODE_PY: "process_user_code.py", - PYTHON_EXE: "python.exe", - PYTHON: "python", -}; - -export const GLOBAL_ENV_VARS = { - PYTHON: "python", - PYTHON3: "python3", -}; -export const LANGUAGE_VARS = { - PYTHON: { ID: "python", FILE_ENDS: ".py" }, -}; - -export default CONSTANTS; diff --git a/src/cpxWorkspace.ts b/src/cpxWorkspace.ts deleted file mode 100644 index 47239a79a..000000000 --- a/src/cpxWorkspace.ts +++ /dev/null @@ -1,26 +0,0 @@ -import * as fs from "fs"; -import * as path from "path"; -import * as vscode from "vscode"; - -export class CPXWorkspace { - static get rootPath(): string | undefined { - const workspaceFolders = vscode.workspace.workspaceFolders; - if (!workspaceFolders || workspaceFolders.length === 0) { - return undefined; - } - - for (const workspaceFolder of workspaceFolders) { - const workspaceFolderPath = workspaceFolder.uri.fsPath; - const cpxConfigPath = path.join( - workspaceFolderPath, - ".vscode", - "cpx.json" - ); - if (fs.existsSync(cpxConfigPath)) { - return workspaceFolderPath; - } - } - - return workspaceFolders[0].uri.fsPath; - } -} diff --git a/src/debug_user_code.py b/src/debug_user_code.py deleted file mode 100644 index a1ad6cb16..000000000 --- a/src/debug_user_code.py +++ /dev/null @@ -1,95 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -import os -import sys -import traceback -from pathlib import Path -import python_constants as CONSTANTS -import check_python_dependencies -from common import utils - -# will propagate errors if dependencies aren't sufficient -check_python_dependencies.check_for_dependencies() - -abs_path_to_parent_dir = os.path.dirname(os.path.abspath(__file__)) - -# Insert absolute path to Adafruit library for CPX into sys.path -abs_path_to_adafruit_lib = os.path.join( - abs_path_to_parent_dir, CONSTANTS.ADAFRUIT_LIBRARY_NAME -) -sys.path.insert(0, abs_path_to_adafruit_lib) - -# Insert absolute path to Micropython libraries for micro:bit into sys.path -abs_path_to_micropython_lib = os.path.join( - abs_path_to_parent_dir, CONSTANTS.MICROPYTHON_LIBRARY_NAME -) -sys.path.insert(0, abs_path_to_micropython_lib) - -# Insert absolute path to library for CLUE into sys.path -sys.path.insert(0, os.path.join(abs_path_to_parent_dir, CONSTANTS.CLUE)) - -# Insert absolute path to Circuitpython libraries for CLUE into sys.path -sys.path.insert(0, os.path.join(abs_path_to_parent_dir, CONSTANTS.CIRCUITPYTHON)) - -# This import must happen after the sys.path is modified -from common import debugger_communication_client - -# get board so we can get terminal handle -import board - -# get handle to terminal for clue -curr_terminal = board.DISPLAY.terminal - -## Execute User Code ## - -# Get user's code path -abs_path_to_code_file = "" -if len(sys.argv) > 1 and sys.argv[1]: - abs_path_to_code_file = sys.argv[1] -else: - raise FileNotFoundError(CONSTANTS.ERROR_NO_FILE) - -# Get Debugger Server Port -server_port = CONSTANTS.DEFAULT_PORT -if len(sys.argv) > 2: - server_port = sys.argv[2] - -# Init Communication -debugger_communication_client.init_connection(server_port) - -# Init API variables -utils.abs_path_to_user_file = abs_path_to_code_file -utils.debug_mode = True - -# overriding print function so that it shows on clue terminal -def print_decorator(func): - global curr_terminal - - def wrapped_func(*args, **kwargs): - curr_terminal.add_str_to_terminal("".join(str(e) for e in args)) - return func(*args, **kwargs) - - return wrapped_func - - -print = print_decorator(print) - -# Execute the user's code file -with open(abs_path_to_code_file, encoding="utf8") as user_code_file: - curr_terminal.add_str_to_terminal(CONSTANTS.CODE_START_MSG_CLUE) - user_code = user_code_file.read() - try: - codeObj = compile(user_code, abs_path_to_code_file, CONSTANTS.EXEC_COMMAND) - exec(codeObj, {"print": print}) - sys.stdout.flush() - except Exception as e: - exc_type, exc_value, exc_traceback = sys.exc_info() - errorMessage = CONSTANTS.ERROR_TRACEBACK - stackTrace = traceback.format_exception(exc_type, exc_value, exc_traceback) - - for frameIndex in range(2, len(stackTrace) - 1): - errorMessage += "\t" + str(stackTrace[frameIndex]) - print(e, errorMessage, file=sys.stderr, flush=True) - curr_terminal.add_str_to_terminal(CONSTANTS.CODE_FINISHED_MSG_CLUE) - board.DISPLAY.show(None) diff --git a/src/debugger/debugAdapter.ts b/src/debugger/debugAdapter.ts deleted file mode 100644 index 59a78482e..000000000 --- a/src/debugger/debugAdapter.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { DebugAdapterTracker, DebugConsole, DebugSession } from "vscode"; -import { DebuggerCommunicationService } from "../service/debuggerCommunicationService"; -import { MessagingService } from "../service/messagingService"; -import { DEBUG_COMMANDS } from "../view/constants"; - -export class DebugAdapter implements DebugAdapterTracker { - private readonly console: DebugConsole | undefined; - private readonly messagingService: MessagingService; - private debugCommunicationService: DebuggerCommunicationService; - constructor( - debugSession: DebugSession, - messagingService: MessagingService, - debugCommunicationService: DebuggerCommunicationService - ) { - this.console = debugSession.configuration.console; - this.messagingService = messagingService; - this.debugCommunicationService = debugCommunicationService; - } - onWillStartSession() { - // To Implement - } - onWillReceiveMessage(message: any): void { - if (message.command) { - // Only send pertinent debug messages - switch (message.command) { - case DEBUG_COMMANDS.CONTINUE: - this.messagingService.sendStartMessage(); - break; - case DEBUG_COMMANDS.STACK_TRACE: - this.messagingService.sendPauseMessage(); - break; - case DEBUG_COMMANDS.DISCONNECT: - // Triggered on stop event for debugger - if (!message.arguments.restart) { - this.debugCommunicationService.handleStopEvent(); - } - break; - } - } - } - // A debugger error should unlock the webview - onError() { - this.messagingService.sendStartMessage(); - } - // Device is always running when exiting debugging mode - onExit() { - this.messagingService.sendStartMessage(); - } -} diff --git a/src/debugger/debugAdapterFactory.ts b/src/debugger/debugAdapterFactory.ts deleted file mode 100644 index 5b0e2b401..000000000 --- a/src/debugger/debugAdapterFactory.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { - DebugAdapterTracker, - DebugAdapterTrackerFactory, - DebugSession, - ProviderResult, -} from "vscode"; -import { DebuggerCommunicationService } from "../service/debuggerCommunicationService"; -import { MessagingService } from "../service/messagingService"; -import { DebugAdapter } from "./debugAdapter"; - -export class DebugAdapterFactory implements DebugAdapterTrackerFactory { - private debugSession: DebugSession; - private messagingService: MessagingService; - private debugCommunicationService: DebuggerCommunicationService; - constructor( - debugSession: DebugSession, - messagingService: MessagingService, - debugCommunicationService: DebuggerCommunicationService - ) { - this.debugSession = debugSession; - this.messagingService = messagingService; - this.debugCommunicationService = debugCommunicationService; - } - public createDebugAdapterTracker( - session: DebugSession - ): ProviderResult { - return new DebugAdapter( - session, - this.messagingService, - this.debugCommunicationService - ); - } -} diff --git a/src/debuggerCommunicationServer.ts b/src/debuggerCommunicationServer.ts deleted file mode 100644 index 0fa4a65cc..000000000 --- a/src/debuggerCommunicationServer.ts +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as http from "http"; -import * as socketio from "socket.io"; -import { WebviewPanel } from "vscode"; -import { SERVER_INFO } from "./constants"; -import { DeviceSelectionService } from "./service/deviceSelectionService"; - -export const DEBUGGER_MESSAGES = { - EMITTER: { - INPUT_CHANGED: "input_changed", - RECEIVED_STATE: "received_state", - DISCONNECT: "process_disconnect", - }, - LISTENER: { - UPDATE_STATE: "updateState", - RECEIVED_STATE: "receivedState", - DISCONNECT: "disconnect", - }, -}; - -export class DebuggerCommunicationServer { - private port: number; - private serverHttp: http.Server; - private serverIo: socketio.Server; - private simulatorWebview: WebviewPanel | undefined; - private deviceSelectionService: DeviceSelectionService; - private isPendingResponse = false; - private pendingCallbacks: Function[] = []; - - constructor( - webviewPanel: WebviewPanel | undefined, - port = SERVER_INFO.DEFAULT_SERVER_PORT, - deviceSelectionService: DeviceSelectionService - ) { - this.port = port; - this.serverHttp = new http.Server(); - this.initHttpServer(); - - this.serverIo = socketio(this.serverHttp); - this.simulatorWebview = webviewPanel; - this.initEventsHandlers(); - console.info(`Server running on port ${this.port}`); - - this.deviceSelectionService = deviceSelectionService; - } - - // send the message to start closing the connection - public closeConnection(): void { - this.sendDisconnectEvent(); - } - - public setWebview(webviewPanel: WebviewPanel | undefined) { - this.simulatorWebview = webviewPanel; - } - // Events are pushed when the previous processed event is over - public emitInputChanged(newState: string): void { - if (this.isPendingResponse) { - this.pendingCallbacks.push(() => { - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, - newState - ); - }); - } else { - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, - newState - ); - this.isPendingResponse = true; - } - } - public disconnectFromPort() { - this.serverIo.close(); - this.serverHttp.close(); - } - private sendDisconnectEvent() { - this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); - } - - private initHttpServer(): void { - this.serverHttp.listen(this.port); - if (!this.serverHttp.listening) { - throw new Error(SERVER_INFO.ERROR_CODE_INIT_SERVER); - } - } - - private initEventsHandlers(): void { - this.serverIo.on("connection", (socket: any) => { - socket.on(DEBUGGER_MESSAGES.LISTENER.UPDATE_STATE, (data: any) => { - this.handleState(data); - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.RECEIVED_STATE, - {} - ); - }); - socket.on(DEBUGGER_MESSAGES.LISTENER.RECEIVED_STATE, () => { - if (this.pendingCallbacks.length > 0) { - const currentCall = this.pendingCallbacks.shift(); - currentCall(); - this.isPendingResponse = true; - } else { - this.isPendingResponse = false; - } - }); - - socket.on(DEBUGGER_MESSAGES.LISTENER.DISCONNECT, () => { - this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); - if (this.simulatorWebview) { - this.simulatorWebview.webview.postMessage({ - command: "reset-state", - }); - } - }); - }); - } - - private handleState(data: any): void { - try { - const messageToWebview = JSON.parse(data); - if (messageToWebview.type === "state") { - const messageState = JSON.parse(messageToWebview.data); - if ( - this.simulatorWebview && - messageState.device_name === - this.deviceSelectionService.getCurrentActiveDevice() - ) { - this.simulatorWebview.webview.postMessage({ - active_device: this.deviceSelectionService.getCurrentActiveDevice(), - command: "set-state", - state: messageState, - }); - } - } - } catch (err) { - console.error(`Error: Non-JSON output from the process : ${data}`); - } - } -} diff --git a/src/dev-requirements.txt b/src/dev-requirements.txt deleted file mode 100644 index 26f334b51..000000000 --- a/src/dev-requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ --r ./requirements.txt -black==19.10b0 -pytest==5.0.1 \ No newline at end of file diff --git a/src/device.py b/src/device.py deleted file mode 100644 index def9673b0..000000000 --- a/src/device.py +++ /dev/null @@ -1,121 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -from subprocess import check_output -import string -import os -import sys -import shutil -import json -import uflash -import python_constants as CONSTANTS - -if sys.platform == "win32": - # pylint: disable=import-error - import win32api - - -class Device: - def __init__(self, name, file_path): - self.name = name - self.file_path = file_path - self.connected = False - self.error_message = None - - def find_adafruit_device_directory(self): - """ - Check if the Adafruit Device is available/plugged in - """ - found_directory = None - - if sys.platform.startswith(CONSTANTS.LINUX_OS) or sys.platform.startswith( - CONSTANTS.MAC_OS - ): - # Mac or Linux - mounted = ( - check_output(CONSTANTS.MOUNT_COMMAND) - .decode(CONSTANTS.UTF_FORMAT) - .split("\n") - ) - for mount in mounted: - drive_path = mount.split()[2] if mount else "" - if drive_path.endswith(CONSTANTS.ADAFRUIT_DRIVE_NAME): - found_directory = drive_path - break - elif sys.platform == CONSTANTS.WINDOWS_OS: - # Windows - for drive_letter in string.ascii_uppercase: - drive_path = "{}:{}".format(drive_letter, os.sep) - if os.path.exists(drive_path): - drive_name = win32api.GetVolumeInformation(drive_path)[0] - if drive_name == CONSTANTS.ADAFRUIT_DRIVE_NAME: - found_directory = drive_path - break - else: - raise NotImplementedError(CONSTANTS.NOT_SUPPORTED_OS.format(sys.platform)) - - if not found_directory: - self.connected = False - self.error_message = ( - CONSTANTS.NO_ADAFRUIT_DEVICE_DETECTED_ERROR_TITLE, - CONSTANTS.NO_ADAFRUIT_DEVICE_DETECTED_ERROR_DETAIL.format(sys.platform), - ) - else: - self.connected = True - self.error_message = None - return found_directory - - def deployToAdafruitDevice(self): - device_directory = self.find_adafruit_device_directory() - if self.error_message: - print( - "{}:\t{}".format(self.error_message[0], self.error_message[1]), - file=sys.stderr, - flush=True, - ) - if self.connected: - original_file_name = self.file_path.rsplit(os.sep, 1)[-1] - if original_file_name == "code.py" or original_file_name == "main.py": - dest_path = os.path.join(device_directory, original_file_name) - else: - dest_path = os.path.join(device_directory, "code.py") - shutil.copyfile(self.file_path, dest_path) - message = {"type": "complete"} - else: - message = {"type": "no-device"} - return message - - def deployToMicrobit(self): - # Temporarily redirecting stdout because there are some print statements in uflash library - fake_stdout = open(os.devnull, "w") - _stdout = sys.stdout - sys.stdout = fake_stdout - - try: - uflash.flash(path_to_python=self.file_path) - message = {"type": "complete"} - except RuntimeError: - message = {"type": "low-python-version"} - except IOError: - self.error_message = CONSTANTS.NO_MICROBIT_DETECTED_ERROR_TITLE - print( - self.error_message, file=sys.stderr, flush=True, - ) - message = {"type": "no-device"} - - sys.stdout = _stdout - return message - - def deploy(self): - if self.name == CONSTANTS.MICROBIT: - return self.deployToMicrobit() - elif self.name == CONSTANTS.CPX or self.name == CONSTANTS.CLUE: - return self.deployToAdafruitDevice() - else: - return {"type": "no-device"} - - -if __name__ == "__main__": - device = Device(sys.argv[1], sys.argv[2]) - message = device.deploy() - print(json.dumps(message), flush=True) diff --git a/src/deviceContext.ts b/src/deviceContext.ts deleted file mode 100644 index a4f0afd2e..000000000 --- a/src/deviceContext.ts +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Credit: A majority of this code was taken from the Visual Studio Code Arduino extension with some modifications to suit our purposes. - -import * as fs from "fs"; -import * as path from "path"; -import * as vscode from "vscode"; -import CONSTANTS, { CPX_CONFIG_FILE } from "./constants"; -import { CPXWorkspace } from "./cpxWorkspace"; -import * as utils from "./extension_utils/utils"; - -export class DeviceContext implements vscode.Disposable { - public static getInstance(): DeviceContext { - return DeviceContext._deviceContext; - } - - private static _deviceContext: DeviceContext = new DeviceContext(); - - private _onDidChange = new vscode.EventEmitter(); - private _watcher: vscode.FileSystemWatcher; - private _vscodeWatcher: vscode.FileSystemWatcher; - private _port!: string; - - private constructor() { - if (vscode.workspace && CPXWorkspace.rootPath) { - this._watcher = vscode.workspace.createFileSystemWatcher( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ); - this._vscodeWatcher = vscode.workspace.createFileSystemWatcher( - path.join(CPXWorkspace.rootPath, ".vscode"), - true, - true, - false - ); - - // Reloads the config into the code if the cpx config file has changed - this._watcher.onDidCreate(() => this.loadContext()); - this._watcher.onDidChange(() => this.loadContext()); - this._watcher.onDidDelete(() => this.loadContext()); - - this._vscodeWatcher.onDidDelete(() => this.loadContext()); - } - } - - public loadContext(): Thenable { - return vscode.workspace.findFiles(CPX_CONFIG_FILE, null, 1).then( - files => { - let cpxConfigJson: any = {}; - if (files && files.length > 0) { - const configFile = files[0]; - cpxConfigJson = utils.tryParseJSON( - fs.readFileSync(configFile.fsPath, "utf8") - ); - if (cpxConfigJson) { - this._port = cpxConfigJson.port; - this._onDidChange.fire(); - } else { - console.error(CONSTANTS.ERROR.CPX_FILE_ERROR); - } - } else { - this._port = null; - this._onDidChange.fire(); - } - return this; - }, - reason => { - this._port = null; - this._onDidChange.fire(); - return this; - } - ); - } - - public saveContext() { - if (!CPXWorkspace.rootPath) { - return; - } - const cpxConfigFile = path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE); - let cpxConfigJson: any = {}; - if (utils.fileExistsSync(cpxConfigFile)) { - cpxConfigJson = utils.tryParseJSON( - fs.readFileSync(cpxConfigFile, "utf8") - ); - } - if (!cpxConfigJson) { - // log and notify user error - return; - } - cpxConfigJson.port = this.port; - - utils.mkdirRecursivelySync(path.dirname(cpxConfigFile)); - fs.writeFileSync( - cpxConfigFile, - JSON.stringify( - cpxConfigJson, - (key, value) => { - if (value === null) { - return undefined; - } - return value; - }, - 4 - ) - ); - } - - public dispose() { - if (this._watcher) { - this._watcher.dispose(); - } - - if (this._vscodeWatcher) { - this._vscodeWatcher.dispose(); - } - } - - public async initialize() { - if ( - CPXWorkspace.rootPath && - utils.fileExistsSync( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ) - ) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.CPX_JSON_ALREADY_GENERATED - ); - return; - } else { - if (!CPXWorkspace.rootPath) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.PLEASE_OPEN_FOLDER - ); - return; - } - } - } - - public get onDidChange(): vscode.Event { - return this._onDidChange.event; - } - - public get port() { - return this._port; - } - - public set port(value: string) { - this._port = value; - this.saveContext(); - } -} diff --git a/src/extension.ts b/src/extension.ts deleted file mode 100644 index 5940217dc..000000000 --- a/src/extension.ts +++ /dev/null @@ -1,1101 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as cp from "child_process"; -import * as fs from "fs"; -import * as open from "open"; -import * as path from "path"; -import * as vscode from "vscode"; -import { - CONFIG, - CONSTANTS, - CPX_CONFIG_FILE, - DialogResponses, - GLOBAL_ENV_VARS, - HELPER_FILES, - LANGUAGE_VARS, - SERVER_INFO, - TelemetryEventName, -} from "./constants"; -import { CPXWorkspace } from "./cpxWorkspace"; -import { DebugAdapterFactory } from "./debugger/debugAdapterFactory"; -import { DebuggerCommunicationServer } from "./debuggerCommunicationServer"; -import * as utils from "./extension_utils/utils"; -import { SerialMonitor } from "./serialMonitor"; -import { DebuggerCommunicationService } from "./service/debuggerCommunicationService"; -import { DeviceSelectionService } from "./service/deviceSelectionService"; -import { FileSelectionService } from "./service/fileSelectionService"; -import { MessagingService } from "./service/messagingService"; -import { PopupService } from "./service/PopupService"; -import { SetupService } from "./service/setupService"; -import { TelemetryHandlerService } from "./service/telemetryHandlerService"; -import { WebviewService } from "./service/webviewService"; -import { SimulatorDebugConfigurationProvider } from "./simulatorDebugConfigurationProvider"; -import getPackageInfo from "./telemetry/getPackageInfo"; -import TelemetryAI from "./telemetry/telemetryAI"; -import { UsbDetector } from "./usbDetector"; -import { - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, - WEBVIEW_TYPES, -} from "./view/constants"; - -let telemetryAI: TelemetryAI; -let pythonExecutablePath: string = GLOBAL_ENV_VARS.PYTHON; -let configFileCreated: boolean = false; -let inDebugMode: boolean = false; -// Notification booleans -let firstTimeClosed: boolean = true; -let shouldShowRunCodePopup: boolean = true; - -let setupService: SetupService; -const deviceSelectionService = new DeviceSelectionService(); -const messagingService = new MessagingService(deviceSelectionService); -const debuggerCommunicationService = new DebuggerCommunicationService(); -const fileSelectionService = new FileSelectionService(messagingService); - -let pythonProcessDataBuffer: string[]; - -export let outChannel: vscode.OutputChannel | undefined; - -const sendCurrentDeviceMessage = (currentPanel: vscode.WebviewPanel) => { - if (currentPanel) { - currentPanel.webview.postMessage({ - command: VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE, - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } -}; -// Extension activation -export async function activate(context: vscode.ExtensionContext) { - telemetryAI = new TelemetryAI(context); - setupService = new SetupService(telemetryAI); - let currentPanel: vscode.WebviewPanel | undefined; - let childProcess: cp.ChildProcess | undefined; - let messageListener: vscode.Disposable; - let activeEditorListener: vscode.Disposable; - const webviewService = new WebviewService(context, deviceSelectionService); - const telemetryHandlerService = new TelemetryHandlerService( - telemetryAI, - deviceSelectionService - ); - const formalNameToNickNameMapping = { - [CONSTANTS.DEVICE_NAME_FORMAL.CPX]: CONSTANTS.DEVICE_NAME.CPX, - [CONSTANTS.DEVICE_NAME_FORMAL.MICROBIT]: CONSTANTS.DEVICE_NAME.MICROBIT, - [CONSTANTS.DEVICE_NAME_FORMAL.CLUE]: CONSTANTS.DEVICE_NAME.CLUE, - }; - - // Add our library path to settings.json for autocomplete functionality - updatePythonExtraPaths(); - - // ignore import errors so that adafruit_circuitplayground library - // doesn't trigger lint errors - updatePylintArgs(context); - - pythonExecutablePath = await setupService.setupEnv(context); - - try { - utils.generateCPXConfig(); - configFileCreated = true; - } catch (err) { - console.info("Failed to create the CPX config file."); - configFileCreated = false; - } - - if (pythonExecutablePath === "") { - return; - } - - if (outChannel === undefined) { - outChannel = vscode.window.createOutputChannel(CONSTANTS.NAME); - utils.logToOutputChannel(outChannel, CONSTANTS.INFO.WELCOME_OUTPUT_TAB); - } - - vscode.workspace.onDidSaveTextDocument( - async (document: vscode.TextDocument) => { - await fileSelectionService.updateCurrentFileFromTextFile(document); - } - ); - - const currVersionReleaseName = - "release_note_" + getPackageInfo(context).extensionVersion; - const viewedReleaseNote = context.globalState.get( - currVersionReleaseName, - false - ); - - if (!viewedReleaseNote) { - PopupService.openReleaseNote(); - context.globalState.update(currVersionReleaseName, true); - } - - const openWebview = () => { - if (currentPanel && currentPanel.webview) { - messagingService.setWebview(currentPanel.webview); - currentPanel.webview.html = webviewService.getWebviewContent( - WEBVIEW_TYPES.SIMULATOR, - true, - currentPanel - ); - currentPanel.reveal(vscode.ViewColumn.Beside); - } else { - currentPanel = vscode.window.createWebviewPanel( - CONSTANTS.WEBVIEW_TYPE.SIMULATOR, - CONSTANTS.LABEL.WEBVIEW_PANEL, - { preserveFocus: true, viewColumn: vscode.ViewColumn.Beside }, - { - // Only allow the webview to access resources in our extension's media directory - localResourceRoots: [ - vscode.Uri.file( - path.join( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY - ) - ), - ], - enableScripts: true, - } - ); - - currentPanel.webview.html = webviewService.getWebviewContent( - WEBVIEW_TYPES.SIMULATOR, - true, - currentPanel - ); - messagingService.setWebview(currentPanel.webview); - - if (messageListener !== undefined) { - messageListener.dispose(); - const index = context.subscriptions.indexOf(messageListener); - if (index > -1) { - context.subscriptions.splice(index, 1); - } - } - - if (activeEditorListener !== undefined) { - activeEditorListener.dispose(); - const index = context.subscriptions.indexOf( - activeEditorListener - ); - if (index > -1) { - context.subscriptions.splice(index, 1); - } - } - - if (currentPanel) { - // Handle messages from webview - messageListener = currentPanel.webview.onDidReceiveMessage( - message => { - const messageJson = JSON.stringify({ - active_device: deviceSelectionService.getCurrentActiveDevice(), - state: message.text, - }); - switch (message.command) { - case WEBVIEW_MESSAGES.BUTTON_PRESS: - // Send input to the Python process - telemetryHandlerService.handleButtonPressTelemetry( - message.text - ); - console.log(`About to write ${messageJson} \n`); - if ( - inDebugMode && - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .emitInputChanged(messageJson); - } else if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - break; - case WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP: - console.log(`Play button ${messageJson} \n`); - if (message.text.state as boolean) { - fileSelectionService.setPathAndSendMessage( - message.text.selected_file - ); - fileSelectionService.findCurrentTextDocument(); - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_RUN_SIMULATOR_BUTTON - ); - runSimulatorCommand(); - } else { - killProcessIfRunning(); - } - - if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - - break; - case WEBVIEW_MESSAGES.GESTURE: - case WEBVIEW_MESSAGES.SENSOR_CHANGED: - telemetryHandlerService.handleGestureTelemetry( - message.text - ); - console.log(`Sensor changed ${messageJson} \n`); - if ( - inDebugMode && - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .emitInputChanged(messageJson); - } else if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - break; - case WEBVIEW_MESSAGES.REFRESH_SIMULATOR: - console.log("Refresh button"); - runSimulatorCommand(); - break; - case WEBVIEW_MESSAGES.SLIDER_TELEMETRY: - telemetryHandlerService.handleSensorTelemetry( - message.text - ); - break; - case WEBVIEW_MESSAGES.SWITCH_DEVICE: - deviceSelectionService.setCurrentActiveDevice( - message.text.active_device - ); - killProcessIfRunning(); - break; - default: - vscode.window.showInformationMessage( - CONSTANTS.ERROR.UNEXPECTED_MESSAGE - ); - break; - } - }, - undefined, - context.subscriptions - ); - - activeEditorListener = utils.addVisibleTextEditorCallback( - currentPanel, - context - ); - } - - currentPanel.onDidDispose( - () => { - currentPanel = undefined; - if ( - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .setWebview(undefined); - } - killProcessIfRunning(); - if (firstTimeClosed) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.FIRST_TIME_WEBVIEW - ); - firstTimeClosed = false; - } - }, - undefined, - context.subscriptions - ); - } - sendCurrentDeviceMessage(currentPanel); - }; - - // Open Simulator on the webview - const openSimulator: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.openSimulator", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_SIMULATE_TO, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - deviceSelectionService.setCurrentActiveDevice(device); - const telemetryEvents = telemetryHandlerService.getTelemetryEventsForOpenSimulator( - device - ); - telemetryAI.trackFeatureUsage( - telemetryEvents.openSimulatorTelemetryEvent - ); - telemetryAI.runWithLatencyMeasure( - openWebview, - telemetryEvents.openSimulatorPerformanceTelemetryEvent - ); - } - ); - - const gettingStartedOpen: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.gettingStarted", - () => { - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_GETTING_STARTED - ); - webviewService.openTutorialPanel(); - } - ); - - const openTemplateFile = (template: string) => { - const fileName = template; - const filePath = - __dirname + path.sep + "templates" + path.sep + fileName; - const file = fs.readFileSync(filePath, "utf8"); - const showNewFilePopup: boolean = vscode.workspace - .getConfiguration() - .get(CONFIG.SHOW_NEW_FILE_POPUP); - - if (showNewFilePopup && template === CONSTANTS.TEMPLATE.CPX) { - vscode.window - .showInformationMessage( - CONSTANTS.INFO.NEW_FILE, - DialogResponses.DONT_SHOW, - DialogResponses.EXAMPLE_CODE, - DialogResponses.TUTORIALS - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.DONT_SHOW) { - vscode.workspace - .getConfiguration() - .update(CONFIG.SHOW_NEW_FILE_POPUP, false); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_DONT_SHOW - ); - } else if (selection === DialogResponses.EXAMPLE_CODE) { - open(CONSTANTS.LINKS.EXAMPLE_CODE); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_EXAMPLE_CODE - ); - } else if (selection === DialogResponses.TUTORIALS) { - const okAction = () => { - open(CONSTANTS.LINKS.TUTORIALS); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_TUTORIALS - ); - }; - utils.showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT - ); - } - }); - } - - // tslint:disable-next-line: ban-comma-operator - vscode.workspace - .openTextDocument({ - content: file, - language: LANGUAGE_VARS.PYTHON.ID, - }) - .then((template: vscode.TextDocument) => { - vscode.window.showTextDocument(template, 1, false).then(() => { - openWebview(); - }); - }), - // tslint:disable-next-line: no-unused-expression - (error: any) => { - telemetryHandlerService.handleNewFileErrorTelemetry(); - console.error(`Failed to open a new text document: ${error}`); - }; - }; - - const newFile: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.newFile", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_FOR_NEW_FILE, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - deviceSelectionService.setCurrentActiveDevice(device); - - const deviceToTemplateMapping = { - [CONSTANTS.DEVICE_NAME.CPX]: CONSTANTS.TEMPLATE.CPX, - [CONSTANTS.DEVICE_NAME.MICROBIT]: CONSTANTS.TEMPLATE.MICROBIT, - [CONSTANTS.DEVICE_NAME.CLUE]: CONSTANTS.TEMPLATE.CLUE, - }; - const templateFile = deviceToTemplateMapping[device]; - - const telemetryEvents = telemetryHandlerService.getTelemetryEventsForNewFile( - device - ); - - telemetryAI.trackFeatureUsage( - telemetryEvents.newFileTelemetryEvent - ); - telemetryAI.runWithLatencyMeasure( - () => openTemplateFile(templateFile), - telemetryEvents.newFilePerformanceTelemetryEvent - ); - } - ); - - const installDependencies: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.installDependencies", - async () => { - pythonExecutablePath = await setupService.setupEnv(context, true); - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_INSTALL_EXTENSION_DEPENDENCIES - ); - } - ); - - const killProcessIfRunning = () => { - if (childProcess !== undefined) { - if (currentPanel) { - currentPanel.webview.postMessage({ - command: "reset-state", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } - // TODO: We need to check the process was correctly killed - childProcess.kill(); - childProcess = undefined; - } - }; - - const runSimulatorCommand = async () => { - pythonProcessDataBuffer = []; - // Prevent running new code if a debug session is active - if (inDebugMode) { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.DEBUGGING_SESSION_IN_PROGESS - ); - return; - } - if (shouldShowRunCodePopup) { - const shouldExitCommand = await vscode.window - .showWarningMessage( - CONSTANTS.WARNING.ACCEPT_AND_RUN, - DialogResponses.ACCEPT_AND_RUN, - DialogResponses.CANCEL - ) - .then((selection: vscode.MessageItem | undefined) => { - let hasAccepted = true; - if (selection === DialogResponses.ACCEPT_AND_RUN) { - shouldShowRunCodePopup = false; - hasAccepted = false; - } - return hasAccepted; - }); - // Don't run users code if they don't accept - if (shouldExitCommand) { - return; - } - } - - openWebview(); - - if (!currentPanel) { - return; - } - - console.info(CONSTANTS.INFO.RUNNING_CODE); - - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_SIMULATOR, - true - ); - - killProcessIfRunning(); - - await fileSelectionService.updateCurrentFileFromEditor( - vscode.window.activeTextEditor - ); - - if (fileSelectionService.getCurrentFileAbsPath() === "") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_RUN, - true - ); - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FILE_TO_RUN, - DialogResponses.MESSAGE_UNDERSTOOD - ); - } else { - // Save on run - await fileSelectionService.getCurrentTextDocument().save(); - - if ( - !fileSelectionService - .getCurrentTextDocument() - .fileName.endsWith(LANGUAGE_VARS.PYTHON.FILE_ENDS) - ) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_RUN, - true - ); - return; - } - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.FILE_SELECTED( - fileSelectionService.getCurrentFileAbsPath() - ) - ); - - // Activate the run webview button - currentPanel.webview.postMessage({ - command: "activate-play", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - const args = [ - utils.getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.PROCESS_USER_CODE_PY - ), - fileSelectionService.getCurrentFileAbsPath(), - JSON.stringify({ enable_telemetry: utils.getTelemetryState() }), - ]; - childProcess = cp.spawn(pythonExecutablePath, args); - - let dataFromTheProcess = ""; - let oldMessage = ""; - - // Data received from Python process - childProcess.stdout.on("data", data => { - dataFromTheProcess = data.toString(); - if (currentPanel) { - // NOTE: parts of the flow regarding pythonProcessDataBuffer - // are needed for the CLUE simulator to properly receive - // base_64 strings on UNIX systems. - - // added any incomplete data to beginning - const processedData = pythonProcessDataBuffer - .join("") - .concat(dataFromTheProcess); - pythonProcessDataBuffer = []; - - // Process the data from the process and send one state at a time - processedData.split("\0").forEach(message => { - if ( - currentPanel && - message.length > 0 && - message !== oldMessage - ) { - oldMessage = message; - let messageToWebview; - // Check the message is a JSON - try { - messageToWebview = JSON.parse(message); - // Check the JSON is a state - switch (messageToWebview.type) { - case "state": - const messageData = JSON.parse( - messageToWebview.data - ); - if ( - messageData.device_name === - deviceSelectionService.getCurrentActiveDevice() - ) { - messagingService.sendMessageToWebview( - VSCODE_MESSAGES_TO_WEBVIEW.SET_STATE, - messageData - ); - } - break; - - case "print": - console.log( - `Process print statement output = ${messageToWebview.data}` - ); - utils.logToOutputChannel( - outChannel, - `[PRINT] ${messageToWebview.data}` - ); - break; - - default: - console.log( - `Non-state JSON output from the process : ${messageToWebview}` - ); - break; - } - } catch (err) { - if (err instanceof SyntaxError) { - // if not a JSON string, it is incomplete - // add to beginning of next strings - pythonProcessDataBuffer.push(message); - } else { - console.log( - `Errored output: ${messageToWebview}` - ); - } - } - } - }); - } - }); - - // Std error output - childProcess.stderr.on("data", data => { - console.error( - `Error from the Python process through stderr: ${data}` - ); - telemetryAI.trackFeatureUsage( - TelemetryEventName.ERROR_PYTHON_PROCESS - ); - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.STDERR(data), - true - ); - if (currentPanel) { - currentPanel.webview.postMessage({ - active_device: deviceSelectionService.getCurrentActiveDevice(), - command: "reset-state", - }); - } - }); - - // When the process is done - childProcess.on("end", (code: number) => { - console.info(`Command execution exited with code: ${code}`); - }); - } - }; - - // Send message to the webview - const runSimulator: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.runSimulator", - () => { - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_RUN_PALETTE - ); - runSimulatorCommand(); - } - ); - - const deployCode = async (device: string) => { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_DEVICE, - true - ); - - await fileSelectionService.updateCurrentFileFromEditor( - vscode.window.activeTextEditor - ); - - if (fileSelectionService.getCurrentFileAbsPath() === "") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, - true - ); - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, - DialogResponses.MESSAGE_UNDERSTOOD - ); - } else { - await fileSelectionService.getCurrentTextDocument().save(); - - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.FILE_SELECTED( - fileSelectionService.getCurrentFileAbsPath() - ) - ); - - const deviceProcess = cp.spawn(pythonExecutablePath, [ - utils.getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.DEVICE_PY - ), - device, - fileSelectionService.getCurrentFileAbsPath(), - ]); - - let dataFromTheProcess = ""; - - // Data received from Python process - deviceProcess.stdout.on("data", data => { - dataFromTheProcess = data.toString(); - - let messageToWebview; - try { - messageToWebview = JSON.parse(dataFromTheProcess); - if (messageToWebview.type === "complete") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_SUCCESS, - true - ); - } - telemetryHandlerService.handleDeployToDeviceFinishedTelemetry( - messageToWebview, - device - ); - } catch (err) { - console.log( - `Non-JSON output from the process : ${dataFromTheProcess}` - ); - } - }); - - // Std error output - deviceProcess.stderr.on("data", data => { - telemetryHandlerService.handleDeployToDeviceErrorTelemetry( - data, - device - ); - console.error( - `Error from the Python device process through stderr: ${data}` - ); - utils.logToOutputChannel( - outChannel, - `[ERROR] ${data} \n`, - true - ); - }); - - // When the process is done - deviceProcess.on("end", (code: number) => { - console.info(`Command execution exited with code: ${code}`); - }); - } - }; - - const deployToDevice: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.deployToDevice", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_DEPLOY_TO, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - - const telemetryEvents = telemetryHandlerService.getTelemetryEventsForStartingDeployToDevice( - device - ); - - telemetryAI.trackFeatureUsage(telemetryEvents.deployTelemetryEvent); - telemetryAI.runWithLatencyMeasure(() => { - deployCode(device); - }, telemetryEvents.deployPerformanceTelemetryEvent); - } - ); - - let serialMonitor: SerialMonitor | undefined; - if (configFileCreated) { - serialMonitor = SerialMonitor.getInstance(); - context.subscriptions.push(serialMonitor); - } - - const selectSerialPort: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.selectSerialPort", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.selectSerialPort(null, null); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CHOOSE_PORT); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const openSerialMonitor: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.openSerialMonitor", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure( - serialMonitor.openSerialMonitor.bind(serialMonitor), - TelemetryEventName.COMMAND_SERIAL_MONITOR_OPEN - ); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const changeBaudRate: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.changeBaudRate", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure( - serialMonitor.changeBaudRate.bind(serialMonitor), - TelemetryEventName.COMMAND_SERIAL_MONITOR_BAUD_RATE - ); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const closeSerialMonitor: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.closeSerialMonitor", - (port, showWarning = true) => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.closeSerialMonitor(port, showWarning); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const showReleaseNote = vscode.commands.registerCommand( - "deviceSimulatorExpress.", - (port, showWarning = true) => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.closeSerialMonitor(port, showWarning); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - UsbDetector.getInstance().initialize(context.extensionPath); - UsbDetector.getInstance().startListening(); - - if ( - CPXWorkspace.rootPath && - (utils.fileExistsSync( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ) || - vscode.window.activeTextEditor) - ) { - (() => { - if (!SerialMonitor.getInstance().initialized) { - SerialMonitor.getInstance().initialize(); - } - })(); - } - - // Debugger configuration - const simulatorDebugConfiguration = new SimulatorDebugConfigurationProvider( - utils.getPathToScript(context, "out/", "debug_user_code.py") - ); - - const debugAdapterFactory = new DebugAdapterFactory( - vscode.debug.activeDebugSession, - messagingService, - debuggerCommunicationService - ); - vscode.debug.registerDebugAdapterTrackerFactory( - LANGUAGE_VARS.PYTHON.ID, - debugAdapterFactory - ); - // On Debug Session Start: Init comunication - const debugSessionsStarted = vscode.debug.onDidStartDebugSession(() => { - if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { - // Reinitialize process - killProcessIfRunning(); - inDebugMode = true; - - try { - // Shut down existing server on debug restart - if (debuggerCommunicationService.getCurrentDebuggerServer()) { - debuggerCommunicationService.resetCurrentDebuggerServer(); - } - - debuggerCommunicationService.setCurrentDebuggerServer( - new DebuggerCommunicationServer( - currentPanel, - utils.getServerPortConfig(), - deviceSelectionService - ) - ); - - telemetryHandlerService.handleDebuggerTelemetry(); - - openWebview(); - if (currentPanel) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .setWebview(currentPanel); - currentPanel.webview.postMessage({ - active_device: deviceSelectionService.getCurrentActiveDevice(), - command: "activate-play", - }); - } - } catch (err) { - if (err.message === SERVER_INFO.ERROR_CODE_INIT_SERVER) { - console.error( - `Error trying to init the server on port ${utils.getServerPortConfig()}` - ); - - telemetryHandlerService.handleDebuggerFailTelemetry(); - - vscode.window.showErrorMessage( - CONSTANTS.ERROR.DEBUGGER_SERVER_INIT_FAILED( - utils.getServerPortConfig() - ) - ); - } - } - } - }); - - // On Debug Session Stop: Stop communiation - const debugSessionStopped = vscode.debug.onDidTerminateDebugSession(() => { - if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { - inDebugMode = false; - simulatorDebugConfiguration.deviceSimulatorExpressDebug = false; - if (debuggerCommunicationService.getCurrentDebuggerServer()) { - debuggerCommunicationService.resetCurrentDebuggerServer(); - } - if (currentPanel) { - currentPanel.webview.postMessage({ - command: "reset-state", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } - } - }); - - const configsChanged = vscode.workspace.onDidChangeConfiguration( - async () => { - if (utils.checkConfig(CONFIG.CONFIG_ENV_ON_SWITCH)) { - pythonExecutablePath = await setupService.setupEnv(context); - } - } - ); - - context.subscriptions.push( - installDependencies, - runSimulator, - changeBaudRate, - closeSerialMonitor, - deployToDevice, - newFile, - openSimulator, - openSerialMonitor, - selectSerialPort, - gettingStartedOpen, - vscode.debug.registerDebugConfigurationProvider( - CONSTANTS.DEBUG_CONFIGURATION_TYPE, - simulatorDebugConfiguration - ), - debugSessionsStarted, - debugSessionStopped, - configsChanged - ); -} - -const updatePythonExtraPaths = () => { - updateConfigLists( - "python.autoComplete.extraPaths", - [ - __dirname, - path.join(__dirname, CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY), - path.join(__dirname, CONSTANTS.FILESYSTEM.CLUE), - path.join(__dirname, CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON), - ], - vscode.ConfigurationTarget.Global - ); -}; - -const updatePylintArgs = (context: vscode.ExtensionContext) => { - const outPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY - ); - const micropythonPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY - ); - - const cluePath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.CLUE - ); - - const baseCircuitPythonPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON - ); - // update pylint args to extend system path - // to include python libs local to extention - updateConfigLists( - "python.linting.pylintArgs", - [ - "--init-hook", - `import sys; sys.path.extend([\"${outPath}\",\"${micropythonPath}\",\"${cluePath}\",\"${baseCircuitPythonPath}\"])`, - ], - vscode.ConfigurationTarget.Workspace - ); -}; - -const updateConfigLists = ( - section: string, - newItems: string[], - scope: vscode.ConfigurationTarget -) => { - // function for adding elements to configuration arrays - const currentExtraItems: string[] = - vscode.workspace.getConfiguration().get(section) || []; - const extraItemsSet: Set = new Set( - currentExtraItems.concat(newItems) - ); - - vscode.workspace - .getConfiguration() - .update(section, Array.from(extraItemsSet), scope); -}; - -// this method is called when your extension is deactivated -export async function deactivate() { - const monitor: SerialMonitor = SerialMonitor.getInstance(); - await monitor.closeSerialMonitor(null, false); - UsbDetector.getInstance().stopListening(); -} diff --git a/src/extension_utils/utils.ts b/src/extension_utils/utils.ts deleted file mode 100644 index b7be3b71c..000000000 --- a/src/extension_utils/utils.ts +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as cp from "child_process"; -import * as fs from "fs"; -import * as path from "path"; -import * as util from "util"; -import * as vscode from "vscode"; -import { - CONSTANTS, - CPX_CONFIG_FILE, - DialogResponses, - GLOBAL_ENV_VARS, - SERVER_INFO, -} from "../constants"; -import { CPXWorkspace } from "../cpxWorkspace"; -import { DeviceContext } from "../deviceContext"; - -export const exec = util.promisify(cp.exec); - -const errorChannel = vscode.window.createOutputChannel( - CONSTANTS.ERROR.INSTALLATION_ERROR -); - -// tslint:disable-next-line: export-name -export const getPathToScript = ( - context: vscode.ExtensionContext, - folderName: string, - fileName: string = "" -) => { - const onDiskPath = vscode.Uri.file( - path.join(context.extensionPath, folderName, fileName) - ); - const scriptPath = onDiskPath.with({ scheme: "vscode-resource" }); - return scriptPath.fsPath; -}; - -export const showPrivacyModal = ( - okAction: () => void, - thirdPartyDisclaimer: string -) => { - vscode.window - .showInformationMessage( - `${thirdPartyDisclaimer}: ${CONSTANTS.LINKS.PRIVACY}`, - DialogResponses.AGREE_AND_PROCEED, - DialogResponses.CANCEL - ) - .then((privacySelection: vscode.MessageItem | undefined) => { - if (privacySelection === DialogResponses.AGREE_AND_PROCEED) { - okAction(); - } else if (privacySelection === DialogResponses.CANCEL) { - // do nothing - } - }); -}; - -export const logToOutputChannel = ( - outChannel: vscode.OutputChannel | undefined, - message: string, - show: boolean = false -): void => { - if (outChannel) { - if (show) { - outChannel.show(true); - } - outChannel.append(message); - } -}; - -export function tryParseJSON(jsonString: string): any | boolean { - try { - const jsonObj = JSON.parse(jsonString); - if (jsonObj && typeof jsonObj === "object") { - return jsonObj; - } - } catch (exception) {} - - return false; -} - -export function fileExistsSync(filePath: string): boolean { - try { - return fs.statSync(filePath).isFile(); - } catch (error) { - return false; - } -} - -export function mkdirRecursivelySync(dirPath: string): void { - if (directoryExistsSync(dirPath)) { - return; - } - const dirname = path.dirname(dirPath); - if (path.normalize(dirname) === path.normalize(dirPath)) { - fs.mkdirSync(dirPath); - } else if (directoryExistsSync(dirname)) { - fs.mkdirSync(dirPath); - } else { - mkdirRecursivelySync(dirname); - fs.mkdirSync(dirPath); - } -} - -export function directoryExistsSync(dirPath: string): boolean { - try { - return fs.statSync(dirPath).isDirectory(); - } catch (e) { - return false; - } -} - -/** - * This method pads the current string with another string (repeated, if needed) - * so that the resulting string reaches the given length. - * The padding is applied from the start (left) of the current string. - */ -export function padStart( - sourceString: string, - targetLength: number, - padString?: string -): string { - if (!sourceString) { - return sourceString; - } - - if (!(String.prototype as any).padStart) { - // https://github.com/uxitten/polyfill/blob/master/string.polyfill.js - padString = String(padString || " "); - if (sourceString.length > targetLength) { - return sourceString; - } else { - targetLength = targetLength - sourceString.length; - if (targetLength > padString.length) { - padString += padString.repeat(targetLength / padString.length); // append to original to ensure we are longer than needed - } - return padString.slice(0, targetLength) + sourceString; - } - } else { - return (sourceString as any).padStart(targetLength, padString); - } -} - -export function convertToHex(num: number, width = 0): string { - return padStart(num.toString(16), width, "0"); -} - -export function generateCPXConfig(): void { - const deviceContext: DeviceContext = DeviceContext.getInstance(); - const cpxJson = { - port: deviceContext.port, - }; - const cpxConfigFilePath: string = path.join( - CPXWorkspace.rootPath, - CPX_CONFIG_FILE - ); - mkdirRecursivelySync(path.dirname(cpxConfigFilePath)); - fs.writeFileSync(cpxConfigFilePath, JSON.stringify(cpxJson, null, 4)); -} - -export const addVisibleTextEditorCallback = ( - currentPanel: vscode.WebviewPanel, - context: vscode.ExtensionContext -): vscode.Disposable => { - const initialPythonEditors = filterForPythonFiles( - vscode.window.visibleTextEditors - ); - currentPanel.webview.postMessage({ - command: "visible-editors", - state: { activePythonEditors: initialPythonEditors }, - }); - return vscode.window.onDidChangeVisibleTextEditors( - (textEditors: vscode.TextEditor[]) => { - const activePythonEditors = filterForPythonFiles(textEditors); - currentPanel.webview.postMessage({ - command: "visible-editors", - state: { activePythonEditors }, - }); - }, - {}, - context.subscriptions - ); -}; - -export const filterForPythonFiles = (textEditors: vscode.TextEditor[]) => { - return textEditors - .filter(editor => editor.document.languageId === GLOBAL_ENV_VARS.PYTHON) - .map(editor => editor.document.fileName); -}; - -export const getActiveEditorFromPath = ( - filePath: string -): vscode.TextDocument => { - const activeEditor = vscode.window.visibleTextEditors.find( - (editor: vscode.TextEditor) => editor.document.fileName === filePath - ); - return activeEditor ? activeEditor.document : undefined; -}; - -export const getServerPortConfig = (): number => { - // tslint:disable: no-backbone-get-set-outside-model prefer-type-cast - if ( - vscode.workspace - .getConfiguration() - .has(SERVER_INFO.SERVER_PORT_CONFIGURATION) - ) { - return vscode.workspace - .getConfiguration() - .get(SERVER_INFO.SERVER_PORT_CONFIGURATION) as number; - } - return SERVER_INFO.DEFAULT_SERVER_PORT; -}; - -export const checkConfig = (configName: string): boolean => { - return vscode.workspace.getConfiguration().get(configName) === true; -}; - -export const getConfig = (configName: string): string => { - return vscode.workspace.getConfiguration().get(configName); -}; - -export const createEscapedPath = (...pieces: string[]) => { - const initialPath: string = path.join(...pieces); - - // escape all special characters - // https://stackoverflow.com/questions/1779858/how-do-i-escape-a-string-for-a-shell-command-in-node - return `"` + initialPath.replace(/(["'$`\\])/g, "\\$1") + `"`; -}; - -export const getTelemetryState = () => { - return vscode.workspace - .getConfiguration() - .get("telemetry.enableTelemetry", true); -}; diff --git a/src/install_dependencies.py b/src/install_dependencies.py deleted file mode 100644 index 00fe81d37..000000000 --- a/src/install_dependencies.py +++ /dev/null @@ -1,9 +0,0 @@ -import subprocess -import sys -import pathlib -import os - -os.chdir(str(pathlib.Path(__file__).parent.parent.absolute())) -subprocess.check_call( - [sys.executable, "-m", "pip", "install", "-r", "./out/requirements.txt"] -) diff --git a/src/latest_release_note.ts b/src/latest_release_note.ts deleted file mode 100644 index ed9357870..000000000 --- a/src/latest_release_note.ts +++ /dev/null @@ -1,38 +0,0 @@ -// TODO: find a better way of loading html into a string -export const LATEST_RELEASE_NOTE = `

Device Simulator Express Release Notes 🤖

-

Device Simulator Express, a Microsoft Garage project, allows you to code microcontrollers without the hardware on hand! You can program your Adafruit Circuit Playground Express (CPX), your BBC micro:bit or the Adafruit CLUE!

-
- LIGHTGESTUREPROXIMITY -
- -

📝 April 22, 2020

-

Changes:

-
    -
  • Increased precision for certain sensors on the CLUE and CPX.
  • -
-

Fixes:

-
    -
  • Fixed bugs within the CLUE slideshow library and debugger.
  • -
- -

📝 April 20, 2020

-

-

We're back with a full release for the Adafruit CLUE 🐍🔍.

-

-

Changes:

-
    -
  • The Adafruit CLUE is enabled by default.
  • -
  • The "Getting Started" page now includes some guidance on the debugger.
  • -
-

Fixes:

-
    -
  • Implemented fix for the switch on the CPX.
  • -
  • The CLUE debugger's LEDs can now correctly show on the UI.
  • -
  • The dependency installation process is fixed, and users without Git installed can now run setup.
  • -
- -

- -

PS: You can read about the DSX team in the article here!

-

Create something wonderful ✨🙌,
-       - The Device Simulator Express Team

`; diff --git a/src/micropython/__init__.py b/src/micropython/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/micropython/audio.py b/src/micropython/audio.py deleted file mode 100644 index 36a336465..000000000 --- a/src/micropython/audio.py +++ /dev/null @@ -1,39 +0,0 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/audio.html. - - -def play(source, wait=True, pin="pin0", return_pin=None): - """ - This function is not implemented in the simulator. - - Play the source to completion. - - ``source`` is an iterable, each element of which must be an ``AudioFrame``. - - If ``wait`` is ``True``, this function will block until the source is exhausted. - - ``pin`` specifies which pin the speaker is connected to. - - ``return_pin`` specifies a differential pin to connect to the speaker - instead of ground. - """ - utils.print_for_unimplemented_functions(play.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_AUDIO) - - -class AudioFrame: - """ - This class is not implemented in the simulator. - - An ``AudioFrame`` object is a list of 32 samples each of which is a signed byte - (whole number between -128 and 127). - - It takes just over 4 ms to play a single frame. - """ - - def __init__(self): - utils.print_for_unimplemented_functions(AudioFrame.__init__.__qualname__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_AUDIO) diff --git a/src/micropython/microbit/__init__.py b/src/micropython/microbit/__init__.py deleted file mode 100644 index 478fcff42..000000000 --- a/src/micropython/microbit/__init__.py +++ /dev/null @@ -1,52 +0,0 @@ -from .__model.image import Image -from .__model.microbit_model import __mb -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -accelerometer = __mb.accelerometer -button_a = __mb.button_a -button_b = __mb.button_b -compass = __mb.compass -display = __mb.display -i2c = __mb.i2c -spi = __mb.spi - - -def panic(n): - """ - Enter a panic mode. Requires restart. Pass in an arbitrary integer <= 255 to indicate a status - """ - __mb.panic(n) - - -def reset(): - """ - Restart the board. - """ - __mb.reset() - - -def sleep(n): - """ - Wait for ``n`` milliseconds. One second is 1000 milliseconds, so:: - microbit.sleep(1000) - will pause the execution for one second. ``n`` can be an integer or - a floating point number. - """ - __mb.sleep(n) - - -def running_time(): - """ - Return the number of milliseconds since the board was switched on or - restarted. - """ - return __mb.running_time() - - -def temperature(): - """ - Return the temperature of the micro:bit in degrees Celcius. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_TEMPERATURE) - return __mb.temperature() diff --git a/src/micropython/microbit/__model/accelerometer.py b/src/micropython/microbit/__model/accelerometer.py deleted file mode 100644 index 4b28d35ee..000000000 --- a/src/micropython/microbit/__model/accelerometer.py +++ /dev/null @@ -1,136 +0,0 @@ -from . import constants as CONSTANTS -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - - -class Accelerometer: - # The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/accelerometer.html. - def __init__(self): - self.__x = 0 - self.__y = 0 - self.__z = 0 - self.__current_gesture = "" - self.__prev_gestures = set() - self.__gestures = [] - - def get_x(self): - """ - Get the acceleration measurement in the ``x`` axis, as a positive or - negative integer, depending on the direction. The measurement is given in - milli-g. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_ACCELEROMETER) - return self.__x - - def get_y(self): - """ - Get the acceleration measurement in the ``y`` axis, as a positive or - negative integer, depending on the direction. The measurement is given in - milli-g. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_ACCELEROMETER) - return self.__y - - def get_z(self): - """ - Get the acceleration measurement in the ``z`` axis, as a positive or - negative integer, depending on the direction. The measurement is given in - milli-g. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_ACCELEROMETER) - return self.__z - - def get_values(self): - """ - Get the acceleration measurements in all axes at once, as a three-element - tuple of integers ordered as X, Y, Z. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_ACCELEROMETER) - return (self.__x, self.__y, self.__z) - - def current_gesture(self): - """ - Return the name of the current gesture. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_GESTURE) - self.__add_current_gesture_to_gesture_lists() - return self.__current_gesture - - def is_gesture(self, name): - """ - Return True or False to indicate if the named gesture is currently active. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_GESTURE) - self.__add_current_gesture_to_gesture_lists() - if name not in CONSTANTS.GESTURES: - raise ValueError(CONSTANTS.INVALID_GESTURE_ERR) - return name == self.__current_gesture - - def was_gesture(self, name): - """ - Return True or False to indicate if the named gesture was active since the - last [was_gesture] call. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_GESTURE) - self.__add_current_gesture_to_gesture_lists() - if name not in CONSTANTS.GESTURES: - raise ValueError(CONSTANTS.INVALID_GESTURE_ERR) - was_gesture = name in self.__prev_gestures - self.__prev_gestures.clear() - return was_gesture - - def get_gestures(self): - """ - Return a tuple of the gesture history. The most recent is listed last. - Also clears the gesture history before returning. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_GESTURE) - self.__add_current_gesture_to_gesture_lists() - gestures = tuple(self.__gestures) - self.__gestures.clear() - return gestures - - # Helpers and Hidden Functions - - def __get_accel(self, axis): - if axis == "x": - return self.get_x() - elif axis == "y": - return self.get_y() - elif axis == "z": - return self.get_z() - - def __set_accel(self, axis, accel): - if accel < CONSTANTS.MIN_ACCELERATION or accel > CONSTANTS.MAX_ACCELERATION: - raise ValueError(CONSTANTS.INVALID_ACCEL_ERR) - if axis == "x": - self.__x = accel - elif axis == "y": - self.__y = accel - elif axis == "z": - self.__z = accel - - def __set_gesture(self, gesture): - if gesture in CONSTANTS.GESTURES: - self.__current_gesture = gesture - elif gesture == "": - self.__current_gesture = "" - else: - raise ValueError(CONSTANTS.INVALID_GESTURE_ERR) - - def __add_current_gesture_to_gesture_lists(self): - if self.__current_gesture in CONSTANTS.GESTURES: - self.__gestures.append(self.__current_gesture) - self.__prev_gestures.add(self.__current_gesture) - - def __update_motion(self, axis, accel): - if accel is not None: - previous_accel = self.__get_accel(axis) - if accel != previous_accel: - self.__set_accel(axis, accel) - - def __update_gesture(self, gesture): - if gesture is not None: - previous_gesture = self.__current_gesture - if previous_gesture != gesture: - self.__set_gesture(gesture) diff --git a/src/micropython/microbit/__model/button.py b/src/micropython/microbit/__model/button.py deleted file mode 100644 index 1bbe4ddbc..000000000 --- a/src/micropython/microbit/__model/button.py +++ /dev/null @@ -1,59 +0,0 @@ -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - - -class Button: - # The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/button.html. - def __init__(self): - self.__pressed = False - self.__presses = 0 - self.__prev_pressed = False - - def is_pressed(self): - """ - Returns ``True`` if the specified button ``button`` is currently being - held down, and ``False`` otherwise. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_BUTTON) - return self.__pressed - - def was_pressed(self): - """ - Returns ``True`` or ``False`` to indicate if the button was pressed - (went from up to down) since the device started or the last time this - method was called. Calling this method will clear the press state so - that the button must be pressed again before this method will return - ``True`` again. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_BUTTON) - res = self.__prev_pressed - self.__prev_pressed = False - return res - - def get_presses(self): - """ - Returns the running total of button presses, and resets this total - to zero before returning. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_BUTTON) - res = self.__presses - self.__presses = 0 - return res - - def __press_down(self): - self.__pressed = True - self.__prev_pressed = True - self.__presses += 1 - - def __release(self): - self.__pressed = False - - def __update(self, is_button_pressed): - if is_button_pressed is not None: - was_button_pressed = self.is_pressed() - - if is_button_pressed != was_button_pressed: - if is_button_pressed: - self.__press_down() - else: - self.__release() diff --git a/src/micropython/microbit/__model/compass.py b/src/micropython/microbit/__model/compass.py deleted file mode 100644 index 56eb43911..000000000 --- a/src/micropython/microbit/__model/compass.py +++ /dev/null @@ -1,88 +0,0 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - - -class Compass: - # The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/compass.html. - def calibrate(self): - """ - This function is not implemented in the simulator. - - Starts the calibration process. When this function is called on the physical device, an instructive message will be scrolled to the user after which they will need to rotate the device in order to draw a circle on the LED display on the actual device. - """ - utils.print_for_unimplemented_functions(Compass.calibrate.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) - - def is_calibrated(self): - """ - This function is not implemented in the simulator. - - Returns ``True`` if the compass has been successfully calibrated, and - returns ``False`` otherwise. - """ - utils.print_for_unimplemented_functions(Compass.is_calibrated.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) - - def clear_calibration(self): - """ - This function is not implemented in the simulator. - - Undoes the calibration, making the compass uncalibrated again. - """ - utils.print_for_unimplemented_functions(Compass.clear_calibration.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) - - def get_x(self): - """ - This function is not implemented in the simulator. - - Gives the reading of the magnetic field strength on the ``x`` axis in nano - tesla, as a positive or negative integer, depending on the direction of the - field. - """ - utils.print_for_unimplemented_functions(Compass.get_x.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) - - def get_y(self): - """ - This function is not implemented in the simulator. - - Gives the reading of the magnetic field strength on the ``y`` axis in nano - tesla, as a positive or negative integer, depending on the direction of the - field. - """ - utils.print_for_unimplemented_functions(Compass.get_y.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) - - def get_z(self): - """ - This function is not implemented in the simulator. - - Gives the reading of the magnetic field strength on the ``z`` axis in nano - tesla, as a positive or negative integer, depending on the direction of the - field. - """ - utils.print_for_unimplemented_functions(Compass.get_z.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) - - def heading(self): - """ - This function is not implemented in the simulator. - - Gives the compass heading, calculated from the above readings, as an - integer in the range from 0 to 360, representing the angle in degrees, - clockwise, with north as 0. - """ - utils.print_for_unimplemented_functions(Compass.heading.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) - - def get_field_strength(self): - """ - This function is not implemented in the simulator. - - Returns an integer indication of the magnitude of the magnetic field around - the device in nano tesla. - """ - utils.print_for_unimplemented_functions(Compass.get_field_strength.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) diff --git a/src/micropython/microbit/__model/constants.py b/src/micropython/microbit/__model/constants.py deleted file mode 100644 index 3e05b8b90..000000000 --- a/src/micropython/microbit/__model/constants.py +++ /dev/null @@ -1,169 +0,0 @@ -MICROBIT = "micro:bit" - -# string arguments for constructor -BLANK_5X5 = "00000:00000:00000:00000:00000:" - -# pre-defined image patterns -IMAGE_PATTERNS = { - "HEART": "09090:99999:99999:09990:00900:", - "HEART_SMALL": "00000:09090:09990:00900:00000:", - "HAPPY": "00000:09090:00000:90009:09990:", - "SMILE": "00000:00000:00000:90009:09990:", - "SAD": "00000:09090:00000:09990:90009:", - "CONFUSED": "00000:09090:00000:09090:90909:", - "ANGRY": "90009:09090:00000:99999:90909:", - "ASLEEP": "00000:99099:00000:09990:00000:", - "SURPRISED": "09090:00000:00900:09090:00900:", - "SILLY": "90009:00000:99999:00909:00999:", - "FABULOUS": "99999:99099:00000:09090:09990:", - "MEH": "09090:00000:00090:00900:09000:", - "YES": "00000:00009:00090:90900:09000:", - "NO": "90009:09090:00900:09090:90009:", - "CLOCK12": "00900:00900:00900:00000:00000:", - "CLOCK11": "09000:09000:00900:00000:00000:", - "CLOCK10": "00000:99000:00900:00000:00000:", - "CLOCK9": "00000:00000:99900:00000:00000:", - "CLOCK8": "00000:00000:00900:99000:00000:", - "CLOCK7": "00000:00000:00900:09000:09000:", - "CLOCK6": "00000:00000:00900:00900:00900:", - "CLOCK5": "00000:00000:00900:00090:00090:", - "CLOCK4": "00000:00000:00900:00099:00000:", - "CLOCK3": "00000:00000:00999:00000:00000:", - "CLOCK2": "00000:00099:00900:00000:00000:", - "CLOCK1": "00090:00090:00900:00000:00000:", - "ARROW_N": "00900:09990:90909:00900:00900:", - "ARROW_NE": "00999:00099:00909:09000:90000:", - "ARROW_E": "00900:00090:99999:00090:00900:", - "ARROW_SE": "90000:09000:00909:00099:00999:", - "ARROW_S": "00900:00900:90909:09990:00900:", - "ARROW_SW": "00009:00090:90900:99000:99900:", - "ARROW_W": "00900:09000:99999:09000:00900:", - "ARROW_NW": "99900:99000:90900:00090:00009:", - "TRIANGLE": "00000:00900:09090:99999:00000:", - "TRIANGLE_LEFT": "90000:99000:90900:90090:99999:", - "CHESSBOARD": "09090:90909:09090:90909:09090:", - "DIAMOND": "00900:09090:90009:09090:00900:", - "DIAMOND_SMALL": "00000:00900:09090:00900:00000:", - "SQUARE": "99999:90009:90009:90009:99999:", - "SQUARE_SMALL": "00000:09990:09090:09990:00000:", - "RABBIT": "90900:90900:99990:99090:99990:", - "COW": "90009:90009:99999:09990:00900:", - "MUSIC_CROTCHET": "00900:00900:00900:99900:99900:", - "MUSIC_QUAVER": "00900:00990:00909:99900:99900:", - "MUSIC_QUAVERS": "09999:09009:09009:99099:99099:", - "PITCHFORK": "90909:90909:99999:00900:00900:", - "XMAS": "00900:09990:00900:09990:99999:", - "PACMAN": "09999:99090:99900:99990:09999:", - "TARGET": "00900:09990:99099:09990:00900:", - "TSHIRT": "99099:99999:09990:09990:09990:", - "ROLLERSKATE": "00099:00099:99999:99999:09090:", - "DUCK": "09900:99900:09999:09990:00000:", - "HOUSE": "00900:09990:99999:09990:09090:", - "TORTOISE": "00000:09990:99999:09090:00000:", - "BUTTERFLY": "99099:99999:00900:99999:99099:", - "STICKFIGURE": "00900:99999:00900:09090:90009:", - "GHOST": "99999:90909:99999:99999:90909:", - "SWORD": "00900:00900:00900:09990:00900:", - "GIRAFFE": "99000:09000:09000:09990:09090:", - "SKULL": "09990:90909:99999:09990:09990:", - "UMBRELLA": "09990:99999:00900:90900:09900:", - "SNAKE": "99000:99099:09090:09990:00000:", -} - -IMAGE_TUPLE_LOOKUP = { - "ALL_CLOCKS": [ - "CLOCK12", - "CLOCK11", - "CLOCK10", - "CLOCK9", - "CLOCK8", - "CLOCK7", - "CLOCK6", - "CLOCK5", - "CLOCK4", - "CLOCK3", - "CLOCK2", - "CLOCK1", - ], - "ALL_ARROWS": [ - "ARROW_N", - "ARROW_NE", - "ARROW_E", - "ARROW_SE", - "ARROW_S", - "ARROW_SW", - "ARROW_W", - "ARROW_NW", - ], -} - -# 5x5 Alphabet -# Taken from https://raw.githubusercontent.com/micropython/micropython/264d80c84e034541bd6e4b461bfece4443ffd0ac/ports/nrf/boards/microbit/modules/microbitfont.h -ALPHABET = b"\x00\x00\x00\x00\x00\x08\x08\x08\x00\x08\x0a\x4a\x40\x00\x00\x0a\x5f\xea\x5f\xea\x0e\xd9\x2e\xd3\x6e\x19\x32\x44\x89\x33\x0c\x92\x4c\x92\x4d\x08\x08\x00\x00\x00\x04\x88\x08\x08\x04\x08\x04\x84\x84\x88\x00\x0a\x44\x8a\x40\x00\x04\x8e\xc4\x80\x00\x00\x00\x04\x88\x00\x00\x0e\xc0\x00\x00\x00\x00\x08\x00\x01\x22\x44\x88\x10\x0c\x92\x52\x52\x4c\x04\x8c\x84\x84\x8e\x1c\x82\x4c\x90\x1e\x1e\xc2\x44\x92\x4c\x06\xca\x52\x5f\xe2\x1f\xf0\x1e\xc1\x3e\x02\x44\x8e\xd1\x2e\x1f\xe2\x44\x88\x10\x0e\xd1\x2e\xd1\x2e\x0e\xd1\x2e\xc4\x88\x00\x08\x00\x08\x00\x00\x04\x80\x04\x88\x02\x44\x88\x04\x82\x00\x0e\xc0\x0e\xc0\x08\x04\x82\x44\x88\x0e\xd1\x26\xc0\x04\x0e\xd1\x35\xb3\x6c\x0c\x92\x5e\xd2\x52\x1c\x92\x5c\x92\x5c\x0e\xd0\x10\x10\x0e\x1c\x92\x52\x52\x5c\x1e\xd0\x1c\x90\x1e\x1e\xd0\x1c\x90\x10\x0e\xd0\x13\x71\x2e\x12\x52\x5e\xd2\x52\x1c\x88\x08\x08\x1c\x1f\xe2\x42\x52\x4c\x12\x54\x98\x14\x92\x10\x10\x10\x10\x1e\x11\x3b\x75\xb1\x31\x11\x39\x35\xb3\x71\x0c\x92\x52\x52\x4c\x1c\x92\x5c\x90\x10\x0c\x92\x52\x4c\x86\x1c\x92\x5c\x92\x51\x0e\xd0\x0c\x82\x5c\x1f\xe4\x84\x84\x84\x12\x52\x52\x52\x4c\x11\x31\x31\x2a\x44\x11\x31\x35\xbb\x71\x12\x52\x4c\x92\x52\x11\x2a\x44\x84\x84\x1e\xc4\x88\x10\x1e\x0e\xc8\x08\x08\x0e\x10\x08\x04\x82\x41\x0e\xc2\x42\x42\x4e\x04\x8a\x40\x00\x00\x00\x00\x00\x00\x1f\x08\x04\x80\x00\x00\x00\x0e\xd2\x52\x4f\x10\x10\x1c\x92\x5c\x00\x0e\xd0\x10\x0e\x02\x42\x4e\xd2\x4e\x0c\x92\x5c\x90\x0e\x06\xc8\x1c\x88\x08\x0e\xd2\x4e\xc2\x4c\x10\x10\x1c\x92\x52\x08\x00\x08\x08\x08\x02\x40\x02\x42\x4c\x10\x14\x98\x14\x92\x08\x08\x08\x08\x06\x00\x1b\x75\xb1\x31\x00\x1c\x92\x52\x52\x00\x0c\x92\x52\x4c\x00\x1c\x92\x5c\x90\x00\x0e\xd2\x4e\xc2\x00\x0e\xd0\x10\x10\x00\x06\xc8\x04\x98\x08\x08\x0e\xc8\x07\x00\x12\x52\x52\x4f\x00\x11\x31\x2a\x44\x00\x11\x31\x35\xbb\x00\x12\x4c\x8c\x92\x00\x11\x2a\x44\x98\x00\x1e\xc4\x88\x1e\x06\xc4\x8c\x84\x86\x08\x08\x08\x08\x08\x18\x08\x0c\x88\x18\x00\x00\x0c\x83\x60" -# We support ASCII characters between these indexes on the microbit -ASCII_START = 32 -ASCII_END = 126 -SPACE_BETWEEN_LETTERS_WIDTH = 1 -WHITESPACE_WIDTH = 3 - -# numerical LED values -LED_HEIGHT = 5 -LED_WIDTH = 5 -BRIGHTNESS_MIN = 0 -BRIGHTNESS_MAX = 9 - -# sensor max/min values -MAX_TEMPERATURE = 125 -MIN_TEMPERATURE = -55 -MAX_LIGHT_LEVEL = 255 -MIN_LIGHT_LEVEL = 0 -MAX_ACCELERATION = 1023 -MIN_ACCELERATION = -1023 - -GESTURES = set( - [ - "up", - "down", - "left", - "right", - "face up", - "face down", - "freefall", - "3g", - "6g", - "8g", - "shake", - ] -) - -# error messages -BRIGHTNESS_ERR = "brightness out of bounds" -COPY_ERR_MESSAGE = "please call copy function first" -INCORR_IMAGE_SIZE = "image data is incorrect size" -INDEX_ERR = "index out of bounds" -NOT_IMPLEMENTED_ERROR = "This method is not implemented by the simulator" -UNSUPPORTED_ADD_TYPE = "unsupported types for __add__:" -SAME_SIZE_ERR = "images must be the same size" -INVALID_GESTURE_ERR = "invalid gesture" -INVALID_ACCEL_ERR = "invalid acceleration" -INVALID_LIGHT_LEVEL_ERR = "invalid light level" -INVALID_TEMPERATURE_ERR = "invalid temperature" - -TIME_DELAY = 0.03 - -EXPECTED_INPUT_BUTTONS = [ - "button_a", - "button_b", -] - -EXPECTED_INPUT_ACCEL = { - "motion_x": "x", - "motion_y": "y", - "motion_z": "z", -} - -EXPECTED_INPUT_LIGHT = "light" - -EXPECTED_INPUT_TEMP = "temperature" - -EXPECTED_INPUT_GESTURE = "gesture" diff --git a/src/micropython/microbit/__model/display.py b/src/micropython/microbit/__model/display.py deleted file mode 100644 index 523811db0..000000000 --- a/src/micropython/microbit/__model/display.py +++ /dev/null @@ -1,369 +0,0 @@ -import copy -import time -import threading -import common - -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent -from . import constants as CONSTANTS -from .image import Image - - -class Display: - # The implementation based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/display.html. - - def __init__(self): - self.__image = Image() - self.__on = True - self.__light_level = 0 - self.__blank_image = Image() - - self.__current_pid = None - self.__lock = threading.Lock() - - def scroll(self, value, delay=150, wait=True, loop=False, monospace=False): - """ - Scrolls ``value`` horizontally on the display. If ``value`` is an integer or float it is - first converted to a string using ``str()``. The ``delay`` parameter controls how fast - the text is scrolling. - - If ``wait`` is ``True``, this function will block until the animation is - finished, otherwise the animation will happen in the background. - - If ``loop`` is ``True``, the animation will repeat forever. - - If ``monospace`` is ``True``, the characters will all take up 5 pixel-columns - in width, otherwise there will be exactly 1 blank pixel-column between each - character as they scroll. - - Note that the ``wait``, ``loop`` and ``monospace`` arguments must be specified - using their keyword. - """ - if not wait: - thread = threading.Thread( - target=self.scroll, args=(value, delay, True, loop, monospace) - ) - thread.start() - return - - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_SCROLL) - - # Set current_pid to the thread's identifier - self.__lock.acquire() - self.__current_pid = threading.get_ident() - self.__lock.release() - - if isinstance(value, (str, int, float)): - value = str(value) - else: - raise TypeError(f"can't convert {type(value)} object to str implicitly") - - letters = [] - for c in value: - if monospace: - letters.append(Display.__get_image_from_char(c)) - letters.append( - Image(CONSTANTS.SPACE_BETWEEN_LETTERS_WIDTH, CONSTANTS.LED_HEIGHT) - ) - else: - if c == " ": - letters.append( - Image(CONSTANTS.WHITESPACE_WIDTH, CONSTANTS.LED_HEIGHT) - ) - else: - letters.append( - Display.__strip_unlit_columns(Display.__get_image_from_char(c)) - ) - letters.append( - Image( - CONSTANTS.SPACE_BETWEEN_LETTERS_WIDTH, CONSTANTS.LED_HEIGHT, - ) - ) - appended_image = Display.__create_scroll_image(letters) - - while True: - # Show the scrolled image one square at a time. - for x in range(appended_image.width() - CONSTANTS.LED_WIDTH + 1): - self.__lock.acquire() - - # If show or scroll is called again, there will be a different pid and break - if self.__current_pid != threading.get_ident(): - self.__lock.release() - break - - self.__image.blit( - appended_image, x, 0, CONSTANTS.LED_WIDTH, CONSTANTS.LED_HEIGHT - ) - self.__lock.release() - self.__update_client() - - Display.sleep_ms(delay) - - if not loop: - break - - def show(self, value, delay=400, wait=True, loop=False, clear=False): - """ - Display the ``image``. - - If ``value`` is a string, float or integer, display letters/digits in sequence. - Otherwise, if ``value`` is an iterable sequence of images, display these images in sequence. - Each letter, digit or image is shown with ``delay`` milliseconds between them. - - If ``wait`` is ``True``, this function will block until the animation is - finished, otherwise the animation will happen in the background. - - If ``loop`` is ``True``, the animation will repeat forever. - - If ``clear`` is ``True``, the display will be cleared after the iterable has finished. - - Note that the ``wait``, ``loop`` and ``clear`` arguments must be specified - using their keyword. - """ - if not wait: - thread = threading.Thread( - target=self.show, args=(value, delay, True, loop, clear) - ) - thread.start() - return - - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_SHOW) - - # Set current_pid to the thread's identifier - self.__lock.acquire() - self.__current_pid = threading.get_ident() - self.__lock.release() - - images = [] - use_delay = False - if isinstance(value, Image): - images.append(value.crop(0, 0, CONSTANTS.LED_WIDTH, CONSTANTS.LED_HEIGHT)) - elif isinstance(value, (str, int, float)): - chars = list(str(value)) - for c in chars: - images.append(Display.__get_image_from_char(c)) - if len(chars) > 1: - use_delay = True - else: - # Check if iterable - try: - _ = iter(value) - except TypeError as e: - raise e - - for elem in value: - if isinstance(elem, Image): - images.append( - elem.crop(0, 0, CONSTANTS.LED_WIDTH, CONSTANTS.LED_HEIGHT) - ) - elif isinstance(elem, str) and len(elem) == 1: - images.append(Display.__get_image_from_char(elem)) - # If elem is not char or image, break without iterating through rest of list - else: - break - use_delay = True - - while True: - for image in images: - self.__lock.acquire() - - # If show or scroll is called again, there will be a different pid and break - if self.__current_pid != threading.get_ident(): - self.__lock.release() - break - - self.__image = image - self.__lock.release() - self.__update_client() - - if use_delay: - Display.sleep_ms(delay) - - if not loop: - break - if clear: - self.clear() - - def get_pixel(self, x, y): - """ - Return the brightness of the LED at column ``x`` and row ``y`` as an - integer between 0 (off) and 9 (bright). - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_OTHER) - self.__lock.acquire() - pixel = self.__image.get_pixel(x, y) - self.__lock.release() - return pixel - - def set_pixel(self, x, y, value): - """ - Set the brightness of the LED at column ``x`` and row ``y`` to ``value``, - which has to be an integer between 0 and 9. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_OTHER) - self.__lock.acquire() - self.__image.set_pixel(x, y, value) - self.__lock.release() - self.__update_client() - - def clear(self): - """ - Set the brightness of all LEDs to 0 (off). - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_OTHER) - self.__lock.acquire() - self.__image = Image() - self.__lock.release() - self.__update_client() - - def on(self): - """ - Use on() to turn on the display. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_OTHER) - self.__on = True - - def off(self): - """ - Use off() to turn off the display. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_OTHER) - self.__on = False - - def is_on(self): - """ - Returns ``True`` if the display is on, otherwise returns ``False``. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_OTHER) - return self.__on - - def read_light_level(self): - """ - Use the display's LEDs in reverse-bias mode to sense the amount of light - falling on the display. Returns an integer between 0 and 255 representing - the light level, with larger meaning more light. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_LIGHT_LEVEL) - return self.__light_level - - def __set_light_level(self, level): - if level < CONSTANTS.MIN_LIGHT_LEVEL or level > CONSTANTS.MAX_LIGHT_LEVEL: - raise ValueError(CONSTANTS.INVALID_LIGHT_LEVEL_ERR) - else: - self.__light_level = level - - # Helpers - - def __get_array(self): - self.__lock.acquire() - if self.is_on(): - leds = copy.deepcopy(self.__image._Image__LED) - else: - leds = self.__blank_image._Image__LED - self.__lock.release() - return leds - - @staticmethod - def __get_image_from_char(c): - # If c is not between the ASCII alphabet we cover, make it a question mark - if ord(c) < CONSTANTS.ASCII_START or ord(c) > CONSTANTS.ASCII_END: - c = "?" - offset = (ord(c) - CONSTANTS.ASCII_START) * CONSTANTS.LED_WIDTH - representative_bytes = CONSTANTS.ALPHABET[ - offset : offset + CONSTANTS.LED_HEIGHT - ] - return Image(Display.__convert_bytearray_to_image_str(representative_bytes)) - - # Removes columns that are not lit - @staticmethod - def __strip_unlit_columns(image): - min_index = CONSTANTS.LED_WIDTH - 1 - max_index = 0 - for row in image._Image__LED: - for index, bit in enumerate(row): - if bit > 0: - min_index = min(min_index, index) - max_index = max(max_index, index) - return image.crop(min_index, 0, max_index - min_index + 1, CONSTANTS.LED_HEIGHT) - - # This method is different from Image's __bytes_to_array. - # This one requires a conversion from binary of the ALPHABET constant to an image. - @staticmethod - def __convert_bytearray_to_image_str(byte_array): - arr = [] - for b in byte_array: - # Convert byte to binary - b_as_bits = str(bin(b))[2:] - sub_arr = [] - while len(sub_arr) < 5: - # Iterate throught bits - # If there is a 1 at b, then the pixel at column b is lit - for bit in b_as_bits[::-1]: - if len(sub_arr) < 5: - sub_arr.insert(0, int(bit) * CONSTANTS.BRIGHTNESS_MAX) - else: - break - # Add 0s to the front until the list is 5 long - while len(sub_arr) < 5: - sub_arr.insert(0, 0) - arr.append(sub_arr) - image_str = "" - for row in arr: - for elem in row: - image_str += str(elem) - image_str += ":" - return image_str - - @staticmethod - def __insert_blank_column(image): - for row in image._Image__LED: - row.append(0) - - @staticmethod - def __create_scroll_image(images): - blank_5x5_image = Image() - front_of_scroll_image = Image(4, 5) - images.insert(0, front_of_scroll_image) - - scroll_image = Image._Image__append_images(images) - end_of_scroll_image = Image() - # Insert columns of 0s until the ending is a 5x5 blank - end_of_scroll_image.blit( - scroll_image, - scroll_image.width() - CONSTANTS.LED_WIDTH, - 0, - CONSTANTS.LED_WIDTH, - CONSTANTS.LED_HEIGHT, - ) - while not Image._Image__same_image(end_of_scroll_image, blank_5x5_image): - Display.__insert_blank_column(scroll_image) - end_of_scroll_image.blit( - scroll_image, - scroll_image.width() - CONSTANTS.LED_WIDTH, - 0, - CONSTANTS.LED_WIDTH, - CONSTANTS.LED_HEIGHT, - ) - - return scroll_image - - def __update_client(self): - sendable_json = {"leds": self.__get_array()} - - if common.utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - sendable_json, CONSTANTS.MICROBIT - ) - else: - common.utils.send_to_simulator(sendable_json, CONSTANTS.MICROBIT) - - def __update_light_level(self, new_light_level): - if new_light_level is not None: - previous_light_level = self.read_light_level() - if new_light_level != previous_light_level: - self.__set_light_level(new_light_level) - - @staticmethod - def sleep_ms(ms): - time.sleep(ms / 1000) diff --git a/src/micropython/microbit/__model/i2c.py b/src/micropython/microbit/__model/i2c.py deleted file mode 100644 index 2c83868d2..000000000 --- a/src/micropython/microbit/__model/i2c.py +++ /dev/null @@ -1,51 +0,0 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - - -class I2c: - # The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/i2c.html. - def init(self, freq=100000, sda="pin20", scl="pin19"): - """ - This function is not implemented in the simulator. - - Re-initialize peripheral with the specified clock frequency ``freq`` on the - specified ``sda`` and ``scl`` pins. - - Warning: - - Changing the I²C pins from defaults will make the accelerometer and - compass stop working, as they are connected internally to those pins. - """ - utils.print_for_unimplemented_functions(I2c.init.__qualname__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_I2C) - - def scan(self): - """ - This function is not implemented in the simulator. - - Scan the bus for devices. Returns a list of 7-bit addresses corresponding - to those devices that responded to the scan. - """ - utils.print_for_unimplemented_functions(I2c.scan.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_I2C) - - def read(self, addr, n, repeat=False): - """ - This function is not implemented in the simulator. - - Read ``n`` bytes from the device with 7-bit address ``addr``. If ``repeat`` - is ``True``, no stop bit will be sent. - """ - utils.print_for_unimplemented_functions(I2c.read.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_I2C) - - def write(self, addr, buf, repeat=False): - """ - This function is not implemented in the simulator. - - Write bytes from ``buf`` to the device with 7-bit address ``addr``. If - ``repeat`` is ``True``, no stop bit will be sent. - """ - utils.print_for_unimplemented_functions(I2c.write.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_I2C) diff --git a/src/micropython/microbit/__model/image.py b/src/micropython/microbit/__model/image.py deleted file mode 100644 index a525ea6e1..000000000 --- a/src/micropython/microbit/__model/image.py +++ /dev/null @@ -1,539 +0,0 @@ -from . import constants as CONSTANTS -from .producer_property import ProducerProperty -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - - -class Image: - """ - If ``string`` is used, it has to consist of digits 0-9 arranged into - lines, describing the image, for example:: - - image = Image("90009:" - "09090:" - "00900:" - "09090:" - "90009") - - will create a 5×5 image of an X. The end of a line is indicated by a colon. - It's also possible to use a newline (\\n) to indicate the end of a line - like this:: - - image = Image("90009\\n" - "09090\\n" - "00900\\n" - "09090\\n" - "90009") - - The other form creates an empty image with ``width`` columns and - ``height`` rows. Optionally ``buffer`` can be an array of - ``width``×``height`` integers in range 0-9 to initialize the image:: - - Image(2, 2, b'\x08\x08\x08\x08') - - or:: - - Image(2, 2, bytearray([9,9,9,9])) - - Will create a 2 x 2 pixel image at full brightness. - - .. note:: - - Keyword arguments cannot be passed to ``buffer``. - """ - - # Attributes assigned (to functions) later; - # having this here helps the pylint. - HEART = None - HEART_SMALL = None - HAPPY = None - SMILE = None - SAD = None - CONFUSED = None - ANGRY = None - ASLEEP = None - SURPRISED = None - SILLY = None - FABULOUS = None - MEH = None - YES = None - NO = None - CLOCK12 = None - CLOCK11 = None - CLOCK10 = None - CLOCK9 = None - CLOCK8 = None - CLOCK7 = None - CLOCK6 = None - CLOCK5 = None - CLOCK4 = None - CLOCK3 = None - CLOCK2 = None - CLOCK1 = None - ARROW_N = None - ARROW_NE = None - ARROW_E = None - ARROW_SE = None - ARROW_S = None - ARROW_SW = None - ARROW_W = None - ARROW_NW = None - TRIANGLE = None - TRIANGLE_LEFT = None - CHESSBOARD = None - DIAMOND = None - DIAMOND_SMALL = None - SQUARE = None - SQUARE_SMALL = None - RABBIT = None - COW = None - MUSIC_CROTCHET = None - MUSIC_QUAVER = None - MUSIC_QUAVERS = None - PITCHFORK = None - XMAS = None - PACMAN = None - TARGET = None - TSHIRT = None - ROLLERSKATE = None - DUCK = None - HOUSE = None - TORTOISE = None - BUTTERFLY = None - STICKFIGURE = None - GHOST = None - SWORD = None - GIRAFFE = None - SKULL = None - UMBRELLA = None - SNAKE = None - ALL_CLOCKS = None - ALL_ARROWS = None - - # implementing image model as described here: - # https://microbit-micropython.readthedocs.io/en/v1.0.1/image.html - - def __init__(self, *args, **kwargs): - # Depending on the number of arguments - # in constructor, it treat args differently. - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_CREATION) - if len(args) == 0: - # default constructor - self.__LED = self.__string_to_square_array(CONSTANTS.BLANK_5X5) - elif len(args) == 1: - pattern = args[0] - if isinstance(pattern, str): - self.__LED = self.__string_to_square_array(pattern) - else: - raise TypeError("Image(s) takes a string") - else: - - width = args[0] - height = args[1] - - if width < 0 or height < 0: - # This is not in original, but ideally, - # image should fail non-silently - raise ValueError(CONSTANTS.INDEX_ERR) - - if len(args) == 3: - # This option is for potential third bytearray arguments - byte_arr = args[2] - self.__LED = self.__bytes_to_array(width, height, byte_arr) - else: - self.__LED = self.__create_leds(width, height) - self.read_only = False - - def width(self): - """ - Return the number of columns in the image. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - if len(self.__LED) > 0: - return len(self.__LED[0]) - else: - return 0 - - def height(self): - """ - Return the numbers of rows in the image. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - return len(self.__LED) - - def set_pixel(self, x, y, value): - """ - Set the brightness of the pixel at column ``x`` and row ``y`` to the - ``value``, which has to be between 0 (dark) and 9 (bright). - - This method will raise an exception when called on any of the built-in - read-only images, like ``Image.HEART``. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - if self.read_only: - raise TypeError(CONSTANTS.COPY_ERR_MESSAGE) - elif not self.__valid_pos(x, y): - raise ValueError(CONSTANTS.INDEX_ERR) - elif not self.__valid_brightness(value): - raise ValueError(CONSTANTS.BRIGHTNESS_ERR) - else: - self.__LED[y][x] = value - - def get_pixel(self, x, y): - """ - Return the brightness of pixel at column ``x`` and row ``y`` as an - integer between 0 and 9. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - if self.__valid_pos(x, y): - return self.__LED[y][x] - else: - raise ValueError(CONSTANTS.INDEX_ERR) - - def shift_up(self, n): - """ - Return a new image created by shifting the picture up by ``n`` rows. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - return self.__shift_vertical(-n) - - def shift_down(self, n): - """ - Return a new image created by shifting the picture down by ``n`` rows. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - return self.__shift_vertical(n) - - def shift_right(self, n): - """ - Return a new image created by shifting the picture right by ``n`` - columns. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - return self.__shift_horizontal(n) - - def shift_left(self, n): - """ - Return a new image created by shifting the picture left by ``n`` - columns. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - return self.__shift_horizontal(-n) - - def crop(self, x, y, w, h): - """ - Return a new image by cropping the picture to a width of ``w`` and a - height of ``h``, starting with the pixel at column ``x`` and row ``y``. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - res = Image(w, h) - res.blit(self, x, y, w, h) - return res - - def copy(self): - """ - Return an exact copy of the image. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - return Image(self.__create_string()) - - # This inverts the brightness of each LED. - # ie: Pixel that is at brightness 4 would become brightness 5 - # and pixel that is at brightness 9 would become brightness 0. - def invert(self): - """ - Return a new image by inverting the brightness of the pixels in the - source image. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - for y in range(self.height()): - for x in range(self.width()): - self.set_pixel(x, y, CONSTANTS.BRIGHTNESS_MAX - self.get_pixel(x, y)) - - # This fills all LEDs with same brightness. - def fill(self, value): - """ - Set the brightness of all the pixels in the image to the - ``value``, which has to be between 0 (dark) and 9 (bright). - - This method will raise an exception when called on any of the built-in - read-only images, like ``Image.HEART``. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - for y in range(self.height()): - for x in range(self.width()): - self.set_pixel(x, y, value) - - # This transposes a certain area (w x h) on src onto the current image. - def blit(self, src, x, y, w, h, xdest=0, ydest=0): - """ - Copy the rectangle defined by ``x``, ``y``, ``w``, ``h`` from the image ``src`` into - this image at ``xdest``, ``ydest``. - Areas in the source rectangle, but outside the source image are treated as having a value of 0. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - if not src.__valid_pos(x, y): - raise ValueError(CONSTANTS.INDEX_ERR) - - for count_y in range(h): - for count_x in range(w): - if self.__valid_pos(xdest + count_x, ydest + count_y): - if src.__valid_pos(x + count_x, y + count_y): - transfer_pixel = src.get_pixel(x + count_x, y + count_y) - else: - transfer_pixel = 0 - self.set_pixel(xdest + count_x, ydest + count_y, transfer_pixel) - - # This adds two images (if other object is not an image, throws error). - # The images must be the same size. - def __add__(self, other): - """ - Create a new image by adding the brightness values from the two images for each pixel. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - if not isinstance(other, Image): - raise TypeError( - CONSTANTS.UNSUPPORTED_ADD_TYPE + f"'{type(self)}', '{type(other)}'" - ) - elif not (other.height() == self.height() and other.width() == self.width()): - raise ValueError(CONSTANTS.SAME_SIZE_ERR) - else: - res = Image(self.width(), self.height()) - - for y in range(self.height()): - for x in range(self.width()): - sum_value = other.get_pixel(x, y) + self.get_pixel(x, y) - display_result = min(CONSTANTS.BRIGHTNESS_MAX, sum_value) - res.set_pixel(x, y, display_result) - - return res - - # This multiplies image by number (if other factor is not a number, it throws an error). - def __mul__(self, other): - """ - Create a new image by multiplying the brightness of each pixel by n. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - try: - float_val = float(other) - except TypeError: - raise TypeError(f"can't convert {type(other)} to float") - - res = Image(self.width(), self.height()) - - for y in range(self.height()): - for x in range(self.width()): - product = self.get_pixel(x, y) * float_val - res.set_pixel(x, y, min(CONSTANTS.BRIGHTNESS_MAX, product)) - - return res - - def __repr__(self): - """ - Get a compact string representation of the image. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - ret_str = "Image('" - for index_y in range(self.height()): - ret_str += self.__row_to_str(index_y) - - ret_str += "')" - - return ret_str - - def __str__(self): - """ - Get a readable string representation of the image. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - ret_str = "Image('\n" - for index_y in range(self.height()): - ret_str += "\t" + self.__row_to_str(index_y) + "\n" - - ret_str += "')" - - return ret_str - - # HELPER FUNCTIONS - - # This create 2D array of off LEDs with - # width w and height h - def __create_leds(self, w, h): - arr = [] - for _ in range(h): - sub_arr = [] - for _ in range(w): - sub_arr.append(0) - arr.append(sub_arr) - - return arr - - # This turns byte array to 2D array for LED field. - def __bytes_to_array(self, width, height, byte_arr): - bytes_translated = bytes(byte_arr) - - if not len(bytes_translated) == height * width: - raise ValueError(CONSTANTS.INCORR_IMAGE_SIZE) - - arr = [] - sub_arr = [] - - for index, elem in enumerate(bytes_translated): - if index % width == 0 and index != 0: - arr.append(sub_arr) - sub_arr = [] - - sub_arr.append(elem) - - arr.append(sub_arr) - return arr - - # This converts string (with different rows separated by ":") - # to 2d array arrangement. - def __string_to_square_array(self, pattern): - initial_array, max_subarray_len = self.__string_directly_to_array(pattern) - - # Fill in empty spaces in w x h matrix. - for arr_y in initial_array: - num_extra_spaces = max_subarray_len - len(arr_y) - for _ in range(num_extra_spaces): - arr_y.append(0) - - return initial_array - - def __string_directly_to_array(self, pattern): - # The result may have spaces in the 2D array - # and may uneven sub-array lengths - arr = [] - sub_arr = [] - - max_subarray_len = 0 - - for elem in pattern: - if elem == ":" or elem == "\n": - if len(sub_arr) > max_subarray_len: - max_subarray_len = len(sub_arr) - arr.append(sub_arr) - sub_arr = [] - else: - sub_arr.append(int(elem)) - - if ( - len(pattern) > 0 - and not str(pattern)[-1] == ":" - and not str(pattern)[-1] == "\n" - and len(sub_arr) != 0 - ): - if len(sub_arr) > max_subarray_len: - max_subarray_len = len(sub_arr) - arr.append(sub_arr) - - return arr, max_subarray_len - - def __valid_brightness(self, value): - return value >= CONSTANTS.BRIGHTNESS_MIN and value <= CONSTANTS.BRIGHTNESS_MAX - - def __valid_pos(self, x, y): - return x >= 0 and x < self.width() and y >= 0 and y < self.height() - - def __shift_vertical(self, n): - res = Image(self.width(), self.height()) - - if n > 0: - # down - res.blit(self, 0, 0, self.width(), self.height() - n, 0, n) - else: - # up - if self.__valid_pos(0, abs(n)): - res.blit(self, 0, abs(n), self.width(), self.height() - abs(n), 0, 0) - - return res - - def __shift_horizontal(self, n): - res = Image(self.width(), self.height()) - if n > 0: - # right - res.blit(self, 0, 0, self.width() - n, self.height(), n, 0) - else: - # left - if self.__valid_pos(abs(n), 0): - res.blit(self, abs(n), 0, self.width() - abs(n), self.height(), 0, 0) - - return res - - def __create_string(self): - ret_str = "" - for index_y in range(self.height()): - ret_str += self.__row_to_str(index_y) - return ret_str - - def __row_to_str(self, y): - new_str = "" - for x in range(self.width()): - new_str += str(self.get_pixel(x, y)) - - new_str += ":" - - return new_str - - @staticmethod - def __append_images(images): - width = 0 - height = 0 - for image in images: - width += image.width() - height = max(height, image.height()) - res = Image(width, height) - x_ind = 0 - for image in images: - res.blit(image, 0, 0, image.width(), image.height(), xdest=x_ind) - x_ind += image.width() - return res - - @staticmethod - def __same_image(i1, i2): - if i1.width() != i2.width() or i1.height() != i2.height(): - return False - for y in range(i1.height()): - for x in range(i1.width()): - if i1.get_pixel(x, y) != i2.get_pixel(x, y): - return False - return True - - -# This is for generating functions like Image.HEART -# that return a new read-only Image -def create_const_func(func_name): - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_STATIC) - - def func(*args): - const_instance = Image(CONSTANTS.IMAGE_PATTERNS[func_name]) - const_instance.read_only = True - return const_instance - - func.__name__ = func_name - return ProducerProperty(func) - - -# for attributes like Image.ALL_CLOCKS -# that return tuples -def create_const_list_func(func_name): - def func(*args): - collection_names = CONSTANTS.IMAGE_TUPLE_LOOKUP[func_name] - ret_list = [] - for image_name in collection_names: - const_instance = Image(CONSTANTS.IMAGE_PATTERNS[image_name]) - const_instance.read_only = True - ret_list.append(const_instance) - - return tuple(ret_list) - - func.__name__ = func_name - return ProducerProperty(func) - - -for name in CONSTANTS.IMAGE_PATTERNS.keys(): - setattr(Image, name, create_const_func(name)) - -for name in CONSTANTS.IMAGE_TUPLE_LOOKUP.keys(): - setattr(Image, name, create_const_list_func(name)) diff --git a/src/micropython/microbit/__model/microbit_model.py b/src/micropython/microbit/__model/microbit_model.py deleted file mode 100644 index 1f78e35ae..000000000 --- a/src/micropython/microbit/__model/microbit_model.py +++ /dev/null @@ -1,98 +0,0 @@ -import time - -from common import utils -from .accelerometer import Accelerometer -from .button import Button -from .compass import Compass -from .display import Display -from .i2c import I2c -from .spi import SPI -from . import constants as CONSTANTS - - -class MicrobitModel: - def __init__(self): - # State in the Python process - self.accelerometer = Accelerometer() - self.button_a = Button() - self.button_b = Button() - self.compass = Compass() - self.display = Display() - self.i2c = I2c() - self.spi = SPI() - - self.__start_time = time.time() - self.__temperature = 0 - self.__microbit_button_dict = { - "button_a": self.button_a, - "button_b": self.button_b, - } - - def panic(self, n): - # Due to the shim, there is another call frame. - utils.print_for_unimplemented_functions(MicrobitModel.panic.__name__) - - def reset(self): - # Due to the shim, there is another call frame. - utils.print_for_unimplemented_functions(MicrobitModel.reset.__name__) - - def sleep(self, n): - time.sleep(n / 1000) - - def running_time(self): - print(f"time. time: {time.time()}") - return time.time() - self.__start_time - - def temperature(self): - return self.__temperature - - def __set_temperature(self, temperature): - if ( - temperature < CONSTANTS.MIN_TEMPERATURE - or temperature > CONSTANTS.MAX_TEMPERATURE - ): - raise ValueError(CONSTANTS.INVALID_TEMPERATURE_ERR) - else: - self.__temperature = temperature - - def update_state(self, new_state): - self.__update_buttons(new_state) - self.__update_motion(new_state) - self.__update_light(new_state) - self.__update_temp(new_state) - self.__update_gesture(new_state) - - # helpers - def __update_buttons(self, new_state): - # get button pushes - for button_name in CONSTANTS.EXPECTED_INPUT_BUTTONS: - button = self.__microbit_button_dict[button_name] - button._Button__update(new_state.get(button_name)) - - def __update_motion(self, new_state): - # set motion_x, motion_y, motion_z - for name, direction in CONSTANTS.EXPECTED_INPUT_ACCEL.items(): - self.accelerometer._Accelerometer__update_motion( - direction, new_state.get(name) - ) - - def __update_light(self, new_state): - # set light level - new_light_level = new_state.get(CONSTANTS.EXPECTED_INPUT_LIGHT) - self.display._Display__update_light_level(new_light_level) - - def __update_temp(self, new_state): - # set temperature - new_temp = new_state.get(CONSTANTS.EXPECTED_INPUT_TEMP) - if new_temp is not None: - previous_temp = self.temperature() - if new_temp != previous_temp: - self._MicrobitModel__set_temperature(new_temp) - - def __update_gesture(self, new_state): - # set gesture - new_gesture = new_state.get(CONSTANTS.EXPECTED_INPUT_GESTURE) - self.accelerometer._Accelerometer__update_gesture(new_gesture) - - -__mb = MicrobitModel() diff --git a/src/micropython/microbit/__model/producer_property.py b/src/micropython/microbit/__model/producer_property.py deleted file mode 100644 index f67f23261..000000000 --- a/src/micropython/microbit/__model/producer_property.py +++ /dev/null @@ -1,3 +0,0 @@ -class ProducerProperty(property): - def __get__(self, cls, owner): - return classmethod(self.fget).__get__(cls, owner)() diff --git a/src/micropython/microbit/__model/spi.py b/src/micropython/microbit/__model/spi.py deleted file mode 100644 index d455e30b0..000000000 --- a/src/micropython/microbit/__model/spi.py +++ /dev/null @@ -1,66 +0,0 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - - -class SPI: - # The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/spi.html. - def init( - baudrate=1000000, bits=8, mode=0, sclk="pin13", mosi="pin15", miso="pin14" - ): - """ - This function is not implemented in the simulator. - - Initialize SPI communication with the specified parameters on the - specified ``pins``. Note that for correct communication, the parameters - have to be the same on both communicating devices. - - The ``baudrate`` defines the speed of communication. - - The ``bits`` defines the size of bytes being transmitted. Currently only - ``bits=8`` is supported. However, this may change in the future. - - The ``mode`` determines the combination of clock polarity and phase - according to the following convention, with polarity as the high order bit - and phase as the low order bit: - - Polarity (aka CPOL) 0 means that the clock is at logic value 0 when idle - and goes high (logic value 1) when active; polarity 1 means the clock is - at logic value 1 when idle and goes low (logic value 0) when active. Phase - (aka CPHA) 0 means that data is sampled on the leading edge of the clock, - and 1 means on the trailing edge. - - The ``sclk``, ``mosi`` and ``miso`` arguments specify the pins to use for - each type of signal. - """ - utils.print_for_unimplemented_functions(SPI.init.__qualname__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPI) - - def read(self, nbytes): - """ - This function is not implemented in the simulator. - - Read at most ``nbytes``. Returns what was read. - """ - utils.print_for_unimplemented_functions(SPI.read.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPI) - - def write(self, buffer): - """ - This function is not implemented in the simulator. - - Write the ``buffer`` of bytes to the bus. - """ - utils.print_for_unimplemented_functions(SPI.write.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPI) - - def write_readinto(self, out, in_): - """ - This function is not implemented in the simulator. - - Write the ``out`` buffer to the bus and read any response into the ``in_`` - buffer. The length of the buffers should be the same. The buffers can be - the same object. - """ - utils.print_for_unimplemented_functions(SPI.write_readinto.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPI) diff --git a/src/micropython/microbit/test/__init__.py b/src/micropython/microbit/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/micropython/microbit/test/test_accelerometer.py b/src/micropython/microbit/test/test_accelerometer.py deleted file mode 100644 index 241f63df1..000000000 --- a/src/micropython/microbit/test/test_accelerometer.py +++ /dev/null @@ -1,104 +0,0 @@ -import pytest -from unittest import mock - -from ..__model.accelerometer import Accelerometer -from ..__model import constants as CONSTANTS - - -class TestAccelerometer(object): - def setup_method(self): - self.accelerometer = Accelerometer() - - @pytest.mark.parametrize( - "accel", - [ - CONSTANTS.MIN_ACCELERATION, - CONSTANTS.MIN_ACCELERATION + 1, - 100, - CONSTANTS.MAX_ACCELERATION - 1, - CONSTANTS.MAX_ACCELERATION, - ], - ) - def test_x_y_z(self, accel): - self.accelerometer._Accelerometer__set_accel("x", accel) - assert accel == self.accelerometer.get_x() - self.accelerometer._Accelerometer__set_accel("y", accel) - assert accel == self.accelerometer.get_y() - self.accelerometer._Accelerometer__set_accel("z", accel) - assert accel == self.accelerometer.get_z() - - @pytest.mark.parametrize("axis", ["x", "y", "z"]) - def test_x_y_z_invalid_accel(self, axis): - with pytest.raises(ValueError): - self.accelerometer._Accelerometer__set_accel( - axis, CONSTANTS.MAX_ACCELERATION + 1 - ) - with pytest.raises(ValueError): - self.accelerometer._Accelerometer__set_accel( - axis, CONSTANTS.MIN_ACCELERATION - 1 - ) - - @pytest.mark.parametrize( - "accels", - [ - (23, 25, 26), - (204, 234, -534), - (CONSTANTS.MIN_ACCELERATION + 10, 234, CONSTANTS.MAX_ACCELERATION), - ], - ) - def test_get_values(self, accels): - self.accelerometer._Accelerometer__set_accel("x", accels[0]) - self.accelerometer._Accelerometer__set_accel("y", accels[1]) - self.accelerometer._Accelerometer__set_accel("z", accels[2]) - assert accels == self.accelerometer.get_values() - - @pytest.mark.parametrize("gesture", ["up", "face down", "freefall", "8g"]) - def test_current_gesture(self, gesture): - self.accelerometer._Accelerometer__set_gesture(gesture) - assert gesture == self.accelerometer.current_gesture() - - @pytest.mark.parametrize("gesture", ["up", "face down", "freefall", "8g"]) - def test_is_gesture(self, gesture): - self.accelerometer._Accelerometer__set_gesture(gesture) - assert self.accelerometer.is_gesture(gesture) - for g in CONSTANTS.GESTURES: - if g != gesture: - assert not self.accelerometer.is_gesture(g) - - def test_is_gesture_error(self): - with pytest.raises(ValueError): - self.accelerometer.is_gesture("sideways") - - def test_was_gesture(self): - mock_gesture_up = "up" - mock_gesture_down = "down" - - assert not self.accelerometer.was_gesture(mock_gesture_up) - self.accelerometer._Accelerometer__set_gesture(mock_gesture_up) - self.accelerometer.current_gesture() # Call is needed for gesture detection so it can be added to the lists. - self.accelerometer._Accelerometer__set_gesture("") - assert self.accelerometer.was_gesture(mock_gesture_up) - assert not self.accelerometer.was_gesture(mock_gesture_up) - - def test_was_gesture_error(self): - with pytest.raises(ValueError): - self.accelerometer.was_gesture("sideways") - - def test_get_gestures(self): - mock_gesture_up = "up" - mock_gesture_down = "down" - mock_gesture_freefall = "freefall" - - self.accelerometer._Accelerometer__set_gesture(mock_gesture_up) - self.accelerometer.current_gesture() # Call is needed for gesture detection so it can be added to the lists. - self.accelerometer._Accelerometer__set_gesture(mock_gesture_down) - self.accelerometer.current_gesture() - self.accelerometer._Accelerometer__set_gesture(mock_gesture_freefall) - self.accelerometer.current_gesture() - self.accelerometer._Accelerometer__set_gesture("") - assert ( - mock_gesture_up, - mock_gesture_down, - mock_gesture_freefall, - ) == self.accelerometer.get_gestures() - assert () == self.accelerometer.get_gestures() diff --git a/src/micropython/microbit/test/test_button.py b/src/micropython/microbit/test/test_button.py deleted file mode 100644 index 31e9d6720..000000000 --- a/src/micropython/microbit/test/test_button.py +++ /dev/null @@ -1,46 +0,0 @@ -import pytest -from ..__model.button import Button - - -class TestButton(object): - def setup_method(self): - self.button = Button() - - def test_press_down(self): - self.button._Button__press_down() - assert self.button._Button__presses == 1 - assert self.button._Button__pressed - assert self.button._Button__prev_pressed - self.button._Button__press_down() - assert self.button._Button__presses == 2 - assert self.button._Button__pressed - assert self.button._Button__prev_pressed - - def test_release(self): - self.button._Button__pressed = True - self.button._Button__prev_pressed = False - self.button._Button__release() - assert not self.button._Button__pressed - - def test_is_pressed(self): - assert not self.button.is_pressed() - self.button._Button__press_down() - assert self.button.is_pressed() - - def test_was_pressed(self): - assert not self.button.was_pressed() - self.button._Button__press_down() - self.button._Button__release() - assert self.button.was_pressed() - # Button resets __prev_pressed after was_pressed() is called. - assert not self.button.was_pressed() - - @pytest.mark.parametrize("presses", [1, 2, 4]) - def test_get_presses(self, presses): - assert 0 == self.button.get_presses() - for i in range(presses): - self.button._Button__press_down() - self.button._Button__release() - assert presses == self.button.get_presses() - # Presses is reset to 0 after get_presses() is called. - assert 0 == self.button.get_presses() diff --git a/src/micropython/microbit/test/test_display.py b/src/micropython/microbit/test/test_display.py deleted file mode 100644 index 1055c8870..000000000 --- a/src/micropython/microbit/test/test_display.py +++ /dev/null @@ -1,185 +0,0 @@ -import pytest -import threading -from unittest import mock -from common import utils - -from ..__model import constants as CONSTANTS -from ..__model.display import Display -from ..__model.image import Image - - -STR_A = "09900:90090:99990:90090:90090" -STR_QUESTION_MARK = "09990:90009:00990:00000:00900" -STR_EXCLAMATION_MARK = "09000:09000:09000:00000:09000:" -STR_SIX = "00090:00900:09990:90009:09990" - - -class TestDisplay(object): - def setup_method(self): - self.display = Display() - utils.send_to_simulator = mock.Mock() - - @pytest.mark.parametrize("x, y, brightness", [(1, 1, 4), (2, 3, 6), (4, 4, 9)]) - def test_set_and_get_pixel(self, x, y, brightness): - self.display.set_pixel(x, y, brightness) - assert brightness == self.display.get_pixel(x, y) - - @pytest.mark.parametrize("x, y", [(5, 0), (0, -1), (0, 5)]) - def test_get_pixel_error(self, x, y): - with pytest.raises(ValueError, match=CONSTANTS.INDEX_ERR): - self.display.get_pixel(x, y) - - @pytest.mark.parametrize( - "x, y, brightness, err_msg", - [ - (5, 0, 0, CONSTANTS.INDEX_ERR), - (0, -1, 0, CONSTANTS.INDEX_ERR), - (0, 0, -1, CONSTANTS.BRIGHTNESS_ERR), - ], - ) - def test_set_pixel_error(self, x, y, brightness, err_msg): - with pytest.raises(ValueError, match=err_msg): - self.display.set_pixel(x, y, brightness) - - def test_clear(self): - self.display.set_pixel(2, 3, 7) - self.display.set_pixel(3, 4, 6) - self.display.set_pixel(4, 4, 9) - assert not self.__is_clear() - self.display.clear() - assert self.__is_clear() - - def test_on_off(self): - self.display.on() - assert self.display.is_on() - self.display.off() - assert not self.display.is_on() - - def test_show_one_image(self): - img = Image() - img.set_pixel(0, 0, 8) - img.set_pixel(0, 1, 9) - img.set_pixel(0, 2, 7) - img.set_pixel(2, 2, 6) - self.display.show(img, delay=0) - assert Image._Image__same_image(img, self.display._Display__image) - - def test_show_different_size_image(self): - img = Image(3, 7) - img.set_pixel(1, 1, 9) - img.set_pixel(2, 6, 9) # Will not be on display - expected = Image(5, 5) - expected.set_pixel(1, 1, 9) - self.display.show(img, delay=0) - assert Image._Image__same_image(expected, self.display._Display__image) - - def test_show_smaller_image(self): - img = Image(2, 2) - img.set_pixel(1, 1, 9) - expected = Image(5, 5) - expected.set_pixel(1, 1, 9) - self.display.show(img, delay=0) - assert Image._Image__same_image(expected, self.display._Display__image) - - @pytest.mark.parametrize( - "value, expected_str", - [ - ("!", STR_EXCLAMATION_MARK), - ("A", STR_A), - (" ", CONSTANTS.BLANK_5X5), - (6, STR_SIX), - ("\x7F", STR_QUESTION_MARK), # Character is out of our ASCII range - ], - ) - def test_show_char(self, value, expected_str): - expected = Image(expected_str) - self.display.show(value, delay=0) - assert Image._Image__same_image(expected, self.display._Display__image) - - def test_show_char_with_clear(self): - image = Image(STR_EXCLAMATION_MARK) - self.display.show(image, delay=0, clear=True) - assert self.__is_clear() - - def test_show_iterable(self): - expected = Image(STR_A) - value = [Image(STR_EXCLAMATION_MARK), "A", "ab"] - self.display.show(value, delay=0) - assert Image._Image__same_image(expected, self.display._Display__image) - - def test_show_non_iterable(self): - with pytest.raises(TypeError): - self.display.show(TestDisplay()) - - def test_scroll(self): - self.display.scroll("a b") - self.__is_clear() - - def test_scroll_type_error(self): - with pytest.raises(TypeError): - self.display.scroll(["a", 1]) - - # Should change these threaded tests to test behaviour in the future - def test_show_threaded(self): - threading.Thread = mock.Mock() - self.display.show("a", delay=0, wait=False) - threading.Thread.assert_called_once() - - def test_scroll_threaded(self): - threading.Thread = mock.Mock() - self.display.scroll("test", delay=0, wait=False) - threading.Thread.assert_called_once() - - def test_get_array(self): - self.display.set_pixel(3, 3, 3) - self.display.off() - assert self.display._Display__get_array() == [ - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - ] - - self.display.on() - assert self.display._Display__get_array() == [ - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 3, 0], - [0, 0, 0, 0, 0], - ] - - # The second show call should immedaitely stop the first show call. - # Therefore the final result of display should be 6. - def test_async_tests(self): - self.display.show("MMMMMMMMMMMMMM", delay=100, wait=False) - self.display.show("6", delay=0) - assert Image._Image__same_image(Image(STR_SIX), self.display._Display__image) - - @pytest.mark.parametrize( - "light_level", - [ - CONSTANTS.MIN_LIGHT_LEVEL, - CONSTANTS.MIN_LIGHT_LEVEL + 1, - 100, - CONSTANTS.MAX_LIGHT_LEVEL - 1, - CONSTANTS.MAX_LIGHT_LEVEL, - ], - ) - def test_light_level(self, light_level): - self.display._Display__set_light_level(light_level) - assert light_level == self.display.read_light_level() - - @pytest.mark.parametrize( - "invalid_light_level", - [CONSTANTS.MIN_LIGHT_LEVEL - 1, CONSTANTS.MAX_LIGHT_LEVEL + 1], - ) - def test_invalid_light_level(self, invalid_light_level): - with pytest.raises(ValueError): - self.display._Display__set_light_level(invalid_light_level) - - # Helpers - def __is_clear(self): - i = Image(CONSTANTS.BLANK_5X5) - return Image._Image__same_image(i, self.display._Display__image) diff --git a/src/micropython/microbit/test/test_image.py b/src/micropython/microbit/test/test_image.py deleted file mode 100644 index 5ea150230..000000000 --- a/src/micropython/microbit/test/test_image.py +++ /dev/null @@ -1,283 +0,0 @@ -import pytest -from ..__model.image import Image - -from ..__model import constants as CONSTANTS - - -class TestImage(object): - def setup_method(self): - self.image = Image() - self.image_heart = Image(CONSTANTS.IMAGE_PATTERNS["HEART"]) - - @pytest.mark.parametrize("x, y, brightness", [(1, 1, 4), (2, 3, 6), (4, 4, 9)]) - def test_get_set_pixel(self, x, y, brightness): - self.image.set_pixel(x, y, brightness) - assert brightness == self.image.get_pixel(x, y) - - @pytest.mark.parametrize("x, y", [(5, 0), (0, -1), (0, 5)]) - def test_get_pixel_error(self, x, y): - with pytest.raises(ValueError, match=CONSTANTS.INDEX_ERR): - self.image.get_pixel(x, y) - - @pytest.mark.parametrize( - "x, y, brightness, err_msg", - [ - (5, 0, 0, CONSTANTS.INDEX_ERR), - (0, -1, 0, CONSTANTS.INDEX_ERR), - (0, 0, -1, CONSTANTS.BRIGHTNESS_ERR), - ], - ) - def test_set_pixel_error(self, x, y, brightness, err_msg): - with pytest.raises(ValueError, match=err_msg): - self.image.set_pixel(x, y, brightness) - - @pytest.mark.parametrize( - "image, height, width", - [ - (Image(), 5, 5), - (Image(3, 3), 3, 3), - (Image(""), 0, 0), - (Image("00:00000"), 2, 5), - (Image("0000:0000"), 2, 4), - ], - ) - def test_width_and_height(self, image, height, width): - print(str(image)) - assert image.height() == height - assert image.width() == width - - @pytest.mark.parametrize( - "x, y, w, h, x_dest, y_dest, actual", - [ - (0, 0, 3, 2, 2, 1, Image("00000:00090:00999:00000:00000:")), - (0, 0, 3, 3, 8, 8, Image("00000:00000:00000:00000:00000:")), - (3, 0, 3, 3, 0, 0, Image("90000:99000:99000:00000:00000:")), - (3, 0, 7, 7, 0, 0, Image("90000:99000:99000:90000:00000:")), - ], - ) - def test_blit_heart(self, x, y, w, h, x_dest, y_dest, actual): - result = Image() - result.blit(self.image_heart, x, y, w, h, x_dest, y_dest) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "x, y, w, h, x_dest, y_dest, actual", - [ - (1, 1, 2, 4, 3, 3, Image("09090:99999:99999:09999:00999:")), - (0, 0, 3, 3, 8, 8, Image(CONSTANTS.IMAGE_PATTERNS["HEART"])), - (0, 0, 7, 7, 0, 0, Image(CONSTANTS.IMAGE_PATTERNS["HEART"])), - (3, 0, 7, 7, 0, 0, Image("90000:99000:99000:90000:00000:")), - ], - ) - def test_blit_heart_nonblank(self, x, y, w, h, x_dest, y_dest, actual): - result = Image(CONSTANTS.IMAGE_PATTERNS["HEART"]) - src = Image(CONSTANTS.IMAGE_PATTERNS["HEART"]) - result.blit(src, x, y, w, h, x_dest, y_dest) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "x, y, w, h, x_dest, y_dest", [(5, 6, 2, 4, 3, 3), (5, 0, 3, 3, 8, 8)] - ) - def test_blit_heart_valueerror(self, x, y, w, h, x_dest, y_dest): - result = Image(CONSTANTS.IMAGE_PATTERNS["HEART"]) - with pytest.raises(ValueError, match=CONSTANTS.INDEX_ERR): - result.blit(self.image_heart, x, y, w, h, x_dest, y_dest) - - @pytest.mark.parametrize( - "image1, image2", [(Image(2, 2, bytearray([4, 4, 4, 4])), Image("44:44"))] - ) - def test_constructor_bytearray(self, image1, image2): - assert image1._Image__LED == image2._Image__LED - - @pytest.mark.parametrize( - "x, y, w, h, actual", [(1, 1, 2, 4, Image("99:99:99:09:"))] - ) - def test_crop_heart(self, x, y, w, h, actual): - result = self.image_heart.crop(1, 1, 2, 4) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, actual", [(Image("99:99:99:00:"), Image("22:22:22:22:"))] - ) - def test_fill(self, target, actual): - target.fill(2) - assert target._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, actual", [(Image("012:345:678:900:"), Image("987:654:321:099:"))] - ) - def test_invert(self, target, actual): - target.invert() - assert target._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, value, actual", - [ - (Image("012:345:678:900:"), 1, Image("001:034:067:090:")), - (Image("012:345:678:900:"), 6, Image("000:000:000:000:")), - (Image("012:345:678:900:"), -1, Image("120:450:780:000:")), - ], - ) - def test_shift_right(self, target, value, actual): - result = target.shift_right(value) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, value, actual", - [ - (Image("012:345:678:900:"), 2, Image("200:500:800:000:")), - (Image("012:345:678:900:"), 6, Image("000:000:000:000:")), - (Image("012:345:678:900:"), -2, Image("000:003:006:009:")), - ], - ) - def test_shift_left(self, target, value, actual): - result = target.shift_left(value) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, value, actual", - [ - (Image("012:345:678:900:"), 2, Image("678:900:000:000:")), - (Image("012:345:678:900:"), 6, Image("000:000:000:000:")), - (Image("012:345:678:900:"), -2, Image("000:000:012:345:")), - ], - ) - def test_shift_up(self, target, value, actual): - result = target.shift_up(value) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, value, actual", - [ - (Image("012:345:678:900:"), 1, Image("000:012:345:678")), - (Image("012:345:678:900:"), 6, Image("000:000:000:000:")), - (Image("012:345:678:900:"), -1, Image("345:678:900:000:")), - ], - ) - def test_shift_down(self, target, value, actual): - result = target.shift_down(value) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize("target", [(Image("012:345:678:900:"))]) - def test_copy(self, target): - result = target.copy() - assert result._Image__LED == target._Image__LED - - @pytest.mark.parametrize( - "target, multiplier, actual", - [ - (Image("012:345:678:900:"), 2, Image("024:689:999:900:")), - (Image("012:345:678:900:"), 0, Image("000:000:000:000:")), - ], - ) - def test_multiply(self, target, multiplier, actual): - result = target * multiplier - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, multiplier", - [ - (Image("012:345:678:900:"), []), - (Image("012:345:678:900:"), Image("000:000:000:000:")), - ], - ) - def test_multiply_error(self, target, multiplier): - - with pytest.raises( - TypeError, match=f"can't convert {type(multiplier)} to float" - ): - target * multiplier - - @pytest.mark.parametrize( - "target, value, actual", - [ - ( - Image("012:345:678:900:"), - Image("024:689:999:900:"), - Image("036:999:999:900:"), - ), - ( - Image("999:999:999:000:"), - Image("999:999:999:000:"), - Image("999:999:999:000:"), - ), - ], - ) - def test_add(self, target, value, actual): - result = target + value - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, value, err_message", - [ - ( - Image("012:345:678:900:"), - 2, - CONSTANTS.UNSUPPORTED_ADD_TYPE + f"'{type(Image())}', '{type(2)}'", - ), - ( - Image("012:345:678:900:"), - [], - CONSTANTS.UNSUPPORTED_ADD_TYPE + f"'{type(Image())}', '{type([])}'", - ), - ], - ) - def test_add_typeerror(self, target, value, err_message): - with pytest.raises(TypeError, match=err_message): - target + value - - @pytest.mark.parametrize( - "target, value", [(Image(2, 3), Image(3, 3)), (Image(2, 1), Image(0, 0))] - ) - def test_add_valueerror(self, target, value): - with pytest.raises(ValueError, match=CONSTANTS.SAME_SIZE_ERR): - target + value - - @pytest.mark.parametrize( - "initial, actual", - [ - (Image("0:000:00:0000:"), Image("0000:0000:0000:0000:")), - (Image("12125:1212:12:1:"), Image("12125:12120:12000:10000:")), - ], - ) - def test_uneven_strings(self, initial, actual): - assert initial._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "image, repr_actual, str_actual", - [ - ( - Image("05150:05050:05050:99999:09990:"), - "Image('05150:05050:05050:99999:09990:')", - "Image('\n 05150:\n 05050:\n 05050:\n 99999:\n 09990:\n')", - ), - (Image(""), "Image('')", "Image('\n')"), - ( - Image("00000:00000:00000:00000:00000:"), - "Image('00000:00000:00000:00000:00000:')", - "Image('\n 00000:\n 00000:\n 00000:\n 00000:\n 00000:\n')", - ), - ( - Image("00:00:00:00:"), - "Image('00:00:00:00:')", - "Image('\n 00:\n 00:\n 00:\n 00:\n')", - ), - ], - ) - def test_str(self, image, repr_actual, str_actual): - repr_output = repr(image) - str_output = str(image) - assert repr_actual == repr_output - assert str_actual == str_output - - @pytest.mark.parametrize( - "const, actual", - [ - (Image.SNAKE, Image(CONSTANTS.IMAGE_PATTERNS["SNAKE"])), - (Image.PITCHFORK, Image(CONSTANTS.IMAGE_PATTERNS["PITCHFORK"])), - ], - ) - def test_image_constants(self, const, actual): - assert const._Image__LED == actual._Image__LED - with pytest.raises(TypeError, match=CONSTANTS.COPY_ERR_MESSAGE): - const.set_pixel(0, 0, 5) diff --git a/src/micropython/microbit/test/test_init.py b/src/micropython/microbit/test/test_init.py deleted file mode 100644 index aebbc805a..000000000 --- a/src/micropython/microbit/test/test_init.py +++ /dev/null @@ -1,45 +0,0 @@ -import time - -import pytest -from unittest import mock - -from .. import * -from ..__model.microbit_model import MicrobitModel - -# tests methods in __init__.py - - -class TestShim(object): - def test_sleep(self): - # Save pointer to function about to be mocked - real_function = MicrobitModel.sleep - - milliseconds = 100 - MicrobitModel.sleep = mock.Mock() - sleep(milliseconds) - MicrobitModel.sleep.assert_called_with(milliseconds) - - # Restore original function - MicrobitModel.sleep = real_function - - def test_running_time(self): - # Save pointer to function about to be mocked - real_function = MicrobitModel.running_time - - MicrobitModel.running_time = mock.Mock() - running_time() - MicrobitModel.running_time.assert_called_once() - - # Restore original function - MicrobitModel.running_time = real_function - - def test_temperature(self): - # Save pointer to function about to be mocked - real_function = MicrobitModel.temperature - - MicrobitModel.temperature = mock.Mock() - temperature() - MicrobitModel.temperature.asser_called_once() - - # Restore original function - MicrobitModel.temperature = real_function diff --git a/src/micropython/microbit/test/test_microbit_model.py b/src/micropython/microbit/test/test_microbit_model.py deleted file mode 100644 index 4e06c6c36..000000000 --- a/src/micropython/microbit/test/test_microbit_model.py +++ /dev/null @@ -1,48 +0,0 @@ -import time - -import pytest -from unittest import mock -from ..__model import constants as CONSTANTS -from ..__model.microbit_model import MicrobitModel - - -class TestMicrobitModel(object): - def setup_method(self): - self.__mb = MicrobitModel() - - @pytest.mark.parametrize("value", [9, 30, 1999]) - def test_sleep(self, value): - time.sleep = mock.Mock() - self.__mb.sleep(value) - time.sleep.assert_called_with(value / 1000) - - def test_running_time(self): - mock_start_time = 10 - mock_end_time = 300 - self.__mb._MicrobitModel__start_time = mock_start_time - time.time = mock.MagicMock(return_value=mock_end_time) - assert mock_end_time - mock_start_time == pytest.approx( - self.__mb.running_time() - ) - - @pytest.mark.parametrize( - "temperature", - [ - CONSTANTS.MIN_TEMPERATURE, - CONSTANTS.MIN_TEMPERATURE + 1, - 0, - CONSTANTS.MAX_TEMPERATURE - 1, - CONSTANTS.MAX_TEMPERATURE, - ], - ) - def test_temperature(self, temperature): - self.__mb._MicrobitModel__set_temperature(temperature) - assert temperature == self.__mb.temperature() - - @pytest.mark.parametrize( - "invalid_temperature", - [CONSTANTS.MIN_TEMPERATURE - 1, CONSTANTS.MAX_TEMPERATURE + 1], - ) - def test_invalid_temperature(self, invalid_temperature): - with pytest.raises(ValueError): - self.__mb._MicrobitModel__set_temperature(invalid_temperature) diff --git a/src/micropython/music.py b/src/micropython/music.py deleted file mode 100644 index ad25816a6..000000000 --- a/src/micropython/music.py +++ /dev/null @@ -1,109 +0,0 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/music.html. - - -def set_tempo(ticks=4, bpm=120): - """ - This function is not implemented in the simulator. - - Sets the approximate tempo for playback. - - A number of ticks (expressed as an integer) constitute a beat. Each beat is to be played at a certain frequency per minute (expressed as the more familiar BPM - beats per minute - also as an integer). - - Suggested default values allow the following useful behaviour: - - * ``music.set_tempo()`` - reset the tempo to default of ticks = 4, bpm = 120 - * ``music.set_tempo(ticks=8)`` - change the "definition" of a beat - * ``music.set_tempo(bpm=180)`` - just change the tempo - - To work out the length of a tick in milliseconds is very simple arithmetic: ``60000/bpm/ticks_per_beat`` . For the default values that's ``60000/120/4 = 125 milliseconds`` or ``1 beat = 500 milliseconds``. - """ - utils.print_for_unimplemented_functions(set_tempo.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def get_tempo(): - """ - This function is not implemented in the simulator. - - Gets the current tempo as a tuple of integers: ``(ticks, bpm)``. - """ - utils.print_for_unimplemented_functions(get_tempo.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def play(music, pin="microbit.pin0", wait=True, loop=False): - """ - This function is not implemented in the simulator. - - Plays ``music`` containing the musical DSL defined above. - - If ``music`` is a string it is expected to be a single note such as, - ``'c1:4'``. - - If ``music`` is specified as a list of notes (as defined in the section on - the musical DSL, above) then they are played one after the other to perform - a melody. - - In both cases, the ``duration`` and ``octave`` values are reset to - their defaults before the music (whatever it may be) is played. - - An optional argument to specify the output pin can be used to override the - default of ``microbit.pin0``. - - If ``wait`` is set to ``True``, this function is blocking. - - If ``loop`` is set to ``True``, the tune repeats until ``stop`` is called - (see below) or the blocking call is interrupted. - """ - utils.print_for_unimplemented_functions(play.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def pitch(frequency, duration=-1, pin="microbit.pin0", wait=True): - """ - This function is not implemented in the simulator. - - Plays a pitch at the integer frequency given for the specified number of - milliseconds. For example, if the frequency is set to 440 and the length to - 1000 then we hear a standard concert A for one second. - - Note that you can only play one pitch on one pin at any one time. - - If ``wait`` is set to ``True``, this function is blocking. - - If ``duration`` is negative the pitch is played continuously until either the - blocking call is interrupted or, in the case of a background call, a new - frequency is set or ``stop`` is called (see below). - """ - utils.print_for_unimplemented_functions(pitch.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def stop(pin="microbit.pin0"): - """ - This function is not implemented in the simulator. - - Stops all music playback on a given pin, eg. ``music.stop(pin1)``. - If no pin is given, eg. ``music.stop()`` pin0 is assumed. - """ - utils.print_for_unimplemented_functions(stop.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def reset(): - """ - This function is not implemented in the simulator. - - Resets the state of the following attributes in the following way: - - * ``ticks = 4`` - * ``bpm = 120`` - * ``duration = 4`` - * ``octave = 4`` - """ - utils.print_for_unimplemented_functions(reset.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) diff --git a/src/micropython/radio.py b/src/micropython/radio.py deleted file mode 100644 index ac6d24fe3..000000000 --- a/src/micropython/radio.py +++ /dev/null @@ -1,180 +0,0 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/radio.html. - -RATE_250KBIT = "" - -RATE_1MBIT = "" - -RATE_2MBIT = "" - - -def on(): - """ - This function is not implemented in the simulator. - - Turns the radio on. This needs to be explicitly called since the radio - draws power and takes up memory that you may otherwise need. - """ - utils.print_for_unimplemented_functions(on.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def off(): - """ - This function is not implemented in the simulator. - - Turns off the radio, thus saving power and memory - """ - utils.print_for_unimplemented_functions(off.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def config(**kwargs): - """ - This function is not implemented in the simulator. - - Configures various keyword based settings relating to the radio. The - available settings and their sensible default values are listed below. - - The ``length`` (default=32) defines the maximum length, in bytes, of a - message sent via the radio. It can be up to 251 bytes long (254 - 3 bytes - for S0, LENGTH and S1 preamble). - - The ``queue`` (default=3) specifies the number of messages that can be - stored on the incoming message queue. If there are no spaces left on the - queue for incoming messages, then the incoming message is dropped. - - The ``channel`` (default=7) can be an integer value from 0 to 83 - (inclusive) that defines an arbitrary "channel" to which the radio is - tuned. Messages will be sent via this channel and only messages received - via this channel will be put onto the incoming message queue. Each step is - 1MHz wide, based at 2400MHz. - - The ``power`` (default=6) is an integer value from 0 to 7 (inclusive) to - indicate the strength of signal used when broadcasting a message. The - higher the value the stronger the signal, but the more power is consumed - by the device. The numbering translates to positions in the following list - of dBm (decibel milliwatt) values: -30, -20, -16, -12, -8, -4, 0, 4. - - The ``address`` (default=0x75626974) is an arbitrary name, expressed as a - 32-bit address, that's used to filter incoming packets at the hardware - level, keeping only those that match the address you set. The default used - by other micro:bit related platforms is the default setting used here. - - The ``group`` (default=0) is an 8-bit value (0-255) used with the - ``address`` when filtering messages. Conceptually, "address" is like a - house/office address and "group" is like the person at that address to - which you want to send your message. - - The ``data_rate`` (default=radio.RATE_1MBIT) indicates the speed at which - data throughput takes place. Can be one of the following contants defined - in the ``radio`` module : ``RATE_250KBIT``, ``RATE_1MBIT`` or - ``RATE_2MBIT``. - - If ``config`` is not called then the defaults described above are assumed. - """ - utils.print_for_unimplemented_functions(config.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def reset(): - """ - This function is not implemented in the simulator. - - Reset the settings to their default values (as listed in the documentation - for the ``config`` function above). - """ - utils.print_for_unimplemented_functions(reset.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def send_bytes(message): - """ - This function is not implemented in the simulator. - - Sends a message containing bytes. - """ - utils.print_for_unimplemented_functions(send_bytes.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def receive_bytes(): - """ - This function is not implemented in the simulator. - - Receive the next incoming message on the message queue. Returns ``None`` if - there are no pending messages. Messages are returned as bytes. - """ - utils.print_for_unimplemented_functions(receive_bytes.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def receive_bytes_into(buffer): - """ - This function is not implemented in the simulator. - - Receive the next incoming message on the message queue. Copies the message - into ``buffer``, trimming the end of the message if necessary. - Returns ``None`` if there are no pending messages, otherwise it returns the length - of the message (which might be more than the length of the buffer). - """ - utils.print_for_unimplemented_functions(receive_bytes_into.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def send(message): - """ - This function is not implemented in the simulator. - - Sends a message containing bytes. - """ - utils.print_for_unimplemented_functions(send.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def receive(): - """ - This function is not implemented in the simulator. - - Works in exactly the same way as ``receive_bytes`` but returns - whatever was sent. - - Currently, it's equivalent to ``str(receive_bytes(), 'utf8')`` but with a - check that the the first three bytes are ``b'\x01\x00\x01'`` (to make it - compatible with other platforms that may target the micro:bit). It strips - the prepended bytes before converting to a string. - - A ``ValueError`` exception is raised if conversion to string fails. - """ - utils.print_for_unimplemented_functions(receive.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def receive_full(): - """ - This function is not implemented in the simulator. - - Returns a tuple containing three values representing the next incoming - message on the message queue. If there are no pending messages then - ``None`` is returned. - - The three values in the tuple represent: - - * the next incoming message on the message queue as bytes. - * the RSSI (signal strength): a value between 0 (strongest) and -255 (weakest) as measured in dBm. - * a microsecond timestamp: the value returned by ``time.ticks_us()`` when the message was received. - - For example:: - - details = radio.receive_full() - if details: - msg, rssi, timestamp = details - - This function is useful for providing information needed for triangulation - and/or triliteration with other micro:bit devices. - """ - utils.print_for_unimplemented_functions(receive_full.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) diff --git a/src/micropython/speech.py b/src/micropython/speech.py deleted file mode 100644 index e92458a96..000000000 --- a/src/micropython/speech.py +++ /dev/null @@ -1,61 +0,0 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/speech.html. - - -def translate(words): - """ - This function is not implemented in the simulator. - - Given English words in the string ``words``, return a string containing - a best guess at the appropriate phonemes to pronounce. The output is - generated from this - `text to phoneme translation table `_. - - This function should be used to generate a first approximation of phonemes - that can be further hand-edited to improve accuracy, inflection and - emphasis. - """ - utils.print_for_unimplemented_functions(translate.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) - - -def pronounce(phonemes, pitch=64, speed=72, mouth=128, throat=128): - """ - This function is not implemented in the simulator. - - Pronounce the phonemes in the string ``phonemes``. See below for details of - how to use phonemes to finely control the output of the speech synthesiser. - Override the optional pitch, speed, mouth and throat settings to change the - timbre (quality) of the voice. - """ - utils.print_for_unimplemented_functions(pronounce.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) - - -def say(words, pitch=64, speed=72, mouth=128, throat=128): - """ - This function is not implemented in the simulator. - - Say the English words in the string ``words``. The result is semi-accurate - for English. Override the optional pitch, speed, mouth and throat - settings to change the timbre (quality) of the voice. This is a short-hand - equivalent of: ``speech.pronounce(speech.translate(words))`` - """ - utils.print_for_unimplemented_functions(say.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) - - -def sing(phonemes, pitch=64, speed=72, mouth=128, throat=128): - """ - This function is not implemented in the simulator. - - Sing the phonemes contained in the string ``phonemes``. Changing the pitch - and duration of the note is described below. Override the optional pitch, - speed, mouth and throat settings to change the timbre (quality) of the - voice. - """ - utils.print_for_unimplemented_functions(sing.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) diff --git a/src/micropython/utime.py b/src/micropython/utime.py deleted file mode 100644 index 9ae5ee4df..000000000 --- a/src/micropython/utime.py +++ /dev/null @@ -1,132 +0,0 @@ -import time - -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/utime.html. - - -def sleep(seconds): - """ - Sleep for the given number of seconds. You can use a floating-point number - to sleep for a fractional number of seconds, or use the - :func:`utime.sleep_ms()` and :func:`utime.sleep_us()` functions. - """ - time.sleep(seconds) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def sleep_ms(ms): - """ - Delay for given number of milliseconds, should be positive or 0. - """ - time.sleep(ms / 1000) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def sleep_us(us): - """ - Delay for given number of microseconds, should be positive or 0. - """ - time.sleep(us / 1000000) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def ticks_ms(): - """ - This function is not implemented in the simulator. - - Returns an increasing millisecond counter with an arbitrary reference point, - that wraps around after some value. - """ - utils.print_for_unimplemented_functions(ticks_ms.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def ticks_us(): - """ - This function is not implemented in the simulator. - - Just like :func:`utime.ticks_ms()` above, but in microseconds. - """ - utils.print_for_unimplemented_functions(ticks_us.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def ticks_add(ticks, delta): - """ - This function is not implemented in the simulator. - - Offset ticks value by a given number, which can be either positive or - negative. Given a ticks value, this function allows to calculate ticks - value delta ticks before or after it, following modular-arithmetic - definition of tick values. - - Example: - - .. code-block:: python - - # Find out what ticks value there was 100ms ago - print(ticks_add(time.ticks_ms(), -100)) - - # Calculate deadline for operation and test for it - deadline = ticks_add(time.ticks_ms(), 200) - while ticks_diff(deadline, time.ticks_ms()) > 0: - do_a_little_of_something() - - # Find out TICKS_MAX used by this port - print(ticks_add(0, -1)) - """ - utils.print_for_unimplemented_functions(ticks_add.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def ticks_diff(ticks1, ticks2): - """ - This function is not implemented in the simulator. - - Measure ticks difference between values returned from - :func:`utime.ticks_ms()` or :func:`ticks_us()` functions, as a signed value - which may wrap around. - - The argument order is the same as for subtraction operator, - ``ticks_diff(ticks1, ticks2)`` has the same meaning as ``ticks1 - ticks2``. - - :func:`utime.ticks_diff()` is designed to accommodate various usage - patterns, among them: - - Polling with timeout. In this case, the order of events is known, and you - will deal only with positive results of :func:`utime.ticks_diff()`: - - .. code-block:: python - - # Wait for GPIO pin to be asserted, but at most 500us - start = time.ticks_us() - while pin.value() == 0: - if time.ticks_diff(time.ticks_us(), start) > 500: - raise TimeoutError - - - Scheduling events. In this case, :func:`utime.ticks_diff()` result may be - negative if an event is overdue: - - - .. code-block:: python - - # This code snippet is not optimized - now = time.ticks_ms() - scheduled_time = task.scheduled_time() - if ticks_diff(scheduled_time, now) > 0: - print("Too early, let's nap") - sleep_ms(ticks_diff(scheduled_time, now)) - task.run() - elif ticks_diff(scheduled_time, now) == 0: - print("Right at time!") - task.run() - elif ticks_diff(scheduled_time, now) < 0: - print("Oops, running late, tell task to run faster!") - task.run(run_faster=true) - """ - utils.print_for_unimplemented_functions(ticks_diff.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) diff --git a/src/process_user_code.py b/src/process_user_code.py deleted file mode 100644 index 4b17792a6..000000000 --- a/src/process_user_code.py +++ /dev/null @@ -1,152 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -import os -import io -import sys -import copy -import json -import threading -import traceback -import python_constants as CONSTANTS -from pathlib import Path -import check_python_dependencies - -# will propagate errors if dependencies aren't sufficient -check_python_dependencies.check_for_dependencies() - -read_val = "" -threads = [] -# Redirecting the process stdout -user_stdout = io.StringIO() -sys.stdout = user_stdout - -abs_path_to_parent_dir = os.path.dirname(os.path.abspath(__file__)) - -# Insert absolute path to library for CLUE into sys.path -sys.path.insert(0, os.path.join(abs_path_to_parent_dir, CONSTANTS.CLUE_DIR)) - -# Insert absolute path to Circuitpython libraries for CLUE into sys.path -sys.path.insert(0, os.path.join(abs_path_to_parent_dir, CONSTANTS.CIRCUITPYTHON)) - -# Insert absolute path to Adafruit library for CPX into sys.path -abs_path_to_adafruit_lib = os.path.join( - abs_path_to_parent_dir, CONSTANTS.ADAFRUIT_LIBRARY_NAME -) -sys.path.insert(0, abs_path_to_adafruit_lib) - -# Insert absolute path to Micropython libraries for micro:bit into sys.path -abs_path_to_micropython_lib = os.path.join( - abs_path_to_parent_dir, CONSTANTS.MICROPYTHON_LIBRARY_NAME -) -sys.path.insert(0, abs_path_to_micropython_lib) - -# This import must happen after the sys.path is modified -from common.telemetry import telemetry_py -from common import utils -from adafruit_circuitplayground.express import cpx -from adafruit_circuitplayground.constants import CPX - -from microbit.__model.microbit_model import __mb as mb -from microbit.__model.constants import MICROBIT - -from adafruit_clue import clue -from base_circuitpython.base_cp_constants import CLUE -import board - -# get handle to terminal for clue -curr_terminal = board.DISPLAY.terminal - -# Handle User Inputs Thread -class UserInput(threading.Thread): - def __init__(self): - threading.Thread.__init__(self) - - def run(self): - device_dict = {CPX: cpx, MICROBIT: mb, CLUE: clue} - while True: - read_val = sys.stdin.readline() - sys.stdin.flush() - try: - new_state_message = json.loads(read_val) - device = new_state_message.get(CONSTANTS.ACTIVE_DEVICE_FIELD) - new_state = new_state_message.get(CONSTANTS.STATE_FIELD, {}) - if device in device_dict: - device_dict[device].update_state(new_state) - else: - raise Exception(CONSTANTS.DEVICE_NOT_IMPLEMENTED_ERROR) - - except Exception as e: - print(CONSTANTS.ERROR_SENDING_EVENT, e, file=sys.stderr, flush=True) - - -user_input = UserInput() -threads.append(user_input) -user_input.start() - - -# Handle User's Print Statements Thread -def handle_user_prints(): - global user_stdout - global curr_terminal - while True: - if user_stdout.getvalue(): - message = {"type": "print", "data": user_stdout.getvalue()} - - # when I use the value for user_stdout.getvalue() directly - # as the argument for add_str_to_terminal, it only sends the first - # line of the stream. - - # hence, I parse it out of the message dict and take off the - # extra newline at the end. - - data_str = str(message["data"]) - curr_terminal.add_str_to_terminal(data_str[:-1]) - print(json.dumps(message) + "\0", file=sys.__stdout__, flush=True) - user_stdout.truncate(0) - user_stdout.seek(0) - - -user_prints = threading.Thread(target=handle_user_prints) -threads.append(user_prints) -user_prints.start() - - -# Execute User Code Thread -def execute_user_code(abs_path_to_code_file): - global curr_terminal - curr_terminal.add_str_to_terminal(CONSTANTS.CODE_START_MSG_CLUE) - utils.abs_path_to_user_file = abs_path_to_code_file - # Execute the user's code.py file - with open(abs_path_to_code_file, encoding="utf8") as user_code_file: - user_code = user_code_file.read() - try: - codeObj = compile(user_code, abs_path_to_code_file, CONSTANTS.EXEC_COMMAND) - exec(codeObj, {}) - sys.stdout.flush() - except Exception as e: - exc_type, exc_value, exc_traceback = sys.exc_info() - errorMessage = CONSTANTS.ERROR_TRACEBACK - stackTrace = traceback.format_exception(exc_type, exc_value, exc_traceback) - - for frameIndex in range(2, len(stackTrace) - 1): - errorMessage += "\t" + str(stackTrace[frameIndex]) - print(e, errorMessage, file=sys.stderr, flush=True) - - curr_terminal.add_str_to_terminal(errorMessage) - - curr_terminal.add_str_to_terminal(CONSTANTS.CODE_FINISHED_MSG_CLUE) - board.DISPLAY.show(None) - - -user_code = threading.Thread(args=(sys.argv[1],), target=execute_user_code) -telemetry_state = json.loads(sys.argv[2]) - -telemetry_py._Telemetry__enable_telemetry = telemetry_state.get( - CONSTANTS.ENABLE_TELEMETRY, True -) -threads.append(user_code) -user_code.start() - -for thread in threads: - thread.join() diff --git a/src/python_constants.py b/src/python_constants.py deleted file mode 100644 index f469ec149..000000000 --- a/src/python_constants.py +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -ACTIVE_DEVICE_FIELD = "active_device" - -ADAFRUIT_DRIVE_NAME = "CIRCUITPY" - -DEPEND_ERR = 'The required dependencies aren\'t downloaded. Please use CTRL+SHIFT+P to open the command palette and select "Device Simulator Express: Install Extension Dependencies".' - -DEVICE_NOT_IMPLEMENTED_ERROR = "Device not implemented." - -ENABLE_TELEMETRY = "enable_telemetry" - -EXEC_COMMAND = "exec" -ERROR_SENDING_EVENT = "Error trying to send event to the process : " -ERROR_TRACEBACK = "\n\tTraceback of code execution : \n" -ERROR_NO_FILE = "Error : No file was passed to the process to execute.\n" - -ADAFRUIT_LIBRARY_NAME = "adafruit_circuitplayground" -MICROPYTHON_LIBRARY_NAME = "micropython" - -LINUX_OS = "linux" - -MAC_OS = "darwin" -MOUNT_COMMAND = "mount" - -NO_ADAFRUIT_DEVICE_DETECTED_ERROR_TITLE = ( - "No Adafruit device (Circuit Playground Express or Clue) detected" -) -NO_ADAFRUIT_DEVICE_DETECTED_ERROR_DETAIL = ( - "Could not find drive with name 'CIRCUITPYTHON'. Detected OS: {}" -) -NO_MICROBIT_DETECTED_ERROR_TITLE = "No micro:bit detected" -NOT_SUPPORTED_OS = 'The OS "{}" not supported.' -NOT_IMPLEMENTED_ERROR = "This method is not implemented by the simulator" - -STATE_FIELD = "state" - -UTF_FORMAT = "utf-8" - -WINDOWS_OS = "win32" - -DEFAULT_PORT = "5577" - -CPX = "CPX" - -MICROBIT = "micro:bit" - -CLUE = "CLUE" -CLUE_DIR = "clue" - -CIRCUITPYTHON = "base_circuitpython" - -CODE_START_MSG_CLUE = "soft reboot\ncode.py output:" -CODE_FINISHED_MSG_CLUE = "\nCode done running. Waiting for reload." diff --git a/src/requirements.txt b/src/requirements.txt deleted file mode 100644 index c13eef60b..000000000 --- a/src/requirements.txt +++ /dev/null @@ -1,12 +0,0 @@ -playsound==1.2.2 -applicationinsights==0.11.9 -python-socketio==4.3.1 -requests==2.22.0 -pywin32==227; platform_system == "Windows" -PyObjC; platform_system == "darwin" -uflash==1.3.0 -adafruit-circuitpython-fancyled==1.3.3 -Pillow==8.1.1 -adafruit-circuitpython-bitmap_font==1.1.0 -adafruit-circuitpython-display-shapes==1.2.0 -adafruit-circuitpython-neopixel==5.0.0 \ No newline at end of file diff --git a/src/serialMonitor.ts b/src/serialMonitor.ts deleted file mode 100644 index f3685cd58..000000000 --- a/src/serialMonitor.ts +++ /dev/null @@ -1,310 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Credit: A majority of this code was taken from the Visual Studio Code Arduino extension with some modifications to suit our purposes. - -import * as vscode from "vscode"; -import CONSTANTS, { DialogResponses, STATUS_BAR_PRIORITY } from "./constants"; -import { DeviceContext } from "./deviceContext"; -import { outChannel } from "./extension"; -import { logToOutputChannel } from "./extension_utils/utils"; -import { SerialPortControl } from "./serialPortControl"; - -export interface ISerialPortDetail { - path: string; - manufacturer: string; - vendorId: string; - productId: string; -} - -export class SerialMonitor implements vscode.Disposable { - public static DEFAULT_BAUD_RATE: number = 115200; - - public static listBaudRates(): number[] { - return [ - 300, - 1200, - 2400, - 4800, - 9600, - 19200, - 38400, - 57600, - 74880, - 115200, - 230400, - 250000, - ]; - } - - public static getInstance(): SerialMonitor { - if (SerialMonitor._serialMonitor === null) { - SerialMonitor._serialMonitor = new SerialMonitor(); - } - return SerialMonitor._serialMonitor; - } - - private static _serialMonitor: SerialMonitor | null = null; - - private _currentPort!: string; - private _currentBaudRate!: number; - private _outputChannel!: vscode.OutputChannel; - private _serialPortControl: SerialPortControl | null = null; - private _baudRateStatusBar!: vscode.StatusBarItem; - private _openPortStatusBar!: vscode.StatusBarItem; - private _portsStatusBar!: vscode.StatusBarItem; - - private constructor() { - const deviceContext = DeviceContext.getInstance(); - deviceContext.onDidChange(() => { - if (deviceContext.port) { - if (!this.initialized) { - this.initialize(); - } - this.updatePortListStatus(null); - } - }); - } - - public initialize() { - const defaultBaudRate: number = SerialMonitor.DEFAULT_BAUD_RATE; - this._outputChannel = vscode.window.createOutputChannel( - CONSTANTS.MISC.SERIAL_MONITOR_NAME - ); - this._currentBaudRate = defaultBaudRate; - this._portsStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.PORT - ); - this._portsStatusBar.command = - "deviceSimulatorExpress.common.selectSerialPort"; - this._portsStatusBar.tooltip = "Select Serial Port"; - this._portsStatusBar.show(); - - this._openPortStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.OPEN_PORT - ); - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.openSerialMonitor"; - this._openPortStatusBar.text = `$(plug)`; - this._openPortStatusBar.tooltip = "Open Serial Monitor"; - this._openPortStatusBar.show(); - - this._baudRateStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.BAUD_RATE - ); - this._baudRateStatusBar.command = - "deviceSimulatorExpress.common.changeBaudRate"; - this._baudRateStatusBar.tooltip = "Baud Rate"; - this._baudRateStatusBar.text = defaultBaudRate.toString(); - this.updatePortListStatus(null); - } - - public async selectSerialPort(vid: string | null, pid: string | null) { - const lists = await SerialPortControl.list(); - if (!lists.length) { - vscode.window.showInformationMessage( - "No serial message is available." - ); - return; - } - - if (vid && pid) { - const valueOfVid = parseInt(vid, 16); - const valueOfPid = parseInt(pid, 16); - const foundPort = lists.find(port => { - if (port.productId && port.vendorId) { - return ( - parseInt(port.productId, 16) === valueOfPid && - parseInt(port.vendorId, 16) === valueOfVid - ); - } - return false; - }); - if ( - foundPort && - !(this._serialPortControl && this._serialPortControl.isActive) - ) { - this.updatePortListStatus(foundPort.path); - } - } else { - const chosen = await vscode.window.showQuickPick( - lists - .map( - (port: ISerialPortDetail): vscode.QuickPickItem => { - return { - description: port.manufacturer, - label: port.path, - }; - } - ) - .sort((a, b): number => { - return a.label === b.label - ? 0 - : a.label > b.label - ? 1 - : -1; - }) as vscode.QuickPickItem[], - { placeHolder: CONSTANTS.MISC.SELECT_PORT_PLACEHOLDER } - ); - - if (chosen && chosen.label) { - this.updatePortListStatus(chosen.label); - } - } - } - - public async openSerialMonitor() { - if (!this._currentPort) { - const ans = await vscode.window.showInformationMessage( - CONSTANTS.WARNING.NO_SERIAL_PORT_SELECTED, - DialogResponses.SELECT, - DialogResponses.CANCEL - ); - if (ans === DialogResponses.SELECT) { - await this.selectSerialPort(null, null); - } - if (!this._currentPort) { - return; - } - } - - if (this._serialPortControl) { - if (this._currentPort !== this._serialPortControl.currentPort) { - await this._serialPortControl.changePort(this._currentPort); - } else if (this._serialPortControl.isActive) { - vscode.window.showWarningMessage( - `Serial Monitor is already opened for ${this._currentPort}` - ); - return; - } - } else { - this._serialPortControl = new SerialPortControl( - this._currentPort, - this._currentBaudRate, - this._outputChannel - ); - } - - if (!this._serialPortControl.currentPort) { - console.error( - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT(this._currentPort) - ); - return; - } - - try { - await this._serialPortControl.open(); - this.updatePortStatus(true); - } catch (error) { - logToOutputChannel( - outChannel, - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT_DUE_TO( - this._currentPort, - error - ), - true - ); - } - } - - public get initialized(): boolean { - return !!this._outputChannel; - } - - public dispose() { - if (this._serialPortControl && this._serialPortControl.isActive) { - return this._serialPortControl.stop(); - } - } - - public async changeBaudRate() { - const baudRates = SerialMonitor.listBaudRates(); - const chosen = await vscode.window.showQuickPick( - baudRates.map(baudRate => baudRate.toString()) - ); - - if (!chosen) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.NO_RATE_SELECTED, - true - ); - return; - } - - if (!parseInt(chosen, 10)) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.INVALID_BAUD_RATE, - true - ); - return; - } - - if (!this._serialPortControl) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.SERIAL_MONITOR_NOT_STARTED, - true - ); - return; - } - - const selectedRate: number = parseInt(chosen, 10); - await this._serialPortControl.changeBaudRate(selectedRate); - this._currentBaudRate = selectedRate; - this._baudRateStatusBar.text = chosen; - } - - public async closeSerialMonitor(port: string, showWarning: boolean = true) { - if (this._serialPortControl) { - if (port && port !== this._serialPortControl.currentPort) { - // Port is not opened - return false; - } - const result = await this._serialPortControl.stop(); - this.updatePortStatus(false); - return result; - } else if (!port && showWarning) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.SERIAL_PORT_NOT_STARTED, - true - ); - return false; - } - } - - private updatePortStatus(isOpened: boolean) { - if (isOpened) { - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.closeSerialMonitor"; - this._openPortStatusBar.text = `$(x)`; - this._openPortStatusBar.tooltip = "Close Serial Monitor"; - this._baudRateStatusBar.show(); - } else { - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.openSerialMonitor"; - this._openPortStatusBar.text = `$(plug)`; - this._openPortStatusBar.tooltip = "Open Serial Monitor"; - this._baudRateStatusBar.hide(); - } - } - - private updatePortListStatus(port: string | null) { - const deviceContext = DeviceContext.getInstance(); - if (port) { - deviceContext.port = port; - } - this._currentPort = deviceContext.port; - - if (deviceContext.port) { - this._portsStatusBar.text = deviceContext.port; - } else { - this._portsStatusBar.text = " - {renderOptions(props.options)} - - ); -}; - -const renderOptions = (options: string[]) => { - return options.map((name, index) => { - return ( - - ); - }); -}; diff --git a/src/view/components/clue/Clue.spec.tsx b/src/view/components/clue/Clue.spec.tsx deleted file mode 100644 index c69b4ebe7..000000000 --- a/src/view/components/clue/Clue.spec.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { Clue } from "./Clue"; - -describe("Clue component", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); diff --git a/src/view/components/clue/Clue.tsx b/src/view/components/clue/Clue.tsx deleted file mode 100644 index 546f136ee..000000000 --- a/src/view/components/clue/Clue.tsx +++ /dev/null @@ -1,158 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { - GESTURES_CLUE, - SENSOR_LIST, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, -} from "../../constants"; -import "../../styles/Simulator.css"; -import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; -import { sendMessage } from "../../utils/MessageUtils"; -import { CLUE_TOOLBAR_ICON_ID } from "../toolbar/SensorModalUtils"; -import ToolBar from "../toolbar/ToolBar"; -import { ClueSimulator } from "./ClueSimulator"; - -// Component grouping the functionality for micro:bit functionalities -interface IState { - sensors: { [key: string]: number }; - currentSelectedGesture: string; -} -const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT_R]: 0, - [SENSOR_LIST.LIGHT_G]: 0, - [SENSOR_LIST.LIGHT_B]: 0, - [SENSOR_LIST.LIGHT_C]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - [SENSOR_LIST.HUMIDITY]: 0, - [SENSOR_LIST.PRESSURE]: 1013, - [SENSOR_LIST.PROXIMITY]: 0, - [SENSOR_LIST.GYRO_X]: 0, - [SENSOR_LIST.GYRO_Y]: 0, - [SENSOR_LIST.GYRO_Z]: 0, - [SENSOR_LIST.MAGNET_X]: 0, - [SENSOR_LIST.MAGNET_Y]: 0, - [SENSOR_LIST.MAGNET_Z]: 0, - }, - currentSelectedGesture: GESTURES_CLUE[0], -}; - -export class Clue extends React.Component<{}, IState> { - state = DEFAULT_STATE; - - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; - - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; - updateGesture = (event: React.ChangeEvent) => { - this.setState({ currentSelectedGesture: event.target.value }); - }; - sendGesture = (isActive: boolean) => { - if (this.state.currentSelectedGesture) { - if (isActive) { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: this.state.currentSelectedGesture, - }); - } else { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: "", - }); - } - } - }; -} - -const CLUE_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - label: CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.LEDS, - image: TOOLBAR_SVG.NEO_PIXEL_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.TEMPERATURE, - image: TOOLBAR_SVG.TEMPERATURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.LIGHT, - image: TOOLBAR_SVG.LIGHT_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, - image: TOOLBAR_SVG.MOTION_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.HUMIDITY, - image: TOOLBAR_SVG.HUMIDITY_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.PRESSURE, - image: TOOLBAR_SVG.PRESSURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.PROXIMITY, - image: TOOLBAR_SVG.PROXIMITY_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GESTURE, - image: TOOLBAR_SVG.GESTURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GYROSCOPE, - image: TOOLBAR_SVG.GYROSCOPE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, - image: TOOLBAR_SVG.MAGNET_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GPIO, - image: TOOLBAR_SVG.GPIO_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.SOUND, - image: TOOLBAR_SVG.SOUND_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.SPEAKER, - image: TOOLBAR_SVG.SPEAKER_SVG, - }, -]; diff --git a/src/view/components/clue/ClueImage.tsx b/src/view/components/clue/ClueImage.tsx deleted file mode 100644 index 85694d4e0..000000000 --- a/src/view/components/clue/ClueImage.tsx +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { BUTTON_CLASSNAME, VIEW_STATE } from "../../constants"; -import CONSTANTS, { BUTTON_STYLING_CLASSES } from "../../constants"; -import { ViewStateContext } from "../../context"; -import { ClueSvg, IRefObject } from "./Clue_svg"; - -interface EventTriggers { - onMouseUp: (event: Event, buttonKey: string) => void; - onMouseDown: (event: Event, buttonKey: string) => void; - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; -} -interface IProps { - eventTriggers: EventTriggers; - displayMessage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; -} - -export enum BUTTONS_KEYS { - BTN_A = "BTN_A", - BTN_B = "BTN_B", - BTN_AB = "BTN_AB", -} -// Displays the SVG and call necessary svg modification. -export class ClueImage extends React.Component { - private svgRef: React.RefObject = React.createRef(); - constructor(props: IProps) { - super(props); - } - componentDidMount() { - const svgElement = this.svgRef.current; - if (svgElement) { - setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); - this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); - } - } - componentDidUpdate() { - if (this.context === VIEW_STATE.PAUSE && this.svgRef.current) { - disableAllButtons(this.svgRef.current.getButtons()); - } else if (this.context === VIEW_STATE.RUNNING && this.svgRef.current) { - setupAllButtons( - this.props.eventTriggers, - this.svgRef.current.getButtons() - ); - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.eventTriggers.onKeyEvent(event, true, event.key); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.eventTriggers.onKeyEvent(event, false, event.key); - }; - render() { - return ( - - ); - } - public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { - const button = this.svgRef.current?.getButtons()[key].current; - if (button) { - button.focus(); - if (isActive) { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.KEYPRESSED - ); - } else { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.DEFAULT - ); - } - button.setAttribute("pressed", `${isActive}`); - button.setAttribute("aria-pressed", `${isActive}`); - } - } -} - -ClueImage.contextType = ViewStateContext; -const setupButton = ( - buttonElement: SVGRectElement, - eventTriggers: EventTriggers, - key: string -) => { - buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); - buttonElement.onmousedown = e => { - buttonElement.focus(); - eventTriggers.onMouseDown(e, key); - }; - buttonElement.onmouseup = e => { - eventTriggers.onMouseUp(e, key); - }; - - buttonElement.onkeydown = e => { - // ensure that the keydown is enter, - // or else it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - eventTriggers.onKeyEvent(e, true, key); - } - }; - buttonElement.onkeyup = e => { - eventTriggers.onKeyEvent(e, false, key); - }; -}; -const setupAllButtons = ( - eventTriggers: EventTriggers, - buttonRefs: IRefObject -) => { - for (const [key, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - setupButton(ref.current, eventTriggers, key); - } - } -}; -const disableAllButtons = (buttonRefs: IRefObject) => { - for (const [, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - // to implement - ref.current.onmousedown = null; - ref.current.onmouseup = null; - ref.current.onkeydown = null; - ref.current.onkeyup = null; - ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); - } - } -}; diff --git a/src/view/components/clue/ClueSimulator.tsx b/src/view/components/clue/ClueSimulator.tsx deleted file mode 100644 index a15f101f8..000000000 --- a/src/view/components/clue/ClueSimulator.tsx +++ /dev/null @@ -1,304 +0,0 @@ -import * as React from "react"; -import { - AB_BUTTONS_KEYS, - CONSTANTS, - DEFAULT_IMG_CLUE, - DEVICE_LIST_KEY, - VIEW_STATE, - WEBVIEW_MESSAGES, -} from "../../constants"; -import { ViewStateContext } from "../../context"; -import "../../styles/Simulator.css"; -import "../../styles/Simulator.css"; -import PlayLogo from "../../svgs/play_svg"; -import StopLogo from "../../svgs/stop_svg"; -import { sendMessage } from "../../utils/MessageUtils"; -import ActionBar from "../simulator/ActionBar"; -import { BUTTONS_KEYS, ClueImage } from "./ClueImage"; - -export const DEFAULT_CLUE_STATE: IClueState = { - buttons: { button_a: false, button_b: false }, - displayMessage: DEFAULT_IMG_CLUE, - leds: { - neopixel: [0, 0, 0], - isRedLedOn: false, - isWhiteLedOn: false, - }, -}; - -interface IState { - active_editors: string[]; - running_file?: string; - play_button: boolean; - selected_file: string; - clue: IClueState; - currently_selected_file: string; -} - -interface IClueState { - buttons: { button_a: boolean; button_b: boolean }; - displayMessage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; -} -export class ClueSimulator extends React.Component { - private imageRef: React.RefObject = React.createRef(); - constructor() { - super({}); - this.state = { - clue: DEFAULT_CLUE_STATE, - play_button: false, - selected_file: "", - active_editors: [], - running_file: undefined, - currently_selected_file: "", - }; - this.onKeyEvent = this.onKeyEvent.bind(this); - } - handleMessage = (event: any): void => { - const message = event.data; - if (message.active_device !== DEVICE_LIST_KEY.CLUE) { - return; - } - switch (message.command) { - case "reset-state": - this.setState({ - clue: DEFAULT_CLUE_STATE, - play_button: false, - }); - break; - case "set-state": - this.handleStateChangeMessage(message); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - clue: { - ...this.state.clue, - displayMessage: DEFAULT_IMG_CLUE, - }, - }); - break; - case "visible-editors": - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } - - break; - } - }; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } - - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
- -
- -
- -
- ); - } - protected togglePlayClick = () => { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - }; - protected onSelectFile(event: React.FocusEvent) { - this.setState({ - selected_file: event.currentTarget.value, - }); - } - protected refreshSimulatorClick = () => { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - }; - protected handleButtonClick = (key: string, isActive: boolean) => { - let newButtonState = this.state.clue.buttons; - switch (key) { - case AB_BUTTONS_KEYS.BTN_A: - newButtonState.button_a = isActive; - break; - case AB_BUTTONS_KEYS.BTN_B: - newButtonState.button_b = isActive; - break; - case AB_BUTTONS_KEYS.BTN_AB: - newButtonState = { - button_a: isActive, - button_b: isActive, - }; - break; - } - sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); - this.setState({ - clue: { - ...this.state.clue, - buttons: newButtonState, - }, - }); - }; - - protected onMouseUp = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, false); - }; - - protected onMouseDown = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, true); - }; - - protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { - event.stopPropagation(); - if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(key, active); - if (key === BUTTONS_KEYS.BTN_A) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if (key === BUTTONS_KEYS.BTN_B) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if (key === BUTTONS_KEYS.BTN_AB) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } - } - protected handleStateChangeMessage(message: any) { - if (message.state.display_base64 != null) { - this.setState({ - clue: { - ...this.state.clue, - displayMessage: message.state.display_base64, - }, - }); - } else if (message.state.pixels != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - neopixel: message.state.pixels, - }, - }, - }); - } else if (message.state.white_leds != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - isWhiteLedOn: message.state.white_leds, - }, - }, - }); - } else if (message.state.red_led != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - isRedLedOn: message.state.red_led, - }, - }, - }); - } - } -} -ClueSimulator.contextType = ViewStateContext; diff --git a/src/view/components/clue/Clue_svg.tsx b/src/view/components/clue/Clue_svg.tsx deleted file mode 100644 index bcbf4e6d2..000000000 --- a/src/view/components/clue/Clue_svg.tsx +++ /dev/null @@ -1,1184 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { CLUE_LEDS_COLORS, CONSTANTS } from "../../constants"; -import "../../styles/SimulatorSvg.css"; -import svg from "../cpx/Svg_utils"; -import { DEFAULT_CLUE_STATE } from "./ClueSimulator"; -export interface IRefObject { - [key: string]: React.RefObject; -} -interface IProps { - displayImage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; -} -export class ClueSvg extends React.Component { - private svgRef: React.RefObject = React.createRef(); - private ledsRefs = { - neopixel: React.createRef(), - redLed: React.createRef(), - whiteLeds: [ - React.createRef(), - React.createRef(), - ], - }; - private gradientRefs = { - neopixel: React.createRef(), - whiteLed: React.createRef(), - redLed: React.createRef(), - }; - - private buttonRefs: IRefObject = { - BTN_A: React.createRef(), - BTN_B: React.createRef(), - BTN_AB: React.createRef(), - }; - - private displayRef: React.RefObject = React.createRef(); - - public getSvgRef(): React.RefObject { - return this.svgRef; - } - public getButtons(): IRefObject { - return this.buttonRefs; - } - public getDisplayRef(): React.RefObject { - return this.displayRef; - } - componentDidMount() { - this.updateSvg(); - } - componentDidUpdate() { - this.updateSvg(); - } - - render() { - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - - LIGHT - - - GESTURE - - - P - - R - - - O - - - XIMI - - - T - - - Y - - - - - - - - - - - - - - Red LED - - - - - Neopixel - - - - -
- ); - } - private updateSvg() { - this.updateDisplay(); - this.updateNeopixel(); - this.updateLeds(); - } - - private updateDisplay() { - if (this.props.displayImage) { - this.displayRef.current?.setAttribute( - "href", - `data:image/png;base64,${this.props.displayImage}` - ); - } - } - - private updateNeopixel() { - const { neopixel } = this.props.leds; - const rgbColor = `rgb(${neopixel[0] + - (255 - neopixel[0]) * CONSTANTS.LED_TINT_FACTOR}, - ${neopixel[1] + - (255 - neopixel[1]) * CONSTANTS.LED_TINT_FACTOR},${neopixel[2] + - (255 - neopixel[2]) * CONSTANTS.LED_TINT_FACTOR})`; - - this.ledsRefs.neopixel.current?.setAttribute("fill", rgbColor); - - if (neopixel === DEFAULT_CLUE_STATE.leds.neopixel) { - this.gradientRefs.neopixel.current?.setAttribute( - "stop-opacity", - "0" - ); - } else { - this.gradientRefs.neopixel.current?.setAttribute( - "stop-opacity", - "1" - ); - } - this.gradientRefs.neopixel.current?.setAttribute( - "stop-color", - rgbColor - ); - } - private updateLeds() { - // update white led - const { isWhiteLedOn, isRedLedOn } = this.props.leds; - - this.ledsRefs.whiteLeds.map( - (ledRef: React.RefObject) => { - svg.setLed( - isWhiteLedOn, - CLUE_LEDS_COLORS.WHITE_LEDS_OFF, - CLUE_LEDS_COLORS.WHITE_LEDS_ON, - ledRef.current, - this.gradientRefs.whiteLed.current - ); - } - ); - svg.setLed( - isRedLedOn, - CLUE_LEDS_COLORS.RED_LED_OFF, - CLUE_LEDS_COLORS.RED_LED_ON, - this.ledsRefs.redLed.current, - this.gradientRefs.redLed.current - ); - } -} diff --git a/src/view/components/clue/__snapshots__/Clue.spec.tsx.snap b/src/view/components/clue/__snapshots__/Clue.spec.tsx.snap deleted file mode 100644 index dce8f43ff..000000000 --- a/src/view/components/clue/__snapshots__/Clue.spec.tsx.snap +++ /dev/null @@ -1,2202 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Clue component should render correctly 1`] = ` -Array [ -
-
- The simulator will run the .py file you have focused on. -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - LIGHT - - - GESTURE - - - P - - R - - - O - - - XIMI - - - T - - - Y - - - - - - - - - - - - - - Red LED - - - - - Neopixel - - - - -
-
-
- - -
-
, -
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
, -] -`; diff --git a/src/view/components/cpx/Accessibility_utils.ts b/src/view/components/cpx/Accessibility_utils.ts deleted file mode 100644 index afdadb2ac..000000000 --- a/src/view/components/cpx/Accessibility_utils.ts +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Helpers designed to help to make a simulator accessible. -namespace accessibility { - export function makeFocusable(elem: SVGElement): void { - elem.setAttribute("focusable", "true"); - elem.setAttribute("tabindex", "0"); - } - - export function setAria( - elem: Element, - role?: string, - label?: string - ): void { - if (role && !elem.hasAttribute("role")) { - elem.setAttribute("role", role); - } - - if (label && !elem.hasAttribute("aria-label")) { - elem.setAttribute("aria-label", label); - } - } -} - -export default accessibility; diff --git a/src/view/components/cpx/Cpx.spec.tsx b/src/view/components/cpx/Cpx.spec.tsx deleted file mode 100644 index 24c53d551..000000000 --- a/src/view/components/cpx/Cpx.spec.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { Cpx } from "./Cpx"; - -describe("CPX component", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); diff --git a/src/view/components/cpx/Cpx.tsx b/src/view/components/cpx/Cpx.tsx deleted file mode 100644 index d91728fba..000000000 --- a/src/view/components/cpx/Cpx.tsx +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { CPX_TOOLBAR_ICON_ID } from "../../components/toolbar/SensorModalUtils"; -import ToolBar from "../../components/toolbar/ToolBar"; -import { SENSOR_LIST, VSCODE_MESSAGES_TO_WEBVIEW } from "../../constants"; -import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; -import Simulator from "./CpxSimulator"; - -// Component grouping the functionality for circuit playground express -const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - }, -}; - -export class Cpx extends React.Component { - state = DEFAULT_STATE; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; - - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; -} - -const CPX_TOOLBAR_BUTTONS: Array<{ label: any; image: any }> = [ - { - image: TOOLBAR_SVG.SLIDER_SWITCH_SVG, - label: CPX_TOOLBAR_ICON_ID.SWITCH, - }, - { - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - label: CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, - }, - { - image: TOOLBAR_SVG.RED_LED_SVG, - label: CPX_TOOLBAR_ICON_ID.RED_LED, - }, - { - image: TOOLBAR_SVG.SOUND_SVG, - label: CPX_TOOLBAR_ICON_ID.SOUND, - }, - { - image: TOOLBAR_SVG.TEMPERATURE_SVG, - label: CPX_TOOLBAR_ICON_ID.TEMPERATURE, - }, - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: CPX_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.NEO_PIXEL_SVG, - label: CPX_TOOLBAR_ICON_ID.NEO_PIXEL, - }, - { - image: TOOLBAR_SVG.SPEAKER_SVG, - label: CPX_TOOLBAR_ICON_ID.SPEAKER, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: CPX_TOOLBAR_ICON_ID.MOTION, - }, - { - image: TOOLBAR_SVG.IR_SVG, - label: CPX_TOOLBAR_ICON_ID.IR, - }, - { - image: TOOLBAR_SVG.GPIO_SVG, - label: CPX_TOOLBAR_ICON_ID.GPIO, - }, -]; diff --git a/src/view/components/cpx/CpxImage.tsx b/src/view/components/cpx/CpxImage.tsx deleted file mode 100644 index 48aef4e64..000000000 --- a/src/view/components/cpx/CpxImage.tsx +++ /dev/null @@ -1,406 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import CONSTANTS from "../../constants"; -import accessibility from "./Accessibility_utils"; -import CPX_SVG from "./Cpx_svg"; -import * as SvgStyle from "./Cpx_svg_style"; -import svg from "./Svg_utils"; - -interface IProps { - pixels: number[][]; - red_led: boolean; - brightness: number; - switch: boolean; - on: boolean; - onKeyEvent: (event: KeyboardEvent, active: boolean) => void; - onMouseUp: (button: HTMLElement, event: Event) => void; - onMouseDown: (button: HTMLElement, event: Event) => void; - onMouseLeave: (button: HTMLElement, event: Event) => void; -} - -export class CpxImage extends React.Component { - componentDidMount() { - const svgElement = window.document.getElementById("cpx_svg"); - if (svgElement) { - initSvgStyle(svgElement, this.props.brightness); - setupButtons(this.props); - setupPins(this.props); - this.setupKeyPresses(this.props.onKeyEvent); - setupSwitch(this.props); - this.updateImage(); - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - componentDidUpdate() { - this.updateImage(); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the switch, run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.S) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.onKeyEvent(event, true); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.onKeyEvent(event, false); - }; - render() { - return CPX_SVG; - } - private updateImage() { - updateNeopixels(this.props); - updateRedLED(this.props.red_led); - updatePowerLED(this.props.on); - updateSwitch(this.props.switch); - } -} - -const makeButton = ( - g: SVGElement, - left: number, - top: number, - id: string -): { outer: SVGElement; inner: SVGElement } => { - const buttonCornerRadius = SvgStyle.BUTTON_CORNER_RADIUS; - const buttonWidth = SvgStyle.BUTTON_WIDTH; - const buttonCircleRadius = SvgStyle.BUTTON_CIRCLE_RADIUS; - const btng = svg.child(g, "g", { class: "sim-button-group" }); - svg.child(btng, "rect", { - fill: SvgStyle.BUTTON_OUTER, - height: buttonWidth, - id: id + "_OUTER", - rx: buttonCornerRadius, - ry: buttonCornerRadius, - width: buttonWidth, - x: left, - y: top, - }); - - const outer = btng; - const inner = svg.child(btng, "circle", { - id: id + "_INNER", - cx: left + buttonWidth / 2, - cy: top + buttonWidth / 2, - r: buttonCircleRadius, - fill: SvgStyle.BUTTON_NEUTRAL, - }); - - return { outer, inner }; -}; - -const initSvgStyle = (svgElement: HTMLElement, brightness: number): void => { - const style: SVGStyleElement = svg.child( - svgElement, - "style", - {} - ) as SVGStyleElement; - style.textContent = SvgStyle.SVG_STYLE; - - // Filters for the glow effect (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) - const defs: SVGDefsElement = svg.child( - svgElement, - "defs", - {} - ) as SVGDefsElement; - - const g = svg.createElement("g") as SVGElement; - svgElement.appendChild(g); - - const glow = svg.child(defs, "filter", { - height: "120%", - id: "filterglow", - width: "120%", - x: "-5%", - y: "-5%", - }); - svg.child(glow, "feGaussianBlur", { stdDeviation: "5", result: "glow" }); - const merge = svg.child(glow, "feMerge", {}); - for (let i = 0; i < 3; ++i) { - svg.child(merge, "feMergeNode", { in: "glow" }); - } - - const neopixelglow = svg.child(defs, "filter", { - height: "600%", - id: "neopixelglow", - width: "600%", - x: "-300%", - y: "-300%", - }); - svg.child(neopixelglow, "feGaussianBlur", { - result: "coloredBlur", - stdDeviation: "4.3", - }); - const neopixelmerge = svg.child(neopixelglow, "feMerge", {}); - svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); - svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); - svg.child(neopixelmerge, "feMergeNode", { in: "SourceGraphic" }); - - // Brightness - const neopixelfeComponentTransfer = svg.child( - neopixelglow, - "feComponentTransfer", - {} - ); - svg.child(neopixelfeComponentTransfer, "feFuncR", { - id: "brightnessFilterR", - type: "linear", - slope: brightness, - }); - svg.child(neopixelfeComponentTransfer, "feFuncG", { - id: "brightnessFilterG", - slope: brightness, - type: "linear", - }); - svg.child(neopixelfeComponentTransfer, "feFuncB", { - id: "brightnessFilterB", - slope: brightness, - type: "linear", - }); - - // BTN A+B - const outerBtn = (left: number, top: number, label: string) => { - return makeButton(g, left, top, "BTN_AB"); - }; - - const ab = outerBtn(165, SvgStyle.MB_HEIGHT - 15, "A+B"); - const abtext = svg.child(ab.outer, "text", { - class: "sim-text-outside", - x: SvgStyle.BUTTON_TEXT_BASELINE, - y: SvgStyle.MB_HEIGHT - 18, - }) as SVGTextElement; - abtext.textContent = "A+B"; -}; - -const updateNeopixels = (props: IProps): void => { - for (let i = 0; i < props.pixels.length; i++) { - const led = window.document.getElementById(`NEOPIXEL_${i}`); - if (led) { - setNeopixel(led, props.pixels[i], props.brightness); - } - } -}; - -const updateRedLED = (propsRedLED: boolean): void => { - const redLED = window.document.getElementById("SERIAL_LED"); - if (redLED) { - redLED.style.fill = propsRedLED - ? SvgStyle.RED_LED_ON - : SvgStyle.RED_LED_OFF; - } -}; - -const updatePowerLED = (propsPowerLED: boolean): void => { - const powerLED = window.document.getElementById("PWR_LED"); - if (powerLED) { - powerLED.style.fill = propsPowerLED - ? SvgStyle.POWER_LED_ON - : SvgStyle.POWER_LED_OFF; - } -}; - -const setNeopixel = ( - led: HTMLElement, - pixValue: number[], - brightness: number -): void => { - if (isLightOn(pixValue) && brightness > 0) { - // Neopixels style (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) - changeBrightness("brightnessFilterR", brightness); - changeBrightness("brightnessFilterG", brightness); - changeBrightness("brightnessFilterB", brightness); - - let [hue, sat, lum] = SvgStyle.rgbToHsl([ - pixValue[0], - pixValue[1], - pixValue[2], - ]); - const innerLum = Math.max( - lum * SvgStyle.INTENSITY_FACTOR, - SvgStyle.MIN_INNER_LUM - ); - lum = (lum * 90) / 100 + 10; // at least 10% luminosity for the stroke - - led.style.filter = `url(#neopixelglow)`; - led.style.fill = `hsl(${hue}, ${sat}%, ${innerLum}%)`; - led.style.stroke = `hsl(${hue}, ${sat}%, ${Math.min( - lum * 3, - SvgStyle.MAX_STROKE_LUM - )}%)`; - led.style.strokeWidth = `1.5`; - } else { - led.style.fill = SvgStyle.OFF_COLOR; - led.style.filter = `none`; - led.style.stroke = `none`; - } -}; - -const isLightOn = (pixValue: number[]): boolean => { - return !pixValue.every(val => { - return val === 0; - }); -}; - -const changeBrightness = (filterID: string, brightness: number): void => { - const brightnessFilter: HTMLElement | null = window.document.getElementById( - filterID - ); - if (brightnessFilter) { - brightnessFilter.setAttribute("slope", brightness.toString()); - } -}; - -const setupButtons = (props: IProps): void => { - const outButtons = ["A_OUTER", "B_OUTER", "AB_OUTER"]; - const inButtons = ["A_INNER", "B_INNER", "AB_INNER"]; - outButtons.forEach(buttonName => { - const button = window.document.getElementById("BTN_" + buttonName); - - if (button) { - setupButton(button, "sim-button-outer", props); - } - }); - inButtons.forEach(buttonName => { - const button = window.document.getElementById("BTN_" + buttonName); - if (button) { - setupButton(button, "sim-button", props); - } - }); -}; - -const setupPins = (props: IProps): void => { - const pins = [ - "PIN_A1", - "PIN_A2", - "PIN_A3", - "PIN_A4", - "PIN_A5", - "PIN_A6", - "PIN_A7", - ]; - pins.forEach(pinName => { - const pin = window.document.getElementById(pinName); - - if (pin) { - const svgPin = (pin as unknown) as SVGElement; - svg.addClass(svgPin, `sim-${pinName}-touch`); - accessibility.makeFocusable(svgPin); - svgPin.onmouseup = e => props.onMouseUp(pin, e); - svgPin.onkeyup = e => props.onKeyEvent(e, false); - svgPin.onmousedown = e => props.onMouseDown(pin, e); - svgPin.onkeydown = e => props.onKeyEvent(e, true); - accessibility.setAria( - svgPin, - "button", - `Touch pin ${pinName.substr(pinName.length - 2)}` - ); - } - }); -}; - -const addButtonLabels = (button: HTMLElement) => { - let label = ""; - if (button.id.match(/AB/) !== null) { - label = "a+b"; - } else if (button.id.match(/A/) !== null) { - label = "a"; - } else if (button.id.match(/B/) !== null) { - label = "b"; - } - accessibility.setAria(button, "button", label); -}; - -const setupButton = (button: HTMLElement, className: string, props: IProps) => { - const svgButton = (button as unknown) as SVGElement; - svg.addClass(svgButton, className); - addButtonLabels(button); - if (className.match(/outer/) !== null) { - accessibility.makeFocusable(svgButton); - } - svgButton.onmousedown = e => props.onMouseDown(button, e); - svgButton.onmouseup = e => props.onMouseUp(button, e); - svgButton.onkeydown = e => { - // ensure that the keydown is enter. - // Or else, if the key is a shortcut instead, - // it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - props.onKeyEvent(e, true); - } - }; - svgButton.onkeyup = e => props.onKeyEvent(e, false); - svgButton.onmouseleave = e => props.onMouseLeave(button, e); -}; - -const setupSwitch = (props: IProps): void => { - const switchElement = window.document.getElementById("SWITCH"); - const swInnerElement = window.document.getElementById("SWITCH_INNER"); - const swHousingElement = window.document.getElementById("SWITCH_HOUSING"); - - if (switchElement && swInnerElement && swHousingElement) { - const svgSwitch: SVGElement = (switchElement as unknown) as SVGElement; - const svgSwitchInner: SVGElement = (swInnerElement as unknown) as SVGElement; - const svgSwitchHousing: SVGElement = (swHousingElement as unknown) as SVGElement; - - svg.addClass(svgSwitch, "sim-slide-switch"); - - svgSwitch.onmouseup = e => props.onMouseUp(switchElement, e); - svgSwitchInner.onmouseup = e => props.onMouseUp(swInnerElement, e); - svgSwitchHousing.onmouseup = e => props.onMouseUp(swHousingElement, e); - svgSwitch.onkeyup = e => props.onKeyEvent(e, false); - - accessibility.makeFocusable(svgSwitch); - accessibility.setAria(svgSwitch, "button", "On/Off Switch"); - } -}; - -export const updateSwitch = (switchState: boolean): void => { - const switchElement = window.document.getElementById("SWITCH"); - const switchInner = (window.document.getElementById( - "SWITCH_INNER" - ) as unknown) as SVGElement; - - if (switchElement && switchInner) { - svg.addClass(switchInner, "sim-slide-switch-inner"); - - if (!switchState) { - svg.addClass(switchInner, "on"); - switchInner.setAttribute("transform", "translate(-5,0)"); - } else { - svg.removeClass(switchInner, "on"); - switchInner.removeAttribute("transform"); - } - switchElement.setAttribute("aria-pressed", switchState.toString()); - } -}; -export const updatePinTouch = (pinState: boolean, id: string): void => { - console.log(`updating ${id} with ${pinState}`); - const pinElement = window.document.getElementById(id); - const pinSvg: SVGElement = (pinElement as unknown) as SVGElement; - - if (pinElement && pinSvg) { - pinElement.setAttribute("aria-pressed", pinState.toString()); - pinState - ? svg.addClass(pinSvg, "pin-pressed") - : svg.removeClass(pinSvg, "pin-pressed"); - } -}; - -export default CpxImage; diff --git a/src/view/components/cpx/CpxSimulator.tsx b/src/view/components/cpx/CpxSimulator.tsx deleted file mode 100644 index b0d77f441..000000000 --- a/src/view/components/cpx/CpxSimulator.tsx +++ /dev/null @@ -1,392 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { CONSTANTS, DEVICE_LIST_KEY, WEBVIEW_MESSAGES } from "../../constants"; -import { sendMessage } from "../../utils/MessageUtils"; - -import "../../styles/Simulator.css"; -import PlayLogo from "../../svgs/play_svg"; -import StopLogo from "../../svgs/stop_svg"; -import ActionBar from "../simulator/ActionBar"; -import { BUTTON_NEUTRAL, BUTTON_PRESSED } from "./Cpx_svg_style"; -import { CpxImage, updatePinTouch, updateSwitch } from "./CpxImage"; - -interface ICpxState { - pixels: number[][]; - brightness: number; - red_led: boolean; - button_a: boolean; - button_b: boolean; - switch: boolean; - touch: boolean[]; - shake: boolean; -} - -interface IState { - active_editors: string[]; - running_file: string; - selected_file: string; - cpx: ICpxState; - play_button: boolean; - currently_selected_file: string; -} - -const DEFAULT_CPX_STATE: ICpxState = { - brightness: 1.0, - button_a: false, - button_b: false, - pixels: [ - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - ], - red_led: false, - switch: false, - touch: [false, false, false, false, false, false, false], - shake: false, -}; - -class Simulator extends React.Component<{}, IState> { - constructor(props: Readonly<{}>) { - super(props); - this.state = { - active_editors: [], - cpx: DEFAULT_CPX_STATE, - play_button: false, - running_file: "", - selected_file: "", - currently_selected_file: "", - }; - - this.handleClick = this.handleClick.bind(this); - this.onKeyEvent = this.onKeyEvent.bind(this); - this.onMouseDown = this.onMouseDown.bind(this); - this.onMouseUp = this.onMouseUp.bind(this); - this.onMouseLeave = this.onMouseLeave.bind(this); - this.togglePlayClick = this.togglePlayClick.bind(this); - this.refreshSimulatorClick = this.refreshSimulatorClick.bind(this); - } - - handleMessage = (event: any): void => { - const message = event.data; // The JSON data our extension sent - if (message.active_device !== DEVICE_LIST_KEY.CPX) { - return; - } - switch (message.command) { - case "reset-state": - console.log("Clearing the state"); - this.setState({ - cpx: DEFAULT_CPX_STATE, - play_button: false, - }); - break; - case "set-state": - console.log( - "Setting the state: " + JSON.stringify(message.state) - ); - this.setState({ - cpx: message.state, - play_button: true, - }); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - }); - break; - case "visible-editors": - console.log( - "Setting active editors", - message.state.activePythonEditors - ); - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - console.log("Setting current file", message.state.running_file); - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } - break; - } - }; - - componentDidMount() { - console.log("Mounted"); - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
-
- -
- -
- ); - } - - protected togglePlayClick() { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - } - - protected refreshSimulatorClick() { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - } - - protected onKeyEvent(event: KeyboardEvent, active: boolean) { - let element; - const target = event.target as SVGElement; - // Guard Clause - if (target === undefined) { - return; - } - - if ([event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER)) { - element = window.document.getElementById(target.id); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_A - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_B - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_AB - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.S) - ) { - element = window.document.getElementById(CONSTANTS.ID_NAME.SWITCH); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } else { - if (event.shiftKey) { - switch (event.code) { - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_ONE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A1 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_TWO: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A2 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_THREE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A3 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FOUR: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A4 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FIVE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A5 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SIX: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A6 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SEVEN: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A7 - ); - break; - } - } - } - if (element) { - event.preventDefault(); - this.handleClick(element, active); - element.focus(); - } - } - protected onMouseDown(button: HTMLElement, event: Event) { - event.preventDefault(); - this.handleClick(button, true); - button.focus(); - } - - protected onMouseUp(button: HTMLElement, event: Event) { - event.preventDefault(); - this.handleClick(button, false); - } - - protected onMouseLeave(button: HTMLElement, event: Event) { - event.preventDefault(); - - if (button.getAttribute("pressed") === "true") { - this.handleClick(button, false); - } - } - - private handleClick(element: HTMLElement, active: boolean) { - let newState; - let message; - if (element.id.includes("BTN")) { - newState = this.handleButtonClick(element, active); - message = "button-press"; - } else if (element.id.includes("SWITCH")) { - newState = this.handleSwitchClick(); - message = "button-press"; - } else if (element.id.includes("PIN")) { - newState = this.handleTouchPinClick(element, active); - message = "sensor-changed"; - } else { - return; - } - - if (newState && message) { - sendMessage(message, newState); - } - } - - private handleButtonClick(button: HTMLElement, active: boolean) { - const ButtonA: boolean = button.id.match(/BTN_A/) !== null; - const ButtonB: boolean = button.id.match(/BTN_B/) !== null; - const ButtonAB: boolean = button.id.match(/BTN_AB/) !== null; - let innerButton; - let newState; - - if (ButtonAB) { - innerButton = window.document.getElementById("BTN_AB_INNER"); - newState = { - button_a: active, - button_b: active, - }; - this.setState({ ...this.state, ...newState }); - } else if (ButtonA) { - innerButton = window.document.getElementById("BTN_A_INNER"); - newState = { - button_a: active, - }; - this.setState({ ...this.state, ...newState }); - } else if (ButtonB) { - innerButton = window.document.getElementById("BTN_B_INNER"); - newState = { - button_b: active, - }; - this.setState({ ...this.state, ...newState }); - } - - if (innerButton) { - innerButton.style.fill = this.getButtonColor(active); - } - - button.setAttribute("pressed", `${active}`); - return newState; - } - - private getButtonColor(pressed: boolean) { - const buttonUps = BUTTON_NEUTRAL; - const buttonDown = BUTTON_PRESSED; - return pressed ? buttonDown : buttonUps; - } - - private handleSwitchClick() { - const switchIsOn = !this.state.cpx.switch; - updateSwitch(switchIsOn); - this.setState({ - ...this.state, - cpx: { ...this.state.cpx, switch: switchIsOn }, - }); - return { switch: switchIsOn }; - } - - private handleTouchPinClick(pin: HTMLElement, active: boolean): any { - let cpxState = this.state.cpx; - const pinIndex = parseInt(pin.id.charAt(pin.id.length - 1)) - 1; - const pinState = cpxState.touch; - pinState[pinIndex] = active; - cpxState = { ...cpxState, touch: pinState }; - this.setState({ ...this.state, ...cpxState }); - updatePinTouch(active, pin.id); - return { touch: pinState }; - } -} - -export default Simulator; diff --git a/src/view/components/cpx/Cpx_svg.tsx b/src/view/components/cpx/Cpx_svg.tsx deleted file mode 100644 index 55864d460..000000000 --- a/src/view/components/cpx/Cpx_svg.tsx +++ /dev/null @@ -1,3002 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/boardsvg.ts - -import * as React from "react"; - -export const CPX_SVG = ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -); - -export default CPX_SVG; diff --git a/src/view/components/cpx/Cpx_svg_style.tsx b/src/view/components/cpx/Cpx_svg_style.tsx deleted file mode 100644 index 4eff14480..000000000 --- a/src/view/components/cpx/Cpx_svg_style.tsx +++ /dev/null @@ -1,302 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts#L477 - -export const MB_WIDTH = 180.09375; -export const MB_HEIGHT = 179.22874; - -export const OFF_COLOR = "#c8c8c8"; -export const MAX_STROKE_LUM = 75; -export const MIN_INNER_LUM = 85; -export const INTENSITY_FACTOR = 1.3; -export const RED_LED_ON: string = "#FF7777"; -export const RED_LED_OFF: string = "#FFFFFF"; -export const BUTTON_NEUTRAL: string = "#000000"; -export const BUTTON_PRESSED: string = "#FFA500"; -export const BUTTON_OUTER: string = "#DCDCDC"; -export const BUTTON_CORNER_RADIUS: number = 2; -export const BUTTON_WIDTH: number = 10; -export const BUTTON_CIRCLE_RADIUS: number = 3; -export const BUTTON_TEXT_BASELINE: number = 163; -export const POWER_LED_ON: string = "#00FF00"; -export const POWER_LED_OFF: string = "#FFFFFF"; - -// Adapted from : https://github.com/microsoft/pxt/blob/master/pxtsim/simlib.ts -export function rgbToHsl( - rgb: [number, number, number] -): [number, number, number] { - const [r, g, b] = rgb; - const [r$, g$, b$] = [r / 255, g / 255, b / 255]; - const cMin = Math.min(r$, g$, b$); - const cMax = Math.max(r$, g$, b$); - const cDelta = cMax - cMin; - let h: number = 0, - s: number, - l: number; - const maxAndMin = cMax + cMin; - - // Luminosity - l = (maxAndMin / 2) * 100; - - if (cDelta === 0) { - s = 0; - h = 0; - } else { - // Hue - switch (cMax) { - case r$: - h = 60 * (((g$ - b$) / cDelta) % 6); - break; - case g$: - h = 60 * ((b$ - r$) / cDelta + 2); - break; - case b$: - h = 60 * ((r$ - g$) / cDelta + 4); - break; - } - - // Saturation - l > 50 - ? (s = 100 * (cDelta / (2 - maxAndMin))) - : (s = 100 * (cDelta / maxAndMin)); - } - - return [Math.floor(h), Math.floor(s), Math.floor(l)]; -} - -export const SVG_STYLE = ` - svg.sim { - box-sizing: border-box; - width: 100%; - height: 100%; - display: block; - } - svg.sim.grayscale { - -moz-filter: grayscale(1); - -webkit-filter: grayscale(1); - filter: grayscale(1); - } - .sim-button { - pointer-events: none; - } - - .sim-button-outer { - cursor: pointer; - } - .sim-button-outer:hover { - stroke-width: 1px; - stroke: orange !important; - } - .sim-button-nut { - fill:#704A4A; - pointer-events:none; - } - .sim-button-nut:hover { - stroke:1px solid #704A4A; - } - - .sim-pin-touch.touched:hover { - stroke:darkorange; - } - - .sim-led-back:hover { - stroke:#fff; - stroke-width:3px; - } - .sim-led:hover { - stroke:#ff7f7f; - stroke-width:3px; - } - - .sim-systemled { - fill:#333; - stroke:#555; - stroke-width: 1px; - } - - .sim-light-level-button { - stroke:#f1c40f; - stroke-width: 1px; - } - - .sim-pin-level-button { - stroke:darkorange; - stroke-width: 1px; - } - - .sim-sound-level-button { - stroke:#7f8c8d; - stroke-width: 1px; - } - - .sim-antenna { - stroke:#555; - stroke-width: 2px; - } - - .sim-text { - font-family:"Lucida Console", Monaco, monospace; - font-size:8px; - fill:#fff; - pointer-events: none; user-select: none; - } - .sim-text-outside{ - font-size:8px; - fill: var(--vscode-descriptionForeground); - } - .sim-text.small { - font-size:6px; - } - .sim-text.inverted { - fill:#000; - } - - .sim-text-pin { - font-family:"Lucida Console", Monaco, monospace; - font-size:5px; - fill:#fff; - pointer-events: none; - } - - .sim-thermometer { - stroke:#aaa; - stroke-width: 1px; - } - - #rgbledcircle:hover { - r:8px; - } - - #SWITCH_HOVER { - cursor: pointer; - } - .sim-slide-switch:hover #SWITCH_HOVER { - stroke:orange !important; - stroke-width: 1px; - } - - .sim-slide-switch-inner.on { - fill:#ff0000 !important; - } - - /* animations */ - .sim-theme-glow { - animation-name: sim-theme-glow-animation; - animation-timing-function: ease-in-out; - animation-direction: alternate; - animation-iteration-count: infinite; - animation-duration: 1.25s; - } - @keyframes sim-theme-glow-animation { - from { opacity: 1; } - to { opacity: 0.75; } - } - - .sim-flash { - animation-name: sim-flash-animation; - animation-duration: 0.1s; - } - - @keyframes sim-flash-animation { - from { fill: yellow; } - to { fill: default; } - } - - .sim-flash-stroke { - animation-name: sim-flash-stroke-animation; - animation-duration: 0.4s; - animation-timing-function: ease-in; - } - - @keyframes sim-flash-stroke-animation { - from { stroke: yellow; } - to { stroke: default; } - } - - - .sim-sound-stroke { - animation-name: sim-sound-stroke-animation; - animation-duration: 0.4s; - } - - @keyframes sim-sound-stroke-animation { - from { stroke: yellow; } - to { stroke: default; } - } - - /* wireframe */ - .sim-wireframe * { - fill: none; - stroke: black; - } - .sim-wireframe .sim-display, - .sim-wireframe .sim-led, - .sim-wireframe .sim-led-back, - .sim-wireframe .sim-head, - .sim-wireframe .sim-theme, - .sim-wireframe .sim-button-group, - .sim-wireframe .sim-button-label, - .sim-wireframe .sim-button, - .sim-wireframe .sim-text-pin - { - visibility: hidden; - } - .sim-wireframe .sim-label - { - stroke: none; - fill: #777; - } - .sim-wireframe .sim-board { - stroke-width: 2px; - } - *:focus { - outline: none; - } - - .sim-button-outer:focus, - .sim-slide-switch:focus, - .sim-thermometer:focus, - .sim-button-group:focus .sim-button-outer, - .sim-light-level-button:focus, - .sim-sound-level-button:focus { - stroke: #4D90FE; - stroke-width: 2px !important; - } - - .no-drag { - user-drag: none; - user-select: none; - -moz-user-select: none; - -webkit-user-drag: none; - -webkit-user-select: none; - -ms-user-select: none; - } - - .sim-PIN_A1-touch:hover, - .sim-PIN_A2-touch:hover, - .sim-PIN_A3-touch:hover, - .sim-PIN_A4-touch:hover, - .sim-PIN_A5-touch:hover, - .sim-PIN_A6-touch:hover, - .sim-PIN_A7-touch:hover{ - stroke:orange !important; - stroke-width:1px; - } - - .sim-PIN_A1-touch:focus, - .sim-PIN_A2-touch:focus, - .sim-PIN_A3-touch:focus, - .sim-PIN_A4-touch:focus, - .sim-PIN_A5-touch:focus, - .sim-PIN_A6-touch:focus, - .sim-PIN_A7-touch:focus{ - stroke:#4D90FE; - stroke-width:2px; - } - - .pin-pressed{ - stroke:orange !important; - stroke-width:1px; - } -`; diff --git a/src/view/components/cpx/Svg_utils.tsx b/src/view/components/cpx/Svg_utils.tsx deleted file mode 100644 index 92836b923..000000000 --- a/src/view/components/cpx/Svg_utils.tsx +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Adapted from : https://github.com/microsoft/pxt/blob/master/pxtsim/svg.ts - -// tslint:disable-next-line: no-namespace -namespace svg { - export function addClass(el: SVGElement, cls: string) { - if (el.classList) { - el.classList.add(cls); - } else if (el.className.baseVal.indexOf(cls) < 0) { - el.className.baseVal += " " + cls; - } - } - - export function removeClass(el: SVGElement, cls: string) { - if (el.classList) { - el.classList.remove(cls); - } else { - el.className.baseVal = el.className.baseVal - .replace(cls, "") - .replace(/\s{2,}/, " "); - } - } - - export function hydrate(el: SVGElement, props: any) { - for (const k in props) { - if (k == "title") { - svg.title(el, props[k]); - } else { - el.setAttributeNS(null, k, props[k]); - } - } - } - - export function createElement(name: string, props?: any): SVGElement { - const newElement = document.createElementNS( - "http://www.w3.org/2000/svg", - name - ); - if (props) { - svg.hydrate(newElement, props); - } - return newElement; - } - - export function child( - parent: Element, - name: string, - props?: any - ): SVGElement { - const childElement = svg.createElement(name, props); - parent.appendChild(childElement); - return childElement; - } - - export function fill(el: SVGElement, c: string) { - el.style.fill = c; - } - - export function filter(el: SVGElement, c: string) { - el.style.filter = c; - } - - export function fills(els: SVGElement[], c: string) { - els.forEach(el => (el.style.fill = c)); - } - - export function mkTitle(txt: string): SVGTitleElement { - const t = svg.createElement("title") as SVGTitleElement; - t.textContent = txt; - return t; - } - - export function title(el: SVGElement, txt: string): SVGTitleElement { - const t = mkTitle(txt); - el.appendChild(t); - return t; - } - - export function setLed( - ledStatus: boolean, - offColor: string, - onColor: string, - ledElement: SVGElement | null, - gradientStopElement: SVGStopElement | null - ) { - if (ledStatus) { - ledElement?.setAttribute("fill", onColor); - gradientStopElement?.setAttribute("stop-opacity", "1"); - } else { - ledElement?.setAttribute("fill", offColor); - gradientStopElement?.setAttribute("stop-opacity", "0"); - } - } -} - -export default svg; diff --git a/src/view/components/cpx/__snapshots__/Cpx.spec.tsx.snap b/src/view/components/cpx/__snapshots__/Cpx.spec.tsx.snap deleted file mode 100644 index 960f9b501..000000000 --- a/src/view/components/cpx/__snapshots__/Cpx.spec.tsx.snap +++ /dev/null @@ -1,4666 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`CPX component should render correctly 1`] = ` -Array [ -
-
- The simulator will run the .py file you have focused on. -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
-
, -
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
, -] -`; diff --git a/src/view/components/microbit/Microbit.spec.tsx b/src/view/components/microbit/Microbit.spec.tsx deleted file mode 100644 index e948a1988..000000000 --- a/src/view/components/microbit/Microbit.spec.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { Microbit } from "./Microbit"; - -describe("Microbit component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); diff --git a/src/view/components/microbit/Microbit.tsx b/src/view/components/microbit/Microbit.tsx deleted file mode 100644 index b85565e67..000000000 --- a/src/view/components/microbit/Microbit.tsx +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { MICROBIT_TOOLBAR_ICON_ID } from "../../components/toolbar/SensorModalUtils"; -import { - GESTURES_MICROBIT, - SENSOR_LIST, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, -} from "../../constants"; -import "../../styles/Simulator.css"; -import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; -import { sendMessage } from "../../utils/MessageUtils"; -import ToolBar from "../toolbar/ToolBar"; -import { MicrobitSimulator } from "./MicrobitSimulator"; - -// Component grouping the functionality for micro:bit functionalities -interface IState { - sensors: { [key: string]: number }; - currentSelectedGesture?: string; -} -const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - }, - currentSelectedGesture: GESTURES_MICROBIT[0], -}; - -export class Microbit extends React.Component<{}, IState> { - state = DEFAULT_STATE; - - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; - - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; - updateGesture = (event: React.ChangeEvent) => { - this.setState({ currentSelectedGesture: event.target.value }); - }; - sendGesture = (isActive: boolean) => { - if (this.state.currentSelectedGesture) { - if (isActive) { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: this.state.currentSelectedGesture, - }); - } else { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: "", - }); - } - } - }; -} - -const MICROBIT_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, - }, - { - image: TOOLBAR_SVG.RED_LED_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LEDS, - }, - { - image: TOOLBAR_SVG.TEMPERATURE_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, - }, - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - }, - { - image: TOOLBAR_SVG.GESTURE_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.GESTURE, - }, - { - image: TOOLBAR_SVG.GPIO_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.GPIO, - }, - { - image: TOOLBAR_SVG.COMPASS_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.COMPASS, - }, - { - image: TOOLBAR_SVG.SPEAKER_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.SOUND, - }, - { - image: TOOLBAR_SVG.WIRELESS_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.WIRELESS, - }, -]; diff --git a/src/view/components/microbit/MicrobitImage.tsx b/src/view/components/microbit/MicrobitImage.tsx deleted file mode 100644 index a216dceef..000000000 --- a/src/view/components/microbit/MicrobitImage.tsx +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { BUTTON_CLASSNAME, VIEW_STATE } from "../../constants"; -import CONSTANTS, { BUTTON_STYLING_CLASSES } from "../../constants"; -import { ViewStateContext } from "../../context"; -import { IRefObject, MicrobitSvg } from "./Microbit_svg"; - -interface EventTriggers { - onMouseUp: (event: Event, buttonKey: string) => void; - onMouseDown: (event: Event, buttonKey: string) => void; - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; -} -interface IProps { - eventTriggers: EventTriggers; - leds: number[][]; -} - -export enum BUTTONS_KEYS { - BTN_A = "BTN_A", - BTN_B = "BTN_B", - BTN_AB = "BTN_AB", -} -// Displays the SVG and call necessary svg modification. -export class MicrobitImage extends React.Component { - private svgRef: React.RefObject = React.createRef(); - constructor(props: IProps) { - super(props); - } - componentDidMount() { - const svgElement = this.svgRef.current; - if (svgElement) { - updateAllLeds(this.props.leds, svgElement.getLeds()); - setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); - this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); - } - } - componentDidUpdate() { - if (this.svgRef.current) { - updateAllLeds(this.props.leds, this.svgRef.current.getLeds()); - if (this.context === VIEW_STATE.PAUSE) { - disableAllButtons(this.svgRef.current.getButtons()); - } else if (this.context === VIEW_STATE.RUNNING) { - setupAllButtons( - this.props.eventTriggers, - this.svgRef.current.getButtons() - ); - } - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.eventTriggers.onKeyEvent(event, true, event.key); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.eventTriggers.onKeyEvent(event, false, event.key); - }; - render() { - return ; - } - public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { - const button = this.svgRef.current?.getButtons()[key].current; - if (button) { - button.focus(); - if (isActive) { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.KEYPRESSED - ); - } else { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.DEFAULT - ); - } - button.setAttribute("pressed", `${isActive}`); - button.setAttribute("aria-pressed", `${isActive}`); - } - } -} - -MicrobitImage.contextType = ViewStateContext; -const setupButton = ( - buttonElement: SVGRectElement, - eventTriggers: EventTriggers, - key: string -) => { - buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); - - buttonElement.onmousedown = e => { - buttonElement.focus(); - eventTriggers.onMouseDown(e, key); - }; - buttonElement.onmouseup = e => { - eventTriggers.onMouseUp(e, key); - }; - - buttonElement.onkeydown = e => { - // ensure that the keydown is enter, - // or else it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - eventTriggers.onKeyEvent(e, true, key); - } - }; - buttonElement.onkeyup = e => { - eventTriggers.onKeyEvent(e, false, key); - }; -}; -const setupAllButtons = ( - eventTriggers: EventTriggers, - buttonRefs: IRefObject -) => { - for (const [key, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - setupButton(ref.current, eventTriggers, key); - } - } -}; -const disableAllButtons = (buttonRefs: IRefObject) => { - for (const [, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - // to implement - ref.current.onmousedown = null; - ref.current.onmouseup = null; - ref.current.onkeydown = null; - ref.current.onkeyup = null; - ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); - } - } -}; -const updateAllLeds = ( - leds: number[][], - ledRefs: Array>> -) => { - for (let j = 0; j < leds.length; j++) { - for (let i = 0; i < leds[0].length; i++) { - const ledElement = ledRefs[j][i].current; - if (ledElement) { - setupLed(ledElement, leds[i][j]); - } - } - } -}; -const setupLed = (ledElement: SVGRectElement, brightness: number) => { - ledElement.style.opacity = (brightness / 10).toString(); -}; diff --git a/src/view/components/microbit/MicrobitSimulator.tsx b/src/view/components/microbit/MicrobitSimulator.tsx deleted file mode 100644 index d3507710c..000000000 --- a/src/view/components/microbit/MicrobitSimulator.tsx +++ /dev/null @@ -1,259 +0,0 @@ -import * as React from "react"; -import { - AB_BUTTONS_KEYS, - CONSTANTS, - DEVICE_LIST_KEY, - VIEW_STATE, - WEBVIEW_MESSAGES, -} from "../../constants"; -import { ViewStateContext } from "../../context"; -import PlayLogo from "../../svgs/play_svg"; -import StopLogo from "../../svgs/stop_svg"; -import { sendMessage } from "../../utils/MessageUtils"; -import ActionBar from "../simulator/ActionBar"; -import { BUTTONS_KEYS, MicrobitImage } from "./MicrobitImage"; - -const DEFAULT_MICROBIT_STATE: IMicrobitState = { - leds: [ - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - ], - buttons: { button_a: false, button_b: false }, -}; - -interface IState { - active_editors: string[]; - running_file?: string; - currently_selected_file: string; - play_button: boolean; - selected_file: string; - microbit: IMicrobitState; - sendGesture?: (isActive: boolean) => void; -} - -interface IMicrobitState { - leds: number[][]; - buttons: { button_a: boolean; button_b: boolean }; -} -export class MicrobitSimulator extends React.Component { - private imageRef: React.RefObject = React.createRef(); - constructor() { - super({}); - this.state = { - microbit: DEFAULT_MICROBIT_STATE, - play_button: false, - selected_file: "", - active_editors: [], - running_file: undefined, - currently_selected_file: "", - }; - this.onKeyEvent = this.onKeyEvent.bind(this); - } - handleMessage = (event: any): void => { - const message = event.data; - - if (message.active_device !== DEVICE_LIST_KEY.MICROBIT) { - return; - } - - switch (message.command) { - case "reset-state": - this.setState({ - microbit: DEFAULT_MICROBIT_STATE, - play_button: false, - }); - break; - case "set-state": - this.setState({ - microbit: { - ...this.state.microbit, - leds: message.state.leds, - }, - }); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - }); - break; - case "visible-editors": - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } - - break; - } - }; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } - - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
-
- -
- -
- ); - } - - protected togglePlayClick = () => { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - }; - - protected refreshSimulatorClick = () => { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - }; - protected handleButtonClick = (key: string, isActive: boolean) => { - let newButtonState = this.state.microbit.buttons; - switch (key) { - case AB_BUTTONS_KEYS.BTN_A: - newButtonState.button_a = isActive; - break; - case AB_BUTTONS_KEYS.BTN_B: - newButtonState.button_b = isActive; - break; - case AB_BUTTONS_KEYS.BTN_AB: - newButtonState = { - button_a: isActive, - button_b: isActive, - }; - break; - } - sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); - this.setState({ - microbit: { - ...this.state.microbit, - buttons: newButtonState, - }, - }); - }; - - protected onMouseUp = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, false); - }; - - protected onMouseDown = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, true); - }; - - protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { - event.stopPropagation(); - if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(key, active); - if (key === BUTTONS_KEYS.BTN_A) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if (key === BUTTONS_KEYS.BTN_B) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if (key === BUTTONS_KEYS.BTN_AB) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); - - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); - - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); - - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } - } -} -MicrobitSimulator.contextType = ViewStateContext; diff --git a/src/view/components/microbit/Microbit_svg.tsx b/src/view/components/microbit/Microbit_svg.tsx deleted file mode 100644 index c3d95fdbb..000000000 --- a/src/view/components/microbit/Microbit_svg.tsx +++ /dev/null @@ -1,1890 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Adapted from : https://makecode.microbit.org/#editor - -import * as React from "react"; -import "../../styles/SimulatorSvg.css"; - -export interface IRefObject { - [key: string]: React.RefObject; -} -/* tslint:disable */ - -const N_LED_COLUMN = 5; -const N_LED_ROW = 5; -export class MicrobitSvg extends React.Component { - constructor(props: Readonly<{}>) { - super(props); - for (let j = 0; j < N_LED_ROW; j++) { - const led_row: React.RefObject[] = []; - for (let i = 0; i < N_LED_COLUMN; i++) { - led_row.push(React.createRef()); - } - this.ledRefs.push(led_row); - } - } - private svgRef: React.RefObject = React.createRef(); - - private buttonRefs: IRefObject = { - BTN_A: React.createRef(), - BTN_B: React.createRef(), - BTN_AB: React.createRef(), - }; - - private ledRefs: React.RefObject[][] = []; - public getSvgRef(): React.RefObject { - return this.svgRef; - } - public getButtons(): IRefObject { - return this.buttonRefs; - } - public getLeds(): React.RefObject[][] { - return this.ledRefs; - } - - render() { - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (0,0) - - - - (1,0) - - - - (2,0) - - - - (3,0) - - - - (4,0) - - - - (0,1) - - - - (1,1) - - - - (2,1) - - - - (3,1) - - - - (4,1) - - - - (0,2) - - - - (1,2) - - - - (2,2) - - - - (3,2) - - - - (4,2) - - - - (0,3) - - - - (1,3) - - - - (2,3) - - - - (3,3) - - - - (4,3) - - - - (0,4) - - - - (1,4) - - - - (2,4) - - - - (3,4) - - - - (4,4) - - - - - - - - - - P0, ANALOG IN - - - P1, ANALOG IN - - - P2, ANALOG IN - - - P3, ANALOG IN, LED Col 1 - - - P4, ANALOG IN, LED Col 2 - - - P5, BUTTON A - - - P6, LED Col 9 - - - P7, LED Col 8 - - - P8 - - - P9, LED Col 7 - - - P10, ANALOG IN, LED Col 3 - - - P11, BUTTON B - - - P12, RESERVED ACCESSIBILITY - - - P13, SPI - SCK - - - P14, SPI - MISO - - - P15, SPI - MOSI - - - P16, SPI - Chip Select - - - P17, +3v3 - - - P18, +3v3 - - - P19, I2C - SCL - - - P20, I2C - SDA - - - GND - - - GND - - - +3v3 - - - GND - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - - - - - - - - - - - - - - -
- ); - } -} diff --git a/src/view/components/microbit/__snapshots__/Microbit.spec.tsx.snap b/src/view/components/microbit/__snapshots__/Microbit.spec.tsx.snap deleted file mode 100644 index 9e167bbca..000000000 --- a/src/view/components/microbit/__snapshots__/Microbit.spec.tsx.snap +++ /dev/null @@ -1,3238 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Microbit component should render correctly 1`] = ` -Array [ -
-
- The simulator will run the .py file you have focused on. -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (0,0) - - - - - - (1,0) - - - - - - (2,0) - - - - - - (3,0) - - - - - - (4,0) - - - - - - (0,1) - - - - - - (1,1) - - - - - - (2,1) - - - - - - (3,1) - - - - - - (4,1) - - - - - - (0,2) - - - - - - (1,2) - - - - - - (2,2) - - - - - - (3,2) - - - - - - (4,2) - - - - - - (0,3) - - - - - - (1,3) - - - - - - (2,3) - - - - - - (3,3) - - - - - - (4,3) - - - - - - (0,4) - - - - - - (1,4) - - - - - - (2,4) - - - - - - (3,4) - - - - - - (4,4) - - - - - - - - - - - - P0, ANALOG IN - - - - - P1, ANALOG IN - - - - - P2, ANALOG IN - - - - - P3, ANALOG IN, LED Col 1 - - - - - P4, ANALOG IN, LED Col 2 - - - - - P5, BUTTON A - - - - - P6, LED Col 9 - - - - - P7, LED Col 8 - - - - - P8 - - - - - P9, LED Col 7 - - - - - P10, ANALOG IN, LED Col 3 - - - - - P11, BUTTON B - - - - - P12, RESERVED ACCESSIBILITY - - - - - P13, SPI - SCK - - - - - P14, SPI - MISO - - - - - P15, SPI - MOSI - - - - - P16, SPI - Chip Select - - - - - P17, +3v3 - - - - - P18, +3v3 - - - - - P19, I2C - SCL - - - - - P20, I2C - SDA - - - - - GND - - - - - GND - - - - - +3v3 - - - - - GND - - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
-
, -
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
, -] -`; diff --git a/src/view/components/simulator/ActionBar.tsx b/src/view/components/simulator/ActionBar.tsx deleted file mode 100644 index b760817b8..000000000 --- a/src/view/components/simulator/ActionBar.tsx +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { CONSTANTS } from "../../constants"; -import RefreshLogo from "../../svgs/refresh_svg"; -import Button from "../Button"; - -interface IProps { - onTogglePlay: (event: React.MouseEvent) => void; - onToggleRefresh: (event: React.MouseEvent) => void; - playStopImage: JSX.Element; - playStopLabel: string; -} - -// Component including the actions done on the Simulator (play/stop, refresh) - -class ActionBar extends React.Component { - public render() { - const { - onTogglePlay, - onToggleRefresh, - playStopImage, - playStopLabel, - } = this.props; - return ( -
-
- ); - } -} -export default ActionBar; diff --git a/src/view/components/toolbar/GenericSliderComponent.tsx b/src/view/components/toolbar/GenericSliderComponent.tsx deleted file mode 100644 index 273896621..000000000 --- a/src/view/components/toolbar/GenericSliderComponent.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import * as React from "react"; -import { SENSOR_LIST } from "../../constants"; -import { ISensorProps, ISliderProps } from "../../viewUtils"; -import InputSlider from "./InputSlider"; - -interface IProps { - axisProperties: ISensorProps; - axisValues: { - // key is accessed with axisLabel - [key: string]: number; - }; - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void; -} -export const GenericSliderComponent: React.FC = props => { - return ( -
- {props.axisProperties.sliderProps.map( - (sliderProperties: ISliderProps, index: number) => { - return ( - - -
-
- ); - } - )} -
- ); -}; diff --git a/src/view/components/toolbar/Gesture.tsx b/src/view/components/toolbar/Gesture.tsx deleted file mode 100644 index a89a3bd5c..000000000 --- a/src/view/components/toolbar/Gesture.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import * as React from "react"; -import { CONSTANTS } from "../../constants"; -import { Dropdown } from "../Dropdown"; -import SensorButton from "./SensorButton"; - -const GESTURE_BUTTON_MESSAGE = "Send Gesture"; -interface IProps { - gestures: string[]; - onSelectGestures?: (event: React.ChangeEvent) => void; - onSendGesture?: (isActive: boolean) => void; -} -export class Gesture extends React.Component { - private sensorButtonRef: React.RefObject = React.createRef(); - render() { - return ( -
- - { - if (this.props.onSendGesture) { - this.props.onSendGesture(true); - } - }} - onMouseUp={() => { - if (this.props.onSendGesture) { - this.props.onSendGesture(false); - } - }} - onKeyDown={this.handleOnKeyDown} - onKeyUp={this.handleOnKeyUp} - type="gesture" - /> -
- ); - } - private handleOnKeyDown = (e: React.KeyboardEvent) => { - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - this.sensorButtonRef!.current!.setButtonClass(true); - if (this.props.onSendGesture) { - this.props.onSendGesture(true); - } - } - }; - - private handleOnKeyUp = ( - e: React.KeyboardEvent, - onSendGesture?: (isActive: boolean) => void - ) => { - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - this.sensorButtonRef!.current!.setButtonClass(false); - - if (this.props.onSendGesture) { - this.props.onSendGesture(false); - } - } - }; -} diff --git a/src/view/components/toolbar/InputSlider.tsx b/src/view/components/toolbar/InputSlider.tsx deleted file mode 100644 index adfbcef60..000000000 --- a/src/view/components/toolbar/InputSlider.tsx +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { SENSOR_LIST, VIEW_STATE, WEBVIEW_MESSAGES } from "../../constants"; -import { ViewStateContext } from "../../context"; -import "../../styles/InputSlider.css"; -import { sendMessage } from "../../utils/MessageUtils"; -import { ISliderProps } from "../../viewUtils"; - -class InputSlider extends React.Component { - constructor(props: ISliderProps) { - super(props); - this.state = { - value: this.props.value, - }; - - this.handleOnChange = this.handleOnChange.bind(this); - this.validateRange = this.validateRange.bind(this); - } - - render() { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; - - const nbDecimals = - this.props.step.toString().split(".")[1]?.length || 0; - return ( -
- {this.props.axisLabel} - 0 ? 1 : 0}}[0-9]{0,${nbDecimals}}$`} - onKeyUp={this.handleOnChange} - style={{ width: this.getMaximumBoxWidth() + "ch" }} - aria-label={`${this.props.type} sensor input ${this.props.axisLabel}`} - /> - - - {this.props.minValue} - {this.props.maxValue} - - - - {this.props.minLabel} - {this.props.maxLabel} - - -
- ); - } - - private getMaximumBoxWidth = () => { - return ( - Math.max( - this.props.minValue.toString().length, - this.props.maxValue.toString().length - ) + 2 - ); - }; - - private handleOnChange = (event: any) => { - const validatedValue = this.validateRange(this.updateValue(event)); - const newSensorState = this.writeMessage(validatedValue); - if (newSensorState) { - sendMessage(WEBVIEW_MESSAGES.SENSOR_CHANGED, newSensorState); - } - }; - - private writeMessage = (valueTowrite: number) => { - let value = valueTowrite; - if (value > this.props.maxValue || value < this.props.minValue) { - value = parseInt(this.state.value, 10); - } - - return this.props.type && this.state.value !== undefined - ? { [this.props.type]: value } - : undefined; - }; - - private updateValue = (event: any) => { - const newValue = event.target.validity.valid - ? event.target.value - : this.state.value; - if (this.props.onUpdateValue) { - this.props.onUpdateValue(this.props.type as SENSOR_LIST, newValue); - } - return newValue; - }; - - private sendTelemetry = () => { - sendMessage(WEBVIEW_MESSAGES.SLIDER_TELEMETRY, this.props.type); - }; - - private validateRange = (valueString: string) => { - let valueInt = parseFloat(valueString); - if (valueInt < this.props.minValue) { - valueInt = this.props.minValue; - this.setState({ value: valueInt }); - } else if (valueInt > this.props.maxValue) { - valueInt = this.props.maxValue; - this.setState({ value: valueInt }); - } - return valueInt; - }; -} -InputSlider.contextType = ViewStateContext; - -export default InputSlider; diff --git a/src/view/components/toolbar/SensorButton.tsx b/src/view/components/toolbar/SensorButton.tsx deleted file mode 100644 index b50759bd4..000000000 --- a/src/view/components/toolbar/SensorButton.tsx +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { VIEW_STATE } from "../../constants"; -import { ViewStateContext } from "../../context"; -import "../../styles/SensorButton.css"; -import { ISensorButtonProps } from "../../viewUtils"; - -class SensorButton extends React.Component { - private buttonRef: React.RefObject = React.createRef(); - - public setButtonClass = (isActive: boolean) => { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; - - if (isActive && !isInputDisabled) { - this.buttonRef.current?.setAttribute( - "class", - "sensor-button active-button" - ); - } else if (this.buttonRef.current) { - this.buttonRef!.current!.setAttribute("class", "sensor-button"); - } - }; - render() { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; - - return ( - - ); - } -} -SensorButton.contextType = ViewStateContext; -export default SensorButton; diff --git a/src/view/components/toolbar/SensorModalUtils.tsx b/src/view/components/toolbar/SensorModalUtils.tsx deleted file mode 100644 index c7ea53f85..000000000 --- a/src/view/components/toolbar/SensorModalUtils.tsx +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. -import * as React from "react"; -import { SENSOR_LIST } from "../../constants"; -import { ARROW_RIGHT_SVG } from "../../svgs/arrow_right_svg"; -import * as CLUE_MODAL from "./clue/ClueModalContent"; -import * as CPX_MODAL from "./cpx/CpxModalContent"; -import * as MICROBIT_MODAL from "./microbit/MicrobitModalContent"; - -export const TRY_IT_MAKE_CODE = ( - -); - -export const FEATURE_REQUEST_ON_GITHUB = ( - -); - -export const TOOLBAR_ICON_LABEL = { - GPIO: "GPIO", - IR: "IR", - LEFT_EDGE: "left-edge", - LIGHT: "Light sensor", - MOTION: "Motion Sensor", - NEO_PIXEL: "Neo Pixels", - PUSH_BUTTON: "Push Button", - RED_LED: "Red LED", - RIGHT_EDGE: "right-edge", - SOUND: "Sound Sensor", - SPEAKER: "Speaker", - SWITCH: "Switch", - TAG_INPUT: "Tag Input", - TAG_OUTPUT: "Tag Output", - TEMPERATURE: "Temperature Sensor", - WIRELESS: "Bluetooth and Radio", -}; -export const CPX_TOOLBAR_ICON_ID = { - GPIO: "toolbar-gpio", - IR: "toolbar-ir-sensor", - LEFT_EDGE: "left-edge", - LIGHT: "toolbar-light-sensor", - MOTION: "toolbar-motion-sensor", - NEO_PIXEL: "toolbar-neo-pixels", - PUSH_BUTTON: "toolbar-a-b-push", - RED_LED: "toolbar-red-led", - RIGHT_EDGE: "right-edge", - SOUND: "toolbar-sound-sensor", - SPEAKER: "toolbar-speaker", - SWITCH: "toolbar-slider-switch", - TEMPERATURE: "toolbar-temperature-sensor", -}; - -export const MICROBIT_TOOLBAR_ICON_ID = { - TEMPERATURE: "toolbar-microbit-temperature-sensor", - LIGHT: "toolbar-microbit-light-sensor", - ACCELEROMETER: "toolbar-accelerometer-sensor", - LEDS: "toolbar-microbit-led", - PUSH_BUTTON: "toolbar-microbit-a-b-push", - GPIO: "toolbar-gpio", - SOUND: "toolbar-microbit-sound", - WIRELESS: "toolbar-microbit-wireless", - GESTURE: "toolbar-microbit-gesture-sensor", - COMPASS: "toolbar-microbit-compass-sensor", -}; - -export const CLUE_TOOLBAR_ICON_ID = { - TEMPERATURE: "toolbar-clue-temperature-sensor", - LIGHT: "toolbar-clue-light-sensor", - ACCELEROMETER: "toolbar-clue-accelerometer-sensor", - LEDS: "toolbar-clue-led", - PUSH_BUTTON: "toolbar-clue-a-b-push", - GPIO: "toolbar-clue-gpio", - SPEAKER: "toolbar-speaker", - SOUND: "toolbar-clue-sound-sensor", - PRESSURE: "toolbar-clue-pressure-sensor", - HUMIDITY: "toolbar-clue-humidity-sensor", - GESTURE: "toolbar-clue-gesture-sensor", - PROXIMITY: "toolbar-clue-proximity-sensor", - BLUETOOTH: "toolbar-clue-bluetooth", - MAGNETOSCOPE: "toolbar-clue-magnet-sensor", - GYROSCOPE: "toolbar-clue-gyroscope-sensor", -}; - -export interface IModalContent { - components: any; - descriptionText: string; - descriptionTitle: string; - id: string; - tagInput: any; - tagOutput: any; - tryItDescription: string; -} - -export const DEFAULT_MODAL_CONTENT: IModalContent = { - descriptionTitle: "default", - tagInput: undefined, - tagOutput: undefined, - descriptionText: "none", - tryItDescription: "none", - components: undefined, - id: "none", -}; - -export const LABEL_TO_MODAL_CONTENT_CONSTRUCTOR = new Map([ - [CPX_TOOLBAR_ICON_ID.GPIO, CPX_MODAL.GPIO_CONTENT], - [CPX_TOOLBAR_ICON_ID.IR, CPX_MODAL.IR_CONTENT], - [CPX_TOOLBAR_ICON_ID.LIGHT, CPX_MODAL.LIGHT_CONTENT], - [CPX_TOOLBAR_ICON_ID.MOTION, CPX_MODAL.MOTION_CONTENT], - [CPX_TOOLBAR_ICON_ID.NEO_PIXEL, CPX_MODAL.NEOP_CONTENT], - [CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, CPX_MODAL.PUSHB_CONTENT], - [CPX_TOOLBAR_ICON_ID.RED_LED, CPX_MODAL.RED_LED_CONTENT], - [CPX_TOOLBAR_ICON_ID.SOUND, CPX_MODAL.SOUND_CONTENT], - [CPX_TOOLBAR_ICON_ID.SPEAKER, CPX_MODAL.SPEAKER_CONTENT], - [CPX_TOOLBAR_ICON_ID.SWITCH, CPX_MODAL.SWITCH_CONTENT], - [CPX_TOOLBAR_ICON_ID.TEMPERATURE, CPX_MODAL.TEMPERATURE_CONTENT], - [ - MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - MICROBIT_MODAL.ACCELEROMETER_CONTENT, - ], - [MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, MICROBIT_MODAL.TEMPERATURE_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.LIGHT, MICROBIT_MODAL.LIGHT_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.LEDS, MICROBIT_MODAL.LED_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, MICROBIT_MODAL.BUTTON_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.GPIO, MICROBIT_MODAL.GPIO_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.SOUND, MICROBIT_MODAL.SOUND_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.WIRELESS, MICROBIT_MODAL.WIRELESS_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], - [CLUE_TOOLBAR_ICON_ID.TEMPERATURE, CLUE_MODAL.TEMPERATURE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, CLUE_MODAL.BUTTON_CONTENT], - [CLUE_TOOLBAR_ICON_ID.GPIO, CLUE_MODAL.GPIO_CONTENT], - [CLUE_TOOLBAR_ICON_ID.LIGHT, CLUE_MODAL.LIGHT_CONTENT], - [CLUE_TOOLBAR_ICON_ID.LEDS, CLUE_MODAL.LED_CONTENT], - [CLUE_TOOLBAR_ICON_ID.SOUND, CLUE_MODAL.SOUND_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PRESSURE, CLUE_MODAL.PRESSURE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.HUMIDITY, CLUE_MODAL.HUMIDITY_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PROXIMITY, CLUE_MODAL.PROXIMITY_CONTENT], - [CLUE_TOOLBAR_ICON_ID.BLUETOOTH, CLUE_MODAL.BLUETOOTH_CONTENT], - [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.SPEAKER, CLUE_MODAL.SPEAKER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.GYROSCOPE, CLUE_MODAL.GYROSCOPE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, CLUE_MODAL.MAGNETOSCOPE_CONTENT], -]); - -export const getModalContent = ( - label: string, - onUpdateValue: (onUpdateValue: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number }, - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void -) => { - if (label === CLUE_TOOLBAR_ICON_ID.GESTURE) { - return CLUE_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); - } else if (label === MICROBIT_TOOLBAR_ICON_ID.GESTURE) { - return MICROBIT_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); - } - const modalContentConstructor = LABEL_TO_MODAL_CONTENT_CONSTRUCTOR.get( - label - ); - if (modalContentConstructor) { - return modalContentConstructor(onUpdateValue, sensorValues); - } else { - return; - } -}; diff --git a/src/view/components/toolbar/ToolBar.tsx b/src/view/components/toolbar/ToolBar.tsx deleted file mode 100644 index a2a3ee1a2..000000000 --- a/src/view/components/toolbar/ToolBar.tsx +++ /dev/null @@ -1,221 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. -import { initializeIcons } from "@uifabric/icons"; -import { Callout, TooltipHost } from "office-ui-fabric-react"; -import { IconButton } from "office-ui-fabric-react"; -import * as React from "react"; -import { - FormattedMessage, - injectIntl, - WrappedComponentProps, -} from "react-intl"; -import { SENSOR_LIST } from "../../constants"; -import "../../styles/ToolBar.css"; -import Button from "../Button"; -import { - DEFAULT_MODAL_CONTENT, - getModalContent, - IModalContent, -} from "./SensorModalUtils"; - -interface IToolbarState { - currentOpenedId: string; - showModal: boolean; - isDescriptionVisible: boolean; -} - -interface IProps extends WrappedComponentProps { - buttonList: Array<{ - label: any; - image: any; - }>; - onUpdateSensor: (sensor: SENSOR_LIST, value: number) => void; - sensorValues: { [key: string]: number }; - onSelectGesture?: (event: React.ChangeEvent) => void; - sendGesture?: (isActive: boolean) => void; -} - -class ToolBar extends React.Component { - private readonly TOOLBAR_BUTTON_WIDTH: number = 32; - - constructor(props: IProps) { - super(props); - initializeIcons(); - this.state = { - currentOpenedId: "", - isDescriptionVisible: false, - showModal: false, - }; - } - - public render() { - const { buttonList } = this.props; - return ( -
-
-
- {buttonList.map( - (currrentButton: any, index: number) => { - return ( - ( - - ), - }} - key={index} - > -
- {this.getIconModal()} -
-
- ); - } - - private handleOnClick = ( - event: React.MouseEvent, - label: string - ) => { - if ( - !this.state.showModal && - this.state.currentOpenedId === "" && - this.state.currentOpenedId !== label - ) { - this.openModal(label); - } else { - this.closeCurrentModal(); - if (this.state.currentOpenedId !== label) { - this.openModal(label); - } - } - }; - - private changePressedState(id: string, pressed: boolean) { - const elt = window.document.getElementById(`${id}-button`); - if (elt) { - pressed - ? elt.classList.add("button-pressed") - : elt.classList.remove("button-pressed"); - } - } - private closeCurrentModal = () => { - this.changePressedState(this.state.currentOpenedId, false); - this.setState({ - currentOpenedId: "", - showModal: false, - }); - }; - - private openModal = (label: string) => { - this.setState({ - currentOpenedId: label, - showModal: true, - }); - this.changePressedState(label, true); - }; - - private onShowDescriptionClicked = (): void => { - this.setState({ - isDescriptionVisible: !this.state.isDescriptionVisible, - }); - }; - - private onDescriptionDismiss = (): void => { - this.setState({ - isDescriptionVisible: false, - }); - }; - - private getIconModal() { - if ( - !this.state.showModal || - !getModalContent( - this.state.currentOpenedId, - this.props.onUpdateSensor, - this.props.sensorValues, - this.props.onSelectGesture, - this.props.sendGesture - ) - ) { - return null; - } - - const content = getModalContent( - this.state.currentOpenedId, - this.props.onUpdateSensor, - this.props.sensorValues, - this.props.onSelectGesture, - this.props.sendGesture - ) as IModalContent; - - const components = content - ? content.components - : DEFAULT_MODAL_CONTENT.components; - - return ( -
-
- - - {content.tagInput} - {content.tagOutput} - - -
-
- {this.state.isDescriptionVisible && ( - -
- -
-
- )} -
-
- - - -
- -
{components}
-
-
- ); - } -} - -export default injectIntl(ToolBar); diff --git a/src/view/components/toolbar/Toolbar.spec.tsx b/src/view/components/toolbar/Toolbar.spec.tsx deleted file mode 100644 index bd122082e..000000000 --- a/src/view/components/toolbar/Toolbar.spec.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { SENSOR_LIST } from "../../constants"; -import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; -import { MICROBIT_TOOLBAR_ICON_ID } from "./SensorModalUtils"; -import Toolbar from "./ToolBar"; - -const MOCK_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - }, -]; -const mockUpdateSensors = () => { - return; -}; -const mockInitialValues = { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, -}; -describe("Toolbar component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); diff --git a/src/view/components/toolbar/__snapshots__/Toolbar.spec.tsx.snap b/src/view/components/toolbar/__snapshots__/Toolbar.spec.tsx.snap deleted file mode 100644 index de9a7a42d..000000000 --- a/src/view/components/toolbar/__snapshots__/Toolbar.spec.tsx.snap +++ /dev/null @@ -1,143 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Toolbar component should render correctly 1`] = ` -
-
-
-
- -
-
- -
-
-
-
-`; diff --git a/src/view/components/toolbar/clue/ClueModalContent.tsx b/src/view/components/toolbar/clue/ClueModalContent.tsx deleted file mode 100644 index 250e61388..000000000 --- a/src/view/components/toolbar/clue/ClueModalContent.tsx +++ /dev/null @@ -1,318 +0,0 @@ -import * as React from "react"; -import { GESTURES_CLUE, SENSOR_LIST } from "../../../constants"; -import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; -import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; -import { GenericSliderComponent } from "../GenericSliderComponent"; -import { Gesture } from "../Gesture"; -import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; -import * as SENSOR_PROPERTIES from "./ClueSensorProperties"; - -export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-clue-temperature-sensor.description", - descriptionTitle: "toolbar-clue-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-temperature-sensor.tryItDescription", - }; -}; - -export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-gpio.description", - tryItDescription: "toolbar-clue-gpio.tryItDescription", - components: undefined, - id: "GPIO", - }; -}; - -export const ACCELEROMETER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const accelerometerSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-accelerometer-sensor.description", - descriptionTitle: "toolbar-clue-accelerometer-sensor.title", - id: "accelerometer", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-accelerometer-sensor.tryItDescription", - }; -}; -export const GYROSCOPE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const gyroSensorValues = { - X: sensorValues[SENSOR_LIST.GYRO_X], - Y: sensorValues[SENSOR_LIST.GYRO_Y], - Z: sensorValues[SENSOR_LIST.GYRO_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-gyroscope-sensor.description", - descriptionTitle: "toolbar-clue-gyroscope-sensor.title", - id: "gyroscope", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-gyroscope-sensor.tryItDescription", - }; -}; -export const MAGNETOSCOPE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const magnetSensorValues = { - X: sensorValues[SENSOR_LIST.MAGNET_X], - Y: sensorValues[SENSOR_LIST.MAGNET_Y], - Z: sensorValues[SENSOR_LIST.MAGNET_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-magnet-sensor.description", - descriptionTitle: "toolbar-clue-magnet-sensor.title", - id: "magnetoscope", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-magnet-sensor.tryItDescription", - }; -}; - -export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const lightSensorValues = { - R: sensorValues[SENSOR_LIST.LIGHT_R], - G: sensorValues[SENSOR_LIST.LIGHT_G], - B: sensorValues[SENSOR_LIST.LIGHT_B], - C: sensorValues[SENSOR_LIST.LIGHT_C], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-light-sensor.description", - descriptionTitle: "toolbar-clue-light-sensor.title", - id: "light_sensor", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-light-sensor.tryItDescription", - }; -}; - -export const HUMIDITY_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const humiditySensorValues = { - H: sensorValues[SENSOR_LIST.HUMIDITY], - }; - return { - descriptionTitle: "toolbar-clue-humidity-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-humidity-sensor.description", - tryItDescription: "toolbar-clue-humidity-sensor.tryItDescription", - components: [ - , - ], - id: "humidity_sensor", - }; -}; - -export const GESTURE_CONTENT = ( - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-gesture-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-gesture-sensor.description", - tryItDescription: "toolbar-clue-gesture-sensor.tryItDescription", - components: [ - , - ], - id: "gesture_sensor", - }; -}; - -export const PROXIMITY_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const proximitySensorValues = { - P: sensorValues[SENSOR_LIST.PROXIMITY], - }; - return { - descriptionTitle: "toolbar-clue-proximity-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-proximity-sensor.description", - tryItDescription: "toolbar-clue-proximity-sensor.tryItDescription", - components: [ - , - ], - id: "proximity_sensor", - }; -}; - -export const PRESSURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const pressureSensorValues = { - P: sensorValues[SENSOR_LIST.PRESSURE], - }; - return { - descriptionTitle: "toolbar-clue-pressure-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-pressure-sensor.description", - tryItDescription: "toolbar-clue-pressure-sensor.tryItDescription", - components: [ - , - ], - id: "pressure_sensor", - }; -}; - -export const BUTTON_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-a-b-push.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-clue-a-b-push.description", - tryItDescription: "toolbar-clue-a-b-push.tryItDescription", - components: undefined, - id: "microbit_button", - }; -}; - -export const BLUETOOTH_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-bluetooth.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-clue-bluetooth.description", - tryItDescription: "toolbar-clue-bluetooth.tryItDescription", - components: undefined, - id: "bluetooth", - }; -}; - -export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-sound-sensor.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-sound-sensor.description", - tryItDescription: "toolbar-clue-sound-sensor.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "sound_sensor", - }; -}; - -export const LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-led.description", - tryItDescription: "toolbar-clue-led.tryItDescription", - components: undefined, - id: "clue_neopixel", - }; -}; - -export const SPEAKER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-speaker.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-speaker.description", - tryItDescription: "toolbar-speaker.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "speaker", - }; -}; diff --git a/src/view/components/toolbar/clue/ClueSensorProperties.tsx b/src/view/components/toolbar/clue/ClueSensorProperties.tsx deleted file mode 100644 index ccb8d8e1b..000000000 --- a/src/view/components/toolbar/clue/ClueSensorProperties.tsx +++ /dev/null @@ -1,216 +0,0 @@ -import { SENSOR_LIST } from "../../../constants"; -import { ISensorProps, ISliderProps } from "../../../viewUtils"; - -const CLUE_SLIDER_R: ISliderProps = { - axisLabel: "R", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_R, - step: 1, -}; - -const CLUE_SLIDER_G: ISliderProps = { - axisLabel: "G", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_G, - step: 1, -}; - -const CLUE_SLIDER_B: ISliderProps = { - axisLabel: "B", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_B, - step: 1, -}; -const CLUE_SLIDER_C: ISliderProps = { - axisLabel: "C", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_C, - step: 1, -}; - -export const CLUE_LIGHT_PROPERTIES: ISensorProps = { - LABEL: "Light Sensor", - sliderProps: [CLUE_SLIDER_R, CLUE_SLIDER_G, CLUE_SLIDER_B, CLUE_SLIDER_C], - unitLabel: "Lux", -}; - -// Range for magnet found here https://www.adafruit.com/product/4479 -const CLUE_MAGNET_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_X, - step: 0.1, -}; -const CLUE_MAGNET_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_Y, - step: 0.1, -}; -const CLUE_MAGNET_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_Z, - step: 0.1, -}; - -export const CLUE_MAGNET_PROPERTIES: ISensorProps = { - LABEL: "Magnetoscope", - sliderProps: [CLUE_MAGNET_X, CLUE_MAGNET_Y, CLUE_MAGNET_Z], - unitLabel: "μT", -}; -const CLUE_GYRO_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_X, - step: 0.1, -}; -const CLUE_GYRO_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_Y, - step: 0.1, -}; -const CLUE_GYRO_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_Z, - step: 0.1, -}; - -export const CLUE_GYRO_PROPERTIES: ISensorProps = { - LABEL: "Gyroscope", - sliderProps: [CLUE_GYRO_X, CLUE_GYRO_Y, CLUE_GYRO_Z], - unitLabel: "deg/s", -}; - -export const CLUE_HUMIDITY_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "H", - maxLabel: "Max", - maxValue: 100, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.HUMIDITY, - step: 0.1, - }, - ], - unitLabel: "%", -}; -export const CLUE__PROXIMITY_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "P", - maxLabel: "Max", - maxValue: 255, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.PROXIMITY, - step: 1, - }, - ], - unitLabel: "", -}; -export const CLUE_PRESSURE_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "P", - maxLabel: "Max", - maxValue: 1100, - minLabel: "Min", - minValue: 800, - type: SENSOR_LIST.PRESSURE, - step: 0.1, - }, - ], - unitLabel: "hPa", -}; -const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 1023, - minLabel: "Left", - minValue: -1023, - type: SENSOR_LIST.MOTION_X, - step: 0.1, -}; - -const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 1023, - minLabel: "Back", - minValue: -1023, - type: SENSOR_LIST.MOTION_Y, - step: 0.1, -}; - -const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 1023, - minLabel: "Up", - minValue: -1023, - type: SENSOR_LIST.MOTION_Z, - step: 0.1, -}; - -export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "m/s2", -}; - -const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 0.1, -}; - -export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", -}; diff --git a/src/view/components/toolbar/cpx/CpxModalContent.tsx b/src/view/components/toolbar/cpx/CpxModalContent.tsx deleted file mode 100644 index 55166eb2a..000000000 --- a/src/view/components/toolbar/cpx/CpxModalContent.tsx +++ /dev/null @@ -1,198 +0,0 @@ -import * as React from "react"; -import { SENSOR_LIST } from "../../../constants"; -import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; -import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; -import { GenericSliderComponent } from "../GenericSliderComponent"; -import { - FEATURE_REQUEST_ON_GITHUB, - IModalContent, - TRY_IT_MAKE_CODE, -} from "../SensorModalUtils"; -import * as SENSOR_PROPERTIES from "./CpxSensorProperties"; - -export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-gpio.description", - tryItDescription: "toolbar-gpio.tryItDescription", - components: undefined, - id: "GPIO", - }; -}; - -export const IR_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-ir-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-ir-sensor.description", - tryItDescription: "toolbar-ir-sensor.tryItDescription", - components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], - id: "IR", - }; -}; -export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const lightSensorValues = { - L: sensorValues[SENSOR_LIST.LIGHT], - }; - return { - descriptionTitle: "toolbar-light-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-light-sensor.description", - tryItDescription: "toolbar-light-sensor.tryItDescription", - components: [ - , - ], - id: "light_sensor", - }; -}; -export const MOTION_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const motionSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - descriptionTitle: "toolbar-motion-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-motion-sensor.description", - tryItDescription: "toolbar-motion-sensor.tryItDescription", - components: [ - , - TRY_IT_MAKE_CODE, - FEATURE_REQUEST_ON_GITHUB, - ], - id: "motion_sensor", - }; -}; -export const NEOP_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-neo-pixels.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-neo-pixels.description", - tryItDescription: "toolbar-neo-pixels.tryItDescription", - components: undefined, - id: "neon_pixel", - }; -}; -export const PUSHB_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-a-b-push.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-a-b-push.description", - tryItDescription: "toolbar-a-b-push.tryItDescription", - components: undefined, - id: "push_btn", - }; -}; -export const RED_LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-red-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-red-led.description", - tryItDescription: "toolbar-red-led.tryItDescription", - components: undefined, - id: "red_LED", - }; -}; -export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-sound-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-sound-sensor.description", - tryItDescription: "toolbar-sound-sensor.tryItDescription", - components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], - id: "sound_sensor", - }; -}; -export const SWITCH_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-slider-switch.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-slider-switch.description", - tryItDescription: "toolbar-slider-switch.tryItDescription", - components: undefined, - id: "slider_switch", - }; -}; -export const SPEAKER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-speaker.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-speaker.description", - tryItDescription: "toolbar-speaker.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "speaker", - }; -}; -export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-temperature-sensor.description", - descriptionTitle: "toolbar-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-temperature-sensor.tryItDescription", - }; -}; diff --git a/src/view/components/toolbar/cpx/CpxSensorProperties.tsx b/src/view/components/toolbar/cpx/CpxSensorProperties.tsx deleted file mode 100644 index f91f91469..000000000 --- a/src/view/components/toolbar/cpx/CpxSensorProperties.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import { SENSOR_LIST } from "../../../constants"; -import { ISensorProps, ISliderProps } from "../../../viewUtils"; - -const LIGHT_SLIDER_PROPS: ISliderProps = { - maxValue: 320, - minValue: 0, - minLabel: "Dark", - maxLabel: "Bright", - type: "light", - axisLabel: "L", - step: 1, -}; - -export const LIGHT_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Light sensor", - sliderProps: [LIGHT_SLIDER_PROPS], - unitLabel: "Lux", -}; - -const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 0.1, -}; -export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", -}; - -const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 78, - minLabel: "Left", - minValue: -78, - type: SENSOR_LIST.MOTION_X, - step: 1, -}; -const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 78, - minLabel: "Back", - minValue: -78, - type: SENSOR_LIST.MOTION_Y, - step: 1, -}; -const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 78, - minLabel: "Up", - minValue: -78, - type: SENSOR_LIST.MOTION_Z, - step: 1, -}; - -export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "Lux", -}; diff --git a/src/view/components/toolbar/microbit/MicrobitModalContent.tsx b/src/view/components/toolbar/microbit/MicrobitModalContent.tsx deleted file mode 100644 index 6d4ae76ef..000000000 --- a/src/view/components/toolbar/microbit/MicrobitModalContent.tsx +++ /dev/null @@ -1,187 +0,0 @@ -import * as React from "react"; -import { GESTURES_MICROBIT, SENSOR_LIST } from "../../../constants"; -import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; -import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; -import { GenericSliderComponent } from "../GenericSliderComponent"; -import { Gesture } from "../Gesture"; -import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; -import * as SENSOR_PROPERTIES from "./MicrobitSensorProperties"; - -export const ACCELEROMETER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - // this object will be accessed with the axis label - const accelerometerSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-accelerometer-sensor.description", - descriptionTitle: "toolbar-accelerometer-sensor.title", - id: "accelerometer", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-accelerometer-sensor.tryItDescription", - }; -}; -export const LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-led.description", - tryItDescription: "toolbar-microbit-led.tryItDescription", - components: undefined, - id: "microbit_LED", - }; -}; - -export const BUTTON_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-a-b-push.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-microbit-a-b-push.description", - tryItDescription: "toolbar-microbit-a-b-push.tryItDescription", - components: undefined, - id: "microbit_button", - }; -}; -export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-sound.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-sound.description", - tryItDescription: "toolbar-microbit-sound.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_sound", - }; -}; -export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-gpio.description", - tryItDescription: "toolbar-microbit-gpio.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_gpio", - }; -}; -export const COMPASS_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-compass-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-compass-sensor.description", - tryItDescription: "toolbar-microbit-compass-sensor.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_compass", - }; -}; -export const WIRELESS_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-wireless.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-wireless.description", - tryItDescription: "toolbar-microbit-wireless.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_wireless", - }; -}; -export const GESTURE_CONTENT = ( - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-gesture-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-microbit-gesture-sensor.description", - tryItDescription: "toolbar-microbit-gesture-sensor.tryItDescription", - components: [ - , - ], - id: "gesture_sensor", - }; -}; -export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const lightSensorValues = { - L: sensorValues[SENSOR_LIST.LIGHT], - }; - return { - descriptionTitle: "toolbar-light-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-light-sensor.description", - tryItDescription: "toolbar-light-sensor.tryItDescription", - components: [ - , - ], - id: "light_sensor", - }; -}; - -export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-temperature-sensor.description", - descriptionTitle: "toolbar-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-temperature-sensor.tryItDescription", - }; -}; diff --git a/src/view/components/toolbar/microbit/MicrobitSensorProperties.tsx b/src/view/components/toolbar/microbit/MicrobitSensorProperties.tsx deleted file mode 100644 index c32b00477..000000000 --- a/src/view/components/toolbar/microbit/MicrobitSensorProperties.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import { SENSOR_LIST } from "../../../constants"; -import { ISensorProps, ISliderProps } from "../../../viewUtils"; - -const LIGHT_SLIDER_PROPS: ISliderProps = { - maxValue: 255, - minValue: 0, - minLabel: "Dark", - maxLabel: "Bright", - type: "light", - axisLabel: "L", - step: 1, -}; - -export const LIGHT_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Light sensor", - sliderProps: [LIGHT_SLIDER_PROPS], - unitLabel: "Lux", -}; - -const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 1023, - minLabel: "Left", - minValue: -1023, - type: SENSOR_LIST.MOTION_X, - step: 1, -}; - -const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 1023, - minLabel: "Back", - minValue: -1023, - type: SENSOR_LIST.MOTION_Y, - step: 1, -}; - -const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 1023, - minLabel: "Up", - minValue: -1023, - type: SENSOR_LIST.MOTION_Z, - step: 1, -}; - -export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "m/s2", -}; - -const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 1, -}; - -export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", -}; diff --git a/src/view/constants.ts b/src/view/constants.ts deleted file mode 100644 index 56dda92af..000000000 --- a/src/view/constants.ts +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license.a - -// Key events -export const CONSTANTS = { - CURRENTLY_RUNNING: (file: string) => { - return `Currently running: ${file}`; - }, - DEVICE_NAME: { - CPX: "CPX", - MICROBIT: "micro:bit", - }, - ID_NAME: { - BUTTON_A: "BTN_A_OUTER", - BUTTON_AB: "BTN_AB_OUTER", - BUTTON_B: "BTN_B_OUTER", - PIN_A1: "PIN_A1", - PIN_A2: "PIN_A2", - PIN_A3: "PIN_A3", - PIN_A4: "PIN_A4", - PIN_A5: "PIN_A5", - PIN_A6: "PIN_A6", - PIN_A7: "PIN_A7", - PLAY_BUTTON: "play-button", - REFRESH_BUTTON: "refresh-button", - STOP_BUTTON: "stop-button", - SWITCH: "SWITCH", - }, - KEYBOARD_KEYS: { - A: "KeyA", - B: "KeyB", - C: "KeyC", - CAPITAL_R: "R", - CAPITAL_F: "F", - ENTER: "Enter", - S: "KeyS", - NUMERIC_ONE: "Digit1", - NUMERIC_TWO: "Digit2", - NUMERIC_THREE: "Digit3", - NUMERIC_FOUR: "Digit4", - NUMERIC_FIVE: "Digit5", - NUMERIC_SIX: "Digit6", - NUMERIC_SEVEN: "Digit7", - }, - FILES_PLACEHOLDER: - "The simulator will run the .py file you have focused on.", - SIMULATOR_BUTTON_WIDTH: 60, - TOOLBAR_INFO: `Explore what's on the board:`, - LED_TINT_FACTOR: 0.5, -}; -export const AB_BUTTONS_KEYS = { - BTN_A: "BTN_A", - BTN_B: "BTN_B", - BTN_AB: "BTN_AB", -}; -export const BUTTON_CLASSNAME = { - ACTIVE: "sim-button-group", - DEACTIVATED: "sim-button-group-deactivated", -}; -export const BUTTON_STYLING_CLASSES = { - DEFAULT: "sim-button-outer", - KEYPRESSED: "sim-button-key-press", -}; -export const CLUE_LEDS_COLORS = { - WHITE_LEDS_OFF: "#ffde00", - WHITE_LEDS_ON: "white", - RED_LED_OFF: "#808080", - RED_LED_ON: "red", -}; -export enum DEVICE_LIST_KEY { - CPX = "CPX", - MICROBIT = "micro:bit", - CLUE = "CLUE", -} - -// Pauses on Debug mode alter the state of the view -export enum VIEW_STATE { - PAUSE = "debug-pause", - RUNNING = "running", -} - -// -export enum WEBVIEW_MESSAGES { - SWITCH_DEVICE = "switch-device", - REFRESH_SIMULATOR = "refresh-simulator", - TOGGLE_PLAY_STOP = "toggle-play-stop", - BUTTON_PRESS = "button-press", - SENSOR_CHANGED = "sensor-changed", - GESTURE = "gesture", - SLIDER_TELEMETRY = "slider-telemetry", -} - -export enum VSCODE_MESSAGES_TO_WEBVIEW { - SET_DEVICE = "set-device", - PAUSE_DEVICE = "pause-device", - RUN_DEVICE = "run-device", - RESET = "reset-state", - CURRENT_FILE = "current-file", - SET_STATE = "set-state", -} -export enum DEBUG_COMMANDS { - STACK_TRACE = "stackTrace", - CONTINUE = "continue", - DISCONNECT = "disconnect", -} -export enum SENSOR_LIST { - TEMPERATURE = "temperature", - LIGHT = "light", - ACCELEROMETER = "accelerometer", - MOTION_X = "motion_x", - MOTION_Y = "motion_y", - MOTION_Z = "motion_z", - LIGHT_R = "light_r", - LIGHT_G = "light_g", - LIGHT_B = "light_b", - LIGHT_C = "light_c", - HUMIDITY = "humidity", - PRESSURE = "pressure", - PROXIMITY = "proximity", - MAGNET_X = "magnet_x", - MAGNET_Y = "magnet_y", - MAGNET_Z = "magnet_z", - GYRO_X = "gyro_x", - GYRO_Y = "gyro_y", - GYRO_Z = "gyro_z", -} - -export const GESTURES_MICROBIT = [ - "shake", - "up", - "down", - "left", - "right", - "face up", - "face down", - "freefall", - "3g", - "6g", - "8g", -]; -export const GESTURES_CLUE = ["up", "down", "left", "right", "shake"]; - -export enum WEBVIEW_ATTRIBUTES_KEY { - INITIAL_DEVICE = "initial_device", - TYPE = "webview_type", -} -export enum WEBVIEW_TYPES { - SIMULATOR = "simulator", - GETTING_STARTED = "getting_started", -} -export const DEFAULT_IMG_CLUE = `/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAEBAQEBAQEBA -QEBAQEBAQICAQEBAQMCAgICAwMEBAMDAwMEBAYFBAQFBAMDBQcFBQYGBgYGBAUHBwcGBwYGBgb/2wBDAQEBAQEBAQMCAgMGBAMEB -gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgb/wAARCAJYAlgDASIAAhEBAxEB/8QAHwAAA -QUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0Kxw -RVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl -5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBA -QAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRC -hYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkp -aanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD/AD/6KKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP//Z`; - -export default CONSTANTS; diff --git a/src/view/container/device/Device.spec.tsx b/src/view/container/device/Device.spec.tsx deleted file mode 100644 index 491d4e2a5..000000000 --- a/src/view/container/device/Device.spec.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { DEVICE_LIST_KEY } from "../../constants"; -import { Device } from "./Device"; - -describe("Device component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); diff --git a/src/view/container/device/Device.tsx b/src/view/container/device/Device.tsx deleted file mode 100644 index dd30d2dc6..000000000 --- a/src/view/container/device/Device.tsx +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { Clue } from "../../components/clue/Clue"; -import { Cpx } from "../../components/cpx/Cpx"; -import { Microbit } from "../../components/microbit/Microbit"; -import { DEVICE_LIST_KEY } from "../../constants"; - -interface IProps { - currentSelectedDevice: string; -} -// Container to switch between multiple devices - -export class Device extends React.Component { - constructor(props: IProps) { - super(props); - } - render() { - const { currentSelectedDevice } = this.props; - - return ( -
- - {loadSelectedDevice(currentSelectedDevice)} - -
- ); - } -} -const loadSelectedDevice = (currentSelectedDevice: string) => { - switch (currentSelectedDevice) { - case DEVICE_LIST_KEY.CPX: - return ; - case DEVICE_LIST_KEY.MICROBIT: - return ; - case DEVICE_LIST_KEY.CLUE: - return ; - default: - return null; - } -}; diff --git a/src/view/container/device/__snapshots__/Device.spec.tsx.snap b/src/view/container/device/__snapshots__/Device.spec.tsx.snap deleted file mode 100644 index cd2e25d19..000000000 --- a/src/view/container/device/__snapshots__/Device.spec.tsx.snap +++ /dev/null @@ -1,3240 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Device component should render correctly 1`] = ` -
-
-
- The simulator will run the .py file you have focused on. -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (0,0) - - - - - - (1,0) - - - - - - (2,0) - - - - - - (3,0) - - - - - - (4,0) - - - - - - (0,1) - - - - - - (1,1) - - - - - - (2,1) - - - - - - (3,1) - - - - - - (4,1) - - - - - - (0,2) - - - - - - (1,2) - - - - - - (2,2) - - - - - - (3,2) - - - - - - (4,2) - - - - - - (0,3) - - - - - - (1,3) - - - - - - (2,3) - - - - - - (3,3) - - - - - - (4,3) - - - - - - (0,4) - - - - - - (1,4) - - - - - - (2,4) - - - - - - (3,4) - - - - - - (4,4) - - - - - - - - - - - - P0, ANALOG IN - - - - - P1, ANALOG IN - - - - - P2, ANALOG IN - - - - - P3, ANALOG IN, LED Col 1 - - - - - P4, ANALOG IN, LED Col 2 - - - - - P5, BUTTON A - - - - - P6, LED Col 9 - - - - - P7, LED Col 8 - - - - - P8 - - - - - P9, LED Col 7 - - - - - P10, ANALOG IN, LED Col 3 - - - - - P11, BUTTON B - - - - - P12, RESERVED ACCESSIBILITY - - - - - P13, SPI - SCK - - - - - P14, SPI - MISO - - - - - P15, SPI - MOSI - - - - - P16, SPI - Chip Select - - - - - P17, +3v3 - - - - - P18, +3v3 - - - - - P19, I2C - SCL - - - - - P20, I2C - SDA - - - - - GND - - - - - GND - - - - - +3v3 - - - - - GND - - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
-
-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-`; diff --git a/src/view/context.ts b/src/view/context.ts deleted file mode 100644 index 24fafc556..000000000 --- a/src/view/context.ts +++ /dev/null @@ -1,6 +0,0 @@ -import * as React from "react"; -import { VIEW_STATE } from "./constants"; - -// View is running by default - -export const ViewStateContext = React.createContext(VIEW_STATE.RUNNING); diff --git a/src/view/index.css b/src/view/index.css deleted file mode 100644 index 918c31f9e..000000000 --- a/src/view/index.css +++ /dev/null @@ -1,13 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Joti+One"); - -body { - margin: 0; - padding: 0; - font-family: sans-serif; -} - -html, -body { - overflow: hidden; - height: 100%; -} diff --git a/src/view/index.tsx b/src/view/index.tsx deleted file mode 100644 index 32e7400b1..000000000 --- a/src/view/index.tsx +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import App from "./App"; - -import "./index.css"; - -const messageEn = require("./translations/en.json"); -const locale = "en"; - -const message = { - en: messageEn, -}; -ReactDOM.render( - - - , - document.getElementById("root") -); diff --git a/src/view/pages/__snapshots__/gettingStarted.spec.tsx.snap b/src/view/pages/__snapshots__/gettingStarted.spec.tsx.snap deleted file mode 100644 index 18dac92ce..000000000 --- a/src/view/pages/__snapshots__/gettingStarted.spec.tsx.snap +++ /dev/null @@ -1,901 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`GettingStartedPage component should render correctly 1`] = ` -
-

- Getting started -

- -

- Copy these snippets of code to a .py file and run the simulator -

-
-

- Tutorial for Circuit Playground Express -

-

- > Import the Circuit Playground library to use it (This is required) -

- -
-        from adafruit_circuitplayground import cp
-      
-
-

- > Turn on the little red LED -

- -
-        while True:
-      
-
-            cp.red_led = True
-      
-
-

- > Turn up red LED when button A is clicked -

- -
-        while True:
-      
-
-            if cp.button_a:
-      
-
-                cp.red_led = True
-      
-
-

- > Light up the first neopixel blue -

- -
-        cp.pixels[0] = (0, 0, 255)
-      
-
-

- And much more! These links have more tutorials: -

-

- - Getting started with CPX and CircuitPython - -

-

- - More example code - -

-

- Keyboard Shortcuts -

-
    -
  • - Push Button: - - A - - for Button A, - - B - - for Button B, - - C - - for Buttons A & B -
  • -
  • - Refresh the simulator: - - Shift - - + - - R - -
  • -
  • - Run the simulator: - - Shift - - + - - F - -
  • -
-
-
-

- Tutorial for micro:bit -

-

- > Import the micro:bit library to use it (This is required) -

- -
-        from microbit import *
-      
-
-

- > Light up your micro:bit with love by showing a heart -

- -
-        display.show(Image.HEART)
-      
-
-

- > Use your micro:bit to tell the world how you’re feeling -

- -
-        while True:
-      
-
-            if button_a.is_pressed():
-      
-
-                display.show(Image.HAPPY)
-      
-
-            if button_b.is_pressed():
-      
-
-                display.show(Image.SAD)
-      
-
-

- > Read then display the temperature -

- -
-        while True:
-      
-
-            temp = temperature()
-      
-
-            display.show(temp)
-      
-
-

- > Display your name with the scroll functionality -

- -
-        while True:
-      
-
-            display.show("Your name")
-      
-
-

- And much more! These links have more tutorials: -

-

- - Microbit Tutorials - -

-

- - Microbit official documentation - -

-

- Keyboard Shortcuts -

-
    -
  • - Push Button: - - A - - for Button A, - - B - - for Button B, - - C - - for Buttons A & B -
  • -
  • - Refresh the simulator: - - Shift - - + - - R - -
  • -
  • - Run the simulator: - - Shift - - + - - F - -
  • -
-
-
-

- Tutorial for CLUE -

-

- > Import the the main CLUE library (This is required) -

- -
-        from adafruit_clue import clue
-      
-
-

- > Display text on the CLUE and change the text when a button is pressed -

- -
-        clue_data = clue.simple_text_display(title="CLUE!")
-      
-
-        while True:
-      
-
-            clue_data[1].text = "Hello World!"
-      
-
-            if clue.button_a:
-      
-
-                clue_data[5].text = "A is pressed!"
-      
-
-            else:
-      
-
-                clue_data[5].text = "A is not pressed!"
-      
-
-            clue_data.show()
-      
-
-

- > Create a slide show on the CLUE -

-

- Make sure there are bitmap (.bmp) pictures of your choice in the same directory as the code file. -

- -
-        import board
-      
-
-        from adafruit_slideshow import SlideShow
-      
-
-         
-      
-
-        slideshow = SlideShow(clue.display, auto_advance=True, dwell=3, fade_effect=True)
-      
-
-        while slideshow.update():
-      
-
-            pass
-      
-
-

- > Light up the neopixel green -

- -
-        clue.pixel.fill(clue.GREEN)
-      
-
-

- > Display sensor data on the CLUE -

- -
-        clue_data = clue.simple_text_display(title="CLUE Sensor Data!", title_scale=2)
-      
-
-        while True:
-      
-
-            clue_data[0].text = "Acceleration: 
-        {}
-         
-        {}
-         
-        {}
-        ".format(*clue.acceleration)
-      
-
-            clue_data[1].text = "Gyro: 
-        {}
-         
-        {}
-         
-        {}
-        ".format(*clue.gyro)
-      
-
-            clue_data[2].text = "Magnetic: 
-        {}
-         
-        {}
-         
-        {}
-        ".format(*clue.magnetic)
-      
-
-            clue_data[3].text = "Pressure: 
-        {}
-        hPa".format(clue.pressure)
-      
-
-            clue_data[4].text = "Altitude: 
-        {}
-        m".format(clue.altitude)
-      
-
-            clue_data[5].text = "Temperature: 
-        {}
-        C".format(clue.temperature)
-      
-
-            clue_data[6].text = "Humidity: 
-        {}
-        %".format(clue.humidity)
-      
-
-            clue_data[7].text = "Proximity: 
-        {}
-        ".format(clue.proximity)
-      
-
-            clue_data[8].text = "Gesture: 
-        {}
-        ".format(clue.gesture)
-      
-
-            clue_data[9].text = "Color: R: 
-        {}
-         G: 
-        {}
-         B: 
-        {}
-         C: 
-        {}
-        ".format(*clue.color)
-      
-
-            clue_data[10].text = "Button A: 
-        {}
-        ".format(clue.button_a)
-      
-
-            clue_data[11].text = "Button B: 
-        {}
-        ".format(clue.button_b)
-      
-
-            clue_data.show()
-      
-
-

- > Draw a blue rectangle on the screen -

- -
-        import board
-      
-
-        import displayio
-      
-
-        from adafruit_display_shapes.rect import Rect
-      
-
-         
-      
-
-        splash = displayio.Group(max_size=20)
-      
-
-        board.DISPLAY.show(splash)
-      
-
-         
-      
-
-        rect = Rect(80, 20, 41, 41, fill=0x0000FF)
-      
-
-        splash.append(rect)
-      
-
-

- And much more! These links have more tutorials: -

-

- - Getting started with CLUE and CircuitPython - -

-

- - More example code - -

-

- Keyboard Shortcuts -

-
    -
  • - Push Button: - - A - - for Button A, - - B - - for Button B, - - C - - for Buttons A & B -
  • -
  • - Refresh the simulator: - - Shift - - + - - R - -
  • -
  • - Run the simulator: - - Shift - - + - - F - -
  • -
  • - Capacitive Touch Sensor: - - Shift - - + - - 1 - - ~ - - 7 - - for GPIO pins A1 - A7 -
  • -
  • - Slider Switch: - - Shift - - + - - S - -
  • -
-
-
-

- Tutorial for using the debugger -

-

- > Enter debug mode -

-

- Press - - F5 - - or go to - - Run -> Start Debugging - -

- Start debugging -

- > Set a breakpoint or multiple breakpoints -

-

- Stopping at a breakpoint pauses the program at that particular place. -

-

- Use the debug toolbar or the shortcuts below -

- Debugger Toolbar -
    -
  • - - F5 - - to continue / pause -
  • -
  • - - F10 - - to step over (execute current statement and all functions that it calls and stop before the next statement) -
  • -
  • - - F11 - - to step into (stop at first statement of first function called from first line) -
  • -
  • - - Shift - - + - - F11 - - to step out (run current function to end) -
  • -
  • - - Ctrl - - + - - Shift - - + - - F11 - - to restart -
  • -
  • - - Shift - - + - - F5 - - to stop -
  • -
- debugging experience -

- > Observe the device's state on the "Variables" tab on the left when stopped at a breakpoint -

- Debugger Variables -

- And much more! These links have more tutorials: -

-

- - Learn more about debugging in VS Code - -

-
-
-`; diff --git a/src/view/pages/gettingStarted.css b/src/view/pages/gettingStarted.css deleted file mode 100644 index d312598b1..000000000 --- a/src/view/pages/gettingStarted.css +++ /dev/null @@ -1,56 +0,0 @@ -.inv { - display: none; -} - -.codeText { - overflow-x: auto; - white-space: pre-wrap; - word-wrap: break-word; -} - -li:not(:last-child) { - margin-bottom: 6px; -} - -.normalFontWeight { - font-weight: normal; -} - -.deviceSelector { - width: 250px; - border: 1px solid var(--vscode-dropdown-border); - background-color: var(--vscode-dropdown-background); - color: var(--vscode-dropdown-foreground); - margin: 0 0 5px; - padding: 8px; - border-radius: 5px; - font-size: 12px; - padding-right: 30px; -} - -.deviceSelector optgroup { - background-color: var(--vscode-dropdown-listBackground); - color: var(--vscode-dropdown-foreground); -} - -.deviceSelector option { - background-color: var(--vscode-dropdown-listBackground); - color: var(--vscode-dropdown-foreground); -} - -.codeBox { - display: block; - width: 90%; - margin: 10px; - padding: 15px; - text-align: left; - background: none; - border: 1px solid grey; - border-radius: 4px; - background-color: var(--vscode-textCodeBlock-background); -} - -.container { - text-align: left; - padding: 0 10px 20px 10px; -} diff --git a/src/view/pages/gettingStarted.spec.tsx b/src/view/pages/gettingStarted.spec.tsx deleted file mode 100644 index 278d5ed4b..000000000 --- a/src/view/pages/gettingStarted.spec.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { GettingStartedPage } from "./gettingStarted"; - -describe("GettingStartedPage component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); diff --git a/src/view/pages/gettingStarted.tsx b/src/view/pages/gettingStarted.tsx deleted file mode 100644 index 2477594e7..000000000 --- a/src/view/pages/gettingStarted.tsx +++ /dev/null @@ -1,281 +0,0 @@ -import * as React from "react"; -import "./gettingStarted.css"; - -export class GettingStartedPage extends React.Component { - private selectRef: React.RefObject = React.createRef(); - - componentDidMount() { - this.selectRef.current?.addEventListener("change", (event: any) => { - const visibleElement = document.querySelector(".visibleElement"); - const target = document.getElementById(event!.target!.value); - if (visibleElement !== null) { - visibleElement.className = "inv"; - } - if (target !== null) { - target.className = "visibleElement"; - } - }); - } - - render() { - return ( - -
-

Getting started

- -

- Copy these snippets of code to a .py file and run the - simulator -

- {/* prettier-ignore */} -
-

Tutorial for Circuit Playground Express

-

- > Import the Circuit Playground library to use it (This is required) -

- -
from adafruit_circuitplayground import cp
-
-

> Turn on the little red LED

- -
while True:
-
    cp.red_led = True
-
-

> Turn up red LED when button A is clicked

- -
while True:
-
    if cp.button_a:
-
        cp.red_led = True
-
-

> Light up the first neopixel blue

- -
cp.pixels[0] = (0, 0, 255)
-
-

And much more! These links have more tutorials:

-

- - Getting started with CPX and CircuitPython - -

-

- - More example code - -

-

Keyboard Shortcuts

-
    -
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • -
  • Refresh the simulator: Shift + R
  • -
  • Run the simulator: Shift + F
  • -
-
- {/* prettier-ignore */} -
-

Tutorial for micro:bit

-

- > Import the micro:bit library to use it (This is - required) -

- -
from microbit import *
-
-

- > Light up your micro:bit with love by showing a - heart -

- -
display.show(Image.HEART)
-
-

- > Use your micro:bit to tell the world how you’re - feeling -

- -
while True:
-
    if button_a.is_pressed():
-
        display.show(Image.HAPPY)
-
    if button_b.is_pressed():
-
        display.show(Image.SAD)
-
-

> Read then display the temperature

- -
while True:
-
    temp = temperature()
-
    display.show(temp)
-
-

- > Display your name with the scroll functionality -

- -
while True:
-
    display.show("Your name")
-
-

And much more! These links have more tutorials:

-

- - Microbit Tutorials - -

-

- - Microbit official documentation - -

-

Keyboard Shortcuts

-
    -
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • -
  • Refresh the simulator: Shift + R
  • -
  • Run the simulator: Shift + F
  • -
-
- {/* prettier-ignore */} -
-

Tutorial for CLUE

-

- > Import the the main CLUE library (This is - required) -

- -
from adafruit_clue import clue
-
-

- > Display text on the CLUE and change the text when - a button is pressed -

- -
-                                clue_data = clue.simple_text_display(title="CLUE!")
-                            
-
while True:
-
    clue_data[1].text = "Hello World!"
-
    if clue.button_a:
-
        clue_data[5].text = "A is pressed!"
-
    else:
-
        clue_data[5].text = "A is not pressed!"
-
    clue_data.show()
-
-

> Create a slide show on the CLUE

-

- Make sure there are bitmap (.bmp) pictures of your choice in the same directory - as the code file. -

- -
import board
-
from adafruit_slideshow import SlideShow
-
 
-
slideshow = SlideShow(clue.display, auto_advance=True, dwell=3, fade_effect=True)
-                            
-
while slideshow.update():
-
    pass
-
-

> Light up the neopixel green

- -
clue.pixel.fill(clue.GREEN)
-
-

> Display sensor data on the CLUE

- -
clue_data = clue.simple_text_display(title="CLUE Sensor Data!", title_scale=2)
-
while True:
-
    clue_data[0].text = "Acceleration: {"{}"} {"{}"} {"{}"}".format(*clue.acceleration)
-
    clue_data[1].text = "Gyro: {"{}"} {"{}"} {"{}"}".format(*clue.gyro)
-
    clue_data[2].text = "Magnetic: {"{}"} {"{}"} {"{}"}".format(*clue.magnetic)
-
    clue_data[3].text = "Pressure: {"{}"}hPa".format(clue.pressure)
-
    clue_data[4].text = "Altitude: {"{}"}m".format(clue.altitude)
-
    clue_data[5].text = "Temperature: {"{}"}C".format(clue.temperature)
-
    clue_data[6].text = "Humidity: {"{}"}%".format(clue.humidity)
-
    clue_data[7].text = "Proximity: {"{}"}".format(clue.proximity)
-
    clue_data[8].text = "Gesture: {"{}"}".format(clue.gesture)
-
    clue_data[9].text = "Color: R: {"{}"} G: {"{}"} B: {"{}"} C: {"{}"}".format(*clue.color)
-
    clue_data[10].text = "Button A: {"{}"}".format(clue.button_a)
-
    clue_data[11].text = "Button B: {"{}"}".format(clue.button_b)
-
    clue_data.show()
-
-

> Draw a blue rectangle on the screen

- -
import board
-
import displayio
-
from adafruit_display_shapes.rect import Rect
-
 
-
splash = displayio.Group(max_size=20)
-
board.DISPLAY.show(splash)
-
 
-
rect = Rect(80, 20, 41, 41, fill=0x0000FF)
-
splash.append(rect)
-
-

And much more! These links have more tutorials:

-

- - Getting started with CLUE and CircuitPython - -

-

- - More example code - -

-

Keyboard Shortcuts

-
    -
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • -
  • Refresh the simulator: Shift + R
  • -
  • Run the simulator: Shift + F
  • -
  • Capacitive Touch Sensor: Shift + 1 ~ 7 for GPIO pins A1 - A7
  • -
  • Slider Switch: Shift + S
  • -
-
- {/* prettier-ignore */} -
-

Tutorial for using the debugger

-

- > Enter debug mode -

-

Press F5 or go to Run -> Start Debugging

- Start debugging -

- > Set a breakpoint or multiple breakpoints -

-

Stopping at a breakpoint pauses the program at that particular place.

-

Use the debug toolbar or the shortcuts below

- Debugger Toolbar -
    -
  • F5 to continue / pause
  • -
  • F10 to step over (execute current statement and all functions that it calls and stop before the next statement)
  • -
  • F11 to step into (stop at first statement of first function called from first line)
  • -
  • Shift + F11 to step out (run current function to end)
  • -
  • Ctrl + Shift + F11 to restart
  • -
  • Shift + F5 to stop
  • -
- debugging experience -

- > Observe the device's state on the "Variables" tab on the left when stopped at a breakpoint -

- Debugger Variables -

And much more! These links have more tutorials:

-

- - Learn more about debugging in VS Code - -

-
-
-
- ); - } -} diff --git a/src/view/pages/gettingStartedPictures/debugger/debugger_vars.png b/src/view/pages/gettingStartedPictures/debugger/debugger_vars.png deleted file mode 100644 index 267f461ef3e2c2a5828a1db3bff454c7eecff476..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44993 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

IqyB?WD=aWcD#Ji7HNax7-GQ>11cdloxpL( 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

xd9?>F(T_Er zym&K6!IPx|%r~`jNlxgr@++cA^3^`0!xnX9hx}CT^9xi!M9~{wl@Qd*SYsx=srl9& zP*Rs}JAG;(NUO3Eh~;C0-sF6lkXwAFpjV%NMm6_E{U1RlmjaA4$81yiQ)<&4X?7!D ztUsiguns|DPxLe)QPHXcM$}(%cg&Eq_qnX3Ql(}OR6|t{D|>1^RBjzqb%ywi4isbNCmq@_k;cN=*?}NV`Gw-7SU#iFQ~1r6ds)m zo%Yp0=&$v)?;C%%nz|CY@bf9<(*GXBGTjL-T@_wJaPU#9$=e3N;FeU&f@?oCnrsbg zMGY{J<)tElWJj95KU|ym4g!&VoDI;Ok(D7gi;Gq6)h#HabS?Xe-`I zXsYbuFDoWj12&`dk&5wlNg~=R?Pte=vZj&@6;*<|h7!O@O&Rc*;TtrDj@Ck{wT~vxti|US;l*H`d2!K#DWJO1$O$=Mwb=NJipO1 zE!S|Zs%8Ds#XC{xeL@_gPChH7mod7YbqDCH(z1=Fb>em_-GU)k?gcYVo8#c9K{*r- z-ZJ9A@87>8Y)rf259AuNP_M%86@53TFgJ!YHc#sCd~=);R5Y$%!+AsFRs#N_T|;=w zhvLp4G5v7co9QXJb@V1Ln?iFRs1}MfFvCQX6sQXEd);5vM^(HGEOv z{=?4KNrW&1E-`qlcn>gD`-_wde_CircU{Z8UWqQ8$=Ff^g5cwDz|@xgYrGN5e44Z@ z1;{B&6WUwnJ~ChSX@tzJJ=HW=gTdddav8w@TkP(2Jd|e!dGPxqojZadIaEcI5~uwP zo+`VCpCMs0F=b@#TPWFaY<4Lu4+`1I@Rh`zIHp!U=ShE-+o8iV$ihVR;?@FyY+(h@ z0NoVg&DKcag|TNJepMtk1u{OU4dzn4TEyzW_K7^#> zy_ko-goZKln0wR7-OR7~QG|(n3t`3RRngc}HlSxf1m&q2>9QAB(;5GGx%Si>REa?# zvA^hpeatzI1H0yLFpg?b2oui-RxdY{Ei82lgkmF8Jpf?q$}VT8OF$Y?pAC4y{8yE; zlP&BIAaNBu%5EH8KY?BC`|t)B&&OG!EGi`(+&CU|4H}!4l#m->A`;^PdQ*mE(~71A}VnT4>gLpJi*_C6?&>?GPci|)-?zCgb2OA z6C2y{6F0EtGI~xU;oSW29$Ed*&kFNE2n$&5`S-XumAr_m>C;f#LTa+yjwW4-KJyLO zF&I;{FcOVDyzL09#J;H_?Xo5@q7cy#T ze+DT>O8)aF&#!#<{TcEu7|!byTGjZ87)vKqW zfQ(_I1_}gx5BA$re?5DG`3ALo2A<7w@z%XZaBqbxSSXEr9T3GccZoAS@7A2Pm257f z3_%Z2iU5~=HZGrvq~(NXbppD7y*Tf>5#Na|&h5l<+sc|E9_Vvvsxz!FJyKZ5>bl>` zZw~rom|rP>@E*Q2pXR%E8q3*_i0XB&IeKxHn{j@Ze_vYwQd#3}aWy)}EKn5ZB$uwn z(93#Ut)%W33i9NiCN@D<#4_$QpMCSM<9|2(Jk~xGt{Id%!hu4k+OmW~=j^VArGniu z$ZD5XT$y{_A)WH#27MsIjqw*3m^;pp%zm4qHxi2@-5!0|9xVDL%*&;s;tJEuAPFU z)({>3Q!77xt79>Kg1h^v)C}}bfN*y`ypimRDGI%~xo&P>%s#mzZtF#vZXQ2KOE!%b zd)R8q$VYp>YlZ&K(LGb$@OgJ&w{z`Bn>fCDj zjZ=W`)Z?=#()dY^5x2{ONBW3r%!2=A}(grcT9p<3W96-+Ol5bc}# z>rO-Ac(yNM6n@DtcxkFk8gYH_7-wo0lzY2)8GZgiE)5dvDqf?xF>_0^9d5i|J>(O3 zE4HT2US&3xhgx+LRLr;L*1Ym1E2c}lLT@NymyMzA8UAQ^7=KS-{xtxIP)_R7g)}n7 z-}uEyu!|PDwrp?4a8QBOJ=j9(NJF1FQ)qK9@ZM0su4?toq+5d+#a|vuktAZsV2++7ww+q+$*klO!ojhTGyxi(?+&=+#<3n%& diff --git a/src/view/pages/gettingStartedPictures/debugger/debugging.gif b/src/view/pages/gettingStartedPictures/debugger/debugging.gif deleted file mode 100644 index 5d42a436ae20b4fc76a2c10f2f78716dd566fdc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 652131 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

-{vN#&nJiSL3j06_uncZcf!BiE7`5^=;>N!Y%Y! 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 z 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

YO>2rMouP(dHVz(BKRCpxD{& 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%0ANooijZsdO7H)43a( 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 diff --git a/src/view/pages/gettingStartedPictures/debugger/start_debugging.jpg b/src/view/pages/gettingStartedPictures/debugger/start_debugging.jpg deleted file mode 100644 index 3d39fbf6618e891ba856af8820192b2a5cb1b64f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51011 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 Cdeq7Q diff --git a/src/view/pages/gettingStartedPictures/debugger/toolbar.png b/src/view/pages/gettingStartedPictures/debugger/toolbar.png deleted file mode 100644 index 754e68e03fbe5eff10db43c4c97871faf02d3184..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4635 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 OZ=kLgT(ex=4*Ngaowt7g diff --git a/src/view/react-app-env.d.ts b/src/view/react-app-env.d.ts deleted file mode 100644 index 6431bc5fc..000000000 --- a/src/view/react-app-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/src/view/styles/Button.css b/src/view/styles/Button.css deleted file mode 100644 index c30ed1360..000000000 --- a/src/view/styles/Button.css +++ /dev/null @@ -1,50 +0,0 @@ -.button { - height: 32px; - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-debugToolBar-background); -} - -.button-icon { - fill: var(--vscode-badgeForegroundOverride); -} - -.button-rectangle { - stroke: var(--vscode-badgeForegroundOverride); -} - -.play-button { - border-radius: 8px 0px 0px 8px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); -} - -.refresh-button { - border-radius: 0px 8px 8px 0px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); -} - -.button:focus, -.button:hover { - background-color: var(--vscode-terminal-selectionBackground); -} - -.button:active { - background-color: var(--vscode-editor-selectionHighlightBackground); -} - -.toolbar-button { - border: none; -} - -.toolbar-button:hover { - outline: none; -} - -.edge-button { - pointer-events: none; - border: none; -} - -.button-pressed { - background-color: var(--vscode-button-background); - outline: none; -} diff --git a/src/view/styles/Dropdown.css b/src/view/styles/Dropdown.css deleted file mode 100644 index b69b14c74..000000000 --- a/src/view/styles/Dropdown.css +++ /dev/null @@ -1,24 +0,0 @@ -.dropdown { - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-foreground); - border-radius: 2px; - box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.22); - color: var(--vscode-foreground); - height: 32px; - width: 100%; -} - -select.dropdown:hover, -select.dropdown:focus, -select.dropdown:active { - outline: 1px solid var(--vscode-button-background); -} - -option { - height: 32px; - background: var(--vscode-debugToolBar-background); - outline: 0; - align-items: center; - font-size: 14px; - color: var(--vscode-foreground); -} diff --git a/src/view/styles/InputSlider.css b/src/view/styles/InputSlider.css deleted file mode 100644 index b51dae8f3..000000000 --- a/src/view/styles/InputSlider.css +++ /dev/null @@ -1,103 +0,0 @@ -:root { - --slider-gray-color: #cccccc; - --slider-width: 240px; -} -.inputSlider { - height: 48px; - margin-bottom: 60px; - display: table-cell; -} -.sliderValue { - -webkit-appearance: none; - text-align: center; - width: 48px; - height: 32px; - background-color: var(--vscode-editor-background); - margin-right: 15px; - margin-top: auto; - margin-bottom: auto; - margin-left: 5px; - color: var(--badgeForegroundOverride); - border-radius: 2px; - font-size: 16px; - font-weight: bold; - border-width: 1px; - border-radius: 2px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); -} - -.slider { - -webkit-appearance: none; - background-color: var(--slider-gray-color); - height: 1px; - width: var(--slider-width); - vertical-align: middle; -} -.slider::-webkit-slider-thumb { - -webkit-appearance: none; - appearance: none; - width: 16px; - height: 16px; - border-radius: 50%; - background: var(--vscode-textLink-activeForeground); - cursor: pointer; -} - -.slider::-webkit-slider-runnable-track:focus, -.inputSlider:focus, -.slider:focus { - outline: none; -} - -.sliderValue:focus, -.sliderValue:hover { - -webkit-appearance: none; - color: var(--vscode-textLink-activeForeground); - outline: 1px solid var(--vscode-textLink-activeForeground); -} -.maxLabel, -.minLabel { - display: inline-block; - position: absolute; - vertical-align: top; -} - -.maxLabel { - right: 0; -} - -.minLabel { - left: 0; -} - -.sliderArea, -.sliderValue { - display: inline-block; - vertical-align: middle; -} - -.sliderArea { - width: var(--slider-width); - height: 49px; -} -.downLabelArea { - width: var(--slider-width); - height: 15px; - margin-top: 10px; - position: relative; - font-size: 14px; -} -.upLabelArea { - width: var(--slider-width); - height: 15px; - margin-bottom: 10px; - position: relative; - font-weight: bolder; - font-size: 16px; -} - -.slider, -.upLabelArea, -.downLabelArea { - display: block; -} diff --git a/src/view/styles/LightSensorBar.css b/src/view/styles/LightSensorBar.css deleted file mode 100644 index 5d0abac42..000000000 --- a/src/view/styles/LightSensorBar.css +++ /dev/null @@ -1,20 +0,0 @@ -.title { - font-size: 14px; - text-align: left; - font-weight: bold; -} - -.header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; -} - -.lightSensorBar { - -webkit-appearance: none; - margin-top: 10px; - width: 400px; - margin-left: auto; - margin-right: auto; - padding-bottom: 16px; -} diff --git a/src/view/styles/MotionSensorBar.css b/src/view/styles/MotionSensorBar.css deleted file mode 100644 index 8ea39c23c..000000000 --- a/src/view/styles/MotionSensorBar.css +++ /dev/null @@ -1,20 +0,0 @@ -.title { - font-size: 14px; - text-align: left; -} - -.header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; -} - -.MotionSensorBar { - width: 100%; - margin-left: auto; - margin-right: auto; -} - -.sensor-button-container { - padding: 10px 0; -} diff --git a/src/view/styles/SensorButton.css b/src/view/styles/SensorButton.css deleted file mode 100644 index 21241eca2..000000000 --- a/src/view/styles/SensorButton.css +++ /dev/null @@ -1,29 +0,0 @@ -.sensor-button { - color: var(--vscode-badgeForegroundOverride); - text-align: center; - background-color: var(--vscode-button-background); - width: 100%; - height: 32px; - font-weight: bolder; - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - padding: 4px; -} - -.sensor-button:focus, -.sensor-button:active { - outline-width: thick; - outline-offset: 4px; - outline: 2px solid var(--vscode-focusBorder); - background-color: var(--vscode-button-hoverBackground); -} - -.sensor-button:active, -.active-button { - opacity: 0.5; -} - -.sensor-button:hover { - background-color: var(--vscode-button-hoverBackground); -} diff --git a/src/view/styles/Simulator.css b/src/view/styles/Simulator.css deleted file mode 100644 index 016cc8855..000000000 --- a/src/view/styles/Simulator.css +++ /dev/null @@ -1,83 +0,0 @@ -.simulator { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - max-width: 700px; - max-height: 700px; - margin-left: auto; - margin-right: auto; -} - -.buttons { - display: flex; - flex-direction: row; - padding-top: 20px; - justify-content: center; -} - -.file-selector { - padding: 20px; - width: 80%; - height: 30px; - border: 1px solid var(--vscode-debugToolBar-background); - border-radius: 3px; -} - -.shake-pressed { - /* Start the shake animation and make the animation last for 0.5 seconds */ - animation: shake 0.5s; - - /* When the animation is finished, start again */ - animation-iteration-count: infinite; -} - -@keyframes shake { - 0% { - transform: translate(1px, 1px) rotate(0deg); - } - 10% { - transform: translate(-1px, -2px) rotate(-1deg); - } - 20% { - transform: translate(-3px, 0px) rotate(1deg); - } - 30% { - transform: translate(3px, 2px) rotate(0deg); - } - 40% { - transform: translate(1px, -1px) rotate(1deg); - } - 50% { - transform: translate(-1px, 2px) rotate(-1deg); - } - 60% { - transform: translate(-3px, 1px) rotate(0deg); - } - 70% { - transform: translate(3px, 1px) rotate(-1deg); - } - 80% { - transform: translate(-1px, -1px) rotate(1deg); - } - 90% { - transform: translate(1px, 2px) rotate(0deg); - } - 100% { - transform: translate(1px, -2px) rotate(-1deg); - } -} - -.microbit-container { - max-width: 350px; - padding: 20px; -} -.clue-container { - width: 100%; - max-width: 500px; - padding: 20px; -} -.cpx-container { - width: 100%; - padding-top: 10px; -} diff --git a/src/view/styles/SimulatorSvg.css b/src/view/styles/SimulatorSvg.css deleted file mode 100644 index c9266c4a3..000000000 --- a/src/view/styles/SimulatorSvg.css +++ /dev/null @@ -1,290 +0,0 @@ -.microbit-svg { - padding: 0 0 0 10px; -} -svg.sim { - box-sizing: border-box; - width: 100%; - height: 100%; - display: block; -} -svg.sim.grayscale { - -moz-filter: grayscale(1); - -webkit-filter: grayscale(1); - filter: grayscale(1); -} -.sim-button-group { - cursor: pointer; -} -.sim-button { - pointer-events: none; - fill: "rgb(17, 17, 17)"; -} -.sim-button-group > .sim-button:active { - fill: orange; -} -.sim-text-outside { - font-size: 25px; - fill: var(--vscode-foreground); -} -.sim-board, -.sim-display, -sim-button { - fill: #111; -} -.sim-button-group > .sim-button-outer:hover { - stroke: orange; - stroke-width: 4px; -} -.sim-button-group > .sim-button-outer:active { - fill: orange; -} -.sim-button-outer { - fill: #7e7272; -} - -.sim-button-key-press { - fill: orange; -} - -.sim-button-nut { - fill: #704a4a; - pointer-events: none; -} - -.sim-systemled { - fill: #333; - stroke: #555; - stroke-width: 1px; -} -.sim-light-level-button { - stroke: #fff; - stroke-width: 3px; -} -.sim-antenna { - stroke: #555; - stroke-width: 2px; -} -.sim-text { - font-family: "Lucida Console", Monaco, monospace; - font-size: 25px; - fill: #fff; - pointer-events: none; -} -.sim-text-pin { - font-family: "Lucida Console", Monaco, monospace; - font-size: 20px; - fill: #fff; - pointer-events: none; -} -.sim-thermometer { - stroke: #aaa; - stroke-width: 3px; -} -/* animations */ -.sim-flash { - animation-name: sim-flash-animation; - animation-duration: 0.1s; -} -@keyframes sim-flash-animation { - from { - fill: yellow; - } - to { - fill: default; - } -} -.sim-flash-stroke { - animation-name: sim-flash-stroke-animation; - animation-duration: 0.4s; - animation-timing-function: ease-in; -} -@keyframes sim-flash-stroke-animation { - from { - stroke: yellow; - } - to { - stroke: default; - } -} -/* wireframe */ -.sim-wireframe * { - fill: none; - stroke: black; -} -.sim-wireframe .sim-display, -.sim-wireframe .sim-led, -.sim-wireframe .sim-led-back, -.sim-wireframe .sim-head, -.sim-wireframe .sim-theme, -.sim-wireframe .sim-button-group, -.sim-wireframe .sim-button-label, -.sim-wireframe .sim-button, -.sim-wireframe .sim-text-pin { - visibility: hidden; -} -.sim-wireframe .sim-label { - stroke: none; - fill: #777; -} -.sim-label, -.sim-button-label { - fill: #000; -} -.sim-wireframe .sim-board { - stroke-width: 2px; -} -*:focus { - outline: none; -} -.sim-button-group:focus { - stroke: #4d90fe; - stroke-width: 4px; -} -.sim-button-group:focus { - stroke: #4d90fe; - stroke-width: 4px; -} -*:focus .sim-button-outer, -.sim-pin:focus, -.sim-thermometer:focus, -.sim-shake:focus, -.no-drag, -.sim-text, -.sim-text-pin { - user-drag: none; - user-select: none; - -moz-user-select: none; - -webkit-user-drag: none; - -webkit-user-select: none; - -ms-user-select: none; -} -.sim-button { - stroke: none; -} -.sim-button:active { - stroke: none; -} -.cls-1 { - fill: #097054; -} -.cls-1, -.cls-14, -.cls-23, -.cls-9 { - stroke: #000; -} -.cls-1, -.cls-11, -.cls-12, -.cls-14, -.cls-17, -.cls-22, -.cls-23, -.cls-3, -.cls-4, -.cls-5, -.cls-6, -.cls-9 { - stroke-miterlimit: 10; -} -.cls-1, -.cls-23 { - stroke-width: 1.99px; -} -.cls-18, -.cls-2 { - fill: #fff; -} -.cls-11, -.cls-12, -.cls-17, -.cls-23, -.cls-3, -.cls-4, -.cls-5, -.cls-6, -.cls-7, -.cls-8 { - fill: none; -} -.cls-11, -.cls-12, -.cls-17, -.cls-3, -.cls-4, -.cls-5, -.cls-6, -.cls-7, -.cls-8 { - stroke: #fff; -} -.cls-3 { - stroke-width: 2px; -} -.cls-12, -.cls-17, -.cls-4, -.cls-5, -.cls-6, -.cls-7, -.cls-8 { - stroke-linecap: round; -} -.cls-4, -.cls-7 { - stroke-width: 1.63px; -} -.cls-5 { - stroke-width: 1.41px; -} -.cls-6 { - stroke-width: 1.6px; -} -.cls-7, -.cls-8 { - stroke-linejoin: round; -} -.cls-8 { - stroke-width: 1.63px; -} -.cls-10, -.cls-9 { - fill: #7e7272; -} -.cls-22, -.cls-9 { - stroke-width: 1.5px; -} -.cls-12 { - stroke-width: 1.71px; -} - -.cls-14 { - stroke-width: 0.25px; -} - -.cls-17 { - stroke-width: 2.02px; -} -.cls-18 { - font-size: 7px; - font-family: SegoeUI-Bold, Segoe UI; - font-weight: 700; - letter-spacing: -0.02em; -} -.cls-19 { - letter-spacing: -0.03em; -} -.cls-20 { - letter-spacing: -0.05em; -} -.cls-21 { - letter-spacing: 0em; -} -.cls-22 { - stroke: #7e7272; -} -.sim-text-outside-clue { - font-size: 14px; - fill: var(--vscode-foreground); -} diff --git a/src/view/styles/TemperatureSensorBar.css b/src/view/styles/TemperatureSensorBar.css deleted file mode 100644 index dfab0b7cd..000000000 --- a/src/view/styles/TemperatureSensorBar.css +++ /dev/null @@ -1,18 +0,0 @@ -.title { - font-size: 14px; - text-align: left; - font-weight: bold; -} - -.header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; -} -.temperatureSensorBar { - margin-top: 10px; - width: 440px; - margin-left: auto; - margin-right: auto; - padding-bottom: 16px; -} diff --git a/src/view/styles/ToolBar.css b/src/view/styles/ToolBar.css deleted file mode 100644 index faca0569c..000000000 --- a/src/view/styles/ToolBar.css +++ /dev/null @@ -1,182 +0,0 @@ -.toolbar-parent { - background: var(--vscode-debugToolBar-background); - width: fit-content; - border-radius: 2px; - height: fit-content; - margin-left: auto; - margin-right: auto; - margin-top: 24px; - margin-bottom: 50px; -} - -.toolbar { - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - display: flex; - flex-direction: column; - align-content: center; - align-items: center; -} - -.toolbar-icon { - min-width: 360px; - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - padding: 0px 8px 0px 8px; -} - -.tag, -.title { - display: inline; -} - -.sensor_modal { - vertical-align: middle; - width: 360px; - overflow-y: visible; - overflow-x: hidden; - position: relative; - height: fit-content; - padding-left: 16px; - box-shadow: none; - margin-left: 1px; -} - -.title { - -webkit-appearance: none; - font-size: 16px; - font-weight: bolder; - color: var(--vscode-badgeForegroundOverride); - text-align: left; - margin-right: 40px; - position: absolute; - left: 0; - padding-left: inherit; - width: 320px; -} - -.info-icon { - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - color: var(--vscode-badgeForegroundOverride); - border-width: 1px; - border-style: solid; - padding: 0px 4px; - float: right; - left: 25px; - margin-top: -10px; -} - -.info-icon:hover { - background-color: var(--vscode-terminal-selectionBackground); - color: var(--vscode-badgeForegroundOverride); -} - -.info-icon:active { - background-color: var(--vscode-editor-selectionHighlightBackground); - color: var(--vscode-badgeForegroundOverride); -} - -.tag { - position: absolute; - left: 200px; -} - -.description-callout { - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - padding: "210px 214px 214px 210px"; - border: 2px solid var(--vscode-highContrastButtonBorderOverride-color); -} - -.description-callout .ms-Callout-beak { - background-color: var(--vscode-debugToolBar-background); -} - -.description-callout .ms-Callout-main { - background-color: var(--vscode-debugToolBar-background); - overflow-x: hidden; - overflow-y: auto; - margin: -1px; -} - -.try-it-description { - -webkit-appearance: none; - font-size: 14px; - background: var(--vscode-debugToolBar-background); - word-wrap: break-word; - width: 320px; - height: "100%"; - margin-top: 15px; - text-align: left; - line-height: 17px; - font-weight: 100; -} - -.description { - -webkit-appearance: none; - color: var(--vscode-badgeForegroundOverride); - font-size: 14px; - word-wrap: break-word; - width: 320px; - height: "100%"; - text-align: left; - font-weight: 400; - padding: 10px 0px 10px 10px; - margin: 10px; - overflow-y: hidden; -} - -.title_group { - margin-top: 20px; - width: fit-content; - padding-left: 16px; -} - -.try_area { - position: relative; - padding-bottom: 30px; - text-align: left; - line-height: 17px; - font-weight: 100; - opacity: 90%; - font-size: 14px; - word-wrap: break-word; - padding-right: 10px; -} - -.link-parent { - padding-top: 12px; - -webkit-appearance: none; - color: var(--vscode-textLink-foreground); - text-align: right; - text-decoration: none; - font-weight: bold; -} - -.link-parent:hover { - -webkit-appearance: none; - color: var(--vscode-textLink-activeForeground); - text-decoration: none; -} - -.link { - -webkit-appearance: none; - text-decoration: none; -} - -.gesture-container { - display: "flex"; - justify-content: "space-between"; - flex-direction: "column"; - align-items: "center"; - height: 750; - padding-top: 10px; -} - -.generic-slider-component { - padding-top: 10px; -} diff --git a/src/view/svgs/arrow_right_svg.tsx b/src/view/svgs/arrow_right_svg.tsx deleted file mode 100644 index 7eead7979..000000000 --- a/src/view/svgs/arrow_right_svg.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import * as React from "react"; - -export const ARROW_RIGHT_SVG = ( - - - -); - -export default ARROW_RIGHT_SVG; diff --git a/src/view/svgs/close_svg.tsx b/src/view/svgs/close_svg.tsx deleted file mode 100644 index ac05bedfc..000000000 --- a/src/view/svgs/close_svg.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import * as React from "react"; - -export const CLOSE_SVG = ( - - - - -); - -export default CLOSE_SVG; diff --git a/src/view/svgs/play_svg.tsx b/src/view/svgs/play_svg.tsx deleted file mode 100644 index 0da21aa9d..000000000 --- a/src/view/svgs/play_svg.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import * as React from "react"; - -export const PLAY_SVG = ( - - - -); - -export default PLAY_SVG; diff --git a/src/view/svgs/refresh_svg.tsx b/src/view/svgs/refresh_svg.tsx deleted file mode 100644 index 340ad03f8..000000000 --- a/src/view/svgs/refresh_svg.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import * as React from "react"; -import "../styles/Button.css"; - -export const REFRESH_SVG = ( - - - -); - -export default REFRESH_SVG; diff --git a/src/view/svgs/stop_svg.tsx b/src/view/svgs/stop_svg.tsx deleted file mode 100644 index a89175f66..000000000 --- a/src/view/svgs/stop_svg.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import * as React from "react"; - -export const STOP_SVG = ( - - - -); - -export default STOP_SVG; diff --git a/src/view/svgs/tag_input_svg.tsx b/src/view/svgs/tag_input_svg.tsx deleted file mode 100644 index 13a507504..000000000 --- a/src/view/svgs/tag_input_svg.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import * as React from "react"; - -export const TAG_INPUT_SVG = ( - - - - -); - -export default TAG_INPUT_SVG; diff --git a/src/view/svgs/tag_output_svg.tsx b/src/view/svgs/tag_output_svg.tsx deleted file mode 100644 index 745175db5..000000000 --- a/src/view/svgs/tag_output_svg.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import * as React from "react"; - -export const TAG_OUTPUT_SVG = ( - - - - -); - -export default TAG_OUTPUT_SVG; diff --git a/src/view/svgs/toolbar_svg.tsx b/src/view/svgs/toolbar_svg.tsx deleted file mode 100644 index 52de70b86..000000000 --- a/src/view/svgs/toolbar_svg.tsx +++ /dev/null @@ -1,740 +0,0 @@ -import * as React from "react"; -import { TOOLBAR_ICON_LABEL } from "../components/toolbar/SensorModalUtils"; -import "../styles/Button.css"; - -export const LEFT_EDGE_SVG = ( - - - - - - - - - - -); -export const RIGHT_EDGE_SVG = ( - - - - - - - - - - -); - -export const GPIO_SVG = ( - - Created with Sketch. - - - - - - -); - -export const IR_SVG = ( - - Created with Sketch. - - - - - - - - -); - -export const LIGHT_SVG = ( - - - - - - - - - - - -); - -export const MOTION_SVG = ( - - - - - - - - - - - -); - -export const NEO_PIXEL_SVG = ( - - Created with Sketch. - - - - - - - - - - - - - - - -); - -export const PUSH_BUTTON_SVG = ( - - Created with Sketch. - - - - - - - - - -); - -export const RED_LED_SVG = ( - - Created with Sketch. - - - - - - - - - -); - -export const SLIDER_SWITCH_SVG = ( - - Created with Sketch. - - - - - - - - - -); - -export const SOUND_SVG = ( - - Created with Sketch. - - - - - - - - - - - -); - -export const SPEAKER_SVG = ( - - Created with Sketch. - - - - - - - - -); - -export const TEMPERATURE_SVG = ( - - - - - - - - - -); - -export const WIRELESS_SVG = ( - - - - - - - - - -); -export default LEFT_EDGE_SVG; - -export const GESTURE_SVG = ( - - - - - - - - - - - - - - - - - - -); -export const HUMIDITY_SVG = ( - - - - - - - - - - - - - -); -export const PRESSURE_SVG = ( - - - - - - - - - - - - - - - - - - - - - -); -export const PROXIMITY_SVG = ( - - - - - - - - - - - - - - - - - - - - -); -export const MAGNET_SVG = ( - - - - - -); -export const GYROSCOPE_SVG = ( - - - - - - - - - - - - - -); -export const COMPASS_SVG = ( - - - - - -); diff --git a/src/view/translations/en.json b/src/view/translations/en.json deleted file mode 100644 index 0a873c763..000000000 --- a/src/view/translations/en.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "toolbar-gpio.description": "8 GPIOs on the device! Pin A1 - A7 can also be used as capacitive touch sensors, and A0 is a true analog output pin.", - "toolbar-gpio.title": "GPIO", - "toolbar-gpio.tryItDescription": "Use your mouse to interact with the pin A1 - A7 or use your keyboard SHIFT + ”1” - “7”.", - "toolbar-ir-sensor.description": "Allows you to send commands to the device with a remote control, or even send messages between multiple devices! You can also do very simple proximity sensing since it reads the reflected light.", - "toolbar-ir-sensor.title": "IR Transmit & Receiver", - "toolbar-ir-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-light-sensor.description": "An analog light sensor can be used to detect ambient light, with similar spectral response to the human eye.", - "toolbar-light-sensor.title": "Light Sensor", - "toolbar-light-sensor.tryItDescription": "Change the brightness detected by the sensor here!", - "toolbar-motion-sensor.description": "Detects acceleration in X, Y and Z orientations. It can also detect 'tap' and 'double tap' strikes on the board and when the board is shaken.", - "toolbar-motion-sensor.title": "Motion Sensor", - "toolbar-motion-sensor.tryItDescription": "Change the acceleration here and click or click on the button to simulate a shake. The tap feature is not supported by the Device Simulator Express. If you would like to see the 'tap' feature implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-neo-pixels.description": "The 10 full color RGB LEDs surrounding the outer edge of the boards can be set to any color. Great for beautiful lighting effects!", - "toolbar-neo-pixels.title": "NeoPixels", - "toolbar-neo-pixels.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-a-b-push.description": "Two push buttons A and B are connected to digital pin #4 (Left) and #5 (Right) each.", - "toolbar-a-b-push.title": "Push Buttons", - "toolbar-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-red-led.description": "This Red LED is connected to the digital #13 GPIO pin. It can be very handy when you want an indicator LED.", - "toolbar-red-led.title": "Red LED", - "toolbar-red-led.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-sound-sensor.description": "A digital microphone can detect audio volume and even perform basic FFT functions but cannot read it like an analog voltage.", - "toolbar-sound-sensor.title": "Sound Sensor", - "toolbar-sound-sensor.tryItDescription": "If you would like to see the sound sensor implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-slider-switch.description": "This slide switch returns True or False depending on whether it's ON or OFF and can be used as a toggle switch in your code!", - "toolbar-slider-switch.title": "Slider Switch", - "toolbar-slider-switch.tryItDescription": "Click it with your mouse or press 'S' on your keyboard to switch it ON and OFF!", - "toolbar-speaker.description": "This speaker can play a .wav file and different tones and also has a class D amplifier that is connected to an output A0 pin built in! You can turn it off using the shutdown control on pin #11 on the physical device.", - "toolbar-speaker.title": "Speaker", - "toolbar-speaker.tryItDescription": "Right now the tones are not supported on the simulator. If you would like to see tones implemented, please +1 the feature addition issue on GitHub! Regardless, you can play it on your device!", - "toolbar-temperature-sensor.description": "This sensor uses an NTC thermistor to sense temperature an calculate it with the analog voltage on analog pin #A9.", - "toolbar-temperature-sensor.title": "Temperature Sensor", - "toolbar-temperature-sensor.tryItDescription": "You can set the temperature in degrees Celsius.", - "toolbar-accelerometer-sensor.title": "Accelerometer", - "toolbar-accelerometer-sensor.description": "An accelerometer measures the acceleration of your micro:bit; this component senses when the micro:bit is moved.", - "toolbar-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", - "toolbar-microbit-light-sensor.title": "Light Sensor", - "toolbar-microbit-temperature-sensor.title": "Temperature Sensor", - "toolbar-microbit-led.title": "LEDs", - "toolbar-microbit-led.description": "The microbit has 25 LEDs for you to play with. The LEDs have 9 levels of brightness.", - "toolbar-microbit-led.tryItDescription": "Run your code and see the LEDs light up!", - "toolbar-microbit-a-b-push.title": "Buttons", - "toolbar-microbit-a-b-push.description": "There are two buttons on the front of the micro:bit (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", - "toolbar-microbit-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-microbit-sound.title": "Sound", - "toolbar-microbit-sound.description": "Your BBC micro:bit can be programmed to make a wide variety of sounds - from single notes, tones and beats to your own musical compositions.", - "toolbar-microbit-sound.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-gpio.title": "GPIO (Pins)", - "toolbar-microbit-gpio.description": "On the bottom edge of your BBC micro:bit there are 25 gold strips, called pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", - "toolbar-microbit-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-wireless.title": "Bluetooth & Radio", - "toolbar-microbit-wireless.description": "micro:bits can use radio waves and bluetooth services to communicate with each other.", - - "toolbar-microbit-wireless.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-gesture-sensor.title": "Gesture", - "toolbar-microbit-gesture-sensor.description": "If you move your BBC micro:bit in a certain way (as a gesture) then the micro:bit is able to detect this. It can recognize the following gestures: up, down, left, right, face up, face down, freefall, 3g, 6g, 8g, and shake.", - - "toolbar-microbit-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", - "toolbar-microbit-compass-sensor.title": "Compass", - "toolbar-microbit-compass-sensor.description": "A digital compass is an input sensor that detects magnetic fields. Your BBC micro:bit has an inbuilt compass that can detect the direction in which it is facing.", - "toolbar-microbit-compass-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-temperature-sensor.title": "Temperature", - "toolbar-clue-temperature-sensor.description": "CLUE uses the BMP280 sensor, an environmental sensor with temperature. This precision sensor from Bosch is the best low-cost, precision sensing solution for measuring temperature with ±1.0°C accuracy.", - - "toolbar-clue-temperature-sensor.tryItDescription": "You can simulate the temperature in your code!", - - "toolbar-clue-light-sensor.title": "Light/Color Sensor", - "toolbar-clue-light-sensor.description": "The light sensor uses APDS9960 and is able to return the red, blue, green and clear light.", - "toolbar-clue-light-sensor.tryItDescription": "You can set the color values of the light detected.", - "toolbar-clue-accelerometer-sensor.title": "Accelerometer", - "toolbar-clue-accelerometer-sensor.description": " The 3-axis accelerometer, can tell you which direction is down towards the Earth (by measuring gravity) or how fast the board is accelerating in 3D space.", - "toolbar-clue-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", - "toolbar-clue-led.title": "Neopixel", - "toolbar-clue-led.description": "The CLUE has one full RGB LED (NeoPixel) on the back of the device.", - - "toolbar-clue-led.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-clue-a-b-push.title": "Buttons", - "toolbar-clue-a-b-push.description": "There are two buttons on the front of the CLUE (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", - "toolbar-clue-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-clue-gpio.title": "Input/Output (GPIO)", - "toolbar-clue-gpio.description": "On the bottom edge of your CLUE, you have 25 pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", - "toolbar-clue-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-sound-sensor.title": "Sound", - "toolbar-clue-sound-sensor.description": "The CLUE uses a PDM MEMS microphone. PDM is a little like 1-bit PWM. You clock the mic with a 1 MHz - 3 MHz clock rate, and on the data line you'll get a square wave out that syncs with the clock.", - "toolbar-clue-sound-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-pressure-sensor.title": "Pressure", - "toolbar-clue-pressure-sensor.description": "CLUE uses the BMP280 sensor for barometric pressure. Because pressure changes with altitude, you can also use it as an altimeter with ±1 meter accuracy.", - - "toolbar-clue-pressure-sensor.tryItDescription": "You can set the pressure here in hectoPascals (hPa).", - "toolbar-clue-humidity-sensor.title": "Humidity", - "toolbar-clue-humidity-sensor.description": "The SHT30-D sensor has an excellent ±2% relative humidity and ±0.5°C accuracy for most uses.", - "toolbar-clue-humidity-sensor.tryItDescription": "You can set the humidity in percentage (%) here.", - "toolbar-clue-gesture-sensor.title": "Gesture", - "toolbar-clue-gesture-sensor.description": "The gesture sensor can detect directional gestures (left to right, right to left, up to down, down to up), but in theory more complicated gestures like zig-zag, clockwise or counterclockwise circle, near to far, etc. could also be detected with additional code. ", - "toolbar-clue-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", - "toolbar-clue-proximity-sensor.title": "Proximity", - "toolbar-clue-proximity-sensor.description": "The proximity sensor uses APDS9960 and is able to return how close an object is to the front of the sensor. This is a number from 0 to 255 where the higher the number the closer an object is to the sensor. You won't be able to translate this into an absolute value in units like inches or millimeters, you can only see how it changes relative to other values.", - - "toolbar-clue-proximity-sensor.tryItDescription": "Set relative proximity to the sensor in values from 0 - 255, where 0 means very close and 255 means very far.", - - "toolbar-clue-bluetooth.title": "Bluetooth", - "toolbar-clue-bluetooth.description": "You can transmit data over Bluetooth to a computer or mobile device for data plotting and logging, or save it to the built in storage.", - "toolbar-clue-bluetooth.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! ", - "toolbar-clue-speaker.description": "The CLUE has a buzzer/speaker for playing tones and beeps.", - "toolbar-clue-magnet-sensor.title": "Magnetometer", - "toolbar-clue-magnet-sensor.description": "Sense the magnetic fields that surround us with this handy triple-axis magnetometer (compass) module. Magnetometers can sense where the strongest magnetic force is coming from, generally used to detect magnetic north, but can also be used for measuring magnetic fields.", - "toolbar-clue-magnet-sensor.tryItDescription": "You can set the magnetic field value in microTeslas (uT).", - "toolbar-clue-gyroscope-sensor.title": "Gyroscope", - "toolbar-clue-gyroscope-sensor.description": "The 3-axis gyroscope that can measure spin and twist users LSM6DS33.", - "toolbar-clue-gyroscope-sensor.tryItDescription": "Set the angular velocity in degrees/second." -} diff --git a/src/view/tsconfig.json b/src/view/tsconfig.json deleted file mode 100644 index 28c6454e0..000000000 --- a/src/view/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "compilerOptions": { - "module": "esnext", - "moduleResolution": "node", - "target": "es6", - "outDir": "out", - "lib": ["es6", "dom"], - "jsx": "react", - "sourceMap": true, - "rootDir": "..", - "strict": true, - "noUnusedLocals": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "experimentalDecorators": true - }, - "exclude": ["node_modules"], - "include": ["./index.tsx"] -} diff --git a/src/view/utils/MessageUtils.tsx b/src/view/utils/MessageUtils.tsx deleted file mode 100644 index 41e093455..000000000 --- a/src/view/utils/MessageUtils.tsx +++ /dev/null @@ -1,12 +0,0 @@ -interface vscode { - postMessage(message: any): void; -} - -declare const vscode: vscode; - -export const sendMessage = ( - type: string, - state: TState -) => { - vscode.postMessage({ command: type, text: state }); -}; diff --git a/src/view/viewUtils.tsx b/src/view/viewUtils.tsx deleted file mode 100644 index 1335d039f..000000000 --- a/src/view/viewUtils.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { SENSOR_LIST } from "./constants"; - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. -export interface ISliderProps { - minValue: number; - maxValue: number; - maxLabel: string; - minLabel: string; - type: string | SENSOR_LIST; - axisLabel: string; - value?: number; - onUpdateValue?: (sensor: SENSOR_LIST, value: number) => void; - step: number; -} - -export interface ISensorButtonProps { - label: string; - type: string; - onMouseUp?: (event: React.PointerEvent) => void; - onMouseDown?: (event: React.PointerEvent) => void; - onKeyUp?: (event: React.KeyboardEvent) => void; - onKeyDown?: (event: React.KeyboardEvent) => void; -} -export interface ISensorProps { - LABEL: string; - sliderProps: ISliderProps[]; - unitLabel: string; -} - -export const X_SLIDER_INDEX = 0; -export const Y_SLIDER_INDEX = 1; -export const Z_SLIDER_INDEX = 2; diff --git a/src/vscode_import.ts b/src/vscode_import.ts deleted file mode 100644 index d9b935355..000000000 --- a/src/vscode_import.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare const acquireVsCodeApi; - -const vscode = acquireVsCodeApi(); From e9d860c9108cd87a11200d1e27080ab5258d2c39 Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Fri, 17 Nov 2023 16:36:48 +0200 Subject: [PATCH 14/64] squash! --- CHANGELOG.md | 8 +- CODING_STANDARDS.md | 33 +- CONTRIBUTING.md | 24 +- LICENSE | 46 +- PRIVACY.md | 2 +- README.md | 782 ++- SECURITY.md | 5 +- Source/constants.ts | 1014 +-- Source/cpxWorkspace.ts | 36 +- Source/debugger/debugAdapter.ts | 84 +- Source/debugger/debugAdapterFactory.ts | 50 +- Source/debuggerCommunicationServer.ts | 235 +- Source/dev-requirements.txt | 2 +- Source/deviceContext.ts | 274 +- Source/extension.ts | 2080 +++--- Source/extension_utils/utils.ts | 300 +- Source/requirements.txt | 2 +- Source/serialMonitor.ts | 522 +- Source/serialPortControl.ts | 362 +- Source/service/PopupService.ts | 18 +- .../service/debuggerCommunicationService.ts | 44 +- Source/service/deviceSelectionService.ts | 14 +- Source/service/fileSelectionService.ts | 168 +- Source/service/messagingService.ts | 57 +- Source/service/setupService.ts | 1130 ++-- Source/service/telemetryHandlerService.ts | 1054 +-- Source/service/webviewService.ts | 147 +- Source/simulatorDebugConfigurationProvider.ts | 143 +- Source/telemetry/getPackageInfo.ts | 86 +- Source/telemetry/telemetryAI.ts | 134 +- Source/usbDetector.ts | 194 +- Source/view/App.css | 22 +- Source/view/App.spec.tsx | 40 +- Source/view/App.tsx | 152 +- Source/view/components/Button.tsx | 45 +- Source/view/components/Dropdown.tsx | 43 +- Source/view/components/clue/Clue.spec.tsx | 40 +- Source/view/components/clue/Clue.tsx | 262 +- Source/view/components/clue/ClueImage.tsx | 252 +- Source/view/components/clue/ClueSimulator.tsx | 550 +- Source/view/components/clue/Clue_svg.tsx | 2309 ++++--- .../components/cpx/Accessibility_utils.ts | 32 +- Source/view/components/cpx/Cpx.spec.tsx | 40 +- Source/view/components/cpx/Cpx.tsx | 164 +- Source/view/components/cpx/CpxImage.tsx | 688 +- Source/view/components/cpx/CpxSimulator.tsx | 730 +- Source/view/components/cpx/Cpx_svg.tsx | 5981 ++++++++--------- Source/view/components/cpx/Cpx_svg_style.tsx | 68 +- Source/view/components/cpx/Svg_utils.tsx | 156 +- .../components/microbit/Microbit.spec.tsx | 40 +- Source/view/components/microbit/Microbit.tsx | 206 +- .../components/microbit/MicrobitImage.tsx | 260 +- .../components/microbit/MicrobitSimulator.tsx | 452 +- .../view/components/microbit/Microbit_svg.tsx | 3661 +++++----- .../view/components/simulator/ActionBar.tsx | 60 +- .../toolbar/GenericSliderComponent.tsx | 66 +- Source/view/components/toolbar/Gesture.tsx | 117 +- .../view/components/toolbar/InputSlider.tsx | 212 +- .../view/components/toolbar/SensorButton.tsx | 59 +- .../components/toolbar/SensorModalUtils.tsx | 274 +- Source/view/components/toolbar/ToolBar.tsx | 392 +- .../view/components/toolbar/Toolbar.spec.tsx | 78 +- Source/view/constants.ts | 220 +- Source/view/container/device/Device.spec.tsx | 40 +- Source/view/container/device/Device.tsx | 48 +- Source/view/index.css | 10 +- Source/view/index.tsx | 10 +- Source/view/pages/gettingStarted.css | 60 +- Source/view/pages/gettingStarted.spec.tsx | 40 +- Source/view/styles/Button.css | 34 +- Source/view/styles/Dropdown.css | 28 +- Source/view/styles/InputSlider.css | 116 +- Source/view/styles/LightSensorBar.css | 24 +- Source/view/styles/MotionSensorBar.css | 18 +- Source/view/styles/SensorButton.css | 32 +- Source/view/styles/Simulator.css | 122 +- Source/view/styles/SimulatorSvg.css | 212 +- Source/view/styles/TemperatureSensorBar.css | 22 +- Source/view/styles/ToolBar.css | 232 +- Source/view/svgs/arrow_right_svg.tsx | 29 +- Source/view/svgs/close_svg.tsx | 39 +- Source/view/svgs/play_svg.tsx | 25 +- Source/view/svgs/refresh_svg.tsx | 27 +- Source/view/svgs/stop_svg.tsx | 29 +- Source/view/svgs/tag_input_svg.tsx | 41 +- Source/view/svgs/tag_output_svg.tsx | 39 +- Source/view/svgs/toolbar_svg.tsx | 1289 ++-- Source/view/translations/en.json | 204 +- Source/view/tsconfig.json | 34 +- Source/view/utils/MessageUtils.tsx | 8 +- Source/view/viewUtils.tsx | 36 +- assets/dark-theme/open-simulator.svg | 8 +- assets/dark-theme/run-on-simulator.svg | 8 +- assets/dark-theme/save-to-board.svg | 8 +- assets/light-theme/open-simulator.svg | 8 +- assets/light-theme/run-on-simulator.svg | 8 +- assets/light-theme/save-to-board.svg | 8 +- docs/developers-setup.md | 119 +- docs/how-to-use.md | 148 +- docs/install.md | 61 +- docs/telemetry.md | 12 +- gulpfile.js | 290 +- locales/en/out/constants.i18n.json | 84 +- locales/en/package.i18n.json | 32 +- misc/usbmapping.json | 31 +- package.json | 650 +- package.nls.json | 32 +- tsconfig.json | 22 +- tslint.json | 64 +- webpack.config.js | 162 +- 110 files changed, 15689 insertions(+), 15635 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 230138ddb..1c4b233df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,11 @@ # Change Log -All notable changes to the "embedded-python" extension will be documented in this file. +All notable changes to the "embedded-python" extension will be documented in +this file. -Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. +Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how +to structure this file. ## [Unreleased] -- Initial release \ No newline at end of file +- Initial release diff --git a/CODING_STANDARDS.md b/CODING_STANDARDS.md index 629e68791..a19ef621b 100644 --- a/CODING_STANDARDS.md +++ b/CODING_STANDARDS.md @@ -2,24 +2,31 @@ ## Coding guidelines for TypeScript -- The following standards are inspired from [Coding guidelines for TypeScript](https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines) (which you should follow when something is not specified in this document, although any pre-existing practices in a file being edited trump either style guide). +- The following standards are inspired from + [Coding guidelines for TypeScript](https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines) + (which you should follow when something is not specified in this document, + although any pre-existing practices in a file being edited trump either + style guide). ### Names - Use `PascalCase` for type names. -- Use `I` as a prefix for interface names only when an interface is implemented by a class. +- Use `I` as a prefix for interface names only when an interface is + implemented by a class. - Use `PascalCase` for enum values. - Use `camelCase` for function names. - Use `camelCase` for property names and local variables. -- Do not use `_` as a prefix for private properties (unless used as backing properties). +- Do not use `_` as a prefix for private properties (unless used as backing + properties). - Use whole words in names when possible. ### Types -- Do not export types/functions unless you need to share it across multiple components. +- Do not export types/functions unless you need to share it across multiple + components. - Do not introduce new types/values to the global namespace. -- Shared types should be defined in `types.ts`. - Within a file, type definitions should come first. +- Shared types should be defined in `types.ts`. Within a file, type + definitions should come first. ### null and undefined @@ -37,16 +44,21 @@ Use single quotes for strings. ### Imports - Use ES6 module imports. -- Do not use bare `import *`; all imports should either explicitly pull in an object or import an entire module, otherwise you're implicitly polluting the global namespace and making it difficult to figure out from code examination where a name originates from. +- Do not use bare `import *`; all imports should either explicitly pull in an + object or import an entire module, otherwise you're implicitly polluting the + global namespace and making it difficult to figure out from code examination + where a name originates from. ### Style - Use `prettier` to format `TypeScript` and `JavaScript` code. - Use arrow functions over anonymous function expressions. -- Always surround loop and conditional bodies with curly braces. Statements on the same line are allowed to omit braces. +- Always surround loop and conditional bodies with curly braces. Statements on + the same line are allowed to omit braces. - Open curly braces always go on the same line as whatever necessitates them. - Parenthesized constructs should have no surrounding whitespace. -- A single space follows commas, colons, and semicolons in those constructs. For example: +- A single space follows commas, colons, and semicolons in those constructs. + For example: - `for (var i = 0, n = str.length; i < 10; i++) { }` - `if (x < 10) { }` @@ -58,4 +70,5 @@ Use single quotes for strings. ## Coding Standards for Python -Please follow the [Google Python Style Guide](https://google.github.io/styleguide/pyguide.html). +Please follow the +[Google Python Style Guide](https://google.github.io/styleguide/pyguide.html). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c282e9a1a..f0c1cf0b4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,14 +1,18 @@ # Contributing -This project welcomes contributions and suggestions. Most contributions require you to -agree to a Contributor License Agreement (CLA) declaring that you have the right to, -and actually do, grant us the rights to use your contribution. For details, visit -https://cla.microsoft.com. +This project welcomes contributions and suggestions. Most contributions require +you to agree to a Contributor License Agreement (CLA) declaring that you have +the right to, and actually do, grant us the rights to use your contribution. For +details, visit https://cla.microsoft.com. -When you submit a pull request, a CLA-bot will automatically determine whether you need -to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the -instructions provided by the bot. You will only need to do this once across all repositories using our CLA. +When you submit a pull request, a CLA-bot will automatically determine whether +you need to provide a CLA and decorate the PR appropriately (e.g., label, +comment). Simply follow the instructions provided by the bot. You will only need +to do this once across all repositories using our CLA. -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). -For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) -or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. \ No newline at end of file +This project has adopted the +[Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). +For more information see the +[Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or +contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any +additional questions or comments. diff --git a/LICENSE b/LICENSE index 1a7e30ed5..1c80a7489 100644 --- a/LICENSE +++ b/LICENSE @@ -1,23 +1,23 @@ - Project Device Simulator Express - - Copyright (c) Microsoft Corporation. All rights reserved. - - MIT License - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. + Project Device Simulator Express + + Copyright (c) Microsoft Corporation. All rights reserved. + + MIT License + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. diff --git a/PRIVACY.md b/PRIVACY.md index c97adaf9a..aca263491 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -19,4 +19,4 @@ To disable telemetry, follow these steps: 2) Select **Preferences** 3) Select **Settings** 4) Search for `telemetry` -5) Uncheck the **Telemetry: Enable Telemetry** setting \ No newline at end of file +5) Uncheck the **Telemetry: Enable Telemetry** setting diff --git a/README.md b/README.md index fd019ee59..78f01934d 100644 --- a/README.md +++ b/README.md @@ -1,349 +1,433 @@ -# ⚠️ NOTE: this extension is no longer maintained! ⚠️ - -Please see the [deprecation notice](https://github.com/microsoft/vscode-python-devicesimulator/wiki/Deprecation-of-the-extension) for details. - -# Device Simulator Express, a Microsoft Garage project - -Make without limit! Device Simulator Express, a Microsoft Garage project, allows you to code microcontrollers without the hardware on hand! You can program your Adafruit Circuit Playground Express (CPX), your BBC micro:bit or the Adafruit CLUE! Test and debug your code on the device simulator and see the same -result when you plug in your actual microcontroller. Curious about the output of the device, the serial -monitor allows you to observe the device output. - -## Table of Contents - - [Devices we support](#devices-we-support) - - [Prerequisites](#prerequisites) - - [Adafruit Circuit Playground Express (CPX) Simulator](#adafruit-circuit-playground-express-cpx-simulator) - - [Features](#features) - - [Useful Links](#useful-links) - - [Keyboard Shortcuts](#keyboard-shortcuts) - - [BBC micro:bit Simulator](#bbc-microbit-simulator) - - [Features](#features-1) - - [Useful Links](#useful-links-1) - - [Keyboard Shortcuts](#keyboard-shortcuts-1) - - [Adafruit CLUE Simulator](#adafruit-clue-simulator) - - [Features](#features-2) - - [Useful Links](#useful-links-2) - - [Keyboard Shortcuts](#keyboard-shortcuts-2) - - [How to use](#how-to-use) - - [Commands](#commands) - - [Contribute](#contribute) - - [Provide feedback](#provide-feedback) - - [Privacy and Telemetry Notice](#privacy-and-telemetry-notice) - - [Third Party Notice](#third-party-notice) - - [Troubleshooting Tips](#troubleshooting-tips) - - [License](#license) - - [Notes](#notes) - -## Devices we support - -- [**Adafruit Circuit Playground Express (CPX)**](#adafruit-circuit-playground-express-cpx-simulator) - - [CircuitPlayground Express](#adafruit-circuit-playground-express-cpx-simulator) - -- [**BBC micro:bit**](#bbc-microbit-simulator) - - [bbc micro:bit](#bbc-microbit-simulator) - -- [**Adafruit CLUE**](#adafruit-clue-simulator) - - [Adafruit CLUE](#adafruit-clue-simulator) - -## Build Status - -| Branch | Build Status | -| :------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| dev | [![Build Status](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_apis/build/status/Adafruit/Pacifica-CI?branchName=dev)](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_build/latest?definitionId=304&branchName=dev) | -| staging | [![Build Status](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_apis/build/status/Adafruit/Pacifica-CI?branchName=staging)](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_build/latest?definitionId=304&branchName=staging) | -| master | [![Build Status](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_apis/build/status/Adafruit/Pacifica-CI?branchName=master)](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_build/latest?definitionId=304&branchName=master) | - -## Prerequisites - -The following dependencies are required to install before launching Device Simulator Express. -You will be prompted to install the Python dependencies during the first use. - -- _**[Visual Studio Code](https://code.visualstudio.com/)**_ -- _**[Python 3.7+](https://www.python.org/downloads/)**_: Make sure you've added Python and pip to your PATH in your environment variables. (1) -- _**[Python VS Code extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python)**_: This will be installed automatically from the marketplace when you install Device Simulator Express. - -## Adafruit Circuit Playground Express (CPX) Simulator - -### Features - -- IntelliSense and syntax highlighting for CircuitPython code for the CPX library -- Template file generation -- Integrated Python Debugging for the Simulator -- Serial monitor (available on Windows and Mac only) -- Output panel for the simulator -- Deploy CircuitPython code to the physical device. -- Simulation of the CPX device, including: - - Green LED - - Red LED - - Push Buttons A and B - - Slider Switch - - Speaker: Play .wav file - - 10 NeoPixels - - Light sensor - - Motion sensors - - Acceleration detection - - Device shake detection - - Temperature sensor - - 7 Capacitive Touch sensors - -The simulator supports most of the sensors on CPX except **IR transmitter & Receiver**, **Sound Sensor (microphone)**, **Speaker (Play Tone)** and the **"tap" on Motion Sensor**. -The code related to these sensors can still run on the actual CPX board and be deployed using Device Simulator Express. -As we only support CPX library now, other libraries (i.e. simpleio) can’t run on the simulator. But they will work on the actual device! - -### Useful Links - -- Tutorials and Example Code for Adafruit CPX: - - [Adafruit CPX library tutorial](https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library) - - [Adafruit CPX Examples on GitHub](https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples) - - [Adafruit CPX Guided Tour (Intro for the Hardware)](https://learn.adafruit.com/adafruit-circuit-playground-express/guided-tour) -- Format Adafruit CPX device: - - [Tutorial for formatting Adafruit CPX for CircuitPython](https://learn.adafruit.com/welcome-to-circuitpython/installing-circuitpython) - - [Download Firmware .uf2 file](https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart) - - [Download the latest version of the Adafruit CPX library](https://learn.adafruit.com/welcome-to-circuitpython/circuitpython-libraries) - -### Keyboard Shortcuts - -In Device Simulator Express, you can use keyboard to interact with the device: - -- Push Button: A for Button A, B for Button B, C for Buttons A & B -- Capacitive Touch Sensor: Shift + 1 ~ 7 for GPIO pins A1 - A7 -- Slider Switch: Shift + S -- Refresh the simulator: Shift + R -- Run the simulator: Shift + F - -## BBC micro:bit Simulator - -### Features - -- IntelliSense and syntax highlighting for MicroPython code for the micro:bit library -- Template file generation -- Integrated Python Debugging for the Simulator -- Deploy MicroPython code to the physical device -- Serial monitor (available on Windows and Mac only) -- Simulation of the micro:bit device, including: - - 25 LEDs - - Push Buttons A and B - - Light sensor - - Motion sensors - - Acceleration detection including gesture detection - - Temperature sensor - -### Useful Links - -- Tutorials and Example Code for BBC micro:bit: - - [MicroPython documentation](https://microbit-micropython.readthedocs.io/en/latest/) - - [BBC micro:bit examples on the official micro:bit website](https://microbit.org/projects/make-it-code-it/?filters=python) - -### Keyboard Shortcuts - -- Push Button: A for Button A, B for Button B, C for Buttons A & B -- Refresh the simulator: Shift + R -- Run the simulator: Shift + F - -## Adafruit CLUE Simulator - -### Features - -- IntelliSense and syntax highlighting for CircuitPython code for the following drivers and libraries: - - `adafruit_clue` - - `adafruit_slideshow` - - `adafruit_display_shapes` - - `adafruit_display_text` - - `adafruit_bitmap_font` - - `adafruit_fancyled` - - `neopixel` - - `displayio` -- Template file generation -- Integrated Python Debugging for the Simulator -- Deploy CircuitPython code to the physical device -- Serial monitor (available on Windows and Mac only) -- Simulation of the CLUE device, including: - - 240x240 color screen - - Push Buttons A and B - - Sensors for: - - Temperature - - Light - - Color - - Acceleration - - Humidity - - Pressure - - Proximity - - Gestures - - Gyro - - Magnetic Field - -### Useful Links - -- Tutorials and Example Code for Adafruit CLUE: - - [Adafruit CLUE Overview](https://learn.adafruit.com/adafruit-clue) - - [Adafruit CLUE Examples on GitHub](https://github.com/adafruit/Adafruit_CircuitPython_CLUE/tree/master/examples) - -### Keyboard Shortcuts - -- Push Button: A for Button A, B for Button B, C for Buttons A & B -- Refresh the simulator: Shift + R -- Run the simulator: Shift + F - -## How to use - -To use Device Simulator Express, install the extension from the marketplace and reload VS Code. - -To access many of the commands, you need to open the command palette. This can be done with Ctrl + Shift + P for Windows and Linux / Cmd + Shift + P for Mac. It can also be accessed from the toolbar by going to `View -> Command Palette`. - -### I. Take a look at the "Device Simulator Express: Getting Started" Command. - -1. Type in `"Device Simulator Express: Getting Started"` in the command palette (Ctrl + Shift + P / Cmd + Shift + P to open the command palette). -2. Choose the the device you want to play with from the dropdown. -3. Read, copy and learn some of the things you can do with the simulator! - -Getting Started - -### II. Start with the "Device Simulator Express: New File" Command. - -1. Type in `"Device Simulator Express: New File"` in the command palette (Ctrl + Shift + P / Cmd + Shift + P to open the command palette). -2. Select the device you want to use. -3. Name and save your file somewhere, and we’re good to go! -4. Start with some examples: you can find examples files and tutorials inside the comments at the top of the file. - -"New File" animation - -### III. Start from an existing Python file. - -1. Open the folder or your .py file in Visual Studio Code. -2. Run `Device Simulator Express: Open Simulator` from the command palette or icon in the editor toolbar. -3. Select the device you want to use. - -### IV. Run your code on the simulator. - -1. Run `Run Simulator` from the command palette or use the `Play` button on the simulator webview. - -How to run the simulator animation - -### V. Deploy your code to the physical device - -Before deploying the Python code to your CPX device, you need to format your device by following these tutorials: - -- _For the CPX_: - - - Download the firmware with the .uf2 file (link: https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart). - - Download the lastest versions of the cpx libraries (link: https://learn.adafruit.com/welcome-to-circuitpython/circuitpython-libraries). - -- _For the micro:bit_: - - - Download the firmware with the .hex file (link: https://microbit.org/get-started/user-guide/firmware/). - -- _For the CLUE_: - - Download the latest versions of the cpx libraries and follow the instructions here (link:https://learn.adafruit.com/adafruit-clue/circuitpython). - -1. Plug in your device (make sure it’s formatted properly already). -2. Run the command `"Device Simulator Express: Deploy to Device"`. - -Deploy to Device - -### VI. Use the Serial Monitor for your device (available on Windows and Mac only) - -1. Plug in your device (make sure it’s formatted properly already). -2. Run the command `"Device Simulator Express: Open Serial Monitor"`. -3. Select your baud rate for the serial port. -4. The `print()` statements in your code will show in the output console. - -### VII. Debug your project on the simulator - -1. Add breakpoints in your code -2. Press F5 to enter the debugging mode, and you can start debugging line by line! - -### Commands - -Device Simulator Express provides several commands in the Command Palette (F1 or Ctrl + Shift + P / Cmd + Shift + P for Mac OS) for working with \*.py files: - -- `Device Simulator Express: Getting Started`: Opens a page in VS Code that helps users get started with the extension. Here, users can browse through code that they can use to play with the simulators. -- `Device Simulator Express: Run Simulator`: Runs Python code on the simulator. -- `Device Simulator Express: New File`: Opens an unsaved .py file with template code, also opens the simulator for the selected device. -- `Device Simulator Express: Open Simulator`: Opens the simulator in the simulator window for the selected device -- `Device Simulator Express: Deploy to Device`: Copies the current file to the selected device. -- `Device Simulator Express: Open Serial Monitor`: Opens the serial monitor in the integrated output window. -- `Device Simulator Express: Close Serial Monitor`: Stops the serial monitor and releases the serial port. -- `Device Simulator Express: Change Baud Rate`: Changes the baud rate of the selected serial port. For Adafruit CPX, the default baud rate is 115200. -- `Device Simulator Express: Select Serial Port`: Changes the current serial port. - -## Contribute - -[See here for steps to run the extension locally.](https://github.com/microsoft/vscode-python-devicesimulator/blob/dev/docs/developers-setup.md) - -## Provide feedback - -To add a review for our extension, please do so on the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-python.devicesimulatorexpress) - -To report issues, provide feedback or requests, please use this link: [Provide Feedback](https://github.com/microsoft/vscode-python-devicesimulator/issues). -We would love to hear from you about your experience to keep improving our project. - -## Privacy and Telemetry Notice - -### Data Collection - -The software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft's privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices. - -### Disable Telemetry - -The Microsoft Device Simulator Express Extension for Visual Studio Code collects usage -data and sends it to Microsoft to help improve our products and -services. Read our -[privacy statement](https://privacy.microsoft.com/privacystatement) to -learn more. This extension respects the `telemetry.enableTelemetry` -setting which you can learn more about at -https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting. - -To disable telemetry, follow these steps: - -1. Open **File** (Open **Code** on macOS) -2. Select **Preferences** -3. Select **Settings** -4. Search for `telemetry` -5. Uncheck the **Telemetry: Enable Telemetry** setting - -## Third Party Notice - -A `ThirdPartyNotices.txt` file is provided in the extension's source code listing the appropriate third-party notices. - -## Troubleshooting Tips - -- The first time you install the extension, you'll need to execute the `run` command at least once in order to access auto-completion. -- While running a code file, if you get an error saying it can't find the file, make sure you've clicked on a valid Python code file before running it. -- To open the output panel again after closing it go to VS Code menu: `View -> Output`. -- If you try to deploy to the CPX while it's plugged in but you still get an error saying it cannot find the board, make sure your device is formatted correctly and that its name matches `CIRCUITPY`. -- If you can't get the Simulator communication working while debugging, try to open your `Settings` and check the port used under `"Device Simulator Express: Debugger Server Port"`. You can either change it (usually ports above 5000 should work) or try to free it, then start debugging again. -- When you are using the serial monitor, if you get some unusual error messages, unplug the device and reload the VS Code windows. -- If you're using Ubuntu and having some problems with setting up the environment, try reviewing [this article's](https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-local-programming-environment-on-ubuntu-16-04) "Step 1" section on how to set up Python 3 on Ubuntu 16.04. Then, ensure that you've run `sudo apt-get install -y python3-venv` to allow for virtual environment creation. - -## License - - Device Simulator Express, a Microsoft Garage project - - Copyright (c) Microsoft Corporation. All rights reserved. - - MIT License - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - -## Notes - -1. Make sure that when you type _python_ in a terminal, the command is recognized and you have the correct version. The easiest way to do it is to select the "Add to PATH" option directly when you install Python. Otherwise you can search how to insert it manually. -2. You can choose to see the prompt or not by changing the extension configurations. +# ⚠️ NOTE: this extension is no longer maintained! ⚠️ + +Please see the +[deprecation notice](https://github.com/microsoft/vscode-python-devicesimulator/wiki/Deprecation-of-the-extension) +for details. + +# Device Simulator Express, a Microsoft Garage project + +Make without limit! Device Simulator Express, a Microsoft Garage project, allows +you to code microcontrollers without the hardware on hand! You can program your +Adafruit Circuit Playground Express (CPX), your BBC micro:bit or the Adafruit +CLUE! Test and debug your code on the device simulator and see the same result +when you plug in your actual microcontroller. Curious about the output of the +device, the serial monitor allows you to observe the device output. + +## Table of Contents + +- [Devices we support](#devices-we-support) +- [Prerequisites](#prerequisites) +- [Adafruit Circuit Playground Express (CPX) Simulator](#adafruit-circuit-playground-express-cpx-simulator) + - [Features](#features) + - [Useful Links](#useful-links) + - [Keyboard Shortcuts](#keyboard-shortcuts) +- [BBC micro:bit Simulator](#bbc-microbit-simulator) + - [Features](#features-1) + - [Useful Links](#useful-links-1) + - [Keyboard Shortcuts](#keyboard-shortcuts-1) +- [Adafruit CLUE Simulator](#adafruit-clue-simulator) + - [Features](#features-2) + - [Useful Links](#useful-links-2) + - [Keyboard Shortcuts](#keyboard-shortcuts-2) +- [How to use](#how-to-use) + - [Commands](#commands) +- [Contribute](#contribute) +- [Provide feedback](#provide-feedback) +- [Privacy and Telemetry Notice](#privacy-and-telemetry-notice) +- [Third Party Notice](#third-party-notice) +- [Troubleshooting Tips](#troubleshooting-tips) +- [License](#license) +- [Notes](#notes) + +## Devices we support + +- [**Adafruit Circuit Playground Express (CPX)**](#adafruit-circuit-playground-express-cpx-simulator) + + [CircuitPlayground Express](#adafruit-circuit-playground-express-cpx-simulator) + +- [**BBC micro:bit**](#bbc-microbit-simulator) + + [bbc micro:bit](#bbc-microbit-simulator) + +- [**Adafruit CLUE**](#adafruit-clue-simulator) + + [Adafruit CLUE](#adafruit-clue-simulator) + +## Build Status + +| Branch | Build Status | +| :------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| dev | [![Build Status](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_apis/build/status/Adafruit/Pacifica-CI?branchName=dev)](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_build/latest?definitionId=304&branchName=dev) | +| staging | [![Build Status](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_apis/build/status/Adafruit/Pacifica-CI?branchName=staging)](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_build/latest?definitionId=304&branchName=staging) | +| master | [![Build Status](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_apis/build/status/Adafruit/Pacifica-CI?branchName=master)](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_build/latest?definitionId=304&branchName=master) | + +## Prerequisites + +The following dependencies are required to install before launching Device +Simulator Express. +You will be prompted to install the Python dependencies during the first use. + +- _**[Visual Studio Code](https://code.visualstudio.com/)**_ +- _**[Python 3.7+](https://www.python.org/downloads/)**_: Make sure you've + added Python and pip to your PATH in your environment variables. (1) +- _**[Python VS Code extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python)**_: + This will be installed automatically from the marketplace when you install + Device Simulator Express. + +## Adafruit Circuit Playground Express (CPX) Simulator + +### Features + +- IntelliSense and syntax highlighting for CircuitPython code for the CPX + library +- Template file generation +- Integrated Python Debugging for the Simulator +- Serial monitor (available on Windows and Mac only) +- Output panel for the simulator +- Deploy CircuitPython code to the physical device. +- Simulation of the CPX device, including: + - Green LED + - Red LED + - Push Buttons A and B + - Slider Switch + - Speaker: Play .wav file + - 10 NeoPixels + - Light sensor + - Motion sensors + - Acceleration detection + - Device shake detection + - Temperature sensor + - 7 Capacitive Touch sensors + +The simulator supports most of the sensors on CPX except **IR transmitter & +Receiver**, **Sound Sensor (microphone)**, **Speaker (Play Tone)** and the +**"tap" on Motion Sensor**. The code related to these sensors can still run on +the actual CPX board and be deployed using Device Simulator Express. +As we only support CPX library now, other libraries (i.e. simpleio) can’t run on +the simulator. But they will work on the actual device! + +### Useful Links + +- Tutorials and Example Code for Adafruit CPX: + - [Adafruit CPX library tutorial](https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library) + - [Adafruit CPX Examples on GitHub](https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples) + - [Adafruit CPX Guided Tour (Intro for the Hardware)](https://learn.adafruit.com/adafruit-circuit-playground-express/guided-tour) +- Format Adafruit CPX device: + - [Tutorial for formatting Adafruit CPX for CircuitPython](https://learn.adafruit.com/welcome-to-circuitpython/installing-circuitpython) + - [Download Firmware .uf2 file](https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart) + - [Download the latest version of the Adafruit CPX library](https://learn.adafruit.com/welcome-to-circuitpython/circuitpython-libraries) + +### Keyboard Shortcuts + +In Device Simulator Express, you can use keyboard to interact with the device: + +- Push Button: A for Button A, B for Button B, + C for Buttons A & B +- Capacitive Touch Sensor: Shift + 1 ~ 7 for + GPIO pins A1 - A7 +- Slider Switch: Shift + S +- Refresh the simulator: Shift + R +- Run the simulator: Shift + F + +## BBC micro:bit Simulator + +### Features + +- IntelliSense and syntax highlighting for MicroPython code for the micro:bit + library +- Template file generation +- Integrated Python Debugging for the Simulator +- Deploy MicroPython code to the physical device +- Serial monitor (available on Windows and Mac only) +- Simulation of the micro:bit device, including: + - 25 LEDs + - Push Buttons A and B + - Light sensor + - Motion sensors + - Acceleration detection including gesture detection + - Temperature sensor + +### Useful Links + +- Tutorials and Example Code for BBC micro:bit: + - [MicroPython documentation](https://microbit-micropython.readthedocs.io/en/latest/) + - [BBC micro:bit examples on the official micro:bit website](https://microbit.org/projects/make-it-code-it/?filters=python) + +### Keyboard Shortcuts + +- Push Button: A for Button A, B for Button B, + C for Buttons A & B +- Refresh the simulator: Shift + R +- Run the simulator: Shift + F + +## Adafruit CLUE Simulator + +### Features + +- IntelliSense and syntax highlighting for CircuitPython code for the + following drivers and libraries: + - `adafruit_clue` + - `adafruit_slideshow` + - `adafruit_display_shapes` + - `adafruit_display_text` + - `adafruit_bitmap_font` + - `adafruit_fancyled` + - `neopixel` + - `displayio` +- Template file generation +- Integrated Python Debugging for the Simulator +- Deploy CircuitPython code to the physical device +- Serial monitor (available on Windows and Mac only) +- Simulation of the CLUE device, including: + - 240x240 color screen + - Push Buttons A and B + - Sensors for: + - Temperature + - Light + - Color + - Acceleration + - Humidity + - Pressure + - Proximity + - Gestures + - Gyro + - Magnetic Field + +### Useful Links + +- Tutorials and Example Code for Adafruit CLUE: + - [Adafruit CLUE Overview](https://learn.adafruit.com/adafruit-clue) + - [Adafruit CLUE Examples on GitHub](https://github.com/adafruit/Adafruit_CircuitPython_CLUE/tree/master/examples) + +### Keyboard Shortcuts + +- Push Button: A for Button A, B for Button B, + C for Buttons A & B +- Refresh the simulator: Shift + R +- Run the simulator: Shift + F + +## How to use + +To use Device Simulator Express, install the extension from the marketplace and +reload VS Code. + +To access many of the commands, you need to open the command palette. This can +be done with Ctrl + Shift + P for Windows and +Linux / Cmd + Shift + P for Mac. It can also be +accessed from the toolbar by going to `View -> Command Palette`. + +### I. Take a look at the "Device Simulator Express: Getting Started" Command. + +1. Type in `"Device Simulator Express: Getting Started"` in the command palette + (Ctrl + Shift + P / Cmd + + Shift + P to open the command palette). +2. Choose the the device you want to play with from the dropdown. +3. Read, copy and learn some of the things you can do with the simulator! + +Getting Started + +### II. Start with the "Device Simulator Express: New File" Command. + +1. Type in `"Device Simulator Express: New File"` in the command palette + (Ctrl + Shift + P / Cmd + + Shift + P to open the command palette). +2. Select the device you want to use. +3. Name and save your file somewhere, and we’re good to go! +4. Start with some examples: you can find examples files and tutorials inside + the comments at the top of the file. + +"New File" animation + +### III. Start from an existing Python file. + +1. Open the folder or your .py file in Visual Studio Code. +2. Run `Device Simulator Express: Open Simulator` from the command palette or + icon in the editor toolbar. +3. Select the device you want to use. + +### IV. Run your code on the simulator. + +1. Run `Run Simulator` from the command palette or use the `Play` button on the + simulator webview. + +How to run the simulator animation + +### V. Deploy your code to the physical device + +Before deploying the Python code to your CPX device, you need to format your +device by following these tutorials: + +- _For the CPX_: + + - Download the firmware with the .uf2 file (link: + https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart). + - Download the lastest versions of the cpx libraries (link: + https://learn.adafruit.com/welcome-to-circuitpython/circuitpython-libraries). + +- _For the micro:bit_: + + - Download the firmware with the .hex file (link: + https://microbit.org/get-started/user-guide/firmware/). + +- _For the CLUE_: + - Download the latest versions of the cpx libraries and follow the + instructions here + (link:https://learn.adafruit.com/adafruit-clue/circuitpython). + +1. Plug in your device (make sure it’s formatted properly already). +2. Run the command `"Device Simulator Express: Deploy to Device"`. + +Deploy to Device + +### VI. Use the Serial Monitor for your device (available on Windows and Mac only) + +1. Plug in your device (make sure it’s formatted properly already). +2. Run the command `"Device Simulator Express: Open Serial Monitor"`. +3. Select your baud rate for the serial port. +4. The `print()` statements in your code will show in the output console. + +### VII. Debug your project on the simulator + +1. Add breakpoints in your code +2. Press F5 to enter the debugging mode, and you can start debugging line by + line! + +### Commands + +Device Simulator Express provides several commands in the Command Palette +(F1 or Ctrl + Shift + P / +Cmd + Shift + P for Mac OS) for working with +\*.py files: + +- `Device Simulator Express: Getting Started`: Opens a page in VS Code that + helps users get started with the extension. Here, users can browse through + code that they can use to play with the simulators. +- `Device Simulator Express: Run Simulator`: Runs Python code on the + simulator. +- `Device Simulator Express: New File`: Opens an unsaved .py file with + template code, also opens the simulator for the selected device. +- `Device Simulator Express: Open Simulator`: Opens the simulator in the + simulator window for the selected device +- `Device Simulator Express: Deploy to Device`: Copies the current file to the + selected device. +- `Device Simulator Express: Open Serial Monitor`: Opens the serial monitor in + the integrated output window. +- `Device Simulator Express: Close Serial Monitor`: Stops the serial monitor + and releases the serial port. +- `Device Simulator Express: Change Baud Rate`: Changes the baud rate of the + selected serial port. For Adafruit CPX, the default baud rate is 115200. +- `Device Simulator Express: Select Serial Port`: Changes the current serial + port. + +## Contribute + +[See here for steps to run the extension locally.](https://github.com/microsoft/vscode-python-devicesimulator/blob/dev/docs/developers-setup.md) + +## Provide feedback + +To add a review for our extension, please do so on the +[Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-python.devicesimulatorexpress) + +To report issues, provide feedback or requests, please use this link: +[Provide Feedback](https://github.com/microsoft/vscode-python-devicesimulator/issues). +We would love to hear from you about your experience to keep improving our +project. + +## Privacy and Telemetry Notice + +### Data Collection + +The software may collect information about you and your use of the software and +send it to Microsoft. Microsoft may use this information to provide services and +improve our products and services. You may turn off the telemetry as described +in the repository. There are also some features in the software that may enable +you and Microsoft to collect data from users of your applications. If you use +these features, you must comply with applicable law, including providing +appropriate notices to users of your applications together with a copy of +Microsoft's privacy statement. Our privacy statement is located at +https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data +collection and use in the help documentation and our privacy statement. Your use +of the software operates as your consent to these practices. + +### Disable Telemetry + +The Microsoft Device Simulator Express Extension for Visual Studio Code collects +usage data and sends it to Microsoft to help improve our products and services. +Read our [privacy statement](https://privacy.microsoft.com/privacystatement) to +learn more. This extension respects the `telemetry.enableTelemetry` setting +which you can learn more about at +https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting. + +To disable telemetry, follow these steps: + +1. Open **File** (Open **Code** on macOS) +2. Select **Preferences** +3. Select **Settings** +4. Search for `telemetry` +5. Uncheck the **Telemetry: Enable Telemetry** setting + +## Third Party Notice + +A `ThirdPartyNotices.txt` file is provided in the extension's source code +listing the appropriate third-party notices. + +## Troubleshooting Tips + +- The first time you install the extension, you'll need to execute the `run` + command at least once in order to access auto-completion. +- While running a code file, if you get an error saying it can't find the + file, make sure you've clicked on a valid Python code file before running + it. +- To open the output panel again after closing it go to VS Code menu: + `View -> Output`. +- If you try to deploy to the CPX while it's plugged in but you still get an + error saying it cannot find the board, make sure your device is formatted + correctly and that its name matches `CIRCUITPY`. +- If you can't get the Simulator communication working while debugging, try to + open your `Settings` and check the port used under + `"Device Simulator Express: Debugger Server Port"`. You can either change it + (usually ports above 5000 should work) or try to free it, then start + debugging again. +- When you are using the serial monitor, if you get some unusual error + messages, unplug the device and reload the VS Code windows. +- If you're using Ubuntu and having some problems with setting up the + environment, try reviewing + [this article's](https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-local-programming-environment-on-ubuntu-16-04) + "Step 1" section on how to set up Python 3 on Ubuntu 16.04. Then, ensure + that you've run `sudo apt-get install -y python3-venv` to allow for virtual + environment creation. + +## License + + Device Simulator Express, a Microsoft Garage project + + Copyright (c) Microsoft Corporation. All rights reserved. + + MIT License + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +## Notes + +1. Make sure that when you type _python_ in a terminal, the command is + recognized and you have the correct version. The easiest way to do it is to + select the "Add to PATH" option directly when you install Python. Otherwise + you can search how to insert it manually. +2. You can choose to see the prompt or not by changing the extension + configurations. diff --git a/SECURITY.md b/SECURITY.md index 034e84803..d906fed6e 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -16,6 +16,5 @@ currently being supported with security updates. Use this section to tell people how to report a vulnerability. -Tell them where to go, how often they can expect to get an update on a -reported vulnerability, what to expect if the vulnerability is accepted or -declined, etc. +Tell them where to go, how often they can expect to get an update on a reported +vulnerability, what to expect if the vulnerability is accepted or declined, etc. diff --git a/Source/constants.ts b/Source/constants.ts index b14d875f0..fe702c639 100644 --- a/Source/constants.ts +++ b/Source/constants.ts @@ -7,549 +7,549 @@ import * as nls from "vscode-nls"; // Debugger Server export const SERVER_INFO = { - DEFAULT_SERVER_PORT: 5577, - ERROR_CODE_INIT_SERVER: "ERROR_INIT_SERVER", - SERVER_PORT_CONFIGURATION: "deviceSimulatorExpress.debuggerServerPort", + DEFAULT_SERVER_PORT: 5577, + ERROR_CODE_INIT_SERVER: "ERROR_INIT_SERVER", + SERVER_PORT_CONFIGURATION: "deviceSimulatorExpress.debuggerServerPort", }; const localize: nls.LocalizeFunc = nls.config({ - messageFormat: nls.MessageFormat.file, + messageFormat: nls.MessageFormat.file, })(); export const CONFIG = { - CONFIG_ENV_ON_SWITCH: - "deviceSimulatorExpress.configNewEnvironmentUponSwitch", - PYTHON_PATH: "python.pythonPath", - SHOW_DEPENDENCY_INSTALL: "deviceSimulatorExpress.showDependencyInstall", - SHOW_NEW_FILE_POPUP: "deviceSimulatorExpress.showNewFilePopup", + CONFIG_ENV_ON_SWITCH: + "deviceSimulatorExpress.configNewEnvironmentUponSwitch", + PYTHON_PATH: "python.pythonPath", + SHOW_DEPENDENCY_INSTALL: "deviceSimulatorExpress.showDependencyInstall", + SHOW_NEW_FILE_POPUP: "deviceSimulatorExpress.showNewFilePopup", }; export const CONSTANTS = { - WEBVIEW_TYPE: { - SIMULATOR: "simulator", - TUTORIAL: "tutorial", - }, - DEBUG_CONFIGURATION_TYPE: "deviceSimulatorExpress", - DEVICE_NAME: { - CPX: "CPX", - MICROBIT: "micro:bit", - CLUE: "CLUE", - }, - DEVICE_NAME_FORMAL: { - CPX: "Circuit Playground Express", - MICROBIT: "micro:bit", - CLUE: "CLUE", - }, - SCRIPT_PATH: { - SIMULATOR: "out/simulator.js", - VSCODE_API: "out/vscode_import.js", - }, - ERROR: { - BAD_PYTHON_PATH: - 'Your interpreter is not pointing to a valid Python executable. Please select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application', - COMPORT_UNKNOWN_ERROR: - "Writing to COM port (GetOverlappedResult): Unknown error code 121", - CPX_FILE_ERROR: localize( - "error.cpxFileFormat", - "The cpx.json file format is not correct." - ), - DEBUGGER_SERVER_INIT_FAILED: (port: number) => { - return localize( - "error.debuggerServerInitFailed", - `Warning : The Debugger Server cannot be opened. Please try to free the port ${port} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.` - ); - }, - DEBUGGING_SESSION_IN_PROGESS: localize( - "error.debuggingSessionInProgress", - "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n" - ), - DEPENDENCY_DOWNLOAD_ERROR: - "Dependency download could not be completed. Functionality may be limited. Please review the installation docs.", - - FAILED_TO_OPEN_SERIAL_PORT: (port: string): string => { - return localize( - "error.failedToOpenSerialPort", - `[ERROR] Failed to open serial port ${port}.` - ); - }, - FAILED_TO_OPEN_SERIAL_PORT_DUE_TO: (port: string, error: any) => { - return localize( - "error.failedToOpenSerialPortDueTo", - `[ERROR] Failed to open serial port ${port} due to error: ${error}. \n` - ); - }, - INSTALLATION_ERROR: localize( - "error.installationError", - "Installation Error" - ), - - INVALID_FILE_EXTENSION_DEBUG: localize( - "error.invalidFileExtensionDebug", - "The file you tried to run isn't a Python file." - ), - INVALID_PYTHON_PATH: localize( - "error.invalidPythonPath", - 'We found that your selected Python interpreter version is too low to run the extension. Please upgrade to version 3.7+ or select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application.' - ), - LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT: localize( - "error.lowPythonVersionForMicrobitDeployment", - "To deploy your code to the micro:bit, you must be using Python 3.3+" - ), - NO_DEVICE: localize( - "error.noDevice", - "The device is not detected. Please double check if your board is connected and/or properly formatted" - ), - NO_FILE_TO_RUN: localize( - "error.noFileToRun", - '[ERROR] We can\'t find a Python file to run. Please make sure you select or open a new ".py" code file, or use the "New File" command to get started and see useful links.\n' - ), - NO_FILE_TO_DEPLOY: localize( - "error.noFileToDeploy", - "[ERROR] We can't find a Python file to deploy to your device.\n" - ), - NO_FOLDER_OPENED: localize( - "error.noFolderCreated", - "In order to use the Serial Monitor, you need to open a folder and reload VS Code." - ), - NO_PROGRAM_FOUND_DEBUG: localize( - "error.noProgramFoundDebug", - "Cannot find a program to debug." - ), - NO_PYTHON_PATH: localize( - "error.noPythonPath", - "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again." - ), - RECONNECT_DEVICE: localize( - "error.reconnectDevice", - "Please disconnect your Circuit Playground Express and try again." - ), - STDERR: (data: string) => { - return localize("error.stderr", `\n[ERROR] ${data} \n`); - }, - UNEXPECTED_MESSAGE: localize( - "error.unexpectedMessage", - "Webview sent an unexpected message" - ), - }, - FILESYSTEM: { - BASE_CIRCUITPYTHON: "base_circuitpython", - CLUE: "clue", - PYTHON_VENV_DIR: "venv", - MICROPYTHON_DIRECTORY: "micropython", - OUTPUT_DIRECTORY: "out", - }, - INFO: { - ALREADY_SUCCESSFUL_INSTALL: localize( - "info.successfulInstall", - "Your current configuration is already successfully set up for the Device Simulator Expresss." - ), - ARE_YOU_SURE: localize( - "info.areYouSure", - "Are you sure you don't want to install the dependencies? The extension can't run without installing them." - ), - CLOSED_SERIAL_PORT: (port: string) => { - return localize( - "info.closedSerialPort", - `[DONE] Closed the serial port - ${port} \n` - ); - }, - COMPLETED_MESSAGE: "Completed", - CPX_JSON_ALREADY_GENERATED: localize( - "info.cpxJsonAlreadyGenerated", - "cpx.json has already been generated." - ), - DEPLOY_DEVICE: localize( - "info.deployDevice", - "\n[INFO] Deploying code to the device...\n" - ), - DEPLOY_SIMULATOR: localize( - "info.deploySimulator", - "\n[INFO] Deploying code to the simulator...\n" - ), - DEPLOY_SUCCESS: localize( - "info.deploySuccess", - "\n[INFO] Code successfully copied! Your device should be loading and ready to go shortly.\n" - ), - EXTENSION_ACTIVATED: localize( - "info.extensionActivated", - "Congratulations, your extension Device Simulator Express is now active!" - ), - FILE_SELECTED: (filePath: string) => { - return localize( - "info.fileSelected", - `[INFO] File selected : ${filePath} \n` - ); - }, - FIRST_TIME_WEBVIEW: localize( - "info.firstTimeWebview", - 'To reopen the simulator select the command "Open Simulator" from command palette.' - ), - INSTALLING_PYTHON_VENV: localize( - "info.installingPythonVenv", - "A virtual environment is currently being created. The required Python packages will be installed. You will be prompted a message telling you when the installation is done." - ), - INSTALL_PYTHON_DEPS: localize( - "info.installPythonDependencies", - "Do you want us to try and install this extension's dependencies on your selected Python interpreter for you?" - ), - INSTALL_PYTHON_VENV: localize( - "info.installPythonVenv", - "Do you want us to try and install this extension's dependencies via virtual environment for you?" - ), - NEW_FILE: localize( - "info.newFile", - "New to Python or the Circuit Playground Express? We are here to help!" - ), - NO_DEVICE_CHOSEN_TO_DEPLOY_TO: localize( - "info.noDeviceChosenToDeployTo", - "\n[INFO] No device was selected to deploy to.\n" - ), - NO_DEVICE_CHOSEN_TO_SIMULATE_TO: localize( - "info.noDeviceChosenToSimulateTo", - "\n[INFO] No device was selected to simulate.\n" - ), - NO_DEVICE_CHOSEN_FOR_NEW_FILE: localize( - "info.noDeviceChosenForNewFile", - "\n[INFO] No device was selected to open a template file for.\n" - ), - OPENED_SERIAL_PORT: (port: string) => { - return localize( - "info.openedSerialPort", - `[INFO] Opened the serial port - ${port} \n` - ); - }, - OPENING_SERIAL_PORT: (port: string) => { - return localize( - "info.openingSerialPort", - `[STARTING] Opening the serial port - ${port} \n` - ); - }, - PLEASE_OPEN_FOLDER: localize( - "info.pleaseOpenFolder", - "Please open a folder first." - ), - REDIRECT: localize("info.redirect", "You are being redirected."), - RUNNING_CODE: localize("info.runningCode", "Running user code"), - SUCCESSFUL_INSTALL: localize( - "info.successfulInstall", - "Successfully set up the Python environment." - ), - THIRD_PARTY_WEBSITE_ADAFRUIT: localize( - "info.thirdPartyWebsiteAdafruit", - 'By clicking "Agree and Proceed" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit\'s privacy policy' - ), - THIRD_PARTY_WEBSITE_PIP: localize( - "info.thirdPartyWebsitePip", - 'By clicking "Agree and Proceed" you will be redirected to pip.pypa.io, a third party website not managed by Microsoft. Please note that your activity on pip.pypa.io is subject to PyPA\'s privacy policy' - ), - THIRD_PARTY_WEBSITE_PYTHON: localize( - "info.thirdPartyWebsitePython", - 'By clicking "Agree and Proceed" you will be redirected to python.org, a third party website not managed by Microsoft. Please note that your activity on python.org is subject to Python\'s privacy policy' - ), - UPDATED_TO_EXTENSION_VENV: localize( - "info.updatedToExtensionsVenv", - "Automatically updated interpreter to point to extension's virtual environment." - ), - WELCOME_OUTPUT_TAB: localize( - "info.welcomeOutputTab", - "Welcome to the Device Simulator Express output tab!\n\n" - ), - }, - LABEL: { - WEBVIEW_PANEL: localize( - "label.webviewPanel", - "Device Simulator Express" - ), - }, - LINKS: { - DOWNLOAD_PIP: "https://pip.pypa.io/en/stable/installing/", - DOWNLOAD_PYTHON: "https://www.python.org/downloads/", - EXAMPLE_CODE: - "https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples", - CPX_HELP: - "https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart", - CLUE_HELP: "https://learn.adafruit.com/adafruit-clue/circuitpython", - INSTALL: - "https://github.com/microsoft/vscode-python-devicesimulator/blob/dev/docs/install.md", - PRIVACY: "https://www.adafruit.com/privacy", - TUTORIALS: - "https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library", - }, - MISC: { - SELECT_PORT_PLACEHOLDER: localize( - "misc.selectPortPlaceholder", - "Select a serial port" - ), - SERIAL_MONITOR_NAME: localize( - "misc.serialMonitorName", - "Device Simulator Express Serial Monitor" - ), - SERIAL_MONITOR_TEST_IF_OPEN: localize( - "misc.testIfPortOpen", - "Test if serial port is open" - ), - }, - NAME: localize("name", "Device Simulator Express"), - TEMPLATE: { - CPX: "cpx_template.py", - MICROBIT: "microbit_template.py", - CLUE: "clue_template.py", - }, - WARNING: { - ACCEPT_AND_RUN: localize( - "warning.agreeAndRun", - "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk." - ), - INVALID_BAUD_RATE: localize( - "warning.invalidBaudRate", - "Invalid baud rate, keep baud rate unchanged." - ), - NO_RATE_SELECTED: localize( - "warning.noRateSelected", - "No rate is selected, keep baud rate unchanged." - ), - NO_SERIAL_PORT_SELECTED: localize( - "warning.noSerialPortSelected", - "No serial port was selected, please select a serial port first" - ), - SERIAL_MONITOR_ALREADY_OPENED: (port: string) => { - return localize( - "warning.serialMonitorAlreadyOpened", - `Serial monitor is already opened for ${port} \n` - ); - }, - SERIAL_MONITOR_NOT_STARTED: localize( - "warning.serialMonitorNotStarted", - "Serial monitor has not been started." - ), - SERIAL_PORT_NOT_STARTED: localize( - "warning.serialPortNotStarted", - "Serial port has not been started.\n" - ), - }, + WEBVIEW_TYPE: { + SIMULATOR: "simulator", + TUTORIAL: "tutorial", + }, + DEBUG_CONFIGURATION_TYPE: "deviceSimulatorExpress", + DEVICE_NAME: { + CPX: "CPX", + MICROBIT: "micro:bit", + CLUE: "CLUE", + }, + DEVICE_NAME_FORMAL: { + CPX: "Circuit Playground Express", + MICROBIT: "micro:bit", + CLUE: "CLUE", + }, + SCRIPT_PATH: { + SIMULATOR: "out/simulator.js", + VSCODE_API: "out/vscode_import.js", + }, + ERROR: { + BAD_PYTHON_PATH: + 'Your interpreter is not pointing to a valid Python executable. Please select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application', + COMPORT_UNKNOWN_ERROR: + "Writing to COM port (GetOverlappedResult): Unknown error code 121", + CPX_FILE_ERROR: localize( + "error.cpxFileFormat", + "The cpx.json file format is not correct." + ), + DEBUGGER_SERVER_INIT_FAILED: (port: number) => { + return localize( + "error.debuggerServerInitFailed", + `Warning : The Debugger Server cannot be opened. Please try to free the port ${port} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.` + ); + }, + DEBUGGING_SESSION_IN_PROGESS: localize( + "error.debuggingSessionInProgress", + "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n" + ), + DEPENDENCY_DOWNLOAD_ERROR: + "Dependency download could not be completed. Functionality may be limited. Please review the installation docs.", + + FAILED_TO_OPEN_SERIAL_PORT: (port: string): string => { + return localize( + "error.failedToOpenSerialPort", + `[ERROR] Failed to open serial port ${port}.` + ); + }, + FAILED_TO_OPEN_SERIAL_PORT_DUE_TO: (port: string, error: any) => { + return localize( + "error.failedToOpenSerialPortDueTo", + `[ERROR] Failed to open serial port ${port} due to error: ${error}. \n` + ); + }, + INSTALLATION_ERROR: localize( + "error.installationError", + "Installation Error" + ), + + INVALID_FILE_EXTENSION_DEBUG: localize( + "error.invalidFileExtensionDebug", + "The file you tried to run isn't a Python file." + ), + INVALID_PYTHON_PATH: localize( + "error.invalidPythonPath", + 'We found that your selected Python interpreter version is too low to run the extension. Please upgrade to version 3.7+ or select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application.' + ), + LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT: localize( + "error.lowPythonVersionForMicrobitDeployment", + "To deploy your code to the micro:bit, you must be using Python 3.3+" + ), + NO_DEVICE: localize( + "error.noDevice", + "The device is not detected. Please double check if your board is connected and/or properly formatted" + ), + NO_FILE_TO_RUN: localize( + "error.noFileToRun", + '[ERROR] We can\'t find a Python file to run. Please make sure you select or open a new ".py" code file, or use the "New File" command to get started and see useful links.\n' + ), + NO_FILE_TO_DEPLOY: localize( + "error.noFileToDeploy", + "[ERROR] We can't find a Python file to deploy to your device.\n" + ), + NO_FOLDER_OPENED: localize( + "error.noFolderCreated", + "In order to use the Serial Monitor, you need to open a folder and reload VS Code." + ), + NO_PROGRAM_FOUND_DEBUG: localize( + "error.noProgramFoundDebug", + "Cannot find a program to debug." + ), + NO_PYTHON_PATH: localize( + "error.noPythonPath", + "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again." + ), + RECONNECT_DEVICE: localize( + "error.reconnectDevice", + "Please disconnect your Circuit Playground Express and try again." + ), + STDERR: (data: string) => { + return localize("error.stderr", `\n[ERROR] ${data} \n`); + }, + UNEXPECTED_MESSAGE: localize( + "error.unexpectedMessage", + "Webview sent an unexpected message" + ), + }, + FILESYSTEM: { + BASE_CIRCUITPYTHON: "base_circuitpython", + CLUE: "clue", + PYTHON_VENV_DIR: "venv", + MICROPYTHON_DIRECTORY: "micropython", + OUTPUT_DIRECTORY: "out", + }, + INFO: { + ALREADY_SUCCESSFUL_INSTALL: localize( + "info.successfulInstall", + "Your current configuration is already successfully set up for the Device Simulator Expresss." + ), + ARE_YOU_SURE: localize( + "info.areYouSure", + "Are you sure you don't want to install the dependencies? The extension can't run without installing them." + ), + CLOSED_SERIAL_PORT: (port: string) => { + return localize( + "info.closedSerialPort", + `[DONE] Closed the serial port - ${port} \n` + ); + }, + COMPLETED_MESSAGE: "Completed", + CPX_JSON_ALREADY_GENERATED: localize( + "info.cpxJsonAlreadyGenerated", + "cpx.json has already been generated." + ), + DEPLOY_DEVICE: localize( + "info.deployDevice", + "\n[INFO] Deploying code to the device...\n" + ), + DEPLOY_SIMULATOR: localize( + "info.deploySimulator", + "\n[INFO] Deploying code to the simulator...\n" + ), + DEPLOY_SUCCESS: localize( + "info.deploySuccess", + "\n[INFO] Code successfully copied! Your device should be loading and ready to go shortly.\n" + ), + EXTENSION_ACTIVATED: localize( + "info.extensionActivated", + "Congratulations, your extension Device Simulator Express is now active!" + ), + FILE_SELECTED: (filePath: string) => { + return localize( + "info.fileSelected", + `[INFO] File selected : ${filePath} \n` + ); + }, + FIRST_TIME_WEBVIEW: localize( + "info.firstTimeWebview", + 'To reopen the simulator select the command "Open Simulator" from command palette.' + ), + INSTALLING_PYTHON_VENV: localize( + "info.installingPythonVenv", + "A virtual environment is currently being created. The required Python packages will be installed. You will be prompted a message telling you when the installation is done." + ), + INSTALL_PYTHON_DEPS: localize( + "info.installPythonDependencies", + "Do you want us to try and install this extension's dependencies on your selected Python interpreter for you?" + ), + INSTALL_PYTHON_VENV: localize( + "info.installPythonVenv", + "Do you want us to try and install this extension's dependencies via virtual environment for you?" + ), + NEW_FILE: localize( + "info.newFile", + "New to Python or the Circuit Playground Express? We are here to help!" + ), + NO_DEVICE_CHOSEN_TO_DEPLOY_TO: localize( + "info.noDeviceChosenToDeployTo", + "\n[INFO] No device was selected to deploy to.\n" + ), + NO_DEVICE_CHOSEN_TO_SIMULATE_TO: localize( + "info.noDeviceChosenToSimulateTo", + "\n[INFO] No device was selected to simulate.\n" + ), + NO_DEVICE_CHOSEN_FOR_NEW_FILE: localize( + "info.noDeviceChosenForNewFile", + "\n[INFO] No device was selected to open a template file for.\n" + ), + OPENED_SERIAL_PORT: (port: string) => { + return localize( + "info.openedSerialPort", + `[INFO] Opened the serial port - ${port} \n` + ); + }, + OPENING_SERIAL_PORT: (port: string) => { + return localize( + "info.openingSerialPort", + `[STARTING] Opening the serial port - ${port} \n` + ); + }, + PLEASE_OPEN_FOLDER: localize( + "info.pleaseOpenFolder", + "Please open a folder first." + ), + REDIRECT: localize("info.redirect", "You are being redirected."), + RUNNING_CODE: localize("info.runningCode", "Running user code"), + SUCCESSFUL_INSTALL: localize( + "info.successfulInstall", + "Successfully set up the Python environment." + ), + THIRD_PARTY_WEBSITE_ADAFRUIT: localize( + "info.thirdPartyWebsiteAdafruit", + 'By clicking "Agree and Proceed" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit\'s privacy policy' + ), + THIRD_PARTY_WEBSITE_PIP: localize( + "info.thirdPartyWebsitePip", + 'By clicking "Agree and Proceed" you will be redirected to pip.pypa.io, a third party website not managed by Microsoft. Please note that your activity on pip.pypa.io is subject to PyPA\'s privacy policy' + ), + THIRD_PARTY_WEBSITE_PYTHON: localize( + "info.thirdPartyWebsitePython", + 'By clicking "Agree and Proceed" you will be redirected to python.org, a third party website not managed by Microsoft. Please note that your activity on python.org is subject to Python\'s privacy policy' + ), + UPDATED_TO_EXTENSION_VENV: localize( + "info.updatedToExtensionsVenv", + "Automatically updated interpreter to point to extension's virtual environment." + ), + WELCOME_OUTPUT_TAB: localize( + "info.welcomeOutputTab", + "Welcome to the Device Simulator Express output tab!\n\n" + ), + }, + LABEL: { + WEBVIEW_PANEL: localize( + "label.webviewPanel", + "Device Simulator Express" + ), + }, + LINKS: { + DOWNLOAD_PIP: "https://pip.pypa.io/en/stable/installing/", + DOWNLOAD_PYTHON: "https://www.python.org/downloads/", + EXAMPLE_CODE: + "https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples", + CPX_HELP: + "https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart", + CLUE_HELP: "https://learn.adafruit.com/adafruit-clue/circuitpython", + INSTALL: + "https://github.com/microsoft/vscode-python-devicesimulator/blob/dev/docs/install.md", + PRIVACY: "https://www.adafruit.com/privacy", + TUTORIALS: + "https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library", + }, + MISC: { + SELECT_PORT_PLACEHOLDER: localize( + "misc.selectPortPlaceholder", + "Select a serial port" + ), + SERIAL_MONITOR_NAME: localize( + "misc.serialMonitorName", + "Device Simulator Express Serial Monitor" + ), + SERIAL_MONITOR_TEST_IF_OPEN: localize( + "misc.testIfPortOpen", + "Test if serial port is open" + ), + }, + NAME: localize("name", "Device Simulator Express"), + TEMPLATE: { + CPX: "cpx_template.py", + MICROBIT: "microbit_template.py", + CLUE: "clue_template.py", + }, + WARNING: { + ACCEPT_AND_RUN: localize( + "warning.agreeAndRun", + "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk." + ), + INVALID_BAUD_RATE: localize( + "warning.invalidBaudRate", + "Invalid baud rate, keep baud rate unchanged." + ), + NO_RATE_SELECTED: localize( + "warning.noRateSelected", + "No rate is selected, keep baud rate unchanged." + ), + NO_SERIAL_PORT_SELECTED: localize( + "warning.noSerialPortSelected", + "No serial port was selected, please select a serial port first" + ), + SERIAL_MONITOR_ALREADY_OPENED: (port: string) => { + return localize( + "warning.serialMonitorAlreadyOpened", + `Serial monitor is already opened for ${port} \n` + ); + }, + SERIAL_MONITOR_NOT_STARTED: localize( + "warning.serialMonitorNotStarted", + "Serial monitor has not been started." + ), + SERIAL_PORT_NOT_STARTED: localize( + "warning.serialPortNotStarted", + "Serial port has not been started.\n" + ), + }, }; export enum CONFIG_KEYS { - ENABLE_USB_DETECTION = "deviceSimulatorExpress.enableUSBDetection", + ENABLE_USB_DETECTION = "deviceSimulatorExpress.enableUSBDetection", } export enum TelemetryEventName { - FAILED_TO_OPEN_SIMULATOR = "SIMULATOR.FAILED_TO_OPEN", - - // Debugger - CPX_DEBUGGER_INIT_SUCCESS = "CPX.DEBUGGER.INIT.SUCCESS", - CPX_DEBUGGER_INIT_FAIL = "CPX.DEBUGGER.INIT.FAIL", - MICROBIT_DEBUGGER_INIT_SUCCESS = "MICROBIT.DEBUGGER.INIT.SUCCESS", - MICROBIT_DEBUGGER_INIT_FAIL = "MICROBIT.DEBUGGER.INIT.FAIL", - CLUE_DEBUGGER_INIT_SUCCESS = "CLUE.DEBUGGER.INIT.SUCCESS", - CLUE_DEBUGGER_INIT_FAIL = "CLUE.DEBUGGER.INIT.FAIL", - - // Extension commands - COMMAND_RUN_SIMULATOR_BUTTON = "COMMAND.RUN.SIMULATOR_BUTTON", - COMMAND_RUN_PALETTE = "COMMAND.RUN.PALETTE", - COMMAND_INSTALL_EXTENSION_DEPENDENCIES = "COMMAND.INSTALL.EXTENSION.DEPENDENCIES", - COMMAND_SERIAL_MONITOR_CHOOSE_PORT = "COMMAND.SERIAL_MONITOR.CHOOSE_PORT", - COMMAND_SERIAL_MONITOR_OPEN = "COMMAND.SERIAL_MONITOR.OPEN", - COMMAND_SERIAL_MONITOR_BAUD_RATE = "COMMAND.SERIAL_MONITOR.BAUD_RATE", - COMMAND_SERIAL_MONITOR_CLOSE = "COMMAND.SERIAL_MONITOR.CLOSE", - COMMAND_GETTING_STARTED = "COMMAND.GETTING_STARTED", - - CPX_COMMAND_DEPLOY_DEVICE = "CPX.COMMAND.DEPLOY.DEVICE", - CPX_COMMAND_NEW_FILE = "CPX.COMMAND.NEW.FILE.CPX", - CPX_COMMAND_OPEN_SIMULATOR = "CPX.COMMAND.OPEN.SIMULATOR", - - MICROBIT_COMMAND_DEPLOY_DEVICE = "MICROBIT.COMMAND.DEPLOY.DEVICE", - MICROBIT_COMMAND_NEW_FILE = "MICROBIT.COMMAND.NEW.FILE", - MICROBIT_COMMAND_OPEN_SIMULATOR = "MICROBIT.COMMAND.OPEN.SIMULATOR", - - CLUE_COMMAND_DEPLOY_DEVICE = "CLUE.COMMAND.DEPLOY.DEVICE", - CLUE_COMMAND_NEW_FILE = "CLUE.COMMAND.NEW.FILE.CPX", - CLUE_COMMAND_OPEN_SIMULATOR = "CLUE.COMMAND.OPEN.SIMULATOR", - - // Simulator interaction - CPX_SIMULATOR_BUTTON_A = "CPX.SIMULATOR.BUTTON.A", - CPX_SIMULATOR_BUTTON_B = "CPX.SIMULATOR.BUTTON.B", - CPX_SIMULATOR_BUTTON_AB = "CPX.SIMULATOR.BUTTON.AB", - CPX_SIMULATOR_SWITCH = "CPX.SIMULATOR.SWITCH", - - MICROBIT_SIMULATOR_BUTTON_A = "MICROBIT.SIMULATOR.BUTTON.A", - MICROBIT_SIMULATOR_BUTTON_B = "MICROBIT.SIMULATOR.BUTTON.B", - MICROBIT_SIMULATOR_BUTTON_AB = "MICROBIT.SIMULATOR.BUTTON.AB", - - CLUE_SIMULATOR_BUTTON_A = "CLUE.SIMULATOR.BUTTON.A", - CLUE_SIMULATOR_BUTTON_B = "CLUE.SIMULATOR.BUTTON.B", - CLUE_SIMULATOR_BUTTON_AB = "CLUE.SIMULATOR.BUTTON.AB", - - // Sensors - CPX_SIMULATOR_TEMPERATURE_SENSOR = "CPX.SIMULATOR.TEMPERATURE", - CPX_SIMULATOR_LIGHT_SENSOR = "CPX.SIMULATOR.LIGHT", - CPX_SIMULATOR_MOTION_SENSOR = "CPX.SIMULATOR.MOTION", - CPX_SIMULATOR_SHAKE = "CPX.SIMULATOR.SHAKE", - CPX_SIMULATOR_CAPACITIVE_TOUCH = "CPX.SIMULATOR.CAPACITIVE.TOUCH", - - MICROBIT_SIMULATOR_TEMPERATURE_SENSOR = "MICROBIT.SIMULATOR.TEMPERATURE", - MICROBIT_SIMULATOR_LIGHT_SENSOR = "MICROBIT.SIMULATOR.LIGHT", - MICROBIT_SIMULATOR_MOTION_SENSOR = "MICROBIT.SIMULATOR.MOTION", - MICROBIT_SIMULATOR_GESTURE_SENSOR = "MICROBIT.SIMULATOR.GESTURE", - - CLUE_SIMULATOR_TEMPERATURE_SENSOR = "CLUE.SIMULATOR.TEMPERATURE", - CLUE_SIMULATOR_LIGHT_SENSOR = "CLUE.SIMULATOR.LIGHT", - CLUE_SIMULATOR_MOTION_SENSOR = "CLUE.SIMULATOR.MOTION", - CLUE_SIMULATOR_GESTURE_SENSOR = "CLUE.SIMULATOR.GESTURE", - CLUE_SIMULATOR_PRESSURE_SENSOR = "CLUE.SIMULATOR.PRESSURE", - CLUE_SIMULATOR_PROXIMITY_SENSOR = "CLUE.SIMULATOR.PROXIMITY", - CLUE_SIMULATOR_HUMIDITY_SENSOR = "CLUE.SIMULATOR.HUMIDITY", - CLUE_SIMULATOR_GYRO_SENSOR = "CLUE.SIMULATOR.GYRO", - CLUE_SIMULATOR_MAGNET_SENSOR = "CLUE.SIMULATOR.MAGNET", - - // Pop-up dialog - CPX_CLICK_DIALOG_DONT_SHOW = "CPX.CLICK.DIALOG.DONT.SHOW", - CPX_CLICK_DIALOG_EXAMPLE_CODE = "CPX.CLICK.DIALOG.EXAMPLE.CODE", - CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CPX.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", - CPX_CLICK_DIALOG_TUTORIALS = "CPX.CLICK.DIALOG.TUTORIALS", - - CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CLUE.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", - - ERROR_PYTHON_PROCESS = "ERROR.PYTHON.PROCESS", - - CPX_ERROR_COMMAND_NEW_FILE = "CPX.ERROR.COMMAND.NEW.FILE", - CPX_ERROR_DEPLOY_WITHOUT_DEVICE = "CPX.ERROR.DEPLOY.WITHOUT.DEVICE", - CPX_ERROR_PYTHON_DEVICE_PROCESS = "CPX.ERROR.PYTHON.DEVICE.PROCESS", - CPX_SUCCESS_COMMAND_DEPLOY_DEVICE = "CPX.SUCCESS.COMMAND.DEPLOY.DEVICE", - - MICROBIT_ERROR_COMMAND_NEW_FILE = "MICROBIT.ERROR.COMMAND.NEW.FILE", - MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE = "MICROBIT.ERROR.DEPLOY.WITHOUT.DEVICE", - MICROBIT_ERROR_PYTHON_DEVICE_PROCESS = "MICROBIT.ERROR.PYTHON.DEVICE.PROCESS", - MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE = "MICROBIT.SUCCESS.COMMAND.DEPLOY.DEVICE", - - CLUE_ERROR_COMMAND_NEW_FILE = "CLUE.ERROR.COMMAND.NEW.FILE", - CLUE_ERROR_DEPLOY_WITHOUT_DEVICE = "CLUE.ERROR.DEPLOY.WITHOUT.DEVICE", - CLUE_ERROR_PYTHON_DEVICE_PROCESS = "CLUE.ERROR.PYTHON.DEVICE.PROCESS", - CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE = "CLUE.SUCCESS.COMMAND.DEPLOY.DEVICE", - - // Performance - CPX_PERFORMANCE_DEPLOY_DEVICE = "CPX.PERFORMANCE.DEPLOY.DEVICE", - CPX_PERFORMANCE_NEW_FILE = "CPX.PERFORMANCE.NEW.FILE", - CPX_PERFORMANCE_OPEN_SIMULATOR = "CPX.PERFORMANCE.OPEN.SIMULATOR", - - MICROBIT_PERFORMANCE_DEPLOY_DEVICE = "MICROBIT.PERFORMANCE.DEPLOY.DEVICE", - MICROBIT_PERFORMANCE_NEW_FILE = "MICROBIT.PERFORMANCE.NEW.FILE", - MICROBIT_PERFORMANCE_OPEN_SIMULATOR = "MICROBIT.PERFORMANCE.OPEN.SIMULATOR", - - CLUE_PERFORMANCE_DEPLOY_DEVICE = "CLUE.PERFORMANCE.DEPLOY.DEVICE", - CLUE_PERFORMANCE_NEW_FILE = "CLUE.PERFORMANCE.NEW.FILE", - CLUE_PERFORMANCE_OPEN_SIMULATOR = "CLUE.PERFORMANCE.OPEN.SIMULATOR", - - // Venv options - SETUP_VENV_CREATION_ERR = "SETUP.VENV.CREATION.ERR", - SETUP_NO_PIP = "SETUP.NO.PIP", - SETUP_DEP_INSTALL_FAIL = "SETUP.DEP.INSTALL.FAIL", - SETUP_AUTO_RESOLVE_PYTHON_PATH = "SETUP.AUTO.RESOLVE.PYTHON.PATH", - SETUP_NO_PYTHON_PATH = "SETUP.NO.PYTHON.PATH", - SETUP_DOWNLOAD_PYTHON = "SETUP.DOWNLOAD.PYTHON", - SETUP_INVALID_PYTHON_INTERPRETER_PATH = "SETUP.INVALID.PYTHON.INTERPRETER.PATH", - SETUP_INVALID_PYTHON_VER = "SETUP.INVALID.PYTHON.VER", - SETUP_INSTALL_VENV = "SETUP.INSTALL.VENV", - SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL = "SETUP.ORIGINAL.INTERPRETER.DEP.INSTALL", - SETUP_HAS_VENV = "SETUP.HAS.VENV", - SETUP_NO_DEPS_INSTALLED = "SETUP.NO.DEPS.INSTALLED", + FAILED_TO_OPEN_SIMULATOR = "SIMULATOR.FAILED_TO_OPEN", + + // Debugger + CPX_DEBUGGER_INIT_SUCCESS = "CPX.DEBUGGER.INIT.SUCCESS", + CPX_DEBUGGER_INIT_FAIL = "CPX.DEBUGGER.INIT.FAIL", + MICROBIT_DEBUGGER_INIT_SUCCESS = "MICROBIT.DEBUGGER.INIT.SUCCESS", + MICROBIT_DEBUGGER_INIT_FAIL = "MICROBIT.DEBUGGER.INIT.FAIL", + CLUE_DEBUGGER_INIT_SUCCESS = "CLUE.DEBUGGER.INIT.SUCCESS", + CLUE_DEBUGGER_INIT_FAIL = "CLUE.DEBUGGER.INIT.FAIL", + + // Extension commands + COMMAND_RUN_SIMULATOR_BUTTON = "COMMAND.RUN.SIMULATOR_BUTTON", + COMMAND_RUN_PALETTE = "COMMAND.RUN.PALETTE", + COMMAND_INSTALL_EXTENSION_DEPENDENCIES = "COMMAND.INSTALL.EXTENSION.DEPENDENCIES", + COMMAND_SERIAL_MONITOR_CHOOSE_PORT = "COMMAND.SERIAL_MONITOR.CHOOSE_PORT", + COMMAND_SERIAL_MONITOR_OPEN = "COMMAND.SERIAL_MONITOR.OPEN", + COMMAND_SERIAL_MONITOR_BAUD_RATE = "COMMAND.SERIAL_MONITOR.BAUD_RATE", + COMMAND_SERIAL_MONITOR_CLOSE = "COMMAND.SERIAL_MONITOR.CLOSE", + COMMAND_GETTING_STARTED = "COMMAND.GETTING_STARTED", + + CPX_COMMAND_DEPLOY_DEVICE = "CPX.COMMAND.DEPLOY.DEVICE", + CPX_COMMAND_NEW_FILE = "CPX.COMMAND.NEW.FILE.CPX", + CPX_COMMAND_OPEN_SIMULATOR = "CPX.COMMAND.OPEN.SIMULATOR", + + MICROBIT_COMMAND_DEPLOY_DEVICE = "MICROBIT.COMMAND.DEPLOY.DEVICE", + MICROBIT_COMMAND_NEW_FILE = "MICROBIT.COMMAND.NEW.FILE", + MICROBIT_COMMAND_OPEN_SIMULATOR = "MICROBIT.COMMAND.OPEN.SIMULATOR", + + CLUE_COMMAND_DEPLOY_DEVICE = "CLUE.COMMAND.DEPLOY.DEVICE", + CLUE_COMMAND_NEW_FILE = "CLUE.COMMAND.NEW.FILE.CPX", + CLUE_COMMAND_OPEN_SIMULATOR = "CLUE.COMMAND.OPEN.SIMULATOR", + + // Simulator interaction + CPX_SIMULATOR_BUTTON_A = "CPX.SIMULATOR.BUTTON.A", + CPX_SIMULATOR_BUTTON_B = "CPX.SIMULATOR.BUTTON.B", + CPX_SIMULATOR_BUTTON_AB = "CPX.SIMULATOR.BUTTON.AB", + CPX_SIMULATOR_SWITCH = "CPX.SIMULATOR.SWITCH", + + MICROBIT_SIMULATOR_BUTTON_A = "MICROBIT.SIMULATOR.BUTTON.A", + MICROBIT_SIMULATOR_BUTTON_B = "MICROBIT.SIMULATOR.BUTTON.B", + MICROBIT_SIMULATOR_BUTTON_AB = "MICROBIT.SIMULATOR.BUTTON.AB", + + CLUE_SIMULATOR_BUTTON_A = "CLUE.SIMULATOR.BUTTON.A", + CLUE_SIMULATOR_BUTTON_B = "CLUE.SIMULATOR.BUTTON.B", + CLUE_SIMULATOR_BUTTON_AB = "CLUE.SIMULATOR.BUTTON.AB", + + // Sensors + CPX_SIMULATOR_TEMPERATURE_SENSOR = "CPX.SIMULATOR.TEMPERATURE", + CPX_SIMULATOR_LIGHT_SENSOR = "CPX.SIMULATOR.LIGHT", + CPX_SIMULATOR_MOTION_SENSOR = "CPX.SIMULATOR.MOTION", + CPX_SIMULATOR_SHAKE = "CPX.SIMULATOR.SHAKE", + CPX_SIMULATOR_CAPACITIVE_TOUCH = "CPX.SIMULATOR.CAPACITIVE.TOUCH", + + MICROBIT_SIMULATOR_TEMPERATURE_SENSOR = "MICROBIT.SIMULATOR.TEMPERATURE", + MICROBIT_SIMULATOR_LIGHT_SENSOR = "MICROBIT.SIMULATOR.LIGHT", + MICROBIT_SIMULATOR_MOTION_SENSOR = "MICROBIT.SIMULATOR.MOTION", + MICROBIT_SIMULATOR_GESTURE_SENSOR = "MICROBIT.SIMULATOR.GESTURE", + + CLUE_SIMULATOR_TEMPERATURE_SENSOR = "CLUE.SIMULATOR.TEMPERATURE", + CLUE_SIMULATOR_LIGHT_SENSOR = "CLUE.SIMULATOR.LIGHT", + CLUE_SIMULATOR_MOTION_SENSOR = "CLUE.SIMULATOR.MOTION", + CLUE_SIMULATOR_GESTURE_SENSOR = "CLUE.SIMULATOR.GESTURE", + CLUE_SIMULATOR_PRESSURE_SENSOR = "CLUE.SIMULATOR.PRESSURE", + CLUE_SIMULATOR_PROXIMITY_SENSOR = "CLUE.SIMULATOR.PROXIMITY", + CLUE_SIMULATOR_HUMIDITY_SENSOR = "CLUE.SIMULATOR.HUMIDITY", + CLUE_SIMULATOR_GYRO_SENSOR = "CLUE.SIMULATOR.GYRO", + CLUE_SIMULATOR_MAGNET_SENSOR = "CLUE.SIMULATOR.MAGNET", + + // Pop-up dialog + CPX_CLICK_DIALOG_DONT_SHOW = "CPX.CLICK.DIALOG.DONT.SHOW", + CPX_CLICK_DIALOG_EXAMPLE_CODE = "CPX.CLICK.DIALOG.EXAMPLE.CODE", + CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CPX.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", + CPX_CLICK_DIALOG_TUTORIALS = "CPX.CLICK.DIALOG.TUTORIALS", + + CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CLUE.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", + + ERROR_PYTHON_PROCESS = "ERROR.PYTHON.PROCESS", + + CPX_ERROR_COMMAND_NEW_FILE = "CPX.ERROR.COMMAND.NEW.FILE", + CPX_ERROR_DEPLOY_WITHOUT_DEVICE = "CPX.ERROR.DEPLOY.WITHOUT.DEVICE", + CPX_ERROR_PYTHON_DEVICE_PROCESS = "CPX.ERROR.PYTHON.DEVICE.PROCESS", + CPX_SUCCESS_COMMAND_DEPLOY_DEVICE = "CPX.SUCCESS.COMMAND.DEPLOY.DEVICE", + + MICROBIT_ERROR_COMMAND_NEW_FILE = "MICROBIT.ERROR.COMMAND.NEW.FILE", + MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE = "MICROBIT.ERROR.DEPLOY.WITHOUT.DEVICE", + MICROBIT_ERROR_PYTHON_DEVICE_PROCESS = "MICROBIT.ERROR.PYTHON.DEVICE.PROCESS", + MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE = "MICROBIT.SUCCESS.COMMAND.DEPLOY.DEVICE", + + CLUE_ERROR_COMMAND_NEW_FILE = "CLUE.ERROR.COMMAND.NEW.FILE", + CLUE_ERROR_DEPLOY_WITHOUT_DEVICE = "CLUE.ERROR.DEPLOY.WITHOUT.DEVICE", + CLUE_ERROR_PYTHON_DEVICE_PROCESS = "CLUE.ERROR.PYTHON.DEVICE.PROCESS", + CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE = "CLUE.SUCCESS.COMMAND.DEPLOY.DEVICE", + + // Performance + CPX_PERFORMANCE_DEPLOY_DEVICE = "CPX.PERFORMANCE.DEPLOY.DEVICE", + CPX_PERFORMANCE_NEW_FILE = "CPX.PERFORMANCE.NEW.FILE", + CPX_PERFORMANCE_OPEN_SIMULATOR = "CPX.PERFORMANCE.OPEN.SIMULATOR", + + MICROBIT_PERFORMANCE_DEPLOY_DEVICE = "MICROBIT.PERFORMANCE.DEPLOY.DEVICE", + MICROBIT_PERFORMANCE_NEW_FILE = "MICROBIT.PERFORMANCE.NEW.FILE", + MICROBIT_PERFORMANCE_OPEN_SIMULATOR = "MICROBIT.PERFORMANCE.OPEN.SIMULATOR", + + CLUE_PERFORMANCE_DEPLOY_DEVICE = "CLUE.PERFORMANCE.DEPLOY.DEVICE", + CLUE_PERFORMANCE_NEW_FILE = "CLUE.PERFORMANCE.NEW.FILE", + CLUE_PERFORMANCE_OPEN_SIMULATOR = "CLUE.PERFORMANCE.OPEN.SIMULATOR", + + // Venv options + SETUP_VENV_CREATION_ERR = "SETUP.VENV.CREATION.ERR", + SETUP_NO_PIP = "SETUP.NO.PIP", + SETUP_DEP_INSTALL_FAIL = "SETUP.DEP.INSTALL.FAIL", + SETUP_AUTO_RESOLVE_PYTHON_PATH = "SETUP.AUTO.RESOLVE.PYTHON.PATH", + SETUP_NO_PYTHON_PATH = "SETUP.NO.PYTHON.PATH", + SETUP_DOWNLOAD_PYTHON = "SETUP.DOWNLOAD.PYTHON", + SETUP_INVALID_PYTHON_INTERPRETER_PATH = "SETUP.INVALID.PYTHON.INTERPRETER.PATH", + SETUP_INVALID_PYTHON_VER = "SETUP.INVALID.PYTHON.VER", + SETUP_INSTALL_VENV = "SETUP.INSTALL.VENV", + SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL = "SETUP.ORIGINAL.INTERPRETER.DEP.INSTALL", + SETUP_HAS_VENV = "SETUP.HAS.VENV", + SETUP_NO_DEPS_INSTALLED = "SETUP.NO.DEPS.INSTALLED", } export const DEFAULT_DEVICE = CONSTANTS.DEVICE_NAME.CPX; // tslint:disable-next-line: no-namespace export namespace DialogResponses { - export const ACCEPT_AND_RUN: MessageItem = { - title: localize("dialogResponses.agreeAndRun", "Agree and Run"), - }; - export const AGREE_AND_PROCEED: MessageItem = { - title: localize("dialogResponses.agreeAndProceed", "Agree and Proceed"), - }; - export const CANCEL: MessageItem = { - title: localize("dialogResponses.cancel", "Cancel"), - }; - export const SELECT: MessageItem = { - title: localize("dialogResponses.select", "Select"), - }; - export const HELP: MessageItem = { - title: localize("dialogResponses.help", "I need help"), - }; - export const DONT_SHOW: MessageItem = { - title: localize("dialogResponses.dontShowAgain", "Don't Show Again"), - }; - export const NO: MessageItem = { - title: localize("dialogResponses.No", "No"), - }; - export const INSTALL_NOW: MessageItem = { - title: localize("dialogResponses.installNow", "Install Now"), - }; - export const DONT_INSTALL: MessageItem = { - title: localize("dialogResponses.dontInstall", "Don't Install"), - }; - export const PRIVACY_STATEMENT: MessageItem = { - title: localize("info.privacyStatement", "Privacy Statement"), - }; - export const TUTORIALS: MessageItem = { - title: localize("dialogResponses.tutorials", "Tutorials on Adafruit"), - }; - export const EXAMPLE_CODE: MessageItem = { - title: localize( - "dialogResponses.exampleCode", - "Example Code on GitHub" - ), - }; - export const MESSAGE_UNDERSTOOD: MessageItem = { - title: localize("dialogResponses.messageUnderstood", "Got It"), - }; - export const INSTALL_PIP: MessageItem = { - title: localize( - "dialogResponses.installPip", - "Install from Pip's webpage" - ), - }; - export const INSTALL_PYTHON: MessageItem = { - title: localize( - "dialogResponses.installPython", - "Install from python.org" - ), - }; - export const YES: MessageItem = { - title: localize("dialogResponses.Yes", "Yes"), - }; - export const READ_INSTALL_MD: MessageItem = { - title: localize( - "dialogResponses.readInstall", - "Read installation docs" - ), - }; + export const ACCEPT_AND_RUN: MessageItem = { + title: localize("dialogResponses.agreeAndRun", "Agree and Run"), + }; + export const AGREE_AND_PROCEED: MessageItem = { + title: localize("dialogResponses.agreeAndProceed", "Agree and Proceed"), + }; + export const CANCEL: MessageItem = { + title: localize("dialogResponses.cancel", "Cancel"), + }; + export const SELECT: MessageItem = { + title: localize("dialogResponses.select", "Select"), + }; + export const HELP: MessageItem = { + title: localize("dialogResponses.help", "I need help"), + }; + export const DONT_SHOW: MessageItem = { + title: localize("dialogResponses.dontShowAgain", "Don't Show Again"), + }; + export const NO: MessageItem = { + title: localize("dialogResponses.No", "No"), + }; + export const INSTALL_NOW: MessageItem = { + title: localize("dialogResponses.installNow", "Install Now"), + }; + export const DONT_INSTALL: MessageItem = { + title: localize("dialogResponses.dontInstall", "Don't Install"), + }; + export const PRIVACY_STATEMENT: MessageItem = { + title: localize("info.privacyStatement", "Privacy Statement"), + }; + export const TUTORIALS: MessageItem = { + title: localize("dialogResponses.tutorials", "Tutorials on Adafruit"), + }; + export const EXAMPLE_CODE: MessageItem = { + title: localize( + "dialogResponses.exampleCode", + "Example Code on GitHub" + ), + }; + export const MESSAGE_UNDERSTOOD: MessageItem = { + title: localize("dialogResponses.messageUnderstood", "Got It"), + }; + export const INSTALL_PIP: MessageItem = { + title: localize( + "dialogResponses.installPip", + "Install from Pip's webpage" + ), + }; + export const INSTALL_PYTHON: MessageItem = { + title: localize( + "dialogResponses.installPython", + "Install from python.org" + ), + }; + export const YES: MessageItem = { + title: localize("dialogResponses.Yes", "Yes"), + }; + export const READ_INSTALL_MD: MessageItem = { + title: localize( + "dialogResponses.readInstall", + "Read installation docs" + ), + }; } export const CPX_CONFIG_FILE = path.join(".vscode", "cpx.json"); export const STATUS_BAR_PRIORITY = { - PORT: 20, - OPEN_PORT: 30, - BAUD_RATE: 40, + PORT: 20, + OPEN_PORT: 30, + BAUD_RATE: 40, }; export const VERSIONS = { - MIN_PY_VERSION: "Python 3.7.0", + MIN_PY_VERSION: "Python 3.7.0", }; export const HELPER_FILES = { - CHECK_IF_VENV_PY: "check_if_venv.py", - CHECK_PYTHON_DEPENDENCIES: "check_python_dependencies.py", - DEVICE_PY: "device.py", - PROCESS_USER_CODE_PY: "process_user_code.py", - PYTHON_EXE: "python.exe", - PYTHON: "python", + CHECK_IF_VENV_PY: "check_if_venv.py", + CHECK_PYTHON_DEPENDENCIES: "check_python_dependencies.py", + DEVICE_PY: "device.py", + PROCESS_USER_CODE_PY: "process_user_code.py", + PYTHON_EXE: "python.exe", + PYTHON: "python", }; export const GLOBAL_ENV_VARS = { - PYTHON: "python", - PYTHON3: "python3", + PYTHON: "python", + PYTHON3: "python3", }; export const LANGUAGE_VARS = { - PYTHON: { ID: "python", FILE_ENDS: ".py" }, + PYTHON: { ID: "python", FILE_ENDS: ".py" }, }; export default CONSTANTS; diff --git a/Source/cpxWorkspace.ts b/Source/cpxWorkspace.ts index 47239a79a..cec9a6289 100644 --- a/Source/cpxWorkspace.ts +++ b/Source/cpxWorkspace.ts @@ -3,24 +3,24 @@ import * as path from "path"; import * as vscode from "vscode"; export class CPXWorkspace { - static get rootPath(): string | undefined { - const workspaceFolders = vscode.workspace.workspaceFolders; - if (!workspaceFolders || workspaceFolders.length === 0) { - return undefined; - } + static get rootPath(): string | undefined { + const workspaceFolders = vscode.workspace.workspaceFolders; + if (!workspaceFolders || workspaceFolders.length === 0) { + return undefined; + } - for (const workspaceFolder of workspaceFolders) { - const workspaceFolderPath = workspaceFolder.uri.fsPath; - const cpxConfigPath = path.join( - workspaceFolderPath, - ".vscode", - "cpx.json" - ); - if (fs.existsSync(cpxConfigPath)) { - return workspaceFolderPath; - } - } + for (const workspaceFolder of workspaceFolders) { + const workspaceFolderPath = workspaceFolder.uri.fsPath; + const cpxConfigPath = path.join( + workspaceFolderPath, + ".vscode", + "cpx.json" + ); + if (fs.existsSync(cpxConfigPath)) { + return workspaceFolderPath; + } + } - return workspaceFolders[0].uri.fsPath; - } + return workspaceFolders[0].uri.fsPath; + } } diff --git a/Source/debugger/debugAdapter.ts b/Source/debugger/debugAdapter.ts index 59a78482e..9dd7c1dfb 100644 --- a/Source/debugger/debugAdapter.ts +++ b/Source/debugger/debugAdapter.ts @@ -4,46 +4,46 @@ import { MessagingService } from "../service/messagingService"; import { DEBUG_COMMANDS } from "../view/constants"; export class DebugAdapter implements DebugAdapterTracker { - private readonly console: DebugConsole | undefined; - private readonly messagingService: MessagingService; - private debugCommunicationService: DebuggerCommunicationService; - constructor( - debugSession: DebugSession, - messagingService: MessagingService, - debugCommunicationService: DebuggerCommunicationService - ) { - this.console = debugSession.configuration.console; - this.messagingService = messagingService; - this.debugCommunicationService = debugCommunicationService; - } - onWillStartSession() { - // To Implement - } - onWillReceiveMessage(message: any): void { - if (message.command) { - // Only send pertinent debug messages - switch (message.command) { - case DEBUG_COMMANDS.CONTINUE: - this.messagingService.sendStartMessage(); - break; - case DEBUG_COMMANDS.STACK_TRACE: - this.messagingService.sendPauseMessage(); - break; - case DEBUG_COMMANDS.DISCONNECT: - // Triggered on stop event for debugger - if (!message.arguments.restart) { - this.debugCommunicationService.handleStopEvent(); - } - break; - } - } - } - // A debugger error should unlock the webview - onError() { - this.messagingService.sendStartMessage(); - } - // Device is always running when exiting debugging mode - onExit() { - this.messagingService.sendStartMessage(); - } + private readonly console: DebugConsole | undefined; + private readonly messagingService: MessagingService; + private debugCommunicationService: DebuggerCommunicationService; + constructor( + debugSession: DebugSession, + messagingService: MessagingService, + debugCommunicationService: DebuggerCommunicationService + ) { + this.console = debugSession.configuration.console; + this.messagingService = messagingService; + this.debugCommunicationService = debugCommunicationService; + } + onWillStartSession() { + // To Implement + } + onWillReceiveMessage(message: any): void { + if (message.command) { + // Only send pertinent debug messages + switch (message.command) { + case DEBUG_COMMANDS.CONTINUE: + this.messagingService.sendStartMessage(); + break; + case DEBUG_COMMANDS.STACK_TRACE: + this.messagingService.sendPauseMessage(); + break; + case DEBUG_COMMANDS.DISCONNECT: + // Triggered on stop event for debugger + if (!message.arguments.restart) { + this.debugCommunicationService.handleStopEvent(); + } + break; + } + } + } + // A debugger error should unlock the webview + onError() { + this.messagingService.sendStartMessage(); + } + // Device is always running when exiting debugging mode + onExit() { + this.messagingService.sendStartMessage(); + } } diff --git a/Source/debugger/debugAdapterFactory.ts b/Source/debugger/debugAdapterFactory.ts index 5b0e2b401..8bec8cfc8 100644 --- a/Source/debugger/debugAdapterFactory.ts +++ b/Source/debugger/debugAdapterFactory.ts @@ -1,33 +1,33 @@ import { - DebugAdapterTracker, - DebugAdapterTrackerFactory, - DebugSession, - ProviderResult, + DebugAdapterTracker, + DebugAdapterTrackerFactory, + DebugSession, + ProviderResult, } from "vscode"; import { DebuggerCommunicationService } from "../service/debuggerCommunicationService"; import { MessagingService } from "../service/messagingService"; import { DebugAdapter } from "./debugAdapter"; export class DebugAdapterFactory implements DebugAdapterTrackerFactory { - private debugSession: DebugSession; - private messagingService: MessagingService; - private debugCommunicationService: DebuggerCommunicationService; - constructor( - debugSession: DebugSession, - messagingService: MessagingService, - debugCommunicationService: DebuggerCommunicationService - ) { - this.debugSession = debugSession; - this.messagingService = messagingService; - this.debugCommunicationService = debugCommunicationService; - } - public createDebugAdapterTracker( - session: DebugSession - ): ProviderResult { - return new DebugAdapter( - session, - this.messagingService, - this.debugCommunicationService - ); - } + private debugSession: DebugSession; + private messagingService: MessagingService; + private debugCommunicationService: DebuggerCommunicationService; + constructor( + debugSession: DebugSession, + messagingService: MessagingService, + debugCommunicationService: DebuggerCommunicationService + ) { + this.debugSession = debugSession; + this.messagingService = messagingService; + this.debugCommunicationService = debugCommunicationService; + } + public createDebugAdapterTracker( + session: DebugSession + ): ProviderResult { + return new DebugAdapter( + session, + this.messagingService, + this.debugCommunicationService + ); + } } diff --git a/Source/debuggerCommunicationServer.ts b/Source/debuggerCommunicationServer.ts index 0fa4a65cc..3deeff1c4 100644 --- a/Source/debuggerCommunicationServer.ts +++ b/Source/debuggerCommunicationServer.ts @@ -8,133 +8,134 @@ import { SERVER_INFO } from "./constants"; import { DeviceSelectionService } from "./service/deviceSelectionService"; export const DEBUGGER_MESSAGES = { - EMITTER: { - INPUT_CHANGED: "input_changed", - RECEIVED_STATE: "received_state", - DISCONNECT: "process_disconnect", - }, - LISTENER: { - UPDATE_STATE: "updateState", - RECEIVED_STATE: "receivedState", - DISCONNECT: "disconnect", - }, + EMITTER: { + INPUT_CHANGED: "input_changed", + RECEIVED_STATE: "received_state", + DISCONNECT: "process_disconnect", + }, + LISTENER: { + UPDATE_STATE: "updateState", + RECEIVED_STATE: "receivedState", + DISCONNECT: "disconnect", + }, }; export class DebuggerCommunicationServer { - private port: number; - private serverHttp: http.Server; - private serverIo: socketio.Server; - private simulatorWebview: WebviewPanel | undefined; - private deviceSelectionService: DeviceSelectionService; - private isPendingResponse = false; - private pendingCallbacks: Function[] = []; + private port: number; + private serverHttp: http.Server; + private serverIo: socketio.Server; + private simulatorWebview: WebviewPanel | undefined; + private deviceSelectionService: DeviceSelectionService; + private isPendingResponse = false; + private pendingCallbacks: Function[] = []; - constructor( - webviewPanel: WebviewPanel | undefined, - port = SERVER_INFO.DEFAULT_SERVER_PORT, - deviceSelectionService: DeviceSelectionService - ) { - this.port = port; - this.serverHttp = new http.Server(); - this.initHttpServer(); + constructor( + webviewPanel: WebviewPanel | undefined, + port = SERVER_INFO.DEFAULT_SERVER_PORT, + deviceSelectionService: DeviceSelectionService + ) { + this.port = port; + this.serverHttp = new http.Server(); + this.initHttpServer(); - this.serverIo = socketio(this.serverHttp); - this.simulatorWebview = webviewPanel; - this.initEventsHandlers(); - console.info(`Server running on port ${this.port}`); + this.serverIo = socketio(this.serverHttp); + this.simulatorWebview = webviewPanel; + this.initEventsHandlers(); + console.info(`Server running on port ${this.port}`); - this.deviceSelectionService = deviceSelectionService; - } + this.deviceSelectionService = deviceSelectionService; + } - // send the message to start closing the connection - public closeConnection(): void { - this.sendDisconnectEvent(); - } + // send the message to start closing the connection + public closeConnection(): void { + this.sendDisconnectEvent(); + } - public setWebview(webviewPanel: WebviewPanel | undefined) { - this.simulatorWebview = webviewPanel; - } - // Events are pushed when the previous processed event is over - public emitInputChanged(newState: string): void { - if (this.isPendingResponse) { - this.pendingCallbacks.push(() => { - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, - newState - ); - }); - } else { - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, - newState - ); - this.isPendingResponse = true; - } - } - public disconnectFromPort() { - this.serverIo.close(); - this.serverHttp.close(); - } - private sendDisconnectEvent() { - this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); - } + public setWebview(webviewPanel: WebviewPanel | undefined) { + this.simulatorWebview = webviewPanel; + } + // Events are pushed when the previous processed event is over + public emitInputChanged(newState: string): void { + if (this.isPendingResponse) { + this.pendingCallbacks.push(() => { + this.serverIo.emit( + DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, + newState + ); + }); + } else { + this.serverIo.emit( + DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, + newState + ); + this.isPendingResponse = true; + } + } + public disconnectFromPort() { + this.serverIo.close(); + this.serverHttp.close(); + } + private sendDisconnectEvent() { + this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); + } - private initHttpServer(): void { - this.serverHttp.listen(this.port); - if (!this.serverHttp.listening) { - throw new Error(SERVER_INFO.ERROR_CODE_INIT_SERVER); - } - } + private initHttpServer(): void { + this.serverHttp.listen(this.port); + if (!this.serverHttp.listening) { + throw new Error(SERVER_INFO.ERROR_CODE_INIT_SERVER); + } + } - private initEventsHandlers(): void { - this.serverIo.on("connection", (socket: any) => { - socket.on(DEBUGGER_MESSAGES.LISTENER.UPDATE_STATE, (data: any) => { - this.handleState(data); - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.RECEIVED_STATE, - {} - ); - }); - socket.on(DEBUGGER_MESSAGES.LISTENER.RECEIVED_STATE, () => { - if (this.pendingCallbacks.length > 0) { - const currentCall = this.pendingCallbacks.shift(); - currentCall(); - this.isPendingResponse = true; - } else { - this.isPendingResponse = false; - } - }); + private initEventsHandlers(): void { + this.serverIo.on("connection", (socket: any) => { + socket.on(DEBUGGER_MESSAGES.LISTENER.UPDATE_STATE, (data: any) => { + this.handleState(data); + this.serverIo.emit( + DEBUGGER_MESSAGES.EMITTER.RECEIVED_STATE, + {} + ); + }); + socket.on(DEBUGGER_MESSAGES.LISTENER.RECEIVED_STATE, () => { + if (this.pendingCallbacks.length > 0) { + const currentCall = this.pendingCallbacks.shift(); + currentCall(); + this.isPendingResponse = true; + } else { + this.isPendingResponse = false; + } + }); - socket.on(DEBUGGER_MESSAGES.LISTENER.DISCONNECT, () => { - this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); - if (this.simulatorWebview) { - this.simulatorWebview.webview.postMessage({ - command: "reset-state", - }); - } - }); - }); - } + socket.on(DEBUGGER_MESSAGES.LISTENER.DISCONNECT, () => { + this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); + if (this.simulatorWebview) { + this.simulatorWebview.webview.postMessage({ + command: "reset-state", + }); + } + }); + }); + } - private handleState(data: any): void { - try { - const messageToWebview = JSON.parse(data); - if (messageToWebview.type === "state") { - const messageState = JSON.parse(messageToWebview.data); - if ( - this.simulatorWebview && - messageState.device_name === - this.deviceSelectionService.getCurrentActiveDevice() - ) { - this.simulatorWebview.webview.postMessage({ - active_device: this.deviceSelectionService.getCurrentActiveDevice(), - command: "set-state", - state: messageState, - }); - } - } - } catch (err) { - console.error(`Error: Non-JSON output from the process : ${data}`); - } - } + private handleState(data: any): void { + try { + const messageToWebview = JSON.parse(data); + if (messageToWebview.type === "state") { + const messageState = JSON.parse(messageToWebview.data); + if ( + this.simulatorWebview && + messageState.device_name === + this.deviceSelectionService.getCurrentActiveDevice() + ) { + this.simulatorWebview.webview.postMessage({ + active_device: + this.deviceSelectionService.getCurrentActiveDevice(), + command: "set-state", + state: messageState, + }); + } + } + } catch (err) { + console.error(`Error: Non-JSON output from the process : ${data}`); + } + } } diff --git a/Source/dev-requirements.txt b/Source/dev-requirements.txt index 26f334b51..6b117ff69 100644 --- a/Source/dev-requirements.txt +++ b/Source/dev-requirements.txt @@ -1,3 +1,3 @@ -r ./requirements.txt black==19.10b0 -pytest==5.0.1 \ No newline at end of file +pytest==5.0.1 diff --git a/Source/deviceContext.ts b/Source/deviceContext.ts index a4f0afd2e..9144ef23b 100644 --- a/Source/deviceContext.ts +++ b/Source/deviceContext.ts @@ -11,141 +11,141 @@ import { CPXWorkspace } from "./cpxWorkspace"; import * as utils from "./extension_utils/utils"; export class DeviceContext implements vscode.Disposable { - public static getInstance(): DeviceContext { - return DeviceContext._deviceContext; - } - - private static _deviceContext: DeviceContext = new DeviceContext(); - - private _onDidChange = new vscode.EventEmitter(); - private _watcher: vscode.FileSystemWatcher; - private _vscodeWatcher: vscode.FileSystemWatcher; - private _port!: string; - - private constructor() { - if (vscode.workspace && CPXWorkspace.rootPath) { - this._watcher = vscode.workspace.createFileSystemWatcher( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ); - this._vscodeWatcher = vscode.workspace.createFileSystemWatcher( - path.join(CPXWorkspace.rootPath, ".vscode"), - true, - true, - false - ); - - // Reloads the config into the code if the cpx config file has changed - this._watcher.onDidCreate(() => this.loadContext()); - this._watcher.onDidChange(() => this.loadContext()); - this._watcher.onDidDelete(() => this.loadContext()); - - this._vscodeWatcher.onDidDelete(() => this.loadContext()); - } - } - - public loadContext(): Thenable { - return vscode.workspace.findFiles(CPX_CONFIG_FILE, null, 1).then( - files => { - let cpxConfigJson: any = {}; - if (files && files.length > 0) { - const configFile = files[0]; - cpxConfigJson = utils.tryParseJSON( - fs.readFileSync(configFile.fsPath, "utf8") - ); - if (cpxConfigJson) { - this._port = cpxConfigJson.port; - this._onDidChange.fire(); - } else { - console.error(CONSTANTS.ERROR.CPX_FILE_ERROR); - } - } else { - this._port = null; - this._onDidChange.fire(); - } - return this; - }, - reason => { - this._port = null; - this._onDidChange.fire(); - return this; - } - ); - } - - public saveContext() { - if (!CPXWorkspace.rootPath) { - return; - } - const cpxConfigFile = path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE); - let cpxConfigJson: any = {}; - if (utils.fileExistsSync(cpxConfigFile)) { - cpxConfigJson = utils.tryParseJSON( - fs.readFileSync(cpxConfigFile, "utf8") - ); - } - if (!cpxConfigJson) { - // log and notify user error - return; - } - cpxConfigJson.port = this.port; - - utils.mkdirRecursivelySync(path.dirname(cpxConfigFile)); - fs.writeFileSync( - cpxConfigFile, - JSON.stringify( - cpxConfigJson, - (key, value) => { - if (value === null) { - return undefined; - } - return value; - }, - 4 - ) - ); - } - - public dispose() { - if (this._watcher) { - this._watcher.dispose(); - } - - if (this._vscodeWatcher) { - this._vscodeWatcher.dispose(); - } - } - - public async initialize() { - if ( - CPXWorkspace.rootPath && - utils.fileExistsSync( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ) - ) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.CPX_JSON_ALREADY_GENERATED - ); - return; - } else { - if (!CPXWorkspace.rootPath) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.PLEASE_OPEN_FOLDER - ); - return; - } - } - } - - public get onDidChange(): vscode.Event { - return this._onDidChange.event; - } - - public get port() { - return this._port; - } - - public set port(value: string) { - this._port = value; - this.saveContext(); - } + public static getInstance(): DeviceContext { + return DeviceContext._deviceContext; + } + + private static _deviceContext: DeviceContext = new DeviceContext(); + + private _onDidChange = new vscode.EventEmitter(); + private _watcher: vscode.FileSystemWatcher; + private _vscodeWatcher: vscode.FileSystemWatcher; + private _port!: string; + + private constructor() { + if (vscode.workspace && CPXWorkspace.rootPath) { + this._watcher = vscode.workspace.createFileSystemWatcher( + path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) + ); + this._vscodeWatcher = vscode.workspace.createFileSystemWatcher( + path.join(CPXWorkspace.rootPath, ".vscode"), + true, + true, + false + ); + + // Reloads the config into the code if the cpx config file has changed + this._watcher.onDidCreate(() => this.loadContext()); + this._watcher.onDidChange(() => this.loadContext()); + this._watcher.onDidDelete(() => this.loadContext()); + + this._vscodeWatcher.onDidDelete(() => this.loadContext()); + } + } + + public loadContext(): Thenable { + return vscode.workspace.findFiles(CPX_CONFIG_FILE, null, 1).then( + (files) => { + let cpxConfigJson: any = {}; + if (files && files.length > 0) { + const configFile = files[0]; + cpxConfigJson = utils.tryParseJSON( + fs.readFileSync(configFile.fsPath, "utf8") + ); + if (cpxConfigJson) { + this._port = cpxConfigJson.port; + this._onDidChange.fire(); + } else { + console.error(CONSTANTS.ERROR.CPX_FILE_ERROR); + } + } else { + this._port = null; + this._onDidChange.fire(); + } + return this; + }, + (reason) => { + this._port = null; + this._onDidChange.fire(); + return this; + } + ); + } + + public saveContext() { + if (!CPXWorkspace.rootPath) { + return; + } + const cpxConfigFile = path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE); + let cpxConfigJson: any = {}; + if (utils.fileExistsSync(cpxConfigFile)) { + cpxConfigJson = utils.tryParseJSON( + fs.readFileSync(cpxConfigFile, "utf8") + ); + } + if (!cpxConfigJson) { + // log and notify user error + return; + } + cpxConfigJson.port = this.port; + + utils.mkdirRecursivelySync(path.dirname(cpxConfigFile)); + fs.writeFileSync( + cpxConfigFile, + JSON.stringify( + cpxConfigJson, + (key, value) => { + if (value === null) { + return undefined; + } + return value; + }, + 4 + ) + ); + } + + public dispose() { + if (this._watcher) { + this._watcher.dispose(); + } + + if (this._vscodeWatcher) { + this._vscodeWatcher.dispose(); + } + } + + public async initialize() { + if ( + CPXWorkspace.rootPath && + utils.fileExistsSync( + path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) + ) + ) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.CPX_JSON_ALREADY_GENERATED + ); + return; + } else { + if (!CPXWorkspace.rootPath) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.PLEASE_OPEN_FOLDER + ); + return; + } + } + } + + public get onDidChange(): vscode.Event { + return this._onDidChange.event; + } + + public get port() { + return this._port; + } + + public set port(value: string) { + this._port = value; + this.saveContext(); + } } diff --git a/Source/extension.ts b/Source/extension.ts index 5940217dc..d73a05b05 100644 --- a/Source/extension.ts +++ b/Source/extension.ts @@ -7,15 +7,15 @@ import * as open from "open"; import * as path from "path"; import * as vscode from "vscode"; import { - CONFIG, - CONSTANTS, - CPX_CONFIG_FILE, - DialogResponses, - GLOBAL_ENV_VARS, - HELPER_FILES, - LANGUAGE_VARS, - SERVER_INFO, - TelemetryEventName, + CONFIG, + CONSTANTS, + CPX_CONFIG_FILE, + DialogResponses, + GLOBAL_ENV_VARS, + HELPER_FILES, + LANGUAGE_VARS, + SERVER_INFO, + TelemetryEventName, } from "./constants"; import { CPXWorkspace } from "./cpxWorkspace"; import { DebugAdapterFactory } from "./debugger/debugAdapterFactory"; @@ -35,9 +35,9 @@ import getPackageInfo from "./telemetry/getPackageInfo"; import TelemetryAI from "./telemetry/telemetryAI"; import { UsbDetector } from "./usbDetector"; import { - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, - WEBVIEW_TYPES, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_MESSAGES, + WEBVIEW_TYPES, } from "./view/constants"; let telemetryAI: TelemetryAI; @@ -59,1043 +59,1055 @@ let pythonProcessDataBuffer: string[]; export let outChannel: vscode.OutputChannel | undefined; const sendCurrentDeviceMessage = (currentPanel: vscode.WebviewPanel) => { - if (currentPanel) { - currentPanel.webview.postMessage({ - command: VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE, - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } + if (currentPanel) { + currentPanel.webview.postMessage({ + command: VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE, + active_device: deviceSelectionService.getCurrentActiveDevice(), + }); + } }; // Extension activation export async function activate(context: vscode.ExtensionContext) { - telemetryAI = new TelemetryAI(context); - setupService = new SetupService(telemetryAI); - let currentPanel: vscode.WebviewPanel | undefined; - let childProcess: cp.ChildProcess | undefined; - let messageListener: vscode.Disposable; - let activeEditorListener: vscode.Disposable; - const webviewService = new WebviewService(context, deviceSelectionService); - const telemetryHandlerService = new TelemetryHandlerService( - telemetryAI, - deviceSelectionService - ); - const formalNameToNickNameMapping = { - [CONSTANTS.DEVICE_NAME_FORMAL.CPX]: CONSTANTS.DEVICE_NAME.CPX, - [CONSTANTS.DEVICE_NAME_FORMAL.MICROBIT]: CONSTANTS.DEVICE_NAME.MICROBIT, - [CONSTANTS.DEVICE_NAME_FORMAL.CLUE]: CONSTANTS.DEVICE_NAME.CLUE, - }; - - // Add our library path to settings.json for autocomplete functionality - updatePythonExtraPaths(); - - // ignore import errors so that adafruit_circuitplayground library - // doesn't trigger lint errors - updatePylintArgs(context); - - pythonExecutablePath = await setupService.setupEnv(context); - - try { - utils.generateCPXConfig(); - configFileCreated = true; - } catch (err) { - console.info("Failed to create the CPX config file."); - configFileCreated = false; - } - - if (pythonExecutablePath === "") { - return; - } - - if (outChannel === undefined) { - outChannel = vscode.window.createOutputChannel(CONSTANTS.NAME); - utils.logToOutputChannel(outChannel, CONSTANTS.INFO.WELCOME_OUTPUT_TAB); - } - - vscode.workspace.onDidSaveTextDocument( - async (document: vscode.TextDocument) => { - await fileSelectionService.updateCurrentFileFromTextFile(document); - } - ); - - const currVersionReleaseName = - "release_note_" + getPackageInfo(context).extensionVersion; - const viewedReleaseNote = context.globalState.get( - currVersionReleaseName, - false - ); - - if (!viewedReleaseNote) { - PopupService.openReleaseNote(); - context.globalState.update(currVersionReleaseName, true); - } - - const openWebview = () => { - if (currentPanel && currentPanel.webview) { - messagingService.setWebview(currentPanel.webview); - currentPanel.webview.html = webviewService.getWebviewContent( - WEBVIEW_TYPES.SIMULATOR, - true, - currentPanel - ); - currentPanel.reveal(vscode.ViewColumn.Beside); - } else { - currentPanel = vscode.window.createWebviewPanel( - CONSTANTS.WEBVIEW_TYPE.SIMULATOR, - CONSTANTS.LABEL.WEBVIEW_PANEL, - { preserveFocus: true, viewColumn: vscode.ViewColumn.Beside }, - { - // Only allow the webview to access resources in our extension's media directory - localResourceRoots: [ - vscode.Uri.file( - path.join( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY - ) - ), - ], - enableScripts: true, - } - ); - - currentPanel.webview.html = webviewService.getWebviewContent( - WEBVIEW_TYPES.SIMULATOR, - true, - currentPanel - ); - messagingService.setWebview(currentPanel.webview); - - if (messageListener !== undefined) { - messageListener.dispose(); - const index = context.subscriptions.indexOf(messageListener); - if (index > -1) { - context.subscriptions.splice(index, 1); - } - } - - if (activeEditorListener !== undefined) { - activeEditorListener.dispose(); - const index = context.subscriptions.indexOf( - activeEditorListener - ); - if (index > -1) { - context.subscriptions.splice(index, 1); - } - } - - if (currentPanel) { - // Handle messages from webview - messageListener = currentPanel.webview.onDidReceiveMessage( - message => { - const messageJson = JSON.stringify({ - active_device: deviceSelectionService.getCurrentActiveDevice(), - state: message.text, - }); - switch (message.command) { - case WEBVIEW_MESSAGES.BUTTON_PRESS: - // Send input to the Python process - telemetryHandlerService.handleButtonPressTelemetry( - message.text - ); - console.log(`About to write ${messageJson} \n`); - if ( - inDebugMode && - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .emitInputChanged(messageJson); - } else if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - break; - case WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP: - console.log(`Play button ${messageJson} \n`); - if (message.text.state as boolean) { - fileSelectionService.setPathAndSendMessage( - message.text.selected_file - ); - fileSelectionService.findCurrentTextDocument(); - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_RUN_SIMULATOR_BUTTON - ); - runSimulatorCommand(); - } else { - killProcessIfRunning(); - } - - if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - - break; - case WEBVIEW_MESSAGES.GESTURE: - case WEBVIEW_MESSAGES.SENSOR_CHANGED: - telemetryHandlerService.handleGestureTelemetry( - message.text - ); - console.log(`Sensor changed ${messageJson} \n`); - if ( - inDebugMode && - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .emitInputChanged(messageJson); - } else if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - break; - case WEBVIEW_MESSAGES.REFRESH_SIMULATOR: - console.log("Refresh button"); - runSimulatorCommand(); - break; - case WEBVIEW_MESSAGES.SLIDER_TELEMETRY: - telemetryHandlerService.handleSensorTelemetry( - message.text - ); - break; - case WEBVIEW_MESSAGES.SWITCH_DEVICE: - deviceSelectionService.setCurrentActiveDevice( - message.text.active_device - ); - killProcessIfRunning(); - break; - default: - vscode.window.showInformationMessage( - CONSTANTS.ERROR.UNEXPECTED_MESSAGE - ); - break; - } - }, - undefined, - context.subscriptions - ); - - activeEditorListener = utils.addVisibleTextEditorCallback( - currentPanel, - context - ); - } - - currentPanel.onDidDispose( - () => { - currentPanel = undefined; - if ( - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .setWebview(undefined); - } - killProcessIfRunning(); - if (firstTimeClosed) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.FIRST_TIME_WEBVIEW - ); - firstTimeClosed = false; - } - }, - undefined, - context.subscriptions - ); - } - sendCurrentDeviceMessage(currentPanel); - }; - - // Open Simulator on the webview - const openSimulator: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.openSimulator", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_SIMULATE_TO, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - deviceSelectionService.setCurrentActiveDevice(device); - const telemetryEvents = telemetryHandlerService.getTelemetryEventsForOpenSimulator( - device - ); - telemetryAI.trackFeatureUsage( - telemetryEvents.openSimulatorTelemetryEvent - ); - telemetryAI.runWithLatencyMeasure( - openWebview, - telemetryEvents.openSimulatorPerformanceTelemetryEvent - ); - } - ); - - const gettingStartedOpen: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.gettingStarted", - () => { - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_GETTING_STARTED - ); - webviewService.openTutorialPanel(); - } - ); - - const openTemplateFile = (template: string) => { - const fileName = template; - const filePath = - __dirname + path.sep + "templates" + path.sep + fileName; - const file = fs.readFileSync(filePath, "utf8"); - const showNewFilePopup: boolean = vscode.workspace - .getConfiguration() - .get(CONFIG.SHOW_NEW_FILE_POPUP); - - if (showNewFilePopup && template === CONSTANTS.TEMPLATE.CPX) { - vscode.window - .showInformationMessage( - CONSTANTS.INFO.NEW_FILE, - DialogResponses.DONT_SHOW, - DialogResponses.EXAMPLE_CODE, - DialogResponses.TUTORIALS - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.DONT_SHOW) { - vscode.workspace - .getConfiguration() - .update(CONFIG.SHOW_NEW_FILE_POPUP, false); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_DONT_SHOW - ); - } else if (selection === DialogResponses.EXAMPLE_CODE) { - open(CONSTANTS.LINKS.EXAMPLE_CODE); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_EXAMPLE_CODE - ); - } else if (selection === DialogResponses.TUTORIALS) { - const okAction = () => { - open(CONSTANTS.LINKS.TUTORIALS); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_TUTORIALS - ); - }; - utils.showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT - ); - } - }); - } - - // tslint:disable-next-line: ban-comma-operator - vscode.workspace - .openTextDocument({ - content: file, - language: LANGUAGE_VARS.PYTHON.ID, - }) - .then((template: vscode.TextDocument) => { - vscode.window.showTextDocument(template, 1, false).then(() => { - openWebview(); - }); - }), - // tslint:disable-next-line: no-unused-expression - (error: any) => { - telemetryHandlerService.handleNewFileErrorTelemetry(); - console.error(`Failed to open a new text document: ${error}`); - }; - }; - - const newFile: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.newFile", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_FOR_NEW_FILE, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - deviceSelectionService.setCurrentActiveDevice(device); - - const deviceToTemplateMapping = { - [CONSTANTS.DEVICE_NAME.CPX]: CONSTANTS.TEMPLATE.CPX, - [CONSTANTS.DEVICE_NAME.MICROBIT]: CONSTANTS.TEMPLATE.MICROBIT, - [CONSTANTS.DEVICE_NAME.CLUE]: CONSTANTS.TEMPLATE.CLUE, - }; - const templateFile = deviceToTemplateMapping[device]; - - const telemetryEvents = telemetryHandlerService.getTelemetryEventsForNewFile( - device - ); - - telemetryAI.trackFeatureUsage( - telemetryEvents.newFileTelemetryEvent - ); - telemetryAI.runWithLatencyMeasure( - () => openTemplateFile(templateFile), - telemetryEvents.newFilePerformanceTelemetryEvent - ); - } - ); - - const installDependencies: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.installDependencies", - async () => { - pythonExecutablePath = await setupService.setupEnv(context, true); - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_INSTALL_EXTENSION_DEPENDENCIES - ); - } - ); - - const killProcessIfRunning = () => { - if (childProcess !== undefined) { - if (currentPanel) { - currentPanel.webview.postMessage({ - command: "reset-state", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } - // TODO: We need to check the process was correctly killed - childProcess.kill(); - childProcess = undefined; - } - }; - - const runSimulatorCommand = async () => { - pythonProcessDataBuffer = []; - // Prevent running new code if a debug session is active - if (inDebugMode) { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.DEBUGGING_SESSION_IN_PROGESS - ); - return; - } - if (shouldShowRunCodePopup) { - const shouldExitCommand = await vscode.window - .showWarningMessage( - CONSTANTS.WARNING.ACCEPT_AND_RUN, - DialogResponses.ACCEPT_AND_RUN, - DialogResponses.CANCEL - ) - .then((selection: vscode.MessageItem | undefined) => { - let hasAccepted = true; - if (selection === DialogResponses.ACCEPT_AND_RUN) { - shouldShowRunCodePopup = false; - hasAccepted = false; - } - return hasAccepted; - }); - // Don't run users code if they don't accept - if (shouldExitCommand) { - return; - } - } - - openWebview(); - - if (!currentPanel) { - return; - } - - console.info(CONSTANTS.INFO.RUNNING_CODE); - - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_SIMULATOR, - true - ); - - killProcessIfRunning(); - - await fileSelectionService.updateCurrentFileFromEditor( - vscode.window.activeTextEditor - ); - - if (fileSelectionService.getCurrentFileAbsPath() === "") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_RUN, - true - ); - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FILE_TO_RUN, - DialogResponses.MESSAGE_UNDERSTOOD - ); - } else { - // Save on run - await fileSelectionService.getCurrentTextDocument().save(); - - if ( - !fileSelectionService - .getCurrentTextDocument() - .fileName.endsWith(LANGUAGE_VARS.PYTHON.FILE_ENDS) - ) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_RUN, - true - ); - return; - } - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.FILE_SELECTED( - fileSelectionService.getCurrentFileAbsPath() - ) - ); - - // Activate the run webview button - currentPanel.webview.postMessage({ - command: "activate-play", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - const args = [ - utils.getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.PROCESS_USER_CODE_PY - ), - fileSelectionService.getCurrentFileAbsPath(), - JSON.stringify({ enable_telemetry: utils.getTelemetryState() }), - ]; - childProcess = cp.spawn(pythonExecutablePath, args); - - let dataFromTheProcess = ""; - let oldMessage = ""; - - // Data received from Python process - childProcess.stdout.on("data", data => { - dataFromTheProcess = data.toString(); - if (currentPanel) { - // NOTE: parts of the flow regarding pythonProcessDataBuffer - // are needed for the CLUE simulator to properly receive - // base_64 strings on UNIX systems. - - // added any incomplete data to beginning - const processedData = pythonProcessDataBuffer - .join("") - .concat(dataFromTheProcess); - pythonProcessDataBuffer = []; - - // Process the data from the process and send one state at a time - processedData.split("\0").forEach(message => { - if ( - currentPanel && - message.length > 0 && - message !== oldMessage - ) { - oldMessage = message; - let messageToWebview; - // Check the message is a JSON - try { - messageToWebview = JSON.parse(message); - // Check the JSON is a state - switch (messageToWebview.type) { - case "state": - const messageData = JSON.parse( - messageToWebview.data - ); - if ( - messageData.device_name === - deviceSelectionService.getCurrentActiveDevice() - ) { - messagingService.sendMessageToWebview( - VSCODE_MESSAGES_TO_WEBVIEW.SET_STATE, - messageData - ); - } - break; - - case "print": - console.log( - `Process print statement output = ${messageToWebview.data}` - ); - utils.logToOutputChannel( - outChannel, - `[PRINT] ${messageToWebview.data}` - ); - break; - - default: - console.log( - `Non-state JSON output from the process : ${messageToWebview}` - ); - break; - } - } catch (err) { - if (err instanceof SyntaxError) { - // if not a JSON string, it is incomplete - // add to beginning of next strings - pythonProcessDataBuffer.push(message); - } else { - console.log( - `Errored output: ${messageToWebview}` - ); - } - } - } - }); - } - }); - - // Std error output - childProcess.stderr.on("data", data => { - console.error( - `Error from the Python process through stderr: ${data}` - ); - telemetryAI.trackFeatureUsage( - TelemetryEventName.ERROR_PYTHON_PROCESS - ); - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.STDERR(data), - true - ); - if (currentPanel) { - currentPanel.webview.postMessage({ - active_device: deviceSelectionService.getCurrentActiveDevice(), - command: "reset-state", - }); - } - }); - - // When the process is done - childProcess.on("end", (code: number) => { - console.info(`Command execution exited with code: ${code}`); - }); - } - }; - - // Send message to the webview - const runSimulator: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.runSimulator", - () => { - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_RUN_PALETTE - ); - runSimulatorCommand(); - } - ); - - const deployCode = async (device: string) => { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_DEVICE, - true - ); - - await fileSelectionService.updateCurrentFileFromEditor( - vscode.window.activeTextEditor - ); - - if (fileSelectionService.getCurrentFileAbsPath() === "") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, - true - ); - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, - DialogResponses.MESSAGE_UNDERSTOOD - ); - } else { - await fileSelectionService.getCurrentTextDocument().save(); - - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.FILE_SELECTED( - fileSelectionService.getCurrentFileAbsPath() - ) - ); - - const deviceProcess = cp.spawn(pythonExecutablePath, [ - utils.getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.DEVICE_PY - ), - device, - fileSelectionService.getCurrentFileAbsPath(), - ]); - - let dataFromTheProcess = ""; - - // Data received from Python process - deviceProcess.stdout.on("data", data => { - dataFromTheProcess = data.toString(); - - let messageToWebview; - try { - messageToWebview = JSON.parse(dataFromTheProcess); - if (messageToWebview.type === "complete") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_SUCCESS, - true - ); - } - telemetryHandlerService.handleDeployToDeviceFinishedTelemetry( - messageToWebview, - device - ); - } catch (err) { - console.log( - `Non-JSON output from the process : ${dataFromTheProcess}` - ); - } - }); - - // Std error output - deviceProcess.stderr.on("data", data => { - telemetryHandlerService.handleDeployToDeviceErrorTelemetry( - data, - device - ); - console.error( - `Error from the Python device process through stderr: ${data}` - ); - utils.logToOutputChannel( - outChannel, - `[ERROR] ${data} \n`, - true - ); - }); - - // When the process is done - deviceProcess.on("end", (code: number) => { - console.info(`Command execution exited with code: ${code}`); - }); - } - }; - - const deployToDevice: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.deployToDevice", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_DEPLOY_TO, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - - const telemetryEvents = telemetryHandlerService.getTelemetryEventsForStartingDeployToDevice( - device - ); - - telemetryAI.trackFeatureUsage(telemetryEvents.deployTelemetryEvent); - telemetryAI.runWithLatencyMeasure(() => { - deployCode(device); - }, telemetryEvents.deployPerformanceTelemetryEvent); - } - ); - - let serialMonitor: SerialMonitor | undefined; - if (configFileCreated) { - serialMonitor = SerialMonitor.getInstance(); - context.subscriptions.push(serialMonitor); - } - - const selectSerialPort: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.selectSerialPort", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.selectSerialPort(null, null); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CHOOSE_PORT); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const openSerialMonitor: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.openSerialMonitor", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure( - serialMonitor.openSerialMonitor.bind(serialMonitor), - TelemetryEventName.COMMAND_SERIAL_MONITOR_OPEN - ); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const changeBaudRate: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.changeBaudRate", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure( - serialMonitor.changeBaudRate.bind(serialMonitor), - TelemetryEventName.COMMAND_SERIAL_MONITOR_BAUD_RATE - ); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const closeSerialMonitor: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.closeSerialMonitor", - (port, showWarning = true) => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.closeSerialMonitor(port, showWarning); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const showReleaseNote = vscode.commands.registerCommand( - "deviceSimulatorExpress.", - (port, showWarning = true) => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.closeSerialMonitor(port, showWarning); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - UsbDetector.getInstance().initialize(context.extensionPath); - UsbDetector.getInstance().startListening(); - - if ( - CPXWorkspace.rootPath && - (utils.fileExistsSync( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ) || - vscode.window.activeTextEditor) - ) { - (() => { - if (!SerialMonitor.getInstance().initialized) { - SerialMonitor.getInstance().initialize(); - } - })(); - } - - // Debugger configuration - const simulatorDebugConfiguration = new SimulatorDebugConfigurationProvider( - utils.getPathToScript(context, "out/", "debug_user_code.py") - ); - - const debugAdapterFactory = new DebugAdapterFactory( - vscode.debug.activeDebugSession, - messagingService, - debuggerCommunicationService - ); - vscode.debug.registerDebugAdapterTrackerFactory( - LANGUAGE_VARS.PYTHON.ID, - debugAdapterFactory - ); - // On Debug Session Start: Init comunication - const debugSessionsStarted = vscode.debug.onDidStartDebugSession(() => { - if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { - // Reinitialize process - killProcessIfRunning(); - inDebugMode = true; - - try { - // Shut down existing server on debug restart - if (debuggerCommunicationService.getCurrentDebuggerServer()) { - debuggerCommunicationService.resetCurrentDebuggerServer(); - } - - debuggerCommunicationService.setCurrentDebuggerServer( - new DebuggerCommunicationServer( - currentPanel, - utils.getServerPortConfig(), - deviceSelectionService - ) - ); - - telemetryHandlerService.handleDebuggerTelemetry(); - - openWebview(); - if (currentPanel) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .setWebview(currentPanel); - currentPanel.webview.postMessage({ - active_device: deviceSelectionService.getCurrentActiveDevice(), - command: "activate-play", - }); - } - } catch (err) { - if (err.message === SERVER_INFO.ERROR_CODE_INIT_SERVER) { - console.error( - `Error trying to init the server on port ${utils.getServerPortConfig()}` - ); - - telemetryHandlerService.handleDebuggerFailTelemetry(); - - vscode.window.showErrorMessage( - CONSTANTS.ERROR.DEBUGGER_SERVER_INIT_FAILED( - utils.getServerPortConfig() - ) - ); - } - } - } - }); - - // On Debug Session Stop: Stop communiation - const debugSessionStopped = vscode.debug.onDidTerminateDebugSession(() => { - if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { - inDebugMode = false; - simulatorDebugConfiguration.deviceSimulatorExpressDebug = false; - if (debuggerCommunicationService.getCurrentDebuggerServer()) { - debuggerCommunicationService.resetCurrentDebuggerServer(); - } - if (currentPanel) { - currentPanel.webview.postMessage({ - command: "reset-state", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } - } - }); - - const configsChanged = vscode.workspace.onDidChangeConfiguration( - async () => { - if (utils.checkConfig(CONFIG.CONFIG_ENV_ON_SWITCH)) { - pythonExecutablePath = await setupService.setupEnv(context); - } - } - ); - - context.subscriptions.push( - installDependencies, - runSimulator, - changeBaudRate, - closeSerialMonitor, - deployToDevice, - newFile, - openSimulator, - openSerialMonitor, - selectSerialPort, - gettingStartedOpen, - vscode.debug.registerDebugConfigurationProvider( - CONSTANTS.DEBUG_CONFIGURATION_TYPE, - simulatorDebugConfiguration - ), - debugSessionsStarted, - debugSessionStopped, - configsChanged - ); + telemetryAI = new TelemetryAI(context); + setupService = new SetupService(telemetryAI); + let currentPanel: vscode.WebviewPanel | undefined; + let childProcess: cp.ChildProcess | undefined; + let messageListener: vscode.Disposable; + let activeEditorListener: vscode.Disposable; + const webviewService = new WebviewService(context, deviceSelectionService); + const telemetryHandlerService = new TelemetryHandlerService( + telemetryAI, + deviceSelectionService + ); + const formalNameToNickNameMapping = { + [CONSTANTS.DEVICE_NAME_FORMAL.CPX]: CONSTANTS.DEVICE_NAME.CPX, + [CONSTANTS.DEVICE_NAME_FORMAL.MICROBIT]: CONSTANTS.DEVICE_NAME.MICROBIT, + [CONSTANTS.DEVICE_NAME_FORMAL.CLUE]: CONSTANTS.DEVICE_NAME.CLUE, + }; + + // Add our library path to settings.json for autocomplete functionality + updatePythonExtraPaths(); + + // ignore import errors so that adafruit_circuitplayground library + // doesn't trigger lint errors + updatePylintArgs(context); + + pythonExecutablePath = await setupService.setupEnv(context); + + try { + utils.generateCPXConfig(); + configFileCreated = true; + } catch (err) { + console.info("Failed to create the CPX config file."); + configFileCreated = false; + } + + if (pythonExecutablePath === "") { + return; + } + + if (outChannel === undefined) { + outChannel = vscode.window.createOutputChannel(CONSTANTS.NAME); + utils.logToOutputChannel(outChannel, CONSTANTS.INFO.WELCOME_OUTPUT_TAB); + } + + vscode.workspace.onDidSaveTextDocument( + async (document: vscode.TextDocument) => { + await fileSelectionService.updateCurrentFileFromTextFile(document); + } + ); + + const currVersionReleaseName = + "release_note_" + getPackageInfo(context).extensionVersion; + const viewedReleaseNote = context.globalState.get( + currVersionReleaseName, + false + ); + + if (!viewedReleaseNote) { + PopupService.openReleaseNote(); + context.globalState.update(currVersionReleaseName, true); + } + + const openWebview = () => { + if (currentPanel && currentPanel.webview) { + messagingService.setWebview(currentPanel.webview); + currentPanel.webview.html = webviewService.getWebviewContent( + WEBVIEW_TYPES.SIMULATOR, + true, + currentPanel + ); + currentPanel.reveal(vscode.ViewColumn.Beside); + } else { + currentPanel = vscode.window.createWebviewPanel( + CONSTANTS.WEBVIEW_TYPE.SIMULATOR, + CONSTANTS.LABEL.WEBVIEW_PANEL, + { preserveFocus: true, viewColumn: vscode.ViewColumn.Beside }, + { + // Only allow the webview to access resources in our extension's media directory + localResourceRoots: [ + vscode.Uri.file( + path.join( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY + ) + ), + ], + enableScripts: true, + } + ); + + currentPanel.webview.html = webviewService.getWebviewContent( + WEBVIEW_TYPES.SIMULATOR, + true, + currentPanel + ); + messagingService.setWebview(currentPanel.webview); + + if (messageListener !== undefined) { + messageListener.dispose(); + const index = context.subscriptions.indexOf(messageListener); + if (index > -1) { + context.subscriptions.splice(index, 1); + } + } + + if (activeEditorListener !== undefined) { + activeEditorListener.dispose(); + const index = + context.subscriptions.indexOf(activeEditorListener); + if (index > -1) { + context.subscriptions.splice(index, 1); + } + } + + if (currentPanel) { + // Handle messages from webview + messageListener = currentPanel.webview.onDidReceiveMessage( + (message) => { + const messageJson = JSON.stringify({ + active_device: + deviceSelectionService.getCurrentActiveDevice(), + state: message.text, + }); + switch (message.command) { + case WEBVIEW_MESSAGES.BUTTON_PRESS: + // Send input to the Python process + telemetryHandlerService.handleButtonPressTelemetry( + message.text + ); + console.log(`About to write ${messageJson} \n`); + if ( + inDebugMode && + debuggerCommunicationService.getCurrentDebuggerServer() + ) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .emitInputChanged(messageJson); + } else if (childProcess) { + childProcess.stdin.write( + messageJson + "\n" + ); + } + break; + case WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP: + console.log(`Play button ${messageJson} \n`); + if (message.text.state as boolean) { + fileSelectionService.setPathAndSendMessage( + message.text.selected_file + ); + fileSelectionService.findCurrentTextDocument(); + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_RUN_SIMULATOR_BUTTON + ); + runSimulatorCommand(); + } else { + killProcessIfRunning(); + } + + if (childProcess) { + childProcess.stdin.write( + messageJson + "\n" + ); + } + + break; + case WEBVIEW_MESSAGES.GESTURE: + case WEBVIEW_MESSAGES.SENSOR_CHANGED: + telemetryHandlerService.handleGestureTelemetry( + message.text + ); + console.log(`Sensor changed ${messageJson} \n`); + if ( + inDebugMode && + debuggerCommunicationService.getCurrentDebuggerServer() + ) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .emitInputChanged(messageJson); + } else if (childProcess) { + childProcess.stdin.write( + messageJson + "\n" + ); + } + break; + case WEBVIEW_MESSAGES.REFRESH_SIMULATOR: + console.log("Refresh button"); + runSimulatorCommand(); + break; + case WEBVIEW_MESSAGES.SLIDER_TELEMETRY: + telemetryHandlerService.handleSensorTelemetry( + message.text + ); + break; + case WEBVIEW_MESSAGES.SWITCH_DEVICE: + deviceSelectionService.setCurrentActiveDevice( + message.text.active_device + ); + killProcessIfRunning(); + break; + default: + vscode.window.showInformationMessage( + CONSTANTS.ERROR.UNEXPECTED_MESSAGE + ); + break; + } + }, + undefined, + context.subscriptions + ); + + activeEditorListener = utils.addVisibleTextEditorCallback( + currentPanel, + context + ); + } + + currentPanel.onDidDispose( + () => { + currentPanel = undefined; + if ( + debuggerCommunicationService.getCurrentDebuggerServer() + ) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .setWebview(undefined); + } + killProcessIfRunning(); + if (firstTimeClosed) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.FIRST_TIME_WEBVIEW + ); + firstTimeClosed = false; + } + }, + undefined, + context.subscriptions + ); + } + sendCurrentDeviceMessage(currentPanel); + }; + + // Open Simulator on the webview + const openSimulator: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.openSimulator", + async () => { + const chosen_device = await vscode.window.showQuickPick( + Object.values(CONSTANTS.DEVICE_NAME_FORMAL) + ); + + if (!chosen_device) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_SIMULATE_TO, + true + ); + return; + } + + const device = formalNameToNickNameMapping[chosen_device]; + deviceSelectionService.setCurrentActiveDevice(device); + const telemetryEvents = + telemetryHandlerService.getTelemetryEventsForOpenSimulator( + device + ); + telemetryAI.trackFeatureUsage( + telemetryEvents.openSimulatorTelemetryEvent + ); + telemetryAI.runWithLatencyMeasure( + openWebview, + telemetryEvents.openSimulatorPerformanceTelemetryEvent + ); + } + ); + + const gettingStartedOpen: vscode.Disposable = + vscode.commands.registerCommand( + "deviceSimulatorExpress.common.gettingStarted", + () => { + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_GETTING_STARTED + ); + webviewService.openTutorialPanel(); + } + ); + + const openTemplateFile = (template: string) => { + const fileName = template; + const filePath = + __dirname + path.sep + "templates" + path.sep + fileName; + const file = fs.readFileSync(filePath, "utf8"); + const showNewFilePopup: boolean = vscode.workspace + .getConfiguration() + .get(CONFIG.SHOW_NEW_FILE_POPUP); + + if (showNewFilePopup && template === CONSTANTS.TEMPLATE.CPX) { + vscode.window + .showInformationMessage( + CONSTANTS.INFO.NEW_FILE, + DialogResponses.DONT_SHOW, + DialogResponses.EXAMPLE_CODE, + DialogResponses.TUTORIALS + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.DONT_SHOW) { + vscode.workspace + .getConfiguration() + .update(CONFIG.SHOW_NEW_FILE_POPUP, false); + telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_CLICK_DIALOG_DONT_SHOW + ); + } else if (selection === DialogResponses.EXAMPLE_CODE) { + open(CONSTANTS.LINKS.EXAMPLE_CODE); + telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_CLICK_DIALOG_EXAMPLE_CODE + ); + } else if (selection === DialogResponses.TUTORIALS) { + const okAction = () => { + open(CONSTANTS.LINKS.TUTORIALS); + telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_CLICK_DIALOG_TUTORIALS + ); + }; + utils.showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT + ); + } + }); + } + + // tslint:disable-next-line: ban-comma-operator + vscode.workspace + .openTextDocument({ + content: file, + language: LANGUAGE_VARS.PYTHON.ID, + }) + .then((template: vscode.TextDocument) => { + vscode.window.showTextDocument(template, 1, false).then(() => { + openWebview(); + }); + }), + // tslint:disable-next-line: no-unused-expression + (error: any) => { + telemetryHandlerService.handleNewFileErrorTelemetry(); + console.error(`Failed to open a new text document: ${error}`); + }; + }; + + const newFile: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.newFile", + async () => { + const chosen_device = await vscode.window.showQuickPick( + Object.values(CONSTANTS.DEVICE_NAME_FORMAL) + ); + + if (!chosen_device) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.NO_DEVICE_CHOSEN_FOR_NEW_FILE, + true + ); + return; + } + + const device = formalNameToNickNameMapping[chosen_device]; + deviceSelectionService.setCurrentActiveDevice(device); + + const deviceToTemplateMapping = { + [CONSTANTS.DEVICE_NAME.CPX]: CONSTANTS.TEMPLATE.CPX, + [CONSTANTS.DEVICE_NAME.MICROBIT]: CONSTANTS.TEMPLATE.MICROBIT, + [CONSTANTS.DEVICE_NAME.CLUE]: CONSTANTS.TEMPLATE.CLUE, + }; + const templateFile = deviceToTemplateMapping[device]; + + const telemetryEvents = + telemetryHandlerService.getTelemetryEventsForNewFile(device); + + telemetryAI.trackFeatureUsage( + telemetryEvents.newFileTelemetryEvent + ); + telemetryAI.runWithLatencyMeasure( + () => openTemplateFile(templateFile), + telemetryEvents.newFilePerformanceTelemetryEvent + ); + } + ); + + const installDependencies: vscode.Disposable = + vscode.commands.registerCommand( + "deviceSimulatorExpress.common.installDependencies", + async () => { + pythonExecutablePath = await setupService.setupEnv( + context, + true + ); + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_INSTALL_EXTENSION_DEPENDENCIES + ); + } + ); + + const killProcessIfRunning = () => { + if (childProcess !== undefined) { + if (currentPanel) { + currentPanel.webview.postMessage({ + command: "reset-state", + active_device: + deviceSelectionService.getCurrentActiveDevice(), + }); + } + // TODO: We need to check the process was correctly killed + childProcess.kill(); + childProcess = undefined; + } + }; + + const runSimulatorCommand = async () => { + pythonProcessDataBuffer = []; + // Prevent running new code if a debug session is active + if (inDebugMode) { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.DEBUGGING_SESSION_IN_PROGESS + ); + return; + } + if (shouldShowRunCodePopup) { + const shouldExitCommand = await vscode.window + .showWarningMessage( + CONSTANTS.WARNING.ACCEPT_AND_RUN, + DialogResponses.ACCEPT_AND_RUN, + DialogResponses.CANCEL + ) + .then((selection: vscode.MessageItem | undefined) => { + let hasAccepted = true; + if (selection === DialogResponses.ACCEPT_AND_RUN) { + shouldShowRunCodePopup = false; + hasAccepted = false; + } + return hasAccepted; + }); + // Don't run users code if they don't accept + if (shouldExitCommand) { + return; + } + } + + openWebview(); + + if (!currentPanel) { + return; + } + + console.info(CONSTANTS.INFO.RUNNING_CODE); + + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.DEPLOY_SIMULATOR, + true + ); + + killProcessIfRunning(); + + await fileSelectionService.updateCurrentFileFromEditor( + vscode.window.activeTextEditor + ); + + if (fileSelectionService.getCurrentFileAbsPath() === "") { + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.NO_FILE_TO_RUN, + true + ); + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FILE_TO_RUN, + DialogResponses.MESSAGE_UNDERSTOOD + ); + } else { + // Save on run + await fileSelectionService.getCurrentTextDocument().save(); + + if ( + !fileSelectionService + .getCurrentTextDocument() + .fileName.endsWith(LANGUAGE_VARS.PYTHON.FILE_ENDS) + ) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.NO_FILE_TO_RUN, + true + ); + return; + } + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.FILE_SELECTED( + fileSelectionService.getCurrentFileAbsPath() + ) + ); + + // Activate the run webview button + currentPanel.webview.postMessage({ + command: "activate-play", + active_device: deviceSelectionService.getCurrentActiveDevice(), + }); + const args = [ + utils.getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.PROCESS_USER_CODE_PY + ), + fileSelectionService.getCurrentFileAbsPath(), + JSON.stringify({ enable_telemetry: utils.getTelemetryState() }), + ]; + childProcess = cp.spawn(pythonExecutablePath, args); + + let dataFromTheProcess = ""; + let oldMessage = ""; + + // Data received from Python process + childProcess.stdout.on("data", (data) => { + dataFromTheProcess = data.toString(); + if (currentPanel) { + // NOTE: parts of the flow regarding pythonProcessDataBuffer + // are needed for the CLUE simulator to properly receive + // base_64 strings on UNIX systems. + + // added any incomplete data to beginning + const processedData = pythonProcessDataBuffer + .join("") + .concat(dataFromTheProcess); + pythonProcessDataBuffer = []; + + // Process the data from the process and send one state at a time + processedData.split("\0").forEach((message) => { + if ( + currentPanel && + message.length > 0 && + message !== oldMessage + ) { + oldMessage = message; + let messageToWebview; + // Check the message is a JSON + try { + messageToWebview = JSON.parse(message); + // Check the JSON is a state + switch (messageToWebview.type) { + case "state": + const messageData = JSON.parse( + messageToWebview.data + ); + if ( + messageData.device_name === + deviceSelectionService.getCurrentActiveDevice() + ) { + messagingService.sendMessageToWebview( + VSCODE_MESSAGES_TO_WEBVIEW.SET_STATE, + messageData + ); + } + break; + + case "print": + console.log( + `Process print statement output = ${messageToWebview.data}` + ); + utils.logToOutputChannel( + outChannel, + `[PRINT] ${messageToWebview.data}` + ); + break; + + default: + console.log( + `Non-state JSON output from the process : ${messageToWebview}` + ); + break; + } + } catch (err) { + if (err instanceof SyntaxError) { + // if not a JSON string, it is incomplete + // add to beginning of next strings + pythonProcessDataBuffer.push(message); + } else { + console.log( + `Errored output: ${messageToWebview}` + ); + } + } + } + }); + } + }); + + // Std error output + childProcess.stderr.on("data", (data) => { + console.error( + `Error from the Python process through stderr: ${data}` + ); + telemetryAI.trackFeatureUsage( + TelemetryEventName.ERROR_PYTHON_PROCESS + ); + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.STDERR(data), + true + ); + if (currentPanel) { + currentPanel.webview.postMessage({ + active_device: + deviceSelectionService.getCurrentActiveDevice(), + command: "reset-state", + }); + } + }); + + // When the process is done + childProcess.on("end", (code: number) => { + console.info(`Command execution exited with code: ${code}`); + }); + } + }; + + // Send message to the webview + const runSimulator: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.runSimulator", + () => { + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_RUN_PALETTE + ); + runSimulatorCommand(); + } + ); + + const deployCode = async (device: string) => { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.DEPLOY_DEVICE, + true + ); + + await fileSelectionService.updateCurrentFileFromEditor( + vscode.window.activeTextEditor + ); + + if (fileSelectionService.getCurrentFileAbsPath() === "") { + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, + true + ); + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, + DialogResponses.MESSAGE_UNDERSTOOD + ); + } else { + await fileSelectionService.getCurrentTextDocument().save(); + + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.FILE_SELECTED( + fileSelectionService.getCurrentFileAbsPath() + ) + ); + + const deviceProcess = cp.spawn(pythonExecutablePath, [ + utils.getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.DEVICE_PY + ), + device, + fileSelectionService.getCurrentFileAbsPath(), + ]); + + let dataFromTheProcess = ""; + + // Data received from Python process + deviceProcess.stdout.on("data", (data) => { + dataFromTheProcess = data.toString(); + + let messageToWebview; + try { + messageToWebview = JSON.parse(dataFromTheProcess); + if (messageToWebview.type === "complete") { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.DEPLOY_SUCCESS, + true + ); + } + telemetryHandlerService.handleDeployToDeviceFinishedTelemetry( + messageToWebview, + device + ); + } catch (err) { + console.log( + `Non-JSON output from the process : ${dataFromTheProcess}` + ); + } + }); + + // Std error output + deviceProcess.stderr.on("data", (data) => { + telemetryHandlerService.handleDeployToDeviceErrorTelemetry( + data, + device + ); + console.error( + `Error from the Python device process through stderr: ${data}` + ); + utils.logToOutputChannel( + outChannel, + `[ERROR] ${data} \n`, + true + ); + }); + + // When the process is done + deviceProcess.on("end", (code: number) => { + console.info(`Command execution exited with code: ${code}`); + }); + } + }; + + const deployToDevice: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.deployToDevice", + async () => { + const chosen_device = await vscode.window.showQuickPick( + Object.values(CONSTANTS.DEVICE_NAME_FORMAL) + ); + + if (!chosen_device) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_DEPLOY_TO, + true + ); + return; + } + + const device = formalNameToNickNameMapping[chosen_device]; + + const telemetryEvents = + telemetryHandlerService.getTelemetryEventsForStartingDeployToDevice( + device + ); + + telemetryAI.trackFeatureUsage(telemetryEvents.deployTelemetryEvent); + telemetryAI.runWithLatencyMeasure(() => { + deployCode(device); + }, telemetryEvents.deployPerformanceTelemetryEvent); + } + ); + + let serialMonitor: SerialMonitor | undefined; + if (configFileCreated) { + serialMonitor = SerialMonitor.getInstance(); + context.subscriptions.push(serialMonitor); + } + + const selectSerialPort: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.selectSerialPort", + () => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure(() => { + serialMonitor.selectSerialPort(null, null); + }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CHOOSE_PORT); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + const openSerialMonitor: vscode.Disposable = + vscode.commands.registerCommand( + "deviceSimulatorExpress.common.openSerialMonitor", + () => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure( + serialMonitor.openSerialMonitor.bind(serialMonitor), + TelemetryEventName.COMMAND_SERIAL_MONITOR_OPEN + ); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + const changeBaudRate: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.changeBaudRate", + () => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure( + serialMonitor.changeBaudRate.bind(serialMonitor), + TelemetryEventName.COMMAND_SERIAL_MONITOR_BAUD_RATE + ); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + const closeSerialMonitor: vscode.Disposable = + vscode.commands.registerCommand( + "deviceSimulatorExpress.common.closeSerialMonitor", + (port, showWarning = true) => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure(() => { + serialMonitor.closeSerialMonitor(port, showWarning); + }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + const showReleaseNote = vscode.commands.registerCommand( + "deviceSimulatorExpress.", + (port, showWarning = true) => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure(() => { + serialMonitor.closeSerialMonitor(port, showWarning); + }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + UsbDetector.getInstance().initialize(context.extensionPath); + UsbDetector.getInstance().startListening(); + + if ( + CPXWorkspace.rootPath && + (utils.fileExistsSync( + path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) + ) || + vscode.window.activeTextEditor) + ) { + (() => { + if (!SerialMonitor.getInstance().initialized) { + SerialMonitor.getInstance().initialize(); + } + })(); + } + + // Debugger configuration + const simulatorDebugConfiguration = new SimulatorDebugConfigurationProvider( + utils.getPathToScript(context, "out/", "debug_user_code.py") + ); + + const debugAdapterFactory = new DebugAdapterFactory( + vscode.debug.activeDebugSession, + messagingService, + debuggerCommunicationService + ); + vscode.debug.registerDebugAdapterTrackerFactory( + LANGUAGE_VARS.PYTHON.ID, + debugAdapterFactory + ); + // On Debug Session Start: Init comunication + const debugSessionsStarted = vscode.debug.onDidStartDebugSession(() => { + if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { + // Reinitialize process + killProcessIfRunning(); + inDebugMode = true; + + try { + // Shut down existing server on debug restart + if (debuggerCommunicationService.getCurrentDebuggerServer()) { + debuggerCommunicationService.resetCurrentDebuggerServer(); + } + + debuggerCommunicationService.setCurrentDebuggerServer( + new DebuggerCommunicationServer( + currentPanel, + utils.getServerPortConfig(), + deviceSelectionService + ) + ); + + telemetryHandlerService.handleDebuggerTelemetry(); + + openWebview(); + if (currentPanel) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .setWebview(currentPanel); + currentPanel.webview.postMessage({ + active_device: + deviceSelectionService.getCurrentActiveDevice(), + command: "activate-play", + }); + } + } catch (err) { + if (err.message === SERVER_INFO.ERROR_CODE_INIT_SERVER) { + console.error( + `Error trying to init the server on port ${utils.getServerPortConfig()}` + ); + + telemetryHandlerService.handleDebuggerFailTelemetry(); + + vscode.window.showErrorMessage( + CONSTANTS.ERROR.DEBUGGER_SERVER_INIT_FAILED( + utils.getServerPortConfig() + ) + ); + } + } + } + }); + + // On Debug Session Stop: Stop communiation + const debugSessionStopped = vscode.debug.onDidTerminateDebugSession(() => { + if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { + inDebugMode = false; + simulatorDebugConfiguration.deviceSimulatorExpressDebug = false; + if (debuggerCommunicationService.getCurrentDebuggerServer()) { + debuggerCommunicationService.resetCurrentDebuggerServer(); + } + if (currentPanel) { + currentPanel.webview.postMessage({ + command: "reset-state", + active_device: + deviceSelectionService.getCurrentActiveDevice(), + }); + } + } + }); + + const configsChanged = vscode.workspace.onDidChangeConfiguration( + async () => { + if (utils.checkConfig(CONFIG.CONFIG_ENV_ON_SWITCH)) { + pythonExecutablePath = await setupService.setupEnv(context); + } + } + ); + + context.subscriptions.push( + installDependencies, + runSimulator, + changeBaudRate, + closeSerialMonitor, + deployToDevice, + newFile, + openSimulator, + openSerialMonitor, + selectSerialPort, + gettingStartedOpen, + vscode.debug.registerDebugConfigurationProvider( + CONSTANTS.DEBUG_CONFIGURATION_TYPE, + simulatorDebugConfiguration + ), + debugSessionsStarted, + debugSessionStopped, + configsChanged + ); } const updatePythonExtraPaths = () => { - updateConfigLists( - "python.autoComplete.extraPaths", - [ - __dirname, - path.join(__dirname, CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY), - path.join(__dirname, CONSTANTS.FILESYSTEM.CLUE), - path.join(__dirname, CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON), - ], - vscode.ConfigurationTarget.Global - ); + updateConfigLists( + "python.autoComplete.extraPaths", + [ + __dirname, + path.join(__dirname, CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY), + path.join(__dirname, CONSTANTS.FILESYSTEM.CLUE), + path.join(__dirname, CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON), + ], + vscode.ConfigurationTarget.Global + ); }; const updatePylintArgs = (context: vscode.ExtensionContext) => { - const outPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY - ); - const micropythonPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY - ); - - const cluePath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.CLUE - ); - - const baseCircuitPythonPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON - ); - // update pylint args to extend system path - // to include python libs local to extention - updateConfigLists( - "python.linting.pylintArgs", - [ - "--init-hook", - `import sys; sys.path.extend([\"${outPath}\",\"${micropythonPath}\",\"${cluePath}\",\"${baseCircuitPythonPath}\"])`, - ], - vscode.ConfigurationTarget.Workspace - ); + const outPath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY + ); + const micropythonPath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY + ); + + const cluePath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + CONSTANTS.FILESYSTEM.CLUE + ); + + const baseCircuitPythonPath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON + ); + // update pylint args to extend system path + // to include python libs local to extention + updateConfigLists( + "python.linting.pylintArgs", + [ + "--init-hook", + `import sys; sys.path.extend([\"${outPath}\",\"${micropythonPath}\",\"${cluePath}\",\"${baseCircuitPythonPath}\"])`, + ], + vscode.ConfigurationTarget.Workspace + ); }; const updateConfigLists = ( - section: string, - newItems: string[], - scope: vscode.ConfigurationTarget + section: string, + newItems: string[], + scope: vscode.ConfigurationTarget ) => { - // function for adding elements to configuration arrays - const currentExtraItems: string[] = - vscode.workspace.getConfiguration().get(section) || []; - const extraItemsSet: Set = new Set( - currentExtraItems.concat(newItems) - ); - - vscode.workspace - .getConfiguration() - .update(section, Array.from(extraItemsSet), scope); + // function for adding elements to configuration arrays + const currentExtraItems: string[] = + vscode.workspace.getConfiguration().get(section) || []; + const extraItemsSet: Set = new Set( + currentExtraItems.concat(newItems) + ); + + vscode.workspace + .getConfiguration() + .update(section, Array.from(extraItemsSet), scope); }; // this method is called when your extension is deactivated export async function deactivate() { - const monitor: SerialMonitor = SerialMonitor.getInstance(); - await monitor.closeSerialMonitor(null, false); - UsbDetector.getInstance().stopListening(); + const monitor: SerialMonitor = SerialMonitor.getInstance(); + await monitor.closeSerialMonitor(null, false); + UsbDetector.getInstance().stopListening(); } diff --git a/Source/extension_utils/utils.ts b/Source/extension_utils/utils.ts index b7be3b71c..e276605a5 100644 --- a/Source/extension_utils/utils.ts +++ b/Source/extension_utils/utils.ts @@ -7,11 +7,11 @@ import * as path from "path"; import * as util from "util"; import * as vscode from "vscode"; import { - CONSTANTS, - CPX_CONFIG_FILE, - DialogResponses, - GLOBAL_ENV_VARS, - SERVER_INFO, + CONSTANTS, + CPX_CONFIG_FILE, + DialogResponses, + GLOBAL_ENV_VARS, + SERVER_INFO, } from "../constants"; import { CPXWorkspace } from "../cpxWorkspace"; import { DeviceContext } from "../deviceContext"; @@ -19,94 +19,94 @@ import { DeviceContext } from "../deviceContext"; export const exec = util.promisify(cp.exec); const errorChannel = vscode.window.createOutputChannel( - CONSTANTS.ERROR.INSTALLATION_ERROR + CONSTANTS.ERROR.INSTALLATION_ERROR ); // tslint:disable-next-line: export-name export const getPathToScript = ( - context: vscode.ExtensionContext, - folderName: string, - fileName: string = "" + context: vscode.ExtensionContext, + folderName: string, + fileName: string = "" ) => { - const onDiskPath = vscode.Uri.file( - path.join(context.extensionPath, folderName, fileName) - ); - const scriptPath = onDiskPath.with({ scheme: "vscode-resource" }); - return scriptPath.fsPath; + const onDiskPath = vscode.Uri.file( + path.join(context.extensionPath, folderName, fileName) + ); + const scriptPath = onDiskPath.with({ scheme: "vscode-resource" }); + return scriptPath.fsPath; }; export const showPrivacyModal = ( - okAction: () => void, - thirdPartyDisclaimer: string + okAction: () => void, + thirdPartyDisclaimer: string ) => { - vscode.window - .showInformationMessage( - `${thirdPartyDisclaimer}: ${CONSTANTS.LINKS.PRIVACY}`, - DialogResponses.AGREE_AND_PROCEED, - DialogResponses.CANCEL - ) - .then((privacySelection: vscode.MessageItem | undefined) => { - if (privacySelection === DialogResponses.AGREE_AND_PROCEED) { - okAction(); - } else if (privacySelection === DialogResponses.CANCEL) { - // do nothing - } - }); + vscode.window + .showInformationMessage( + `${thirdPartyDisclaimer}: ${CONSTANTS.LINKS.PRIVACY}`, + DialogResponses.AGREE_AND_PROCEED, + DialogResponses.CANCEL + ) + .then((privacySelection: vscode.MessageItem | undefined) => { + if (privacySelection === DialogResponses.AGREE_AND_PROCEED) { + okAction(); + } else if (privacySelection === DialogResponses.CANCEL) { + // do nothing + } + }); }; export const logToOutputChannel = ( - outChannel: vscode.OutputChannel | undefined, - message: string, - show: boolean = false + outChannel: vscode.OutputChannel | undefined, + message: string, + show: boolean = false ): void => { - if (outChannel) { - if (show) { - outChannel.show(true); - } - outChannel.append(message); - } + if (outChannel) { + if (show) { + outChannel.show(true); + } + outChannel.append(message); + } }; export function tryParseJSON(jsonString: string): any | boolean { - try { - const jsonObj = JSON.parse(jsonString); - if (jsonObj && typeof jsonObj === "object") { - return jsonObj; - } - } catch (exception) {} - - return false; + try { + const jsonObj = JSON.parse(jsonString); + if (jsonObj && typeof jsonObj === "object") { + return jsonObj; + } + } catch (exception) {} + + return false; } export function fileExistsSync(filePath: string): boolean { - try { - return fs.statSync(filePath).isFile(); - } catch (error) { - return false; - } + try { + return fs.statSync(filePath).isFile(); + } catch (error) { + return false; + } } export function mkdirRecursivelySync(dirPath: string): void { - if (directoryExistsSync(dirPath)) { - return; - } - const dirname = path.dirname(dirPath); - if (path.normalize(dirname) === path.normalize(dirPath)) { - fs.mkdirSync(dirPath); - } else if (directoryExistsSync(dirname)) { - fs.mkdirSync(dirPath); - } else { - mkdirRecursivelySync(dirname); - fs.mkdirSync(dirPath); - } + if (directoryExistsSync(dirPath)) { + return; + } + const dirname = path.dirname(dirPath); + if (path.normalize(dirname) === path.normalize(dirPath)) { + fs.mkdirSync(dirPath); + } else if (directoryExistsSync(dirname)) { + fs.mkdirSync(dirPath); + } else { + mkdirRecursivelySync(dirname); + fs.mkdirSync(dirPath); + } } export function directoryExistsSync(dirPath: string): boolean { - try { - return fs.statSync(dirPath).isDirectory(); - } catch (e) { - return false; - } + try { + return fs.statSync(dirPath).isDirectory(); + } catch (e) { + return false; + } } /** @@ -115,119 +115,121 @@ export function directoryExistsSync(dirPath: string): boolean { * The padding is applied from the start (left) of the current string. */ export function padStart( - sourceString: string, - targetLength: number, - padString?: string + sourceString: string, + targetLength: number, + padString?: string ): string { - if (!sourceString) { - return sourceString; - } - - if (!(String.prototype as any).padStart) { - // https://github.com/uxitten/polyfill/blob/master/string.polyfill.js - padString = String(padString || " "); - if (sourceString.length > targetLength) { - return sourceString; - } else { - targetLength = targetLength - sourceString.length; - if (targetLength > padString.length) { - padString += padString.repeat(targetLength / padString.length); // append to original to ensure we are longer than needed - } - return padString.slice(0, targetLength) + sourceString; - } - } else { - return (sourceString as any).padStart(targetLength, padString); - } + if (!sourceString) { + return sourceString; + } + + if (!(String.prototype as any).padStart) { + // https://github.com/uxitten/polyfill/blob/master/string.polyfill.js + padString = String(padString || " "); + if (sourceString.length > targetLength) { + return sourceString; + } else { + targetLength = targetLength - sourceString.length; + if (targetLength > padString.length) { + padString += padString.repeat(targetLength / padString.length); // append to original to ensure we are longer than needed + } + return padString.slice(0, targetLength) + sourceString; + } + } else { + return (sourceString as any).padStart(targetLength, padString); + } } export function convertToHex(num: number, width = 0): string { - return padStart(num.toString(16), width, "0"); + return padStart(num.toString(16), width, "0"); } export function generateCPXConfig(): void { - const deviceContext: DeviceContext = DeviceContext.getInstance(); - const cpxJson = { - port: deviceContext.port, - }; - const cpxConfigFilePath: string = path.join( - CPXWorkspace.rootPath, - CPX_CONFIG_FILE - ); - mkdirRecursivelySync(path.dirname(cpxConfigFilePath)); - fs.writeFileSync(cpxConfigFilePath, JSON.stringify(cpxJson, null, 4)); + const deviceContext: DeviceContext = DeviceContext.getInstance(); + const cpxJson = { + port: deviceContext.port, + }; + const cpxConfigFilePath: string = path.join( + CPXWorkspace.rootPath, + CPX_CONFIG_FILE + ); + mkdirRecursivelySync(path.dirname(cpxConfigFilePath)); + fs.writeFileSync(cpxConfigFilePath, JSON.stringify(cpxJson, null, 4)); } export const addVisibleTextEditorCallback = ( - currentPanel: vscode.WebviewPanel, - context: vscode.ExtensionContext + currentPanel: vscode.WebviewPanel, + context: vscode.ExtensionContext ): vscode.Disposable => { - const initialPythonEditors = filterForPythonFiles( - vscode.window.visibleTextEditors - ); - currentPanel.webview.postMessage({ - command: "visible-editors", - state: { activePythonEditors: initialPythonEditors }, - }); - return vscode.window.onDidChangeVisibleTextEditors( - (textEditors: vscode.TextEditor[]) => { - const activePythonEditors = filterForPythonFiles(textEditors); - currentPanel.webview.postMessage({ - command: "visible-editors", - state: { activePythonEditors }, - }); - }, - {}, - context.subscriptions - ); + const initialPythonEditors = filterForPythonFiles( + vscode.window.visibleTextEditors + ); + currentPanel.webview.postMessage({ + command: "visible-editors", + state: { activePythonEditors: initialPythonEditors }, + }); + return vscode.window.onDidChangeVisibleTextEditors( + (textEditors: vscode.TextEditor[]) => { + const activePythonEditors = filterForPythonFiles(textEditors); + currentPanel.webview.postMessage({ + command: "visible-editors", + state: { activePythonEditors }, + }); + }, + {}, + context.subscriptions + ); }; export const filterForPythonFiles = (textEditors: vscode.TextEditor[]) => { - return textEditors - .filter(editor => editor.document.languageId === GLOBAL_ENV_VARS.PYTHON) - .map(editor => editor.document.fileName); + return textEditors + .filter( + (editor) => editor.document.languageId === GLOBAL_ENV_VARS.PYTHON + ) + .map((editor) => editor.document.fileName); }; export const getActiveEditorFromPath = ( - filePath: string + filePath: string ): vscode.TextDocument => { - const activeEditor = vscode.window.visibleTextEditors.find( - (editor: vscode.TextEditor) => editor.document.fileName === filePath - ); - return activeEditor ? activeEditor.document : undefined; + const activeEditor = vscode.window.visibleTextEditors.find( + (editor: vscode.TextEditor) => editor.document.fileName === filePath + ); + return activeEditor ? activeEditor.document : undefined; }; export const getServerPortConfig = (): number => { - // tslint:disable: no-backbone-get-set-outside-model prefer-type-cast - if ( - vscode.workspace - .getConfiguration() - .has(SERVER_INFO.SERVER_PORT_CONFIGURATION) - ) { - return vscode.workspace - .getConfiguration() - .get(SERVER_INFO.SERVER_PORT_CONFIGURATION) as number; - } - return SERVER_INFO.DEFAULT_SERVER_PORT; + // tslint:disable: no-backbone-get-set-outside-model prefer-type-cast + if ( + vscode.workspace + .getConfiguration() + .has(SERVER_INFO.SERVER_PORT_CONFIGURATION) + ) { + return vscode.workspace + .getConfiguration() + .get(SERVER_INFO.SERVER_PORT_CONFIGURATION) as number; + } + return SERVER_INFO.DEFAULT_SERVER_PORT; }; export const checkConfig = (configName: string): boolean => { - return vscode.workspace.getConfiguration().get(configName) === true; + return vscode.workspace.getConfiguration().get(configName) === true; }; export const getConfig = (configName: string): string => { - return vscode.workspace.getConfiguration().get(configName); + return vscode.workspace.getConfiguration().get(configName); }; export const createEscapedPath = (...pieces: string[]) => { - const initialPath: string = path.join(...pieces); + const initialPath: string = path.join(...pieces); - // escape all special characters - // https://stackoverflow.com/questions/1779858/how-do-i-escape-a-string-for-a-shell-command-in-node - return `"` + initialPath.replace(/(["'$`\\])/g, "\\$1") + `"`; + // escape all special characters + // https://stackoverflow.com/questions/1779858/how-do-i-escape-a-string-for-a-shell-command-in-node + return `"` + initialPath.replace(/(["'$`\\])/g, "\\$1") + `"`; }; export const getTelemetryState = () => { - return vscode.workspace - .getConfiguration() - .get("telemetry.enableTelemetry", true); + return vscode.workspace + .getConfiguration() + .get("telemetry.enableTelemetry", true); }; diff --git a/Source/requirements.txt b/Source/requirements.txt index c13eef60b..3a5fdb5a2 100644 --- a/Source/requirements.txt +++ b/Source/requirements.txt @@ -9,4 +9,4 @@ adafruit-circuitpython-fancyled==1.3.3 Pillow==8.1.1 adafruit-circuitpython-bitmap_font==1.1.0 adafruit-circuitpython-display-shapes==1.2.0 -adafruit-circuitpython-neopixel==5.0.0 \ No newline at end of file +adafruit-circuitpython-neopixel==5.0.0 diff --git a/Source/serialMonitor.ts b/Source/serialMonitor.ts index f3685cd58..f5460862c 100644 --- a/Source/serialMonitor.ts +++ b/Source/serialMonitor.ts @@ -11,300 +11,288 @@ import { logToOutputChannel } from "./extension_utils/utils"; import { SerialPortControl } from "./serialPortControl"; export interface ISerialPortDetail { - path: string; - manufacturer: string; - vendorId: string; - productId: string; + path: string; + manufacturer: string; + vendorId: string; + productId: string; } export class SerialMonitor implements vscode.Disposable { - public static DEFAULT_BAUD_RATE: number = 115200; + public static DEFAULT_BAUD_RATE: number = 115200; - public static listBaudRates(): number[] { - return [ - 300, - 1200, - 2400, - 4800, - 9600, - 19200, - 38400, - 57600, - 74880, - 115200, - 230400, - 250000, - ]; - } + public static listBaudRates(): number[] { + return [ + 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 74880, 115200, + 230400, 250000, + ]; + } - public static getInstance(): SerialMonitor { - if (SerialMonitor._serialMonitor === null) { - SerialMonitor._serialMonitor = new SerialMonitor(); - } - return SerialMonitor._serialMonitor; - } + public static getInstance(): SerialMonitor { + if (SerialMonitor._serialMonitor === null) { + SerialMonitor._serialMonitor = new SerialMonitor(); + } + return SerialMonitor._serialMonitor; + } - private static _serialMonitor: SerialMonitor | null = null; + private static _serialMonitor: SerialMonitor | null = null; - private _currentPort!: string; - private _currentBaudRate!: number; - private _outputChannel!: vscode.OutputChannel; - private _serialPortControl: SerialPortControl | null = null; - private _baudRateStatusBar!: vscode.StatusBarItem; - private _openPortStatusBar!: vscode.StatusBarItem; - private _portsStatusBar!: vscode.StatusBarItem; + private _currentPort!: string; + private _currentBaudRate!: number; + private _outputChannel!: vscode.OutputChannel; + private _serialPortControl: SerialPortControl | null = null; + private _baudRateStatusBar!: vscode.StatusBarItem; + private _openPortStatusBar!: vscode.StatusBarItem; + private _portsStatusBar!: vscode.StatusBarItem; - private constructor() { - const deviceContext = DeviceContext.getInstance(); - deviceContext.onDidChange(() => { - if (deviceContext.port) { - if (!this.initialized) { - this.initialize(); - } - this.updatePortListStatus(null); - } - }); - } + private constructor() { + const deviceContext = DeviceContext.getInstance(); + deviceContext.onDidChange(() => { + if (deviceContext.port) { + if (!this.initialized) { + this.initialize(); + } + this.updatePortListStatus(null); + } + }); + } - public initialize() { - const defaultBaudRate: number = SerialMonitor.DEFAULT_BAUD_RATE; - this._outputChannel = vscode.window.createOutputChannel( - CONSTANTS.MISC.SERIAL_MONITOR_NAME - ); - this._currentBaudRate = defaultBaudRate; - this._portsStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.PORT - ); - this._portsStatusBar.command = - "deviceSimulatorExpress.common.selectSerialPort"; - this._portsStatusBar.tooltip = "Select Serial Port"; - this._portsStatusBar.show(); + public initialize() { + const defaultBaudRate: number = SerialMonitor.DEFAULT_BAUD_RATE; + this._outputChannel = vscode.window.createOutputChannel( + CONSTANTS.MISC.SERIAL_MONITOR_NAME + ); + this._currentBaudRate = defaultBaudRate; + this._portsStatusBar = vscode.window.createStatusBarItem( + vscode.StatusBarAlignment.Right, + STATUS_BAR_PRIORITY.PORT + ); + this._portsStatusBar.command = + "deviceSimulatorExpress.common.selectSerialPort"; + this._portsStatusBar.tooltip = "Select Serial Port"; + this._portsStatusBar.show(); - this._openPortStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.OPEN_PORT - ); - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.openSerialMonitor"; - this._openPortStatusBar.text = `$(plug)`; - this._openPortStatusBar.tooltip = "Open Serial Monitor"; - this._openPortStatusBar.show(); + this._openPortStatusBar = vscode.window.createStatusBarItem( + vscode.StatusBarAlignment.Right, + STATUS_BAR_PRIORITY.OPEN_PORT + ); + this._openPortStatusBar.command = + "deviceSimulatorExpress.common.openSerialMonitor"; + this._openPortStatusBar.text = `$(plug)`; + this._openPortStatusBar.tooltip = "Open Serial Monitor"; + this._openPortStatusBar.show(); - this._baudRateStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.BAUD_RATE - ); - this._baudRateStatusBar.command = - "deviceSimulatorExpress.common.changeBaudRate"; - this._baudRateStatusBar.tooltip = "Baud Rate"; - this._baudRateStatusBar.text = defaultBaudRate.toString(); - this.updatePortListStatus(null); - } + this._baudRateStatusBar = vscode.window.createStatusBarItem( + vscode.StatusBarAlignment.Right, + STATUS_BAR_PRIORITY.BAUD_RATE + ); + this._baudRateStatusBar.command = + "deviceSimulatorExpress.common.changeBaudRate"; + this._baudRateStatusBar.tooltip = "Baud Rate"; + this._baudRateStatusBar.text = defaultBaudRate.toString(); + this.updatePortListStatus(null); + } - public async selectSerialPort(vid: string | null, pid: string | null) { - const lists = await SerialPortControl.list(); - if (!lists.length) { - vscode.window.showInformationMessage( - "No serial message is available." - ); - return; - } + public async selectSerialPort(vid: string | null, pid: string | null) { + const lists = await SerialPortControl.list(); + if (!lists.length) { + vscode.window.showInformationMessage( + "No serial message is available." + ); + return; + } - if (vid && pid) { - const valueOfVid = parseInt(vid, 16); - const valueOfPid = parseInt(pid, 16); - const foundPort = lists.find(port => { - if (port.productId && port.vendorId) { - return ( - parseInt(port.productId, 16) === valueOfPid && - parseInt(port.vendorId, 16) === valueOfVid - ); - } - return false; - }); - if ( - foundPort && - !(this._serialPortControl && this._serialPortControl.isActive) - ) { - this.updatePortListStatus(foundPort.path); - } - } else { - const chosen = await vscode.window.showQuickPick( - lists - .map( - (port: ISerialPortDetail): vscode.QuickPickItem => { - return { - description: port.manufacturer, - label: port.path, - }; - } - ) - .sort((a, b): number => { - return a.label === b.label - ? 0 - : a.label > b.label - ? 1 - : -1; - }) as vscode.QuickPickItem[], - { placeHolder: CONSTANTS.MISC.SELECT_PORT_PLACEHOLDER } - ); + if (vid && pid) { + const valueOfVid = parseInt(vid, 16); + const valueOfPid = parseInt(pid, 16); + const foundPort = lists.find((port) => { + if (port.productId && port.vendorId) { + return ( + parseInt(port.productId, 16) === valueOfPid && + parseInt(port.vendorId, 16) === valueOfVid + ); + } + return false; + }); + if ( + foundPort && + !(this._serialPortControl && this._serialPortControl.isActive) + ) { + this.updatePortListStatus(foundPort.path); + } + } else { + const chosen = await vscode.window.showQuickPick( + lists + .map((port: ISerialPortDetail): vscode.QuickPickItem => { + return { + description: port.manufacturer, + label: port.path, + }; + }) + .sort((a, b): number => { + return a.label === b.label + ? 0 + : a.label > b.label + ? 1 + : -1; + }) as vscode.QuickPickItem[], + { placeHolder: CONSTANTS.MISC.SELECT_PORT_PLACEHOLDER } + ); - if (chosen && chosen.label) { - this.updatePortListStatus(chosen.label); - } - } - } + if (chosen && chosen.label) { + this.updatePortListStatus(chosen.label); + } + } + } - public async openSerialMonitor() { - if (!this._currentPort) { - const ans = await vscode.window.showInformationMessage( - CONSTANTS.WARNING.NO_SERIAL_PORT_SELECTED, - DialogResponses.SELECT, - DialogResponses.CANCEL - ); - if (ans === DialogResponses.SELECT) { - await this.selectSerialPort(null, null); - } - if (!this._currentPort) { - return; - } - } + public async openSerialMonitor() { + if (!this._currentPort) { + const ans = await vscode.window.showInformationMessage( + CONSTANTS.WARNING.NO_SERIAL_PORT_SELECTED, + DialogResponses.SELECT, + DialogResponses.CANCEL + ); + if (ans === DialogResponses.SELECT) { + await this.selectSerialPort(null, null); + } + if (!this._currentPort) { + return; + } + } - if (this._serialPortControl) { - if (this._currentPort !== this._serialPortControl.currentPort) { - await this._serialPortControl.changePort(this._currentPort); - } else if (this._serialPortControl.isActive) { - vscode.window.showWarningMessage( - `Serial Monitor is already opened for ${this._currentPort}` - ); - return; - } - } else { - this._serialPortControl = new SerialPortControl( - this._currentPort, - this._currentBaudRate, - this._outputChannel - ); - } + if (this._serialPortControl) { + if (this._currentPort !== this._serialPortControl.currentPort) { + await this._serialPortControl.changePort(this._currentPort); + } else if (this._serialPortControl.isActive) { + vscode.window.showWarningMessage( + `Serial Monitor is already opened for ${this._currentPort}` + ); + return; + } + } else { + this._serialPortControl = new SerialPortControl( + this._currentPort, + this._currentBaudRate, + this._outputChannel + ); + } - if (!this._serialPortControl.currentPort) { - console.error( - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT(this._currentPort) - ); - return; - } + if (!this._serialPortControl.currentPort) { + console.error( + CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT(this._currentPort) + ); + return; + } - try { - await this._serialPortControl.open(); - this.updatePortStatus(true); - } catch (error) { - logToOutputChannel( - outChannel, - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT_DUE_TO( - this._currentPort, - error - ), - true - ); - } - } + try { + await this._serialPortControl.open(); + this.updatePortStatus(true); + } catch (error) { + logToOutputChannel( + outChannel, + CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT_DUE_TO( + this._currentPort, + error + ), + true + ); + } + } - public get initialized(): boolean { - return !!this._outputChannel; - } + public get initialized(): boolean { + return !!this._outputChannel; + } - public dispose() { - if (this._serialPortControl && this._serialPortControl.isActive) { - return this._serialPortControl.stop(); - } - } + public dispose() { + if (this._serialPortControl && this._serialPortControl.isActive) { + return this._serialPortControl.stop(); + } + } - public async changeBaudRate() { - const baudRates = SerialMonitor.listBaudRates(); - const chosen = await vscode.window.showQuickPick( - baudRates.map(baudRate => baudRate.toString()) - ); + public async changeBaudRate() { + const baudRates = SerialMonitor.listBaudRates(); + const chosen = await vscode.window.showQuickPick( + baudRates.map((baudRate) => baudRate.toString()) + ); - if (!chosen) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.NO_RATE_SELECTED, - true - ); - return; - } + if (!chosen) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.NO_RATE_SELECTED, + true + ); + return; + } - if (!parseInt(chosen, 10)) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.INVALID_BAUD_RATE, - true - ); - return; - } + if (!parseInt(chosen, 10)) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.INVALID_BAUD_RATE, + true + ); + return; + } - if (!this._serialPortControl) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.SERIAL_MONITOR_NOT_STARTED, - true - ); - return; - } + if (!this._serialPortControl) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.SERIAL_MONITOR_NOT_STARTED, + true + ); + return; + } - const selectedRate: number = parseInt(chosen, 10); - await this._serialPortControl.changeBaudRate(selectedRate); - this._currentBaudRate = selectedRate; - this._baudRateStatusBar.text = chosen; - } + const selectedRate: number = parseInt(chosen, 10); + await this._serialPortControl.changeBaudRate(selectedRate); + this._currentBaudRate = selectedRate; + this._baudRateStatusBar.text = chosen; + } - public async closeSerialMonitor(port: string, showWarning: boolean = true) { - if (this._serialPortControl) { - if (port && port !== this._serialPortControl.currentPort) { - // Port is not opened - return false; - } - const result = await this._serialPortControl.stop(); - this.updatePortStatus(false); - return result; - } else if (!port && showWarning) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.SERIAL_PORT_NOT_STARTED, - true - ); - return false; - } - } + public async closeSerialMonitor(port: string, showWarning: boolean = true) { + if (this._serialPortControl) { + if (port && port !== this._serialPortControl.currentPort) { + // Port is not opened + return false; + } + const result = await this._serialPortControl.stop(); + this.updatePortStatus(false); + return result; + } else if (!port && showWarning) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.SERIAL_PORT_NOT_STARTED, + true + ); + return false; + } + } - private updatePortStatus(isOpened: boolean) { - if (isOpened) { - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.closeSerialMonitor"; - this._openPortStatusBar.text = `$(x)`; - this._openPortStatusBar.tooltip = "Close Serial Monitor"; - this._baudRateStatusBar.show(); - } else { - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.openSerialMonitor"; - this._openPortStatusBar.text = `$(plug)`; - this._openPortStatusBar.tooltip = "Open Serial Monitor"; - this._baudRateStatusBar.hide(); - } - } + private updatePortStatus(isOpened: boolean) { + if (isOpened) { + this._openPortStatusBar.command = + "deviceSimulatorExpress.common.closeSerialMonitor"; + this._openPortStatusBar.text = `$(x)`; + this._openPortStatusBar.tooltip = "Close Serial Monitor"; + this._baudRateStatusBar.show(); + } else { + this._openPortStatusBar.command = + "deviceSimulatorExpress.common.openSerialMonitor"; + this._openPortStatusBar.text = `$(plug)`; + this._openPortStatusBar.tooltip = "Open Serial Monitor"; + this._baudRateStatusBar.hide(); + } + } - private updatePortListStatus(port: string | null) { - const deviceContext = DeviceContext.getInstance(); - if (port) { - deviceContext.port = port; - } - this._currentPort = deviceContext.port; + private updatePortListStatus(port: string | null) { + const deviceContext = DeviceContext.getInstance(); + if (port) { + deviceContext.port = port; + } + this._currentPort = deviceContext.port; - if (deviceContext.port) { - this._portsStatusBar.text = deviceContext.port; - } else { - this._portsStatusBar.text = ""; + } + } } diff --git a/Source/serialPortControl.ts b/Source/serialPortControl.ts index 64d8d010a..0abcfa03e 100644 --- a/Source/serialPortControl.ts +++ b/Source/serialPortControl.ts @@ -9,188 +9,188 @@ import { CONSTANTS } from "./constants"; import { logToOutputChannel } from "./extension_utils/utils"; interface ISerialPortDetail { - path: string; - manufacturer: string; - vendorId: string; - productId: string; + path: string; + manufacturer: string; + vendorId: string; + productId: string; } export class SerialPortControl { - public static get serialport(): any { - if (!SerialPortControl._serialport) { - SerialPortControl._serialport = require("usb-native").SerialPort; - } - return SerialPortControl._serialport; - } - - public static list(): Promise { - return new Promise((resolve, reject) => { - SerialPortControl.serialport.list().then( - ports => resolve(ports), - err => reject(err) - ); - }); - } - - private static _serialport: any; - - private _currentPort: string; - private _currentBaudRate: number; - private _currentSerialPort: any; - - public constructor( - port: string, - baudRate: number, - private _outputChannel: OutputChannel - ) { - this._currentPort = port; - this._currentBaudRate = baudRate; - } - - public get isActive(): boolean { - return this._currentSerialPort && this._currentSerialPort.isOpen; - } - - public get currentPort(): string { - return this._currentPort; - } - - public open(): Promise { - logToOutputChannel( - this._outputChannel, - CONSTANTS.INFO.OPENING_SERIAL_PORT(this._currentPort) - ); - return new Promise((resolve, reject) => { - if (this._currentSerialPort && this._currentSerialPort.isOpen) { - this._currentSerialPort.close((err: any) => { - if (err) { - return reject(err); - } - this._currentSerialPort = null; - return this.open().then( - () => { - resolve(); - }, - error => { - reject(error); - } - ); - }); - } else { - this._currentSerialPort = new SerialPortControl.serialport( - this._currentPort, - { baudRate: this._currentBaudRate } - ); - this._outputChannel.show(); - this._currentSerialPort.on("open", () => { - this._currentSerialPort.write( - CONSTANTS.MISC.SERIAL_MONITOR_TEST_IF_OPEN + os.EOL, - (err: any) => { - if ( - err && - !( - err.message.indexOf( - CONSTANTS.ERROR.COMPORT_UNKNOWN_ERROR - ) >= 0 - ) - ) { - logToOutputChannel( - this._outputChannel, - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT( - this._currentPort - ) - ); - logToOutputChannel( - this._outputChannel, - CONSTANTS.ERROR.RECONNECT_DEVICE - ); - reject(err); - } else { - logToOutputChannel( - this._outputChannel, - CONSTANTS.INFO.OPENED_SERIAL_PORT( - this._currentPort - ) - ); - resolve(); - } - } - ); - }); - } - - this._currentSerialPort.on("data", (event: any) => { - logToOutputChannel(this._outputChannel, event.toString()); - }); - - this._currentSerialPort.on("error", (error: any) => { - logToOutputChannel(this._outputChannel, error.toString()); - }); - }); - } - - public changePort(newPort: string): Promise { - return new Promise((resolve, reject) => { - if (newPort === this._currentPort) { - resolve(); - return; - } - this._currentPort = newPort; - if (!this._currentSerialPort || !this.isActive) { - resolve(); - return; - } - this._currentSerialPort.close((error: any) => { - if (error) { - reject(error); - } else { - this._currentSerialPort = null; - resolve(); - } - }); - }); - } - - public stop(): Promise { - return new Promise((resolve, reject) => { - if (!this._currentSerialPort || !this.isActive) { - resolve(false); - return; - } - this._currentSerialPort.close((error: any) => { - if (this._outputChannel) { - logToOutputChannel( - this._outputChannel, - CONSTANTS.INFO.CLOSED_SERIAL_PORT(this._currentPort) - ); - } - this._currentSerialPort = null; - if (error) { - reject(error); - } else { - resolve(true); - } - }); - }); - } - - public changeBaudRate(newBaudRate: number): Promise { - return new Promise((resolve, reject) => { - this._currentBaudRate = newBaudRate; - if (!this._currentSerialPort || !this.isActive) { - resolve(); - return; - } - this._currentSerialPort.update( - { baudRate: this._currentBaudRate }, - (error: any) => { - if (error) { - reject(error); - } else { - resolve(); - } - } - ); - }); - } + public static get serialport(): any { + if (!SerialPortControl._serialport) { + SerialPortControl._serialport = require("usb-native").SerialPort; + } + return SerialPortControl._serialport; + } + + public static list(): Promise { + return new Promise((resolve, reject) => { + SerialPortControl.serialport.list().then( + (ports) => resolve(ports), + (err) => reject(err) + ); + }); + } + + private static _serialport: any; + + private _currentPort: string; + private _currentBaudRate: number; + private _currentSerialPort: any; + + public constructor( + port: string, + baudRate: number, + private _outputChannel: OutputChannel + ) { + this._currentPort = port; + this._currentBaudRate = baudRate; + } + + public get isActive(): boolean { + return this._currentSerialPort && this._currentSerialPort.isOpen; + } + + public get currentPort(): string { + return this._currentPort; + } + + public open(): Promise { + logToOutputChannel( + this._outputChannel, + CONSTANTS.INFO.OPENING_SERIAL_PORT(this._currentPort) + ); + return new Promise((resolve, reject) => { + if (this._currentSerialPort && this._currentSerialPort.isOpen) { + this._currentSerialPort.close((err: any) => { + if (err) { + return reject(err); + } + this._currentSerialPort = null; + return this.open().then( + () => { + resolve(); + }, + (error) => { + reject(error); + } + ); + }); + } else { + this._currentSerialPort = new SerialPortControl.serialport( + this._currentPort, + { baudRate: this._currentBaudRate } + ); + this._outputChannel.show(); + this._currentSerialPort.on("open", () => { + this._currentSerialPort.write( + CONSTANTS.MISC.SERIAL_MONITOR_TEST_IF_OPEN + os.EOL, + (err: any) => { + if ( + err && + !( + err.message.indexOf( + CONSTANTS.ERROR.COMPORT_UNKNOWN_ERROR + ) >= 0 + ) + ) { + logToOutputChannel( + this._outputChannel, + CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT( + this._currentPort + ) + ); + logToOutputChannel( + this._outputChannel, + CONSTANTS.ERROR.RECONNECT_DEVICE + ); + reject(err); + } else { + logToOutputChannel( + this._outputChannel, + CONSTANTS.INFO.OPENED_SERIAL_PORT( + this._currentPort + ) + ); + resolve(); + } + } + ); + }); + } + + this._currentSerialPort.on("data", (event: any) => { + logToOutputChannel(this._outputChannel, event.toString()); + }); + + this._currentSerialPort.on("error", (error: any) => { + logToOutputChannel(this._outputChannel, error.toString()); + }); + }); + } + + public changePort(newPort: string): Promise { + return new Promise((resolve, reject) => { + if (newPort === this._currentPort) { + resolve(); + return; + } + this._currentPort = newPort; + if (!this._currentSerialPort || !this.isActive) { + resolve(); + return; + } + this._currentSerialPort.close((error: any) => { + if (error) { + reject(error); + } else { + this._currentSerialPort = null; + resolve(); + } + }); + }); + } + + public stop(): Promise { + return new Promise((resolve, reject) => { + if (!this._currentSerialPort || !this.isActive) { + resolve(false); + return; + } + this._currentSerialPort.close((error: any) => { + if (this._outputChannel) { + logToOutputChannel( + this._outputChannel, + CONSTANTS.INFO.CLOSED_SERIAL_PORT(this._currentPort) + ); + } + this._currentSerialPort = null; + if (error) { + reject(error); + } else { + resolve(true); + } + }); + }); + } + + public changeBaudRate(newBaudRate: number): Promise { + return new Promise((resolve, reject) => { + this._currentBaudRate = newBaudRate; + if (!this._currentSerialPort || !this.isActive) { + resolve(); + return; + } + this._currentSerialPort.update( + { baudRate: this._currentBaudRate }, + (error: any) => { + if (error) { + reject(error); + } else { + resolve(); + } + } + ); + }); + } } diff --git a/Source/service/PopupService.ts b/Source/service/PopupService.ts index d5aadbff4..84d312467 100644 --- a/Source/service/PopupService.ts +++ b/Source/service/PopupService.ts @@ -3,14 +3,14 @@ import * as vscode from "vscode"; import { LATEST_RELEASE_NOTE } from "../latest_release_note"; export class PopupService { - public static openReleaseNote() { - const panel = vscode.window.createWebviewPanel( - "releaseNote", - "Release Note", - vscode.ViewColumn.One, - {} - ); + public static openReleaseNote() { + const panel = vscode.window.createWebviewPanel( + "releaseNote", + "Release Note", + vscode.ViewColumn.One, + {} + ); - panel.webview.html = LATEST_RELEASE_NOTE; - } + panel.webview.html = LATEST_RELEASE_NOTE; + } } diff --git a/Source/service/debuggerCommunicationService.ts b/Source/service/debuggerCommunicationService.ts index b37b1c2ed..1e47024f1 100644 --- a/Source/service/debuggerCommunicationService.ts +++ b/Source/service/debuggerCommunicationService.ts @@ -1,27 +1,27 @@ import { DebuggerCommunicationServer } from "../debuggerCommunicationServer"; export class DebuggerCommunicationService { - private currentDebuggerServer?: DebuggerCommunicationServer; - private previousDebuggerServerToDisconnect?: DebuggerCommunicationServer; + private currentDebuggerServer?: DebuggerCommunicationServer; + private previousDebuggerServerToDisconnect?: DebuggerCommunicationServer; - public setCurrentDebuggerServer(debugServer: DebuggerCommunicationServer) { - this.currentDebuggerServer = debugServer; - } - // Used for restart and stop event - public resetCurrentDebuggerServer() { - if (this.currentDebuggerServer) { - this.currentDebuggerServer.closeConnection(); - } - this.previousDebuggerServerToDisconnect = this.currentDebuggerServer; - this.currentDebuggerServer = undefined; - } - public getCurrentDebuggerServer() { - return this.currentDebuggerServer; - } - // Only used for stop event - public handleStopEvent() { - if (this.previousDebuggerServerToDisconnect) { - this.previousDebuggerServerToDisconnect.disconnectFromPort(); - } - } + public setCurrentDebuggerServer(debugServer: DebuggerCommunicationServer) { + this.currentDebuggerServer = debugServer; + } + // Used for restart and stop event + public resetCurrentDebuggerServer() { + if (this.currentDebuggerServer) { + this.currentDebuggerServer.closeConnection(); + } + this.previousDebuggerServerToDisconnect = this.currentDebuggerServer; + this.currentDebuggerServer = undefined; + } + public getCurrentDebuggerServer() { + return this.currentDebuggerServer; + } + // Only used for stop event + public handleStopEvent() { + if (this.previousDebuggerServerToDisconnect) { + this.previousDebuggerServerToDisconnect.disconnectFromPort(); + } + } } diff --git a/Source/service/deviceSelectionService.ts b/Source/service/deviceSelectionService.ts index 39a8b5988..15f8bc2f2 100644 --- a/Source/service/deviceSelectionService.ts +++ b/Source/service/deviceSelectionService.ts @@ -1,12 +1,12 @@ import { DEFAULT_DEVICE } from "../constants"; export class DeviceSelectionService { - private currentActiveDevice: string = DEFAULT_DEVICE; + private currentActiveDevice: string = DEFAULT_DEVICE; - public getCurrentActiveDevice(): string { - return this.currentActiveDevice; - } - public setCurrentActiveDevice(newActiveDevice: string) { - this.currentActiveDevice = newActiveDevice; - } + public getCurrentActiveDevice(): string { + return this.currentActiveDevice; + } + public setCurrentActiveDevice(newActiveDevice: string) { + this.currentActiveDevice = newActiveDevice; + } } diff --git a/Source/service/fileSelectionService.ts b/Source/service/fileSelectionService.ts index d5b0eea11..5ee5e8ef9 100644 --- a/Source/service/fileSelectionService.ts +++ b/Source/service/fileSelectionService.ts @@ -5,91 +5,91 @@ import { DeviceSelectionService } from "./deviceSelectionService"; import { MessagingService } from "./messagingService"; export class FileSelectionService { - private currentFileAbsPath: string = ""; - private currentTextDocument: vscode.TextDocument; - private messagingService: MessagingService; + private currentFileAbsPath: string = ""; + private currentTextDocument: vscode.TextDocument; + private messagingService: MessagingService; - constructor(messagingService: MessagingService) { - this.messagingService = messagingService; - } + constructor(messagingService: MessagingService) { + this.messagingService = messagingService; + } - public getCurrentFileAbsPath() { - return this.currentFileAbsPath; - } - public getCurrentTextDocument() { - return this.currentTextDocument; - } - public updateCurrentFileFromTextFile = async ( - activeTextDocument: vscode.TextDocument | undefined - ) => { - if (activeTextDocument) { - await this.updateCurrentFileFromEditor({ - document: activeTextDocument, - } as vscode.TextEditor); - } else { - return; - } - }; - public updateCurrentFileFromEditor = async ( - activeTextDocument: vscode.TextEditor | undefined - ) => { - if ( - activeTextDocument && - activeTextDocument.document && - activeTextDocument.document.languageId === "python" - ) { - this.setPathAndSendMessage(activeTextDocument.document.fileName); - this.currentTextDocument = activeTextDocument.document; - } else if (this.currentFileAbsPath === "") { - this.setPathAndSendMessage(this.getActivePythonFile() || ""); - } - if ( - this.currentTextDocument && - this.getActiveEditorFromPath(this.currentTextDocument.fileName) === - undefined - ) { - await vscode.window.showTextDocument( - this.currentTextDocument, - vscode.ViewColumn.One - ); - } - }; - public findCurrentTextDocument() { - if (this.currentFileAbsPath) { - const foundDocument = this.getActiveEditorFromPath( - this.currentFileAbsPath - ); - if (foundDocument !== undefined) { - this.currentTextDocument = foundDocument; - } - } - } + public getCurrentFileAbsPath() { + return this.currentFileAbsPath; + } + public getCurrentTextDocument() { + return this.currentTextDocument; + } + public updateCurrentFileFromTextFile = async ( + activeTextDocument: vscode.TextDocument | undefined + ) => { + if (activeTextDocument) { + await this.updateCurrentFileFromEditor({ + document: activeTextDocument, + } as vscode.TextEditor); + } else { + return; + } + }; + public updateCurrentFileFromEditor = async ( + activeTextDocument: vscode.TextEditor | undefined + ) => { + if ( + activeTextDocument && + activeTextDocument.document && + activeTextDocument.document.languageId === "python" + ) { + this.setPathAndSendMessage(activeTextDocument.document.fileName); + this.currentTextDocument = activeTextDocument.document; + } else if (this.currentFileAbsPath === "") { + this.setPathAndSendMessage(this.getActivePythonFile() || ""); + } + if ( + this.currentTextDocument && + this.getActiveEditorFromPath(this.currentTextDocument.fileName) === + undefined + ) { + await vscode.window.showTextDocument( + this.currentTextDocument, + vscode.ViewColumn.One + ); + } + }; + public findCurrentTextDocument() { + if (this.currentFileAbsPath) { + const foundDocument = this.getActiveEditorFromPath( + this.currentFileAbsPath + ); + if (foundDocument !== undefined) { + this.currentTextDocument = foundDocument; + } + } + } - public setPathAndSendMessage = (newFilePath: string) => { - this.currentFileAbsPath = newFilePath; - this.messagingService.sendMessageToWebview( - VSCODE_MESSAGES_TO_WEBVIEW.CURRENT_FILE, - { - running_file: newFilePath, - } - ); - }; - private getActiveEditorFromPath = ( - filePath: string - ): vscode.TextDocument => { - const activeEditor = vscode.window.visibleTextEditors.find( - (editor: vscode.TextEditor) => editor.document.fileName === filePath - ); - return activeEditor ? activeEditor.document : undefined; - }; - private getActivePythonFile = () => { - const editors: vscode.TextEditor[] = vscode.window.visibleTextEditors; - const activeEditor = editors.find( - editor => editor.document.languageId === LANGUAGE_VARS.PYTHON.ID - ); - if (activeEditor) { - this.currentTextDocument = activeEditor.document; - } - return activeEditor ? activeEditor.document.fileName : ""; - }; + public setPathAndSendMessage = (newFilePath: string) => { + this.currentFileAbsPath = newFilePath; + this.messagingService.sendMessageToWebview( + VSCODE_MESSAGES_TO_WEBVIEW.CURRENT_FILE, + { + running_file: newFilePath, + } + ); + }; + private getActiveEditorFromPath = ( + filePath: string + ): vscode.TextDocument => { + const activeEditor = vscode.window.visibleTextEditors.find( + (editor: vscode.TextEditor) => editor.document.fileName === filePath + ); + return activeEditor ? activeEditor.document : undefined; + }; + private getActivePythonFile = () => { + const editors: vscode.TextEditor[] = vscode.window.visibleTextEditors; + const activeEditor = editors.find( + (editor) => editor.document.languageId === LANGUAGE_VARS.PYTHON.ID + ); + if (activeEditor) { + this.currentTextDocument = activeEditor.document; + } + return activeEditor ? activeEditor.document.fileName : ""; + }; } diff --git a/Source/service/messagingService.ts b/Source/service/messagingService.ts index c702ee268..a10caf3e8 100644 --- a/Source/service/messagingService.ts +++ b/Source/service/messagingService.ts @@ -4,34 +4,35 @@ import * as fs from "fs"; import { VSCODE_MESSAGES_TO_WEBVIEW } from "../view/constants"; import { DeviceSelectionService } from "./deviceSelectionService"; export class MessagingService { - private currentWebviewTarget: Webview | undefined; - private deviceSelectionService: DeviceSelectionService; + private currentWebviewTarget: Webview | undefined; + private deviceSelectionService: DeviceSelectionService; - constructor(deviceSelectionService: DeviceSelectionService) { - this.deviceSelectionService = deviceSelectionService; - } - public setWebview(webview: Webview) { - this.currentWebviewTarget = webview; - } + constructor(deviceSelectionService: DeviceSelectionService) { + this.deviceSelectionService = deviceSelectionService; + } + public setWebview(webview: Webview) { + this.currentWebviewTarget = webview; + } - // Send a message to webview if it exists - public sendMessageToWebview(command: string, stateToSend: Object) { - if (this.currentWebviewTarget) { - this.currentWebviewTarget.postMessage({ - command, - active_device: this.deviceSelectionService.getCurrentActiveDevice(), - state: { ...stateToSend }, - }); - } - } - public sendStartMessage() { - this.currentWebviewTarget.postMessage({ - command: VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE, - }); - } - public sendPauseMessage() { - this.currentWebviewTarget.postMessage({ - command: VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE, - }); - } + // Send a message to webview if it exists + public sendMessageToWebview(command: string, stateToSend: Object) { + if (this.currentWebviewTarget) { + this.currentWebviewTarget.postMessage({ + command, + active_device: + this.deviceSelectionService.getCurrentActiveDevice(), + state: { ...stateToSend }, + }); + } + } + public sendStartMessage() { + this.currentWebviewTarget.postMessage({ + command: VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE, + }); + } + public sendPauseMessage() { + this.currentWebviewTarget.postMessage({ + command: VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE, + }); + } } diff --git a/Source/service/setupService.ts b/Source/service/setupService.ts index f5c80e037..2b0a26760 100644 --- a/Source/service/setupService.ts +++ b/Source/service/setupService.ts @@ -3,574 +3,576 @@ import * as os from "os"; import * as path from "path"; import * as vscode from "vscode"; import { - CONFIG, - CONSTANTS, - DialogResponses, - GLOBAL_ENV_VARS, - HELPER_FILES, - TelemetryEventName, - VERSIONS, + CONFIG, + CONSTANTS, + DialogResponses, + GLOBAL_ENV_VARS, + HELPER_FILES, + TelemetryEventName, + VERSIONS, } from "../constants"; import { - checkConfig, - createEscapedPath, - exec, - getConfig, - getPathToScript, - showPrivacyModal, + checkConfig, + createEscapedPath, + exec, + getConfig, + getPathToScript, + showPrivacyModal, } from "../extension_utils/utils"; import TelemetryAI from "../telemetry/telemetryAI"; export class SetupService { - private telemetryAI: TelemetryAI; - - constructor(telemetryAI: TelemetryAI) { - this.telemetryAI = telemetryAI; - } - - public setupEnv = async ( - context: vscode.ExtensionContext, - needsResponse: boolean = false - ) => { - const originalPythonExecutablePath = await this.getCurrentPythonExecutablePath(); - if (originalPythonExecutablePath === "") { - return; - } - let pythonExecutablePath = originalPythonExecutablePath; - const pythonExecutableName: string = - os.platform() === "win32" - ? HELPER_FILES.PYTHON_EXE - : HELPER_FILES.PYTHON; - - if ( - !(await this.areDependenciesInstalled( - context, - pythonExecutablePath - )) - ) { - // environment needs to install dependencies - if (!(await this.checkIfVenv(context, pythonExecutablePath))) { - const pythonExecutablePathVenv = await this.getPythonVenv( - context, - pythonExecutableName - ); - if (await this.hasVenv(context)) { - // venv in extention exists with wrong dependencies - - if ( - !(await this.areDependenciesInstalled( - context, - pythonExecutablePathVenv - )) - ) { - pythonExecutablePath = await this.installDependenciesWrapper( - context, - pythonExecutablePathVenv, - pythonExecutablePath - ); - } else { - pythonExecutablePath = pythonExecutablePathVenv; - } - } else { - pythonExecutablePath = await this.promptInstallVenv( - context, - originalPythonExecutablePath, - pythonExecutableName - ); - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INSTALL_VENV - ); - } - - if (pythonExecutablePath === pythonExecutablePathVenv) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.UPDATED_TO_EXTENSION_VENV - ); - vscode.workspace - .getConfiguration() - .update(CONFIG.PYTHON_PATH, pythonExecutablePath); - } - } else { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_HAS_VENV - ); - } - if (pythonExecutablePath === originalPythonExecutablePath) { - // going with original interpreter, either because - // already in venv or error in creating custom venv - if (checkConfig(CONFIG.SHOW_DEPENDENCY_INSTALL)) { - await vscode.window - .showInformationMessage( - CONSTANTS.INFO.INSTALL_PYTHON_DEPS, - DialogResponses.INSTALL_NOW, - DialogResponses.DONT_INSTALL - ) - .then( - async ( - installChoice: vscode.MessageItem | undefined - ) => { - if ( - installChoice === - DialogResponses.INSTALL_NOW - ) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL - ); - await this.installDependenciesWrapper( - context, - pythonExecutablePath - ); - } else { - await vscode.window - .showInformationMessage( - CONSTANTS.INFO.ARE_YOU_SURE, - DialogResponses.INSTALL_NOW, - DialogResponses.DONT_INSTALL - ) - .then( - async ( - installChoice2: - | vscode.MessageItem - | undefined - ) => { - if ( - installChoice2 === - DialogResponses.INSTALL_NOW - ) { - await this.installDependenciesWrapper( - context, - pythonExecutablePath - ); - } else { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_NO_DEPS_INSTALLED - ); - } - } - ); - } - } - ); - } - } - } else if (needsResponse) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.ALREADY_SUCCESSFUL_INSTALL - ); - } - - return pythonExecutablePath; - }; - - public getCurrentPythonExecutablePath = async ( - isTryingPython3: boolean = false - ) => { - let originalPythonExecutablePath = ""; - const systemPythonVar = isTryingPython3 - ? GLOBAL_ENV_VARS.PYTHON3 - : GLOBAL_ENV_VARS.PYTHON; - // try to get name from interpreter - try { - originalPythonExecutablePath = getConfig(CONFIG.PYTHON_PATH); - } catch (err) { - originalPythonExecutablePath = systemPythonVar; - } - - if ( - originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON3 || - originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON || - originalPythonExecutablePath === "" - ) { - // catching any instance where the python path needs to be resolved - // from an system variable - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_AUTO_RESOLVE_PYTHON_PATH - ); - try { - const { stdout } = await this.executePythonCommand( - systemPythonVar, - `-c "import sys; print(sys.executable)"` - ); - originalPythonExecutablePath = stdout.trim(); - } catch (err) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_NO_PYTHON_PATH - ); - if (isTryingPython3) { - // if trying python3 failed, that means that BOTH - // python and python3 failed as system variables - // so that means that there is no python - vscode.window - .showErrorMessage( - CONSTANTS.ERROR.NO_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.INSTALL_PYTHON) { - const okAction = () => { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON - ); - open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON - ); - } - }); - // no python installed, cannot get path - return ""; - } else { - // "python" didn't resolve to anything, trying "python3" - return this.getCurrentPythonExecutablePath(true); - } - } - if ( - !(await this.validatePythonVersion( - originalPythonExecutablePath - )) - ) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_VER - ); - if (isTryingPython3) { - // if we're trying python3, it means we already tried python and it - // all doesn't seem to work, but it got this far, so it means that - // their system python3 version is still not above 3.7, but they - // don't have a path selected. - vscode.window - .showInformationMessage( - CONSTANTS.ERROR.INVALID_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON - ) - .then( - (installChoice: vscode.MessageItem | undefined) => { - if ( - installChoice === - DialogResponses.INSTALL_PYTHON - ) { - const okAction = () => { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON - ); - open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO - .THIRD_PARTY_WEBSITE_PYTHON - ); - } - } - ); - return ""; - } else { - // otherwise, we ran the "python" system variable - // and we can try python3 - return this.getCurrentPythonExecutablePath(true); - } - } - } else { - // should only be applicable if the user defined their own path - - // fix path to be absolute - if (!path.isAbsolute(originalPythonExecutablePath)) { - originalPythonExecutablePath = path.join( - vscode.workspace.rootPath, - originalPythonExecutablePath - ); - } - - if (!fs.existsSync(originalPythonExecutablePath)) { - await vscode.window.showErrorMessage( - CONSTANTS.ERROR.BAD_PYTHON_PATH - ); - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_INTERPRETER_PATH - ); - return ""; - } - - if ( - !(await this.validatePythonVersion( - originalPythonExecutablePath - )) - ) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_VER - ); - vscode.window - .showInformationMessage( - CONSTANTS.ERROR.INVALID_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON - ) - .then((installChoice: vscode.MessageItem | undefined) => { - if (installChoice === DialogResponses.INSTALL_PYTHON) { - const okAction = () => { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON - ); - open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON - ); - } - }); - return ""; - } - } - - return originalPythonExecutablePath; - }; - - public isPipInstalled = async (pythonExecutablePath: string) => { - try { - await this.executePythonCommand(pythonExecutablePath, " -m pip"); - return true; - } catch (err) { - vscode.window - .showErrorMessage( - `We found that you may not have Pip installed on your interpreter at ${pythonExecutablePath}, please install it and try again.`, - DialogResponses.INSTALL_PIP - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.INSTALL_PIP) { - const okAction = () => { - open(CONSTANTS.LINKS.DOWNLOAD_PIP); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PIP - ); - } - }); - return false; - } - }; - - public checkIfVenv = async ( - context: vscode.ExtensionContext, - pythonExecutablePath: string - ) => { - const venvCheckerPath: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.CHECK_IF_VENV_PY - ); - const { stdout } = await this.executePythonCommand( - pythonExecutablePath, - `"${venvCheckerPath}"` - ); - return stdout.trim() === "1"; - }; - - public executePythonCommand = async ( - pythonExecutablePath: string, - command: string - ) => { - return exec(`${createEscapedPath(pythonExecutablePath)} ${command}`); - }; - - public validatePythonVersion = async (pythonExecutablePath: string) => { - const { stdout } = await this.executePythonCommand( - pythonExecutablePath, - "--version" - ); - if (stdout < VERSIONS.MIN_PY_VERSION) { - return false; - } else { - return true; - } - }; - - public hasVenv = async (context: vscode.ExtensionContext) => { - const pathToEnv: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR - ); - - return fs.existsSync(pathToEnv); - }; - - public promptInstallVenv = ( - context: vscode.ExtensionContext, - pythonExecutable: string, - pythonExecutableName: string - ) => { - return vscode.window - .showInformationMessage( - CONSTANTS.INFO.INSTALL_PYTHON_VENV, - DialogResponses.YES, - DialogResponses.NO - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.YES) { - return this.installPythonVenv( - context, - pythonExecutable, - pythonExecutableName - ); - } else { - // return pythonExecutable, notifying the caller - // that the user was unwilling to create venv - // and by default, this will trigger the extension to - // try using pythonExecutable - return pythonExecutable; - } - }); - }; - - public getPythonVenv = async ( - context: vscode.ExtensionContext, - pythonExecutableName: string - ) => { - const subFolder = os.platform() === "win32" ? "Scripts" : "bin"; - - return getPathToScript( - context, - path.join(CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR, subFolder), - pythonExecutableName - ); - }; - - public installPythonVenv = async ( - context: vscode.ExtensionContext, - pythonExecutable: string, - pythonExecutableName: string - ) => { - const pathToEnv: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR - ); - - vscode.window.showInformationMessage( - CONSTANTS.INFO.INSTALLING_PYTHON_VENV - ); - - const pythonPath: string = await this.getPythonVenv( - context, - pythonExecutableName - ); - - try { - // make venv - // run command to download dependencies to out/python_libs - await this.executePythonCommand( - pythonExecutable, - `-m venv "${pathToEnv}"` - ); - } catch (err) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_VENV_CREATION_ERR - ); - vscode.window - .showErrorMessage( - `Virtual environment for download could not be completed. Using original interpreter at: ${pythonExecutable}. If you're on Linux, try running "sudo apt-get install python3-venv".`, - DialogResponses.READ_INSTALL_MD - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.READ_INSTALL_MD) { - open(CONSTANTS.LINKS.INSTALL); - } - }); - - console.error(err); - - return pythonExecutable; - } - - return this.installDependenciesWrapper( - context, - pythonPath, - pythonExecutable - ); - }; - - public areDependenciesInstalled = async ( - context: vscode.ExtensionContext, - pythonPath: string - ) => { - const dependencyCheckerPath: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.CHECK_PYTHON_DEPENDENCIES - ); - try { - // python script will throw exception - // if not all dependencies are downloaded - const { stdout } = await this.executePythonCommand( - pythonPath, - `"${dependencyCheckerPath}"` - ); - - // output for debugging purposes - console.info(stdout); - return true; - } catch (err) { - return false; - } - }; - - public installDependencies = async ( - context: vscode.ExtensionContext, - pythonPath: string - ) => { - const requirementsPyInstallPath: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - "install_dependencies.py" - ); - - if (!this.isPipInstalled(pythonPath)) { - this.telemetryAI.trackFeatureUsage(TelemetryEventName.SETUP_NO_PIP); - return false; - } - - try { - const { stdout } = await this.executePythonCommand( - pythonPath, - `"${requirementsPyInstallPath}"` - ); - console.log(`DSE ${stdout}`); - vscode.window.showInformationMessage( - CONSTANTS.INFO.SUCCESSFUL_INSTALL - ); - return true; - } catch (err) { - console.log(`DSE ${err}`); - return false; - } - }; - - public installDependenciesWrapper = async ( - context: vscode.ExtensionContext, - pythonPath: string, - backupPythonPath: string = "" - ) => { - let errMessage = CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR; - if (backupPythonPath !== "") { - errMessage = `${errMessage} Using original interpreter at: ${backupPythonPath}.`; - } - if (!(await this.installDependencies(context, pythonPath))) { - vscode.window - .showErrorMessage( - CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR, - DialogResponses.READ_INSTALL_MD - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.READ_INSTALL_MD) { - open(CONSTANTS.LINKS.INSTALL); - } - }); - - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DEP_INSTALL_FAIL - ); - return backupPythonPath; - } - return pythonPath; - }; + private telemetryAI: TelemetryAI; + + constructor(telemetryAI: TelemetryAI) { + this.telemetryAI = telemetryAI; + } + + public setupEnv = async ( + context: vscode.ExtensionContext, + needsResponse: boolean = false + ) => { + const originalPythonExecutablePath = + await this.getCurrentPythonExecutablePath(); + if (originalPythonExecutablePath === "") { + return; + } + let pythonExecutablePath = originalPythonExecutablePath; + const pythonExecutableName: string = + os.platform() === "win32" + ? HELPER_FILES.PYTHON_EXE + : HELPER_FILES.PYTHON; + + if ( + !(await this.areDependenciesInstalled( + context, + pythonExecutablePath + )) + ) { + // environment needs to install dependencies + if (!(await this.checkIfVenv(context, pythonExecutablePath))) { + const pythonExecutablePathVenv = await this.getPythonVenv( + context, + pythonExecutableName + ); + if (await this.hasVenv(context)) { + // venv in extention exists with wrong dependencies + + if ( + !(await this.areDependenciesInstalled( + context, + pythonExecutablePathVenv + )) + ) { + pythonExecutablePath = + await this.installDependenciesWrapper( + context, + pythonExecutablePathVenv, + pythonExecutablePath + ); + } else { + pythonExecutablePath = pythonExecutablePathVenv; + } + } else { + pythonExecutablePath = await this.promptInstallVenv( + context, + originalPythonExecutablePath, + pythonExecutableName + ); + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INSTALL_VENV + ); + } + + if (pythonExecutablePath === pythonExecutablePathVenv) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.UPDATED_TO_EXTENSION_VENV + ); + vscode.workspace + .getConfiguration() + .update(CONFIG.PYTHON_PATH, pythonExecutablePath); + } + } else { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_HAS_VENV + ); + } + if (pythonExecutablePath === originalPythonExecutablePath) { + // going with original interpreter, either because + // already in venv or error in creating custom venv + if (checkConfig(CONFIG.SHOW_DEPENDENCY_INSTALL)) { + await vscode.window + .showInformationMessage( + CONSTANTS.INFO.INSTALL_PYTHON_DEPS, + DialogResponses.INSTALL_NOW, + DialogResponses.DONT_INSTALL + ) + .then( + async ( + installChoice: vscode.MessageItem | undefined + ) => { + if ( + installChoice === + DialogResponses.INSTALL_NOW + ) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL + ); + await this.installDependenciesWrapper( + context, + pythonExecutablePath + ); + } else { + await vscode.window + .showInformationMessage( + CONSTANTS.INFO.ARE_YOU_SURE, + DialogResponses.INSTALL_NOW, + DialogResponses.DONT_INSTALL + ) + .then( + async ( + installChoice2: + | vscode.MessageItem + | undefined + ) => { + if ( + installChoice2 === + DialogResponses.INSTALL_NOW + ) { + await this.installDependenciesWrapper( + context, + pythonExecutablePath + ); + } else { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_NO_DEPS_INSTALLED + ); + } + } + ); + } + } + ); + } + } + } else if (needsResponse) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.ALREADY_SUCCESSFUL_INSTALL + ); + } + + return pythonExecutablePath; + }; + + public getCurrentPythonExecutablePath = async ( + isTryingPython3: boolean = false + ) => { + let originalPythonExecutablePath = ""; + const systemPythonVar = isTryingPython3 + ? GLOBAL_ENV_VARS.PYTHON3 + : GLOBAL_ENV_VARS.PYTHON; + // try to get name from interpreter + try { + originalPythonExecutablePath = getConfig(CONFIG.PYTHON_PATH); + } catch (err) { + originalPythonExecutablePath = systemPythonVar; + } + + if ( + originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON3 || + originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON || + originalPythonExecutablePath === "" + ) { + // catching any instance where the python path needs to be resolved + // from an system variable + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_AUTO_RESOLVE_PYTHON_PATH + ); + try { + const { stdout } = await this.executePythonCommand( + systemPythonVar, + `-c "import sys; print(sys.executable)"` + ); + originalPythonExecutablePath = stdout.trim(); + } catch (err) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_NO_PYTHON_PATH + ); + if (isTryingPython3) { + // if trying python3 failed, that means that BOTH + // python and python3 failed as system variables + // so that means that there is no python + vscode.window + .showErrorMessage( + CONSTANTS.ERROR.NO_PYTHON_PATH, + DialogResponses.INSTALL_PYTHON + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.INSTALL_PYTHON) { + const okAction = () => { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DOWNLOAD_PYTHON + ); + open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON + ); + } + }); + // no python installed, cannot get path + return ""; + } else { + // "python" didn't resolve to anything, trying "python3" + return this.getCurrentPythonExecutablePath(true); + } + } + if ( + !(await this.validatePythonVersion( + originalPythonExecutablePath + )) + ) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INVALID_PYTHON_VER + ); + if (isTryingPython3) { + // if we're trying python3, it means we already tried python and it + // all doesn't seem to work, but it got this far, so it means that + // their system python3 version is still not above 3.7, but they + // don't have a path selected. + vscode.window + .showInformationMessage( + CONSTANTS.ERROR.INVALID_PYTHON_PATH, + DialogResponses.INSTALL_PYTHON + ) + .then( + (installChoice: vscode.MessageItem | undefined) => { + if ( + installChoice === + DialogResponses.INSTALL_PYTHON + ) { + const okAction = () => { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DOWNLOAD_PYTHON + ); + open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO + .THIRD_PARTY_WEBSITE_PYTHON + ); + } + } + ); + return ""; + } else { + // otherwise, we ran the "python" system variable + // and we can try python3 + return this.getCurrentPythonExecutablePath(true); + } + } + } else { + // should only be applicable if the user defined their own path + + // fix path to be absolute + if (!path.isAbsolute(originalPythonExecutablePath)) { + originalPythonExecutablePath = path.join( + vscode.workspace.rootPath, + originalPythonExecutablePath + ); + } + + if (!fs.existsSync(originalPythonExecutablePath)) { + await vscode.window.showErrorMessage( + CONSTANTS.ERROR.BAD_PYTHON_PATH + ); + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INVALID_PYTHON_INTERPRETER_PATH + ); + return ""; + } + + if ( + !(await this.validatePythonVersion( + originalPythonExecutablePath + )) + ) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INVALID_PYTHON_VER + ); + vscode.window + .showInformationMessage( + CONSTANTS.ERROR.INVALID_PYTHON_PATH, + DialogResponses.INSTALL_PYTHON + ) + .then((installChoice: vscode.MessageItem | undefined) => { + if (installChoice === DialogResponses.INSTALL_PYTHON) { + const okAction = () => { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DOWNLOAD_PYTHON + ); + open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON + ); + } + }); + return ""; + } + } + + return originalPythonExecutablePath; + }; + + public isPipInstalled = async (pythonExecutablePath: string) => { + try { + await this.executePythonCommand(pythonExecutablePath, " -m pip"); + return true; + } catch (err) { + vscode.window + .showErrorMessage( + `We found that you may not have Pip installed on your interpreter at ${pythonExecutablePath}, please install it and try again.`, + DialogResponses.INSTALL_PIP + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.INSTALL_PIP) { + const okAction = () => { + open(CONSTANTS.LINKS.DOWNLOAD_PIP); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PIP + ); + } + }); + return false; + } + }; + + public checkIfVenv = async ( + context: vscode.ExtensionContext, + pythonExecutablePath: string + ) => { + const venvCheckerPath: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.CHECK_IF_VENV_PY + ); + const { stdout } = await this.executePythonCommand( + pythonExecutablePath, + `"${venvCheckerPath}"` + ); + return stdout.trim() === "1"; + }; + + public executePythonCommand = async ( + pythonExecutablePath: string, + command: string + ) => { + return exec(`${createEscapedPath(pythonExecutablePath)} ${command}`); + }; + + public validatePythonVersion = async (pythonExecutablePath: string) => { + const { stdout } = await this.executePythonCommand( + pythonExecutablePath, + "--version" + ); + if (stdout < VERSIONS.MIN_PY_VERSION) { + return false; + } else { + return true; + } + }; + + public hasVenv = async (context: vscode.ExtensionContext) => { + const pathToEnv: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR + ); + + return fs.existsSync(pathToEnv); + }; + + public promptInstallVenv = ( + context: vscode.ExtensionContext, + pythonExecutable: string, + pythonExecutableName: string + ) => { + return vscode.window + .showInformationMessage( + CONSTANTS.INFO.INSTALL_PYTHON_VENV, + DialogResponses.YES, + DialogResponses.NO + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.YES) { + return this.installPythonVenv( + context, + pythonExecutable, + pythonExecutableName + ); + } else { + // return pythonExecutable, notifying the caller + // that the user was unwilling to create venv + // and by default, this will trigger the extension to + // try using pythonExecutable + return pythonExecutable; + } + }); + }; + + public getPythonVenv = async ( + context: vscode.ExtensionContext, + pythonExecutableName: string + ) => { + const subFolder = os.platform() === "win32" ? "Scripts" : "bin"; + + return getPathToScript( + context, + path.join(CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR, subFolder), + pythonExecutableName + ); + }; + + public installPythonVenv = async ( + context: vscode.ExtensionContext, + pythonExecutable: string, + pythonExecutableName: string + ) => { + const pathToEnv: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR + ); + + vscode.window.showInformationMessage( + CONSTANTS.INFO.INSTALLING_PYTHON_VENV + ); + + const pythonPath: string = await this.getPythonVenv( + context, + pythonExecutableName + ); + + try { + // make venv + // run command to download dependencies to out/python_libs + await this.executePythonCommand( + pythonExecutable, + `-m venv "${pathToEnv}"` + ); + } catch (err) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_VENV_CREATION_ERR + ); + vscode.window + .showErrorMessage( + `Virtual environment for download could not be completed. Using original interpreter at: ${pythonExecutable}. If you're on Linux, try running "sudo apt-get install python3-venv".`, + DialogResponses.READ_INSTALL_MD + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.READ_INSTALL_MD) { + open(CONSTANTS.LINKS.INSTALL); + } + }); + + console.error(err); + + return pythonExecutable; + } + + return this.installDependenciesWrapper( + context, + pythonPath, + pythonExecutable + ); + }; + + public areDependenciesInstalled = async ( + context: vscode.ExtensionContext, + pythonPath: string + ) => { + const dependencyCheckerPath: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.CHECK_PYTHON_DEPENDENCIES + ); + try { + // python script will throw exception + // if not all dependencies are downloaded + const { stdout } = await this.executePythonCommand( + pythonPath, + `"${dependencyCheckerPath}"` + ); + + // output for debugging purposes + console.info(stdout); + return true; + } catch (err) { + return false; + } + }; + + public installDependencies = async ( + context: vscode.ExtensionContext, + pythonPath: string + ) => { + const requirementsPyInstallPath: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + "install_dependencies.py" + ); + + if (!this.isPipInstalled(pythonPath)) { + this.telemetryAI.trackFeatureUsage(TelemetryEventName.SETUP_NO_PIP); + return false; + } + + try { + const { stdout } = await this.executePythonCommand( + pythonPath, + `"${requirementsPyInstallPath}"` + ); + console.log(`DSE ${stdout}`); + vscode.window.showInformationMessage( + CONSTANTS.INFO.SUCCESSFUL_INSTALL + ); + return true; + } catch (err) { + console.log(`DSE ${err}`); + return false; + } + }; + + public installDependenciesWrapper = async ( + context: vscode.ExtensionContext, + pythonPath: string, + backupPythonPath: string = "" + ) => { + let errMessage = CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR; + if (backupPythonPath !== "") { + errMessage = `${errMessage} Using original interpreter at: ${backupPythonPath}.`; + } + if (!(await this.installDependencies(context, pythonPath))) { + vscode.window + .showErrorMessage( + CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR, + DialogResponses.READ_INSTALL_MD + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.READ_INSTALL_MD) { + open(CONSTANTS.LINKS.INSTALL); + } + }); + + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DEP_INSTALL_FAIL + ); + return backupPythonPath; + } + return pythonPath; + }; } diff --git a/Source/service/telemetryHandlerService.ts b/Source/service/telemetryHandlerService.ts index f16141f65..e76bea74c 100644 --- a/Source/service/telemetryHandlerService.ts +++ b/Source/service/telemetryHandlerService.ts @@ -6,551 +6,551 @@ import TelemetryAI from "../telemetry/telemetryAI"; import { DeviceSelectionService } from "./deviceSelectionService"; export class TelemetryHandlerService { - private telemetryAI: TelemetryAI; - private deviceSelectionService: DeviceSelectionService; + private telemetryAI: TelemetryAI; + private deviceSelectionService: DeviceSelectionService; - constructor( - telemetryAI: TelemetryAI, - deviceSelectionService: DeviceSelectionService - ) { - this.telemetryAI = telemetryAI; - this.deviceSelectionService = deviceSelectionService; - } + constructor( + telemetryAI: TelemetryAI, + deviceSelectionService: DeviceSelectionService + ) { + this.telemetryAI = telemetryAI; + this.deviceSelectionService = deviceSelectionService; + } - public handleDebuggerTelemetry = () => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_DEBUGGER_INIT_SUCCESS - ); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_DEBUGGER_INIT_SUCCESS - ); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_DEBUGGER_INIT_SUCCESS - ); - break; - default: - break; - } - }; + public handleDebuggerTelemetry = () => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_DEBUGGER_INIT_SUCCESS + ); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_DEBUGGER_INIT_SUCCESS + ); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_DEBUGGER_INIT_SUCCESS + ); + break; + default: + break; + } + }; - public handleDebuggerFailTelemetry = () => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_DEBUGGER_INIT_FAIL - ); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_DEBUGGER_INIT_FAIL - ); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_DEBUGGER_INIT_FAIL - ); - break; - default: - break; - } - }; + public handleDebuggerFailTelemetry = () => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_DEBUGGER_INIT_FAIL + ); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_DEBUGGER_INIT_FAIL + ); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_DEBUGGER_INIT_FAIL + ); + break; + default: + break; + } + }; - public handleButtonPressTelemetry = (buttonState: any) => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.handleCPXButtonPressTelemetry(buttonState); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.handleMicrobitButtonPressTelemetry(buttonState); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.handleClueButtonPressTelemetry(buttonState); - break; - default: - break; - } - }; + public handleButtonPressTelemetry = (buttonState: any) => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.handleCPXButtonPressTelemetry(buttonState); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.handleMicrobitButtonPressTelemetry(buttonState); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.handleClueButtonPressTelemetry(buttonState); + break; + default: + break; + } + }; - public handleGestureTelemetry = (sensorState: any) => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.handleCPXGestureTelemetry(sensorState); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - break; - default: - break; - } - }; + public handleGestureTelemetry = (sensorState: any) => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.handleCPXGestureTelemetry(sensorState); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + break; + default: + break; + } + }; - public handleSensorTelemetry = (sensor: string) => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.handleCPXSensorTelemetry(sensor); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.handleMicrobitSensorTelemetry(sensor); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.handleClueSensorTelemetry(sensor); - break; - default: - break; - } - }; + public handleSensorTelemetry = (sensor: string) => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.handleCPXSensorTelemetry(sensor); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.handleMicrobitSensorTelemetry(sensor); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.handleClueSensorTelemetry(sensor); + break; + default: + break; + } + }; - public handleCPXButtonPressTelemetry = (buttonState: any) => { - if (buttonState.button_a && buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_BUTTON_AB - ); - } else if (buttonState.button_a) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_BUTTON_A - ); - } else if (buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_BUTTON_B - ); - } else if (buttonState.switch) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_SWITCH - ); - } - }; + public handleCPXButtonPressTelemetry = (buttonState: any) => { + if (buttonState.button_a && buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_BUTTON_AB + ); + } else if (buttonState.button_a) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_BUTTON_A + ); + } else if (buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_BUTTON_B + ); + } else if (buttonState.switch) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_SWITCH + ); + } + }; - public handleCPXGestureTelemetry = (sensorState: any) => { - if (sensorState.shake) { - this.handleCPXSensorTelemetry("shake"); - } else if (sensorState.touch) { - this.handleCPXSensorTelemetry("touch"); - } - }; + public handleCPXGestureTelemetry = (sensorState: any) => { + if (sensorState.shake) { + this.handleCPXSensorTelemetry("shake"); + } else if (sensorState.touch) { + this.handleCPXSensorTelemetry("touch"); + } + }; - public handleCPXSensorTelemetry = (sensor: string) => { - switch (sensor) { - case "temperature": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_TEMPERATURE_SENSOR - ); - break; - case "light": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_LIGHT_SENSOR - ); - break; - case "motion_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR - ); - break; - case "shake": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_SHAKE - ); - break; - case "touch": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_CAPACITIVE_TOUCH - ); - break; - } - }; + public handleCPXSensorTelemetry = (sensor: string) => { + switch (sensor) { + case "temperature": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_TEMPERATURE_SENSOR + ); + break; + case "light": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_LIGHT_SENSOR + ); + break; + case "motion_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR + ); + break; + case "shake": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_SHAKE + ); + break; + case "touch": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_CAPACITIVE_TOUCH + ); + break; + } + }; - public handleMicrobitButtonPressTelemetry = (buttonState: any) => { - if (buttonState.button_a && buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_AB - ); - } else if (buttonState.button_a) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_A - ); - } else if (buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_B - ); - } - }; + public handleMicrobitButtonPressTelemetry = (buttonState: any) => { + if (buttonState.button_a && buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_AB + ); + } else if (buttonState.button_a) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_A + ); + } else if (buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_B + ); + } + }; - public handleMicrobitSensorTelemetry = (sensor: string) => { - switch (sensor) { - case "temperature": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_TEMPERATURE_SENSOR - ); - break; - case "light": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_LIGHT_SENSOR - ); - break; - case "motion_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR - ); - break; - case "gesture": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_GESTURE_SENSOR - ); - break; - } - }; + public handleMicrobitSensorTelemetry = (sensor: string) => { + switch (sensor) { + case "temperature": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_TEMPERATURE_SENSOR + ); + break; + case "light": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_LIGHT_SENSOR + ); + break; + case "motion_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR + ); + break; + case "gesture": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_GESTURE_SENSOR + ); + break; + } + }; - public handleClueButtonPressTelemetry = (buttonState: any) => { - if (buttonState.button_a && buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_BUTTON_AB - ); - } else if (buttonState.button_a) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_BUTTON_A - ); - } else if (buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_BUTTON_B - ); - } - }; + public handleClueButtonPressTelemetry = (buttonState: any) => { + if (buttonState.button_a && buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_BUTTON_AB + ); + } else if (buttonState.button_a) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_BUTTON_A + ); + } else if (buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_BUTTON_B + ); + } + }; - public handleClueSensorTelemetry = (sensor: string) => { - switch (sensor) { - case "temperature": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_TEMPERATURE_SENSOR - ); - break; - case "light_r": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "light_g": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "light_b": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "light_c": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "motion_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR - ); - break; - case "gesture": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GESTURE_SENSOR - ); - break; - case "humidity": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_HUMIDITY_SENSOR - ); - break; - case "pressure": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_PRESSURE_SENSOR - ); - break; - case "proximity": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_PROXIMITY_SENSOR - ); - break; - case "gyro_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR - ); - break; - case "gyro_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR - ); - break; - case "gyro_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR - ); - break; - case "magnet_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR - ); - break; - case "magnet_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR - ); - break; - case "magnet_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR - ); - break; - } - }; + public handleClueSensorTelemetry = (sensor: string) => { + switch (sensor) { + case "temperature": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_TEMPERATURE_SENSOR + ); + break; + case "light_r": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR + ); + break; + case "light_g": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR + ); + break; + case "light_b": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR + ); + break; + case "light_c": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR + ); + break; + case "motion_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR + ); + break; + case "gesture": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GESTURE_SENSOR + ); + break; + case "humidity": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_HUMIDITY_SENSOR + ); + break; + case "pressure": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_PRESSURE_SENSOR + ); + break; + case "proximity": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_PROXIMITY_SENSOR + ); + break; + case "gyro_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR + ); + break; + case "gyro_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR + ); + break; + case "gyro_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR + ); + break; + case "magnet_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR + ); + break; + case "magnet_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR + ); + break; + case "magnet_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR + ); + break; + } + }; - public handleNewFileErrorTelemetry = () => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_ERROR_COMMAND_NEW_FILE - ); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_ERROR_COMMAND_NEW_FILE - ); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_ERROR_COMMAND_NEW_FILE - ); - break; - default: - break; - } - }; + public handleNewFileErrorTelemetry = () => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_ERROR_COMMAND_NEW_FILE + ); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_ERROR_COMMAND_NEW_FILE + ); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_ERROR_COMMAND_NEW_FILE + ); + break; + default: + break; + } + }; - public getTelemetryEventsForStartingDeployToDevice = (device: string) => { - let deployTelemetryEvent: string; - let deployPerformanceTelemetryEvent: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - deployTelemetryEvent = - TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; - deployPerformanceTelemetryEvent = - TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - deployTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; - deployPerformanceTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - deployTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; - deployPerformanceTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; - break; - } - return { - deployTelemetryEvent, - deployPerformanceTelemetryEvent, - }; - }; + public getTelemetryEventsForStartingDeployToDevice = (device: string) => { + let deployTelemetryEvent: string; + let deployPerformanceTelemetryEvent: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + deployTelemetryEvent = + TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; + deployPerformanceTelemetryEvent = + TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + deployTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; + deployPerformanceTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + deployTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; + deployPerformanceTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; + break; + } + return { + deployTelemetryEvent, + deployPerformanceTelemetryEvent, + }; + }; - public handleDeployToDeviceErrorTelemetry = ( - data: string, - device: string - ) => { - let telemetryErrorName: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - telemetryErrorName = - TelemetryEventName.CPX_ERROR_PYTHON_DEVICE_PROCESS; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - telemetryErrorName = - TelemetryEventName.MICROBIT_ERROR_PYTHON_DEVICE_PROCESS; - case CONSTANTS.DEVICE_NAME.CLUE: - telemetryErrorName = - TelemetryEventName.CLUE_ERROR_PYTHON_DEVICE_PROCESS; - } - this.telemetryAI.trackFeatureUsage(telemetryErrorName, { - error: `${data}`, - }); - }; + public handleDeployToDeviceErrorTelemetry = ( + data: string, + device: string + ) => { + let telemetryErrorName: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + telemetryErrorName = + TelemetryEventName.CPX_ERROR_PYTHON_DEVICE_PROCESS; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + telemetryErrorName = + TelemetryEventName.MICROBIT_ERROR_PYTHON_DEVICE_PROCESS; + case CONSTANTS.DEVICE_NAME.CLUE: + telemetryErrorName = + TelemetryEventName.CLUE_ERROR_PYTHON_DEVICE_PROCESS; + } + this.telemetryAI.trackFeatureUsage(telemetryErrorName, { + error: `${data}`, + }); + }; - public handleDeployToDeviceFinishedTelemetry = ( - message: any, - device: string - ) => { - let successCommandDeployDevice: string; - let errorCommandDeployWithoutDevice: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - successCommandDeployDevice = - TelemetryEventName.CPX_SUCCESS_COMMAND_DEPLOY_DEVICE; - errorCommandDeployWithoutDevice = - TelemetryEventName.CPX_ERROR_DEPLOY_WITHOUT_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - successCommandDeployDevice = - TelemetryEventName.MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE; - errorCommandDeployWithoutDevice = - TelemetryEventName.MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - successCommandDeployDevice = - TelemetryEventName.CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE; - errorCommandDeployWithoutDevice = - TelemetryEventName.CLUE_ERROR_DEPLOY_WITHOUT_DEVICE; - break; - } + public handleDeployToDeviceFinishedTelemetry = ( + message: any, + device: string + ) => { + let successCommandDeployDevice: string; + let errorCommandDeployWithoutDevice: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + successCommandDeployDevice = + TelemetryEventName.CPX_SUCCESS_COMMAND_DEPLOY_DEVICE; + errorCommandDeployWithoutDevice = + TelemetryEventName.CPX_ERROR_DEPLOY_WITHOUT_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + successCommandDeployDevice = + TelemetryEventName.MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE; + errorCommandDeployWithoutDevice = + TelemetryEventName.MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + successCommandDeployDevice = + TelemetryEventName.CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE; + errorCommandDeployWithoutDevice = + TelemetryEventName.CLUE_ERROR_DEPLOY_WITHOUT_DEVICE; + break; + } - switch (message.type) { - case "complete": - this.telemetryAI.trackFeatureUsage(successCommandDeployDevice); - break; - case "no-device": - this.telemetryAI.trackFeatureUsage( - errorCommandDeployWithoutDevice - ); - if ( - device === CONSTANTS.DEVICE_NAME.CPX || - device === CONSTANTS.DEVICE_NAME.CLUE - ) { - vscode.window - .showErrorMessage( - CONSTANTS.ERROR.NO_DEVICE, - DialogResponses.HELP - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.HELP) { - const okAction = () => { - let helpLink: string; - let helpTelemetryEvent: string; - if (device === CONSTANTS.DEVICE_NAME.CPX) { - helpLink = CONSTANTS.LINKS.CPX_HELP; - helpTelemetryEvent = - TelemetryEventName.CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; - } else if ( - device === CONSTANTS.DEVICE_NAME.CLUE - ) { - helpLink = CONSTANTS.LINKS.CLUE_HELP; - helpTelemetryEvent = - TelemetryEventName.CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; - } - open(helpLink); - this.telemetryAI.trackFeatureUsage( - helpTelemetryEvent - ); - }; - utils.showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT - ); - } - }); - } else if (device === CONSTANTS.DEVICE_NAME.MICROBIT) { - vscode.window.showErrorMessage(CONSTANTS.ERROR.NO_DEVICE); - } - break; - case "low-python-version": - vscode.window.showErrorMessage( - CONSTANTS.ERROR.LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT - ); - break; - default: - console.log( - `Non-state JSON output from the process : ${message}` - ); - break; - } - }; + switch (message.type) { + case "complete": + this.telemetryAI.trackFeatureUsage(successCommandDeployDevice); + break; + case "no-device": + this.telemetryAI.trackFeatureUsage( + errorCommandDeployWithoutDevice + ); + if ( + device === CONSTANTS.DEVICE_NAME.CPX || + device === CONSTANTS.DEVICE_NAME.CLUE + ) { + vscode.window + .showErrorMessage( + CONSTANTS.ERROR.NO_DEVICE, + DialogResponses.HELP + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.HELP) { + const okAction = () => { + let helpLink: string; + let helpTelemetryEvent: string; + if (device === CONSTANTS.DEVICE_NAME.CPX) { + helpLink = CONSTANTS.LINKS.CPX_HELP; + helpTelemetryEvent = + TelemetryEventName.CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; + } else if ( + device === CONSTANTS.DEVICE_NAME.CLUE + ) { + helpLink = CONSTANTS.LINKS.CLUE_HELP; + helpTelemetryEvent = + TelemetryEventName.CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; + } + open(helpLink); + this.telemetryAI.trackFeatureUsage( + helpTelemetryEvent + ); + }; + utils.showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT + ); + } + }); + } else if (device === CONSTANTS.DEVICE_NAME.MICROBIT) { + vscode.window.showErrorMessage(CONSTANTS.ERROR.NO_DEVICE); + } + break; + case "low-python-version": + vscode.window.showErrorMessage( + CONSTANTS.ERROR.LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT + ); + break; + default: + console.log( + `Non-state JSON output from the process : ${message}` + ); + break; + } + }; - public getTelemetryEventsForOpenSimulator = (device: string) => { - let openSimulatorTelemetryEvent: string; - let openSimulatorPerformanceTelemetryEvent: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - openSimulatorTelemetryEvent = - TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; - openSimulatorPerformanceTelemetryEvent = - TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - openSimulatorTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; - openSimulatorPerformanceTelemetryEvent = - TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - openSimulatorTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; - openSimulatorPerformanceTelemetryEvent = - TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; - break; - } - return { - openSimulatorTelemetryEvent, - openSimulatorPerformanceTelemetryEvent, - }; - }; + public getTelemetryEventsForOpenSimulator = (device: string) => { + let openSimulatorTelemetryEvent: string; + let openSimulatorPerformanceTelemetryEvent: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + openSimulatorTelemetryEvent = + TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; + openSimulatorPerformanceTelemetryEvent = + TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + openSimulatorTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; + openSimulatorPerformanceTelemetryEvent = + TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + openSimulatorTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; + openSimulatorPerformanceTelemetryEvent = + TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; + break; + } + return { + openSimulatorTelemetryEvent, + openSimulatorPerformanceTelemetryEvent, + }; + }; - public getTelemetryEventsForNewFile = (device: string) => { - let newFileTelemetryEvent: string; - let newFilePerformanceTelemetryEvent: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - newFileTelemetryEvent = - TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; - newFilePerformanceTelemetryEvent = - TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - newFileTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; - newFilePerformanceTelemetryEvent = - TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - newFileTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; - newFilePerformanceTelemetryEvent = - TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; - break; - } - return { - newFileTelemetryEvent, - newFilePerformanceTelemetryEvent, - }; - }; + public getTelemetryEventsForNewFile = (device: string) => { + let newFileTelemetryEvent: string; + let newFilePerformanceTelemetryEvent: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + newFileTelemetryEvent = + TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; + newFilePerformanceTelemetryEvent = + TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + newFileTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; + newFilePerformanceTelemetryEvent = + TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + newFileTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; + newFilePerformanceTelemetryEvent = + TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; + break; + } + return { + newFileTelemetryEvent, + newFilePerformanceTelemetryEvent, + }; + }; } diff --git a/Source/service/webviewService.ts b/Source/service/webviewService.ts index 2b6add591..01584259b 100644 --- a/Source/service/webviewService.ts +++ b/Source/service/webviewService.ts @@ -6,47 +6,46 @@ import { DeviceSelectionService } from "./deviceSelectionService"; // Manages different type of webview export class WebviewService { - private tutorialPanel: vscode.WebviewPanel | undefined; - private context: vscode.ExtensionContext; - private deviceSelectionService: DeviceSelectionService; + private tutorialPanel: vscode.WebviewPanel | undefined; + private context: vscode.ExtensionContext; + private deviceSelectionService: DeviceSelectionService; - constructor( - context: vscode.ExtensionContext, - deviceSelectionService: DeviceSelectionService - ) { - this.context = context; - this.deviceSelectionService = deviceSelectionService; - } + constructor( + context: vscode.ExtensionContext, + deviceSelectionService: DeviceSelectionService + ) { + this.context = context; + this.deviceSelectionService = deviceSelectionService; + } - public openTutorialPanel() { - if (this.tutorialPanel) { - this.tutorialPanel.reveal(vscode.ViewColumn.Beside); - } else { - this.createTutorialPanel(); - } - } + public openTutorialPanel() { + if (this.tutorialPanel) { + this.tutorialPanel.reveal(vscode.ViewColumn.Beside); + } else { + this.createTutorialPanel(); + } + } - public getWebviewContent( - webviewType: string, - hasDevice: boolean, - panel: vscode.WebviewPanel - ) { - const onDiskPath = vscode.Uri.file( - this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.SIMULATOR) - ); - const scriptSrc = panel.webview.asWebviewUri(onDiskPath); + public getWebviewContent( + webviewType: string, + hasDevice: boolean, + panel: vscode.WebviewPanel + ) { + const onDiskPath = vscode.Uri.file( + this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.SIMULATOR) + ); + const scriptSrc = panel.webview.asWebviewUri(onDiskPath); - const vscodeImportPath = vscode.Uri.file( - this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.VSCODE_API) - ); - const vscodeImportPathSrc = panel.webview.asWebviewUri( - vscodeImportPath - ); + const vscodeImportPath = vscode.Uri.file( + this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.VSCODE_API) + ); + const vscodeImportPathSrc = + panel.webview.asWebviewUri(vscodeImportPath); - const attributeString = this.getAttributeString(webviewType, hasDevice); - const nonce = getNonce(); + const attributeString = this.getAttributeString(webviewType, hasDevice); + const nonce = getNonce(); - return ` + return ` @@ -64,49 +63,49 @@ export class WebviewService { < /html>`; - } + } - private createTutorialPanel() { - this.tutorialPanel = vscode.window.createWebviewPanel( - CONSTANTS.WEBVIEW_TYPE.TUTORIAL, - CONSTANTS.LABEL.WEBVIEW_PANEL, - { preserveFocus: true, viewColumn: vscode.ViewColumn.One }, - { - enableScripts: true, - retainContextWhenHidden: true, - } - ); - this.tutorialPanel.webview.html = this.getWebviewContent( - WEBVIEW_TYPES.GETTING_STARTED, - false, - this.tutorialPanel - ); - this.tutorialPanel.onDidDispose(() => { - this.disposeTutorialPanel(); - }); - } + private createTutorialPanel() { + this.tutorialPanel = vscode.window.createWebviewPanel( + CONSTANTS.WEBVIEW_TYPE.TUTORIAL, + CONSTANTS.LABEL.WEBVIEW_PANEL, + { preserveFocus: true, viewColumn: vscode.ViewColumn.One }, + { + enableScripts: true, + retainContextWhenHidden: true, + } + ); + this.tutorialPanel.webview.html = this.getWebviewContent( + WEBVIEW_TYPES.GETTING_STARTED, + false, + this.tutorialPanel + ); + this.tutorialPanel.onDidDispose(() => { + this.disposeTutorialPanel(); + }); + } - private disposeTutorialPanel() { - this.tutorialPanel = undefined; - } - private getAttributeString(webviewType: string, hasDevice: boolean) { - if (hasDevice) { - return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} ${ - WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE - }=${this.deviceSelectionService.getCurrentActiveDevice()} `; - } else { - return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} `; - } - } + private disposeTutorialPanel() { + this.tutorialPanel = undefined; + } + private getAttributeString(webviewType: string, hasDevice: boolean) { + if (hasDevice) { + return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} ${ + WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE + }=${this.deviceSelectionService.getCurrentActiveDevice()} `; + } else { + return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} `; + } + } } // Nonce generator taken from vscode extension samples found here: // https://github.com/microsoft/vscode-extension-samples/blob/master/custom-editor-sample/src/util.ts function getNonce() { - let text = ""; - const possible = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - for (let i = 0; i < 32; i++) { - text += possible.charAt(Math.floor(Math.random() * possible.length)); - } - return text; + let text = ""; + const possible = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + for (let i = 0; i < 32; i++) { + text += possible.charAt(Math.floor(Math.random() * possible.length)); + } + return text; } diff --git a/Source/simulatorDebugConfigurationProvider.ts b/Source/simulatorDebugConfigurationProvider.ts index 2b6725f22..40d153f6a 100644 --- a/Source/simulatorDebugConfigurationProvider.ts +++ b/Source/simulatorDebugConfigurationProvider.ts @@ -6,79 +6,80 @@ import { CONSTANTS, DialogResponses } from "./constants"; import { getServerPortConfig } from "./extension_utils/utils"; export class SimulatorDebugConfigurationProvider - implements vscode.DebugConfigurationProvider { - public deviceSimulatorExpressDebug: boolean; + implements vscode.DebugConfigurationProvider +{ + public deviceSimulatorExpressDebug: boolean; - constructor(private pathToScript: string) { - this.deviceSimulatorExpressDebug = false; - } + constructor(private pathToScript: string) { + this.deviceSimulatorExpressDebug = false; + } - /** - * Modify the debug configuration just before a debug session is being launched. - */ - public resolveDebugConfiguration( - folder: vscode.WorkspaceFolder | undefined, - config: vscode.DebugConfiguration, - token?: vscode.CancellationToken - ): vscode.ProviderResult { - const activeTextEditor = vscode.window.activeTextEditor; + /** + * Modify the debug configuration just before a debug session is being launched. + */ + public resolveDebugConfiguration( + folder: vscode.WorkspaceFolder | undefined, + config: vscode.DebugConfiguration, + token?: vscode.CancellationToken + ): vscode.ProviderResult { + const activeTextEditor = vscode.window.activeTextEditor; - // Create a configuration if no launch.json exists or if it's empty - if (!config.type && !config.request && !config.name) { - if ( - activeTextEditor && - activeTextEditor.document.languageId === "python" - ) { - config.type = "deviceSimulatorExpress"; - config.request = "launch"; - config.name = "Device Simulator Express Debugger"; - config.console = "integratedTerminal"; - } - } - // Check config type - if (config.type === CONSTANTS.DEBUG_CONFIGURATION_TYPE) { - this.deviceSimulatorExpressDebug = true; - if (activeTextEditor) { - const currentFilePath = activeTextEditor.document.fileName; + // Create a configuration if no launch.json exists or if it's empty + if (!config.type && !config.request && !config.name) { + if ( + activeTextEditor && + activeTextEditor.document.languageId === "python" + ) { + config.type = "deviceSimulatorExpress"; + config.request = "launch"; + config.name = "Device Simulator Express Debugger"; + config.console = "integratedTerminal"; + } + } + // Check config type + if (config.type === CONSTANTS.DEBUG_CONFIGURATION_TYPE) { + this.deviceSimulatorExpressDebug = true; + if (activeTextEditor) { + const currentFilePath = activeTextEditor.document.fileName; - // Check file type and name - if (!(activeTextEditor.document.languageId === "python")) { - return vscode.window - .showErrorMessage( - CONSTANTS.ERROR.INVALID_FILE_EXTENSION_DEBUG - ) - .then(() => { - return undefined; // Abort launch - }); - } - // Set the new configuration type so the python debugger can take over - config.type = "python"; - // Set process_user_code path as program - config.program = this.pathToScript; - // Set user's code path and server's port as args - config.args = [ - currentFilePath, - getServerPortConfig().toString(), - ]; - // Set rules - config.rules = [ - { path: this.pathToScript, include: false }, - { - module: "adafruit_circuitplayground", - include: false, - }, - { module: "playsound", include: false }, - ]; - } - } - // Abort / show error message if can't find process_user_code.py - if (!config.program) { - return vscode.window - .showErrorMessage(CONSTANTS.ERROR.NO_PROGRAM_FOUND_DEBUG) - .then(() => { - return undefined; // Abort launch - }); - } - return config; - } + // Check file type and name + if (!(activeTextEditor.document.languageId === "python")) { + return vscode.window + .showErrorMessage( + CONSTANTS.ERROR.INVALID_FILE_EXTENSION_DEBUG + ) + .then(() => { + return undefined; // Abort launch + }); + } + // Set the new configuration type so the python debugger can take over + config.type = "python"; + // Set process_user_code path as program + config.program = this.pathToScript; + // Set user's code path and server's port as args + config.args = [ + currentFilePath, + getServerPortConfig().toString(), + ]; + // Set rules + config.rules = [ + { path: this.pathToScript, include: false }, + { + module: "adafruit_circuitplayground", + include: false, + }, + { module: "playsound", include: false }, + ]; + } + } + // Abort / show error message if can't find process_user_code.py + if (!config.program) { + return vscode.window + .showErrorMessage(CONSTANTS.ERROR.NO_PROGRAM_FOUND_DEBUG) + .then(() => { + return undefined; // Abort launch + }); + } + return config; + } } diff --git a/Source/telemetry/getPackageInfo.ts b/Source/telemetry/getPackageInfo.ts index cd8d42ab7..6e7044903 100644 --- a/Source/telemetry/getPackageInfo.ts +++ b/Source/telemetry/getPackageInfo.ts @@ -3,55 +3,53 @@ import * as path from "path"; import * as vscode from "vscode"; export interface IPackageJson { - name?: string; - version?: string; - instrumentationKey: string; + name?: string; + version?: string; + instrumentationKey: string; } const getPackagePath = (context: vscode.ExtensionContext) => { - const onDiskPath = vscode.Uri.file( - path.join(context.extensionPath, "package.json") - ); - const packagePath = onDiskPath.with({ scheme: "vscode-resource" }); + const onDiskPath = vscode.Uri.file( + path.join(context.extensionPath, "package.json") + ); + const packagePath = onDiskPath.with({ scheme: "vscode-resource" }); - return packagePath; + return packagePath; }; -export default function getPackageInfo( - context: vscode.ExtensionContext -): { - extensionName: string; - extensionVersion: string; - instrumentationKey: string; +export default function getPackageInfo(context: vscode.ExtensionContext): { + extensionName: string; + extensionVersion: string; + instrumentationKey: string; } { - let packageJson: IPackageJson; - const packagePath = getPackagePath(context); - - try { - packageJson = JSON.parse(fs.readFileSync(packagePath.fsPath, "utf8")); - } catch (error) { - console.error(`Failed to read from package.json: ${error}`); - throw new Error(`Failed to read from package.json: ${error}`); - } - - const extensionName: string | undefined = packageJson.name; - const extensionVersion: string | undefined = packageJson.version; - const instrumentationKey: string | undefined = - packageJson.instrumentationKey; - - if (!extensionName) { - throw new Error( - "Extension's package.json is missing instrumentation key." - ); - } - - if (!extensionVersion) { - throw new Error("Extension's package.json is missing version."); - } - - if (!extensionVersion) { - throw new Error("Extension's package.json is missing version."); - } - - return { extensionName, extensionVersion, instrumentationKey }; + let packageJson: IPackageJson; + const packagePath = getPackagePath(context); + + try { + packageJson = JSON.parse(fs.readFileSync(packagePath.fsPath, "utf8")); + } catch (error) { + console.error(`Failed to read from package.json: ${error}`); + throw new Error(`Failed to read from package.json: ${error}`); + } + + const extensionName: string | undefined = packageJson.name; + const extensionVersion: string | undefined = packageJson.version; + const instrumentationKey: string | undefined = + packageJson.instrumentationKey; + + if (!extensionName) { + throw new Error( + "Extension's package.json is missing instrumentation key." + ); + } + + if (!extensionVersion) { + throw new Error("Extension's package.json is missing version."); + } + + if (!extensionVersion) { + throw new Error("Extension's package.json is missing version."); + } + + return { extensionName, extensionVersion, instrumentationKey }; } diff --git a/Source/telemetry/telemetryAI.ts b/Source/telemetry/telemetryAI.ts index 4dbf5ca41..c0c5ff5ac 100644 --- a/Source/telemetry/telemetryAI.ts +++ b/Source/telemetry/telemetryAI.ts @@ -4,80 +4,76 @@ import getPackageInfo from "./getPackageInfo"; // tslint:disable-next-line:export-name export default class TelemetryAI { - private static telemetryReporter: TelemetryReporter; - private static enableTelemetry: boolean | undefined; + private static telemetryReporter: TelemetryReporter; + private static enableTelemetry: boolean | undefined; - constructor(vscodeContext: vscode.ExtensionContext) { - TelemetryAI.telemetryReporter = this.createTelemetryReporter( - vscodeContext - ); - TelemetryAI.enableTelemetry = vscode.workspace - .getConfiguration() - .get("telemetry.enableTelemetry"); - if (TelemetryAI.enableTelemetry === undefined) { - TelemetryAI.enableTelemetry = true; - } - } + constructor(vscodeContext: vscode.ExtensionContext) { + TelemetryAI.telemetryReporter = + this.createTelemetryReporter(vscodeContext); + TelemetryAI.enableTelemetry = vscode.workspace + .getConfiguration() + .get("telemetry.enableTelemetry"); + if (TelemetryAI.enableTelemetry === undefined) { + TelemetryAI.enableTelemetry = true; + } + } - public getExtensionName(context: vscode.ExtensionContext): string { - const { extensionName } = getPackageInfo(context); - return extensionName; - } + public getExtensionName(context: vscode.ExtensionContext): string { + const { extensionName } = getPackageInfo(context); + return extensionName; + } - public getExtensionVersionNumber(context: vscode.ExtensionContext): string { - const { extensionVersion } = getPackageInfo(context); - return extensionVersion; - } + public getExtensionVersionNumber(context: vscode.ExtensionContext): string { + const { extensionVersion } = getPackageInfo(context); + return extensionVersion; + } - public sendTelemetryIfEnabled( - eventName: string, - properties?: { [key: string]: string }, - measurements?: { [key: string]: number } - ) { - if (TelemetryAI.enableTelemetry) { - TelemetryAI.telemetryReporter.sendTelemetryEvent( - eventName, - properties, - measurements - ); - } - } + public sendTelemetryIfEnabled( + eventName: string, + properties?: { [key: string]: string }, + measurements?: { [key: string]: number } + ) { + if (TelemetryAI.enableTelemetry) { + TelemetryAI.telemetryReporter.sendTelemetryEvent( + eventName, + properties, + measurements + ); + } + } - public trackFeatureUsage( - eventName: string, - eventProperties?: { [key: string]: string } - ) { - this.sendTelemetryIfEnabled(eventName, eventProperties); - } + public trackFeatureUsage( + eventName: string, + eventProperties?: { [key: string]: string } + ) { + this.sendTelemetryIfEnabled(eventName, eventProperties); + } - public runWithLatencyMeasure( - functionToRun: () => void, - eventName: string - ): void { - const numberOfNanosecondsInSecond: number = 1000000000; - const startTime: number = Number(process.hrtime.bigint()); - functionToRun(); - const latency: number = Number(process.hrtime.bigint()) - startTime; - const measurement = { - duration: latency / numberOfNanosecondsInSecond, - }; - this.sendTelemetryIfEnabled(eventName, {}, measurement); - } + public runWithLatencyMeasure( + functionToRun: () => void, + eventName: string + ): void { + const numberOfNanosecondsInSecond: number = 1000000000; + const startTime: number = Number(process.hrtime.bigint()); + functionToRun(); + const latency: number = Number(process.hrtime.bigint()) - startTime; + const measurement = { + duration: latency / numberOfNanosecondsInSecond, + }; + this.sendTelemetryIfEnabled(eventName, {}, measurement); + } - private createTelemetryReporter( - context: vscode.ExtensionContext - ): TelemetryReporter { - const { - extensionName, - extensionVersion, - instrumentationKey, - } = getPackageInfo(context); - const reporter: TelemetryReporter = new TelemetryReporter( - extensionName, - extensionVersion, - instrumentationKey - ); - context.subscriptions.push(reporter); - return reporter; - } + private createTelemetryReporter( + context: vscode.ExtensionContext + ): TelemetryReporter { + const { extensionName, extensionVersion, instrumentationKey } = + getPackageInfo(context); + const reporter: TelemetryReporter = new TelemetryReporter( + extensionName, + extensionVersion, + instrumentationKey + ); + context.subscriptions.push(reporter); + return reporter; + } } diff --git a/Source/usbDetector.ts b/Source/usbDetector.ts index 6d28bb9fb..073c99c01 100644 --- a/Source/usbDetector.ts +++ b/Source/usbDetector.ts @@ -12,101 +12,101 @@ import * as utils from "./extension_utils/utils"; import { SerialMonitor } from "./serialMonitor"; export class UsbDetector { - public static getInstance(): UsbDetector { - if (!UsbDetector._instance) { - UsbDetector._instance = new UsbDetector(); - } - return UsbDetector._instance; - } - - private static _instance: UsbDetector; - - private _usbDetector: any; - - private _boardDescriptors: any = null; - - private _extensionRoot: string = null; - - private constructor() {} - - public initialize(extensionRoot: string) { - this._extensionRoot = extensionRoot; - } - - public async startListening() { - const workspaceConfig = vscode.workspace.getConfiguration(); - const enableUSBDetection = workspaceConfig.get( - CONFIG_KEYS.ENABLE_USB_DETECTION - ); - - if (os.platform() === "linux" || !enableUSBDetection) { - return; - } - this._usbDetector = require("usb-native").detector; - - if (!this._usbDetector) { - return; - } - - if (this._extensionRoot === null) { - throw new Error("UsbDetector should be initialized before using."); - } - - this._usbDetector.on("add", async (device: any) => { - if (device.vendorId && device.productId) { - const deviceDescriptor = this.getUsbDeviceDescriptor( - utils.convertToHex(device.vendorId, 4), - utils.convertToHex(device.productId, 4), - this._extensionRoot - ); - - // Not supported device for discovery - if (!deviceDescriptor) { - return; - } - - const boardKey = `${deviceDescriptor.package}:${deviceDescriptor.architecture}:${deviceDescriptor.id}`; - // Log that a board was detected - if (!SerialMonitor.getInstance().initialized) { - SerialMonitor.getInstance().initialize(); - } - } - }); - } - - public stopListening() { - if (this._usbDetector) { - this._usbDetector.stopMonitoring(); - } - } - - private getUsbDeviceDescriptor( - vendorId: string, - productId: string, - extensionRoot: string - ): any { - if (!this._boardDescriptors) { - this._boardDescriptors = []; - const fileContent = fs.readFileSync( - path.join(extensionRoot, "misc", "usbmapping.json"), - "utf8" - ); - const boardIndexes: [] = JSON.parse(fileContent); - boardIndexes.forEach((boardIndex: any) => { - boardIndex.boards.forEach((board: any) => { - board.indexFile = boardIndex.index_file; - }); - this._boardDescriptors = this._boardDescriptors.concat( - boardIndex.boards - ); - }); - } - return this._boardDescriptors.find((obj: any) => { - return ( - obj.vid === vendorId && - (obj.pid === productId || - (obj.pid.indexOf && obj.pid.indexOf(productId) >= 0)) - ); - }); - } + public static getInstance(): UsbDetector { + if (!UsbDetector._instance) { + UsbDetector._instance = new UsbDetector(); + } + return UsbDetector._instance; + } + + private static _instance: UsbDetector; + + private _usbDetector: any; + + private _boardDescriptors: any = null; + + private _extensionRoot: string = null; + + private constructor() {} + + public initialize(extensionRoot: string) { + this._extensionRoot = extensionRoot; + } + + public async startListening() { + const workspaceConfig = vscode.workspace.getConfiguration(); + const enableUSBDetection = workspaceConfig.get( + CONFIG_KEYS.ENABLE_USB_DETECTION + ); + + if (os.platform() === "linux" || !enableUSBDetection) { + return; + } + this._usbDetector = require("usb-native").detector; + + if (!this._usbDetector) { + return; + } + + if (this._extensionRoot === null) { + throw new Error("UsbDetector should be initialized before using."); + } + + this._usbDetector.on("add", async (device: any) => { + if (device.vendorId && device.productId) { + const deviceDescriptor = this.getUsbDeviceDescriptor( + utils.convertToHex(device.vendorId, 4), + utils.convertToHex(device.productId, 4), + this._extensionRoot + ); + + // Not supported device for discovery + if (!deviceDescriptor) { + return; + } + + const boardKey = `${deviceDescriptor.package}:${deviceDescriptor.architecture}:${deviceDescriptor.id}`; + // Log that a board was detected + if (!SerialMonitor.getInstance().initialized) { + SerialMonitor.getInstance().initialize(); + } + } + }); + } + + public stopListening() { + if (this._usbDetector) { + this._usbDetector.stopMonitoring(); + } + } + + private getUsbDeviceDescriptor( + vendorId: string, + productId: string, + extensionRoot: string + ): any { + if (!this._boardDescriptors) { + this._boardDescriptors = []; + const fileContent = fs.readFileSync( + path.join(extensionRoot, "misc", "usbmapping.json"), + "utf8" + ); + const boardIndexes: [] = JSON.parse(fileContent); + boardIndexes.forEach((boardIndex: any) => { + boardIndex.boards.forEach((board: any) => { + board.indexFile = boardIndex.index_file; + }); + this._boardDescriptors = this._boardDescriptors.concat( + boardIndex.boards + ); + }); + } + return this._boardDescriptors.find((obj: any) => { + return ( + obj.vid === vendorId && + (obj.pid === productId || + (obj.pid.indexOf && obj.pid.indexOf(productId) >= 0)) + ); + }); + } } diff --git a/Source/view/App.css b/Source/view/App.css index 413e9fcbc..dd11b283b 100644 --- a/Source/view/App.css +++ b/Source/view/App.css @@ -1,16 +1,16 @@ .App { - text-align: center; - display: flex; - justify-content: space-between; + text-align: center; + display: flex; + justify-content: space-between; } .App-main { - background-color: var(--vscode-editor-background); - padding: 0px 0.75em 0px 0.75em; - min-height: 100vh; - width: 100%; - margin-top: 24px; - margin-bottom: 53px; - max-height: 400px; - overflow: scroll; + background-color: var(--vscode-editor-background); + padding: 0px 0.75em 0px 0.75em; + min-height: 100vh; + width: 100%; + margin-top: 24px; + margin-bottom: 53px; + max-height: 400px; + overflow: scroll; } diff --git a/Source/view/App.spec.tsx b/Source/view/App.spec.tsx index 66d6fc9d5..eb12d412f 100644 --- a/Source/view/App.spec.tsx +++ b/Source/view/App.spec.tsx @@ -5,24 +5,24 @@ import * as testRenderer from "react-test-renderer"; import App from "./App"; describe("App component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/App.tsx b/Source/view/App.tsx index 3e540c8d9..4b530406e 100644 --- a/Source/view/App.tsx +++ b/Source/view/App.tsx @@ -4,98 +4,98 @@ import * as React from "react"; import "./App.css"; import { - DEVICE_LIST_KEY, - VIEW_STATE, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_ATTRIBUTES_KEY, - WEBVIEW_TYPES, + DEVICE_LIST_KEY, + VIEW_STATE, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_ATTRIBUTES_KEY, + WEBVIEW_TYPES, } from "./constants"; import { Device } from "./container/device/Device"; import { ViewStateContext } from "./context"; import { GettingStartedPage } from "./pages/gettingStarted"; interface IState { - currentDevice: string; - viewState: VIEW_STATE; - type?: WEBVIEW_TYPES; + currentDevice: string; + viewState: VIEW_STATE; + type?: WEBVIEW_TYPES; } const defaultState = { - currentDevice: DEVICE_LIST_KEY.CPX, - viewState: VIEW_STATE.RUNNING, - type: undefined, + currentDevice: DEVICE_LIST_KEY.CPX, + viewState: VIEW_STATE.RUNNING, + type: undefined, }; class App extends React.Component<{}, IState> { - constructor() { - super({}); - this.state = defaultState; - } - componentDidMount() { - if (document.currentScript) { - const webviewTypeAttribute = document.currentScript.getAttribute( - WEBVIEW_ATTRIBUTES_KEY.TYPE - ) as WEBVIEW_TYPES; - if (webviewTypeAttribute) { - this.setState({ type: webviewTypeAttribute }); - } - if (webviewTypeAttribute === WEBVIEW_TYPES.SIMULATOR) { - const initialDevice = document.currentScript.getAttribute( - WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE - ); + constructor() { + super({}); + this.state = defaultState; + } + componentDidMount() { + if (document.currentScript) { + const webviewTypeAttribute = document.currentScript.getAttribute( + WEBVIEW_ATTRIBUTES_KEY.TYPE + ) as WEBVIEW_TYPES; + if (webviewTypeAttribute) { + this.setState({ type: webviewTypeAttribute }); + } + if (webviewTypeAttribute === WEBVIEW_TYPES.SIMULATOR) { + const initialDevice = document.currentScript.getAttribute( + WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE + ); - if (initialDevice) { - this.setState({ currentDevice: initialDevice }); - window.addEventListener("message", this.handleMessage); - } - } - } - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } + if (initialDevice) { + this.setState({ currentDevice: initialDevice }); + window.addEventListener("message", this.handleMessage); + } + } + } + } + componentWillUnmount() { + window.removeEventListener("message", this.handleMessage); + } - render() { - return ( -
-
- - {this.loadContent()} - -
-
- ); - } - loadContent = () => { - console.log(this.state.type); - switch (this.state.type) { - case WEBVIEW_TYPES.GETTING_STARTED: - return ; - case WEBVIEW_TYPES.SIMULATOR: - return ( - - ); - } - return; - }; + render() { + return ( +
+
+ + {this.loadContent()} + +
+
+ ); + } + loadContent = () => { + console.log(this.state.type); + switch (this.state.type) { + case WEBVIEW_TYPES.GETTING_STARTED: + return ; + case WEBVIEW_TYPES.SIMULATOR: + return ( + + ); + } + return; + }; - handleMessage = (event: any): void => { - const message = event.data; + handleMessage = (event: any): void => { + const message = event.data; - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE: - if (message.active_device !== this.state.currentDevice) { - this.setState({ currentDevice: message.active_device }); - } - break; - case VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE: - this.setState({ viewState: VIEW_STATE.RUNNING }); - break; - case VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE: - this.setState({ viewState: VIEW_STATE.PAUSE }); - break; - } - }; + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE: + if (message.active_device !== this.state.currentDevice) { + this.setState({ currentDevice: message.active_device }); + } + break; + case VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE: + this.setState({ viewState: VIEW_STATE.RUNNING }); + break; + case VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE: + this.setState({ viewState: VIEW_STATE.PAUSE }); + break; + } + }; } export default App; diff --git a/Source/view/components/Button.tsx b/Source/view/components/Button.tsx index db5034b9d..a7df60dc7 100644 --- a/Source/view/components/Button.tsx +++ b/Source/view/components/Button.tsx @@ -2,33 +2,32 @@ import * as React from "react"; import "../styles/Button.css"; export interface IButtonProps { - label: string; - image: any; - focusable: boolean; - styleLabel: string; - width: number; - onClick: (event: React.MouseEvent) => void; + label: string; + image: any; + focusable: boolean; + styleLabel: string; + width: number; + onClick: (event: React.MouseEvent) => void; } // Functional Component render -const Button: React.FC = props => { - const iconSvg: SVGElement = props.image as SVGElement; - const buttonStyle = { width: props.width }; - const tabIndex = props.focusable ? 0 : -1; +const Button: React.FC = (props) => { + const iconSvg: SVGElement = props.image as SVGElement; + const buttonStyle = { width: props.width }; + const tabIndex = props.focusable ? 0 : -1; - return ( - - ); + return ( + + ); }; export default Button; diff --git a/Source/view/components/Dropdown.tsx b/Source/view/components/Dropdown.tsx index e5506383a..16c55e60b 100644 --- a/Source/view/components/Dropdown.tsx +++ b/Source/view/components/Dropdown.tsx @@ -5,31 +5,30 @@ import * as React from "react"; import "../styles/Dropdown.css"; export interface IDropdownProps { - options: string[]; - // styleLabel: string; - name: string; - onSelect?: (event: React.ChangeEvent) => void; + options: string[]; + // styleLabel: string; + name: string; + onSelect?: (event: React.ChangeEvent) => void; } -export const Dropdown: React.FC = props => { - return ( - - ); +export const Dropdown: React.FC = (props) => { + return ( + + ); }; const renderOptions = (options: string[]) => { - return options.map((name, index) => { - return ( - - ); - }); + return options.map((name, index) => { + return ( + + ); + }); }; diff --git a/Source/view/components/clue/Clue.spec.tsx b/Source/view/components/clue/Clue.spec.tsx index 55d065bce..e9a6e6c7d 100644 --- a/Source/view/components/clue/Clue.spec.tsx +++ b/Source/view/components/clue/Clue.spec.tsx @@ -5,25 +5,25 @@ import * as testRenderer from "react-test-renderer"; import { Clue } from "./Clue"; describe("Clue component", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/components/clue/Clue.tsx b/Source/view/components/clue/Clue.tsx index 552ff54c3..e587a23bc 100644 --- a/Source/view/components/clue/Clue.tsx +++ b/Source/view/components/clue/Clue.tsx @@ -3,10 +3,10 @@ import * as React from "react"; import { - GESTURES_CLUE, - SENSOR_LIST, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, + GESTURES_CLUE, + SENSOR_LIST, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_MESSAGES, } from "../../constants"; import "../../styles/Simulator.css"; import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; @@ -17,142 +17,142 @@ import { ClueSimulator } from "./ClueSimulator"; // Component grouping the functionality for micro:bit functionalities interface IState { - sensors: { [key: string]: number }; - currentSelectedGesture: string; + sensors: { [key: string]: number }; + currentSelectedGesture: string; } const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT_R]: 0, - [SENSOR_LIST.LIGHT_G]: 0, - [SENSOR_LIST.LIGHT_B]: 0, - [SENSOR_LIST.LIGHT_C]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - [SENSOR_LIST.HUMIDITY]: 0, - [SENSOR_LIST.PRESSURE]: 1013, - [SENSOR_LIST.PROXIMITY]: 0, - [SENSOR_LIST.GYRO_X]: 0, - [SENSOR_LIST.GYRO_Y]: 0, - [SENSOR_LIST.GYRO_Z]: 0, - [SENSOR_LIST.MAGNET_X]: 0, - [SENSOR_LIST.MAGNET_Y]: 0, - [SENSOR_LIST.MAGNET_Z]: 0, - }, - currentSelectedGesture: GESTURES_CLUE[0], + sensors: { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT_R]: 0, + [SENSOR_LIST.LIGHT_G]: 0, + [SENSOR_LIST.LIGHT_B]: 0, + [SENSOR_LIST.LIGHT_C]: 0, + [SENSOR_LIST.MOTION_X]: 0, + [SENSOR_LIST.MOTION_Y]: 0, + [SENSOR_LIST.MOTION_Z]: 0, + [SENSOR_LIST.HUMIDITY]: 0, + [SENSOR_LIST.PRESSURE]: 1013, + [SENSOR_LIST.PROXIMITY]: 0, + [SENSOR_LIST.GYRO_X]: 0, + [SENSOR_LIST.GYRO_Y]: 0, + [SENSOR_LIST.GYRO_Z]: 0, + [SENSOR_LIST.MAGNET_X]: 0, + [SENSOR_LIST.MAGNET_Y]: 0, + [SENSOR_LIST.MAGNET_Z]: 0, + }, + currentSelectedGesture: GESTURES_CLUE[0], }; export class Clue extends React.Component<{}, IState> { - state = DEFAULT_STATE; + state = DEFAULT_STATE; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + handleMessage = (event: any): void => { + const message = event.data; - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; - updateGesture = (event: React.ChangeEvent) => { - this.setState({ currentSelectedGesture: event.target.value }); - }; - sendGesture = (isActive: boolean) => { - if (this.state.currentSelectedGesture) { - if (isActive) { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: this.state.currentSelectedGesture, - }); - } else { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: "", - }); - } - } - }; + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.RESET: + this.setState({ ...DEFAULT_STATE }); + break; + } + }; + render() { + return ( + + + + + ); + } + updateSensor = (sensor: SENSOR_LIST, value: number) => { + this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); + }; + updateGesture = (event: React.ChangeEvent) => { + this.setState({ currentSelectedGesture: event.target.value }); + }; + sendGesture = (isActive: boolean) => { + if (this.state.currentSelectedGesture) { + if (isActive) { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: this.state.currentSelectedGesture, + }); + } else { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: "", + }); + } + } + }; } const CLUE_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - label: CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.LEDS, - image: TOOLBAR_SVG.NEO_PIXEL_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.TEMPERATURE, - image: TOOLBAR_SVG.TEMPERATURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.LIGHT, - image: TOOLBAR_SVG.LIGHT_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, - image: TOOLBAR_SVG.MOTION_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.HUMIDITY, - image: TOOLBAR_SVG.HUMIDITY_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.PRESSURE, - image: TOOLBAR_SVG.PRESSURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.PROXIMITY, - image: TOOLBAR_SVG.PROXIMITY_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GESTURE, - image: TOOLBAR_SVG.GESTURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GYROSCOPE, - image: TOOLBAR_SVG.GYROSCOPE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, - image: TOOLBAR_SVG.MAGNET_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GPIO, - image: TOOLBAR_SVG.GPIO_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.SOUND, - image: TOOLBAR_SVG.SOUND_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.SPEAKER, - image: TOOLBAR_SVG.SPEAKER_SVG, - }, + { + label: CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, + image: TOOLBAR_SVG.PUSH_BUTTON_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.LEDS, + image: TOOLBAR_SVG.NEO_PIXEL_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.TEMPERATURE, + image: TOOLBAR_SVG.TEMPERATURE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.LIGHT, + image: TOOLBAR_SVG.LIGHT_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, + image: TOOLBAR_SVG.MOTION_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.HUMIDITY, + image: TOOLBAR_SVG.HUMIDITY_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.PRESSURE, + image: TOOLBAR_SVG.PRESSURE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.PROXIMITY, + image: TOOLBAR_SVG.PROXIMITY_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.GESTURE, + image: TOOLBAR_SVG.GESTURE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.GYROSCOPE, + image: TOOLBAR_SVG.GYROSCOPE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, + image: TOOLBAR_SVG.MAGNET_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.GPIO, + image: TOOLBAR_SVG.GPIO_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.SOUND, + image: TOOLBAR_SVG.SOUND_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.SPEAKER, + image: TOOLBAR_SVG.SPEAKER_SVG, + }, ]; diff --git a/Source/view/components/clue/ClueImage.tsx b/Source/view/components/clue/ClueImage.tsx index b3c3edcf2..7bbecc68e 100644 --- a/Source/view/components/clue/ClueImage.tsx +++ b/Source/view/components/clue/ClueImage.tsx @@ -8,149 +8,149 @@ import { ViewStateContext } from "../../context"; import { ClueSvg, IRefObject } from "./Clue_svg"; interface EventTriggers { - onMouseUp: (event: Event, buttonKey: string) => void; - onMouseDown: (event: Event, buttonKey: string) => void; - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; + onMouseUp: (event: Event, buttonKey: string) => void; + onMouseDown: (event: Event, buttonKey: string) => void; + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; } interface IProps { - eventTriggers: EventTriggers; - displayMessage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; + eventTriggers: EventTriggers; + displayMessage: string; + leds: { + neopixel: number[]; + isRedLedOn: boolean; + isWhiteLedOn: boolean; + }; } export enum BUTTONS_KEYS { - BTN_A = "BTN_A", - BTN_B = "BTN_B", - BTN_AB = "BTN_AB", + BTN_A = "BTN_A", + BTN_B = "BTN_B", + BTN_AB = "BTN_AB", } // Displays the SVG and call necessary svg modification. export class ClueImage extends React.Component { - private svgRef: React.RefObject = React.createRef(); - constructor(props: IProps) { - super(props); - } - componentDidMount() { - const svgElement = this.svgRef.current; - if (svgElement) { - setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); - this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); - } - } - componentDidUpdate() { - if (this.context === VIEW_STATE.PAUSE && this.svgRef.current) { - disableAllButtons(this.svgRef.current.getButtons()); - } else if (this.context === VIEW_STATE.RUNNING && this.svgRef.current) { - setupAllButtons( - this.props.eventTriggers, - this.svgRef.current.getButtons() - ); - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.eventTriggers.onKeyEvent(event, true, event.key); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.eventTriggers.onKeyEvent(event, false, event.key); - }; - render() { - return ( - - ); - } - public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { - const button = this.svgRef.current?.getButtons()[key].current; - if (button) { - button.focus(); - if (isActive) { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.KEYPRESSED - ); - } else { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.DEFAULT - ); - } - button.setAttribute("pressed", `${isActive}`); - button.setAttribute("aria-pressed", `${isActive}`); - } - } + private svgRef: React.RefObject = React.createRef(); + constructor(props: IProps) { + super(props); + } + componentDidMount() { + const svgElement = this.svgRef.current; + if (svgElement) { + setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); + this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); + } + } + componentDidUpdate() { + if (this.context === VIEW_STATE.PAUSE && this.svgRef.current) { + disableAllButtons(this.svgRef.current.getButtons()); + } else if (this.context === VIEW_STATE.RUNNING && this.svgRef.current) { + setupAllButtons( + this.props.eventTriggers, + this.svgRef.current.getButtons() + ); + } + } + componentWillUnmount() { + window.document.removeEventListener("keydown", this.handleKeyDown); + window.document.removeEventListener("keyup", this.handleKeyUp); + } + setupKeyPresses = ( + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void + ) => { + window.document.addEventListener("keydown", this.handleKeyDown); + window.document.addEventListener("keyup", this.handleKeyUp); + }; + handleKeyDown = (event: KeyboardEvent) => { + const keyEvents = [event.key, event.code]; + // Don't listen to keydown events for the run button, restart button and enter key + if ( + !( + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) + ) + ) { + this.props.eventTriggers.onKeyEvent(event, true, event.key); + } + }; + handleKeyUp = (event: KeyboardEvent) => { + this.props.eventTriggers.onKeyEvent(event, false, event.key); + }; + render() { + return ( + + ); + } + public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { + const button = this.svgRef.current?.getButtons()[key].current; + if (button) { + button.focus(); + if (isActive) { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.KEYPRESSED + ); + } else { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.DEFAULT + ); + } + button.setAttribute("pressed", `${isActive}`); + button.setAttribute("aria-pressed", `${isActive}`); + } + } } ClueImage.contextType = ViewStateContext; const setupButton = ( - buttonElement: SVGRectElement, - eventTriggers: EventTriggers, - key: string + buttonElement: SVGRectElement, + eventTriggers: EventTriggers, + key: string ) => { - buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); - buttonElement.onmousedown = e => { - buttonElement.focus(); - eventTriggers.onMouseDown(e, key); - }; - buttonElement.onmouseup = e => { - eventTriggers.onMouseUp(e, key); - }; + buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); + buttonElement.onmousedown = (e) => { + buttonElement.focus(); + eventTriggers.onMouseDown(e, key); + }; + buttonElement.onmouseup = (e) => { + eventTriggers.onMouseUp(e, key); + }; - buttonElement.onkeydown = e => { - // ensure that the keydown is enter, - // or else it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - eventTriggers.onKeyEvent(e, true, key); - } - }; - buttonElement.onkeyup = e => { - eventTriggers.onKeyEvent(e, false, key); - }; + buttonElement.onkeydown = (e) => { + // ensure that the keydown is enter, + // or else it may register shortcuts twice + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + eventTriggers.onKeyEvent(e, true, key); + } + }; + buttonElement.onkeyup = (e) => { + eventTriggers.onKeyEvent(e, false, key); + }; }; const setupAllButtons = ( - eventTriggers: EventTriggers, - buttonRefs: IRefObject + eventTriggers: EventTriggers, + buttonRefs: IRefObject ) => { - for (const [key, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - setupButton(ref.current, eventTriggers, key); - } - } + for (const [key, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + setupButton(ref.current, eventTriggers, key); + } + } }; const disableAllButtons = (buttonRefs: IRefObject) => { - for (const [, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - // to implement - ref.current.onmousedown = null; - ref.current.onmouseup = null; - ref.current.onkeydown = null; - ref.current.onkeyup = null; - ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); - } - } + for (const [, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + // to implement + ref.current.onmousedown = null; + ref.current.onmouseup = null; + ref.current.onkeydown = null; + ref.current.onkeyup = null; + ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); + } + } }; diff --git a/Source/view/components/clue/ClueSimulator.tsx b/Source/view/components/clue/ClueSimulator.tsx index a15f101f8..89323e93e 100644 --- a/Source/view/components/clue/ClueSimulator.tsx +++ b/Source/view/components/clue/ClueSimulator.tsx @@ -1,11 +1,11 @@ import * as React from "react"; import { - AB_BUTTONS_KEYS, - CONSTANTS, - DEFAULT_IMG_CLUE, - DEVICE_LIST_KEY, - VIEW_STATE, - WEBVIEW_MESSAGES, + AB_BUTTONS_KEYS, + CONSTANTS, + DEFAULT_IMG_CLUE, + DEVICE_LIST_KEY, + VIEW_STATE, + WEBVIEW_MESSAGES, } from "../../constants"; import { ViewStateContext } from "../../context"; import "../../styles/Simulator.css"; @@ -17,288 +17,288 @@ import ActionBar from "../simulator/ActionBar"; import { BUTTONS_KEYS, ClueImage } from "./ClueImage"; export const DEFAULT_CLUE_STATE: IClueState = { - buttons: { button_a: false, button_b: false }, - displayMessage: DEFAULT_IMG_CLUE, - leds: { - neopixel: [0, 0, 0], - isRedLedOn: false, - isWhiteLedOn: false, - }, + buttons: { button_a: false, button_b: false }, + displayMessage: DEFAULT_IMG_CLUE, + leds: { + neopixel: [0, 0, 0], + isRedLedOn: false, + isWhiteLedOn: false, + }, }; interface IState { - active_editors: string[]; - running_file?: string; - play_button: boolean; - selected_file: string; - clue: IClueState; - currently_selected_file: string; + active_editors: string[]; + running_file?: string; + play_button: boolean; + selected_file: string; + clue: IClueState; + currently_selected_file: string; } interface IClueState { - buttons: { button_a: boolean; button_b: boolean }; - displayMessage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; + buttons: { button_a: boolean; button_b: boolean }; + displayMessage: string; + leds: { + neopixel: number[]; + isRedLedOn: boolean; + isWhiteLedOn: boolean; + }; } export class ClueSimulator extends React.Component { - private imageRef: React.RefObject = React.createRef(); - constructor() { - super({}); - this.state = { - clue: DEFAULT_CLUE_STATE, - play_button: false, - selected_file: "", - active_editors: [], - running_file: undefined, - currently_selected_file: "", - }; - this.onKeyEvent = this.onKeyEvent.bind(this); - } - handleMessage = (event: any): void => { - const message = event.data; - if (message.active_device !== DEVICE_LIST_KEY.CLUE) { - return; - } - switch (message.command) { - case "reset-state": - this.setState({ - clue: DEFAULT_CLUE_STATE, - play_button: false, - }); - break; - case "set-state": - this.handleStateChangeMessage(message); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - clue: { - ...this.state.clue, - displayMessage: DEFAULT_IMG_CLUE, - }, - }); - break; - case "visible-editors": - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } + private imageRef: React.RefObject = React.createRef(); + constructor() { + super({}); + this.state = { + clue: DEFAULT_CLUE_STATE, + play_button: false, + selected_file: "", + active_editors: [], + running_file: undefined, + currently_selected_file: "", + }; + this.onKeyEvent = this.onKeyEvent.bind(this); + } + handleMessage = (event: any): void => { + const message = event.data; + if (message.active_device !== DEVICE_LIST_KEY.CLUE) { + return; + } + switch (message.command) { + case "reset-state": + this.setState({ + clue: DEFAULT_CLUE_STATE, + play_button: false, + }); + break; + case "set-state": + this.handleStateChangeMessage(message); + break; + case "activate-play": + const newRunningFile = this.state.currently_selected_file; + this.setState({ + play_button: !this.state.play_button, + running_file: newRunningFile, + clue: { + ...this.state.clue, + displayMessage: DEFAULT_IMG_CLUE, + }, + }); + break; + case "visible-editors": + this.setState({ + active_editors: message.state.activePythonEditors, + }); + break; + case "current-file": + if (this.state.play_button) { + this.setState({ + currently_selected_file: message.state.running_file, + }); + } else { + this.setState({ + running_file: message.state.running_file, + currently_selected_file: message.state.running_file, + }); + } - break; - } - }; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } + break; + } + }; + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } + componentWillUnmount() { + window.removeEventListener("message", this.handleMessage); + } - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
+ render() { + const playStopImage = this.state.play_button ? StopLogo : PlayLogo; + const playStopLabel = this.state.play_button ? "stop" : "play"; + return ( +
+
+ {this.state.running_file && this.state.play_button + ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) + : CONSTANTS.FILES_PLACEHOLDER} +
-
- -
- -
- ); - } - protected togglePlayClick = () => { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - }; - protected onSelectFile(event: React.FocusEvent) { - this.setState({ - selected_file: event.currentTarget.value, - }); - } - protected refreshSimulatorClick = () => { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - }; - protected handleButtonClick = (key: string, isActive: boolean) => { - let newButtonState = this.state.clue.buttons; - switch (key) { - case AB_BUTTONS_KEYS.BTN_A: - newButtonState.button_a = isActive; - break; - case AB_BUTTONS_KEYS.BTN_B: - newButtonState.button_b = isActive; - break; - case AB_BUTTONS_KEYS.BTN_AB: - newButtonState = { - button_a: isActive, - button_b: isActive, - }; - break; - } - sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); - this.setState({ - clue: { - ...this.state.clue, - buttons: newButtonState, - }, - }); - }; +
+ +
+ +
+ ); + } + protected togglePlayClick = () => { + const button = + window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || + window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { + selected_file: this.state.selected_file, + state: !this.state.play_button, + }); + }; + protected onSelectFile(event: React.FocusEvent) { + this.setState({ + selected_file: event.currentTarget.value, + }); + } + protected refreshSimulatorClick = () => { + const button = window.document.getElementById( + CONSTANTS.ID_NAME.REFRESH_BUTTON + ); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); + }; + protected handleButtonClick = (key: string, isActive: boolean) => { + let newButtonState = this.state.clue.buttons; + switch (key) { + case AB_BUTTONS_KEYS.BTN_A: + newButtonState.button_a = isActive; + break; + case AB_BUTTONS_KEYS.BTN_B: + newButtonState.button_b = isActive; + break; + case AB_BUTTONS_KEYS.BTN_AB: + newButtonState = { + button_a: isActive, + button_b: isActive, + }; + break; + } + sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); + this.setState({ + clue: { + ...this.state.clue, + buttons: newButtonState, + }, + }); + }; - protected onMouseUp = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, false); - }; + protected onMouseUp = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, false); + }; - protected onMouseDown = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, true); - }; + protected onMouseDown = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, true); + }; - protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { - event.stopPropagation(); - if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(key, active); - if (key === BUTTONS_KEYS.BTN_A) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if (key === BUTTONS_KEYS.BTN_B) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if (key === BUTTONS_KEYS.BTN_AB) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } - } - protected handleStateChangeMessage(message: any) { - if (message.state.display_base64 != null) { - this.setState({ - clue: { - ...this.state.clue, - displayMessage: message.state.display_base64, - }, - }); - } else if (message.state.pixels != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - neopixel: message.state.pixels, - }, - }, - }); - } else if (message.state.white_leds != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - isWhiteLedOn: message.state.white_leds, - }, - }, - }); - } else if (message.state.red_led != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - isRedLedOn: message.state.red_led, - }, - }, - }); - } - } + protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { + event.stopPropagation(); + if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(key, active); + if (key === BUTTONS_KEYS.BTN_A) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active + ); + } else if (key === BUTTONS_KEYS.BTN_B) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active + ); + } else if (key === BUTTONS_KEYS.BTN_AB) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active + ); + } + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active + ); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { + this.togglePlayClick(); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { + this.refreshSimulatorClick(); + } + } + protected handleStateChangeMessage(message: any) { + if (message.state.display_base64 != null) { + this.setState({ + clue: { + ...this.state.clue, + displayMessage: message.state.display_base64, + }, + }); + } else if (message.state.pixels != null) { + this.setState({ + clue: { + ...this.state.clue, + leds: { + ...this.state.clue.leds, + neopixel: message.state.pixels, + }, + }, + }); + } else if (message.state.white_leds != null) { + this.setState({ + clue: { + ...this.state.clue, + leds: { + ...this.state.clue.leds, + isWhiteLedOn: message.state.white_leds, + }, + }, + }); + } else if (message.state.red_led != null) { + this.setState({ + clue: { + ...this.state.clue, + leds: { + ...this.state.clue.leds, + isRedLedOn: message.state.red_led, + }, + }, + }); + } + } } ClueSimulator.contextType = ViewStateContext; diff --git a/Source/view/components/clue/Clue_svg.tsx b/Source/view/components/clue/Clue_svg.tsx index b67b1f0f9..2f09d3321 100644 --- a/Source/view/components/clue/Clue_svg.tsx +++ b/Source/view/components/clue/Clue_svg.tsx @@ -7,1178 +7,1169 @@ import "../../styles/SimulatorSvg.css"; import svg from "../cpx/Svg_utils"; import { DEFAULT_CLUE_STATE } from "./ClueSimulator"; export interface IRefObject { - [key: string]: React.RefObject; + [key: string]: React.RefObject; } interface IProps { - displayImage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; + displayImage: string; + leds: { + neopixel: number[]; + isRedLedOn: boolean; + isWhiteLedOn: boolean; + }; } export class ClueSvg extends React.Component { - private svgRef: React.RefObject = React.createRef(); - private ledsRefs = { - neopixel: React.createRef(), - redLed: React.createRef(), - whiteLeds: [ - React.createRef(), - React.createRef(), - ], - }; - private gradientRefs = { - neopixel: React.createRef(), - whiteLed: React.createRef(), - redLed: React.createRef(), - }; + private svgRef: React.RefObject = React.createRef(); + private ledsRefs = { + neopixel: React.createRef(), + redLed: React.createRef(), + whiteLeds: [ + React.createRef(), + React.createRef(), + ], + }; + private gradientRefs = { + neopixel: React.createRef(), + whiteLed: React.createRef(), + redLed: React.createRef(), + }; - private buttonRefs: IRefObject = { - BTN_A: React.createRef(), - BTN_B: React.createRef(), - BTN_AB: React.createRef(), - }; + private buttonRefs: IRefObject = { + BTN_A: React.createRef(), + BTN_B: React.createRef(), + BTN_AB: React.createRef(), + }; - private displayRef: React.RefObject = React.createRef(); + private displayRef: React.RefObject = React.createRef(); - public getSvgRef(): React.RefObject { - return this.svgRef; - } - public getButtons(): IRefObject { - return this.buttonRefs; - } - public getDisplayRef(): React.RefObject { - return this.displayRef; - } - componentDidMount() { - this.updateSvg(); - } - componentDidUpdate() { - this.updateSvg(); - } + public getSvgRef(): React.RefObject { + return this.svgRef; + } + public getButtons(): IRefObject { + return this.buttonRefs; + } + public getDisplayRef(): React.RefObject { + return this.displayRef; + } + componentDidMount() { + this.updateSvg(); + } + componentDidUpdate() { + this.updateSvg(); + } - render() { - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + render() { + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - A+B - - - + + + + + + + + + + + + + + + + + + + + + + + + + + A+B + + + - - - - - - - LIGHT - - - GESTURE - - - P - - R - - - O - - - XIMI - - - T - - - Y - - - - - - - - - - - - - - Red LED - - - - - Neopixel - - - - -
- ); - } - private updateSvg() { - this.updateDisplay(); - this.updateNeopixel(); - this.updateLeds(); - } + + + + + + + LIGHT + + + GESTURE + + + P + + R + + + O + + + XIMI + + + T + + + Y + + + + + + + + + + + + + + Red LED + + + + + Neopixel + + + + +
+ ); + } + private updateSvg() { + this.updateDisplay(); + this.updateNeopixel(); + this.updateLeds(); + } - private updateDisplay() { - if (this.props.displayImage) { - this.displayRef.current?.setAttribute( - "href", - `data:image/png;base64,${this.props.displayImage}` - ); - } - } + private updateDisplay() { + if (this.props.displayImage) { + this.displayRef.current?.setAttribute( + "href", + `data:image/png;base64,${this.props.displayImage}` + ); + } + } - private updateNeopixel() { - const { neopixel } = this.props.leds; - const rgbColor = `rgb(${neopixel[0] + - (255 - neopixel[0]) * CONSTANTS.LED_TINT_FACTOR}, - ${neopixel[1] + - (255 - neopixel[1]) * CONSTANTS.LED_TINT_FACTOR},${neopixel[2] + - (255 - neopixel[2]) * CONSTANTS.LED_TINT_FACTOR})`; + private updateNeopixel() { + const { neopixel } = this.props.leds; + const rgbColor = `rgb(${ + neopixel[0] + (255 - neopixel[0]) * CONSTANTS.LED_TINT_FACTOR + }, + ${neopixel[1] + (255 - neopixel[1]) * CONSTANTS.LED_TINT_FACTOR},${ + neopixel[2] + (255 - neopixel[2]) * CONSTANTS.LED_TINT_FACTOR + })`; - this.ledsRefs.neopixel.current?.setAttribute("fill", rgbColor); + this.ledsRefs.neopixel.current?.setAttribute("fill", rgbColor); - if (neopixel === DEFAULT_CLUE_STATE.leds.neopixel) { - this.gradientRefs.neopixel.current?.setAttribute( - "stop-opacity", - "0" - ); - } else { - this.gradientRefs.neopixel.current?.setAttribute( - "stop-opacity", - "1" - ); - } - this.gradientRefs.neopixel.current?.setAttribute( - "stop-color", - rgbColor - ); - } - private updateLeds() { - // update white led - const { isWhiteLedOn, isRedLedOn } = this.props.leds; + if (neopixel === DEFAULT_CLUE_STATE.leds.neopixel) { + this.gradientRefs.neopixel.current?.setAttribute( + "stop-opacity", + "0" + ); + } else { + this.gradientRefs.neopixel.current?.setAttribute( + "stop-opacity", + "1" + ); + } + this.gradientRefs.neopixel.current?.setAttribute( + "stop-color", + rgbColor + ); + } + private updateLeds() { + // update white led + const { isWhiteLedOn, isRedLedOn } = this.props.leds; - this.ledsRefs.whiteLeds.map( - (ledRef: React.RefObject) => { - svg.setLed( - isWhiteLedOn, - CLUE_LEDS_COLORS.WHITE_LEDS_OFF, - CLUE_LEDS_COLORS.WHITE_LEDS_ON, - ledRef.current, - this.gradientRefs.whiteLed.current - ); - } - ); - svg.setLed( - isRedLedOn, - CLUE_LEDS_COLORS.RED_LED_OFF, - CLUE_LEDS_COLORS.RED_LED_ON, - this.ledsRefs.redLed.current, - this.gradientRefs.redLed.current - ); - } + this.ledsRefs.whiteLeds.map( + (ledRef: React.RefObject) => { + svg.setLed( + isWhiteLedOn, + CLUE_LEDS_COLORS.WHITE_LEDS_OFF, + CLUE_LEDS_COLORS.WHITE_LEDS_ON, + ledRef.current, + this.gradientRefs.whiteLed.current + ); + } + ); + svg.setLed( + isRedLedOn, + CLUE_LEDS_COLORS.RED_LED_OFF, + CLUE_LEDS_COLORS.RED_LED_ON, + this.ledsRefs.redLed.current, + this.gradientRefs.redLed.current + ); + } } diff --git a/Source/view/components/cpx/Accessibility_utils.ts b/Source/view/components/cpx/Accessibility_utils.ts index afdadb2ac..1ce8d7559 100644 --- a/Source/view/components/cpx/Accessibility_utils.ts +++ b/Source/view/components/cpx/Accessibility_utils.ts @@ -3,24 +3,24 @@ // Helpers designed to help to make a simulator accessible. namespace accessibility { - export function makeFocusable(elem: SVGElement): void { - elem.setAttribute("focusable", "true"); - elem.setAttribute("tabindex", "0"); - } + export function makeFocusable(elem: SVGElement): void { + elem.setAttribute("focusable", "true"); + elem.setAttribute("tabindex", "0"); + } - export function setAria( - elem: Element, - role?: string, - label?: string - ): void { - if (role && !elem.hasAttribute("role")) { - elem.setAttribute("role", role); - } + export function setAria( + elem: Element, + role?: string, + label?: string + ): void { + if (role && !elem.hasAttribute("role")) { + elem.setAttribute("role", role); + } - if (label && !elem.hasAttribute("aria-label")) { - elem.setAttribute("aria-label", label); - } - } + if (label && !elem.hasAttribute("aria-label")) { + elem.setAttribute("aria-label", label); + } + } } export default accessibility; diff --git a/Source/view/components/cpx/Cpx.spec.tsx b/Source/view/components/cpx/Cpx.spec.tsx index 3b5bdfb6a..229140637 100644 --- a/Source/view/components/cpx/Cpx.spec.tsx +++ b/Source/view/components/cpx/Cpx.spec.tsx @@ -5,25 +5,25 @@ import * as testRenderer from "react-test-renderer"; import { Cpx } from "./Cpx"; describe("CPX component", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/components/cpx/Cpx.tsx b/Source/view/components/cpx/Cpx.tsx index 02560623a..2da890fac 100644 --- a/Source/view/components/cpx/Cpx.tsx +++ b/Source/view/components/cpx/Cpx.tsx @@ -10,95 +10,95 @@ import Simulator from "./CpxSimulator"; // Component grouping the functionality for circuit playground express const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - }, + sensors: { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT]: 0, + [SENSOR_LIST.MOTION_X]: 0, + [SENSOR_LIST.MOTION_Y]: 0, + [SENSOR_LIST.MOTION_Z]: 0, + }, }; export class Cpx extends React.Component { - state = DEFAULT_STATE; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } + state = DEFAULT_STATE; + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + handleMessage = (event: any): void => { + const message = event.data; - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.RESET: + this.setState({ ...DEFAULT_STATE }); + break; + } + }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; + render() { + return ( + + + + + ); + } + updateSensor = (sensor: SENSOR_LIST, value: number) => { + this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); + }; } const CPX_TOOLBAR_BUTTONS: Array<{ label: any; image: any }> = [ - { - image: TOOLBAR_SVG.SLIDER_SWITCH_SVG, - label: CPX_TOOLBAR_ICON_ID.SWITCH, - }, - { - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - label: CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, - }, - { - image: TOOLBAR_SVG.RED_LED_SVG, - label: CPX_TOOLBAR_ICON_ID.RED_LED, - }, - { - image: TOOLBAR_SVG.SOUND_SVG, - label: CPX_TOOLBAR_ICON_ID.SOUND, - }, - { - image: TOOLBAR_SVG.TEMPERATURE_SVG, - label: CPX_TOOLBAR_ICON_ID.TEMPERATURE, - }, - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: CPX_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.NEO_PIXEL_SVG, - label: CPX_TOOLBAR_ICON_ID.NEO_PIXEL, - }, - { - image: TOOLBAR_SVG.SPEAKER_SVG, - label: CPX_TOOLBAR_ICON_ID.SPEAKER, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: CPX_TOOLBAR_ICON_ID.MOTION, - }, - { - image: TOOLBAR_SVG.IR_SVG, - label: CPX_TOOLBAR_ICON_ID.IR, - }, - { - image: TOOLBAR_SVG.GPIO_SVG, - label: CPX_TOOLBAR_ICON_ID.GPIO, - }, + { + image: TOOLBAR_SVG.SLIDER_SWITCH_SVG, + label: CPX_TOOLBAR_ICON_ID.SWITCH, + }, + { + image: TOOLBAR_SVG.PUSH_BUTTON_SVG, + label: CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, + }, + { + image: TOOLBAR_SVG.RED_LED_SVG, + label: CPX_TOOLBAR_ICON_ID.RED_LED, + }, + { + image: TOOLBAR_SVG.SOUND_SVG, + label: CPX_TOOLBAR_ICON_ID.SOUND, + }, + { + image: TOOLBAR_SVG.TEMPERATURE_SVG, + label: CPX_TOOLBAR_ICON_ID.TEMPERATURE, + }, + { + image: TOOLBAR_SVG.LIGHT_SVG, + label: CPX_TOOLBAR_ICON_ID.LIGHT, + }, + { + image: TOOLBAR_SVG.NEO_PIXEL_SVG, + label: CPX_TOOLBAR_ICON_ID.NEO_PIXEL, + }, + { + image: TOOLBAR_SVG.SPEAKER_SVG, + label: CPX_TOOLBAR_ICON_ID.SPEAKER, + }, + { + image: TOOLBAR_SVG.MOTION_SVG, + label: CPX_TOOLBAR_ICON_ID.MOTION, + }, + { + image: TOOLBAR_SVG.IR_SVG, + label: CPX_TOOLBAR_ICON_ID.IR, + }, + { + image: TOOLBAR_SVG.GPIO_SVG, + label: CPX_TOOLBAR_ICON_ID.GPIO, + }, ]; diff --git a/Source/view/components/cpx/CpxImage.tsx b/Source/view/components/cpx/CpxImage.tsx index 48aef4e64..b56b7a31c 100644 --- a/Source/view/components/cpx/CpxImage.tsx +++ b/Source/view/components/cpx/CpxImage.tsx @@ -9,398 +9,400 @@ import * as SvgStyle from "./Cpx_svg_style"; import svg from "./Svg_utils"; interface IProps { - pixels: number[][]; - red_led: boolean; - brightness: number; - switch: boolean; - on: boolean; - onKeyEvent: (event: KeyboardEvent, active: boolean) => void; - onMouseUp: (button: HTMLElement, event: Event) => void; - onMouseDown: (button: HTMLElement, event: Event) => void; - onMouseLeave: (button: HTMLElement, event: Event) => void; + pixels: number[][]; + red_led: boolean; + brightness: number; + switch: boolean; + on: boolean; + onKeyEvent: (event: KeyboardEvent, active: boolean) => void; + onMouseUp: (button: HTMLElement, event: Event) => void; + onMouseDown: (button: HTMLElement, event: Event) => void; + onMouseLeave: (button: HTMLElement, event: Event) => void; } export class CpxImage extends React.Component { - componentDidMount() { - const svgElement = window.document.getElementById("cpx_svg"); - if (svgElement) { - initSvgStyle(svgElement, this.props.brightness); - setupButtons(this.props); - setupPins(this.props); - this.setupKeyPresses(this.props.onKeyEvent); - setupSwitch(this.props); - this.updateImage(); - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - componentDidUpdate() { - this.updateImage(); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the switch, run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.S) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.onKeyEvent(event, true); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.onKeyEvent(event, false); - }; - render() { - return CPX_SVG; - } - private updateImage() { - updateNeopixels(this.props); - updateRedLED(this.props.red_led); - updatePowerLED(this.props.on); - updateSwitch(this.props.switch); - } + componentDidMount() { + const svgElement = window.document.getElementById("cpx_svg"); + if (svgElement) { + initSvgStyle(svgElement, this.props.brightness); + setupButtons(this.props); + setupPins(this.props); + this.setupKeyPresses(this.props.onKeyEvent); + setupSwitch(this.props); + this.updateImage(); + } + } + componentWillUnmount() { + window.document.removeEventListener("keydown", this.handleKeyDown); + window.document.removeEventListener("keyup", this.handleKeyUp); + } + componentDidUpdate() { + this.updateImage(); + } + setupKeyPresses = ( + onKeyEvent: (event: KeyboardEvent, active: boolean) => void + ) => { + window.document.addEventListener("keydown", this.handleKeyDown); + window.document.addEventListener("keyup", this.handleKeyUp); + }; + + handleKeyDown = (event: KeyboardEvent) => { + const keyEvents = [event.key, event.code]; + // Don't listen to keydown events for the switch, run button, restart button and enter key + if ( + !( + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.S) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) + ) + ) { + this.props.onKeyEvent(event, true); + } + }; + handleKeyUp = (event: KeyboardEvent) => { + this.props.onKeyEvent(event, false); + }; + render() { + return CPX_SVG; + } + private updateImage() { + updateNeopixels(this.props); + updateRedLED(this.props.red_led); + updatePowerLED(this.props.on); + updateSwitch(this.props.switch); + } } const makeButton = ( - g: SVGElement, - left: number, - top: number, - id: string + g: SVGElement, + left: number, + top: number, + id: string ): { outer: SVGElement; inner: SVGElement } => { - const buttonCornerRadius = SvgStyle.BUTTON_CORNER_RADIUS; - const buttonWidth = SvgStyle.BUTTON_WIDTH; - const buttonCircleRadius = SvgStyle.BUTTON_CIRCLE_RADIUS; - const btng = svg.child(g, "g", { class: "sim-button-group" }); - svg.child(btng, "rect", { - fill: SvgStyle.BUTTON_OUTER, - height: buttonWidth, - id: id + "_OUTER", - rx: buttonCornerRadius, - ry: buttonCornerRadius, - width: buttonWidth, - x: left, - y: top, - }); - - const outer = btng; - const inner = svg.child(btng, "circle", { - id: id + "_INNER", - cx: left + buttonWidth / 2, - cy: top + buttonWidth / 2, - r: buttonCircleRadius, - fill: SvgStyle.BUTTON_NEUTRAL, - }); - - return { outer, inner }; + const buttonCornerRadius = SvgStyle.BUTTON_CORNER_RADIUS; + const buttonWidth = SvgStyle.BUTTON_WIDTH; + const buttonCircleRadius = SvgStyle.BUTTON_CIRCLE_RADIUS; + const btng = svg.child(g, "g", { class: "sim-button-group" }); + svg.child(btng, "rect", { + fill: SvgStyle.BUTTON_OUTER, + height: buttonWidth, + id: id + "_OUTER", + rx: buttonCornerRadius, + ry: buttonCornerRadius, + width: buttonWidth, + x: left, + y: top, + }); + + const outer = btng; + const inner = svg.child(btng, "circle", { + id: id + "_INNER", + cx: left + buttonWidth / 2, + cy: top + buttonWidth / 2, + r: buttonCircleRadius, + fill: SvgStyle.BUTTON_NEUTRAL, + }); + + return { outer, inner }; }; const initSvgStyle = (svgElement: HTMLElement, brightness: number): void => { - const style: SVGStyleElement = svg.child( - svgElement, - "style", - {} - ) as SVGStyleElement; - style.textContent = SvgStyle.SVG_STYLE; - - // Filters for the glow effect (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) - const defs: SVGDefsElement = svg.child( - svgElement, - "defs", - {} - ) as SVGDefsElement; - - const g = svg.createElement("g") as SVGElement; - svgElement.appendChild(g); - - const glow = svg.child(defs, "filter", { - height: "120%", - id: "filterglow", - width: "120%", - x: "-5%", - y: "-5%", - }); - svg.child(glow, "feGaussianBlur", { stdDeviation: "5", result: "glow" }); - const merge = svg.child(glow, "feMerge", {}); - for (let i = 0; i < 3; ++i) { - svg.child(merge, "feMergeNode", { in: "glow" }); - } - - const neopixelglow = svg.child(defs, "filter", { - height: "600%", - id: "neopixelglow", - width: "600%", - x: "-300%", - y: "-300%", - }); - svg.child(neopixelglow, "feGaussianBlur", { - result: "coloredBlur", - stdDeviation: "4.3", - }); - const neopixelmerge = svg.child(neopixelglow, "feMerge", {}); - svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); - svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); - svg.child(neopixelmerge, "feMergeNode", { in: "SourceGraphic" }); - - // Brightness - const neopixelfeComponentTransfer = svg.child( - neopixelglow, - "feComponentTransfer", - {} - ); - svg.child(neopixelfeComponentTransfer, "feFuncR", { - id: "brightnessFilterR", - type: "linear", - slope: brightness, - }); - svg.child(neopixelfeComponentTransfer, "feFuncG", { - id: "brightnessFilterG", - slope: brightness, - type: "linear", - }); - svg.child(neopixelfeComponentTransfer, "feFuncB", { - id: "brightnessFilterB", - slope: brightness, - type: "linear", - }); - - // BTN A+B - const outerBtn = (left: number, top: number, label: string) => { - return makeButton(g, left, top, "BTN_AB"); - }; - - const ab = outerBtn(165, SvgStyle.MB_HEIGHT - 15, "A+B"); - const abtext = svg.child(ab.outer, "text", { - class: "sim-text-outside", - x: SvgStyle.BUTTON_TEXT_BASELINE, - y: SvgStyle.MB_HEIGHT - 18, - }) as SVGTextElement; - abtext.textContent = "A+B"; + const style: SVGStyleElement = svg.child( + svgElement, + "style", + {} + ) as SVGStyleElement; + style.textContent = SvgStyle.SVG_STYLE; + + // Filters for the glow effect (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) + const defs: SVGDefsElement = svg.child( + svgElement, + "defs", + {} + ) as SVGDefsElement; + + const g = svg.createElement("g") as SVGElement; + svgElement.appendChild(g); + + const glow = svg.child(defs, "filter", { + height: "120%", + id: "filterglow", + width: "120%", + x: "-5%", + y: "-5%", + }); + svg.child(glow, "feGaussianBlur", { stdDeviation: "5", result: "glow" }); + const merge = svg.child(glow, "feMerge", {}); + for (let i = 0; i < 3; ++i) { + svg.child(merge, "feMergeNode", { in: "glow" }); + } + + const neopixelglow = svg.child(defs, "filter", { + height: "600%", + id: "neopixelglow", + width: "600%", + x: "-300%", + y: "-300%", + }); + svg.child(neopixelglow, "feGaussianBlur", { + result: "coloredBlur", + stdDeviation: "4.3", + }); + const neopixelmerge = svg.child(neopixelglow, "feMerge", {}); + svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); + svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); + svg.child(neopixelmerge, "feMergeNode", { in: "SourceGraphic" }); + + // Brightness + const neopixelfeComponentTransfer = svg.child( + neopixelglow, + "feComponentTransfer", + {} + ); + svg.child(neopixelfeComponentTransfer, "feFuncR", { + id: "brightnessFilterR", + type: "linear", + slope: brightness, + }); + svg.child(neopixelfeComponentTransfer, "feFuncG", { + id: "brightnessFilterG", + slope: brightness, + type: "linear", + }); + svg.child(neopixelfeComponentTransfer, "feFuncB", { + id: "brightnessFilterB", + slope: brightness, + type: "linear", + }); + + // BTN A+B + const outerBtn = (left: number, top: number, label: string) => { + return makeButton(g, left, top, "BTN_AB"); + }; + + const ab = outerBtn(165, SvgStyle.MB_HEIGHT - 15, "A+B"); + const abtext = svg.child(ab.outer, "text", { + class: "sim-text-outside", + x: SvgStyle.BUTTON_TEXT_BASELINE, + y: SvgStyle.MB_HEIGHT - 18, + }) as SVGTextElement; + abtext.textContent = "A+B"; }; const updateNeopixels = (props: IProps): void => { - for (let i = 0; i < props.pixels.length; i++) { - const led = window.document.getElementById(`NEOPIXEL_${i}`); - if (led) { - setNeopixel(led, props.pixels[i], props.brightness); - } - } + for (let i = 0; i < props.pixels.length; i++) { + const led = window.document.getElementById(`NEOPIXEL_${i}`); + if (led) { + setNeopixel(led, props.pixels[i], props.brightness); + } + } }; const updateRedLED = (propsRedLED: boolean): void => { - const redLED = window.document.getElementById("SERIAL_LED"); - if (redLED) { - redLED.style.fill = propsRedLED - ? SvgStyle.RED_LED_ON - : SvgStyle.RED_LED_OFF; - } + const redLED = window.document.getElementById("SERIAL_LED"); + if (redLED) { + redLED.style.fill = propsRedLED + ? SvgStyle.RED_LED_ON + : SvgStyle.RED_LED_OFF; + } }; const updatePowerLED = (propsPowerLED: boolean): void => { - const powerLED = window.document.getElementById("PWR_LED"); - if (powerLED) { - powerLED.style.fill = propsPowerLED - ? SvgStyle.POWER_LED_ON - : SvgStyle.POWER_LED_OFF; - } + const powerLED = window.document.getElementById("PWR_LED"); + if (powerLED) { + powerLED.style.fill = propsPowerLED + ? SvgStyle.POWER_LED_ON + : SvgStyle.POWER_LED_OFF; + } }; const setNeopixel = ( - led: HTMLElement, - pixValue: number[], - brightness: number + led: HTMLElement, + pixValue: number[], + brightness: number ): void => { - if (isLightOn(pixValue) && brightness > 0) { - // Neopixels style (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) - changeBrightness("brightnessFilterR", brightness); - changeBrightness("brightnessFilterG", brightness); - changeBrightness("brightnessFilterB", brightness); - - let [hue, sat, lum] = SvgStyle.rgbToHsl([ - pixValue[0], - pixValue[1], - pixValue[2], - ]); - const innerLum = Math.max( - lum * SvgStyle.INTENSITY_FACTOR, - SvgStyle.MIN_INNER_LUM - ); - lum = (lum * 90) / 100 + 10; // at least 10% luminosity for the stroke - - led.style.filter = `url(#neopixelglow)`; - led.style.fill = `hsl(${hue}, ${sat}%, ${innerLum}%)`; - led.style.stroke = `hsl(${hue}, ${sat}%, ${Math.min( - lum * 3, - SvgStyle.MAX_STROKE_LUM - )}%)`; - led.style.strokeWidth = `1.5`; - } else { - led.style.fill = SvgStyle.OFF_COLOR; - led.style.filter = `none`; - led.style.stroke = `none`; - } + if (isLightOn(pixValue) && brightness > 0) { + // Neopixels style (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) + changeBrightness("brightnessFilterR", brightness); + changeBrightness("brightnessFilterG", brightness); + changeBrightness("brightnessFilterB", brightness); + + let [hue, sat, lum] = SvgStyle.rgbToHsl([ + pixValue[0], + pixValue[1], + pixValue[2], + ]); + const innerLum = Math.max( + lum * SvgStyle.INTENSITY_FACTOR, + SvgStyle.MIN_INNER_LUM + ); + lum = (lum * 90) / 100 + 10; // at least 10% luminosity for the stroke + + led.style.filter = `url(#neopixelglow)`; + led.style.fill = `hsl(${hue}, ${sat}%, ${innerLum}%)`; + led.style.stroke = `hsl(${hue}, ${sat}%, ${Math.min( + lum * 3, + SvgStyle.MAX_STROKE_LUM + )}%)`; + led.style.strokeWidth = `1.5`; + } else { + led.style.fill = SvgStyle.OFF_COLOR; + led.style.filter = `none`; + led.style.stroke = `none`; + } }; const isLightOn = (pixValue: number[]): boolean => { - return !pixValue.every(val => { - return val === 0; - }); + return !pixValue.every((val) => { + return val === 0; + }); }; const changeBrightness = (filterID: string, brightness: number): void => { - const brightnessFilter: HTMLElement | null = window.document.getElementById( - filterID - ); - if (brightnessFilter) { - brightnessFilter.setAttribute("slope", brightness.toString()); - } + const brightnessFilter: HTMLElement | null = + window.document.getElementById(filterID); + if (brightnessFilter) { + brightnessFilter.setAttribute("slope", brightness.toString()); + } }; const setupButtons = (props: IProps): void => { - const outButtons = ["A_OUTER", "B_OUTER", "AB_OUTER"]; - const inButtons = ["A_INNER", "B_INNER", "AB_INNER"]; - outButtons.forEach(buttonName => { - const button = window.document.getElementById("BTN_" + buttonName); - - if (button) { - setupButton(button, "sim-button-outer", props); - } - }); - inButtons.forEach(buttonName => { - const button = window.document.getElementById("BTN_" + buttonName); - if (button) { - setupButton(button, "sim-button", props); - } - }); + const outButtons = ["A_OUTER", "B_OUTER", "AB_OUTER"]; + const inButtons = ["A_INNER", "B_INNER", "AB_INNER"]; + outButtons.forEach((buttonName) => { + const button = window.document.getElementById("BTN_" + buttonName); + + if (button) { + setupButton(button, "sim-button-outer", props); + } + }); + inButtons.forEach((buttonName) => { + const button = window.document.getElementById("BTN_" + buttonName); + if (button) { + setupButton(button, "sim-button", props); + } + }); }; const setupPins = (props: IProps): void => { - const pins = [ - "PIN_A1", - "PIN_A2", - "PIN_A3", - "PIN_A4", - "PIN_A5", - "PIN_A6", - "PIN_A7", - ]; - pins.forEach(pinName => { - const pin = window.document.getElementById(pinName); - - if (pin) { - const svgPin = (pin as unknown) as SVGElement; - svg.addClass(svgPin, `sim-${pinName}-touch`); - accessibility.makeFocusable(svgPin); - svgPin.onmouseup = e => props.onMouseUp(pin, e); - svgPin.onkeyup = e => props.onKeyEvent(e, false); - svgPin.onmousedown = e => props.onMouseDown(pin, e); - svgPin.onkeydown = e => props.onKeyEvent(e, true); - accessibility.setAria( - svgPin, - "button", - `Touch pin ${pinName.substr(pinName.length - 2)}` - ); - } - }); + const pins = [ + "PIN_A1", + "PIN_A2", + "PIN_A3", + "PIN_A4", + "PIN_A5", + "PIN_A6", + "PIN_A7", + ]; + pins.forEach((pinName) => { + const pin = window.document.getElementById(pinName); + + if (pin) { + const svgPin = pin as unknown as SVGElement; + svg.addClass(svgPin, `sim-${pinName}-touch`); + accessibility.makeFocusable(svgPin); + svgPin.onmouseup = (e) => props.onMouseUp(pin, e); + svgPin.onkeyup = (e) => props.onKeyEvent(e, false); + svgPin.onmousedown = (e) => props.onMouseDown(pin, e); + svgPin.onkeydown = (e) => props.onKeyEvent(e, true); + accessibility.setAria( + svgPin, + "button", + `Touch pin ${pinName.substr(pinName.length - 2)}` + ); + } + }); }; const addButtonLabels = (button: HTMLElement) => { - let label = ""; - if (button.id.match(/AB/) !== null) { - label = "a+b"; - } else if (button.id.match(/A/) !== null) { - label = "a"; - } else if (button.id.match(/B/) !== null) { - label = "b"; - } - accessibility.setAria(button, "button", label); + let label = ""; + if (button.id.match(/AB/) !== null) { + label = "a+b"; + } else if (button.id.match(/A/) !== null) { + label = "a"; + } else if (button.id.match(/B/) !== null) { + label = "b"; + } + accessibility.setAria(button, "button", label); }; const setupButton = (button: HTMLElement, className: string, props: IProps) => { - const svgButton = (button as unknown) as SVGElement; - svg.addClass(svgButton, className); - addButtonLabels(button); - if (className.match(/outer/) !== null) { - accessibility.makeFocusable(svgButton); - } - svgButton.onmousedown = e => props.onMouseDown(button, e); - svgButton.onmouseup = e => props.onMouseUp(button, e); - svgButton.onkeydown = e => { - // ensure that the keydown is enter. - // Or else, if the key is a shortcut instead, - // it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - props.onKeyEvent(e, true); - } - }; - svgButton.onkeyup = e => props.onKeyEvent(e, false); - svgButton.onmouseleave = e => props.onMouseLeave(button, e); + const svgButton = button as unknown as SVGElement; + svg.addClass(svgButton, className); + addButtonLabels(button); + if (className.match(/outer/) !== null) { + accessibility.makeFocusable(svgButton); + } + svgButton.onmousedown = (e) => props.onMouseDown(button, e); + svgButton.onmouseup = (e) => props.onMouseUp(button, e); + svgButton.onkeydown = (e) => { + // ensure that the keydown is enter. + // Or else, if the key is a shortcut instead, + // it may register shortcuts twice + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + props.onKeyEvent(e, true); + } + }; + svgButton.onkeyup = (e) => props.onKeyEvent(e, false); + svgButton.onmouseleave = (e) => props.onMouseLeave(button, e); }; const setupSwitch = (props: IProps): void => { - const switchElement = window.document.getElementById("SWITCH"); - const swInnerElement = window.document.getElementById("SWITCH_INNER"); - const swHousingElement = window.document.getElementById("SWITCH_HOUSING"); - - if (switchElement && swInnerElement && swHousingElement) { - const svgSwitch: SVGElement = (switchElement as unknown) as SVGElement; - const svgSwitchInner: SVGElement = (swInnerElement as unknown) as SVGElement; - const svgSwitchHousing: SVGElement = (swHousingElement as unknown) as SVGElement; - - svg.addClass(svgSwitch, "sim-slide-switch"); - - svgSwitch.onmouseup = e => props.onMouseUp(switchElement, e); - svgSwitchInner.onmouseup = e => props.onMouseUp(swInnerElement, e); - svgSwitchHousing.onmouseup = e => props.onMouseUp(swHousingElement, e); - svgSwitch.onkeyup = e => props.onKeyEvent(e, false); - - accessibility.makeFocusable(svgSwitch); - accessibility.setAria(svgSwitch, "button", "On/Off Switch"); - } + const switchElement = window.document.getElementById("SWITCH"); + const swInnerElement = window.document.getElementById("SWITCH_INNER"); + const swHousingElement = window.document.getElementById("SWITCH_HOUSING"); + + if (switchElement && swInnerElement && swHousingElement) { + const svgSwitch: SVGElement = switchElement as unknown as SVGElement; + const svgSwitchInner: SVGElement = + swInnerElement as unknown as SVGElement; + const svgSwitchHousing: SVGElement = + swHousingElement as unknown as SVGElement; + + svg.addClass(svgSwitch, "sim-slide-switch"); + + svgSwitch.onmouseup = (e) => props.onMouseUp(switchElement, e); + svgSwitchInner.onmouseup = (e) => props.onMouseUp(swInnerElement, e); + svgSwitchHousing.onmouseup = (e) => + props.onMouseUp(swHousingElement, e); + svgSwitch.onkeyup = (e) => props.onKeyEvent(e, false); + + accessibility.makeFocusable(svgSwitch); + accessibility.setAria(svgSwitch, "button", "On/Off Switch"); + } }; export const updateSwitch = (switchState: boolean): void => { - const switchElement = window.document.getElementById("SWITCH"); - const switchInner = (window.document.getElementById( - "SWITCH_INNER" - ) as unknown) as SVGElement; - - if (switchElement && switchInner) { - svg.addClass(switchInner, "sim-slide-switch-inner"); - - if (!switchState) { - svg.addClass(switchInner, "on"); - switchInner.setAttribute("transform", "translate(-5,0)"); - } else { - svg.removeClass(switchInner, "on"); - switchInner.removeAttribute("transform"); - } - switchElement.setAttribute("aria-pressed", switchState.toString()); - } + const switchElement = window.document.getElementById("SWITCH"); + const switchInner = window.document.getElementById( + "SWITCH_INNER" + ) as unknown as SVGElement; + + if (switchElement && switchInner) { + svg.addClass(switchInner, "sim-slide-switch-inner"); + + if (!switchState) { + svg.addClass(switchInner, "on"); + switchInner.setAttribute("transform", "translate(-5,0)"); + } else { + svg.removeClass(switchInner, "on"); + switchInner.removeAttribute("transform"); + } + switchElement.setAttribute("aria-pressed", switchState.toString()); + } }; export const updatePinTouch = (pinState: boolean, id: string): void => { - console.log(`updating ${id} with ${pinState}`); - const pinElement = window.document.getElementById(id); - const pinSvg: SVGElement = (pinElement as unknown) as SVGElement; - - if (pinElement && pinSvg) { - pinElement.setAttribute("aria-pressed", pinState.toString()); - pinState - ? svg.addClass(pinSvg, "pin-pressed") - : svg.removeClass(pinSvg, "pin-pressed"); - } + console.log(`updating ${id} with ${pinState}`); + const pinElement = window.document.getElementById(id); + const pinSvg: SVGElement = pinElement as unknown as SVGElement; + + if (pinElement && pinSvg) { + pinElement.setAttribute("aria-pressed", pinState.toString()); + pinState + ? svg.addClass(pinSvg, "pin-pressed") + : svg.removeClass(pinSvg, "pin-pressed"); + } }; export default CpxImage; diff --git a/Source/view/components/cpx/CpxSimulator.tsx b/Source/view/components/cpx/CpxSimulator.tsx index b0d77f441..7e095043b 100644 --- a/Source/view/components/cpx/CpxSimulator.tsx +++ b/Source/view/components/cpx/CpxSimulator.tsx @@ -13,380 +13,380 @@ import { BUTTON_NEUTRAL, BUTTON_PRESSED } from "./Cpx_svg_style"; import { CpxImage, updatePinTouch, updateSwitch } from "./CpxImage"; interface ICpxState { - pixels: number[][]; - brightness: number; - red_led: boolean; - button_a: boolean; - button_b: boolean; - switch: boolean; - touch: boolean[]; - shake: boolean; + pixels: number[][]; + brightness: number; + red_led: boolean; + button_a: boolean; + button_b: boolean; + switch: boolean; + touch: boolean[]; + shake: boolean; } interface IState { - active_editors: string[]; - running_file: string; - selected_file: string; - cpx: ICpxState; - play_button: boolean; - currently_selected_file: string; + active_editors: string[]; + running_file: string; + selected_file: string; + cpx: ICpxState; + play_button: boolean; + currently_selected_file: string; } const DEFAULT_CPX_STATE: ICpxState = { - brightness: 1.0, - button_a: false, - button_b: false, - pixels: [ - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - ], - red_led: false, - switch: false, - touch: [false, false, false, false, false, false, false], - shake: false, + brightness: 1.0, + button_a: false, + button_b: false, + pixels: [ + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + ], + red_led: false, + switch: false, + touch: [false, false, false, false, false, false, false], + shake: false, }; class Simulator extends React.Component<{}, IState> { - constructor(props: Readonly<{}>) { - super(props); - this.state = { - active_editors: [], - cpx: DEFAULT_CPX_STATE, - play_button: false, - running_file: "", - selected_file: "", - currently_selected_file: "", - }; - - this.handleClick = this.handleClick.bind(this); - this.onKeyEvent = this.onKeyEvent.bind(this); - this.onMouseDown = this.onMouseDown.bind(this); - this.onMouseUp = this.onMouseUp.bind(this); - this.onMouseLeave = this.onMouseLeave.bind(this); - this.togglePlayClick = this.togglePlayClick.bind(this); - this.refreshSimulatorClick = this.refreshSimulatorClick.bind(this); - } - - handleMessage = (event: any): void => { - const message = event.data; // The JSON data our extension sent - if (message.active_device !== DEVICE_LIST_KEY.CPX) { - return; - } - switch (message.command) { - case "reset-state": - console.log("Clearing the state"); - this.setState({ - cpx: DEFAULT_CPX_STATE, - play_button: false, - }); - break; - case "set-state": - console.log( - "Setting the state: " + JSON.stringify(message.state) - ); - this.setState({ - cpx: message.state, - play_button: true, - }); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - }); - break; - case "visible-editors": - console.log( - "Setting active editors", - message.state.activePythonEditors - ); - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - console.log("Setting current file", message.state.running_file); - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } - break; - } - }; - - componentDidMount() { - console.log("Mounted"); - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
-
- -
- -
- ); - } - - protected togglePlayClick() { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - } - - protected refreshSimulatorClick() { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - } - - protected onKeyEvent(event: KeyboardEvent, active: boolean) { - let element; - const target = event.target as SVGElement; - // Guard Clause - if (target === undefined) { - return; - } - - if ([event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER)) { - element = window.document.getElementById(target.id); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_A - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_B - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_AB - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.S) - ) { - element = window.document.getElementById(CONSTANTS.ID_NAME.SWITCH); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } else { - if (event.shiftKey) { - switch (event.code) { - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_ONE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A1 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_TWO: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A2 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_THREE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A3 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FOUR: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A4 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FIVE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A5 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SIX: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A6 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SEVEN: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A7 - ); - break; - } - } - } - if (element) { - event.preventDefault(); - this.handleClick(element, active); - element.focus(); - } - } - protected onMouseDown(button: HTMLElement, event: Event) { - event.preventDefault(); - this.handleClick(button, true); - button.focus(); - } - - protected onMouseUp(button: HTMLElement, event: Event) { - event.preventDefault(); - this.handleClick(button, false); - } - - protected onMouseLeave(button: HTMLElement, event: Event) { - event.preventDefault(); - - if (button.getAttribute("pressed") === "true") { - this.handleClick(button, false); - } - } - - private handleClick(element: HTMLElement, active: boolean) { - let newState; - let message; - if (element.id.includes("BTN")) { - newState = this.handleButtonClick(element, active); - message = "button-press"; - } else if (element.id.includes("SWITCH")) { - newState = this.handleSwitchClick(); - message = "button-press"; - } else if (element.id.includes("PIN")) { - newState = this.handleTouchPinClick(element, active); - message = "sensor-changed"; - } else { - return; - } - - if (newState && message) { - sendMessage(message, newState); - } - } - - private handleButtonClick(button: HTMLElement, active: boolean) { - const ButtonA: boolean = button.id.match(/BTN_A/) !== null; - const ButtonB: boolean = button.id.match(/BTN_B/) !== null; - const ButtonAB: boolean = button.id.match(/BTN_AB/) !== null; - let innerButton; - let newState; - - if (ButtonAB) { - innerButton = window.document.getElementById("BTN_AB_INNER"); - newState = { - button_a: active, - button_b: active, - }; - this.setState({ ...this.state, ...newState }); - } else if (ButtonA) { - innerButton = window.document.getElementById("BTN_A_INNER"); - newState = { - button_a: active, - }; - this.setState({ ...this.state, ...newState }); - } else if (ButtonB) { - innerButton = window.document.getElementById("BTN_B_INNER"); - newState = { - button_b: active, - }; - this.setState({ ...this.state, ...newState }); - } - - if (innerButton) { - innerButton.style.fill = this.getButtonColor(active); - } - - button.setAttribute("pressed", `${active}`); - return newState; - } - - private getButtonColor(pressed: boolean) { - const buttonUps = BUTTON_NEUTRAL; - const buttonDown = BUTTON_PRESSED; - return pressed ? buttonDown : buttonUps; - } - - private handleSwitchClick() { - const switchIsOn = !this.state.cpx.switch; - updateSwitch(switchIsOn); - this.setState({ - ...this.state, - cpx: { ...this.state.cpx, switch: switchIsOn }, - }); - return { switch: switchIsOn }; - } - - private handleTouchPinClick(pin: HTMLElement, active: boolean): any { - let cpxState = this.state.cpx; - const pinIndex = parseInt(pin.id.charAt(pin.id.length - 1)) - 1; - const pinState = cpxState.touch; - pinState[pinIndex] = active; - cpxState = { ...cpxState, touch: pinState }; - this.setState({ ...this.state, ...cpxState }); - updatePinTouch(active, pin.id); - return { touch: pinState }; - } + constructor(props: Readonly<{}>) { + super(props); + this.state = { + active_editors: [], + cpx: DEFAULT_CPX_STATE, + play_button: false, + running_file: "", + selected_file: "", + currently_selected_file: "", + }; + + this.handleClick = this.handleClick.bind(this); + this.onKeyEvent = this.onKeyEvent.bind(this); + this.onMouseDown = this.onMouseDown.bind(this); + this.onMouseUp = this.onMouseUp.bind(this); + this.onMouseLeave = this.onMouseLeave.bind(this); + this.togglePlayClick = this.togglePlayClick.bind(this); + this.refreshSimulatorClick = this.refreshSimulatorClick.bind(this); + } + + handleMessage = (event: any): void => { + const message = event.data; // The JSON data our extension sent + if (message.active_device !== DEVICE_LIST_KEY.CPX) { + return; + } + switch (message.command) { + case "reset-state": + console.log("Clearing the state"); + this.setState({ + cpx: DEFAULT_CPX_STATE, + play_button: false, + }); + break; + case "set-state": + console.log( + "Setting the state: " + JSON.stringify(message.state) + ); + this.setState({ + cpx: message.state, + play_button: true, + }); + break; + case "activate-play": + const newRunningFile = this.state.currently_selected_file; + + this.setState({ + play_button: !this.state.play_button, + running_file: newRunningFile, + }); + break; + case "visible-editors": + console.log( + "Setting active editors", + message.state.activePythonEditors + ); + this.setState({ + active_editors: message.state.activePythonEditors, + }); + break; + case "current-file": + console.log("Setting current file", message.state.running_file); + if (this.state.play_button) { + this.setState({ + currently_selected_file: message.state.running_file, + }); + } else { + this.setState({ + running_file: message.state.running_file, + currently_selected_file: message.state.running_file, + }); + } + break; + } + }; + + componentDidMount() { + console.log("Mounted"); + window.addEventListener("message", this.handleMessage); + } + + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + + render() { + const playStopImage = this.state.play_button ? StopLogo : PlayLogo; + const playStopLabel = this.state.play_button ? "stop" : "play"; + return ( +
+
+ {this.state.running_file && this.state.play_button + ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) + : CONSTANTS.FILES_PLACEHOLDER} +
+
+ +
+ +
+ ); + } + + protected togglePlayClick() { + const button = + window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || + window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { + selected_file: this.state.selected_file, + state: !this.state.play_button, + }); + } + + protected refreshSimulatorClick() { + const button = window.document.getElementById( + CONSTANTS.ID_NAME.REFRESH_BUTTON + ); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); + } + + protected onKeyEvent(event: KeyboardEvent, active: boolean) { + let element; + const target = event.target as SVGElement; + // Guard Clause + if (target === undefined) { + return; + } + + if ([event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER)) { + element = window.document.getElementById(target.id); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) + ) { + element = window.document.getElementById( + CONSTANTS.ID_NAME.BUTTON_A + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) + ) { + element = window.document.getElementById( + CONSTANTS.ID_NAME.BUTTON_B + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) + ) { + element = window.document.getElementById( + CONSTANTS.ID_NAME.BUTTON_AB + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.S) + ) { + element = window.document.getElementById(CONSTANTS.ID_NAME.SWITCH); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { + this.togglePlayClick(); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { + this.refreshSimulatorClick(); + } else { + if (event.shiftKey) { + switch (event.code) { + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_ONE: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A1 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_TWO: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A2 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_THREE: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A3 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FOUR: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A4 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FIVE: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A5 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SIX: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A6 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SEVEN: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A7 + ); + break; + } + } + } + if (element) { + event.preventDefault(); + this.handleClick(element, active); + element.focus(); + } + } + protected onMouseDown(button: HTMLElement, event: Event) { + event.preventDefault(); + this.handleClick(button, true); + button.focus(); + } + + protected onMouseUp(button: HTMLElement, event: Event) { + event.preventDefault(); + this.handleClick(button, false); + } + + protected onMouseLeave(button: HTMLElement, event: Event) { + event.preventDefault(); + + if (button.getAttribute("pressed") === "true") { + this.handleClick(button, false); + } + } + + private handleClick(element: HTMLElement, active: boolean) { + let newState; + let message; + if (element.id.includes("BTN")) { + newState = this.handleButtonClick(element, active); + message = "button-press"; + } else if (element.id.includes("SWITCH")) { + newState = this.handleSwitchClick(); + message = "button-press"; + } else if (element.id.includes("PIN")) { + newState = this.handleTouchPinClick(element, active); + message = "sensor-changed"; + } else { + return; + } + + if (newState && message) { + sendMessage(message, newState); + } + } + + private handleButtonClick(button: HTMLElement, active: boolean) { + const ButtonA: boolean = button.id.match(/BTN_A/) !== null; + const ButtonB: boolean = button.id.match(/BTN_B/) !== null; + const ButtonAB: boolean = button.id.match(/BTN_AB/) !== null; + let innerButton; + let newState; + + if (ButtonAB) { + innerButton = window.document.getElementById("BTN_AB_INNER"); + newState = { + button_a: active, + button_b: active, + }; + this.setState({ ...this.state, ...newState }); + } else if (ButtonA) { + innerButton = window.document.getElementById("BTN_A_INNER"); + newState = { + button_a: active, + }; + this.setState({ ...this.state, ...newState }); + } else if (ButtonB) { + innerButton = window.document.getElementById("BTN_B_INNER"); + newState = { + button_b: active, + }; + this.setState({ ...this.state, ...newState }); + } + + if (innerButton) { + innerButton.style.fill = this.getButtonColor(active); + } + + button.setAttribute("pressed", `${active}`); + return newState; + } + + private getButtonColor(pressed: boolean) { + const buttonUps = BUTTON_NEUTRAL; + const buttonDown = BUTTON_PRESSED; + return pressed ? buttonDown : buttonUps; + } + + private handleSwitchClick() { + const switchIsOn = !this.state.cpx.switch; + updateSwitch(switchIsOn); + this.setState({ + ...this.state, + cpx: { ...this.state.cpx, switch: switchIsOn }, + }); + return { switch: switchIsOn }; + } + + private handleTouchPinClick(pin: HTMLElement, active: boolean): any { + let cpxState = this.state.cpx; + const pinIndex = parseInt(pin.id.charAt(pin.id.length - 1)) - 1; + const pinState = cpxState.touch; + pinState[pinIndex] = active; + cpxState = { ...cpxState, touch: pinState }; + this.setState({ ...this.state, ...cpxState }); + updatePinTouch(active, pin.id); + return { touch: pinState }; + } } export default Simulator; diff --git a/Source/view/components/cpx/Cpx_svg.tsx b/Source/view/components/cpx/Cpx_svg.tsx index 55864d460..0484dfd11 100644 --- a/Source/view/components/cpx/Cpx_svg.tsx +++ b/Source/view/components/cpx/Cpx_svg.tsx @@ -6,2997 +6,2996 @@ import * as React from "react"; export const CPX_SVG = ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); export default CPX_SVG; diff --git a/Source/view/components/cpx/Cpx_svg_style.tsx b/Source/view/components/cpx/Cpx_svg_style.tsx index 4eff14480..c9f9b2c77 100644 --- a/Source/view/components/cpx/Cpx_svg_style.tsx +++ b/Source/view/components/cpx/Cpx_svg_style.tsx @@ -24,45 +24,45 @@ export const POWER_LED_OFF: string = "#FFFFFF"; // Adapted from : https://github.com/microsoft/pxt/blob/master/pxtsim/simlib.ts export function rgbToHsl( - rgb: [number, number, number] + rgb: [number, number, number] ): [number, number, number] { - const [r, g, b] = rgb; - const [r$, g$, b$] = [r / 255, g / 255, b / 255]; - const cMin = Math.min(r$, g$, b$); - const cMax = Math.max(r$, g$, b$); - const cDelta = cMax - cMin; - let h: number = 0, - s: number, - l: number; - const maxAndMin = cMax + cMin; + const [r, g, b] = rgb; + const [r$, g$, b$] = [r / 255, g / 255, b / 255]; + const cMin = Math.min(r$, g$, b$); + const cMax = Math.max(r$, g$, b$); + const cDelta = cMax - cMin; + let h: number = 0, + s: number, + l: number; + const maxAndMin = cMax + cMin; - // Luminosity - l = (maxAndMin / 2) * 100; + // Luminosity + l = (maxAndMin / 2) * 100; - if (cDelta === 0) { - s = 0; - h = 0; - } else { - // Hue - switch (cMax) { - case r$: - h = 60 * (((g$ - b$) / cDelta) % 6); - break; - case g$: - h = 60 * ((b$ - r$) / cDelta + 2); - break; - case b$: - h = 60 * ((r$ - g$) / cDelta + 4); - break; - } + if (cDelta === 0) { + s = 0; + h = 0; + } else { + // Hue + switch (cMax) { + case r$: + h = 60 * (((g$ - b$) / cDelta) % 6); + break; + case g$: + h = 60 * ((b$ - r$) / cDelta + 2); + break; + case b$: + h = 60 * ((r$ - g$) / cDelta + 4); + break; + } - // Saturation - l > 50 - ? (s = 100 * (cDelta / (2 - maxAndMin))) - : (s = 100 * (cDelta / maxAndMin)); - } + // Saturation + l > 50 + ? (s = 100 * (cDelta / (2 - maxAndMin))) + : (s = 100 * (cDelta / maxAndMin)); + } - return [Math.floor(h), Math.floor(s), Math.floor(l)]; + return [Math.floor(h), Math.floor(s), Math.floor(l)]; } export const SVG_STYLE = ` diff --git a/Source/view/components/cpx/Svg_utils.tsx b/Source/view/components/cpx/Svg_utils.tsx index 92836b923..4776c4a0a 100644 --- a/Source/view/components/cpx/Svg_utils.tsx +++ b/Source/view/components/cpx/Svg_utils.tsx @@ -5,94 +5,94 @@ // tslint:disable-next-line: no-namespace namespace svg { - export function addClass(el: SVGElement, cls: string) { - if (el.classList) { - el.classList.add(cls); - } else if (el.className.baseVal.indexOf(cls) < 0) { - el.className.baseVal += " " + cls; - } - } + export function addClass(el: SVGElement, cls: string) { + if (el.classList) { + el.classList.add(cls); + } else if (el.className.baseVal.indexOf(cls) < 0) { + el.className.baseVal += " " + cls; + } + } - export function removeClass(el: SVGElement, cls: string) { - if (el.classList) { - el.classList.remove(cls); - } else { - el.className.baseVal = el.className.baseVal - .replace(cls, "") - .replace(/\s{2,}/, " "); - } - } + export function removeClass(el: SVGElement, cls: string) { + if (el.classList) { + el.classList.remove(cls); + } else { + el.className.baseVal = el.className.baseVal + .replace(cls, "") + .replace(/\s{2,}/, " "); + } + } - export function hydrate(el: SVGElement, props: any) { - for (const k in props) { - if (k == "title") { - svg.title(el, props[k]); - } else { - el.setAttributeNS(null, k, props[k]); - } - } - } + export function hydrate(el: SVGElement, props: any) { + for (const k in props) { + if (k == "title") { + svg.title(el, props[k]); + } else { + el.setAttributeNS(null, k, props[k]); + } + } + } - export function createElement(name: string, props?: any): SVGElement { - const newElement = document.createElementNS( - "http://www.w3.org/2000/svg", - name - ); - if (props) { - svg.hydrate(newElement, props); - } - return newElement; - } + export function createElement(name: string, props?: any): SVGElement { + const newElement = document.createElementNS( + "http://www.w3.org/2000/svg", + name + ); + if (props) { + svg.hydrate(newElement, props); + } + return newElement; + } - export function child( - parent: Element, - name: string, - props?: any - ): SVGElement { - const childElement = svg.createElement(name, props); - parent.appendChild(childElement); - return childElement; - } + export function child( + parent: Element, + name: string, + props?: any + ): SVGElement { + const childElement = svg.createElement(name, props); + parent.appendChild(childElement); + return childElement; + } - export function fill(el: SVGElement, c: string) { - el.style.fill = c; - } + export function fill(el: SVGElement, c: string) { + el.style.fill = c; + } - export function filter(el: SVGElement, c: string) { - el.style.filter = c; - } + export function filter(el: SVGElement, c: string) { + el.style.filter = c; + } - export function fills(els: SVGElement[], c: string) { - els.forEach(el => (el.style.fill = c)); - } + export function fills(els: SVGElement[], c: string) { + els.forEach((el) => (el.style.fill = c)); + } - export function mkTitle(txt: string): SVGTitleElement { - const t = svg.createElement("title") as SVGTitleElement; - t.textContent = txt; - return t; - } + export function mkTitle(txt: string): SVGTitleElement { + const t = svg.createElement("title") as SVGTitleElement; + t.textContent = txt; + return t; + } - export function title(el: SVGElement, txt: string): SVGTitleElement { - const t = mkTitle(txt); - el.appendChild(t); - return t; - } + export function title(el: SVGElement, txt: string): SVGTitleElement { + const t = mkTitle(txt); + el.appendChild(t); + return t; + } - export function setLed( - ledStatus: boolean, - offColor: string, - onColor: string, - ledElement: SVGElement | null, - gradientStopElement: SVGStopElement | null - ) { - if (ledStatus) { - ledElement?.setAttribute("fill", onColor); - gradientStopElement?.setAttribute("stop-opacity", "1"); - } else { - ledElement?.setAttribute("fill", offColor); - gradientStopElement?.setAttribute("stop-opacity", "0"); - } - } + export function setLed( + ledStatus: boolean, + offColor: string, + onColor: string, + ledElement: SVGElement | null, + gradientStopElement: SVGStopElement | null + ) { + if (ledStatus) { + ledElement?.setAttribute("fill", onColor); + gradientStopElement?.setAttribute("stop-opacity", "1"); + } else { + ledElement?.setAttribute("fill", offColor); + gradientStopElement?.setAttribute("stop-opacity", "0"); + } + } } export default svg; diff --git a/Source/view/components/microbit/Microbit.spec.tsx b/Source/view/components/microbit/Microbit.spec.tsx index 386086866..67c62cbc2 100644 --- a/Source/view/components/microbit/Microbit.spec.tsx +++ b/Source/view/components/microbit/Microbit.spec.tsx @@ -5,25 +5,25 @@ import * as testRenderer from "react-test-renderer"; import { Microbit } from "./Microbit"; describe("Microbit component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/components/microbit/Microbit.tsx b/Source/view/components/microbit/Microbit.tsx index e10c0bfb9..bfc78aa28 100644 --- a/Source/view/components/microbit/Microbit.tsx +++ b/Source/view/components/microbit/Microbit.tsx @@ -4,10 +4,10 @@ import * as React from "react"; import { MICROBIT_TOOLBAR_ICON_ID } from "../../components/toolbar/SensorModalUtils"; import { - GESTURES_MICROBIT, - SENSOR_LIST, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, + GESTURES_MICROBIT, + SENSOR_LIST, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_MESSAGES, } from "../../constants"; import "../../styles/Simulator.css"; import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; @@ -17,114 +17,114 @@ import { MicrobitSimulator } from "./MicrobitSimulator"; // Component grouping the functionality for micro:bit functionalities interface IState { - sensors: { [key: string]: number }; - currentSelectedGesture?: string; + sensors: { [key: string]: number }; + currentSelectedGesture?: string; } const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - }, - currentSelectedGesture: GESTURES_MICROBIT[0], + sensors: { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT]: 0, + [SENSOR_LIST.MOTION_X]: 0, + [SENSOR_LIST.MOTION_Y]: 0, + [SENSOR_LIST.MOTION_Z]: 0, + }, + currentSelectedGesture: GESTURES_MICROBIT[0], }; export class Microbit extends React.Component<{}, IState> { - state = DEFAULT_STATE; + state = DEFAULT_STATE; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + handleMessage = (event: any): void => { + const message = event.data; - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; - updateGesture = (event: React.ChangeEvent) => { - this.setState({ currentSelectedGesture: event.target.value }); - }; - sendGesture = (isActive: boolean) => { - if (this.state.currentSelectedGesture) { - if (isActive) { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: this.state.currentSelectedGesture, - }); - } else { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: "", - }); - } - } - }; + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.RESET: + this.setState({ ...DEFAULT_STATE }); + break; + } + }; + render() { + return ( + + + + + ); + } + updateSensor = (sensor: SENSOR_LIST, value: number) => { + this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); + }; + updateGesture = (event: React.ChangeEvent) => { + this.setState({ currentSelectedGesture: event.target.value }); + }; + sendGesture = (isActive: boolean) => { + if (this.state.currentSelectedGesture) { + if (isActive) { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: this.state.currentSelectedGesture, + }); + } else { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: "", + }); + } + } + }; } const MICROBIT_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, - }, - { - image: TOOLBAR_SVG.RED_LED_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LEDS, - }, - { - image: TOOLBAR_SVG.TEMPERATURE_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, - }, - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - }, - { - image: TOOLBAR_SVG.GESTURE_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.GESTURE, - }, - { - image: TOOLBAR_SVG.GPIO_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.GPIO, - }, - { - image: TOOLBAR_SVG.COMPASS_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.COMPASS, - }, - { - image: TOOLBAR_SVG.SPEAKER_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.SOUND, - }, - { - image: TOOLBAR_SVG.WIRELESS_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.WIRELESS, - }, + { + image: TOOLBAR_SVG.PUSH_BUTTON_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, + }, + { + image: TOOLBAR_SVG.RED_LED_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.LEDS, + }, + { + image: TOOLBAR_SVG.TEMPERATURE_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, + }, + { + image: TOOLBAR_SVG.LIGHT_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, + }, + { + image: TOOLBAR_SVG.MOTION_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, + }, + { + image: TOOLBAR_SVG.GESTURE_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.GESTURE, + }, + { + image: TOOLBAR_SVG.GPIO_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.GPIO, + }, + { + image: TOOLBAR_SVG.COMPASS_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.COMPASS, + }, + { + image: TOOLBAR_SVG.SPEAKER_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.SOUND, + }, + { + image: TOOLBAR_SVG.WIRELESS_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.WIRELESS, + }, ]; diff --git a/Source/view/components/microbit/MicrobitImage.tsx b/Source/view/components/microbit/MicrobitImage.tsx index c9e95216a..18515a425 100644 --- a/Source/view/components/microbit/MicrobitImage.tsx +++ b/Source/view/components/microbit/MicrobitImage.tsx @@ -8,159 +8,159 @@ import { ViewStateContext } from "../../context"; import { IRefObject, MicrobitSvg } from "./Microbit_svg"; interface EventTriggers { - onMouseUp: (event: Event, buttonKey: string) => void; - onMouseDown: (event: Event, buttonKey: string) => void; - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; + onMouseUp: (event: Event, buttonKey: string) => void; + onMouseDown: (event: Event, buttonKey: string) => void; + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; } interface IProps { - eventTriggers: EventTriggers; - leds: number[][]; + eventTriggers: EventTriggers; + leds: number[][]; } export enum BUTTONS_KEYS { - BTN_A = "BTN_A", - BTN_B = "BTN_B", - BTN_AB = "BTN_AB", + BTN_A = "BTN_A", + BTN_B = "BTN_B", + BTN_AB = "BTN_AB", } // Displays the SVG and call necessary svg modification. export class MicrobitImage extends React.Component { - private svgRef: React.RefObject = React.createRef(); - constructor(props: IProps) { - super(props); - } - componentDidMount() { - const svgElement = this.svgRef.current; - if (svgElement) { - updateAllLeds(this.props.leds, svgElement.getLeds()); - setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); - this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); - } - } - componentDidUpdate() { - if (this.svgRef.current) { - updateAllLeds(this.props.leds, this.svgRef.current.getLeds()); - if (this.context === VIEW_STATE.PAUSE) { - disableAllButtons(this.svgRef.current.getButtons()); - } else if (this.context === VIEW_STATE.RUNNING) { - setupAllButtons( - this.props.eventTriggers, - this.svgRef.current.getButtons() - ); - } - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.eventTriggers.onKeyEvent(event, true, event.key); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.eventTriggers.onKeyEvent(event, false, event.key); - }; - render() { - return ; - } - public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { - const button = this.svgRef.current?.getButtons()[key].current; - if (button) { - button.focus(); - if (isActive) { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.KEYPRESSED - ); - } else { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.DEFAULT - ); - } - button.setAttribute("pressed", `${isActive}`); - button.setAttribute("aria-pressed", `${isActive}`); - } - } + private svgRef: React.RefObject = React.createRef(); + constructor(props: IProps) { + super(props); + } + componentDidMount() { + const svgElement = this.svgRef.current; + if (svgElement) { + updateAllLeds(this.props.leds, svgElement.getLeds()); + setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); + this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); + } + } + componentDidUpdate() { + if (this.svgRef.current) { + updateAllLeds(this.props.leds, this.svgRef.current.getLeds()); + if (this.context === VIEW_STATE.PAUSE) { + disableAllButtons(this.svgRef.current.getButtons()); + } else if (this.context === VIEW_STATE.RUNNING) { + setupAllButtons( + this.props.eventTriggers, + this.svgRef.current.getButtons() + ); + } + } + } + componentWillUnmount() { + window.document.removeEventListener("keydown", this.handleKeyDown); + window.document.removeEventListener("keyup", this.handleKeyUp); + } + setupKeyPresses = ( + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void + ) => { + window.document.addEventListener("keydown", this.handleKeyDown); + window.document.addEventListener("keyup", this.handleKeyUp); + }; + handleKeyDown = (event: KeyboardEvent) => { + const keyEvents = [event.key, event.code]; + // Don't listen to keydown events for the run button, restart button and enter key + if ( + !( + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) + ) + ) { + this.props.eventTriggers.onKeyEvent(event, true, event.key); + } + }; + handleKeyUp = (event: KeyboardEvent) => { + this.props.eventTriggers.onKeyEvent(event, false, event.key); + }; + render() { + return ; + } + public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { + const button = this.svgRef.current?.getButtons()[key].current; + if (button) { + button.focus(); + if (isActive) { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.KEYPRESSED + ); + } else { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.DEFAULT + ); + } + button.setAttribute("pressed", `${isActive}`); + button.setAttribute("aria-pressed", `${isActive}`); + } + } } MicrobitImage.contextType = ViewStateContext; const setupButton = ( - buttonElement: SVGRectElement, - eventTriggers: EventTriggers, - key: string + buttonElement: SVGRectElement, + eventTriggers: EventTriggers, + key: string ) => { - buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); + buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); - buttonElement.onmousedown = e => { - buttonElement.focus(); - eventTriggers.onMouseDown(e, key); - }; - buttonElement.onmouseup = e => { - eventTriggers.onMouseUp(e, key); - }; + buttonElement.onmousedown = (e) => { + buttonElement.focus(); + eventTriggers.onMouseDown(e, key); + }; + buttonElement.onmouseup = (e) => { + eventTriggers.onMouseUp(e, key); + }; - buttonElement.onkeydown = e => { - // ensure that the keydown is enter, - // or else it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - eventTriggers.onKeyEvent(e, true, key); - } - }; - buttonElement.onkeyup = e => { - eventTriggers.onKeyEvent(e, false, key); - }; + buttonElement.onkeydown = (e) => { + // ensure that the keydown is enter, + // or else it may register shortcuts twice + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + eventTriggers.onKeyEvent(e, true, key); + } + }; + buttonElement.onkeyup = (e) => { + eventTriggers.onKeyEvent(e, false, key); + }; }; const setupAllButtons = ( - eventTriggers: EventTriggers, - buttonRefs: IRefObject + eventTriggers: EventTriggers, + buttonRefs: IRefObject ) => { - for (const [key, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - setupButton(ref.current, eventTriggers, key); - } - } + for (const [key, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + setupButton(ref.current, eventTriggers, key); + } + } }; const disableAllButtons = (buttonRefs: IRefObject) => { - for (const [, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - // to implement - ref.current.onmousedown = null; - ref.current.onmouseup = null; - ref.current.onkeydown = null; - ref.current.onkeyup = null; - ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); - } - } + for (const [, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + // to implement + ref.current.onmousedown = null; + ref.current.onmouseup = null; + ref.current.onkeydown = null; + ref.current.onkeyup = null; + ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); + } + } }; const updateAllLeds = ( - leds: number[][], - ledRefs: Array>> + leds: number[][], + ledRefs: Array>> ) => { - for (let j = 0; j < leds.length; j++) { - for (let i = 0; i < leds[0].length; i++) { - const ledElement = ledRefs[j][i].current; - if (ledElement) { - setupLed(ledElement, leds[i][j]); - } - } - } + for (let j = 0; j < leds.length; j++) { + for (let i = 0; i < leds[0].length; i++) { + const ledElement = ledRefs[j][i].current; + if (ledElement) { + setupLed(ledElement, leds[i][j]); + } + } + } }; const setupLed = (ledElement: SVGRectElement, brightness: number) => { - ledElement.style.opacity = (brightness / 10).toString(); + ledElement.style.opacity = (brightness / 10).toString(); }; diff --git a/Source/view/components/microbit/MicrobitSimulator.tsx b/Source/view/components/microbit/MicrobitSimulator.tsx index 467efcaaa..3ef219459 100644 --- a/Source/view/components/microbit/MicrobitSimulator.tsx +++ b/Source/view/components/microbit/MicrobitSimulator.tsx @@ -1,10 +1,10 @@ import * as React from "react"; import { - AB_BUTTONS_KEYS, - CONSTANTS, - DEVICE_LIST_KEY, - VIEW_STATE, - WEBVIEW_MESSAGES, + AB_BUTTONS_KEYS, + CONSTANTS, + DEVICE_LIST_KEY, + VIEW_STATE, + WEBVIEW_MESSAGES, } from "../../constants"; import { ViewStateContext } from "../../context"; import PlayLogo from "../../svgs/play_svg"; @@ -14,246 +14,246 @@ import ActionBar from "../simulator/ActionBar"; import { BUTTONS_KEYS, MicrobitImage } from "./MicrobitImage"; const DEFAULT_MICROBIT_STATE: IMicrobitState = { - leds: [ - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - ], - buttons: { button_a: false, button_b: false }, + leds: [ + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + ], + buttons: { button_a: false, button_b: false }, }; interface IState { - active_editors: string[]; - running_file?: string; - currently_selected_file: string; - play_button: boolean; - selected_file: string; - microbit: IMicrobitState; - sendGesture?: (isActive: boolean) => void; + active_editors: string[]; + running_file?: string; + currently_selected_file: string; + play_button: boolean; + selected_file: string; + microbit: IMicrobitState; + sendGesture?: (isActive: boolean) => void; } interface IMicrobitState { - leds: number[][]; - buttons: { button_a: boolean; button_b: boolean }; + leds: number[][]; + buttons: { button_a: boolean; button_b: boolean }; } export class MicrobitSimulator extends React.Component { - private imageRef: React.RefObject = React.createRef(); - constructor() { - super({}); - this.state = { - microbit: DEFAULT_MICROBIT_STATE, - play_button: false, - selected_file: "", - active_editors: [], - running_file: undefined, - currently_selected_file: "", - }; - this.onKeyEvent = this.onKeyEvent.bind(this); - } - handleMessage = (event: any): void => { - const message = event.data; + private imageRef: React.RefObject = React.createRef(); + constructor() { + super({}); + this.state = { + microbit: DEFAULT_MICROBIT_STATE, + play_button: false, + selected_file: "", + active_editors: [], + running_file: undefined, + currently_selected_file: "", + }; + this.onKeyEvent = this.onKeyEvent.bind(this); + } + handleMessage = (event: any): void => { + const message = event.data; - if (message.active_device !== DEVICE_LIST_KEY.MICROBIT) { - return; - } + if (message.active_device !== DEVICE_LIST_KEY.MICROBIT) { + return; + } - switch (message.command) { - case "reset-state": - this.setState({ - microbit: DEFAULT_MICROBIT_STATE, - play_button: false, - }); - break; - case "set-state": - this.setState({ - microbit: { - ...this.state.microbit, - leds: message.state.leds, - }, - }); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - }); - break; - case "visible-editors": - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } + switch (message.command) { + case "reset-state": + this.setState({ + microbit: DEFAULT_MICROBIT_STATE, + play_button: false, + }); + break; + case "set-state": + this.setState({ + microbit: { + ...this.state.microbit, + leds: message.state.leds, + }, + }); + break; + case "activate-play": + const newRunningFile = this.state.currently_selected_file; + this.setState({ + play_button: !this.state.play_button, + running_file: newRunningFile, + }); + break; + case "visible-editors": + this.setState({ + active_editors: message.state.activePythonEditors, + }); + break; + case "current-file": + if (this.state.play_button) { + this.setState({ + currently_selected_file: message.state.running_file, + }); + } else { + this.setState({ + running_file: message.state.running_file, + currently_selected_file: message.state.running_file, + }); + } - break; - } - }; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } + break; + } + }; + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } + componentWillUnmount() { + window.removeEventListener("message", this.handleMessage); + } - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
-
- -
- -
- ); - } + render() { + const playStopImage = this.state.play_button ? StopLogo : PlayLogo; + const playStopLabel = this.state.play_button ? "stop" : "play"; + return ( +
+
+ {this.state.running_file && this.state.play_button + ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) + : CONSTANTS.FILES_PLACEHOLDER} +
+
+ +
+ +
+ ); + } - protected togglePlayClick = () => { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - }; + protected togglePlayClick = () => { + const button = + window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || + window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { + selected_file: this.state.selected_file, + state: !this.state.play_button, + }); + }; - protected refreshSimulatorClick = () => { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - }; - protected handleButtonClick = (key: string, isActive: boolean) => { - let newButtonState = this.state.microbit.buttons; - switch (key) { - case AB_BUTTONS_KEYS.BTN_A: - newButtonState.button_a = isActive; - break; - case AB_BUTTONS_KEYS.BTN_B: - newButtonState.button_b = isActive; - break; - case AB_BUTTONS_KEYS.BTN_AB: - newButtonState = { - button_a: isActive, - button_b: isActive, - }; - break; - } - sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); - this.setState({ - microbit: { - ...this.state.microbit, - buttons: newButtonState, - }, - }); - }; + protected refreshSimulatorClick = () => { + const button = window.document.getElementById( + CONSTANTS.ID_NAME.REFRESH_BUTTON + ); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); + }; + protected handleButtonClick = (key: string, isActive: boolean) => { + let newButtonState = this.state.microbit.buttons; + switch (key) { + case AB_BUTTONS_KEYS.BTN_A: + newButtonState.button_a = isActive; + break; + case AB_BUTTONS_KEYS.BTN_B: + newButtonState.button_b = isActive; + break; + case AB_BUTTONS_KEYS.BTN_AB: + newButtonState = { + button_a: isActive, + button_b: isActive, + }; + break; + } + sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); + this.setState({ + microbit: { + ...this.state.microbit, + buttons: newButtonState, + }, + }); + }; - protected onMouseUp = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, false); - }; + protected onMouseUp = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, false); + }; - protected onMouseDown = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, true); - }; + protected onMouseDown = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, true); + }; - protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { - event.stopPropagation(); - if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(key, active); - if (key === BUTTONS_KEYS.BTN_A) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if (key === BUTTONS_KEYS.BTN_B) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if (key === BUTTONS_KEYS.BTN_AB) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); + protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { + event.stopPropagation(); + if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(key, active); + if (key === BUTTONS_KEYS.BTN_A) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active + ); + } else if (key === BUTTONS_KEYS.BTN_B) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active + ); + } else if (key === BUTTONS_KEYS.BTN_AB) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active + ); + } + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } - } + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active + ); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { + this.togglePlayClick(); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { + this.refreshSimulatorClick(); + } + } } MicrobitSimulator.contextType = ViewStateContext; diff --git a/Source/view/components/microbit/Microbit_svg.tsx b/Source/view/components/microbit/Microbit_svg.tsx index 22854c38f..fd2ea1ca5 100644 --- a/Source/view/components/microbit/Microbit_svg.tsx +++ b/Source/view/components/microbit/Microbit_svg.tsx @@ -7,1884 +7,1803 @@ import * as React from "react"; import "../../styles/SimulatorSvg.css"; export interface IRefObject { - [key: string]: React.RefObject; + [key: string]: React.RefObject; } /* tslint:disable */ const N_LED_COLUMN = 5; const N_LED_ROW = 5; export class MicrobitSvg extends React.Component { - constructor(props: Readonly<{}>) { - super(props); - for (let j = 0; j < N_LED_ROW; j++) { - const led_row: React.RefObject[] = []; - for (let i = 0; i < N_LED_COLUMN; i++) { - led_row.push(React.createRef()); - } - this.ledRefs.push(led_row); - } - } - private svgRef: React.RefObject = React.createRef(); + constructor(props: Readonly<{}>) { + super(props); + for (let j = 0; j < N_LED_ROW; j++) { + const led_row: React.RefObject[] = []; + for (let i = 0; i < N_LED_COLUMN; i++) { + led_row.push(React.createRef()); + } + this.ledRefs.push(led_row); + } + } + private svgRef: React.RefObject = React.createRef(); - private buttonRefs: IRefObject = { - BTN_A: React.createRef(), - BTN_B: React.createRef(), - BTN_AB: React.createRef(), - }; + private buttonRefs: IRefObject = { + BTN_A: React.createRef(), + BTN_B: React.createRef(), + BTN_AB: React.createRef(), + }; - private ledRefs: React.RefObject[][] = []; - public getSvgRef(): React.RefObject { - return this.svgRef; - } - public getButtons(): IRefObject { - return this.buttonRefs; - } - public getLeds(): React.RefObject[][] { - return this.ledRefs; - } + private ledRefs: React.RefObject[][] = []; + public getSvgRef(): React.RefObject { + return this.svgRef; + } + public getButtons(): IRefObject { + return this.buttonRefs; + } + public getLeds(): React.RefObject[][] { + return this.ledRefs; + } - render() { - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (0,0) - - - - (1,0) - - - - (2,0) - - - - (3,0) - - - - (4,0) - - - - (0,1) - - - - (1,1) - - - - (2,1) - - - - (3,1) - - - - (4,1) - - - - (0,2) - - - - (1,2) - - - - (2,2) - - - - (3,2) - - - - (4,2) - - - - (0,3) - - - - (1,3) - - - - (2,3) - - - - (3,3) - - - - (4,3) - - - - (0,4) - - - - (1,4) - - - - (2,4) - - - - (3,4) - - - - (4,4) - - - - - - - - - - P0, ANALOG IN - - - P1, ANALOG IN - - - P2, ANALOG IN - - - P3, ANALOG IN, LED Col 1 - - - P4, ANALOG IN, LED Col 2 - - - P5, BUTTON A - - - P6, LED Col 9 - - - P7, LED Col 8 - - - P8 - - - P9, LED Col 7 - - - P10, ANALOG IN, LED Col 3 - - - P11, BUTTON B - - - P12, RESERVED ACCESSIBILITY - - - P13, SPI - SCK - - - P14, SPI - MISO - - - P15, SPI - MOSI - - - P16, SPI - Chip Select - - - P17, +3v3 - - - P18, +3v3 - - - P19, I2C - SCL - - - P20, I2C - SDA - - - GND - - - GND - - - +3v3 - - - GND - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - - - - - - - - - - - - - - -
- ); - } + render() { + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (0,0) + + + + (1,0) + + + + (2,0) + + + + (3,0) + + + + (4,0) + + + + (0,1) + + + + (1,1) + + + + (2,1) + + + + (3,1) + + + + (4,1) + + + + (0,2) + + + + (1,2) + + + + (2,2) + + + + (3,2) + + + + (4,2) + + + + (0,3) + + + + (1,3) + + + + (2,3) + + + + (3,3) + + + + (4,3) + + + + (0,4) + + + + (1,4) + + + + (2,4) + + + + (3,4) + + + + (4,4) + + + + + + + + + + P0, ANALOG IN + + + P1, ANALOG IN + + + P2, ANALOG IN + + + P3, ANALOG IN, LED Col 1 + + + P4, ANALOG IN, LED Col 2 + + + P5, BUTTON A + + + P6, LED Col 9 + + + P7, LED Col 8 + + + P8 + + + P9, LED Col 7 + + + P10, ANALOG IN, LED Col 3 + + + P11, BUTTON B + + + P12, RESERVED ACCESSIBILITY + + + P13, SPI - SCK + + + P14, SPI - MISO + + + P15, SPI - MOSI + + + P16, SPI - Chip Select + + + P17, +3v3 + + + P18, +3v3 + + + P19, I2C - SCL + + + P20, I2C - SDA + + + GND + + + GND + + + +3v3 + + + GND + + + + + + + + + + + + + + + + + + + + + + A+B + + + + + + + + + + + + + + + + + + + + + + + +
+ ); + } } diff --git a/Source/view/components/simulator/ActionBar.tsx b/Source/view/components/simulator/ActionBar.tsx index b760817b8..151d3758a 100644 --- a/Source/view/components/simulator/ActionBar.tsx +++ b/Source/view/components/simulator/ActionBar.tsx @@ -7,42 +7,38 @@ import RefreshLogo from "../../svgs/refresh_svg"; import Button from "../Button"; interface IProps { - onTogglePlay: (event: React.MouseEvent) => void; - onToggleRefresh: (event: React.MouseEvent) => void; - playStopImage: JSX.Element; - playStopLabel: string; + onTogglePlay: (event: React.MouseEvent) => void; + onToggleRefresh: (event: React.MouseEvent) => void; + playStopImage: JSX.Element; + playStopLabel: string; } // Component including the actions done on the Simulator (play/stop, refresh) class ActionBar extends React.Component { - public render() { - const { - onTogglePlay, - onToggleRefresh, - playStopImage, - playStopLabel, - } = this.props; - return ( -
-
- ); - } + public render() { + const { onTogglePlay, onToggleRefresh, playStopImage, playStopLabel } = + this.props; + return ( +
+
+ ); + } } export default ActionBar; diff --git a/Source/view/components/toolbar/GenericSliderComponent.tsx b/Source/view/components/toolbar/GenericSliderComponent.tsx index 747721075..cc46a7930 100644 --- a/Source/view/components/toolbar/GenericSliderComponent.tsx +++ b/Source/view/components/toolbar/GenericSliderComponent.tsx @@ -4,38 +4,38 @@ import { ISensorProps, ISliderProps } from "../../viewUtils"; import InputSlider from "./InputSlider"; interface IProps { - axisProperties: ISensorProps; - axisValues: { - // key is accessed with axisLabel - [key: string]: number; - }; - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void; + axisProperties: ISensorProps; + axisValues: { + // key is accessed with axisLabel + [key: string]: number; + }; + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void; } -export const GenericSliderComponent: React.FC = props => { - return ( -
- {props.axisProperties.sliderProps.map( - (sliderProperties: ISliderProps, index: number) => { - return ( - - -
-
- ); - } - )} -
- ); +export const GenericSliderComponent: React.FC = (props) => { + return ( +
+ {props.axisProperties.sliderProps.map( + (sliderProperties: ISliderProps, index: number) => { + return ( + + +
+
+ ); + } + )} +
+ ); }; diff --git a/Source/view/components/toolbar/Gesture.tsx b/Source/view/components/toolbar/Gesture.tsx index 4cf941f13..cad53ea8b 100644 --- a/Source/view/components/toolbar/Gesture.tsx +++ b/Source/view/components/toolbar/Gesture.tsx @@ -5,67 +5,66 @@ import SensorButton from "./SensorButton"; const GESTURE_BUTTON_MESSAGE = "Send Gesture"; interface IProps { - gestures: string[]; - onSelectGestures?: (event: React.ChangeEvent) => void; - onSendGesture?: (isActive: boolean) => void; + gestures: string[]; + onSelectGestures?: (event: React.ChangeEvent) => void; + onSendGesture?: (isActive: boolean) => void; } export class Gesture extends React.Component { - private sensorButtonRef: React.RefObject = React.createRef(); - render() { - return ( -
- - { - if (this.props.onSendGesture) { - this.props.onSendGesture(true); - } - }} - onMouseUp={() => { - if (this.props.onSendGesture) { - this.props.onSendGesture(false); - } - }} - onKeyDown={this.handleOnKeyDown} - onKeyUp={this.handleOnKeyUp} - type="gesture" - /> -
- ); - } - private handleOnKeyDown = (e: React.KeyboardEvent) => { - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - this.sensorButtonRef!.current!.setButtonClass(true); - if (this.props.onSendGesture) { - this.props.onSendGesture(true); - } - } - }; + private sensorButtonRef: React.RefObject = React.createRef(); + render() { + return ( +
+ + { + if (this.props.onSendGesture) { + this.props.onSendGesture(true); + } + }} + onMouseUp={() => { + if (this.props.onSendGesture) { + this.props.onSendGesture(false); + } + }} + onKeyDown={this.handleOnKeyDown} + onKeyUp={this.handleOnKeyUp} + type="gesture" + /> +
+ ); + } + private handleOnKeyDown = (e: React.KeyboardEvent) => { + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + this.sensorButtonRef!.current!.setButtonClass(true); + if (this.props.onSendGesture) { + this.props.onSendGesture(true); + } + } + }; - private handleOnKeyUp = ( - e: React.KeyboardEvent, - onSendGesture?: (isActive: boolean) => void - ) => { - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - this.sensorButtonRef!.current!.setButtonClass(false); + private handleOnKeyUp = ( + e: React.KeyboardEvent, + onSendGesture?: (isActive: boolean) => void + ) => { + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + this.sensorButtonRef!.current!.setButtonClass(false); - if (this.props.onSendGesture) { - this.props.onSendGesture(false); - } - } - }; + if (this.props.onSendGesture) { + this.props.onSendGesture(false); + } + } + }; } diff --git a/Source/view/components/toolbar/InputSlider.tsx b/Source/view/components/toolbar/InputSlider.tsx index adfbcef60..db78f58d3 100644 --- a/Source/view/components/toolbar/InputSlider.tsx +++ b/Source/view/components/toolbar/InputSlider.tsx @@ -9,122 +9,122 @@ import { sendMessage } from "../../utils/MessageUtils"; import { ISliderProps } from "../../viewUtils"; class InputSlider extends React.Component { - constructor(props: ISliderProps) { - super(props); - this.state = { - value: this.props.value, - }; + constructor(props: ISliderProps) { + super(props); + this.state = { + value: this.props.value, + }; - this.handleOnChange = this.handleOnChange.bind(this); - this.validateRange = this.validateRange.bind(this); - } + this.handleOnChange = this.handleOnChange.bind(this); + this.validateRange = this.validateRange.bind(this); + } - render() { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; + render() { + const isInputDisabled = this.context === VIEW_STATE.PAUSE; - const nbDecimals = - this.props.step.toString().split(".")[1]?.length || 0; - return ( -
- {this.props.axisLabel} - 0 ? 1 : 0}}[0-9]{0,${nbDecimals}}$`} - onKeyUp={this.handleOnChange} - style={{ width: this.getMaximumBoxWidth() + "ch" }} - aria-label={`${this.props.type} sensor input ${this.props.axisLabel}`} - /> - - - {this.props.minValue} - {this.props.maxValue} - - - - {this.props.minLabel} - {this.props.maxLabel} - - -
- ); - } + const nbDecimals = + this.props.step.toString().split(".")[1]?.length || 0; + return ( +
+ {this.props.axisLabel} + 0 ? 1 : 0}}[0-9]{0,${nbDecimals}}$`} + onKeyUp={this.handleOnChange} + style={{ width: this.getMaximumBoxWidth() + "ch" }} + aria-label={`${this.props.type} sensor input ${this.props.axisLabel}`} + /> + + + {this.props.minValue} + {this.props.maxValue} + + + + {this.props.minLabel} + {this.props.maxLabel} + + +
+ ); + } - private getMaximumBoxWidth = () => { - return ( - Math.max( - this.props.minValue.toString().length, - this.props.maxValue.toString().length - ) + 2 - ); - }; + private getMaximumBoxWidth = () => { + return ( + Math.max( + this.props.minValue.toString().length, + this.props.maxValue.toString().length + ) + 2 + ); + }; - private handleOnChange = (event: any) => { - const validatedValue = this.validateRange(this.updateValue(event)); - const newSensorState = this.writeMessage(validatedValue); - if (newSensorState) { - sendMessage(WEBVIEW_MESSAGES.SENSOR_CHANGED, newSensorState); - } - }; + private handleOnChange = (event: any) => { + const validatedValue = this.validateRange(this.updateValue(event)); + const newSensorState = this.writeMessage(validatedValue); + if (newSensorState) { + sendMessage(WEBVIEW_MESSAGES.SENSOR_CHANGED, newSensorState); + } + }; - private writeMessage = (valueTowrite: number) => { - let value = valueTowrite; - if (value > this.props.maxValue || value < this.props.minValue) { - value = parseInt(this.state.value, 10); - } + private writeMessage = (valueTowrite: number) => { + let value = valueTowrite; + if (value > this.props.maxValue || value < this.props.minValue) { + value = parseInt(this.state.value, 10); + } - return this.props.type && this.state.value !== undefined - ? { [this.props.type]: value } - : undefined; - }; + return this.props.type && this.state.value !== undefined + ? { [this.props.type]: value } + : undefined; + }; - private updateValue = (event: any) => { - const newValue = event.target.validity.valid - ? event.target.value - : this.state.value; - if (this.props.onUpdateValue) { - this.props.onUpdateValue(this.props.type as SENSOR_LIST, newValue); - } - return newValue; - }; + private updateValue = (event: any) => { + const newValue = event.target.validity.valid + ? event.target.value + : this.state.value; + if (this.props.onUpdateValue) { + this.props.onUpdateValue(this.props.type as SENSOR_LIST, newValue); + } + return newValue; + }; - private sendTelemetry = () => { - sendMessage(WEBVIEW_MESSAGES.SLIDER_TELEMETRY, this.props.type); - }; + private sendTelemetry = () => { + sendMessage(WEBVIEW_MESSAGES.SLIDER_TELEMETRY, this.props.type); + }; - private validateRange = (valueString: string) => { - let valueInt = parseFloat(valueString); - if (valueInt < this.props.minValue) { - valueInt = this.props.minValue; - this.setState({ value: valueInt }); - } else if (valueInt > this.props.maxValue) { - valueInt = this.props.maxValue; - this.setState({ value: valueInt }); - } - return valueInt; - }; + private validateRange = (valueString: string) => { + let valueInt = parseFloat(valueString); + if (valueInt < this.props.minValue) { + valueInt = this.props.minValue; + this.setState({ value: valueInt }); + } else if (valueInt > this.props.maxValue) { + valueInt = this.props.maxValue; + this.setState({ value: valueInt }); + } + return valueInt; + }; } InputSlider.contextType = ViewStateContext; diff --git a/Source/view/components/toolbar/SensorButton.tsx b/Source/view/components/toolbar/SensorButton.tsx index b50759bd4..efd22eb96 100644 --- a/Source/view/components/toolbar/SensorButton.tsx +++ b/Source/view/components/toolbar/SensorButton.tsx @@ -8,39 +8,38 @@ import "../../styles/SensorButton.css"; import { ISensorButtonProps } from "../../viewUtils"; class SensorButton extends React.Component { - private buttonRef: React.RefObject = React.createRef(); + private buttonRef: React.RefObject = React.createRef(); - public setButtonClass = (isActive: boolean) => { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; + public setButtonClass = (isActive: boolean) => { + const isInputDisabled = this.context === VIEW_STATE.PAUSE; - if (isActive && !isInputDisabled) { - this.buttonRef.current?.setAttribute( - "class", - "sensor-button active-button" - ); - } else if (this.buttonRef.current) { - this.buttonRef!.current!.setAttribute("class", "sensor-button"); - } - }; - render() { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; + if (isActive && !isInputDisabled) { + this.buttonRef.current?.setAttribute( + "class", + "sensor-button active-button" + ); + } else if (this.buttonRef.current) { + this.buttonRef!.current!.setAttribute("class", "sensor-button"); + } + }; + render() { + const isInputDisabled = this.context === VIEW_STATE.PAUSE; - return ( - - ); - } + return ( + + ); + } } SensorButton.contextType = ViewStateContext; export default SensorButton; diff --git a/Source/view/components/toolbar/SensorModalUtils.tsx b/Source/view/components/toolbar/SensorModalUtils.tsx index c7ea53f85..57a491960 100644 --- a/Source/view/components/toolbar/SensorModalUtils.tsx +++ b/Source/view/components/toolbar/SensorModalUtils.tsx @@ -8,169 +8,167 @@ import * as CPX_MODAL from "./cpx/CpxModalContent"; import * as MICROBIT_MODAL from "./microbit/MicrobitModalContent"; export const TRY_IT_MAKE_CODE = ( - + ); export const FEATURE_REQUEST_ON_GITHUB = ( - + ); export const TOOLBAR_ICON_LABEL = { - GPIO: "GPIO", - IR: "IR", - LEFT_EDGE: "left-edge", - LIGHT: "Light sensor", - MOTION: "Motion Sensor", - NEO_PIXEL: "Neo Pixels", - PUSH_BUTTON: "Push Button", - RED_LED: "Red LED", - RIGHT_EDGE: "right-edge", - SOUND: "Sound Sensor", - SPEAKER: "Speaker", - SWITCH: "Switch", - TAG_INPUT: "Tag Input", - TAG_OUTPUT: "Tag Output", - TEMPERATURE: "Temperature Sensor", - WIRELESS: "Bluetooth and Radio", + GPIO: "GPIO", + IR: "IR", + LEFT_EDGE: "left-edge", + LIGHT: "Light sensor", + MOTION: "Motion Sensor", + NEO_PIXEL: "Neo Pixels", + PUSH_BUTTON: "Push Button", + RED_LED: "Red LED", + RIGHT_EDGE: "right-edge", + SOUND: "Sound Sensor", + SPEAKER: "Speaker", + SWITCH: "Switch", + TAG_INPUT: "Tag Input", + TAG_OUTPUT: "Tag Output", + TEMPERATURE: "Temperature Sensor", + WIRELESS: "Bluetooth and Radio", }; export const CPX_TOOLBAR_ICON_ID = { - GPIO: "toolbar-gpio", - IR: "toolbar-ir-sensor", - LEFT_EDGE: "left-edge", - LIGHT: "toolbar-light-sensor", - MOTION: "toolbar-motion-sensor", - NEO_PIXEL: "toolbar-neo-pixels", - PUSH_BUTTON: "toolbar-a-b-push", - RED_LED: "toolbar-red-led", - RIGHT_EDGE: "right-edge", - SOUND: "toolbar-sound-sensor", - SPEAKER: "toolbar-speaker", - SWITCH: "toolbar-slider-switch", - TEMPERATURE: "toolbar-temperature-sensor", + GPIO: "toolbar-gpio", + IR: "toolbar-ir-sensor", + LEFT_EDGE: "left-edge", + LIGHT: "toolbar-light-sensor", + MOTION: "toolbar-motion-sensor", + NEO_PIXEL: "toolbar-neo-pixels", + PUSH_BUTTON: "toolbar-a-b-push", + RED_LED: "toolbar-red-led", + RIGHT_EDGE: "right-edge", + SOUND: "toolbar-sound-sensor", + SPEAKER: "toolbar-speaker", + SWITCH: "toolbar-slider-switch", + TEMPERATURE: "toolbar-temperature-sensor", }; export const MICROBIT_TOOLBAR_ICON_ID = { - TEMPERATURE: "toolbar-microbit-temperature-sensor", - LIGHT: "toolbar-microbit-light-sensor", - ACCELEROMETER: "toolbar-accelerometer-sensor", - LEDS: "toolbar-microbit-led", - PUSH_BUTTON: "toolbar-microbit-a-b-push", - GPIO: "toolbar-gpio", - SOUND: "toolbar-microbit-sound", - WIRELESS: "toolbar-microbit-wireless", - GESTURE: "toolbar-microbit-gesture-sensor", - COMPASS: "toolbar-microbit-compass-sensor", + TEMPERATURE: "toolbar-microbit-temperature-sensor", + LIGHT: "toolbar-microbit-light-sensor", + ACCELEROMETER: "toolbar-accelerometer-sensor", + LEDS: "toolbar-microbit-led", + PUSH_BUTTON: "toolbar-microbit-a-b-push", + GPIO: "toolbar-gpio", + SOUND: "toolbar-microbit-sound", + WIRELESS: "toolbar-microbit-wireless", + GESTURE: "toolbar-microbit-gesture-sensor", + COMPASS: "toolbar-microbit-compass-sensor", }; export const CLUE_TOOLBAR_ICON_ID = { - TEMPERATURE: "toolbar-clue-temperature-sensor", - LIGHT: "toolbar-clue-light-sensor", - ACCELEROMETER: "toolbar-clue-accelerometer-sensor", - LEDS: "toolbar-clue-led", - PUSH_BUTTON: "toolbar-clue-a-b-push", - GPIO: "toolbar-clue-gpio", - SPEAKER: "toolbar-speaker", - SOUND: "toolbar-clue-sound-sensor", - PRESSURE: "toolbar-clue-pressure-sensor", - HUMIDITY: "toolbar-clue-humidity-sensor", - GESTURE: "toolbar-clue-gesture-sensor", - PROXIMITY: "toolbar-clue-proximity-sensor", - BLUETOOTH: "toolbar-clue-bluetooth", - MAGNETOSCOPE: "toolbar-clue-magnet-sensor", - GYROSCOPE: "toolbar-clue-gyroscope-sensor", + TEMPERATURE: "toolbar-clue-temperature-sensor", + LIGHT: "toolbar-clue-light-sensor", + ACCELEROMETER: "toolbar-clue-accelerometer-sensor", + LEDS: "toolbar-clue-led", + PUSH_BUTTON: "toolbar-clue-a-b-push", + GPIO: "toolbar-clue-gpio", + SPEAKER: "toolbar-speaker", + SOUND: "toolbar-clue-sound-sensor", + PRESSURE: "toolbar-clue-pressure-sensor", + HUMIDITY: "toolbar-clue-humidity-sensor", + GESTURE: "toolbar-clue-gesture-sensor", + PROXIMITY: "toolbar-clue-proximity-sensor", + BLUETOOTH: "toolbar-clue-bluetooth", + MAGNETOSCOPE: "toolbar-clue-magnet-sensor", + GYROSCOPE: "toolbar-clue-gyroscope-sensor", }; export interface IModalContent { - components: any; - descriptionText: string; - descriptionTitle: string; - id: string; - tagInput: any; - tagOutput: any; - tryItDescription: string; + components: any; + descriptionText: string; + descriptionTitle: string; + id: string; + tagInput: any; + tagOutput: any; + tryItDescription: string; } export const DEFAULT_MODAL_CONTENT: IModalContent = { - descriptionTitle: "default", - tagInput: undefined, - tagOutput: undefined, - descriptionText: "none", - tryItDescription: "none", - components: undefined, - id: "none", + descriptionTitle: "default", + tagInput: undefined, + tagOutput: undefined, + descriptionText: "none", + tryItDescription: "none", + components: undefined, + id: "none", }; export const LABEL_TO_MODAL_CONTENT_CONSTRUCTOR = new Map([ - [CPX_TOOLBAR_ICON_ID.GPIO, CPX_MODAL.GPIO_CONTENT], - [CPX_TOOLBAR_ICON_ID.IR, CPX_MODAL.IR_CONTENT], - [CPX_TOOLBAR_ICON_ID.LIGHT, CPX_MODAL.LIGHT_CONTENT], - [CPX_TOOLBAR_ICON_ID.MOTION, CPX_MODAL.MOTION_CONTENT], - [CPX_TOOLBAR_ICON_ID.NEO_PIXEL, CPX_MODAL.NEOP_CONTENT], - [CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, CPX_MODAL.PUSHB_CONTENT], - [CPX_TOOLBAR_ICON_ID.RED_LED, CPX_MODAL.RED_LED_CONTENT], - [CPX_TOOLBAR_ICON_ID.SOUND, CPX_MODAL.SOUND_CONTENT], - [CPX_TOOLBAR_ICON_ID.SPEAKER, CPX_MODAL.SPEAKER_CONTENT], - [CPX_TOOLBAR_ICON_ID.SWITCH, CPX_MODAL.SWITCH_CONTENT], - [CPX_TOOLBAR_ICON_ID.TEMPERATURE, CPX_MODAL.TEMPERATURE_CONTENT], - [ - MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - MICROBIT_MODAL.ACCELEROMETER_CONTENT, - ], - [MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, MICROBIT_MODAL.TEMPERATURE_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.LIGHT, MICROBIT_MODAL.LIGHT_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.LEDS, MICROBIT_MODAL.LED_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, MICROBIT_MODAL.BUTTON_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.GPIO, MICROBIT_MODAL.GPIO_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.SOUND, MICROBIT_MODAL.SOUND_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.WIRELESS, MICROBIT_MODAL.WIRELESS_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], - [CLUE_TOOLBAR_ICON_ID.TEMPERATURE, CLUE_MODAL.TEMPERATURE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, CLUE_MODAL.BUTTON_CONTENT], - [CLUE_TOOLBAR_ICON_ID.GPIO, CLUE_MODAL.GPIO_CONTENT], - [CLUE_TOOLBAR_ICON_ID.LIGHT, CLUE_MODAL.LIGHT_CONTENT], - [CLUE_TOOLBAR_ICON_ID.LEDS, CLUE_MODAL.LED_CONTENT], - [CLUE_TOOLBAR_ICON_ID.SOUND, CLUE_MODAL.SOUND_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PRESSURE, CLUE_MODAL.PRESSURE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.HUMIDITY, CLUE_MODAL.HUMIDITY_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PROXIMITY, CLUE_MODAL.PROXIMITY_CONTENT], - [CLUE_TOOLBAR_ICON_ID.BLUETOOTH, CLUE_MODAL.BLUETOOTH_CONTENT], - [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.SPEAKER, CLUE_MODAL.SPEAKER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.GYROSCOPE, CLUE_MODAL.GYROSCOPE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, CLUE_MODAL.MAGNETOSCOPE_CONTENT], + [CPX_TOOLBAR_ICON_ID.GPIO, CPX_MODAL.GPIO_CONTENT], + [CPX_TOOLBAR_ICON_ID.IR, CPX_MODAL.IR_CONTENT], + [CPX_TOOLBAR_ICON_ID.LIGHT, CPX_MODAL.LIGHT_CONTENT], + [CPX_TOOLBAR_ICON_ID.MOTION, CPX_MODAL.MOTION_CONTENT], + [CPX_TOOLBAR_ICON_ID.NEO_PIXEL, CPX_MODAL.NEOP_CONTENT], + [CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, CPX_MODAL.PUSHB_CONTENT], + [CPX_TOOLBAR_ICON_ID.RED_LED, CPX_MODAL.RED_LED_CONTENT], + [CPX_TOOLBAR_ICON_ID.SOUND, CPX_MODAL.SOUND_CONTENT], + [CPX_TOOLBAR_ICON_ID.SPEAKER, CPX_MODAL.SPEAKER_CONTENT], + [CPX_TOOLBAR_ICON_ID.SWITCH, CPX_MODAL.SWITCH_CONTENT], + [CPX_TOOLBAR_ICON_ID.TEMPERATURE, CPX_MODAL.TEMPERATURE_CONTENT], + [ + MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, + MICROBIT_MODAL.ACCELEROMETER_CONTENT, + ], + [MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, MICROBIT_MODAL.TEMPERATURE_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.LIGHT, MICROBIT_MODAL.LIGHT_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.LEDS, MICROBIT_MODAL.LED_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, MICROBIT_MODAL.BUTTON_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.GPIO, MICROBIT_MODAL.GPIO_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.SOUND, MICROBIT_MODAL.SOUND_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.WIRELESS, MICROBIT_MODAL.WIRELESS_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], + [CLUE_TOOLBAR_ICON_ID.TEMPERATURE, CLUE_MODAL.TEMPERATURE_CONTENT], + [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], + [CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, CLUE_MODAL.BUTTON_CONTENT], + [CLUE_TOOLBAR_ICON_ID.GPIO, CLUE_MODAL.GPIO_CONTENT], + [CLUE_TOOLBAR_ICON_ID.LIGHT, CLUE_MODAL.LIGHT_CONTENT], + [CLUE_TOOLBAR_ICON_ID.LEDS, CLUE_MODAL.LED_CONTENT], + [CLUE_TOOLBAR_ICON_ID.SOUND, CLUE_MODAL.SOUND_CONTENT], + [CLUE_TOOLBAR_ICON_ID.PRESSURE, CLUE_MODAL.PRESSURE_CONTENT], + [CLUE_TOOLBAR_ICON_ID.HUMIDITY, CLUE_MODAL.HUMIDITY_CONTENT], + [CLUE_TOOLBAR_ICON_ID.PROXIMITY, CLUE_MODAL.PROXIMITY_CONTENT], + [CLUE_TOOLBAR_ICON_ID.BLUETOOTH, CLUE_MODAL.BLUETOOTH_CONTENT], + [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], + [CLUE_TOOLBAR_ICON_ID.SPEAKER, CLUE_MODAL.SPEAKER_CONTENT], + [CLUE_TOOLBAR_ICON_ID.GYROSCOPE, CLUE_MODAL.GYROSCOPE_CONTENT], + [CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, CLUE_MODAL.MAGNETOSCOPE_CONTENT], ]); export const getModalContent = ( - label: string, - onUpdateValue: (onUpdateValue: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number }, - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void + label: string, + onUpdateValue: (onUpdateValue: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, + onSelectGestures?: (event: React.ChangeEvent) => void, + sendGesture?: (isActive: boolean) => void ) => { - if (label === CLUE_TOOLBAR_ICON_ID.GESTURE) { - return CLUE_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); - } else if (label === MICROBIT_TOOLBAR_ICON_ID.GESTURE) { - return MICROBIT_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); - } - const modalContentConstructor = LABEL_TO_MODAL_CONTENT_CONSTRUCTOR.get( - label - ); - if (modalContentConstructor) { - return modalContentConstructor(onUpdateValue, sensorValues); - } else { - return; - } + if (label === CLUE_TOOLBAR_ICON_ID.GESTURE) { + return CLUE_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); + } else if (label === MICROBIT_TOOLBAR_ICON_ID.GESTURE) { + return MICROBIT_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); + } + const modalContentConstructor = + LABEL_TO_MODAL_CONTENT_CONSTRUCTOR.get(label); + if (modalContentConstructor) { + return modalContentConstructor(onUpdateValue, sensorValues); + } else { + return; + } }; diff --git a/Source/view/components/toolbar/ToolBar.tsx b/Source/view/components/toolbar/ToolBar.tsx index a2a3ee1a2..9bdd48ae5 100644 --- a/Source/view/components/toolbar/ToolBar.tsx +++ b/Source/view/components/toolbar/ToolBar.tsx @@ -5,217 +5,215 @@ import { Callout, TooltipHost } from "office-ui-fabric-react"; import { IconButton } from "office-ui-fabric-react"; import * as React from "react"; import { - FormattedMessage, - injectIntl, - WrappedComponentProps, + FormattedMessage, + injectIntl, + WrappedComponentProps, } from "react-intl"; import { SENSOR_LIST } from "../../constants"; import "../../styles/ToolBar.css"; import Button from "../Button"; import { - DEFAULT_MODAL_CONTENT, - getModalContent, - IModalContent, + DEFAULT_MODAL_CONTENT, + getModalContent, + IModalContent, } from "./SensorModalUtils"; interface IToolbarState { - currentOpenedId: string; - showModal: boolean; - isDescriptionVisible: boolean; + currentOpenedId: string; + showModal: boolean; + isDescriptionVisible: boolean; } interface IProps extends WrappedComponentProps { - buttonList: Array<{ - label: any; - image: any; - }>; - onUpdateSensor: (sensor: SENSOR_LIST, value: number) => void; - sensorValues: { [key: string]: number }; - onSelectGesture?: (event: React.ChangeEvent) => void; - sendGesture?: (isActive: boolean) => void; + buttonList: Array<{ + label: any; + image: any; + }>; + onUpdateSensor: (sensor: SENSOR_LIST, value: number) => void; + sensorValues: { [key: string]: number }; + onSelectGesture?: (event: React.ChangeEvent) => void; + sendGesture?: (isActive: boolean) => void; } class ToolBar extends React.Component { - private readonly TOOLBAR_BUTTON_WIDTH: number = 32; - - constructor(props: IProps) { - super(props); - initializeIcons(); - this.state = { - currentOpenedId: "", - isDescriptionVisible: false, - showModal: false, - }; - } - - public render() { - const { buttonList } = this.props; - return ( -
-
-
- {buttonList.map( - (currrentButton: any, index: number) => { - return ( - ( - - ), - }} - key={index} - > -
- {this.getIconModal()} -
-
- ); - } - - private handleOnClick = ( - event: React.MouseEvent, - label: string - ) => { - if ( - !this.state.showModal && - this.state.currentOpenedId === "" && - this.state.currentOpenedId !== label - ) { - this.openModal(label); - } else { - this.closeCurrentModal(); - if (this.state.currentOpenedId !== label) { - this.openModal(label); - } - } - }; - - private changePressedState(id: string, pressed: boolean) { - const elt = window.document.getElementById(`${id}-button`); - if (elt) { - pressed - ? elt.classList.add("button-pressed") - : elt.classList.remove("button-pressed"); - } - } - private closeCurrentModal = () => { - this.changePressedState(this.state.currentOpenedId, false); - this.setState({ - currentOpenedId: "", - showModal: false, - }); - }; - - private openModal = (label: string) => { - this.setState({ - currentOpenedId: label, - showModal: true, - }); - this.changePressedState(label, true); - }; - - private onShowDescriptionClicked = (): void => { - this.setState({ - isDescriptionVisible: !this.state.isDescriptionVisible, - }); - }; - - private onDescriptionDismiss = (): void => { - this.setState({ - isDescriptionVisible: false, - }); - }; - - private getIconModal() { - if ( - !this.state.showModal || - !getModalContent( - this.state.currentOpenedId, - this.props.onUpdateSensor, - this.props.sensorValues, - this.props.onSelectGesture, - this.props.sendGesture - ) - ) { - return null; - } - - const content = getModalContent( - this.state.currentOpenedId, - this.props.onUpdateSensor, - this.props.sensorValues, - this.props.onSelectGesture, - this.props.sendGesture - ) as IModalContent; - - const components = content - ? content.components - : DEFAULT_MODAL_CONTENT.components; - - return ( -
-
- - - {content.tagInput} - {content.tagOutput} - - -
-
- {this.state.isDescriptionVisible && ( - -
- -
-
- )} -
-
- - - -
- -
{components}
-
-
- ); - } + private readonly TOOLBAR_BUTTON_WIDTH: number = 32; + + constructor(props: IProps) { + super(props); + initializeIcons(); + this.state = { + currentOpenedId: "", + isDescriptionVisible: false, + showModal: false, + }; + } + + public render() { + const { buttonList } = this.props; + return ( +
+
+
+ {buttonList.map( + (currrentButton: any, index: number) => { + return ( + ( + + ), + }} + key={index}> +
+ {this.getIconModal()} +
+
+ ); + } + + private handleOnClick = ( + event: React.MouseEvent, + label: string + ) => { + if ( + !this.state.showModal && + this.state.currentOpenedId === "" && + this.state.currentOpenedId !== label + ) { + this.openModal(label); + } else { + this.closeCurrentModal(); + if (this.state.currentOpenedId !== label) { + this.openModal(label); + } + } + }; + + private changePressedState(id: string, pressed: boolean) { + const elt = window.document.getElementById(`${id}-button`); + if (elt) { + pressed + ? elt.classList.add("button-pressed") + : elt.classList.remove("button-pressed"); + } + } + private closeCurrentModal = () => { + this.changePressedState(this.state.currentOpenedId, false); + this.setState({ + currentOpenedId: "", + showModal: false, + }); + }; + + private openModal = (label: string) => { + this.setState({ + currentOpenedId: label, + showModal: true, + }); + this.changePressedState(label, true); + }; + + private onShowDescriptionClicked = (): void => { + this.setState({ + isDescriptionVisible: !this.state.isDescriptionVisible, + }); + }; + + private onDescriptionDismiss = (): void => { + this.setState({ + isDescriptionVisible: false, + }); + }; + + private getIconModal() { + if ( + !this.state.showModal || + !getModalContent( + this.state.currentOpenedId, + this.props.onUpdateSensor, + this.props.sensorValues, + this.props.onSelectGesture, + this.props.sendGesture + ) + ) { + return null; + } + + const content = getModalContent( + this.state.currentOpenedId, + this.props.onUpdateSensor, + this.props.sensorValues, + this.props.onSelectGesture, + this.props.sendGesture + ) as IModalContent; + + const components = content + ? content.components + : DEFAULT_MODAL_CONTENT.components; + + return ( +
+
+ + + {content.tagInput} + {content.tagOutput} + + +
+
+ {this.state.isDescriptionVisible && ( + +
+ +
+
+ )} +
+
+ + + +
+ +
{components}
+
+
+ ); + } } export default injectIntl(ToolBar); diff --git a/Source/view/components/toolbar/Toolbar.spec.tsx b/Source/view/components/toolbar/Toolbar.spec.tsx index 7598ff1c0..cc939e108 100644 --- a/Source/view/components/toolbar/Toolbar.spec.tsx +++ b/Source/view/components/toolbar/Toolbar.spec.tsx @@ -8,50 +8,50 @@ import { MICROBIT_TOOLBAR_ICON_ID } from "./SensorModalUtils"; import Toolbar from "./ToolBar"; const MOCK_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - }, + { + image: TOOLBAR_SVG.LIGHT_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, + }, + { + image: TOOLBAR_SVG.MOTION_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, + }, ]; const mockUpdateSensors = () => { - return; + return; }; const mockInitialValues = { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT]: 0, }; describe("Toolbar component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/constants.ts b/Source/view/constants.ts index 56dda92af..2503ff43c 100644 --- a/Source/view/constants.ts +++ b/Source/view/constants.ts @@ -3,150 +3,150 @@ // Key events export const CONSTANTS = { - CURRENTLY_RUNNING: (file: string) => { - return `Currently running: ${file}`; - }, - DEVICE_NAME: { - CPX: "CPX", - MICROBIT: "micro:bit", - }, - ID_NAME: { - BUTTON_A: "BTN_A_OUTER", - BUTTON_AB: "BTN_AB_OUTER", - BUTTON_B: "BTN_B_OUTER", - PIN_A1: "PIN_A1", - PIN_A2: "PIN_A2", - PIN_A3: "PIN_A3", - PIN_A4: "PIN_A4", - PIN_A5: "PIN_A5", - PIN_A6: "PIN_A6", - PIN_A7: "PIN_A7", - PLAY_BUTTON: "play-button", - REFRESH_BUTTON: "refresh-button", - STOP_BUTTON: "stop-button", - SWITCH: "SWITCH", - }, - KEYBOARD_KEYS: { - A: "KeyA", - B: "KeyB", - C: "KeyC", - CAPITAL_R: "R", - CAPITAL_F: "F", - ENTER: "Enter", - S: "KeyS", - NUMERIC_ONE: "Digit1", - NUMERIC_TWO: "Digit2", - NUMERIC_THREE: "Digit3", - NUMERIC_FOUR: "Digit4", - NUMERIC_FIVE: "Digit5", - NUMERIC_SIX: "Digit6", - NUMERIC_SEVEN: "Digit7", - }, - FILES_PLACEHOLDER: - "The simulator will run the .py file you have focused on.", - SIMULATOR_BUTTON_WIDTH: 60, - TOOLBAR_INFO: `Explore what's on the board:`, - LED_TINT_FACTOR: 0.5, + CURRENTLY_RUNNING: (file: string) => { + return `Currently running: ${file}`; + }, + DEVICE_NAME: { + CPX: "CPX", + MICROBIT: "micro:bit", + }, + ID_NAME: { + BUTTON_A: "BTN_A_OUTER", + BUTTON_AB: "BTN_AB_OUTER", + BUTTON_B: "BTN_B_OUTER", + PIN_A1: "PIN_A1", + PIN_A2: "PIN_A2", + PIN_A3: "PIN_A3", + PIN_A4: "PIN_A4", + PIN_A5: "PIN_A5", + PIN_A6: "PIN_A6", + PIN_A7: "PIN_A7", + PLAY_BUTTON: "play-button", + REFRESH_BUTTON: "refresh-button", + STOP_BUTTON: "stop-button", + SWITCH: "SWITCH", + }, + KEYBOARD_KEYS: { + A: "KeyA", + B: "KeyB", + C: "KeyC", + CAPITAL_R: "R", + CAPITAL_F: "F", + ENTER: "Enter", + S: "KeyS", + NUMERIC_ONE: "Digit1", + NUMERIC_TWO: "Digit2", + NUMERIC_THREE: "Digit3", + NUMERIC_FOUR: "Digit4", + NUMERIC_FIVE: "Digit5", + NUMERIC_SIX: "Digit6", + NUMERIC_SEVEN: "Digit7", + }, + FILES_PLACEHOLDER: + "The simulator will run the .py file you have focused on.", + SIMULATOR_BUTTON_WIDTH: 60, + TOOLBAR_INFO: `Explore what's on the board:`, + LED_TINT_FACTOR: 0.5, }; export const AB_BUTTONS_KEYS = { - BTN_A: "BTN_A", - BTN_B: "BTN_B", - BTN_AB: "BTN_AB", + BTN_A: "BTN_A", + BTN_B: "BTN_B", + BTN_AB: "BTN_AB", }; export const BUTTON_CLASSNAME = { - ACTIVE: "sim-button-group", - DEACTIVATED: "sim-button-group-deactivated", + ACTIVE: "sim-button-group", + DEACTIVATED: "sim-button-group-deactivated", }; export const BUTTON_STYLING_CLASSES = { - DEFAULT: "sim-button-outer", - KEYPRESSED: "sim-button-key-press", + DEFAULT: "sim-button-outer", + KEYPRESSED: "sim-button-key-press", }; export const CLUE_LEDS_COLORS = { - WHITE_LEDS_OFF: "#ffde00", - WHITE_LEDS_ON: "white", - RED_LED_OFF: "#808080", - RED_LED_ON: "red", + WHITE_LEDS_OFF: "#ffde00", + WHITE_LEDS_ON: "white", + RED_LED_OFF: "#808080", + RED_LED_ON: "red", }; export enum DEVICE_LIST_KEY { - CPX = "CPX", - MICROBIT = "micro:bit", - CLUE = "CLUE", + CPX = "CPX", + MICROBIT = "micro:bit", + CLUE = "CLUE", } // Pauses on Debug mode alter the state of the view export enum VIEW_STATE { - PAUSE = "debug-pause", - RUNNING = "running", + PAUSE = "debug-pause", + RUNNING = "running", } // export enum WEBVIEW_MESSAGES { - SWITCH_DEVICE = "switch-device", - REFRESH_SIMULATOR = "refresh-simulator", - TOGGLE_PLAY_STOP = "toggle-play-stop", - BUTTON_PRESS = "button-press", - SENSOR_CHANGED = "sensor-changed", - GESTURE = "gesture", - SLIDER_TELEMETRY = "slider-telemetry", + SWITCH_DEVICE = "switch-device", + REFRESH_SIMULATOR = "refresh-simulator", + TOGGLE_PLAY_STOP = "toggle-play-stop", + BUTTON_PRESS = "button-press", + SENSOR_CHANGED = "sensor-changed", + GESTURE = "gesture", + SLIDER_TELEMETRY = "slider-telemetry", } export enum VSCODE_MESSAGES_TO_WEBVIEW { - SET_DEVICE = "set-device", - PAUSE_DEVICE = "pause-device", - RUN_DEVICE = "run-device", - RESET = "reset-state", - CURRENT_FILE = "current-file", - SET_STATE = "set-state", + SET_DEVICE = "set-device", + PAUSE_DEVICE = "pause-device", + RUN_DEVICE = "run-device", + RESET = "reset-state", + CURRENT_FILE = "current-file", + SET_STATE = "set-state", } export enum DEBUG_COMMANDS { - STACK_TRACE = "stackTrace", - CONTINUE = "continue", - DISCONNECT = "disconnect", + STACK_TRACE = "stackTrace", + CONTINUE = "continue", + DISCONNECT = "disconnect", } export enum SENSOR_LIST { - TEMPERATURE = "temperature", - LIGHT = "light", - ACCELEROMETER = "accelerometer", - MOTION_X = "motion_x", - MOTION_Y = "motion_y", - MOTION_Z = "motion_z", - LIGHT_R = "light_r", - LIGHT_G = "light_g", - LIGHT_B = "light_b", - LIGHT_C = "light_c", - HUMIDITY = "humidity", - PRESSURE = "pressure", - PROXIMITY = "proximity", - MAGNET_X = "magnet_x", - MAGNET_Y = "magnet_y", - MAGNET_Z = "magnet_z", - GYRO_X = "gyro_x", - GYRO_Y = "gyro_y", - GYRO_Z = "gyro_z", + TEMPERATURE = "temperature", + LIGHT = "light", + ACCELEROMETER = "accelerometer", + MOTION_X = "motion_x", + MOTION_Y = "motion_y", + MOTION_Z = "motion_z", + LIGHT_R = "light_r", + LIGHT_G = "light_g", + LIGHT_B = "light_b", + LIGHT_C = "light_c", + HUMIDITY = "humidity", + PRESSURE = "pressure", + PROXIMITY = "proximity", + MAGNET_X = "magnet_x", + MAGNET_Y = "magnet_y", + MAGNET_Z = "magnet_z", + GYRO_X = "gyro_x", + GYRO_Y = "gyro_y", + GYRO_Z = "gyro_z", } export const GESTURES_MICROBIT = [ - "shake", - "up", - "down", - "left", - "right", - "face up", - "face down", - "freefall", - "3g", - "6g", - "8g", + "shake", + "up", + "down", + "left", + "right", + "face up", + "face down", + "freefall", + "3g", + "6g", + "8g", ]; export const GESTURES_CLUE = ["up", "down", "left", "right", "shake"]; export enum WEBVIEW_ATTRIBUTES_KEY { - INITIAL_DEVICE = "initial_device", - TYPE = "webview_type", + INITIAL_DEVICE = "initial_device", + TYPE = "webview_type", } export enum WEBVIEW_TYPES { - SIMULATOR = "simulator", - GETTING_STARTED = "getting_started", + SIMULATOR = "simulator", + GETTING_STARTED = "getting_started", } export const DEFAULT_IMG_CLUE = `/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAEBAQEBAQEBA QEBAQEBAQICAQEBAQMCAgICAwMEBAMDAwMEBAYFBAQFBAMDBQcFBQYGBgYGBAUHBwcGBwYGBgb/2wBDAQEBAQEBAQMCAgMGBAMEB diff --git a/Source/view/container/device/Device.spec.tsx b/Source/view/container/device/Device.spec.tsx index 0423721ef..5271bcdfa 100644 --- a/Source/view/container/device/Device.spec.tsx +++ b/Source/view/container/device/Device.spec.tsx @@ -6,25 +6,25 @@ import { DEVICE_LIST_KEY } from "../../constants"; import { Device } from "./Device"; describe("Device component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/container/device/Device.tsx b/Source/view/container/device/Device.tsx index dd30d2dc6..41705059e 100644 --- a/Source/view/container/device/Device.tsx +++ b/Source/view/container/device/Device.tsx @@ -8,35 +8,35 @@ import { Microbit } from "../../components/microbit/Microbit"; import { DEVICE_LIST_KEY } from "../../constants"; interface IProps { - currentSelectedDevice: string; + currentSelectedDevice: string; } // Container to switch between multiple devices export class Device extends React.Component { - constructor(props: IProps) { - super(props); - } - render() { - const { currentSelectedDevice } = this.props; + constructor(props: IProps) { + super(props); + } + render() { + const { currentSelectedDevice } = this.props; - return ( -
- - {loadSelectedDevice(currentSelectedDevice)} - -
- ); - } + return ( +
+ + {loadSelectedDevice(currentSelectedDevice)} + +
+ ); + } } const loadSelectedDevice = (currentSelectedDevice: string) => { - switch (currentSelectedDevice) { - case DEVICE_LIST_KEY.CPX: - return ; - case DEVICE_LIST_KEY.MICROBIT: - return ; - case DEVICE_LIST_KEY.CLUE: - return ; - default: - return null; - } + switch (currentSelectedDevice) { + case DEVICE_LIST_KEY.CPX: + return ; + case DEVICE_LIST_KEY.MICROBIT: + return ; + case DEVICE_LIST_KEY.CLUE: + return ; + default: + return null; + } }; diff --git a/Source/view/index.css b/Source/view/index.css index 918c31f9e..3801bbf26 100644 --- a/Source/view/index.css +++ b/Source/view/index.css @@ -1,13 +1,13 @@ @import url("https://fonts.googleapis.com/css?family=Joti+One"); body { - margin: 0; - padding: 0; - font-family: sans-serif; + margin: 0; + padding: 0; + font-family: sans-serif; } html, body { - overflow: hidden; - height: 100%; + overflow: hidden; + height: 100%; } diff --git a/Source/view/index.tsx b/Source/view/index.tsx index 32e7400b1..2d9c941b6 100644 --- a/Source/view/index.tsx +++ b/Source/view/index.tsx @@ -12,11 +12,11 @@ const messageEn = require("./translations/en.json"); const locale = "en"; const message = { - en: messageEn, + en: messageEn, }; ReactDOM.render( - - - , - document.getElementById("root") + + + , + document.getElementById("root") ); diff --git a/Source/view/pages/gettingStarted.css b/Source/view/pages/gettingStarted.css index ae6d20b4f..29a072207 100644 --- a/Source/view/pages/gettingStarted.css +++ b/Source/view/pages/gettingStarted.css @@ -1,56 +1,56 @@ .inv { - display: none; + display: none; } .codeText { - overflow-x: auto; - white-space: pre-wrap; - word-wrap: break-word; + overflow-x: auto; + white-space: pre-wrap; + word-wrap: break-word; } li:not(:last-child) { - margin-bottom: 6px; + margin-bottom: 6px; } .normalFontWeight { - font-weight: normal; + font-weight: normal; } .deviceSelector { - width: 250px; - border: 1px solid var(--vscode-dropdown-border); - background-color: var(--vscode-dropdown-background); - color: var(--vscode-dropdown-foreground); - margin: 0 0 5px; - padding: 8px; - border-radius: 5px; - font-size: 12px; - padding-right: 30px; + width: 250px; + border: 1px solid var(--vscode-dropdown-border); + background-color: var(--vscode-dropdown-background); + color: var(--vscode-dropdown-foreground); + margin: 0 0 5px; + padding: 8px; + border-radius: 5px; + font-size: 12px; + padding-right: 30px; } .deviceSelector optgroup { - background-color: var(--vscode-dropdown-listBackground); - color: var(--vscode-dropdown-foreground); + background-color: var(--vscode-dropdown-listBackground); + color: var(--vscode-dropdown-foreground); } .deviceSelector option { - background-color: var(--vscode-dropdown-listBackground); - color: var(--vscode-dropdown-foreground); + background-color: var(--vscode-dropdown-listBackground); + color: var(--vscode-dropdown-foreground); } .codeBox { - display: block; - width: 90%; - margin: 10px; - padding: 15px; - text-align: left; - background: none; - border: 1px solid grey; - border-radius: 4px; - background-color: var(--vscode-textCodeBlock-background); + display: block; + width: 90%; + margin: 10px; + padding: 15px; + text-align: left; + background: none; + border: 1px solid grey; + border-radius: 4px; + background-color: var(--vscode-textCodeBlock-background); } .container { - text-align: left; - padding: 0 10px 20px 10px; + text-align: left; + padding: 0 10px 20px 10px; } diff --git a/Source/view/pages/gettingStarted.spec.tsx b/Source/view/pages/gettingStarted.spec.tsx index 12554fdfb..c45e2e6d1 100644 --- a/Source/view/pages/gettingStarted.spec.tsx +++ b/Source/view/pages/gettingStarted.spec.tsx @@ -5,25 +5,25 @@ import * as testRenderer from "react-test-renderer"; import { GettingStartedPage } from "./gettingStarted"; describe("GettingStartedPage component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/styles/Button.css b/Source/view/styles/Button.css index c30ed1360..993bd4937 100644 --- a/Source/view/styles/Button.css +++ b/Source/view/styles/Button.css @@ -1,50 +1,50 @@ .button { - height: 32px; - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-debugToolBar-background); + height: 32px; + background: var(--vscode-debugToolBar-background); + border-color: var(--vscode-debugToolBar-background); } .button-icon { - fill: var(--vscode-badgeForegroundOverride); + fill: var(--vscode-badgeForegroundOverride); } .button-rectangle { - stroke: var(--vscode-badgeForegroundOverride); + stroke: var(--vscode-badgeForegroundOverride); } .play-button { - border-radius: 8px 0px 0px 8px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-radius: 8px 0px 0px 8px; + border-color: var(--vscode-highContrastButtonBorderOverride-color); } .refresh-button { - border-radius: 0px 8px 8px 0px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-radius: 0px 8px 8px 0px; + border-color: var(--vscode-highContrastButtonBorderOverride-color); } .button:focus, .button:hover { - background-color: var(--vscode-terminal-selectionBackground); + background-color: var(--vscode-terminal-selectionBackground); } .button:active { - background-color: var(--vscode-editor-selectionHighlightBackground); + background-color: var(--vscode-editor-selectionHighlightBackground); } .toolbar-button { - border: none; + border: none; } .toolbar-button:hover { - outline: none; + outline: none; } .edge-button { - pointer-events: none; - border: none; + pointer-events: none; + border: none; } .button-pressed { - background-color: var(--vscode-button-background); - outline: none; + background-color: var(--vscode-button-background); + outline: none; } diff --git a/Source/view/styles/Dropdown.css b/Source/view/styles/Dropdown.css index b69b14c74..b617665a9 100644 --- a/Source/view/styles/Dropdown.css +++ b/Source/view/styles/Dropdown.css @@ -1,24 +1,24 @@ .dropdown { - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-foreground); - border-radius: 2px; - box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.22); - color: var(--vscode-foreground); - height: 32px; - width: 100%; + background: var(--vscode-debugToolBar-background); + border-color: var(--vscode-foreground); + border-radius: 2px; + box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.22); + color: var(--vscode-foreground); + height: 32px; + width: 100%; } select.dropdown:hover, select.dropdown:focus, select.dropdown:active { - outline: 1px solid var(--vscode-button-background); + outline: 1px solid var(--vscode-button-background); } option { - height: 32px; - background: var(--vscode-debugToolBar-background); - outline: 0; - align-items: center; - font-size: 14px; - color: var(--vscode-foreground); + height: 32px; + background: var(--vscode-debugToolBar-background); + outline: 0; + align-items: center; + font-size: 14px; + color: var(--vscode-foreground); } diff --git a/Source/view/styles/InputSlider.css b/Source/view/styles/InputSlider.css index b51dae8f3..0adcd1340 100644 --- a/Source/view/styles/InputSlider.css +++ b/Source/view/styles/InputSlider.css @@ -1,103 +1,103 @@ :root { - --slider-gray-color: #cccccc; - --slider-width: 240px; + --slider-gray-color: #cccccc; + --slider-width: 240px; } .inputSlider { - height: 48px; - margin-bottom: 60px; - display: table-cell; + height: 48px; + margin-bottom: 60px; + display: table-cell; } .sliderValue { - -webkit-appearance: none; - text-align: center; - width: 48px; - height: 32px; - background-color: var(--vscode-editor-background); - margin-right: 15px; - margin-top: auto; - margin-bottom: auto; - margin-left: 5px; - color: var(--badgeForegroundOverride); - border-radius: 2px; - font-size: 16px; - font-weight: bold; - border-width: 1px; - border-radius: 2px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); + -webkit-appearance: none; + text-align: center; + width: 48px; + height: 32px; + background-color: var(--vscode-editor-background); + margin-right: 15px; + margin-top: auto; + margin-bottom: auto; + margin-left: 5px; + color: var(--badgeForegroundOverride); + border-radius: 2px; + font-size: 16px; + font-weight: bold; + border-width: 1px; + border-radius: 2px; + border-color: var(--vscode-highContrastButtonBorderOverride-color); } .slider { - -webkit-appearance: none; - background-color: var(--slider-gray-color); - height: 1px; - width: var(--slider-width); - vertical-align: middle; + -webkit-appearance: none; + background-color: var(--slider-gray-color); + height: 1px; + width: var(--slider-width); + vertical-align: middle; } .slider::-webkit-slider-thumb { - -webkit-appearance: none; - appearance: none; - width: 16px; - height: 16px; - border-radius: 50%; - background: var(--vscode-textLink-activeForeground); - cursor: pointer; + -webkit-appearance: none; + appearance: none; + width: 16px; + height: 16px; + border-radius: 50%; + background: var(--vscode-textLink-activeForeground); + cursor: pointer; } .slider::-webkit-slider-runnable-track:focus, .inputSlider:focus, .slider:focus { - outline: none; + outline: none; } .sliderValue:focus, .sliderValue:hover { - -webkit-appearance: none; - color: var(--vscode-textLink-activeForeground); - outline: 1px solid var(--vscode-textLink-activeForeground); + -webkit-appearance: none; + color: var(--vscode-textLink-activeForeground); + outline: 1px solid var(--vscode-textLink-activeForeground); } .maxLabel, .minLabel { - display: inline-block; - position: absolute; - vertical-align: top; + display: inline-block; + position: absolute; + vertical-align: top; } .maxLabel { - right: 0; + right: 0; } .minLabel { - left: 0; + left: 0; } .sliderArea, .sliderValue { - display: inline-block; - vertical-align: middle; + display: inline-block; + vertical-align: middle; } .sliderArea { - width: var(--slider-width); - height: 49px; + width: var(--slider-width); + height: 49px; } .downLabelArea { - width: var(--slider-width); - height: 15px; - margin-top: 10px; - position: relative; - font-size: 14px; + width: var(--slider-width); + height: 15px; + margin-top: 10px; + position: relative; + font-size: 14px; } .upLabelArea { - width: var(--slider-width); - height: 15px; - margin-bottom: 10px; - position: relative; - font-weight: bolder; - font-size: 16px; + width: var(--slider-width); + height: 15px; + margin-bottom: 10px; + position: relative; + font-weight: bolder; + font-size: 16px; } .slider, .upLabelArea, .downLabelArea { - display: block; + display: block; } diff --git a/Source/view/styles/LightSensorBar.css b/Source/view/styles/LightSensorBar.css index 5d0abac42..ec70e6765 100644 --- a/Source/view/styles/LightSensorBar.css +++ b/Source/view/styles/LightSensorBar.css @@ -1,20 +1,20 @@ .title { - font-size: 14px; - text-align: left; - font-weight: bold; + font-size: 14px; + text-align: left; + font-weight: bold; } .header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; + -webkit-appearance: none; + height: 30px; + margin-bottom: 2px; } .lightSensorBar { - -webkit-appearance: none; - margin-top: 10px; - width: 400px; - margin-left: auto; - margin-right: auto; - padding-bottom: 16px; + -webkit-appearance: none; + margin-top: 10px; + width: 400px; + margin-left: auto; + margin-right: auto; + padding-bottom: 16px; } diff --git a/Source/view/styles/MotionSensorBar.css b/Source/view/styles/MotionSensorBar.css index 8ea39c23c..5d68da3c9 100644 --- a/Source/view/styles/MotionSensorBar.css +++ b/Source/view/styles/MotionSensorBar.css @@ -1,20 +1,20 @@ .title { - font-size: 14px; - text-align: left; + font-size: 14px; + text-align: left; } .header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; + -webkit-appearance: none; + height: 30px; + margin-bottom: 2px; } .MotionSensorBar { - width: 100%; - margin-left: auto; - margin-right: auto; + width: 100%; + margin-left: auto; + margin-right: auto; } .sensor-button-container { - padding: 10px 0; + padding: 10px 0; } diff --git a/Source/view/styles/SensorButton.css b/Source/view/styles/SensorButton.css index 21241eca2..75c322083 100644 --- a/Source/view/styles/SensorButton.css +++ b/Source/view/styles/SensorButton.css @@ -1,29 +1,29 @@ .sensor-button { - color: var(--vscode-badgeForegroundOverride); - text-align: center; - background-color: var(--vscode-button-background); - width: 100%; - height: 32px; - font-weight: bolder; - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - padding: 4px; + color: var(--vscode-badgeForegroundOverride); + text-align: center; + background-color: var(--vscode-button-background); + width: 100%; + height: 32px; + font-weight: bolder; + border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-width: 1px; + border-style: solid; + padding: 4px; } .sensor-button:focus, .sensor-button:active { - outline-width: thick; - outline-offset: 4px; - outline: 2px solid var(--vscode-focusBorder); - background-color: var(--vscode-button-hoverBackground); + outline-width: thick; + outline-offset: 4px; + outline: 2px solid var(--vscode-focusBorder); + background-color: var(--vscode-button-hoverBackground); } .sensor-button:active, .active-button { - opacity: 0.5; + opacity: 0.5; } .sensor-button:hover { - background-color: var(--vscode-button-hoverBackground); + background-color: var(--vscode-button-hoverBackground); } diff --git a/Source/view/styles/Simulator.css b/Source/view/styles/Simulator.css index 016cc8855..ea7979248 100644 --- a/Source/view/styles/Simulator.css +++ b/Source/view/styles/Simulator.css @@ -1,83 +1,83 @@ .simulator { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - max-width: 700px; - max-height: 700px; - margin-left: auto; - margin-right: auto; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + max-width: 700px; + max-height: 700px; + margin-left: auto; + margin-right: auto; } .buttons { - display: flex; - flex-direction: row; - padding-top: 20px; - justify-content: center; + display: flex; + flex-direction: row; + padding-top: 20px; + justify-content: center; } .file-selector { - padding: 20px; - width: 80%; - height: 30px; - border: 1px solid var(--vscode-debugToolBar-background); - border-radius: 3px; + padding: 20px; + width: 80%; + height: 30px; + border: 1px solid var(--vscode-debugToolBar-background); + border-radius: 3px; } .shake-pressed { - /* Start the shake animation and make the animation last for 0.5 seconds */ - animation: shake 0.5s; + /* Start the shake animation and make the animation last for 0.5 seconds */ + animation: shake 0.5s; - /* When the animation is finished, start again */ - animation-iteration-count: infinite; + /* When the animation is finished, start again */ + animation-iteration-count: infinite; } @keyframes shake { - 0% { - transform: translate(1px, 1px) rotate(0deg); - } - 10% { - transform: translate(-1px, -2px) rotate(-1deg); - } - 20% { - transform: translate(-3px, 0px) rotate(1deg); - } - 30% { - transform: translate(3px, 2px) rotate(0deg); - } - 40% { - transform: translate(1px, -1px) rotate(1deg); - } - 50% { - transform: translate(-1px, 2px) rotate(-1deg); - } - 60% { - transform: translate(-3px, 1px) rotate(0deg); - } - 70% { - transform: translate(3px, 1px) rotate(-1deg); - } - 80% { - transform: translate(-1px, -1px) rotate(1deg); - } - 90% { - transform: translate(1px, 2px) rotate(0deg); - } - 100% { - transform: translate(1px, -2px) rotate(-1deg); - } + 0% { + transform: translate(1px, 1px) rotate(0deg); + } + 10% { + transform: translate(-1px, -2px) rotate(-1deg); + } + 20% { + transform: translate(-3px, 0px) rotate(1deg); + } + 30% { + transform: translate(3px, 2px) rotate(0deg); + } + 40% { + transform: translate(1px, -1px) rotate(1deg); + } + 50% { + transform: translate(-1px, 2px) rotate(-1deg); + } + 60% { + transform: translate(-3px, 1px) rotate(0deg); + } + 70% { + transform: translate(3px, 1px) rotate(-1deg); + } + 80% { + transform: translate(-1px, -1px) rotate(1deg); + } + 90% { + transform: translate(1px, 2px) rotate(0deg); + } + 100% { + transform: translate(1px, -2px) rotate(-1deg); + } } .microbit-container { - max-width: 350px; - padding: 20px; + max-width: 350px; + padding: 20px; } .clue-container { - width: 100%; - max-width: 500px; - padding: 20px; + width: 100%; + max-width: 500px; + padding: 20px; } .cpx-container { - width: 100%; - padding-top: 10px; + width: 100%; + padding-top: 10px; } diff --git a/Source/view/styles/SimulatorSvg.css b/Source/view/styles/SimulatorSvg.css index 10d839893..523411c2f 100644 --- a/Source/view/styles/SimulatorSvg.css +++ b/Source/view/styles/SimulatorSvg.css @@ -1,115 +1,115 @@ .microbit-svg { - padding: 0 0 0 10px; + padding: 0 0 0 10px; } svg.sim { - box-sizing: border-box; - width: 100%; - height: 100%; - display: block; + box-sizing: border-box; + width: 100%; + height: 100%; + display: block; } svg.sim.grayscale { - -moz-filter: grayscale(1); - -webkit-filter: grayscale(1); - filter: grayscale(1); + -moz-filter: grayscale(1); + -webkit-filter: grayscale(1); + filter: grayscale(1); } .sim-button-group { - cursor: pointer; + cursor: pointer; } .sim-button { - pointer-events: none; - fill: "rgb(17, 17, 17)"; + pointer-events: none; + fill: "rgb(17, 17, 17)"; } .sim-button-group > .sim-button:active { - fill: orange; + fill: orange; } .sim-text-outside { - font-size: 25px; - fill: var(--vscode-foreground); + font-size: 25px; + fill: var(--vscode-foreground); } .sim-board, .sim-display, sim-button { - fill: #111; + fill: #111; } .sim-button-group > .sim-button-outer:hover { - stroke: orange; - stroke-width: 4px; + stroke: orange; + stroke-width: 4px; } .sim-button-group > .sim-button-outer:active { - fill: orange; + fill: orange; } .sim-button-outer { - fill: #7e7272; + fill: #7e7272; } .sim-button-key-press { - fill: orange; + fill: orange; } .sim-button-nut { - fill: #704a4a; - pointer-events: none; + fill: #704a4a; + pointer-events: none; } .sim-systemled { - fill: #333; - stroke: #555; - stroke-width: 1px; + fill: #333; + stroke: #555; + stroke-width: 1px; } .sim-light-level-button { - stroke: #fff; - stroke-width: 3px; + stroke: #fff; + stroke-width: 3px; } .sim-antenna { - stroke: #555; - stroke-width: 2px; + stroke: #555; + stroke-width: 2px; } .sim-text { - font-family: "Lucida Console", Monaco, monospace; - font-size: 25px; - fill: #fff; - pointer-events: none; + font-family: "Lucida Console", Monaco, monospace; + font-size: 25px; + fill: #fff; + pointer-events: none; } .sim-text-pin { - font-family: "Lucida Console", Monaco, monospace; - font-size: 20px; - fill: #fff; - pointer-events: none; + font-family: "Lucida Console", Monaco, monospace; + font-size: 20px; + fill: #fff; + pointer-events: none; } .sim-thermometer { - stroke: #aaa; - stroke-width: 3px; + stroke: #aaa; + stroke-width: 3px; } /* animations */ .sim-flash { - animation-name: sim-flash-animation; - animation-duration: 0.1s; + animation-name: sim-flash-animation; + animation-duration: 0.1s; } @keyframes sim-flash-animation { - from { - fill: yellow; - } - to { - fill: default; - } + from { + fill: yellow; + } + to { + fill: default; + } } .sim-flash-stroke { - animation-name: sim-flash-stroke-animation; - animation-duration: 0.4s; - animation-timing-function: ease-in; + animation-name: sim-flash-stroke-animation; + animation-duration: 0.4s; + animation-timing-function: ease-in; } @keyframes sim-flash-stroke-animation { - from { - stroke: yellow; - } - to { - stroke: default; - } + from { + stroke: yellow; + } + to { + stroke: default; + } } /* wireframe */ .sim-wireframe * { - fill: none; - stroke: black; + fill: none; + stroke: black; } .sim-wireframe .sim-display, .sim-wireframe .sim-led, @@ -120,29 +120,29 @@ sim-button { .sim-wireframe .sim-button-label, .sim-wireframe .sim-button, .sim-wireframe .sim-text-pin { - visibility: hidden; + visibility: hidden; } .sim-wireframe .sim-label { - stroke: none; - fill: #777; + stroke: none; + fill: #777; } .sim-label, .sim-button-label { - fill: #000; + fill: #000; } .sim-wireframe .sim-board { - stroke-width: 2px; + stroke-width: 2px; } *:focus { - outline: none; + outline: none; } .sim-button-group:focus { - stroke: #4d90fe; - stroke-width: 4px; + stroke: #4d90fe; + stroke-width: 4px; } .sim-button-group:focus { - stroke: #4d90fe; - stroke-width: 4px; + stroke: #4d90fe; + stroke-width: 4px; } *:focus .sim-button-outer, .sim-pin:focus, @@ -151,27 +151,27 @@ sim-button { .no-drag, .sim-text, .sim-text-pin { - user-drag: none; - user-select: none; - -moz-user-select: none; - -webkit-user-drag: none; - -webkit-user-select: none; - -ms-user-select: none; + user-drag: none; + user-select: none; + -moz-user-select: none; + -webkit-user-drag: none; + -webkit-user-select: none; + -ms-user-select: none; } .sim-button { - stroke: none; + stroke: none; } .sim-button:active { - stroke: none; + stroke: none; } .cls-1 { - fill: #097054; + fill: #097054; } .cls-1, .cls-14, .cls-23, .cls-9 { - stroke: #000; + stroke: #000; } .cls-1, .cls-11, @@ -185,15 +185,15 @@ sim-button { .cls-5, .cls-6, .cls-9 { - stroke-miterlimit: 10; + stroke-miterlimit: 10; } .cls-1, .cls-23 { - stroke-width: 1.99px; + stroke-width: 1.99px; } .cls-18, .cls-2 { - fill: #fff; + fill: #fff; } .cls-11, .cls-12, @@ -205,7 +205,7 @@ sim-button { .cls-6, .cls-7, .cls-8 { - fill: none; + fill: none; } .cls-11, .cls-12, @@ -216,10 +216,10 @@ sim-button { .cls-6, .cls-7, .cls-8 { - stroke: #fff; + stroke: #fff; } .cls-3 { - stroke-width: 2px; + stroke-width: 2px; } .cls-12, .cls-17, @@ -228,63 +228,65 @@ sim-button { .cls-6, .cls-7, .cls-8 { - stroke-linecap: round; + stroke-linecap: round; } .cls-4, .cls-7 { - stroke-width: 1.63px; + stroke-width: 1.63px; } .cls-5 { - stroke-width: 1.41px; + stroke-width: 1.41px; } .cls-6 { - stroke-width: 1.6px; + stroke-width: 1.6px; } .cls-7, .cls-8 { - stroke-linejoin: round; + stroke-linejoin: round; } .cls-8 { - stroke-width: 1.63px; + stroke-width: 1.63px; } .cls-10, .cls-9 { - fill: #7e7272; + fill: #7e7272; } .cls-22, .cls-9 { - stroke-width: 1.5px; + stroke-width: 1.5px; } .cls-12 { - stroke-width: 1.71px; + stroke-width: 1.71px; } .cls-14 { - stroke-width: 0.25px; + stroke-width: 0.25px; } .cls-17 { - stroke-width: 2.02px; + stroke-width: 2.02px; } .cls-18 { - font-size: 7px; - font-family: SegoeUI-Bold, Segoe UI; - font-weight: 700; - letter-spacing: -0.02em; + font-size: 7px; + font-family: + SegoeUI-Bold, + Segoe UI; + font-weight: 700; + letter-spacing: -0.02em; } .cls-19 { - letter-spacing: -0.03em; + letter-spacing: -0.03em; } .cls-20 { - letter-spacing: -0.05em; + letter-spacing: -0.05em; } .cls-21 { - letter-spacing: 0em; + letter-spacing: 0em; } .cls-22 { - stroke: #7e7272; + stroke: #7e7272; } .sim-text-outside-clue { - font-size: 14px; - fill: var(--vscode-foreground); + font-size: 14px; + fill: var(--vscode-foreground); } diff --git a/Source/view/styles/TemperatureSensorBar.css b/Source/view/styles/TemperatureSensorBar.css index dfab0b7cd..e52920b20 100644 --- a/Source/view/styles/TemperatureSensorBar.css +++ b/Source/view/styles/TemperatureSensorBar.css @@ -1,18 +1,18 @@ .title { - font-size: 14px; - text-align: left; - font-weight: bold; + font-size: 14px; + text-align: left; + font-weight: bold; } .header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; + -webkit-appearance: none; + height: 30px; + margin-bottom: 2px; } .temperatureSensorBar { - margin-top: 10px; - width: 440px; - margin-left: auto; - margin-right: auto; - padding-bottom: 16px; + margin-top: 10px; + width: 440px; + margin-left: auto; + margin-right: auto; + padding-bottom: 16px; } diff --git a/Source/view/styles/ToolBar.css b/Source/view/styles/ToolBar.css index faca0569c..f85843e90 100644 --- a/Source/view/styles/ToolBar.css +++ b/Source/view/styles/ToolBar.css @@ -1,182 +1,182 @@ .toolbar-parent { - background: var(--vscode-debugToolBar-background); - width: fit-content; - border-radius: 2px; - height: fit-content; - margin-left: auto; - margin-right: auto; - margin-top: 24px; - margin-bottom: 50px; + background: var(--vscode-debugToolBar-background); + width: fit-content; + border-radius: 2px; + height: fit-content; + margin-left: auto; + margin-right: auto; + margin-top: 24px; + margin-bottom: 50px; } .toolbar { - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - display: flex; - flex-direction: column; - align-content: center; - align-items: center; + box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); + border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-width: 1px; + border-style: solid; + display: flex; + flex-direction: column; + align-content: center; + align-items: center; } .toolbar-icon { - min-width: 360px; - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - padding: 0px 8px 0px 8px; + min-width: 360px; + box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); + border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-width: 1px; + border-style: solid; + padding: 0px 8px 0px 8px; } .tag, .title { - display: inline; + display: inline; } .sensor_modal { - vertical-align: middle; - width: 360px; - overflow-y: visible; - overflow-x: hidden; - position: relative; - height: fit-content; - padding-left: 16px; - box-shadow: none; - margin-left: 1px; + vertical-align: middle; + width: 360px; + overflow-y: visible; + overflow-x: hidden; + position: relative; + height: fit-content; + padding-left: 16px; + box-shadow: none; + margin-left: 1px; } .title { - -webkit-appearance: none; - font-size: 16px; - font-weight: bolder; - color: var(--vscode-badgeForegroundOverride); - text-align: left; - margin-right: 40px; - position: absolute; - left: 0; - padding-left: inherit; - width: 320px; + -webkit-appearance: none; + font-size: 16px; + font-weight: bolder; + color: var(--vscode-badgeForegroundOverride); + text-align: left; + margin-right: 40px; + position: absolute; + left: 0; + padding-left: inherit; + width: 320px; } .info-icon { - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - color: var(--vscode-badgeForegroundOverride); - border-width: 1px; - border-style: solid; - padding: 0px 4px; - float: right; - left: 25px; - margin-top: -10px; + background: var(--vscode-debugToolBar-background); + border-color: var(--vscode-highContrastButtonBorderOverride-color); + color: var(--vscode-badgeForegroundOverride); + border-width: 1px; + border-style: solid; + padding: 0px 4px; + float: right; + left: 25px; + margin-top: -10px; } .info-icon:hover { - background-color: var(--vscode-terminal-selectionBackground); - color: var(--vscode-badgeForegroundOverride); + background-color: var(--vscode-terminal-selectionBackground); + color: var(--vscode-badgeForegroundOverride); } .info-icon:active { - background-color: var(--vscode-editor-selectionHighlightBackground); - color: var(--vscode-badgeForegroundOverride); + background-color: var(--vscode-editor-selectionHighlightBackground); + color: var(--vscode-badgeForegroundOverride); } .tag { - position: absolute; - left: 200px; + position: absolute; + left: 200px; } .description-callout { - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - padding: "210px 214px 214px 210px"; - border: 2px solid var(--vscode-highContrastButtonBorderOverride-color); + box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); + padding: "210px 214px 214px 210px"; + border: 2px solid var(--vscode-highContrastButtonBorderOverride-color); } .description-callout .ms-Callout-beak { - background-color: var(--vscode-debugToolBar-background); + background-color: var(--vscode-debugToolBar-background); } .description-callout .ms-Callout-main { - background-color: var(--vscode-debugToolBar-background); - overflow-x: hidden; - overflow-y: auto; - margin: -1px; + background-color: var(--vscode-debugToolBar-background); + overflow-x: hidden; + overflow-y: auto; + margin: -1px; } .try-it-description { - -webkit-appearance: none; - font-size: 14px; - background: var(--vscode-debugToolBar-background); - word-wrap: break-word; - width: 320px; - height: "100%"; - margin-top: 15px; - text-align: left; - line-height: 17px; - font-weight: 100; + -webkit-appearance: none; + font-size: 14px; + background: var(--vscode-debugToolBar-background); + word-wrap: break-word; + width: 320px; + height: "100%"; + margin-top: 15px; + text-align: left; + line-height: 17px; + font-weight: 100; } .description { - -webkit-appearance: none; - color: var(--vscode-badgeForegroundOverride); - font-size: 14px; - word-wrap: break-word; - width: 320px; - height: "100%"; - text-align: left; - font-weight: 400; - padding: 10px 0px 10px 10px; - margin: 10px; - overflow-y: hidden; + -webkit-appearance: none; + color: var(--vscode-badgeForegroundOverride); + font-size: 14px; + word-wrap: break-word; + width: 320px; + height: "100%"; + text-align: left; + font-weight: 400; + padding: 10px 0px 10px 10px; + margin: 10px; + overflow-y: hidden; } .title_group { - margin-top: 20px; - width: fit-content; - padding-left: 16px; + margin-top: 20px; + width: fit-content; + padding-left: 16px; } .try_area { - position: relative; - padding-bottom: 30px; - text-align: left; - line-height: 17px; - font-weight: 100; - opacity: 90%; - font-size: 14px; - word-wrap: break-word; - padding-right: 10px; + position: relative; + padding-bottom: 30px; + text-align: left; + line-height: 17px; + font-weight: 100; + opacity: 90%; + font-size: 14px; + word-wrap: break-word; + padding-right: 10px; } .link-parent { - padding-top: 12px; - -webkit-appearance: none; - color: var(--vscode-textLink-foreground); - text-align: right; - text-decoration: none; - font-weight: bold; + padding-top: 12px; + -webkit-appearance: none; + color: var(--vscode-textLink-foreground); + text-align: right; + text-decoration: none; + font-weight: bold; } .link-parent:hover { - -webkit-appearance: none; - color: var(--vscode-textLink-activeForeground); - text-decoration: none; + -webkit-appearance: none; + color: var(--vscode-textLink-activeForeground); + text-decoration: none; } .link { - -webkit-appearance: none; - text-decoration: none; + -webkit-appearance: none; + text-decoration: none; } .gesture-container { - display: "flex"; - justify-content: "space-between"; - flex-direction: "column"; - align-items: "center"; - height: 750; - padding-top: 10px; + display: "flex"; + justify-content: "space-between"; + flex-direction: "column"; + align-items: "center"; + height: 750; + padding-top: 10px; } .generic-slider-component { - padding-top: 10px; + padding-top: 10px; } diff --git a/Source/view/svgs/arrow_right_svg.tsx b/Source/view/svgs/arrow_right_svg.tsx index 7eead7979..538c52229 100644 --- a/Source/view/svgs/arrow_right_svg.tsx +++ b/Source/view/svgs/arrow_right_svg.tsx @@ -1,21 +1,20 @@ import * as React from "react"; export const ARROW_RIGHT_SVG = ( - - - + + + ); export default ARROW_RIGHT_SVG; diff --git a/Source/view/svgs/close_svg.tsx b/Source/view/svgs/close_svg.tsx index ac05bedfc..b591fa868 100644 --- a/Source/view/svgs/close_svg.tsx +++ b/Source/view/svgs/close_svg.tsx @@ -1,26 +1,25 @@ import * as React from "react"; export const CLOSE_SVG = ( - - - - + + + + ); export default CLOSE_SVG; diff --git a/Source/view/svgs/play_svg.tsx b/Source/view/svgs/play_svg.tsx index 0da21aa9d..8c1317ee1 100644 --- a/Source/view/svgs/play_svg.tsx +++ b/Source/view/svgs/play_svg.tsx @@ -1,19 +1,18 @@ import * as React from "react"; export const PLAY_SVG = ( - - - + + + ); export default PLAY_SVG; diff --git a/Source/view/svgs/refresh_svg.tsx b/Source/view/svgs/refresh_svg.tsx index 340ad03f8..4df58cd59 100644 --- a/Source/view/svgs/refresh_svg.tsx +++ b/Source/view/svgs/refresh_svg.tsx @@ -2,20 +2,19 @@ import * as React from "react"; import "../styles/Button.css"; export const REFRESH_SVG = ( - - - + + + ); export default REFRESH_SVG; diff --git a/Source/view/svgs/stop_svg.tsx b/Source/view/svgs/stop_svg.tsx index a89175f66..f6a628fa3 100644 --- a/Source/view/svgs/stop_svg.tsx +++ b/Source/view/svgs/stop_svg.tsx @@ -1,21 +1,20 @@ import * as React from "react"; export const STOP_SVG = ( - - - + + + ); export default STOP_SVG; diff --git a/Source/view/svgs/tag_input_svg.tsx b/Source/view/svgs/tag_input_svg.tsx index 13a507504..8e346d140 100644 --- a/Source/view/svgs/tag_input_svg.tsx +++ b/Source/view/svgs/tag_input_svg.tsx @@ -1,27 +1,26 @@ import * as React from "react"; export const TAG_INPUT_SVG = ( - - - - + + + + ); export default TAG_INPUT_SVG; diff --git a/Source/view/svgs/tag_output_svg.tsx b/Source/view/svgs/tag_output_svg.tsx index 745175db5..157dca014 100644 --- a/Source/view/svgs/tag_output_svg.tsx +++ b/Source/view/svgs/tag_output_svg.tsx @@ -1,26 +1,25 @@ import * as React from "react"; export const TAG_OUTPUT_SVG = ( - - - - + + + + ); export default TAG_OUTPUT_SVG; diff --git a/Source/view/svgs/toolbar_svg.tsx b/Source/view/svgs/toolbar_svg.tsx index 52de70b86..701725550 100644 --- a/Source/view/svgs/toolbar_svg.tsx +++ b/Source/view/svgs/toolbar_svg.tsx @@ -3,738 +3,693 @@ import { TOOLBAR_ICON_LABEL } from "../components/toolbar/SensorModalUtils"; import "../styles/Button.css"; export const LEFT_EDGE_SVG = ( - - - - - - - - - - + + + + + + + + + + ); export const RIGHT_EDGE_SVG = ( - - - - - - - - - - + + + + + + + + + + ); export const GPIO_SVG = ( - - Created with Sketch. - - - - - - + + Created with Sketch. + + + + + + ); export const IR_SVG = ( - - Created with Sketch. - - - - - - - - + + Created with Sketch. + + + + + + + + ); export const LIGHT_SVG = ( - - - - - - - - - - - + + + + + + + + + + + ); export const MOTION_SVG = ( - - - - - - - - - - - + + + + + + + + + + + ); export const NEO_PIXEL_SVG = ( - - Created with Sketch. - - - - - - - - - - - - - - - + + Created with Sketch. + + + + + + + + + + + + + + + ); export const PUSH_BUTTON_SVG = ( - - Created with Sketch. - - - - - - - - - + + Created with Sketch. + + + + + + + + + ); export const RED_LED_SVG = ( - - Created with Sketch. - - - - - - - - - + + Created with Sketch. + + + + + + + + + ); export const SLIDER_SWITCH_SVG = ( - - Created with Sketch. - - - - - - - - - + + Created with Sketch. + + + + + + + + + ); export const SOUND_SVG = ( - - Created with Sketch. - - - - - - - - - - - + + Created with Sketch. + + + + + + + + + + + ); export const SPEAKER_SVG = ( - - Created with Sketch. - - - - - - - - + + Created with Sketch. + + + + + + + + ); export const TEMPERATURE_SVG = ( - - - - - - - - - + + + + + + + + + ); export const WIRELESS_SVG = ( - - - - - - - - - + + + + + + + + + ); export default LEFT_EDGE_SVG; export const GESTURE_SVG = ( - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + ); export const HUMIDITY_SVG = ( - - - - + + + - - - - - - - - - + /> + + + ); export const PRESSURE_SVG = ( - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + ); export const PROXIMITY_SVG = ( - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + ); export const MAGNET_SVG = ( - - - + + - - + /> + + ); export const GYROSCOPE_SVG = ( - - - + + + - - - - - - - - - + + + + + + + + + ); export const COMPASS_SVG = ( - - - - - + + + + + ); diff --git a/Source/view/translations/en.json b/Source/view/translations/en.json index c5e6ebed9..6583386d6 100644 --- a/Source/view/translations/en.json +++ b/Source/view/translations/en.json @@ -1,112 +1,112 @@ { - "toolbar-gpio.description": "8 GPIOs on the device! Pin A1 - A7 can also be used as capacitive touch sensors, and A0 is a true analog output pin.", - "toolbar-gpio.title": "GPIO", - "toolbar-gpio.tryItDescription": "Use your mouse to interact with the pin A1 - A7 or use your keyboard SHIFT + ”1” - “7”.", - "toolbar-ir-sensor.description": "Allows you to send commands to the device with a remote control, or even send messages between multiple devices! You can also do very simple proximity sensing since it reads the reflected light.", - "toolbar-ir-sensor.title": "IR Transmit & Receiver", - "toolbar-ir-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-light-sensor.description": "An analog light sensor can be used to detect ambient light, with similar spectral response to the human eye.", - "toolbar-light-sensor.title": "Light Sensor", - "toolbar-light-sensor.tryItDescription": "Change the brightness detected by the sensor here!", - "toolbar-motion-sensor.description": "Detects acceleration in X, Y and Z orientations. It can also detect 'tap' and 'double tap' strikes on the board and when the board is shaken.", - "toolbar-motion-sensor.title": "Motion Sensor", - "toolbar-motion-sensor.tryItDescription": "Change the acceleration here and click or click on the button to simulate a shake. The tap feature is not supported by the Device Simulator Express. If you would like to see the 'tap' feature implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-neo-pixels.description": "The 10 full color RGB LEDs surrounding the outer edge of the boards can be set to any color. Great for beautiful lighting effects!", - "toolbar-neo-pixels.title": "NeoPixels", - "toolbar-neo-pixels.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-a-b-push.description": "Two push buttons A and B are connected to digital pin #4 (Left) and #5 (Right) each.", - "toolbar-a-b-push.title": "Push Buttons", - "toolbar-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-red-led.description": "This Red LED is connected to the digital #13 GPIO pin. It can be very handy when you want an indicator LED.", - "toolbar-red-led.title": "Red LED", - "toolbar-red-led.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-sound-sensor.description": "A digital microphone can detect audio volume and even perform basic FFT functions but cannot read it like an analog voltage.", - "toolbar-sound-sensor.title": "Sound Sensor", - "toolbar-sound-sensor.tryItDescription": "If you would like to see the sound sensor implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-slider-switch.description": "This slide switch returns True or False depending on whether it's ON or OFF and can be used as a toggle switch in your code!", - "toolbar-slider-switch.title": "Slider Switch", - "toolbar-slider-switch.tryItDescription": "Click it with your mouse or press 'S' on your keyboard to switch it ON and OFF!", - "toolbar-speaker.description": "This speaker can play a .wav file and different tones and also has a class D amplifier that is connected to an output A0 pin built in! You can turn it off using the shutdown control on pin #11 on the physical device.", - "toolbar-speaker.title": "Speaker", - "toolbar-speaker.tryItDescription": "Right now the tones are not supported on the simulator. If you would like to see tones implemented, please +1 the feature addition issue on GitHub! Regardless, you can play it on your device!", - "toolbar-temperature-sensor.description": "This sensor uses an NTC thermistor to sense temperature an calculate it with the analog voltage on analog pin #A9.", - "toolbar-temperature-sensor.title": "Temperature Sensor", - "toolbar-temperature-sensor.tryItDescription": "You can set the temperature in degrees Celsius.", - "toolbar-accelerometer-sensor.title": "Accelerometer", - "toolbar-accelerometer-sensor.description": "An accelerometer measures the acceleration of your micro:bit; this component senses when the micro:bit is moved.", - "toolbar-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", - "toolbar-microbit-light-sensor.title": "Light Sensor", - "toolbar-microbit-temperature-sensor.title": "Temperature Sensor", - "toolbar-microbit-led.title": "LEDs", - "toolbar-microbit-led.description": "The microbit has 25 LEDs for you to play with. The LEDs have 9 levels of brightness.", - "toolbar-microbit-led.tryItDescription": "Run your code and see the LEDs light up!", - "toolbar-microbit-a-b-push.title": "Buttons", - "toolbar-microbit-a-b-push.description": "There are two buttons on the front of the micro:bit (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", - "toolbar-microbit-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-microbit-sound.title": "Sound", - "toolbar-microbit-sound.description": "Your BBC micro:bit can be programmed to make a wide variety of sounds - from single notes, tones and beats to your own musical compositions.", - "toolbar-microbit-sound.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-gpio.title": "GPIO (Pins)", - "toolbar-microbit-gpio.description": "On the bottom edge of your BBC micro:bit there are 25 gold strips, called pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", - "toolbar-microbit-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-wireless.title": "Bluetooth & Radio", - "toolbar-microbit-wireless.description": "micro:bits can use radio waves and bluetooth services to communicate with each other.", + "toolbar-gpio.description": "8 GPIOs on the device! Pin A1 - A7 can also be used as capacitive touch sensors, and A0 is a true analog output pin.", + "toolbar-gpio.title": "GPIO", + "toolbar-gpio.tryItDescription": "Use your mouse to interact with the pin A1 - A7 or use your keyboard SHIFT + ”1” - “7”.", + "toolbar-ir-sensor.description": "Allows you to send commands to the device with a remote control, or even send messages between multiple devices! You can also do very simple proximity sensing since it reads the reflected light.", + "toolbar-ir-sensor.title": "IR Transmit & Receiver", + "toolbar-ir-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-light-sensor.description": "An analog light sensor can be used to detect ambient light, with similar spectral response to the human eye.", + "toolbar-light-sensor.title": "Light Sensor", + "toolbar-light-sensor.tryItDescription": "Change the brightness detected by the sensor here!", + "toolbar-motion-sensor.description": "Detects acceleration in X, Y and Z orientations. It can also detect 'tap' and 'double tap' strikes on the board and when the board is shaken.", + "toolbar-motion-sensor.title": "Motion Sensor", + "toolbar-motion-sensor.tryItDescription": "Change the acceleration here and click or click on the button to simulate a shake. The tap feature is not supported by the Device Simulator Express. If you would like to see the 'tap' feature implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-neo-pixels.description": "The 10 full color RGB LEDs surrounding the outer edge of the boards can be set to any color. Great for beautiful lighting effects!", + "toolbar-neo-pixels.title": "NeoPixels", + "toolbar-neo-pixels.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-a-b-push.description": "Two push buttons A and B are connected to digital pin #4 (Left) and #5 (Right) each.", + "toolbar-a-b-push.title": "Push Buttons", + "toolbar-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", + "toolbar-red-led.description": "This Red LED is connected to the digital #13 GPIO pin. It can be very handy when you want an indicator LED.", + "toolbar-red-led.title": "Red LED", + "toolbar-red-led.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-sound-sensor.description": "A digital microphone can detect audio volume and even perform basic FFT functions but cannot read it like an analog voltage.", + "toolbar-sound-sensor.title": "Sound Sensor", + "toolbar-sound-sensor.tryItDescription": "If you would like to see the sound sensor implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-slider-switch.description": "This slide switch returns True or False depending on whether it's ON or OFF and can be used as a toggle switch in your code!", + "toolbar-slider-switch.title": "Slider Switch", + "toolbar-slider-switch.tryItDescription": "Click it with your mouse or press 'S' on your keyboard to switch it ON and OFF!", + "toolbar-speaker.description": "This speaker can play a .wav file and different tones and also has a class D amplifier that is connected to an output A0 pin built in! You can turn it off using the shutdown control on pin #11 on the physical device.", + "toolbar-speaker.title": "Speaker", + "toolbar-speaker.tryItDescription": "Right now the tones are not supported on the simulator. If you would like to see tones implemented, please +1 the feature addition issue on GitHub! Regardless, you can play it on your device!", + "toolbar-temperature-sensor.description": "This sensor uses an NTC thermistor to sense temperature an calculate it with the analog voltage on analog pin #A9.", + "toolbar-temperature-sensor.title": "Temperature Sensor", + "toolbar-temperature-sensor.tryItDescription": "You can set the temperature in degrees Celsius.", + "toolbar-accelerometer-sensor.title": "Accelerometer", + "toolbar-accelerometer-sensor.description": "An accelerometer measures the acceleration of your micro:bit; this component senses when the micro:bit is moved.", + "toolbar-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", + "toolbar-microbit-light-sensor.title": "Light Sensor", + "toolbar-microbit-temperature-sensor.title": "Temperature Sensor", + "toolbar-microbit-led.title": "LEDs", + "toolbar-microbit-led.description": "The microbit has 25 LEDs for you to play with. The LEDs have 9 levels of brightness.", + "toolbar-microbit-led.tryItDescription": "Run your code and see the LEDs light up!", + "toolbar-microbit-a-b-push.title": "Buttons", + "toolbar-microbit-a-b-push.description": "There are two buttons on the front of the micro:bit (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", + "toolbar-microbit-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", + "toolbar-microbit-sound.title": "Sound", + "toolbar-microbit-sound.description": "Your BBC micro:bit can be programmed to make a wide variety of sounds - from single notes, tones and beats to your own musical compositions.", + "toolbar-microbit-sound.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-microbit-gpio.title": "GPIO (Pins)", + "toolbar-microbit-gpio.description": "On the bottom edge of your BBC micro:bit there are 25 gold strips, called pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", + "toolbar-microbit-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-microbit-wireless.title": "Bluetooth & Radio", + "toolbar-microbit-wireless.description": "micro:bits can use radio waves and bluetooth services to communicate with each other.", - "toolbar-microbit-wireless.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-gesture-sensor.title": "Gesture", - "toolbar-microbit-gesture-sensor.description": "If you move your BBC micro:bit in a certain way (as a gesture) then the micro:bit is able to detect this. It can recognize the following gestures: up, down, left, right, face up, face down, freefall, 3g, 6g, 8g, and shake.", + "toolbar-microbit-wireless.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-microbit-gesture-sensor.title": "Gesture", + "toolbar-microbit-gesture-sensor.description": "If you move your BBC micro:bit in a certain way (as a gesture) then the micro:bit is able to detect this. It can recognize the following gestures: up, down, left, right, face up, face down, freefall, 3g, 6g, 8g, and shake.", - "toolbar-microbit-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", - "toolbar-microbit-compass-sensor.title": "Compass", - "toolbar-microbit-compass-sensor.description": "A digital compass is an input sensor that detects magnetic fields. Your BBC micro:bit has an inbuilt compass that can detect the direction in which it is facing.", - "toolbar-microbit-compass-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-temperature-sensor.title": "Temperature", - "toolbar-clue-temperature-sensor.description": "CLUE uses the BMP280 sensor, an environmental sensor with temperature. This precision sensor from Bosch is the best low-cost, precision sensing solution for measuring temperature with ±1.0°C accuracy.", + "toolbar-microbit-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", + "toolbar-microbit-compass-sensor.title": "Compass", + "toolbar-microbit-compass-sensor.description": "A digital compass is an input sensor that detects magnetic fields. Your BBC micro:bit has an inbuilt compass that can detect the direction in which it is facing.", + "toolbar-microbit-compass-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", + "toolbar-clue-temperature-sensor.title": "Temperature", + "toolbar-clue-temperature-sensor.description": "CLUE uses the BMP280 sensor, an environmental sensor with temperature. This precision sensor from Bosch is the best low-cost, precision sensing solution for measuring temperature with ±1.0°C accuracy.", - "toolbar-clue-temperature-sensor.tryItDescription": "You can simulate the temperature in your code!", + "toolbar-clue-temperature-sensor.tryItDescription": "You can simulate the temperature in your code!", - "toolbar-clue-light-sensor.title": "Light/Color Sensor", - "toolbar-clue-light-sensor.description": "The light sensor uses APDS9960 and is able to return the red, blue, green and clear light.", - "toolbar-clue-light-sensor.tryItDescription": "You can set the color values of the light detected.", - "toolbar-clue-accelerometer-sensor.title": "Accelerometer", - "toolbar-clue-accelerometer-sensor.description": " The 3-axis accelerometer, can tell you which direction is down towards the Earth (by measuring gravity) or how fast the board is accelerating in 3D space.", - "toolbar-clue-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", - "toolbar-clue-led.title": "Neopixel", - "toolbar-clue-led.description": "The CLUE has one full RGB LED (NeoPixel) on the back of the device.", + "toolbar-clue-light-sensor.title": "Light/Color Sensor", + "toolbar-clue-light-sensor.description": "The light sensor uses APDS9960 and is able to return the red, blue, green and clear light.", + "toolbar-clue-light-sensor.tryItDescription": "You can set the color values of the light detected.", + "toolbar-clue-accelerometer-sensor.title": "Accelerometer", + "toolbar-clue-accelerometer-sensor.description": " The 3-axis accelerometer, can tell you which direction is down towards the Earth (by measuring gravity) or how fast the board is accelerating in 3D space.", + "toolbar-clue-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", + "toolbar-clue-led.title": "Neopixel", + "toolbar-clue-led.description": "The CLUE has one full RGB LED (NeoPixel) on the back of the device.", - "toolbar-clue-led.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-clue-a-b-push.title": "Buttons", - "toolbar-clue-a-b-push.description": "There are two buttons on the front of the CLUE (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", - "toolbar-clue-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-clue-gpio.title": "Input/Output (GPIO)", - "toolbar-clue-gpio.description": "On the bottom edge of your CLUE, you have 25 pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", - "toolbar-clue-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-sound-sensor.title": "Sound", - "toolbar-clue-sound-sensor.description": "The CLUE uses a PDM MEMS microphone. PDM is a little like 1-bit PWM. You clock the mic with a 1 MHz - 3 MHz clock rate, and on the data line you'll get a square wave out that syncs with the clock.", - "toolbar-clue-sound-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-pressure-sensor.title": "Pressure", - "toolbar-clue-pressure-sensor.description": "CLUE uses the BMP280 sensor for barometric pressure. Because pressure changes with altitude, you can also use it as an altimeter with ±1 meter accuracy.", + "toolbar-clue-led.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-clue-a-b-push.title": "Buttons", + "toolbar-clue-a-b-push.description": "There are two buttons on the front of the CLUE (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", + "toolbar-clue-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", + "toolbar-clue-gpio.title": "Input/Output (GPIO)", + "toolbar-clue-gpio.description": "On the bottom edge of your CLUE, you have 25 pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", + "toolbar-clue-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", + "toolbar-clue-sound-sensor.title": "Sound", + "toolbar-clue-sound-sensor.description": "The CLUE uses a PDM MEMS microphone. PDM is a little like 1-bit PWM. You clock the mic with a 1 MHz - 3 MHz clock rate, and on the data line you'll get a square wave out that syncs with the clock.", + "toolbar-clue-sound-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", + "toolbar-clue-pressure-sensor.title": "Pressure", + "toolbar-clue-pressure-sensor.description": "CLUE uses the BMP280 sensor for barometric pressure. Because pressure changes with altitude, you can also use it as an altimeter with ±1 meter accuracy.", - "toolbar-clue-pressure-sensor.tryItDescription": "You can set the pressure here in hectoPascals (hPa).", - "toolbar-clue-humidity-sensor.title": "Humidity", - "toolbar-clue-humidity-sensor.description": "The SHT30-D sensor has an excellent ±2% relative humidity and ±0.5°C accuracy for most uses.", - "toolbar-clue-humidity-sensor.tryItDescription": "You can set the humidity in percentage (%) here.", - "toolbar-clue-gesture-sensor.title": "Gesture", - "toolbar-clue-gesture-sensor.description": "The gesture sensor can detect directional gestures (left to right, right to left, up to down, down to up), but in theory more complicated gestures like zig-zag, clockwise or counterclockwise circle, near to far, etc. could also be detected with additional code. ", - "toolbar-clue-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", - "toolbar-clue-proximity-sensor.title": "Proximity", - "toolbar-clue-proximity-sensor.description": "The proximity sensor uses APDS9960 and is able to return how close an object is to the front of the sensor. This is a number from 0 to 255 where the higher the number the closer an object is to the sensor. You won't be able to translate this into an absolute value in units like inches or millimeters, you can only see how it changes relative to other values.", + "toolbar-clue-pressure-sensor.tryItDescription": "You can set the pressure here in hectoPascals (hPa).", + "toolbar-clue-humidity-sensor.title": "Humidity", + "toolbar-clue-humidity-sensor.description": "The SHT30-D sensor has an excellent ±2% relative humidity and ±0.5°C accuracy for most uses.", + "toolbar-clue-humidity-sensor.tryItDescription": "You can set the humidity in percentage (%) here.", + "toolbar-clue-gesture-sensor.title": "Gesture", + "toolbar-clue-gesture-sensor.description": "The gesture sensor can detect directional gestures (left to right, right to left, up to down, down to up), but in theory more complicated gestures like zig-zag, clockwise or counterclockwise circle, near to far, etc. could also be detected with additional code. ", + "toolbar-clue-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", + "toolbar-clue-proximity-sensor.title": "Proximity", + "toolbar-clue-proximity-sensor.description": "The proximity sensor uses APDS9960 and is able to return how close an object is to the front of the sensor. This is a number from 0 to 255 where the higher the number the closer an object is to the sensor. You won't be able to translate this into an absolute value in units like inches or millimeters, you can only see how it changes relative to other values.", - "toolbar-clue-proximity-sensor.tryItDescription": "Set relative proximity to the sensor in values from 0 - 255, where 0 means very close and 255 means very far.", + "toolbar-clue-proximity-sensor.tryItDescription": "Set relative proximity to the sensor in values from 0 - 255, where 0 means very close and 255 means very far.", - "toolbar-clue-bluetooth.title": "Bluetooth", - "toolbar-clue-bluetooth.description": "You can transmit data over Bluetooth to a computer or mobile device for data plotting and logging, or save it to the built in storage.", - "toolbar-clue-bluetooth.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! ", - "toolbar-clue-speaker.description": "The CLUE has a buzzer/speaker for playing tones and beeps.", - "toolbar-clue-magnet-sensor.title": "Magnetometer", - "toolbar-clue-magnet-sensor.description": "Sense the magnetic fields that surround us with this handy triple-axis magnetometer (compass) module. Magnetometers can sense where the strongest magnetic force is coming from, generally used to detect magnetic north, but can also be used for measuring magnetic fields.", - "toolbar-clue-magnet-sensor.tryItDescription": "You can set the magnetic field value in microTeslas (uT).", - "toolbar-clue-gyroscope-sensor.title": "Gyroscope", - "toolbar-clue-gyroscope-sensor.description": "The 3-axis gyroscope that can measure spin and twist users LSM6DS33.", - "toolbar-clue-gyroscope-sensor.tryItDescription": "Set the angular velocity in degrees/second." + "toolbar-clue-bluetooth.title": "Bluetooth", + "toolbar-clue-bluetooth.description": "You can transmit data over Bluetooth to a computer or mobile device for data plotting and logging, or save it to the built in storage.", + "toolbar-clue-bluetooth.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! ", + "toolbar-clue-speaker.description": "The CLUE has a buzzer/speaker for playing tones and beeps.", + "toolbar-clue-magnet-sensor.title": "Magnetometer", + "toolbar-clue-magnet-sensor.description": "Sense the magnetic fields that surround us with this handy triple-axis magnetometer (compass) module. Magnetometers can sense where the strongest magnetic force is coming from, generally used to detect magnetic north, but can also be used for measuring magnetic fields.", + "toolbar-clue-magnet-sensor.tryItDescription": "You can set the magnetic field value in microTeslas (uT).", + "toolbar-clue-gyroscope-sensor.title": "Gyroscope", + "toolbar-clue-gyroscope-sensor.description": "The 3-axis gyroscope that can measure spin and twist users LSM6DS33.", + "toolbar-clue-gyroscope-sensor.tryItDescription": "Set the angular velocity in degrees/second." } diff --git a/Source/view/tsconfig.json b/Source/view/tsconfig.json index 28c6454e0..3bb77287f 100644 --- a/Source/view/tsconfig.json +++ b/Source/view/tsconfig.json @@ -1,19 +1,19 @@ { - "compilerOptions": { - "module": "esnext", - "moduleResolution": "node", - "target": "es6", - "outDir": "out", - "lib": ["es6", "dom"], - "jsx": "react", - "sourceMap": true, - "rootDir": "..", - "strict": true, - "noUnusedLocals": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "experimentalDecorators": true - }, - "exclude": ["node_modules"], - "include": ["./index.tsx"] + "compilerOptions": { + "module": "esnext", + "moduleResolution": "node", + "target": "es6", + "outDir": "out", + "lib": ["es6", "dom"], + "jsx": "react", + "sourceMap": true, + "rootDir": "..", + "strict": true, + "noUnusedLocals": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "experimentalDecorators": true + }, + "exclude": ["node_modules"], + "include": ["./index.tsx"] } diff --git a/Source/view/utils/MessageUtils.tsx b/Source/view/utils/MessageUtils.tsx index a9fcf9c75..18adf5031 100644 --- a/Source/view/utils/MessageUtils.tsx +++ b/Source/view/utils/MessageUtils.tsx @@ -1,12 +1,12 @@ interface vscode { - postMessage(message: any): void; + postMessage(message: any): void; } declare const vscode: vscode; export const sendMessage = ( - type: string, - state: TState + type: string, + state: TState ) => { - vscode.postMessage({ command: type, text: state }); + vscode.postMessage({ command: type, text: state }); }; diff --git a/Source/view/viewUtils.tsx b/Source/view/viewUtils.tsx index 1335d039f..a210b8021 100644 --- a/Source/view/viewUtils.tsx +++ b/Source/view/viewUtils.tsx @@ -3,29 +3,29 @@ import { SENSOR_LIST } from "./constants"; // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. export interface ISliderProps { - minValue: number; - maxValue: number; - maxLabel: string; - minLabel: string; - type: string | SENSOR_LIST; - axisLabel: string; - value?: number; - onUpdateValue?: (sensor: SENSOR_LIST, value: number) => void; - step: number; + minValue: number; + maxValue: number; + maxLabel: string; + minLabel: string; + type: string | SENSOR_LIST; + axisLabel: string; + value?: number; + onUpdateValue?: (sensor: SENSOR_LIST, value: number) => void; + step: number; } export interface ISensorButtonProps { - label: string; - type: string; - onMouseUp?: (event: React.PointerEvent) => void; - onMouseDown?: (event: React.PointerEvent) => void; - onKeyUp?: (event: React.KeyboardEvent) => void; - onKeyDown?: (event: React.KeyboardEvent) => void; + label: string; + type: string; + onMouseUp?: (event: React.PointerEvent) => void; + onMouseDown?: (event: React.PointerEvent) => void; + onKeyUp?: (event: React.KeyboardEvent) => void; + onKeyDown?: (event: React.KeyboardEvent) => void; } export interface ISensorProps { - LABEL: string; - sliderProps: ISliderProps[]; - unitLabel: string; + LABEL: string; + sliderProps: ISliderProps[]; + unitLabel: string; } export const X_SLIDER_INDEX = 0; diff --git a/assets/dark-theme/open-simulator.svg b/assets/dark-theme/open-simulator.svg index 7dc10846a..6bcdc492a 100644 --- a/assets/dark-theme/open-simulator.svg +++ b/assets/dark-theme/open-simulator.svg @@ -1,4 +1,8 @@ - - + + diff --git a/assets/dark-theme/run-on-simulator.svg b/assets/dark-theme/run-on-simulator.svg index 410f09dbd..2583a1fda 100644 --- a/assets/dark-theme/run-on-simulator.svg +++ b/assets/dark-theme/run-on-simulator.svg @@ -1,4 +1,8 @@ - - + + diff --git a/assets/dark-theme/save-to-board.svg b/assets/dark-theme/save-to-board.svg index bba02a9e8..c8647fbd6 100644 --- a/assets/dark-theme/save-to-board.svg +++ b/assets/dark-theme/save-to-board.svg @@ -1,4 +1,8 @@ - - + + diff --git a/assets/light-theme/open-simulator.svg b/assets/light-theme/open-simulator.svg index 8e0745d02..ae17edbe8 100644 --- a/assets/light-theme/open-simulator.svg +++ b/assets/light-theme/open-simulator.svg @@ -1,4 +1,8 @@ - - + + diff --git a/assets/light-theme/run-on-simulator.svg b/assets/light-theme/run-on-simulator.svg index e04612cfa..a85fb4c52 100644 --- a/assets/light-theme/run-on-simulator.svg +++ b/assets/light-theme/run-on-simulator.svg @@ -1,4 +1,8 @@ - - + + diff --git a/assets/light-theme/save-to-board.svg b/assets/light-theme/save-to-board.svg index 307c0b1ea..0798693d0 100644 --- a/assets/light-theme/save-to-board.svg +++ b/assets/light-theme/save-to-board.svg @@ -1,4 +1,8 @@ - - + + diff --git a/docs/developers-setup.md b/docs/developers-setup.md index a31842a89..bbd33ebe4 100644 --- a/docs/developers-setup.md +++ b/docs/developers-setup.md @@ -2,36 +2,47 @@ ## Dependencies -- Node +- Node - - Download link : https://nodejs.org/en/download/ + - Download link : https://nodejs.org/en/download/ -- Python 3.7.4 (or latest) +- Python 3.7.4 (or latest) -- Download link : https://www.python.org/downloads/ -- **NOTE :** Make sure Python is in your path under an environment variable named `python` or `python3.7` (during installation or insert it manually afterwards) -- **NOTE :** Make sure pip is added to your environment variables as well - (for example it could be found at : `c:\users\<...>\appdata\local\programs\python\python37\lib\site-packages\pip`) -- Run in a console `python -m pip install --upgrade pip` - -* Python Modules - - **Note:** On extension activation, you will be prompted with a popup asking if you want the modules to be automatically installed for you. The following python modules should be downloaded when you select "yes" on the prompt message. - - pywin32 **(on Windows only)** - - On Windows, you need to use the following command in the console to manually install pywin32: `pip install pywin32` - - *playsound* - - *pytest* - - *python-socketio* - - *requests* - - *applicationinsights* +- Download link : https://www.python.org/downloads/ +- **NOTE :** Make sure Python is in your path under an environment variable + named `python` or `python3.7` (during installation or insert it manually + afterwards) +- **NOTE :** Make sure pip is added to your environment variables as well (for + example it could be found at : + `c:\users\<...>\appdata\local\programs\python\python37\lib\site-packages\pip`) +- Run in a console `python -m pip install --upgrade pip` - *italics*: used in simulation mode only -* VS Code +* Python Modules -* Python extension for VS Code (download from VS Code market place) + - **Note:** On extension activation, you will be prompted with a popup + asking if you want the modules to be automatically installed for you. + The following python modules should be downloaded when you select "yes" + on the prompt message. + + - pywin32 **(on Windows only)** + - On Windows, you need to use the following command in the console + to manually install pywin32: `pip install pywin32` + - _playsound_ + - _pytest_ + - _python-socketio_ + - _requests_ + - _applicationinsights_ + + _italics_: used in simulation mode only + +* VS Code + +* Python extension for VS Code (download from VS Code market place) ## Steps to Get Started Running the Extension Locally -1. Make sure you have all the dependencies installed (Node, Python, Playsound, VS Code, Python VS Code extension) +1. Make sure you have all the dependencies installed (Node, Python, Playsound, + VS Code, Python VS Code extension) 2. Open the repository @@ -41,38 +52,56 @@ 5. Run the command : `npm run compile` -6. Start running the extension locally by pressing F5 or going to VS Code Debug menu and select 'Start debugging' +6. Start running the extension locally by pressing F5 or going to VS Code Debug + menu and select 'Start debugging' ## Testing -- To run unit tests, run the command: `npm run test` in the root level directory. - - You will need Pytest installed for the Python tests to run correctly -- To run just the python tests, run the command: `pytest src` or `python -m pytest src` in the root level directory. +- To run unit tests, run the command: `npm run test` in the root level + directory. + - You will need Pytest installed for the Python tests to run correctly +- To run just the python tests, run the command: `pytest src` or + `python -m pytest src` in the root level directory. ## Notes on how to use it -- [Documentation to use the Extension](/docs/how-to-use.md) -- Debugging the extension opens a new VS Code window with the local build of the extension -- From the original VS Code window (opened in our repository) you can see outputs in the Debug Console -- In the new VS Code window, you can access the commands provided by the extension from the Commands Palette (Ctrl+Shift+P) - listed as 'Device Simulator Express : ...' -- If you change some files you'll need to run the 'npm run compile' command again and restart debugging +- [Documentation to use the Extension](/docs/how-to-use.md) +- Debugging the extension opens a new VS Code window with the local build of + the extension +- From the original VS Code window (opened in our repository) you can see + outputs in the Debug Console +- In the new VS Code window, you can access the commands provided by the + extension from the Commands Palette (Ctrl+Shift+P) listed as 'Device + Simulator Express : ...' +- If you change some files you'll need to run the 'npm run compile' command + again and restart debugging ## Formatting -- We use prettier to format the Typescript and CSS files, and we use black to format the Python files. - - You will need to install them, if they are not installed already. This can be done by running the command: `npm install prettier` and `pip install black` respectively. -- To check that your files are formatted correctly, run the command: `npm run check`. -- To format your files correctly, run the command: `npm run format`. +- We use prettier to format the Typescript and CSS files, and we use black to + format the Python files. + - You will need to install them, if they are not installed already. This + can be done by running the command: `npm install prettier` and + `pip install black` respectively. +- To check that your files are formatted correctly, run the command: + `npm run check`. +- To format your files correctly, run the command: `npm run format`. ## Repository Structure (important files) -- src - - `adafruit_circuitplayground` : our mock library - - `extension.ts` : our extension code - - `process_user_code.py` : the file containing the code ran by the Python process spawned by the extension, responsible for running the user's code - - `view` : React side - - `components/` - - `cpx/` and `Simulator.tsx` : contain the React components and objects to display and handle the simulator webview - - `toolbar/` : contains the React components used in the toolbar and the modal. - - `translation/en.json`: contains the constants that should be localized. To internationalize the extension you can add additional files with constants sharing the same id found in _en.json_, but with the translated values. +- src + - `adafruit_circuitplayground` : our mock library + - `extension.ts` : our extension code + - `process_user_code.py` : the file containing the code ran by the Python + process spawned by the extension, responsible for running the user's + code + - `view` : React side + - `components/` + - `cpx/` and `Simulator.tsx` : contain the React components and + objects to display and handle the simulator webview + - `toolbar/` : contains the React components used in the toolbar and + the modal. + - `translation/en.json`: contains the constants that should be + localized. To internationalize the extension you can add additional + files with constants sharing the same id found in _en.json_, but + with the translated values. diff --git a/docs/how-to-use.md b/docs/how-to-use.md index d94b4987c..b79e12b00 100644 --- a/docs/how-to-use.md +++ b/docs/how-to-use.md @@ -2,92 +2,126 @@ Commands are accessible through : -- **The command palette** (`Ctrl+Shift+P` or `View->Command Palette`) and type 'Device Simulator Express : `command_name`' -- **The extension buttons** available on the top right of the Text Editor Panel when you have a Python file open (1) +- **The command palette** (`Ctrl+Shift+P` or `View->Command Palette`) and type + 'Device Simulator Express : `command_name`' +- **The extension buttons** available on the top right of the Text Editor + Panel when you have a Python file open (1) ## Available commands -- **Open Simulator** : opens the webview of the simulator. +- **Open Simulator** : opens the webview of the simulator. -- **New File** : opens an unsaved file to help you and a code snippet that you can save and play around with. - _(**Note :** will open the simulator webview if it's not open yet)_. +- **New File** : opens an unsaved file to help you and a code snippet that you + can save and play around with. + _(**Note :** will open the simulator webview if it's not open yet)_. -- **Run Simulator** : runs the code you have opened in the simulator (make sure you've clicked on a valid code file). - _(**Note :** will open the simulator webview if it's not open yet)_. +- **Run Simulator** : runs the code you have opened in the simulator (make + sure you've clicked on a valid code file). + _(**Note :** will open the simulator webview if it's not open yet)_. -- **Deploy to Device** : saves the code to the connected device. - _(**Note :** For the Circuit Playground Express, the board needs to be correctly formatted to a `CIRCUITPY` drive first. If that's not the case check [Installing CircuitPython](https://learn.adafruit.com/welcome-to-circuitpython/installing-circuitpython) to correctly format it)_. +- **Deploy to Device** : saves the code to the connected device. + _(**Note :** For the Circuit Playground Express, the board needs to be + correctly formatted to a `CIRCUITPY` drive first. If that's not the case + check + [Installing CircuitPython](https://learn.adafruit.com/welcome-to-circuitpython/installing-circuitpython) + to correctly format it)_. -* **Select Serial Port** : selects the serial port of the board you want the serial monitor to interact with. (2) - _(**Note :** USB detection must be enabled in the extension settings.)_ +* **Select Serial Port** : selects the serial port of the board you want the + serial monitor to interact with. (2) _(**Note :** USB detection must be + enabled in the extension settings.)_ -* **Open Serial Monitor** : opens the serial monitor. (2) - _(**Note :** A serial port must have been selected already)_. +* **Open Serial Monitor** : opens the serial monitor. (2) + _(**Note :** A serial port must have been selected already)_. -* **Change Baud Rate** : changes the baud rate of the serial monitor. (2) +* **Change Baud Rate** : changes the baud rate of the serial monitor. (2) -* **Close Serial Montitor** : closes the serial monitor. (2) +* **Close Serial Montitor** : closes the serial monitor. (2) ## Available features -- We currently support the [Adafruit Circuit Playground Express board](https://www.adafruit.com/product/3333) -- Access to auto-completion and Python error flagging -- Output panel for the simulator -- Deploy to the physical device (if correctly formatted) -- Debugger for the simulator -- Serial Monitor (available on Windows and Mac only) -- Device's features : - - NeoPixels - - Buttons (A & B) - - Playing .wav files - - Red LED - - Switch - - Green LED - - Light sensor - - Motion sensors - - Acceleration detection - - Board shake detection - - Temperature sensor - - Touch sensors +- We currently support the + [Adafruit Circuit Playground Express board](https://www.adafruit.com/product/3333) +- Access to auto-completion and Python error flagging +- Output panel for the simulator +- Deploy to the physical device (if correctly formatted) +- Debugger for the simulator +- Serial Monitor (available on Windows and Mac only) +- Device's features : + - NeoPixels + - Buttons (A & B) + - Playing .wav files + - Red LED + - Switch + - Green LED + - Light sensor + - Motion sensors + - Acceleration detection + - Board shake detection + - Temperature sensor + - Touch sensors ## Not supported yet -- Auto-detect/format the device -- Device's features - - Sound sensor - - Tones -- Sound detection (3) -- IR transmitter (3) -- Motion sensors - - Tap detection +- Auto-detect/format the device +- Device's features + - Sound sensor + - Tones +- Sound detection (3) +- IR transmitter (3) +- Motion sensors + - Tap detection ## Device Simulator Express configuration -Here are the settings you can change in the Device Simulator Express configuration: +Here are the settings you can change in the Device Simulator Express +configuration: -- **Debugger Server Port:** allows you to change the port used to communicate with the debugger. Default value is _5577_. (4) +- **Debugger Server Port:** allows you to change the port used to communicate + with the debugger. Default value is _5577_. (4) -- **Enable USB Detection:** when disabled, prevents the serial monitor from listening to messages from the serial port. +- **Enable USB Detection:** when disabled, prevents the serial monitor from + listening to messages from the serial port. -- **Show Device Icon In Editor Title Menu:** allows you to choose whether the _`Deploy to Device`_ button should be in the editor title. +- **Show Device Icon In Editor Title Menu:** allows you to choose whether the + _`Deploy to Device`_ button should be in the editor title. -- **Show Open Icon In Editor Title Menu:** allows you to choose whether the _`Open Simulator`_ button should be in the editor title. +- **Show Open Icon In Editor Title Menu:** allows you to choose whether the + _`Open Simulator`_ button should be in the editor title. -- **Show Simulator Icon In Editor Title Menu:** allows you to choose whether the _`Run Simulator`_ button should be in the editor title. +- **Show Simulator Icon In Editor Title Menu:** allows you to choose whether + the _`Run Simulator`_ button should be in the editor title. -- **Show Dependency Install:** allows you to choose whether you want to be prompted to install the Python dependencies. +- **Show Dependency Install:** allows you to choose whether you want to be + prompted to install the Python dependencies. ## Troubleshooting Tips -- The first time you install the extension, you'll need to execute the `run` command at least once in order to access auto-completion. -- While running a code file, if you get an error saying it can't find the file, make sure you've clicked on a valid Python code file before running it. -- To open the output panel again after closing it go to VS Code menu : `View->Output`. -- For the Circuit Playground Express, if you try to deploy to the device while it's plugged in but you still get an error saying it cannot find the board, make sure your Circuit Playground Express is formatted correctly and that its name matches `CIRCUITPY`. -- If you can't get the Simulator communication working while debugging, try to open you `Settings` and check the port used under `'Device Simulator Express: Debugger Server Port'`. You can either change it (usually ports above 5000 could work) or try to free it, then start debugging again. +- The first time you install the extension, you'll need to execute the `run` + command at least once in order to access auto-completion. +- While running a code file, if you get an error saying it can't find the + file, make sure you've clicked on a valid Python code file before running + it. +- To open the output panel again after closing it go to VS Code menu : + `View->Output`. +- For the Circuit Playground Express, if you try to deploy to the device while + it's plugged in but you still get an error saying it cannot find the board, + make sure your Circuit Playground Express is formatted correctly and that + its name matches `CIRCUITPY`. +- If you can't get the Simulator communication working while debugging, try to + open you `Settings` and check the port used under + `'Device Simulator Express: Debugger Server Port'`. You can either change it + (usually ports above 5000 could work) or try to free it, then start + debugging again. ### Notes (1) Can be changed in settings. -(2) To use the Serial Monitor commands, you'll need to open a folder because this saves the configuration file for the serial communication. You can still use the rest of the extension without opening a folder. -(3) Sensors currently not supported by the official adafruit_circuit_playground.express library (v2.1.2). -(4) The regular communication is using the stdout and stdin of the Python process. But when you debug your code, it will communicate over sockets on port 5577. This is the default port that you can change in your `Settings` : `'Device Simulator Express: Debugger Server Port'`. +(2) To use the Serial Monitor commands, you'll need to open a folder because +this saves the configuration file for the serial communication. You can still +use the rest of the extension without opening a folder. +(3) Sensors currently not supported by the official +adafruit_circuit_playground.express library (v2.1.2). +(4) The regular communication is using the stdout and stdin of the Python +process. But when you debug your code, it will communicate over sockets on +port 5577. This is the default port that you can change in your `Settings` : +`'Device Simulator Express: Debugger Server Port'`. diff --git a/docs/install.md b/docs/install.md index 8a8421d6e..da5e79780 100644 --- a/docs/install.md +++ b/docs/install.md @@ -7,33 +7,48 @@ 2. Click on the latest release 3. At the bottom of the page download the .vsix file 4. To install the .vsix file : - - Go to the directory where the downloaded vsix file is and run in a command console: `code --install-extension ` - - Or in VS Code, go to the extension tab (a), in menu (b) select 'Install from VSIX' (c) and search the file you downloaded - ![VSIX Install Instructions](./vsix-install-instructions.png) + - Go to the directory where the downloaded vsix file is and run in a command + console: `code --install-extension ` + - Or in VS Code, go to the extension tab (a), in menu (b) select 'Install + from VSIX' (c) and search the file you downloaded + ![VSIX Install Instructions](./vsix-install-instructions.png) ## Prerequisites _Note: You need to install all the dependencies in order to use the extension._ -- [VS Code](https://code.visualstudio.com/Download) -- [Node](https://nodejs.org/en/download/) -- [Python 3.7.4](https://www.python.org/downloads/) - - **Warning :** Make sure you've included `python` (or `python3.7`) and `pip` to your `PATH` in your **environment variables**. - _(Note: the easiest way to do it might be when you install Python, you can select the "Add to PATH" option directly. Otherwise you can search how to insert it manually, but make sure that when you type `python` (or `python3.7`) in a terminal, the command is recognized.)_ -- [Python VS Code extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python) - - **Note:** This extension is installed automatically from the marketplace when you install our extension - -* Python Modules - - **Note:** On extension activation, you will be prompted with a popup asking if you want the modules to be automatically installed for you. The following python modules should be downloaded when you select "yes" on the prompt message. **If modules are not installed correctly, please use the "pip install" commands listed below.** - - pywin32 **(on Windows only)**: `pip install pywin32` - - On Windows, you need to use the above command in the console to manually install pywin32. - - *playsound*: `pip install playsound` - - *pytest*: `pip install pytest` - - *python-socketio*: `pip install python-socketio` - - *requests*: `pip install requests` - - *applicationinsights*: `pip install applicationinsights` - - *italics*: used in simulation mode only +- [VS Code](https://code.visualstudio.com/Download) +- [Node](https://nodejs.org/en/download/) +- [Python 3.7.4](https://www.python.org/downloads/) + - **Warning :** Make sure you've included `python` (or `python3.7`) and + `pip` to your `PATH` in your **environment variables**. + _(Note: the easiest way to do it might be when you install Python, you + can select the "Add to PATH" option directly. Otherwise you can search + how to insert it manually, but make sure that when you type `python` (or + `python3.7`) in a terminal, the command is recognized.)_ +- [Python VS Code extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python) + - **Note:** This extension is installed automatically from the marketplace + when you install our extension + +* Python Modules + + - **Note:** On extension activation, you will be prompted with a popup + asking if you want the modules to be automatically installed for you. + The following python modules should be downloaded when you select "yes" + on the prompt message. **If modules are not installed correctly, please + use the "pip install" commands listed below.** + + - pywin32 **(on Windows only)**: `pip install pywin32` + - On Windows, you need to use the above command in the console to + manually install pywin32. + - _playsound_: `pip install playsound` + - _pytest_: `pip install pytest` + - _python-socketio_: `pip install python-socketio` + - _requests_: `pip install requests` + - _applicationinsights_: `pip install applicationinsights` + + _italics_: used in simulation mode only + ## How to use the Extension -- [How to use the Extension](/docs/how-to-use.md) +- [How to use the Extension](/docs/how-to-use.md) diff --git a/docs/telemetry.md b/docs/telemetry.md index e9a22941e..5af450692 100644 --- a/docs/telemetry.md +++ b/docs/telemetry.md @@ -1,17 +1,21 @@ # Device Simulator Express Telemetry -The Device Simulator Express logs usage data and diagnostics telemetry through [Application Insights](https://azure.microsoft.com/en-us/services/monitor/). +The Device Simulator Express logs usage data and diagnostics telemetry through +[Application Insights](https://azure.microsoft.com/en-us/services/monitor/). ## Telemetry Gathered This extension collects basic diagnostics telemetry and usage data: -- **Diagnostics telemetry**: performance of extension commands and success / error rate -- **Usage telemetry**: user usage of extension commands and API calls +- **Diagnostics telemetry**: performance of extension commands and success / + error rate +- **Usage telemetry**: user usage of extension commands and API calls ## Usage Telemetry -Through the Application Insights API, telemetry events are collected on The Device Simulator Express extension usage. The follow table describes the Telemetry events we collect: +Through the Application Insights API, telemetry events are collected on The +Device Simulator Express extension usage. The follow table describes the +Telemetry events we collect: | **Property** | **Note** | | :--------------------: | --------------------------------------------------------------------------------------------- | diff --git a/gulpfile.js b/gulpfile.js index 65b6b47a2..bfec071bf 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,145 +1,145 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -const gulp = require("gulp"); - -const ts = require("gulp-typescript"); -const sourcemaps = require("gulp-sourcemaps"); -const typescript = require("typescript"); -const del = require("del"); -const es = require("event-stream"); -const vsce = require("vsce"); -const nls = require("vscode-nls-dev"); - -const tsProject = ts.createProject("./tsconfig.json", { typescript }); - -const inlineMap = true; -const inlineSource = false; -const outDest = "out"; - -// A list of all locales supported by VSCode can be found here: https://code.visualstudio.com/docs/getstarted/locales -const languages = [{ folderName: "en", id: "en" }]; - -gulp.task("clean", () => { - return del( - [ - "out/*", - "package.nls.*.json", - "../../dist/*0.0.0-UNTRACKEDVERSION.vsix", - ], - { force: true } - ); -}); - -const pythonToMove = [ - "./src/adafruit_circuitplayground/*.*", - "./src/clue/*.*", - "./src/clue/!(test)/**/*", - "./src/base_circuitpython/**/*", - "./src/micropython/*.*", - "./src/micropython/microbit/*.*", - "./src/micropython/microbit/!(test)/**/*", - "./src/*.py", - "./src/common/*.py", - "./src/dev-requirements.txt", - "./src/requirements.txt", - "./src/templates/*.*" -]; - -gulp.task("python-compile", () => { - // the base option sets the relative root for the set of files, - // preserving the folder structure - return gulp.src(pythonToMove, { base: "./src/" }).pipe(gulp.dest("out")); -}); - -gulp.task("internal-compile", () => { - return compile(false); -}); - -gulp.task("internal-nls-compile", () => { - return compile(true); -}); - -gulp.task("add-locales", () => { - return gulp - .src(["package.nls.json"]) - .pipe(nls.createAdditionalLanguageFiles(languages, "locales")) - .pipe(gulp.dest(".")); -}); - -gulp.task("vsce:publish", () => { - return vsce.publish(); -}); - -gulp.task("vsce:package", () => { - return vsce.createVSIX({ - packagePath: - "../../dist/deviceSimulatorExpress-0.0.0-UNTRACKEDVERSION.vsix", - }); -}); - -gulp.task( - "compile", - gulp.series("clean", "internal-compile", "python-compile", callback => { - callback(); - }) -); - -gulp.task( - "build", - gulp.series( - "clean", - "internal-nls-compile", - "python-compile", - "add-locales", - callback => { - callback(); - } - ) -); - -gulp.task( - "publish", - gulp.series("compile", "vsce:publish", callback => { - callback(); - }) -); - -gulp.task( - "package", - gulp.series("compile", "vsce:package", callback => { - callback(); - }) -); - -//---- internal - -function compile(buildNls) { - var r = tsProject - .src() - .pipe(sourcemaps.init()) - .pipe(tsProject()) - .js.pipe(buildNls ? nls.rewriteLocalizeCalls() : es.through()) - .pipe( - buildNls - ? nls.createAdditionalLanguageFiles(languages, "locales", "out") - : es.through() - ); - - if (inlineMap && inlineSource) { - r = r.pipe(sourcemaps.write()); - } else { - r = r.pipe( - sourcemaps.write("../out", { - // no inlined source - includeContent: inlineSource, - // Return relative source map root directories per file. - sourceRoot: "../src", - }) - ); - } - - return r.pipe(gulp.dest(outDest)); -} +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +const gulp = require("gulp"); + +const ts = require("gulp-typescript"); +const sourcemaps = require("gulp-sourcemaps"); +const typescript = require("typescript"); +const del = require("del"); +const es = require("event-stream"); +const vsce = require("vsce"); +const nls = require("vscode-nls-dev"); + +const tsProject = ts.createProject("./tsconfig.json", { typescript }); + +const inlineMap = true; +const inlineSource = false; +const outDest = "out"; + +// A list of all locales supported by VSCode can be found here: https://code.visualstudio.com/docs/getstarted/locales +const languages = [{ folderName: "en", id: "en" }]; + +gulp.task("clean", () => { + return del( + [ + "out/*", + "package.nls.*.json", + "../../dist/*0.0.0-UNTRACKEDVERSION.vsix", + ], + { force: true } + ); +}); + +const pythonToMove = [ + "./src/adafruit_circuitplayground/*.*", + "./src/clue/*.*", + "./src/clue/!(test)/**/*", + "./src/base_circuitpython/**/*", + "./src/micropython/*.*", + "./src/micropython/microbit/*.*", + "./src/micropython/microbit/!(test)/**/*", + "./src/*.py", + "./src/common/*.py", + "./src/dev-requirements.txt", + "./src/requirements.txt", + "./src/templates/*.*", +]; + +gulp.task("python-compile", () => { + // the base option sets the relative root for the set of files, + // preserving the folder structure + return gulp.src(pythonToMove, { base: "./src/" }).pipe(gulp.dest("out")); +}); + +gulp.task("internal-compile", () => { + return compile(false); +}); + +gulp.task("internal-nls-compile", () => { + return compile(true); +}); + +gulp.task("add-locales", () => { + return gulp + .src(["package.nls.json"]) + .pipe(nls.createAdditionalLanguageFiles(languages, "locales")) + .pipe(gulp.dest(".")); +}); + +gulp.task("vsce:publish", () => { + return vsce.publish(); +}); + +gulp.task("vsce:package", () => { + return vsce.createVSIX({ + packagePath: + "../../dist/deviceSimulatorExpress-0.0.0-UNTRACKEDVERSION.vsix", + }); +}); + +gulp.task( + "compile", + gulp.series("clean", "internal-compile", "python-compile", (callback) => { + callback(); + }) +); + +gulp.task( + "build", + gulp.series( + "clean", + "internal-nls-compile", + "python-compile", + "add-locales", + (callback) => { + callback(); + } + ) +); + +gulp.task( + "publish", + gulp.series("compile", "vsce:publish", (callback) => { + callback(); + }) +); + +gulp.task( + "package", + gulp.series("compile", "vsce:package", (callback) => { + callback(); + }) +); + +//---- internal + +function compile(buildNls) { + var r = tsProject + .src() + .pipe(sourcemaps.init()) + .pipe(tsProject()) + .js.pipe(buildNls ? nls.rewriteLocalizeCalls() : es.through()) + .pipe( + buildNls + ? nls.createAdditionalLanguageFiles(languages, "locales", "out") + : es.through() + ); + + if (inlineMap && inlineSource) { + r = r.pipe(sourcemaps.write()); + } else { + r = r.pipe( + sourcemaps.write("../out", { + // no inlined source + includeContent: inlineSource, + // Return relative source map root directories per file. + sourceRoot: "../src", + }) + ); + } + + return r.pipe(gulp.dest(outDest)); +} diff --git a/locales/en/out/constants.i18n.json b/locales/en/out/constants.i18n.json index d6df54300..079866bfc 100644 --- a/locales/en/out/constants.i18n.json +++ b/locales/en/out/constants.i18n.json @@ -1,45 +1,45 @@ { - "dialogResponses.agreeAndRun": "Agree and Run", - "dialogResponses.acceptPrivacy": "Got it", - "dialogResponses.cancel": "Cancel", - "dialogResponses.select": "Select", - "dialogResponses.dontShowAgain": "Don't Show Again", - "dialogResponses.exampleCode": "Example Code on GitHub", - "dialogResponses.help": "I need help", - "dialogResponses.installPython": "Install from python.org", - "dialogResponses.installNow": "Install Now", - "dialogResponses.dontInstall": "Don't Install", - "dialogResponses.tutorials": "Tutorials on Adafruit", - "dialogResponses.readInstall": "Read installation docs", - "error.debuggerServerInitFailed": "Warning : The Debugger Server cannot be opened. Please try to free the port {0} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.", - "error.debuggingSessionInProgress": "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n", - "error.noDevice": "No plugged in boards detected. Please double check if your board is connected and/or properly formatted", - "error.noFileToRun": "\n[ERROR] We can't find the .py file to run. Open up a new .py file, or browse through some examples\n", - "error.noFileToDeploy": "\n[ERROR] We can't find a Python file to deploy to your device.\n", - "error.noFolderCreated": "In order to use the Serial Monitor, you need to open a folder and reload VS Code.", - "error.noProgramFoundDebug": "Cannot find a program to debug.", - "error.noPythonPath": "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again.", - "error.stderr": "\n[ERROR] {0} \n", - "error.unexpectedMessage": "Webview sent an unexpected message", - "info.deployDevice": "\n[INFO] Deploying code to the device...\n", - "info.deploySimulator": "\n[INFO] Deploying code to the simulator...\n", - "info.deploySuccess": "\n[INFO] Code successfully deployed\n", - "info.extensionActivated": "Congratulations, your extension Adafruit_Simulator is now active!", - "info.firstTimeWebview": "To reopen the simulator select the command \"Open Simulator\" from command palette.", - "info.installPythonDependencies": "Do you want us to try and install this extensions dependencies for you?", - "error.invalidFileExtensionDebug": "The file you tried to run isn\\'t a Python file.", - "info.newFile": "New to Python or the Circuit Playground Express? We are here to help!", - "info.noDeviceChosenToDeployTo": "\n[INFO] No device was selected to deploy to.\n", - "info.noDeviceChosenToSimulateTo": "\n[INFO] No device was selected to simulate.\n", - "info.noDeviceChosenForNewFile": "\n[INFO] No device was selected to open a template file for.\n", - "info.redirect": "You are being redirected.", - "info.runningCode": "Running user code", - "info.privacyStatement": "Privacy Statement", - "info.successfulInstall": "Successfully installed Python dependencies.", - "info.thirdPartyWebsite": "By clicking \"Agree and Proceed\" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit's privacy policy", - "info.welcomeOutputTab": "Welcome to the Device Simulator Express output tab!\n\n", - "label.webviewPanel": "Device Simulator Express", - "name": "Device Simulator Express", + "dialogResponses.agreeAndRun": "Agree and Run", + "dialogResponses.acceptPrivacy": "Got it", + "dialogResponses.cancel": "Cancel", + "dialogResponses.select": "Select", + "dialogResponses.dontShowAgain": "Don't Show Again", + "dialogResponses.exampleCode": "Example Code on GitHub", + "dialogResponses.help": "I need help", + "dialogResponses.installPython": "Install from python.org", + "dialogResponses.installNow": "Install Now", + "dialogResponses.dontInstall": "Don't Install", + "dialogResponses.tutorials": "Tutorials on Adafruit", + "dialogResponses.readInstall": "Read installation docs", + "error.debuggerServerInitFailed": "Warning : The Debugger Server cannot be opened. Please try to free the port {0} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.", + "error.debuggingSessionInProgress": "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n", + "error.noDevice": "No plugged in boards detected. Please double check if your board is connected and/or properly formatted", + "error.noFileToRun": "\n[ERROR] We can't find the .py file to run. Open up a new .py file, or browse through some examples\n", + "error.noFileToDeploy": "\n[ERROR] We can't find a Python file to deploy to your device.\n", + "error.noFolderCreated": "In order to use the Serial Monitor, you need to open a folder and reload VS Code.", + "error.noProgramFoundDebug": "Cannot find a program to debug.", + "error.noPythonPath": "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again.", + "error.stderr": "\n[ERROR] {0} \n", + "error.unexpectedMessage": "Webview sent an unexpected message", + "info.deployDevice": "\n[INFO] Deploying code to the device...\n", + "info.deploySimulator": "\n[INFO] Deploying code to the simulator...\n", + "info.deploySuccess": "\n[INFO] Code successfully deployed\n", + "info.extensionActivated": "Congratulations, your extension Adafruit_Simulator is now active!", + "info.firstTimeWebview": "To reopen the simulator select the command \"Open Simulator\" from command palette.", + "info.installPythonDependencies": "Do you want us to try and install this extensions dependencies for you?", + "error.invalidFileExtensionDebug": "The file you tried to run isn\\'t a Python file.", + "info.newFile": "New to Python or the Circuit Playground Express? We are here to help!", + "info.noDeviceChosenToDeployTo": "\n[INFO] No device was selected to deploy to.\n", + "info.noDeviceChosenToSimulateTo": "\n[INFO] No device was selected to simulate.\n", + "info.noDeviceChosenForNewFile": "\n[INFO] No device was selected to open a template file for.\n", + "info.redirect": "You are being redirected.", + "info.runningCode": "Running user code", + "info.privacyStatement": "Privacy Statement", + "info.successfulInstall": "Successfully installed Python dependencies.", + "info.thirdPartyWebsite": "By clicking \"Agree and Proceed\" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit's privacy policy", + "info.welcomeOutputTab": "Welcome to the Device Simulator Express output tab!\n\n", + "label.webviewPanel": "Device Simulator Express", + "name": "Device Simulator Express", - "warning.agreeAndRun": "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk." + "warning.agreeAndRun": "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk." } diff --git a/locales/en/package.i18n.json b/locales/en/package.i18n.json index 4f34f2536..c2a23bf24 100644 --- a/locales/en/package.i18n.json +++ b/locales/en/package.i18n.json @@ -1,17 +1,17 @@ { - "deviceSimulatorExpressExtension.commands.common.installDependencies": "Install Extension Dependencies", - "deviceSimulatorExpressExtension.commands.common.label": "Device Simulator Express", - "deviceSimulatorExpressExtension.commands.common.runSimulator": "Run Simulator", - "deviceSimulatorExpressExtension.commands.common.gettingStarted": "Getting Started", - "deviceSimulatorExpressExtension.commands.common.changeBaudRate": "Change Baud Rate", - "deviceSimulatorExpressExtension.commands.common.closeSerialMonitor": "Close Serial Monitor", - "deviceSimulatorExpressExtension.commands.common.openSerialMonitor": "Open Serial Monitor", - "deviceSimulatorExpressExtension.commands.common.selectSerialPort": "Select Serial Port", - "deviceSimulatorExpressExtension.commands.common.deployToDevice": "Deploy to Device", - "deviceSimulatorExpressExtension.commands.common.openSimulator": "Open Simulator", - "deviceSimulatorExpressExtension.commands.common.newFile": "New File", - "deviceSimulatorExpressExtension.configuration.title": "Device Simulator Express configuration", - "deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange": "When you change the Python interpreter, the Device Simulator Express will automatically configure itself for the required dependencies.", - "deviceSimulatorExpressExtension.configuration.properties.debuggerPort": "The port the Server will listen on for communication with the debugger.", - "deviceSimulatorExpressExtension.configuration.properties.dependencyChecker": "Whether or not to ask if we can download dependencies. If unchecked, the extension will default to never download dependencies, except when automatically creating a virtual environment in the extension files." -} \ No newline at end of file + "deviceSimulatorExpressExtension.commands.common.installDependencies": "Install Extension Dependencies", + "deviceSimulatorExpressExtension.commands.common.label": "Device Simulator Express", + "deviceSimulatorExpressExtension.commands.common.runSimulator": "Run Simulator", + "deviceSimulatorExpressExtension.commands.common.gettingStarted": "Getting Started", + "deviceSimulatorExpressExtension.commands.common.changeBaudRate": "Change Baud Rate", + "deviceSimulatorExpressExtension.commands.common.closeSerialMonitor": "Close Serial Monitor", + "deviceSimulatorExpressExtension.commands.common.openSerialMonitor": "Open Serial Monitor", + "deviceSimulatorExpressExtension.commands.common.selectSerialPort": "Select Serial Port", + "deviceSimulatorExpressExtension.commands.common.deployToDevice": "Deploy to Device", + "deviceSimulatorExpressExtension.commands.common.openSimulator": "Open Simulator", + "deviceSimulatorExpressExtension.commands.common.newFile": "New File", + "deviceSimulatorExpressExtension.configuration.title": "Device Simulator Express configuration", + "deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange": "When you change the Python interpreter, the Device Simulator Express will automatically configure itself for the required dependencies.", + "deviceSimulatorExpressExtension.configuration.properties.debuggerPort": "The port the Server will listen on for communication with the debugger.", + "deviceSimulatorExpressExtension.configuration.properties.dependencyChecker": "Whether or not to ask if we can download dependencies. If unchecked, the extension will default to never download dependencies, except when automatically creating a virtual environment in the extension files." +} diff --git a/misc/usbmapping.json b/misc/usbmapping.json index e3d9519a5..584bd236a 100644 --- a/misc/usbmapping.json +++ b/misc/usbmapping.json @@ -1,18 +1,15 @@ [ - { - "index_file": "https://adafruit.github.io/arduino-board-index/package_adafruit_index.json", - "boards": [ - { - "vid": "239a", - "pid": [ - "8019" - ], - "name": "Adafruit Circuit Playground Express", - "package": "adafruit", - "architecture": "samd", - "id": "cpx" - } - - ] - } -] \ No newline at end of file + { + "index_file": "https://adafruit.github.io/arduino-board-index/package_adafruit_index.json", + "boards": [ + { + "vid": "239a", + "pid": ["8019"], + "name": "Adafruit Circuit Playground Express", + "package": "adafruit", + "architecture": "samd", + "id": "cpx" + } + ] + } +] diff --git a/package.json b/package.json index c3d9e093d..cddc5aca6 100644 --- a/package.json +++ b/package.json @@ -1,327 +1,327 @@ { - "name": "__EXTENSIONNAME__", - "displayName": "__DISPLAYNAME__", - "description": "__DESCRIPTION__", - "version": "0.0.0-UNTRACKEDVERSION", - "publisher": "__PUBLISHER__", - "instrumentationKey": "__AIKEY__", - "icon": "assets/icon.png", - "engines": { - "vscode": "^1.43.0" - }, - "categories": [ - "Other" - ], - "preview": true, - "license": "MIT", - "homepage": "https://github.com/microsoft/vscode-python-devicesimulator", - "repository": { - "type": "git", - "url": "https://github.com/microsoft/vscode-python-devicesimulator" - }, - "bugs": { - "url": "https://github.com/microsoft/vscode-python-devicesimulator/issues" - }, - "keywords": [ - "python", - "CircuitPython", - "Adafruit", - "microbit", - "MicroPython" - ], - "activationEvents": [ - "onCommand:deviceSimulatorExpress.common.installDependencies", - "onCommand:deviceSimulatorExpress.common.openSerialMonitor", - "onCommand:deviceSimulatorExpress.common.runSimulator", - "onCommand:deviceSimulatorExpress.common.selectSerialPort", - "onCommand:deviceSimulatorExpress.common.gettingStarted", - "onCommand:deviceSimulatorExpress.common.deployToDevice", - "onCommand:deviceSimulatorExpress.common.newFile", - "onCommand:deviceSimulatorExpress.common.openSimulator", - "onDebug" - ], - "main": "./out/extension.js", - "contributes": { - "commands": [ - { - "command": "deviceSimulatorExpress.common.installDependencies", - "title": "%deviceSimulatorExpressExtension.commands.common.installDependencies%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.changeBaudRate", - "title": "%deviceSimulatorExpressExtension.commands.common.changeBaudRate%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.closeSerialMonitor", - "title": "%deviceSimulatorExpressExtension.commands.common.closeSerialMonitor%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.openSerialMonitor", - "title": "%deviceSimulatorExpressExtension.commands.common.openSerialMonitor%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.selectSerialPort", - "title": "%deviceSimulatorExpressExtension.commands.common.selectSerialPort%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.runSimulator", - "title": "%deviceSimulatorExpressExtension.commands.common.runSimulator%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.gettingStarted", - "title": "%deviceSimulatorExpressExtension.commands.common.gettingStarted%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.deployToDevice", - "title": "%deviceSimulatorExpressExtension.commands.common.deployToDevice%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.newFile", - "title": "%deviceSimulatorExpressExtension.commands.common.newFile%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.openSimulator", - "title": "%deviceSimulatorExpressExtension.commands.common.openSimulator%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - } - ], - "colors": [ - { - "id": "highContrastButtonBorderOverride.color", - "description": "Color for the high contrast border updated", - "defaults": { - "dark": "debugToolBar.background", - "light": "debugToolBar.background", - "highContrast": "#6FC3DF" - } - }, - { - "id": "badgeForegroundOverride", - "description": "Color that fixes the issue with midnight blue ", - "defaults": { - "dark": "#FFFFFF", - "light": "badge.foreground", - "highContrast": "#FFFFFF" - } - } - ], - "configuration": { - "type": "object", - "title": "%deviceSimulatorExpressExtension.configuration.title%", - "properties": { - "deviceSimulatorExpress.configNewEnvironmentUponSwitch": { - "type": "boolean", - "default": false, - "description": "%deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange%", - "scope": "resource" - }, - "deviceSimulatorExpress.enableUSBDetection": { - "type": "boolean", - "default": true - }, - "deviceSimulatorExpress.showDependencyInstall": { - "type": "boolean", - "default": true, - "description": "%deviceSimulatorExpressExtension.configuration.properties.dependencyChecker%", - "scope": "resource" - }, - "deviceSimulatorExpress.showNewFilePopup": { - "type": "boolean", - "default": true, - "scope": "resource" - }, - "deviceSimulatorExpress.debuggerServerPort": { - "type": "number", - "default": 5577, - "description": "%deviceSimulatorExpressExtension.configuration.properties.debuggerPort%", - "scope": "resource" - } - } - }, - "breakpoints": [ - { - "language": "python" - } - ], - "debuggers": [ - { - "type": "deviceSimulatorExpress", - "label": "Device Simulator Express Debugger", - "languages": [ - "python" - ], - "configurationAttributes": { - "launch": { - "properties": { - "program": { - "type": "string", - "description": "Absolute path to the code file.", - "default": "${file}" - }, - "stopOnEntry": { - "type": "boolean", - "description": "Automatically stop after launch.", - "default": true - }, - "console": { - "enum": [ - "internalConsole", - "integratedTerminal", - "externalTerminal" - ], - "description": "Where to launch the debug target: internal console, integrated terminal, or external terminal.", - "default": "integratedTerminal" - }, - "args": { - "type": "array", - "description": "Command line arguments passed to the program.", - "default": [], - "items": { - "filePath": "string", - "serverPort": "string" - } - }, - "rules": { - "type": "array", - "description": "Debugger rules.", - "default": [], - "items": { - "path": "string", - "include": "boolean" - } - } - } - } - }, - "initialConfigurations": [ - { - "type": "deviceSimulatorExpress", - "request": "launch", - "name": "Device Simulator Express Debugger", - "console": "integratedTerminal" - } - ], - "configurationSnippets": [ - { - "label": "Device Simulator Express Debugger : Launch", - "description": "Device Simulator Express Debugger - A configuration for debugging a python code file for the Device Simulator Express simulator.", - "body": { - "type": "deviceSimulatorExpress", - "request": "launch", - "name": "Device Simulator Express Debugger", - "console": "integratedTerminal" - } - } - ] - } - ] - }, - "scripts": { - "start": "webpack-dev-server", - "vscode:prepublish": "npm run compile", - "build": "gulp build", - "clean": "gulp clean", - "compile": "npm-run-all compile:*", - "compile:extension": "gulp compile", - "compile:views": "webpack --mode development", - "watch": "npm-run-all -p watch:*", - "watch:extension": "tsc --watch", - "watch:views": "webpack --watch --mode development", - "pretest": "npm run compile", - "test": "npm-run-all test:*", - "test:extension-tests": "node ./out/test/runTest.js", - "test:ts": "jest", - "test:api-tests": "pytest src", - "lint": "npm-run-all lint:*", - "lint:ts": "tslint -c tslint.json src/**/*.{ts,tsx}", - "lint:python": "pylint src", - "format": "npm-run-all format:*", - "format:ts": "prettier --config .prettierrc.yaml --write src/**/*.{css,ts,tsx}", - "format:python": "black src", - "check": "npm-run-all check:*", - "check:ts": "prettier --config .prettierrc.yaml --check src/**/*.{css,ts,tsx}", - "check:python": "black src --check", - "package": "vsce package" - }, - "devDependencies": { - "@types/glob": "^7.1.1", - "@types/node": "^10.12.21", - "@types/react": "16.8.6", - "@types/react-dom": "16.8.4", - "@types/vscode": "^1.45.1", - "css-loader": "^1.0.0", - "del": "^4.0.0", - "event-stream": "^4.0.1", - "gulp": "^4.0.2", - "gulp-cli": "^2.1.0", - "gulp-filter": "^5.1.0", - "gulp-sourcemaps": "^2.6.5", - "gulp-typescript": "^5.0.1", - "less": "^3.7.0", - "less-loader": "^4.1.0", - "mocha": "^6.1.4", - "npm-run-all": "^4.1.3", - "prettier": "^1.19.1", - "react-scripts": "^3.4.0", - "style-loader": "^0.21.0", - "ts-import-plugin": "^1.5.4", - "ts-loader": "^4.4.2", - "tslint": "^5.12.1", - "tslint-config-prettier": "^1.18.0", - "tslint-microsoft-contrib": "^6.1.0", - "tslint-react": "^3.6.0", - "tslint-react-hooks": "^2.0.0", - "typescript": "^3.8.3", - "typescript-react-intl": "^0.4.0", - "version-from-git": "^1.1.1", - "vsce": "^1.47.0", - "vscode-nls-dev": "^3.2.6", - "vscode-test": "^1.0.0", - "webpack": "^4.15.1", - "webpack-cli": "^3.0.8" - }, - "dependencies": { - "@babel/preset-typescript": "^7.8.3", - "@testing-library/jest-dom": "^5.0.2", - "@testing-library/react": "^9.4.0", - "@types/jest": "^24.9.0", - "@types/open": "^6.1.0", - "@types/react-test-renderer": "^16.9.0", - "@types/socket.io": "^2.1.2", - "babel-jest": "^25.1.0", - "compare-versions": "^3.5.1", - "eventemitter2": "^5.0.1", - "glob": "^7.1.4", - "jest": "^25.1.0", - "jest-transform-css": "^2.0.0", - "office-ui-fabric-react": "^7.105.12", - "open": "^6.4.0", - "os": "^0.1.1", - "react": "^16.9.0", - "react-dom": "^16.9.0", - "react-intl": "^3.1.9", - "react-test-renderer": "^16.9.0", - "socket.io": "^2.4.0", - "svg-inline-react": "^3.1.0", - "ts-jest": "^25.0.0", - "usb-native": "^5.0.1", - "util": "^0.12.1", - "vscode-extension-telemetry": "^0.1.1", - "vscode-nls": "^4.1.0" - }, - "eslintConfig": { - "extends": "react-app" - }, - "extensionDependencies": [ - "ms-python.python" - ] + "name": "__EXTENSIONNAME__", + "displayName": "__DISPLAYNAME__", + "version": "0.0.0-UNTRACKEDVERSION", + "description": "__DESCRIPTION__", + "categories": [ + "Other" + ], + "keywords": [ + "python", + "CircuitPython", + "Adafruit", + "microbit", + "MicroPython" + ], + "homepage": "https://github.com/microsoft/vscode-python-devicesimulator", + "bugs": { + "url": "https://github.com/microsoft/vscode-python-devicesimulator/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode-python-devicesimulator" + }, + "license": "MIT", + "publisher": "__PUBLISHER__", + "main": "./out/extension.js", + "scripts": { + "start": "webpack-dev-server", + "vscode:prepublish": "npm run compile", + "build": "gulp build", + "clean": "gulp clean", + "compile": "npm-run-all compile:*", + "compile:extension": "gulp compile", + "compile:views": "webpack --mode development", + "watch": "npm-run-all -p watch:*", + "watch:extension": "tsc --watch", + "watch:views": "webpack --watch --mode development", + "pretest": "npm run compile", + "test": "npm-run-all test:*", + "test:extension-tests": "node ./out/test/runTest.js", + "test:ts": "jest", + "test:api-tests": "pytest src", + "lint": "npm-run-all lint:*", + "lint:ts": "tslint -c tslint.json src/**/*.{ts,tsx}", + "lint:python": "pylint src", + "format": "npm-run-all format:*", + "format:ts": "prettier --config .prettierrc.yaml --write src/**/*.{css,ts,tsx}", + "format:python": "black src", + "check": "npm-run-all check:*", + "check:ts": "prettier --config .prettierrc.yaml --check src/**/*.{css,ts,tsx}", + "check:python": "black src --check", + "package": "vsce package" + }, + "contributes": { + "breakpoints": [ + { + "language": "python" + } + ], + "colors": [ + { + "id": "highContrastButtonBorderOverride.color", + "description": "Color for the high contrast border updated", + "defaults": { + "dark": "debugToolBar.background", + "light": "debugToolBar.background", + "highContrast": "#6FC3DF" + } + }, + { + "id": "badgeForegroundOverride", + "description": "Color that fixes the issue with midnight blue ", + "defaults": { + "dark": "#FFFFFF", + "light": "badge.foreground", + "highContrast": "#FFFFFF" + } + } + ], + "commands": [ + { + "command": "deviceSimulatorExpress.common.installDependencies", + "title": "%deviceSimulatorExpressExtension.commands.common.installDependencies%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.changeBaudRate", + "title": "%deviceSimulatorExpressExtension.commands.common.changeBaudRate%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.closeSerialMonitor", + "title": "%deviceSimulatorExpressExtension.commands.common.closeSerialMonitor%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.openSerialMonitor", + "title": "%deviceSimulatorExpressExtension.commands.common.openSerialMonitor%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.selectSerialPort", + "title": "%deviceSimulatorExpressExtension.commands.common.selectSerialPort%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.runSimulator", + "title": "%deviceSimulatorExpressExtension.commands.common.runSimulator%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.gettingStarted", + "title": "%deviceSimulatorExpressExtension.commands.common.gettingStarted%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.deployToDevice", + "title": "%deviceSimulatorExpressExtension.commands.common.deployToDevice%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.newFile", + "title": "%deviceSimulatorExpressExtension.commands.common.newFile%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.openSimulator", + "title": "%deviceSimulatorExpressExtension.commands.common.openSimulator%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + } + ], + "configuration": { + "type": "object", + "title": "%deviceSimulatorExpressExtension.configuration.title%", + "properties": { + "deviceSimulatorExpress.configNewEnvironmentUponSwitch": { + "type": "boolean", + "default": false, + "description": "%deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange%", + "scope": "resource" + }, + "deviceSimulatorExpress.enableUSBDetection": { + "type": "boolean", + "default": true + }, + "deviceSimulatorExpress.showDependencyInstall": { + "type": "boolean", + "default": true, + "description": "%deviceSimulatorExpressExtension.configuration.properties.dependencyChecker%", + "scope": "resource" + }, + "deviceSimulatorExpress.showNewFilePopup": { + "type": "boolean", + "default": true, + "scope": "resource" + }, + "deviceSimulatorExpress.debuggerServerPort": { + "type": "number", + "default": 5577, + "description": "%deviceSimulatorExpressExtension.configuration.properties.debuggerPort%", + "scope": "resource" + } + } + }, + "debuggers": [ + { + "type": "deviceSimulatorExpress", + "label": "Device Simulator Express Debugger", + "languages": [ + "python" + ], + "configurationAttributes": { + "launch": { + "properties": { + "program": { + "type": "string", + "description": "Absolute path to the code file.", + "default": "${file}" + }, + "stopOnEntry": { + "type": "boolean", + "description": "Automatically stop after launch.", + "default": true + }, + "console": { + "enum": [ + "internalConsole", + "integratedTerminal", + "externalTerminal" + ], + "description": "Where to launch the debug target: internal console, integrated terminal, or external terminal.", + "default": "integratedTerminal" + }, + "args": { + "type": "array", + "description": "Command line arguments passed to the program.", + "default": [], + "items": { + "filePath": "string", + "serverPort": "string" + } + }, + "rules": { + "type": "array", + "description": "Debugger rules.", + "default": [], + "items": { + "path": "string", + "include": "boolean" + } + } + } + } + }, + "initialConfigurations": [ + { + "type": "deviceSimulatorExpress", + "request": "launch", + "name": "Device Simulator Express Debugger", + "console": "integratedTerminal" + } + ], + "configurationSnippets": [ + { + "label": "Device Simulator Express Debugger : Launch", + "description": "Device Simulator Express Debugger - A configuration for debugging a python code file for the Device Simulator Express simulator.", + "body": { + "type": "deviceSimulatorExpress", + "request": "launch", + "name": "Device Simulator Express Debugger", + "console": "integratedTerminal" + } + } + ] + } + ] + }, + "activationEvents": [ + "onCommand:deviceSimulatorExpress.common.installDependencies", + "onCommand:deviceSimulatorExpress.common.openSerialMonitor", + "onCommand:deviceSimulatorExpress.common.runSimulator", + "onCommand:deviceSimulatorExpress.common.selectSerialPort", + "onCommand:deviceSimulatorExpress.common.gettingStarted", + "onCommand:deviceSimulatorExpress.common.deployToDevice", + "onCommand:deviceSimulatorExpress.common.newFile", + "onCommand:deviceSimulatorExpress.common.openSimulator", + "onDebug" + ], + "eslintConfig": { + "extends": "react-app" + }, + "dependencies": { + "@babel/preset-typescript": "7.8.3", + "@testing-library/jest-dom": "5.0.2", + "@testing-library/react": "9.4.0", + "@types/jest": "24.9.0", + "@types/open": "6.1.0", + "@types/react-test-renderer": "16.9.0", + "@types/socket.io": "2.1.2", + "babel-jest": "25.1.0", + "compare-versions": "3.5.1", + "eventemitter2": "5.0.1", + "glob": "7.1.4", + "jest": "25.1.0", + "jest-transform-css": "2.0.0", + "office-ui-fabric-react": "7.105.12", + "open": "6.4.0", + "os": "0.1.1", + "react": "16.9.0", + "react-dom": "16.9.0", + "react-intl": "3.1.9", + "react-test-renderer": "16.9.0", + "socket.io": "2.4.0", + "svg-inline-react": "3.1.0", + "ts-jest": "25.0.0", + "usb-native": "5.0.1", + "util": "0.12.1", + "vscode-extension-telemetry": "0.1.1", + "vscode-nls": "4.1.0" + }, + "devDependencies": { + "@types/glob": "7.1.1", + "@types/node": "10.12.21", + "@types/react": "16.8.6", + "@types/react-dom": "16.8.4", + "@types/vscode": "1.45.1", + "css-loader": "1.0.0", + "del": "4.0.0", + "event-stream": "4.0.1", + "gulp": "4.0.2", + "gulp-cli": "2.1.0", + "gulp-filter": "5.1.0", + "gulp-sourcemaps": "2.6.5", + "gulp-typescript": "5.0.1", + "less": "3.7.0", + "less-loader": "4.1.0", + "mocha": "6.1.4", + "npm-run-all": "4.1.3", + "prettier": "1.19.1", + "react-scripts": "3.4.0", + "style-loader": "0.21.0", + "ts-import-plugin": "1.5.4", + "ts-loader": "4.4.2", + "tslint": "5.12.1", + "tslint-config-prettier": "1.18.0", + "tslint-microsoft-contrib": "6.1.0", + "tslint-react": "3.6.0", + "tslint-react-hooks": "2.0.0", + "typescript": "3.8.3", + "typescript-react-intl": "0.4.0", + "version-from-git": "1.1.1", + "vsce": "1.47.0", + "vscode-nls-dev": "3.2.6", + "vscode-test": "1.0.0", + "webpack": "4.15.1", + "webpack-cli": "3.0.8" + }, + "extensionDependencies": [ + "ms-python.python" + ], + "engines": { + "vscode": "1.43.0" + }, + "icon": "assets/icon.png", + "preview": true, + "instrumentationKey": "__AIKEY__" } diff --git a/package.nls.json b/package.nls.json index e662c005a..56d7a34ed 100644 --- a/package.nls.json +++ b/package.nls.json @@ -1,17 +1,17 @@ { - "deviceSimulatorExpressExtension.commands.common.installDependencies": "Install Extension Dependencies", - "deviceSimulatorExpressExtension.commands.common.label": "Device Simulator Express", - "deviceSimulatorExpressExtension.commands.common.runSimulator": "Run Simulator", - "deviceSimulatorExpressExtension.commands.common.gettingStarted": "Getting Started", - "deviceSimulatorExpressExtension.commands.common.changeBaudRate": "Change Baud Rate", - "deviceSimulatorExpressExtension.commands.common.closeSerialMonitor": "Close Serial Monitor", - "deviceSimulatorExpressExtension.commands.common.openSerialMonitor": "Open Serial Monitor", - "deviceSimulatorExpressExtension.commands.common.selectSerialPort": "Select Serial Port", - "deviceSimulatorExpressExtension.commands.common.deployToDevice": "Deploy to Device", - "deviceSimulatorExpressExtension.commands.common.openSimulator": "Open Simulator", - "deviceSimulatorExpressExtension.commands.common.newFile": "New File", - "deviceSimulatorExpressExtension.configuration.title": "Device Simulator Express configuration", - "deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange": "When you change the Python interpreter, the Device Simulator Express will automatically configure itself for the required dependencies.", - "deviceSimulatorExpressExtension.configuration.properties.debuggerPort": "The port the Server will listen on for communication with the debugger.", - "deviceSimulatorExpressExtension.configuration.properties.dependencyChecker": "Whether or not to ask for dependency downloads. If unchecked, the extension will default to never download dependencies, except when automatically creating a virtual environment in the extension files." -} \ No newline at end of file + "deviceSimulatorExpressExtension.commands.common.installDependencies": "Install Extension Dependencies", + "deviceSimulatorExpressExtension.commands.common.label": "Device Simulator Express", + "deviceSimulatorExpressExtension.commands.common.runSimulator": "Run Simulator", + "deviceSimulatorExpressExtension.commands.common.gettingStarted": "Getting Started", + "deviceSimulatorExpressExtension.commands.common.changeBaudRate": "Change Baud Rate", + "deviceSimulatorExpressExtension.commands.common.closeSerialMonitor": "Close Serial Monitor", + "deviceSimulatorExpressExtension.commands.common.openSerialMonitor": "Open Serial Monitor", + "deviceSimulatorExpressExtension.commands.common.selectSerialPort": "Select Serial Port", + "deviceSimulatorExpressExtension.commands.common.deployToDevice": "Deploy to Device", + "deviceSimulatorExpressExtension.commands.common.openSimulator": "Open Simulator", + "deviceSimulatorExpressExtension.commands.common.newFile": "New File", + "deviceSimulatorExpressExtension.configuration.title": "Device Simulator Express configuration", + "deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange": "When you change the Python interpreter, the Device Simulator Express will automatically configure itself for the required dependencies.", + "deviceSimulatorExpressExtension.configuration.properties.debuggerPort": "The port the Server will listen on for communication with the debugger.", + "deviceSimulatorExpressExtension.configuration.properties.dependencyChecker": "Whether or not to ask for dependency downloads. If unchecked, the extension will default to never download dependencies, except when automatically creating a virtual environment in the extension files." +} diff --git a/tsconfig.json b/tsconfig.json index 8fd7e5501..8aa229a90 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,13 +1,13 @@ { - "compilerOptions": { - "module": "commonjs", - "target": "es6", - "outDir": "out", - "lib": ["es6", "dom"], - "sourceMap": true, - "rootDir": "src", - "jsx": "react", - "alwaysStrict": true - }, - "exclude": ["node_modules", ".vscode-test"] + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "outDir": "out", + "lib": ["es6", "dom"], + "sourceMap": true, + "rootDir": "src", + "jsx": "react", + "alwaysStrict": true + }, + "exclude": ["node_modules", ".vscode-test"] } diff --git a/tslint.json b/tslint.json index 534279116..1a4aa8078 100644 --- a/tslint.json +++ b/tslint.json @@ -1,34 +1,34 @@ { - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": [ - "tslint:latest", - "tslint-react", - "tslint-config-prettier", - "tslint-react-hooks", - "tslint-microsoft-contrib/latest" - ], - "rules": { - "no-implicit-dependencies": [true, "dev"], - "no-string-throw": true, - "no-unused-expression": true, - "no-duplicate-variable": true, - "no-empty": false, - "no-relative-imports": false, - "max-func-body-length": false, - "curly": true, - "class-name": true, - "triple-equals": true, - "object-literal-sort-keys": true, - "react-hooks-nesting": "error", - "ordered-imports": true, - "import-name": false, - "member-access": false, - "no-console": false, - "jsx-boolean-value": false, - "no-unnecessary-semicolons": false, - "no-http-string": false, - "export-name": false, - "interface-name": false - }, - "defaultSeverity": "warning" + "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], + "extends": [ + "tslint:latest", + "tslint-react", + "tslint-config-prettier", + "tslint-react-hooks", + "tslint-microsoft-contrib/latest" + ], + "rules": { + "no-implicit-dependencies": [true, "dev"], + "no-string-throw": true, + "no-unused-expression": true, + "no-duplicate-variable": true, + "no-empty": false, + "no-relative-imports": false, + "max-func-body-length": false, + "curly": true, + "class-name": true, + "triple-equals": true, + "object-literal-sort-keys": true, + "react-hooks-nesting": "error", + "ordered-imports": true, + "import-name": false, + "member-access": false, + "no-console": false, + "jsx-boolean-value": false, + "no-unnecessary-semicolons": false, + "no-http-string": false, + "export-name": false, + "interface-name": false + }, + "defaultSeverity": "warning" } diff --git a/webpack.config.js b/webpack.config.js index 82aae8c6e..95533509a 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -2,85 +2,85 @@ const path = require("path"); const tsImportPlugin = require("ts-import-plugin"); module.exports = { - entry: { - simulator: "./src/view/index.tsx" - }, - output: { - path: path.resolve(__dirname, "out"), - filename: "[name].js" - }, - devServer: { - historyApiFallback: true - }, - devtool: "source-map", - resolve: { - extensions: [".js", ".ts", ".tsx", ".json"] - }, - module: { - rules: [ - { - test: /\.(ts|tsx)$/, - loader: "ts-loader", - options: { - getCustomTransformers: () => ({ - before: [ - tsImportPlugin({ - libraryName: "antd", - libraryDirectory: "es", - style: true - }) - ] - }) - } - }, - { - test: /\.less$/, - use: [ - { - loader: "style-loader" - }, - { - loader: "css-loader", - options: { - importLoaders: 1, - sourceMap: true - } - }, - { - loader: "less-loader", - options: { - javascriptEnabled: true, - sourceMap: true, - modifyVars: { - "@body-background": "var(--background-color)" - } - } - } - ] - }, - { - test: /\.css$/, - use: [ - { - loader: "style-loader" - }, - { - loader: "css-loader" - } - ] - }, - { - test: /\.svg$/, - loader: "svg-inline" - } - ] - } - // When importing a module whose path matches one of the following, just - // assume a corresponding global variable exists and use that instead. - // This is important because it allows us to avoid bundling all of our - // dependencies, which allows browsers to cache those libraries between builds. - // externals: { - // react: "React", - // "react-dom": "ReactDOM" - // } + entry: { + simulator: "./src/view/index.tsx", + }, + output: { + path: path.resolve(__dirname, "out"), + filename: "[name].js", + }, + devServer: { + historyApiFallback: true, + }, + devtool: "source-map", + resolve: { + extensions: [".js", ".ts", ".tsx", ".json"], + }, + module: { + rules: [ + { + test: /\.(ts|tsx)$/, + loader: "ts-loader", + options: { + getCustomTransformers: () => ({ + before: [ + tsImportPlugin({ + libraryName: "antd", + libraryDirectory: "es", + style: true, + }), + ], + }), + }, + }, + { + test: /\.less$/, + use: [ + { + loader: "style-loader", + }, + { + loader: "css-loader", + options: { + importLoaders: 1, + sourceMap: true, + }, + }, + { + loader: "less-loader", + options: { + javascriptEnabled: true, + sourceMap: true, + modifyVars: { + "@body-background": "var(--background-color)", + }, + }, + }, + ], + }, + { + test: /\.css$/, + use: [ + { + loader: "style-loader", + }, + { + loader: "css-loader", + }, + ], + }, + { + test: /\.svg$/, + loader: "svg-inline", + }, + ], + }, + // When importing a module whose path matches one of the following, just + // assume a corresponding global variable exists and use that instead. + // This is important because it allows us to avoid bundling all of our + // dependencies, which allows browsers to cache those libraries between builds. + // externals: { + // react: "React", + // "react-dom": "ReactDOM" + // } }; From 03d679fb16e20e4f8e48aa0aa751f5a91dfe30e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Nov 2023 14:38:10 +0000 Subject: [PATCH 15/64] Bump pillow from 8.1.1 to 10.0.1 in /Source Bumps [pillow](https://github.com/python-pillow/Pillow) from 8.1.1 to 10.0.1. - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/8.1.1...10.0.1) --- updated-dependencies: - dependency-name: pillow dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- Source/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/requirements.txt b/Source/requirements.txt index 3a5fdb5a2..d2f475b86 100644 --- a/Source/requirements.txt +++ b/Source/requirements.txt @@ -6,7 +6,7 @@ pywin32==227; platform_system == "Windows" PyObjC; platform_system == "darwin" uflash==1.3.0 adafruit-circuitpython-fancyled==1.3.3 -Pillow==8.1.1 +Pillow==10.0.1 adafruit-circuitpython-bitmap_font==1.1.0 adafruit-circuitpython-display-shapes==1.2.0 adafruit-circuitpython-neopixel==5.0.0 From 51f223a1dea4861b6a0abb762e825bd77902f100 Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Fri, 17 Nov 2023 17:03:12 +0200 Subject: [PATCH 16/64] squash! --- package.json | 104 +++++++++++++++++++++++++-------------------------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/package.json b/package.json index cddc5aca6..ffebb153b 100644 --- a/package.json +++ b/package.json @@ -250,70 +250,70 @@ "extends": "react-app" }, "dependencies": { - "@babel/preset-typescript": "7.8.3", - "@testing-library/jest-dom": "5.0.2", - "@testing-library/react": "9.4.0", - "@types/jest": "24.9.0", + "@babel/preset-typescript": "7.23.3", + "@testing-library/jest-dom": "6.1.4", + "@testing-library/react": "14.1.0", + "@types/jest": "29.5.8", "@types/open": "6.1.0", - "@types/react-test-renderer": "16.9.0", - "@types/socket.io": "2.1.2", - "babel-jest": "25.1.0", - "compare-versions": "3.5.1", - "eventemitter2": "5.0.1", - "glob": "7.1.4", - "jest": "25.1.0", - "jest-transform-css": "2.0.0", - "office-ui-fabric-react": "7.105.12", - "open": "6.4.0", - "os": "0.1.1", - "react": "16.9.0", - "react-dom": "16.9.0", - "react-intl": "3.1.9", - "react-test-renderer": "16.9.0", - "socket.io": "2.4.0", - "svg-inline-react": "3.1.0", - "ts-jest": "25.0.0", - "usb-native": "5.0.1", - "util": "0.12.1", + "@types/react-test-renderer": "18.0.6", + "@types/socket.io": "3.0.1", + "babel-jest": "29.7.0", + "compare-versions": "6.1.0", + "eventemitter2": "6.4.9", + "glob": "10.3.10", + "jest": "29.7.0", + "jest-transform-css": "6.0.1", + "office-ui-fabric-react": "7.204.0", + "open": "9.1.0", + "os": "0.1.2", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-intl": "6.5.5", + "react-test-renderer": "18.2.0", + "socket.io": "4.7.2", + "svg-inline-react": "3.2.1", + "ts-jest": "29.1.1", + "usb-native": "6.0.0", + "util": "0.12.5", "vscode-extension-telemetry": "0.1.1", - "vscode-nls": "4.1.0" + "vscode-nls": "5.2.0" }, "devDependencies": { - "@types/glob": "7.1.1", - "@types/node": "10.12.21", - "@types/react": "16.8.6", - "@types/react-dom": "16.8.4", - "@types/vscode": "1.45.1", - "css-loader": "1.0.0", - "del": "4.0.0", + "@types/glob": "8.1.0", + "@types/node": "20.9.1", + "@types/react": "18.2.37", + "@types/react-dom": "18.2.15", + "@types/vscode": "1.84.1", + "css-loader": "6.8.1", + "del": "7.1.0", "event-stream": "4.0.1", "gulp": "4.0.2", - "gulp-cli": "2.1.0", - "gulp-filter": "5.1.0", - "gulp-sourcemaps": "2.6.5", + "gulp-cli": "2.3.0", + "gulp-filter": "9.0.1", + "gulp-sourcemaps": "3.0.0", "gulp-typescript": "5.0.1", - "less": "3.7.0", - "less-loader": "4.1.0", - "mocha": "6.1.4", - "npm-run-all": "4.1.3", - "prettier": "1.19.1", - "react-scripts": "3.4.0", - "style-loader": "0.21.0", - "ts-import-plugin": "1.5.4", - "ts-loader": "4.4.2", - "tslint": "5.12.1", + "less": "4.2.0", + "less-loader": "11.1.3", + "mocha": "10.2.0", + "npm-run-all": "4.1.5", + "prettier": "3.1.0", + "react-scripts": "5.0.1", + "style-loader": "3.3.3", + "ts-import-plugin": "3.0.0", + "ts-loader": "9.5.1", + "tslint": "5.20.1", "tslint-config-prettier": "1.18.0", "tslint-microsoft-contrib": "6.1.0", - "tslint-react": "3.6.0", - "tslint-react-hooks": "2.0.0", - "typescript": "3.8.3", - "typescript-react-intl": "0.4.0", + "tslint-react": "4.1.0", + "tslint-react-hooks": "2.2.2", + "typescript": "5.2.2", + "typescript-react-intl": "0.4.1", "version-from-git": "1.1.1", "vsce": "1.47.0", - "vscode-nls-dev": "3.2.6", + "vscode-nls-dev": "4.0.4", "vscode-test": "1.0.0", - "webpack": "4.15.1", - "webpack-cli": "3.0.8" + "webpack": "5.89.0", + "webpack-cli": "5.1.4" }, "extensionDependencies": [ "ms-python.python" From daa3789653123db3a3a4b69fb68b9798ff9e0207 Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Fri, 17 Nov 2023 19:28:17 +0200 Subject: [PATCH 17/64] squash! --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ffebb153b..473a3977e 100644 --- a/package.json +++ b/package.json @@ -252,7 +252,7 @@ "dependencies": { "@babel/preset-typescript": "7.23.3", "@testing-library/jest-dom": "6.1.4", - "@testing-library/react": "14.1.0", + "@testing-library/react": "14.1.2", "@types/jest": "29.5.8", "@types/open": "6.1.0", "@types/react-test-renderer": "18.0.6", From adf966005235889b301531d98d3186c46c328f9a Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Sun, 19 Nov 2023 01:06:45 +0200 Subject: [PATCH 18/64] squash! --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 473a3977e..cd6592f97 100644 --- a/package.json +++ b/package.json @@ -280,7 +280,7 @@ }, "devDependencies": { "@types/glob": "8.1.0", - "@types/node": "20.9.1", + "@types/node": "20.9.2", "@types/react": "18.2.37", "@types/react-dom": "18.2.15", "@types/vscode": "1.84.1", @@ -296,7 +296,6 @@ "less-loader": "11.1.3", "mocha": "10.2.0", "npm-run-all": "4.1.5", - "prettier": "3.1.0", "react-scripts": "5.0.1", "style-loader": "3.3.3", "ts-import-plugin": "3.0.0", From ebfb2e461729ee7ac859fb0c146389bd56b0fb30 Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Sun, 19 Nov 2023 01:46:44 +0200 Subject: [PATCH 19/64] squash! --- PRIVACY.md | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/PRIVACY.md b/PRIVACY.md index aca263491..7ca7ec04b 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -2,21 +2,31 @@ ## Data Collection -The software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft's privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704​​​​​​​. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices. +The software may collect information about you and your use of the software and +send it to Microsoft. Microsoft may use this information to provide services and +improve our products and services. You may turn off the telemetry as described +in the repository. There are also some features in the software that may enable +you and Microsoft to collect data from users of your applications. If you use +these features, you must comply with applicable law, including providing +appropriate notices to users of your applications together with a copy of +Microsoft's privacy statement. Our privacy statement is located at +https://go.microsoft.com/fwlink/?LinkID=824704​​​​​​​. You can learn more about +data collection and use in the help documentation and our privacy statement. +Your use of the software operates as your consent to these practices. ## Disable Telemetry -The Microsoft Device Simulator Express Extension for Visual Studio Code collects usage -data and sends it to Microsoft to help improve our products and -services. Read our -[privacy statement](https://privacy.microsoft.com/privacystatement) to -learn more. This extension respects the `telemetry.enableTelemetry` -setting which you can learn more about at +The Microsoft Device Simulator Express Extension for Visual Studio Code collects +usage data and sends it to Microsoft to help improve our products and services. +Read our [privacy statement](https://privacy.microsoft.com/privacystatement) to +learn more. This extension respects the `telemetry.enableTelemetry` setting +which you can learn more about at https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting. To disable telemetry, follow these steps: -1) Open **File** (Open **Code** on macOS) -2) Select **Preferences** -3) Select **Settings** -4) Search for `telemetry` -5) Uncheck the **Telemetry: Enable Telemetry** setting + +1. Open **File** (Open **Code** on macOS) +2. Select **Preferences** +3. Select **Settings** +4. Search for `telemetry` +5. Uncheck the **Telemetry: Enable Telemetry** setting From d041b13dd2b458489832baf91efe6e5206ca79c5 Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Mon, 20 Nov 2023 07:12:16 +0200 Subject: [PATCH 20/64] squash! --- .vscode/extensions.json | 7 ------- .vscode/launch.json | 30 ------------------------------ .vscode/settings.json | 10 ---------- .vscode/tasks.json | 25 ------------------------- 4 files changed, 72 deletions(-) delete mode 100644 .vscode/extensions.json delete mode 100644 .vscode/launch.json delete mode 100644 .vscode/settings.json delete mode 100644 .vscode/tasks.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index 0a18b9c4b..000000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - // See http://go.microsoft.com/fwlink/?LinkId=827846 - // for the documentation about the extensions.json format - "recommendations": [ - "ms-vscode.vscode-typescript-tslint-plugin" - ] -} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 36aa66946..000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,30 +0,0 @@ -// A launch configuration that compiles the extension and then opens it inside a new window -// Use IntelliSense to learn about possible attributes. -// Hover to view descriptions of existing attributes. -// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Run Extension", - "type": "extensionHost", - "request": "launch", - "runtimeExecutable": "${execPath}", - "args": ["--extensionDevelopmentPath=${workspaceFolder}"], - "outFiles": ["${workspaceFolder}/out/**/*.js"], - "preLaunchTask": "npm: watch" - }, - { - "name": "Extension Tests", - "type": "extensionHost", - "request": "launch", - "runtimeExecutable": "${execPath}", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}", - "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" - ], - "outFiles": ["${workspaceFolder}/out/test/**/*.js"], - "preLaunchTask": "npm: watch" - } - ] -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 0b79e8a23..000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,10 +0,0 @@ -// Place your settings in this file to overwrite default and user settings. -{ - "files.exclude": { - "out": false // set this to true to hide the "out" folder with the compiled JS files - }, - "search.exclude": { - "out": true // set this to false to include "out" folder in search results - } - // Turn off tsc task auto detection since we have the necessary tasks as npm scripts -} diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index db16afdd4..000000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,25 +0,0 @@ -// See https://go.microsoft.com/fwlink/?LinkId=733558 -// for the documentation about the tasks.json format -{ - "version": "2.0.0", - "tasks": [ - { - "type": "npm", - "script": "watch", - "problemMatcher": "$tsc-watch", - "isBackground": true, - "presentation": { - "reveal": "never" - }, - "group": { - "kind": "build", - "isDefault": true - } - }, - { - "type": "gulp", - "task": "add-locales", - "problemMatcher": [] - } - ] -} From f24c9919a4beda72daad87f21659b36ddcd5891f Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Mon, 20 Nov 2023 18:11:31 +0200 Subject: [PATCH 21/64] squash! --- .../toolbar/clue/ClueModalContent.tsx | 504 +++++++++--------- .../toolbar/clue/ClueSensorProperties.tsx | 312 +++++------ .../toolbar/cpx/CpxModalContent.tsx | 310 +++++------ .../toolbar/cpx/CpxSensorProperties.tsx | 96 ++-- .../toolbar/microbit/MicrobitModalContent.tsx | 292 +++++----- .../microbit/MicrobitSensorProperties.tsx | 96 ++-- 6 files changed, 805 insertions(+), 805 deletions(-) diff --git a/Source/view/components/toolbar/clue/ClueModalContent.tsx b/Source/view/components/toolbar/clue/ClueModalContent.tsx index b4fc4a136..34a56b1d0 100644 --- a/Source/view/components/toolbar/clue/ClueModalContent.tsx +++ b/Source/view/components/toolbar/clue/ClueModalContent.tsx @@ -8,311 +8,311 @@ import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; import * as SENSOR_PROPERTIES from "./ClueSensorProperties"; export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-clue-temperature-sensor.description", - descriptionTitle: "toolbar-clue-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-temperature-sensor.tryItDescription", - }; + const temperatureSensorValues = { + T: sensorValues[SENSOR_LIST.TEMPERATURE], + }; + return { + components: [ + , + ], + descriptionText: "toolbar-clue-temperature-sensor.description", + descriptionTitle: "toolbar-clue-temperature-sensor.title", + id: "temperature", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-temperature-sensor.tryItDescription", + }; }; export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-gpio.description", - tryItDescription: "toolbar-clue-gpio.tryItDescription", - components: undefined, - id: "GPIO", - }; + return { + descriptionTitle: "toolbar-clue-gpio.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-gpio.description", + tryItDescription: "toolbar-clue-gpio.tryItDescription", + components: undefined, + id: "GPIO", + }; }; export const ACCELEROMETER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const accelerometerSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-accelerometer-sensor.description", - descriptionTitle: "toolbar-clue-accelerometer-sensor.title", - id: "accelerometer", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-accelerometer-sensor.tryItDescription", - }; + const accelerometerSensorValues = { + X: sensorValues[SENSOR_LIST.MOTION_X], + Y: sensorValues[SENSOR_LIST.MOTION_Y], + Z: sensorValues[SENSOR_LIST.MOTION_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-accelerometer-sensor.description", + descriptionTitle: "toolbar-clue-accelerometer-sensor.title", + id: "accelerometer", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-accelerometer-sensor.tryItDescription", + }; }; export const GYROSCOPE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const gyroSensorValues = { - X: sensorValues[SENSOR_LIST.GYRO_X], - Y: sensorValues[SENSOR_LIST.GYRO_Y], - Z: sensorValues[SENSOR_LIST.GYRO_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-gyroscope-sensor.description", - descriptionTitle: "toolbar-clue-gyroscope-sensor.title", - id: "gyroscope", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-gyroscope-sensor.tryItDescription", - }; + const gyroSensorValues = { + X: sensorValues[SENSOR_LIST.GYRO_X], + Y: sensorValues[SENSOR_LIST.GYRO_Y], + Z: sensorValues[SENSOR_LIST.GYRO_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-gyroscope-sensor.description", + descriptionTitle: "toolbar-clue-gyroscope-sensor.title", + id: "gyroscope", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-gyroscope-sensor.tryItDescription", + }; }; export const MAGNETOSCOPE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const magnetSensorValues = { - X: sensorValues[SENSOR_LIST.MAGNET_X], - Y: sensorValues[SENSOR_LIST.MAGNET_Y], - Z: sensorValues[SENSOR_LIST.MAGNET_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-magnet-sensor.description", - descriptionTitle: "toolbar-clue-magnet-sensor.title", - id: "magnetoscope", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-magnet-sensor.tryItDescription", - }; + const magnetSensorValues = { + X: sensorValues[SENSOR_LIST.MAGNET_X], + Y: sensorValues[SENSOR_LIST.MAGNET_Y], + Z: sensorValues[SENSOR_LIST.MAGNET_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-magnet-sensor.description", + descriptionTitle: "toolbar-clue-magnet-sensor.title", + id: "magnetoscope", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-magnet-sensor.tryItDescription", + }; }; export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const lightSensorValues = { - R: sensorValues[SENSOR_LIST.LIGHT_R], - G: sensorValues[SENSOR_LIST.LIGHT_G], - B: sensorValues[SENSOR_LIST.LIGHT_B], - C: sensorValues[SENSOR_LIST.LIGHT_C], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-light-sensor.description", - descriptionTitle: "toolbar-clue-light-sensor.title", - id: "light_sensor", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-light-sensor.tryItDescription", - }; + const lightSensorValues = { + R: sensorValues[SENSOR_LIST.LIGHT_R], + G: sensorValues[SENSOR_LIST.LIGHT_G], + B: sensorValues[SENSOR_LIST.LIGHT_B], + C: sensorValues[SENSOR_LIST.LIGHT_C], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-light-sensor.description", + descriptionTitle: "toolbar-clue-light-sensor.title", + id: "light_sensor", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-light-sensor.tryItDescription", + }; }; export const HUMIDITY_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const humiditySensorValues = { - H: sensorValues[SENSOR_LIST.HUMIDITY], - }; - return { - descriptionTitle: "toolbar-clue-humidity-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-humidity-sensor.description", - tryItDescription: "toolbar-clue-humidity-sensor.tryItDescription", - components: [ - , - ], - id: "humidity_sensor", - }; + const humiditySensorValues = { + H: sensorValues[SENSOR_LIST.HUMIDITY], + }; + return { + descriptionTitle: "toolbar-clue-humidity-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-humidity-sensor.description", + tryItDescription: "toolbar-clue-humidity-sensor.tryItDescription", + components: [ + , + ], + id: "humidity_sensor", + }; }; export const GESTURE_CONTENT = ( - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void + onSelectGestures?: (event: React.ChangeEvent) => void, + sendGesture?: (isActive: boolean) => void ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-gesture-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-gesture-sensor.description", - tryItDescription: "toolbar-clue-gesture-sensor.tryItDescription", - components: [ - , - ], - id: "gesture_sensor", - }; + return { + descriptionTitle: "toolbar-clue-gesture-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-gesture-sensor.description", + tryItDescription: "toolbar-clue-gesture-sensor.tryItDescription", + components: [ + , + ], + id: "gesture_sensor", + }; }; export const PROXIMITY_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const proximitySensorValues = { - P: sensorValues[SENSOR_LIST.PROXIMITY], - }; - return { - descriptionTitle: "toolbar-clue-proximity-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-proximity-sensor.description", - tryItDescription: "toolbar-clue-proximity-sensor.tryItDescription", - components: [ - , - ], - id: "proximity_sensor", - }; + const proximitySensorValues = { + P: sensorValues[SENSOR_LIST.PROXIMITY], + }; + return { + descriptionTitle: "toolbar-clue-proximity-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-proximity-sensor.description", + tryItDescription: "toolbar-clue-proximity-sensor.tryItDescription", + components: [ + , + ], + id: "proximity_sensor", + }; }; export const PRESSURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const pressureSensorValues = { - P: sensorValues[SENSOR_LIST.PRESSURE], - }; - return { - descriptionTitle: "toolbar-clue-pressure-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-pressure-sensor.description", - tryItDescription: "toolbar-clue-pressure-sensor.tryItDescription", - components: [ - , - ], - id: "pressure_sensor", - }; + const pressureSensorValues = { + P: sensorValues[SENSOR_LIST.PRESSURE], + }; + return { + descriptionTitle: "toolbar-clue-pressure-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-pressure-sensor.description", + tryItDescription: "toolbar-clue-pressure-sensor.tryItDescription", + components: [ + , + ], + id: "pressure_sensor", + }; }; export const BUTTON_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-a-b-push.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-clue-a-b-push.description", - tryItDescription: "toolbar-clue-a-b-push.tryItDescription", - components: undefined, - id: "microbit_button", - }; + return { + descriptionTitle: "toolbar-clue-a-b-push.title", + tagInput: undefined, + tagOutput: TAG_INPUT_SVG, + descriptionText: "toolbar-clue-a-b-push.description", + tryItDescription: "toolbar-clue-a-b-push.tryItDescription", + components: undefined, + id: "microbit_button", + }; }; export const BLUETOOTH_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-bluetooth.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-clue-bluetooth.description", - tryItDescription: "toolbar-clue-bluetooth.tryItDescription", - components: undefined, - id: "bluetooth", - }; + return { + descriptionTitle: "toolbar-clue-bluetooth.title", + tagInput: undefined, + tagOutput: TAG_INPUT_SVG, + descriptionText: "toolbar-clue-bluetooth.description", + tryItDescription: "toolbar-clue-bluetooth.tryItDescription", + components: undefined, + id: "bluetooth", + }; }; export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-sound-sensor.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-sound-sensor.description", - tryItDescription: "toolbar-clue-sound-sensor.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "sound_sensor", - }; + return { + descriptionTitle: "toolbar-clue-sound-sensor.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-sound-sensor.description", + tryItDescription: "toolbar-clue-sound-sensor.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "sound_sensor", + }; }; export const LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-led.description", - tryItDescription: "toolbar-clue-led.tryItDescription", - components: undefined, - id: "clue_neopixel", - }; + return { + descriptionTitle: "toolbar-clue-led.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-led.description", + tryItDescription: "toolbar-clue-led.tryItDescription", + components: undefined, + id: "clue_neopixel", + }; }; export const SPEAKER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-speaker.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-speaker.description", - tryItDescription: "toolbar-speaker.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "speaker", - }; + return { + descriptionTitle: "toolbar-speaker.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-speaker.description", + tryItDescription: "toolbar-speaker.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "speaker", + }; }; diff --git a/Source/view/components/toolbar/clue/ClueSensorProperties.tsx b/Source/view/components/toolbar/clue/ClueSensorProperties.tsx index f8194eeb3..ad40283f8 100644 --- a/Source/view/components/toolbar/clue/ClueSensorProperties.tsx +++ b/Source/view/components/toolbar/clue/ClueSensorProperties.tsx @@ -2,215 +2,215 @@ import { SENSOR_LIST } from "../../../constants"; import { ISensorProps, ISliderProps } from "../../../viewUtils"; const CLUE_SLIDER_R: ISliderProps = { - axisLabel: "R", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_R, - step: 1, + axisLabel: "R", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_R, + step: 1, }; const CLUE_SLIDER_G: ISliderProps = { - axisLabel: "G", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_G, - step: 1, + axisLabel: "G", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_G, + step: 1, }; const CLUE_SLIDER_B: ISliderProps = { - axisLabel: "B", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_B, - step: 1, + axisLabel: "B", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_B, + step: 1, }; const CLUE_SLIDER_C: ISliderProps = { - axisLabel: "C", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_C, - step: 1, + axisLabel: "C", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_C, + step: 1, }; export const CLUE_LIGHT_PROPERTIES: ISensorProps = { - LABEL: "Light Sensor", - sliderProps: [CLUE_SLIDER_R, CLUE_SLIDER_G, CLUE_SLIDER_B, CLUE_SLIDER_C], - unitLabel: "Lux", + LABEL: "Light Sensor", + sliderProps: [CLUE_SLIDER_R, CLUE_SLIDER_G, CLUE_SLIDER_B, CLUE_SLIDER_C], + unitLabel: "Lux", }; // Range for magnet found here https://www.adafruit.com/product/4479 const CLUE_MAGNET_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_X, - step: 0.1, + axisLabel: "X", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.MAGNET_X, + step: 0.1, }; const CLUE_MAGNET_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_Y, - step: 0.1, + axisLabel: "Y", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.MAGNET_Y, + step: 0.1, }; const CLUE_MAGNET_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_Z, - step: 0.1, + axisLabel: "Z", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.MAGNET_Z, + step: 0.1, }; export const CLUE_MAGNET_PROPERTIES: ISensorProps = { - LABEL: "Magnetoscope", - sliderProps: [CLUE_MAGNET_X, CLUE_MAGNET_Y, CLUE_MAGNET_Z], - unitLabel: "μT", + LABEL: "Magnetoscope", + sliderProps: [CLUE_MAGNET_X, CLUE_MAGNET_Y, CLUE_MAGNET_Z], + unitLabel: "μT", }; const CLUE_GYRO_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_X, - step: 0.1, + axisLabel: "X", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.GYRO_X, + step: 0.1, }; const CLUE_GYRO_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_Y, - step: 0.1, + axisLabel: "Y", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.GYRO_Y, + step: 0.1, }; const CLUE_GYRO_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_Z, - step: 0.1, + axisLabel: "Z", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.GYRO_Z, + step: 0.1, }; export const CLUE_GYRO_PROPERTIES: ISensorProps = { - LABEL: "Gyroscope", - sliderProps: [CLUE_GYRO_X, CLUE_GYRO_Y, CLUE_GYRO_Z], - unitLabel: "deg/s", + LABEL: "Gyroscope", + sliderProps: [CLUE_GYRO_X, CLUE_GYRO_Y, CLUE_GYRO_Z], + unitLabel: "deg/s", }; export const CLUE_HUMIDITY_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "H", - maxLabel: "Max", - maxValue: 100, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.HUMIDITY, - step: 0.1, - }, - ], - unitLabel: "%", + LABEL: "Humidity Sensor", + sliderProps: [ + { + axisLabel: "H", + maxLabel: "Max", + maxValue: 100, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.HUMIDITY, + step: 0.1, + }, + ], + unitLabel: "%", }; export const CLUE__PROXIMITY_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "P", - maxLabel: "Max", - maxValue: 255, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.PROXIMITY, - step: 1, - }, - ], - unitLabel: "", + LABEL: "Humidity Sensor", + sliderProps: [ + { + axisLabel: "P", + maxLabel: "Max", + maxValue: 255, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.PROXIMITY, + step: 1, + }, + ], + unitLabel: "", }; export const CLUE_PRESSURE_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "P", - maxLabel: "Max", - maxValue: 1100, - minLabel: "Min", - minValue: 800, - type: SENSOR_LIST.PRESSURE, - step: 0.1, - }, - ], - unitLabel: "hPa", + LABEL: "Humidity Sensor", + sliderProps: [ + { + axisLabel: "P", + maxLabel: "Max", + maxValue: 1100, + minLabel: "Min", + minValue: 800, + type: SENSOR_LIST.PRESSURE, + step: 0.1, + }, + ], + unitLabel: "hPa", }; const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 1023, - minLabel: "Left", - minValue: -1023, - type: SENSOR_LIST.MOTION_X, - step: 0.1, + axisLabel: "X", + maxLabel: "Right", + maxValue: 1023, + minLabel: "Left", + minValue: -1023, + type: SENSOR_LIST.MOTION_X, + step: 0.1, }; const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 1023, - minLabel: "Back", - minValue: -1023, - type: SENSOR_LIST.MOTION_Y, - step: 0.1, + axisLabel: "Y", + maxLabel: "Front", + maxValue: 1023, + minLabel: "Back", + minValue: -1023, + type: SENSOR_LIST.MOTION_Y, + step: 0.1, }; const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 1023, - minLabel: "Up", - minValue: -1023, - type: SENSOR_LIST.MOTION_Z, - step: 0.1, + axisLabel: "Z", + maxLabel: "Down", + maxValue: 1023, + minLabel: "Up", + minValue: -1023, + type: SENSOR_LIST.MOTION_Z, + step: 0.1, }; export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "m/s2", + LABEL: "Motion sensor", + sliderProps: [ + MOTION_SLIDER_PROPS_X, + MOTION_SLIDER_PROPS_Y, + MOTION_SLIDER_PROPS_Z, + ], + unitLabel: "m/s2", }; const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 0.1, + axisLabel: "T", + maxLabel: "Hot", + maxValue: 125, + minLabel: "Cold", + minValue: -55, + type: SENSOR_LIST.TEMPERATURE, + step: 0.1, }; export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", + LABEL: "Temperature sensor", + sliderProps: [TEMPERATURE_SLIDER_PROPS], + unitLabel: "°C", }; diff --git a/Source/view/components/toolbar/cpx/CpxModalContent.tsx b/Source/view/components/toolbar/cpx/CpxModalContent.tsx index 55166eb2a..669a059ea 100644 --- a/Source/view/components/toolbar/cpx/CpxModalContent.tsx +++ b/Source/view/components/toolbar/cpx/CpxModalContent.tsx @@ -4,195 +4,195 @@ import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; import { GenericSliderComponent } from "../GenericSliderComponent"; import { - FEATURE_REQUEST_ON_GITHUB, - IModalContent, - TRY_IT_MAKE_CODE, + FEATURE_REQUEST_ON_GITHUB, + IModalContent, + TRY_IT_MAKE_CODE, } from "../SensorModalUtils"; import * as SENSOR_PROPERTIES from "./CpxSensorProperties"; export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-gpio.description", - tryItDescription: "toolbar-gpio.tryItDescription", - components: undefined, - id: "GPIO", - }; + return { + descriptionTitle: "toolbar-gpio.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-gpio.description", + tryItDescription: "toolbar-gpio.tryItDescription", + components: undefined, + id: "GPIO", + }; }; export const IR_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-ir-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-ir-sensor.description", - tryItDescription: "toolbar-ir-sensor.tryItDescription", - components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], - id: "IR", - }; + return { + descriptionTitle: "toolbar-ir-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-ir-sensor.description", + tryItDescription: "toolbar-ir-sensor.tryItDescription", + components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], + id: "IR", + }; }; export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const lightSensorValues = { - L: sensorValues[SENSOR_LIST.LIGHT], - }; - return { - descriptionTitle: "toolbar-light-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-light-sensor.description", - tryItDescription: "toolbar-light-sensor.tryItDescription", - components: [ - , - ], - id: "light_sensor", - }; + const lightSensorValues = { + L: sensorValues[SENSOR_LIST.LIGHT], + }; + return { + descriptionTitle: "toolbar-light-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-light-sensor.description", + tryItDescription: "toolbar-light-sensor.tryItDescription", + components: [ + , + ], + id: "light_sensor", + }; }; export const MOTION_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const motionSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - descriptionTitle: "toolbar-motion-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-motion-sensor.description", - tryItDescription: "toolbar-motion-sensor.tryItDescription", - components: [ - , - TRY_IT_MAKE_CODE, - FEATURE_REQUEST_ON_GITHUB, - ], - id: "motion_sensor", - }; + const motionSensorValues = { + X: sensorValues[SENSOR_LIST.MOTION_X], + Y: sensorValues[SENSOR_LIST.MOTION_Y], + Z: sensorValues[SENSOR_LIST.MOTION_Z], + }; + return { + descriptionTitle: "toolbar-motion-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-motion-sensor.description", + tryItDescription: "toolbar-motion-sensor.tryItDescription", + components: [ + , + TRY_IT_MAKE_CODE, + FEATURE_REQUEST_ON_GITHUB, + ], + id: "motion_sensor", + }; }; export const NEOP_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-neo-pixels.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-neo-pixels.description", - tryItDescription: "toolbar-neo-pixels.tryItDescription", - components: undefined, - id: "neon_pixel", - }; + return { + descriptionTitle: "toolbar-neo-pixels.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-neo-pixels.description", + tryItDescription: "toolbar-neo-pixels.tryItDescription", + components: undefined, + id: "neon_pixel", + }; }; export const PUSHB_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-a-b-push.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-a-b-push.description", - tryItDescription: "toolbar-a-b-push.tryItDescription", - components: undefined, - id: "push_btn", - }; + return { + descriptionTitle: "toolbar-a-b-push.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-a-b-push.description", + tryItDescription: "toolbar-a-b-push.tryItDescription", + components: undefined, + id: "push_btn", + }; }; export const RED_LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-red-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-red-led.description", - tryItDescription: "toolbar-red-led.tryItDescription", - components: undefined, - id: "red_LED", - }; + return { + descriptionTitle: "toolbar-red-led.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-red-led.description", + tryItDescription: "toolbar-red-led.tryItDescription", + components: undefined, + id: "red_LED", + }; }; export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-sound-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-sound-sensor.description", - tryItDescription: "toolbar-sound-sensor.tryItDescription", - components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], - id: "sound_sensor", - }; + return { + descriptionTitle: "toolbar-sound-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-sound-sensor.description", + tryItDescription: "toolbar-sound-sensor.tryItDescription", + components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], + id: "sound_sensor", + }; }; export const SWITCH_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-slider-switch.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-slider-switch.description", - tryItDescription: "toolbar-slider-switch.tryItDescription", - components: undefined, - id: "slider_switch", - }; + return { + descriptionTitle: "toolbar-slider-switch.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-slider-switch.description", + tryItDescription: "toolbar-slider-switch.tryItDescription", + components: undefined, + id: "slider_switch", + }; }; export const SPEAKER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-speaker.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-speaker.description", - tryItDescription: "toolbar-speaker.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "speaker", - }; + return { + descriptionTitle: "toolbar-speaker.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-speaker.description", + tryItDescription: "toolbar-speaker.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "speaker", + }; }; export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-temperature-sensor.description", - descriptionTitle: "toolbar-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-temperature-sensor.tryItDescription", - }; + const temperatureSensorValues = { + T: sensorValues[SENSOR_LIST.TEMPERATURE], + }; + return { + components: [ + , + ], + descriptionText: "toolbar-temperature-sensor.description", + descriptionTitle: "toolbar-temperature-sensor.title", + id: "temperature", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-temperature-sensor.tryItDescription", + }; }; diff --git a/Source/view/components/toolbar/cpx/CpxSensorProperties.tsx b/Source/view/components/toolbar/cpx/CpxSensorProperties.tsx index f91f91469..478eb36c0 100644 --- a/Source/view/components/toolbar/cpx/CpxSensorProperties.tsx +++ b/Source/view/components/toolbar/cpx/CpxSensorProperties.tsx @@ -2,70 +2,70 @@ import { SENSOR_LIST } from "../../../constants"; import { ISensorProps, ISliderProps } from "../../../viewUtils"; const LIGHT_SLIDER_PROPS: ISliderProps = { - maxValue: 320, - minValue: 0, - minLabel: "Dark", - maxLabel: "Bright", - type: "light", - axisLabel: "L", - step: 1, + maxValue: 320, + minValue: 0, + minLabel: "Dark", + maxLabel: "Bright", + type: "light", + axisLabel: "L", + step: 1, }; export const LIGHT_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Light sensor", - sliderProps: [LIGHT_SLIDER_PROPS], - unitLabel: "Lux", + LABEL: "Light sensor", + sliderProps: [LIGHT_SLIDER_PROPS], + unitLabel: "Lux", }; const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 0.1, + axisLabel: "T", + maxLabel: "Hot", + maxValue: 125, + minLabel: "Cold", + minValue: -55, + type: SENSOR_LIST.TEMPERATURE, + step: 0.1, }; export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", + LABEL: "Temperature sensor", + sliderProps: [TEMPERATURE_SLIDER_PROPS], + unitLabel: "°C", }; const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 78, - minLabel: "Left", - minValue: -78, - type: SENSOR_LIST.MOTION_X, - step: 1, + axisLabel: "X", + maxLabel: "Right", + maxValue: 78, + minLabel: "Left", + minValue: -78, + type: SENSOR_LIST.MOTION_X, + step: 1, }; const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 78, - minLabel: "Back", - minValue: -78, - type: SENSOR_LIST.MOTION_Y, - step: 1, + axisLabel: "Y", + maxLabel: "Front", + maxValue: 78, + minLabel: "Back", + minValue: -78, + type: SENSOR_LIST.MOTION_Y, + step: 1, }; const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 78, - minLabel: "Up", - minValue: -78, - type: SENSOR_LIST.MOTION_Z, - step: 1, + axisLabel: "Z", + maxLabel: "Down", + maxValue: 78, + minLabel: "Up", + minValue: -78, + type: SENSOR_LIST.MOTION_Z, + step: 1, }; export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "Lux", + LABEL: "Motion sensor", + sliderProps: [ + MOTION_SLIDER_PROPS_X, + MOTION_SLIDER_PROPS_Y, + MOTION_SLIDER_PROPS_Z, + ], + unitLabel: "Lux", }; diff --git a/Source/view/components/toolbar/microbit/MicrobitModalContent.tsx b/Source/view/components/toolbar/microbit/MicrobitModalContent.tsx index c53cf5554..c0ffe7b5b 100644 --- a/Source/view/components/toolbar/microbit/MicrobitModalContent.tsx +++ b/Source/view/components/toolbar/microbit/MicrobitModalContent.tsx @@ -8,180 +8,180 @@ import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; import * as SENSOR_PROPERTIES from "./MicrobitSensorProperties"; export const ACCELEROMETER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - // this object will be accessed with the axis label - const accelerometerSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-accelerometer-sensor.description", - descriptionTitle: "toolbar-accelerometer-sensor.title", - id: "accelerometer", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-accelerometer-sensor.tryItDescription", - }; + // this object will be accessed with the axis label + const accelerometerSensorValues = { + X: sensorValues[SENSOR_LIST.MOTION_X], + Y: sensorValues[SENSOR_LIST.MOTION_Y], + Z: sensorValues[SENSOR_LIST.MOTION_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-accelerometer-sensor.description", + descriptionTitle: "toolbar-accelerometer-sensor.title", + id: "accelerometer", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-accelerometer-sensor.tryItDescription", + }; }; export const LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-led.description", - tryItDescription: "toolbar-microbit-led.tryItDescription", - components: undefined, - id: "microbit_LED", - }; + return { + descriptionTitle: "toolbar-microbit-led.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-led.description", + tryItDescription: "toolbar-microbit-led.tryItDescription", + components: undefined, + id: "microbit_LED", + }; }; export const BUTTON_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-a-b-push.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-microbit-a-b-push.description", - tryItDescription: "toolbar-microbit-a-b-push.tryItDescription", - components: undefined, - id: "microbit_button", - }; + return { + descriptionTitle: "toolbar-microbit-a-b-push.title", + tagInput: undefined, + tagOutput: TAG_INPUT_SVG, + descriptionText: "toolbar-microbit-a-b-push.description", + tryItDescription: "toolbar-microbit-a-b-push.tryItDescription", + components: undefined, + id: "microbit_button", + }; }; export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-sound.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-sound.description", - tryItDescription: "toolbar-microbit-sound.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_sound", - }; + return { + descriptionTitle: "toolbar-microbit-sound.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-sound.description", + tryItDescription: "toolbar-microbit-sound.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_sound", + }; }; export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-gpio.description", - tryItDescription: "toolbar-microbit-gpio.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_gpio", - }; + return { + descriptionTitle: "toolbar-microbit-gpio.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-gpio.description", + tryItDescription: "toolbar-microbit-gpio.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_gpio", + }; }; export const COMPASS_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-compass-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-compass-sensor.description", - tryItDescription: "toolbar-microbit-compass-sensor.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_compass", - }; + return { + descriptionTitle: "toolbar-microbit-compass-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-compass-sensor.description", + tryItDescription: "toolbar-microbit-compass-sensor.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_compass", + }; }; export const WIRELESS_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-wireless.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-wireless.description", - tryItDescription: "toolbar-microbit-wireless.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_wireless", - }; + return { + descriptionTitle: "toolbar-microbit-wireless.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-wireless.description", + tryItDescription: "toolbar-microbit-wireless.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_wireless", + }; }; export const GESTURE_CONTENT = ( - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void + onSelectGestures?: (event: React.ChangeEvent) => void, + sendGesture?: (isActive: boolean) => void ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-gesture-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-microbit-gesture-sensor.description", - tryItDescription: "toolbar-microbit-gesture-sensor.tryItDescription", - components: [ - , - ], - id: "gesture_sensor", - }; + return { + descriptionTitle: "toolbar-microbit-gesture-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-microbit-gesture-sensor.description", + tryItDescription: "toolbar-microbit-gesture-sensor.tryItDescription", + components: [ + , + ], + id: "gesture_sensor", + }; }; export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const lightSensorValues = { - L: sensorValues[SENSOR_LIST.LIGHT], - }; - return { - descriptionTitle: "toolbar-light-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-light-sensor.description", - tryItDescription: "toolbar-light-sensor.tryItDescription", - components: [ - , - ], - id: "light_sensor", - }; + const lightSensorValues = { + L: sensorValues[SENSOR_LIST.LIGHT], + }; + return { + descriptionTitle: "toolbar-light-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-light-sensor.description", + tryItDescription: "toolbar-light-sensor.tryItDescription", + components: [ + , + ], + id: "light_sensor", + }; }; export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-temperature-sensor.description", - descriptionTitle: "toolbar-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-temperature-sensor.tryItDescription", - }; + const temperatureSensorValues = { + T: sensorValues[SENSOR_LIST.TEMPERATURE], + }; + return { + components: [ + , + ], + descriptionText: "toolbar-temperature-sensor.description", + descriptionTitle: "toolbar-temperature-sensor.title", + id: "temperature", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-temperature-sensor.tryItDescription", + }; }; diff --git a/Source/view/components/toolbar/microbit/MicrobitSensorProperties.tsx b/Source/view/components/toolbar/microbit/MicrobitSensorProperties.tsx index c32b00477..4a8974625 100644 --- a/Source/view/components/toolbar/microbit/MicrobitSensorProperties.tsx +++ b/Source/view/components/toolbar/microbit/MicrobitSensorProperties.tsx @@ -2,73 +2,73 @@ import { SENSOR_LIST } from "../../../constants"; import { ISensorProps, ISliderProps } from "../../../viewUtils"; const LIGHT_SLIDER_PROPS: ISliderProps = { - maxValue: 255, - minValue: 0, - minLabel: "Dark", - maxLabel: "Bright", - type: "light", - axisLabel: "L", - step: 1, + maxValue: 255, + minValue: 0, + minLabel: "Dark", + maxLabel: "Bright", + type: "light", + axisLabel: "L", + step: 1, }; export const LIGHT_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Light sensor", - sliderProps: [LIGHT_SLIDER_PROPS], - unitLabel: "Lux", + LABEL: "Light sensor", + sliderProps: [LIGHT_SLIDER_PROPS], + unitLabel: "Lux", }; const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 1023, - minLabel: "Left", - minValue: -1023, - type: SENSOR_LIST.MOTION_X, - step: 1, + axisLabel: "X", + maxLabel: "Right", + maxValue: 1023, + minLabel: "Left", + minValue: -1023, + type: SENSOR_LIST.MOTION_X, + step: 1, }; const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 1023, - minLabel: "Back", - minValue: -1023, - type: SENSOR_LIST.MOTION_Y, - step: 1, + axisLabel: "Y", + maxLabel: "Front", + maxValue: 1023, + minLabel: "Back", + minValue: -1023, + type: SENSOR_LIST.MOTION_Y, + step: 1, }; const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 1023, - minLabel: "Up", - minValue: -1023, - type: SENSOR_LIST.MOTION_Z, - step: 1, + axisLabel: "Z", + maxLabel: "Down", + maxValue: 1023, + minLabel: "Up", + minValue: -1023, + type: SENSOR_LIST.MOTION_Z, + step: 1, }; export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "m/s2", + LABEL: "Motion sensor", + sliderProps: [ + MOTION_SLIDER_PROPS_X, + MOTION_SLIDER_PROPS_Y, + MOTION_SLIDER_PROPS_Z, + ], + unitLabel: "m/s2", }; const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 1, + axisLabel: "T", + maxLabel: "Hot", + maxValue: 125, + minLabel: "Cold", + minValue: -55, + type: SENSOR_LIST.TEMPERATURE, + step: 1, }; export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", + LABEL: "Temperature sensor", + sliderProps: [TEMPERATURE_SLIDER_PROPS], + unitLabel: "°C", }; From b84af5a8c82e6303f6e3936f59a0371786c6ff42 Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Wed, 22 Nov 2023 06:01:42 +0200 Subject: [PATCH 22/64] squash! --- .gitignore | 10 +- package.json | 644 +++++++++++++++++++++++++-------------------------- 2 files changed, 325 insertions(+), 329 deletions(-) diff --git a/.gitignore b/.gitignore index 7bc1e7ff6..5b1da70a4 100644 --- a/.gitignore +++ b/.gitignore @@ -5,14 +5,14 @@ # Compiled JS code out/ -!locales/**/out/ +!locales/**/out/ package.nls.*.json # virtual environment venv/ # testing -.vscode-test +.vscode-test # User-specific files *.suo @@ -232,7 +232,7 @@ ClientBin/ *.publishsettings orleans.codegen.cs -# Including strong name files can present a security risk +# Including strong name files can present a security risk # (https://github.com/github/gitignore/pull/2483#issue-259490424) #*.snk @@ -328,7 +328,7 @@ __pycache__/ # OpenCover UI analysis results OpenCover/ -# Azure Stream Analytics local run output +# Azure Stream Analytics local run output ASALocalRun/ # MSBuild Binary and Structured Log @@ -337,5 +337,5 @@ ASALocalRun/ # NVidia Nsight GPU debugger configuration file *.nvuser -# MFractors (Xamarin productivity tool) working folder +# MFractors (Xamarin productivity tool) working folder .mfractor/ diff --git a/package.json b/package.json index cd6592f97..f561dcc43 100644 --- a/package.json +++ b/package.json @@ -1,326 +1,322 @@ { - "name": "__EXTENSIONNAME__", - "displayName": "__DISPLAYNAME__", - "version": "0.0.0-UNTRACKEDVERSION", - "description": "__DESCRIPTION__", - "categories": [ - "Other" - ], - "keywords": [ - "python", - "CircuitPython", - "Adafruit", - "microbit", - "MicroPython" - ], - "homepage": "https://github.com/microsoft/vscode-python-devicesimulator", - "bugs": { - "url": "https://github.com/microsoft/vscode-python-devicesimulator/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/microsoft/vscode-python-devicesimulator" - }, - "license": "MIT", - "publisher": "__PUBLISHER__", - "main": "./out/extension.js", - "scripts": { - "start": "webpack-dev-server", - "vscode:prepublish": "npm run compile", - "build": "gulp build", - "clean": "gulp clean", - "compile": "npm-run-all compile:*", - "compile:extension": "gulp compile", - "compile:views": "webpack --mode development", - "watch": "npm-run-all -p watch:*", - "watch:extension": "tsc --watch", - "watch:views": "webpack --watch --mode development", - "pretest": "npm run compile", - "test": "npm-run-all test:*", - "test:extension-tests": "node ./out/test/runTest.js", - "test:ts": "jest", - "test:api-tests": "pytest src", - "lint": "npm-run-all lint:*", - "lint:ts": "tslint -c tslint.json src/**/*.{ts,tsx}", - "lint:python": "pylint src", - "format": "npm-run-all format:*", - "format:ts": "prettier --config .prettierrc.yaml --write src/**/*.{css,ts,tsx}", - "format:python": "black src", - "check": "npm-run-all check:*", - "check:ts": "prettier --config .prettierrc.yaml --check src/**/*.{css,ts,tsx}", - "check:python": "black src --check", - "package": "vsce package" - }, - "contributes": { - "breakpoints": [ - { - "language": "python" - } - ], - "colors": [ - { - "id": "highContrastButtonBorderOverride.color", - "description": "Color for the high contrast border updated", - "defaults": { - "dark": "debugToolBar.background", - "light": "debugToolBar.background", - "highContrast": "#6FC3DF" - } - }, - { - "id": "badgeForegroundOverride", - "description": "Color that fixes the issue with midnight blue ", - "defaults": { - "dark": "#FFFFFF", - "light": "badge.foreground", - "highContrast": "#FFFFFF" - } - } - ], - "commands": [ - { - "command": "deviceSimulatorExpress.common.installDependencies", - "title": "%deviceSimulatorExpressExtension.commands.common.installDependencies%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.changeBaudRate", - "title": "%deviceSimulatorExpressExtension.commands.common.changeBaudRate%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.closeSerialMonitor", - "title": "%deviceSimulatorExpressExtension.commands.common.closeSerialMonitor%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.openSerialMonitor", - "title": "%deviceSimulatorExpressExtension.commands.common.openSerialMonitor%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.selectSerialPort", - "title": "%deviceSimulatorExpressExtension.commands.common.selectSerialPort%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.runSimulator", - "title": "%deviceSimulatorExpressExtension.commands.common.runSimulator%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.gettingStarted", - "title": "%deviceSimulatorExpressExtension.commands.common.gettingStarted%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.deployToDevice", - "title": "%deviceSimulatorExpressExtension.commands.common.deployToDevice%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.newFile", - "title": "%deviceSimulatorExpressExtension.commands.common.newFile%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.openSimulator", - "title": "%deviceSimulatorExpressExtension.commands.common.openSimulator%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - } - ], - "configuration": { - "type": "object", - "title": "%deviceSimulatorExpressExtension.configuration.title%", - "properties": { - "deviceSimulatorExpress.configNewEnvironmentUponSwitch": { - "type": "boolean", - "default": false, - "description": "%deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange%", - "scope": "resource" - }, - "deviceSimulatorExpress.enableUSBDetection": { - "type": "boolean", - "default": true - }, - "deviceSimulatorExpress.showDependencyInstall": { - "type": "boolean", - "default": true, - "description": "%deviceSimulatorExpressExtension.configuration.properties.dependencyChecker%", - "scope": "resource" - }, - "deviceSimulatorExpress.showNewFilePopup": { - "type": "boolean", - "default": true, - "scope": "resource" - }, - "deviceSimulatorExpress.debuggerServerPort": { - "type": "number", - "default": 5577, - "description": "%deviceSimulatorExpressExtension.configuration.properties.debuggerPort%", - "scope": "resource" - } - } - }, - "debuggers": [ - { - "type": "deviceSimulatorExpress", - "label": "Device Simulator Express Debugger", - "languages": [ - "python" - ], - "configurationAttributes": { - "launch": { - "properties": { - "program": { - "type": "string", - "description": "Absolute path to the code file.", - "default": "${file}" - }, - "stopOnEntry": { - "type": "boolean", - "description": "Automatically stop after launch.", - "default": true - }, - "console": { - "enum": [ - "internalConsole", - "integratedTerminal", - "externalTerminal" - ], - "description": "Where to launch the debug target: internal console, integrated terminal, or external terminal.", - "default": "integratedTerminal" - }, - "args": { - "type": "array", - "description": "Command line arguments passed to the program.", - "default": [], - "items": { - "filePath": "string", - "serverPort": "string" - } - }, - "rules": { - "type": "array", - "description": "Debugger rules.", - "default": [], - "items": { - "path": "string", - "include": "boolean" - } - } - } - } - }, - "initialConfigurations": [ - { - "type": "deviceSimulatorExpress", - "request": "launch", - "name": "Device Simulator Express Debugger", - "console": "integratedTerminal" - } - ], - "configurationSnippets": [ - { - "label": "Device Simulator Express Debugger : Launch", - "description": "Device Simulator Express Debugger - A configuration for debugging a python code file for the Device Simulator Express simulator.", - "body": { - "type": "deviceSimulatorExpress", - "request": "launch", - "name": "Device Simulator Express Debugger", - "console": "integratedTerminal" - } - } - ] - } - ] - }, - "activationEvents": [ - "onCommand:deviceSimulatorExpress.common.installDependencies", - "onCommand:deviceSimulatorExpress.common.openSerialMonitor", - "onCommand:deviceSimulatorExpress.common.runSimulator", - "onCommand:deviceSimulatorExpress.common.selectSerialPort", - "onCommand:deviceSimulatorExpress.common.gettingStarted", - "onCommand:deviceSimulatorExpress.common.deployToDevice", - "onCommand:deviceSimulatorExpress.common.newFile", - "onCommand:deviceSimulatorExpress.common.openSimulator", - "onDebug" - ], - "eslintConfig": { - "extends": "react-app" - }, - "dependencies": { - "@babel/preset-typescript": "7.23.3", - "@testing-library/jest-dom": "6.1.4", - "@testing-library/react": "14.1.2", - "@types/jest": "29.5.8", - "@types/open": "6.1.0", - "@types/react-test-renderer": "18.0.6", - "@types/socket.io": "3.0.1", - "babel-jest": "29.7.0", - "compare-versions": "6.1.0", - "eventemitter2": "6.4.9", - "glob": "10.3.10", - "jest": "29.7.0", - "jest-transform-css": "6.0.1", - "office-ui-fabric-react": "7.204.0", - "open": "9.1.0", - "os": "0.1.2", - "react": "18.2.0", - "react-dom": "18.2.0", - "react-intl": "6.5.5", - "react-test-renderer": "18.2.0", - "socket.io": "4.7.2", - "svg-inline-react": "3.2.1", - "ts-jest": "29.1.1", - "usb-native": "6.0.0", - "util": "0.12.5", - "vscode-extension-telemetry": "0.1.1", - "vscode-nls": "5.2.0" - }, - "devDependencies": { - "@types/glob": "8.1.0", - "@types/node": "20.9.2", - "@types/react": "18.2.37", - "@types/react-dom": "18.2.15", - "@types/vscode": "1.84.1", - "css-loader": "6.8.1", - "del": "7.1.0", - "event-stream": "4.0.1", - "gulp": "4.0.2", - "gulp-cli": "2.3.0", - "gulp-filter": "9.0.1", - "gulp-sourcemaps": "3.0.0", - "gulp-typescript": "5.0.1", - "less": "4.2.0", - "less-loader": "11.1.3", - "mocha": "10.2.0", - "npm-run-all": "4.1.5", - "react-scripts": "5.0.1", - "style-loader": "3.3.3", - "ts-import-plugin": "3.0.0", - "ts-loader": "9.5.1", - "tslint": "5.20.1", - "tslint-config-prettier": "1.18.0", - "tslint-microsoft-contrib": "6.1.0", - "tslint-react": "4.1.0", - "tslint-react-hooks": "2.2.2", - "typescript": "5.2.2", - "typescript-react-intl": "0.4.1", - "version-from-git": "1.1.1", - "vsce": "1.47.0", - "vscode-nls-dev": "4.0.4", - "vscode-test": "1.0.0", - "webpack": "5.89.0", - "webpack-cli": "5.1.4" - }, - "extensionDependencies": [ - "ms-python.python" - ], - "engines": { - "vscode": "1.43.0" - }, - "icon": "assets/icon.png", - "preview": true, - "instrumentationKey": "__AIKEY__" + "name": "__EXTENSIONNAME__", + "displayName": "__DISPLAYNAME__", + "version": "0.0.1", + "description": "__DESCRIPTION__", + "homepage": "https://github.com/CodeEditorLand/CodeEditorLand#readme", + "bugs": { + "url": "https://github.com/CodeEditorLand/CodeEditorLand/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/CodeEditorLand/CodeEditorLand.git" + }, + "license": "MIT", + "publisher": "playform", + "main": "./out/extension.js", + "scripts": { + "start": "webpack-dev-server", + "vscode:prepublish": "npm run compile", + "build": "gulp build", + "clean": "gulp clean", + "compile": "npm-run-all compile:*", + "compile:extension": "gulp compile", + "compile:views": "webpack --mode development", + "watch": "npm-run-all -p watch:*", + "watch:extension": "tsc --watch", + "watch:views": "webpack --watch --mode development", + "pretest": "npm run compile", + "test": "npm-run-all test:*", + "test:extension-tests": "node ./out/test/runTest.js", + "test:ts": "jest", + "test:api-tests": "pytest src", + "lint": "npm-run-all lint:*", + "lint:ts": "tslint -c tslint.json src/**/*.{ts,tsx}", + "lint:python": "pylint src", + "format": "npm-run-all format:*", + "format:ts": "prettier --config .prettierrc.yaml --write src/**/*.{css,ts,tsx}", + "format:python": "black src", + "check": "npm-run-all check:*", + "check:ts": "prettier --config .prettierrc.yaml --check src/**/*.{css,ts,tsx}", + "check:python": "black src --check", + "package": "vsce package", + "prepublishOnly": "TypeScriptESBuild 'Source/**/*.ts'" + }, + "contributes": { + "breakpoints": [ + { + "language": "python" + } + ], + "colors": [ + { + "id": "highContrastButtonBorderOverride.color", + "description": "Color for the high contrast border updated", + "defaults": { + "dark": "debugToolBar.background", + "light": "debugToolBar.background", + "highContrast": "#6FC3DF" + } + }, + { + "id": "badgeForegroundOverride", + "description": "Color that fixes the issue with midnight blue ", + "defaults": { + "dark": "#FFFFFF", + "light": "badge.foreground", + "highContrast": "#FFFFFF" + } + } + ], + "commands": [ + { + "command": "deviceSimulatorExpress.common.installDependencies", + "title": "%deviceSimulatorExpressExtension.commands.common.installDependencies%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.changeBaudRate", + "title": "%deviceSimulatorExpressExtension.commands.common.changeBaudRate%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.closeSerialMonitor", + "title": "%deviceSimulatorExpressExtension.commands.common.closeSerialMonitor%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.openSerialMonitor", + "title": "%deviceSimulatorExpressExtension.commands.common.openSerialMonitor%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.selectSerialPort", + "title": "%deviceSimulatorExpressExtension.commands.common.selectSerialPort%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.runSimulator", + "title": "%deviceSimulatorExpressExtension.commands.common.runSimulator%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.gettingStarted", + "title": "%deviceSimulatorExpressExtension.commands.common.gettingStarted%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.deployToDevice", + "title": "%deviceSimulatorExpressExtension.commands.common.deployToDevice%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.newFile", + "title": "%deviceSimulatorExpressExtension.commands.common.newFile%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.openSimulator", + "title": "%deviceSimulatorExpressExtension.commands.common.openSimulator%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + } + ], + "configuration": { + "type": "object", + "title": "%deviceSimulatorExpressExtension.configuration.title%", + "properties": { + "deviceSimulatorExpress.configNewEnvironmentUponSwitch": { + "type": "boolean", + "default": false, + "description": "%deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange%", + "scope": "resource" + }, + "deviceSimulatorExpress.enableUSBDetection": { + "type": "boolean", + "default": true + }, + "deviceSimulatorExpress.showDependencyInstall": { + "type": "boolean", + "default": true, + "description": "%deviceSimulatorExpressExtension.configuration.properties.dependencyChecker%", + "scope": "resource" + }, + "deviceSimulatorExpress.showNewFilePopup": { + "type": "boolean", + "default": true, + "scope": "resource" + }, + "deviceSimulatorExpress.debuggerServerPort": { + "type": "number", + "default": 5577, + "description": "%deviceSimulatorExpressExtension.configuration.properties.debuggerPort%", + "scope": "resource" + } + } + }, + "debuggers": [ + { + "type": "deviceSimulatorExpress", + "label": "Device Simulator Express Debugger", + "languages": [ + "python" + ], + "configurationAttributes": { + "launch": { + "properties": { + "program": { + "type": "string", + "description": "Absolute path to the code file.", + "default": "${file}" + }, + "stopOnEntry": { + "type": "boolean", + "description": "Automatically stop after launch.", + "default": true + }, + "console": { + "enum": [ + "internalConsole", + "integratedTerminal", + "externalTerminal" + ], + "description": "Where to launch the debug target: internal console, integrated terminal, or external terminal.", + "default": "integratedTerminal" + }, + "args": { + "type": "array", + "description": "Command line arguments passed to the program.", + "default": [], + "items": { + "filePath": "string", + "serverPort": "string" + } + }, + "rules": { + "type": "array", + "description": "Debugger rules.", + "default": [], + "items": { + "path": "string", + "include": "boolean" + } + } + } + } + }, + "initialConfigurations": [ + { + "type": "deviceSimulatorExpress", + "request": "launch", + "name": "Device Simulator Express Debugger", + "console": "integratedTerminal" + } + ], + "configurationSnippets": [ + { + "label": "Device Simulator Express Debugger : Launch", + "description": "Device Simulator Express Debugger - A configuration for debugging a python code file for the Device Simulator Express simulator.", + "body": { + "type": "deviceSimulatorExpress", + "request": "launch", + "name": "Device Simulator Express Debugger", + "console": "integratedTerminal" + } + } + ] + } + ] + }, + "activationEvents": [ + "onCommand:deviceSimulatorExpress.common.installDependencies", + "onCommand:deviceSimulatorExpress.common.openSerialMonitor", + "onCommand:deviceSimulatorExpress.common.runSimulator", + "onCommand:deviceSimulatorExpress.common.selectSerialPort", + "onCommand:deviceSimulatorExpress.common.gettingStarted", + "onCommand:deviceSimulatorExpress.common.deployToDevice", + "onCommand:deviceSimulatorExpress.common.newFile", + "onCommand:deviceSimulatorExpress.common.openSimulator", + "onDebug" + ], + "dependencies": { + "@babel/preset-typescript": "7.23.3", + "@testing-library/jest-dom": "6.1.4", + "@testing-library/react": "14.1.2", + "@types/jest": "29.5.10", + "@types/open": "6.1.0", + "@types/react-test-renderer": "18.0.7", + "@types/socket.io": "3.0.1", + "babel-jest": "29.7.0", + "compare-versions": "6.1.0", + "eventemitter2": "6.4.9", + "glob": "10.3.10", + "jest": "29.7.0", + "jest-transform-css": "6.0.1", + "office-ui-fabric-react": "7.204.0", + "open": "9.1.0", + "os": "0.1.2", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-intl": "6.5.5", + "react-test-renderer": "18.2.0", + "socket.io": "4.7.2", + "svg-inline-react": "3.2.1", + "ts-jest": "29.1.1", + "usb-native": "6.0.0", + "util": "0.12.5", + "vscode-extension-telemetry": "0.1.1", + "vscode-nls": "5.2.0" + }, + "devDependencies": { + "@types/glob": "8.1.0", + "@types/node": "20.9.4", + "@types/react": "18.2.38", + "@types/react-dom": "18.2.17", + "@types/vscode": "1.84.2", + "css-loader": "6.8.1", + "del": "7.1.0", + "event-stream": "4.0.1", + "gulp": "4.0.2", + "gulp-cli": "2.3.0", + "gulp-filter": "9.0.1", + "gulp-sourcemaps": "3.0.0", + "gulp-typescript": "5.0.1", + "less": "4.2.0", + "less-loader": "11.1.3", + "mocha": "10.2.0", + "npm-run-all": "4.1.5", + "react-scripts": "5.0.1", + "style-loader": "3.3.3", + "ts-import-plugin": "3.0.0", + "ts-loader": "9.5.1", + "tslint": "5.20.1", + "tslint-config-prettier": "1.18.0", + "tslint-microsoft-contrib": "6.1.0", + "tslint-react": "4.1.0", + "tslint-react-hooks": "2.2.2", + "typescript": "5.3.2", + "typescript-react-intl": "0.4.1", + "version-from-git": "1.1.1", + "vsce": "1.47.0", + "vscode-nls-dev": "4.0.4", + "vscode-test": "1.0.0", + "webpack": "5.89.0", + "webpack-cli": "5.1.4", + "typescript-esbuild": "0.3.1" + }, + "extensionDependencies": [ + "ms-python.python" + ], + "icon": "assets/icon.png", + "preview": true, + "instrumentationKey": "__AIKEY__", + "type": "module", + "private": "false", + "publishConfig": { + "access": "public" + }, + "author": { + "name": "Nikola Hristov", + "email": "nikola@nikolahristov.tech", + "url": "https://nikolahristov.tech" + } } From a4154db8984de1f79d538a06de52b635d1917511 Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Wed, 22 Nov 2023 10:49:28 +0200 Subject: [PATCH 23/64] squash! --- package.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index f561dcc43..c72b9e43b 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "__EXTENSIONNAME__", "displayName": "__DISPLAYNAME__", "version": "0.0.1", + "private": "false", "description": "__DESCRIPTION__", "homepage": "https://github.com/CodeEditorLand/CodeEditorLand#readme", "bugs": { @@ -12,7 +13,13 @@ "url": "git+https://github.com/CodeEditorLand/CodeEditorLand.git" }, "license": "MIT", + "author": { + "name": "Nikola Hristov", + "email": "nikola@nikolahristov.tech", + "url": "https://nikolahristov.tech" + }, "publisher": "playform", + "type": "module", "main": "./out/extension.js", "scripts": { "start": "webpack-dev-server", @@ -294,29 +301,22 @@ "tslint-react": "4.1.0", "tslint-react-hooks": "2.2.2", "typescript": "5.3.2", + "typescript-esbuild": "0.3.1", "typescript-react-intl": "0.4.1", "version-from-git": "1.1.1", "vsce": "1.47.0", "vscode-nls-dev": "4.0.4", "vscode-test": "1.0.0", "webpack": "5.89.0", - "webpack-cli": "5.1.4", - "typescript-esbuild": "0.3.1" + "webpack-cli": "5.1.4" }, "extensionDependencies": [ "ms-python.python" ], - "icon": "assets/icon.png", - "preview": true, - "instrumentationKey": "__AIKEY__", - "type": "module", - "private": "false", "publishConfig": { "access": "public" }, - "author": { - "name": "Nikola Hristov", - "email": "nikola@nikolahristov.tech", - "url": "https://nikolahristov.tech" - } + "icon": "assets/icon.png", + "preview": true, + "instrumentationKey": "__AIKEY__" } From 7e2a56832b12df1e4ec6d5a3e3e13aeaf3adcb92 Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Mon, 27 Nov 2023 02:18:44 +0200 Subject: [PATCH 24/64] squash! --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c72b9e43b..bfa2cb814 100644 --- a/package.json +++ b/package.json @@ -275,7 +275,7 @@ }, "devDependencies": { "@types/glob": "8.1.0", - "@types/node": "20.9.4", + "@types/node": "20.10.0", "@types/react": "18.2.38", "@types/react-dom": "18.2.17", "@types/vscode": "1.84.2", From b6bc88162256c15126872477d5e205dd57bc82ed Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Mon, 27 Nov 2023 06:12:39 +0200 Subject: [PATCH 25/64] squash! --- Source/serialMonitor.ts | 4 +- package.json | 640 ++++++++++++++++++++-------------------- 2 files changed, 322 insertions(+), 322 deletions(-) diff --git a/Source/serialMonitor.ts b/Source/serialMonitor.ts index f5460862c..f4c781064 100644 --- a/Source/serialMonitor.ts +++ b/Source/serialMonitor.ts @@ -132,8 +132,8 @@ export class SerialMonitor implements vscode.Disposable { return a.label === b.label ? 0 : a.label > b.label - ? 1 - : -1; + ? 1 + : -1; }) as vscode.QuickPickItem[], { placeHolder: CONSTANTS.MISC.SELECT_PORT_PLACEHOLDER } ); diff --git a/package.json b/package.json index bfa2cb814..be439a078 100644 --- a/package.json +++ b/package.json @@ -1,322 +1,322 @@ { - "name": "__EXTENSIONNAME__", - "displayName": "__DISPLAYNAME__", - "version": "0.0.1", - "private": "false", - "description": "__DESCRIPTION__", - "homepage": "https://github.com/CodeEditorLand/CodeEditorLand#readme", - "bugs": { - "url": "https://github.com/CodeEditorLand/CodeEditorLand/issues" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/CodeEditorLand/CodeEditorLand.git" - }, - "license": "MIT", - "author": { - "name": "Nikola Hristov", - "email": "nikola@nikolahristov.tech", - "url": "https://nikolahristov.tech" - }, - "publisher": "playform", - "type": "module", - "main": "./out/extension.js", - "scripts": { - "start": "webpack-dev-server", - "vscode:prepublish": "npm run compile", - "build": "gulp build", - "clean": "gulp clean", - "compile": "npm-run-all compile:*", - "compile:extension": "gulp compile", - "compile:views": "webpack --mode development", - "watch": "npm-run-all -p watch:*", - "watch:extension": "tsc --watch", - "watch:views": "webpack --watch --mode development", - "pretest": "npm run compile", - "test": "npm-run-all test:*", - "test:extension-tests": "node ./out/test/runTest.js", - "test:ts": "jest", - "test:api-tests": "pytest src", - "lint": "npm-run-all lint:*", - "lint:ts": "tslint -c tslint.json src/**/*.{ts,tsx}", - "lint:python": "pylint src", - "format": "npm-run-all format:*", - "format:ts": "prettier --config .prettierrc.yaml --write src/**/*.{css,ts,tsx}", - "format:python": "black src", - "check": "npm-run-all check:*", - "check:ts": "prettier --config .prettierrc.yaml --check src/**/*.{css,ts,tsx}", - "check:python": "black src --check", - "package": "vsce package", - "prepublishOnly": "TypeScriptESBuild 'Source/**/*.ts'" - }, - "contributes": { - "breakpoints": [ - { - "language": "python" - } - ], - "colors": [ - { - "id": "highContrastButtonBorderOverride.color", - "description": "Color for the high contrast border updated", - "defaults": { - "dark": "debugToolBar.background", - "light": "debugToolBar.background", - "highContrast": "#6FC3DF" - } - }, - { - "id": "badgeForegroundOverride", - "description": "Color that fixes the issue with midnight blue ", - "defaults": { - "dark": "#FFFFFF", - "light": "badge.foreground", - "highContrast": "#FFFFFF" - } - } - ], - "commands": [ - { - "command": "deviceSimulatorExpress.common.installDependencies", - "title": "%deviceSimulatorExpressExtension.commands.common.installDependencies%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.changeBaudRate", - "title": "%deviceSimulatorExpressExtension.commands.common.changeBaudRate%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.closeSerialMonitor", - "title": "%deviceSimulatorExpressExtension.commands.common.closeSerialMonitor%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.openSerialMonitor", - "title": "%deviceSimulatorExpressExtension.commands.common.openSerialMonitor%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.selectSerialPort", - "title": "%deviceSimulatorExpressExtension.commands.common.selectSerialPort%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.runSimulator", - "title": "%deviceSimulatorExpressExtension.commands.common.runSimulator%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.gettingStarted", - "title": "%deviceSimulatorExpressExtension.commands.common.gettingStarted%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.deployToDevice", - "title": "%deviceSimulatorExpressExtension.commands.common.deployToDevice%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.newFile", - "title": "%deviceSimulatorExpressExtension.commands.common.newFile%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.openSimulator", - "title": "%deviceSimulatorExpressExtension.commands.common.openSimulator%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - } - ], - "configuration": { - "type": "object", - "title": "%deviceSimulatorExpressExtension.configuration.title%", - "properties": { - "deviceSimulatorExpress.configNewEnvironmentUponSwitch": { - "type": "boolean", - "default": false, - "description": "%deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange%", - "scope": "resource" - }, - "deviceSimulatorExpress.enableUSBDetection": { - "type": "boolean", - "default": true - }, - "deviceSimulatorExpress.showDependencyInstall": { - "type": "boolean", - "default": true, - "description": "%deviceSimulatorExpressExtension.configuration.properties.dependencyChecker%", - "scope": "resource" - }, - "deviceSimulatorExpress.showNewFilePopup": { - "type": "boolean", - "default": true, - "scope": "resource" - }, - "deviceSimulatorExpress.debuggerServerPort": { - "type": "number", - "default": 5577, - "description": "%deviceSimulatorExpressExtension.configuration.properties.debuggerPort%", - "scope": "resource" - } - } - }, - "debuggers": [ - { - "type": "deviceSimulatorExpress", - "label": "Device Simulator Express Debugger", - "languages": [ - "python" - ], - "configurationAttributes": { - "launch": { - "properties": { - "program": { - "type": "string", - "description": "Absolute path to the code file.", - "default": "${file}" - }, - "stopOnEntry": { - "type": "boolean", - "description": "Automatically stop after launch.", - "default": true - }, - "console": { - "enum": [ - "internalConsole", - "integratedTerminal", - "externalTerminal" - ], - "description": "Where to launch the debug target: internal console, integrated terminal, or external terminal.", - "default": "integratedTerminal" - }, - "args": { - "type": "array", - "description": "Command line arguments passed to the program.", - "default": [], - "items": { - "filePath": "string", - "serverPort": "string" - } - }, - "rules": { - "type": "array", - "description": "Debugger rules.", - "default": [], - "items": { - "path": "string", - "include": "boolean" - } - } - } - } - }, - "initialConfigurations": [ - { - "type": "deviceSimulatorExpress", - "request": "launch", - "name": "Device Simulator Express Debugger", - "console": "integratedTerminal" - } - ], - "configurationSnippets": [ - { - "label": "Device Simulator Express Debugger : Launch", - "description": "Device Simulator Express Debugger - A configuration for debugging a python code file for the Device Simulator Express simulator.", - "body": { - "type": "deviceSimulatorExpress", - "request": "launch", - "name": "Device Simulator Express Debugger", - "console": "integratedTerminal" - } - } - ] - } - ] - }, - "activationEvents": [ - "onCommand:deviceSimulatorExpress.common.installDependencies", - "onCommand:deviceSimulatorExpress.common.openSerialMonitor", - "onCommand:deviceSimulatorExpress.common.runSimulator", - "onCommand:deviceSimulatorExpress.common.selectSerialPort", - "onCommand:deviceSimulatorExpress.common.gettingStarted", - "onCommand:deviceSimulatorExpress.common.deployToDevice", - "onCommand:deviceSimulatorExpress.common.newFile", - "onCommand:deviceSimulatorExpress.common.openSimulator", - "onDebug" - ], - "dependencies": { - "@babel/preset-typescript": "7.23.3", - "@testing-library/jest-dom": "6.1.4", - "@testing-library/react": "14.1.2", - "@types/jest": "29.5.10", - "@types/open": "6.1.0", - "@types/react-test-renderer": "18.0.7", - "@types/socket.io": "3.0.1", - "babel-jest": "29.7.0", - "compare-versions": "6.1.0", - "eventemitter2": "6.4.9", - "glob": "10.3.10", - "jest": "29.7.0", - "jest-transform-css": "6.0.1", - "office-ui-fabric-react": "7.204.0", - "open": "9.1.0", - "os": "0.1.2", - "react": "18.2.0", - "react-dom": "18.2.0", - "react-intl": "6.5.5", - "react-test-renderer": "18.2.0", - "socket.io": "4.7.2", - "svg-inline-react": "3.2.1", - "ts-jest": "29.1.1", - "usb-native": "6.0.0", - "util": "0.12.5", - "vscode-extension-telemetry": "0.1.1", - "vscode-nls": "5.2.0" - }, - "devDependencies": { - "@types/glob": "8.1.0", - "@types/node": "20.10.0", - "@types/react": "18.2.38", - "@types/react-dom": "18.2.17", - "@types/vscode": "1.84.2", - "css-loader": "6.8.1", - "del": "7.1.0", - "event-stream": "4.0.1", - "gulp": "4.0.2", - "gulp-cli": "2.3.0", - "gulp-filter": "9.0.1", - "gulp-sourcemaps": "3.0.0", - "gulp-typescript": "5.0.1", - "less": "4.2.0", - "less-loader": "11.1.3", - "mocha": "10.2.0", - "npm-run-all": "4.1.5", - "react-scripts": "5.0.1", - "style-loader": "3.3.3", - "ts-import-plugin": "3.0.0", - "ts-loader": "9.5.1", - "tslint": "5.20.1", - "tslint-config-prettier": "1.18.0", - "tslint-microsoft-contrib": "6.1.0", - "tslint-react": "4.1.0", - "tslint-react-hooks": "2.2.2", - "typescript": "5.3.2", - "typescript-esbuild": "0.3.1", - "typescript-react-intl": "0.4.1", - "version-from-git": "1.1.1", - "vsce": "1.47.0", - "vscode-nls-dev": "4.0.4", - "vscode-test": "1.0.0", - "webpack": "5.89.0", - "webpack-cli": "5.1.4" - }, - "extensionDependencies": [ - "ms-python.python" - ], - "publishConfig": { - "access": "public" - }, - "icon": "assets/icon.png", - "preview": true, - "instrumentationKey": "__AIKEY__" + "name": "__EXTENSIONNAME__", + "displayName": "__DISPLAYNAME__", + "version": "0.0.1", + "private": "false", + "description": "__DESCRIPTION__", + "homepage": "https://github.com/CodeEditorLand/CodeEditorLand#readme", + "bugs": { + "url": "https://github.com/CodeEditorLand/CodeEditorLand/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/CodeEditorLand/CodeEditorLand.git" + }, + "license": "MIT", + "author": { + "name": "Nikola Hristov", + "email": "nikola@nikolahristov.tech", + "url": "https://nikolahristov.tech" + }, + "publisher": "playform", + "type": "module", + "main": "./out/extension.js", + "scripts": { + "start": "webpack-dev-server", + "vscode:prepublish": "npm run compile", + "build": "gulp build", + "clean": "gulp clean", + "compile": "npm-run-all compile:*", + "compile:extension": "gulp compile", + "compile:views": "webpack --mode development", + "watch": "npm-run-all -p watch:*", + "watch:extension": "tsc --watch", + "watch:views": "webpack --watch --mode development", + "pretest": "npm run compile", + "test": "npm-run-all test:*", + "test:extension-tests": "node ./out/test/runTest.js", + "test:ts": "jest", + "test:api-tests": "pytest src", + "lint": "npm-run-all lint:*", + "lint:ts": "tslint -c tslint.json src/**/*.{ts,tsx}", + "lint:python": "pylint src", + "format": "npm-run-all format:*", + "format:ts": "prettier --config .prettierrc.yaml --write src/**/*.{css,ts,tsx}", + "format:python": "black src", + "check": "npm-run-all check:*", + "check:ts": "prettier --config .prettierrc.yaml --check src/**/*.{css,ts,tsx}", + "check:python": "black src --check", + "package": "vsce package", + "prepublishOnly": "TypeScriptESBuild 'Source/**/*.ts'" + }, + "contributes": { + "breakpoints": [ + { + "language": "python" + } + ], + "colors": [ + { + "id": "highContrastButtonBorderOverride.color", + "description": "Color for the high contrast border updated", + "defaults": { + "dark": "debugToolBar.background", + "light": "debugToolBar.background", + "highContrast": "#6FC3DF" + } + }, + { + "id": "badgeForegroundOverride", + "description": "Color that fixes the issue with midnight blue ", + "defaults": { + "dark": "#FFFFFF", + "light": "badge.foreground", + "highContrast": "#FFFFFF" + } + } + ], + "commands": [ + { + "command": "deviceSimulatorExpress.common.installDependencies", + "title": "%deviceSimulatorExpressExtension.commands.common.installDependencies%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.changeBaudRate", + "title": "%deviceSimulatorExpressExtension.commands.common.changeBaudRate%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.closeSerialMonitor", + "title": "%deviceSimulatorExpressExtension.commands.common.closeSerialMonitor%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.openSerialMonitor", + "title": "%deviceSimulatorExpressExtension.commands.common.openSerialMonitor%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.selectSerialPort", + "title": "%deviceSimulatorExpressExtension.commands.common.selectSerialPort%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.runSimulator", + "title": "%deviceSimulatorExpressExtension.commands.common.runSimulator%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.gettingStarted", + "title": "%deviceSimulatorExpressExtension.commands.common.gettingStarted%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.deployToDevice", + "title": "%deviceSimulatorExpressExtension.commands.common.deployToDevice%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.newFile", + "title": "%deviceSimulatorExpressExtension.commands.common.newFile%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.openSimulator", + "title": "%deviceSimulatorExpressExtension.commands.common.openSimulator%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + } + ], + "configuration": { + "type": "object", + "title": "%deviceSimulatorExpressExtension.configuration.title%", + "properties": { + "deviceSimulatorExpress.configNewEnvironmentUponSwitch": { + "type": "boolean", + "default": false, + "description": "%deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange%", + "scope": "resource" + }, + "deviceSimulatorExpress.enableUSBDetection": { + "type": "boolean", + "default": true + }, + "deviceSimulatorExpress.showDependencyInstall": { + "type": "boolean", + "default": true, + "description": "%deviceSimulatorExpressExtension.configuration.properties.dependencyChecker%", + "scope": "resource" + }, + "deviceSimulatorExpress.showNewFilePopup": { + "type": "boolean", + "default": true, + "scope": "resource" + }, + "deviceSimulatorExpress.debuggerServerPort": { + "type": "number", + "default": 5577, + "description": "%deviceSimulatorExpressExtension.configuration.properties.debuggerPort%", + "scope": "resource" + } + } + }, + "debuggers": [ + { + "type": "deviceSimulatorExpress", + "label": "Device Simulator Express Debugger", + "languages": [ + "python" + ], + "configurationAttributes": { + "launch": { + "properties": { + "program": { + "type": "string", + "description": "Absolute path to the code file.", + "default": "${file}" + }, + "stopOnEntry": { + "type": "boolean", + "description": "Automatically stop after launch.", + "default": true + }, + "console": { + "enum": [ + "internalConsole", + "integratedTerminal", + "externalTerminal" + ], + "description": "Where to launch the debug target: internal console, integrated terminal, or external terminal.", + "default": "integratedTerminal" + }, + "args": { + "type": "array", + "description": "Command line arguments passed to the program.", + "default": [], + "items": { + "filePath": "string", + "serverPort": "string" + } + }, + "rules": { + "type": "array", + "description": "Debugger rules.", + "default": [], + "items": { + "path": "string", + "include": "boolean" + } + } + } + } + }, + "initialConfigurations": [ + { + "type": "deviceSimulatorExpress", + "request": "launch", + "name": "Device Simulator Express Debugger", + "console": "integratedTerminal" + } + ], + "configurationSnippets": [ + { + "label": "Device Simulator Express Debugger : Launch", + "description": "Device Simulator Express Debugger - A configuration for debugging a python code file for the Device Simulator Express simulator.", + "body": { + "type": "deviceSimulatorExpress", + "request": "launch", + "name": "Device Simulator Express Debugger", + "console": "integratedTerminal" + } + } + ] + } + ] + }, + "activationEvents": [ + "onCommand:deviceSimulatorExpress.common.installDependencies", + "onCommand:deviceSimulatorExpress.common.openSerialMonitor", + "onCommand:deviceSimulatorExpress.common.runSimulator", + "onCommand:deviceSimulatorExpress.common.selectSerialPort", + "onCommand:deviceSimulatorExpress.common.gettingStarted", + "onCommand:deviceSimulatorExpress.common.deployToDevice", + "onCommand:deviceSimulatorExpress.common.newFile", + "onCommand:deviceSimulatorExpress.common.openSimulator", + "onDebug" + ], + "dependencies": { + "@babel/preset-typescript": "7.23.3", + "@testing-library/jest-dom": "6.1.4", + "@testing-library/react": "14.1.2", + "@types/jest": "29.5.10", + "@types/open": "6.1.0", + "@types/react-test-renderer": "18.0.7", + "@types/socket.io": "3.0.1", + "babel-jest": "29.7.0", + "compare-versions": "6.1.0", + "eventemitter2": "6.4.9", + "glob": "10.3.10", + "jest": "29.7.0", + "jest-transform-css": "6.0.1", + "office-ui-fabric-react": "7.204.0", + "open": "9.1.0", + "os": "0.1.2", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-intl": "6.5.5", + "react-test-renderer": "18.2.0", + "socket.io": "4.7.2", + "svg-inline-react": "3.2.1", + "ts-jest": "29.1.1", + "usb-native": "6.0.0", + "util": "0.12.5", + "vscode-extension-telemetry": "0.1.1", + "vscode-nls": "5.2.0" + }, + "devDependencies": { + "@types/glob": "8.1.0", + "@types/node": "20.10.0", + "@types/react": "18.2.38", + "@types/react-dom": "18.2.17", + "@types/vscode": "1.84.2", + "css-loader": "6.8.1", + "del": "7.1.0", + "event-stream": "4.0.1", + "gulp": "4.0.2", + "gulp-cli": "2.3.0", + "gulp-filter": "9.0.1", + "gulp-sourcemaps": "3.0.0", + "gulp-typescript": "5.0.1", + "less": "4.2.0", + "less-loader": "11.1.3", + "mocha": "10.2.0", + "npm-run-all": "4.1.5", + "react-scripts": "5.0.1", + "style-loader": "3.3.3", + "ts-import-plugin": "3.0.0", + "ts-loader": "9.5.1", + "tslint": "5.20.1", + "tslint-config-prettier": "1.18.0", + "tslint-microsoft-contrib": "6.1.0", + "tslint-react": "4.1.0", + "tslint-react-hooks": "2.2.2", + "typescript": "5.3.2", + "typescript-esbuild": "0.3.1", + "typescript-react-intl": "0.4.1", + "version-from-git": "1.1.1", + "vsce": "1.47.0", + "vscode-nls-dev": "4.0.4", + "vscode-test": "1.0.0", + "webpack": "5.89.0", + "webpack-cli": "5.1.4" + }, + "extensionDependencies": [ + "ms-python.python" + ], + "publishConfig": { + "access": "public" + }, + "icon": "assets/icon.png", + "preview": true, + "instrumentationKey": "__AIKEY__" } From 04e59d99f647b57bcb21cfbfb52e3b8537dea4ae Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Mon, 27 Nov 2023 06:42:04 +0200 Subject: [PATCH 26/64] squash! --- assets/dark-theme/run-on-simulator.svg | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/assets/dark-theme/run-on-simulator.svg b/assets/dark-theme/run-on-simulator.svg index 2583a1fda..0582773e9 100644 --- a/assets/dark-theme/run-on-simulator.svg +++ b/assets/dark-theme/run-on-simulator.svg @@ -1,8 +1,8 @@ - - + + From 734eab02cb40b9e0841556c8584e6dc60d1c113d Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Tue, 28 Nov 2023 09:01:50 +0200 Subject: [PATCH 27/64] squash! --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index be439a078..8e311cd8e 100644 --- a/package.json +++ b/package.json @@ -276,7 +276,7 @@ "devDependencies": { "@types/glob": "8.1.0", "@types/node": "20.10.0", - "@types/react": "18.2.38", + "@types/react": "18.2.39", "@types/react-dom": "18.2.17", "@types/vscode": "1.84.2", "css-loader": "6.8.1", From 2eac829cd209e193ff69c2a309cb4d51deee5c79 Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Thu, 30 Nov 2023 12:59:22 +0200 Subject: [PATCH 28/64] squash! --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8e311cd8e..a724e31f4 100644 --- a/package.json +++ b/package.json @@ -275,7 +275,7 @@ }, "devDependencies": { "@types/glob": "8.1.0", - "@types/node": "20.10.0", + "@types/node": "20.10.1", "@types/react": "18.2.39", "@types/react-dom": "18.2.17", "@types/vscode": "1.84.2", From f9b10b7fcfa71b4d7ce80bad73e0d820ea15157a Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Fri, 1 Dec 2023 14:38:43 +0200 Subject: [PATCH 29/64] squash! --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a724e31f4..abb223d9c 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "type": "git", "url": "git+https://github.com/CodeEditorLand/CodeEditorLand.git" }, - "license": "MIT", + "license": "SEE LICENSE IN LICENSE", "author": { "name": "Nikola Hristov", "email": "nikola@nikolahristov.tech", From f00f454a9dd4d9d3543a7e3504d92dbde231de1e Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Sun, 3 Dec 2023 15:58:47 +0200 Subject: [PATCH 30/64] squash! --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index abb223d9c..9312d9fff 100644 --- a/package.json +++ b/package.json @@ -246,7 +246,7 @@ ], "dependencies": { "@babel/preset-typescript": "7.23.3", - "@testing-library/jest-dom": "6.1.4", + "@testing-library/jest-dom": "6.1.5", "@testing-library/react": "14.1.2", "@types/jest": "29.5.10", "@types/open": "6.1.0", @@ -275,8 +275,8 @@ }, "devDependencies": { "@types/glob": "8.1.0", - "@types/node": "20.10.1", - "@types/react": "18.2.39", + "@types/node": "20.10.2", + "@types/react": "18.2.41", "@types/react-dom": "18.2.17", "@types/vscode": "1.84.2", "css-loader": "6.8.1", From 4128e59c58b386ac27aae5d16a2e1b208b7972cd Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Mon, 4 Dec 2023 13:27:11 +0200 Subject: [PATCH 31/64] squash! --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9312d9fff..76b20b26f 100644 --- a/package.json +++ b/package.json @@ -275,7 +275,7 @@ }, "devDependencies": { "@types/glob": "8.1.0", - "@types/node": "20.10.2", + "@types/node": "20.10.3", "@types/react": "18.2.41", "@types/react-dom": "18.2.17", "@types/vscode": "1.84.2", @@ -301,7 +301,7 @@ "tslint-react": "4.1.0", "tslint-react-hooks": "2.2.2", "typescript": "5.3.2", - "typescript-esbuild": "0.3.1", + "typescript-esbuild": "0.3.2", "typescript-react-intl": "0.4.1", "version-from-git": "1.1.1", "vsce": "1.47.0", From 002368ac70258bad9670f339d791e9b563d2fe3a Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Sun, 10 Dec 2023 21:42:40 +0200 Subject: [PATCH 32/64] squash! --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 76b20b26f..9f8e3559c 100644 --- a/package.json +++ b/package.json @@ -248,7 +248,7 @@ "@babel/preset-typescript": "7.23.3", "@testing-library/jest-dom": "6.1.5", "@testing-library/react": "14.1.2", - "@types/jest": "29.5.10", + "@types/jest": "29.5.11", "@types/open": "6.1.0", "@types/react-test-renderer": "18.0.7", "@types/socket.io": "3.0.1", @@ -275,10 +275,10 @@ }, "devDependencies": { "@types/glob": "8.1.0", - "@types/node": "20.10.3", - "@types/react": "18.2.41", + "@types/node": "20.10.4", + "@types/react": "18.2.43", "@types/react-dom": "18.2.17", - "@types/vscode": "1.84.2", + "@types/vscode": "1.85.0", "css-loader": "6.8.1", "del": "7.1.0", "event-stream": "4.0.1", @@ -300,7 +300,7 @@ "tslint-microsoft-contrib": "6.1.0", "tslint-react": "4.1.0", "tslint-react-hooks": "2.2.2", - "typescript": "5.3.2", + "typescript": "5.3.3", "typescript-esbuild": "0.3.2", "typescript-react-intl": "0.4.1", "version-from-git": "1.1.1", From 06846ec064759629da3a017a43565939b026cf5f Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Mon, 11 Dec 2023 22:28:11 +0200 Subject: [PATCH 33/64] squash! --- package-lock.json | 32342 -------------------------------------------- package.json | 122 +- 2 files changed, 61 insertions(+), 32403 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 83024d259..000000000 --- a/package-lock.json +++ /dev/null @@ -1,32342 +0,0 @@ -{ - "name": "__EXTENSIONNAME__", - "version": "0.0.0-UNTRACKEDVERSION", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/compat-data": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.5.tgz", - "integrity": "sha512-jWYUqQX/ObOhG1UiEkbH5SANsE/8oKXiQWjj7p7xgj9Zmnt//aUvyz4dBkK0HNsS8/cbyC5NmmH87VekW+mXFg==", - "dev": true, - "requires": { - "browserslist": "^4.8.5", - "invariant": "^2.2.4", - "semver": "^5.5.0" - } - }, - "@babel/core": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.3.tgz", - "integrity": "sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.0", - "@babel/helpers": "^7.4.3", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "convert-source-map": "^1.1.0", - "debug": "^4.1.0", - "json5": "^2.1.0", - "lodash": "^4.17.11", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", - "requires": { - "@babel/types": "^7.4.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", - "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", - "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-builder-react-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz", - "integrity": "sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "esutils": "^2.0.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-call-delegate": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz", - "integrity": "sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz", - "integrity": "sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.8.4", - "browserslist": "^4.8.5", - "invariant": "^2.2.4", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz", - "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz", - "integrity": "sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==", - "dev": true, - "requires": { - "@babel/helper-regex": "^7.8.3", - "regexpu-core": "^4.6.0" - }, - "dependencies": { - "regexpu-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", - "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.1.0", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" - } - }, - "regjsgen": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", - "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", - "dev": true - }, - "regjsparser": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.3.tgz", - "integrity": "sha512-8uZvYbnfAtEm9Ab8NTb3hdLwL4g/LQzEYP7Xs27T96abJCCE2d6r3cPZPQEsLKy0vRSGVNG+/zVGtLr86HQduA==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } - } - } - }, - "@babel/helper-define-map": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", - "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/types": "^7.8.3", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", - "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", - "dev": true, - "requires": { - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", - "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-module-imports": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", - "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-module-transforms": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz", - "integrity": "sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-simple-access": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==" - }, - "@babel/helper-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", - "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", - "dev": true, - "requires": { - "lodash": "^4.17.13" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", - "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-wrap-function": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-replace-supers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", - "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-simple-access": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", - "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@babel/helper-wrap-function": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", - "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/helpers": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz", - "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", - "requires": { - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==" - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", - "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3", - "@babel/plugin-syntax-async-generators": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz", - "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-decorators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz", - "integrity": "sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-decorators": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", - "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", - "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", - "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - } - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz", - "integrity": "sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz", - "integrity": "sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - } - } - }, - "@babel/plugin-syntax-decorators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz", - "integrity": "sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-flow": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz", - "integrity": "sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz", - "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", - "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", - "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz", - "integrity": "sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - } - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", - "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", - "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", - "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", - "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-classes": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz", - "integrity": "sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-define-map": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", - "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz", - "integrity": "sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", - "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", - "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", - "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.8.3.tgz", - "integrity": "sha512-g/6WTWG/xbdd2exBBzMfygjX/zw4eyNC4X8pRaq7aRHRoDUCzAIu3kGYIXviOv8BjCuWm8vDBwjHcjiRNgXrPA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-flow": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz", - "integrity": "sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", - "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/plugin-transform-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", - "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", - "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz", - "integrity": "sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz", - "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-simple-access": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz", - "integrity": "sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.8.3", - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz", - "integrity": "sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", - "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", - "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", - "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz", - "integrity": "sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA==", - "dev": true, - "requires": { - "@babel/helper-call-delegate": "^7.8.3", - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", - "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-constant-elements": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.8.3.tgz", - "integrity": "sha512-glrzN2U+egwRfkNFtL34xIBYTxbbUF2qJTP8HD3qETBBqzAWSeNB821X0GjU06+dNpq/UyCIjI72FmGE5NNkQQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", - "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz", - "integrity": "sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g==", - "dev": true, - "requires": { - "@babel/helper-builder-react-jsx": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz", - "integrity": "sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz", - "integrity": "sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz", - "integrity": "sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA==", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.0" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", - "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz", - "integrity": "sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "resolve": "^1.8.1", - "semver": "^5.5.1" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", - "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", - "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", - "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-regex": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", - "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", - "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.3.tgz", - "integrity": "sha512-Ebj230AxcrKGZPKIp4g4TdQLrqX95TobLUWKd/CwG7X1XHUH1ZpkpFvXuXqWbtGRWb7uuEWNlrl681wsOArAdQ==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-typescript": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz", - "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==", - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - }, - "@babel/helper-replace-supers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", - "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", - "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/preset-env": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.4.tgz", - "integrity": "sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.8.4", - "@babel/helper-compilation-targets": "^7.8.4", - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-proposal-async-generator-functions": "^7.8.3", - "@babel/plugin-proposal-dynamic-import": "^7.8.3", - "@babel/plugin-proposal-json-strings": "^7.8.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.8.3", - "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", - "@babel/plugin-proposal-optional-chaining": "^7.8.3", - "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.8.3", - "@babel/plugin-transform-async-to-generator": "^7.8.3", - "@babel/plugin-transform-block-scoped-functions": "^7.8.3", - "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/plugin-transform-classes": "^7.8.3", - "@babel/plugin-transform-computed-properties": "^7.8.3", - "@babel/plugin-transform-destructuring": "^7.8.3", - "@babel/plugin-transform-dotall-regex": "^7.8.3", - "@babel/plugin-transform-duplicate-keys": "^7.8.3", - "@babel/plugin-transform-exponentiation-operator": "^7.8.3", - "@babel/plugin-transform-for-of": "^7.8.4", - "@babel/plugin-transform-function-name": "^7.8.3", - "@babel/plugin-transform-literals": "^7.8.3", - "@babel/plugin-transform-member-expression-literals": "^7.8.3", - "@babel/plugin-transform-modules-amd": "^7.8.3", - "@babel/plugin-transform-modules-commonjs": "^7.8.3", - "@babel/plugin-transform-modules-systemjs": "^7.8.3", - "@babel/plugin-transform-modules-umd": "^7.8.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", - "@babel/plugin-transform-new-target": "^7.8.3", - "@babel/plugin-transform-object-super": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.8.4", - "@babel/plugin-transform-property-literals": "^7.8.3", - "@babel/plugin-transform-regenerator": "^7.8.3", - "@babel/plugin-transform-reserved-words": "^7.8.3", - "@babel/plugin-transform-shorthand-properties": "^7.8.3", - "@babel/plugin-transform-spread": "^7.8.3", - "@babel/plugin-transform-sticky-regex": "^7.8.3", - "@babel/plugin-transform-template-literals": "^7.8.3", - "@babel/plugin-transform-typeof-symbol": "^7.8.4", - "@babel/plugin-transform-unicode-regex": "^7.8.3", - "@babel/types": "^7.8.3", - "browserslist": "^4.8.5", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/preset-react": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.8.3.tgz", - "integrity": "sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-transform-react-display-name": "^7.8.3", - "@babel/plugin-transform-react-jsx": "^7.8.3", - "@babel/plugin-transform-react-jsx-self": "^7.8.3", - "@babel/plugin-transform-react-jsx-source": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - } - } - }, - "@babel/preset-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.8.3.tgz", - "integrity": "sha512-qee5LgPGui9zQ0jR1TeU5/fP9L+ovoArklEqY12ek8P/wV5ZeM/VYSQYwICeoT6FfpJTekG9Ilay5PhwsOpMHA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-transform-typescript": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - } - } - }, - "@babel/runtime": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz", - "integrity": "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" - }, - "@cnakazawa/watch": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", - "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, - "@csstools/convert-colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", - "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", - "dev": true - }, - "@csstools/normalize.css": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", - "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==", - "dev": true - }, - "@fluentui/react-focus": { - "version": "7.1.13", - "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-7.1.13.tgz", - "integrity": "sha512-voY84/vRkcZGUHSwrPO6eEplc0EGKRGf06ov826NdzMq8s2BXoG2JMMdFNclFppQsCtcXOCPmfzwGHShJvGu5g==", - "requires": { - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/set-version": "^7.0.9", - "@uifabric/styling": "^7.11.2", - "@uifabric/utilities": "^7.15.5", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@formatjs/intl-relativetimeformat": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-2.8.0.tgz", - "integrity": "sha512-5T3m5hJSxXrbwtnFHyYBSbTjOXPXu+4NJ0MUu1LAf4fPEdd+pJZfWKuMJSWgFQPVMbLYq9NLvDWQda3hVe99sg==" - }, - "@gulp-sourcemaps/identity-map": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz", - "integrity": "sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==", - "dev": true, - "requires": { - "acorn": "^5.0.3", - "css": "^2.2.1", - "normalize-path": "^2.1.1", - "source-map": "^0.6.0", - "through2": "^2.0.3" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - } - } - }, - "@gulp-sourcemaps/map-sources": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", - "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", - "dev": true, - "requires": { - "normalize-path": "^2.0.1", - "through2": "^2.0.3" - } - }, - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", - "dev": true - }, - "@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", - "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", - "dev": true - }, - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "dev": true - }, - "@hapi/joi": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", - "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", - "dev": true, - "requires": { - "@hapi/address": "2.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/topo": "3.x.x" - } - }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", - "dev": true, - "requires": { - "@hapi/hoek": "^8.3.0" - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", - "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==" - }, - "@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", - "dev": true, - "requires": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@jest/core": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.1.0.tgz", - "integrity": "sha512-iz05+NmwCmZRzMXvMo6KFipW7nzhbpEawrKrkkdJzgytavPse0biEnCNr2wRlyCsp3SmKaEY+SGv7YWYQnIdig==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/reporters": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-changed-files": "^25.1.0", - "jest-config": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-resolve-dependencies": "^25.1.0", - "jest-runner": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "jest-watcher": "^25.1.0", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "realpath-native": "^1.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "requires": { - "type-fest": "^0.8.1" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "jest-watcher": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.1.0.tgz", - "integrity": "sha512-Q9eZ7pyaIr6xfU24OeTg4z1fUqBF/4MP6J801lyQfg7CsnZ/TCzAPvCfckKdL5dlBBEKBeHV0AdyjFZ5eWj4ig==", - "requires": { - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "string-length": "^3.1.0" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - } - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "@jest/environment": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.1.0.tgz", - "integrity": "sha512-cTpUtsjU4cum53VqBDlcW0E4KbQF03Cn0jckGPW/5rrE9tb+porD3+hhLtHAwhthsqfyF+bizyodTlsRA++sHg==", - "requires": { - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/fake-timers": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.1.0.tgz", - "integrity": "sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ==", - "requires": { - "@jest/types": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "lolex": "^5.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", - "requires": { - "@jest/types": "^25.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "@jest/fake-timers": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - } - } - }, - "@jest/reporters": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.1.0.tgz", - "integrity": "sha512-ORLT7hq2acJQa8N+NKfs68ZtHFnJPxsGqmofxW7v7urVhzJvpKZG9M7FAcgh9Ee1ZbCteMrirHA3m5JfBtAaDg==", - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.0", - "jest-haste-map": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", - "node-notifier": "^6.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^3.1.0", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^4.0.1" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "istanbul-lib-instrument": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz", - "integrity": "sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ==", - "requires": { - "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", - "source-map": "^0.6.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - } - } - }, - "@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", - "dev": true, - "requires": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - } - } - }, - "@jest/test-sequencer": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.1.0.tgz", - "integrity": "sha512-WgZLRgVr2b4l/7ED1J1RJQBOharxS11EFhmwDqknpknE0Pm87HLZVS2Asuuw+HQdfQvm2aXL2FvvBLxOD1D0iw==", - "requires": { - "@jest/test-result": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-runner": "^25.1.0", - "jest-runtime": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/transform": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.1.0.tgz", - "integrity": "sha512-4ktrQ2TPREVeM+KxB4zskAT84SnmG1vaz4S+51aTefyqn3zocZUnliLLm5Fsl85I3p/kFPN4CRp1RElIfXGegQ==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^25.1.0", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^3.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-util": "^25.1.0", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "istanbul-lib-instrument": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz", - "integrity": "sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ==", - "requires": { - "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "write-file-atomic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", - "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - } - } - }, - "@jest/types": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.1.0.tgz", - "integrity": "sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - }, - "dependencies": { - "@types/yargs": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.1.tgz", - "integrity": "sha512-sYlwNU7zYi6eZbMzFvG6eHD7VsEvFdoDtlD7eI1JTg7YNnuguzmiGsc6MPSq5l8n+h21AsNof0je+9sgOe4+dg==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@microsoft/load-themed-styles": { - "version": "1.10.43", - "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.43.tgz", - "integrity": "sha512-9RUeBMXPHbT/qHTRIQi9oQs3bw5JkQGBQ8ayjycq95q+1OUI9jBJPiJi2d8btpGdJWisVb3ZXxRsUx5u6f5dRA==" - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, - "@serialport/binding-abstract": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/binding-abstract/-/binding-abstract-8.0.6.tgz", - "integrity": "sha512-1swwUVoRyQ9ubxrkJ8JPppykohUpTAP4jkGr36e9NjbVocSPfqeX6tFZFwl/IdUlwJwxGdbKDqq7FvXniCQUMw==", - "requires": { - "debug": "^4.1.1" - } - }, - "@serialport/binding-mock": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/binding-mock/-/binding-mock-8.0.6.tgz", - "integrity": "sha512-BIbY5/PsDDo0QWDNCCxDgpowAdks+aZR8BOsEtK2GoASTTcJCy1fBwPIfH870o7rnbH901wY3C+yuTfdOvSO9A==", - "requires": { - "@serialport/binding-abstract": "^8.0.6", - "debug": "^4.1.1" - } - }, - "@serialport/bindings": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/@serialport/bindings/-/bindings-8.0.7.tgz", - "integrity": "sha512-IqudDL8ne2Y2S0W5fKA6wdgHCIA2e2OIaPVYhGy6duE6legNHFY+05CLicHAyAeTocXmHU7rVNxzVQrOG5tM4g==", - "requires": { - "@serialport/binding-abstract": "^8.0.6", - "@serialport/parser-readline": "^8.0.6", - "bindings": "^1.5.0", - "debug": "^4.1.1", - "nan": "^2.14.0", - "prebuild-install": "^5.3.0" - } - }, - "@serialport/parser-byte-length": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-byte-length/-/parser-byte-length-8.0.6.tgz", - "integrity": "sha512-92mrFxFEvq3gRvSM7ANK/jfbmHslz91a5oYJy/nbSn4H/MCRXjxR2YOkQgVXuN+zLt+iyDoW3pcOP4Sc1nWdqQ==" - }, - "@serialport/parser-cctalk": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-cctalk/-/parser-cctalk-8.0.6.tgz", - "integrity": "sha512-pqtCYQPgxnxHygiXUPCfgX7sEx+fdR/ObjpscidynEULUq2fFrC5kBkrxRbTfHRtTaU2ii9DyjFq0JVRCbhI0Q==" - }, - "@serialport/parser-delimiter": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-8.0.6.tgz", - "integrity": "sha512-ogKOcPisPMlVtirkuDu3SFTF0+xT0ijxoH7XjpZiYL41EVi367MwuCnEmXG+dEKKnF0j9EPqOyD2LGSJxaFmhQ==" - }, - "@serialport/parser-readline": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-8.0.6.tgz", - "integrity": "sha512-OYBT2mpczh9QUI3MTw8j0A0tIlPVjpVipvuVnjRkYwxrxPeq04RaLFhaDpuRzua5rTKMt89c1y3btYeoDXMjAA==", - "requires": { - "@serialport/parser-delimiter": "^8.0.6" - } - }, - "@serialport/parser-ready": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-ready/-/parser-ready-8.0.6.tgz", - "integrity": "sha512-xcEqv4rc119WR5JzAuu8UeJOlAwET2PTdNb6aIrrLlmTxhvuBbuRFcsnF3BpH9jUL30Kh7a6QiNXIwVG+WR/1Q==" - }, - "@serialport/parser-regex": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/parser-regex/-/parser-regex-8.0.6.tgz", - "integrity": "sha512-J8KY75Azz5ZyExmyM5YfUxbXOWBkZCytKgCCmZ966ttwZS0bUZOuoCaZj2Zp4VILJAiLuxHoqc0foi67Fri5+g==" - }, - "@serialport/stream": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-8.0.6.tgz", - "integrity": "sha512-ym1PwM0rwLrj90vRBB66I1hwMXbuMw9wGTxqns75U3N/tuNFOH85mxXaYVF2TpI66aM849NoI1jMm50fl9equg==", - "requires": { - "debug": "^4.1.1" - } - }, - "@sheerun/mutationobserver-shim": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz", - "integrity": "sha512-vTCdPp/T/Q3oSqwHmZ5Kpa9oI7iLtGl3RQaA/NyLHikvcrPxACkkKVr/XzkSPJWXHRhKGzVvb0urJsbMlRxi1Q==" - }, - "@sinonjs/commons": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.0.tgz", - "integrity": "sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg==", - "requires": { - "type-detect": "4.0.8" - } - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==", - "dev": true - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==", - "dev": true - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", - "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==", - "dev": true - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", - "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==", - "dev": true - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz", - "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==", - "dev": true - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", - "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==", - "dev": true - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", - "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==", - "dev": true - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", - "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==", - "dev": true - }, - "@svgr/babel-preset": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz", - "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", - "dev": true, - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", - "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3", - "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", - "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", - "@svgr/babel-plugin-transform-svg-component": "^4.2.0" - } - }, - "@svgr/core": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz", - "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", - "dev": true, - "requires": { - "@svgr/plugin-jsx": "^4.3.3", - "camelcase": "^5.3.1", - "cosmiconfig": "^5.2.1" - } - }, - "@svgr/hast-util-to-babel-ast": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", - "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@svgr/plugin-jsx": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz", - "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", - "dev": true, - "requires": { - "@babel/core": "^7.4.5", - "@svgr/babel-preset": "^4.3.3", - "@svgr/hast-util-to-babel-ast": "^4.3.2", - "svg-parser": "^2.0.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@svgr/plugin-svgo": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", - "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", - "dev": true, - "requires": { - "cosmiconfig": "^5.2.1", - "merge-deep": "^3.0.2", - "svgo": "^1.2.2" - } - }, - "@svgr/webpack": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz", - "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==", - "dev": true, - "requires": { - "@babel/core": "^7.4.5", - "@babel/plugin-transform-react-constant-elements": "^7.0.0", - "@babel/preset-env": "^7.4.5", - "@babel/preset-react": "^7.0.0", - "@svgr/core": "^4.3.3", - "@svgr/plugin-jsx": "^4.3.3", - "@svgr/plugin-svgo": "^4.3.1", - "loader-utils": "^1.2.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@testing-library/dom": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-6.11.0.tgz", - "integrity": "sha512-Pkx9LMIGshyNbfmecjt18rrAp/ayMqGH674jYER0SXj0iG9xZc+zWRjk2Pg9JgPBDvwI//xGrI/oOQkAi4YEew==", - "requires": { - "@babel/runtime": "^7.6.2", - "@sheerun/mutationobserver-shim": "^0.3.2", - "@types/testing-library__dom": "^6.0.0", - "aria-query": "3.0.0", - "pretty-format": "^24.9.0", - "wait-for-expect": "^3.0.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "requires": { - "regenerator-runtime": "^0.13.2" - } - } - } - }, - "@testing-library/jest-dom": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.0.2.tgz", - "integrity": "sha512-Pl3si4eH88+5wlVz6NjecLfeO7PjTbbgWKwVZXUtBfrGuJLjGdUUo+O92XRu/59wft8HAmwvXHeMWpqWTg2Uwg==", - "requires": { - "@babel/runtime": "^7.5.1", - "@types/testing-library__jest-dom": "^5.0.0", - "chalk": "^2.4.1", - "css": "^2.2.3", - "css.escape": "^1.5.1", - "jest-diff": "^24.0.0", - "jest-matcher-utils": "^24.0.0", - "lodash": "^4.17.11", - "pretty-format": "^24.0.0", - "redent": "^3.0.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@testing-library/react": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-9.4.0.tgz", - "integrity": "sha512-XdhDWkI4GktUPsz0AYyeQ8M9qS/JFie06kcSnUVcpgOwFjAu9vhwR83qBl+lw9yZWkbECjL8Hd+n5hH6C0oWqg==", - "requires": { - "@babel/runtime": "^7.7.6", - "@testing-library/dom": "^6.11.0", - "@types/testing-library__react": "^9.1.2" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "requires": { - "regenerator-runtime": "^0.13.2" - } - } - } - }, - "@types/babel__core": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", - "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.8.tgz", - "integrity": "sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw==", - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" - }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true - }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", - "dev": true, - "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", - "requires": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, - "@types/invariant": { - "version": "2.2.30", - "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.30.tgz", - "integrity": "sha512-98fB+yo7imSD2F7PF7GIpELNgtLNgo5wjivu0W5V4jx+KVVJxo6p/qN4zdzSTBWy4/sN3pPyXwnhRSD28QX+ag==" - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==" - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-dXvuABY9nM1xgsXlOtLQXJKdacxZJd7AtvLsKZ/0b57ruMXDKCOXAC/M75GbllQX6o1pcZ5hAG4JzYy7Z/wM2w==", - "requires": { - "jest-diff": "^24.3.0" - } - }, - "@types/json-schema": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", - "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/node": { - "version": "10.14.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.7.tgz", - "integrity": "sha512-on4MmIDgHXiuJDELPk1NFaKVUxxCFr37tm8E9yN6rAiF5Pzp/9bBfBHkoexqRiY+hk/Z04EJU9kKEb59YqJ82A==" - }, - "@types/open": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/open/-/open-6.1.0.tgz", - "integrity": "sha512-sdB0OltczakZfdn5DYg3ZbHoQeYtU8Vbo4dys0U98gikn++M4gGDI02dzEWXPMP5uXGSjGx9GnK/yLlJMfGjlg==", - "requires": { - "@types/node": "*" - } - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" - }, - "@types/q": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", - "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", - "dev": true - }, - "@types/react": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.8.6.tgz", - "integrity": "sha512-bN9qDjEMltmHrl0PZRI4IF2AbB7V5UlRfG+OOduckVnRQ4VzXVSzy/1eLAh778IEqhTnW0mmgL9yShfinNverA==", - "requires": { - "@types/prop-types": "*", - "csstype": "^2.2.0" - } - }, - "@types/react-dom": { - "version": "16.8.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.8.4.tgz", - "integrity": "sha512-eIRpEW73DCzPIMaNBDP5pPIpK1KXyZwNgfxiVagb5iGiz6da+9A5hslSX6GAQKdO7SayVCS/Fr2kjqprgAvkfA==", - "requires": { - "@types/react": "*" - } - }, - "@types/react-test-renderer": { - "version": "16.9.2", - "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-16.9.2.tgz", - "integrity": "sha512-4eJr1JFLIAlWhzDkBCkhrOIWOvOxcCAfQh+jiKg7l/nNZcCIL2MHl2dZhogIFKyHzedVWHaVP1Yydq/Ruu4agw==", - "requires": { - "@types/react": "*" - } - }, - "@types/socket.io": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/socket.io/-/socket.io-2.1.2.tgz", - "integrity": "sha512-Ind+4qMNfQ62llyB4IMs1D8znMEBsMKohZBPqfBUIXqLQ9bdtWIbNTBWwtdcBWJKnokMZGcmWOOKslatni5vtA==", - "requires": { - "@types/node": "*" - } - }, - "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" - }, - "@types/testing-library__dom": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/@types/testing-library__dom/-/testing-library__dom-6.11.1.tgz", - "integrity": "sha512-ImChHtQqmjwraRLqBC2sgSQFtczeFvBmBcfhTYZn/3KwXbyD07LQykEQ0xJo7QHc1GbVvf7pRyGaIe6PkCdxEw==", - "requires": { - "pretty-format": "^24.3.0" - } - }, - "@types/testing-library__jest-dom": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.0.0.tgz", - "integrity": "sha512-Pm+2mvqs9sND247oMVJbu3QmPUqMzBuJbY5uHHYQdl9MXq5hwWkTbesw1sPIky52Y0sHksWAZnVvGLbdyFSyrA==", - "requires": { - "@types/jest": "*" - } - }, - "@types/testing-library__react": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@types/testing-library__react/-/testing-library__react-9.1.2.tgz", - "integrity": "sha512-CYaMqrswQ+cJACy268jsLAw355DZtPZGt3Jwmmotlcu8O/tkoXBI6AeZ84oZBJsIsesozPKzWzmv/0TIU+1E9Q==", - "requires": { - "@types/react-dom": "*", - "@types/testing-library__dom": "*" - } - }, - "@types/vscode": { - "version": "1.45.1", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.45.1.tgz", - "integrity": "sha512-0NO9qrrEJBO8FsqHCrFMgR2suKnwCsKBWvRSb2OzH5gs4i3QO5AhEMQYrSzDbU/wLPt7N617/rN9lPY213gmwg==", - "dev": true - }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" - }, - "@typescript-eslint/eslint-plugin": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.20.0.tgz", - "integrity": "sha512-cimIdVDV3MakiGJqMXw51Xci6oEDEoPkvh8ggJe2IIzcc0fYqAxOXN6Vbeanahz6dLZq64W+40iUEc9g32FLDQ==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "2.20.0", - "eslint-utils": "^1.4.3", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.20.0.tgz", - "integrity": "sha512-fEBy9xYrwG9hfBLFEwGW2lKwDRTmYzH3DwTmYbT+SMycmxAoPl0eGretnBFj/s+NfYBG63w/5c3lsvqqz5mYag==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.20.0", - "eslint-scope": "^5.0.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - } - } - }, - "@typescript-eslint/parser": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.20.0.tgz", - "integrity": "sha512-o8qsKaosLh2qhMZiHNtaHKTHyCHc3Triq6aMnwnWj7budm3xAY9owSZzV1uon5T9cWmJRJGzTFa90aex4m77Lw==", - "dev": true, - "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.20.0", - "@typescript-eslint/typescript-estree": "2.20.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.20.0.tgz", - "integrity": "sha512-WlFk8QtI8pPaE7JGQGxU7nGcnk1ccKAJkhbVookv94ZcAef3m6oCE/jEDL6dGte3JcD7reKrA0o55XhBRiVT3A==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^6.3.0", - "tsutils": "^3.17.1" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@uifabric/foundation": { - "version": "7.5.25", - "resolved": "https://registry.npmjs.org/@uifabric/foundation/-/foundation-7.5.25.tgz", - "integrity": "sha512-5PcqVMjXG1or7GrZHCWQ1SRNcCUV6lPm7OoAi1AKtVrSEi69g56VjJCJ7sqc/Q587ehDN6LqK9RhLc2IhQVO+Q==", - "requires": { - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/set-version": "^7.0.9", - "@uifabric/styling": "^7.11.2", - "@uifabric/utilities": "^7.15.5", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/icons": { - "version": "7.3.24", - "resolved": "https://registry.npmjs.org/@uifabric/icons/-/icons-7.3.24.tgz", - "integrity": "sha512-0CkTEgY8xwvNs+zUQcvWKLnuYxudjJfPI016385bqizE9dkCMyAfXer/7sgyrp6FjxNUrHGyQUKvdVoT3zSNYA==", - "requires": { - "@uifabric/set-version": "^7.0.9", - "@uifabric/styling": "^7.11.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/merge-styles": { - "version": "7.8.11", - "resolved": "https://registry.npmjs.org/@uifabric/merge-styles/-/merge-styles-7.8.11.tgz", - "integrity": "sha512-U1gYewj/j6ZGBSXD84Ekp+En4N5hH79TsK9hWJq2wKJKK3h0MKmY50WyFKWIL2/kS+wM7zIR6irK0xY+mfjB2g==", - "requires": { - "@uifabric/set-version": "^7.0.9", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/react-hooks": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@uifabric/react-hooks/-/react-hooks-7.1.2.tgz", - "integrity": "sha512-gFsjCeh+g0rZYSx13WIJcA2HLxNKiY4RQsxLuOq1cMsBgiUGix8ofMPd3S5ys+qfVdl+XwoqlV/25PgvIRrpUA==", - "requires": { - "@uifabric/set-version": "^7.0.9", - "@uifabric/utilities": "^7.15.5", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/set-version": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@uifabric/set-version/-/set-version-7.0.9.tgz", - "integrity": "sha512-YJL6WLBlFKDJcLSw1ihqW5PTFi2XMoluEvwGd2qtzp2IVbHvdbk7uIdWuTALo3dFNNqWPN8shSNUdHVATE/1jQ==", - "requires": { - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/styling": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-7.11.2.tgz", - "integrity": "sha512-0so6oM6d0WOogDiOxT5bbfOrkGEvhrmRukSrgr1mY/3tkQ3gue/XW4yus0fNi7H9R8wZa2rIPQaUcZBW3Hrc0g==", - "requires": { - "@microsoft/load-themed-styles": "^1.10.26", - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/set-version": "^7.0.9", - "@uifabric/utilities": "^7.15.5", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@uifabric/utilities": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-7.15.5.tgz", - "integrity": "sha512-cjnhT7tTvHNXt0rvuajk5s/RQtSWFh2JfRhbmS7dTGfg3vNieoHg2EiNt+ulzKXxtdkFriXoFHRSNkTuV4/L9w==", - "requires": { - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/set-version": "^7.0.9", - "prop-types": "^15.7.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==" - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" - }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", - "dev": true - }, - "acorn-globals": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", - "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" - } - } - }, - "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", - "dev": true - }, - "acorn-walk": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", - "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==" - }, - "address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", - "dev": true - }, - "adjust-sourcemap-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", - "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", - "dev": true, - "requires": { - "assert": "1.4.1", - "camelcase": "5.0.0", - "loader-utils": "1.2.3", - "object-path": "0.11.4", - "regex-parser": "2.2.10" - }, - "dependencies": { - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - } - }, - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", - "dev": true - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "dev": true, - "requires": { - "buffer-equal": "^1.0.0" - } - }, - "applicationinsights": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-1.0.8.tgz", - "integrity": "sha512-KzOOGdphOS/lXWMFZe5440LUdFbrLpMvh2SaRxn7BmiI550KAoSb2gIhiq6kJZ9Ir3AxRRztjhzif+e5P5IXIg==", - "requires": { - "diagnostic-channel": "0.2.0", - "diagnostic-channel-publishers": "0.2.1", - "zone.js": "0.7.6" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", - "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - } - }, - "arity-n": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", - "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" - }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "dev": true, - "requires": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", - "dev": true, - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", - "dev": true - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", - "dev": true - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", - "dev": true, - "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", - "dev": true - }, - "async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "dev": true, - "requires": { - "async-done": "^1.2.2" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "autoprefixer": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz", - "integrity": "sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==", - "dev": true, - "requires": { - "browserslist": "^4.8.3", - "caniuse-lite": "^1.0.30001020", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.26", - "postcss-value-parser": "^4.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-value-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", - "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" - }, - "axobject-query": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz", - "integrity": "sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ==", - "dev": true - }, - "azure-devops-node-api": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-7.2.0.tgz", - "integrity": "sha512-pMfGJ6gAQ7LRKTHgiRF+8iaUUeGAI0c8puLaqHLc7B8AR7W6GJLozK9RFeUHFjEGybC9/EB3r67WPd7e46zQ8w==", - "dev": true, - "requires": { - "os": "0.1.1", - "tunnel": "0.0.4", - "typed-rest-client": "1.2.0", - "underscore": "1.8.3" - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - } - } - }, - "babel-eslint": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", - "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "babel-extract-comments": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", - "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", - "dev": true, - "requires": { - "babylon": "^6.18.0" - } - }, - "babel-jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.1.0.tgz", - "integrity": "sha512-tz0VxUhhOE2y+g8R2oFrO/2VtVjA1lkJeavlhExuRBg3LdNJY9gwQ+Vcvqt9+cqy71MCTJhewvTB7Qtnnr9SWg==", - "requires": { - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^25.1.0", - "chalk": "^3.0.0", - "slash": "^3.0.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@jest/transform": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.1.0.tgz", - "integrity": "sha512-4ktrQ2TPREVeM+KxB4zskAT84SnmG1vaz4S+51aTefyqn3zocZUnliLLm5Fsl85I3p/kFPN4CRp1RElIfXGegQ==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^25.1.0", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^3.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-util": "^25.1.0", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": true - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "istanbul-lib-instrument": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.0.tgz", - "integrity": "sha512-Nm4wVHdo7ZXSG30KjZ2Wl5SU/Bw7bDx1PdaiIFzEStdjs0H12mOTncn1GVYuqQSaZxpg87VGBRsVRPGD2cD1AQ==", - "requires": { - "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "jest-haste-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.1.0.tgz", - "integrity": "sha512-/2oYINIdnQZAqyWSn1GTku571aAfs8NxzSErGek65Iu5o8JYb+113bZysRMcC/pjE5v9w0Yz+ldbj9NxrFyPyw==", - "requires": { - "@jest/types": "^25.1.0", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.3", - "jest-serializer": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-regex-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.1.0.tgz", - "integrity": "sha512-9lShaDmDpqwg+xAd73zHydKrBbbrIi08Kk9YryBEBybQFg/lBWR/2BDjjiSE7KIppM9C5+c03XiDaZ+m4Pgs1w==" - }, - "jest-serializer": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.1.0.tgz", - "integrity": "sha512-20Wkq5j7o84kssBwvyuJ7Xhn7hdPeTXndnwIblKDR2/sy1SUm6rWWiG9kSCgJPIfkDScJCIsTtOKdlzfIHOfKA==" - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "write-file-atomic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", - "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - } - } - }, - "babel-loader": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", - "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", - "dev": true, - "requires": { - "find-cache-dir": "^2.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1", - "pify": "^4.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", - "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-istanbul": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.3.0", - "test-exclude": "^5.2.3" - } - }, - "babel-plugin-jest-hoist": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.1.0.tgz", - "integrity": "sha512-oIsopO41vW4YFZ9yNYoLQATnnN46lp+MZ6H4VvPKFkcc2/fkl3CfE/NZZSmnEIEsJRmJAgkVEK0R7Zbl50CpTw==", - "requires": { - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "babel-plugin-named-asset-import": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz", - "integrity": "sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA==", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" - } - }, - "babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", - "dev": true - }, - "babel-preset-jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.1.0.tgz", - "integrity": "sha512-eCGn64olaqwUMaugXsTtGAM2I0QTahjEtnRu0ql8Ie+gDWAc1N6wqN0k2NilnyTunM69Pad7gJY7LOtwLimoFQ==", - "requires": { - "@babel/plugin-syntax-bigint": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^25.1.0" - } - }, - "babel-preset-react-app": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.1.1.tgz", - "integrity": "sha512-YkWP2UwY//TLltNlEBRngDOrYhvSLb+CA330G7T9M5UhGEMWe+JK/8IXJc5p2fDTSfSiETf+PY0+PYXFMix81Q==", - "dev": true, - "requires": { - "@babel/core": "7.8.4", - "@babel/plugin-proposal-class-properties": "7.8.3", - "@babel/plugin-proposal-decorators": "7.8.3", - "@babel/plugin-proposal-numeric-separator": "7.8.3", - "@babel/plugin-transform-flow-strip-types": "7.8.3", - "@babel/plugin-transform-react-display-name": "7.8.3", - "@babel/plugin-transform-runtime": "7.8.3", - "@babel/preset-env": "7.8.4", - "@babel/preset-react": "7.8.3", - "@babel/preset-typescript": "7.8.3", - "@babel/runtime": "7.8.4", - "babel-plugin-macros": "2.8.0", - "babel-plugin-transform-react-remove-prop-types": "0.4.24" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", - "dev": true, - "requires": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" - } - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bl": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", - "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" - }, - "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==" - }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" - } - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.8.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.7.tgz", - "integrity": "sha512-gFOnZNYBHrEyUML0xr5NJ6edFaaKbTFX9S9kQHlYfCP0Rit/boRIz4G+Avq6/4haEKJXdGGUnoolx+5MWW2BoA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001027", - "electron-to-chromium": "^1.3.349", - "node-releases": "^1.1.49" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", - "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "cacache": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", - "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", - "dev": true, - "requires": { - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "minipass": "^3.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^7.0.0", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camel-case": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", - "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", - "dev": true, - "requires": { - "pascal-case": "^3.1.1", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001028", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001028.tgz", - "integrity": "sha512-Vnrq+XMSHpT7E+LWoIYhs3Sne8h9lx9YJV3acH3THNCwU/9zV93/ta4xVfzTtnqd3rvnuVpVjE3DFqf56tr3aQ==", - "dev": true - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "requires": { - "rsvp": "^4.8.4" - } - }, - "case-sensitive-paths-webpack-plugin": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", - "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "cheerio": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", - "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", - "dev": true, - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.1", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - }, - "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, - "requires": { - "@types/node": "*" - } - } - } - }, - "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - } - } - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-deep": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", - "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", - "dev": true, - "requires": { - "for-own": "^0.1.3", - "is-plain-object": "^2.0.1", - "kind-of": "^3.0.2", - "lazy-cache": "^1.0.3", - "shallow-clone": "^0.1.2" - } - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "collect-v8-coverage": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.0.tgz", - "integrity": "sha512-VKIhJgvk8E1W28m5avZ2Gv2Ruv5YiF56ug2oclvaG9md69BuZImMG2sk9g7QNKLUbtYAKQjXjYxbYZVUlMMKmQ==" - }, - "collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "dev": true, - "requires": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", - "dev": true, - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "compare-versions": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.5.1.tgz", - "integrity": "sha512-9fGPIB7C6AyM18CJJBHt5EnCZDG3oiTJYy0NjfIAGjKpzv0tkxWko7TNQHF5ymqm7IH03tqmeuBxtvD+Izh6mg==" - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" - }, - "compose-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", - "dev": true, - "requires": { - "arity-n": "^1.0.4" - } - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - }, - "dependencies": { - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", - "dev": true - } - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "confusing-browser-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", - "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", - "dev": true - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", - "dev": true, - "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" - } - }, - "core-js": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", - "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", - "dev": true - }, - "core-js-compat": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", - "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", - "dev": true, - "requires": { - "browserslist": "^4.8.3", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - } - }, - "css-blank-pseudo": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", - "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "dev": true, - "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-has-pseudo": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", - "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^5.0.0-rc.4" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-loader": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", - "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash": "^4.17.11", - "postcss": "^6.0.23", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - } - }, - "css-modules-loader-core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz", - "integrity": "sha1-WQhmgpShvs0mGuCkziGwtVHyHRY=", - "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.1", - "postcss-modules-extract-imports": "1.1.0", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz", - "integrity": "sha1-AA29H47vIXqjaLmiEsX8QLKo8/I=", - "requires": { - "chalk": "^1.1.3", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-modules-extract-imports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", - "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", - "requires": { - "postcss": "^6.0.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "css-prefers-color-scheme": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", - "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - }, - "dependencies": { - "css-what": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", - "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", - "dev": true - } - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "css-selector-tokenizer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", - "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", - "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" - } - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dev": true, - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "dev": true - }, - "css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" - }, - "cssdb": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", - "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==", - "dev": true - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" - }, - "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", - "dev": true, - "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", - "postcss-unique-selectors": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "dev": true - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "dev": true - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", - "dev": true - }, - "csso": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", - "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", - "dev": true, - "requires": { - "css-tree": "1.0.0-alpha.37" - } - }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", - "dev": true, - "requires": { - "cssom": "0.3.x" - } - }, - "csstype": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.8.tgz", - "integrity": "sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA==" - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - }, - "dependencies": { - "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "debug-fabulous": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz", - "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==", - "dev": true, - "requires": { - "debug": "3.X", - "memoizee": "0.4.X", - "object-assign": "4.X" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "requires": { - "mimic-response": "^2.0.0" - } - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", - "dev": true, - "requires": { - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - } - }, - "default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" - }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true - }, - "detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "dev": true, - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "diagnostic-channel": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz", - "integrity": "sha1-zJmvlhLCP7H/8TYSxy8sv6qNWhc=", - "requires": { - "semver": "^5.3.0" - } - }, - "diagnostic-channel-publishers": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.2.1.tgz", - "integrity": "sha1-ji1geottef6IC1SLxYzGvrKIxPM=" - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "diff-sequences": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==" - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "requires": { - "webidl-conversions": "^4.0.2" - } - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz", - "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==", - "dev": true, - "requires": { - "no-case": "^3.0.3", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", - "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "dev": true - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.355", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.355.tgz", - "integrity": "sha512-zKO/wS+2ChI/jz9WAo647xSW8t2RmgRLFdbUb/77cORkUTargO+SCj4ctTHjBn2VeNFrsLgDT7IuDVrd3F8mLQ==", - "dev": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "requires": { - "once": "^1.4.0" - } - }, - "engine.io": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", - "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", - "requires": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "~7.4.2" - }, - "dependencies": { - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" - }, - "ws": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", - "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==" - } - } - }, - "engine.io-client": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.1.tgz", - "integrity": "sha512-oVu9kBkGbcggulyVF0kz6BV3ganqUeqXvD79WOFKa+11oK692w1NyFkuEj4xrkFRpZhn92QOqTk4RQq5LiBXbQ==", - "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "ws": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", - "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==" - } - } - }, - "engine.io-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", - "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.4", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", - "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.50", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz", - "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "^1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escodegen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", - "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", - "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" - } - } - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "eslint-config-react-app": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.0.tgz", - "integrity": "sha512-WrHjoGpKr1kLLiWDD81tme9jMM0hk5cMxasLSdyno6DdPt+IfLOrDJBVo6jN7tn4y1nzhs43TmUaZWO6Sf0blw==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.9" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", - "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-loader": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.3.tgz", - "integrity": "sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw==", - "dev": true, - "requires": { - "fs-extra": "^8.1.0", - "loader-fs-cache": "^1.0.2", - "loader-utils": "^1.2.3", - "object-hash": "^2.0.1", - "schema-utils": "^2.6.1" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz", - "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - } - } - }, - "eslint-plugin-flowtype": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz", - "integrity": "sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "eslint-plugin-import": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.0.tgz", - "integrity": "sha512-NK42oA0mUc8Ngn4kONOPsPB1XhbUvNHqF+g307dPV28aknPoiNnKLFd9em4nkswwepdF5ouieqv5Th/63U7YJQ==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.1", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.0", - "read-pkg-up": "^2.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", - "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.4.5", - "aria-query": "^3.0.0", - "array-includes": "^3.0.3", - "ast-types-flow": "^0.0.7", - "axobject-query": "^2.0.2", - "damerau-levenshtein": "^1.0.4", - "emoji-regex": "^7.0.2", - "has": "^1.0.3", - "jsx-ast-utils": "^2.2.1" - } - }, - "eslint-plugin-react": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.18.0.tgz", - "integrity": "sha512-p+PGoGeV4SaZRDsXqdj9OWcOrOpZn8gXoGPcIQTzo2IDMbAKhNDnME9myZWqO3Ic4R3YmwAZ1lDjWl2R2hMUVQ==", - "dev": true, - "requires": { - "array-includes": "^3.1.1", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.2.3", - "object.entries": "^1.1.1", - "object.fromentries": "^2.0.2", - "object.values": "^1.1.1", - "prop-types": "^15.7.2", - "resolve": "^1.14.2" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "object.entries": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", - "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-plugin-react-hooks": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", - "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==", - "dev": true - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - }, - "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", - "dev": true, - "requires": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", - "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "event-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", - "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "from": "^0.1.7", - "map-stream": "0.0.7", - "pause-stream": "^0.0.11", - "split": "^1.0.1", - "stream-combiner": "^0.2.2", - "through": "^2.3.8" - } - }, - "eventemitter2": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", - "integrity": "sha1-YZegldX7a1folC9v1+qtY6CclFI=" - }, - "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", - "dev": true - }, - "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", - "dev": true - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "exec-sh": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", - "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==" - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "expect": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.1.0.tgz", - "integrity": "sha512-wqHzuoapQkhc3OKPlrpetsfueuEiMf3iWh0R8+duCu9PIjXoP7HgD5aeypwTnXUAjC8aMsiVDaWwlbJ1RlQ38g==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-styles": "^4.0.0", - "jest-get-type": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-regex-util": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "diff-sequences": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", - "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-diff": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", - "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-matcher-utils": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", - "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", - "requires": { - "chalk": "^3.0.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fb-watchman": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", - "requires": { - "bser": "^2.0.0" - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "file-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", - "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.5.0" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "filesize": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz", - "integrity": "sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg==", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, - "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "dev": true, - "requires": { - "is-buffer": "~2.0.3" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", - "dev": true - }, - "flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", - "dev": true - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", - "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", - "dev": true, - "requires": { - "debug": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "fork-ts-checker-webpack-plugin": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz", - "integrity": "sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ==", - "dev": true, - "requires": { - "babel-code-frame": "^6.22.0", - "chalk": "^2.4.1", - "chokidar": "^3.3.0", - "micromatch": "^3.1.10", - "minimatch": "^3.0.4", - "semver": "^5.6.0", - "tapable": "^1.0.0", - "worker-rpc": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", - "dev": true, - "requires": { - "picomatch": "^2.0.7" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - } - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": false, - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": false, - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": false, - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "debug": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": false, - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": false, - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "resolved": false, - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": false, - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": false, - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": false, - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": false, - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": false, - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": false, - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.3.5", - "resolved": false, - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "resolved": false, - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": false, - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.0", - "resolved": false, - "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", - "dev": true, - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "resolved": false, - "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": false, - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "resolved": false, - "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": false, - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": false, - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": false, - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": false, - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": false, - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": false, - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": false, - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": false, - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": false, - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.0", - "resolved": false, - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": false, - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "resolved": false, - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": false, - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.0.3", - "resolved": false, - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true, - "optional": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "generic-names": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-1.0.3.tgz", - "integrity": "sha1-LXhqEhruUIh2eWk56OO/+DbCCRc=", - "requires": { - "loader-utils": "^0.2.16" - }, - "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - } - } - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "git-rev-sync": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/git-rev-sync/-/git-rev-sync-1.12.0.tgz", - "integrity": "sha1-RGhAbH5sO6TPRYeZnhrbKNnRr1U=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "graceful-fs": "4.1.11", - "shelljs": "0.7.7" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - } - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "glob-watcher": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", - "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "object.defaults": "^1.1.0" - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - }, - "dependencies": { - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - } - } - }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" - }, - "gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", - "dev": true, - "requires": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" - } - }, - "gulp-cli": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", - "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.1.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.0.1", - "yargs": "^7.1.0" - }, - "dependencies": { - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", - "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "object.assign": "^4.1.0" - } - } - } - }, - "gulp-filter": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz", - "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=", - "dev": true, - "requires": { - "multimatch": "^2.0.0", - "plugin-error": "^0.1.2", - "streamfilter": "^1.0.5" - } - }, - "gulp-sourcemaps": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz", - "integrity": "sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg==", - "dev": true, - "requires": { - "@gulp-sourcemaps/identity-map": "1.X", - "@gulp-sourcemaps/map-sources": "1.X", - "acorn": "5.X", - "convert-source-map": "1.X", - "css": "2.X", - "debug-fabulous": "1.X", - "detect-newline": "2.X", - "graceful-fs": "4.X", - "source-map": "~0.6.0", - "strip-bom-string": "1.X", - "through2": "2.X" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - } - } - }, - "gulp-typescript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-5.0.1.tgz", - "integrity": "sha512-YuMMlylyJtUSHG1/wuSVTrZp60k1dMEFKYOvDf7OvbAJWrDtxxD4oZon4ancdWwzjj30ztiidhe4VXJniF0pIQ==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.5", - "plugin-error": "^1.0.1", - "source-map": "^0.7.3", - "through2": "^3.0.0", - "vinyl": "^2.1.0", - "vinyl-fs": "^3.0.3" - }, - "dependencies": { - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - }, - "dependencies": { - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - } - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", - "dev": true, - "requires": { - "readable-stream": "2 || 3" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - } - }, - "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "handle-thing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "harmony-reflect": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", - "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", - "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", - "requires": { - "react-is": "^16.7.0" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "requires": { - "whatwg-encoding": "^1.0.1" - } - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true - }, - "html-escaper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", - "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==" - }, - "html-minifier-terser": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.0.4.tgz", - "integrity": "sha512-fHwmKQ+GzhlqdxEtwrqLT7MSuheiA+rif5/dZgbz3GjoMXJzcRzy1L9NXoiiyxrnap+q5guSiv8Tz5lrh9g42g==", - "dev": true, - "requires": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", - "he": "^1.2.0", - "param-case": "^3.0.3", - "relateurl": "^0.2.7", - "terser": "^4.6.3" - }, - "dependencies": { - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - } - } - }, - "html-webpack-plugin": { - "version": "4.0.0-beta.11", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz", - "integrity": "sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg==", - "dev": true, - "requires": { - "html-minifier-terser": "^5.0.1", - "loader-utils": "^1.2.3", - "lodash": "^4.17.15", - "pretty-error": "^2.1.1", - "tapable": "^1.1.3", - "util.promisify": "1.0.0" - } - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "dev": true, - "requires": { - "agent-base": "4", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "dev": true, - "requires": { - "postcss": "^6.0.1" - } - }, - "identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", - "dev": true, - "requires": { - "harmony-reflect": "^1.4.6" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true - }, - "immer": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", - "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==", - "dev": true - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "requires": { - "resolve-from": "^3.0.0" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "inquirer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", - "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "intl-format-cache": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/intl-format-cache/-/intl-format-cache-4.1.13.tgz", - "integrity": "sha512-d/1NI8ctPZsPJU3G6k0pIuydnebeck7hG+wIHJOJUJm3eZ2+3bcZCD34o/Mc18M5ZiEZei02xsMtp8g1IQc23A==" - }, - "intl-locales-supported": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/intl-locales-supported/-/intl-locales-supported-1.4.5.tgz", - "integrity": "sha512-D7oriM5x46rd7kNlSW0f9noIBegFr3ReIM6xlMpwH4lfIPD/zvBelPlCjR10IK16boGJG9lKccOvRAM8wzpbrA==" - }, - "intl-messageformat": { - "version": "6.1.9", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-6.1.9.tgz", - "integrity": "sha512-vnPujdP+gpWK/+GxWUo3nWRfrUj67/NAZoBNAyCvZ0fnfWh5jvIkKNr5ZZYewdZ7J3cEFLU6hYYgWztiCEFZGg==", - "requires": { - "intl-format-cache": "^4.1.13", - "intl-messageformat-parser": "^3.0.7" - } - }, - "intl-messageformat-parser": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-3.0.7.tgz", - "integrity": "sha512-L16VbbV3NFaiZV65XwOIH9fBe52TS2EkOR0k8Y4ratsgTE7KPEbcUCUrz/iEQwJo7BcWY4ohkZbeYZRgAiPR1Q==" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" - }, - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", - "dev": true - }, - "is": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", - "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", - "dev": true - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" - }, - "is-docker": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", - "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" - }, - "is-generator-function": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", - "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.1.0.tgz", - "integrity": "sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "requires": { - "has": "^1.0.1" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "dev": true - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "dev": true, - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - } - } - }, - "istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A==", - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-25.1.0.tgz", - "integrity": "sha512-FV6jEruneBhokkt9MQk0WUFoNTwnF76CLXtwNMfsc0um0TlB/LG2yxUd0KqaFjEJ9laQmVWQWS0sG/t2GsuI0w==", - "requires": { - "@jest/core": "^25.1.0", - "import-local": "^3.0.2", - "jest-cli": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "jest-cli": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.1.0.tgz", - "integrity": "sha512-p+aOfczzzKdo3AsLJlhs8J5EW6ffVidfSZZxXedJ0mHPBOln1DccqFmGCoO8JWd4xRycfmwy1eoQkMsF8oekPg==", - "requires": { - "@jest/core": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^15.0.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.1.0.tgz", - "integrity": "sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg==", - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^16.1.0" - } - } - } - }, - "jest-changed-files": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.1.0.tgz", - "integrity": "sha512-bdL1aHjIVy3HaBO3eEQeemGttsq1BDlHgWcOjEOIAcga7OOEGWHD2WSu8HhL7I1F0mFFyci8VKU4tRNk+qtwDA==", - "requires": { - "@jest/types": "^25.1.0", - "execa": "^3.2.0", - "throat": "^5.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "jest-config": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.1.0.tgz", - "integrity": "sha512-tLmsg4SZ5H7tuhBC5bOja0HEblM0coS3Wy5LTCb2C8ZV6eWLewHyK+3qSq9Bi29zmWQ7ojdCd3pxpx4l4d2uGw==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^25.1.0", - "@jest/types": "^25.1.0", - "babel-jest": "^25.1.0", - "chalk": "^3.0.0", - "glob": "^7.1.1", - "jest-environment-jsdom": "^25.1.0", - "jest-environment-node": "^25.1.0", - "jest-get-type": "^25.1.0", - "jest-jasmine2": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "micromatch": "^4.0.2", - "pretty-format": "^25.1.0", - "realpath-native": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", - "requires": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-docblock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.1.0.tgz", - "integrity": "sha512-370P/mh1wzoef6hUKiaMcsPtIapY25suP6JqM70V9RJvdKLrV4GaGbfUseUVk4FZJw4oTZ1qSCJNdrClKt5JQA==", - "requires": { - "detect-newline": "^3.0.0" - }, - "dependencies": { - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" - } - } - }, - "jest-each": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.1.0.tgz", - "integrity": "sha512-R9EL8xWzoPySJ5wa0DXFTj7NrzKpRD40Jy+zQDp3Qr/2QmevJgkN9GqioCGtAJ2bW9P/MQRznQHQQhoeAyra7A==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "jest-get-type": "^25.1.0", - "jest-util": "^25.1.0", - "pretty-format": "^25.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-environment-jsdom": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.1.0.tgz", - "integrity": "sha512-ILb4wdrwPAOHX6W82GGDUiaXSSOE274ciuov0lztOIymTChKFtC02ddyicRRCdZlB5YSrv3vzr1Z5xjpEe1OHQ==", - "requires": { - "@jest/environment": "^25.1.0", - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "jsdom": "^15.1.1" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/fake-timers": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.1.0.tgz", - "integrity": "sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ==", - "requires": { - "@jest/types": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "lolex": "^5.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", - "requires": { - "@jest/types": "^25.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-environment-jsdom-fourteen": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-1.0.1.tgz", - "integrity": "sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q==", - "dev": true, - "requires": { - "@jest/environment": "^24.3.0", - "@jest/fake-timers": "^24.3.0", - "@jest/types": "^24.3.0", - "jest-mock": "^24.0.0", - "jest-util": "^24.0.0", - "jsdom": "^14.1.0" - }, - "dependencies": { - "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", - "dev": true, - "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" - } - }, - "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - } - }, - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, - "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", - "dev": true - }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jsdom": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz", - "integrity": "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^6.0.4", - "acorn-globals": "^4.3.0", - "array-equal": "^1.0.0", - "cssom": "^0.3.4", - "cssstyle": "^1.1.1", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.0", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.1.3", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.5.0", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^6.1.2", - "xml-name-validator": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "jest-environment-node": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.1.0.tgz", - "integrity": "sha512-U9kFWTtAPvhgYY5upnH9rq8qZkj6mYLup5l1caAjjx9uNnkLHN2xgZy5mo4SyLdmrh/EtB9UPpKFShvfQHD0Iw==", - "requires": { - "@jest/environment": "^25.1.0", - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/fake-timers": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.1.0.tgz", - "integrity": "sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ==", - "requires": { - "@jest/types": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "lolex": "^5.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", - "requires": { - "@jest/types": "^25.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" - }, - "jest-haste-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.1.0.tgz", - "integrity": "sha512-/2oYINIdnQZAqyWSn1GTku571aAfs8NxzSErGek65Iu5o8JYb+113bZysRMcC/pjE5v9w0Yz+ldbj9NxrFyPyw==", - "requires": { - "@jest/types": "^25.1.0", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.3", - "jest-serializer": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": true - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-jasmine2": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.1.0.tgz", - "integrity": "sha512-GdncRq7jJ7sNIQ+dnXvpKO2MyP6j3naNK41DTTjEAhLEdpImaDA9zSAZwDhijjSF/D7cf4O5fdyUApGBZleaEg==", - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^25.1.0", - "@jest/source-map": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "co": "^4.6.0", - "expect": "^25.1.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "pretty-format": "^25.1.0", - "throat": "^5.0.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "diff-sequences": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", - "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-diff": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", - "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-matcher-utils": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", - "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", - "requires": { - "chalk": "^3.0.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-leak-detector": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.1.0.tgz", - "integrity": "sha512-3xRI264dnhGaMHRvkFyEKpDeaRzcEBhyNrOG5oT8xPxOyUAblIAQnpiR3QXu4wDor47MDTiHbiFcbypdLcLW5w==", - "requires": { - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - } - } - }, - "jest-matcher-utils": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", - "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", - "requires": { - "chalk": "^2.0.1", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", - "stack-utils": "^1.0.1" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-mock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - } - } - }, - "jest-pnp-resolver": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", - "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==" - }, - "jest-regex-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.1.0.tgz", - "integrity": "sha512-9lShaDmDpqwg+xAd73zHydKrBbbrIi08Kk9YryBEBybQFg/lBWR/2BDjjiSE7KIppM9C5+c03XiDaZ+m4Pgs1w==" - }, - "jest-resolve": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", - "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.1.0.tgz", - "integrity": "sha512-Cu/Je38GSsccNy4I2vL12ZnBlD170x2Oh1devzuM9TLH5rrnLW1x51lN8kpZLYTvzx9j+77Y5pqBaTqfdzVzrw==", - "requires": { - "@jest/types": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-snapshot": "^25.1.0" - } - }, - "jest-runner": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.1.0.tgz", - "integrity": "sha512-su3O5fy0ehwgt+e8Wy7A8CaxxAOCMzL4gUBftSs0Ip32S0epxyZPDov9Znvkl1nhVOJNf4UwAsnqfc3plfQH9w==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-config": "^25.1.0", - "jest-docblock": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-jasmine2": "^25.1.0", - "jest-leak-detector": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-runtime": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.1.0.tgz", - "integrity": "sha512-mpPYYEdbExKBIBB16ryF6FLZTc1Rbk9Nx0ryIpIMiDDkOeGa0jQOKVI/QeGvVGlunKKm62ywcioeFVzIbK03bA==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/source-map": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.3", - "jest-config": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "realpath-native": "^1.1.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.0.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@types/yargs": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.1.tgz", - "integrity": "sha512-sYlwNU7zYi6eZbMzFvG6eHD7VsEvFdoDtlD7eI1JTg7YNnuguzmiGsc6MPSq5l8n+h21AsNof0je+9sgOe4+dg==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", - "requires": { - "@jest/types": "^25.1.0" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.1.0.tgz", - "integrity": "sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg==", - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^16.1.0" - } - } - } - }, - "jest-serializer": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.1.0.tgz", - "integrity": "sha512-20Wkq5j7o84kssBwvyuJ7Xhn7hdPeTXndnwIblKDR2/sy1SUm6rWWiG9kSCgJPIfkDScJCIsTtOKdlzfIHOfKA==" - }, - "jest-snapshot": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.1.0.tgz", - "integrity": "sha512-xZ73dFYN8b/+X2hKLXz4VpBZGIAn7muD/DAg+pXtDzDGw3iIV10jM7WiHqhCcpDZfGiKEj7/2HXAEPtHTj0P2A==", - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "expect": "^25.1.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^25.1.0", - "semver": "^7.1.1" - }, - "dependencies": { - "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", - "requires": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", - "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "diff-sequences": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", - "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-diff": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", - "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "jest-matcher-utils": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", - "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", - "requires": { - "chalk": "^3.0.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" - } - }, - "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", - "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "semver": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.1.tgz", - "integrity": "sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-transform-css": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jest-transform-css/-/jest-transform-css-2.0.0.tgz", - "integrity": "sha512-KV5pD27qUltAVj0mZEVvqd+Ahe+WNPOVWKA1BRpIhBJ5OeUUOM46ivAznJrC5B1JrVNbMzWjPxnKl6QTsAAT3Q==", - "requires": { - "common-tags": "1.8.0", - "cosmiconfig": "5.0.6", - "cross-spawn": "6.0.5", - "postcss-load-config": "2.0.0", - "postcss-modules": "1.3.2", - "style-inject": "0.3.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.6.tgz", - "integrity": "sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ==", - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0" - } - } - } - }, - "jest-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", - "dev": true, - "requires": { - "@jest/console": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/source-map": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-validate": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.1.0.tgz", - "integrity": "sha512-kGbZq1f02/zVO2+t1KQGSVoCTERc5XeObLwITqC6BTRH3Adv7NZdYqCpKIZLUgpLXf2yISzQ465qOZpul8abXA==", - "requires": { - "@jest/types": "^25.1.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "jest-get-type": "^25.1.0", - "leven": "^3.1.0", - "pretty-format": "^25.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==" - }, - "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", - "requires": { - "@jest/types": "^25.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-watch-typeahead": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz", - "integrity": "sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.1", - "jest-regex-util": "^24.9.0", - "jest-watcher": "^24.3.0", - "slash": "^3.0.0", - "string-length": "^3.1.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", - "dev": true, - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-watcher": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", - "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", - "dev": true, - "requires": { - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "jest-util": "^24.9.0", - "string-length": "^2.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsdom": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", - "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", - "requires": { - "abab": "^2.0.0", - "acorn": "^7.1.0", - "acorn-globals": "^4.3.2", - "array-equal": "^1.0.0", - "cssom": "^0.4.1", - "cssstyle": "^2.0.0", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.1", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.2.0", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^7.0.0", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" - }, - "cssstyle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", - "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - } - } - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" - }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jsx-ast-utils": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", - "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "object.assign": "^4.1.0" - } - }, - "just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", - "dev": true - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - } - } - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" - }, - "last-call-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", - "dev": true, - "requires": { - "lodash": "^4.17.5", - "webpack-sources": "^1.1.0" - } - }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "dev": true, - "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "dev": true, - "requires": { - "flush-write-stream": "^1.0.2" - } - }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", - "dev": true - }, - "less": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", - "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", - "dev": true, - "requires": { - "clone": "^2.1.2", - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "mime": "^1.4.1", - "mkdirp": "^0.5.0", - "promise": "^7.1.1", - "request": "^2.83.0", - "source-map": "~0.6.0" - } - }, - "less-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", - "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "loader-utils": "^1.1.0", - "pify": "^3.0.0" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "dev": true, - "requires": { - "leven": "^3.1.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - }, - "dependencies": { - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - } - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "linkify-it": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.1.0.tgz", - "integrity": "sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg==", - "dev": true, - "requires": { - "uc.micro": "^1.0.1" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "loader-fs-cache": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz", - "integrity": "sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw==", - "dev": true, - "requires": { - "find-cache-dir": "^0.1.1", - "mkdirp": "0.5.1" - }, - "dependencies": { - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "^1.0.0" - } - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" - }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "loglevel": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", - "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==", - "dev": true - }, - "lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", - "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", - "dev": true, - "requires": { - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "dev": true, - "requires": { - "es5-ext": "~0.10.2" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==" - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "requires": { - "tmpl": "1.0.x" - } - }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", - "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "entities": "~1.1.1", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - } - }, - "matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "dev": true, - "requires": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - } - } - }, - "memoizee": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", - "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.45", - "es6-weak-map": "^2.0.2", - "event-emitter": "^0.3.5", - "is-promise": "^2.1", - "lru-queue": "0.1", - "next-tick": "1", - "timers-ext": "^0.1.5" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true - }, - "merge-deep": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", - "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "clone-deep": "^0.2.4", - "kind-of": "^3.0.2" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", - "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "microevent.ts": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", - "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "requires": { - "mime-db": "1.40.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" - }, - "min-indent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz", - "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=" - }, - "mini-css-extract-plugin": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", - "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "minipass": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", - "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", - "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mixin-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", - "dev": true, - "requires": { - "for-in": "^0.1.3", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-in": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", - "dev": true - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, - "mocha": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.1.4.tgz", - "integrity": "sha512-PN8CIy4RXsIoxoFJzS4QNnCH4psUCPWc4/rPrst/ecSJJbLBkubMiyGCP2Kj/9YnWbotFqAoeXyXMucj7gwCFg==", - "dev": true, - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.2.2", - "yargs-parser": "13.0.0", - "yargs-unparser": "1.5.0" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" - } - }, - "yargs-parser": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", - "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" - } - }, - "mute-stdout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "no-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", - "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", - "dev": true, - "requires": { - "lower-case": "^2.0.1", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "node-abi": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.15.0.tgz", - "integrity": "sha512-FeLpTS0F39U7hHZU1srAK4Vx+5AHNVOTP+hxBNQknR/54laTHSFIJkDWDqiquY1LeLUgTfPN7sLPhMubx0PLAg==", - "requires": { - "semver": "^5.4.1" - } - }, - "node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" - }, - "node-libs-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", - "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - } - } - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" - }, - "node-notifier": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", - "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.1.1", - "semver": "^6.3.0", - "shellwords": "^0.1.1", - "which": "^1.3.1" - }, - "dependencies": { - "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", - "optional": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "optional": true - } - } - }, - "node-releases": { - "version": "1.1.49", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.49.tgz", - "integrity": "sha512-xH8t0LS0disN0mtRCh+eByxFPie+msJUBL/lJDBuap53QGiYPa9joh83K4pCZgWJ+2L4b9h88vCVdXQ60NO2bg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "noop-logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, - "now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "dev": true, - "requires": { - "once": "^1.3.2" - } - }, - "npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "object-hash": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", - "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==", - "dev": true - }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true - }, - "object-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", - "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object-path": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", - "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "object.entries": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", - "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "object.fromentries": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", - "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } - }, - "object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "office-ui-fabric-react": { - "version": "7.105.12", - "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-7.105.12.tgz", - "integrity": "sha512-PUmhth8szgLzR6xoN4HkPA0aIahpYr6/sU5oPob5zPRXB2JrhOCnCL9lFsL7/xU0lCFf/OAdoH+ARvF8DcAa0w==", - "requires": { - "@fluentui/react-focus": "^7.1.13", - "@microsoft/load-themed-styles": "^1.10.26", - "@uifabric/foundation": "^7.5.25", - "@uifabric/icons": "^7.3.24", - "@uifabric/merge-styles": "^7.8.11", - "@uifabric/react-hooks": "^7.1.2", - "@uifabric/set-version": "^7.0.9", - "@uifabric/styling": "^7.11.2", - "@uifabric/utilities": "^7.15.5", - "prop-types": "^15.7.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } - } - }, - "on-error-resume-next": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-error-resume-next/-/on-error-resume-next-1.1.0.tgz", - "integrity": "sha512-XhWMbmKV0+W95yLJjT1Z9zdkKiPUjDn63YYsji1pdvKqaa7pq4coeHaHEXPsa36SFlffOyOlPK/0rn6Njfb+LA==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "requires": { - "is-wsl": "^1.1.0" - } - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "optimize-css-assets-webpack-plugin": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", - "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", - "dev": true, - "requires": { - "cssnano": "^4.1.10", - "last-call-webpack-plugin": "^3.0.0" - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz", - "integrity": "sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M=" - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-each-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", - "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", - "dev": true - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", - "dev": true - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "param-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz", - "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==", - "dev": true, - "requires": { - "dot-case": "^3.0.3", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - } - } - }, - "parse-asn1": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", - "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parse-semver": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", - "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=", - "dev": true, - "requires": { - "semver": "^5.1.0" - } - }, - "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" - }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascal-case": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", - "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", - "dev": true, - "requires": { - "no-case": "^3.0.3", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", - "dev": true - } - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "~2.3" - } - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "picomatch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", - "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==" - }, - "pidtree": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", - "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - } - } - }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" - }, - "pnp-webpack-plugin": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.0.tgz", - "integrity": "sha512-ZcMGn/xF/fCOq+9kWMP9vVVxjIkMCja72oy3lziR7UHy0hHFZ57iVpQ71OtveVbmzeCmphBg8pxNdk/hlK99aQ==", - "dev": true, - "requires": { - "ts-pnp": "^1.1.2" - } - }, - "portfinder": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", - "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.1" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-attribute-case-insensitive": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", - "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^6.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-browser-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", - "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", - "dev": true, - "requires": { - "postcss": "^7" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-calc": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", - "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", - "dev": true, - "requires": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", - "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-functional-notation": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", - "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-gray": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", - "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-hex-alpha": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", - "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", - "dev": true, - "requires": { - "postcss": "^7.0.14", - "postcss-values-parser": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-mod-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", - "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-color-rebeccapurple": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", - "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-custom-media": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", - "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-custom-properties": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", - "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", - "dev": true, - "requires": { - "postcss": "^7.0.17", - "postcss-values-parser": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-custom-selectors": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", - "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-dir-pseudo-class": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", - "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-double-position-gradients": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", - "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", - "dev": true, - "requires": { - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-env-function": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", - "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-flexbugs-fixes": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz", - "integrity": "sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-focus-visible": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", - "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-focus-within": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", - "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-font-variant": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz", - "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-gap-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", - "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-image-set-function": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", - "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-initial": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", - "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", - "dev": true, - "requires": { - "lodash.template": "^4.5.0", - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-lab-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", - "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", - "requires": { - "cosmiconfig": "^4.0.0", - "import-cwd": "^2.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" - } - } - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-logical": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", - "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-media-minmax": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", - "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", - "dev": true, - "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-1.3.2.tgz", - "integrity": "sha512-QujH5ZpPtr1fBWTKDa43Hx45gm7p19aEtHaAtkMCBZZiB/D5za2wXSMtAf94tDUZHF3F5KZcTXISUNqgEQRiDw==", - "requires": { - "css-modules-loader-core": "^1.1.0", - "generic-names": "^1.0.3", - "lodash.camelcase": "^4.3.0", - "postcss": "^7.0.1", - "string-hash": "^1.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.26.tgz", - "integrity": "sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", - "dev": true, - "requires": { - "postcss": "^6.0.1" - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - } - }, - "postcss-nesting": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", - "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", - "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", - "dev": true, - "requires": { - "@csstools/normalize.css": "^10.1.0", - "browserslist": "^4.6.2", - "postcss": "^7.0.17", - "postcss-browser-comments": "^3.0.0", - "sanitize.css": "^10.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", - "dev": true, - "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", - "dev": true, - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-overflow-shorthand": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", - "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-page-break": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", - "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-place": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", - "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-preset-env": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", - "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", - "dev": true, - "requires": { - "autoprefixer": "^9.6.1", - "browserslist": "^4.6.4", - "caniuse-lite": "^1.0.30000981", - "css-blank-pseudo": "^0.1.4", - "css-has-pseudo": "^0.10.0", - "css-prefers-color-scheme": "^3.1.1", - "cssdb": "^4.4.0", - "postcss": "^7.0.17", - "postcss-attribute-case-insensitive": "^4.0.1", - "postcss-color-functional-notation": "^2.0.1", - "postcss-color-gray": "^5.0.0", - "postcss-color-hex-alpha": "^5.0.3", - "postcss-color-mod-function": "^3.0.3", - "postcss-color-rebeccapurple": "^4.0.1", - "postcss-custom-media": "^7.0.8", - "postcss-custom-properties": "^8.0.11", - "postcss-custom-selectors": "^5.1.2", - "postcss-dir-pseudo-class": "^5.0.0", - "postcss-double-position-gradients": "^1.0.0", - "postcss-env-function": "^2.0.2", - "postcss-focus-visible": "^4.0.0", - "postcss-focus-within": "^3.0.0", - "postcss-font-variant": "^4.0.0", - "postcss-gap-properties": "^2.0.0", - "postcss-image-set-function": "^3.0.1", - "postcss-initial": "^3.0.0", - "postcss-lab-function": "^2.0.1", - "postcss-logical": "^3.0.0", - "postcss-media-minmax": "^4.0.0", - "postcss-nesting": "^7.0.0", - "postcss-overflow-shorthand": "^2.0.0", - "postcss-page-break": "^2.0.0", - "postcss-place": "^4.0.1", - "postcss-pseudo-class-any-link": "^6.0.0", - "postcss-replace-overflow-wrap": "^3.0.0", - "postcss-selector-matches": "^4.0.0", - "postcss-selector-not": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-pseudo-class-any-link": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", - "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-replace-overflow-wrap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", - "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-safe-parser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz", - "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-selector-matches": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", - "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-selector-not": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz", - "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "dependencies": { - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - } - } - }, - "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", - "dev": true, - "requires": { - "is-svg": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "prebuild-install": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.3.tgz", - "integrity": "sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==", - "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.7.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true - }, - "pretty-bytes": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", - "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==", - "dev": true - }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "dev": true, - "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" - } - }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", - "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/yargs": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.6.tgz", - "integrity": "sha512-IkltIncDQWv6fcAvnHtJ6KtkmY/vtR3bViOaCzpj/A3yNhlfZAgxNe6AEQD1cQrkYD+YsKVo08DSxvNKEsD7BA==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - } - } - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "optional": true, - "requires": { - "asap": "~2.0.3" - } - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "prompts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz", - "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==", - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.3" - } - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "psl": { - "version": "1.1.32", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.32.tgz", - "integrity": "sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==" - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", - "dev": true - }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dev": true, - "requires": { - "performance-now": "^2.1.0" - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "react": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", - "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - } - }, - "react-app-polyfill": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz", - "integrity": "sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g==", - "dev": true, - "requires": { - "core-js": "^3.5.0", - "object-assign": "^4.1.1", - "promise": "^8.0.3", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.3", - "whatwg-fetch": "^3.0.0" - }, - "dependencies": { - "promise": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.3.tgz", - "integrity": "sha512-HeRDUL1RJiLhyA0/grn+PTShlBAcLuh/1BJGtrvjwbvRDCTLLMEz9rOGCV+R3vHY4MixIuoMEd9Yq/XvsTPcjw==", - "dev": true, - "requires": { - "asap": "~2.0.6" - } - }, - "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", - "dev": true - } - } - }, - "react-dev-utils": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.2.0.tgz", - "integrity": "sha512-MwrvQW2TFjLblhqpDNeqCXHBkz3G5vc7k4wntgutAJZX4ia3o07eGKo6uYGhUOeJ0hfOxcpJFNFk7+4XCc1S8g==", - "dev": true, - "requires": { - "@babel/code-frame": "7.8.3", - "address": "1.1.2", - "browserslist": "4.8.6", - "chalk": "2.4.2", - "cross-spawn": "7.0.1", - "detect-port-alt": "1.1.6", - "escape-string-regexp": "2.0.0", - "filesize": "6.0.1", - "find-up": "4.1.0", - "fork-ts-checker-webpack-plugin": "3.1.1", - "global-modules": "2.0.0", - "globby": "8.0.2", - "gzip-size": "5.1.1", - "immer": "1.10.0", - "inquirer": "7.0.4", - "is-root": "2.1.0", - "loader-utils": "1.2.3", - "open": "^7.0.2", - "pkg-up": "3.1.0", - "react-error-overlay": "^6.0.6", - "recursive-readdir": "2.2.2", - "shell-quote": "1.7.2", - "strip-ansi": "6.0.0", - "text-table": "0.2.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "browserslist": { - "version": "4.8.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.6.tgz", - "integrity": "sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001023", - "electron-to-chromium": "^1.3.341", - "node-releases": "^1.1.47" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } - } - }, - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "open": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.2.tgz", - "integrity": "sha512-70E/pFTPr7nZ9nLDPNTcj3IVqnNvKuP4VsBmoKV9YGTnChe0mlS3C4qM7qKarhZ8rGaHKLfo+vBTHXDp6ZSyLQ==", - "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "react-dom": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", - "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.18.0" - } - }, - "react-error-overlay": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.6.tgz", - "integrity": "sha512-Yzpno3enVzSrSCnnljmr4b/2KUQSMZaPuqmS26t9k4nW7uwJk6STWmH9heNjPuvqUTO3jOSPkHoKgO4+Dw7uIw==", - "dev": true - }, - "react-intl": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-3.1.9.tgz", - "integrity": "sha512-mQxhcFsYsj7O+k2Gsf1p+QaGhEdr+g7v5hYaa88dqar1m1xdWldEJjZ4JK/waHTp4zhVPoco4NQ1JdPkhs8HkA==", - "requires": { - "@formatjs/intl-relativetimeformat": "^2.6.3", - "@types/hoist-non-react-statics": "^3.3.1", - "@types/invariant": "^2.2.30", - "hoist-non-react-statics": "^3.3.0", - "intl-format-cache": "^4.1.10", - "intl-locales-supported": "^1.4.5", - "intl-messageformat": "^6.1.6", - "intl-messageformat-parser": "^3.0.7", - "invariant": "^2.1.1", - "shallow-equal": "^1.1.0" - } - }, - "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==" - }, - "react-scripts": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.0.tgz", - "integrity": "sha512-pBqaAroFoHnFAkuX+uSK9Th1uEh2GYdGY2IG1I9/7HmuEf+ls3lLCk1p2GFYRSrLMz6ieQR/SyN6TLIGK3hKRg==", - "dev": true, - "requires": { - "@babel/core": "7.8.4", - "@svgr/webpack": "4.3.3", - "@typescript-eslint/eslint-plugin": "^2.10.0", - "@typescript-eslint/parser": "^2.10.0", - "babel-eslint": "10.0.3", - "babel-jest": "^24.9.0", - "babel-loader": "8.0.6", - "babel-plugin-named-asset-import": "^0.3.6", - "babel-preset-react-app": "^9.1.1", - "camelcase": "^5.3.1", - "case-sensitive-paths-webpack-plugin": "2.3.0", - "css-loader": "3.4.2", - "dotenv": "8.2.0", - "dotenv-expand": "5.1.0", - "eslint": "^6.6.0", - "eslint-config-react-app": "^5.2.0", - "eslint-loader": "3.0.3", - "eslint-plugin-flowtype": "4.6.0", - "eslint-plugin-import": "2.20.0", - "eslint-plugin-jsx-a11y": "6.2.3", - "eslint-plugin-react": "7.18.0", - "eslint-plugin-react-hooks": "^1.6.1", - "file-loader": "4.3.0", - "fs-extra": "^8.1.0", - "fsevents": "2.1.2", - "html-webpack-plugin": "4.0.0-beta.11", - "identity-obj-proxy": "3.0.0", - "jest": "24.9.0", - "jest-environment-jsdom-fourteen": "1.0.1", - "jest-resolve": "24.9.0", - "jest-watch-typeahead": "0.4.2", - "mini-css-extract-plugin": "0.9.0", - "optimize-css-assets-webpack-plugin": "5.0.3", - "pnp-webpack-plugin": "1.6.0", - "postcss-flexbugs-fixes": "4.1.0", - "postcss-loader": "3.0.0", - "postcss-normalize": "8.0.1", - "postcss-preset-env": "6.7.0", - "postcss-safe-parser": "4.0.1", - "react-app-polyfill": "^1.0.6", - "react-dev-utils": "^10.2.0", - "resolve": "1.15.0", - "resolve-url-loader": "3.1.1", - "sass-loader": "8.0.2", - "semver": "6.3.0", - "style-loader": "0.23.1", - "terser-webpack-plugin": "2.3.4", - "ts-pnp": "1.1.5", - "url-loader": "2.3.0", - "webpack": "4.41.5", - "webpack-dev-server": "3.10.2", - "webpack-manifest-plugin": "2.2.0", - "workbox-webpack-plugin": "4.3.1" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@jest/core": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", - "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/reporters": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.9.0", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-resolve-dependencies": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "jest-watcher": "^24.9.0", - "micromatch": "^3.1.10", - "p-each-series": "^1.0.0", - "realpath-native": "^1.1.0", - "rimraf": "^2.5.4", - "slash": "^2.0.0", - "strip-ansi": "^5.0.0" - } - }, - "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", - "dev": true, - "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" - } - }, - "@jest/reporters": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", - "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^2.0.2", - "istanbul-lib-instrument": "^3.0.1", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.2.6", - "jest-haste-map": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "node-notifier": "^5.4.2", - "slash": "^2.0.0", - "source-map": "^0.6.0", - "string-length": "^2.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@jest/test-sequencer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", - "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", - "dev": true, - "requires": { - "@jest/test-result": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0" - } - }, - "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - }, - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "babel-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", - "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", - "dev": true, - "requires": { - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.9.0", - "chalk": "^2.4.2", - "slash": "^2.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", - "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", - "dev": true, - "requires": { - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", - "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", - "dev": true, - "requires": { - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "css-loader": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", - "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.23", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.1.1", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.0.2", - "schema-utils": "^2.6.0" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "expect": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", - "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "ansi-styles": "^3.2.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.9.0" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "find-cache-dir": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", - "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.0", - "pkg-dir": "^4.1.0" - }, - "dependencies": { - "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - } - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "dev": true, - "optional": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0" - } - }, - "jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", - "dev": true, - "requires": { - "import-local": "^2.0.0", - "jest-cli": "^24.9.0" - }, - "dependencies": { - "jest-cli": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", - "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", - "dev": true, - "requires": { - "@jest/core": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "import-local": "^2.0.0", - "is-ci": "^2.0.0", - "jest-config": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^13.3.0" - } - } - } - }, - "jest-changed-files": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", - "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "execa": "^1.0.0", - "throat": "^4.0.0" - } - }, - "jest-config": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", - "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.9.0", - "@jest/types": "^24.9.0", - "babel-jest": "^24.9.0", - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^24.9.0", - "jest-environment-node": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "micromatch": "^3.1.10", - "pretty-format": "^24.9.0", - "realpath-native": "^1.1.0" - } - }, - "jest-docblock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", - "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", - "dev": true, - "requires": { - "detect-newline": "^2.1.0" - } - }, - "jest-each": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", - "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-environment-jsdom": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", - "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0", - "jsdom": "^11.5.1" - } - }, - "jest-environment-node": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", - "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0" - } - }, - "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, - "dependencies": { - "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": false, - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": false, - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.3", - "resolved": false, - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": false, - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "resolved": false, - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": false, - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": false, - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": false, - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": false, - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": false, - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": false, - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "resolved": false, - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": false, - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": false, - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": false, - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "resolved": false, - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": false, - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": false, - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.2", - "resolved": false, - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "optional": true - }, - "needle": { - "version": "2.4.0", - "resolved": false, - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "resolved": false, - "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": false, - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.7", - "resolved": false, - "integrity": "sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": false, - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": false, - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": false, - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": false, - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": false, - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": false, - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": false, - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": false, - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": false, - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "resolved": false, - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": false, - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "resolved": false, - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": false, - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "resolved": false, - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "optional": true - } - } - } - } - }, - "jest-jasmine2": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", - "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^24.9.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0", - "throat": "^4.0.0" - } - }, - "jest-leak-detector": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", - "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", - "dev": true, - "requires": { - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, - "jest-resolve-dependencies": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", - "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.9.0" - } - }, - "jest-runner": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", - "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.4.2", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-leak-detector": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "source-map-support": "^0.5.6", - "throat": "^4.0.0" - } - }, - "jest-runtime": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", - "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "strip-bom": "^3.0.0", - "yargs": "^13.3.0" - } - }, - "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", - "dev": true - }, - "jest-snapshot": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", - "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "expect": "^24.9.0", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^24.9.0", - "semver": "^6.2.0" - } - }, - "jest-validate": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", - "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "camelcase": "^5.3.1", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "leven": "^3.1.0", - "pretty-format": "^24.9.0" - } - }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", - "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - } - }, - "node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", - "dev": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "p-each-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", - "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", - "dev": true, - "requires": { - "p-reduce": "^1.0.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "postcss-modules-local-by-default": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", - "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", - "dev": true, - "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.16", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.0" - } - }, - "postcss-modules-scope": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz", - "integrity": "sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - } - }, - "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", - "dev": true, - "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" - } - }, - "postcss-value-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", - "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "resolve": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", - "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "terser-webpack-plugin": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.4.tgz", - "integrity": "sha512-Nv96Nws2R2nrFOpbzF6IxRDpIkkIfmhvOws+IqMvYdFLO7o6wAILWFKONFgaYy8+T4LVz77DQW0f7wOeDEAjrg==", - "dev": true, - "requires": { - "cacache": "^13.0.1", - "find-cache-dir": "^3.2.0", - "jest-worker": "^25.1.0", - "p-limit": "^2.2.2", - "schema-utils": "^2.6.4", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.4.3", - "webpack-sources": "^1.4.3" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "webpack": { - "version": "4.41.5", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", - "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.0", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - }, - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - } - } - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "react-test-renderer": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.12.0.tgz", - "integrity": "sha512-Vj/teSqt2oayaWxkbhQ6gKis+t5JrknXfPVo+aIJ8QwYAqMPH77uptOdrlphyxl8eQI/rtkOYg86i/UWkpFu0w==", - "requires": { - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "react-is": "^16.8.6", - "scheduler": "^0.18.0" - }, - "dependencies": { - "scheduler": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", - "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - } - } - }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "dev": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", - "requires": { - "util.promisify": "^1.0.0" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", - "dev": true, - "requires": { - "minimatch": "3.0.4" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" - }, - "regenerate-unicode-properties": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", - "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" - }, - "regenerator-transform": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", - "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", - "dev": true, - "requires": { - "private": "^0.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regex-parser": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", - "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "regexpp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", - "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", - "dev": true - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "~0.5.0" - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - } - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dev": true, - "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "renderkid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", - "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", - "dev": true, - "requires": { - "css-select": "^1.1.0", - "dom-converter": "^0.2", - "htmlparser2": "^3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" - }, - "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - } - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", - "requires": { - "lodash": "^4.17.11" - } - }, - "request-promise-native": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", - "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", - "requires": { - "request-promise-core": "1.1.2", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", - "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "dependencies": { - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - } - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - }, - "resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "dev": true, - "requires": { - "value-or-function": "^3.0.0" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "resolve-url-loader": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz", - "integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==", - "dev": true, - "requires": { - "adjust-sourcemap-loader": "2.0.0", - "camelcase": "5.3.1", - "compose-function": "3.0.3", - "convert-source-map": "1.7.0", - "es6-iterator": "2.0.3", - "loader-utils": "1.2.3", - "postcss": "7.0.21", - "rework": "1.0.1", - "rework-visit": "1.0.0", - "source-map": "0.6.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "dev": true, - "requires": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - }, - "dependencies": { - "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", - "dev": true - } - } - }, - "rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", - "dev": true - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, - "rimraf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", - "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rsvp": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.4.tgz", - "integrity": "sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA==" - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - } - }, - "sanitize.css": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", - "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==", - "dev": true - }, - "sass-loader": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", - "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "loader-utils": "^1.2.3", - "neo-async": "^2.6.1", - "schema-utils": "^2.6.1", - "semver": "^6.3.0" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "saxes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.9.tgz", - "integrity": "sha512-FZeKhJglhJHk7eWG5YM0z46VHmI3KJpMBAQm3xa9meDvd+wevB5GuBB0wc0exPInZiBBHqi00DbS8AcvCGCFMw==", - "requires": { - "xmlchars": "^1.3.1" - } - }, - "scheduler": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", - "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", - "dev": true, - "requires": { - "node-forge": "0.9.0" - } - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" - }, - "semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", - "dev": true, - "requires": { - "sver-compat": "^1.5.0" - } - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - } - } - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, - "serialport": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/serialport/-/serialport-8.0.7.tgz", - "integrity": "sha512-R9bfNebs2dblYf5sD/Aaa7j8+siP4X7TGT02lqHM9DF5fyjlrPGXmsLw9+LKOz1AvjGjkxf2NzBVnDpqRX7clQ==", - "requires": { - "@serialport/binding-mock": "^8.0.6", - "@serialport/bindings": "^8.0.7", - "@serialport/parser-byte-length": "^8.0.6", - "@serialport/parser-cctalk": "^8.0.6", - "@serialport/parser-delimiter": "^8.0.6", - "@serialport/parser-readline": "^8.0.6", - "@serialport/parser-ready": "^8.0.6", - "@serialport/parser-regex": "^8.0.6", - "@serialport/stream": "^8.0.6", - "debug": "^4.1.1" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-clone": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", - "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", - "dev": true, - "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^2.0.1", - "lazy-cache": "^0.2.3", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", - "dev": true, - "requires": { - "is-buffer": "^1.0.2" - } - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", - "dev": true - } - } - }, - "shallow-equal": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.0.tgz", - "integrity": "sha512-Z21pVxR4cXsfwpMKMhCEIO1PCi5sp7KEp+CmOpBQ+E8GpHwKOw2sEzk7sgblM3d/j4z4gakoWEoPcjK0VJQogA==" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "dev": true, - "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } - }, - "shelljs": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.7.tgz", - "integrity": "sha1-svXHfvlxSPS09uImguELuoZnz/E=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" - }, - "simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - } - } - }, - "sisteransi": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", - "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==" - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - } - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - } - }, - "socket.io": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.0.tgz", - "integrity": "sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ==", - "requires": { - "debug": "~4.1.0", - "engine.io": "~3.5.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.4.0", - "socket.io-parser": "~3.4.0" - } - }, - "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" - }, - "socket.io-client": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", - "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "engine.io-client": "~3.5.0", - "has-binary2": "~1.0.2", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "socket.io-parser": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", - "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", - "requires": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" - } - } - } - }, - "socket.io-parser": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", - "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", - "requires": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - } - } - }, - "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", - "dev": true, - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" - } - }, - "sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", - "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", - "dev": true, - "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", - "dev": true - }, - "spdy": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", - "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", - "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "minipass": "^3.1.1" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - }, - "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==" - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", - "dev": true - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "streamfilter": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz", - "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=" - }, - "string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", - "dev": true, - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string.prototype.padend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", - "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.4.3", - "function-bind": "^1.0.2" - } - }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dev": true, - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "dependencies": { - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", - "dev": true - }, - "strip-comments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", - "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", - "dev": true, - "requires": { - "babel-extract-comments": "^1.0.0", - "babel-plugin-transform-object-rest-spread": "^6.26.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "style-inject": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", - "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==" - }, - "style-loader": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.21.0.tgz", - "integrity": "sha512-T+UNsAcl3Yg+BsPKs1vd22Fr8sVT+CJMtzqc6LEw9bbJZb43lm9GoeIfUcDEefBSWC0BhYbcdupV1GtI4DGzxg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^0.4.5" - }, - "dependencies": { - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "supports-hyperlinks": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.0.0.tgz", - "integrity": "sha512-bFhn0MQ8qefLyJ3K7PpHiPUTuTVPWw6RXfaMeV6xgJLXtBbszyboz1bvGTVv4R0YpQm2DqlXXn0fFHhxUHVE5w==", - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "dev": true, - "requires": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "svg-inline-react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/svg-inline-react/-/svg-inline-react-3.1.0.tgz", - "integrity": "sha512-c39AIRQOUXLMD8fQ2rHmK1GOSO3tVuZk61bAXqIT05uhhm3z4VtQFITQSwyhL0WA2uxoJAIhPd2YV0CYQOolSA==", - "requires": { - "prop-types": "^15.5.0" - } - }, - "svg-parser": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.3.tgz", - "integrity": "sha512-fnCWiifNhK8i2Z7b9R5tbNahpxrRdAaQbnoxKlT2KrSCj9Kq/yBSgulCRgBJRhy1dPnSY5slg5ehPUnzpEcHlg==", - "dev": true - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "symbol-tree": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "tar-fs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", - "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", - "requires": { - "chownr": "^1.1.1", - "mkdirp": "^0.5.1", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - } - }, - "tar-stream": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", - "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", - "requires": { - "bl": "^4.0.1", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "dependencies": { - "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "requires": { - "type-fest": "^0.8.1" - } - } - } - }, - "terser": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - }, - "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "terser": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } - } - }, - "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "dev": true, - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "dev": true, - "requires": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" - }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - } - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "dev": true, - "requires": { - "through2": "^2.0.3" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "requires": { - "punycode": "^2.1.0" - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - }, - "ts-import-plugin": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/ts-import-plugin/-/ts-import-plugin-1.5.5.tgz", - "integrity": "sha512-i0ULERaX+vycmASUeJFbAqx+KeMBAH+iFaSim+U9t05DxK+ZGpMCHT18zTRzTEh1dA6OWsHzVZmHgFKh5UTKUA==", - "dev": true, - "requires": { - "tslib": "^1.9.2" - } - }, - "ts-jest": { - "version": "25.0.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-25.0.0.tgz", - "integrity": "sha512-F+hZg3j7XYOFpXJteXb4lnqy7vQzTmpTmX7AJT6pvSGeZejyXj1Lk0ArpnrEPOpv6Zu/NugHc5W7FINngC9WZQ==", - "requires": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "mkdirp": "0.x", - "resolve": "1.x", - "semver": "^5.5", - "yargs-parser": "10.x" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "ts-loader": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-4.5.0.tgz", - "integrity": "sha512-ihgVaSmgrX4crGV4n7yuoHPoCHbDzj9aepCZR9TgIx4SgJ9gdnB6xLHgUBb7bsFM/f0K6x9iXa65KY/Fu1Klkw==", - "dev": true, - "requires": { - "chalk": "^2.3.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^1.0.2", - "micromatch": "^3.1.4", - "semver": "^5.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "ts-pnp": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.5.tgz", - "integrity": "sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA==", - "dev": true - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - }, - "tslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz", - "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^3.2.0", - "glob": "^7.1.1", - "js-yaml": "^3.13.0", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tslint-config-prettier": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz", - "integrity": "sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==", - "dev": true - }, - "tslint-microsoft-contrib": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-6.2.0.tgz", - "integrity": "sha512-6tfi/2tHqV/3CL77pULBcK+foty11Rr0idRDxKnteTaKm6gWF9qmaCNU17HVssOuwlYNyOmd9Jsmjd+1t3a3qw==", - "dev": true, - "requires": { - "tsutils": "^2.27.2 <2.29.0" - }, - "dependencies": { - "tsutils": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz", - "integrity": "sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tslint-react": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/tslint-react/-/tslint-react-3.6.0.tgz", - "integrity": "sha512-AIv1QcsSnj7e9pFir6cJ6vIncTqxfqeFF3Lzh8SuuBljueYzEAtByuB6zMaD27BL0xhMEqsZ9s5eHuCONydjBw==", - "dev": true, - "requires": { - "tsutils": "^2.13.1" - }, - "dependencies": { - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tslint-react-hooks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslint-react-hooks/-/tslint-react-hooks-2.1.0.tgz", - "integrity": "sha512-ccjyguEHGEU5rXikLDaQ6kT1AVo3C0HV8gi2MIJc7SbYAXjbzJkpbs4IXulgfqdEY1T6RnNSuGhyXg+2jTm5Bg==", - "dev": true - }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", - "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/type/-/type-1.0.1.tgz", - "integrity": "sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw==", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typed-rest-client": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.2.0.tgz", - "integrity": "sha512-FrUshzZ1yxH8YwGR29PWWnfksLEILbWJydU7zfIRkyH7kAEzB62uMAl2WY6EyolWpLpVHeJGgQm45/MaruaHpw==", - "dev": true, - "requires": { - "tunnel": "0.0.4", - "underscore": "1.8.3" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", - "dev": true - }, - "typescript-react-intl": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/typescript-react-intl/-/typescript-react-intl-0.4.0.tgz", - "integrity": "sha512-sCQN2YdWSaWNAK9bBezmqZStswfh0MMWQnIlBOn+iFBN4fE1m36fv1zqUaw33jTbQUjIaZ4N+NFbMfS/cnyIew==", - "dev": true, - "requires": { - "typescript": "^2.6.2" - }, - "dependencies": { - "typescript": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", - "dev": true - } - } - }, - "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true - }, - "undertaker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", - "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - } - }, - "undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", - "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", - "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "dev": true, - "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } - } - }, - "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-join": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", - "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=", - "dev": true - }, - "url-loader": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", - "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "mime": "^2.4.4", - "schema-utils": "^2.5.0" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } - } - }, - "url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "usb-detection": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/usb-detection/-/usb-detection-4.7.0.tgz", - "integrity": "sha512-HE9y5uYfA2ebVo64BrIB0OVNaVKZ2oWkadpTItCi4YQXyZ9vD0705iqQ3B7Rz8xevcrW/RNg/85E2o2JoPFmsQ==", - "requires": { - "bindings": "^1.3.0", - "eventemitter2": "^5.0.1", - "nan": "^2.13.2", - "prebuild-install": "^5.1.0" - } - }, - "usb-native": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/usb-native/-/usb-native-5.0.1.tgz", - "integrity": "sha512-FuKUVJmzgo7I6jclH0fCLuQLuOTg3jzzDvQwFgFWJM5Qe1L09snrl84adFCNvE/LGbCCCa4XjLuGGIgB7+zGQA==", - "requires": { - "fs-extra": "^8.1.0", - "serialport": "^8.0.7", - "usb-detection": "^4.7.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "util": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.1.tgz", - "integrity": "sha512-MREAtYOp+GTt9/+kwf00IYoHZyjM8VU4aVrkzUlejyqaIjd2GztVl5V9hGXKlvBKE3gENn/FMfHE5v6hElXGcQ==", - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "object.entries": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - }, - "v8-compile-cache": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", - "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", - "dev": true - }, - "v8-to-istanbul": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.0.1.tgz", - "integrity": "sha512-x0yZvZAkjJwdD3fPiJzYP37aod0ati4LlmD2RmpKjqewjKAov/u/ytZ8ViIZb07cN4cePKzl9ijiUi7C1LQ8hQ==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } - } - }, - "v8flags": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", - "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "version-from-git": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/version-from-git/-/version-from-git-1.1.1.tgz", - "integrity": "sha512-R8kAZ+EFJcqG5HGrfjk7bSBAWKB3AE/Dnh21llvNg6CWJIPJAKsYNLR7lvYrCwu33A3TU4UljPLpp577UxgL3w==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "commander": "^2.15.1", - "cross-spawn": "^6.0.5", - "git-rev-sync": "^1.12.0", - "on-error-resume-next": "^1.0.0", - "semver": "^5.5.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - } - }, - "vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "dev": true, - "requires": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "vsce": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.62.0.tgz", - "integrity": "sha512-KXtPBsdC0K27hmDksINyjoRl9BiuTB+ntmoJEDbbO3GIc+L3wfOclaSy8iYqddnpSA33YDkhKzKXhT0JGzrG/A==", - "dev": true, - "requires": { - "azure-devops-node-api": "^7.2.0", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.1", - "commander": "^2.8.1", - "denodeify": "^1.2.1", - "glob": "^7.0.6", - "lodash": "^4.17.10", - "markdown-it": "^8.3.1", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "osenv": "^0.1.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "semver": "^5.1.0", - "tmp": "0.0.29", - "typed-rest-client": "1.2.0", - "url-join": "^1.1.0", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tmp": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", - "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.1" - } - } - } - }, - "vscode-extension-telemetry": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.1.1.tgz", - "integrity": "sha512-TkKKG/B/J94DP5qf6xWB4YaqlhWDg6zbbqVx7Bz//stLQNnfE9XS1xm3f6fl24c5+bnEK0/wHgMgZYKIKxPeUA==", - "requires": { - "applicationinsights": "1.0.8" - } - }, - "vscode-nls": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.1.tgz", - "integrity": "sha512-4R+2UoUUU/LdnMnFjePxfLqNhBS8lrAFyX7pjb2ud/lqDkrUavFUTcG7wR0HBZFakae0Q6KLBFjMS6W93F403A==" - }, - "vscode-nls-dev": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/vscode-nls-dev/-/vscode-nls-dev-3.3.1.tgz", - "integrity": "sha512-fug18D7CXb8pv8JoQ0D0JmZaIYDQoKLiyZxkAy5P8Cln/FwlNsdzwQILDph62EdGY5pvsJ2Jd1T5qgHAExe/tg==", - "dev": true, - "requires": { - "ansi-colors": "^3.2.3", - "clone": "^2.1.1", - "event-stream": "^3.3.4", - "fancy-log": "^1.3.3", - "glob": "^7.1.2", - "iconv-lite": "^0.4.19", - "is": "^3.2.1", - "source-map": "^0.6.1", - "typescript": "^2.6.2", - "vinyl": "^2.1.0", - "xml2js": "^0.4.19", - "yargs": "^13.2.4" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "event-stream": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.5.tgz", - "integrity": "sha512-vyibDcu5JL20Me1fP734QBH/kenBGLZap2n0+XXM7mvuUPzJ20Ydqj1aKcIeMdri1p+PU+4yAKugjN8KCVst+g==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "from": "^0.1.7", - "map-stream": "0.0.7", - "pause-stream": "^0.0.11", - "split": "^1.0.1", - "stream-combiner": "^0.2.2", - "through": "^2.3.8" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "typescript": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "vscode-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.0.0.tgz", - "integrity": "sha512-RnZUhxEXYCozHtBAQwX/UISlw0JPqlv1I9LLl4++vcPDIvjs2Zfz2Inp8haxixS1sOTftHJ9kiecrwWF9S3taQ==", - "dev": true, - "requires": { - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1" - } - }, - "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", - "requires": { - "browser-process-hrtime": "^0.1.2" - } - }, - "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", - "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" - } - }, - "wait-for-expect": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-3.0.1.tgz", - "integrity": "sha512-3Ha7lu+zshEG/CeHdcpmQsZnnZpPj/UsG3DuKO8FskjuDbkx3jE3845H+CuwZjA2YWYDfKMU2KhnCaXMLd3wVw==" - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "requires": { - "makeerror": "1.0.x" - } - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "dev": true, - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - }, - "webpack": { - "version": "4.32.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.32.2.tgz", - "integrity": "sha512-F+H2Aa1TprTQrpodRAWUMJn7A8MgDx82yQiNvYMaj3d1nv3HetKU0oqEulL9huj8enirKi8KvEXQ3QtuHF89Zg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.0.5", - "acorn-dynamic-import": "^4.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^1.0.0", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - } - } - }, - "webpack-cli": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.2.tgz", - "integrity": "sha512-FLkobnaJJ+03j5eplxlI0TUxhGCOdfewspIGuvDVtpOlrAuKMFC57K42Ukxqs1tn8947/PM6tP95gQc0DCzRYA==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.0", - "findup-sync": "^2.0.0", - "global-modules": "^1.0.0", - "import-local": "^2.0.0", - "interpret": "^1.1.0", - "loader-utils": "^1.1.0", - "supports-color": "^5.5.0", - "v8-compile-cache": "^2.0.2", - "yargs": "^12.0.5" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", - "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", - "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - }, - "dependencies": { - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - } - } - }, - "webpack-dev-server": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.2.tgz", - "integrity": "sha512-pxZKPYb+n77UN8u9YxXT4IaIrGcNtijh/mi8TXbErHmczw0DtPnMTTjHj+eNjkqLOaAZM/qD7V59j/qJsEiaZA==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.2.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.6", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.25", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "0.3.19", - "sockjs-client": "1.4.0", - "spdy": "^4.0.1", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "12.0.5" - }, - "dependencies": { - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "webpack-manifest-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", - "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", - "dev": true, - "requires": { - "fs-extra": "^7.0.0", - "lodash": ">=3.5 <5", - "object.entries": "^1.1.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.4.0 <0.4.11", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==", - "dev": true - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - }, - "workbox-background-sync": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz", - "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-broadcast-update": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz", - "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-build": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-4.3.1.tgz", - "integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.3.4", - "@hapi/joi": "^15.0.0", - "common-tags": "^1.8.0", - "fs-extra": "^4.0.2", - "glob": "^7.1.3", - "lodash.template": "^4.4.0", - "pretty-bytes": "^5.1.0", - "stringify-object": "^3.3.0", - "strip-comments": "^1.0.2", - "workbox-background-sync": "^4.3.1", - "workbox-broadcast-update": "^4.3.1", - "workbox-cacheable-response": "^4.3.1", - "workbox-core": "^4.3.1", - "workbox-expiration": "^4.3.1", - "workbox-google-analytics": "^4.3.1", - "workbox-navigation-preload": "^4.3.1", - "workbox-precaching": "^4.3.1", - "workbox-range-requests": "^4.3.1", - "workbox-routing": "^4.3.1", - "workbox-strategies": "^4.3.1", - "workbox-streams": "^4.3.1", - "workbox-sw": "^4.3.1", - "workbox-window": "^4.3.1" - }, - "dependencies": { - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "workbox-cacheable-response": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz", - "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-core": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", - "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==", - "dev": true - }, - "workbox-expiration": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz", - "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-google-analytics": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz", - "integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==", - "dev": true, - "requires": { - "workbox-background-sync": "^4.3.1", - "workbox-core": "^4.3.1", - "workbox-routing": "^4.3.1", - "workbox-strategies": "^4.3.1" - } - }, - "workbox-navigation-preload": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz", - "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-precaching": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz", - "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-range-requests": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz", - "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-routing": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz", - "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-strategies": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz", - "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-streams": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-4.3.1.tgz", - "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "workbox-sw": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz", - "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==", - "dev": true - }, - "workbox-webpack-plugin": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz", - "integrity": "sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.0.0", - "json-stable-stringify": "^1.0.1", - "workbox-build": "^4.3.1" - } - }, - "workbox-window": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-4.3.1.tgz", - "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==", - "dev": true, - "requires": { - "workbox-core": "^4.3.1" - } - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "worker-rpc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", - "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", - "dev": true, - "requires": { - "microevent.ts": "~0.1.1" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "ws": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.1.tgz", - "integrity": "sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A==" - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true - }, - "xmlchars": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-1.3.1.tgz", - "integrity": "sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw==" - }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true - }, - "yaml": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz", - "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.6.3" - } - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - }, - "dependencies": { - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "yargs-parser": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", - "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yargs-unparser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", - "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", - "dev": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.11", - "yargs": "^12.0.5" - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3" - } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" - }, - "zone.js": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.7.6.tgz", - "integrity": "sha1-+7w50+AmHQmG8boGMG6zrrDSIAk=" - } - } -} diff --git a/package.json b/package.json index c3d9e093d..2e730e244 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "instrumentationKey": "__AIKEY__", "icon": "assets/icon.png", "engines": { - "vscode": "^1.43.0" + "vscode": "1.43.0" }, "categories": [ "Other" @@ -253,70 +253,70 @@ "package": "vsce package" }, "devDependencies": { - "@types/glob": "^7.1.1", - "@types/node": "^10.12.21", + "@types/glob": "7.1.1", + "@types/node": "10.12.21", "@types/react": "16.8.6", "@types/react-dom": "16.8.4", - "@types/vscode": "^1.45.1", - "css-loader": "^1.0.0", - "del": "^4.0.0", - "event-stream": "^4.0.1", - "gulp": "^4.0.2", - "gulp-cli": "^2.1.0", - "gulp-filter": "^5.1.0", - "gulp-sourcemaps": "^2.6.5", - "gulp-typescript": "^5.0.1", - "less": "^3.7.0", - "less-loader": "^4.1.0", - "mocha": "^6.1.4", - "npm-run-all": "^4.1.3", - "prettier": "^1.19.1", - "react-scripts": "^3.4.0", - "style-loader": "^0.21.0", - "ts-import-plugin": "^1.5.4", - "ts-loader": "^4.4.2", - "tslint": "^5.12.1", - "tslint-config-prettier": "^1.18.0", - "tslint-microsoft-contrib": "^6.1.0", - "tslint-react": "^3.6.0", - "tslint-react-hooks": "^2.0.0", - "typescript": "^3.8.3", - "typescript-react-intl": "^0.4.0", - "version-from-git": "^1.1.1", - "vsce": "^1.47.0", - "vscode-nls-dev": "^3.2.6", - "vscode-test": "^1.0.0", - "webpack": "^4.15.1", - "webpack-cli": "^3.0.8" + "@types/vscode": "1.45.1", + "css-loader": "1.0.0", + "del": "4.0.0", + "event-stream": "4.0.1", + "gulp": "4.0.2", + "gulp-cli": "2.1.0", + "gulp-filter": "5.1.0", + "gulp-sourcemaps": "2.6.5", + "gulp-typescript": "5.0.1", + "less": "3.7.0", + "less-loader": "4.1.0", + "mocha": "6.1.4", + "npm-run-all": "4.1.3", + "prettier": "1.19.1", + "react-scripts": "3.4.0", + "style-loader": "0.21.0", + "ts-import-plugin": "1.5.4", + "ts-loader": "4.4.2", + "tslint": "5.12.1", + "tslint-config-prettier": "1.18.0", + "tslint-microsoft-contrib": "6.1.0", + "tslint-react": "3.6.0", + "tslint-react-hooks": "2.0.0", + "typescript": "3.8.3", + "typescript-react-intl": "0.4.0", + "version-from-git": "1.1.1", + "vsce": "1.47.0", + "vscode-nls-dev": "3.2.6", + "vscode-test": "1.0.0", + "webpack": "4.15.1", + "webpack-cli": "3.0.8" }, "dependencies": { - "@babel/preset-typescript": "^7.8.3", - "@testing-library/jest-dom": "^5.0.2", - "@testing-library/react": "^9.4.0", - "@types/jest": "^24.9.0", - "@types/open": "^6.1.0", - "@types/react-test-renderer": "^16.9.0", - "@types/socket.io": "^2.1.2", - "babel-jest": "^25.1.0", - "compare-versions": "^3.5.1", - "eventemitter2": "^5.0.1", - "glob": "^7.1.4", - "jest": "^25.1.0", - "jest-transform-css": "^2.0.0", - "office-ui-fabric-react": "^7.105.12", - "open": "^6.4.0", - "os": "^0.1.1", - "react": "^16.9.0", - "react-dom": "^16.9.0", - "react-intl": "^3.1.9", - "react-test-renderer": "^16.9.0", - "socket.io": "^2.4.0", - "svg-inline-react": "^3.1.0", - "ts-jest": "^25.0.0", - "usb-native": "^5.0.1", - "util": "^0.12.1", - "vscode-extension-telemetry": "^0.1.1", - "vscode-nls": "^4.1.0" + "@babel/preset-typescript": "7.8.3", + "@testing-library/jest-dom": "5.0.2", + "@testing-library/react": "9.4.0", + "@types/jest": "24.9.0", + "@types/open": "6.1.0", + "@types/react-test-renderer": "16.9.0", + "@types/socket.io": "2.1.2", + "babel-jest": "25.1.0", + "compare-versions": "3.5.1", + "eventemitter2": "5.0.1", + "glob": "7.1.4", + "jest": "25.1.0", + "jest-transform-css": "2.0.0", + "office-ui-fabric-react": "7.105.12", + "open": "6.4.0", + "os": "0.1.1", + "react": "16.9.0", + "react-dom": "16.9.0", + "react-intl": "3.1.9", + "react-test-renderer": "16.9.0", + "socket.io": "2.4.0", + "svg-inline-react": "3.1.0", + "ts-jest": "25.0.0", + "usb-native": "5.0.1", + "util": "0.12.1", + "vscode-extension-telemetry": "0.1.1", + "vscode-nls": "4.1.0" }, "eslintConfig": { "extends": "react-app" From c2ad6346fcc73726a4776050c8096b157117abba Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Wed, 13 Dec 2023 01:19:38 +0200 Subject: [PATCH 34/64] squash! --- .github/CODEOWNERS | 3 - .github/PULL_REQUEST_TEMPLATE.md | 33 - .github/workflows/ci.yml | 52 - .prettierrc.yaml | 5 - .vscode/extensions.json | 7 - .vscode/launch.json | 30 - .vscode/settings.json | 10 - .vscode/tasks.json | 25 - Source/constants.ts | 1014 +- Source/cpxWorkspace.ts | 36 +- Source/debugger/debugAdapter.ts | 84 +- Source/debugger/debugAdapterFactory.ts | 50 +- Source/debuggerCommunicationServer.ts | 235 +- Source/dev-requirements.txt | 2 +- Source/deviceContext.ts | 274 +- Source/extension.ts | 2080 +- Source/extension_utils/utils.ts | 300 +- Source/requirements.txt | 2 +- Source/serialMonitor.ts | 522 +- Source/serialPortControl.ts | 362 +- Source/service/PopupService.ts | 18 +- .../service/debuggerCommunicationService.ts | 44 +- Source/service/deviceSelectionService.ts | 14 +- Source/service/fileSelectionService.ts | 168 +- Source/service/messagingService.ts | 57 +- Source/service/setupService.ts | 1130 +- Source/service/telemetryHandlerService.ts | 1054 +- Source/service/webviewService.ts | 147 +- Source/simulatorDebugConfigurationProvider.ts | 143 +- Source/telemetry/getPackageInfo.ts | 86 +- Source/telemetry/telemetryAI.ts | 134 +- Source/usbDetector.ts | 194 +- Source/view/App.css | 22 +- Source/view/App.spec.tsx | 40 +- Source/view/App.tsx | 152 +- Source/view/components/Button.tsx | 45 +- Source/view/components/Dropdown.tsx | 43 +- Source/view/components/clue/Clue.spec.tsx | 40 +- Source/view/components/clue/Clue.tsx | 262 +- Source/view/components/clue/ClueImage.tsx | 252 +- Source/view/components/clue/ClueSimulator.tsx | 550 +- Source/view/components/clue/Clue_svg.tsx | 2309 +- .../components/cpx/Accessibility_utils.ts | 32 +- Source/view/components/cpx/Cpx.spec.tsx | 40 +- Source/view/components/cpx/Cpx.tsx | 164 +- Source/view/components/cpx/CpxImage.tsx | 688 +- Source/view/components/cpx/CpxSimulator.tsx | 730 +- Source/view/components/cpx/Cpx_svg.tsx | 5981 ++-- Source/view/components/cpx/Cpx_svg_style.tsx | 68 +- Source/view/components/cpx/Svg_utils.tsx | 156 +- .../components/microbit/Microbit.spec.tsx | 40 +- Source/view/components/microbit/Microbit.tsx | 206 +- .../components/microbit/MicrobitImage.tsx | 260 +- .../components/microbit/MicrobitSimulator.tsx | 452 +- .../view/components/microbit/Microbit_svg.tsx | 3661 +-- .../view/components/simulator/ActionBar.tsx | 60 +- .../toolbar/GenericSliderComponent.tsx | 66 +- Source/view/components/toolbar/Gesture.tsx | 117 +- .../view/components/toolbar/InputSlider.tsx | 212 +- .../view/components/toolbar/SensorButton.tsx | 59 +- .../components/toolbar/SensorModalUtils.tsx | 274 +- Source/view/components/toolbar/ToolBar.tsx | 392 +- .../view/components/toolbar/Toolbar.spec.tsx | 78 +- .../toolbar/clue/ClueModalContent.tsx | 504 +- .../toolbar/clue/ClueSensorProperties.tsx | 312 +- .../toolbar/cpx/CpxModalContent.tsx | 310 +- .../toolbar/cpx/CpxSensorProperties.tsx | 96 +- .../toolbar/microbit/MicrobitModalContent.tsx | 292 +- .../microbit/MicrobitSensorProperties.tsx | 96 +- Source/view/constants.ts | 220 +- Source/view/container/device/Device.spec.tsx | 40 +- Source/view/container/device/Device.tsx | 48 +- Source/view/index.css | 10 +- Source/view/index.tsx | 10 +- Source/view/pages/gettingStarted.css | 60 +- Source/view/pages/gettingStarted.spec.tsx | 40 +- Source/view/styles/Button.css | 34 +- Source/view/styles/Dropdown.css | 28 +- Source/view/styles/InputSlider.css | 116 +- Source/view/styles/LightSensorBar.css | 24 +- Source/view/styles/MotionSensorBar.css | 18 +- Source/view/styles/SensorButton.css | 32 +- Source/view/styles/Simulator.css | 122 +- Source/view/styles/SimulatorSvg.css | 212 +- Source/view/styles/TemperatureSensorBar.css | 22 +- Source/view/styles/ToolBar.css | 232 +- Source/view/svgs/arrow_right_svg.tsx | 29 +- Source/view/svgs/close_svg.tsx | 39 +- Source/view/svgs/play_svg.tsx | 25 +- Source/view/svgs/refresh_svg.tsx | 27 +- Source/view/svgs/stop_svg.tsx | 29 +- Source/view/svgs/tag_input_svg.tsx | 41 +- Source/view/svgs/tag_output_svg.tsx | 39 +- Source/view/svgs/toolbar_svg.tsx | 1289 +- Source/view/translations/en.json | 204 +- Source/view/tsconfig.json | 34 +- Source/view/utils/MessageUtils.tsx | 8 +- Source/view/viewUtils.tsx | 36 +- src/adafruit_circuitplayground/__init__.py | 4 - src/adafruit_circuitplayground/constants.py | 78 - src/adafruit_circuitplayground/express.py | 215 - .../locale/en/LC_MESSAGES/express.po | 26 - .../locale/express.pot | 26 - src/adafruit_circuitplayground/pixel.py | 133 - .../test/__init__.py | 0 .../test/sample.mp4 | Bin 1055736 -> 0 bytes .../test/sample.wav | Bin 210158 -> 0 bytes .../test/test_express.py | 115 - .../test/test_pixel.py | 117 - src/base_circuitpython/__init__.py | 8 - src/base_circuitpython/base_cp_constants.py | 82 - src/base_circuitpython/board.py | 128 - src/base_circuitpython/digitalio.py | 17 - src/base_circuitpython/displayio/__init__.py | 11 - src/base_circuitpython/displayio/bitmap.py | 105 - .../displayio/color_type.py | 12 - src/base_circuitpython/displayio/constants.py | 12 - src/base_circuitpython/displayio/group.py | 354 - src/base_circuitpython/displayio/palette.py | 81 - .../displayio/test/__init__.py | 0 .../displayio/test/img/group_test_result.bmp | Bin 172854 -> 0 bytes .../displayio/test/test_bitmap.py | 44 - .../displayio/test/test_group.py | 174 - .../displayio/test/test_palette.py | 31 - .../displayio/test/test_tile_grid.py | 173 - src/base_circuitpython/displayio/tile_grid.py | 280 - src/base_circuitpython/fontio.py | 14 - src/base_circuitpython/fonts/ter-u12n.bdf | 25240 ---------------- src/base_circuitpython/img/blinka.bmp | Bin 172856 -> 0 bytes src/base_circuitpython/neopixel_write.py | 55 - src/base_circuitpython/pulseio.py | 16 - src/base_circuitpython/terminal_handler.py | 108 - src/base_circuitpython/terminalio.py | 15 - src/base_circuitpython/test/__init__.py | 0 .../test/test_terminal_handler.py | 61 - src/check_if_venv.py | 11 - src/check_python_dependencies.py | 36 - src/clue/__init__.py | 1 - src/clue/adafruit_clue.py | 852 - src/clue/adafruit_display_text/label.py | 280 - src/clue/adafruit_slideshow.py | 407 - src/clue/test/__init__.py | 0 src/clue/test/img/test_clue_text_1.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_display_text_1.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_display_text_2.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_display_text_3.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_display_text_4.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_image_shapes_1.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_image_shapes_2.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_image_shapes_3.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_image_shapes_4.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_image_shapes_5.bmp | Bin 172854 -> 0 bytes src/clue/test/img/test_image_text_1.bmp | Bin 230454 -> 0 bytes src/clue/test/img/test_image_text_2.bmp | Bin 230454 -> 0 bytes src/clue/test/img/test_image_text_3.bmp | Bin 230454 -> 0 bytes src/clue/test/img/test_image_text_4.bmp | Bin 230454 -> 0 bytes src/clue/test/slideshow_pics/pic_1.bmp | Bin 113974 -> 0 bytes src/clue/test/slideshow_pics/pic_2.bmp | Bin 113974 -> 0 bytes src/clue/test/slideshow_pics/pic_3.bmp | Bin 330726 -> 0 bytes src/clue/test/slideshow_pics/pic_4.bmp | Bin 327414 -> 0 bytes src/clue/test/slideshow_pics/pic_5.bmp | Bin 225622 -> 0 bytes src/clue/test/slideshow_pics/pic_6.bmp | Bin 115818 -> 0 bytes src/clue/test/slideshow_pics/pic_7.bmp | Bin 93510 -> 0 bytes src/clue/test/slideshow_pics/pic_8.bmp | Bin 193734 -> 0 bytes src/clue/test/test_adafruit_clue.py | 193 - src/clue/test/test_adafruit_display_shapes.py | 81 - src/clue/test/test_adafruit_display_text.py | 65 - src/clue/test/test_adafruit_slideshow.py | 100 - src/clue/test/test_helpers.py | 32 - src/common/__init__.py | 0 src/common/constants.py | 12 - src/common/debugger_communication_client.py | 104 - src/common/telemetry.py | 35 - src/common/telemetry_events.py | 65 - src/common/test/__init__.py | 0 .../test_debugger_communication_client.py | 193 - src/common/test/test_utils.py | 32 - src/common/utils.py | 67 - src/constants.ts | 555 - src/cpxWorkspace.ts | 26 - src/debug_user_code.py | 95 - src/debugger/debugAdapter.ts | 49 - src/debugger/debugAdapterFactory.ts | 33 - src/debuggerCommunicationServer.ts | 140 - src/dev-requirements.txt | 3 - src/device.py | 121 - src/deviceContext.ts | 151 - src/extension.ts | 1101 - src/extension_utils/utils.ts | 233 - src/install_dependencies.py | 9 - src/latest_release_note.ts | 38 - src/micropython/__init__.py | 0 src/micropython/audio.py | 39 - src/micropython/microbit/__init__.py | 52 - .../microbit/__model/accelerometer.py | 136 - src/micropython/microbit/__model/button.py | 59 - src/micropython/microbit/__model/compass.py | 88 - src/micropython/microbit/__model/constants.py | 169 - src/micropython/microbit/__model/display.py | 369 - src/micropython/microbit/__model/i2c.py | 51 - src/micropython/microbit/__model/image.py | 539 - .../microbit/__model/microbit_model.py | 98 - .../microbit/__model/producer_property.py | 3 - src/micropython/microbit/__model/spi.py | 66 - src/micropython/microbit/test/__init__.py | 0 .../microbit/test/test_accelerometer.py | 104 - src/micropython/microbit/test/test_button.py | 46 - src/micropython/microbit/test/test_display.py | 185 - src/micropython/microbit/test/test_image.py | 283 - src/micropython/microbit/test/test_init.py | 45 - .../microbit/test/test_microbit_model.py | 48 - src/micropython/music.py | 109 - src/micropython/radio.py | 180 - src/micropython/speech.py | 61 - src/micropython/utime.py | 132 - src/process_user_code.py | 152 - src/python_constants.py | 55 - src/requirements.txt | 12 - src/serialMonitor.ts | 310 - src/serialPortControl.ts | 196 - src/service/PopupService.ts | 16 - src/service/debuggerCommunicationService.ts | 27 - src/service/deviceSelectionService.ts | 12 - src/service/fileSelectionService.ts | 95 - src/service/messagingService.ts | 37 - src/service/setupService.ts | 576 - src/service/telemetryHandlerService.ts | 556 - src/service/webviewService.ts | 112 - src/simulatorDebugConfigurationProvider.ts | 84 - src/telemetry/getPackageInfo.ts | 57 - src/telemetry/telemetryAI.ts | 83 - src/templates/clue_template.py | 16 - src/templates/cpx_template.py | 16 - src/templates/microbit_template.py | 11 - src/test/runTest.ts | 23 - src/test/suite/index.ts | 50 - src/usbDetector.ts | 112 - src/view/App.css | 16 - src/view/App.spec.tsx | 28 - src/view/App.tsx | 101 - src/view/__snapshots__/App.spec.tsx.snap | 11 - src/view/components/Button.tsx | 34 - src/view/components/Dropdown.tsx | 35 - src/view/components/clue/Clue.spec.tsx | 29 - src/view/components/clue/Clue.tsx | 158 - src/view/components/clue/ClueImage.tsx | 156 - src/view/components/clue/ClueSimulator.tsx | 304 - src/view/components/clue/Clue_svg.tsx | 1184 - .../clue/__snapshots__/Clue.spec.tsx.snap | 2202 -- .../components/cpx/Accessibility_utils.ts | 26 - src/view/components/cpx/Cpx.spec.tsx | 29 - src/view/components/cpx/Cpx.tsx | 104 - src/view/components/cpx/CpxImage.tsx | 406 - src/view/components/cpx/CpxSimulator.tsx | 392 - src/view/components/cpx/Cpx_svg.tsx | 3002 -- src/view/components/cpx/Cpx_svg_style.tsx | 302 - src/view/components/cpx/Svg_utils.tsx | 98 - .../cpx/__snapshots__/Cpx.spec.tsx.snap | 4666 --- .../components/microbit/Microbit.spec.tsx | 29 - src/view/components/microbit/Microbit.tsx | 130 - .../components/microbit/MicrobitImage.tsx | 166 - .../components/microbit/MicrobitSimulator.tsx | 259 - src/view/components/microbit/Microbit_svg.tsx | 1890 -- .../__snapshots__/Microbit.spec.tsx.snap | 3238 -- src/view/components/simulator/ActionBar.tsx | 48 - .../toolbar/GenericSliderComponent.tsx | 41 - src/view/components/toolbar/Gesture.tsx | 71 - src/view/components/toolbar/InputSlider.tsx | 131 - src/view/components/toolbar/SensorButton.tsx | 46 - .../components/toolbar/SensorModalUtils.tsx | 176 - src/view/components/toolbar/ToolBar.tsx | 221 - src/view/components/toolbar/Toolbar.spec.tsx | 57 - .../__snapshots__/Toolbar.spec.tsx.snap | 143 - .../toolbar/clue/ClueModalContent.tsx | 318 - .../toolbar/clue/ClueSensorProperties.tsx | 216 - .../toolbar/cpx/CpxModalContent.tsx | 198 - .../toolbar/cpx/CpxSensorProperties.tsx | 71 - .../toolbar/microbit/MicrobitModalContent.tsx | 187 - .../microbit/MicrobitSensorProperties.tsx | 74 - src/view/constants.ts | 238 - src/view/container/device/Device.spec.tsx | 30 - src/view/container/device/Device.tsx | 42 - .../device/__snapshots__/Device.spec.tsx.snap | 3240 -- src/view/context.ts | 6 - src/view/index.css | 13 - src/view/index.tsx | 22 - .../gettingStarted.spec.tsx.snap | 901 - src/view/pages/gettingStarted.css | 56 - src/view/pages/gettingStarted.spec.tsx | 29 - src/view/pages/gettingStarted.tsx | 281 - .../debugger/debugger_vars.png | Bin 44993 -> 0 bytes .../debugger/debugging.gif | Bin 652131 -> 0 bytes .../debugger/start_debugging.jpg | Bin 51011 -> 0 bytes .../debugger/toolbar.png | Bin 4635 -> 0 bytes src/view/react-app-env.d.ts | 1 - src/view/styles/Button.css | 50 - src/view/styles/Dropdown.css | 24 - src/view/styles/InputSlider.css | 103 - src/view/styles/LightSensorBar.css | 20 - src/view/styles/MotionSensorBar.css | 20 - src/view/styles/SensorButton.css | 29 - src/view/styles/Simulator.css | 83 - src/view/styles/SimulatorSvg.css | 290 - src/view/styles/TemperatureSensorBar.css | 18 - src/view/styles/ToolBar.css | 182 - src/view/svgs/arrow_right_svg.tsx | 21 - src/view/svgs/close_svg.tsx | 26 - src/view/svgs/play_svg.tsx | 19 - src/view/svgs/refresh_svg.tsx | 21 - src/view/svgs/stop_svg.tsx | 21 - src/view/svgs/tag_input_svg.tsx | 27 - src/view/svgs/tag_output_svg.tsx | 26 - src/view/svgs/toolbar_svg.tsx | 740 - src/view/translations/en.json | 112 - src/view/tsconfig.json | 19 - src/view/utils/MessageUtils.tsx | 12 - src/view/viewUtils.tsx | 33 - src/vscode_import.ts | 3 - 318 files changed, 15215 insertions(+), 81305 deletions(-) delete mode 100644 .github/CODEOWNERS delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/ci.yml delete mode 100644 .prettierrc.yaml delete mode 100644 .vscode/extensions.json delete mode 100644 .vscode/launch.json delete mode 100644 .vscode/settings.json delete mode 100644 .vscode/tasks.json delete mode 100644 src/adafruit_circuitplayground/__init__.py delete mode 100644 src/adafruit_circuitplayground/constants.py delete mode 100644 src/adafruit_circuitplayground/express.py delete mode 100644 src/adafruit_circuitplayground/locale/en/LC_MESSAGES/express.po delete mode 100644 src/adafruit_circuitplayground/locale/express.pot delete mode 100644 src/adafruit_circuitplayground/pixel.py delete mode 100644 src/adafruit_circuitplayground/test/__init__.py delete mode 100644 src/adafruit_circuitplayground/test/sample.mp4 delete mode 100644 src/adafruit_circuitplayground/test/sample.wav delete mode 100644 src/adafruit_circuitplayground/test/test_express.py delete mode 100644 src/adafruit_circuitplayground/test/test_pixel.py delete mode 100644 src/base_circuitpython/__init__.py delete mode 100644 src/base_circuitpython/base_cp_constants.py delete mode 100644 src/base_circuitpython/board.py delete mode 100644 src/base_circuitpython/digitalio.py delete mode 100644 src/base_circuitpython/displayio/__init__.py delete mode 100644 src/base_circuitpython/displayio/bitmap.py delete mode 100644 src/base_circuitpython/displayio/color_type.py delete mode 100644 src/base_circuitpython/displayio/constants.py delete mode 100644 src/base_circuitpython/displayio/group.py delete mode 100644 src/base_circuitpython/displayio/palette.py delete mode 100644 src/base_circuitpython/displayio/test/__init__.py delete mode 100644 src/base_circuitpython/displayio/test/img/group_test_result.bmp delete mode 100644 src/base_circuitpython/displayio/test/test_bitmap.py delete mode 100644 src/base_circuitpython/displayio/test/test_group.py delete mode 100644 src/base_circuitpython/displayio/test/test_palette.py delete mode 100644 src/base_circuitpython/displayio/test/test_tile_grid.py delete mode 100644 src/base_circuitpython/displayio/tile_grid.py delete mode 100644 src/base_circuitpython/fontio.py delete mode 100644 src/base_circuitpython/fonts/ter-u12n.bdf delete mode 100644 src/base_circuitpython/img/blinka.bmp delete mode 100644 src/base_circuitpython/neopixel_write.py delete mode 100644 src/base_circuitpython/pulseio.py delete mode 100644 src/base_circuitpython/terminal_handler.py delete mode 100644 src/base_circuitpython/terminalio.py delete mode 100644 src/base_circuitpython/test/__init__.py delete mode 100644 src/base_circuitpython/test/test_terminal_handler.py delete mode 100644 src/check_if_venv.py delete mode 100644 src/check_python_dependencies.py delete mode 100644 src/clue/__init__.py delete mode 100644 src/clue/adafruit_clue.py delete mode 100644 src/clue/adafruit_display_text/label.py delete mode 100644 src/clue/adafruit_slideshow.py delete mode 100644 src/clue/test/__init__.py delete mode 100644 src/clue/test/img/test_clue_text_1.bmp delete mode 100644 src/clue/test/img/test_display_text_1.bmp delete mode 100644 src/clue/test/img/test_display_text_2.bmp delete mode 100644 src/clue/test/img/test_display_text_3.bmp delete mode 100644 src/clue/test/img/test_display_text_4.bmp delete mode 100644 src/clue/test/img/test_image_shapes_1.bmp delete mode 100644 src/clue/test/img/test_image_shapes_2.bmp delete mode 100644 src/clue/test/img/test_image_shapes_3.bmp delete mode 100644 src/clue/test/img/test_image_shapes_4.bmp delete mode 100644 src/clue/test/img/test_image_shapes_5.bmp delete mode 100644 src/clue/test/img/test_image_text_1.bmp delete mode 100644 src/clue/test/img/test_image_text_2.bmp delete mode 100644 src/clue/test/img/test_image_text_3.bmp delete mode 100644 src/clue/test/img/test_image_text_4.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_1.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_2.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_3.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_4.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_5.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_6.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_7.bmp delete mode 100644 src/clue/test/slideshow_pics/pic_8.bmp delete mode 100644 src/clue/test/test_adafruit_clue.py delete mode 100644 src/clue/test/test_adafruit_display_shapes.py delete mode 100644 src/clue/test/test_adafruit_display_text.py delete mode 100644 src/clue/test/test_adafruit_slideshow.py delete mode 100644 src/clue/test/test_helpers.py delete mode 100644 src/common/__init__.py delete mode 100644 src/common/constants.py delete mode 100644 src/common/debugger_communication_client.py delete mode 100644 src/common/telemetry.py delete mode 100644 src/common/telemetry_events.py delete mode 100644 src/common/test/__init__.py delete mode 100644 src/common/test/test_debugger_communication_client.py delete mode 100644 src/common/test/test_utils.py delete mode 100644 src/common/utils.py delete mode 100644 src/constants.ts delete mode 100644 src/cpxWorkspace.ts delete mode 100644 src/debug_user_code.py delete mode 100644 src/debugger/debugAdapter.ts delete mode 100644 src/debugger/debugAdapterFactory.ts delete mode 100644 src/debuggerCommunicationServer.ts delete mode 100644 src/dev-requirements.txt delete mode 100644 src/device.py delete mode 100644 src/deviceContext.ts delete mode 100644 src/extension.ts delete mode 100644 src/extension_utils/utils.ts delete mode 100644 src/install_dependencies.py delete mode 100644 src/latest_release_note.ts delete mode 100644 src/micropython/__init__.py delete mode 100644 src/micropython/audio.py delete mode 100644 src/micropython/microbit/__init__.py delete mode 100644 src/micropython/microbit/__model/accelerometer.py delete mode 100644 src/micropython/microbit/__model/button.py delete mode 100644 src/micropython/microbit/__model/compass.py delete mode 100644 src/micropython/microbit/__model/constants.py delete mode 100644 src/micropython/microbit/__model/display.py delete mode 100644 src/micropython/microbit/__model/i2c.py delete mode 100644 src/micropython/microbit/__model/image.py delete mode 100644 src/micropython/microbit/__model/microbit_model.py delete mode 100644 src/micropython/microbit/__model/producer_property.py delete mode 100644 src/micropython/microbit/__model/spi.py delete mode 100644 src/micropython/microbit/test/__init__.py delete mode 100644 src/micropython/microbit/test/test_accelerometer.py delete mode 100644 src/micropython/microbit/test/test_button.py delete mode 100644 src/micropython/microbit/test/test_display.py delete mode 100644 src/micropython/microbit/test/test_image.py delete mode 100644 src/micropython/microbit/test/test_init.py delete mode 100644 src/micropython/microbit/test/test_microbit_model.py delete mode 100644 src/micropython/music.py delete mode 100644 src/micropython/radio.py delete mode 100644 src/micropython/speech.py delete mode 100644 src/micropython/utime.py delete mode 100644 src/process_user_code.py delete mode 100644 src/python_constants.py delete mode 100644 src/requirements.txt delete mode 100644 src/serialMonitor.ts delete mode 100644 src/serialPortControl.ts delete mode 100644 src/service/PopupService.ts delete mode 100644 src/service/debuggerCommunicationService.ts delete mode 100644 src/service/deviceSelectionService.ts delete mode 100644 src/service/fileSelectionService.ts delete mode 100644 src/service/messagingService.ts delete mode 100644 src/service/setupService.ts delete mode 100644 src/service/telemetryHandlerService.ts delete mode 100644 src/service/webviewService.ts delete mode 100644 src/simulatorDebugConfigurationProvider.ts delete mode 100644 src/telemetry/getPackageInfo.ts delete mode 100644 src/telemetry/telemetryAI.ts delete mode 100644 src/templates/clue_template.py delete mode 100644 src/templates/cpx_template.py delete mode 100644 src/templates/microbit_template.py delete mode 100644 src/test/runTest.ts delete mode 100644 src/test/suite/index.ts delete mode 100644 src/usbDetector.ts delete mode 100644 src/view/App.css delete mode 100644 src/view/App.spec.tsx delete mode 100644 src/view/App.tsx delete mode 100644 src/view/__snapshots__/App.spec.tsx.snap delete mode 100644 src/view/components/Button.tsx delete mode 100644 src/view/components/Dropdown.tsx delete mode 100644 src/view/components/clue/Clue.spec.tsx delete mode 100644 src/view/components/clue/Clue.tsx delete mode 100644 src/view/components/clue/ClueImage.tsx delete mode 100644 src/view/components/clue/ClueSimulator.tsx delete mode 100644 src/view/components/clue/Clue_svg.tsx delete mode 100644 src/view/components/clue/__snapshots__/Clue.spec.tsx.snap delete mode 100644 src/view/components/cpx/Accessibility_utils.ts delete mode 100644 src/view/components/cpx/Cpx.spec.tsx delete mode 100644 src/view/components/cpx/Cpx.tsx delete mode 100644 src/view/components/cpx/CpxImage.tsx delete mode 100644 src/view/components/cpx/CpxSimulator.tsx delete mode 100644 src/view/components/cpx/Cpx_svg.tsx delete mode 100644 src/view/components/cpx/Cpx_svg_style.tsx delete mode 100644 src/view/components/cpx/Svg_utils.tsx delete mode 100644 src/view/components/cpx/__snapshots__/Cpx.spec.tsx.snap delete mode 100644 src/view/components/microbit/Microbit.spec.tsx delete mode 100644 src/view/components/microbit/Microbit.tsx delete mode 100644 src/view/components/microbit/MicrobitImage.tsx delete mode 100644 src/view/components/microbit/MicrobitSimulator.tsx delete mode 100644 src/view/components/microbit/Microbit_svg.tsx delete mode 100644 src/view/components/microbit/__snapshots__/Microbit.spec.tsx.snap delete mode 100644 src/view/components/simulator/ActionBar.tsx delete mode 100644 src/view/components/toolbar/GenericSliderComponent.tsx delete mode 100644 src/view/components/toolbar/Gesture.tsx delete mode 100644 src/view/components/toolbar/InputSlider.tsx delete mode 100644 src/view/components/toolbar/SensorButton.tsx delete mode 100644 src/view/components/toolbar/SensorModalUtils.tsx delete mode 100644 src/view/components/toolbar/ToolBar.tsx delete mode 100644 src/view/components/toolbar/Toolbar.spec.tsx delete mode 100644 src/view/components/toolbar/__snapshots__/Toolbar.spec.tsx.snap delete mode 100644 src/view/components/toolbar/clue/ClueModalContent.tsx delete mode 100644 src/view/components/toolbar/clue/ClueSensorProperties.tsx delete mode 100644 src/view/components/toolbar/cpx/CpxModalContent.tsx delete mode 100644 src/view/components/toolbar/cpx/CpxSensorProperties.tsx delete mode 100644 src/view/components/toolbar/microbit/MicrobitModalContent.tsx delete mode 100644 src/view/components/toolbar/microbit/MicrobitSensorProperties.tsx delete mode 100644 src/view/constants.ts delete mode 100644 src/view/container/device/Device.spec.tsx delete mode 100644 src/view/container/device/Device.tsx delete mode 100644 src/view/container/device/__snapshots__/Device.spec.tsx.snap delete mode 100644 src/view/context.ts delete mode 100644 src/view/index.css delete mode 100644 src/view/index.tsx delete mode 100644 src/view/pages/__snapshots__/gettingStarted.spec.tsx.snap delete mode 100644 src/view/pages/gettingStarted.css delete mode 100644 src/view/pages/gettingStarted.spec.tsx delete mode 100644 src/view/pages/gettingStarted.tsx delete mode 100644 src/view/pages/gettingStartedPictures/debugger/debugger_vars.png delete mode 100644 src/view/pages/gettingStartedPictures/debugger/debugging.gif delete mode 100644 src/view/pages/gettingStartedPictures/debugger/start_debugging.jpg delete mode 100644 src/view/pages/gettingStartedPictures/debugger/toolbar.png delete mode 100644 src/view/react-app-env.d.ts delete mode 100644 src/view/styles/Button.css delete mode 100644 src/view/styles/Dropdown.css delete mode 100644 src/view/styles/InputSlider.css delete mode 100644 src/view/styles/LightSensorBar.css delete mode 100644 src/view/styles/MotionSensorBar.css delete mode 100644 src/view/styles/SensorButton.css delete mode 100644 src/view/styles/Simulator.css delete mode 100644 src/view/styles/SimulatorSvg.css delete mode 100644 src/view/styles/TemperatureSensorBar.css delete mode 100644 src/view/styles/ToolBar.css delete mode 100644 src/view/svgs/arrow_right_svg.tsx delete mode 100644 src/view/svgs/close_svg.tsx delete mode 100644 src/view/svgs/play_svg.tsx delete mode 100644 src/view/svgs/refresh_svg.tsx delete mode 100644 src/view/svgs/stop_svg.tsx delete mode 100644 src/view/svgs/tag_input_svg.tsx delete mode 100644 src/view/svgs/tag_output_svg.tsx delete mode 100644 src/view/svgs/toolbar_svg.tsx delete mode 100644 src/view/translations/en.json delete mode 100644 src/view/tsconfig.json delete mode 100644 src/view/utils/MessageUtils.tsx delete mode 100644 src/view/viewUtils.tsx delete mode 100644 src/vscode_import.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 7bd16fe97..000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,3 +0,0 @@ -# At least one of the code owners below will be required on each PR: - -* @markAtMicrosoft @smmatte @adclements @abmahdy @iennae @nasadigital @isadorasophia @sagarmanchanda diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index ef9bbe450..000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,33 +0,0 @@ -# Description: - -Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. - -## Type of change - -Please delete options that are not relevant. - -- [ ] Bug fix (non-breaking change which fixes an issue) -- [ ] New feature (non-breaking change which adds functionality) -- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) -- [ ] This change requires a documentation update - -# Limitations: - -Please describe limitations of this PR - -# Testing: - -Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration - -- [ ] Test A -- [ ] Test B - -# Checklist: - -- [ ] My code follows the style guidelines of this project -- [ ] My code has been formatted with `npm run format` and passes the checks in `npm run check` -- [ ] I have performed a self-review of my own code -- [ ] I have commented my code, particularly in hard-to-understand areas -- [ ] I have made corresponding changes to the documentation -- [ ] My changes generate no new warnings -- [ ] Any dependent changes have been merged and published in downstream modules diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 93eb4fa78..000000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,52 +0,0 @@ -# This workflow will do a clean install of node dependencies, python dependencies, build the source code and run tests - -name: CI - -on: - push: - branches: [ dev, staging ] - pull_request: - branches: [ dev, staging ] - -jobs: - build-and-test: - - runs-on: ${{ matrix.os }} - - strategy: - fail-fast: false - matrix: - os: [macos-latest, windows-latest, ubuntu-18.04] - node-version: [10.x] - - steps: - - uses: actions/checkout@v2 - - name: Install Linux dependencies - if: matrix.os == 'ubuntu-18.04' - run: | - sudo apt-get update - sudo apt-get install g++-multilib - sudo apt-get install -y build-essential - sudo apt-get install libudev-dev - - name: Use Node.js ${{ matrix.node-version }} and install npm dependencies - uses: actions/setup-node@v2 - with: - node-version: ${{ matrix.node-version }} - - run: npm install - - name: Setup Python environment - uses: actions/setup-python@v2 - with: - python-version: 3.x - - run: | - python -m pip install --upgrade pip - pip install -r ./src/dev-requirements.txt - - name: Use npm to compile, format-check and test - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - run: npm run compile - - run: npm run check - - name: Run tests - uses: GabrielBB/xvfb-action@v1.0 - with: - run: npm run test diff --git a/.prettierrc.yaml b/.prettierrc.yaml deleted file mode 100644 index 5379f1e00..000000000 --- a/.prettierrc.yaml +++ /dev/null @@ -1,5 +0,0 @@ -trailingComma: "es5" -tabWidth: 4 -semi: true -endOfLine: auto -printWidth: 80 \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index 0a18b9c4b..000000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - // See http://go.microsoft.com/fwlink/?LinkId=827846 - // for the documentation about the extensions.json format - "recommendations": [ - "ms-vscode.vscode-typescript-tslint-plugin" - ] -} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 36aa66946..000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,30 +0,0 @@ -// A launch configuration that compiles the extension and then opens it inside a new window -// Use IntelliSense to learn about possible attributes. -// Hover to view descriptions of existing attributes. -// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Run Extension", - "type": "extensionHost", - "request": "launch", - "runtimeExecutable": "${execPath}", - "args": ["--extensionDevelopmentPath=${workspaceFolder}"], - "outFiles": ["${workspaceFolder}/out/**/*.js"], - "preLaunchTask": "npm: watch" - }, - { - "name": "Extension Tests", - "type": "extensionHost", - "request": "launch", - "runtimeExecutable": "${execPath}", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}", - "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" - ], - "outFiles": ["${workspaceFolder}/out/test/**/*.js"], - "preLaunchTask": "npm: watch" - } - ] -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 0b79e8a23..000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,10 +0,0 @@ -// Place your settings in this file to overwrite default and user settings. -{ - "files.exclude": { - "out": false // set this to true to hide the "out" folder with the compiled JS files - }, - "search.exclude": { - "out": true // set this to false to include "out" folder in search results - } - // Turn off tsc task auto detection since we have the necessary tasks as npm scripts -} diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index db16afdd4..000000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,25 +0,0 @@ -// See https://go.microsoft.com/fwlink/?LinkId=733558 -// for the documentation about the tasks.json format -{ - "version": "2.0.0", - "tasks": [ - { - "type": "npm", - "script": "watch", - "problemMatcher": "$tsc-watch", - "isBackground": true, - "presentation": { - "reveal": "never" - }, - "group": { - "kind": "build", - "isDefault": true - } - }, - { - "type": "gulp", - "task": "add-locales", - "problemMatcher": [] - } - ] -} diff --git a/Source/constants.ts b/Source/constants.ts index fe702c639..b14d875f0 100644 --- a/Source/constants.ts +++ b/Source/constants.ts @@ -7,549 +7,549 @@ import * as nls from "vscode-nls"; // Debugger Server export const SERVER_INFO = { - DEFAULT_SERVER_PORT: 5577, - ERROR_CODE_INIT_SERVER: "ERROR_INIT_SERVER", - SERVER_PORT_CONFIGURATION: "deviceSimulatorExpress.debuggerServerPort", + DEFAULT_SERVER_PORT: 5577, + ERROR_CODE_INIT_SERVER: "ERROR_INIT_SERVER", + SERVER_PORT_CONFIGURATION: "deviceSimulatorExpress.debuggerServerPort", }; const localize: nls.LocalizeFunc = nls.config({ - messageFormat: nls.MessageFormat.file, + messageFormat: nls.MessageFormat.file, })(); export const CONFIG = { - CONFIG_ENV_ON_SWITCH: - "deviceSimulatorExpress.configNewEnvironmentUponSwitch", - PYTHON_PATH: "python.pythonPath", - SHOW_DEPENDENCY_INSTALL: "deviceSimulatorExpress.showDependencyInstall", - SHOW_NEW_FILE_POPUP: "deviceSimulatorExpress.showNewFilePopup", + CONFIG_ENV_ON_SWITCH: + "deviceSimulatorExpress.configNewEnvironmentUponSwitch", + PYTHON_PATH: "python.pythonPath", + SHOW_DEPENDENCY_INSTALL: "deviceSimulatorExpress.showDependencyInstall", + SHOW_NEW_FILE_POPUP: "deviceSimulatorExpress.showNewFilePopup", }; export const CONSTANTS = { - WEBVIEW_TYPE: { - SIMULATOR: "simulator", - TUTORIAL: "tutorial", - }, - DEBUG_CONFIGURATION_TYPE: "deviceSimulatorExpress", - DEVICE_NAME: { - CPX: "CPX", - MICROBIT: "micro:bit", - CLUE: "CLUE", - }, - DEVICE_NAME_FORMAL: { - CPX: "Circuit Playground Express", - MICROBIT: "micro:bit", - CLUE: "CLUE", - }, - SCRIPT_PATH: { - SIMULATOR: "out/simulator.js", - VSCODE_API: "out/vscode_import.js", - }, - ERROR: { - BAD_PYTHON_PATH: - 'Your interpreter is not pointing to a valid Python executable. Please select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application', - COMPORT_UNKNOWN_ERROR: - "Writing to COM port (GetOverlappedResult): Unknown error code 121", - CPX_FILE_ERROR: localize( - "error.cpxFileFormat", - "The cpx.json file format is not correct." - ), - DEBUGGER_SERVER_INIT_FAILED: (port: number) => { - return localize( - "error.debuggerServerInitFailed", - `Warning : The Debugger Server cannot be opened. Please try to free the port ${port} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.` - ); - }, - DEBUGGING_SESSION_IN_PROGESS: localize( - "error.debuggingSessionInProgress", - "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n" - ), - DEPENDENCY_DOWNLOAD_ERROR: - "Dependency download could not be completed. Functionality may be limited. Please review the installation docs.", - - FAILED_TO_OPEN_SERIAL_PORT: (port: string): string => { - return localize( - "error.failedToOpenSerialPort", - `[ERROR] Failed to open serial port ${port}.` - ); - }, - FAILED_TO_OPEN_SERIAL_PORT_DUE_TO: (port: string, error: any) => { - return localize( - "error.failedToOpenSerialPortDueTo", - `[ERROR] Failed to open serial port ${port} due to error: ${error}. \n` - ); - }, - INSTALLATION_ERROR: localize( - "error.installationError", - "Installation Error" - ), - - INVALID_FILE_EXTENSION_DEBUG: localize( - "error.invalidFileExtensionDebug", - "The file you tried to run isn't a Python file." - ), - INVALID_PYTHON_PATH: localize( - "error.invalidPythonPath", - 'We found that your selected Python interpreter version is too low to run the extension. Please upgrade to version 3.7+ or select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application.' - ), - LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT: localize( - "error.lowPythonVersionForMicrobitDeployment", - "To deploy your code to the micro:bit, you must be using Python 3.3+" - ), - NO_DEVICE: localize( - "error.noDevice", - "The device is not detected. Please double check if your board is connected and/or properly formatted" - ), - NO_FILE_TO_RUN: localize( - "error.noFileToRun", - '[ERROR] We can\'t find a Python file to run. Please make sure you select or open a new ".py" code file, or use the "New File" command to get started and see useful links.\n' - ), - NO_FILE_TO_DEPLOY: localize( - "error.noFileToDeploy", - "[ERROR] We can't find a Python file to deploy to your device.\n" - ), - NO_FOLDER_OPENED: localize( - "error.noFolderCreated", - "In order to use the Serial Monitor, you need to open a folder and reload VS Code." - ), - NO_PROGRAM_FOUND_DEBUG: localize( - "error.noProgramFoundDebug", - "Cannot find a program to debug." - ), - NO_PYTHON_PATH: localize( - "error.noPythonPath", - "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again." - ), - RECONNECT_DEVICE: localize( - "error.reconnectDevice", - "Please disconnect your Circuit Playground Express and try again." - ), - STDERR: (data: string) => { - return localize("error.stderr", `\n[ERROR] ${data} \n`); - }, - UNEXPECTED_MESSAGE: localize( - "error.unexpectedMessage", - "Webview sent an unexpected message" - ), - }, - FILESYSTEM: { - BASE_CIRCUITPYTHON: "base_circuitpython", - CLUE: "clue", - PYTHON_VENV_DIR: "venv", - MICROPYTHON_DIRECTORY: "micropython", - OUTPUT_DIRECTORY: "out", - }, - INFO: { - ALREADY_SUCCESSFUL_INSTALL: localize( - "info.successfulInstall", - "Your current configuration is already successfully set up for the Device Simulator Expresss." - ), - ARE_YOU_SURE: localize( - "info.areYouSure", - "Are you sure you don't want to install the dependencies? The extension can't run without installing them." - ), - CLOSED_SERIAL_PORT: (port: string) => { - return localize( - "info.closedSerialPort", - `[DONE] Closed the serial port - ${port} \n` - ); - }, - COMPLETED_MESSAGE: "Completed", - CPX_JSON_ALREADY_GENERATED: localize( - "info.cpxJsonAlreadyGenerated", - "cpx.json has already been generated." - ), - DEPLOY_DEVICE: localize( - "info.deployDevice", - "\n[INFO] Deploying code to the device...\n" - ), - DEPLOY_SIMULATOR: localize( - "info.deploySimulator", - "\n[INFO] Deploying code to the simulator...\n" - ), - DEPLOY_SUCCESS: localize( - "info.deploySuccess", - "\n[INFO] Code successfully copied! Your device should be loading and ready to go shortly.\n" - ), - EXTENSION_ACTIVATED: localize( - "info.extensionActivated", - "Congratulations, your extension Device Simulator Express is now active!" - ), - FILE_SELECTED: (filePath: string) => { - return localize( - "info.fileSelected", - `[INFO] File selected : ${filePath} \n` - ); - }, - FIRST_TIME_WEBVIEW: localize( - "info.firstTimeWebview", - 'To reopen the simulator select the command "Open Simulator" from command palette.' - ), - INSTALLING_PYTHON_VENV: localize( - "info.installingPythonVenv", - "A virtual environment is currently being created. The required Python packages will be installed. You will be prompted a message telling you when the installation is done." - ), - INSTALL_PYTHON_DEPS: localize( - "info.installPythonDependencies", - "Do you want us to try and install this extension's dependencies on your selected Python interpreter for you?" - ), - INSTALL_PYTHON_VENV: localize( - "info.installPythonVenv", - "Do you want us to try and install this extension's dependencies via virtual environment for you?" - ), - NEW_FILE: localize( - "info.newFile", - "New to Python or the Circuit Playground Express? We are here to help!" - ), - NO_DEVICE_CHOSEN_TO_DEPLOY_TO: localize( - "info.noDeviceChosenToDeployTo", - "\n[INFO] No device was selected to deploy to.\n" - ), - NO_DEVICE_CHOSEN_TO_SIMULATE_TO: localize( - "info.noDeviceChosenToSimulateTo", - "\n[INFO] No device was selected to simulate.\n" - ), - NO_DEVICE_CHOSEN_FOR_NEW_FILE: localize( - "info.noDeviceChosenForNewFile", - "\n[INFO] No device was selected to open a template file for.\n" - ), - OPENED_SERIAL_PORT: (port: string) => { - return localize( - "info.openedSerialPort", - `[INFO] Opened the serial port - ${port} \n` - ); - }, - OPENING_SERIAL_PORT: (port: string) => { - return localize( - "info.openingSerialPort", - `[STARTING] Opening the serial port - ${port} \n` - ); - }, - PLEASE_OPEN_FOLDER: localize( - "info.pleaseOpenFolder", - "Please open a folder first." - ), - REDIRECT: localize("info.redirect", "You are being redirected."), - RUNNING_CODE: localize("info.runningCode", "Running user code"), - SUCCESSFUL_INSTALL: localize( - "info.successfulInstall", - "Successfully set up the Python environment." - ), - THIRD_PARTY_WEBSITE_ADAFRUIT: localize( - "info.thirdPartyWebsiteAdafruit", - 'By clicking "Agree and Proceed" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit\'s privacy policy' - ), - THIRD_PARTY_WEBSITE_PIP: localize( - "info.thirdPartyWebsitePip", - 'By clicking "Agree and Proceed" you will be redirected to pip.pypa.io, a third party website not managed by Microsoft. Please note that your activity on pip.pypa.io is subject to PyPA\'s privacy policy' - ), - THIRD_PARTY_WEBSITE_PYTHON: localize( - "info.thirdPartyWebsitePython", - 'By clicking "Agree and Proceed" you will be redirected to python.org, a third party website not managed by Microsoft. Please note that your activity on python.org is subject to Python\'s privacy policy' - ), - UPDATED_TO_EXTENSION_VENV: localize( - "info.updatedToExtensionsVenv", - "Automatically updated interpreter to point to extension's virtual environment." - ), - WELCOME_OUTPUT_TAB: localize( - "info.welcomeOutputTab", - "Welcome to the Device Simulator Express output tab!\n\n" - ), - }, - LABEL: { - WEBVIEW_PANEL: localize( - "label.webviewPanel", - "Device Simulator Express" - ), - }, - LINKS: { - DOWNLOAD_PIP: "https://pip.pypa.io/en/stable/installing/", - DOWNLOAD_PYTHON: "https://www.python.org/downloads/", - EXAMPLE_CODE: - "https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples", - CPX_HELP: - "https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart", - CLUE_HELP: "https://learn.adafruit.com/adafruit-clue/circuitpython", - INSTALL: - "https://github.com/microsoft/vscode-python-devicesimulator/blob/dev/docs/install.md", - PRIVACY: "https://www.adafruit.com/privacy", - TUTORIALS: - "https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library", - }, - MISC: { - SELECT_PORT_PLACEHOLDER: localize( - "misc.selectPortPlaceholder", - "Select a serial port" - ), - SERIAL_MONITOR_NAME: localize( - "misc.serialMonitorName", - "Device Simulator Express Serial Monitor" - ), - SERIAL_MONITOR_TEST_IF_OPEN: localize( - "misc.testIfPortOpen", - "Test if serial port is open" - ), - }, - NAME: localize("name", "Device Simulator Express"), - TEMPLATE: { - CPX: "cpx_template.py", - MICROBIT: "microbit_template.py", - CLUE: "clue_template.py", - }, - WARNING: { - ACCEPT_AND_RUN: localize( - "warning.agreeAndRun", - "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk." - ), - INVALID_BAUD_RATE: localize( - "warning.invalidBaudRate", - "Invalid baud rate, keep baud rate unchanged." - ), - NO_RATE_SELECTED: localize( - "warning.noRateSelected", - "No rate is selected, keep baud rate unchanged." - ), - NO_SERIAL_PORT_SELECTED: localize( - "warning.noSerialPortSelected", - "No serial port was selected, please select a serial port first" - ), - SERIAL_MONITOR_ALREADY_OPENED: (port: string) => { - return localize( - "warning.serialMonitorAlreadyOpened", - `Serial monitor is already opened for ${port} \n` - ); - }, - SERIAL_MONITOR_NOT_STARTED: localize( - "warning.serialMonitorNotStarted", - "Serial monitor has not been started." - ), - SERIAL_PORT_NOT_STARTED: localize( - "warning.serialPortNotStarted", - "Serial port has not been started.\n" - ), - }, + WEBVIEW_TYPE: { + SIMULATOR: "simulator", + TUTORIAL: "tutorial", + }, + DEBUG_CONFIGURATION_TYPE: "deviceSimulatorExpress", + DEVICE_NAME: { + CPX: "CPX", + MICROBIT: "micro:bit", + CLUE: "CLUE", + }, + DEVICE_NAME_FORMAL: { + CPX: "Circuit Playground Express", + MICROBIT: "micro:bit", + CLUE: "CLUE", + }, + SCRIPT_PATH: { + SIMULATOR: "out/simulator.js", + VSCODE_API: "out/vscode_import.js", + }, + ERROR: { + BAD_PYTHON_PATH: + 'Your interpreter is not pointing to a valid Python executable. Please select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application', + COMPORT_UNKNOWN_ERROR: + "Writing to COM port (GetOverlappedResult): Unknown error code 121", + CPX_FILE_ERROR: localize( + "error.cpxFileFormat", + "The cpx.json file format is not correct." + ), + DEBUGGER_SERVER_INIT_FAILED: (port: number) => { + return localize( + "error.debuggerServerInitFailed", + `Warning : The Debugger Server cannot be opened. Please try to free the port ${port} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.` + ); + }, + DEBUGGING_SESSION_IN_PROGESS: localize( + "error.debuggingSessionInProgress", + "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n" + ), + DEPENDENCY_DOWNLOAD_ERROR: + "Dependency download could not be completed. Functionality may be limited. Please review the installation docs.", + + FAILED_TO_OPEN_SERIAL_PORT: (port: string): string => { + return localize( + "error.failedToOpenSerialPort", + `[ERROR] Failed to open serial port ${port}.` + ); + }, + FAILED_TO_OPEN_SERIAL_PORT_DUE_TO: (port: string, error: any) => { + return localize( + "error.failedToOpenSerialPortDueTo", + `[ERROR] Failed to open serial port ${port} due to error: ${error}. \n` + ); + }, + INSTALLATION_ERROR: localize( + "error.installationError", + "Installation Error" + ), + + INVALID_FILE_EXTENSION_DEBUG: localize( + "error.invalidFileExtensionDebug", + "The file you tried to run isn't a Python file." + ), + INVALID_PYTHON_PATH: localize( + "error.invalidPythonPath", + 'We found that your selected Python interpreter version is too low to run the extension. Please upgrade to version 3.7+ or select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application.' + ), + LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT: localize( + "error.lowPythonVersionForMicrobitDeployment", + "To deploy your code to the micro:bit, you must be using Python 3.3+" + ), + NO_DEVICE: localize( + "error.noDevice", + "The device is not detected. Please double check if your board is connected and/or properly formatted" + ), + NO_FILE_TO_RUN: localize( + "error.noFileToRun", + '[ERROR] We can\'t find a Python file to run. Please make sure you select or open a new ".py" code file, or use the "New File" command to get started and see useful links.\n' + ), + NO_FILE_TO_DEPLOY: localize( + "error.noFileToDeploy", + "[ERROR] We can't find a Python file to deploy to your device.\n" + ), + NO_FOLDER_OPENED: localize( + "error.noFolderCreated", + "In order to use the Serial Monitor, you need to open a folder and reload VS Code." + ), + NO_PROGRAM_FOUND_DEBUG: localize( + "error.noProgramFoundDebug", + "Cannot find a program to debug." + ), + NO_PYTHON_PATH: localize( + "error.noPythonPath", + "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again." + ), + RECONNECT_DEVICE: localize( + "error.reconnectDevice", + "Please disconnect your Circuit Playground Express and try again." + ), + STDERR: (data: string) => { + return localize("error.stderr", `\n[ERROR] ${data} \n`); + }, + UNEXPECTED_MESSAGE: localize( + "error.unexpectedMessage", + "Webview sent an unexpected message" + ), + }, + FILESYSTEM: { + BASE_CIRCUITPYTHON: "base_circuitpython", + CLUE: "clue", + PYTHON_VENV_DIR: "venv", + MICROPYTHON_DIRECTORY: "micropython", + OUTPUT_DIRECTORY: "out", + }, + INFO: { + ALREADY_SUCCESSFUL_INSTALL: localize( + "info.successfulInstall", + "Your current configuration is already successfully set up for the Device Simulator Expresss." + ), + ARE_YOU_SURE: localize( + "info.areYouSure", + "Are you sure you don't want to install the dependencies? The extension can't run without installing them." + ), + CLOSED_SERIAL_PORT: (port: string) => { + return localize( + "info.closedSerialPort", + `[DONE] Closed the serial port - ${port} \n` + ); + }, + COMPLETED_MESSAGE: "Completed", + CPX_JSON_ALREADY_GENERATED: localize( + "info.cpxJsonAlreadyGenerated", + "cpx.json has already been generated." + ), + DEPLOY_DEVICE: localize( + "info.deployDevice", + "\n[INFO] Deploying code to the device...\n" + ), + DEPLOY_SIMULATOR: localize( + "info.deploySimulator", + "\n[INFO] Deploying code to the simulator...\n" + ), + DEPLOY_SUCCESS: localize( + "info.deploySuccess", + "\n[INFO] Code successfully copied! Your device should be loading and ready to go shortly.\n" + ), + EXTENSION_ACTIVATED: localize( + "info.extensionActivated", + "Congratulations, your extension Device Simulator Express is now active!" + ), + FILE_SELECTED: (filePath: string) => { + return localize( + "info.fileSelected", + `[INFO] File selected : ${filePath} \n` + ); + }, + FIRST_TIME_WEBVIEW: localize( + "info.firstTimeWebview", + 'To reopen the simulator select the command "Open Simulator" from command palette.' + ), + INSTALLING_PYTHON_VENV: localize( + "info.installingPythonVenv", + "A virtual environment is currently being created. The required Python packages will be installed. You will be prompted a message telling you when the installation is done." + ), + INSTALL_PYTHON_DEPS: localize( + "info.installPythonDependencies", + "Do you want us to try and install this extension's dependencies on your selected Python interpreter for you?" + ), + INSTALL_PYTHON_VENV: localize( + "info.installPythonVenv", + "Do you want us to try and install this extension's dependencies via virtual environment for you?" + ), + NEW_FILE: localize( + "info.newFile", + "New to Python or the Circuit Playground Express? We are here to help!" + ), + NO_DEVICE_CHOSEN_TO_DEPLOY_TO: localize( + "info.noDeviceChosenToDeployTo", + "\n[INFO] No device was selected to deploy to.\n" + ), + NO_DEVICE_CHOSEN_TO_SIMULATE_TO: localize( + "info.noDeviceChosenToSimulateTo", + "\n[INFO] No device was selected to simulate.\n" + ), + NO_DEVICE_CHOSEN_FOR_NEW_FILE: localize( + "info.noDeviceChosenForNewFile", + "\n[INFO] No device was selected to open a template file for.\n" + ), + OPENED_SERIAL_PORT: (port: string) => { + return localize( + "info.openedSerialPort", + `[INFO] Opened the serial port - ${port} \n` + ); + }, + OPENING_SERIAL_PORT: (port: string) => { + return localize( + "info.openingSerialPort", + `[STARTING] Opening the serial port - ${port} \n` + ); + }, + PLEASE_OPEN_FOLDER: localize( + "info.pleaseOpenFolder", + "Please open a folder first." + ), + REDIRECT: localize("info.redirect", "You are being redirected."), + RUNNING_CODE: localize("info.runningCode", "Running user code"), + SUCCESSFUL_INSTALL: localize( + "info.successfulInstall", + "Successfully set up the Python environment." + ), + THIRD_PARTY_WEBSITE_ADAFRUIT: localize( + "info.thirdPartyWebsiteAdafruit", + 'By clicking "Agree and Proceed" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit\'s privacy policy' + ), + THIRD_PARTY_WEBSITE_PIP: localize( + "info.thirdPartyWebsitePip", + 'By clicking "Agree and Proceed" you will be redirected to pip.pypa.io, a third party website not managed by Microsoft. Please note that your activity on pip.pypa.io is subject to PyPA\'s privacy policy' + ), + THIRD_PARTY_WEBSITE_PYTHON: localize( + "info.thirdPartyWebsitePython", + 'By clicking "Agree and Proceed" you will be redirected to python.org, a third party website not managed by Microsoft. Please note that your activity on python.org is subject to Python\'s privacy policy' + ), + UPDATED_TO_EXTENSION_VENV: localize( + "info.updatedToExtensionsVenv", + "Automatically updated interpreter to point to extension's virtual environment." + ), + WELCOME_OUTPUT_TAB: localize( + "info.welcomeOutputTab", + "Welcome to the Device Simulator Express output tab!\n\n" + ), + }, + LABEL: { + WEBVIEW_PANEL: localize( + "label.webviewPanel", + "Device Simulator Express" + ), + }, + LINKS: { + DOWNLOAD_PIP: "https://pip.pypa.io/en/stable/installing/", + DOWNLOAD_PYTHON: "https://www.python.org/downloads/", + EXAMPLE_CODE: + "https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples", + CPX_HELP: + "https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart", + CLUE_HELP: "https://learn.adafruit.com/adafruit-clue/circuitpython", + INSTALL: + "https://github.com/microsoft/vscode-python-devicesimulator/blob/dev/docs/install.md", + PRIVACY: "https://www.adafruit.com/privacy", + TUTORIALS: + "https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library", + }, + MISC: { + SELECT_PORT_PLACEHOLDER: localize( + "misc.selectPortPlaceholder", + "Select a serial port" + ), + SERIAL_MONITOR_NAME: localize( + "misc.serialMonitorName", + "Device Simulator Express Serial Monitor" + ), + SERIAL_MONITOR_TEST_IF_OPEN: localize( + "misc.testIfPortOpen", + "Test if serial port is open" + ), + }, + NAME: localize("name", "Device Simulator Express"), + TEMPLATE: { + CPX: "cpx_template.py", + MICROBIT: "microbit_template.py", + CLUE: "clue_template.py", + }, + WARNING: { + ACCEPT_AND_RUN: localize( + "warning.agreeAndRun", + "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk." + ), + INVALID_BAUD_RATE: localize( + "warning.invalidBaudRate", + "Invalid baud rate, keep baud rate unchanged." + ), + NO_RATE_SELECTED: localize( + "warning.noRateSelected", + "No rate is selected, keep baud rate unchanged." + ), + NO_SERIAL_PORT_SELECTED: localize( + "warning.noSerialPortSelected", + "No serial port was selected, please select a serial port first" + ), + SERIAL_MONITOR_ALREADY_OPENED: (port: string) => { + return localize( + "warning.serialMonitorAlreadyOpened", + `Serial monitor is already opened for ${port} \n` + ); + }, + SERIAL_MONITOR_NOT_STARTED: localize( + "warning.serialMonitorNotStarted", + "Serial monitor has not been started." + ), + SERIAL_PORT_NOT_STARTED: localize( + "warning.serialPortNotStarted", + "Serial port has not been started.\n" + ), + }, }; export enum CONFIG_KEYS { - ENABLE_USB_DETECTION = "deviceSimulatorExpress.enableUSBDetection", + ENABLE_USB_DETECTION = "deviceSimulatorExpress.enableUSBDetection", } export enum TelemetryEventName { - FAILED_TO_OPEN_SIMULATOR = "SIMULATOR.FAILED_TO_OPEN", - - // Debugger - CPX_DEBUGGER_INIT_SUCCESS = "CPX.DEBUGGER.INIT.SUCCESS", - CPX_DEBUGGER_INIT_FAIL = "CPX.DEBUGGER.INIT.FAIL", - MICROBIT_DEBUGGER_INIT_SUCCESS = "MICROBIT.DEBUGGER.INIT.SUCCESS", - MICROBIT_DEBUGGER_INIT_FAIL = "MICROBIT.DEBUGGER.INIT.FAIL", - CLUE_DEBUGGER_INIT_SUCCESS = "CLUE.DEBUGGER.INIT.SUCCESS", - CLUE_DEBUGGER_INIT_FAIL = "CLUE.DEBUGGER.INIT.FAIL", - - // Extension commands - COMMAND_RUN_SIMULATOR_BUTTON = "COMMAND.RUN.SIMULATOR_BUTTON", - COMMAND_RUN_PALETTE = "COMMAND.RUN.PALETTE", - COMMAND_INSTALL_EXTENSION_DEPENDENCIES = "COMMAND.INSTALL.EXTENSION.DEPENDENCIES", - COMMAND_SERIAL_MONITOR_CHOOSE_PORT = "COMMAND.SERIAL_MONITOR.CHOOSE_PORT", - COMMAND_SERIAL_MONITOR_OPEN = "COMMAND.SERIAL_MONITOR.OPEN", - COMMAND_SERIAL_MONITOR_BAUD_RATE = "COMMAND.SERIAL_MONITOR.BAUD_RATE", - COMMAND_SERIAL_MONITOR_CLOSE = "COMMAND.SERIAL_MONITOR.CLOSE", - COMMAND_GETTING_STARTED = "COMMAND.GETTING_STARTED", - - CPX_COMMAND_DEPLOY_DEVICE = "CPX.COMMAND.DEPLOY.DEVICE", - CPX_COMMAND_NEW_FILE = "CPX.COMMAND.NEW.FILE.CPX", - CPX_COMMAND_OPEN_SIMULATOR = "CPX.COMMAND.OPEN.SIMULATOR", - - MICROBIT_COMMAND_DEPLOY_DEVICE = "MICROBIT.COMMAND.DEPLOY.DEVICE", - MICROBIT_COMMAND_NEW_FILE = "MICROBIT.COMMAND.NEW.FILE", - MICROBIT_COMMAND_OPEN_SIMULATOR = "MICROBIT.COMMAND.OPEN.SIMULATOR", - - CLUE_COMMAND_DEPLOY_DEVICE = "CLUE.COMMAND.DEPLOY.DEVICE", - CLUE_COMMAND_NEW_FILE = "CLUE.COMMAND.NEW.FILE.CPX", - CLUE_COMMAND_OPEN_SIMULATOR = "CLUE.COMMAND.OPEN.SIMULATOR", - - // Simulator interaction - CPX_SIMULATOR_BUTTON_A = "CPX.SIMULATOR.BUTTON.A", - CPX_SIMULATOR_BUTTON_B = "CPX.SIMULATOR.BUTTON.B", - CPX_SIMULATOR_BUTTON_AB = "CPX.SIMULATOR.BUTTON.AB", - CPX_SIMULATOR_SWITCH = "CPX.SIMULATOR.SWITCH", - - MICROBIT_SIMULATOR_BUTTON_A = "MICROBIT.SIMULATOR.BUTTON.A", - MICROBIT_SIMULATOR_BUTTON_B = "MICROBIT.SIMULATOR.BUTTON.B", - MICROBIT_SIMULATOR_BUTTON_AB = "MICROBIT.SIMULATOR.BUTTON.AB", - - CLUE_SIMULATOR_BUTTON_A = "CLUE.SIMULATOR.BUTTON.A", - CLUE_SIMULATOR_BUTTON_B = "CLUE.SIMULATOR.BUTTON.B", - CLUE_SIMULATOR_BUTTON_AB = "CLUE.SIMULATOR.BUTTON.AB", - - // Sensors - CPX_SIMULATOR_TEMPERATURE_SENSOR = "CPX.SIMULATOR.TEMPERATURE", - CPX_SIMULATOR_LIGHT_SENSOR = "CPX.SIMULATOR.LIGHT", - CPX_SIMULATOR_MOTION_SENSOR = "CPX.SIMULATOR.MOTION", - CPX_SIMULATOR_SHAKE = "CPX.SIMULATOR.SHAKE", - CPX_SIMULATOR_CAPACITIVE_TOUCH = "CPX.SIMULATOR.CAPACITIVE.TOUCH", - - MICROBIT_SIMULATOR_TEMPERATURE_SENSOR = "MICROBIT.SIMULATOR.TEMPERATURE", - MICROBIT_SIMULATOR_LIGHT_SENSOR = "MICROBIT.SIMULATOR.LIGHT", - MICROBIT_SIMULATOR_MOTION_SENSOR = "MICROBIT.SIMULATOR.MOTION", - MICROBIT_SIMULATOR_GESTURE_SENSOR = "MICROBIT.SIMULATOR.GESTURE", - - CLUE_SIMULATOR_TEMPERATURE_SENSOR = "CLUE.SIMULATOR.TEMPERATURE", - CLUE_SIMULATOR_LIGHT_SENSOR = "CLUE.SIMULATOR.LIGHT", - CLUE_SIMULATOR_MOTION_SENSOR = "CLUE.SIMULATOR.MOTION", - CLUE_SIMULATOR_GESTURE_SENSOR = "CLUE.SIMULATOR.GESTURE", - CLUE_SIMULATOR_PRESSURE_SENSOR = "CLUE.SIMULATOR.PRESSURE", - CLUE_SIMULATOR_PROXIMITY_SENSOR = "CLUE.SIMULATOR.PROXIMITY", - CLUE_SIMULATOR_HUMIDITY_SENSOR = "CLUE.SIMULATOR.HUMIDITY", - CLUE_SIMULATOR_GYRO_SENSOR = "CLUE.SIMULATOR.GYRO", - CLUE_SIMULATOR_MAGNET_SENSOR = "CLUE.SIMULATOR.MAGNET", - - // Pop-up dialog - CPX_CLICK_DIALOG_DONT_SHOW = "CPX.CLICK.DIALOG.DONT.SHOW", - CPX_CLICK_DIALOG_EXAMPLE_CODE = "CPX.CLICK.DIALOG.EXAMPLE.CODE", - CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CPX.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", - CPX_CLICK_DIALOG_TUTORIALS = "CPX.CLICK.DIALOG.TUTORIALS", - - CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CLUE.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", - - ERROR_PYTHON_PROCESS = "ERROR.PYTHON.PROCESS", - - CPX_ERROR_COMMAND_NEW_FILE = "CPX.ERROR.COMMAND.NEW.FILE", - CPX_ERROR_DEPLOY_WITHOUT_DEVICE = "CPX.ERROR.DEPLOY.WITHOUT.DEVICE", - CPX_ERROR_PYTHON_DEVICE_PROCESS = "CPX.ERROR.PYTHON.DEVICE.PROCESS", - CPX_SUCCESS_COMMAND_DEPLOY_DEVICE = "CPX.SUCCESS.COMMAND.DEPLOY.DEVICE", - - MICROBIT_ERROR_COMMAND_NEW_FILE = "MICROBIT.ERROR.COMMAND.NEW.FILE", - MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE = "MICROBIT.ERROR.DEPLOY.WITHOUT.DEVICE", - MICROBIT_ERROR_PYTHON_DEVICE_PROCESS = "MICROBIT.ERROR.PYTHON.DEVICE.PROCESS", - MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE = "MICROBIT.SUCCESS.COMMAND.DEPLOY.DEVICE", - - CLUE_ERROR_COMMAND_NEW_FILE = "CLUE.ERROR.COMMAND.NEW.FILE", - CLUE_ERROR_DEPLOY_WITHOUT_DEVICE = "CLUE.ERROR.DEPLOY.WITHOUT.DEVICE", - CLUE_ERROR_PYTHON_DEVICE_PROCESS = "CLUE.ERROR.PYTHON.DEVICE.PROCESS", - CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE = "CLUE.SUCCESS.COMMAND.DEPLOY.DEVICE", - - // Performance - CPX_PERFORMANCE_DEPLOY_DEVICE = "CPX.PERFORMANCE.DEPLOY.DEVICE", - CPX_PERFORMANCE_NEW_FILE = "CPX.PERFORMANCE.NEW.FILE", - CPX_PERFORMANCE_OPEN_SIMULATOR = "CPX.PERFORMANCE.OPEN.SIMULATOR", - - MICROBIT_PERFORMANCE_DEPLOY_DEVICE = "MICROBIT.PERFORMANCE.DEPLOY.DEVICE", - MICROBIT_PERFORMANCE_NEW_FILE = "MICROBIT.PERFORMANCE.NEW.FILE", - MICROBIT_PERFORMANCE_OPEN_SIMULATOR = "MICROBIT.PERFORMANCE.OPEN.SIMULATOR", - - CLUE_PERFORMANCE_DEPLOY_DEVICE = "CLUE.PERFORMANCE.DEPLOY.DEVICE", - CLUE_PERFORMANCE_NEW_FILE = "CLUE.PERFORMANCE.NEW.FILE", - CLUE_PERFORMANCE_OPEN_SIMULATOR = "CLUE.PERFORMANCE.OPEN.SIMULATOR", - - // Venv options - SETUP_VENV_CREATION_ERR = "SETUP.VENV.CREATION.ERR", - SETUP_NO_PIP = "SETUP.NO.PIP", - SETUP_DEP_INSTALL_FAIL = "SETUP.DEP.INSTALL.FAIL", - SETUP_AUTO_RESOLVE_PYTHON_PATH = "SETUP.AUTO.RESOLVE.PYTHON.PATH", - SETUP_NO_PYTHON_PATH = "SETUP.NO.PYTHON.PATH", - SETUP_DOWNLOAD_PYTHON = "SETUP.DOWNLOAD.PYTHON", - SETUP_INVALID_PYTHON_INTERPRETER_PATH = "SETUP.INVALID.PYTHON.INTERPRETER.PATH", - SETUP_INVALID_PYTHON_VER = "SETUP.INVALID.PYTHON.VER", - SETUP_INSTALL_VENV = "SETUP.INSTALL.VENV", - SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL = "SETUP.ORIGINAL.INTERPRETER.DEP.INSTALL", - SETUP_HAS_VENV = "SETUP.HAS.VENV", - SETUP_NO_DEPS_INSTALLED = "SETUP.NO.DEPS.INSTALLED", + FAILED_TO_OPEN_SIMULATOR = "SIMULATOR.FAILED_TO_OPEN", + + // Debugger + CPX_DEBUGGER_INIT_SUCCESS = "CPX.DEBUGGER.INIT.SUCCESS", + CPX_DEBUGGER_INIT_FAIL = "CPX.DEBUGGER.INIT.FAIL", + MICROBIT_DEBUGGER_INIT_SUCCESS = "MICROBIT.DEBUGGER.INIT.SUCCESS", + MICROBIT_DEBUGGER_INIT_FAIL = "MICROBIT.DEBUGGER.INIT.FAIL", + CLUE_DEBUGGER_INIT_SUCCESS = "CLUE.DEBUGGER.INIT.SUCCESS", + CLUE_DEBUGGER_INIT_FAIL = "CLUE.DEBUGGER.INIT.FAIL", + + // Extension commands + COMMAND_RUN_SIMULATOR_BUTTON = "COMMAND.RUN.SIMULATOR_BUTTON", + COMMAND_RUN_PALETTE = "COMMAND.RUN.PALETTE", + COMMAND_INSTALL_EXTENSION_DEPENDENCIES = "COMMAND.INSTALL.EXTENSION.DEPENDENCIES", + COMMAND_SERIAL_MONITOR_CHOOSE_PORT = "COMMAND.SERIAL_MONITOR.CHOOSE_PORT", + COMMAND_SERIAL_MONITOR_OPEN = "COMMAND.SERIAL_MONITOR.OPEN", + COMMAND_SERIAL_MONITOR_BAUD_RATE = "COMMAND.SERIAL_MONITOR.BAUD_RATE", + COMMAND_SERIAL_MONITOR_CLOSE = "COMMAND.SERIAL_MONITOR.CLOSE", + COMMAND_GETTING_STARTED = "COMMAND.GETTING_STARTED", + + CPX_COMMAND_DEPLOY_DEVICE = "CPX.COMMAND.DEPLOY.DEVICE", + CPX_COMMAND_NEW_FILE = "CPX.COMMAND.NEW.FILE.CPX", + CPX_COMMAND_OPEN_SIMULATOR = "CPX.COMMAND.OPEN.SIMULATOR", + + MICROBIT_COMMAND_DEPLOY_DEVICE = "MICROBIT.COMMAND.DEPLOY.DEVICE", + MICROBIT_COMMAND_NEW_FILE = "MICROBIT.COMMAND.NEW.FILE", + MICROBIT_COMMAND_OPEN_SIMULATOR = "MICROBIT.COMMAND.OPEN.SIMULATOR", + + CLUE_COMMAND_DEPLOY_DEVICE = "CLUE.COMMAND.DEPLOY.DEVICE", + CLUE_COMMAND_NEW_FILE = "CLUE.COMMAND.NEW.FILE.CPX", + CLUE_COMMAND_OPEN_SIMULATOR = "CLUE.COMMAND.OPEN.SIMULATOR", + + // Simulator interaction + CPX_SIMULATOR_BUTTON_A = "CPX.SIMULATOR.BUTTON.A", + CPX_SIMULATOR_BUTTON_B = "CPX.SIMULATOR.BUTTON.B", + CPX_SIMULATOR_BUTTON_AB = "CPX.SIMULATOR.BUTTON.AB", + CPX_SIMULATOR_SWITCH = "CPX.SIMULATOR.SWITCH", + + MICROBIT_SIMULATOR_BUTTON_A = "MICROBIT.SIMULATOR.BUTTON.A", + MICROBIT_SIMULATOR_BUTTON_B = "MICROBIT.SIMULATOR.BUTTON.B", + MICROBIT_SIMULATOR_BUTTON_AB = "MICROBIT.SIMULATOR.BUTTON.AB", + + CLUE_SIMULATOR_BUTTON_A = "CLUE.SIMULATOR.BUTTON.A", + CLUE_SIMULATOR_BUTTON_B = "CLUE.SIMULATOR.BUTTON.B", + CLUE_SIMULATOR_BUTTON_AB = "CLUE.SIMULATOR.BUTTON.AB", + + // Sensors + CPX_SIMULATOR_TEMPERATURE_SENSOR = "CPX.SIMULATOR.TEMPERATURE", + CPX_SIMULATOR_LIGHT_SENSOR = "CPX.SIMULATOR.LIGHT", + CPX_SIMULATOR_MOTION_SENSOR = "CPX.SIMULATOR.MOTION", + CPX_SIMULATOR_SHAKE = "CPX.SIMULATOR.SHAKE", + CPX_SIMULATOR_CAPACITIVE_TOUCH = "CPX.SIMULATOR.CAPACITIVE.TOUCH", + + MICROBIT_SIMULATOR_TEMPERATURE_SENSOR = "MICROBIT.SIMULATOR.TEMPERATURE", + MICROBIT_SIMULATOR_LIGHT_SENSOR = "MICROBIT.SIMULATOR.LIGHT", + MICROBIT_SIMULATOR_MOTION_SENSOR = "MICROBIT.SIMULATOR.MOTION", + MICROBIT_SIMULATOR_GESTURE_SENSOR = "MICROBIT.SIMULATOR.GESTURE", + + CLUE_SIMULATOR_TEMPERATURE_SENSOR = "CLUE.SIMULATOR.TEMPERATURE", + CLUE_SIMULATOR_LIGHT_SENSOR = "CLUE.SIMULATOR.LIGHT", + CLUE_SIMULATOR_MOTION_SENSOR = "CLUE.SIMULATOR.MOTION", + CLUE_SIMULATOR_GESTURE_SENSOR = "CLUE.SIMULATOR.GESTURE", + CLUE_SIMULATOR_PRESSURE_SENSOR = "CLUE.SIMULATOR.PRESSURE", + CLUE_SIMULATOR_PROXIMITY_SENSOR = "CLUE.SIMULATOR.PROXIMITY", + CLUE_SIMULATOR_HUMIDITY_SENSOR = "CLUE.SIMULATOR.HUMIDITY", + CLUE_SIMULATOR_GYRO_SENSOR = "CLUE.SIMULATOR.GYRO", + CLUE_SIMULATOR_MAGNET_SENSOR = "CLUE.SIMULATOR.MAGNET", + + // Pop-up dialog + CPX_CLICK_DIALOG_DONT_SHOW = "CPX.CLICK.DIALOG.DONT.SHOW", + CPX_CLICK_DIALOG_EXAMPLE_CODE = "CPX.CLICK.DIALOG.EXAMPLE.CODE", + CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CPX.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", + CPX_CLICK_DIALOG_TUTORIALS = "CPX.CLICK.DIALOG.TUTORIALS", + + CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CLUE.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", + + ERROR_PYTHON_PROCESS = "ERROR.PYTHON.PROCESS", + + CPX_ERROR_COMMAND_NEW_FILE = "CPX.ERROR.COMMAND.NEW.FILE", + CPX_ERROR_DEPLOY_WITHOUT_DEVICE = "CPX.ERROR.DEPLOY.WITHOUT.DEVICE", + CPX_ERROR_PYTHON_DEVICE_PROCESS = "CPX.ERROR.PYTHON.DEVICE.PROCESS", + CPX_SUCCESS_COMMAND_DEPLOY_DEVICE = "CPX.SUCCESS.COMMAND.DEPLOY.DEVICE", + + MICROBIT_ERROR_COMMAND_NEW_FILE = "MICROBIT.ERROR.COMMAND.NEW.FILE", + MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE = "MICROBIT.ERROR.DEPLOY.WITHOUT.DEVICE", + MICROBIT_ERROR_PYTHON_DEVICE_PROCESS = "MICROBIT.ERROR.PYTHON.DEVICE.PROCESS", + MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE = "MICROBIT.SUCCESS.COMMAND.DEPLOY.DEVICE", + + CLUE_ERROR_COMMAND_NEW_FILE = "CLUE.ERROR.COMMAND.NEW.FILE", + CLUE_ERROR_DEPLOY_WITHOUT_DEVICE = "CLUE.ERROR.DEPLOY.WITHOUT.DEVICE", + CLUE_ERROR_PYTHON_DEVICE_PROCESS = "CLUE.ERROR.PYTHON.DEVICE.PROCESS", + CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE = "CLUE.SUCCESS.COMMAND.DEPLOY.DEVICE", + + // Performance + CPX_PERFORMANCE_DEPLOY_DEVICE = "CPX.PERFORMANCE.DEPLOY.DEVICE", + CPX_PERFORMANCE_NEW_FILE = "CPX.PERFORMANCE.NEW.FILE", + CPX_PERFORMANCE_OPEN_SIMULATOR = "CPX.PERFORMANCE.OPEN.SIMULATOR", + + MICROBIT_PERFORMANCE_DEPLOY_DEVICE = "MICROBIT.PERFORMANCE.DEPLOY.DEVICE", + MICROBIT_PERFORMANCE_NEW_FILE = "MICROBIT.PERFORMANCE.NEW.FILE", + MICROBIT_PERFORMANCE_OPEN_SIMULATOR = "MICROBIT.PERFORMANCE.OPEN.SIMULATOR", + + CLUE_PERFORMANCE_DEPLOY_DEVICE = "CLUE.PERFORMANCE.DEPLOY.DEVICE", + CLUE_PERFORMANCE_NEW_FILE = "CLUE.PERFORMANCE.NEW.FILE", + CLUE_PERFORMANCE_OPEN_SIMULATOR = "CLUE.PERFORMANCE.OPEN.SIMULATOR", + + // Venv options + SETUP_VENV_CREATION_ERR = "SETUP.VENV.CREATION.ERR", + SETUP_NO_PIP = "SETUP.NO.PIP", + SETUP_DEP_INSTALL_FAIL = "SETUP.DEP.INSTALL.FAIL", + SETUP_AUTO_RESOLVE_PYTHON_PATH = "SETUP.AUTO.RESOLVE.PYTHON.PATH", + SETUP_NO_PYTHON_PATH = "SETUP.NO.PYTHON.PATH", + SETUP_DOWNLOAD_PYTHON = "SETUP.DOWNLOAD.PYTHON", + SETUP_INVALID_PYTHON_INTERPRETER_PATH = "SETUP.INVALID.PYTHON.INTERPRETER.PATH", + SETUP_INVALID_PYTHON_VER = "SETUP.INVALID.PYTHON.VER", + SETUP_INSTALL_VENV = "SETUP.INSTALL.VENV", + SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL = "SETUP.ORIGINAL.INTERPRETER.DEP.INSTALL", + SETUP_HAS_VENV = "SETUP.HAS.VENV", + SETUP_NO_DEPS_INSTALLED = "SETUP.NO.DEPS.INSTALLED", } export const DEFAULT_DEVICE = CONSTANTS.DEVICE_NAME.CPX; // tslint:disable-next-line: no-namespace export namespace DialogResponses { - export const ACCEPT_AND_RUN: MessageItem = { - title: localize("dialogResponses.agreeAndRun", "Agree and Run"), - }; - export const AGREE_AND_PROCEED: MessageItem = { - title: localize("dialogResponses.agreeAndProceed", "Agree and Proceed"), - }; - export const CANCEL: MessageItem = { - title: localize("dialogResponses.cancel", "Cancel"), - }; - export const SELECT: MessageItem = { - title: localize("dialogResponses.select", "Select"), - }; - export const HELP: MessageItem = { - title: localize("dialogResponses.help", "I need help"), - }; - export const DONT_SHOW: MessageItem = { - title: localize("dialogResponses.dontShowAgain", "Don't Show Again"), - }; - export const NO: MessageItem = { - title: localize("dialogResponses.No", "No"), - }; - export const INSTALL_NOW: MessageItem = { - title: localize("dialogResponses.installNow", "Install Now"), - }; - export const DONT_INSTALL: MessageItem = { - title: localize("dialogResponses.dontInstall", "Don't Install"), - }; - export const PRIVACY_STATEMENT: MessageItem = { - title: localize("info.privacyStatement", "Privacy Statement"), - }; - export const TUTORIALS: MessageItem = { - title: localize("dialogResponses.tutorials", "Tutorials on Adafruit"), - }; - export const EXAMPLE_CODE: MessageItem = { - title: localize( - "dialogResponses.exampleCode", - "Example Code on GitHub" - ), - }; - export const MESSAGE_UNDERSTOOD: MessageItem = { - title: localize("dialogResponses.messageUnderstood", "Got It"), - }; - export const INSTALL_PIP: MessageItem = { - title: localize( - "dialogResponses.installPip", - "Install from Pip's webpage" - ), - }; - export const INSTALL_PYTHON: MessageItem = { - title: localize( - "dialogResponses.installPython", - "Install from python.org" - ), - }; - export const YES: MessageItem = { - title: localize("dialogResponses.Yes", "Yes"), - }; - export const READ_INSTALL_MD: MessageItem = { - title: localize( - "dialogResponses.readInstall", - "Read installation docs" - ), - }; + export const ACCEPT_AND_RUN: MessageItem = { + title: localize("dialogResponses.agreeAndRun", "Agree and Run"), + }; + export const AGREE_AND_PROCEED: MessageItem = { + title: localize("dialogResponses.agreeAndProceed", "Agree and Proceed"), + }; + export const CANCEL: MessageItem = { + title: localize("dialogResponses.cancel", "Cancel"), + }; + export const SELECT: MessageItem = { + title: localize("dialogResponses.select", "Select"), + }; + export const HELP: MessageItem = { + title: localize("dialogResponses.help", "I need help"), + }; + export const DONT_SHOW: MessageItem = { + title: localize("dialogResponses.dontShowAgain", "Don't Show Again"), + }; + export const NO: MessageItem = { + title: localize("dialogResponses.No", "No"), + }; + export const INSTALL_NOW: MessageItem = { + title: localize("dialogResponses.installNow", "Install Now"), + }; + export const DONT_INSTALL: MessageItem = { + title: localize("dialogResponses.dontInstall", "Don't Install"), + }; + export const PRIVACY_STATEMENT: MessageItem = { + title: localize("info.privacyStatement", "Privacy Statement"), + }; + export const TUTORIALS: MessageItem = { + title: localize("dialogResponses.tutorials", "Tutorials on Adafruit"), + }; + export const EXAMPLE_CODE: MessageItem = { + title: localize( + "dialogResponses.exampleCode", + "Example Code on GitHub" + ), + }; + export const MESSAGE_UNDERSTOOD: MessageItem = { + title: localize("dialogResponses.messageUnderstood", "Got It"), + }; + export const INSTALL_PIP: MessageItem = { + title: localize( + "dialogResponses.installPip", + "Install from Pip's webpage" + ), + }; + export const INSTALL_PYTHON: MessageItem = { + title: localize( + "dialogResponses.installPython", + "Install from python.org" + ), + }; + export const YES: MessageItem = { + title: localize("dialogResponses.Yes", "Yes"), + }; + export const READ_INSTALL_MD: MessageItem = { + title: localize( + "dialogResponses.readInstall", + "Read installation docs" + ), + }; } export const CPX_CONFIG_FILE = path.join(".vscode", "cpx.json"); export const STATUS_BAR_PRIORITY = { - PORT: 20, - OPEN_PORT: 30, - BAUD_RATE: 40, + PORT: 20, + OPEN_PORT: 30, + BAUD_RATE: 40, }; export const VERSIONS = { - MIN_PY_VERSION: "Python 3.7.0", + MIN_PY_VERSION: "Python 3.7.0", }; export const HELPER_FILES = { - CHECK_IF_VENV_PY: "check_if_venv.py", - CHECK_PYTHON_DEPENDENCIES: "check_python_dependencies.py", - DEVICE_PY: "device.py", - PROCESS_USER_CODE_PY: "process_user_code.py", - PYTHON_EXE: "python.exe", - PYTHON: "python", + CHECK_IF_VENV_PY: "check_if_venv.py", + CHECK_PYTHON_DEPENDENCIES: "check_python_dependencies.py", + DEVICE_PY: "device.py", + PROCESS_USER_CODE_PY: "process_user_code.py", + PYTHON_EXE: "python.exe", + PYTHON: "python", }; export const GLOBAL_ENV_VARS = { - PYTHON: "python", - PYTHON3: "python3", + PYTHON: "python", + PYTHON3: "python3", }; export const LANGUAGE_VARS = { - PYTHON: { ID: "python", FILE_ENDS: ".py" }, + PYTHON: { ID: "python", FILE_ENDS: ".py" }, }; export default CONSTANTS; diff --git a/Source/cpxWorkspace.ts b/Source/cpxWorkspace.ts index cec9a6289..47239a79a 100644 --- a/Source/cpxWorkspace.ts +++ b/Source/cpxWorkspace.ts @@ -3,24 +3,24 @@ import * as path from "path"; import * as vscode from "vscode"; export class CPXWorkspace { - static get rootPath(): string | undefined { - const workspaceFolders = vscode.workspace.workspaceFolders; - if (!workspaceFolders || workspaceFolders.length === 0) { - return undefined; - } + static get rootPath(): string | undefined { + const workspaceFolders = vscode.workspace.workspaceFolders; + if (!workspaceFolders || workspaceFolders.length === 0) { + return undefined; + } - for (const workspaceFolder of workspaceFolders) { - const workspaceFolderPath = workspaceFolder.uri.fsPath; - const cpxConfigPath = path.join( - workspaceFolderPath, - ".vscode", - "cpx.json" - ); - if (fs.existsSync(cpxConfigPath)) { - return workspaceFolderPath; - } - } + for (const workspaceFolder of workspaceFolders) { + const workspaceFolderPath = workspaceFolder.uri.fsPath; + const cpxConfigPath = path.join( + workspaceFolderPath, + ".vscode", + "cpx.json" + ); + if (fs.existsSync(cpxConfigPath)) { + return workspaceFolderPath; + } + } - return workspaceFolders[0].uri.fsPath; - } + return workspaceFolders[0].uri.fsPath; + } } diff --git a/Source/debugger/debugAdapter.ts b/Source/debugger/debugAdapter.ts index 9dd7c1dfb..59a78482e 100644 --- a/Source/debugger/debugAdapter.ts +++ b/Source/debugger/debugAdapter.ts @@ -4,46 +4,46 @@ import { MessagingService } from "../service/messagingService"; import { DEBUG_COMMANDS } from "../view/constants"; export class DebugAdapter implements DebugAdapterTracker { - private readonly console: DebugConsole | undefined; - private readonly messagingService: MessagingService; - private debugCommunicationService: DebuggerCommunicationService; - constructor( - debugSession: DebugSession, - messagingService: MessagingService, - debugCommunicationService: DebuggerCommunicationService - ) { - this.console = debugSession.configuration.console; - this.messagingService = messagingService; - this.debugCommunicationService = debugCommunicationService; - } - onWillStartSession() { - // To Implement - } - onWillReceiveMessage(message: any): void { - if (message.command) { - // Only send pertinent debug messages - switch (message.command) { - case DEBUG_COMMANDS.CONTINUE: - this.messagingService.sendStartMessage(); - break; - case DEBUG_COMMANDS.STACK_TRACE: - this.messagingService.sendPauseMessage(); - break; - case DEBUG_COMMANDS.DISCONNECT: - // Triggered on stop event for debugger - if (!message.arguments.restart) { - this.debugCommunicationService.handleStopEvent(); - } - break; - } - } - } - // A debugger error should unlock the webview - onError() { - this.messagingService.sendStartMessage(); - } - // Device is always running when exiting debugging mode - onExit() { - this.messagingService.sendStartMessage(); - } + private readonly console: DebugConsole | undefined; + private readonly messagingService: MessagingService; + private debugCommunicationService: DebuggerCommunicationService; + constructor( + debugSession: DebugSession, + messagingService: MessagingService, + debugCommunicationService: DebuggerCommunicationService + ) { + this.console = debugSession.configuration.console; + this.messagingService = messagingService; + this.debugCommunicationService = debugCommunicationService; + } + onWillStartSession() { + // To Implement + } + onWillReceiveMessage(message: any): void { + if (message.command) { + // Only send pertinent debug messages + switch (message.command) { + case DEBUG_COMMANDS.CONTINUE: + this.messagingService.sendStartMessage(); + break; + case DEBUG_COMMANDS.STACK_TRACE: + this.messagingService.sendPauseMessage(); + break; + case DEBUG_COMMANDS.DISCONNECT: + // Triggered on stop event for debugger + if (!message.arguments.restart) { + this.debugCommunicationService.handleStopEvent(); + } + break; + } + } + } + // A debugger error should unlock the webview + onError() { + this.messagingService.sendStartMessage(); + } + // Device is always running when exiting debugging mode + onExit() { + this.messagingService.sendStartMessage(); + } } diff --git a/Source/debugger/debugAdapterFactory.ts b/Source/debugger/debugAdapterFactory.ts index 8bec8cfc8..5b0e2b401 100644 --- a/Source/debugger/debugAdapterFactory.ts +++ b/Source/debugger/debugAdapterFactory.ts @@ -1,33 +1,33 @@ import { - DebugAdapterTracker, - DebugAdapterTrackerFactory, - DebugSession, - ProviderResult, + DebugAdapterTracker, + DebugAdapterTrackerFactory, + DebugSession, + ProviderResult, } from "vscode"; import { DebuggerCommunicationService } from "../service/debuggerCommunicationService"; import { MessagingService } from "../service/messagingService"; import { DebugAdapter } from "./debugAdapter"; export class DebugAdapterFactory implements DebugAdapterTrackerFactory { - private debugSession: DebugSession; - private messagingService: MessagingService; - private debugCommunicationService: DebuggerCommunicationService; - constructor( - debugSession: DebugSession, - messagingService: MessagingService, - debugCommunicationService: DebuggerCommunicationService - ) { - this.debugSession = debugSession; - this.messagingService = messagingService; - this.debugCommunicationService = debugCommunicationService; - } - public createDebugAdapterTracker( - session: DebugSession - ): ProviderResult { - return new DebugAdapter( - session, - this.messagingService, - this.debugCommunicationService - ); - } + private debugSession: DebugSession; + private messagingService: MessagingService; + private debugCommunicationService: DebuggerCommunicationService; + constructor( + debugSession: DebugSession, + messagingService: MessagingService, + debugCommunicationService: DebuggerCommunicationService + ) { + this.debugSession = debugSession; + this.messagingService = messagingService; + this.debugCommunicationService = debugCommunicationService; + } + public createDebugAdapterTracker( + session: DebugSession + ): ProviderResult { + return new DebugAdapter( + session, + this.messagingService, + this.debugCommunicationService + ); + } } diff --git a/Source/debuggerCommunicationServer.ts b/Source/debuggerCommunicationServer.ts index 3deeff1c4..0fa4a65cc 100644 --- a/Source/debuggerCommunicationServer.ts +++ b/Source/debuggerCommunicationServer.ts @@ -8,134 +8,133 @@ import { SERVER_INFO } from "./constants"; import { DeviceSelectionService } from "./service/deviceSelectionService"; export const DEBUGGER_MESSAGES = { - EMITTER: { - INPUT_CHANGED: "input_changed", - RECEIVED_STATE: "received_state", - DISCONNECT: "process_disconnect", - }, - LISTENER: { - UPDATE_STATE: "updateState", - RECEIVED_STATE: "receivedState", - DISCONNECT: "disconnect", - }, + EMITTER: { + INPUT_CHANGED: "input_changed", + RECEIVED_STATE: "received_state", + DISCONNECT: "process_disconnect", + }, + LISTENER: { + UPDATE_STATE: "updateState", + RECEIVED_STATE: "receivedState", + DISCONNECT: "disconnect", + }, }; export class DebuggerCommunicationServer { - private port: number; - private serverHttp: http.Server; - private serverIo: socketio.Server; - private simulatorWebview: WebviewPanel | undefined; - private deviceSelectionService: DeviceSelectionService; - private isPendingResponse = false; - private pendingCallbacks: Function[] = []; + private port: number; + private serverHttp: http.Server; + private serverIo: socketio.Server; + private simulatorWebview: WebviewPanel | undefined; + private deviceSelectionService: DeviceSelectionService; + private isPendingResponse = false; + private pendingCallbacks: Function[] = []; - constructor( - webviewPanel: WebviewPanel | undefined, - port = SERVER_INFO.DEFAULT_SERVER_PORT, - deviceSelectionService: DeviceSelectionService - ) { - this.port = port; - this.serverHttp = new http.Server(); - this.initHttpServer(); + constructor( + webviewPanel: WebviewPanel | undefined, + port = SERVER_INFO.DEFAULT_SERVER_PORT, + deviceSelectionService: DeviceSelectionService + ) { + this.port = port; + this.serverHttp = new http.Server(); + this.initHttpServer(); - this.serverIo = socketio(this.serverHttp); - this.simulatorWebview = webviewPanel; - this.initEventsHandlers(); - console.info(`Server running on port ${this.port}`); + this.serverIo = socketio(this.serverHttp); + this.simulatorWebview = webviewPanel; + this.initEventsHandlers(); + console.info(`Server running on port ${this.port}`); - this.deviceSelectionService = deviceSelectionService; - } + this.deviceSelectionService = deviceSelectionService; + } - // send the message to start closing the connection - public closeConnection(): void { - this.sendDisconnectEvent(); - } + // send the message to start closing the connection + public closeConnection(): void { + this.sendDisconnectEvent(); + } - public setWebview(webviewPanel: WebviewPanel | undefined) { - this.simulatorWebview = webviewPanel; - } - // Events are pushed when the previous processed event is over - public emitInputChanged(newState: string): void { - if (this.isPendingResponse) { - this.pendingCallbacks.push(() => { - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, - newState - ); - }); - } else { - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, - newState - ); - this.isPendingResponse = true; - } - } - public disconnectFromPort() { - this.serverIo.close(); - this.serverHttp.close(); - } - private sendDisconnectEvent() { - this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); - } + public setWebview(webviewPanel: WebviewPanel | undefined) { + this.simulatorWebview = webviewPanel; + } + // Events are pushed when the previous processed event is over + public emitInputChanged(newState: string): void { + if (this.isPendingResponse) { + this.pendingCallbacks.push(() => { + this.serverIo.emit( + DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, + newState + ); + }); + } else { + this.serverIo.emit( + DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, + newState + ); + this.isPendingResponse = true; + } + } + public disconnectFromPort() { + this.serverIo.close(); + this.serverHttp.close(); + } + private sendDisconnectEvent() { + this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); + } - private initHttpServer(): void { - this.serverHttp.listen(this.port); - if (!this.serverHttp.listening) { - throw new Error(SERVER_INFO.ERROR_CODE_INIT_SERVER); - } - } + private initHttpServer(): void { + this.serverHttp.listen(this.port); + if (!this.serverHttp.listening) { + throw new Error(SERVER_INFO.ERROR_CODE_INIT_SERVER); + } + } - private initEventsHandlers(): void { - this.serverIo.on("connection", (socket: any) => { - socket.on(DEBUGGER_MESSAGES.LISTENER.UPDATE_STATE, (data: any) => { - this.handleState(data); - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.RECEIVED_STATE, - {} - ); - }); - socket.on(DEBUGGER_MESSAGES.LISTENER.RECEIVED_STATE, () => { - if (this.pendingCallbacks.length > 0) { - const currentCall = this.pendingCallbacks.shift(); - currentCall(); - this.isPendingResponse = true; - } else { - this.isPendingResponse = false; - } - }); + private initEventsHandlers(): void { + this.serverIo.on("connection", (socket: any) => { + socket.on(DEBUGGER_MESSAGES.LISTENER.UPDATE_STATE, (data: any) => { + this.handleState(data); + this.serverIo.emit( + DEBUGGER_MESSAGES.EMITTER.RECEIVED_STATE, + {} + ); + }); + socket.on(DEBUGGER_MESSAGES.LISTENER.RECEIVED_STATE, () => { + if (this.pendingCallbacks.length > 0) { + const currentCall = this.pendingCallbacks.shift(); + currentCall(); + this.isPendingResponse = true; + } else { + this.isPendingResponse = false; + } + }); - socket.on(DEBUGGER_MESSAGES.LISTENER.DISCONNECT, () => { - this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); - if (this.simulatorWebview) { - this.simulatorWebview.webview.postMessage({ - command: "reset-state", - }); - } - }); - }); - } + socket.on(DEBUGGER_MESSAGES.LISTENER.DISCONNECT, () => { + this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); + if (this.simulatorWebview) { + this.simulatorWebview.webview.postMessage({ + command: "reset-state", + }); + } + }); + }); + } - private handleState(data: any): void { - try { - const messageToWebview = JSON.parse(data); - if (messageToWebview.type === "state") { - const messageState = JSON.parse(messageToWebview.data); - if ( - this.simulatorWebview && - messageState.device_name === - this.deviceSelectionService.getCurrentActiveDevice() - ) { - this.simulatorWebview.webview.postMessage({ - active_device: - this.deviceSelectionService.getCurrentActiveDevice(), - command: "set-state", - state: messageState, - }); - } - } - } catch (err) { - console.error(`Error: Non-JSON output from the process : ${data}`); - } - } + private handleState(data: any): void { + try { + const messageToWebview = JSON.parse(data); + if (messageToWebview.type === "state") { + const messageState = JSON.parse(messageToWebview.data); + if ( + this.simulatorWebview && + messageState.device_name === + this.deviceSelectionService.getCurrentActiveDevice() + ) { + this.simulatorWebview.webview.postMessage({ + active_device: this.deviceSelectionService.getCurrentActiveDevice(), + command: "set-state", + state: messageState, + }); + } + } + } catch (err) { + console.error(`Error: Non-JSON output from the process : ${data}`); + } + } } diff --git a/Source/dev-requirements.txt b/Source/dev-requirements.txt index 6b117ff69..26f334b51 100644 --- a/Source/dev-requirements.txt +++ b/Source/dev-requirements.txt @@ -1,3 +1,3 @@ -r ./requirements.txt black==19.10b0 -pytest==5.0.1 +pytest==5.0.1 \ No newline at end of file diff --git a/Source/deviceContext.ts b/Source/deviceContext.ts index 9144ef23b..a4f0afd2e 100644 --- a/Source/deviceContext.ts +++ b/Source/deviceContext.ts @@ -11,141 +11,141 @@ import { CPXWorkspace } from "./cpxWorkspace"; import * as utils from "./extension_utils/utils"; export class DeviceContext implements vscode.Disposable { - public static getInstance(): DeviceContext { - return DeviceContext._deviceContext; - } - - private static _deviceContext: DeviceContext = new DeviceContext(); - - private _onDidChange = new vscode.EventEmitter(); - private _watcher: vscode.FileSystemWatcher; - private _vscodeWatcher: vscode.FileSystemWatcher; - private _port!: string; - - private constructor() { - if (vscode.workspace && CPXWorkspace.rootPath) { - this._watcher = vscode.workspace.createFileSystemWatcher( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ); - this._vscodeWatcher = vscode.workspace.createFileSystemWatcher( - path.join(CPXWorkspace.rootPath, ".vscode"), - true, - true, - false - ); - - // Reloads the config into the code if the cpx config file has changed - this._watcher.onDidCreate(() => this.loadContext()); - this._watcher.onDidChange(() => this.loadContext()); - this._watcher.onDidDelete(() => this.loadContext()); - - this._vscodeWatcher.onDidDelete(() => this.loadContext()); - } - } - - public loadContext(): Thenable { - return vscode.workspace.findFiles(CPX_CONFIG_FILE, null, 1).then( - (files) => { - let cpxConfigJson: any = {}; - if (files && files.length > 0) { - const configFile = files[0]; - cpxConfigJson = utils.tryParseJSON( - fs.readFileSync(configFile.fsPath, "utf8") - ); - if (cpxConfigJson) { - this._port = cpxConfigJson.port; - this._onDidChange.fire(); - } else { - console.error(CONSTANTS.ERROR.CPX_FILE_ERROR); - } - } else { - this._port = null; - this._onDidChange.fire(); - } - return this; - }, - (reason) => { - this._port = null; - this._onDidChange.fire(); - return this; - } - ); - } - - public saveContext() { - if (!CPXWorkspace.rootPath) { - return; - } - const cpxConfigFile = path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE); - let cpxConfigJson: any = {}; - if (utils.fileExistsSync(cpxConfigFile)) { - cpxConfigJson = utils.tryParseJSON( - fs.readFileSync(cpxConfigFile, "utf8") - ); - } - if (!cpxConfigJson) { - // log and notify user error - return; - } - cpxConfigJson.port = this.port; - - utils.mkdirRecursivelySync(path.dirname(cpxConfigFile)); - fs.writeFileSync( - cpxConfigFile, - JSON.stringify( - cpxConfigJson, - (key, value) => { - if (value === null) { - return undefined; - } - return value; - }, - 4 - ) - ); - } - - public dispose() { - if (this._watcher) { - this._watcher.dispose(); - } - - if (this._vscodeWatcher) { - this._vscodeWatcher.dispose(); - } - } - - public async initialize() { - if ( - CPXWorkspace.rootPath && - utils.fileExistsSync( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ) - ) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.CPX_JSON_ALREADY_GENERATED - ); - return; - } else { - if (!CPXWorkspace.rootPath) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.PLEASE_OPEN_FOLDER - ); - return; - } - } - } - - public get onDidChange(): vscode.Event { - return this._onDidChange.event; - } - - public get port() { - return this._port; - } - - public set port(value: string) { - this._port = value; - this.saveContext(); - } + public static getInstance(): DeviceContext { + return DeviceContext._deviceContext; + } + + private static _deviceContext: DeviceContext = new DeviceContext(); + + private _onDidChange = new vscode.EventEmitter(); + private _watcher: vscode.FileSystemWatcher; + private _vscodeWatcher: vscode.FileSystemWatcher; + private _port!: string; + + private constructor() { + if (vscode.workspace && CPXWorkspace.rootPath) { + this._watcher = vscode.workspace.createFileSystemWatcher( + path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) + ); + this._vscodeWatcher = vscode.workspace.createFileSystemWatcher( + path.join(CPXWorkspace.rootPath, ".vscode"), + true, + true, + false + ); + + // Reloads the config into the code if the cpx config file has changed + this._watcher.onDidCreate(() => this.loadContext()); + this._watcher.onDidChange(() => this.loadContext()); + this._watcher.onDidDelete(() => this.loadContext()); + + this._vscodeWatcher.onDidDelete(() => this.loadContext()); + } + } + + public loadContext(): Thenable { + return vscode.workspace.findFiles(CPX_CONFIG_FILE, null, 1).then( + files => { + let cpxConfigJson: any = {}; + if (files && files.length > 0) { + const configFile = files[0]; + cpxConfigJson = utils.tryParseJSON( + fs.readFileSync(configFile.fsPath, "utf8") + ); + if (cpxConfigJson) { + this._port = cpxConfigJson.port; + this._onDidChange.fire(); + } else { + console.error(CONSTANTS.ERROR.CPX_FILE_ERROR); + } + } else { + this._port = null; + this._onDidChange.fire(); + } + return this; + }, + reason => { + this._port = null; + this._onDidChange.fire(); + return this; + } + ); + } + + public saveContext() { + if (!CPXWorkspace.rootPath) { + return; + } + const cpxConfigFile = path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE); + let cpxConfigJson: any = {}; + if (utils.fileExistsSync(cpxConfigFile)) { + cpxConfigJson = utils.tryParseJSON( + fs.readFileSync(cpxConfigFile, "utf8") + ); + } + if (!cpxConfigJson) { + // log and notify user error + return; + } + cpxConfigJson.port = this.port; + + utils.mkdirRecursivelySync(path.dirname(cpxConfigFile)); + fs.writeFileSync( + cpxConfigFile, + JSON.stringify( + cpxConfigJson, + (key, value) => { + if (value === null) { + return undefined; + } + return value; + }, + 4 + ) + ); + } + + public dispose() { + if (this._watcher) { + this._watcher.dispose(); + } + + if (this._vscodeWatcher) { + this._vscodeWatcher.dispose(); + } + } + + public async initialize() { + if ( + CPXWorkspace.rootPath && + utils.fileExistsSync( + path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) + ) + ) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.CPX_JSON_ALREADY_GENERATED + ); + return; + } else { + if (!CPXWorkspace.rootPath) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.PLEASE_OPEN_FOLDER + ); + return; + } + } + } + + public get onDidChange(): vscode.Event { + return this._onDidChange.event; + } + + public get port() { + return this._port; + } + + public set port(value: string) { + this._port = value; + this.saveContext(); + } } diff --git a/Source/extension.ts b/Source/extension.ts index d73a05b05..5940217dc 100644 --- a/Source/extension.ts +++ b/Source/extension.ts @@ -7,15 +7,15 @@ import * as open from "open"; import * as path from "path"; import * as vscode from "vscode"; import { - CONFIG, - CONSTANTS, - CPX_CONFIG_FILE, - DialogResponses, - GLOBAL_ENV_VARS, - HELPER_FILES, - LANGUAGE_VARS, - SERVER_INFO, - TelemetryEventName, + CONFIG, + CONSTANTS, + CPX_CONFIG_FILE, + DialogResponses, + GLOBAL_ENV_VARS, + HELPER_FILES, + LANGUAGE_VARS, + SERVER_INFO, + TelemetryEventName, } from "./constants"; import { CPXWorkspace } from "./cpxWorkspace"; import { DebugAdapterFactory } from "./debugger/debugAdapterFactory"; @@ -35,9 +35,9 @@ import getPackageInfo from "./telemetry/getPackageInfo"; import TelemetryAI from "./telemetry/telemetryAI"; import { UsbDetector } from "./usbDetector"; import { - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, - WEBVIEW_TYPES, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_MESSAGES, + WEBVIEW_TYPES, } from "./view/constants"; let telemetryAI: TelemetryAI; @@ -59,1055 +59,1043 @@ let pythonProcessDataBuffer: string[]; export let outChannel: vscode.OutputChannel | undefined; const sendCurrentDeviceMessage = (currentPanel: vscode.WebviewPanel) => { - if (currentPanel) { - currentPanel.webview.postMessage({ - command: VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE, - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } + if (currentPanel) { + currentPanel.webview.postMessage({ + command: VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE, + active_device: deviceSelectionService.getCurrentActiveDevice(), + }); + } }; // Extension activation export async function activate(context: vscode.ExtensionContext) { - telemetryAI = new TelemetryAI(context); - setupService = new SetupService(telemetryAI); - let currentPanel: vscode.WebviewPanel | undefined; - let childProcess: cp.ChildProcess | undefined; - let messageListener: vscode.Disposable; - let activeEditorListener: vscode.Disposable; - const webviewService = new WebviewService(context, deviceSelectionService); - const telemetryHandlerService = new TelemetryHandlerService( - telemetryAI, - deviceSelectionService - ); - const formalNameToNickNameMapping = { - [CONSTANTS.DEVICE_NAME_FORMAL.CPX]: CONSTANTS.DEVICE_NAME.CPX, - [CONSTANTS.DEVICE_NAME_FORMAL.MICROBIT]: CONSTANTS.DEVICE_NAME.MICROBIT, - [CONSTANTS.DEVICE_NAME_FORMAL.CLUE]: CONSTANTS.DEVICE_NAME.CLUE, - }; - - // Add our library path to settings.json for autocomplete functionality - updatePythonExtraPaths(); - - // ignore import errors so that adafruit_circuitplayground library - // doesn't trigger lint errors - updatePylintArgs(context); - - pythonExecutablePath = await setupService.setupEnv(context); - - try { - utils.generateCPXConfig(); - configFileCreated = true; - } catch (err) { - console.info("Failed to create the CPX config file."); - configFileCreated = false; - } - - if (pythonExecutablePath === "") { - return; - } - - if (outChannel === undefined) { - outChannel = vscode.window.createOutputChannel(CONSTANTS.NAME); - utils.logToOutputChannel(outChannel, CONSTANTS.INFO.WELCOME_OUTPUT_TAB); - } - - vscode.workspace.onDidSaveTextDocument( - async (document: vscode.TextDocument) => { - await fileSelectionService.updateCurrentFileFromTextFile(document); - } - ); - - const currVersionReleaseName = - "release_note_" + getPackageInfo(context).extensionVersion; - const viewedReleaseNote = context.globalState.get( - currVersionReleaseName, - false - ); - - if (!viewedReleaseNote) { - PopupService.openReleaseNote(); - context.globalState.update(currVersionReleaseName, true); - } - - const openWebview = () => { - if (currentPanel && currentPanel.webview) { - messagingService.setWebview(currentPanel.webview); - currentPanel.webview.html = webviewService.getWebviewContent( - WEBVIEW_TYPES.SIMULATOR, - true, - currentPanel - ); - currentPanel.reveal(vscode.ViewColumn.Beside); - } else { - currentPanel = vscode.window.createWebviewPanel( - CONSTANTS.WEBVIEW_TYPE.SIMULATOR, - CONSTANTS.LABEL.WEBVIEW_PANEL, - { preserveFocus: true, viewColumn: vscode.ViewColumn.Beside }, - { - // Only allow the webview to access resources in our extension's media directory - localResourceRoots: [ - vscode.Uri.file( - path.join( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY - ) - ), - ], - enableScripts: true, - } - ); - - currentPanel.webview.html = webviewService.getWebviewContent( - WEBVIEW_TYPES.SIMULATOR, - true, - currentPanel - ); - messagingService.setWebview(currentPanel.webview); - - if (messageListener !== undefined) { - messageListener.dispose(); - const index = context.subscriptions.indexOf(messageListener); - if (index > -1) { - context.subscriptions.splice(index, 1); - } - } - - if (activeEditorListener !== undefined) { - activeEditorListener.dispose(); - const index = - context.subscriptions.indexOf(activeEditorListener); - if (index > -1) { - context.subscriptions.splice(index, 1); - } - } - - if (currentPanel) { - // Handle messages from webview - messageListener = currentPanel.webview.onDidReceiveMessage( - (message) => { - const messageJson = JSON.stringify({ - active_device: - deviceSelectionService.getCurrentActiveDevice(), - state: message.text, - }); - switch (message.command) { - case WEBVIEW_MESSAGES.BUTTON_PRESS: - // Send input to the Python process - telemetryHandlerService.handleButtonPressTelemetry( - message.text - ); - console.log(`About to write ${messageJson} \n`); - if ( - inDebugMode && - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .emitInputChanged(messageJson); - } else if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - break; - case WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP: - console.log(`Play button ${messageJson} \n`); - if (message.text.state as boolean) { - fileSelectionService.setPathAndSendMessage( - message.text.selected_file - ); - fileSelectionService.findCurrentTextDocument(); - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_RUN_SIMULATOR_BUTTON - ); - runSimulatorCommand(); - } else { - killProcessIfRunning(); - } - - if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - - break; - case WEBVIEW_MESSAGES.GESTURE: - case WEBVIEW_MESSAGES.SENSOR_CHANGED: - telemetryHandlerService.handleGestureTelemetry( - message.text - ); - console.log(`Sensor changed ${messageJson} \n`); - if ( - inDebugMode && - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .emitInputChanged(messageJson); - } else if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - break; - case WEBVIEW_MESSAGES.REFRESH_SIMULATOR: - console.log("Refresh button"); - runSimulatorCommand(); - break; - case WEBVIEW_MESSAGES.SLIDER_TELEMETRY: - telemetryHandlerService.handleSensorTelemetry( - message.text - ); - break; - case WEBVIEW_MESSAGES.SWITCH_DEVICE: - deviceSelectionService.setCurrentActiveDevice( - message.text.active_device - ); - killProcessIfRunning(); - break; - default: - vscode.window.showInformationMessage( - CONSTANTS.ERROR.UNEXPECTED_MESSAGE - ); - break; - } - }, - undefined, - context.subscriptions - ); - - activeEditorListener = utils.addVisibleTextEditorCallback( - currentPanel, - context - ); - } - - currentPanel.onDidDispose( - () => { - currentPanel = undefined; - if ( - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .setWebview(undefined); - } - killProcessIfRunning(); - if (firstTimeClosed) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.FIRST_TIME_WEBVIEW - ); - firstTimeClosed = false; - } - }, - undefined, - context.subscriptions - ); - } - sendCurrentDeviceMessage(currentPanel); - }; - - // Open Simulator on the webview - const openSimulator: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.openSimulator", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_SIMULATE_TO, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - deviceSelectionService.setCurrentActiveDevice(device); - const telemetryEvents = - telemetryHandlerService.getTelemetryEventsForOpenSimulator( - device - ); - telemetryAI.trackFeatureUsage( - telemetryEvents.openSimulatorTelemetryEvent - ); - telemetryAI.runWithLatencyMeasure( - openWebview, - telemetryEvents.openSimulatorPerformanceTelemetryEvent - ); - } - ); - - const gettingStartedOpen: vscode.Disposable = - vscode.commands.registerCommand( - "deviceSimulatorExpress.common.gettingStarted", - () => { - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_GETTING_STARTED - ); - webviewService.openTutorialPanel(); - } - ); - - const openTemplateFile = (template: string) => { - const fileName = template; - const filePath = - __dirname + path.sep + "templates" + path.sep + fileName; - const file = fs.readFileSync(filePath, "utf8"); - const showNewFilePopup: boolean = vscode.workspace - .getConfiguration() - .get(CONFIG.SHOW_NEW_FILE_POPUP); - - if (showNewFilePopup && template === CONSTANTS.TEMPLATE.CPX) { - vscode.window - .showInformationMessage( - CONSTANTS.INFO.NEW_FILE, - DialogResponses.DONT_SHOW, - DialogResponses.EXAMPLE_CODE, - DialogResponses.TUTORIALS - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.DONT_SHOW) { - vscode.workspace - .getConfiguration() - .update(CONFIG.SHOW_NEW_FILE_POPUP, false); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_DONT_SHOW - ); - } else if (selection === DialogResponses.EXAMPLE_CODE) { - open(CONSTANTS.LINKS.EXAMPLE_CODE); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_EXAMPLE_CODE - ); - } else if (selection === DialogResponses.TUTORIALS) { - const okAction = () => { - open(CONSTANTS.LINKS.TUTORIALS); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_TUTORIALS - ); - }; - utils.showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT - ); - } - }); - } - - // tslint:disable-next-line: ban-comma-operator - vscode.workspace - .openTextDocument({ - content: file, - language: LANGUAGE_VARS.PYTHON.ID, - }) - .then((template: vscode.TextDocument) => { - vscode.window.showTextDocument(template, 1, false).then(() => { - openWebview(); - }); - }), - // tslint:disable-next-line: no-unused-expression - (error: any) => { - telemetryHandlerService.handleNewFileErrorTelemetry(); - console.error(`Failed to open a new text document: ${error}`); - }; - }; - - const newFile: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.newFile", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_FOR_NEW_FILE, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - deviceSelectionService.setCurrentActiveDevice(device); - - const deviceToTemplateMapping = { - [CONSTANTS.DEVICE_NAME.CPX]: CONSTANTS.TEMPLATE.CPX, - [CONSTANTS.DEVICE_NAME.MICROBIT]: CONSTANTS.TEMPLATE.MICROBIT, - [CONSTANTS.DEVICE_NAME.CLUE]: CONSTANTS.TEMPLATE.CLUE, - }; - const templateFile = deviceToTemplateMapping[device]; - - const telemetryEvents = - telemetryHandlerService.getTelemetryEventsForNewFile(device); - - telemetryAI.trackFeatureUsage( - telemetryEvents.newFileTelemetryEvent - ); - telemetryAI.runWithLatencyMeasure( - () => openTemplateFile(templateFile), - telemetryEvents.newFilePerformanceTelemetryEvent - ); - } - ); - - const installDependencies: vscode.Disposable = - vscode.commands.registerCommand( - "deviceSimulatorExpress.common.installDependencies", - async () => { - pythonExecutablePath = await setupService.setupEnv( - context, - true - ); - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_INSTALL_EXTENSION_DEPENDENCIES - ); - } - ); - - const killProcessIfRunning = () => { - if (childProcess !== undefined) { - if (currentPanel) { - currentPanel.webview.postMessage({ - command: "reset-state", - active_device: - deviceSelectionService.getCurrentActiveDevice(), - }); - } - // TODO: We need to check the process was correctly killed - childProcess.kill(); - childProcess = undefined; - } - }; - - const runSimulatorCommand = async () => { - pythonProcessDataBuffer = []; - // Prevent running new code if a debug session is active - if (inDebugMode) { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.DEBUGGING_SESSION_IN_PROGESS - ); - return; - } - if (shouldShowRunCodePopup) { - const shouldExitCommand = await vscode.window - .showWarningMessage( - CONSTANTS.WARNING.ACCEPT_AND_RUN, - DialogResponses.ACCEPT_AND_RUN, - DialogResponses.CANCEL - ) - .then((selection: vscode.MessageItem | undefined) => { - let hasAccepted = true; - if (selection === DialogResponses.ACCEPT_AND_RUN) { - shouldShowRunCodePopup = false; - hasAccepted = false; - } - return hasAccepted; - }); - // Don't run users code if they don't accept - if (shouldExitCommand) { - return; - } - } - - openWebview(); - - if (!currentPanel) { - return; - } - - console.info(CONSTANTS.INFO.RUNNING_CODE); - - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_SIMULATOR, - true - ); - - killProcessIfRunning(); - - await fileSelectionService.updateCurrentFileFromEditor( - vscode.window.activeTextEditor - ); - - if (fileSelectionService.getCurrentFileAbsPath() === "") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_RUN, - true - ); - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FILE_TO_RUN, - DialogResponses.MESSAGE_UNDERSTOOD - ); - } else { - // Save on run - await fileSelectionService.getCurrentTextDocument().save(); - - if ( - !fileSelectionService - .getCurrentTextDocument() - .fileName.endsWith(LANGUAGE_VARS.PYTHON.FILE_ENDS) - ) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_RUN, - true - ); - return; - } - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.FILE_SELECTED( - fileSelectionService.getCurrentFileAbsPath() - ) - ); - - // Activate the run webview button - currentPanel.webview.postMessage({ - command: "activate-play", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - const args = [ - utils.getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.PROCESS_USER_CODE_PY - ), - fileSelectionService.getCurrentFileAbsPath(), - JSON.stringify({ enable_telemetry: utils.getTelemetryState() }), - ]; - childProcess = cp.spawn(pythonExecutablePath, args); - - let dataFromTheProcess = ""; - let oldMessage = ""; - - // Data received from Python process - childProcess.stdout.on("data", (data) => { - dataFromTheProcess = data.toString(); - if (currentPanel) { - // NOTE: parts of the flow regarding pythonProcessDataBuffer - // are needed for the CLUE simulator to properly receive - // base_64 strings on UNIX systems. - - // added any incomplete data to beginning - const processedData = pythonProcessDataBuffer - .join("") - .concat(dataFromTheProcess); - pythonProcessDataBuffer = []; - - // Process the data from the process and send one state at a time - processedData.split("\0").forEach((message) => { - if ( - currentPanel && - message.length > 0 && - message !== oldMessage - ) { - oldMessage = message; - let messageToWebview; - // Check the message is a JSON - try { - messageToWebview = JSON.parse(message); - // Check the JSON is a state - switch (messageToWebview.type) { - case "state": - const messageData = JSON.parse( - messageToWebview.data - ); - if ( - messageData.device_name === - deviceSelectionService.getCurrentActiveDevice() - ) { - messagingService.sendMessageToWebview( - VSCODE_MESSAGES_TO_WEBVIEW.SET_STATE, - messageData - ); - } - break; - - case "print": - console.log( - `Process print statement output = ${messageToWebview.data}` - ); - utils.logToOutputChannel( - outChannel, - `[PRINT] ${messageToWebview.data}` - ); - break; - - default: - console.log( - `Non-state JSON output from the process : ${messageToWebview}` - ); - break; - } - } catch (err) { - if (err instanceof SyntaxError) { - // if not a JSON string, it is incomplete - // add to beginning of next strings - pythonProcessDataBuffer.push(message); - } else { - console.log( - `Errored output: ${messageToWebview}` - ); - } - } - } - }); - } - }); - - // Std error output - childProcess.stderr.on("data", (data) => { - console.error( - `Error from the Python process through stderr: ${data}` - ); - telemetryAI.trackFeatureUsage( - TelemetryEventName.ERROR_PYTHON_PROCESS - ); - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.STDERR(data), - true - ); - if (currentPanel) { - currentPanel.webview.postMessage({ - active_device: - deviceSelectionService.getCurrentActiveDevice(), - command: "reset-state", - }); - } - }); - - // When the process is done - childProcess.on("end", (code: number) => { - console.info(`Command execution exited with code: ${code}`); - }); - } - }; - - // Send message to the webview - const runSimulator: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.runSimulator", - () => { - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_RUN_PALETTE - ); - runSimulatorCommand(); - } - ); - - const deployCode = async (device: string) => { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_DEVICE, - true - ); - - await fileSelectionService.updateCurrentFileFromEditor( - vscode.window.activeTextEditor - ); - - if (fileSelectionService.getCurrentFileAbsPath() === "") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, - true - ); - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, - DialogResponses.MESSAGE_UNDERSTOOD - ); - } else { - await fileSelectionService.getCurrentTextDocument().save(); - - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.FILE_SELECTED( - fileSelectionService.getCurrentFileAbsPath() - ) - ); - - const deviceProcess = cp.spawn(pythonExecutablePath, [ - utils.getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.DEVICE_PY - ), - device, - fileSelectionService.getCurrentFileAbsPath(), - ]); - - let dataFromTheProcess = ""; - - // Data received from Python process - deviceProcess.stdout.on("data", (data) => { - dataFromTheProcess = data.toString(); - - let messageToWebview; - try { - messageToWebview = JSON.parse(dataFromTheProcess); - if (messageToWebview.type === "complete") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_SUCCESS, - true - ); - } - telemetryHandlerService.handleDeployToDeviceFinishedTelemetry( - messageToWebview, - device - ); - } catch (err) { - console.log( - `Non-JSON output from the process : ${dataFromTheProcess}` - ); - } - }); - - // Std error output - deviceProcess.stderr.on("data", (data) => { - telemetryHandlerService.handleDeployToDeviceErrorTelemetry( - data, - device - ); - console.error( - `Error from the Python device process through stderr: ${data}` - ); - utils.logToOutputChannel( - outChannel, - `[ERROR] ${data} \n`, - true - ); - }); - - // When the process is done - deviceProcess.on("end", (code: number) => { - console.info(`Command execution exited with code: ${code}`); - }); - } - }; - - const deployToDevice: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.deployToDevice", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_DEPLOY_TO, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - - const telemetryEvents = - telemetryHandlerService.getTelemetryEventsForStartingDeployToDevice( - device - ); - - telemetryAI.trackFeatureUsage(telemetryEvents.deployTelemetryEvent); - telemetryAI.runWithLatencyMeasure(() => { - deployCode(device); - }, telemetryEvents.deployPerformanceTelemetryEvent); - } - ); - - let serialMonitor: SerialMonitor | undefined; - if (configFileCreated) { - serialMonitor = SerialMonitor.getInstance(); - context.subscriptions.push(serialMonitor); - } - - const selectSerialPort: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.selectSerialPort", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.selectSerialPort(null, null); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CHOOSE_PORT); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const openSerialMonitor: vscode.Disposable = - vscode.commands.registerCommand( - "deviceSimulatorExpress.common.openSerialMonitor", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure( - serialMonitor.openSerialMonitor.bind(serialMonitor), - TelemetryEventName.COMMAND_SERIAL_MONITOR_OPEN - ); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const changeBaudRate: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.changeBaudRate", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure( - serialMonitor.changeBaudRate.bind(serialMonitor), - TelemetryEventName.COMMAND_SERIAL_MONITOR_BAUD_RATE - ); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const closeSerialMonitor: vscode.Disposable = - vscode.commands.registerCommand( - "deviceSimulatorExpress.common.closeSerialMonitor", - (port, showWarning = true) => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.closeSerialMonitor(port, showWarning); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const showReleaseNote = vscode.commands.registerCommand( - "deviceSimulatorExpress.", - (port, showWarning = true) => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.closeSerialMonitor(port, showWarning); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - UsbDetector.getInstance().initialize(context.extensionPath); - UsbDetector.getInstance().startListening(); - - if ( - CPXWorkspace.rootPath && - (utils.fileExistsSync( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ) || - vscode.window.activeTextEditor) - ) { - (() => { - if (!SerialMonitor.getInstance().initialized) { - SerialMonitor.getInstance().initialize(); - } - })(); - } - - // Debugger configuration - const simulatorDebugConfiguration = new SimulatorDebugConfigurationProvider( - utils.getPathToScript(context, "out/", "debug_user_code.py") - ); - - const debugAdapterFactory = new DebugAdapterFactory( - vscode.debug.activeDebugSession, - messagingService, - debuggerCommunicationService - ); - vscode.debug.registerDebugAdapterTrackerFactory( - LANGUAGE_VARS.PYTHON.ID, - debugAdapterFactory - ); - // On Debug Session Start: Init comunication - const debugSessionsStarted = vscode.debug.onDidStartDebugSession(() => { - if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { - // Reinitialize process - killProcessIfRunning(); - inDebugMode = true; - - try { - // Shut down existing server on debug restart - if (debuggerCommunicationService.getCurrentDebuggerServer()) { - debuggerCommunicationService.resetCurrentDebuggerServer(); - } - - debuggerCommunicationService.setCurrentDebuggerServer( - new DebuggerCommunicationServer( - currentPanel, - utils.getServerPortConfig(), - deviceSelectionService - ) - ); - - telemetryHandlerService.handleDebuggerTelemetry(); - - openWebview(); - if (currentPanel) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .setWebview(currentPanel); - currentPanel.webview.postMessage({ - active_device: - deviceSelectionService.getCurrentActiveDevice(), - command: "activate-play", - }); - } - } catch (err) { - if (err.message === SERVER_INFO.ERROR_CODE_INIT_SERVER) { - console.error( - `Error trying to init the server on port ${utils.getServerPortConfig()}` - ); - - telemetryHandlerService.handleDebuggerFailTelemetry(); - - vscode.window.showErrorMessage( - CONSTANTS.ERROR.DEBUGGER_SERVER_INIT_FAILED( - utils.getServerPortConfig() - ) - ); - } - } - } - }); - - // On Debug Session Stop: Stop communiation - const debugSessionStopped = vscode.debug.onDidTerminateDebugSession(() => { - if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { - inDebugMode = false; - simulatorDebugConfiguration.deviceSimulatorExpressDebug = false; - if (debuggerCommunicationService.getCurrentDebuggerServer()) { - debuggerCommunicationService.resetCurrentDebuggerServer(); - } - if (currentPanel) { - currentPanel.webview.postMessage({ - command: "reset-state", - active_device: - deviceSelectionService.getCurrentActiveDevice(), - }); - } - } - }); - - const configsChanged = vscode.workspace.onDidChangeConfiguration( - async () => { - if (utils.checkConfig(CONFIG.CONFIG_ENV_ON_SWITCH)) { - pythonExecutablePath = await setupService.setupEnv(context); - } - } - ); - - context.subscriptions.push( - installDependencies, - runSimulator, - changeBaudRate, - closeSerialMonitor, - deployToDevice, - newFile, - openSimulator, - openSerialMonitor, - selectSerialPort, - gettingStartedOpen, - vscode.debug.registerDebugConfigurationProvider( - CONSTANTS.DEBUG_CONFIGURATION_TYPE, - simulatorDebugConfiguration - ), - debugSessionsStarted, - debugSessionStopped, - configsChanged - ); + telemetryAI = new TelemetryAI(context); + setupService = new SetupService(telemetryAI); + let currentPanel: vscode.WebviewPanel | undefined; + let childProcess: cp.ChildProcess | undefined; + let messageListener: vscode.Disposable; + let activeEditorListener: vscode.Disposable; + const webviewService = new WebviewService(context, deviceSelectionService); + const telemetryHandlerService = new TelemetryHandlerService( + telemetryAI, + deviceSelectionService + ); + const formalNameToNickNameMapping = { + [CONSTANTS.DEVICE_NAME_FORMAL.CPX]: CONSTANTS.DEVICE_NAME.CPX, + [CONSTANTS.DEVICE_NAME_FORMAL.MICROBIT]: CONSTANTS.DEVICE_NAME.MICROBIT, + [CONSTANTS.DEVICE_NAME_FORMAL.CLUE]: CONSTANTS.DEVICE_NAME.CLUE, + }; + + // Add our library path to settings.json for autocomplete functionality + updatePythonExtraPaths(); + + // ignore import errors so that adafruit_circuitplayground library + // doesn't trigger lint errors + updatePylintArgs(context); + + pythonExecutablePath = await setupService.setupEnv(context); + + try { + utils.generateCPXConfig(); + configFileCreated = true; + } catch (err) { + console.info("Failed to create the CPX config file."); + configFileCreated = false; + } + + if (pythonExecutablePath === "") { + return; + } + + if (outChannel === undefined) { + outChannel = vscode.window.createOutputChannel(CONSTANTS.NAME); + utils.logToOutputChannel(outChannel, CONSTANTS.INFO.WELCOME_OUTPUT_TAB); + } + + vscode.workspace.onDidSaveTextDocument( + async (document: vscode.TextDocument) => { + await fileSelectionService.updateCurrentFileFromTextFile(document); + } + ); + + const currVersionReleaseName = + "release_note_" + getPackageInfo(context).extensionVersion; + const viewedReleaseNote = context.globalState.get( + currVersionReleaseName, + false + ); + + if (!viewedReleaseNote) { + PopupService.openReleaseNote(); + context.globalState.update(currVersionReleaseName, true); + } + + const openWebview = () => { + if (currentPanel && currentPanel.webview) { + messagingService.setWebview(currentPanel.webview); + currentPanel.webview.html = webviewService.getWebviewContent( + WEBVIEW_TYPES.SIMULATOR, + true, + currentPanel + ); + currentPanel.reveal(vscode.ViewColumn.Beside); + } else { + currentPanel = vscode.window.createWebviewPanel( + CONSTANTS.WEBVIEW_TYPE.SIMULATOR, + CONSTANTS.LABEL.WEBVIEW_PANEL, + { preserveFocus: true, viewColumn: vscode.ViewColumn.Beside }, + { + // Only allow the webview to access resources in our extension's media directory + localResourceRoots: [ + vscode.Uri.file( + path.join( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY + ) + ), + ], + enableScripts: true, + } + ); + + currentPanel.webview.html = webviewService.getWebviewContent( + WEBVIEW_TYPES.SIMULATOR, + true, + currentPanel + ); + messagingService.setWebview(currentPanel.webview); + + if (messageListener !== undefined) { + messageListener.dispose(); + const index = context.subscriptions.indexOf(messageListener); + if (index > -1) { + context.subscriptions.splice(index, 1); + } + } + + if (activeEditorListener !== undefined) { + activeEditorListener.dispose(); + const index = context.subscriptions.indexOf( + activeEditorListener + ); + if (index > -1) { + context.subscriptions.splice(index, 1); + } + } + + if (currentPanel) { + // Handle messages from webview + messageListener = currentPanel.webview.onDidReceiveMessage( + message => { + const messageJson = JSON.stringify({ + active_device: deviceSelectionService.getCurrentActiveDevice(), + state: message.text, + }); + switch (message.command) { + case WEBVIEW_MESSAGES.BUTTON_PRESS: + // Send input to the Python process + telemetryHandlerService.handleButtonPressTelemetry( + message.text + ); + console.log(`About to write ${messageJson} \n`); + if ( + inDebugMode && + debuggerCommunicationService.getCurrentDebuggerServer() + ) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .emitInputChanged(messageJson); + } else if (childProcess) { + childProcess.stdin.write( + messageJson + "\n" + ); + } + break; + case WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP: + console.log(`Play button ${messageJson} \n`); + if (message.text.state as boolean) { + fileSelectionService.setPathAndSendMessage( + message.text.selected_file + ); + fileSelectionService.findCurrentTextDocument(); + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_RUN_SIMULATOR_BUTTON + ); + runSimulatorCommand(); + } else { + killProcessIfRunning(); + } + + if (childProcess) { + childProcess.stdin.write( + messageJson + "\n" + ); + } + + break; + case WEBVIEW_MESSAGES.GESTURE: + case WEBVIEW_MESSAGES.SENSOR_CHANGED: + telemetryHandlerService.handleGestureTelemetry( + message.text + ); + console.log(`Sensor changed ${messageJson} \n`); + if ( + inDebugMode && + debuggerCommunicationService.getCurrentDebuggerServer() + ) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .emitInputChanged(messageJson); + } else if (childProcess) { + childProcess.stdin.write( + messageJson + "\n" + ); + } + break; + case WEBVIEW_MESSAGES.REFRESH_SIMULATOR: + console.log("Refresh button"); + runSimulatorCommand(); + break; + case WEBVIEW_MESSAGES.SLIDER_TELEMETRY: + telemetryHandlerService.handleSensorTelemetry( + message.text + ); + break; + case WEBVIEW_MESSAGES.SWITCH_DEVICE: + deviceSelectionService.setCurrentActiveDevice( + message.text.active_device + ); + killProcessIfRunning(); + break; + default: + vscode.window.showInformationMessage( + CONSTANTS.ERROR.UNEXPECTED_MESSAGE + ); + break; + } + }, + undefined, + context.subscriptions + ); + + activeEditorListener = utils.addVisibleTextEditorCallback( + currentPanel, + context + ); + } + + currentPanel.onDidDispose( + () => { + currentPanel = undefined; + if ( + debuggerCommunicationService.getCurrentDebuggerServer() + ) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .setWebview(undefined); + } + killProcessIfRunning(); + if (firstTimeClosed) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.FIRST_TIME_WEBVIEW + ); + firstTimeClosed = false; + } + }, + undefined, + context.subscriptions + ); + } + sendCurrentDeviceMessage(currentPanel); + }; + + // Open Simulator on the webview + const openSimulator: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.openSimulator", + async () => { + const chosen_device = await vscode.window.showQuickPick( + Object.values(CONSTANTS.DEVICE_NAME_FORMAL) + ); + + if (!chosen_device) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_SIMULATE_TO, + true + ); + return; + } + + const device = formalNameToNickNameMapping[chosen_device]; + deviceSelectionService.setCurrentActiveDevice(device); + const telemetryEvents = telemetryHandlerService.getTelemetryEventsForOpenSimulator( + device + ); + telemetryAI.trackFeatureUsage( + telemetryEvents.openSimulatorTelemetryEvent + ); + telemetryAI.runWithLatencyMeasure( + openWebview, + telemetryEvents.openSimulatorPerformanceTelemetryEvent + ); + } + ); + + const gettingStartedOpen: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.gettingStarted", + () => { + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_GETTING_STARTED + ); + webviewService.openTutorialPanel(); + } + ); + + const openTemplateFile = (template: string) => { + const fileName = template; + const filePath = + __dirname + path.sep + "templates" + path.sep + fileName; + const file = fs.readFileSync(filePath, "utf8"); + const showNewFilePopup: boolean = vscode.workspace + .getConfiguration() + .get(CONFIG.SHOW_NEW_FILE_POPUP); + + if (showNewFilePopup && template === CONSTANTS.TEMPLATE.CPX) { + vscode.window + .showInformationMessage( + CONSTANTS.INFO.NEW_FILE, + DialogResponses.DONT_SHOW, + DialogResponses.EXAMPLE_CODE, + DialogResponses.TUTORIALS + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.DONT_SHOW) { + vscode.workspace + .getConfiguration() + .update(CONFIG.SHOW_NEW_FILE_POPUP, false); + telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_CLICK_DIALOG_DONT_SHOW + ); + } else if (selection === DialogResponses.EXAMPLE_CODE) { + open(CONSTANTS.LINKS.EXAMPLE_CODE); + telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_CLICK_DIALOG_EXAMPLE_CODE + ); + } else if (selection === DialogResponses.TUTORIALS) { + const okAction = () => { + open(CONSTANTS.LINKS.TUTORIALS); + telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_CLICK_DIALOG_TUTORIALS + ); + }; + utils.showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT + ); + } + }); + } + + // tslint:disable-next-line: ban-comma-operator + vscode.workspace + .openTextDocument({ + content: file, + language: LANGUAGE_VARS.PYTHON.ID, + }) + .then((template: vscode.TextDocument) => { + vscode.window.showTextDocument(template, 1, false).then(() => { + openWebview(); + }); + }), + // tslint:disable-next-line: no-unused-expression + (error: any) => { + telemetryHandlerService.handleNewFileErrorTelemetry(); + console.error(`Failed to open a new text document: ${error}`); + }; + }; + + const newFile: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.newFile", + async () => { + const chosen_device = await vscode.window.showQuickPick( + Object.values(CONSTANTS.DEVICE_NAME_FORMAL) + ); + + if (!chosen_device) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.NO_DEVICE_CHOSEN_FOR_NEW_FILE, + true + ); + return; + } + + const device = formalNameToNickNameMapping[chosen_device]; + deviceSelectionService.setCurrentActiveDevice(device); + + const deviceToTemplateMapping = { + [CONSTANTS.DEVICE_NAME.CPX]: CONSTANTS.TEMPLATE.CPX, + [CONSTANTS.DEVICE_NAME.MICROBIT]: CONSTANTS.TEMPLATE.MICROBIT, + [CONSTANTS.DEVICE_NAME.CLUE]: CONSTANTS.TEMPLATE.CLUE, + }; + const templateFile = deviceToTemplateMapping[device]; + + const telemetryEvents = telemetryHandlerService.getTelemetryEventsForNewFile( + device + ); + + telemetryAI.trackFeatureUsage( + telemetryEvents.newFileTelemetryEvent + ); + telemetryAI.runWithLatencyMeasure( + () => openTemplateFile(templateFile), + telemetryEvents.newFilePerformanceTelemetryEvent + ); + } + ); + + const installDependencies: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.installDependencies", + async () => { + pythonExecutablePath = await setupService.setupEnv(context, true); + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_INSTALL_EXTENSION_DEPENDENCIES + ); + } + ); + + const killProcessIfRunning = () => { + if (childProcess !== undefined) { + if (currentPanel) { + currentPanel.webview.postMessage({ + command: "reset-state", + active_device: deviceSelectionService.getCurrentActiveDevice(), + }); + } + // TODO: We need to check the process was correctly killed + childProcess.kill(); + childProcess = undefined; + } + }; + + const runSimulatorCommand = async () => { + pythonProcessDataBuffer = []; + // Prevent running new code if a debug session is active + if (inDebugMode) { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.DEBUGGING_SESSION_IN_PROGESS + ); + return; + } + if (shouldShowRunCodePopup) { + const shouldExitCommand = await vscode.window + .showWarningMessage( + CONSTANTS.WARNING.ACCEPT_AND_RUN, + DialogResponses.ACCEPT_AND_RUN, + DialogResponses.CANCEL + ) + .then((selection: vscode.MessageItem | undefined) => { + let hasAccepted = true; + if (selection === DialogResponses.ACCEPT_AND_RUN) { + shouldShowRunCodePopup = false; + hasAccepted = false; + } + return hasAccepted; + }); + // Don't run users code if they don't accept + if (shouldExitCommand) { + return; + } + } + + openWebview(); + + if (!currentPanel) { + return; + } + + console.info(CONSTANTS.INFO.RUNNING_CODE); + + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.DEPLOY_SIMULATOR, + true + ); + + killProcessIfRunning(); + + await fileSelectionService.updateCurrentFileFromEditor( + vscode.window.activeTextEditor + ); + + if (fileSelectionService.getCurrentFileAbsPath() === "") { + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.NO_FILE_TO_RUN, + true + ); + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FILE_TO_RUN, + DialogResponses.MESSAGE_UNDERSTOOD + ); + } else { + // Save on run + await fileSelectionService.getCurrentTextDocument().save(); + + if ( + !fileSelectionService + .getCurrentTextDocument() + .fileName.endsWith(LANGUAGE_VARS.PYTHON.FILE_ENDS) + ) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.NO_FILE_TO_RUN, + true + ); + return; + } + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.FILE_SELECTED( + fileSelectionService.getCurrentFileAbsPath() + ) + ); + + // Activate the run webview button + currentPanel.webview.postMessage({ + command: "activate-play", + active_device: deviceSelectionService.getCurrentActiveDevice(), + }); + const args = [ + utils.getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.PROCESS_USER_CODE_PY + ), + fileSelectionService.getCurrentFileAbsPath(), + JSON.stringify({ enable_telemetry: utils.getTelemetryState() }), + ]; + childProcess = cp.spawn(pythonExecutablePath, args); + + let dataFromTheProcess = ""; + let oldMessage = ""; + + // Data received from Python process + childProcess.stdout.on("data", data => { + dataFromTheProcess = data.toString(); + if (currentPanel) { + // NOTE: parts of the flow regarding pythonProcessDataBuffer + // are needed for the CLUE simulator to properly receive + // base_64 strings on UNIX systems. + + // added any incomplete data to beginning + const processedData = pythonProcessDataBuffer + .join("") + .concat(dataFromTheProcess); + pythonProcessDataBuffer = []; + + // Process the data from the process and send one state at a time + processedData.split("\0").forEach(message => { + if ( + currentPanel && + message.length > 0 && + message !== oldMessage + ) { + oldMessage = message; + let messageToWebview; + // Check the message is a JSON + try { + messageToWebview = JSON.parse(message); + // Check the JSON is a state + switch (messageToWebview.type) { + case "state": + const messageData = JSON.parse( + messageToWebview.data + ); + if ( + messageData.device_name === + deviceSelectionService.getCurrentActiveDevice() + ) { + messagingService.sendMessageToWebview( + VSCODE_MESSAGES_TO_WEBVIEW.SET_STATE, + messageData + ); + } + break; + + case "print": + console.log( + `Process print statement output = ${messageToWebview.data}` + ); + utils.logToOutputChannel( + outChannel, + `[PRINT] ${messageToWebview.data}` + ); + break; + + default: + console.log( + `Non-state JSON output from the process : ${messageToWebview}` + ); + break; + } + } catch (err) { + if (err instanceof SyntaxError) { + // if not a JSON string, it is incomplete + // add to beginning of next strings + pythonProcessDataBuffer.push(message); + } else { + console.log( + `Errored output: ${messageToWebview}` + ); + } + } + } + }); + } + }); + + // Std error output + childProcess.stderr.on("data", data => { + console.error( + `Error from the Python process through stderr: ${data}` + ); + telemetryAI.trackFeatureUsage( + TelemetryEventName.ERROR_PYTHON_PROCESS + ); + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.STDERR(data), + true + ); + if (currentPanel) { + currentPanel.webview.postMessage({ + active_device: deviceSelectionService.getCurrentActiveDevice(), + command: "reset-state", + }); + } + }); + + // When the process is done + childProcess.on("end", (code: number) => { + console.info(`Command execution exited with code: ${code}`); + }); + } + }; + + // Send message to the webview + const runSimulator: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.runSimulator", + () => { + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_RUN_PALETTE + ); + runSimulatorCommand(); + } + ); + + const deployCode = async (device: string) => { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.DEPLOY_DEVICE, + true + ); + + await fileSelectionService.updateCurrentFileFromEditor( + vscode.window.activeTextEditor + ); + + if (fileSelectionService.getCurrentFileAbsPath() === "") { + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, + true + ); + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, + DialogResponses.MESSAGE_UNDERSTOOD + ); + } else { + await fileSelectionService.getCurrentTextDocument().save(); + + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.FILE_SELECTED( + fileSelectionService.getCurrentFileAbsPath() + ) + ); + + const deviceProcess = cp.spawn(pythonExecutablePath, [ + utils.getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.DEVICE_PY + ), + device, + fileSelectionService.getCurrentFileAbsPath(), + ]); + + let dataFromTheProcess = ""; + + // Data received from Python process + deviceProcess.stdout.on("data", data => { + dataFromTheProcess = data.toString(); + + let messageToWebview; + try { + messageToWebview = JSON.parse(dataFromTheProcess); + if (messageToWebview.type === "complete") { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.DEPLOY_SUCCESS, + true + ); + } + telemetryHandlerService.handleDeployToDeviceFinishedTelemetry( + messageToWebview, + device + ); + } catch (err) { + console.log( + `Non-JSON output from the process : ${dataFromTheProcess}` + ); + } + }); + + // Std error output + deviceProcess.stderr.on("data", data => { + telemetryHandlerService.handleDeployToDeviceErrorTelemetry( + data, + device + ); + console.error( + `Error from the Python device process through stderr: ${data}` + ); + utils.logToOutputChannel( + outChannel, + `[ERROR] ${data} \n`, + true + ); + }); + + // When the process is done + deviceProcess.on("end", (code: number) => { + console.info(`Command execution exited with code: ${code}`); + }); + } + }; + + const deployToDevice: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.deployToDevice", + async () => { + const chosen_device = await vscode.window.showQuickPick( + Object.values(CONSTANTS.DEVICE_NAME_FORMAL) + ); + + if (!chosen_device) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_DEPLOY_TO, + true + ); + return; + } + + const device = formalNameToNickNameMapping[chosen_device]; + + const telemetryEvents = telemetryHandlerService.getTelemetryEventsForStartingDeployToDevice( + device + ); + + telemetryAI.trackFeatureUsage(telemetryEvents.deployTelemetryEvent); + telemetryAI.runWithLatencyMeasure(() => { + deployCode(device); + }, telemetryEvents.deployPerformanceTelemetryEvent); + } + ); + + let serialMonitor: SerialMonitor | undefined; + if (configFileCreated) { + serialMonitor = SerialMonitor.getInstance(); + context.subscriptions.push(serialMonitor); + } + + const selectSerialPort: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.selectSerialPort", + () => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure(() => { + serialMonitor.selectSerialPort(null, null); + }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CHOOSE_PORT); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + const openSerialMonitor: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.openSerialMonitor", + () => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure( + serialMonitor.openSerialMonitor.bind(serialMonitor), + TelemetryEventName.COMMAND_SERIAL_MONITOR_OPEN + ); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + const changeBaudRate: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.changeBaudRate", + () => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure( + serialMonitor.changeBaudRate.bind(serialMonitor), + TelemetryEventName.COMMAND_SERIAL_MONITOR_BAUD_RATE + ); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + const closeSerialMonitor: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.closeSerialMonitor", + (port, showWarning = true) => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure(() => { + serialMonitor.closeSerialMonitor(port, showWarning); + }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + const showReleaseNote = vscode.commands.registerCommand( + "deviceSimulatorExpress.", + (port, showWarning = true) => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure(() => { + serialMonitor.closeSerialMonitor(port, showWarning); + }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED + ); + console.info("Serial monitor is not defined."); + } + } + ); + + UsbDetector.getInstance().initialize(context.extensionPath); + UsbDetector.getInstance().startListening(); + + if ( + CPXWorkspace.rootPath && + (utils.fileExistsSync( + path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) + ) || + vscode.window.activeTextEditor) + ) { + (() => { + if (!SerialMonitor.getInstance().initialized) { + SerialMonitor.getInstance().initialize(); + } + })(); + } + + // Debugger configuration + const simulatorDebugConfiguration = new SimulatorDebugConfigurationProvider( + utils.getPathToScript(context, "out/", "debug_user_code.py") + ); + + const debugAdapterFactory = new DebugAdapterFactory( + vscode.debug.activeDebugSession, + messagingService, + debuggerCommunicationService + ); + vscode.debug.registerDebugAdapterTrackerFactory( + LANGUAGE_VARS.PYTHON.ID, + debugAdapterFactory + ); + // On Debug Session Start: Init comunication + const debugSessionsStarted = vscode.debug.onDidStartDebugSession(() => { + if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { + // Reinitialize process + killProcessIfRunning(); + inDebugMode = true; + + try { + // Shut down existing server on debug restart + if (debuggerCommunicationService.getCurrentDebuggerServer()) { + debuggerCommunicationService.resetCurrentDebuggerServer(); + } + + debuggerCommunicationService.setCurrentDebuggerServer( + new DebuggerCommunicationServer( + currentPanel, + utils.getServerPortConfig(), + deviceSelectionService + ) + ); + + telemetryHandlerService.handleDebuggerTelemetry(); + + openWebview(); + if (currentPanel) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .setWebview(currentPanel); + currentPanel.webview.postMessage({ + active_device: deviceSelectionService.getCurrentActiveDevice(), + command: "activate-play", + }); + } + } catch (err) { + if (err.message === SERVER_INFO.ERROR_CODE_INIT_SERVER) { + console.error( + `Error trying to init the server on port ${utils.getServerPortConfig()}` + ); + + telemetryHandlerService.handleDebuggerFailTelemetry(); + + vscode.window.showErrorMessage( + CONSTANTS.ERROR.DEBUGGER_SERVER_INIT_FAILED( + utils.getServerPortConfig() + ) + ); + } + } + } + }); + + // On Debug Session Stop: Stop communiation + const debugSessionStopped = vscode.debug.onDidTerminateDebugSession(() => { + if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { + inDebugMode = false; + simulatorDebugConfiguration.deviceSimulatorExpressDebug = false; + if (debuggerCommunicationService.getCurrentDebuggerServer()) { + debuggerCommunicationService.resetCurrentDebuggerServer(); + } + if (currentPanel) { + currentPanel.webview.postMessage({ + command: "reset-state", + active_device: deviceSelectionService.getCurrentActiveDevice(), + }); + } + } + }); + + const configsChanged = vscode.workspace.onDidChangeConfiguration( + async () => { + if (utils.checkConfig(CONFIG.CONFIG_ENV_ON_SWITCH)) { + pythonExecutablePath = await setupService.setupEnv(context); + } + } + ); + + context.subscriptions.push( + installDependencies, + runSimulator, + changeBaudRate, + closeSerialMonitor, + deployToDevice, + newFile, + openSimulator, + openSerialMonitor, + selectSerialPort, + gettingStartedOpen, + vscode.debug.registerDebugConfigurationProvider( + CONSTANTS.DEBUG_CONFIGURATION_TYPE, + simulatorDebugConfiguration + ), + debugSessionsStarted, + debugSessionStopped, + configsChanged + ); } const updatePythonExtraPaths = () => { - updateConfigLists( - "python.autoComplete.extraPaths", - [ - __dirname, - path.join(__dirname, CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY), - path.join(__dirname, CONSTANTS.FILESYSTEM.CLUE), - path.join(__dirname, CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON), - ], - vscode.ConfigurationTarget.Global - ); + updateConfigLists( + "python.autoComplete.extraPaths", + [ + __dirname, + path.join(__dirname, CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY), + path.join(__dirname, CONSTANTS.FILESYSTEM.CLUE), + path.join(__dirname, CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON), + ], + vscode.ConfigurationTarget.Global + ); }; const updatePylintArgs = (context: vscode.ExtensionContext) => { - const outPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY - ); - const micropythonPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY - ); - - const cluePath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.CLUE - ); - - const baseCircuitPythonPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON - ); - // update pylint args to extend system path - // to include python libs local to extention - updateConfigLists( - "python.linting.pylintArgs", - [ - "--init-hook", - `import sys; sys.path.extend([\"${outPath}\",\"${micropythonPath}\",\"${cluePath}\",\"${baseCircuitPythonPath}\"])`, - ], - vscode.ConfigurationTarget.Workspace - ); + const outPath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY + ); + const micropythonPath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY + ); + + const cluePath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + CONSTANTS.FILESYSTEM.CLUE + ); + + const baseCircuitPythonPath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON + ); + // update pylint args to extend system path + // to include python libs local to extention + updateConfigLists( + "python.linting.pylintArgs", + [ + "--init-hook", + `import sys; sys.path.extend([\"${outPath}\",\"${micropythonPath}\",\"${cluePath}\",\"${baseCircuitPythonPath}\"])`, + ], + vscode.ConfigurationTarget.Workspace + ); }; const updateConfigLists = ( - section: string, - newItems: string[], - scope: vscode.ConfigurationTarget + section: string, + newItems: string[], + scope: vscode.ConfigurationTarget ) => { - // function for adding elements to configuration arrays - const currentExtraItems: string[] = - vscode.workspace.getConfiguration().get(section) || []; - const extraItemsSet: Set = new Set( - currentExtraItems.concat(newItems) - ); - - vscode.workspace - .getConfiguration() - .update(section, Array.from(extraItemsSet), scope); + // function for adding elements to configuration arrays + const currentExtraItems: string[] = + vscode.workspace.getConfiguration().get(section) || []; + const extraItemsSet: Set = new Set( + currentExtraItems.concat(newItems) + ); + + vscode.workspace + .getConfiguration() + .update(section, Array.from(extraItemsSet), scope); }; // this method is called when your extension is deactivated export async function deactivate() { - const monitor: SerialMonitor = SerialMonitor.getInstance(); - await monitor.closeSerialMonitor(null, false); - UsbDetector.getInstance().stopListening(); + const monitor: SerialMonitor = SerialMonitor.getInstance(); + await monitor.closeSerialMonitor(null, false); + UsbDetector.getInstance().stopListening(); } diff --git a/Source/extension_utils/utils.ts b/Source/extension_utils/utils.ts index e276605a5..b7be3b71c 100644 --- a/Source/extension_utils/utils.ts +++ b/Source/extension_utils/utils.ts @@ -7,11 +7,11 @@ import * as path from "path"; import * as util from "util"; import * as vscode from "vscode"; import { - CONSTANTS, - CPX_CONFIG_FILE, - DialogResponses, - GLOBAL_ENV_VARS, - SERVER_INFO, + CONSTANTS, + CPX_CONFIG_FILE, + DialogResponses, + GLOBAL_ENV_VARS, + SERVER_INFO, } from "../constants"; import { CPXWorkspace } from "../cpxWorkspace"; import { DeviceContext } from "../deviceContext"; @@ -19,94 +19,94 @@ import { DeviceContext } from "../deviceContext"; export const exec = util.promisify(cp.exec); const errorChannel = vscode.window.createOutputChannel( - CONSTANTS.ERROR.INSTALLATION_ERROR + CONSTANTS.ERROR.INSTALLATION_ERROR ); // tslint:disable-next-line: export-name export const getPathToScript = ( - context: vscode.ExtensionContext, - folderName: string, - fileName: string = "" + context: vscode.ExtensionContext, + folderName: string, + fileName: string = "" ) => { - const onDiskPath = vscode.Uri.file( - path.join(context.extensionPath, folderName, fileName) - ); - const scriptPath = onDiskPath.with({ scheme: "vscode-resource" }); - return scriptPath.fsPath; + const onDiskPath = vscode.Uri.file( + path.join(context.extensionPath, folderName, fileName) + ); + const scriptPath = onDiskPath.with({ scheme: "vscode-resource" }); + return scriptPath.fsPath; }; export const showPrivacyModal = ( - okAction: () => void, - thirdPartyDisclaimer: string + okAction: () => void, + thirdPartyDisclaimer: string ) => { - vscode.window - .showInformationMessage( - `${thirdPartyDisclaimer}: ${CONSTANTS.LINKS.PRIVACY}`, - DialogResponses.AGREE_AND_PROCEED, - DialogResponses.CANCEL - ) - .then((privacySelection: vscode.MessageItem | undefined) => { - if (privacySelection === DialogResponses.AGREE_AND_PROCEED) { - okAction(); - } else if (privacySelection === DialogResponses.CANCEL) { - // do nothing - } - }); + vscode.window + .showInformationMessage( + `${thirdPartyDisclaimer}: ${CONSTANTS.LINKS.PRIVACY}`, + DialogResponses.AGREE_AND_PROCEED, + DialogResponses.CANCEL + ) + .then((privacySelection: vscode.MessageItem | undefined) => { + if (privacySelection === DialogResponses.AGREE_AND_PROCEED) { + okAction(); + } else if (privacySelection === DialogResponses.CANCEL) { + // do nothing + } + }); }; export const logToOutputChannel = ( - outChannel: vscode.OutputChannel | undefined, - message: string, - show: boolean = false + outChannel: vscode.OutputChannel | undefined, + message: string, + show: boolean = false ): void => { - if (outChannel) { - if (show) { - outChannel.show(true); - } - outChannel.append(message); - } + if (outChannel) { + if (show) { + outChannel.show(true); + } + outChannel.append(message); + } }; export function tryParseJSON(jsonString: string): any | boolean { - try { - const jsonObj = JSON.parse(jsonString); - if (jsonObj && typeof jsonObj === "object") { - return jsonObj; - } - } catch (exception) {} - - return false; + try { + const jsonObj = JSON.parse(jsonString); + if (jsonObj && typeof jsonObj === "object") { + return jsonObj; + } + } catch (exception) {} + + return false; } export function fileExistsSync(filePath: string): boolean { - try { - return fs.statSync(filePath).isFile(); - } catch (error) { - return false; - } + try { + return fs.statSync(filePath).isFile(); + } catch (error) { + return false; + } } export function mkdirRecursivelySync(dirPath: string): void { - if (directoryExistsSync(dirPath)) { - return; - } - const dirname = path.dirname(dirPath); - if (path.normalize(dirname) === path.normalize(dirPath)) { - fs.mkdirSync(dirPath); - } else if (directoryExistsSync(dirname)) { - fs.mkdirSync(dirPath); - } else { - mkdirRecursivelySync(dirname); - fs.mkdirSync(dirPath); - } + if (directoryExistsSync(dirPath)) { + return; + } + const dirname = path.dirname(dirPath); + if (path.normalize(dirname) === path.normalize(dirPath)) { + fs.mkdirSync(dirPath); + } else if (directoryExistsSync(dirname)) { + fs.mkdirSync(dirPath); + } else { + mkdirRecursivelySync(dirname); + fs.mkdirSync(dirPath); + } } export function directoryExistsSync(dirPath: string): boolean { - try { - return fs.statSync(dirPath).isDirectory(); - } catch (e) { - return false; - } + try { + return fs.statSync(dirPath).isDirectory(); + } catch (e) { + return false; + } } /** @@ -115,121 +115,119 @@ export function directoryExistsSync(dirPath: string): boolean { * The padding is applied from the start (left) of the current string. */ export function padStart( - sourceString: string, - targetLength: number, - padString?: string + sourceString: string, + targetLength: number, + padString?: string ): string { - if (!sourceString) { - return sourceString; - } - - if (!(String.prototype as any).padStart) { - // https://github.com/uxitten/polyfill/blob/master/string.polyfill.js - padString = String(padString || " "); - if (sourceString.length > targetLength) { - return sourceString; - } else { - targetLength = targetLength - sourceString.length; - if (targetLength > padString.length) { - padString += padString.repeat(targetLength / padString.length); // append to original to ensure we are longer than needed - } - return padString.slice(0, targetLength) + sourceString; - } - } else { - return (sourceString as any).padStart(targetLength, padString); - } + if (!sourceString) { + return sourceString; + } + + if (!(String.prototype as any).padStart) { + // https://github.com/uxitten/polyfill/blob/master/string.polyfill.js + padString = String(padString || " "); + if (sourceString.length > targetLength) { + return sourceString; + } else { + targetLength = targetLength - sourceString.length; + if (targetLength > padString.length) { + padString += padString.repeat(targetLength / padString.length); // append to original to ensure we are longer than needed + } + return padString.slice(0, targetLength) + sourceString; + } + } else { + return (sourceString as any).padStart(targetLength, padString); + } } export function convertToHex(num: number, width = 0): string { - return padStart(num.toString(16), width, "0"); + return padStart(num.toString(16), width, "0"); } export function generateCPXConfig(): void { - const deviceContext: DeviceContext = DeviceContext.getInstance(); - const cpxJson = { - port: deviceContext.port, - }; - const cpxConfigFilePath: string = path.join( - CPXWorkspace.rootPath, - CPX_CONFIG_FILE - ); - mkdirRecursivelySync(path.dirname(cpxConfigFilePath)); - fs.writeFileSync(cpxConfigFilePath, JSON.stringify(cpxJson, null, 4)); + const deviceContext: DeviceContext = DeviceContext.getInstance(); + const cpxJson = { + port: deviceContext.port, + }; + const cpxConfigFilePath: string = path.join( + CPXWorkspace.rootPath, + CPX_CONFIG_FILE + ); + mkdirRecursivelySync(path.dirname(cpxConfigFilePath)); + fs.writeFileSync(cpxConfigFilePath, JSON.stringify(cpxJson, null, 4)); } export const addVisibleTextEditorCallback = ( - currentPanel: vscode.WebviewPanel, - context: vscode.ExtensionContext + currentPanel: vscode.WebviewPanel, + context: vscode.ExtensionContext ): vscode.Disposable => { - const initialPythonEditors = filterForPythonFiles( - vscode.window.visibleTextEditors - ); - currentPanel.webview.postMessage({ - command: "visible-editors", - state: { activePythonEditors: initialPythonEditors }, - }); - return vscode.window.onDidChangeVisibleTextEditors( - (textEditors: vscode.TextEditor[]) => { - const activePythonEditors = filterForPythonFiles(textEditors); - currentPanel.webview.postMessage({ - command: "visible-editors", - state: { activePythonEditors }, - }); - }, - {}, - context.subscriptions - ); + const initialPythonEditors = filterForPythonFiles( + vscode.window.visibleTextEditors + ); + currentPanel.webview.postMessage({ + command: "visible-editors", + state: { activePythonEditors: initialPythonEditors }, + }); + return vscode.window.onDidChangeVisibleTextEditors( + (textEditors: vscode.TextEditor[]) => { + const activePythonEditors = filterForPythonFiles(textEditors); + currentPanel.webview.postMessage({ + command: "visible-editors", + state: { activePythonEditors }, + }); + }, + {}, + context.subscriptions + ); }; export const filterForPythonFiles = (textEditors: vscode.TextEditor[]) => { - return textEditors - .filter( - (editor) => editor.document.languageId === GLOBAL_ENV_VARS.PYTHON - ) - .map((editor) => editor.document.fileName); + return textEditors + .filter(editor => editor.document.languageId === GLOBAL_ENV_VARS.PYTHON) + .map(editor => editor.document.fileName); }; export const getActiveEditorFromPath = ( - filePath: string + filePath: string ): vscode.TextDocument => { - const activeEditor = vscode.window.visibleTextEditors.find( - (editor: vscode.TextEditor) => editor.document.fileName === filePath - ); - return activeEditor ? activeEditor.document : undefined; + const activeEditor = vscode.window.visibleTextEditors.find( + (editor: vscode.TextEditor) => editor.document.fileName === filePath + ); + return activeEditor ? activeEditor.document : undefined; }; export const getServerPortConfig = (): number => { - // tslint:disable: no-backbone-get-set-outside-model prefer-type-cast - if ( - vscode.workspace - .getConfiguration() - .has(SERVER_INFO.SERVER_PORT_CONFIGURATION) - ) { - return vscode.workspace - .getConfiguration() - .get(SERVER_INFO.SERVER_PORT_CONFIGURATION) as number; - } - return SERVER_INFO.DEFAULT_SERVER_PORT; + // tslint:disable: no-backbone-get-set-outside-model prefer-type-cast + if ( + vscode.workspace + .getConfiguration() + .has(SERVER_INFO.SERVER_PORT_CONFIGURATION) + ) { + return vscode.workspace + .getConfiguration() + .get(SERVER_INFO.SERVER_PORT_CONFIGURATION) as number; + } + return SERVER_INFO.DEFAULT_SERVER_PORT; }; export const checkConfig = (configName: string): boolean => { - return vscode.workspace.getConfiguration().get(configName) === true; + return vscode.workspace.getConfiguration().get(configName) === true; }; export const getConfig = (configName: string): string => { - return vscode.workspace.getConfiguration().get(configName); + return vscode.workspace.getConfiguration().get(configName); }; export const createEscapedPath = (...pieces: string[]) => { - const initialPath: string = path.join(...pieces); + const initialPath: string = path.join(...pieces); - // escape all special characters - // https://stackoverflow.com/questions/1779858/how-do-i-escape-a-string-for-a-shell-command-in-node - return `"` + initialPath.replace(/(["'$`\\])/g, "\\$1") + `"`; + // escape all special characters + // https://stackoverflow.com/questions/1779858/how-do-i-escape-a-string-for-a-shell-command-in-node + return `"` + initialPath.replace(/(["'$`\\])/g, "\\$1") + `"`; }; export const getTelemetryState = () => { - return vscode.workspace - .getConfiguration() - .get("telemetry.enableTelemetry", true); + return vscode.workspace + .getConfiguration() + .get("telemetry.enableTelemetry", true); }; diff --git a/Source/requirements.txt b/Source/requirements.txt index 3a5fdb5a2..c13eef60b 100644 --- a/Source/requirements.txt +++ b/Source/requirements.txt @@ -9,4 +9,4 @@ adafruit-circuitpython-fancyled==1.3.3 Pillow==8.1.1 adafruit-circuitpython-bitmap_font==1.1.0 adafruit-circuitpython-display-shapes==1.2.0 -adafruit-circuitpython-neopixel==5.0.0 +adafruit-circuitpython-neopixel==5.0.0 \ No newline at end of file diff --git a/Source/serialMonitor.ts b/Source/serialMonitor.ts index f4c781064..f3685cd58 100644 --- a/Source/serialMonitor.ts +++ b/Source/serialMonitor.ts @@ -11,288 +11,300 @@ import { logToOutputChannel } from "./extension_utils/utils"; import { SerialPortControl } from "./serialPortControl"; export interface ISerialPortDetail { - path: string; - manufacturer: string; - vendorId: string; - productId: string; + path: string; + manufacturer: string; + vendorId: string; + productId: string; } export class SerialMonitor implements vscode.Disposable { - public static DEFAULT_BAUD_RATE: number = 115200; + public static DEFAULT_BAUD_RATE: number = 115200; - public static listBaudRates(): number[] { - return [ - 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 74880, 115200, - 230400, 250000, - ]; - } + public static listBaudRates(): number[] { + return [ + 300, + 1200, + 2400, + 4800, + 9600, + 19200, + 38400, + 57600, + 74880, + 115200, + 230400, + 250000, + ]; + } - public static getInstance(): SerialMonitor { - if (SerialMonitor._serialMonitor === null) { - SerialMonitor._serialMonitor = new SerialMonitor(); - } - return SerialMonitor._serialMonitor; - } + public static getInstance(): SerialMonitor { + if (SerialMonitor._serialMonitor === null) { + SerialMonitor._serialMonitor = new SerialMonitor(); + } + return SerialMonitor._serialMonitor; + } - private static _serialMonitor: SerialMonitor | null = null; + private static _serialMonitor: SerialMonitor | null = null; - private _currentPort!: string; - private _currentBaudRate!: number; - private _outputChannel!: vscode.OutputChannel; - private _serialPortControl: SerialPortControl | null = null; - private _baudRateStatusBar!: vscode.StatusBarItem; - private _openPortStatusBar!: vscode.StatusBarItem; - private _portsStatusBar!: vscode.StatusBarItem; + private _currentPort!: string; + private _currentBaudRate!: number; + private _outputChannel!: vscode.OutputChannel; + private _serialPortControl: SerialPortControl | null = null; + private _baudRateStatusBar!: vscode.StatusBarItem; + private _openPortStatusBar!: vscode.StatusBarItem; + private _portsStatusBar!: vscode.StatusBarItem; - private constructor() { - const deviceContext = DeviceContext.getInstance(); - deviceContext.onDidChange(() => { - if (deviceContext.port) { - if (!this.initialized) { - this.initialize(); - } - this.updatePortListStatus(null); - } - }); - } + private constructor() { + const deviceContext = DeviceContext.getInstance(); + deviceContext.onDidChange(() => { + if (deviceContext.port) { + if (!this.initialized) { + this.initialize(); + } + this.updatePortListStatus(null); + } + }); + } - public initialize() { - const defaultBaudRate: number = SerialMonitor.DEFAULT_BAUD_RATE; - this._outputChannel = vscode.window.createOutputChannel( - CONSTANTS.MISC.SERIAL_MONITOR_NAME - ); - this._currentBaudRate = defaultBaudRate; - this._portsStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.PORT - ); - this._portsStatusBar.command = - "deviceSimulatorExpress.common.selectSerialPort"; - this._portsStatusBar.tooltip = "Select Serial Port"; - this._portsStatusBar.show(); + public initialize() { + const defaultBaudRate: number = SerialMonitor.DEFAULT_BAUD_RATE; + this._outputChannel = vscode.window.createOutputChannel( + CONSTANTS.MISC.SERIAL_MONITOR_NAME + ); + this._currentBaudRate = defaultBaudRate; + this._portsStatusBar = vscode.window.createStatusBarItem( + vscode.StatusBarAlignment.Right, + STATUS_BAR_PRIORITY.PORT + ); + this._portsStatusBar.command = + "deviceSimulatorExpress.common.selectSerialPort"; + this._portsStatusBar.tooltip = "Select Serial Port"; + this._portsStatusBar.show(); - this._openPortStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.OPEN_PORT - ); - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.openSerialMonitor"; - this._openPortStatusBar.text = `$(plug)`; - this._openPortStatusBar.tooltip = "Open Serial Monitor"; - this._openPortStatusBar.show(); + this._openPortStatusBar = vscode.window.createStatusBarItem( + vscode.StatusBarAlignment.Right, + STATUS_BAR_PRIORITY.OPEN_PORT + ); + this._openPortStatusBar.command = + "deviceSimulatorExpress.common.openSerialMonitor"; + this._openPortStatusBar.text = `$(plug)`; + this._openPortStatusBar.tooltip = "Open Serial Monitor"; + this._openPortStatusBar.show(); - this._baudRateStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.BAUD_RATE - ); - this._baudRateStatusBar.command = - "deviceSimulatorExpress.common.changeBaudRate"; - this._baudRateStatusBar.tooltip = "Baud Rate"; - this._baudRateStatusBar.text = defaultBaudRate.toString(); - this.updatePortListStatus(null); - } + this._baudRateStatusBar = vscode.window.createStatusBarItem( + vscode.StatusBarAlignment.Right, + STATUS_BAR_PRIORITY.BAUD_RATE + ); + this._baudRateStatusBar.command = + "deviceSimulatorExpress.common.changeBaudRate"; + this._baudRateStatusBar.tooltip = "Baud Rate"; + this._baudRateStatusBar.text = defaultBaudRate.toString(); + this.updatePortListStatus(null); + } - public async selectSerialPort(vid: string | null, pid: string | null) { - const lists = await SerialPortControl.list(); - if (!lists.length) { - vscode.window.showInformationMessage( - "No serial message is available." - ); - return; - } + public async selectSerialPort(vid: string | null, pid: string | null) { + const lists = await SerialPortControl.list(); + if (!lists.length) { + vscode.window.showInformationMessage( + "No serial message is available." + ); + return; + } - if (vid && pid) { - const valueOfVid = parseInt(vid, 16); - const valueOfPid = parseInt(pid, 16); - const foundPort = lists.find((port) => { - if (port.productId && port.vendorId) { - return ( - parseInt(port.productId, 16) === valueOfPid && - parseInt(port.vendorId, 16) === valueOfVid - ); - } - return false; - }); - if ( - foundPort && - !(this._serialPortControl && this._serialPortControl.isActive) - ) { - this.updatePortListStatus(foundPort.path); - } - } else { - const chosen = await vscode.window.showQuickPick( - lists - .map((port: ISerialPortDetail): vscode.QuickPickItem => { - return { - description: port.manufacturer, - label: port.path, - }; - }) - .sort((a, b): number => { - return a.label === b.label - ? 0 - : a.label > b.label - ? 1 - : -1; - }) as vscode.QuickPickItem[], - { placeHolder: CONSTANTS.MISC.SELECT_PORT_PLACEHOLDER } - ); + if (vid && pid) { + const valueOfVid = parseInt(vid, 16); + const valueOfPid = parseInt(pid, 16); + const foundPort = lists.find(port => { + if (port.productId && port.vendorId) { + return ( + parseInt(port.productId, 16) === valueOfPid && + parseInt(port.vendorId, 16) === valueOfVid + ); + } + return false; + }); + if ( + foundPort && + !(this._serialPortControl && this._serialPortControl.isActive) + ) { + this.updatePortListStatus(foundPort.path); + } + } else { + const chosen = await vscode.window.showQuickPick( + lists + .map( + (port: ISerialPortDetail): vscode.QuickPickItem => { + return { + description: port.manufacturer, + label: port.path, + }; + } + ) + .sort((a, b): number => { + return a.label === b.label + ? 0 + : a.label > b.label + ? 1 + : -1; + }) as vscode.QuickPickItem[], + { placeHolder: CONSTANTS.MISC.SELECT_PORT_PLACEHOLDER } + ); - if (chosen && chosen.label) { - this.updatePortListStatus(chosen.label); - } - } - } + if (chosen && chosen.label) { + this.updatePortListStatus(chosen.label); + } + } + } - public async openSerialMonitor() { - if (!this._currentPort) { - const ans = await vscode.window.showInformationMessage( - CONSTANTS.WARNING.NO_SERIAL_PORT_SELECTED, - DialogResponses.SELECT, - DialogResponses.CANCEL - ); - if (ans === DialogResponses.SELECT) { - await this.selectSerialPort(null, null); - } - if (!this._currentPort) { - return; - } - } + public async openSerialMonitor() { + if (!this._currentPort) { + const ans = await vscode.window.showInformationMessage( + CONSTANTS.WARNING.NO_SERIAL_PORT_SELECTED, + DialogResponses.SELECT, + DialogResponses.CANCEL + ); + if (ans === DialogResponses.SELECT) { + await this.selectSerialPort(null, null); + } + if (!this._currentPort) { + return; + } + } - if (this._serialPortControl) { - if (this._currentPort !== this._serialPortControl.currentPort) { - await this._serialPortControl.changePort(this._currentPort); - } else if (this._serialPortControl.isActive) { - vscode.window.showWarningMessage( - `Serial Monitor is already opened for ${this._currentPort}` - ); - return; - } - } else { - this._serialPortControl = new SerialPortControl( - this._currentPort, - this._currentBaudRate, - this._outputChannel - ); - } + if (this._serialPortControl) { + if (this._currentPort !== this._serialPortControl.currentPort) { + await this._serialPortControl.changePort(this._currentPort); + } else if (this._serialPortControl.isActive) { + vscode.window.showWarningMessage( + `Serial Monitor is already opened for ${this._currentPort}` + ); + return; + } + } else { + this._serialPortControl = new SerialPortControl( + this._currentPort, + this._currentBaudRate, + this._outputChannel + ); + } - if (!this._serialPortControl.currentPort) { - console.error( - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT(this._currentPort) - ); - return; - } + if (!this._serialPortControl.currentPort) { + console.error( + CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT(this._currentPort) + ); + return; + } - try { - await this._serialPortControl.open(); - this.updatePortStatus(true); - } catch (error) { - logToOutputChannel( - outChannel, - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT_DUE_TO( - this._currentPort, - error - ), - true - ); - } - } + try { + await this._serialPortControl.open(); + this.updatePortStatus(true); + } catch (error) { + logToOutputChannel( + outChannel, + CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT_DUE_TO( + this._currentPort, + error + ), + true + ); + } + } - public get initialized(): boolean { - return !!this._outputChannel; - } + public get initialized(): boolean { + return !!this._outputChannel; + } - public dispose() { - if (this._serialPortControl && this._serialPortControl.isActive) { - return this._serialPortControl.stop(); - } - } + public dispose() { + if (this._serialPortControl && this._serialPortControl.isActive) { + return this._serialPortControl.stop(); + } + } - public async changeBaudRate() { - const baudRates = SerialMonitor.listBaudRates(); - const chosen = await vscode.window.showQuickPick( - baudRates.map((baudRate) => baudRate.toString()) - ); + public async changeBaudRate() { + const baudRates = SerialMonitor.listBaudRates(); + const chosen = await vscode.window.showQuickPick( + baudRates.map(baudRate => baudRate.toString()) + ); - if (!chosen) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.NO_RATE_SELECTED, - true - ); - return; - } + if (!chosen) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.NO_RATE_SELECTED, + true + ); + return; + } - if (!parseInt(chosen, 10)) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.INVALID_BAUD_RATE, - true - ); - return; - } + if (!parseInt(chosen, 10)) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.INVALID_BAUD_RATE, + true + ); + return; + } - if (!this._serialPortControl) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.SERIAL_MONITOR_NOT_STARTED, - true - ); - return; - } + if (!this._serialPortControl) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.SERIAL_MONITOR_NOT_STARTED, + true + ); + return; + } - const selectedRate: number = parseInt(chosen, 10); - await this._serialPortControl.changeBaudRate(selectedRate); - this._currentBaudRate = selectedRate; - this._baudRateStatusBar.text = chosen; - } + const selectedRate: number = parseInt(chosen, 10); + await this._serialPortControl.changeBaudRate(selectedRate); + this._currentBaudRate = selectedRate; + this._baudRateStatusBar.text = chosen; + } - public async closeSerialMonitor(port: string, showWarning: boolean = true) { - if (this._serialPortControl) { - if (port && port !== this._serialPortControl.currentPort) { - // Port is not opened - return false; - } - const result = await this._serialPortControl.stop(); - this.updatePortStatus(false); - return result; - } else if (!port && showWarning) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.SERIAL_PORT_NOT_STARTED, - true - ); - return false; - } - } + public async closeSerialMonitor(port: string, showWarning: boolean = true) { + if (this._serialPortControl) { + if (port && port !== this._serialPortControl.currentPort) { + // Port is not opened + return false; + } + const result = await this._serialPortControl.stop(); + this.updatePortStatus(false); + return result; + } else if (!port && showWarning) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.SERIAL_PORT_NOT_STARTED, + true + ); + return false; + } + } - private updatePortStatus(isOpened: boolean) { - if (isOpened) { - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.closeSerialMonitor"; - this._openPortStatusBar.text = `$(x)`; - this._openPortStatusBar.tooltip = "Close Serial Monitor"; - this._baudRateStatusBar.show(); - } else { - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.openSerialMonitor"; - this._openPortStatusBar.text = `$(plug)`; - this._openPortStatusBar.tooltip = "Open Serial Monitor"; - this._baudRateStatusBar.hide(); - } - } + private updatePortStatus(isOpened: boolean) { + if (isOpened) { + this._openPortStatusBar.command = + "deviceSimulatorExpress.common.closeSerialMonitor"; + this._openPortStatusBar.text = `$(x)`; + this._openPortStatusBar.tooltip = "Close Serial Monitor"; + this._baudRateStatusBar.show(); + } else { + this._openPortStatusBar.command = + "deviceSimulatorExpress.common.openSerialMonitor"; + this._openPortStatusBar.text = `$(plug)`; + this._openPortStatusBar.tooltip = "Open Serial Monitor"; + this._baudRateStatusBar.hide(); + } + } - private updatePortListStatus(port: string | null) { - const deviceContext = DeviceContext.getInstance(); - if (port) { - deviceContext.port = port; - } - this._currentPort = deviceContext.port; + private updatePortListStatus(port: string | null) { + const deviceContext = DeviceContext.getInstance(); + if (port) { + deviceContext.port = port; + } + this._currentPort = deviceContext.port; - if (deviceContext.port) { - this._portsStatusBar.text = deviceContext.port; - } else { - this._portsStatusBar.text = ""; + } + } } diff --git a/Source/serialPortControl.ts b/Source/serialPortControl.ts index 0abcfa03e..64d8d010a 100644 --- a/Source/serialPortControl.ts +++ b/Source/serialPortControl.ts @@ -9,188 +9,188 @@ import { CONSTANTS } from "./constants"; import { logToOutputChannel } from "./extension_utils/utils"; interface ISerialPortDetail { - path: string; - manufacturer: string; - vendorId: string; - productId: string; + path: string; + manufacturer: string; + vendorId: string; + productId: string; } export class SerialPortControl { - public static get serialport(): any { - if (!SerialPortControl._serialport) { - SerialPortControl._serialport = require("usb-native").SerialPort; - } - return SerialPortControl._serialport; - } - - public static list(): Promise { - return new Promise((resolve, reject) => { - SerialPortControl.serialport.list().then( - (ports) => resolve(ports), - (err) => reject(err) - ); - }); - } - - private static _serialport: any; - - private _currentPort: string; - private _currentBaudRate: number; - private _currentSerialPort: any; - - public constructor( - port: string, - baudRate: number, - private _outputChannel: OutputChannel - ) { - this._currentPort = port; - this._currentBaudRate = baudRate; - } - - public get isActive(): boolean { - return this._currentSerialPort && this._currentSerialPort.isOpen; - } - - public get currentPort(): string { - return this._currentPort; - } - - public open(): Promise { - logToOutputChannel( - this._outputChannel, - CONSTANTS.INFO.OPENING_SERIAL_PORT(this._currentPort) - ); - return new Promise((resolve, reject) => { - if (this._currentSerialPort && this._currentSerialPort.isOpen) { - this._currentSerialPort.close((err: any) => { - if (err) { - return reject(err); - } - this._currentSerialPort = null; - return this.open().then( - () => { - resolve(); - }, - (error) => { - reject(error); - } - ); - }); - } else { - this._currentSerialPort = new SerialPortControl.serialport( - this._currentPort, - { baudRate: this._currentBaudRate } - ); - this._outputChannel.show(); - this._currentSerialPort.on("open", () => { - this._currentSerialPort.write( - CONSTANTS.MISC.SERIAL_MONITOR_TEST_IF_OPEN + os.EOL, - (err: any) => { - if ( - err && - !( - err.message.indexOf( - CONSTANTS.ERROR.COMPORT_UNKNOWN_ERROR - ) >= 0 - ) - ) { - logToOutputChannel( - this._outputChannel, - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT( - this._currentPort - ) - ); - logToOutputChannel( - this._outputChannel, - CONSTANTS.ERROR.RECONNECT_DEVICE - ); - reject(err); - } else { - logToOutputChannel( - this._outputChannel, - CONSTANTS.INFO.OPENED_SERIAL_PORT( - this._currentPort - ) - ); - resolve(); - } - } - ); - }); - } - - this._currentSerialPort.on("data", (event: any) => { - logToOutputChannel(this._outputChannel, event.toString()); - }); - - this._currentSerialPort.on("error", (error: any) => { - logToOutputChannel(this._outputChannel, error.toString()); - }); - }); - } - - public changePort(newPort: string): Promise { - return new Promise((resolve, reject) => { - if (newPort === this._currentPort) { - resolve(); - return; - } - this._currentPort = newPort; - if (!this._currentSerialPort || !this.isActive) { - resolve(); - return; - } - this._currentSerialPort.close((error: any) => { - if (error) { - reject(error); - } else { - this._currentSerialPort = null; - resolve(); - } - }); - }); - } - - public stop(): Promise { - return new Promise((resolve, reject) => { - if (!this._currentSerialPort || !this.isActive) { - resolve(false); - return; - } - this._currentSerialPort.close((error: any) => { - if (this._outputChannel) { - logToOutputChannel( - this._outputChannel, - CONSTANTS.INFO.CLOSED_SERIAL_PORT(this._currentPort) - ); - } - this._currentSerialPort = null; - if (error) { - reject(error); - } else { - resolve(true); - } - }); - }); - } - - public changeBaudRate(newBaudRate: number): Promise { - return new Promise((resolve, reject) => { - this._currentBaudRate = newBaudRate; - if (!this._currentSerialPort || !this.isActive) { - resolve(); - return; - } - this._currentSerialPort.update( - { baudRate: this._currentBaudRate }, - (error: any) => { - if (error) { - reject(error); - } else { - resolve(); - } - } - ); - }); - } + public static get serialport(): any { + if (!SerialPortControl._serialport) { + SerialPortControl._serialport = require("usb-native").SerialPort; + } + return SerialPortControl._serialport; + } + + public static list(): Promise { + return new Promise((resolve, reject) => { + SerialPortControl.serialport.list().then( + ports => resolve(ports), + err => reject(err) + ); + }); + } + + private static _serialport: any; + + private _currentPort: string; + private _currentBaudRate: number; + private _currentSerialPort: any; + + public constructor( + port: string, + baudRate: number, + private _outputChannel: OutputChannel + ) { + this._currentPort = port; + this._currentBaudRate = baudRate; + } + + public get isActive(): boolean { + return this._currentSerialPort && this._currentSerialPort.isOpen; + } + + public get currentPort(): string { + return this._currentPort; + } + + public open(): Promise { + logToOutputChannel( + this._outputChannel, + CONSTANTS.INFO.OPENING_SERIAL_PORT(this._currentPort) + ); + return new Promise((resolve, reject) => { + if (this._currentSerialPort && this._currentSerialPort.isOpen) { + this._currentSerialPort.close((err: any) => { + if (err) { + return reject(err); + } + this._currentSerialPort = null; + return this.open().then( + () => { + resolve(); + }, + error => { + reject(error); + } + ); + }); + } else { + this._currentSerialPort = new SerialPortControl.serialport( + this._currentPort, + { baudRate: this._currentBaudRate } + ); + this._outputChannel.show(); + this._currentSerialPort.on("open", () => { + this._currentSerialPort.write( + CONSTANTS.MISC.SERIAL_MONITOR_TEST_IF_OPEN + os.EOL, + (err: any) => { + if ( + err && + !( + err.message.indexOf( + CONSTANTS.ERROR.COMPORT_UNKNOWN_ERROR + ) >= 0 + ) + ) { + logToOutputChannel( + this._outputChannel, + CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT( + this._currentPort + ) + ); + logToOutputChannel( + this._outputChannel, + CONSTANTS.ERROR.RECONNECT_DEVICE + ); + reject(err); + } else { + logToOutputChannel( + this._outputChannel, + CONSTANTS.INFO.OPENED_SERIAL_PORT( + this._currentPort + ) + ); + resolve(); + } + } + ); + }); + } + + this._currentSerialPort.on("data", (event: any) => { + logToOutputChannel(this._outputChannel, event.toString()); + }); + + this._currentSerialPort.on("error", (error: any) => { + logToOutputChannel(this._outputChannel, error.toString()); + }); + }); + } + + public changePort(newPort: string): Promise { + return new Promise((resolve, reject) => { + if (newPort === this._currentPort) { + resolve(); + return; + } + this._currentPort = newPort; + if (!this._currentSerialPort || !this.isActive) { + resolve(); + return; + } + this._currentSerialPort.close((error: any) => { + if (error) { + reject(error); + } else { + this._currentSerialPort = null; + resolve(); + } + }); + }); + } + + public stop(): Promise { + return new Promise((resolve, reject) => { + if (!this._currentSerialPort || !this.isActive) { + resolve(false); + return; + } + this._currentSerialPort.close((error: any) => { + if (this._outputChannel) { + logToOutputChannel( + this._outputChannel, + CONSTANTS.INFO.CLOSED_SERIAL_PORT(this._currentPort) + ); + } + this._currentSerialPort = null; + if (error) { + reject(error); + } else { + resolve(true); + } + }); + }); + } + + public changeBaudRate(newBaudRate: number): Promise { + return new Promise((resolve, reject) => { + this._currentBaudRate = newBaudRate; + if (!this._currentSerialPort || !this.isActive) { + resolve(); + return; + } + this._currentSerialPort.update( + { baudRate: this._currentBaudRate }, + (error: any) => { + if (error) { + reject(error); + } else { + resolve(); + } + } + ); + }); + } } diff --git a/Source/service/PopupService.ts b/Source/service/PopupService.ts index 84d312467..d5aadbff4 100644 --- a/Source/service/PopupService.ts +++ b/Source/service/PopupService.ts @@ -3,14 +3,14 @@ import * as vscode from "vscode"; import { LATEST_RELEASE_NOTE } from "../latest_release_note"; export class PopupService { - public static openReleaseNote() { - const panel = vscode.window.createWebviewPanel( - "releaseNote", - "Release Note", - vscode.ViewColumn.One, - {} - ); + public static openReleaseNote() { + const panel = vscode.window.createWebviewPanel( + "releaseNote", + "Release Note", + vscode.ViewColumn.One, + {} + ); - panel.webview.html = LATEST_RELEASE_NOTE; - } + panel.webview.html = LATEST_RELEASE_NOTE; + } } diff --git a/Source/service/debuggerCommunicationService.ts b/Source/service/debuggerCommunicationService.ts index 1e47024f1..b37b1c2ed 100644 --- a/Source/service/debuggerCommunicationService.ts +++ b/Source/service/debuggerCommunicationService.ts @@ -1,27 +1,27 @@ import { DebuggerCommunicationServer } from "../debuggerCommunicationServer"; export class DebuggerCommunicationService { - private currentDebuggerServer?: DebuggerCommunicationServer; - private previousDebuggerServerToDisconnect?: DebuggerCommunicationServer; + private currentDebuggerServer?: DebuggerCommunicationServer; + private previousDebuggerServerToDisconnect?: DebuggerCommunicationServer; - public setCurrentDebuggerServer(debugServer: DebuggerCommunicationServer) { - this.currentDebuggerServer = debugServer; - } - // Used for restart and stop event - public resetCurrentDebuggerServer() { - if (this.currentDebuggerServer) { - this.currentDebuggerServer.closeConnection(); - } - this.previousDebuggerServerToDisconnect = this.currentDebuggerServer; - this.currentDebuggerServer = undefined; - } - public getCurrentDebuggerServer() { - return this.currentDebuggerServer; - } - // Only used for stop event - public handleStopEvent() { - if (this.previousDebuggerServerToDisconnect) { - this.previousDebuggerServerToDisconnect.disconnectFromPort(); - } - } + public setCurrentDebuggerServer(debugServer: DebuggerCommunicationServer) { + this.currentDebuggerServer = debugServer; + } + // Used for restart and stop event + public resetCurrentDebuggerServer() { + if (this.currentDebuggerServer) { + this.currentDebuggerServer.closeConnection(); + } + this.previousDebuggerServerToDisconnect = this.currentDebuggerServer; + this.currentDebuggerServer = undefined; + } + public getCurrentDebuggerServer() { + return this.currentDebuggerServer; + } + // Only used for stop event + public handleStopEvent() { + if (this.previousDebuggerServerToDisconnect) { + this.previousDebuggerServerToDisconnect.disconnectFromPort(); + } + } } diff --git a/Source/service/deviceSelectionService.ts b/Source/service/deviceSelectionService.ts index 15f8bc2f2..39a8b5988 100644 --- a/Source/service/deviceSelectionService.ts +++ b/Source/service/deviceSelectionService.ts @@ -1,12 +1,12 @@ import { DEFAULT_DEVICE } from "../constants"; export class DeviceSelectionService { - private currentActiveDevice: string = DEFAULT_DEVICE; + private currentActiveDevice: string = DEFAULT_DEVICE; - public getCurrentActiveDevice(): string { - return this.currentActiveDevice; - } - public setCurrentActiveDevice(newActiveDevice: string) { - this.currentActiveDevice = newActiveDevice; - } + public getCurrentActiveDevice(): string { + return this.currentActiveDevice; + } + public setCurrentActiveDevice(newActiveDevice: string) { + this.currentActiveDevice = newActiveDevice; + } } diff --git a/Source/service/fileSelectionService.ts b/Source/service/fileSelectionService.ts index 5ee5e8ef9..d5b0eea11 100644 --- a/Source/service/fileSelectionService.ts +++ b/Source/service/fileSelectionService.ts @@ -5,91 +5,91 @@ import { DeviceSelectionService } from "./deviceSelectionService"; import { MessagingService } from "./messagingService"; export class FileSelectionService { - private currentFileAbsPath: string = ""; - private currentTextDocument: vscode.TextDocument; - private messagingService: MessagingService; + private currentFileAbsPath: string = ""; + private currentTextDocument: vscode.TextDocument; + private messagingService: MessagingService; - constructor(messagingService: MessagingService) { - this.messagingService = messagingService; - } + constructor(messagingService: MessagingService) { + this.messagingService = messagingService; + } - public getCurrentFileAbsPath() { - return this.currentFileAbsPath; - } - public getCurrentTextDocument() { - return this.currentTextDocument; - } - public updateCurrentFileFromTextFile = async ( - activeTextDocument: vscode.TextDocument | undefined - ) => { - if (activeTextDocument) { - await this.updateCurrentFileFromEditor({ - document: activeTextDocument, - } as vscode.TextEditor); - } else { - return; - } - }; - public updateCurrentFileFromEditor = async ( - activeTextDocument: vscode.TextEditor | undefined - ) => { - if ( - activeTextDocument && - activeTextDocument.document && - activeTextDocument.document.languageId === "python" - ) { - this.setPathAndSendMessage(activeTextDocument.document.fileName); - this.currentTextDocument = activeTextDocument.document; - } else if (this.currentFileAbsPath === "") { - this.setPathAndSendMessage(this.getActivePythonFile() || ""); - } - if ( - this.currentTextDocument && - this.getActiveEditorFromPath(this.currentTextDocument.fileName) === - undefined - ) { - await vscode.window.showTextDocument( - this.currentTextDocument, - vscode.ViewColumn.One - ); - } - }; - public findCurrentTextDocument() { - if (this.currentFileAbsPath) { - const foundDocument = this.getActiveEditorFromPath( - this.currentFileAbsPath - ); - if (foundDocument !== undefined) { - this.currentTextDocument = foundDocument; - } - } - } + public getCurrentFileAbsPath() { + return this.currentFileAbsPath; + } + public getCurrentTextDocument() { + return this.currentTextDocument; + } + public updateCurrentFileFromTextFile = async ( + activeTextDocument: vscode.TextDocument | undefined + ) => { + if (activeTextDocument) { + await this.updateCurrentFileFromEditor({ + document: activeTextDocument, + } as vscode.TextEditor); + } else { + return; + } + }; + public updateCurrentFileFromEditor = async ( + activeTextDocument: vscode.TextEditor | undefined + ) => { + if ( + activeTextDocument && + activeTextDocument.document && + activeTextDocument.document.languageId === "python" + ) { + this.setPathAndSendMessage(activeTextDocument.document.fileName); + this.currentTextDocument = activeTextDocument.document; + } else if (this.currentFileAbsPath === "") { + this.setPathAndSendMessage(this.getActivePythonFile() || ""); + } + if ( + this.currentTextDocument && + this.getActiveEditorFromPath(this.currentTextDocument.fileName) === + undefined + ) { + await vscode.window.showTextDocument( + this.currentTextDocument, + vscode.ViewColumn.One + ); + } + }; + public findCurrentTextDocument() { + if (this.currentFileAbsPath) { + const foundDocument = this.getActiveEditorFromPath( + this.currentFileAbsPath + ); + if (foundDocument !== undefined) { + this.currentTextDocument = foundDocument; + } + } + } - public setPathAndSendMessage = (newFilePath: string) => { - this.currentFileAbsPath = newFilePath; - this.messagingService.sendMessageToWebview( - VSCODE_MESSAGES_TO_WEBVIEW.CURRENT_FILE, - { - running_file: newFilePath, - } - ); - }; - private getActiveEditorFromPath = ( - filePath: string - ): vscode.TextDocument => { - const activeEditor = vscode.window.visibleTextEditors.find( - (editor: vscode.TextEditor) => editor.document.fileName === filePath - ); - return activeEditor ? activeEditor.document : undefined; - }; - private getActivePythonFile = () => { - const editors: vscode.TextEditor[] = vscode.window.visibleTextEditors; - const activeEditor = editors.find( - (editor) => editor.document.languageId === LANGUAGE_VARS.PYTHON.ID - ); - if (activeEditor) { - this.currentTextDocument = activeEditor.document; - } - return activeEditor ? activeEditor.document.fileName : ""; - }; + public setPathAndSendMessage = (newFilePath: string) => { + this.currentFileAbsPath = newFilePath; + this.messagingService.sendMessageToWebview( + VSCODE_MESSAGES_TO_WEBVIEW.CURRENT_FILE, + { + running_file: newFilePath, + } + ); + }; + private getActiveEditorFromPath = ( + filePath: string + ): vscode.TextDocument => { + const activeEditor = vscode.window.visibleTextEditors.find( + (editor: vscode.TextEditor) => editor.document.fileName === filePath + ); + return activeEditor ? activeEditor.document : undefined; + }; + private getActivePythonFile = () => { + const editors: vscode.TextEditor[] = vscode.window.visibleTextEditors; + const activeEditor = editors.find( + editor => editor.document.languageId === LANGUAGE_VARS.PYTHON.ID + ); + if (activeEditor) { + this.currentTextDocument = activeEditor.document; + } + return activeEditor ? activeEditor.document.fileName : ""; + }; } diff --git a/Source/service/messagingService.ts b/Source/service/messagingService.ts index a10caf3e8..c702ee268 100644 --- a/Source/service/messagingService.ts +++ b/Source/service/messagingService.ts @@ -4,35 +4,34 @@ import * as fs from "fs"; import { VSCODE_MESSAGES_TO_WEBVIEW } from "../view/constants"; import { DeviceSelectionService } from "./deviceSelectionService"; export class MessagingService { - private currentWebviewTarget: Webview | undefined; - private deviceSelectionService: DeviceSelectionService; + private currentWebviewTarget: Webview | undefined; + private deviceSelectionService: DeviceSelectionService; - constructor(deviceSelectionService: DeviceSelectionService) { - this.deviceSelectionService = deviceSelectionService; - } - public setWebview(webview: Webview) { - this.currentWebviewTarget = webview; - } + constructor(deviceSelectionService: DeviceSelectionService) { + this.deviceSelectionService = deviceSelectionService; + } + public setWebview(webview: Webview) { + this.currentWebviewTarget = webview; + } - // Send a message to webview if it exists - public sendMessageToWebview(command: string, stateToSend: Object) { - if (this.currentWebviewTarget) { - this.currentWebviewTarget.postMessage({ - command, - active_device: - this.deviceSelectionService.getCurrentActiveDevice(), - state: { ...stateToSend }, - }); - } - } - public sendStartMessage() { - this.currentWebviewTarget.postMessage({ - command: VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE, - }); - } - public sendPauseMessage() { - this.currentWebviewTarget.postMessage({ - command: VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE, - }); - } + // Send a message to webview if it exists + public sendMessageToWebview(command: string, stateToSend: Object) { + if (this.currentWebviewTarget) { + this.currentWebviewTarget.postMessage({ + command, + active_device: this.deviceSelectionService.getCurrentActiveDevice(), + state: { ...stateToSend }, + }); + } + } + public sendStartMessage() { + this.currentWebviewTarget.postMessage({ + command: VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE, + }); + } + public sendPauseMessage() { + this.currentWebviewTarget.postMessage({ + command: VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE, + }); + } } diff --git a/Source/service/setupService.ts b/Source/service/setupService.ts index 2b0a26760..f5c80e037 100644 --- a/Source/service/setupService.ts +++ b/Source/service/setupService.ts @@ -3,576 +3,574 @@ import * as os from "os"; import * as path from "path"; import * as vscode from "vscode"; import { - CONFIG, - CONSTANTS, - DialogResponses, - GLOBAL_ENV_VARS, - HELPER_FILES, - TelemetryEventName, - VERSIONS, + CONFIG, + CONSTANTS, + DialogResponses, + GLOBAL_ENV_VARS, + HELPER_FILES, + TelemetryEventName, + VERSIONS, } from "../constants"; import { - checkConfig, - createEscapedPath, - exec, - getConfig, - getPathToScript, - showPrivacyModal, + checkConfig, + createEscapedPath, + exec, + getConfig, + getPathToScript, + showPrivacyModal, } from "../extension_utils/utils"; import TelemetryAI from "../telemetry/telemetryAI"; export class SetupService { - private telemetryAI: TelemetryAI; - - constructor(telemetryAI: TelemetryAI) { - this.telemetryAI = telemetryAI; - } - - public setupEnv = async ( - context: vscode.ExtensionContext, - needsResponse: boolean = false - ) => { - const originalPythonExecutablePath = - await this.getCurrentPythonExecutablePath(); - if (originalPythonExecutablePath === "") { - return; - } - let pythonExecutablePath = originalPythonExecutablePath; - const pythonExecutableName: string = - os.platform() === "win32" - ? HELPER_FILES.PYTHON_EXE - : HELPER_FILES.PYTHON; - - if ( - !(await this.areDependenciesInstalled( - context, - pythonExecutablePath - )) - ) { - // environment needs to install dependencies - if (!(await this.checkIfVenv(context, pythonExecutablePath))) { - const pythonExecutablePathVenv = await this.getPythonVenv( - context, - pythonExecutableName - ); - if (await this.hasVenv(context)) { - // venv in extention exists with wrong dependencies - - if ( - !(await this.areDependenciesInstalled( - context, - pythonExecutablePathVenv - )) - ) { - pythonExecutablePath = - await this.installDependenciesWrapper( - context, - pythonExecutablePathVenv, - pythonExecutablePath - ); - } else { - pythonExecutablePath = pythonExecutablePathVenv; - } - } else { - pythonExecutablePath = await this.promptInstallVenv( - context, - originalPythonExecutablePath, - pythonExecutableName - ); - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INSTALL_VENV - ); - } - - if (pythonExecutablePath === pythonExecutablePathVenv) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.UPDATED_TO_EXTENSION_VENV - ); - vscode.workspace - .getConfiguration() - .update(CONFIG.PYTHON_PATH, pythonExecutablePath); - } - } else { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_HAS_VENV - ); - } - if (pythonExecutablePath === originalPythonExecutablePath) { - // going with original interpreter, either because - // already in venv or error in creating custom venv - if (checkConfig(CONFIG.SHOW_DEPENDENCY_INSTALL)) { - await vscode.window - .showInformationMessage( - CONSTANTS.INFO.INSTALL_PYTHON_DEPS, - DialogResponses.INSTALL_NOW, - DialogResponses.DONT_INSTALL - ) - .then( - async ( - installChoice: vscode.MessageItem | undefined - ) => { - if ( - installChoice === - DialogResponses.INSTALL_NOW - ) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL - ); - await this.installDependenciesWrapper( - context, - pythonExecutablePath - ); - } else { - await vscode.window - .showInformationMessage( - CONSTANTS.INFO.ARE_YOU_SURE, - DialogResponses.INSTALL_NOW, - DialogResponses.DONT_INSTALL - ) - .then( - async ( - installChoice2: - | vscode.MessageItem - | undefined - ) => { - if ( - installChoice2 === - DialogResponses.INSTALL_NOW - ) { - await this.installDependenciesWrapper( - context, - pythonExecutablePath - ); - } else { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_NO_DEPS_INSTALLED - ); - } - } - ); - } - } - ); - } - } - } else if (needsResponse) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.ALREADY_SUCCESSFUL_INSTALL - ); - } - - return pythonExecutablePath; - }; - - public getCurrentPythonExecutablePath = async ( - isTryingPython3: boolean = false - ) => { - let originalPythonExecutablePath = ""; - const systemPythonVar = isTryingPython3 - ? GLOBAL_ENV_VARS.PYTHON3 - : GLOBAL_ENV_VARS.PYTHON; - // try to get name from interpreter - try { - originalPythonExecutablePath = getConfig(CONFIG.PYTHON_PATH); - } catch (err) { - originalPythonExecutablePath = systemPythonVar; - } - - if ( - originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON3 || - originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON || - originalPythonExecutablePath === "" - ) { - // catching any instance where the python path needs to be resolved - // from an system variable - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_AUTO_RESOLVE_PYTHON_PATH - ); - try { - const { stdout } = await this.executePythonCommand( - systemPythonVar, - `-c "import sys; print(sys.executable)"` - ); - originalPythonExecutablePath = stdout.trim(); - } catch (err) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_NO_PYTHON_PATH - ); - if (isTryingPython3) { - // if trying python3 failed, that means that BOTH - // python and python3 failed as system variables - // so that means that there is no python - vscode.window - .showErrorMessage( - CONSTANTS.ERROR.NO_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.INSTALL_PYTHON) { - const okAction = () => { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON - ); - open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON - ); - } - }); - // no python installed, cannot get path - return ""; - } else { - // "python" didn't resolve to anything, trying "python3" - return this.getCurrentPythonExecutablePath(true); - } - } - if ( - !(await this.validatePythonVersion( - originalPythonExecutablePath - )) - ) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_VER - ); - if (isTryingPython3) { - // if we're trying python3, it means we already tried python and it - // all doesn't seem to work, but it got this far, so it means that - // their system python3 version is still not above 3.7, but they - // don't have a path selected. - vscode.window - .showInformationMessage( - CONSTANTS.ERROR.INVALID_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON - ) - .then( - (installChoice: vscode.MessageItem | undefined) => { - if ( - installChoice === - DialogResponses.INSTALL_PYTHON - ) { - const okAction = () => { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON - ); - open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO - .THIRD_PARTY_WEBSITE_PYTHON - ); - } - } - ); - return ""; - } else { - // otherwise, we ran the "python" system variable - // and we can try python3 - return this.getCurrentPythonExecutablePath(true); - } - } - } else { - // should only be applicable if the user defined their own path - - // fix path to be absolute - if (!path.isAbsolute(originalPythonExecutablePath)) { - originalPythonExecutablePath = path.join( - vscode.workspace.rootPath, - originalPythonExecutablePath - ); - } - - if (!fs.existsSync(originalPythonExecutablePath)) { - await vscode.window.showErrorMessage( - CONSTANTS.ERROR.BAD_PYTHON_PATH - ); - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_INTERPRETER_PATH - ); - return ""; - } - - if ( - !(await this.validatePythonVersion( - originalPythonExecutablePath - )) - ) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_VER - ); - vscode.window - .showInformationMessage( - CONSTANTS.ERROR.INVALID_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON - ) - .then((installChoice: vscode.MessageItem | undefined) => { - if (installChoice === DialogResponses.INSTALL_PYTHON) { - const okAction = () => { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON - ); - open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON - ); - } - }); - return ""; - } - } - - return originalPythonExecutablePath; - }; - - public isPipInstalled = async (pythonExecutablePath: string) => { - try { - await this.executePythonCommand(pythonExecutablePath, " -m pip"); - return true; - } catch (err) { - vscode.window - .showErrorMessage( - `We found that you may not have Pip installed on your interpreter at ${pythonExecutablePath}, please install it and try again.`, - DialogResponses.INSTALL_PIP - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.INSTALL_PIP) { - const okAction = () => { - open(CONSTANTS.LINKS.DOWNLOAD_PIP); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PIP - ); - } - }); - return false; - } - }; - - public checkIfVenv = async ( - context: vscode.ExtensionContext, - pythonExecutablePath: string - ) => { - const venvCheckerPath: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.CHECK_IF_VENV_PY - ); - const { stdout } = await this.executePythonCommand( - pythonExecutablePath, - `"${venvCheckerPath}"` - ); - return stdout.trim() === "1"; - }; - - public executePythonCommand = async ( - pythonExecutablePath: string, - command: string - ) => { - return exec(`${createEscapedPath(pythonExecutablePath)} ${command}`); - }; - - public validatePythonVersion = async (pythonExecutablePath: string) => { - const { stdout } = await this.executePythonCommand( - pythonExecutablePath, - "--version" - ); - if (stdout < VERSIONS.MIN_PY_VERSION) { - return false; - } else { - return true; - } - }; - - public hasVenv = async (context: vscode.ExtensionContext) => { - const pathToEnv: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR - ); - - return fs.existsSync(pathToEnv); - }; - - public promptInstallVenv = ( - context: vscode.ExtensionContext, - pythonExecutable: string, - pythonExecutableName: string - ) => { - return vscode.window - .showInformationMessage( - CONSTANTS.INFO.INSTALL_PYTHON_VENV, - DialogResponses.YES, - DialogResponses.NO - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.YES) { - return this.installPythonVenv( - context, - pythonExecutable, - pythonExecutableName - ); - } else { - // return pythonExecutable, notifying the caller - // that the user was unwilling to create venv - // and by default, this will trigger the extension to - // try using pythonExecutable - return pythonExecutable; - } - }); - }; - - public getPythonVenv = async ( - context: vscode.ExtensionContext, - pythonExecutableName: string - ) => { - const subFolder = os.platform() === "win32" ? "Scripts" : "bin"; - - return getPathToScript( - context, - path.join(CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR, subFolder), - pythonExecutableName - ); - }; - - public installPythonVenv = async ( - context: vscode.ExtensionContext, - pythonExecutable: string, - pythonExecutableName: string - ) => { - const pathToEnv: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR - ); - - vscode.window.showInformationMessage( - CONSTANTS.INFO.INSTALLING_PYTHON_VENV - ); - - const pythonPath: string = await this.getPythonVenv( - context, - pythonExecutableName - ); - - try { - // make venv - // run command to download dependencies to out/python_libs - await this.executePythonCommand( - pythonExecutable, - `-m venv "${pathToEnv}"` - ); - } catch (err) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_VENV_CREATION_ERR - ); - vscode.window - .showErrorMessage( - `Virtual environment for download could not be completed. Using original interpreter at: ${pythonExecutable}. If you're on Linux, try running "sudo apt-get install python3-venv".`, - DialogResponses.READ_INSTALL_MD - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.READ_INSTALL_MD) { - open(CONSTANTS.LINKS.INSTALL); - } - }); - - console.error(err); - - return pythonExecutable; - } - - return this.installDependenciesWrapper( - context, - pythonPath, - pythonExecutable - ); - }; - - public areDependenciesInstalled = async ( - context: vscode.ExtensionContext, - pythonPath: string - ) => { - const dependencyCheckerPath: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.CHECK_PYTHON_DEPENDENCIES - ); - try { - // python script will throw exception - // if not all dependencies are downloaded - const { stdout } = await this.executePythonCommand( - pythonPath, - `"${dependencyCheckerPath}"` - ); - - // output for debugging purposes - console.info(stdout); - return true; - } catch (err) { - return false; - } - }; - - public installDependencies = async ( - context: vscode.ExtensionContext, - pythonPath: string - ) => { - const requirementsPyInstallPath: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - "install_dependencies.py" - ); - - if (!this.isPipInstalled(pythonPath)) { - this.telemetryAI.trackFeatureUsage(TelemetryEventName.SETUP_NO_PIP); - return false; - } - - try { - const { stdout } = await this.executePythonCommand( - pythonPath, - `"${requirementsPyInstallPath}"` - ); - console.log(`DSE ${stdout}`); - vscode.window.showInformationMessage( - CONSTANTS.INFO.SUCCESSFUL_INSTALL - ); - return true; - } catch (err) { - console.log(`DSE ${err}`); - return false; - } - }; - - public installDependenciesWrapper = async ( - context: vscode.ExtensionContext, - pythonPath: string, - backupPythonPath: string = "" - ) => { - let errMessage = CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR; - if (backupPythonPath !== "") { - errMessage = `${errMessage} Using original interpreter at: ${backupPythonPath}.`; - } - if (!(await this.installDependencies(context, pythonPath))) { - vscode.window - .showErrorMessage( - CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR, - DialogResponses.READ_INSTALL_MD - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.READ_INSTALL_MD) { - open(CONSTANTS.LINKS.INSTALL); - } - }); - - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DEP_INSTALL_FAIL - ); - return backupPythonPath; - } - return pythonPath; - }; + private telemetryAI: TelemetryAI; + + constructor(telemetryAI: TelemetryAI) { + this.telemetryAI = telemetryAI; + } + + public setupEnv = async ( + context: vscode.ExtensionContext, + needsResponse: boolean = false + ) => { + const originalPythonExecutablePath = await this.getCurrentPythonExecutablePath(); + if (originalPythonExecutablePath === "") { + return; + } + let pythonExecutablePath = originalPythonExecutablePath; + const pythonExecutableName: string = + os.platform() === "win32" + ? HELPER_FILES.PYTHON_EXE + : HELPER_FILES.PYTHON; + + if ( + !(await this.areDependenciesInstalled( + context, + pythonExecutablePath + )) + ) { + // environment needs to install dependencies + if (!(await this.checkIfVenv(context, pythonExecutablePath))) { + const pythonExecutablePathVenv = await this.getPythonVenv( + context, + pythonExecutableName + ); + if (await this.hasVenv(context)) { + // venv in extention exists with wrong dependencies + + if ( + !(await this.areDependenciesInstalled( + context, + pythonExecutablePathVenv + )) + ) { + pythonExecutablePath = await this.installDependenciesWrapper( + context, + pythonExecutablePathVenv, + pythonExecutablePath + ); + } else { + pythonExecutablePath = pythonExecutablePathVenv; + } + } else { + pythonExecutablePath = await this.promptInstallVenv( + context, + originalPythonExecutablePath, + pythonExecutableName + ); + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INSTALL_VENV + ); + } + + if (pythonExecutablePath === pythonExecutablePathVenv) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.UPDATED_TO_EXTENSION_VENV + ); + vscode.workspace + .getConfiguration() + .update(CONFIG.PYTHON_PATH, pythonExecutablePath); + } + } else { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_HAS_VENV + ); + } + if (pythonExecutablePath === originalPythonExecutablePath) { + // going with original interpreter, either because + // already in venv or error in creating custom venv + if (checkConfig(CONFIG.SHOW_DEPENDENCY_INSTALL)) { + await vscode.window + .showInformationMessage( + CONSTANTS.INFO.INSTALL_PYTHON_DEPS, + DialogResponses.INSTALL_NOW, + DialogResponses.DONT_INSTALL + ) + .then( + async ( + installChoice: vscode.MessageItem | undefined + ) => { + if ( + installChoice === + DialogResponses.INSTALL_NOW + ) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL + ); + await this.installDependenciesWrapper( + context, + pythonExecutablePath + ); + } else { + await vscode.window + .showInformationMessage( + CONSTANTS.INFO.ARE_YOU_SURE, + DialogResponses.INSTALL_NOW, + DialogResponses.DONT_INSTALL + ) + .then( + async ( + installChoice2: + | vscode.MessageItem + | undefined + ) => { + if ( + installChoice2 === + DialogResponses.INSTALL_NOW + ) { + await this.installDependenciesWrapper( + context, + pythonExecutablePath + ); + } else { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_NO_DEPS_INSTALLED + ); + } + } + ); + } + } + ); + } + } + } else if (needsResponse) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.ALREADY_SUCCESSFUL_INSTALL + ); + } + + return pythonExecutablePath; + }; + + public getCurrentPythonExecutablePath = async ( + isTryingPython3: boolean = false + ) => { + let originalPythonExecutablePath = ""; + const systemPythonVar = isTryingPython3 + ? GLOBAL_ENV_VARS.PYTHON3 + : GLOBAL_ENV_VARS.PYTHON; + // try to get name from interpreter + try { + originalPythonExecutablePath = getConfig(CONFIG.PYTHON_PATH); + } catch (err) { + originalPythonExecutablePath = systemPythonVar; + } + + if ( + originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON3 || + originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON || + originalPythonExecutablePath === "" + ) { + // catching any instance where the python path needs to be resolved + // from an system variable + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_AUTO_RESOLVE_PYTHON_PATH + ); + try { + const { stdout } = await this.executePythonCommand( + systemPythonVar, + `-c "import sys; print(sys.executable)"` + ); + originalPythonExecutablePath = stdout.trim(); + } catch (err) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_NO_PYTHON_PATH + ); + if (isTryingPython3) { + // if trying python3 failed, that means that BOTH + // python and python3 failed as system variables + // so that means that there is no python + vscode.window + .showErrorMessage( + CONSTANTS.ERROR.NO_PYTHON_PATH, + DialogResponses.INSTALL_PYTHON + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.INSTALL_PYTHON) { + const okAction = () => { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DOWNLOAD_PYTHON + ); + open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON + ); + } + }); + // no python installed, cannot get path + return ""; + } else { + // "python" didn't resolve to anything, trying "python3" + return this.getCurrentPythonExecutablePath(true); + } + } + if ( + !(await this.validatePythonVersion( + originalPythonExecutablePath + )) + ) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INVALID_PYTHON_VER + ); + if (isTryingPython3) { + // if we're trying python3, it means we already tried python and it + // all doesn't seem to work, but it got this far, so it means that + // their system python3 version is still not above 3.7, but they + // don't have a path selected. + vscode.window + .showInformationMessage( + CONSTANTS.ERROR.INVALID_PYTHON_PATH, + DialogResponses.INSTALL_PYTHON + ) + .then( + (installChoice: vscode.MessageItem | undefined) => { + if ( + installChoice === + DialogResponses.INSTALL_PYTHON + ) { + const okAction = () => { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DOWNLOAD_PYTHON + ); + open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO + .THIRD_PARTY_WEBSITE_PYTHON + ); + } + } + ); + return ""; + } else { + // otherwise, we ran the "python" system variable + // and we can try python3 + return this.getCurrentPythonExecutablePath(true); + } + } + } else { + // should only be applicable if the user defined their own path + + // fix path to be absolute + if (!path.isAbsolute(originalPythonExecutablePath)) { + originalPythonExecutablePath = path.join( + vscode.workspace.rootPath, + originalPythonExecutablePath + ); + } + + if (!fs.existsSync(originalPythonExecutablePath)) { + await vscode.window.showErrorMessage( + CONSTANTS.ERROR.BAD_PYTHON_PATH + ); + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INVALID_PYTHON_INTERPRETER_PATH + ); + return ""; + } + + if ( + !(await this.validatePythonVersion( + originalPythonExecutablePath + )) + ) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INVALID_PYTHON_VER + ); + vscode.window + .showInformationMessage( + CONSTANTS.ERROR.INVALID_PYTHON_PATH, + DialogResponses.INSTALL_PYTHON + ) + .then((installChoice: vscode.MessageItem | undefined) => { + if (installChoice === DialogResponses.INSTALL_PYTHON) { + const okAction = () => { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DOWNLOAD_PYTHON + ); + open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON + ); + } + }); + return ""; + } + } + + return originalPythonExecutablePath; + }; + + public isPipInstalled = async (pythonExecutablePath: string) => { + try { + await this.executePythonCommand(pythonExecutablePath, " -m pip"); + return true; + } catch (err) { + vscode.window + .showErrorMessage( + `We found that you may not have Pip installed on your interpreter at ${pythonExecutablePath}, please install it and try again.`, + DialogResponses.INSTALL_PIP + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.INSTALL_PIP) { + const okAction = () => { + open(CONSTANTS.LINKS.DOWNLOAD_PIP); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PIP + ); + } + }); + return false; + } + }; + + public checkIfVenv = async ( + context: vscode.ExtensionContext, + pythonExecutablePath: string + ) => { + const venvCheckerPath: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.CHECK_IF_VENV_PY + ); + const { stdout } = await this.executePythonCommand( + pythonExecutablePath, + `"${venvCheckerPath}"` + ); + return stdout.trim() === "1"; + }; + + public executePythonCommand = async ( + pythonExecutablePath: string, + command: string + ) => { + return exec(`${createEscapedPath(pythonExecutablePath)} ${command}`); + }; + + public validatePythonVersion = async (pythonExecutablePath: string) => { + const { stdout } = await this.executePythonCommand( + pythonExecutablePath, + "--version" + ); + if (stdout < VERSIONS.MIN_PY_VERSION) { + return false; + } else { + return true; + } + }; + + public hasVenv = async (context: vscode.ExtensionContext) => { + const pathToEnv: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR + ); + + return fs.existsSync(pathToEnv); + }; + + public promptInstallVenv = ( + context: vscode.ExtensionContext, + pythonExecutable: string, + pythonExecutableName: string + ) => { + return vscode.window + .showInformationMessage( + CONSTANTS.INFO.INSTALL_PYTHON_VENV, + DialogResponses.YES, + DialogResponses.NO + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.YES) { + return this.installPythonVenv( + context, + pythonExecutable, + pythonExecutableName + ); + } else { + // return pythonExecutable, notifying the caller + // that the user was unwilling to create venv + // and by default, this will trigger the extension to + // try using pythonExecutable + return pythonExecutable; + } + }); + }; + + public getPythonVenv = async ( + context: vscode.ExtensionContext, + pythonExecutableName: string + ) => { + const subFolder = os.platform() === "win32" ? "Scripts" : "bin"; + + return getPathToScript( + context, + path.join(CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR, subFolder), + pythonExecutableName + ); + }; + + public installPythonVenv = async ( + context: vscode.ExtensionContext, + pythonExecutable: string, + pythonExecutableName: string + ) => { + const pathToEnv: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR + ); + + vscode.window.showInformationMessage( + CONSTANTS.INFO.INSTALLING_PYTHON_VENV + ); + + const pythonPath: string = await this.getPythonVenv( + context, + pythonExecutableName + ); + + try { + // make venv + // run command to download dependencies to out/python_libs + await this.executePythonCommand( + pythonExecutable, + `-m venv "${pathToEnv}"` + ); + } catch (err) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_VENV_CREATION_ERR + ); + vscode.window + .showErrorMessage( + `Virtual environment for download could not be completed. Using original interpreter at: ${pythonExecutable}. If you're on Linux, try running "sudo apt-get install python3-venv".`, + DialogResponses.READ_INSTALL_MD + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.READ_INSTALL_MD) { + open(CONSTANTS.LINKS.INSTALL); + } + }); + + console.error(err); + + return pythonExecutable; + } + + return this.installDependenciesWrapper( + context, + pythonPath, + pythonExecutable + ); + }; + + public areDependenciesInstalled = async ( + context: vscode.ExtensionContext, + pythonPath: string + ) => { + const dependencyCheckerPath: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.CHECK_PYTHON_DEPENDENCIES + ); + try { + // python script will throw exception + // if not all dependencies are downloaded + const { stdout } = await this.executePythonCommand( + pythonPath, + `"${dependencyCheckerPath}"` + ); + + // output for debugging purposes + console.info(stdout); + return true; + } catch (err) { + return false; + } + }; + + public installDependencies = async ( + context: vscode.ExtensionContext, + pythonPath: string + ) => { + const requirementsPyInstallPath: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + "install_dependencies.py" + ); + + if (!this.isPipInstalled(pythonPath)) { + this.telemetryAI.trackFeatureUsage(TelemetryEventName.SETUP_NO_PIP); + return false; + } + + try { + const { stdout } = await this.executePythonCommand( + pythonPath, + `"${requirementsPyInstallPath}"` + ); + console.log(`DSE ${stdout}`); + vscode.window.showInformationMessage( + CONSTANTS.INFO.SUCCESSFUL_INSTALL + ); + return true; + } catch (err) { + console.log(`DSE ${err}`); + return false; + } + }; + + public installDependenciesWrapper = async ( + context: vscode.ExtensionContext, + pythonPath: string, + backupPythonPath: string = "" + ) => { + let errMessage = CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR; + if (backupPythonPath !== "") { + errMessage = `${errMessage} Using original interpreter at: ${backupPythonPath}.`; + } + if (!(await this.installDependencies(context, pythonPath))) { + vscode.window + .showErrorMessage( + CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR, + DialogResponses.READ_INSTALL_MD + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.READ_INSTALL_MD) { + open(CONSTANTS.LINKS.INSTALL); + } + }); + + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DEP_INSTALL_FAIL + ); + return backupPythonPath; + } + return pythonPath; + }; } diff --git a/Source/service/telemetryHandlerService.ts b/Source/service/telemetryHandlerService.ts index e76bea74c..f16141f65 100644 --- a/Source/service/telemetryHandlerService.ts +++ b/Source/service/telemetryHandlerService.ts @@ -6,551 +6,551 @@ import TelemetryAI from "../telemetry/telemetryAI"; import { DeviceSelectionService } from "./deviceSelectionService"; export class TelemetryHandlerService { - private telemetryAI: TelemetryAI; - private deviceSelectionService: DeviceSelectionService; + private telemetryAI: TelemetryAI; + private deviceSelectionService: DeviceSelectionService; - constructor( - telemetryAI: TelemetryAI, - deviceSelectionService: DeviceSelectionService - ) { - this.telemetryAI = telemetryAI; - this.deviceSelectionService = deviceSelectionService; - } + constructor( + telemetryAI: TelemetryAI, + deviceSelectionService: DeviceSelectionService + ) { + this.telemetryAI = telemetryAI; + this.deviceSelectionService = deviceSelectionService; + } - public handleDebuggerTelemetry = () => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_DEBUGGER_INIT_SUCCESS - ); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_DEBUGGER_INIT_SUCCESS - ); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_DEBUGGER_INIT_SUCCESS - ); - break; - default: - break; - } - }; + public handleDebuggerTelemetry = () => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_DEBUGGER_INIT_SUCCESS + ); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_DEBUGGER_INIT_SUCCESS + ); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_DEBUGGER_INIT_SUCCESS + ); + break; + default: + break; + } + }; - public handleDebuggerFailTelemetry = () => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_DEBUGGER_INIT_FAIL - ); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_DEBUGGER_INIT_FAIL - ); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_DEBUGGER_INIT_FAIL - ); - break; - default: - break; - } - }; + public handleDebuggerFailTelemetry = () => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_DEBUGGER_INIT_FAIL + ); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_DEBUGGER_INIT_FAIL + ); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_DEBUGGER_INIT_FAIL + ); + break; + default: + break; + } + }; - public handleButtonPressTelemetry = (buttonState: any) => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.handleCPXButtonPressTelemetry(buttonState); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.handleMicrobitButtonPressTelemetry(buttonState); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.handleClueButtonPressTelemetry(buttonState); - break; - default: - break; - } - }; + public handleButtonPressTelemetry = (buttonState: any) => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.handleCPXButtonPressTelemetry(buttonState); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.handleMicrobitButtonPressTelemetry(buttonState); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.handleClueButtonPressTelemetry(buttonState); + break; + default: + break; + } + }; - public handleGestureTelemetry = (sensorState: any) => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.handleCPXGestureTelemetry(sensorState); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - break; - default: - break; - } - }; + public handleGestureTelemetry = (sensorState: any) => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.handleCPXGestureTelemetry(sensorState); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + break; + default: + break; + } + }; - public handleSensorTelemetry = (sensor: string) => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.handleCPXSensorTelemetry(sensor); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.handleMicrobitSensorTelemetry(sensor); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.handleClueSensorTelemetry(sensor); - break; - default: - break; - } - }; + public handleSensorTelemetry = (sensor: string) => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.handleCPXSensorTelemetry(sensor); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.handleMicrobitSensorTelemetry(sensor); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.handleClueSensorTelemetry(sensor); + break; + default: + break; + } + }; - public handleCPXButtonPressTelemetry = (buttonState: any) => { - if (buttonState.button_a && buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_BUTTON_AB - ); - } else if (buttonState.button_a) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_BUTTON_A - ); - } else if (buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_BUTTON_B - ); - } else if (buttonState.switch) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_SWITCH - ); - } - }; + public handleCPXButtonPressTelemetry = (buttonState: any) => { + if (buttonState.button_a && buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_BUTTON_AB + ); + } else if (buttonState.button_a) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_BUTTON_A + ); + } else if (buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_BUTTON_B + ); + } else if (buttonState.switch) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_SWITCH + ); + } + }; - public handleCPXGestureTelemetry = (sensorState: any) => { - if (sensorState.shake) { - this.handleCPXSensorTelemetry("shake"); - } else if (sensorState.touch) { - this.handleCPXSensorTelemetry("touch"); - } - }; + public handleCPXGestureTelemetry = (sensorState: any) => { + if (sensorState.shake) { + this.handleCPXSensorTelemetry("shake"); + } else if (sensorState.touch) { + this.handleCPXSensorTelemetry("touch"); + } + }; - public handleCPXSensorTelemetry = (sensor: string) => { - switch (sensor) { - case "temperature": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_TEMPERATURE_SENSOR - ); - break; - case "light": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_LIGHT_SENSOR - ); - break; - case "motion_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR - ); - break; - case "shake": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_SHAKE - ); - break; - case "touch": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_CAPACITIVE_TOUCH - ); - break; - } - }; + public handleCPXSensorTelemetry = (sensor: string) => { + switch (sensor) { + case "temperature": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_TEMPERATURE_SENSOR + ); + break; + case "light": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_LIGHT_SENSOR + ); + break; + case "motion_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR + ); + break; + case "shake": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_SHAKE + ); + break; + case "touch": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_CAPACITIVE_TOUCH + ); + break; + } + }; - public handleMicrobitButtonPressTelemetry = (buttonState: any) => { - if (buttonState.button_a && buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_AB - ); - } else if (buttonState.button_a) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_A - ); - } else if (buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_B - ); - } - }; + public handleMicrobitButtonPressTelemetry = (buttonState: any) => { + if (buttonState.button_a && buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_AB + ); + } else if (buttonState.button_a) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_A + ); + } else if (buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_B + ); + } + }; - public handleMicrobitSensorTelemetry = (sensor: string) => { - switch (sensor) { - case "temperature": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_TEMPERATURE_SENSOR - ); - break; - case "light": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_LIGHT_SENSOR - ); - break; - case "motion_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR - ); - break; - case "gesture": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_GESTURE_SENSOR - ); - break; - } - }; + public handleMicrobitSensorTelemetry = (sensor: string) => { + switch (sensor) { + case "temperature": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_TEMPERATURE_SENSOR + ); + break; + case "light": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_LIGHT_SENSOR + ); + break; + case "motion_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR + ); + break; + case "gesture": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_GESTURE_SENSOR + ); + break; + } + }; - public handleClueButtonPressTelemetry = (buttonState: any) => { - if (buttonState.button_a && buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_BUTTON_AB - ); - } else if (buttonState.button_a) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_BUTTON_A - ); - } else if (buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_BUTTON_B - ); - } - }; + public handleClueButtonPressTelemetry = (buttonState: any) => { + if (buttonState.button_a && buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_BUTTON_AB + ); + } else if (buttonState.button_a) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_BUTTON_A + ); + } else if (buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_BUTTON_B + ); + } + }; - public handleClueSensorTelemetry = (sensor: string) => { - switch (sensor) { - case "temperature": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_TEMPERATURE_SENSOR - ); - break; - case "light_r": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "light_g": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "light_b": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "light_c": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "motion_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR - ); - break; - case "gesture": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GESTURE_SENSOR - ); - break; - case "humidity": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_HUMIDITY_SENSOR - ); - break; - case "pressure": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_PRESSURE_SENSOR - ); - break; - case "proximity": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_PROXIMITY_SENSOR - ); - break; - case "gyro_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR - ); - break; - case "gyro_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR - ); - break; - case "gyro_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR - ); - break; - case "magnet_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR - ); - break; - case "magnet_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR - ); - break; - case "magnet_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR - ); - break; - } - }; + public handleClueSensorTelemetry = (sensor: string) => { + switch (sensor) { + case "temperature": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_TEMPERATURE_SENSOR + ); + break; + case "light_r": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR + ); + break; + case "light_g": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR + ); + break; + case "light_b": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR + ); + break; + case "light_c": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR + ); + break; + case "motion_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR + ); + break; + case "motion_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR + ); + break; + case "gesture": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GESTURE_SENSOR + ); + break; + case "humidity": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_HUMIDITY_SENSOR + ); + break; + case "pressure": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_PRESSURE_SENSOR + ); + break; + case "proximity": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_PROXIMITY_SENSOR + ); + break; + case "gyro_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR + ); + break; + case "gyro_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR + ); + break; + case "gyro_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR + ); + break; + case "magnet_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR + ); + break; + case "magnet_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR + ); + break; + case "magnet_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR + ); + break; + } + }; - public handleNewFileErrorTelemetry = () => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_ERROR_COMMAND_NEW_FILE - ); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_ERROR_COMMAND_NEW_FILE - ); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_ERROR_COMMAND_NEW_FILE - ); - break; - default: - break; - } - }; + public handleNewFileErrorTelemetry = () => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_ERROR_COMMAND_NEW_FILE + ); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_ERROR_COMMAND_NEW_FILE + ); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_ERROR_COMMAND_NEW_FILE + ); + break; + default: + break; + } + }; - public getTelemetryEventsForStartingDeployToDevice = (device: string) => { - let deployTelemetryEvent: string; - let deployPerformanceTelemetryEvent: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - deployTelemetryEvent = - TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; - deployPerformanceTelemetryEvent = - TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - deployTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; - deployPerformanceTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - deployTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; - deployPerformanceTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; - break; - } - return { - deployTelemetryEvent, - deployPerformanceTelemetryEvent, - }; - }; + public getTelemetryEventsForStartingDeployToDevice = (device: string) => { + let deployTelemetryEvent: string; + let deployPerformanceTelemetryEvent: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + deployTelemetryEvent = + TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; + deployPerformanceTelemetryEvent = + TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + deployTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; + deployPerformanceTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + deployTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; + deployPerformanceTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; + break; + } + return { + deployTelemetryEvent, + deployPerformanceTelemetryEvent, + }; + }; - public handleDeployToDeviceErrorTelemetry = ( - data: string, - device: string - ) => { - let telemetryErrorName: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - telemetryErrorName = - TelemetryEventName.CPX_ERROR_PYTHON_DEVICE_PROCESS; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - telemetryErrorName = - TelemetryEventName.MICROBIT_ERROR_PYTHON_DEVICE_PROCESS; - case CONSTANTS.DEVICE_NAME.CLUE: - telemetryErrorName = - TelemetryEventName.CLUE_ERROR_PYTHON_DEVICE_PROCESS; - } - this.telemetryAI.trackFeatureUsage(telemetryErrorName, { - error: `${data}`, - }); - }; + public handleDeployToDeviceErrorTelemetry = ( + data: string, + device: string + ) => { + let telemetryErrorName: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + telemetryErrorName = + TelemetryEventName.CPX_ERROR_PYTHON_DEVICE_PROCESS; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + telemetryErrorName = + TelemetryEventName.MICROBIT_ERROR_PYTHON_DEVICE_PROCESS; + case CONSTANTS.DEVICE_NAME.CLUE: + telemetryErrorName = + TelemetryEventName.CLUE_ERROR_PYTHON_DEVICE_PROCESS; + } + this.telemetryAI.trackFeatureUsage(telemetryErrorName, { + error: `${data}`, + }); + }; - public handleDeployToDeviceFinishedTelemetry = ( - message: any, - device: string - ) => { - let successCommandDeployDevice: string; - let errorCommandDeployWithoutDevice: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - successCommandDeployDevice = - TelemetryEventName.CPX_SUCCESS_COMMAND_DEPLOY_DEVICE; - errorCommandDeployWithoutDevice = - TelemetryEventName.CPX_ERROR_DEPLOY_WITHOUT_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - successCommandDeployDevice = - TelemetryEventName.MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE; - errorCommandDeployWithoutDevice = - TelemetryEventName.MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - successCommandDeployDevice = - TelemetryEventName.CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE; - errorCommandDeployWithoutDevice = - TelemetryEventName.CLUE_ERROR_DEPLOY_WITHOUT_DEVICE; - break; - } + public handleDeployToDeviceFinishedTelemetry = ( + message: any, + device: string + ) => { + let successCommandDeployDevice: string; + let errorCommandDeployWithoutDevice: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + successCommandDeployDevice = + TelemetryEventName.CPX_SUCCESS_COMMAND_DEPLOY_DEVICE; + errorCommandDeployWithoutDevice = + TelemetryEventName.CPX_ERROR_DEPLOY_WITHOUT_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + successCommandDeployDevice = + TelemetryEventName.MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE; + errorCommandDeployWithoutDevice = + TelemetryEventName.MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + successCommandDeployDevice = + TelemetryEventName.CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE; + errorCommandDeployWithoutDevice = + TelemetryEventName.CLUE_ERROR_DEPLOY_WITHOUT_DEVICE; + break; + } - switch (message.type) { - case "complete": - this.telemetryAI.trackFeatureUsage(successCommandDeployDevice); - break; - case "no-device": - this.telemetryAI.trackFeatureUsage( - errorCommandDeployWithoutDevice - ); - if ( - device === CONSTANTS.DEVICE_NAME.CPX || - device === CONSTANTS.DEVICE_NAME.CLUE - ) { - vscode.window - .showErrorMessage( - CONSTANTS.ERROR.NO_DEVICE, - DialogResponses.HELP - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.HELP) { - const okAction = () => { - let helpLink: string; - let helpTelemetryEvent: string; - if (device === CONSTANTS.DEVICE_NAME.CPX) { - helpLink = CONSTANTS.LINKS.CPX_HELP; - helpTelemetryEvent = - TelemetryEventName.CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; - } else if ( - device === CONSTANTS.DEVICE_NAME.CLUE - ) { - helpLink = CONSTANTS.LINKS.CLUE_HELP; - helpTelemetryEvent = - TelemetryEventName.CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; - } - open(helpLink); - this.telemetryAI.trackFeatureUsage( - helpTelemetryEvent - ); - }; - utils.showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT - ); - } - }); - } else if (device === CONSTANTS.DEVICE_NAME.MICROBIT) { - vscode.window.showErrorMessage(CONSTANTS.ERROR.NO_DEVICE); - } - break; - case "low-python-version": - vscode.window.showErrorMessage( - CONSTANTS.ERROR.LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT - ); - break; - default: - console.log( - `Non-state JSON output from the process : ${message}` - ); - break; - } - }; + switch (message.type) { + case "complete": + this.telemetryAI.trackFeatureUsage(successCommandDeployDevice); + break; + case "no-device": + this.telemetryAI.trackFeatureUsage( + errorCommandDeployWithoutDevice + ); + if ( + device === CONSTANTS.DEVICE_NAME.CPX || + device === CONSTANTS.DEVICE_NAME.CLUE + ) { + vscode.window + .showErrorMessage( + CONSTANTS.ERROR.NO_DEVICE, + DialogResponses.HELP + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.HELP) { + const okAction = () => { + let helpLink: string; + let helpTelemetryEvent: string; + if (device === CONSTANTS.DEVICE_NAME.CPX) { + helpLink = CONSTANTS.LINKS.CPX_HELP; + helpTelemetryEvent = + TelemetryEventName.CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; + } else if ( + device === CONSTANTS.DEVICE_NAME.CLUE + ) { + helpLink = CONSTANTS.LINKS.CLUE_HELP; + helpTelemetryEvent = + TelemetryEventName.CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; + } + open(helpLink); + this.telemetryAI.trackFeatureUsage( + helpTelemetryEvent + ); + }; + utils.showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT + ); + } + }); + } else if (device === CONSTANTS.DEVICE_NAME.MICROBIT) { + vscode.window.showErrorMessage(CONSTANTS.ERROR.NO_DEVICE); + } + break; + case "low-python-version": + vscode.window.showErrorMessage( + CONSTANTS.ERROR.LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT + ); + break; + default: + console.log( + `Non-state JSON output from the process : ${message}` + ); + break; + } + }; - public getTelemetryEventsForOpenSimulator = (device: string) => { - let openSimulatorTelemetryEvent: string; - let openSimulatorPerformanceTelemetryEvent: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - openSimulatorTelemetryEvent = - TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; - openSimulatorPerformanceTelemetryEvent = - TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - openSimulatorTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; - openSimulatorPerformanceTelemetryEvent = - TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - openSimulatorTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; - openSimulatorPerformanceTelemetryEvent = - TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; - break; - } - return { - openSimulatorTelemetryEvent, - openSimulatorPerformanceTelemetryEvent, - }; - }; + public getTelemetryEventsForOpenSimulator = (device: string) => { + let openSimulatorTelemetryEvent: string; + let openSimulatorPerformanceTelemetryEvent: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + openSimulatorTelemetryEvent = + TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; + openSimulatorPerformanceTelemetryEvent = + TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + openSimulatorTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; + openSimulatorPerformanceTelemetryEvent = + TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + openSimulatorTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; + openSimulatorPerformanceTelemetryEvent = + TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; + break; + } + return { + openSimulatorTelemetryEvent, + openSimulatorPerformanceTelemetryEvent, + }; + }; - public getTelemetryEventsForNewFile = (device: string) => { - let newFileTelemetryEvent: string; - let newFilePerformanceTelemetryEvent: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - newFileTelemetryEvent = - TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; - newFilePerformanceTelemetryEvent = - TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - newFileTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; - newFilePerformanceTelemetryEvent = - TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - newFileTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; - newFilePerformanceTelemetryEvent = - TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; - break; - } - return { - newFileTelemetryEvent, - newFilePerformanceTelemetryEvent, - }; - }; + public getTelemetryEventsForNewFile = (device: string) => { + let newFileTelemetryEvent: string; + let newFilePerformanceTelemetryEvent: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + newFileTelemetryEvent = + TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; + newFilePerformanceTelemetryEvent = + TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + newFileTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; + newFilePerformanceTelemetryEvent = + TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + newFileTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; + newFilePerformanceTelemetryEvent = + TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; + break; + } + return { + newFileTelemetryEvent, + newFilePerformanceTelemetryEvent, + }; + }; } diff --git a/Source/service/webviewService.ts b/Source/service/webviewService.ts index 01584259b..2b6add591 100644 --- a/Source/service/webviewService.ts +++ b/Source/service/webviewService.ts @@ -6,46 +6,47 @@ import { DeviceSelectionService } from "./deviceSelectionService"; // Manages different type of webview export class WebviewService { - private tutorialPanel: vscode.WebviewPanel | undefined; - private context: vscode.ExtensionContext; - private deviceSelectionService: DeviceSelectionService; + private tutorialPanel: vscode.WebviewPanel | undefined; + private context: vscode.ExtensionContext; + private deviceSelectionService: DeviceSelectionService; - constructor( - context: vscode.ExtensionContext, - deviceSelectionService: DeviceSelectionService - ) { - this.context = context; - this.deviceSelectionService = deviceSelectionService; - } + constructor( + context: vscode.ExtensionContext, + deviceSelectionService: DeviceSelectionService + ) { + this.context = context; + this.deviceSelectionService = deviceSelectionService; + } - public openTutorialPanel() { - if (this.tutorialPanel) { - this.tutorialPanel.reveal(vscode.ViewColumn.Beside); - } else { - this.createTutorialPanel(); - } - } + public openTutorialPanel() { + if (this.tutorialPanel) { + this.tutorialPanel.reveal(vscode.ViewColumn.Beside); + } else { + this.createTutorialPanel(); + } + } - public getWebviewContent( - webviewType: string, - hasDevice: boolean, - panel: vscode.WebviewPanel - ) { - const onDiskPath = vscode.Uri.file( - this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.SIMULATOR) - ); - const scriptSrc = panel.webview.asWebviewUri(onDiskPath); + public getWebviewContent( + webviewType: string, + hasDevice: boolean, + panel: vscode.WebviewPanel + ) { + const onDiskPath = vscode.Uri.file( + this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.SIMULATOR) + ); + const scriptSrc = panel.webview.asWebviewUri(onDiskPath); - const vscodeImportPath = vscode.Uri.file( - this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.VSCODE_API) - ); - const vscodeImportPathSrc = - panel.webview.asWebviewUri(vscodeImportPath); + const vscodeImportPath = vscode.Uri.file( + this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.VSCODE_API) + ); + const vscodeImportPathSrc = panel.webview.asWebviewUri( + vscodeImportPath + ); - const attributeString = this.getAttributeString(webviewType, hasDevice); - const nonce = getNonce(); + const attributeString = this.getAttributeString(webviewType, hasDevice); + const nonce = getNonce(); - return ` + return ` @@ -63,49 +64,49 @@ export class WebviewService { < /html>`; - } + } - private createTutorialPanel() { - this.tutorialPanel = vscode.window.createWebviewPanel( - CONSTANTS.WEBVIEW_TYPE.TUTORIAL, - CONSTANTS.LABEL.WEBVIEW_PANEL, - { preserveFocus: true, viewColumn: vscode.ViewColumn.One }, - { - enableScripts: true, - retainContextWhenHidden: true, - } - ); - this.tutorialPanel.webview.html = this.getWebviewContent( - WEBVIEW_TYPES.GETTING_STARTED, - false, - this.tutorialPanel - ); - this.tutorialPanel.onDidDispose(() => { - this.disposeTutorialPanel(); - }); - } + private createTutorialPanel() { + this.tutorialPanel = vscode.window.createWebviewPanel( + CONSTANTS.WEBVIEW_TYPE.TUTORIAL, + CONSTANTS.LABEL.WEBVIEW_PANEL, + { preserveFocus: true, viewColumn: vscode.ViewColumn.One }, + { + enableScripts: true, + retainContextWhenHidden: true, + } + ); + this.tutorialPanel.webview.html = this.getWebviewContent( + WEBVIEW_TYPES.GETTING_STARTED, + false, + this.tutorialPanel + ); + this.tutorialPanel.onDidDispose(() => { + this.disposeTutorialPanel(); + }); + } - private disposeTutorialPanel() { - this.tutorialPanel = undefined; - } - private getAttributeString(webviewType: string, hasDevice: boolean) { - if (hasDevice) { - return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} ${ - WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE - }=${this.deviceSelectionService.getCurrentActiveDevice()} `; - } else { - return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} `; - } - } + private disposeTutorialPanel() { + this.tutorialPanel = undefined; + } + private getAttributeString(webviewType: string, hasDevice: boolean) { + if (hasDevice) { + return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} ${ + WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE + }=${this.deviceSelectionService.getCurrentActiveDevice()} `; + } else { + return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} `; + } + } } // Nonce generator taken from vscode extension samples found here: // https://github.com/microsoft/vscode-extension-samples/blob/master/custom-editor-sample/src/util.ts function getNonce() { - let text = ""; - const possible = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - for (let i = 0; i < 32; i++) { - text += possible.charAt(Math.floor(Math.random() * possible.length)); - } - return text; + let text = ""; + const possible = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + for (let i = 0; i < 32; i++) { + text += possible.charAt(Math.floor(Math.random() * possible.length)); + } + return text; } diff --git a/Source/simulatorDebugConfigurationProvider.ts b/Source/simulatorDebugConfigurationProvider.ts index 40d153f6a..2b6725f22 100644 --- a/Source/simulatorDebugConfigurationProvider.ts +++ b/Source/simulatorDebugConfigurationProvider.ts @@ -6,80 +6,79 @@ import { CONSTANTS, DialogResponses } from "./constants"; import { getServerPortConfig } from "./extension_utils/utils"; export class SimulatorDebugConfigurationProvider - implements vscode.DebugConfigurationProvider -{ - public deviceSimulatorExpressDebug: boolean; + implements vscode.DebugConfigurationProvider { + public deviceSimulatorExpressDebug: boolean; - constructor(private pathToScript: string) { - this.deviceSimulatorExpressDebug = false; - } + constructor(private pathToScript: string) { + this.deviceSimulatorExpressDebug = false; + } - /** - * Modify the debug configuration just before a debug session is being launched. - */ - public resolveDebugConfiguration( - folder: vscode.WorkspaceFolder | undefined, - config: vscode.DebugConfiguration, - token?: vscode.CancellationToken - ): vscode.ProviderResult { - const activeTextEditor = vscode.window.activeTextEditor; + /** + * Modify the debug configuration just before a debug session is being launched. + */ + public resolveDebugConfiguration( + folder: vscode.WorkspaceFolder | undefined, + config: vscode.DebugConfiguration, + token?: vscode.CancellationToken + ): vscode.ProviderResult { + const activeTextEditor = vscode.window.activeTextEditor; - // Create a configuration if no launch.json exists or if it's empty - if (!config.type && !config.request && !config.name) { - if ( - activeTextEditor && - activeTextEditor.document.languageId === "python" - ) { - config.type = "deviceSimulatorExpress"; - config.request = "launch"; - config.name = "Device Simulator Express Debugger"; - config.console = "integratedTerminal"; - } - } - // Check config type - if (config.type === CONSTANTS.DEBUG_CONFIGURATION_TYPE) { - this.deviceSimulatorExpressDebug = true; - if (activeTextEditor) { - const currentFilePath = activeTextEditor.document.fileName; + // Create a configuration if no launch.json exists or if it's empty + if (!config.type && !config.request && !config.name) { + if ( + activeTextEditor && + activeTextEditor.document.languageId === "python" + ) { + config.type = "deviceSimulatorExpress"; + config.request = "launch"; + config.name = "Device Simulator Express Debugger"; + config.console = "integratedTerminal"; + } + } + // Check config type + if (config.type === CONSTANTS.DEBUG_CONFIGURATION_TYPE) { + this.deviceSimulatorExpressDebug = true; + if (activeTextEditor) { + const currentFilePath = activeTextEditor.document.fileName; - // Check file type and name - if (!(activeTextEditor.document.languageId === "python")) { - return vscode.window - .showErrorMessage( - CONSTANTS.ERROR.INVALID_FILE_EXTENSION_DEBUG - ) - .then(() => { - return undefined; // Abort launch - }); - } - // Set the new configuration type so the python debugger can take over - config.type = "python"; - // Set process_user_code path as program - config.program = this.pathToScript; - // Set user's code path and server's port as args - config.args = [ - currentFilePath, - getServerPortConfig().toString(), - ]; - // Set rules - config.rules = [ - { path: this.pathToScript, include: false }, - { - module: "adafruit_circuitplayground", - include: false, - }, - { module: "playsound", include: false }, - ]; - } - } - // Abort / show error message if can't find process_user_code.py - if (!config.program) { - return vscode.window - .showErrorMessage(CONSTANTS.ERROR.NO_PROGRAM_FOUND_DEBUG) - .then(() => { - return undefined; // Abort launch - }); - } - return config; - } + // Check file type and name + if (!(activeTextEditor.document.languageId === "python")) { + return vscode.window + .showErrorMessage( + CONSTANTS.ERROR.INVALID_FILE_EXTENSION_DEBUG + ) + .then(() => { + return undefined; // Abort launch + }); + } + // Set the new configuration type so the python debugger can take over + config.type = "python"; + // Set process_user_code path as program + config.program = this.pathToScript; + // Set user's code path and server's port as args + config.args = [ + currentFilePath, + getServerPortConfig().toString(), + ]; + // Set rules + config.rules = [ + { path: this.pathToScript, include: false }, + { + module: "adafruit_circuitplayground", + include: false, + }, + { module: "playsound", include: false }, + ]; + } + } + // Abort / show error message if can't find process_user_code.py + if (!config.program) { + return vscode.window + .showErrorMessage(CONSTANTS.ERROR.NO_PROGRAM_FOUND_DEBUG) + .then(() => { + return undefined; // Abort launch + }); + } + return config; + } } diff --git a/Source/telemetry/getPackageInfo.ts b/Source/telemetry/getPackageInfo.ts index 6e7044903..cd8d42ab7 100644 --- a/Source/telemetry/getPackageInfo.ts +++ b/Source/telemetry/getPackageInfo.ts @@ -3,53 +3,55 @@ import * as path from "path"; import * as vscode from "vscode"; export interface IPackageJson { - name?: string; - version?: string; - instrumentationKey: string; + name?: string; + version?: string; + instrumentationKey: string; } const getPackagePath = (context: vscode.ExtensionContext) => { - const onDiskPath = vscode.Uri.file( - path.join(context.extensionPath, "package.json") - ); - const packagePath = onDiskPath.with({ scheme: "vscode-resource" }); + const onDiskPath = vscode.Uri.file( + path.join(context.extensionPath, "package.json") + ); + const packagePath = onDiskPath.with({ scheme: "vscode-resource" }); - return packagePath; + return packagePath; }; -export default function getPackageInfo(context: vscode.ExtensionContext): { - extensionName: string; - extensionVersion: string; - instrumentationKey: string; +export default function getPackageInfo( + context: vscode.ExtensionContext +): { + extensionName: string; + extensionVersion: string; + instrumentationKey: string; } { - let packageJson: IPackageJson; - const packagePath = getPackagePath(context); - - try { - packageJson = JSON.parse(fs.readFileSync(packagePath.fsPath, "utf8")); - } catch (error) { - console.error(`Failed to read from package.json: ${error}`); - throw new Error(`Failed to read from package.json: ${error}`); - } - - const extensionName: string | undefined = packageJson.name; - const extensionVersion: string | undefined = packageJson.version; - const instrumentationKey: string | undefined = - packageJson.instrumentationKey; - - if (!extensionName) { - throw new Error( - "Extension's package.json is missing instrumentation key." - ); - } - - if (!extensionVersion) { - throw new Error("Extension's package.json is missing version."); - } - - if (!extensionVersion) { - throw new Error("Extension's package.json is missing version."); - } - - return { extensionName, extensionVersion, instrumentationKey }; + let packageJson: IPackageJson; + const packagePath = getPackagePath(context); + + try { + packageJson = JSON.parse(fs.readFileSync(packagePath.fsPath, "utf8")); + } catch (error) { + console.error(`Failed to read from package.json: ${error}`); + throw new Error(`Failed to read from package.json: ${error}`); + } + + const extensionName: string | undefined = packageJson.name; + const extensionVersion: string | undefined = packageJson.version; + const instrumentationKey: string | undefined = + packageJson.instrumentationKey; + + if (!extensionName) { + throw new Error( + "Extension's package.json is missing instrumentation key." + ); + } + + if (!extensionVersion) { + throw new Error("Extension's package.json is missing version."); + } + + if (!extensionVersion) { + throw new Error("Extension's package.json is missing version."); + } + + return { extensionName, extensionVersion, instrumentationKey }; } diff --git a/Source/telemetry/telemetryAI.ts b/Source/telemetry/telemetryAI.ts index c0c5ff5ac..4dbf5ca41 100644 --- a/Source/telemetry/telemetryAI.ts +++ b/Source/telemetry/telemetryAI.ts @@ -4,76 +4,80 @@ import getPackageInfo from "./getPackageInfo"; // tslint:disable-next-line:export-name export default class TelemetryAI { - private static telemetryReporter: TelemetryReporter; - private static enableTelemetry: boolean | undefined; + private static telemetryReporter: TelemetryReporter; + private static enableTelemetry: boolean | undefined; - constructor(vscodeContext: vscode.ExtensionContext) { - TelemetryAI.telemetryReporter = - this.createTelemetryReporter(vscodeContext); - TelemetryAI.enableTelemetry = vscode.workspace - .getConfiguration() - .get("telemetry.enableTelemetry"); - if (TelemetryAI.enableTelemetry === undefined) { - TelemetryAI.enableTelemetry = true; - } - } + constructor(vscodeContext: vscode.ExtensionContext) { + TelemetryAI.telemetryReporter = this.createTelemetryReporter( + vscodeContext + ); + TelemetryAI.enableTelemetry = vscode.workspace + .getConfiguration() + .get("telemetry.enableTelemetry"); + if (TelemetryAI.enableTelemetry === undefined) { + TelemetryAI.enableTelemetry = true; + } + } - public getExtensionName(context: vscode.ExtensionContext): string { - const { extensionName } = getPackageInfo(context); - return extensionName; - } + public getExtensionName(context: vscode.ExtensionContext): string { + const { extensionName } = getPackageInfo(context); + return extensionName; + } - public getExtensionVersionNumber(context: vscode.ExtensionContext): string { - const { extensionVersion } = getPackageInfo(context); - return extensionVersion; - } + public getExtensionVersionNumber(context: vscode.ExtensionContext): string { + const { extensionVersion } = getPackageInfo(context); + return extensionVersion; + } - public sendTelemetryIfEnabled( - eventName: string, - properties?: { [key: string]: string }, - measurements?: { [key: string]: number } - ) { - if (TelemetryAI.enableTelemetry) { - TelemetryAI.telemetryReporter.sendTelemetryEvent( - eventName, - properties, - measurements - ); - } - } + public sendTelemetryIfEnabled( + eventName: string, + properties?: { [key: string]: string }, + measurements?: { [key: string]: number } + ) { + if (TelemetryAI.enableTelemetry) { + TelemetryAI.telemetryReporter.sendTelemetryEvent( + eventName, + properties, + measurements + ); + } + } - public trackFeatureUsage( - eventName: string, - eventProperties?: { [key: string]: string } - ) { - this.sendTelemetryIfEnabled(eventName, eventProperties); - } + public trackFeatureUsage( + eventName: string, + eventProperties?: { [key: string]: string } + ) { + this.sendTelemetryIfEnabled(eventName, eventProperties); + } - public runWithLatencyMeasure( - functionToRun: () => void, - eventName: string - ): void { - const numberOfNanosecondsInSecond: number = 1000000000; - const startTime: number = Number(process.hrtime.bigint()); - functionToRun(); - const latency: number = Number(process.hrtime.bigint()) - startTime; - const measurement = { - duration: latency / numberOfNanosecondsInSecond, - }; - this.sendTelemetryIfEnabled(eventName, {}, measurement); - } + public runWithLatencyMeasure( + functionToRun: () => void, + eventName: string + ): void { + const numberOfNanosecondsInSecond: number = 1000000000; + const startTime: number = Number(process.hrtime.bigint()); + functionToRun(); + const latency: number = Number(process.hrtime.bigint()) - startTime; + const measurement = { + duration: latency / numberOfNanosecondsInSecond, + }; + this.sendTelemetryIfEnabled(eventName, {}, measurement); + } - private createTelemetryReporter( - context: vscode.ExtensionContext - ): TelemetryReporter { - const { extensionName, extensionVersion, instrumentationKey } = - getPackageInfo(context); - const reporter: TelemetryReporter = new TelemetryReporter( - extensionName, - extensionVersion, - instrumentationKey - ); - context.subscriptions.push(reporter); - return reporter; - } + private createTelemetryReporter( + context: vscode.ExtensionContext + ): TelemetryReporter { + const { + extensionName, + extensionVersion, + instrumentationKey, + } = getPackageInfo(context); + const reporter: TelemetryReporter = new TelemetryReporter( + extensionName, + extensionVersion, + instrumentationKey + ); + context.subscriptions.push(reporter); + return reporter; + } } diff --git a/Source/usbDetector.ts b/Source/usbDetector.ts index 073c99c01..6d28bb9fb 100644 --- a/Source/usbDetector.ts +++ b/Source/usbDetector.ts @@ -12,101 +12,101 @@ import * as utils from "./extension_utils/utils"; import { SerialMonitor } from "./serialMonitor"; export class UsbDetector { - public static getInstance(): UsbDetector { - if (!UsbDetector._instance) { - UsbDetector._instance = new UsbDetector(); - } - return UsbDetector._instance; - } - - private static _instance: UsbDetector; - - private _usbDetector: any; - - private _boardDescriptors: any = null; - - private _extensionRoot: string = null; - - private constructor() {} - - public initialize(extensionRoot: string) { - this._extensionRoot = extensionRoot; - } - - public async startListening() { - const workspaceConfig = vscode.workspace.getConfiguration(); - const enableUSBDetection = workspaceConfig.get( - CONFIG_KEYS.ENABLE_USB_DETECTION - ); - - if (os.platform() === "linux" || !enableUSBDetection) { - return; - } - this._usbDetector = require("usb-native").detector; - - if (!this._usbDetector) { - return; - } - - if (this._extensionRoot === null) { - throw new Error("UsbDetector should be initialized before using."); - } - - this._usbDetector.on("add", async (device: any) => { - if (device.vendorId && device.productId) { - const deviceDescriptor = this.getUsbDeviceDescriptor( - utils.convertToHex(device.vendorId, 4), - utils.convertToHex(device.productId, 4), - this._extensionRoot - ); - - // Not supported device for discovery - if (!deviceDescriptor) { - return; - } - - const boardKey = `${deviceDescriptor.package}:${deviceDescriptor.architecture}:${deviceDescriptor.id}`; - // Log that a board was detected - if (!SerialMonitor.getInstance().initialized) { - SerialMonitor.getInstance().initialize(); - } - } - }); - } - - public stopListening() { - if (this._usbDetector) { - this._usbDetector.stopMonitoring(); - } - } - - private getUsbDeviceDescriptor( - vendorId: string, - productId: string, - extensionRoot: string - ): any { - if (!this._boardDescriptors) { - this._boardDescriptors = []; - const fileContent = fs.readFileSync( - path.join(extensionRoot, "misc", "usbmapping.json"), - "utf8" - ); - const boardIndexes: [] = JSON.parse(fileContent); - boardIndexes.forEach((boardIndex: any) => { - boardIndex.boards.forEach((board: any) => { - board.indexFile = boardIndex.index_file; - }); - this._boardDescriptors = this._boardDescriptors.concat( - boardIndex.boards - ); - }); - } - return this._boardDescriptors.find((obj: any) => { - return ( - obj.vid === vendorId && - (obj.pid === productId || - (obj.pid.indexOf && obj.pid.indexOf(productId) >= 0)) - ); - }); - } + public static getInstance(): UsbDetector { + if (!UsbDetector._instance) { + UsbDetector._instance = new UsbDetector(); + } + return UsbDetector._instance; + } + + private static _instance: UsbDetector; + + private _usbDetector: any; + + private _boardDescriptors: any = null; + + private _extensionRoot: string = null; + + private constructor() {} + + public initialize(extensionRoot: string) { + this._extensionRoot = extensionRoot; + } + + public async startListening() { + const workspaceConfig = vscode.workspace.getConfiguration(); + const enableUSBDetection = workspaceConfig.get( + CONFIG_KEYS.ENABLE_USB_DETECTION + ); + + if (os.platform() === "linux" || !enableUSBDetection) { + return; + } + this._usbDetector = require("usb-native").detector; + + if (!this._usbDetector) { + return; + } + + if (this._extensionRoot === null) { + throw new Error("UsbDetector should be initialized before using."); + } + + this._usbDetector.on("add", async (device: any) => { + if (device.vendorId && device.productId) { + const deviceDescriptor = this.getUsbDeviceDescriptor( + utils.convertToHex(device.vendorId, 4), + utils.convertToHex(device.productId, 4), + this._extensionRoot + ); + + // Not supported device for discovery + if (!deviceDescriptor) { + return; + } + + const boardKey = `${deviceDescriptor.package}:${deviceDescriptor.architecture}:${deviceDescriptor.id}`; + // Log that a board was detected + if (!SerialMonitor.getInstance().initialized) { + SerialMonitor.getInstance().initialize(); + } + } + }); + } + + public stopListening() { + if (this._usbDetector) { + this._usbDetector.stopMonitoring(); + } + } + + private getUsbDeviceDescriptor( + vendorId: string, + productId: string, + extensionRoot: string + ): any { + if (!this._boardDescriptors) { + this._boardDescriptors = []; + const fileContent = fs.readFileSync( + path.join(extensionRoot, "misc", "usbmapping.json"), + "utf8" + ); + const boardIndexes: [] = JSON.parse(fileContent); + boardIndexes.forEach((boardIndex: any) => { + boardIndex.boards.forEach((board: any) => { + board.indexFile = boardIndex.index_file; + }); + this._boardDescriptors = this._boardDescriptors.concat( + boardIndex.boards + ); + }); + } + return this._boardDescriptors.find((obj: any) => { + return ( + obj.vid === vendorId && + (obj.pid === productId || + (obj.pid.indexOf && obj.pid.indexOf(productId) >= 0)) + ); + }); + } } diff --git a/Source/view/App.css b/Source/view/App.css index dd11b283b..413e9fcbc 100644 --- a/Source/view/App.css +++ b/Source/view/App.css @@ -1,16 +1,16 @@ .App { - text-align: center; - display: flex; - justify-content: space-between; + text-align: center; + display: flex; + justify-content: space-between; } .App-main { - background-color: var(--vscode-editor-background); - padding: 0px 0.75em 0px 0.75em; - min-height: 100vh; - width: 100%; - margin-top: 24px; - margin-bottom: 53px; - max-height: 400px; - overflow: scroll; + background-color: var(--vscode-editor-background); + padding: 0px 0.75em 0px 0.75em; + min-height: 100vh; + width: 100%; + margin-top: 24px; + margin-bottom: 53px; + max-height: 400px; + overflow: scroll; } diff --git a/Source/view/App.spec.tsx b/Source/view/App.spec.tsx index eb12d412f..66d6fc9d5 100644 --- a/Source/view/App.spec.tsx +++ b/Source/view/App.spec.tsx @@ -5,24 +5,24 @@ import * as testRenderer from "react-test-renderer"; import App from "./App"; describe("App component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/App.tsx b/Source/view/App.tsx index 4b530406e..3e540c8d9 100644 --- a/Source/view/App.tsx +++ b/Source/view/App.tsx @@ -4,98 +4,98 @@ import * as React from "react"; import "./App.css"; import { - DEVICE_LIST_KEY, - VIEW_STATE, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_ATTRIBUTES_KEY, - WEBVIEW_TYPES, + DEVICE_LIST_KEY, + VIEW_STATE, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_ATTRIBUTES_KEY, + WEBVIEW_TYPES, } from "./constants"; import { Device } from "./container/device/Device"; import { ViewStateContext } from "./context"; import { GettingStartedPage } from "./pages/gettingStarted"; interface IState { - currentDevice: string; - viewState: VIEW_STATE; - type?: WEBVIEW_TYPES; + currentDevice: string; + viewState: VIEW_STATE; + type?: WEBVIEW_TYPES; } const defaultState = { - currentDevice: DEVICE_LIST_KEY.CPX, - viewState: VIEW_STATE.RUNNING, - type: undefined, + currentDevice: DEVICE_LIST_KEY.CPX, + viewState: VIEW_STATE.RUNNING, + type: undefined, }; class App extends React.Component<{}, IState> { - constructor() { - super({}); - this.state = defaultState; - } - componentDidMount() { - if (document.currentScript) { - const webviewTypeAttribute = document.currentScript.getAttribute( - WEBVIEW_ATTRIBUTES_KEY.TYPE - ) as WEBVIEW_TYPES; - if (webviewTypeAttribute) { - this.setState({ type: webviewTypeAttribute }); - } - if (webviewTypeAttribute === WEBVIEW_TYPES.SIMULATOR) { - const initialDevice = document.currentScript.getAttribute( - WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE - ); + constructor() { + super({}); + this.state = defaultState; + } + componentDidMount() { + if (document.currentScript) { + const webviewTypeAttribute = document.currentScript.getAttribute( + WEBVIEW_ATTRIBUTES_KEY.TYPE + ) as WEBVIEW_TYPES; + if (webviewTypeAttribute) { + this.setState({ type: webviewTypeAttribute }); + } + if (webviewTypeAttribute === WEBVIEW_TYPES.SIMULATOR) { + const initialDevice = document.currentScript.getAttribute( + WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE + ); - if (initialDevice) { - this.setState({ currentDevice: initialDevice }); - window.addEventListener("message", this.handleMessage); - } - } - } - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } + if (initialDevice) { + this.setState({ currentDevice: initialDevice }); + window.addEventListener("message", this.handleMessage); + } + } + } + } + componentWillUnmount() { + window.removeEventListener("message", this.handleMessage); + } - render() { - return ( -
-
- - {this.loadContent()} - -
-
- ); - } - loadContent = () => { - console.log(this.state.type); - switch (this.state.type) { - case WEBVIEW_TYPES.GETTING_STARTED: - return ; - case WEBVIEW_TYPES.SIMULATOR: - return ( - - ); - } - return; - }; + render() { + return ( +
+
+ + {this.loadContent()} + +
+
+ ); + } + loadContent = () => { + console.log(this.state.type); + switch (this.state.type) { + case WEBVIEW_TYPES.GETTING_STARTED: + return ; + case WEBVIEW_TYPES.SIMULATOR: + return ( + + ); + } + return; + }; - handleMessage = (event: any): void => { - const message = event.data; + handleMessage = (event: any): void => { + const message = event.data; - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE: - if (message.active_device !== this.state.currentDevice) { - this.setState({ currentDevice: message.active_device }); - } - break; - case VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE: - this.setState({ viewState: VIEW_STATE.RUNNING }); - break; - case VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE: - this.setState({ viewState: VIEW_STATE.PAUSE }); - break; - } - }; + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE: + if (message.active_device !== this.state.currentDevice) { + this.setState({ currentDevice: message.active_device }); + } + break; + case VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE: + this.setState({ viewState: VIEW_STATE.RUNNING }); + break; + case VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE: + this.setState({ viewState: VIEW_STATE.PAUSE }); + break; + } + }; } export default App; diff --git a/Source/view/components/Button.tsx b/Source/view/components/Button.tsx index a7df60dc7..db5034b9d 100644 --- a/Source/view/components/Button.tsx +++ b/Source/view/components/Button.tsx @@ -2,32 +2,33 @@ import * as React from "react"; import "../styles/Button.css"; export interface IButtonProps { - label: string; - image: any; - focusable: boolean; - styleLabel: string; - width: number; - onClick: (event: React.MouseEvent) => void; + label: string; + image: any; + focusable: boolean; + styleLabel: string; + width: number; + onClick: (event: React.MouseEvent) => void; } // Functional Component render -const Button: React.FC = (props) => { - const iconSvg: SVGElement = props.image as SVGElement; - const buttonStyle = { width: props.width }; - const tabIndex = props.focusable ? 0 : -1; +const Button: React.FC = props => { + const iconSvg: SVGElement = props.image as SVGElement; + const buttonStyle = { width: props.width }; + const tabIndex = props.focusable ? 0 : -1; - return ( - - ); + return ( + + ); }; export default Button; diff --git a/Source/view/components/Dropdown.tsx b/Source/view/components/Dropdown.tsx index 16c55e60b..e5506383a 100644 --- a/Source/view/components/Dropdown.tsx +++ b/Source/view/components/Dropdown.tsx @@ -5,30 +5,31 @@ import * as React from "react"; import "../styles/Dropdown.css"; export interface IDropdownProps { - options: string[]; - // styleLabel: string; - name: string; - onSelect?: (event: React.ChangeEvent) => void; + options: string[]; + // styleLabel: string; + name: string; + onSelect?: (event: React.ChangeEvent) => void; } -export const Dropdown: React.FC = (props) => { - return ( - - ); +export const Dropdown: React.FC = props => { + return ( + + ); }; const renderOptions = (options: string[]) => { - return options.map((name, index) => { - return ( - - ); - }); + return options.map((name, index) => { + return ( + + ); + }); }; diff --git a/Source/view/components/clue/Clue.spec.tsx b/Source/view/components/clue/Clue.spec.tsx index e9a6e6c7d..55d065bce 100644 --- a/Source/view/components/clue/Clue.spec.tsx +++ b/Source/view/components/clue/Clue.spec.tsx @@ -5,25 +5,25 @@ import * as testRenderer from "react-test-renderer"; import { Clue } from "./Clue"; describe("Clue component", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/components/clue/Clue.tsx b/Source/view/components/clue/Clue.tsx index e587a23bc..552ff54c3 100644 --- a/Source/view/components/clue/Clue.tsx +++ b/Source/view/components/clue/Clue.tsx @@ -3,10 +3,10 @@ import * as React from "react"; import { - GESTURES_CLUE, - SENSOR_LIST, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, + GESTURES_CLUE, + SENSOR_LIST, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_MESSAGES, } from "../../constants"; import "../../styles/Simulator.css"; import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; @@ -17,142 +17,142 @@ import { ClueSimulator } from "./ClueSimulator"; // Component grouping the functionality for micro:bit functionalities interface IState { - sensors: { [key: string]: number }; - currentSelectedGesture: string; + sensors: { [key: string]: number }; + currentSelectedGesture: string; } const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT_R]: 0, - [SENSOR_LIST.LIGHT_G]: 0, - [SENSOR_LIST.LIGHT_B]: 0, - [SENSOR_LIST.LIGHT_C]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - [SENSOR_LIST.HUMIDITY]: 0, - [SENSOR_LIST.PRESSURE]: 1013, - [SENSOR_LIST.PROXIMITY]: 0, - [SENSOR_LIST.GYRO_X]: 0, - [SENSOR_LIST.GYRO_Y]: 0, - [SENSOR_LIST.GYRO_Z]: 0, - [SENSOR_LIST.MAGNET_X]: 0, - [SENSOR_LIST.MAGNET_Y]: 0, - [SENSOR_LIST.MAGNET_Z]: 0, - }, - currentSelectedGesture: GESTURES_CLUE[0], + sensors: { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT_R]: 0, + [SENSOR_LIST.LIGHT_G]: 0, + [SENSOR_LIST.LIGHT_B]: 0, + [SENSOR_LIST.LIGHT_C]: 0, + [SENSOR_LIST.MOTION_X]: 0, + [SENSOR_LIST.MOTION_Y]: 0, + [SENSOR_LIST.MOTION_Z]: 0, + [SENSOR_LIST.HUMIDITY]: 0, + [SENSOR_LIST.PRESSURE]: 1013, + [SENSOR_LIST.PROXIMITY]: 0, + [SENSOR_LIST.GYRO_X]: 0, + [SENSOR_LIST.GYRO_Y]: 0, + [SENSOR_LIST.GYRO_Z]: 0, + [SENSOR_LIST.MAGNET_X]: 0, + [SENSOR_LIST.MAGNET_Y]: 0, + [SENSOR_LIST.MAGNET_Z]: 0, + }, + currentSelectedGesture: GESTURES_CLUE[0], }; export class Clue extends React.Component<{}, IState> { - state = DEFAULT_STATE; + state = DEFAULT_STATE; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + handleMessage = (event: any): void => { + const message = event.data; - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; - updateGesture = (event: React.ChangeEvent) => { - this.setState({ currentSelectedGesture: event.target.value }); - }; - sendGesture = (isActive: boolean) => { - if (this.state.currentSelectedGesture) { - if (isActive) { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: this.state.currentSelectedGesture, - }); - } else { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: "", - }); - } - } - }; + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.RESET: + this.setState({ ...DEFAULT_STATE }); + break; + } + }; + render() { + return ( + + + + + ); + } + updateSensor = (sensor: SENSOR_LIST, value: number) => { + this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); + }; + updateGesture = (event: React.ChangeEvent) => { + this.setState({ currentSelectedGesture: event.target.value }); + }; + sendGesture = (isActive: boolean) => { + if (this.state.currentSelectedGesture) { + if (isActive) { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: this.state.currentSelectedGesture, + }); + } else { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: "", + }); + } + } + }; } const CLUE_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - label: CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.LEDS, - image: TOOLBAR_SVG.NEO_PIXEL_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.TEMPERATURE, - image: TOOLBAR_SVG.TEMPERATURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.LIGHT, - image: TOOLBAR_SVG.LIGHT_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, - image: TOOLBAR_SVG.MOTION_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.HUMIDITY, - image: TOOLBAR_SVG.HUMIDITY_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.PRESSURE, - image: TOOLBAR_SVG.PRESSURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.PROXIMITY, - image: TOOLBAR_SVG.PROXIMITY_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GESTURE, - image: TOOLBAR_SVG.GESTURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GYROSCOPE, - image: TOOLBAR_SVG.GYROSCOPE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, - image: TOOLBAR_SVG.MAGNET_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GPIO, - image: TOOLBAR_SVG.GPIO_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.SOUND, - image: TOOLBAR_SVG.SOUND_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.SPEAKER, - image: TOOLBAR_SVG.SPEAKER_SVG, - }, + { + label: CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, + image: TOOLBAR_SVG.PUSH_BUTTON_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.LEDS, + image: TOOLBAR_SVG.NEO_PIXEL_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.TEMPERATURE, + image: TOOLBAR_SVG.TEMPERATURE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.LIGHT, + image: TOOLBAR_SVG.LIGHT_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, + image: TOOLBAR_SVG.MOTION_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.HUMIDITY, + image: TOOLBAR_SVG.HUMIDITY_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.PRESSURE, + image: TOOLBAR_SVG.PRESSURE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.PROXIMITY, + image: TOOLBAR_SVG.PROXIMITY_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.GESTURE, + image: TOOLBAR_SVG.GESTURE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.GYROSCOPE, + image: TOOLBAR_SVG.GYROSCOPE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, + image: TOOLBAR_SVG.MAGNET_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.GPIO, + image: TOOLBAR_SVG.GPIO_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.SOUND, + image: TOOLBAR_SVG.SOUND_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.SPEAKER, + image: TOOLBAR_SVG.SPEAKER_SVG, + }, ]; diff --git a/Source/view/components/clue/ClueImage.tsx b/Source/view/components/clue/ClueImage.tsx index 7bbecc68e..b3c3edcf2 100644 --- a/Source/view/components/clue/ClueImage.tsx +++ b/Source/view/components/clue/ClueImage.tsx @@ -8,149 +8,149 @@ import { ViewStateContext } from "../../context"; import { ClueSvg, IRefObject } from "./Clue_svg"; interface EventTriggers { - onMouseUp: (event: Event, buttonKey: string) => void; - onMouseDown: (event: Event, buttonKey: string) => void; - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; + onMouseUp: (event: Event, buttonKey: string) => void; + onMouseDown: (event: Event, buttonKey: string) => void; + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; } interface IProps { - eventTriggers: EventTriggers; - displayMessage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; + eventTriggers: EventTriggers; + displayMessage: string; + leds: { + neopixel: number[]; + isRedLedOn: boolean; + isWhiteLedOn: boolean; + }; } export enum BUTTONS_KEYS { - BTN_A = "BTN_A", - BTN_B = "BTN_B", - BTN_AB = "BTN_AB", + BTN_A = "BTN_A", + BTN_B = "BTN_B", + BTN_AB = "BTN_AB", } // Displays the SVG and call necessary svg modification. export class ClueImage extends React.Component { - private svgRef: React.RefObject = React.createRef(); - constructor(props: IProps) { - super(props); - } - componentDidMount() { - const svgElement = this.svgRef.current; - if (svgElement) { - setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); - this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); - } - } - componentDidUpdate() { - if (this.context === VIEW_STATE.PAUSE && this.svgRef.current) { - disableAllButtons(this.svgRef.current.getButtons()); - } else if (this.context === VIEW_STATE.RUNNING && this.svgRef.current) { - setupAllButtons( - this.props.eventTriggers, - this.svgRef.current.getButtons() - ); - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.eventTriggers.onKeyEvent(event, true, event.key); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.eventTriggers.onKeyEvent(event, false, event.key); - }; - render() { - return ( - - ); - } - public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { - const button = this.svgRef.current?.getButtons()[key].current; - if (button) { - button.focus(); - if (isActive) { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.KEYPRESSED - ); - } else { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.DEFAULT - ); - } - button.setAttribute("pressed", `${isActive}`); - button.setAttribute("aria-pressed", `${isActive}`); - } - } + private svgRef: React.RefObject = React.createRef(); + constructor(props: IProps) { + super(props); + } + componentDidMount() { + const svgElement = this.svgRef.current; + if (svgElement) { + setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); + this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); + } + } + componentDidUpdate() { + if (this.context === VIEW_STATE.PAUSE && this.svgRef.current) { + disableAllButtons(this.svgRef.current.getButtons()); + } else if (this.context === VIEW_STATE.RUNNING && this.svgRef.current) { + setupAllButtons( + this.props.eventTriggers, + this.svgRef.current.getButtons() + ); + } + } + componentWillUnmount() { + window.document.removeEventListener("keydown", this.handleKeyDown); + window.document.removeEventListener("keyup", this.handleKeyUp); + } + setupKeyPresses = ( + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void + ) => { + window.document.addEventListener("keydown", this.handleKeyDown); + window.document.addEventListener("keyup", this.handleKeyUp); + }; + handleKeyDown = (event: KeyboardEvent) => { + const keyEvents = [event.key, event.code]; + // Don't listen to keydown events for the run button, restart button and enter key + if ( + !( + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) + ) + ) { + this.props.eventTriggers.onKeyEvent(event, true, event.key); + } + }; + handleKeyUp = (event: KeyboardEvent) => { + this.props.eventTriggers.onKeyEvent(event, false, event.key); + }; + render() { + return ( + + ); + } + public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { + const button = this.svgRef.current?.getButtons()[key].current; + if (button) { + button.focus(); + if (isActive) { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.KEYPRESSED + ); + } else { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.DEFAULT + ); + } + button.setAttribute("pressed", `${isActive}`); + button.setAttribute("aria-pressed", `${isActive}`); + } + } } ClueImage.contextType = ViewStateContext; const setupButton = ( - buttonElement: SVGRectElement, - eventTriggers: EventTriggers, - key: string + buttonElement: SVGRectElement, + eventTriggers: EventTriggers, + key: string ) => { - buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); - buttonElement.onmousedown = (e) => { - buttonElement.focus(); - eventTriggers.onMouseDown(e, key); - }; - buttonElement.onmouseup = (e) => { - eventTriggers.onMouseUp(e, key); - }; + buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); + buttonElement.onmousedown = e => { + buttonElement.focus(); + eventTriggers.onMouseDown(e, key); + }; + buttonElement.onmouseup = e => { + eventTriggers.onMouseUp(e, key); + }; - buttonElement.onkeydown = (e) => { - // ensure that the keydown is enter, - // or else it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - eventTriggers.onKeyEvent(e, true, key); - } - }; - buttonElement.onkeyup = (e) => { - eventTriggers.onKeyEvent(e, false, key); - }; + buttonElement.onkeydown = e => { + // ensure that the keydown is enter, + // or else it may register shortcuts twice + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + eventTriggers.onKeyEvent(e, true, key); + } + }; + buttonElement.onkeyup = e => { + eventTriggers.onKeyEvent(e, false, key); + }; }; const setupAllButtons = ( - eventTriggers: EventTriggers, - buttonRefs: IRefObject + eventTriggers: EventTriggers, + buttonRefs: IRefObject ) => { - for (const [key, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - setupButton(ref.current, eventTriggers, key); - } - } + for (const [key, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + setupButton(ref.current, eventTriggers, key); + } + } }; const disableAllButtons = (buttonRefs: IRefObject) => { - for (const [, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - // to implement - ref.current.onmousedown = null; - ref.current.onmouseup = null; - ref.current.onkeydown = null; - ref.current.onkeyup = null; - ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); - } - } + for (const [, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + // to implement + ref.current.onmousedown = null; + ref.current.onmouseup = null; + ref.current.onkeydown = null; + ref.current.onkeyup = null; + ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); + } + } }; diff --git a/Source/view/components/clue/ClueSimulator.tsx b/Source/view/components/clue/ClueSimulator.tsx index 89323e93e..a15f101f8 100644 --- a/Source/view/components/clue/ClueSimulator.tsx +++ b/Source/view/components/clue/ClueSimulator.tsx @@ -1,11 +1,11 @@ import * as React from "react"; import { - AB_BUTTONS_KEYS, - CONSTANTS, - DEFAULT_IMG_CLUE, - DEVICE_LIST_KEY, - VIEW_STATE, - WEBVIEW_MESSAGES, + AB_BUTTONS_KEYS, + CONSTANTS, + DEFAULT_IMG_CLUE, + DEVICE_LIST_KEY, + VIEW_STATE, + WEBVIEW_MESSAGES, } from "../../constants"; import { ViewStateContext } from "../../context"; import "../../styles/Simulator.css"; @@ -17,288 +17,288 @@ import ActionBar from "../simulator/ActionBar"; import { BUTTONS_KEYS, ClueImage } from "./ClueImage"; export const DEFAULT_CLUE_STATE: IClueState = { - buttons: { button_a: false, button_b: false }, - displayMessage: DEFAULT_IMG_CLUE, - leds: { - neopixel: [0, 0, 0], - isRedLedOn: false, - isWhiteLedOn: false, - }, + buttons: { button_a: false, button_b: false }, + displayMessage: DEFAULT_IMG_CLUE, + leds: { + neopixel: [0, 0, 0], + isRedLedOn: false, + isWhiteLedOn: false, + }, }; interface IState { - active_editors: string[]; - running_file?: string; - play_button: boolean; - selected_file: string; - clue: IClueState; - currently_selected_file: string; + active_editors: string[]; + running_file?: string; + play_button: boolean; + selected_file: string; + clue: IClueState; + currently_selected_file: string; } interface IClueState { - buttons: { button_a: boolean; button_b: boolean }; - displayMessage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; + buttons: { button_a: boolean; button_b: boolean }; + displayMessage: string; + leds: { + neopixel: number[]; + isRedLedOn: boolean; + isWhiteLedOn: boolean; + }; } export class ClueSimulator extends React.Component { - private imageRef: React.RefObject = React.createRef(); - constructor() { - super({}); - this.state = { - clue: DEFAULT_CLUE_STATE, - play_button: false, - selected_file: "", - active_editors: [], - running_file: undefined, - currently_selected_file: "", - }; - this.onKeyEvent = this.onKeyEvent.bind(this); - } - handleMessage = (event: any): void => { - const message = event.data; - if (message.active_device !== DEVICE_LIST_KEY.CLUE) { - return; - } - switch (message.command) { - case "reset-state": - this.setState({ - clue: DEFAULT_CLUE_STATE, - play_button: false, - }); - break; - case "set-state": - this.handleStateChangeMessage(message); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - clue: { - ...this.state.clue, - displayMessage: DEFAULT_IMG_CLUE, - }, - }); - break; - case "visible-editors": - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } + private imageRef: React.RefObject = React.createRef(); + constructor() { + super({}); + this.state = { + clue: DEFAULT_CLUE_STATE, + play_button: false, + selected_file: "", + active_editors: [], + running_file: undefined, + currently_selected_file: "", + }; + this.onKeyEvent = this.onKeyEvent.bind(this); + } + handleMessage = (event: any): void => { + const message = event.data; + if (message.active_device !== DEVICE_LIST_KEY.CLUE) { + return; + } + switch (message.command) { + case "reset-state": + this.setState({ + clue: DEFAULT_CLUE_STATE, + play_button: false, + }); + break; + case "set-state": + this.handleStateChangeMessage(message); + break; + case "activate-play": + const newRunningFile = this.state.currently_selected_file; + this.setState({ + play_button: !this.state.play_button, + running_file: newRunningFile, + clue: { + ...this.state.clue, + displayMessage: DEFAULT_IMG_CLUE, + }, + }); + break; + case "visible-editors": + this.setState({ + active_editors: message.state.activePythonEditors, + }); + break; + case "current-file": + if (this.state.play_button) { + this.setState({ + currently_selected_file: message.state.running_file, + }); + } else { + this.setState({ + running_file: message.state.running_file, + currently_selected_file: message.state.running_file, + }); + } - break; - } - }; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } + break; + } + }; + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } + componentWillUnmount() { + window.removeEventListener("message", this.handleMessage); + } - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
+ render() { + const playStopImage = this.state.play_button ? StopLogo : PlayLogo; + const playStopLabel = this.state.play_button ? "stop" : "play"; + return ( +
+
+ {this.state.running_file && this.state.play_button + ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) + : CONSTANTS.FILES_PLACEHOLDER} +
-
- -
- -
- ); - } - protected togglePlayClick = () => { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - }; - protected onSelectFile(event: React.FocusEvent) { - this.setState({ - selected_file: event.currentTarget.value, - }); - } - protected refreshSimulatorClick = () => { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - }; - protected handleButtonClick = (key: string, isActive: boolean) => { - let newButtonState = this.state.clue.buttons; - switch (key) { - case AB_BUTTONS_KEYS.BTN_A: - newButtonState.button_a = isActive; - break; - case AB_BUTTONS_KEYS.BTN_B: - newButtonState.button_b = isActive; - break; - case AB_BUTTONS_KEYS.BTN_AB: - newButtonState = { - button_a: isActive, - button_b: isActive, - }; - break; - } - sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); - this.setState({ - clue: { - ...this.state.clue, - buttons: newButtonState, - }, - }); - }; +
+ +
+ +
+ ); + } + protected togglePlayClick = () => { + const button = + window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || + window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { + selected_file: this.state.selected_file, + state: !this.state.play_button, + }); + }; + protected onSelectFile(event: React.FocusEvent) { + this.setState({ + selected_file: event.currentTarget.value, + }); + } + protected refreshSimulatorClick = () => { + const button = window.document.getElementById( + CONSTANTS.ID_NAME.REFRESH_BUTTON + ); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); + }; + protected handleButtonClick = (key: string, isActive: boolean) => { + let newButtonState = this.state.clue.buttons; + switch (key) { + case AB_BUTTONS_KEYS.BTN_A: + newButtonState.button_a = isActive; + break; + case AB_BUTTONS_KEYS.BTN_B: + newButtonState.button_b = isActive; + break; + case AB_BUTTONS_KEYS.BTN_AB: + newButtonState = { + button_a: isActive, + button_b: isActive, + }; + break; + } + sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); + this.setState({ + clue: { + ...this.state.clue, + buttons: newButtonState, + }, + }); + }; - protected onMouseUp = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, false); - }; + protected onMouseUp = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, false); + }; - protected onMouseDown = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, true); - }; + protected onMouseDown = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, true); + }; - protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { - event.stopPropagation(); - if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(key, active); - if (key === BUTTONS_KEYS.BTN_A) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if (key === BUTTONS_KEYS.BTN_B) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if (key === BUTTONS_KEYS.BTN_AB) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } - } - protected handleStateChangeMessage(message: any) { - if (message.state.display_base64 != null) { - this.setState({ - clue: { - ...this.state.clue, - displayMessage: message.state.display_base64, - }, - }); - } else if (message.state.pixels != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - neopixel: message.state.pixels, - }, - }, - }); - } else if (message.state.white_leds != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - isWhiteLedOn: message.state.white_leds, - }, - }, - }); - } else if (message.state.red_led != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - isRedLedOn: message.state.red_led, - }, - }, - }); - } - } + protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { + event.stopPropagation(); + if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(key, active); + if (key === BUTTONS_KEYS.BTN_A) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active + ); + } else if (key === BUTTONS_KEYS.BTN_B) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active + ); + } else if (key === BUTTONS_KEYS.BTN_AB) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active + ); + } + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active + ); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { + this.togglePlayClick(); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { + this.refreshSimulatorClick(); + } + } + protected handleStateChangeMessage(message: any) { + if (message.state.display_base64 != null) { + this.setState({ + clue: { + ...this.state.clue, + displayMessage: message.state.display_base64, + }, + }); + } else if (message.state.pixels != null) { + this.setState({ + clue: { + ...this.state.clue, + leds: { + ...this.state.clue.leds, + neopixel: message.state.pixels, + }, + }, + }); + } else if (message.state.white_leds != null) { + this.setState({ + clue: { + ...this.state.clue, + leds: { + ...this.state.clue.leds, + isWhiteLedOn: message.state.white_leds, + }, + }, + }); + } else if (message.state.red_led != null) { + this.setState({ + clue: { + ...this.state.clue, + leds: { + ...this.state.clue.leds, + isRedLedOn: message.state.red_led, + }, + }, + }); + } + } } ClueSimulator.contextType = ViewStateContext; diff --git a/Source/view/components/clue/Clue_svg.tsx b/Source/view/components/clue/Clue_svg.tsx index 2f09d3321..b67b1f0f9 100644 --- a/Source/view/components/clue/Clue_svg.tsx +++ b/Source/view/components/clue/Clue_svg.tsx @@ -7,1169 +7,1178 @@ import "../../styles/SimulatorSvg.css"; import svg from "../cpx/Svg_utils"; import { DEFAULT_CLUE_STATE } from "./ClueSimulator"; export interface IRefObject { - [key: string]: React.RefObject; + [key: string]: React.RefObject; } interface IProps { - displayImage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; + displayImage: string; + leds: { + neopixel: number[]; + isRedLedOn: boolean; + isWhiteLedOn: boolean; + }; } export class ClueSvg extends React.Component { - private svgRef: React.RefObject = React.createRef(); - private ledsRefs = { - neopixel: React.createRef(), - redLed: React.createRef(), - whiteLeds: [ - React.createRef(), - React.createRef(), - ], - }; - private gradientRefs = { - neopixel: React.createRef(), - whiteLed: React.createRef(), - redLed: React.createRef(), - }; + private svgRef: React.RefObject = React.createRef(); + private ledsRefs = { + neopixel: React.createRef(), + redLed: React.createRef(), + whiteLeds: [ + React.createRef(), + React.createRef(), + ], + }; + private gradientRefs = { + neopixel: React.createRef(), + whiteLed: React.createRef(), + redLed: React.createRef(), + }; - private buttonRefs: IRefObject = { - BTN_A: React.createRef(), - BTN_B: React.createRef(), - BTN_AB: React.createRef(), - }; + private buttonRefs: IRefObject = { + BTN_A: React.createRef(), + BTN_B: React.createRef(), + BTN_AB: React.createRef(), + }; - private displayRef: React.RefObject = React.createRef(); + private displayRef: React.RefObject = React.createRef(); - public getSvgRef(): React.RefObject { - return this.svgRef; - } - public getButtons(): IRefObject { - return this.buttonRefs; - } - public getDisplayRef(): React.RefObject { - return this.displayRef; - } - componentDidMount() { - this.updateSvg(); - } - componentDidUpdate() { - this.updateSvg(); - } + public getSvgRef(): React.RefObject { + return this.svgRef; + } + public getButtons(): IRefObject { + return this.buttonRefs; + } + public getDisplayRef(): React.RefObject { + return this.displayRef; + } + componentDidMount() { + this.updateSvg(); + } + componentDidUpdate() { + this.updateSvg(); + } - render() { - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + render() { + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - A+B - - - + + + + + + + + + + + + + + + + + + + + + + + + + + A+B + + + - - - - - - - LIGHT - - - GESTURE - - - P - - R - - - O - - - XIMI - - - T - - - Y - - - - - - - - - - - - - - Red LED - - - - - Neopixel - - - - -
- ); - } - private updateSvg() { - this.updateDisplay(); - this.updateNeopixel(); - this.updateLeds(); - } + + + + + + + LIGHT + + + GESTURE + + + P + + R + + + O + + + XIMI + + + T + + + Y + + + + + + + + + + + + + + Red LED + + + + + Neopixel + + + + +
+ ); + } + private updateSvg() { + this.updateDisplay(); + this.updateNeopixel(); + this.updateLeds(); + } - private updateDisplay() { - if (this.props.displayImage) { - this.displayRef.current?.setAttribute( - "href", - `data:image/png;base64,${this.props.displayImage}` - ); - } - } + private updateDisplay() { + if (this.props.displayImage) { + this.displayRef.current?.setAttribute( + "href", + `data:image/png;base64,${this.props.displayImage}` + ); + } + } - private updateNeopixel() { - const { neopixel } = this.props.leds; - const rgbColor = `rgb(${ - neopixel[0] + (255 - neopixel[0]) * CONSTANTS.LED_TINT_FACTOR - }, - ${neopixel[1] + (255 - neopixel[1]) * CONSTANTS.LED_TINT_FACTOR},${ - neopixel[2] + (255 - neopixel[2]) * CONSTANTS.LED_TINT_FACTOR - })`; + private updateNeopixel() { + const { neopixel } = this.props.leds; + const rgbColor = `rgb(${neopixel[0] + + (255 - neopixel[0]) * CONSTANTS.LED_TINT_FACTOR}, + ${neopixel[1] + + (255 - neopixel[1]) * CONSTANTS.LED_TINT_FACTOR},${neopixel[2] + + (255 - neopixel[2]) * CONSTANTS.LED_TINT_FACTOR})`; - this.ledsRefs.neopixel.current?.setAttribute("fill", rgbColor); + this.ledsRefs.neopixel.current?.setAttribute("fill", rgbColor); - if (neopixel === DEFAULT_CLUE_STATE.leds.neopixel) { - this.gradientRefs.neopixel.current?.setAttribute( - "stop-opacity", - "0" - ); - } else { - this.gradientRefs.neopixel.current?.setAttribute( - "stop-opacity", - "1" - ); - } - this.gradientRefs.neopixel.current?.setAttribute( - "stop-color", - rgbColor - ); - } - private updateLeds() { - // update white led - const { isWhiteLedOn, isRedLedOn } = this.props.leds; + if (neopixel === DEFAULT_CLUE_STATE.leds.neopixel) { + this.gradientRefs.neopixel.current?.setAttribute( + "stop-opacity", + "0" + ); + } else { + this.gradientRefs.neopixel.current?.setAttribute( + "stop-opacity", + "1" + ); + } + this.gradientRefs.neopixel.current?.setAttribute( + "stop-color", + rgbColor + ); + } + private updateLeds() { + // update white led + const { isWhiteLedOn, isRedLedOn } = this.props.leds; - this.ledsRefs.whiteLeds.map( - (ledRef: React.RefObject) => { - svg.setLed( - isWhiteLedOn, - CLUE_LEDS_COLORS.WHITE_LEDS_OFF, - CLUE_LEDS_COLORS.WHITE_LEDS_ON, - ledRef.current, - this.gradientRefs.whiteLed.current - ); - } - ); - svg.setLed( - isRedLedOn, - CLUE_LEDS_COLORS.RED_LED_OFF, - CLUE_LEDS_COLORS.RED_LED_ON, - this.ledsRefs.redLed.current, - this.gradientRefs.redLed.current - ); - } + this.ledsRefs.whiteLeds.map( + (ledRef: React.RefObject) => { + svg.setLed( + isWhiteLedOn, + CLUE_LEDS_COLORS.WHITE_LEDS_OFF, + CLUE_LEDS_COLORS.WHITE_LEDS_ON, + ledRef.current, + this.gradientRefs.whiteLed.current + ); + } + ); + svg.setLed( + isRedLedOn, + CLUE_LEDS_COLORS.RED_LED_OFF, + CLUE_LEDS_COLORS.RED_LED_ON, + this.ledsRefs.redLed.current, + this.gradientRefs.redLed.current + ); + } } diff --git a/Source/view/components/cpx/Accessibility_utils.ts b/Source/view/components/cpx/Accessibility_utils.ts index 1ce8d7559..afdadb2ac 100644 --- a/Source/view/components/cpx/Accessibility_utils.ts +++ b/Source/view/components/cpx/Accessibility_utils.ts @@ -3,24 +3,24 @@ // Helpers designed to help to make a simulator accessible. namespace accessibility { - export function makeFocusable(elem: SVGElement): void { - elem.setAttribute("focusable", "true"); - elem.setAttribute("tabindex", "0"); - } + export function makeFocusable(elem: SVGElement): void { + elem.setAttribute("focusable", "true"); + elem.setAttribute("tabindex", "0"); + } - export function setAria( - elem: Element, - role?: string, - label?: string - ): void { - if (role && !elem.hasAttribute("role")) { - elem.setAttribute("role", role); - } + export function setAria( + elem: Element, + role?: string, + label?: string + ): void { + if (role && !elem.hasAttribute("role")) { + elem.setAttribute("role", role); + } - if (label && !elem.hasAttribute("aria-label")) { - elem.setAttribute("aria-label", label); - } - } + if (label && !elem.hasAttribute("aria-label")) { + elem.setAttribute("aria-label", label); + } + } } export default accessibility; diff --git a/Source/view/components/cpx/Cpx.spec.tsx b/Source/view/components/cpx/Cpx.spec.tsx index 229140637..3b5bdfb6a 100644 --- a/Source/view/components/cpx/Cpx.spec.tsx +++ b/Source/view/components/cpx/Cpx.spec.tsx @@ -5,25 +5,25 @@ import * as testRenderer from "react-test-renderer"; import { Cpx } from "./Cpx"; describe("CPX component", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/components/cpx/Cpx.tsx b/Source/view/components/cpx/Cpx.tsx index 2da890fac..02560623a 100644 --- a/Source/view/components/cpx/Cpx.tsx +++ b/Source/view/components/cpx/Cpx.tsx @@ -10,95 +10,95 @@ import Simulator from "./CpxSimulator"; // Component grouping the functionality for circuit playground express const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - }, + sensors: { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT]: 0, + [SENSOR_LIST.MOTION_X]: 0, + [SENSOR_LIST.MOTION_Y]: 0, + [SENSOR_LIST.MOTION_Z]: 0, + }, }; export class Cpx extends React.Component { - state = DEFAULT_STATE; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } + state = DEFAULT_STATE; + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + handleMessage = (event: any): void => { + const message = event.data; - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.RESET: + this.setState({ ...DEFAULT_STATE }); + break; + } + }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; + render() { + return ( + + + + + ); + } + updateSensor = (sensor: SENSOR_LIST, value: number) => { + this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); + }; } const CPX_TOOLBAR_BUTTONS: Array<{ label: any; image: any }> = [ - { - image: TOOLBAR_SVG.SLIDER_SWITCH_SVG, - label: CPX_TOOLBAR_ICON_ID.SWITCH, - }, - { - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - label: CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, - }, - { - image: TOOLBAR_SVG.RED_LED_SVG, - label: CPX_TOOLBAR_ICON_ID.RED_LED, - }, - { - image: TOOLBAR_SVG.SOUND_SVG, - label: CPX_TOOLBAR_ICON_ID.SOUND, - }, - { - image: TOOLBAR_SVG.TEMPERATURE_SVG, - label: CPX_TOOLBAR_ICON_ID.TEMPERATURE, - }, - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: CPX_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.NEO_PIXEL_SVG, - label: CPX_TOOLBAR_ICON_ID.NEO_PIXEL, - }, - { - image: TOOLBAR_SVG.SPEAKER_SVG, - label: CPX_TOOLBAR_ICON_ID.SPEAKER, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: CPX_TOOLBAR_ICON_ID.MOTION, - }, - { - image: TOOLBAR_SVG.IR_SVG, - label: CPX_TOOLBAR_ICON_ID.IR, - }, - { - image: TOOLBAR_SVG.GPIO_SVG, - label: CPX_TOOLBAR_ICON_ID.GPIO, - }, + { + image: TOOLBAR_SVG.SLIDER_SWITCH_SVG, + label: CPX_TOOLBAR_ICON_ID.SWITCH, + }, + { + image: TOOLBAR_SVG.PUSH_BUTTON_SVG, + label: CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, + }, + { + image: TOOLBAR_SVG.RED_LED_SVG, + label: CPX_TOOLBAR_ICON_ID.RED_LED, + }, + { + image: TOOLBAR_SVG.SOUND_SVG, + label: CPX_TOOLBAR_ICON_ID.SOUND, + }, + { + image: TOOLBAR_SVG.TEMPERATURE_SVG, + label: CPX_TOOLBAR_ICON_ID.TEMPERATURE, + }, + { + image: TOOLBAR_SVG.LIGHT_SVG, + label: CPX_TOOLBAR_ICON_ID.LIGHT, + }, + { + image: TOOLBAR_SVG.NEO_PIXEL_SVG, + label: CPX_TOOLBAR_ICON_ID.NEO_PIXEL, + }, + { + image: TOOLBAR_SVG.SPEAKER_SVG, + label: CPX_TOOLBAR_ICON_ID.SPEAKER, + }, + { + image: TOOLBAR_SVG.MOTION_SVG, + label: CPX_TOOLBAR_ICON_ID.MOTION, + }, + { + image: TOOLBAR_SVG.IR_SVG, + label: CPX_TOOLBAR_ICON_ID.IR, + }, + { + image: TOOLBAR_SVG.GPIO_SVG, + label: CPX_TOOLBAR_ICON_ID.GPIO, + }, ]; diff --git a/Source/view/components/cpx/CpxImage.tsx b/Source/view/components/cpx/CpxImage.tsx index b56b7a31c..48aef4e64 100644 --- a/Source/view/components/cpx/CpxImage.tsx +++ b/Source/view/components/cpx/CpxImage.tsx @@ -9,400 +9,398 @@ import * as SvgStyle from "./Cpx_svg_style"; import svg from "./Svg_utils"; interface IProps { - pixels: number[][]; - red_led: boolean; - brightness: number; - switch: boolean; - on: boolean; - onKeyEvent: (event: KeyboardEvent, active: boolean) => void; - onMouseUp: (button: HTMLElement, event: Event) => void; - onMouseDown: (button: HTMLElement, event: Event) => void; - onMouseLeave: (button: HTMLElement, event: Event) => void; + pixels: number[][]; + red_led: boolean; + brightness: number; + switch: boolean; + on: boolean; + onKeyEvent: (event: KeyboardEvent, active: boolean) => void; + onMouseUp: (button: HTMLElement, event: Event) => void; + onMouseDown: (button: HTMLElement, event: Event) => void; + onMouseLeave: (button: HTMLElement, event: Event) => void; } export class CpxImage extends React.Component { - componentDidMount() { - const svgElement = window.document.getElementById("cpx_svg"); - if (svgElement) { - initSvgStyle(svgElement, this.props.brightness); - setupButtons(this.props); - setupPins(this.props); - this.setupKeyPresses(this.props.onKeyEvent); - setupSwitch(this.props); - this.updateImage(); - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - componentDidUpdate() { - this.updateImage(); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the switch, run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.S) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.onKeyEvent(event, true); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.onKeyEvent(event, false); - }; - render() { - return CPX_SVG; - } - private updateImage() { - updateNeopixels(this.props); - updateRedLED(this.props.red_led); - updatePowerLED(this.props.on); - updateSwitch(this.props.switch); - } + componentDidMount() { + const svgElement = window.document.getElementById("cpx_svg"); + if (svgElement) { + initSvgStyle(svgElement, this.props.brightness); + setupButtons(this.props); + setupPins(this.props); + this.setupKeyPresses(this.props.onKeyEvent); + setupSwitch(this.props); + this.updateImage(); + } + } + componentWillUnmount() { + window.document.removeEventListener("keydown", this.handleKeyDown); + window.document.removeEventListener("keyup", this.handleKeyUp); + } + componentDidUpdate() { + this.updateImage(); + } + setupKeyPresses = ( + onKeyEvent: (event: KeyboardEvent, active: boolean) => void + ) => { + window.document.addEventListener("keydown", this.handleKeyDown); + window.document.addEventListener("keyup", this.handleKeyUp); + }; + + handleKeyDown = (event: KeyboardEvent) => { + const keyEvents = [event.key, event.code]; + // Don't listen to keydown events for the switch, run button, restart button and enter key + if ( + !( + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.S) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) + ) + ) { + this.props.onKeyEvent(event, true); + } + }; + handleKeyUp = (event: KeyboardEvent) => { + this.props.onKeyEvent(event, false); + }; + render() { + return CPX_SVG; + } + private updateImage() { + updateNeopixels(this.props); + updateRedLED(this.props.red_led); + updatePowerLED(this.props.on); + updateSwitch(this.props.switch); + } } const makeButton = ( - g: SVGElement, - left: number, - top: number, - id: string + g: SVGElement, + left: number, + top: number, + id: string ): { outer: SVGElement; inner: SVGElement } => { - const buttonCornerRadius = SvgStyle.BUTTON_CORNER_RADIUS; - const buttonWidth = SvgStyle.BUTTON_WIDTH; - const buttonCircleRadius = SvgStyle.BUTTON_CIRCLE_RADIUS; - const btng = svg.child(g, "g", { class: "sim-button-group" }); - svg.child(btng, "rect", { - fill: SvgStyle.BUTTON_OUTER, - height: buttonWidth, - id: id + "_OUTER", - rx: buttonCornerRadius, - ry: buttonCornerRadius, - width: buttonWidth, - x: left, - y: top, - }); - - const outer = btng; - const inner = svg.child(btng, "circle", { - id: id + "_INNER", - cx: left + buttonWidth / 2, - cy: top + buttonWidth / 2, - r: buttonCircleRadius, - fill: SvgStyle.BUTTON_NEUTRAL, - }); - - return { outer, inner }; + const buttonCornerRadius = SvgStyle.BUTTON_CORNER_RADIUS; + const buttonWidth = SvgStyle.BUTTON_WIDTH; + const buttonCircleRadius = SvgStyle.BUTTON_CIRCLE_RADIUS; + const btng = svg.child(g, "g", { class: "sim-button-group" }); + svg.child(btng, "rect", { + fill: SvgStyle.BUTTON_OUTER, + height: buttonWidth, + id: id + "_OUTER", + rx: buttonCornerRadius, + ry: buttonCornerRadius, + width: buttonWidth, + x: left, + y: top, + }); + + const outer = btng; + const inner = svg.child(btng, "circle", { + id: id + "_INNER", + cx: left + buttonWidth / 2, + cy: top + buttonWidth / 2, + r: buttonCircleRadius, + fill: SvgStyle.BUTTON_NEUTRAL, + }); + + return { outer, inner }; }; const initSvgStyle = (svgElement: HTMLElement, brightness: number): void => { - const style: SVGStyleElement = svg.child( - svgElement, - "style", - {} - ) as SVGStyleElement; - style.textContent = SvgStyle.SVG_STYLE; - - // Filters for the glow effect (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) - const defs: SVGDefsElement = svg.child( - svgElement, - "defs", - {} - ) as SVGDefsElement; - - const g = svg.createElement("g") as SVGElement; - svgElement.appendChild(g); - - const glow = svg.child(defs, "filter", { - height: "120%", - id: "filterglow", - width: "120%", - x: "-5%", - y: "-5%", - }); - svg.child(glow, "feGaussianBlur", { stdDeviation: "5", result: "glow" }); - const merge = svg.child(glow, "feMerge", {}); - for (let i = 0; i < 3; ++i) { - svg.child(merge, "feMergeNode", { in: "glow" }); - } - - const neopixelglow = svg.child(defs, "filter", { - height: "600%", - id: "neopixelglow", - width: "600%", - x: "-300%", - y: "-300%", - }); - svg.child(neopixelglow, "feGaussianBlur", { - result: "coloredBlur", - stdDeviation: "4.3", - }); - const neopixelmerge = svg.child(neopixelglow, "feMerge", {}); - svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); - svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); - svg.child(neopixelmerge, "feMergeNode", { in: "SourceGraphic" }); - - // Brightness - const neopixelfeComponentTransfer = svg.child( - neopixelglow, - "feComponentTransfer", - {} - ); - svg.child(neopixelfeComponentTransfer, "feFuncR", { - id: "brightnessFilterR", - type: "linear", - slope: brightness, - }); - svg.child(neopixelfeComponentTransfer, "feFuncG", { - id: "brightnessFilterG", - slope: brightness, - type: "linear", - }); - svg.child(neopixelfeComponentTransfer, "feFuncB", { - id: "brightnessFilterB", - slope: brightness, - type: "linear", - }); - - // BTN A+B - const outerBtn = (left: number, top: number, label: string) => { - return makeButton(g, left, top, "BTN_AB"); - }; - - const ab = outerBtn(165, SvgStyle.MB_HEIGHT - 15, "A+B"); - const abtext = svg.child(ab.outer, "text", { - class: "sim-text-outside", - x: SvgStyle.BUTTON_TEXT_BASELINE, - y: SvgStyle.MB_HEIGHT - 18, - }) as SVGTextElement; - abtext.textContent = "A+B"; + const style: SVGStyleElement = svg.child( + svgElement, + "style", + {} + ) as SVGStyleElement; + style.textContent = SvgStyle.SVG_STYLE; + + // Filters for the glow effect (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) + const defs: SVGDefsElement = svg.child( + svgElement, + "defs", + {} + ) as SVGDefsElement; + + const g = svg.createElement("g") as SVGElement; + svgElement.appendChild(g); + + const glow = svg.child(defs, "filter", { + height: "120%", + id: "filterglow", + width: "120%", + x: "-5%", + y: "-5%", + }); + svg.child(glow, "feGaussianBlur", { stdDeviation: "5", result: "glow" }); + const merge = svg.child(glow, "feMerge", {}); + for (let i = 0; i < 3; ++i) { + svg.child(merge, "feMergeNode", { in: "glow" }); + } + + const neopixelglow = svg.child(defs, "filter", { + height: "600%", + id: "neopixelglow", + width: "600%", + x: "-300%", + y: "-300%", + }); + svg.child(neopixelglow, "feGaussianBlur", { + result: "coloredBlur", + stdDeviation: "4.3", + }); + const neopixelmerge = svg.child(neopixelglow, "feMerge", {}); + svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); + svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); + svg.child(neopixelmerge, "feMergeNode", { in: "SourceGraphic" }); + + // Brightness + const neopixelfeComponentTransfer = svg.child( + neopixelglow, + "feComponentTransfer", + {} + ); + svg.child(neopixelfeComponentTransfer, "feFuncR", { + id: "brightnessFilterR", + type: "linear", + slope: brightness, + }); + svg.child(neopixelfeComponentTransfer, "feFuncG", { + id: "brightnessFilterG", + slope: brightness, + type: "linear", + }); + svg.child(neopixelfeComponentTransfer, "feFuncB", { + id: "brightnessFilterB", + slope: brightness, + type: "linear", + }); + + // BTN A+B + const outerBtn = (left: number, top: number, label: string) => { + return makeButton(g, left, top, "BTN_AB"); + }; + + const ab = outerBtn(165, SvgStyle.MB_HEIGHT - 15, "A+B"); + const abtext = svg.child(ab.outer, "text", { + class: "sim-text-outside", + x: SvgStyle.BUTTON_TEXT_BASELINE, + y: SvgStyle.MB_HEIGHT - 18, + }) as SVGTextElement; + abtext.textContent = "A+B"; }; const updateNeopixels = (props: IProps): void => { - for (let i = 0; i < props.pixels.length; i++) { - const led = window.document.getElementById(`NEOPIXEL_${i}`); - if (led) { - setNeopixel(led, props.pixels[i], props.brightness); - } - } + for (let i = 0; i < props.pixels.length; i++) { + const led = window.document.getElementById(`NEOPIXEL_${i}`); + if (led) { + setNeopixel(led, props.pixels[i], props.brightness); + } + } }; const updateRedLED = (propsRedLED: boolean): void => { - const redLED = window.document.getElementById("SERIAL_LED"); - if (redLED) { - redLED.style.fill = propsRedLED - ? SvgStyle.RED_LED_ON - : SvgStyle.RED_LED_OFF; - } + const redLED = window.document.getElementById("SERIAL_LED"); + if (redLED) { + redLED.style.fill = propsRedLED + ? SvgStyle.RED_LED_ON + : SvgStyle.RED_LED_OFF; + } }; const updatePowerLED = (propsPowerLED: boolean): void => { - const powerLED = window.document.getElementById("PWR_LED"); - if (powerLED) { - powerLED.style.fill = propsPowerLED - ? SvgStyle.POWER_LED_ON - : SvgStyle.POWER_LED_OFF; - } + const powerLED = window.document.getElementById("PWR_LED"); + if (powerLED) { + powerLED.style.fill = propsPowerLED + ? SvgStyle.POWER_LED_ON + : SvgStyle.POWER_LED_OFF; + } }; const setNeopixel = ( - led: HTMLElement, - pixValue: number[], - brightness: number + led: HTMLElement, + pixValue: number[], + brightness: number ): void => { - if (isLightOn(pixValue) && brightness > 0) { - // Neopixels style (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) - changeBrightness("brightnessFilterR", brightness); - changeBrightness("brightnessFilterG", brightness); - changeBrightness("brightnessFilterB", brightness); - - let [hue, sat, lum] = SvgStyle.rgbToHsl([ - pixValue[0], - pixValue[1], - pixValue[2], - ]); - const innerLum = Math.max( - lum * SvgStyle.INTENSITY_FACTOR, - SvgStyle.MIN_INNER_LUM - ); - lum = (lum * 90) / 100 + 10; // at least 10% luminosity for the stroke - - led.style.filter = `url(#neopixelglow)`; - led.style.fill = `hsl(${hue}, ${sat}%, ${innerLum}%)`; - led.style.stroke = `hsl(${hue}, ${sat}%, ${Math.min( - lum * 3, - SvgStyle.MAX_STROKE_LUM - )}%)`; - led.style.strokeWidth = `1.5`; - } else { - led.style.fill = SvgStyle.OFF_COLOR; - led.style.filter = `none`; - led.style.stroke = `none`; - } + if (isLightOn(pixValue) && brightness > 0) { + // Neopixels style (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) + changeBrightness("brightnessFilterR", brightness); + changeBrightness("brightnessFilterG", brightness); + changeBrightness("brightnessFilterB", brightness); + + let [hue, sat, lum] = SvgStyle.rgbToHsl([ + pixValue[0], + pixValue[1], + pixValue[2], + ]); + const innerLum = Math.max( + lum * SvgStyle.INTENSITY_FACTOR, + SvgStyle.MIN_INNER_LUM + ); + lum = (lum * 90) / 100 + 10; // at least 10% luminosity for the stroke + + led.style.filter = `url(#neopixelglow)`; + led.style.fill = `hsl(${hue}, ${sat}%, ${innerLum}%)`; + led.style.stroke = `hsl(${hue}, ${sat}%, ${Math.min( + lum * 3, + SvgStyle.MAX_STROKE_LUM + )}%)`; + led.style.strokeWidth = `1.5`; + } else { + led.style.fill = SvgStyle.OFF_COLOR; + led.style.filter = `none`; + led.style.stroke = `none`; + } }; const isLightOn = (pixValue: number[]): boolean => { - return !pixValue.every((val) => { - return val === 0; - }); + return !pixValue.every(val => { + return val === 0; + }); }; const changeBrightness = (filterID: string, brightness: number): void => { - const brightnessFilter: HTMLElement | null = - window.document.getElementById(filterID); - if (brightnessFilter) { - brightnessFilter.setAttribute("slope", brightness.toString()); - } + const brightnessFilter: HTMLElement | null = window.document.getElementById( + filterID + ); + if (brightnessFilter) { + brightnessFilter.setAttribute("slope", brightness.toString()); + } }; const setupButtons = (props: IProps): void => { - const outButtons = ["A_OUTER", "B_OUTER", "AB_OUTER"]; - const inButtons = ["A_INNER", "B_INNER", "AB_INNER"]; - outButtons.forEach((buttonName) => { - const button = window.document.getElementById("BTN_" + buttonName); - - if (button) { - setupButton(button, "sim-button-outer", props); - } - }); - inButtons.forEach((buttonName) => { - const button = window.document.getElementById("BTN_" + buttonName); - if (button) { - setupButton(button, "sim-button", props); - } - }); + const outButtons = ["A_OUTER", "B_OUTER", "AB_OUTER"]; + const inButtons = ["A_INNER", "B_INNER", "AB_INNER"]; + outButtons.forEach(buttonName => { + const button = window.document.getElementById("BTN_" + buttonName); + + if (button) { + setupButton(button, "sim-button-outer", props); + } + }); + inButtons.forEach(buttonName => { + const button = window.document.getElementById("BTN_" + buttonName); + if (button) { + setupButton(button, "sim-button", props); + } + }); }; const setupPins = (props: IProps): void => { - const pins = [ - "PIN_A1", - "PIN_A2", - "PIN_A3", - "PIN_A4", - "PIN_A5", - "PIN_A6", - "PIN_A7", - ]; - pins.forEach((pinName) => { - const pin = window.document.getElementById(pinName); - - if (pin) { - const svgPin = pin as unknown as SVGElement; - svg.addClass(svgPin, `sim-${pinName}-touch`); - accessibility.makeFocusable(svgPin); - svgPin.onmouseup = (e) => props.onMouseUp(pin, e); - svgPin.onkeyup = (e) => props.onKeyEvent(e, false); - svgPin.onmousedown = (e) => props.onMouseDown(pin, e); - svgPin.onkeydown = (e) => props.onKeyEvent(e, true); - accessibility.setAria( - svgPin, - "button", - `Touch pin ${pinName.substr(pinName.length - 2)}` - ); - } - }); + const pins = [ + "PIN_A1", + "PIN_A2", + "PIN_A3", + "PIN_A4", + "PIN_A5", + "PIN_A6", + "PIN_A7", + ]; + pins.forEach(pinName => { + const pin = window.document.getElementById(pinName); + + if (pin) { + const svgPin = (pin as unknown) as SVGElement; + svg.addClass(svgPin, `sim-${pinName}-touch`); + accessibility.makeFocusable(svgPin); + svgPin.onmouseup = e => props.onMouseUp(pin, e); + svgPin.onkeyup = e => props.onKeyEvent(e, false); + svgPin.onmousedown = e => props.onMouseDown(pin, e); + svgPin.onkeydown = e => props.onKeyEvent(e, true); + accessibility.setAria( + svgPin, + "button", + `Touch pin ${pinName.substr(pinName.length - 2)}` + ); + } + }); }; const addButtonLabels = (button: HTMLElement) => { - let label = ""; - if (button.id.match(/AB/) !== null) { - label = "a+b"; - } else if (button.id.match(/A/) !== null) { - label = "a"; - } else if (button.id.match(/B/) !== null) { - label = "b"; - } - accessibility.setAria(button, "button", label); + let label = ""; + if (button.id.match(/AB/) !== null) { + label = "a+b"; + } else if (button.id.match(/A/) !== null) { + label = "a"; + } else if (button.id.match(/B/) !== null) { + label = "b"; + } + accessibility.setAria(button, "button", label); }; const setupButton = (button: HTMLElement, className: string, props: IProps) => { - const svgButton = button as unknown as SVGElement; - svg.addClass(svgButton, className); - addButtonLabels(button); - if (className.match(/outer/) !== null) { - accessibility.makeFocusable(svgButton); - } - svgButton.onmousedown = (e) => props.onMouseDown(button, e); - svgButton.onmouseup = (e) => props.onMouseUp(button, e); - svgButton.onkeydown = (e) => { - // ensure that the keydown is enter. - // Or else, if the key is a shortcut instead, - // it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - props.onKeyEvent(e, true); - } - }; - svgButton.onkeyup = (e) => props.onKeyEvent(e, false); - svgButton.onmouseleave = (e) => props.onMouseLeave(button, e); + const svgButton = (button as unknown) as SVGElement; + svg.addClass(svgButton, className); + addButtonLabels(button); + if (className.match(/outer/) !== null) { + accessibility.makeFocusable(svgButton); + } + svgButton.onmousedown = e => props.onMouseDown(button, e); + svgButton.onmouseup = e => props.onMouseUp(button, e); + svgButton.onkeydown = e => { + // ensure that the keydown is enter. + // Or else, if the key is a shortcut instead, + // it may register shortcuts twice + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + props.onKeyEvent(e, true); + } + }; + svgButton.onkeyup = e => props.onKeyEvent(e, false); + svgButton.onmouseleave = e => props.onMouseLeave(button, e); }; const setupSwitch = (props: IProps): void => { - const switchElement = window.document.getElementById("SWITCH"); - const swInnerElement = window.document.getElementById("SWITCH_INNER"); - const swHousingElement = window.document.getElementById("SWITCH_HOUSING"); - - if (switchElement && swInnerElement && swHousingElement) { - const svgSwitch: SVGElement = switchElement as unknown as SVGElement; - const svgSwitchInner: SVGElement = - swInnerElement as unknown as SVGElement; - const svgSwitchHousing: SVGElement = - swHousingElement as unknown as SVGElement; - - svg.addClass(svgSwitch, "sim-slide-switch"); - - svgSwitch.onmouseup = (e) => props.onMouseUp(switchElement, e); - svgSwitchInner.onmouseup = (e) => props.onMouseUp(swInnerElement, e); - svgSwitchHousing.onmouseup = (e) => - props.onMouseUp(swHousingElement, e); - svgSwitch.onkeyup = (e) => props.onKeyEvent(e, false); - - accessibility.makeFocusable(svgSwitch); - accessibility.setAria(svgSwitch, "button", "On/Off Switch"); - } + const switchElement = window.document.getElementById("SWITCH"); + const swInnerElement = window.document.getElementById("SWITCH_INNER"); + const swHousingElement = window.document.getElementById("SWITCH_HOUSING"); + + if (switchElement && swInnerElement && swHousingElement) { + const svgSwitch: SVGElement = (switchElement as unknown) as SVGElement; + const svgSwitchInner: SVGElement = (swInnerElement as unknown) as SVGElement; + const svgSwitchHousing: SVGElement = (swHousingElement as unknown) as SVGElement; + + svg.addClass(svgSwitch, "sim-slide-switch"); + + svgSwitch.onmouseup = e => props.onMouseUp(switchElement, e); + svgSwitchInner.onmouseup = e => props.onMouseUp(swInnerElement, e); + svgSwitchHousing.onmouseup = e => props.onMouseUp(swHousingElement, e); + svgSwitch.onkeyup = e => props.onKeyEvent(e, false); + + accessibility.makeFocusable(svgSwitch); + accessibility.setAria(svgSwitch, "button", "On/Off Switch"); + } }; export const updateSwitch = (switchState: boolean): void => { - const switchElement = window.document.getElementById("SWITCH"); - const switchInner = window.document.getElementById( - "SWITCH_INNER" - ) as unknown as SVGElement; - - if (switchElement && switchInner) { - svg.addClass(switchInner, "sim-slide-switch-inner"); - - if (!switchState) { - svg.addClass(switchInner, "on"); - switchInner.setAttribute("transform", "translate(-5,0)"); - } else { - svg.removeClass(switchInner, "on"); - switchInner.removeAttribute("transform"); - } - switchElement.setAttribute("aria-pressed", switchState.toString()); - } + const switchElement = window.document.getElementById("SWITCH"); + const switchInner = (window.document.getElementById( + "SWITCH_INNER" + ) as unknown) as SVGElement; + + if (switchElement && switchInner) { + svg.addClass(switchInner, "sim-slide-switch-inner"); + + if (!switchState) { + svg.addClass(switchInner, "on"); + switchInner.setAttribute("transform", "translate(-5,0)"); + } else { + svg.removeClass(switchInner, "on"); + switchInner.removeAttribute("transform"); + } + switchElement.setAttribute("aria-pressed", switchState.toString()); + } }; export const updatePinTouch = (pinState: boolean, id: string): void => { - console.log(`updating ${id} with ${pinState}`); - const pinElement = window.document.getElementById(id); - const pinSvg: SVGElement = pinElement as unknown as SVGElement; - - if (pinElement && pinSvg) { - pinElement.setAttribute("aria-pressed", pinState.toString()); - pinState - ? svg.addClass(pinSvg, "pin-pressed") - : svg.removeClass(pinSvg, "pin-pressed"); - } + console.log(`updating ${id} with ${pinState}`); + const pinElement = window.document.getElementById(id); + const pinSvg: SVGElement = (pinElement as unknown) as SVGElement; + + if (pinElement && pinSvg) { + pinElement.setAttribute("aria-pressed", pinState.toString()); + pinState + ? svg.addClass(pinSvg, "pin-pressed") + : svg.removeClass(pinSvg, "pin-pressed"); + } }; export default CpxImage; diff --git a/Source/view/components/cpx/CpxSimulator.tsx b/Source/view/components/cpx/CpxSimulator.tsx index 7e095043b..b0d77f441 100644 --- a/Source/view/components/cpx/CpxSimulator.tsx +++ b/Source/view/components/cpx/CpxSimulator.tsx @@ -13,380 +13,380 @@ import { BUTTON_NEUTRAL, BUTTON_PRESSED } from "./Cpx_svg_style"; import { CpxImage, updatePinTouch, updateSwitch } from "./CpxImage"; interface ICpxState { - pixels: number[][]; - brightness: number; - red_led: boolean; - button_a: boolean; - button_b: boolean; - switch: boolean; - touch: boolean[]; - shake: boolean; + pixels: number[][]; + brightness: number; + red_led: boolean; + button_a: boolean; + button_b: boolean; + switch: boolean; + touch: boolean[]; + shake: boolean; } interface IState { - active_editors: string[]; - running_file: string; - selected_file: string; - cpx: ICpxState; - play_button: boolean; - currently_selected_file: string; + active_editors: string[]; + running_file: string; + selected_file: string; + cpx: ICpxState; + play_button: boolean; + currently_selected_file: string; } const DEFAULT_CPX_STATE: ICpxState = { - brightness: 1.0, - button_a: false, - button_b: false, - pixels: [ - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - ], - red_led: false, - switch: false, - touch: [false, false, false, false, false, false, false], - shake: false, + brightness: 1.0, + button_a: false, + button_b: false, + pixels: [ + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + ], + red_led: false, + switch: false, + touch: [false, false, false, false, false, false, false], + shake: false, }; class Simulator extends React.Component<{}, IState> { - constructor(props: Readonly<{}>) { - super(props); - this.state = { - active_editors: [], - cpx: DEFAULT_CPX_STATE, - play_button: false, - running_file: "", - selected_file: "", - currently_selected_file: "", - }; - - this.handleClick = this.handleClick.bind(this); - this.onKeyEvent = this.onKeyEvent.bind(this); - this.onMouseDown = this.onMouseDown.bind(this); - this.onMouseUp = this.onMouseUp.bind(this); - this.onMouseLeave = this.onMouseLeave.bind(this); - this.togglePlayClick = this.togglePlayClick.bind(this); - this.refreshSimulatorClick = this.refreshSimulatorClick.bind(this); - } - - handleMessage = (event: any): void => { - const message = event.data; // The JSON data our extension sent - if (message.active_device !== DEVICE_LIST_KEY.CPX) { - return; - } - switch (message.command) { - case "reset-state": - console.log("Clearing the state"); - this.setState({ - cpx: DEFAULT_CPX_STATE, - play_button: false, - }); - break; - case "set-state": - console.log( - "Setting the state: " + JSON.stringify(message.state) - ); - this.setState({ - cpx: message.state, - play_button: true, - }); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - }); - break; - case "visible-editors": - console.log( - "Setting active editors", - message.state.activePythonEditors - ); - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - console.log("Setting current file", message.state.running_file); - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } - break; - } - }; - - componentDidMount() { - console.log("Mounted"); - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
-
- -
- -
- ); - } - - protected togglePlayClick() { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - } - - protected refreshSimulatorClick() { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - } - - protected onKeyEvent(event: KeyboardEvent, active: boolean) { - let element; - const target = event.target as SVGElement; - // Guard Clause - if (target === undefined) { - return; - } - - if ([event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER)) { - element = window.document.getElementById(target.id); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_A - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_B - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_AB - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.S) - ) { - element = window.document.getElementById(CONSTANTS.ID_NAME.SWITCH); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } else { - if (event.shiftKey) { - switch (event.code) { - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_ONE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A1 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_TWO: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A2 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_THREE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A3 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FOUR: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A4 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FIVE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A5 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SIX: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A6 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SEVEN: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A7 - ); - break; - } - } - } - if (element) { - event.preventDefault(); - this.handleClick(element, active); - element.focus(); - } - } - protected onMouseDown(button: HTMLElement, event: Event) { - event.preventDefault(); - this.handleClick(button, true); - button.focus(); - } - - protected onMouseUp(button: HTMLElement, event: Event) { - event.preventDefault(); - this.handleClick(button, false); - } - - protected onMouseLeave(button: HTMLElement, event: Event) { - event.preventDefault(); - - if (button.getAttribute("pressed") === "true") { - this.handleClick(button, false); - } - } - - private handleClick(element: HTMLElement, active: boolean) { - let newState; - let message; - if (element.id.includes("BTN")) { - newState = this.handleButtonClick(element, active); - message = "button-press"; - } else if (element.id.includes("SWITCH")) { - newState = this.handleSwitchClick(); - message = "button-press"; - } else if (element.id.includes("PIN")) { - newState = this.handleTouchPinClick(element, active); - message = "sensor-changed"; - } else { - return; - } - - if (newState && message) { - sendMessage(message, newState); - } - } - - private handleButtonClick(button: HTMLElement, active: boolean) { - const ButtonA: boolean = button.id.match(/BTN_A/) !== null; - const ButtonB: boolean = button.id.match(/BTN_B/) !== null; - const ButtonAB: boolean = button.id.match(/BTN_AB/) !== null; - let innerButton; - let newState; - - if (ButtonAB) { - innerButton = window.document.getElementById("BTN_AB_INNER"); - newState = { - button_a: active, - button_b: active, - }; - this.setState({ ...this.state, ...newState }); - } else if (ButtonA) { - innerButton = window.document.getElementById("BTN_A_INNER"); - newState = { - button_a: active, - }; - this.setState({ ...this.state, ...newState }); - } else if (ButtonB) { - innerButton = window.document.getElementById("BTN_B_INNER"); - newState = { - button_b: active, - }; - this.setState({ ...this.state, ...newState }); - } - - if (innerButton) { - innerButton.style.fill = this.getButtonColor(active); - } - - button.setAttribute("pressed", `${active}`); - return newState; - } - - private getButtonColor(pressed: boolean) { - const buttonUps = BUTTON_NEUTRAL; - const buttonDown = BUTTON_PRESSED; - return pressed ? buttonDown : buttonUps; - } - - private handleSwitchClick() { - const switchIsOn = !this.state.cpx.switch; - updateSwitch(switchIsOn); - this.setState({ - ...this.state, - cpx: { ...this.state.cpx, switch: switchIsOn }, - }); - return { switch: switchIsOn }; - } - - private handleTouchPinClick(pin: HTMLElement, active: boolean): any { - let cpxState = this.state.cpx; - const pinIndex = parseInt(pin.id.charAt(pin.id.length - 1)) - 1; - const pinState = cpxState.touch; - pinState[pinIndex] = active; - cpxState = { ...cpxState, touch: pinState }; - this.setState({ ...this.state, ...cpxState }); - updatePinTouch(active, pin.id); - return { touch: pinState }; - } + constructor(props: Readonly<{}>) { + super(props); + this.state = { + active_editors: [], + cpx: DEFAULT_CPX_STATE, + play_button: false, + running_file: "", + selected_file: "", + currently_selected_file: "", + }; + + this.handleClick = this.handleClick.bind(this); + this.onKeyEvent = this.onKeyEvent.bind(this); + this.onMouseDown = this.onMouseDown.bind(this); + this.onMouseUp = this.onMouseUp.bind(this); + this.onMouseLeave = this.onMouseLeave.bind(this); + this.togglePlayClick = this.togglePlayClick.bind(this); + this.refreshSimulatorClick = this.refreshSimulatorClick.bind(this); + } + + handleMessage = (event: any): void => { + const message = event.data; // The JSON data our extension sent + if (message.active_device !== DEVICE_LIST_KEY.CPX) { + return; + } + switch (message.command) { + case "reset-state": + console.log("Clearing the state"); + this.setState({ + cpx: DEFAULT_CPX_STATE, + play_button: false, + }); + break; + case "set-state": + console.log( + "Setting the state: " + JSON.stringify(message.state) + ); + this.setState({ + cpx: message.state, + play_button: true, + }); + break; + case "activate-play": + const newRunningFile = this.state.currently_selected_file; + + this.setState({ + play_button: !this.state.play_button, + running_file: newRunningFile, + }); + break; + case "visible-editors": + console.log( + "Setting active editors", + message.state.activePythonEditors + ); + this.setState({ + active_editors: message.state.activePythonEditors, + }); + break; + case "current-file": + console.log("Setting current file", message.state.running_file); + if (this.state.play_button) { + this.setState({ + currently_selected_file: message.state.running_file, + }); + } else { + this.setState({ + running_file: message.state.running_file, + currently_selected_file: message.state.running_file, + }); + } + break; + } + }; + + componentDidMount() { + console.log("Mounted"); + window.addEventListener("message", this.handleMessage); + } + + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + + render() { + const playStopImage = this.state.play_button ? StopLogo : PlayLogo; + const playStopLabel = this.state.play_button ? "stop" : "play"; + return ( +
+
+ {this.state.running_file && this.state.play_button + ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) + : CONSTANTS.FILES_PLACEHOLDER} +
+
+ +
+ +
+ ); + } + + protected togglePlayClick() { + const button = + window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || + window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { + selected_file: this.state.selected_file, + state: !this.state.play_button, + }); + } + + protected refreshSimulatorClick() { + const button = window.document.getElementById( + CONSTANTS.ID_NAME.REFRESH_BUTTON + ); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); + } + + protected onKeyEvent(event: KeyboardEvent, active: boolean) { + let element; + const target = event.target as SVGElement; + // Guard Clause + if (target === undefined) { + return; + } + + if ([event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER)) { + element = window.document.getElementById(target.id); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) + ) { + element = window.document.getElementById( + CONSTANTS.ID_NAME.BUTTON_A + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) + ) { + element = window.document.getElementById( + CONSTANTS.ID_NAME.BUTTON_B + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) + ) { + element = window.document.getElementById( + CONSTANTS.ID_NAME.BUTTON_AB + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.S) + ) { + element = window.document.getElementById(CONSTANTS.ID_NAME.SWITCH); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { + this.togglePlayClick(); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { + this.refreshSimulatorClick(); + } else { + if (event.shiftKey) { + switch (event.code) { + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_ONE: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A1 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_TWO: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A2 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_THREE: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A3 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FOUR: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A4 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FIVE: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A5 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SIX: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A6 + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SEVEN: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A7 + ); + break; + } + } + } + if (element) { + event.preventDefault(); + this.handleClick(element, active); + element.focus(); + } + } + protected onMouseDown(button: HTMLElement, event: Event) { + event.preventDefault(); + this.handleClick(button, true); + button.focus(); + } + + protected onMouseUp(button: HTMLElement, event: Event) { + event.preventDefault(); + this.handleClick(button, false); + } + + protected onMouseLeave(button: HTMLElement, event: Event) { + event.preventDefault(); + + if (button.getAttribute("pressed") === "true") { + this.handleClick(button, false); + } + } + + private handleClick(element: HTMLElement, active: boolean) { + let newState; + let message; + if (element.id.includes("BTN")) { + newState = this.handleButtonClick(element, active); + message = "button-press"; + } else if (element.id.includes("SWITCH")) { + newState = this.handleSwitchClick(); + message = "button-press"; + } else if (element.id.includes("PIN")) { + newState = this.handleTouchPinClick(element, active); + message = "sensor-changed"; + } else { + return; + } + + if (newState && message) { + sendMessage(message, newState); + } + } + + private handleButtonClick(button: HTMLElement, active: boolean) { + const ButtonA: boolean = button.id.match(/BTN_A/) !== null; + const ButtonB: boolean = button.id.match(/BTN_B/) !== null; + const ButtonAB: boolean = button.id.match(/BTN_AB/) !== null; + let innerButton; + let newState; + + if (ButtonAB) { + innerButton = window.document.getElementById("BTN_AB_INNER"); + newState = { + button_a: active, + button_b: active, + }; + this.setState({ ...this.state, ...newState }); + } else if (ButtonA) { + innerButton = window.document.getElementById("BTN_A_INNER"); + newState = { + button_a: active, + }; + this.setState({ ...this.state, ...newState }); + } else if (ButtonB) { + innerButton = window.document.getElementById("BTN_B_INNER"); + newState = { + button_b: active, + }; + this.setState({ ...this.state, ...newState }); + } + + if (innerButton) { + innerButton.style.fill = this.getButtonColor(active); + } + + button.setAttribute("pressed", `${active}`); + return newState; + } + + private getButtonColor(pressed: boolean) { + const buttonUps = BUTTON_NEUTRAL; + const buttonDown = BUTTON_PRESSED; + return pressed ? buttonDown : buttonUps; + } + + private handleSwitchClick() { + const switchIsOn = !this.state.cpx.switch; + updateSwitch(switchIsOn); + this.setState({ + ...this.state, + cpx: { ...this.state.cpx, switch: switchIsOn }, + }); + return { switch: switchIsOn }; + } + + private handleTouchPinClick(pin: HTMLElement, active: boolean): any { + let cpxState = this.state.cpx; + const pinIndex = parseInt(pin.id.charAt(pin.id.length - 1)) - 1; + const pinState = cpxState.touch; + pinState[pinIndex] = active; + cpxState = { ...cpxState, touch: pinState }; + this.setState({ ...this.state, ...cpxState }); + updatePinTouch(active, pin.id); + return { touch: pinState }; + } } export default Simulator; diff --git a/Source/view/components/cpx/Cpx_svg.tsx b/Source/view/components/cpx/Cpx_svg.tsx index 0484dfd11..55864d460 100644 --- a/Source/view/components/cpx/Cpx_svg.tsx +++ b/Source/view/components/cpx/Cpx_svg.tsx @@ -6,2996 +6,2997 @@ import * as React from "react"; export const CPX_SVG = ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); export default CPX_SVG; diff --git a/Source/view/components/cpx/Cpx_svg_style.tsx b/Source/view/components/cpx/Cpx_svg_style.tsx index c9f9b2c77..4eff14480 100644 --- a/Source/view/components/cpx/Cpx_svg_style.tsx +++ b/Source/view/components/cpx/Cpx_svg_style.tsx @@ -24,45 +24,45 @@ export const POWER_LED_OFF: string = "#FFFFFF"; // Adapted from : https://github.com/microsoft/pxt/blob/master/pxtsim/simlib.ts export function rgbToHsl( - rgb: [number, number, number] + rgb: [number, number, number] ): [number, number, number] { - const [r, g, b] = rgb; - const [r$, g$, b$] = [r / 255, g / 255, b / 255]; - const cMin = Math.min(r$, g$, b$); - const cMax = Math.max(r$, g$, b$); - const cDelta = cMax - cMin; - let h: number = 0, - s: number, - l: number; - const maxAndMin = cMax + cMin; + const [r, g, b] = rgb; + const [r$, g$, b$] = [r / 255, g / 255, b / 255]; + const cMin = Math.min(r$, g$, b$); + const cMax = Math.max(r$, g$, b$); + const cDelta = cMax - cMin; + let h: number = 0, + s: number, + l: number; + const maxAndMin = cMax + cMin; - // Luminosity - l = (maxAndMin / 2) * 100; + // Luminosity + l = (maxAndMin / 2) * 100; - if (cDelta === 0) { - s = 0; - h = 0; - } else { - // Hue - switch (cMax) { - case r$: - h = 60 * (((g$ - b$) / cDelta) % 6); - break; - case g$: - h = 60 * ((b$ - r$) / cDelta + 2); - break; - case b$: - h = 60 * ((r$ - g$) / cDelta + 4); - break; - } + if (cDelta === 0) { + s = 0; + h = 0; + } else { + // Hue + switch (cMax) { + case r$: + h = 60 * (((g$ - b$) / cDelta) % 6); + break; + case g$: + h = 60 * ((b$ - r$) / cDelta + 2); + break; + case b$: + h = 60 * ((r$ - g$) / cDelta + 4); + break; + } - // Saturation - l > 50 - ? (s = 100 * (cDelta / (2 - maxAndMin))) - : (s = 100 * (cDelta / maxAndMin)); - } + // Saturation + l > 50 + ? (s = 100 * (cDelta / (2 - maxAndMin))) + : (s = 100 * (cDelta / maxAndMin)); + } - return [Math.floor(h), Math.floor(s), Math.floor(l)]; + return [Math.floor(h), Math.floor(s), Math.floor(l)]; } export const SVG_STYLE = ` diff --git a/Source/view/components/cpx/Svg_utils.tsx b/Source/view/components/cpx/Svg_utils.tsx index 4776c4a0a..92836b923 100644 --- a/Source/view/components/cpx/Svg_utils.tsx +++ b/Source/view/components/cpx/Svg_utils.tsx @@ -5,94 +5,94 @@ // tslint:disable-next-line: no-namespace namespace svg { - export function addClass(el: SVGElement, cls: string) { - if (el.classList) { - el.classList.add(cls); - } else if (el.className.baseVal.indexOf(cls) < 0) { - el.className.baseVal += " " + cls; - } - } + export function addClass(el: SVGElement, cls: string) { + if (el.classList) { + el.classList.add(cls); + } else if (el.className.baseVal.indexOf(cls) < 0) { + el.className.baseVal += " " + cls; + } + } - export function removeClass(el: SVGElement, cls: string) { - if (el.classList) { - el.classList.remove(cls); - } else { - el.className.baseVal = el.className.baseVal - .replace(cls, "") - .replace(/\s{2,}/, " "); - } - } + export function removeClass(el: SVGElement, cls: string) { + if (el.classList) { + el.classList.remove(cls); + } else { + el.className.baseVal = el.className.baseVal + .replace(cls, "") + .replace(/\s{2,}/, " "); + } + } - export function hydrate(el: SVGElement, props: any) { - for (const k in props) { - if (k == "title") { - svg.title(el, props[k]); - } else { - el.setAttributeNS(null, k, props[k]); - } - } - } + export function hydrate(el: SVGElement, props: any) { + for (const k in props) { + if (k == "title") { + svg.title(el, props[k]); + } else { + el.setAttributeNS(null, k, props[k]); + } + } + } - export function createElement(name: string, props?: any): SVGElement { - const newElement = document.createElementNS( - "http://www.w3.org/2000/svg", - name - ); - if (props) { - svg.hydrate(newElement, props); - } - return newElement; - } + export function createElement(name: string, props?: any): SVGElement { + const newElement = document.createElementNS( + "http://www.w3.org/2000/svg", + name + ); + if (props) { + svg.hydrate(newElement, props); + } + return newElement; + } - export function child( - parent: Element, - name: string, - props?: any - ): SVGElement { - const childElement = svg.createElement(name, props); - parent.appendChild(childElement); - return childElement; - } + export function child( + parent: Element, + name: string, + props?: any + ): SVGElement { + const childElement = svg.createElement(name, props); + parent.appendChild(childElement); + return childElement; + } - export function fill(el: SVGElement, c: string) { - el.style.fill = c; - } + export function fill(el: SVGElement, c: string) { + el.style.fill = c; + } - export function filter(el: SVGElement, c: string) { - el.style.filter = c; - } + export function filter(el: SVGElement, c: string) { + el.style.filter = c; + } - export function fills(els: SVGElement[], c: string) { - els.forEach((el) => (el.style.fill = c)); - } + export function fills(els: SVGElement[], c: string) { + els.forEach(el => (el.style.fill = c)); + } - export function mkTitle(txt: string): SVGTitleElement { - const t = svg.createElement("title") as SVGTitleElement; - t.textContent = txt; - return t; - } + export function mkTitle(txt: string): SVGTitleElement { + const t = svg.createElement("title") as SVGTitleElement; + t.textContent = txt; + return t; + } - export function title(el: SVGElement, txt: string): SVGTitleElement { - const t = mkTitle(txt); - el.appendChild(t); - return t; - } + export function title(el: SVGElement, txt: string): SVGTitleElement { + const t = mkTitle(txt); + el.appendChild(t); + return t; + } - export function setLed( - ledStatus: boolean, - offColor: string, - onColor: string, - ledElement: SVGElement | null, - gradientStopElement: SVGStopElement | null - ) { - if (ledStatus) { - ledElement?.setAttribute("fill", onColor); - gradientStopElement?.setAttribute("stop-opacity", "1"); - } else { - ledElement?.setAttribute("fill", offColor); - gradientStopElement?.setAttribute("stop-opacity", "0"); - } - } + export function setLed( + ledStatus: boolean, + offColor: string, + onColor: string, + ledElement: SVGElement | null, + gradientStopElement: SVGStopElement | null + ) { + if (ledStatus) { + ledElement?.setAttribute("fill", onColor); + gradientStopElement?.setAttribute("stop-opacity", "1"); + } else { + ledElement?.setAttribute("fill", offColor); + gradientStopElement?.setAttribute("stop-opacity", "0"); + } + } } export default svg; diff --git a/Source/view/components/microbit/Microbit.spec.tsx b/Source/view/components/microbit/Microbit.spec.tsx index 67c62cbc2..386086866 100644 --- a/Source/view/components/microbit/Microbit.spec.tsx +++ b/Source/view/components/microbit/Microbit.spec.tsx @@ -5,25 +5,25 @@ import * as testRenderer from "react-test-renderer"; import { Microbit } from "./Microbit"; describe("Microbit component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/components/microbit/Microbit.tsx b/Source/view/components/microbit/Microbit.tsx index bfc78aa28..e10c0bfb9 100644 --- a/Source/view/components/microbit/Microbit.tsx +++ b/Source/view/components/microbit/Microbit.tsx @@ -4,10 +4,10 @@ import * as React from "react"; import { MICROBIT_TOOLBAR_ICON_ID } from "../../components/toolbar/SensorModalUtils"; import { - GESTURES_MICROBIT, - SENSOR_LIST, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, + GESTURES_MICROBIT, + SENSOR_LIST, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_MESSAGES, } from "../../constants"; import "../../styles/Simulator.css"; import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; @@ -17,114 +17,114 @@ import { MicrobitSimulator } from "./MicrobitSimulator"; // Component grouping the functionality for micro:bit functionalities interface IState { - sensors: { [key: string]: number }; - currentSelectedGesture?: string; + sensors: { [key: string]: number }; + currentSelectedGesture?: string; } const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - }, - currentSelectedGesture: GESTURES_MICROBIT[0], + sensors: { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT]: 0, + [SENSOR_LIST.MOTION_X]: 0, + [SENSOR_LIST.MOTION_Y]: 0, + [SENSOR_LIST.MOTION_Z]: 0, + }, + currentSelectedGesture: GESTURES_MICROBIT[0], }; export class Microbit extends React.Component<{}, IState> { - state = DEFAULT_STATE; + state = DEFAULT_STATE; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + handleMessage = (event: any): void => { + const message = event.data; - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; - updateGesture = (event: React.ChangeEvent) => { - this.setState({ currentSelectedGesture: event.target.value }); - }; - sendGesture = (isActive: boolean) => { - if (this.state.currentSelectedGesture) { - if (isActive) { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: this.state.currentSelectedGesture, - }); - } else { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: "", - }); - } - } - }; + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.RESET: + this.setState({ ...DEFAULT_STATE }); + break; + } + }; + render() { + return ( + + + + + ); + } + updateSensor = (sensor: SENSOR_LIST, value: number) => { + this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); + }; + updateGesture = (event: React.ChangeEvent) => { + this.setState({ currentSelectedGesture: event.target.value }); + }; + sendGesture = (isActive: boolean) => { + if (this.state.currentSelectedGesture) { + if (isActive) { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: this.state.currentSelectedGesture, + }); + } else { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: "", + }); + } + } + }; } const MICROBIT_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, - }, - { - image: TOOLBAR_SVG.RED_LED_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LEDS, - }, - { - image: TOOLBAR_SVG.TEMPERATURE_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, - }, - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - }, - { - image: TOOLBAR_SVG.GESTURE_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.GESTURE, - }, - { - image: TOOLBAR_SVG.GPIO_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.GPIO, - }, - { - image: TOOLBAR_SVG.COMPASS_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.COMPASS, - }, - { - image: TOOLBAR_SVG.SPEAKER_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.SOUND, - }, - { - image: TOOLBAR_SVG.WIRELESS_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.WIRELESS, - }, + { + image: TOOLBAR_SVG.PUSH_BUTTON_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, + }, + { + image: TOOLBAR_SVG.RED_LED_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.LEDS, + }, + { + image: TOOLBAR_SVG.TEMPERATURE_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, + }, + { + image: TOOLBAR_SVG.LIGHT_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, + }, + { + image: TOOLBAR_SVG.MOTION_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, + }, + { + image: TOOLBAR_SVG.GESTURE_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.GESTURE, + }, + { + image: TOOLBAR_SVG.GPIO_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.GPIO, + }, + { + image: TOOLBAR_SVG.COMPASS_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.COMPASS, + }, + { + image: TOOLBAR_SVG.SPEAKER_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.SOUND, + }, + { + image: TOOLBAR_SVG.WIRELESS_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.WIRELESS, + }, ]; diff --git a/Source/view/components/microbit/MicrobitImage.tsx b/Source/view/components/microbit/MicrobitImage.tsx index 18515a425..c9e95216a 100644 --- a/Source/view/components/microbit/MicrobitImage.tsx +++ b/Source/view/components/microbit/MicrobitImage.tsx @@ -8,159 +8,159 @@ import { ViewStateContext } from "../../context"; import { IRefObject, MicrobitSvg } from "./Microbit_svg"; interface EventTriggers { - onMouseUp: (event: Event, buttonKey: string) => void; - onMouseDown: (event: Event, buttonKey: string) => void; - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; + onMouseUp: (event: Event, buttonKey: string) => void; + onMouseDown: (event: Event, buttonKey: string) => void; + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; } interface IProps { - eventTriggers: EventTriggers; - leds: number[][]; + eventTriggers: EventTriggers; + leds: number[][]; } export enum BUTTONS_KEYS { - BTN_A = "BTN_A", - BTN_B = "BTN_B", - BTN_AB = "BTN_AB", + BTN_A = "BTN_A", + BTN_B = "BTN_B", + BTN_AB = "BTN_AB", } // Displays the SVG and call necessary svg modification. export class MicrobitImage extends React.Component { - private svgRef: React.RefObject = React.createRef(); - constructor(props: IProps) { - super(props); - } - componentDidMount() { - const svgElement = this.svgRef.current; - if (svgElement) { - updateAllLeds(this.props.leds, svgElement.getLeds()); - setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); - this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); - } - } - componentDidUpdate() { - if (this.svgRef.current) { - updateAllLeds(this.props.leds, this.svgRef.current.getLeds()); - if (this.context === VIEW_STATE.PAUSE) { - disableAllButtons(this.svgRef.current.getButtons()); - } else if (this.context === VIEW_STATE.RUNNING) { - setupAllButtons( - this.props.eventTriggers, - this.svgRef.current.getButtons() - ); - } - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.eventTriggers.onKeyEvent(event, true, event.key); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.eventTriggers.onKeyEvent(event, false, event.key); - }; - render() { - return ; - } - public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { - const button = this.svgRef.current?.getButtons()[key].current; - if (button) { - button.focus(); - if (isActive) { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.KEYPRESSED - ); - } else { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.DEFAULT - ); - } - button.setAttribute("pressed", `${isActive}`); - button.setAttribute("aria-pressed", `${isActive}`); - } - } + private svgRef: React.RefObject = React.createRef(); + constructor(props: IProps) { + super(props); + } + componentDidMount() { + const svgElement = this.svgRef.current; + if (svgElement) { + updateAllLeds(this.props.leds, svgElement.getLeds()); + setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); + this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); + } + } + componentDidUpdate() { + if (this.svgRef.current) { + updateAllLeds(this.props.leds, this.svgRef.current.getLeds()); + if (this.context === VIEW_STATE.PAUSE) { + disableAllButtons(this.svgRef.current.getButtons()); + } else if (this.context === VIEW_STATE.RUNNING) { + setupAllButtons( + this.props.eventTriggers, + this.svgRef.current.getButtons() + ); + } + } + } + componentWillUnmount() { + window.document.removeEventListener("keydown", this.handleKeyDown); + window.document.removeEventListener("keyup", this.handleKeyUp); + } + setupKeyPresses = ( + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void + ) => { + window.document.addEventListener("keydown", this.handleKeyDown); + window.document.addEventListener("keyup", this.handleKeyUp); + }; + handleKeyDown = (event: KeyboardEvent) => { + const keyEvents = [event.key, event.code]; + // Don't listen to keydown events for the run button, restart button and enter key + if ( + !( + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) + ) + ) { + this.props.eventTriggers.onKeyEvent(event, true, event.key); + } + }; + handleKeyUp = (event: KeyboardEvent) => { + this.props.eventTriggers.onKeyEvent(event, false, event.key); + }; + render() { + return ; + } + public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { + const button = this.svgRef.current?.getButtons()[key].current; + if (button) { + button.focus(); + if (isActive) { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.KEYPRESSED + ); + } else { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.DEFAULT + ); + } + button.setAttribute("pressed", `${isActive}`); + button.setAttribute("aria-pressed", `${isActive}`); + } + } } MicrobitImage.contextType = ViewStateContext; const setupButton = ( - buttonElement: SVGRectElement, - eventTriggers: EventTriggers, - key: string + buttonElement: SVGRectElement, + eventTriggers: EventTriggers, + key: string ) => { - buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); + buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); - buttonElement.onmousedown = (e) => { - buttonElement.focus(); - eventTriggers.onMouseDown(e, key); - }; - buttonElement.onmouseup = (e) => { - eventTriggers.onMouseUp(e, key); - }; + buttonElement.onmousedown = e => { + buttonElement.focus(); + eventTriggers.onMouseDown(e, key); + }; + buttonElement.onmouseup = e => { + eventTriggers.onMouseUp(e, key); + }; - buttonElement.onkeydown = (e) => { - // ensure that the keydown is enter, - // or else it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - eventTriggers.onKeyEvent(e, true, key); - } - }; - buttonElement.onkeyup = (e) => { - eventTriggers.onKeyEvent(e, false, key); - }; + buttonElement.onkeydown = e => { + // ensure that the keydown is enter, + // or else it may register shortcuts twice + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + eventTriggers.onKeyEvent(e, true, key); + } + }; + buttonElement.onkeyup = e => { + eventTriggers.onKeyEvent(e, false, key); + }; }; const setupAllButtons = ( - eventTriggers: EventTriggers, - buttonRefs: IRefObject + eventTriggers: EventTriggers, + buttonRefs: IRefObject ) => { - for (const [key, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - setupButton(ref.current, eventTriggers, key); - } - } + for (const [key, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + setupButton(ref.current, eventTriggers, key); + } + } }; const disableAllButtons = (buttonRefs: IRefObject) => { - for (const [, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - // to implement - ref.current.onmousedown = null; - ref.current.onmouseup = null; - ref.current.onkeydown = null; - ref.current.onkeyup = null; - ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); - } - } + for (const [, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + // to implement + ref.current.onmousedown = null; + ref.current.onmouseup = null; + ref.current.onkeydown = null; + ref.current.onkeyup = null; + ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); + } + } }; const updateAllLeds = ( - leds: number[][], - ledRefs: Array>> + leds: number[][], + ledRefs: Array>> ) => { - for (let j = 0; j < leds.length; j++) { - for (let i = 0; i < leds[0].length; i++) { - const ledElement = ledRefs[j][i].current; - if (ledElement) { - setupLed(ledElement, leds[i][j]); - } - } - } + for (let j = 0; j < leds.length; j++) { + for (let i = 0; i < leds[0].length; i++) { + const ledElement = ledRefs[j][i].current; + if (ledElement) { + setupLed(ledElement, leds[i][j]); + } + } + } }; const setupLed = (ledElement: SVGRectElement, brightness: number) => { - ledElement.style.opacity = (brightness / 10).toString(); + ledElement.style.opacity = (brightness / 10).toString(); }; diff --git a/Source/view/components/microbit/MicrobitSimulator.tsx b/Source/view/components/microbit/MicrobitSimulator.tsx index 3ef219459..467efcaaa 100644 --- a/Source/view/components/microbit/MicrobitSimulator.tsx +++ b/Source/view/components/microbit/MicrobitSimulator.tsx @@ -1,10 +1,10 @@ import * as React from "react"; import { - AB_BUTTONS_KEYS, - CONSTANTS, - DEVICE_LIST_KEY, - VIEW_STATE, - WEBVIEW_MESSAGES, + AB_BUTTONS_KEYS, + CONSTANTS, + DEVICE_LIST_KEY, + VIEW_STATE, + WEBVIEW_MESSAGES, } from "../../constants"; import { ViewStateContext } from "../../context"; import PlayLogo from "../../svgs/play_svg"; @@ -14,246 +14,246 @@ import ActionBar from "../simulator/ActionBar"; import { BUTTONS_KEYS, MicrobitImage } from "./MicrobitImage"; const DEFAULT_MICROBIT_STATE: IMicrobitState = { - leds: [ - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - ], - buttons: { button_a: false, button_b: false }, + leds: [ + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + ], + buttons: { button_a: false, button_b: false }, }; interface IState { - active_editors: string[]; - running_file?: string; - currently_selected_file: string; - play_button: boolean; - selected_file: string; - microbit: IMicrobitState; - sendGesture?: (isActive: boolean) => void; + active_editors: string[]; + running_file?: string; + currently_selected_file: string; + play_button: boolean; + selected_file: string; + microbit: IMicrobitState; + sendGesture?: (isActive: boolean) => void; } interface IMicrobitState { - leds: number[][]; - buttons: { button_a: boolean; button_b: boolean }; + leds: number[][]; + buttons: { button_a: boolean; button_b: boolean }; } export class MicrobitSimulator extends React.Component { - private imageRef: React.RefObject = React.createRef(); - constructor() { - super({}); - this.state = { - microbit: DEFAULT_MICROBIT_STATE, - play_button: false, - selected_file: "", - active_editors: [], - running_file: undefined, - currently_selected_file: "", - }; - this.onKeyEvent = this.onKeyEvent.bind(this); - } - handleMessage = (event: any): void => { - const message = event.data; + private imageRef: React.RefObject = React.createRef(); + constructor() { + super({}); + this.state = { + microbit: DEFAULT_MICROBIT_STATE, + play_button: false, + selected_file: "", + active_editors: [], + running_file: undefined, + currently_selected_file: "", + }; + this.onKeyEvent = this.onKeyEvent.bind(this); + } + handleMessage = (event: any): void => { + const message = event.data; - if (message.active_device !== DEVICE_LIST_KEY.MICROBIT) { - return; - } + if (message.active_device !== DEVICE_LIST_KEY.MICROBIT) { + return; + } - switch (message.command) { - case "reset-state": - this.setState({ - microbit: DEFAULT_MICROBIT_STATE, - play_button: false, - }); - break; - case "set-state": - this.setState({ - microbit: { - ...this.state.microbit, - leds: message.state.leds, - }, - }); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - }); - break; - case "visible-editors": - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } + switch (message.command) { + case "reset-state": + this.setState({ + microbit: DEFAULT_MICROBIT_STATE, + play_button: false, + }); + break; + case "set-state": + this.setState({ + microbit: { + ...this.state.microbit, + leds: message.state.leds, + }, + }); + break; + case "activate-play": + const newRunningFile = this.state.currently_selected_file; + this.setState({ + play_button: !this.state.play_button, + running_file: newRunningFile, + }); + break; + case "visible-editors": + this.setState({ + active_editors: message.state.activePythonEditors, + }); + break; + case "current-file": + if (this.state.play_button) { + this.setState({ + currently_selected_file: message.state.running_file, + }); + } else { + this.setState({ + running_file: message.state.running_file, + currently_selected_file: message.state.running_file, + }); + } - break; - } - }; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } + break; + } + }; + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } + componentWillUnmount() { + window.removeEventListener("message", this.handleMessage); + } - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
-
- -
- -
- ); - } + render() { + const playStopImage = this.state.play_button ? StopLogo : PlayLogo; + const playStopLabel = this.state.play_button ? "stop" : "play"; + return ( +
+
+ {this.state.running_file && this.state.play_button + ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) + : CONSTANTS.FILES_PLACEHOLDER} +
+
+ +
+ +
+ ); + } - protected togglePlayClick = () => { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - }; + protected togglePlayClick = () => { + const button = + window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || + window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { + selected_file: this.state.selected_file, + state: !this.state.play_button, + }); + }; - protected refreshSimulatorClick = () => { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - }; - protected handleButtonClick = (key: string, isActive: boolean) => { - let newButtonState = this.state.microbit.buttons; - switch (key) { - case AB_BUTTONS_KEYS.BTN_A: - newButtonState.button_a = isActive; - break; - case AB_BUTTONS_KEYS.BTN_B: - newButtonState.button_b = isActive; - break; - case AB_BUTTONS_KEYS.BTN_AB: - newButtonState = { - button_a: isActive, - button_b: isActive, - }; - break; - } - sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); - this.setState({ - microbit: { - ...this.state.microbit, - buttons: newButtonState, - }, - }); - }; + protected refreshSimulatorClick = () => { + const button = window.document.getElementById( + CONSTANTS.ID_NAME.REFRESH_BUTTON + ); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); + }; + protected handleButtonClick = (key: string, isActive: boolean) => { + let newButtonState = this.state.microbit.buttons; + switch (key) { + case AB_BUTTONS_KEYS.BTN_A: + newButtonState.button_a = isActive; + break; + case AB_BUTTONS_KEYS.BTN_B: + newButtonState.button_b = isActive; + break; + case AB_BUTTONS_KEYS.BTN_AB: + newButtonState = { + button_a: isActive, + button_b: isActive, + }; + break; + } + sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); + this.setState({ + microbit: { + ...this.state.microbit, + buttons: newButtonState, + }, + }); + }; - protected onMouseUp = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, false); - }; + protected onMouseUp = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, false); + }; - protected onMouseDown = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, true); - }; + protected onMouseDown = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, true); + }; - protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { - event.stopPropagation(); - if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(key, active); - if (key === BUTTONS_KEYS.BTN_A) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if (key === BUTTONS_KEYS.BTN_B) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if (key === BUTTONS_KEYS.BTN_AB) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); + protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { + event.stopPropagation(); + if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(key, active); + if (key === BUTTONS_KEYS.BTN_A) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active + ); + } else if (key === BUTTONS_KEYS.BTN_B) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active + ); + } else if (key === BUTTONS_KEYS.BTN_AB) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active + ); + } + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } - } + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active + ); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { + this.togglePlayClick(); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { + this.refreshSimulatorClick(); + } + } } MicrobitSimulator.contextType = ViewStateContext; diff --git a/Source/view/components/microbit/Microbit_svg.tsx b/Source/view/components/microbit/Microbit_svg.tsx index fd2ea1ca5..22854c38f 100644 --- a/Source/view/components/microbit/Microbit_svg.tsx +++ b/Source/view/components/microbit/Microbit_svg.tsx @@ -7,1803 +7,1884 @@ import * as React from "react"; import "../../styles/SimulatorSvg.css"; export interface IRefObject { - [key: string]: React.RefObject; + [key: string]: React.RefObject; } /* tslint:disable */ const N_LED_COLUMN = 5; const N_LED_ROW = 5; export class MicrobitSvg extends React.Component { - constructor(props: Readonly<{}>) { - super(props); - for (let j = 0; j < N_LED_ROW; j++) { - const led_row: React.RefObject[] = []; - for (let i = 0; i < N_LED_COLUMN; i++) { - led_row.push(React.createRef()); - } - this.ledRefs.push(led_row); - } - } - private svgRef: React.RefObject = React.createRef(); + constructor(props: Readonly<{}>) { + super(props); + for (let j = 0; j < N_LED_ROW; j++) { + const led_row: React.RefObject[] = []; + for (let i = 0; i < N_LED_COLUMN; i++) { + led_row.push(React.createRef()); + } + this.ledRefs.push(led_row); + } + } + private svgRef: React.RefObject = React.createRef(); - private buttonRefs: IRefObject = { - BTN_A: React.createRef(), - BTN_B: React.createRef(), - BTN_AB: React.createRef(), - }; + private buttonRefs: IRefObject = { + BTN_A: React.createRef(), + BTN_B: React.createRef(), + BTN_AB: React.createRef(), + }; - private ledRefs: React.RefObject[][] = []; - public getSvgRef(): React.RefObject { - return this.svgRef; - } - public getButtons(): IRefObject { - return this.buttonRefs; - } - public getLeds(): React.RefObject[][] { - return this.ledRefs; - } + private ledRefs: React.RefObject[][] = []; + public getSvgRef(): React.RefObject { + return this.svgRef; + } + public getButtons(): IRefObject { + return this.buttonRefs; + } + public getLeds(): React.RefObject[][] { + return this.ledRefs; + } - render() { - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (0,0) - - - - (1,0) - - - - (2,0) - - - - (3,0) - - - - (4,0) - - - - (0,1) - - - - (1,1) - - - - (2,1) - - - - (3,1) - - - - (4,1) - - - - (0,2) - - - - (1,2) - - - - (2,2) - - - - (3,2) - - - - (4,2) - - - - (0,3) - - - - (1,3) - - - - (2,3) - - - - (3,3) - - - - (4,3) - - - - (0,4) - - - - (1,4) - - - - (2,4) - - - - (3,4) - - - - (4,4) - - - - - - - - - - P0, ANALOG IN - - - P1, ANALOG IN - - - P2, ANALOG IN - - - P3, ANALOG IN, LED Col 1 - - - P4, ANALOG IN, LED Col 2 - - - P5, BUTTON A - - - P6, LED Col 9 - - - P7, LED Col 8 - - - P8 - - - P9, LED Col 7 - - - P10, ANALOG IN, LED Col 3 - - - P11, BUTTON B - - - P12, RESERVED ACCESSIBILITY - - - P13, SPI - SCK - - - P14, SPI - MISO - - - P15, SPI - MOSI - - - P16, SPI - Chip Select - - - P17, +3v3 - - - P18, +3v3 - - - P19, I2C - SCL - - - P20, I2C - SDA - - - GND - - - GND - - - +3v3 - - - GND - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - - - - - - - - - - - - - - -
- ); - } + render() { + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (0,0) + + + + (1,0) + + + + (2,0) + + + + (3,0) + + + + (4,0) + + + + (0,1) + + + + (1,1) + + + + (2,1) + + + + (3,1) + + + + (4,1) + + + + (0,2) + + + + (1,2) + + + + (2,2) + + + + (3,2) + + + + (4,2) + + + + (0,3) + + + + (1,3) + + + + (2,3) + + + + (3,3) + + + + (4,3) + + + + (0,4) + + + + (1,4) + + + + (2,4) + + + + (3,4) + + + + (4,4) + + + + + + + + + + P0, ANALOG IN + + + P1, ANALOG IN + + + P2, ANALOG IN + + + P3, ANALOG IN, LED Col 1 + + + P4, ANALOG IN, LED Col 2 + + + P5, BUTTON A + + + P6, LED Col 9 + + + P7, LED Col 8 + + + P8 + + + P9, LED Col 7 + + + P10, ANALOG IN, LED Col 3 + + + P11, BUTTON B + + + P12, RESERVED ACCESSIBILITY + + + P13, SPI - SCK + + + P14, SPI - MISO + + + P15, SPI - MOSI + + + P16, SPI - Chip Select + + + P17, +3v3 + + + P18, +3v3 + + + P19, I2C - SCL + + + P20, I2C - SDA + + + GND + + + GND + + + +3v3 + + + GND + + + + + + + + + + + + + + + + + + + + + + A+B + + + + + + + + + + + + + + + + + + + + + + + +
+ ); + } } diff --git a/Source/view/components/simulator/ActionBar.tsx b/Source/view/components/simulator/ActionBar.tsx index 151d3758a..b760817b8 100644 --- a/Source/view/components/simulator/ActionBar.tsx +++ b/Source/view/components/simulator/ActionBar.tsx @@ -7,38 +7,42 @@ import RefreshLogo from "../../svgs/refresh_svg"; import Button from "../Button"; interface IProps { - onTogglePlay: (event: React.MouseEvent) => void; - onToggleRefresh: (event: React.MouseEvent) => void; - playStopImage: JSX.Element; - playStopLabel: string; + onTogglePlay: (event: React.MouseEvent) => void; + onToggleRefresh: (event: React.MouseEvent) => void; + playStopImage: JSX.Element; + playStopLabel: string; } // Component including the actions done on the Simulator (play/stop, refresh) class ActionBar extends React.Component { - public render() { - const { onTogglePlay, onToggleRefresh, playStopImage, playStopLabel } = - this.props; - return ( -
-
- ); - } + public render() { + const { + onTogglePlay, + onToggleRefresh, + playStopImage, + playStopLabel, + } = this.props; + return ( +
+
+ ); + } } export default ActionBar; diff --git a/Source/view/components/toolbar/GenericSliderComponent.tsx b/Source/view/components/toolbar/GenericSliderComponent.tsx index cc46a7930..747721075 100644 --- a/Source/view/components/toolbar/GenericSliderComponent.tsx +++ b/Source/view/components/toolbar/GenericSliderComponent.tsx @@ -4,38 +4,38 @@ import { ISensorProps, ISliderProps } from "../../viewUtils"; import InputSlider from "./InputSlider"; interface IProps { - axisProperties: ISensorProps; - axisValues: { - // key is accessed with axisLabel - [key: string]: number; - }; - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void; + axisProperties: ISensorProps; + axisValues: { + // key is accessed with axisLabel + [key: string]: number; + }; + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void; } -export const GenericSliderComponent: React.FC = (props) => { - return ( -
- {props.axisProperties.sliderProps.map( - (sliderProperties: ISliderProps, index: number) => { - return ( - - -
-
- ); - } - )} -
- ); +export const GenericSliderComponent: React.FC = props => { + return ( +
+ {props.axisProperties.sliderProps.map( + (sliderProperties: ISliderProps, index: number) => { + return ( + + +
+
+ ); + } + )} +
+ ); }; diff --git a/Source/view/components/toolbar/Gesture.tsx b/Source/view/components/toolbar/Gesture.tsx index cad53ea8b..4cf941f13 100644 --- a/Source/view/components/toolbar/Gesture.tsx +++ b/Source/view/components/toolbar/Gesture.tsx @@ -5,66 +5,67 @@ import SensorButton from "./SensorButton"; const GESTURE_BUTTON_MESSAGE = "Send Gesture"; interface IProps { - gestures: string[]; - onSelectGestures?: (event: React.ChangeEvent) => void; - onSendGesture?: (isActive: boolean) => void; + gestures: string[]; + onSelectGestures?: (event: React.ChangeEvent) => void; + onSendGesture?: (isActive: boolean) => void; } export class Gesture extends React.Component { - private sensorButtonRef: React.RefObject = React.createRef(); - render() { - return ( -
- - { - if (this.props.onSendGesture) { - this.props.onSendGesture(true); - } - }} - onMouseUp={() => { - if (this.props.onSendGesture) { - this.props.onSendGesture(false); - } - }} - onKeyDown={this.handleOnKeyDown} - onKeyUp={this.handleOnKeyUp} - type="gesture" - /> -
- ); - } - private handleOnKeyDown = (e: React.KeyboardEvent) => { - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - this.sensorButtonRef!.current!.setButtonClass(true); - if (this.props.onSendGesture) { - this.props.onSendGesture(true); - } - } - }; + private sensorButtonRef: React.RefObject = React.createRef(); + render() { + return ( +
+ + { + if (this.props.onSendGesture) { + this.props.onSendGesture(true); + } + }} + onMouseUp={() => { + if (this.props.onSendGesture) { + this.props.onSendGesture(false); + } + }} + onKeyDown={this.handleOnKeyDown} + onKeyUp={this.handleOnKeyUp} + type="gesture" + /> +
+ ); + } + private handleOnKeyDown = (e: React.KeyboardEvent) => { + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + this.sensorButtonRef!.current!.setButtonClass(true); + if (this.props.onSendGesture) { + this.props.onSendGesture(true); + } + } + }; - private handleOnKeyUp = ( - e: React.KeyboardEvent, - onSendGesture?: (isActive: boolean) => void - ) => { - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - this.sensorButtonRef!.current!.setButtonClass(false); + private handleOnKeyUp = ( + e: React.KeyboardEvent, + onSendGesture?: (isActive: boolean) => void + ) => { + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + this.sensorButtonRef!.current!.setButtonClass(false); - if (this.props.onSendGesture) { - this.props.onSendGesture(false); - } - } - }; + if (this.props.onSendGesture) { + this.props.onSendGesture(false); + } + } + }; } diff --git a/Source/view/components/toolbar/InputSlider.tsx b/Source/view/components/toolbar/InputSlider.tsx index db78f58d3..adfbcef60 100644 --- a/Source/view/components/toolbar/InputSlider.tsx +++ b/Source/view/components/toolbar/InputSlider.tsx @@ -9,122 +9,122 @@ import { sendMessage } from "../../utils/MessageUtils"; import { ISliderProps } from "../../viewUtils"; class InputSlider extends React.Component { - constructor(props: ISliderProps) { - super(props); - this.state = { - value: this.props.value, - }; + constructor(props: ISliderProps) { + super(props); + this.state = { + value: this.props.value, + }; - this.handleOnChange = this.handleOnChange.bind(this); - this.validateRange = this.validateRange.bind(this); - } + this.handleOnChange = this.handleOnChange.bind(this); + this.validateRange = this.validateRange.bind(this); + } - render() { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; + render() { + const isInputDisabled = this.context === VIEW_STATE.PAUSE; - const nbDecimals = - this.props.step.toString().split(".")[1]?.length || 0; - return ( -
- {this.props.axisLabel} - 0 ? 1 : 0}}[0-9]{0,${nbDecimals}}$`} - onKeyUp={this.handleOnChange} - style={{ width: this.getMaximumBoxWidth() + "ch" }} - aria-label={`${this.props.type} sensor input ${this.props.axisLabel}`} - /> - - - {this.props.minValue} - {this.props.maxValue} - - - - {this.props.minLabel} - {this.props.maxLabel} - - -
- ); - } + const nbDecimals = + this.props.step.toString().split(".")[1]?.length || 0; + return ( +
+ {this.props.axisLabel} + 0 ? 1 : 0}}[0-9]{0,${nbDecimals}}$`} + onKeyUp={this.handleOnChange} + style={{ width: this.getMaximumBoxWidth() + "ch" }} + aria-label={`${this.props.type} sensor input ${this.props.axisLabel}`} + /> + + + {this.props.minValue} + {this.props.maxValue} + + + + {this.props.minLabel} + {this.props.maxLabel} + + +
+ ); + } - private getMaximumBoxWidth = () => { - return ( - Math.max( - this.props.minValue.toString().length, - this.props.maxValue.toString().length - ) + 2 - ); - }; + private getMaximumBoxWidth = () => { + return ( + Math.max( + this.props.minValue.toString().length, + this.props.maxValue.toString().length + ) + 2 + ); + }; - private handleOnChange = (event: any) => { - const validatedValue = this.validateRange(this.updateValue(event)); - const newSensorState = this.writeMessage(validatedValue); - if (newSensorState) { - sendMessage(WEBVIEW_MESSAGES.SENSOR_CHANGED, newSensorState); - } - }; + private handleOnChange = (event: any) => { + const validatedValue = this.validateRange(this.updateValue(event)); + const newSensorState = this.writeMessage(validatedValue); + if (newSensorState) { + sendMessage(WEBVIEW_MESSAGES.SENSOR_CHANGED, newSensorState); + } + }; - private writeMessage = (valueTowrite: number) => { - let value = valueTowrite; - if (value > this.props.maxValue || value < this.props.minValue) { - value = parseInt(this.state.value, 10); - } + private writeMessage = (valueTowrite: number) => { + let value = valueTowrite; + if (value > this.props.maxValue || value < this.props.minValue) { + value = parseInt(this.state.value, 10); + } - return this.props.type && this.state.value !== undefined - ? { [this.props.type]: value } - : undefined; - }; + return this.props.type && this.state.value !== undefined + ? { [this.props.type]: value } + : undefined; + }; - private updateValue = (event: any) => { - const newValue = event.target.validity.valid - ? event.target.value - : this.state.value; - if (this.props.onUpdateValue) { - this.props.onUpdateValue(this.props.type as SENSOR_LIST, newValue); - } - return newValue; - }; + private updateValue = (event: any) => { + const newValue = event.target.validity.valid + ? event.target.value + : this.state.value; + if (this.props.onUpdateValue) { + this.props.onUpdateValue(this.props.type as SENSOR_LIST, newValue); + } + return newValue; + }; - private sendTelemetry = () => { - sendMessage(WEBVIEW_MESSAGES.SLIDER_TELEMETRY, this.props.type); - }; + private sendTelemetry = () => { + sendMessage(WEBVIEW_MESSAGES.SLIDER_TELEMETRY, this.props.type); + }; - private validateRange = (valueString: string) => { - let valueInt = parseFloat(valueString); - if (valueInt < this.props.minValue) { - valueInt = this.props.minValue; - this.setState({ value: valueInt }); - } else if (valueInt > this.props.maxValue) { - valueInt = this.props.maxValue; - this.setState({ value: valueInt }); - } - return valueInt; - }; + private validateRange = (valueString: string) => { + let valueInt = parseFloat(valueString); + if (valueInt < this.props.minValue) { + valueInt = this.props.minValue; + this.setState({ value: valueInt }); + } else if (valueInt > this.props.maxValue) { + valueInt = this.props.maxValue; + this.setState({ value: valueInt }); + } + return valueInt; + }; } InputSlider.contextType = ViewStateContext; diff --git a/Source/view/components/toolbar/SensorButton.tsx b/Source/view/components/toolbar/SensorButton.tsx index efd22eb96..b50759bd4 100644 --- a/Source/view/components/toolbar/SensorButton.tsx +++ b/Source/view/components/toolbar/SensorButton.tsx @@ -8,38 +8,39 @@ import "../../styles/SensorButton.css"; import { ISensorButtonProps } from "../../viewUtils"; class SensorButton extends React.Component { - private buttonRef: React.RefObject = React.createRef(); + private buttonRef: React.RefObject = React.createRef(); - public setButtonClass = (isActive: boolean) => { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; + public setButtonClass = (isActive: boolean) => { + const isInputDisabled = this.context === VIEW_STATE.PAUSE; - if (isActive && !isInputDisabled) { - this.buttonRef.current?.setAttribute( - "class", - "sensor-button active-button" - ); - } else if (this.buttonRef.current) { - this.buttonRef!.current!.setAttribute("class", "sensor-button"); - } - }; - render() { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; + if (isActive && !isInputDisabled) { + this.buttonRef.current?.setAttribute( + "class", + "sensor-button active-button" + ); + } else if (this.buttonRef.current) { + this.buttonRef!.current!.setAttribute("class", "sensor-button"); + } + }; + render() { + const isInputDisabled = this.context === VIEW_STATE.PAUSE; - return ( - - ); - } + return ( + + ); + } } SensorButton.contextType = ViewStateContext; export default SensorButton; diff --git a/Source/view/components/toolbar/SensorModalUtils.tsx b/Source/view/components/toolbar/SensorModalUtils.tsx index 57a491960..c7ea53f85 100644 --- a/Source/view/components/toolbar/SensorModalUtils.tsx +++ b/Source/view/components/toolbar/SensorModalUtils.tsx @@ -8,167 +8,169 @@ import * as CPX_MODAL from "./cpx/CpxModalContent"; import * as MICROBIT_MODAL from "./microbit/MicrobitModalContent"; export const TRY_IT_MAKE_CODE = ( - + ); export const FEATURE_REQUEST_ON_GITHUB = ( - + ); export const TOOLBAR_ICON_LABEL = { - GPIO: "GPIO", - IR: "IR", - LEFT_EDGE: "left-edge", - LIGHT: "Light sensor", - MOTION: "Motion Sensor", - NEO_PIXEL: "Neo Pixels", - PUSH_BUTTON: "Push Button", - RED_LED: "Red LED", - RIGHT_EDGE: "right-edge", - SOUND: "Sound Sensor", - SPEAKER: "Speaker", - SWITCH: "Switch", - TAG_INPUT: "Tag Input", - TAG_OUTPUT: "Tag Output", - TEMPERATURE: "Temperature Sensor", - WIRELESS: "Bluetooth and Radio", + GPIO: "GPIO", + IR: "IR", + LEFT_EDGE: "left-edge", + LIGHT: "Light sensor", + MOTION: "Motion Sensor", + NEO_PIXEL: "Neo Pixels", + PUSH_BUTTON: "Push Button", + RED_LED: "Red LED", + RIGHT_EDGE: "right-edge", + SOUND: "Sound Sensor", + SPEAKER: "Speaker", + SWITCH: "Switch", + TAG_INPUT: "Tag Input", + TAG_OUTPUT: "Tag Output", + TEMPERATURE: "Temperature Sensor", + WIRELESS: "Bluetooth and Radio", }; export const CPX_TOOLBAR_ICON_ID = { - GPIO: "toolbar-gpio", - IR: "toolbar-ir-sensor", - LEFT_EDGE: "left-edge", - LIGHT: "toolbar-light-sensor", - MOTION: "toolbar-motion-sensor", - NEO_PIXEL: "toolbar-neo-pixels", - PUSH_BUTTON: "toolbar-a-b-push", - RED_LED: "toolbar-red-led", - RIGHT_EDGE: "right-edge", - SOUND: "toolbar-sound-sensor", - SPEAKER: "toolbar-speaker", - SWITCH: "toolbar-slider-switch", - TEMPERATURE: "toolbar-temperature-sensor", + GPIO: "toolbar-gpio", + IR: "toolbar-ir-sensor", + LEFT_EDGE: "left-edge", + LIGHT: "toolbar-light-sensor", + MOTION: "toolbar-motion-sensor", + NEO_PIXEL: "toolbar-neo-pixels", + PUSH_BUTTON: "toolbar-a-b-push", + RED_LED: "toolbar-red-led", + RIGHT_EDGE: "right-edge", + SOUND: "toolbar-sound-sensor", + SPEAKER: "toolbar-speaker", + SWITCH: "toolbar-slider-switch", + TEMPERATURE: "toolbar-temperature-sensor", }; export const MICROBIT_TOOLBAR_ICON_ID = { - TEMPERATURE: "toolbar-microbit-temperature-sensor", - LIGHT: "toolbar-microbit-light-sensor", - ACCELEROMETER: "toolbar-accelerometer-sensor", - LEDS: "toolbar-microbit-led", - PUSH_BUTTON: "toolbar-microbit-a-b-push", - GPIO: "toolbar-gpio", - SOUND: "toolbar-microbit-sound", - WIRELESS: "toolbar-microbit-wireless", - GESTURE: "toolbar-microbit-gesture-sensor", - COMPASS: "toolbar-microbit-compass-sensor", + TEMPERATURE: "toolbar-microbit-temperature-sensor", + LIGHT: "toolbar-microbit-light-sensor", + ACCELEROMETER: "toolbar-accelerometer-sensor", + LEDS: "toolbar-microbit-led", + PUSH_BUTTON: "toolbar-microbit-a-b-push", + GPIO: "toolbar-gpio", + SOUND: "toolbar-microbit-sound", + WIRELESS: "toolbar-microbit-wireless", + GESTURE: "toolbar-microbit-gesture-sensor", + COMPASS: "toolbar-microbit-compass-sensor", }; export const CLUE_TOOLBAR_ICON_ID = { - TEMPERATURE: "toolbar-clue-temperature-sensor", - LIGHT: "toolbar-clue-light-sensor", - ACCELEROMETER: "toolbar-clue-accelerometer-sensor", - LEDS: "toolbar-clue-led", - PUSH_BUTTON: "toolbar-clue-a-b-push", - GPIO: "toolbar-clue-gpio", - SPEAKER: "toolbar-speaker", - SOUND: "toolbar-clue-sound-sensor", - PRESSURE: "toolbar-clue-pressure-sensor", - HUMIDITY: "toolbar-clue-humidity-sensor", - GESTURE: "toolbar-clue-gesture-sensor", - PROXIMITY: "toolbar-clue-proximity-sensor", - BLUETOOTH: "toolbar-clue-bluetooth", - MAGNETOSCOPE: "toolbar-clue-magnet-sensor", - GYROSCOPE: "toolbar-clue-gyroscope-sensor", + TEMPERATURE: "toolbar-clue-temperature-sensor", + LIGHT: "toolbar-clue-light-sensor", + ACCELEROMETER: "toolbar-clue-accelerometer-sensor", + LEDS: "toolbar-clue-led", + PUSH_BUTTON: "toolbar-clue-a-b-push", + GPIO: "toolbar-clue-gpio", + SPEAKER: "toolbar-speaker", + SOUND: "toolbar-clue-sound-sensor", + PRESSURE: "toolbar-clue-pressure-sensor", + HUMIDITY: "toolbar-clue-humidity-sensor", + GESTURE: "toolbar-clue-gesture-sensor", + PROXIMITY: "toolbar-clue-proximity-sensor", + BLUETOOTH: "toolbar-clue-bluetooth", + MAGNETOSCOPE: "toolbar-clue-magnet-sensor", + GYROSCOPE: "toolbar-clue-gyroscope-sensor", }; export interface IModalContent { - components: any; - descriptionText: string; - descriptionTitle: string; - id: string; - tagInput: any; - tagOutput: any; - tryItDescription: string; + components: any; + descriptionText: string; + descriptionTitle: string; + id: string; + tagInput: any; + tagOutput: any; + tryItDescription: string; } export const DEFAULT_MODAL_CONTENT: IModalContent = { - descriptionTitle: "default", - tagInput: undefined, - tagOutput: undefined, - descriptionText: "none", - tryItDescription: "none", - components: undefined, - id: "none", + descriptionTitle: "default", + tagInput: undefined, + tagOutput: undefined, + descriptionText: "none", + tryItDescription: "none", + components: undefined, + id: "none", }; export const LABEL_TO_MODAL_CONTENT_CONSTRUCTOR = new Map([ - [CPX_TOOLBAR_ICON_ID.GPIO, CPX_MODAL.GPIO_CONTENT], - [CPX_TOOLBAR_ICON_ID.IR, CPX_MODAL.IR_CONTENT], - [CPX_TOOLBAR_ICON_ID.LIGHT, CPX_MODAL.LIGHT_CONTENT], - [CPX_TOOLBAR_ICON_ID.MOTION, CPX_MODAL.MOTION_CONTENT], - [CPX_TOOLBAR_ICON_ID.NEO_PIXEL, CPX_MODAL.NEOP_CONTENT], - [CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, CPX_MODAL.PUSHB_CONTENT], - [CPX_TOOLBAR_ICON_ID.RED_LED, CPX_MODAL.RED_LED_CONTENT], - [CPX_TOOLBAR_ICON_ID.SOUND, CPX_MODAL.SOUND_CONTENT], - [CPX_TOOLBAR_ICON_ID.SPEAKER, CPX_MODAL.SPEAKER_CONTENT], - [CPX_TOOLBAR_ICON_ID.SWITCH, CPX_MODAL.SWITCH_CONTENT], - [CPX_TOOLBAR_ICON_ID.TEMPERATURE, CPX_MODAL.TEMPERATURE_CONTENT], - [ - MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - MICROBIT_MODAL.ACCELEROMETER_CONTENT, - ], - [MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, MICROBIT_MODAL.TEMPERATURE_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.LIGHT, MICROBIT_MODAL.LIGHT_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.LEDS, MICROBIT_MODAL.LED_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, MICROBIT_MODAL.BUTTON_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.GPIO, MICROBIT_MODAL.GPIO_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.SOUND, MICROBIT_MODAL.SOUND_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.WIRELESS, MICROBIT_MODAL.WIRELESS_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], - [CLUE_TOOLBAR_ICON_ID.TEMPERATURE, CLUE_MODAL.TEMPERATURE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, CLUE_MODAL.BUTTON_CONTENT], - [CLUE_TOOLBAR_ICON_ID.GPIO, CLUE_MODAL.GPIO_CONTENT], - [CLUE_TOOLBAR_ICON_ID.LIGHT, CLUE_MODAL.LIGHT_CONTENT], - [CLUE_TOOLBAR_ICON_ID.LEDS, CLUE_MODAL.LED_CONTENT], - [CLUE_TOOLBAR_ICON_ID.SOUND, CLUE_MODAL.SOUND_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PRESSURE, CLUE_MODAL.PRESSURE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.HUMIDITY, CLUE_MODAL.HUMIDITY_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PROXIMITY, CLUE_MODAL.PROXIMITY_CONTENT], - [CLUE_TOOLBAR_ICON_ID.BLUETOOTH, CLUE_MODAL.BLUETOOTH_CONTENT], - [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.SPEAKER, CLUE_MODAL.SPEAKER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.GYROSCOPE, CLUE_MODAL.GYROSCOPE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, CLUE_MODAL.MAGNETOSCOPE_CONTENT], + [CPX_TOOLBAR_ICON_ID.GPIO, CPX_MODAL.GPIO_CONTENT], + [CPX_TOOLBAR_ICON_ID.IR, CPX_MODAL.IR_CONTENT], + [CPX_TOOLBAR_ICON_ID.LIGHT, CPX_MODAL.LIGHT_CONTENT], + [CPX_TOOLBAR_ICON_ID.MOTION, CPX_MODAL.MOTION_CONTENT], + [CPX_TOOLBAR_ICON_ID.NEO_PIXEL, CPX_MODAL.NEOP_CONTENT], + [CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, CPX_MODAL.PUSHB_CONTENT], + [CPX_TOOLBAR_ICON_ID.RED_LED, CPX_MODAL.RED_LED_CONTENT], + [CPX_TOOLBAR_ICON_ID.SOUND, CPX_MODAL.SOUND_CONTENT], + [CPX_TOOLBAR_ICON_ID.SPEAKER, CPX_MODAL.SPEAKER_CONTENT], + [CPX_TOOLBAR_ICON_ID.SWITCH, CPX_MODAL.SWITCH_CONTENT], + [CPX_TOOLBAR_ICON_ID.TEMPERATURE, CPX_MODAL.TEMPERATURE_CONTENT], + [ + MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, + MICROBIT_MODAL.ACCELEROMETER_CONTENT, + ], + [MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, MICROBIT_MODAL.TEMPERATURE_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.LIGHT, MICROBIT_MODAL.LIGHT_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.LEDS, MICROBIT_MODAL.LED_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, MICROBIT_MODAL.BUTTON_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.GPIO, MICROBIT_MODAL.GPIO_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.SOUND, MICROBIT_MODAL.SOUND_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.WIRELESS, MICROBIT_MODAL.WIRELESS_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], + [CLUE_TOOLBAR_ICON_ID.TEMPERATURE, CLUE_MODAL.TEMPERATURE_CONTENT], + [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], + [CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, CLUE_MODAL.BUTTON_CONTENT], + [CLUE_TOOLBAR_ICON_ID.GPIO, CLUE_MODAL.GPIO_CONTENT], + [CLUE_TOOLBAR_ICON_ID.LIGHT, CLUE_MODAL.LIGHT_CONTENT], + [CLUE_TOOLBAR_ICON_ID.LEDS, CLUE_MODAL.LED_CONTENT], + [CLUE_TOOLBAR_ICON_ID.SOUND, CLUE_MODAL.SOUND_CONTENT], + [CLUE_TOOLBAR_ICON_ID.PRESSURE, CLUE_MODAL.PRESSURE_CONTENT], + [CLUE_TOOLBAR_ICON_ID.HUMIDITY, CLUE_MODAL.HUMIDITY_CONTENT], + [CLUE_TOOLBAR_ICON_ID.PROXIMITY, CLUE_MODAL.PROXIMITY_CONTENT], + [CLUE_TOOLBAR_ICON_ID.BLUETOOTH, CLUE_MODAL.BLUETOOTH_CONTENT], + [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], + [CLUE_TOOLBAR_ICON_ID.SPEAKER, CLUE_MODAL.SPEAKER_CONTENT], + [CLUE_TOOLBAR_ICON_ID.GYROSCOPE, CLUE_MODAL.GYROSCOPE_CONTENT], + [CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, CLUE_MODAL.MAGNETOSCOPE_CONTENT], ]); export const getModalContent = ( - label: string, - onUpdateValue: (onUpdateValue: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number }, - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void + label: string, + onUpdateValue: (onUpdateValue: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, + onSelectGestures?: (event: React.ChangeEvent) => void, + sendGesture?: (isActive: boolean) => void ) => { - if (label === CLUE_TOOLBAR_ICON_ID.GESTURE) { - return CLUE_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); - } else if (label === MICROBIT_TOOLBAR_ICON_ID.GESTURE) { - return MICROBIT_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); - } - const modalContentConstructor = - LABEL_TO_MODAL_CONTENT_CONSTRUCTOR.get(label); - if (modalContentConstructor) { - return modalContentConstructor(onUpdateValue, sensorValues); - } else { - return; - } + if (label === CLUE_TOOLBAR_ICON_ID.GESTURE) { + return CLUE_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); + } else if (label === MICROBIT_TOOLBAR_ICON_ID.GESTURE) { + return MICROBIT_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); + } + const modalContentConstructor = LABEL_TO_MODAL_CONTENT_CONSTRUCTOR.get( + label + ); + if (modalContentConstructor) { + return modalContentConstructor(onUpdateValue, sensorValues); + } else { + return; + } }; diff --git a/Source/view/components/toolbar/ToolBar.tsx b/Source/view/components/toolbar/ToolBar.tsx index 9bdd48ae5..a2a3ee1a2 100644 --- a/Source/view/components/toolbar/ToolBar.tsx +++ b/Source/view/components/toolbar/ToolBar.tsx @@ -5,215 +5,217 @@ import { Callout, TooltipHost } from "office-ui-fabric-react"; import { IconButton } from "office-ui-fabric-react"; import * as React from "react"; import { - FormattedMessage, - injectIntl, - WrappedComponentProps, + FormattedMessage, + injectIntl, + WrappedComponentProps, } from "react-intl"; import { SENSOR_LIST } from "../../constants"; import "../../styles/ToolBar.css"; import Button from "../Button"; import { - DEFAULT_MODAL_CONTENT, - getModalContent, - IModalContent, + DEFAULT_MODAL_CONTENT, + getModalContent, + IModalContent, } from "./SensorModalUtils"; interface IToolbarState { - currentOpenedId: string; - showModal: boolean; - isDescriptionVisible: boolean; + currentOpenedId: string; + showModal: boolean; + isDescriptionVisible: boolean; } interface IProps extends WrappedComponentProps { - buttonList: Array<{ - label: any; - image: any; - }>; - onUpdateSensor: (sensor: SENSOR_LIST, value: number) => void; - sensorValues: { [key: string]: number }; - onSelectGesture?: (event: React.ChangeEvent) => void; - sendGesture?: (isActive: boolean) => void; + buttonList: Array<{ + label: any; + image: any; + }>; + onUpdateSensor: (sensor: SENSOR_LIST, value: number) => void; + sensorValues: { [key: string]: number }; + onSelectGesture?: (event: React.ChangeEvent) => void; + sendGesture?: (isActive: boolean) => void; } class ToolBar extends React.Component { - private readonly TOOLBAR_BUTTON_WIDTH: number = 32; - - constructor(props: IProps) { - super(props); - initializeIcons(); - this.state = { - currentOpenedId: "", - isDescriptionVisible: false, - showModal: false, - }; - } - - public render() { - const { buttonList } = this.props; - return ( -
-
-
- {buttonList.map( - (currrentButton: any, index: number) => { - return ( - ( - - ), - }} - key={index}> -
- {this.getIconModal()} -
-
- ); - } - - private handleOnClick = ( - event: React.MouseEvent, - label: string - ) => { - if ( - !this.state.showModal && - this.state.currentOpenedId === "" && - this.state.currentOpenedId !== label - ) { - this.openModal(label); - } else { - this.closeCurrentModal(); - if (this.state.currentOpenedId !== label) { - this.openModal(label); - } - } - }; - - private changePressedState(id: string, pressed: boolean) { - const elt = window.document.getElementById(`${id}-button`); - if (elt) { - pressed - ? elt.classList.add("button-pressed") - : elt.classList.remove("button-pressed"); - } - } - private closeCurrentModal = () => { - this.changePressedState(this.state.currentOpenedId, false); - this.setState({ - currentOpenedId: "", - showModal: false, - }); - }; - - private openModal = (label: string) => { - this.setState({ - currentOpenedId: label, - showModal: true, - }); - this.changePressedState(label, true); - }; - - private onShowDescriptionClicked = (): void => { - this.setState({ - isDescriptionVisible: !this.state.isDescriptionVisible, - }); - }; - - private onDescriptionDismiss = (): void => { - this.setState({ - isDescriptionVisible: false, - }); - }; - - private getIconModal() { - if ( - !this.state.showModal || - !getModalContent( - this.state.currentOpenedId, - this.props.onUpdateSensor, - this.props.sensorValues, - this.props.onSelectGesture, - this.props.sendGesture - ) - ) { - return null; - } - - const content = getModalContent( - this.state.currentOpenedId, - this.props.onUpdateSensor, - this.props.sensorValues, - this.props.onSelectGesture, - this.props.sendGesture - ) as IModalContent; - - const components = content - ? content.components - : DEFAULT_MODAL_CONTENT.components; - - return ( -
-
- - - {content.tagInput} - {content.tagOutput} - - -
-
- {this.state.isDescriptionVisible && ( - -
- -
-
- )} -
-
- - - -
- -
{components}
-
-
- ); - } + private readonly TOOLBAR_BUTTON_WIDTH: number = 32; + + constructor(props: IProps) { + super(props); + initializeIcons(); + this.state = { + currentOpenedId: "", + isDescriptionVisible: false, + showModal: false, + }; + } + + public render() { + const { buttonList } = this.props; + return ( +
+
+
+ {buttonList.map( + (currrentButton: any, index: number) => { + return ( + ( + + ), + }} + key={index} + > +
+ {this.getIconModal()} +
+
+ ); + } + + private handleOnClick = ( + event: React.MouseEvent, + label: string + ) => { + if ( + !this.state.showModal && + this.state.currentOpenedId === "" && + this.state.currentOpenedId !== label + ) { + this.openModal(label); + } else { + this.closeCurrentModal(); + if (this.state.currentOpenedId !== label) { + this.openModal(label); + } + } + }; + + private changePressedState(id: string, pressed: boolean) { + const elt = window.document.getElementById(`${id}-button`); + if (elt) { + pressed + ? elt.classList.add("button-pressed") + : elt.classList.remove("button-pressed"); + } + } + private closeCurrentModal = () => { + this.changePressedState(this.state.currentOpenedId, false); + this.setState({ + currentOpenedId: "", + showModal: false, + }); + }; + + private openModal = (label: string) => { + this.setState({ + currentOpenedId: label, + showModal: true, + }); + this.changePressedState(label, true); + }; + + private onShowDescriptionClicked = (): void => { + this.setState({ + isDescriptionVisible: !this.state.isDescriptionVisible, + }); + }; + + private onDescriptionDismiss = (): void => { + this.setState({ + isDescriptionVisible: false, + }); + }; + + private getIconModal() { + if ( + !this.state.showModal || + !getModalContent( + this.state.currentOpenedId, + this.props.onUpdateSensor, + this.props.sensorValues, + this.props.onSelectGesture, + this.props.sendGesture + ) + ) { + return null; + } + + const content = getModalContent( + this.state.currentOpenedId, + this.props.onUpdateSensor, + this.props.sensorValues, + this.props.onSelectGesture, + this.props.sendGesture + ) as IModalContent; + + const components = content + ? content.components + : DEFAULT_MODAL_CONTENT.components; + + return ( +
+
+ + + {content.tagInput} + {content.tagOutput} + + +
+
+ {this.state.isDescriptionVisible && ( + +
+ +
+
+ )} +
+
+ + + +
+ +
{components}
+
+
+ ); + } } export default injectIntl(ToolBar); diff --git a/Source/view/components/toolbar/Toolbar.spec.tsx b/Source/view/components/toolbar/Toolbar.spec.tsx index cc939e108..7598ff1c0 100644 --- a/Source/view/components/toolbar/Toolbar.spec.tsx +++ b/Source/view/components/toolbar/Toolbar.spec.tsx @@ -8,50 +8,50 @@ import { MICROBIT_TOOLBAR_ICON_ID } from "./SensorModalUtils"; import Toolbar from "./ToolBar"; const MOCK_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - }, + { + image: TOOLBAR_SVG.LIGHT_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, + }, + { + image: TOOLBAR_SVG.MOTION_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, + }, ]; const mockUpdateSensors = () => { - return; + return; }; const mockInitialValues = { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT]: 0, }; describe("Toolbar component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/components/toolbar/clue/ClueModalContent.tsx b/Source/view/components/toolbar/clue/ClueModalContent.tsx index 34a56b1d0..b4fc4a136 100644 --- a/Source/view/components/toolbar/clue/ClueModalContent.tsx +++ b/Source/view/components/toolbar/clue/ClueModalContent.tsx @@ -8,311 +8,311 @@ import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; import * as SENSOR_PROPERTIES from "./ClueSensorProperties"; export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-clue-temperature-sensor.description", - descriptionTitle: "toolbar-clue-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-temperature-sensor.tryItDescription", - }; + const temperatureSensorValues = { + T: sensorValues[SENSOR_LIST.TEMPERATURE], + }; + return { + components: [ + , + ], + descriptionText: "toolbar-clue-temperature-sensor.description", + descriptionTitle: "toolbar-clue-temperature-sensor.title", + id: "temperature", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-temperature-sensor.tryItDescription", + }; }; export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-gpio.description", - tryItDescription: "toolbar-clue-gpio.tryItDescription", - components: undefined, - id: "GPIO", - }; + return { + descriptionTitle: "toolbar-clue-gpio.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-gpio.description", + tryItDescription: "toolbar-clue-gpio.tryItDescription", + components: undefined, + id: "GPIO", + }; }; export const ACCELEROMETER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const accelerometerSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-accelerometer-sensor.description", - descriptionTitle: "toolbar-clue-accelerometer-sensor.title", - id: "accelerometer", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-accelerometer-sensor.tryItDescription", - }; + const accelerometerSensorValues = { + X: sensorValues[SENSOR_LIST.MOTION_X], + Y: sensorValues[SENSOR_LIST.MOTION_Y], + Z: sensorValues[SENSOR_LIST.MOTION_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-accelerometer-sensor.description", + descriptionTitle: "toolbar-clue-accelerometer-sensor.title", + id: "accelerometer", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-accelerometer-sensor.tryItDescription", + }; }; export const GYROSCOPE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const gyroSensorValues = { - X: sensorValues[SENSOR_LIST.GYRO_X], - Y: sensorValues[SENSOR_LIST.GYRO_Y], - Z: sensorValues[SENSOR_LIST.GYRO_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-gyroscope-sensor.description", - descriptionTitle: "toolbar-clue-gyroscope-sensor.title", - id: "gyroscope", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-gyroscope-sensor.tryItDescription", - }; + const gyroSensorValues = { + X: sensorValues[SENSOR_LIST.GYRO_X], + Y: sensorValues[SENSOR_LIST.GYRO_Y], + Z: sensorValues[SENSOR_LIST.GYRO_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-gyroscope-sensor.description", + descriptionTitle: "toolbar-clue-gyroscope-sensor.title", + id: "gyroscope", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-gyroscope-sensor.tryItDescription", + }; }; export const MAGNETOSCOPE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const magnetSensorValues = { - X: sensorValues[SENSOR_LIST.MAGNET_X], - Y: sensorValues[SENSOR_LIST.MAGNET_Y], - Z: sensorValues[SENSOR_LIST.MAGNET_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-magnet-sensor.description", - descriptionTitle: "toolbar-clue-magnet-sensor.title", - id: "magnetoscope", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-magnet-sensor.tryItDescription", - }; + const magnetSensorValues = { + X: sensorValues[SENSOR_LIST.MAGNET_X], + Y: sensorValues[SENSOR_LIST.MAGNET_Y], + Z: sensorValues[SENSOR_LIST.MAGNET_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-magnet-sensor.description", + descriptionTitle: "toolbar-clue-magnet-sensor.title", + id: "magnetoscope", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-magnet-sensor.tryItDescription", + }; }; export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const lightSensorValues = { - R: sensorValues[SENSOR_LIST.LIGHT_R], - G: sensorValues[SENSOR_LIST.LIGHT_G], - B: sensorValues[SENSOR_LIST.LIGHT_B], - C: sensorValues[SENSOR_LIST.LIGHT_C], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-light-sensor.description", - descriptionTitle: "toolbar-clue-light-sensor.title", - id: "light_sensor", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-light-sensor.tryItDescription", - }; + const lightSensorValues = { + R: sensorValues[SENSOR_LIST.LIGHT_R], + G: sensorValues[SENSOR_LIST.LIGHT_G], + B: sensorValues[SENSOR_LIST.LIGHT_B], + C: sensorValues[SENSOR_LIST.LIGHT_C], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-light-sensor.description", + descriptionTitle: "toolbar-clue-light-sensor.title", + id: "light_sensor", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-light-sensor.tryItDescription", + }; }; export const HUMIDITY_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const humiditySensorValues = { - H: sensorValues[SENSOR_LIST.HUMIDITY], - }; - return { - descriptionTitle: "toolbar-clue-humidity-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-humidity-sensor.description", - tryItDescription: "toolbar-clue-humidity-sensor.tryItDescription", - components: [ - , - ], - id: "humidity_sensor", - }; + const humiditySensorValues = { + H: sensorValues[SENSOR_LIST.HUMIDITY], + }; + return { + descriptionTitle: "toolbar-clue-humidity-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-humidity-sensor.description", + tryItDescription: "toolbar-clue-humidity-sensor.tryItDescription", + components: [ + , + ], + id: "humidity_sensor", + }; }; export const GESTURE_CONTENT = ( - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void + onSelectGestures?: (event: React.ChangeEvent) => void, + sendGesture?: (isActive: boolean) => void ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-gesture-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-gesture-sensor.description", - tryItDescription: "toolbar-clue-gesture-sensor.tryItDescription", - components: [ - , - ], - id: "gesture_sensor", - }; + return { + descriptionTitle: "toolbar-clue-gesture-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-gesture-sensor.description", + tryItDescription: "toolbar-clue-gesture-sensor.tryItDescription", + components: [ + , + ], + id: "gesture_sensor", + }; }; export const PROXIMITY_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const proximitySensorValues = { - P: sensorValues[SENSOR_LIST.PROXIMITY], - }; - return { - descriptionTitle: "toolbar-clue-proximity-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-proximity-sensor.description", - tryItDescription: "toolbar-clue-proximity-sensor.tryItDescription", - components: [ - , - ], - id: "proximity_sensor", - }; + const proximitySensorValues = { + P: sensorValues[SENSOR_LIST.PROXIMITY], + }; + return { + descriptionTitle: "toolbar-clue-proximity-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-proximity-sensor.description", + tryItDescription: "toolbar-clue-proximity-sensor.tryItDescription", + components: [ + , + ], + id: "proximity_sensor", + }; }; export const PRESSURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const pressureSensorValues = { - P: sensorValues[SENSOR_LIST.PRESSURE], - }; - return { - descriptionTitle: "toolbar-clue-pressure-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-pressure-sensor.description", - tryItDescription: "toolbar-clue-pressure-sensor.tryItDescription", - components: [ - , - ], - id: "pressure_sensor", - }; + const pressureSensorValues = { + P: sensorValues[SENSOR_LIST.PRESSURE], + }; + return { + descriptionTitle: "toolbar-clue-pressure-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-pressure-sensor.description", + tryItDescription: "toolbar-clue-pressure-sensor.tryItDescription", + components: [ + , + ], + id: "pressure_sensor", + }; }; export const BUTTON_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-a-b-push.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-clue-a-b-push.description", - tryItDescription: "toolbar-clue-a-b-push.tryItDescription", - components: undefined, - id: "microbit_button", - }; + return { + descriptionTitle: "toolbar-clue-a-b-push.title", + tagInput: undefined, + tagOutput: TAG_INPUT_SVG, + descriptionText: "toolbar-clue-a-b-push.description", + tryItDescription: "toolbar-clue-a-b-push.tryItDescription", + components: undefined, + id: "microbit_button", + }; }; export const BLUETOOTH_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-bluetooth.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-clue-bluetooth.description", - tryItDescription: "toolbar-clue-bluetooth.tryItDescription", - components: undefined, - id: "bluetooth", - }; + return { + descriptionTitle: "toolbar-clue-bluetooth.title", + tagInput: undefined, + tagOutput: TAG_INPUT_SVG, + descriptionText: "toolbar-clue-bluetooth.description", + tryItDescription: "toolbar-clue-bluetooth.tryItDescription", + components: undefined, + id: "bluetooth", + }; }; export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-sound-sensor.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-sound-sensor.description", - tryItDescription: "toolbar-clue-sound-sensor.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "sound_sensor", - }; + return { + descriptionTitle: "toolbar-clue-sound-sensor.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-sound-sensor.description", + tryItDescription: "toolbar-clue-sound-sensor.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "sound_sensor", + }; }; export const LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-led.description", - tryItDescription: "toolbar-clue-led.tryItDescription", - components: undefined, - id: "clue_neopixel", - }; + return { + descriptionTitle: "toolbar-clue-led.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-led.description", + tryItDescription: "toolbar-clue-led.tryItDescription", + components: undefined, + id: "clue_neopixel", + }; }; export const SPEAKER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-speaker.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-speaker.description", - tryItDescription: "toolbar-speaker.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "speaker", - }; + return { + descriptionTitle: "toolbar-speaker.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-speaker.description", + tryItDescription: "toolbar-speaker.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "speaker", + }; }; diff --git a/Source/view/components/toolbar/clue/ClueSensorProperties.tsx b/Source/view/components/toolbar/clue/ClueSensorProperties.tsx index ad40283f8..f8194eeb3 100644 --- a/Source/view/components/toolbar/clue/ClueSensorProperties.tsx +++ b/Source/view/components/toolbar/clue/ClueSensorProperties.tsx @@ -2,215 +2,215 @@ import { SENSOR_LIST } from "../../../constants"; import { ISensorProps, ISliderProps } from "../../../viewUtils"; const CLUE_SLIDER_R: ISliderProps = { - axisLabel: "R", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_R, - step: 1, + axisLabel: "R", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_R, + step: 1, }; const CLUE_SLIDER_G: ISliderProps = { - axisLabel: "G", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_G, - step: 1, + axisLabel: "G", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_G, + step: 1, }; const CLUE_SLIDER_B: ISliderProps = { - axisLabel: "B", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_B, - step: 1, + axisLabel: "B", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_B, + step: 1, }; const CLUE_SLIDER_C: ISliderProps = { - axisLabel: "C", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_C, - step: 1, + axisLabel: "C", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_C, + step: 1, }; export const CLUE_LIGHT_PROPERTIES: ISensorProps = { - LABEL: "Light Sensor", - sliderProps: [CLUE_SLIDER_R, CLUE_SLIDER_G, CLUE_SLIDER_B, CLUE_SLIDER_C], - unitLabel: "Lux", + LABEL: "Light Sensor", + sliderProps: [CLUE_SLIDER_R, CLUE_SLIDER_G, CLUE_SLIDER_B, CLUE_SLIDER_C], + unitLabel: "Lux", }; // Range for magnet found here https://www.adafruit.com/product/4479 const CLUE_MAGNET_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_X, - step: 0.1, + axisLabel: "X", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.MAGNET_X, + step: 0.1, }; const CLUE_MAGNET_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_Y, - step: 0.1, + axisLabel: "Y", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.MAGNET_Y, + step: 0.1, }; const CLUE_MAGNET_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_Z, - step: 0.1, + axisLabel: "Z", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.MAGNET_Z, + step: 0.1, }; export const CLUE_MAGNET_PROPERTIES: ISensorProps = { - LABEL: "Magnetoscope", - sliderProps: [CLUE_MAGNET_X, CLUE_MAGNET_Y, CLUE_MAGNET_Z], - unitLabel: "μT", + LABEL: "Magnetoscope", + sliderProps: [CLUE_MAGNET_X, CLUE_MAGNET_Y, CLUE_MAGNET_Z], + unitLabel: "μT", }; const CLUE_GYRO_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_X, - step: 0.1, + axisLabel: "X", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.GYRO_X, + step: 0.1, }; const CLUE_GYRO_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_Y, - step: 0.1, + axisLabel: "Y", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.GYRO_Y, + step: 0.1, }; const CLUE_GYRO_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_Z, - step: 0.1, + axisLabel: "Z", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.GYRO_Z, + step: 0.1, }; export const CLUE_GYRO_PROPERTIES: ISensorProps = { - LABEL: "Gyroscope", - sliderProps: [CLUE_GYRO_X, CLUE_GYRO_Y, CLUE_GYRO_Z], - unitLabel: "deg/s", + LABEL: "Gyroscope", + sliderProps: [CLUE_GYRO_X, CLUE_GYRO_Y, CLUE_GYRO_Z], + unitLabel: "deg/s", }; export const CLUE_HUMIDITY_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "H", - maxLabel: "Max", - maxValue: 100, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.HUMIDITY, - step: 0.1, - }, - ], - unitLabel: "%", + LABEL: "Humidity Sensor", + sliderProps: [ + { + axisLabel: "H", + maxLabel: "Max", + maxValue: 100, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.HUMIDITY, + step: 0.1, + }, + ], + unitLabel: "%", }; export const CLUE__PROXIMITY_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "P", - maxLabel: "Max", - maxValue: 255, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.PROXIMITY, - step: 1, - }, - ], - unitLabel: "", + LABEL: "Humidity Sensor", + sliderProps: [ + { + axisLabel: "P", + maxLabel: "Max", + maxValue: 255, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.PROXIMITY, + step: 1, + }, + ], + unitLabel: "", }; export const CLUE_PRESSURE_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "P", - maxLabel: "Max", - maxValue: 1100, - minLabel: "Min", - minValue: 800, - type: SENSOR_LIST.PRESSURE, - step: 0.1, - }, - ], - unitLabel: "hPa", + LABEL: "Humidity Sensor", + sliderProps: [ + { + axisLabel: "P", + maxLabel: "Max", + maxValue: 1100, + minLabel: "Min", + minValue: 800, + type: SENSOR_LIST.PRESSURE, + step: 0.1, + }, + ], + unitLabel: "hPa", }; const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 1023, - minLabel: "Left", - minValue: -1023, - type: SENSOR_LIST.MOTION_X, - step: 0.1, + axisLabel: "X", + maxLabel: "Right", + maxValue: 1023, + minLabel: "Left", + minValue: -1023, + type: SENSOR_LIST.MOTION_X, + step: 0.1, }; const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 1023, - minLabel: "Back", - minValue: -1023, - type: SENSOR_LIST.MOTION_Y, - step: 0.1, + axisLabel: "Y", + maxLabel: "Front", + maxValue: 1023, + minLabel: "Back", + minValue: -1023, + type: SENSOR_LIST.MOTION_Y, + step: 0.1, }; const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 1023, - minLabel: "Up", - minValue: -1023, - type: SENSOR_LIST.MOTION_Z, - step: 0.1, + axisLabel: "Z", + maxLabel: "Down", + maxValue: 1023, + minLabel: "Up", + minValue: -1023, + type: SENSOR_LIST.MOTION_Z, + step: 0.1, }; export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "m/s2", + LABEL: "Motion sensor", + sliderProps: [ + MOTION_SLIDER_PROPS_X, + MOTION_SLIDER_PROPS_Y, + MOTION_SLIDER_PROPS_Z, + ], + unitLabel: "m/s2", }; const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 0.1, + axisLabel: "T", + maxLabel: "Hot", + maxValue: 125, + minLabel: "Cold", + minValue: -55, + type: SENSOR_LIST.TEMPERATURE, + step: 0.1, }; export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", + LABEL: "Temperature sensor", + sliderProps: [TEMPERATURE_SLIDER_PROPS], + unitLabel: "°C", }; diff --git a/Source/view/components/toolbar/cpx/CpxModalContent.tsx b/Source/view/components/toolbar/cpx/CpxModalContent.tsx index 669a059ea..55166eb2a 100644 --- a/Source/view/components/toolbar/cpx/CpxModalContent.tsx +++ b/Source/view/components/toolbar/cpx/CpxModalContent.tsx @@ -4,195 +4,195 @@ import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; import { GenericSliderComponent } from "../GenericSliderComponent"; import { - FEATURE_REQUEST_ON_GITHUB, - IModalContent, - TRY_IT_MAKE_CODE, + FEATURE_REQUEST_ON_GITHUB, + IModalContent, + TRY_IT_MAKE_CODE, } from "../SensorModalUtils"; import * as SENSOR_PROPERTIES from "./CpxSensorProperties"; export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-gpio.description", - tryItDescription: "toolbar-gpio.tryItDescription", - components: undefined, - id: "GPIO", - }; + return { + descriptionTitle: "toolbar-gpio.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-gpio.description", + tryItDescription: "toolbar-gpio.tryItDescription", + components: undefined, + id: "GPIO", + }; }; export const IR_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-ir-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-ir-sensor.description", - tryItDescription: "toolbar-ir-sensor.tryItDescription", - components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], - id: "IR", - }; + return { + descriptionTitle: "toolbar-ir-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-ir-sensor.description", + tryItDescription: "toolbar-ir-sensor.tryItDescription", + components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], + id: "IR", + }; }; export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const lightSensorValues = { - L: sensorValues[SENSOR_LIST.LIGHT], - }; - return { - descriptionTitle: "toolbar-light-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-light-sensor.description", - tryItDescription: "toolbar-light-sensor.tryItDescription", - components: [ - , - ], - id: "light_sensor", - }; + const lightSensorValues = { + L: sensorValues[SENSOR_LIST.LIGHT], + }; + return { + descriptionTitle: "toolbar-light-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-light-sensor.description", + tryItDescription: "toolbar-light-sensor.tryItDescription", + components: [ + , + ], + id: "light_sensor", + }; }; export const MOTION_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const motionSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - descriptionTitle: "toolbar-motion-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-motion-sensor.description", - tryItDescription: "toolbar-motion-sensor.tryItDescription", - components: [ - , - TRY_IT_MAKE_CODE, - FEATURE_REQUEST_ON_GITHUB, - ], - id: "motion_sensor", - }; + const motionSensorValues = { + X: sensorValues[SENSOR_LIST.MOTION_X], + Y: sensorValues[SENSOR_LIST.MOTION_Y], + Z: sensorValues[SENSOR_LIST.MOTION_Z], + }; + return { + descriptionTitle: "toolbar-motion-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-motion-sensor.description", + tryItDescription: "toolbar-motion-sensor.tryItDescription", + components: [ + , + TRY_IT_MAKE_CODE, + FEATURE_REQUEST_ON_GITHUB, + ], + id: "motion_sensor", + }; }; export const NEOP_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-neo-pixels.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-neo-pixels.description", - tryItDescription: "toolbar-neo-pixels.tryItDescription", - components: undefined, - id: "neon_pixel", - }; + return { + descriptionTitle: "toolbar-neo-pixels.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-neo-pixels.description", + tryItDescription: "toolbar-neo-pixels.tryItDescription", + components: undefined, + id: "neon_pixel", + }; }; export const PUSHB_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-a-b-push.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-a-b-push.description", - tryItDescription: "toolbar-a-b-push.tryItDescription", - components: undefined, - id: "push_btn", - }; + return { + descriptionTitle: "toolbar-a-b-push.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-a-b-push.description", + tryItDescription: "toolbar-a-b-push.tryItDescription", + components: undefined, + id: "push_btn", + }; }; export const RED_LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-red-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-red-led.description", - tryItDescription: "toolbar-red-led.tryItDescription", - components: undefined, - id: "red_LED", - }; + return { + descriptionTitle: "toolbar-red-led.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-red-led.description", + tryItDescription: "toolbar-red-led.tryItDescription", + components: undefined, + id: "red_LED", + }; }; export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-sound-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-sound-sensor.description", - tryItDescription: "toolbar-sound-sensor.tryItDescription", - components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], - id: "sound_sensor", - }; + return { + descriptionTitle: "toolbar-sound-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-sound-sensor.description", + tryItDescription: "toolbar-sound-sensor.tryItDescription", + components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], + id: "sound_sensor", + }; }; export const SWITCH_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-slider-switch.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-slider-switch.description", - tryItDescription: "toolbar-slider-switch.tryItDescription", - components: undefined, - id: "slider_switch", - }; + return { + descriptionTitle: "toolbar-slider-switch.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-slider-switch.description", + tryItDescription: "toolbar-slider-switch.tryItDescription", + components: undefined, + id: "slider_switch", + }; }; export const SPEAKER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-speaker.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-speaker.description", - tryItDescription: "toolbar-speaker.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "speaker", - }; + return { + descriptionTitle: "toolbar-speaker.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-speaker.description", + tryItDescription: "toolbar-speaker.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "speaker", + }; }; export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-temperature-sensor.description", - descriptionTitle: "toolbar-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-temperature-sensor.tryItDescription", - }; + const temperatureSensorValues = { + T: sensorValues[SENSOR_LIST.TEMPERATURE], + }; + return { + components: [ + , + ], + descriptionText: "toolbar-temperature-sensor.description", + descriptionTitle: "toolbar-temperature-sensor.title", + id: "temperature", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-temperature-sensor.tryItDescription", + }; }; diff --git a/Source/view/components/toolbar/cpx/CpxSensorProperties.tsx b/Source/view/components/toolbar/cpx/CpxSensorProperties.tsx index 478eb36c0..f91f91469 100644 --- a/Source/view/components/toolbar/cpx/CpxSensorProperties.tsx +++ b/Source/view/components/toolbar/cpx/CpxSensorProperties.tsx @@ -2,70 +2,70 @@ import { SENSOR_LIST } from "../../../constants"; import { ISensorProps, ISliderProps } from "../../../viewUtils"; const LIGHT_SLIDER_PROPS: ISliderProps = { - maxValue: 320, - minValue: 0, - minLabel: "Dark", - maxLabel: "Bright", - type: "light", - axisLabel: "L", - step: 1, + maxValue: 320, + minValue: 0, + minLabel: "Dark", + maxLabel: "Bright", + type: "light", + axisLabel: "L", + step: 1, }; export const LIGHT_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Light sensor", - sliderProps: [LIGHT_SLIDER_PROPS], - unitLabel: "Lux", + LABEL: "Light sensor", + sliderProps: [LIGHT_SLIDER_PROPS], + unitLabel: "Lux", }; const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 0.1, + axisLabel: "T", + maxLabel: "Hot", + maxValue: 125, + minLabel: "Cold", + minValue: -55, + type: SENSOR_LIST.TEMPERATURE, + step: 0.1, }; export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", + LABEL: "Temperature sensor", + sliderProps: [TEMPERATURE_SLIDER_PROPS], + unitLabel: "°C", }; const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 78, - minLabel: "Left", - minValue: -78, - type: SENSOR_LIST.MOTION_X, - step: 1, + axisLabel: "X", + maxLabel: "Right", + maxValue: 78, + minLabel: "Left", + minValue: -78, + type: SENSOR_LIST.MOTION_X, + step: 1, }; const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 78, - minLabel: "Back", - minValue: -78, - type: SENSOR_LIST.MOTION_Y, - step: 1, + axisLabel: "Y", + maxLabel: "Front", + maxValue: 78, + minLabel: "Back", + minValue: -78, + type: SENSOR_LIST.MOTION_Y, + step: 1, }; const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 78, - minLabel: "Up", - minValue: -78, - type: SENSOR_LIST.MOTION_Z, - step: 1, + axisLabel: "Z", + maxLabel: "Down", + maxValue: 78, + minLabel: "Up", + minValue: -78, + type: SENSOR_LIST.MOTION_Z, + step: 1, }; export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "Lux", + LABEL: "Motion sensor", + sliderProps: [ + MOTION_SLIDER_PROPS_X, + MOTION_SLIDER_PROPS_Y, + MOTION_SLIDER_PROPS_Z, + ], + unitLabel: "Lux", }; diff --git a/Source/view/components/toolbar/microbit/MicrobitModalContent.tsx b/Source/view/components/toolbar/microbit/MicrobitModalContent.tsx index c0ffe7b5b..c53cf5554 100644 --- a/Source/view/components/toolbar/microbit/MicrobitModalContent.tsx +++ b/Source/view/components/toolbar/microbit/MicrobitModalContent.tsx @@ -8,180 +8,180 @@ import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; import * as SENSOR_PROPERTIES from "./MicrobitSensorProperties"; export const ACCELEROMETER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - // this object will be accessed with the axis label - const accelerometerSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-accelerometer-sensor.description", - descriptionTitle: "toolbar-accelerometer-sensor.title", - id: "accelerometer", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-accelerometer-sensor.tryItDescription", - }; + // this object will be accessed with the axis label + const accelerometerSensorValues = { + X: sensorValues[SENSOR_LIST.MOTION_X], + Y: sensorValues[SENSOR_LIST.MOTION_Y], + Z: sensorValues[SENSOR_LIST.MOTION_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-accelerometer-sensor.description", + descriptionTitle: "toolbar-accelerometer-sensor.title", + id: "accelerometer", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-accelerometer-sensor.tryItDescription", + }; }; export const LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-led.description", - tryItDescription: "toolbar-microbit-led.tryItDescription", - components: undefined, - id: "microbit_LED", - }; + return { + descriptionTitle: "toolbar-microbit-led.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-led.description", + tryItDescription: "toolbar-microbit-led.tryItDescription", + components: undefined, + id: "microbit_LED", + }; }; export const BUTTON_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-a-b-push.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-microbit-a-b-push.description", - tryItDescription: "toolbar-microbit-a-b-push.tryItDescription", - components: undefined, - id: "microbit_button", - }; + return { + descriptionTitle: "toolbar-microbit-a-b-push.title", + tagInput: undefined, + tagOutput: TAG_INPUT_SVG, + descriptionText: "toolbar-microbit-a-b-push.description", + tryItDescription: "toolbar-microbit-a-b-push.tryItDescription", + components: undefined, + id: "microbit_button", + }; }; export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-sound.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-sound.description", - tryItDescription: "toolbar-microbit-sound.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_sound", - }; + return { + descriptionTitle: "toolbar-microbit-sound.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-sound.description", + tryItDescription: "toolbar-microbit-sound.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_sound", + }; }; export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-gpio.description", - tryItDescription: "toolbar-microbit-gpio.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_gpio", - }; + return { + descriptionTitle: "toolbar-microbit-gpio.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-gpio.description", + tryItDescription: "toolbar-microbit-gpio.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_gpio", + }; }; export const COMPASS_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-compass-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-compass-sensor.description", - tryItDescription: "toolbar-microbit-compass-sensor.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_compass", - }; + return { + descriptionTitle: "toolbar-microbit-compass-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-compass-sensor.description", + tryItDescription: "toolbar-microbit-compass-sensor.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_compass", + }; }; export const WIRELESS_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-wireless.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-wireless.description", - tryItDescription: "toolbar-microbit-wireless.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_wireless", - }; + return { + descriptionTitle: "toolbar-microbit-wireless.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-wireless.description", + tryItDescription: "toolbar-microbit-wireless.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_wireless", + }; }; export const GESTURE_CONTENT = ( - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void + onSelectGestures?: (event: React.ChangeEvent) => void, + sendGesture?: (isActive: boolean) => void ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-gesture-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-microbit-gesture-sensor.description", - tryItDescription: "toolbar-microbit-gesture-sensor.tryItDescription", - components: [ - , - ], - id: "gesture_sensor", - }; + return { + descriptionTitle: "toolbar-microbit-gesture-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-microbit-gesture-sensor.description", + tryItDescription: "toolbar-microbit-gesture-sensor.tryItDescription", + components: [ + , + ], + id: "gesture_sensor", + }; }; export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const lightSensorValues = { - L: sensorValues[SENSOR_LIST.LIGHT], - }; - return { - descriptionTitle: "toolbar-light-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-light-sensor.description", - tryItDescription: "toolbar-light-sensor.tryItDescription", - components: [ - , - ], - id: "light_sensor", - }; + const lightSensorValues = { + L: sensorValues[SENSOR_LIST.LIGHT], + }; + return { + descriptionTitle: "toolbar-light-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-light-sensor.description", + tryItDescription: "toolbar-light-sensor.tryItDescription", + components: [ + , + ], + id: "light_sensor", + }; }; export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number } ): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-temperature-sensor.description", - descriptionTitle: "toolbar-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-temperature-sensor.tryItDescription", - }; + const temperatureSensorValues = { + T: sensorValues[SENSOR_LIST.TEMPERATURE], + }; + return { + components: [ + , + ], + descriptionText: "toolbar-temperature-sensor.description", + descriptionTitle: "toolbar-temperature-sensor.title", + id: "temperature", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-temperature-sensor.tryItDescription", + }; }; diff --git a/Source/view/components/toolbar/microbit/MicrobitSensorProperties.tsx b/Source/view/components/toolbar/microbit/MicrobitSensorProperties.tsx index 4a8974625..c32b00477 100644 --- a/Source/view/components/toolbar/microbit/MicrobitSensorProperties.tsx +++ b/Source/view/components/toolbar/microbit/MicrobitSensorProperties.tsx @@ -2,73 +2,73 @@ import { SENSOR_LIST } from "../../../constants"; import { ISensorProps, ISliderProps } from "../../../viewUtils"; const LIGHT_SLIDER_PROPS: ISliderProps = { - maxValue: 255, - minValue: 0, - minLabel: "Dark", - maxLabel: "Bright", - type: "light", - axisLabel: "L", - step: 1, + maxValue: 255, + minValue: 0, + minLabel: "Dark", + maxLabel: "Bright", + type: "light", + axisLabel: "L", + step: 1, }; export const LIGHT_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Light sensor", - sliderProps: [LIGHT_SLIDER_PROPS], - unitLabel: "Lux", + LABEL: "Light sensor", + sliderProps: [LIGHT_SLIDER_PROPS], + unitLabel: "Lux", }; const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 1023, - minLabel: "Left", - minValue: -1023, - type: SENSOR_LIST.MOTION_X, - step: 1, + axisLabel: "X", + maxLabel: "Right", + maxValue: 1023, + minLabel: "Left", + minValue: -1023, + type: SENSOR_LIST.MOTION_X, + step: 1, }; const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 1023, - minLabel: "Back", - minValue: -1023, - type: SENSOR_LIST.MOTION_Y, - step: 1, + axisLabel: "Y", + maxLabel: "Front", + maxValue: 1023, + minLabel: "Back", + minValue: -1023, + type: SENSOR_LIST.MOTION_Y, + step: 1, }; const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 1023, - minLabel: "Up", - minValue: -1023, - type: SENSOR_LIST.MOTION_Z, - step: 1, + axisLabel: "Z", + maxLabel: "Down", + maxValue: 1023, + minLabel: "Up", + minValue: -1023, + type: SENSOR_LIST.MOTION_Z, + step: 1, }; export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "m/s2", + LABEL: "Motion sensor", + sliderProps: [ + MOTION_SLIDER_PROPS_X, + MOTION_SLIDER_PROPS_Y, + MOTION_SLIDER_PROPS_Z, + ], + unitLabel: "m/s2", }; const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 1, + axisLabel: "T", + maxLabel: "Hot", + maxValue: 125, + minLabel: "Cold", + minValue: -55, + type: SENSOR_LIST.TEMPERATURE, + step: 1, }; export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", + LABEL: "Temperature sensor", + sliderProps: [TEMPERATURE_SLIDER_PROPS], + unitLabel: "°C", }; diff --git a/Source/view/constants.ts b/Source/view/constants.ts index 2503ff43c..56dda92af 100644 --- a/Source/view/constants.ts +++ b/Source/view/constants.ts @@ -3,150 +3,150 @@ // Key events export const CONSTANTS = { - CURRENTLY_RUNNING: (file: string) => { - return `Currently running: ${file}`; - }, - DEVICE_NAME: { - CPX: "CPX", - MICROBIT: "micro:bit", - }, - ID_NAME: { - BUTTON_A: "BTN_A_OUTER", - BUTTON_AB: "BTN_AB_OUTER", - BUTTON_B: "BTN_B_OUTER", - PIN_A1: "PIN_A1", - PIN_A2: "PIN_A2", - PIN_A3: "PIN_A3", - PIN_A4: "PIN_A4", - PIN_A5: "PIN_A5", - PIN_A6: "PIN_A6", - PIN_A7: "PIN_A7", - PLAY_BUTTON: "play-button", - REFRESH_BUTTON: "refresh-button", - STOP_BUTTON: "stop-button", - SWITCH: "SWITCH", - }, - KEYBOARD_KEYS: { - A: "KeyA", - B: "KeyB", - C: "KeyC", - CAPITAL_R: "R", - CAPITAL_F: "F", - ENTER: "Enter", - S: "KeyS", - NUMERIC_ONE: "Digit1", - NUMERIC_TWO: "Digit2", - NUMERIC_THREE: "Digit3", - NUMERIC_FOUR: "Digit4", - NUMERIC_FIVE: "Digit5", - NUMERIC_SIX: "Digit6", - NUMERIC_SEVEN: "Digit7", - }, - FILES_PLACEHOLDER: - "The simulator will run the .py file you have focused on.", - SIMULATOR_BUTTON_WIDTH: 60, - TOOLBAR_INFO: `Explore what's on the board:`, - LED_TINT_FACTOR: 0.5, + CURRENTLY_RUNNING: (file: string) => { + return `Currently running: ${file}`; + }, + DEVICE_NAME: { + CPX: "CPX", + MICROBIT: "micro:bit", + }, + ID_NAME: { + BUTTON_A: "BTN_A_OUTER", + BUTTON_AB: "BTN_AB_OUTER", + BUTTON_B: "BTN_B_OUTER", + PIN_A1: "PIN_A1", + PIN_A2: "PIN_A2", + PIN_A3: "PIN_A3", + PIN_A4: "PIN_A4", + PIN_A5: "PIN_A5", + PIN_A6: "PIN_A6", + PIN_A7: "PIN_A7", + PLAY_BUTTON: "play-button", + REFRESH_BUTTON: "refresh-button", + STOP_BUTTON: "stop-button", + SWITCH: "SWITCH", + }, + KEYBOARD_KEYS: { + A: "KeyA", + B: "KeyB", + C: "KeyC", + CAPITAL_R: "R", + CAPITAL_F: "F", + ENTER: "Enter", + S: "KeyS", + NUMERIC_ONE: "Digit1", + NUMERIC_TWO: "Digit2", + NUMERIC_THREE: "Digit3", + NUMERIC_FOUR: "Digit4", + NUMERIC_FIVE: "Digit5", + NUMERIC_SIX: "Digit6", + NUMERIC_SEVEN: "Digit7", + }, + FILES_PLACEHOLDER: + "The simulator will run the .py file you have focused on.", + SIMULATOR_BUTTON_WIDTH: 60, + TOOLBAR_INFO: `Explore what's on the board:`, + LED_TINT_FACTOR: 0.5, }; export const AB_BUTTONS_KEYS = { - BTN_A: "BTN_A", - BTN_B: "BTN_B", - BTN_AB: "BTN_AB", + BTN_A: "BTN_A", + BTN_B: "BTN_B", + BTN_AB: "BTN_AB", }; export const BUTTON_CLASSNAME = { - ACTIVE: "sim-button-group", - DEACTIVATED: "sim-button-group-deactivated", + ACTIVE: "sim-button-group", + DEACTIVATED: "sim-button-group-deactivated", }; export const BUTTON_STYLING_CLASSES = { - DEFAULT: "sim-button-outer", - KEYPRESSED: "sim-button-key-press", + DEFAULT: "sim-button-outer", + KEYPRESSED: "sim-button-key-press", }; export const CLUE_LEDS_COLORS = { - WHITE_LEDS_OFF: "#ffde00", - WHITE_LEDS_ON: "white", - RED_LED_OFF: "#808080", - RED_LED_ON: "red", + WHITE_LEDS_OFF: "#ffde00", + WHITE_LEDS_ON: "white", + RED_LED_OFF: "#808080", + RED_LED_ON: "red", }; export enum DEVICE_LIST_KEY { - CPX = "CPX", - MICROBIT = "micro:bit", - CLUE = "CLUE", + CPX = "CPX", + MICROBIT = "micro:bit", + CLUE = "CLUE", } // Pauses on Debug mode alter the state of the view export enum VIEW_STATE { - PAUSE = "debug-pause", - RUNNING = "running", + PAUSE = "debug-pause", + RUNNING = "running", } // export enum WEBVIEW_MESSAGES { - SWITCH_DEVICE = "switch-device", - REFRESH_SIMULATOR = "refresh-simulator", - TOGGLE_PLAY_STOP = "toggle-play-stop", - BUTTON_PRESS = "button-press", - SENSOR_CHANGED = "sensor-changed", - GESTURE = "gesture", - SLIDER_TELEMETRY = "slider-telemetry", + SWITCH_DEVICE = "switch-device", + REFRESH_SIMULATOR = "refresh-simulator", + TOGGLE_PLAY_STOP = "toggle-play-stop", + BUTTON_PRESS = "button-press", + SENSOR_CHANGED = "sensor-changed", + GESTURE = "gesture", + SLIDER_TELEMETRY = "slider-telemetry", } export enum VSCODE_MESSAGES_TO_WEBVIEW { - SET_DEVICE = "set-device", - PAUSE_DEVICE = "pause-device", - RUN_DEVICE = "run-device", - RESET = "reset-state", - CURRENT_FILE = "current-file", - SET_STATE = "set-state", + SET_DEVICE = "set-device", + PAUSE_DEVICE = "pause-device", + RUN_DEVICE = "run-device", + RESET = "reset-state", + CURRENT_FILE = "current-file", + SET_STATE = "set-state", } export enum DEBUG_COMMANDS { - STACK_TRACE = "stackTrace", - CONTINUE = "continue", - DISCONNECT = "disconnect", + STACK_TRACE = "stackTrace", + CONTINUE = "continue", + DISCONNECT = "disconnect", } export enum SENSOR_LIST { - TEMPERATURE = "temperature", - LIGHT = "light", - ACCELEROMETER = "accelerometer", - MOTION_X = "motion_x", - MOTION_Y = "motion_y", - MOTION_Z = "motion_z", - LIGHT_R = "light_r", - LIGHT_G = "light_g", - LIGHT_B = "light_b", - LIGHT_C = "light_c", - HUMIDITY = "humidity", - PRESSURE = "pressure", - PROXIMITY = "proximity", - MAGNET_X = "magnet_x", - MAGNET_Y = "magnet_y", - MAGNET_Z = "magnet_z", - GYRO_X = "gyro_x", - GYRO_Y = "gyro_y", - GYRO_Z = "gyro_z", + TEMPERATURE = "temperature", + LIGHT = "light", + ACCELEROMETER = "accelerometer", + MOTION_X = "motion_x", + MOTION_Y = "motion_y", + MOTION_Z = "motion_z", + LIGHT_R = "light_r", + LIGHT_G = "light_g", + LIGHT_B = "light_b", + LIGHT_C = "light_c", + HUMIDITY = "humidity", + PRESSURE = "pressure", + PROXIMITY = "proximity", + MAGNET_X = "magnet_x", + MAGNET_Y = "magnet_y", + MAGNET_Z = "magnet_z", + GYRO_X = "gyro_x", + GYRO_Y = "gyro_y", + GYRO_Z = "gyro_z", } export const GESTURES_MICROBIT = [ - "shake", - "up", - "down", - "left", - "right", - "face up", - "face down", - "freefall", - "3g", - "6g", - "8g", + "shake", + "up", + "down", + "left", + "right", + "face up", + "face down", + "freefall", + "3g", + "6g", + "8g", ]; export const GESTURES_CLUE = ["up", "down", "left", "right", "shake"]; export enum WEBVIEW_ATTRIBUTES_KEY { - INITIAL_DEVICE = "initial_device", - TYPE = "webview_type", + INITIAL_DEVICE = "initial_device", + TYPE = "webview_type", } export enum WEBVIEW_TYPES { - SIMULATOR = "simulator", - GETTING_STARTED = "getting_started", + SIMULATOR = "simulator", + GETTING_STARTED = "getting_started", } export const DEFAULT_IMG_CLUE = `/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAEBAQEBAQEBA QEBAQEBAQICAQEBAQMCAgICAwMEBAMDAwMEBAYFBAQFBAMDBQcFBQYGBgYGBAUHBwcGBwYGBgb/2wBDAQEBAQEBAQMCAgMGBAMEB diff --git a/Source/view/container/device/Device.spec.tsx b/Source/view/container/device/Device.spec.tsx index 5271bcdfa..0423721ef 100644 --- a/Source/view/container/device/Device.spec.tsx +++ b/Source/view/container/device/Device.spec.tsx @@ -6,25 +6,25 @@ import { DEVICE_LIST_KEY } from "../../constants"; import { Device } from "./Device"; describe("Device component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/container/device/Device.tsx b/Source/view/container/device/Device.tsx index 41705059e..dd30d2dc6 100644 --- a/Source/view/container/device/Device.tsx +++ b/Source/view/container/device/Device.tsx @@ -8,35 +8,35 @@ import { Microbit } from "../../components/microbit/Microbit"; import { DEVICE_LIST_KEY } from "../../constants"; interface IProps { - currentSelectedDevice: string; + currentSelectedDevice: string; } // Container to switch between multiple devices export class Device extends React.Component { - constructor(props: IProps) { - super(props); - } - render() { - const { currentSelectedDevice } = this.props; + constructor(props: IProps) { + super(props); + } + render() { + const { currentSelectedDevice } = this.props; - return ( -
- - {loadSelectedDevice(currentSelectedDevice)} - -
- ); - } + return ( +
+ + {loadSelectedDevice(currentSelectedDevice)} + +
+ ); + } } const loadSelectedDevice = (currentSelectedDevice: string) => { - switch (currentSelectedDevice) { - case DEVICE_LIST_KEY.CPX: - return ; - case DEVICE_LIST_KEY.MICROBIT: - return ; - case DEVICE_LIST_KEY.CLUE: - return ; - default: - return null; - } + switch (currentSelectedDevice) { + case DEVICE_LIST_KEY.CPX: + return ; + case DEVICE_LIST_KEY.MICROBIT: + return ; + case DEVICE_LIST_KEY.CLUE: + return ; + default: + return null; + } }; diff --git a/Source/view/index.css b/Source/view/index.css index 3801bbf26..918c31f9e 100644 --- a/Source/view/index.css +++ b/Source/view/index.css @@ -1,13 +1,13 @@ @import url("https://fonts.googleapis.com/css?family=Joti+One"); body { - margin: 0; - padding: 0; - font-family: sans-serif; + margin: 0; + padding: 0; + font-family: sans-serif; } html, body { - overflow: hidden; - height: 100%; + overflow: hidden; + height: 100%; } diff --git a/Source/view/index.tsx b/Source/view/index.tsx index 2d9c941b6..32e7400b1 100644 --- a/Source/view/index.tsx +++ b/Source/view/index.tsx @@ -12,11 +12,11 @@ const messageEn = require("./translations/en.json"); const locale = "en"; const message = { - en: messageEn, + en: messageEn, }; ReactDOM.render( - - - , - document.getElementById("root") + + + , + document.getElementById("root") ); diff --git a/Source/view/pages/gettingStarted.css b/Source/view/pages/gettingStarted.css index 29a072207..ae6d20b4f 100644 --- a/Source/view/pages/gettingStarted.css +++ b/Source/view/pages/gettingStarted.css @@ -1,56 +1,56 @@ .inv { - display: none; + display: none; } .codeText { - overflow-x: auto; - white-space: pre-wrap; - word-wrap: break-word; + overflow-x: auto; + white-space: pre-wrap; + word-wrap: break-word; } li:not(:last-child) { - margin-bottom: 6px; + margin-bottom: 6px; } .normalFontWeight { - font-weight: normal; + font-weight: normal; } .deviceSelector { - width: 250px; - border: 1px solid var(--vscode-dropdown-border); - background-color: var(--vscode-dropdown-background); - color: var(--vscode-dropdown-foreground); - margin: 0 0 5px; - padding: 8px; - border-radius: 5px; - font-size: 12px; - padding-right: 30px; + width: 250px; + border: 1px solid var(--vscode-dropdown-border); + background-color: var(--vscode-dropdown-background); + color: var(--vscode-dropdown-foreground); + margin: 0 0 5px; + padding: 8px; + border-radius: 5px; + font-size: 12px; + padding-right: 30px; } .deviceSelector optgroup { - background-color: var(--vscode-dropdown-listBackground); - color: var(--vscode-dropdown-foreground); + background-color: var(--vscode-dropdown-listBackground); + color: var(--vscode-dropdown-foreground); } .deviceSelector option { - background-color: var(--vscode-dropdown-listBackground); - color: var(--vscode-dropdown-foreground); + background-color: var(--vscode-dropdown-listBackground); + color: var(--vscode-dropdown-foreground); } .codeBox { - display: block; - width: 90%; - margin: 10px; - padding: 15px; - text-align: left; - background: none; - border: 1px solid grey; - border-radius: 4px; - background-color: var(--vscode-textCodeBlock-background); + display: block; + width: 90%; + margin: 10px; + padding: 15px; + text-align: left; + background: none; + border: 1px solid grey; + border-radius: 4px; + background-color: var(--vscode-textCodeBlock-background); } .container { - text-align: left; - padding: 0 10px 20px 10px; + text-align: left; + padding: 0 10px 20px 10px; } diff --git a/Source/view/pages/gettingStarted.spec.tsx b/Source/view/pages/gettingStarted.spec.tsx index c45e2e6d1..12554fdfb 100644 --- a/Source/view/pages/gettingStarted.spec.tsx +++ b/Source/view/pages/gettingStarted.spec.tsx @@ -5,25 +5,25 @@ import * as testRenderer from "react-test-renderer"; import { GettingStartedPage } from "./gettingStarted"; describe("GettingStartedPage component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/styles/Button.css b/Source/view/styles/Button.css index 993bd4937..c30ed1360 100644 --- a/Source/view/styles/Button.css +++ b/Source/view/styles/Button.css @@ -1,50 +1,50 @@ .button { - height: 32px; - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-debugToolBar-background); + height: 32px; + background: var(--vscode-debugToolBar-background); + border-color: var(--vscode-debugToolBar-background); } .button-icon { - fill: var(--vscode-badgeForegroundOverride); + fill: var(--vscode-badgeForegroundOverride); } .button-rectangle { - stroke: var(--vscode-badgeForegroundOverride); + stroke: var(--vscode-badgeForegroundOverride); } .play-button { - border-radius: 8px 0px 0px 8px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-radius: 8px 0px 0px 8px; + border-color: var(--vscode-highContrastButtonBorderOverride-color); } .refresh-button { - border-radius: 0px 8px 8px 0px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-radius: 0px 8px 8px 0px; + border-color: var(--vscode-highContrastButtonBorderOverride-color); } .button:focus, .button:hover { - background-color: var(--vscode-terminal-selectionBackground); + background-color: var(--vscode-terminal-selectionBackground); } .button:active { - background-color: var(--vscode-editor-selectionHighlightBackground); + background-color: var(--vscode-editor-selectionHighlightBackground); } .toolbar-button { - border: none; + border: none; } .toolbar-button:hover { - outline: none; + outline: none; } .edge-button { - pointer-events: none; - border: none; + pointer-events: none; + border: none; } .button-pressed { - background-color: var(--vscode-button-background); - outline: none; + background-color: var(--vscode-button-background); + outline: none; } diff --git a/Source/view/styles/Dropdown.css b/Source/view/styles/Dropdown.css index b617665a9..b69b14c74 100644 --- a/Source/view/styles/Dropdown.css +++ b/Source/view/styles/Dropdown.css @@ -1,24 +1,24 @@ .dropdown { - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-foreground); - border-radius: 2px; - box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.22); - color: var(--vscode-foreground); - height: 32px; - width: 100%; + background: var(--vscode-debugToolBar-background); + border-color: var(--vscode-foreground); + border-radius: 2px; + box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.22); + color: var(--vscode-foreground); + height: 32px; + width: 100%; } select.dropdown:hover, select.dropdown:focus, select.dropdown:active { - outline: 1px solid var(--vscode-button-background); + outline: 1px solid var(--vscode-button-background); } option { - height: 32px; - background: var(--vscode-debugToolBar-background); - outline: 0; - align-items: center; - font-size: 14px; - color: var(--vscode-foreground); + height: 32px; + background: var(--vscode-debugToolBar-background); + outline: 0; + align-items: center; + font-size: 14px; + color: var(--vscode-foreground); } diff --git a/Source/view/styles/InputSlider.css b/Source/view/styles/InputSlider.css index 0adcd1340..b51dae8f3 100644 --- a/Source/view/styles/InputSlider.css +++ b/Source/view/styles/InputSlider.css @@ -1,103 +1,103 @@ :root { - --slider-gray-color: #cccccc; - --slider-width: 240px; + --slider-gray-color: #cccccc; + --slider-width: 240px; } .inputSlider { - height: 48px; - margin-bottom: 60px; - display: table-cell; + height: 48px; + margin-bottom: 60px; + display: table-cell; } .sliderValue { - -webkit-appearance: none; - text-align: center; - width: 48px; - height: 32px; - background-color: var(--vscode-editor-background); - margin-right: 15px; - margin-top: auto; - margin-bottom: auto; - margin-left: 5px; - color: var(--badgeForegroundOverride); - border-radius: 2px; - font-size: 16px; - font-weight: bold; - border-width: 1px; - border-radius: 2px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); + -webkit-appearance: none; + text-align: center; + width: 48px; + height: 32px; + background-color: var(--vscode-editor-background); + margin-right: 15px; + margin-top: auto; + margin-bottom: auto; + margin-left: 5px; + color: var(--badgeForegroundOverride); + border-radius: 2px; + font-size: 16px; + font-weight: bold; + border-width: 1px; + border-radius: 2px; + border-color: var(--vscode-highContrastButtonBorderOverride-color); } .slider { - -webkit-appearance: none; - background-color: var(--slider-gray-color); - height: 1px; - width: var(--slider-width); - vertical-align: middle; + -webkit-appearance: none; + background-color: var(--slider-gray-color); + height: 1px; + width: var(--slider-width); + vertical-align: middle; } .slider::-webkit-slider-thumb { - -webkit-appearance: none; - appearance: none; - width: 16px; - height: 16px; - border-radius: 50%; - background: var(--vscode-textLink-activeForeground); - cursor: pointer; + -webkit-appearance: none; + appearance: none; + width: 16px; + height: 16px; + border-radius: 50%; + background: var(--vscode-textLink-activeForeground); + cursor: pointer; } .slider::-webkit-slider-runnable-track:focus, .inputSlider:focus, .slider:focus { - outline: none; + outline: none; } .sliderValue:focus, .sliderValue:hover { - -webkit-appearance: none; - color: var(--vscode-textLink-activeForeground); - outline: 1px solid var(--vscode-textLink-activeForeground); + -webkit-appearance: none; + color: var(--vscode-textLink-activeForeground); + outline: 1px solid var(--vscode-textLink-activeForeground); } .maxLabel, .minLabel { - display: inline-block; - position: absolute; - vertical-align: top; + display: inline-block; + position: absolute; + vertical-align: top; } .maxLabel { - right: 0; + right: 0; } .minLabel { - left: 0; + left: 0; } .sliderArea, .sliderValue { - display: inline-block; - vertical-align: middle; + display: inline-block; + vertical-align: middle; } .sliderArea { - width: var(--slider-width); - height: 49px; + width: var(--slider-width); + height: 49px; } .downLabelArea { - width: var(--slider-width); - height: 15px; - margin-top: 10px; - position: relative; - font-size: 14px; + width: var(--slider-width); + height: 15px; + margin-top: 10px; + position: relative; + font-size: 14px; } .upLabelArea { - width: var(--slider-width); - height: 15px; - margin-bottom: 10px; - position: relative; - font-weight: bolder; - font-size: 16px; + width: var(--slider-width); + height: 15px; + margin-bottom: 10px; + position: relative; + font-weight: bolder; + font-size: 16px; } .slider, .upLabelArea, .downLabelArea { - display: block; + display: block; } diff --git a/Source/view/styles/LightSensorBar.css b/Source/view/styles/LightSensorBar.css index ec70e6765..5d0abac42 100644 --- a/Source/view/styles/LightSensorBar.css +++ b/Source/view/styles/LightSensorBar.css @@ -1,20 +1,20 @@ .title { - font-size: 14px; - text-align: left; - font-weight: bold; + font-size: 14px; + text-align: left; + font-weight: bold; } .header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; + -webkit-appearance: none; + height: 30px; + margin-bottom: 2px; } .lightSensorBar { - -webkit-appearance: none; - margin-top: 10px; - width: 400px; - margin-left: auto; - margin-right: auto; - padding-bottom: 16px; + -webkit-appearance: none; + margin-top: 10px; + width: 400px; + margin-left: auto; + margin-right: auto; + padding-bottom: 16px; } diff --git a/Source/view/styles/MotionSensorBar.css b/Source/view/styles/MotionSensorBar.css index 5d68da3c9..8ea39c23c 100644 --- a/Source/view/styles/MotionSensorBar.css +++ b/Source/view/styles/MotionSensorBar.css @@ -1,20 +1,20 @@ .title { - font-size: 14px; - text-align: left; + font-size: 14px; + text-align: left; } .header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; + -webkit-appearance: none; + height: 30px; + margin-bottom: 2px; } .MotionSensorBar { - width: 100%; - margin-left: auto; - margin-right: auto; + width: 100%; + margin-left: auto; + margin-right: auto; } .sensor-button-container { - padding: 10px 0; + padding: 10px 0; } diff --git a/Source/view/styles/SensorButton.css b/Source/view/styles/SensorButton.css index 75c322083..21241eca2 100644 --- a/Source/view/styles/SensorButton.css +++ b/Source/view/styles/SensorButton.css @@ -1,29 +1,29 @@ .sensor-button { - color: var(--vscode-badgeForegroundOverride); - text-align: center; - background-color: var(--vscode-button-background); - width: 100%; - height: 32px; - font-weight: bolder; - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - padding: 4px; + color: var(--vscode-badgeForegroundOverride); + text-align: center; + background-color: var(--vscode-button-background); + width: 100%; + height: 32px; + font-weight: bolder; + border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-width: 1px; + border-style: solid; + padding: 4px; } .sensor-button:focus, .sensor-button:active { - outline-width: thick; - outline-offset: 4px; - outline: 2px solid var(--vscode-focusBorder); - background-color: var(--vscode-button-hoverBackground); + outline-width: thick; + outline-offset: 4px; + outline: 2px solid var(--vscode-focusBorder); + background-color: var(--vscode-button-hoverBackground); } .sensor-button:active, .active-button { - opacity: 0.5; + opacity: 0.5; } .sensor-button:hover { - background-color: var(--vscode-button-hoverBackground); + background-color: var(--vscode-button-hoverBackground); } diff --git a/Source/view/styles/Simulator.css b/Source/view/styles/Simulator.css index ea7979248..016cc8855 100644 --- a/Source/view/styles/Simulator.css +++ b/Source/view/styles/Simulator.css @@ -1,83 +1,83 @@ .simulator { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - max-width: 700px; - max-height: 700px; - margin-left: auto; - margin-right: auto; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + max-width: 700px; + max-height: 700px; + margin-left: auto; + margin-right: auto; } .buttons { - display: flex; - flex-direction: row; - padding-top: 20px; - justify-content: center; + display: flex; + flex-direction: row; + padding-top: 20px; + justify-content: center; } .file-selector { - padding: 20px; - width: 80%; - height: 30px; - border: 1px solid var(--vscode-debugToolBar-background); - border-radius: 3px; + padding: 20px; + width: 80%; + height: 30px; + border: 1px solid var(--vscode-debugToolBar-background); + border-radius: 3px; } .shake-pressed { - /* Start the shake animation and make the animation last for 0.5 seconds */ - animation: shake 0.5s; + /* Start the shake animation and make the animation last for 0.5 seconds */ + animation: shake 0.5s; - /* When the animation is finished, start again */ - animation-iteration-count: infinite; + /* When the animation is finished, start again */ + animation-iteration-count: infinite; } @keyframes shake { - 0% { - transform: translate(1px, 1px) rotate(0deg); - } - 10% { - transform: translate(-1px, -2px) rotate(-1deg); - } - 20% { - transform: translate(-3px, 0px) rotate(1deg); - } - 30% { - transform: translate(3px, 2px) rotate(0deg); - } - 40% { - transform: translate(1px, -1px) rotate(1deg); - } - 50% { - transform: translate(-1px, 2px) rotate(-1deg); - } - 60% { - transform: translate(-3px, 1px) rotate(0deg); - } - 70% { - transform: translate(3px, 1px) rotate(-1deg); - } - 80% { - transform: translate(-1px, -1px) rotate(1deg); - } - 90% { - transform: translate(1px, 2px) rotate(0deg); - } - 100% { - transform: translate(1px, -2px) rotate(-1deg); - } + 0% { + transform: translate(1px, 1px) rotate(0deg); + } + 10% { + transform: translate(-1px, -2px) rotate(-1deg); + } + 20% { + transform: translate(-3px, 0px) rotate(1deg); + } + 30% { + transform: translate(3px, 2px) rotate(0deg); + } + 40% { + transform: translate(1px, -1px) rotate(1deg); + } + 50% { + transform: translate(-1px, 2px) rotate(-1deg); + } + 60% { + transform: translate(-3px, 1px) rotate(0deg); + } + 70% { + transform: translate(3px, 1px) rotate(-1deg); + } + 80% { + transform: translate(-1px, -1px) rotate(1deg); + } + 90% { + transform: translate(1px, 2px) rotate(0deg); + } + 100% { + transform: translate(1px, -2px) rotate(-1deg); + } } .microbit-container { - max-width: 350px; - padding: 20px; + max-width: 350px; + padding: 20px; } .clue-container { - width: 100%; - max-width: 500px; - padding: 20px; + width: 100%; + max-width: 500px; + padding: 20px; } .cpx-container { - width: 100%; - padding-top: 10px; + width: 100%; + padding-top: 10px; } diff --git a/Source/view/styles/SimulatorSvg.css b/Source/view/styles/SimulatorSvg.css index 523411c2f..10d839893 100644 --- a/Source/view/styles/SimulatorSvg.css +++ b/Source/view/styles/SimulatorSvg.css @@ -1,115 +1,115 @@ .microbit-svg { - padding: 0 0 0 10px; + padding: 0 0 0 10px; } svg.sim { - box-sizing: border-box; - width: 100%; - height: 100%; - display: block; + box-sizing: border-box; + width: 100%; + height: 100%; + display: block; } svg.sim.grayscale { - -moz-filter: grayscale(1); - -webkit-filter: grayscale(1); - filter: grayscale(1); + -moz-filter: grayscale(1); + -webkit-filter: grayscale(1); + filter: grayscale(1); } .sim-button-group { - cursor: pointer; + cursor: pointer; } .sim-button { - pointer-events: none; - fill: "rgb(17, 17, 17)"; + pointer-events: none; + fill: "rgb(17, 17, 17)"; } .sim-button-group > .sim-button:active { - fill: orange; + fill: orange; } .sim-text-outside { - font-size: 25px; - fill: var(--vscode-foreground); + font-size: 25px; + fill: var(--vscode-foreground); } .sim-board, .sim-display, sim-button { - fill: #111; + fill: #111; } .sim-button-group > .sim-button-outer:hover { - stroke: orange; - stroke-width: 4px; + stroke: orange; + stroke-width: 4px; } .sim-button-group > .sim-button-outer:active { - fill: orange; + fill: orange; } .sim-button-outer { - fill: #7e7272; + fill: #7e7272; } .sim-button-key-press { - fill: orange; + fill: orange; } .sim-button-nut { - fill: #704a4a; - pointer-events: none; + fill: #704a4a; + pointer-events: none; } .sim-systemled { - fill: #333; - stroke: #555; - stroke-width: 1px; + fill: #333; + stroke: #555; + stroke-width: 1px; } .sim-light-level-button { - stroke: #fff; - stroke-width: 3px; + stroke: #fff; + stroke-width: 3px; } .sim-antenna { - stroke: #555; - stroke-width: 2px; + stroke: #555; + stroke-width: 2px; } .sim-text { - font-family: "Lucida Console", Monaco, monospace; - font-size: 25px; - fill: #fff; - pointer-events: none; + font-family: "Lucida Console", Monaco, monospace; + font-size: 25px; + fill: #fff; + pointer-events: none; } .sim-text-pin { - font-family: "Lucida Console", Monaco, monospace; - font-size: 20px; - fill: #fff; - pointer-events: none; + font-family: "Lucida Console", Monaco, monospace; + font-size: 20px; + fill: #fff; + pointer-events: none; } .sim-thermometer { - stroke: #aaa; - stroke-width: 3px; + stroke: #aaa; + stroke-width: 3px; } /* animations */ .sim-flash { - animation-name: sim-flash-animation; - animation-duration: 0.1s; + animation-name: sim-flash-animation; + animation-duration: 0.1s; } @keyframes sim-flash-animation { - from { - fill: yellow; - } - to { - fill: default; - } + from { + fill: yellow; + } + to { + fill: default; + } } .sim-flash-stroke { - animation-name: sim-flash-stroke-animation; - animation-duration: 0.4s; - animation-timing-function: ease-in; + animation-name: sim-flash-stroke-animation; + animation-duration: 0.4s; + animation-timing-function: ease-in; } @keyframes sim-flash-stroke-animation { - from { - stroke: yellow; - } - to { - stroke: default; - } + from { + stroke: yellow; + } + to { + stroke: default; + } } /* wireframe */ .sim-wireframe * { - fill: none; - stroke: black; + fill: none; + stroke: black; } .sim-wireframe .sim-display, .sim-wireframe .sim-led, @@ -120,29 +120,29 @@ sim-button { .sim-wireframe .sim-button-label, .sim-wireframe .sim-button, .sim-wireframe .sim-text-pin { - visibility: hidden; + visibility: hidden; } .sim-wireframe .sim-label { - stroke: none; - fill: #777; + stroke: none; + fill: #777; } .sim-label, .sim-button-label { - fill: #000; + fill: #000; } .sim-wireframe .sim-board { - stroke-width: 2px; + stroke-width: 2px; } *:focus { - outline: none; + outline: none; } .sim-button-group:focus { - stroke: #4d90fe; - stroke-width: 4px; + stroke: #4d90fe; + stroke-width: 4px; } .sim-button-group:focus { - stroke: #4d90fe; - stroke-width: 4px; + stroke: #4d90fe; + stroke-width: 4px; } *:focus .sim-button-outer, .sim-pin:focus, @@ -151,27 +151,27 @@ sim-button { .no-drag, .sim-text, .sim-text-pin { - user-drag: none; - user-select: none; - -moz-user-select: none; - -webkit-user-drag: none; - -webkit-user-select: none; - -ms-user-select: none; + user-drag: none; + user-select: none; + -moz-user-select: none; + -webkit-user-drag: none; + -webkit-user-select: none; + -ms-user-select: none; } .sim-button { - stroke: none; + stroke: none; } .sim-button:active { - stroke: none; + stroke: none; } .cls-1 { - fill: #097054; + fill: #097054; } .cls-1, .cls-14, .cls-23, .cls-9 { - stroke: #000; + stroke: #000; } .cls-1, .cls-11, @@ -185,15 +185,15 @@ sim-button { .cls-5, .cls-6, .cls-9 { - stroke-miterlimit: 10; + stroke-miterlimit: 10; } .cls-1, .cls-23 { - stroke-width: 1.99px; + stroke-width: 1.99px; } .cls-18, .cls-2 { - fill: #fff; + fill: #fff; } .cls-11, .cls-12, @@ -205,7 +205,7 @@ sim-button { .cls-6, .cls-7, .cls-8 { - fill: none; + fill: none; } .cls-11, .cls-12, @@ -216,10 +216,10 @@ sim-button { .cls-6, .cls-7, .cls-8 { - stroke: #fff; + stroke: #fff; } .cls-3 { - stroke-width: 2px; + stroke-width: 2px; } .cls-12, .cls-17, @@ -228,65 +228,63 @@ sim-button { .cls-6, .cls-7, .cls-8 { - stroke-linecap: round; + stroke-linecap: round; } .cls-4, .cls-7 { - stroke-width: 1.63px; + stroke-width: 1.63px; } .cls-5 { - stroke-width: 1.41px; + stroke-width: 1.41px; } .cls-6 { - stroke-width: 1.6px; + stroke-width: 1.6px; } .cls-7, .cls-8 { - stroke-linejoin: round; + stroke-linejoin: round; } .cls-8 { - stroke-width: 1.63px; + stroke-width: 1.63px; } .cls-10, .cls-9 { - fill: #7e7272; + fill: #7e7272; } .cls-22, .cls-9 { - stroke-width: 1.5px; + stroke-width: 1.5px; } .cls-12 { - stroke-width: 1.71px; + stroke-width: 1.71px; } .cls-14 { - stroke-width: 0.25px; + stroke-width: 0.25px; } .cls-17 { - stroke-width: 2.02px; + stroke-width: 2.02px; } .cls-18 { - font-size: 7px; - font-family: - SegoeUI-Bold, - Segoe UI; - font-weight: 700; - letter-spacing: -0.02em; + font-size: 7px; + font-family: SegoeUI-Bold, Segoe UI; + font-weight: 700; + letter-spacing: -0.02em; } .cls-19 { - letter-spacing: -0.03em; + letter-spacing: -0.03em; } .cls-20 { - letter-spacing: -0.05em; + letter-spacing: -0.05em; } .cls-21 { - letter-spacing: 0em; + letter-spacing: 0em; } .cls-22 { - stroke: #7e7272; + stroke: #7e7272; } .sim-text-outside-clue { - font-size: 14px; - fill: var(--vscode-foreground); + font-size: 14px; + fill: var(--vscode-foreground); } diff --git a/Source/view/styles/TemperatureSensorBar.css b/Source/view/styles/TemperatureSensorBar.css index e52920b20..dfab0b7cd 100644 --- a/Source/view/styles/TemperatureSensorBar.css +++ b/Source/view/styles/TemperatureSensorBar.css @@ -1,18 +1,18 @@ .title { - font-size: 14px; - text-align: left; - font-weight: bold; + font-size: 14px; + text-align: left; + font-weight: bold; } .header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; + -webkit-appearance: none; + height: 30px; + margin-bottom: 2px; } .temperatureSensorBar { - margin-top: 10px; - width: 440px; - margin-left: auto; - margin-right: auto; - padding-bottom: 16px; + margin-top: 10px; + width: 440px; + margin-left: auto; + margin-right: auto; + padding-bottom: 16px; } diff --git a/Source/view/styles/ToolBar.css b/Source/view/styles/ToolBar.css index f85843e90..faca0569c 100644 --- a/Source/view/styles/ToolBar.css +++ b/Source/view/styles/ToolBar.css @@ -1,182 +1,182 @@ .toolbar-parent { - background: var(--vscode-debugToolBar-background); - width: fit-content; - border-radius: 2px; - height: fit-content; - margin-left: auto; - margin-right: auto; - margin-top: 24px; - margin-bottom: 50px; + background: var(--vscode-debugToolBar-background); + width: fit-content; + border-radius: 2px; + height: fit-content; + margin-left: auto; + margin-right: auto; + margin-top: 24px; + margin-bottom: 50px; } .toolbar { - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - display: flex; - flex-direction: column; - align-content: center; - align-items: center; + box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); + border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-width: 1px; + border-style: solid; + display: flex; + flex-direction: column; + align-content: center; + align-items: center; } .toolbar-icon { - min-width: 360px; - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - padding: 0px 8px 0px 8px; + min-width: 360px; + box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); + border-color: var(--vscode-highContrastButtonBorderOverride-color); + border-width: 1px; + border-style: solid; + padding: 0px 8px 0px 8px; } .tag, .title { - display: inline; + display: inline; } .sensor_modal { - vertical-align: middle; - width: 360px; - overflow-y: visible; - overflow-x: hidden; - position: relative; - height: fit-content; - padding-left: 16px; - box-shadow: none; - margin-left: 1px; + vertical-align: middle; + width: 360px; + overflow-y: visible; + overflow-x: hidden; + position: relative; + height: fit-content; + padding-left: 16px; + box-shadow: none; + margin-left: 1px; } .title { - -webkit-appearance: none; - font-size: 16px; - font-weight: bolder; - color: var(--vscode-badgeForegroundOverride); - text-align: left; - margin-right: 40px; - position: absolute; - left: 0; - padding-left: inherit; - width: 320px; + -webkit-appearance: none; + font-size: 16px; + font-weight: bolder; + color: var(--vscode-badgeForegroundOverride); + text-align: left; + margin-right: 40px; + position: absolute; + left: 0; + padding-left: inherit; + width: 320px; } .info-icon { - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - color: var(--vscode-badgeForegroundOverride); - border-width: 1px; - border-style: solid; - padding: 0px 4px; - float: right; - left: 25px; - margin-top: -10px; + background: var(--vscode-debugToolBar-background); + border-color: var(--vscode-highContrastButtonBorderOverride-color); + color: var(--vscode-badgeForegroundOverride); + border-width: 1px; + border-style: solid; + padding: 0px 4px; + float: right; + left: 25px; + margin-top: -10px; } .info-icon:hover { - background-color: var(--vscode-terminal-selectionBackground); - color: var(--vscode-badgeForegroundOverride); + background-color: var(--vscode-terminal-selectionBackground); + color: var(--vscode-badgeForegroundOverride); } .info-icon:active { - background-color: var(--vscode-editor-selectionHighlightBackground); - color: var(--vscode-badgeForegroundOverride); + background-color: var(--vscode-editor-selectionHighlightBackground); + color: var(--vscode-badgeForegroundOverride); } .tag { - position: absolute; - left: 200px; + position: absolute; + left: 200px; } .description-callout { - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - padding: "210px 214px 214px 210px"; - border: 2px solid var(--vscode-highContrastButtonBorderOverride-color); + box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); + padding: "210px 214px 214px 210px"; + border: 2px solid var(--vscode-highContrastButtonBorderOverride-color); } .description-callout .ms-Callout-beak { - background-color: var(--vscode-debugToolBar-background); + background-color: var(--vscode-debugToolBar-background); } .description-callout .ms-Callout-main { - background-color: var(--vscode-debugToolBar-background); - overflow-x: hidden; - overflow-y: auto; - margin: -1px; + background-color: var(--vscode-debugToolBar-background); + overflow-x: hidden; + overflow-y: auto; + margin: -1px; } .try-it-description { - -webkit-appearance: none; - font-size: 14px; - background: var(--vscode-debugToolBar-background); - word-wrap: break-word; - width: 320px; - height: "100%"; - margin-top: 15px; - text-align: left; - line-height: 17px; - font-weight: 100; + -webkit-appearance: none; + font-size: 14px; + background: var(--vscode-debugToolBar-background); + word-wrap: break-word; + width: 320px; + height: "100%"; + margin-top: 15px; + text-align: left; + line-height: 17px; + font-weight: 100; } .description { - -webkit-appearance: none; - color: var(--vscode-badgeForegroundOverride); - font-size: 14px; - word-wrap: break-word; - width: 320px; - height: "100%"; - text-align: left; - font-weight: 400; - padding: 10px 0px 10px 10px; - margin: 10px; - overflow-y: hidden; + -webkit-appearance: none; + color: var(--vscode-badgeForegroundOverride); + font-size: 14px; + word-wrap: break-word; + width: 320px; + height: "100%"; + text-align: left; + font-weight: 400; + padding: 10px 0px 10px 10px; + margin: 10px; + overflow-y: hidden; } .title_group { - margin-top: 20px; - width: fit-content; - padding-left: 16px; + margin-top: 20px; + width: fit-content; + padding-left: 16px; } .try_area { - position: relative; - padding-bottom: 30px; - text-align: left; - line-height: 17px; - font-weight: 100; - opacity: 90%; - font-size: 14px; - word-wrap: break-word; - padding-right: 10px; + position: relative; + padding-bottom: 30px; + text-align: left; + line-height: 17px; + font-weight: 100; + opacity: 90%; + font-size: 14px; + word-wrap: break-word; + padding-right: 10px; } .link-parent { - padding-top: 12px; - -webkit-appearance: none; - color: var(--vscode-textLink-foreground); - text-align: right; - text-decoration: none; - font-weight: bold; + padding-top: 12px; + -webkit-appearance: none; + color: var(--vscode-textLink-foreground); + text-align: right; + text-decoration: none; + font-weight: bold; } .link-parent:hover { - -webkit-appearance: none; - color: var(--vscode-textLink-activeForeground); - text-decoration: none; + -webkit-appearance: none; + color: var(--vscode-textLink-activeForeground); + text-decoration: none; } .link { - -webkit-appearance: none; - text-decoration: none; + -webkit-appearance: none; + text-decoration: none; } .gesture-container { - display: "flex"; - justify-content: "space-between"; - flex-direction: "column"; - align-items: "center"; - height: 750; - padding-top: 10px; + display: "flex"; + justify-content: "space-between"; + flex-direction: "column"; + align-items: "center"; + height: 750; + padding-top: 10px; } .generic-slider-component { - padding-top: 10px; + padding-top: 10px; } diff --git a/Source/view/svgs/arrow_right_svg.tsx b/Source/view/svgs/arrow_right_svg.tsx index 538c52229..7eead7979 100644 --- a/Source/view/svgs/arrow_right_svg.tsx +++ b/Source/view/svgs/arrow_right_svg.tsx @@ -1,20 +1,21 @@ import * as React from "react"; export const ARROW_RIGHT_SVG = ( - - - + + + ); export default ARROW_RIGHT_SVG; diff --git a/Source/view/svgs/close_svg.tsx b/Source/view/svgs/close_svg.tsx index b591fa868..ac05bedfc 100644 --- a/Source/view/svgs/close_svg.tsx +++ b/Source/view/svgs/close_svg.tsx @@ -1,25 +1,26 @@ import * as React from "react"; export const CLOSE_SVG = ( - - - - + + + + ); export default CLOSE_SVG; diff --git a/Source/view/svgs/play_svg.tsx b/Source/view/svgs/play_svg.tsx index 8c1317ee1..0da21aa9d 100644 --- a/Source/view/svgs/play_svg.tsx +++ b/Source/view/svgs/play_svg.tsx @@ -1,18 +1,19 @@ import * as React from "react"; export const PLAY_SVG = ( - - - + + + ); export default PLAY_SVG; diff --git a/Source/view/svgs/refresh_svg.tsx b/Source/view/svgs/refresh_svg.tsx index 4df58cd59..340ad03f8 100644 --- a/Source/view/svgs/refresh_svg.tsx +++ b/Source/view/svgs/refresh_svg.tsx @@ -2,19 +2,20 @@ import * as React from "react"; import "../styles/Button.css"; export const REFRESH_SVG = ( - - - + + + ); export default REFRESH_SVG; diff --git a/Source/view/svgs/stop_svg.tsx b/Source/view/svgs/stop_svg.tsx index f6a628fa3..a89175f66 100644 --- a/Source/view/svgs/stop_svg.tsx +++ b/Source/view/svgs/stop_svg.tsx @@ -1,20 +1,21 @@ import * as React from "react"; export const STOP_SVG = ( - - - + + + ); export default STOP_SVG; diff --git a/Source/view/svgs/tag_input_svg.tsx b/Source/view/svgs/tag_input_svg.tsx index 8e346d140..13a507504 100644 --- a/Source/view/svgs/tag_input_svg.tsx +++ b/Source/view/svgs/tag_input_svg.tsx @@ -1,26 +1,27 @@ import * as React from "react"; export const TAG_INPUT_SVG = ( - - - - + + + + ); export default TAG_INPUT_SVG; diff --git a/Source/view/svgs/tag_output_svg.tsx b/Source/view/svgs/tag_output_svg.tsx index 157dca014..745175db5 100644 --- a/Source/view/svgs/tag_output_svg.tsx +++ b/Source/view/svgs/tag_output_svg.tsx @@ -1,25 +1,26 @@ import * as React from "react"; export const TAG_OUTPUT_SVG = ( - - - - + + + + ); export default TAG_OUTPUT_SVG; diff --git a/Source/view/svgs/toolbar_svg.tsx b/Source/view/svgs/toolbar_svg.tsx index 701725550..52de70b86 100644 --- a/Source/view/svgs/toolbar_svg.tsx +++ b/Source/view/svgs/toolbar_svg.tsx @@ -3,693 +3,738 @@ import { TOOLBAR_ICON_LABEL } from "../components/toolbar/SensorModalUtils"; import "../styles/Button.css"; export const LEFT_EDGE_SVG = ( - - - - - - - - - - + + + + + + + + + + ); export const RIGHT_EDGE_SVG = ( - - - - - - - - - - + + + + + + + + + + ); export const GPIO_SVG = ( - - Created with Sketch. - - - - - - + + Created with Sketch. + + + + + + ); export const IR_SVG = ( - - Created with Sketch. - - - - - - - - + + Created with Sketch. + + + + + + + + ); export const LIGHT_SVG = ( - - - - - - - - - - - + + + + + + + + + + + ); export const MOTION_SVG = ( - - - - - - - - - - - + + + + + + + + + + + ); export const NEO_PIXEL_SVG = ( - - Created with Sketch. - - - - - - - - - - - - - - - + + Created with Sketch. + + + + + + + + + + + + + + + ); export const PUSH_BUTTON_SVG = ( - - Created with Sketch. - - - - - - - - - + + Created with Sketch. + + + + + + + + + ); export const RED_LED_SVG = ( - - Created with Sketch. - - - - - - - - - + + Created with Sketch. + + + + + + + + + ); export const SLIDER_SWITCH_SVG = ( - - Created with Sketch. - - - - - - - - - + + Created with Sketch. + + + + + + + + + ); export const SOUND_SVG = ( - - Created with Sketch. - - - - - - - - - - - + + Created with Sketch. + + + + + + + + + + + ); export const SPEAKER_SVG = ( - - Created with Sketch. - - - - - - - - + + Created with Sketch. + + + + + + + + ); export const TEMPERATURE_SVG = ( - - - - - - - - - + + + + + + + + + ); export const WIRELESS_SVG = ( - - - - - - - - - + + + + + + + + + ); export default LEFT_EDGE_SVG; export const GESTURE_SVG = ( - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + ); export const HUMIDITY_SVG = ( - - - - + + + - - - - - - - - - + /> + + + ); export const PRESSURE_SVG = ( - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + ); export const PROXIMITY_SVG = ( - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + ); export const MAGNET_SVG = ( - - - + + - - + /> + + ); export const GYROSCOPE_SVG = ( - - - + + + - - - - - - - - - + + + + + + + + + ); export const COMPASS_SVG = ( - - - - - + + + + + ); diff --git a/Source/view/translations/en.json b/Source/view/translations/en.json index 6583386d6..c5e6ebed9 100644 --- a/Source/view/translations/en.json +++ b/Source/view/translations/en.json @@ -1,112 +1,112 @@ { - "toolbar-gpio.description": "8 GPIOs on the device! Pin A1 - A7 can also be used as capacitive touch sensors, and A0 is a true analog output pin.", - "toolbar-gpio.title": "GPIO", - "toolbar-gpio.tryItDescription": "Use your mouse to interact with the pin A1 - A7 or use your keyboard SHIFT + ”1” - “7”.", - "toolbar-ir-sensor.description": "Allows you to send commands to the device with a remote control, or even send messages between multiple devices! You can also do very simple proximity sensing since it reads the reflected light.", - "toolbar-ir-sensor.title": "IR Transmit & Receiver", - "toolbar-ir-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-light-sensor.description": "An analog light sensor can be used to detect ambient light, with similar spectral response to the human eye.", - "toolbar-light-sensor.title": "Light Sensor", - "toolbar-light-sensor.tryItDescription": "Change the brightness detected by the sensor here!", - "toolbar-motion-sensor.description": "Detects acceleration in X, Y and Z orientations. It can also detect 'tap' and 'double tap' strikes on the board and when the board is shaken.", - "toolbar-motion-sensor.title": "Motion Sensor", - "toolbar-motion-sensor.tryItDescription": "Change the acceleration here and click or click on the button to simulate a shake. The tap feature is not supported by the Device Simulator Express. If you would like to see the 'tap' feature implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-neo-pixels.description": "The 10 full color RGB LEDs surrounding the outer edge of the boards can be set to any color. Great for beautiful lighting effects!", - "toolbar-neo-pixels.title": "NeoPixels", - "toolbar-neo-pixels.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-a-b-push.description": "Two push buttons A and B are connected to digital pin #4 (Left) and #5 (Right) each.", - "toolbar-a-b-push.title": "Push Buttons", - "toolbar-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-red-led.description": "This Red LED is connected to the digital #13 GPIO pin. It can be very handy when you want an indicator LED.", - "toolbar-red-led.title": "Red LED", - "toolbar-red-led.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-sound-sensor.description": "A digital microphone can detect audio volume and even perform basic FFT functions but cannot read it like an analog voltage.", - "toolbar-sound-sensor.title": "Sound Sensor", - "toolbar-sound-sensor.tryItDescription": "If you would like to see the sound sensor implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-slider-switch.description": "This slide switch returns True or False depending on whether it's ON or OFF and can be used as a toggle switch in your code!", - "toolbar-slider-switch.title": "Slider Switch", - "toolbar-slider-switch.tryItDescription": "Click it with your mouse or press 'S' on your keyboard to switch it ON and OFF!", - "toolbar-speaker.description": "This speaker can play a .wav file and different tones and also has a class D amplifier that is connected to an output A0 pin built in! You can turn it off using the shutdown control on pin #11 on the physical device.", - "toolbar-speaker.title": "Speaker", - "toolbar-speaker.tryItDescription": "Right now the tones are not supported on the simulator. If you would like to see tones implemented, please +1 the feature addition issue on GitHub! Regardless, you can play it on your device!", - "toolbar-temperature-sensor.description": "This sensor uses an NTC thermistor to sense temperature an calculate it with the analog voltage on analog pin #A9.", - "toolbar-temperature-sensor.title": "Temperature Sensor", - "toolbar-temperature-sensor.tryItDescription": "You can set the temperature in degrees Celsius.", - "toolbar-accelerometer-sensor.title": "Accelerometer", - "toolbar-accelerometer-sensor.description": "An accelerometer measures the acceleration of your micro:bit; this component senses when the micro:bit is moved.", - "toolbar-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", - "toolbar-microbit-light-sensor.title": "Light Sensor", - "toolbar-microbit-temperature-sensor.title": "Temperature Sensor", - "toolbar-microbit-led.title": "LEDs", - "toolbar-microbit-led.description": "The microbit has 25 LEDs for you to play with. The LEDs have 9 levels of brightness.", - "toolbar-microbit-led.tryItDescription": "Run your code and see the LEDs light up!", - "toolbar-microbit-a-b-push.title": "Buttons", - "toolbar-microbit-a-b-push.description": "There are two buttons on the front of the micro:bit (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", - "toolbar-microbit-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-microbit-sound.title": "Sound", - "toolbar-microbit-sound.description": "Your BBC micro:bit can be programmed to make a wide variety of sounds - from single notes, tones and beats to your own musical compositions.", - "toolbar-microbit-sound.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-gpio.title": "GPIO (Pins)", - "toolbar-microbit-gpio.description": "On the bottom edge of your BBC micro:bit there are 25 gold strips, called pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", - "toolbar-microbit-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-wireless.title": "Bluetooth & Radio", - "toolbar-microbit-wireless.description": "micro:bits can use radio waves and bluetooth services to communicate with each other.", + "toolbar-gpio.description": "8 GPIOs on the device! Pin A1 - A7 can also be used as capacitive touch sensors, and A0 is a true analog output pin.", + "toolbar-gpio.title": "GPIO", + "toolbar-gpio.tryItDescription": "Use your mouse to interact with the pin A1 - A7 or use your keyboard SHIFT + ”1” - “7”.", + "toolbar-ir-sensor.description": "Allows you to send commands to the device with a remote control, or even send messages between multiple devices! You can also do very simple proximity sensing since it reads the reflected light.", + "toolbar-ir-sensor.title": "IR Transmit & Receiver", + "toolbar-ir-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-light-sensor.description": "An analog light sensor can be used to detect ambient light, with similar spectral response to the human eye.", + "toolbar-light-sensor.title": "Light Sensor", + "toolbar-light-sensor.tryItDescription": "Change the brightness detected by the sensor here!", + "toolbar-motion-sensor.description": "Detects acceleration in X, Y and Z orientations. It can also detect 'tap' and 'double tap' strikes on the board and when the board is shaken.", + "toolbar-motion-sensor.title": "Motion Sensor", + "toolbar-motion-sensor.tryItDescription": "Change the acceleration here and click or click on the button to simulate a shake. The tap feature is not supported by the Device Simulator Express. If you would like to see the 'tap' feature implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-neo-pixels.description": "The 10 full color RGB LEDs surrounding the outer edge of the boards can be set to any color. Great for beautiful lighting effects!", + "toolbar-neo-pixels.title": "NeoPixels", + "toolbar-neo-pixels.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-a-b-push.description": "Two push buttons A and B are connected to digital pin #4 (Left) and #5 (Right) each.", + "toolbar-a-b-push.title": "Push Buttons", + "toolbar-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", + "toolbar-red-led.description": "This Red LED is connected to the digital #13 GPIO pin. It can be very handy when you want an indicator LED.", + "toolbar-red-led.title": "Red LED", + "toolbar-red-led.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-sound-sensor.description": "A digital microphone can detect audio volume and even perform basic FFT functions but cannot read it like an analog voltage.", + "toolbar-sound-sensor.title": "Sound Sensor", + "toolbar-sound-sensor.tryItDescription": "If you would like to see the sound sensor implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-slider-switch.description": "This slide switch returns True or False depending on whether it's ON or OFF and can be used as a toggle switch in your code!", + "toolbar-slider-switch.title": "Slider Switch", + "toolbar-slider-switch.tryItDescription": "Click it with your mouse or press 'S' on your keyboard to switch it ON and OFF!", + "toolbar-speaker.description": "This speaker can play a .wav file and different tones and also has a class D amplifier that is connected to an output A0 pin built in! You can turn it off using the shutdown control on pin #11 on the physical device.", + "toolbar-speaker.title": "Speaker", + "toolbar-speaker.tryItDescription": "Right now the tones are not supported on the simulator. If you would like to see tones implemented, please +1 the feature addition issue on GitHub! Regardless, you can play it on your device!", + "toolbar-temperature-sensor.description": "This sensor uses an NTC thermistor to sense temperature an calculate it with the analog voltage on analog pin #A9.", + "toolbar-temperature-sensor.title": "Temperature Sensor", + "toolbar-temperature-sensor.tryItDescription": "You can set the temperature in degrees Celsius.", + "toolbar-accelerometer-sensor.title": "Accelerometer", + "toolbar-accelerometer-sensor.description": "An accelerometer measures the acceleration of your micro:bit; this component senses when the micro:bit is moved.", + "toolbar-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", + "toolbar-microbit-light-sensor.title": "Light Sensor", + "toolbar-microbit-temperature-sensor.title": "Temperature Sensor", + "toolbar-microbit-led.title": "LEDs", + "toolbar-microbit-led.description": "The microbit has 25 LEDs for you to play with. The LEDs have 9 levels of brightness.", + "toolbar-microbit-led.tryItDescription": "Run your code and see the LEDs light up!", + "toolbar-microbit-a-b-push.title": "Buttons", + "toolbar-microbit-a-b-push.description": "There are two buttons on the front of the micro:bit (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", + "toolbar-microbit-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", + "toolbar-microbit-sound.title": "Sound", + "toolbar-microbit-sound.description": "Your BBC micro:bit can be programmed to make a wide variety of sounds - from single notes, tones and beats to your own musical compositions.", + "toolbar-microbit-sound.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-microbit-gpio.title": "GPIO (Pins)", + "toolbar-microbit-gpio.description": "On the bottom edge of your BBC micro:bit there are 25 gold strips, called pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", + "toolbar-microbit-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-microbit-wireless.title": "Bluetooth & Radio", + "toolbar-microbit-wireless.description": "micro:bits can use radio waves and bluetooth services to communicate with each other.", - "toolbar-microbit-wireless.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-gesture-sensor.title": "Gesture", - "toolbar-microbit-gesture-sensor.description": "If you move your BBC micro:bit in a certain way (as a gesture) then the micro:bit is able to detect this. It can recognize the following gestures: up, down, left, right, face up, face down, freefall, 3g, 6g, 8g, and shake.", + "toolbar-microbit-wireless.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-microbit-gesture-sensor.title": "Gesture", + "toolbar-microbit-gesture-sensor.description": "If you move your BBC micro:bit in a certain way (as a gesture) then the micro:bit is able to detect this. It can recognize the following gestures: up, down, left, right, face up, face down, freefall, 3g, 6g, 8g, and shake.", - "toolbar-microbit-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", - "toolbar-microbit-compass-sensor.title": "Compass", - "toolbar-microbit-compass-sensor.description": "A digital compass is an input sensor that detects magnetic fields. Your BBC micro:bit has an inbuilt compass that can detect the direction in which it is facing.", - "toolbar-microbit-compass-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-temperature-sensor.title": "Temperature", - "toolbar-clue-temperature-sensor.description": "CLUE uses the BMP280 sensor, an environmental sensor with temperature. This precision sensor from Bosch is the best low-cost, precision sensing solution for measuring temperature with ±1.0°C accuracy.", + "toolbar-microbit-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", + "toolbar-microbit-compass-sensor.title": "Compass", + "toolbar-microbit-compass-sensor.description": "A digital compass is an input sensor that detects magnetic fields. Your BBC micro:bit has an inbuilt compass that can detect the direction in which it is facing.", + "toolbar-microbit-compass-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", + "toolbar-clue-temperature-sensor.title": "Temperature", + "toolbar-clue-temperature-sensor.description": "CLUE uses the BMP280 sensor, an environmental sensor with temperature. This precision sensor from Bosch is the best low-cost, precision sensing solution for measuring temperature with ±1.0°C accuracy.", - "toolbar-clue-temperature-sensor.tryItDescription": "You can simulate the temperature in your code!", + "toolbar-clue-temperature-sensor.tryItDescription": "You can simulate the temperature in your code!", - "toolbar-clue-light-sensor.title": "Light/Color Sensor", - "toolbar-clue-light-sensor.description": "The light sensor uses APDS9960 and is able to return the red, blue, green and clear light.", - "toolbar-clue-light-sensor.tryItDescription": "You can set the color values of the light detected.", - "toolbar-clue-accelerometer-sensor.title": "Accelerometer", - "toolbar-clue-accelerometer-sensor.description": " The 3-axis accelerometer, can tell you which direction is down towards the Earth (by measuring gravity) or how fast the board is accelerating in 3D space.", - "toolbar-clue-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", - "toolbar-clue-led.title": "Neopixel", - "toolbar-clue-led.description": "The CLUE has one full RGB LED (NeoPixel) on the back of the device.", + "toolbar-clue-light-sensor.title": "Light/Color Sensor", + "toolbar-clue-light-sensor.description": "The light sensor uses APDS9960 and is able to return the red, blue, green and clear light.", + "toolbar-clue-light-sensor.tryItDescription": "You can set the color values of the light detected.", + "toolbar-clue-accelerometer-sensor.title": "Accelerometer", + "toolbar-clue-accelerometer-sensor.description": " The 3-axis accelerometer, can tell you which direction is down towards the Earth (by measuring gravity) or how fast the board is accelerating in 3D space.", + "toolbar-clue-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", + "toolbar-clue-led.title": "Neopixel", + "toolbar-clue-led.description": "The CLUE has one full RGB LED (NeoPixel) on the back of the device.", - "toolbar-clue-led.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-clue-a-b-push.title": "Buttons", - "toolbar-clue-a-b-push.description": "There are two buttons on the front of the CLUE (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", - "toolbar-clue-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-clue-gpio.title": "Input/Output (GPIO)", - "toolbar-clue-gpio.description": "On the bottom edge of your CLUE, you have 25 pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", - "toolbar-clue-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-sound-sensor.title": "Sound", - "toolbar-clue-sound-sensor.description": "The CLUE uses a PDM MEMS microphone. PDM is a little like 1-bit PWM. You clock the mic with a 1 MHz - 3 MHz clock rate, and on the data line you'll get a square wave out that syncs with the clock.", - "toolbar-clue-sound-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-pressure-sensor.title": "Pressure", - "toolbar-clue-pressure-sensor.description": "CLUE uses the BMP280 sensor for barometric pressure. Because pressure changes with altitude, you can also use it as an altimeter with ±1 meter accuracy.", + "toolbar-clue-led.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-clue-a-b-push.title": "Buttons", + "toolbar-clue-a-b-push.description": "There are two buttons on the front of the CLUE (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", + "toolbar-clue-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", + "toolbar-clue-gpio.title": "Input/Output (GPIO)", + "toolbar-clue-gpio.description": "On the bottom edge of your CLUE, you have 25 pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", + "toolbar-clue-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", + "toolbar-clue-sound-sensor.title": "Sound", + "toolbar-clue-sound-sensor.description": "The CLUE uses a PDM MEMS microphone. PDM is a little like 1-bit PWM. You clock the mic with a 1 MHz - 3 MHz clock rate, and on the data line you'll get a square wave out that syncs with the clock.", + "toolbar-clue-sound-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", + "toolbar-clue-pressure-sensor.title": "Pressure", + "toolbar-clue-pressure-sensor.description": "CLUE uses the BMP280 sensor for barometric pressure. Because pressure changes with altitude, you can also use it as an altimeter with ±1 meter accuracy.", - "toolbar-clue-pressure-sensor.tryItDescription": "You can set the pressure here in hectoPascals (hPa).", - "toolbar-clue-humidity-sensor.title": "Humidity", - "toolbar-clue-humidity-sensor.description": "The SHT30-D sensor has an excellent ±2% relative humidity and ±0.5°C accuracy for most uses.", - "toolbar-clue-humidity-sensor.tryItDescription": "You can set the humidity in percentage (%) here.", - "toolbar-clue-gesture-sensor.title": "Gesture", - "toolbar-clue-gesture-sensor.description": "The gesture sensor can detect directional gestures (left to right, right to left, up to down, down to up), but in theory more complicated gestures like zig-zag, clockwise or counterclockwise circle, near to far, etc. could also be detected with additional code. ", - "toolbar-clue-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", - "toolbar-clue-proximity-sensor.title": "Proximity", - "toolbar-clue-proximity-sensor.description": "The proximity sensor uses APDS9960 and is able to return how close an object is to the front of the sensor. This is a number from 0 to 255 where the higher the number the closer an object is to the sensor. You won't be able to translate this into an absolute value in units like inches or millimeters, you can only see how it changes relative to other values.", + "toolbar-clue-pressure-sensor.tryItDescription": "You can set the pressure here in hectoPascals (hPa).", + "toolbar-clue-humidity-sensor.title": "Humidity", + "toolbar-clue-humidity-sensor.description": "The SHT30-D sensor has an excellent ±2% relative humidity and ±0.5°C accuracy for most uses.", + "toolbar-clue-humidity-sensor.tryItDescription": "You can set the humidity in percentage (%) here.", + "toolbar-clue-gesture-sensor.title": "Gesture", + "toolbar-clue-gesture-sensor.description": "The gesture sensor can detect directional gestures (left to right, right to left, up to down, down to up), but in theory more complicated gestures like zig-zag, clockwise or counterclockwise circle, near to far, etc. could also be detected with additional code. ", + "toolbar-clue-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", + "toolbar-clue-proximity-sensor.title": "Proximity", + "toolbar-clue-proximity-sensor.description": "The proximity sensor uses APDS9960 and is able to return how close an object is to the front of the sensor. This is a number from 0 to 255 where the higher the number the closer an object is to the sensor. You won't be able to translate this into an absolute value in units like inches or millimeters, you can only see how it changes relative to other values.", - "toolbar-clue-proximity-sensor.tryItDescription": "Set relative proximity to the sensor in values from 0 - 255, where 0 means very close and 255 means very far.", + "toolbar-clue-proximity-sensor.tryItDescription": "Set relative proximity to the sensor in values from 0 - 255, where 0 means very close and 255 means very far.", - "toolbar-clue-bluetooth.title": "Bluetooth", - "toolbar-clue-bluetooth.description": "You can transmit data over Bluetooth to a computer or mobile device for data plotting and logging, or save it to the built in storage.", - "toolbar-clue-bluetooth.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! ", - "toolbar-clue-speaker.description": "The CLUE has a buzzer/speaker for playing tones and beeps.", - "toolbar-clue-magnet-sensor.title": "Magnetometer", - "toolbar-clue-magnet-sensor.description": "Sense the magnetic fields that surround us with this handy triple-axis magnetometer (compass) module. Magnetometers can sense where the strongest magnetic force is coming from, generally used to detect magnetic north, but can also be used for measuring magnetic fields.", - "toolbar-clue-magnet-sensor.tryItDescription": "You can set the magnetic field value in microTeslas (uT).", - "toolbar-clue-gyroscope-sensor.title": "Gyroscope", - "toolbar-clue-gyroscope-sensor.description": "The 3-axis gyroscope that can measure spin and twist users LSM6DS33.", - "toolbar-clue-gyroscope-sensor.tryItDescription": "Set the angular velocity in degrees/second." + "toolbar-clue-bluetooth.title": "Bluetooth", + "toolbar-clue-bluetooth.description": "You can transmit data over Bluetooth to a computer or mobile device for data plotting and logging, or save it to the built in storage.", + "toolbar-clue-bluetooth.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! ", + "toolbar-clue-speaker.description": "The CLUE has a buzzer/speaker for playing tones and beeps.", + "toolbar-clue-magnet-sensor.title": "Magnetometer", + "toolbar-clue-magnet-sensor.description": "Sense the magnetic fields that surround us with this handy triple-axis magnetometer (compass) module. Magnetometers can sense where the strongest magnetic force is coming from, generally used to detect magnetic north, but can also be used for measuring magnetic fields.", + "toolbar-clue-magnet-sensor.tryItDescription": "You can set the magnetic field value in microTeslas (uT).", + "toolbar-clue-gyroscope-sensor.title": "Gyroscope", + "toolbar-clue-gyroscope-sensor.description": "The 3-axis gyroscope that can measure spin and twist users LSM6DS33.", + "toolbar-clue-gyroscope-sensor.tryItDescription": "Set the angular velocity in degrees/second." } diff --git a/Source/view/tsconfig.json b/Source/view/tsconfig.json index 3bb77287f..28c6454e0 100644 --- a/Source/view/tsconfig.json +++ b/Source/view/tsconfig.json @@ -1,19 +1,19 @@ { - "compilerOptions": { - "module": "esnext", - "moduleResolution": "node", - "target": "es6", - "outDir": "out", - "lib": ["es6", "dom"], - "jsx": "react", - "sourceMap": true, - "rootDir": "..", - "strict": true, - "noUnusedLocals": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "experimentalDecorators": true - }, - "exclude": ["node_modules"], - "include": ["./index.tsx"] + "compilerOptions": { + "module": "esnext", + "moduleResolution": "node", + "target": "es6", + "outDir": "out", + "lib": ["es6", "dom"], + "jsx": "react", + "sourceMap": true, + "rootDir": "..", + "strict": true, + "noUnusedLocals": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "experimentalDecorators": true + }, + "exclude": ["node_modules"], + "include": ["./index.tsx"] } diff --git a/Source/view/utils/MessageUtils.tsx b/Source/view/utils/MessageUtils.tsx index 18adf5031..a9fcf9c75 100644 --- a/Source/view/utils/MessageUtils.tsx +++ b/Source/view/utils/MessageUtils.tsx @@ -1,12 +1,12 @@ interface vscode { - postMessage(message: any): void; + postMessage(message: any): void; } declare const vscode: vscode; export const sendMessage = ( - type: string, - state: TState + type: string, + state: TState ) => { - vscode.postMessage({ command: type, text: state }); + vscode.postMessage({ command: type, text: state }); }; diff --git a/Source/view/viewUtils.tsx b/Source/view/viewUtils.tsx index a210b8021..1335d039f 100644 --- a/Source/view/viewUtils.tsx +++ b/Source/view/viewUtils.tsx @@ -3,29 +3,29 @@ import { SENSOR_LIST } from "./constants"; // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. export interface ISliderProps { - minValue: number; - maxValue: number; - maxLabel: string; - minLabel: string; - type: string | SENSOR_LIST; - axisLabel: string; - value?: number; - onUpdateValue?: (sensor: SENSOR_LIST, value: number) => void; - step: number; + minValue: number; + maxValue: number; + maxLabel: string; + minLabel: string; + type: string | SENSOR_LIST; + axisLabel: string; + value?: number; + onUpdateValue?: (sensor: SENSOR_LIST, value: number) => void; + step: number; } export interface ISensorButtonProps { - label: string; - type: string; - onMouseUp?: (event: React.PointerEvent) => void; - onMouseDown?: (event: React.PointerEvent) => void; - onKeyUp?: (event: React.KeyboardEvent) => void; - onKeyDown?: (event: React.KeyboardEvent) => void; + label: string; + type: string; + onMouseUp?: (event: React.PointerEvent) => void; + onMouseDown?: (event: React.PointerEvent) => void; + onKeyUp?: (event: React.KeyboardEvent) => void; + onKeyDown?: (event: React.KeyboardEvent) => void; } export interface ISensorProps { - LABEL: string; - sliderProps: ISliderProps[]; - unitLabel: string; + LABEL: string; + sliderProps: ISliderProps[]; + unitLabel: string; } export const X_SLIDER_INDEX = 0; diff --git a/src/adafruit_circuitplayground/__init__.py b/src/adafruit_circuitplayground/__init__.py deleted file mode 100644 index b4bc33da8..000000000 --- a/src/adafruit_circuitplayground/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# added compatibility for new import structure in CircuitPython -# https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/pull/79 - -from .express import cpx as cp diff --git a/src/adafruit_circuitplayground/constants.py b/src/adafruit_circuitplayground/constants.py deleted file mode 100644 index 2c47a919d..000000000 --- a/src/adafruit_circuitplayground/constants.py +++ /dev/null @@ -1,78 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - - -class EXPRESS_STATE: - BUTTON_A = "button_a" - BUTTON_B = "button_b" - ACCELERATION = "acceleration" - BRIGHTNESS = "brightness" - PIXELS = "pixels" - RED_LED = "red_led" - SWITCH = "switch" - TEMPERATURE = "temperature" - LIGHT = "light" - MOTION_X = "motion_x" - MOTION_Y = "motion_y" - MOTION_Z = "motion_z" - TOUCH = "touch" - SHAKE = "shake" - DETECT_TAPS = "detect_taps" - - -ASSIGN_PIXEL_TYPE_ERROR = ( - "The pixel color value type should be tuple, list or hexadecimal." -) - -BRIGHTNESS_RANGE_ERROR = "The brightness value should be a number between 0 and 1." - -CPX = "CPX" - -INDEX_ERROR = ( - "The index is not a valid number, you can access the Neopixels from 0 to 9." -) - -MAC_OS = "darwin" - -NOT_IMPLEMENTED_ERROR = "This method is not implemented by the simulator" - -NOT_SUITABLE_FILE_ERROR = ( - "Your .wav file is not suitable for the Circuit Playground Express." -) - -PIXEL_RANGE_ERROR = ( - "The pixel hexadicimal color value should be in range #000000 and #FFFFFF." -) - -VALID_PIXEL_ASSIGN_ERROR = "The pixel color value should be a tuple with three values between 0 and 255 or a hexadecimal color between 0x000000 and 0xFFFFFF." - -ERROR_SENDING_EVENT = "Error trying to send event to the process : " - -TIME_DELAY = 0.03 - - -EVENTS_BUTTON_PRESS = [ - EXPRESS_STATE.BUTTON_A, - EXPRESS_STATE.BUTTON_B, - EXPRESS_STATE.SWITCH, -] -EVENTS_SENSOR_CHANGED = [ - EXPRESS_STATE.TEMPERATURE, - EXPRESS_STATE.LIGHT, - EXPRESS_STATE.MOTION_X, - EXPRESS_STATE.MOTION_Y, - EXPRESS_STATE.MOTION_Z, -] - -ALL_EXPECTED_INPUT_EVENTS = [ - EXPRESS_STATE.BUTTON_A, - EXPRESS_STATE.BUTTON_B, - EXPRESS_STATE.SWITCH, - EXPRESS_STATE.TEMPERATURE, - EXPRESS_STATE.LIGHT, - EXPRESS_STATE.SHAKE, - EXPRESS_STATE.MOTION_X, - EXPRESS_STATE.MOTION_Y, - EXPRESS_STATE.MOTION_Z, - EXPRESS_STATE.TOUCH, -] diff --git a/src/adafruit_circuitplayground/express.py b/src/adafruit_circuitplayground/express.py deleted file mode 100644 index 7f2857508..000000000 --- a/src/adafruit_circuitplayground/express.py +++ /dev/null @@ -1,215 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -import json -import sys -import os -import playsound - -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent -from .pixel import Pixel -from . import constants as CONSTANTS -from collections import namedtuple -import common - -Acceleration = namedtuple(CONSTANTS.EXPRESS_STATE.ACCELERATION, ["x", "y", "z"]) - - -class Express: - def __init__(self): - # State in the Python process - self.__state = {} - self.__state[CONSTANTS.EXPRESS_STATE.BRIGHTNESS] = 1.0 - self.__state[CONSTANTS.EXPRESS_STATE.BUTTON_A] = False - self.__state[CONSTANTS.EXPRESS_STATE.BUTTON_B] = False - self.__state[CONSTANTS.EXPRESS_STATE.PIXELS] = [ - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - ] - self.__state[CONSTANTS.EXPRESS_STATE.RED_LED] = False - self.__state[CONSTANTS.EXPRESS_STATE.SWITCH] = False - self.__state[CONSTANTS.EXPRESS_STATE.TEMPERATURE] = 0 - self.__state[CONSTANTS.EXPRESS_STATE.LIGHT] = 0 - self.__state[CONSTANTS.EXPRESS_STATE.MOTION_X] = 0 - self.__state[CONSTANTS.EXPRESS_STATE.MOTION_Y] = 0 - self.__state[CONSTANTS.EXPRESS_STATE.MOTION_Z] = 0 - self.__state[CONSTANTS.EXPRESS_STATE.TOUCH] = [False] * 7 - self.__state[CONSTANTS.EXPRESS_STATE.SHAKE] = False - self.__state[CONSTANTS.EXPRESS_STATE.DETECT_TAPS] = 0 - self.pixels = Pixel(self.__state) - - @property - def acceleration(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_ACCELERATION) - return Acceleration( - self.__state[CONSTANTS.EXPRESS_STATE.MOTION_X], - self.__state[CONSTANTS.EXPRESS_STATE.MOTION_Y], - self.__state[CONSTANTS.EXPRESS_STATE.MOTION_Z], - ) - - @property - def button_a(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_BUTTON_A) - return self.__state[CONSTANTS.EXPRESS_STATE.BUTTON_A] - - @property - def button_b(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_BUTTON_B) - return self.__state[CONSTANTS.EXPRESS_STATE.BUTTON_B] - - @property - def detect_taps(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_DETECT_TAPS) - return self.__state[CONSTANTS.EXPRESS_STATE.DETECT_TAPS] - - @detect_taps.setter - def detect_taps(self, value): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_DETECT_TAPS) - value_int = int(value) - self.__state[CONSTANTS.EXPRESS_STATE.DETECT_TAPS] = ( - value_int if (value_int == 1 or value_int == 2) else 1 - ) - - @property - def tapped(self): - """ Not Implemented! - """ - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_TAPPED) - utils.print_for_unimplemented_functions("tapped") - - @property - def red_led(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_RED_LED) - return self.__state[CONSTANTS.EXPRESS_STATE.RED_LED] - - @red_led.setter - def red_led(self, value): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_RED_LED) - self.__state[CONSTANTS.EXPRESS_STATE.RED_LED] = bool(value) - self.__show() - - @property - def switch(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_SWITCH) - return self.__state[CONSTANTS.EXPRESS_STATE.SWITCH] - - @property - def temperature(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_TEMPERATURE) - return self.__state[CONSTANTS.EXPRESS_STATE.TEMPERATURE] - - @property - def light(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_LIGHT) - return self.__state[CONSTANTS.EXPRESS_STATE.LIGHT] - - def __show(self): - if utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - self.__state, CONSTANTS.CPX - ) - else: - utils.send_to_simulator(self.__state, CONSTANTS.CPX) - - def __touch(self, i): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_TOUCH) - return self.__state[CONSTANTS.EXPRESS_STATE.TOUCH][i - 1] - - @property - def touch_A1(self): - return self.__touch(1) - - @property - def touch_A2(self): - return self.__touch(2) - - @property - def touch_A3(self): - return self.__touch(3) - - @property - def touch_A4(self): - return self.__touch(4) - - @property - def touch_A5(self): - return self.__touch(5) - - @property - def touch_A6(self): - return self.__touch(6) - - @property - def touch_A7(self): - return self.__touch(7) - - def adjust_touch_threshold(self, adjustment): - """Not implemented! - The CPX Simulator doesn't use capacitive touch threshold. - """ - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_ADJUST_THRESHOLD) - utils.print_for_unimplemented_functions(Express.adjust_touch_threshold.__name__) - - def shake(self, shake_threshold=30): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_SHAKE) - return self.__state[CONSTANTS.EXPRESS_STATE.SHAKE] - - def play_file(self, file_name): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_PLAY_FILE) - file_name = utils.remove_leading_slashes(file_name) - abs_path_parent_dir = os.path.abspath( - os.path.join(utils.abs_path_to_user_file, os.pardir) - ) - abs_path_wav_file = os.path.normpath( - os.path.join(abs_path_parent_dir, file_name) - ) - abs_path_wav_file = utils.escape_if_OSX(abs_path_wav_file) - - if sys.implementation.version[0] >= 3: - if file_name.endswith(".wav"): - try: - playsound.playsound(abs_path_wav_file) - except: - # TODO TASK: 29054 Verfication of a "valid" .wav file - raise EnvironmentError(CONSTANTS.NOT_SUITABLE_FILE_ERROR) - else: - raise TypeError(file_name + " is not a path to a .wav file.") - else: - raise NotImplementedError("Please use Python 3 or higher.") - - def play_tone(self, frequency, duration): - """ Not Implemented! - """ - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_PLAY_TONE) - utils.print_for_unimplemented_functions(Express.play_tone.__name__) - - def start_tone(self, frequency): - """ Not Implemented! - """ - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_START_TONE) - utils.print_for_unimplemented_functions(Express.start_tone.__name__) - - def stop_tone(self): - """ Not Implemented! - """ - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_STOP_TONE) - utils.print_for_unimplemented_functions(Express.stop_tone.__name__) - - def update_state(self, new_state): - for event in CONSTANTS.ALL_EXPECTED_INPUT_EVENTS: - self._Express__state[event] = new_state.get( - event, self._Express__state[event] - ) - - -cpx = Express() diff --git a/src/adafruit_circuitplayground/locale/en/LC_MESSAGES/express.po b/src/adafruit_circuitplayground/locale/en/LC_MESSAGES/express.po deleted file mode 100644 index 50579af3a..000000000 --- a/src/adafruit_circuitplayground/locale/en/LC_MESSAGES/express.po +++ /dev/null @@ -1,26 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-21 13:35-0700\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: express.py:190 -msgid " is not a path to a .wav file." -msgstr "" - -#: express.py:192 -msgid "Please use Python 3 or higher." -msgstr "" diff --git a/src/adafruit_circuitplayground/locale/express.pot b/src/adafruit_circuitplayground/locale/express.pot deleted file mode 100644 index 50579af3a..000000000 --- a/src/adafruit_circuitplayground/locale/express.pot +++ /dev/null @@ -1,26 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-21 13:35-0700\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: express.py:190 -msgid " is not a path to a .wav file." -msgstr "" - -#: express.py:192 -msgid "Please use Python 3 or higher." -msgstr "" diff --git a/src/adafruit_circuitplayground/pixel.py b/src/adafruit_circuitplayground/pixel.py deleted file mode 100644 index 22fcfc8ae..000000000 --- a/src/adafruit_circuitplayground/pixel.py +++ /dev/null @@ -1,133 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -import json -import sys -import common - -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent -from . import constants as CONSTANTS - - -class Pixel: - def __init__(self, state): - self.__state = state - self.auto_write = True - self.telemetry_state = False - - def show(self): - # Send the state to the extension so that React re-renders the Webview - # or send the state to the debugger (within this library) - if utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - self.__state, CONSTANTS.CPX - ) - else: - common.utils.send_to_simulator(self.__state, CONSTANTS.CPX) - - def __show_if_auto_write(self): - if self.auto_write: - self.show() - - def __getitem__(self, index): - if type(index) is not slice: - if not self.__valid_index(index): - raise IndexError(CONSTANTS.INDEX_ERROR) - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_PIXELS) - return self.__state[CONSTANTS.EXPRESS_STATE.PIXELS][index] - - def __setitem__(self, index, val): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_PIXELS) - is_slice = False - if type(index) is slice: - is_slice = True - else: - if not self.__valid_index(index): - raise IndexError(CONSTANTS.INDEX_ERROR) - self.__state[CONSTANTS.EXPRESS_STATE.PIXELS][ - index - ] = self.__extract_pixel_value(val, is_slice) - self.__show_if_auto_write() - - def __iter__(self): - yield from self.__state[CONSTANTS.EXPRESS_STATE.PIXELS] - - def __enter__(self): - return self - - def __repr__(self): - return "[" + ", ".join([str(x) for x in self]) + "]" - - def __len__(self): - return len(self.__state[CONSTANTS.EXPRESS_STATE.PIXELS]) - - def __valid_index(self, index): - return ( - type(index) is int - and index >= -len(self.__state[CONSTANTS.EXPRESS_STATE.PIXELS]) - and index < len(self.__state[CONSTANTS.EXPRESS_STATE.PIXELS]) - ) - - def fill(self, val): - for index in range(len(self.__state[CONSTANTS.EXPRESS_STATE.PIXELS])): - self.__state[CONSTANTS.EXPRESS_STATE.PIXELS][ - index - ] = self.__extract_pixel_value(val) - self.__show_if_auto_write() - - def __extract_pixel_value(self, val, is_slice=False): - extracted_values = [] - values = val - if not is_slice: - values = [val] - # Type validation - for v in values: - if type(v) is list: - rgb_value = tuple(v) - elif type(v) is int: - rgb_value = self.__hex_to_rgb(hex(v)) - elif type(v) is tuple: - rgb_value = v - else: - raise ValueError(CONSTANTS.ASSIGN_PIXEL_TYPE_ERROR) - # Values validation - if len(rgb_value) != 3 or any( - not self.__valid_rgb_value(pix) for pix in rgb_value - ): - raise ValueError(CONSTANTS.VALID_PIXEL_ASSIGN_ERROR) - extracted_values.append(rgb_value) - return rgb_value if not is_slice else extracted_values - - def __hex_to_rgb(self, hexValue): - if hexValue[0:2] == "0x" and len(hexValue) <= 8: - hexToRgbValue = [0, 0, 0] - hexColor = hexValue[2:].zfill(6) - hexToRgbValue[0] = int(hexColor[0:2], 16) # R - hexToRgbValue[1] = int(hexColor[2:4], 16) # G - hexToRgbValue[2] = int(hexColor[4:6], 16) # B - return tuple(hexToRgbValue) - else: - raise ValueError(CONSTANTS.PIXEL_RANGE_ERROR) - - def __valid_rgb_value(self, pixValue): - return type(pixValue) is int and pixValue >= 0 and pixValue <= 255 - - @property - def brightness(self): - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_BRIGHTNESS) - return self.__state[CONSTANTS.EXPRESS_STATE.BRIGHTNESS] - - @brightness.setter - def brightness(self, brightness): - if not self.__valid_brightness(brightness): - raise ValueError(CONSTANTS.BRIGHTNESS_RANGE_ERROR) - telemetry_py.send_telemetry(TelemetryEvent.CPX_API_BRIGHTNESS) - self.__state[CONSTANTS.EXPRESS_STATE.BRIGHTNESS] = brightness - self.__show_if_auto_write() - - def __valid_brightness(self, brightness): - return (type(brightness) is float or type(brightness) is int) and ( - brightness >= 0 and brightness <= 1 - ) diff --git a/src/adafruit_circuitplayground/test/__init__.py b/src/adafruit_circuitplayground/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/adafruit_circuitplayground/test/sample.mp4 b/src/adafruit_circuitplayground/test/sample.mp4 deleted file mode 100644 index ed139d6d50cc43f89c27392621f20d174d0bf051..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1055736 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

Aa@|$FDt-+LPp7ZlZYEj+U-s{? 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⁣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%0DXThCjUf28ZIq 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≫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

l{J&)}YQ*vBn(G1ylxHzv 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

^>&uqp0SB(s(nZAP%Ox2{`ej2 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

QHULVySZ}#~PuWJ^7tmFuh?r7A2=*(e)d45vEW8 zEPEUcCCcU=)~jdnN|8@*$U3?5ZP97f_+qg& z#v=8(o_Ut*F`m2(;W@_FOEu7yW1{C9@XHeHxF%&+(bJjM&$ej7r3H$REfm%8BzG4t z!@sE1rDfr0xtgs1E||jAH1$mOy=#xs>cHsqJv}A-`mdLBwu__NN69YZa1UKL)3z14 z7R<4)E8e$$w)^}$p+5*NaG zwA}2_K^+Mo!zkEeif`VFS4}~EG5-#GQmuO)SnZH=b>phP3^{p&VYL-6t`Y&!LWHDY zWc4#>02}P7)Mu3O;f0AM&C=vCR_lwXN^~)1hk5BnfUEiQKy+d%$?&8#ftLVnK$5>) ztL>5}!4WkLd0m7QrzuxZ41zI7j^HA#jb(d!t9Mn@;QB!QnB!X{bRIKW_bvm%?SK zXUZD8YDK~gH+H(~5k6c?AZ~CJEVKDcxDeo9h}q{VSD-17KTtfU;@$j7SQnSE6UWz- z)XBeem7wm}$Z@c4Ue^}X(f}rmy48Jy5?UFsaayuxK&Ystsdxx3ybfu%hSEgwpdJ{# zKrqo8E>0-q3nxbXB2@IfA^0zBI4yB1Uy7IBz`#_E7B_xDohTJh(O!C=z?nCKw@R_` zk{0`vzJ7a<`oJdI&%jeBQ5T`iugx9IJC2A34Xelv?Lxkkfhv>+_T_z9vOd`z1r`k# z<%t3*E3Kfo(lTM&4_*P#o+*QwRCnK8D`UJ{H{|HGF* zPm_QuzBZJM-Faztxg4F!n;20{NZOHqL$mJzWgs~2r<bd+`{suP~J}S7%*A z1N{7;XglM*K)C+&zHPwq2yu4;-vl*zXZ_wem;on9AhX-Wl&N*y-nZ$FseVNaIi;9# z;aiM@<7fLXJ@7`H%eTohsA*<@#zNbvQDeZLLL=7pynrVLhZrmcsoQAMPz*Wmyb)1e zm*09hb67JV|JR6jaxPZD!D2aHJqqm4bWRs}wYm3>M{WP2^zl=V2o6lP$6++3 z1`#o{T#!7SrS@8VO)l^?guYUkjy}GRsB-&y$>vM`biWeRDDC}?XlDY=h^8y+>yf%g zQSIWWRadBd1hajBiwT8ln8m5}F8MOk4)vq-abkv_i7a(FQ~gHBTGHUC#}kAUnGOml z3*r_*(Js~RaTjwuonqs)D${Hm8nBeC^~Y7Y|H9l<&aXf$s6K*#znT(lD|9T*S&)&3 zGPMucwLIMo*c_BOgxV7H5YORqRaRqe9#+wuP>N2NV<{>j6D_-)-8V3agB;5T{l{q< zqLjeAqraY`tAOq8KB7LZ3;2uT|VsqQqV|w)k|i)+p(HT1@uFL z`P`nFCE#BrWiqaSQH$u~Y%AdY=&<8f6dI{%nqxSe(#asN6zfFh1^V!fB6mWGVC4xz z#Y@d52Z01>If>I} z@qD(TNP=%GMS&oc8k2`Nz+36s^w4uRvfP!>V774gQ47(b{kqr=V-67q)U*d_co z-ibz2bSf`-Lpd>Cg-$96x}hJKD{eM>hG6(My%D^VyV)%|MHn(ULY8eqmw+~3uZ_z8D5l&V`lSPlr5zx> zDIMca`>9@yN1aC&PPi3=E}Z6sL#mqkckR#_RNLBsA?-eZTF|Q59xY@x;GsBeVPDB6 ztMmPK+4P2H8D2j05EMa=R5mWgbI0ekA_?+_26`ir0NvjA`%=?kDk%E?$qsf6tNEIx zExnJ2MwBh#Lhzoc#01@VB<|JNkUX$+<@U=8e-p={Tr%mh1(OlM<66K;w)X{tFAe&Kq$ct#G&$~HjHIYDRwA7Rmft$C z*IP6cU?QPIV>_y$(sLTo0-r!(Mu^LXqA=KAfdmaj1Uq9TsRb1E$l?gChQ-dy%JB7` z?|7}C(h_1fJ{lGGIrwJx!P);~vuZVaAG7eSly9Y-iuZW}=-htJK~F#BnFvAWWfVj| zWXVhSFp-~&C!9qL7peN_q_~O_MI^;Q)*g`;=zlB8iMUR^ovr z7)MU8;RSv_vpOvCLFd-sJHl{Dyg1PCc!Vd%%2^B9o>DwUTQQDzav zg8z_TwxtQC7N z!~4MPr`}{7I1^Hv$UjlC&Ea+;>!kdWt#mp~5gdv}cbuhmHOO<~vMAh`!YYvkTEz`_ zP>ESVeZucf#jGFRy^rTg9W11Z>NGPkP3k&51bsR|(Oqi0uuB#1IV6>`@F3V zFM~hlDHB*y!59mmi|;iTB*5rt14!i%b`Raf(iDusVI4FCcM@}8^7vrhA128))&P5V zxhkI^e{T=3v0G96ImS;bUErD{KPl=@pc*^b0K0iqt#HtSHP!r7? zDNqlKGIguG7N0^L&i_b1u0`9beB(5I{Wi58TkTNz%OKouRB+50Fj7z0qPN6;@o1B6 z3IM#<cM>!vj?MI3%qMX&)ELV1kE6y)g3gXgQ_9ijBB^1oM z_)h_OGX^{sG$h-k!$q1XwCpYAPW1O1!M8_?`i3NJ0U!{PIY3IByeRLJya=_CvJFIr z2bd6Ddm9>aEFOjn(~d;=D9kC0+8c)aU`X7GV7?!Jlxei*U!aZ&nUDHvBe!9<6V4E; zBzV7kEI)WhD0E};6wqe3bGFqNMom#LKIX-6CbOwNOBW=!MWNPC{39XIWs%ueK?*-)#BbuK&+{BQJq*P>z3!niGnf}Z+Fj=Bf^Q7LJ zyXZ>*$r7nDOsEvRAfJ4rS0hZnKv=(ciN?vPYBXE+*(GeE{tR215K6S}nn;S(&OC~8 zIV8#z1WSS$F<#FBZL`#eKb|MY)52+G-8me4&qG*X0@&j{OOKbLEU7w{Onifo>ah1- zCv~{iTr!2PI;pb9+_$Z5QLt;TO@+>*IAX6Bsvs!biLJOO@IR!>y3u~kmi$@q<@iT73KD|Ebq->M&-1^ z9-B2Mxt1zTW$N9gnw)ubbyJ+c8Um-m_y0p>YWk8u!9xqZbWHDE39^{lRb_6i@hTX9;?*=tt zku9Y{^cS+9@rB`__=i+Lh2wd|xo{MTBRlqu6x(4Q(s1KgHWNMZ`a$|SYpVFPXyH#W zyDG0ME#w4o-?{^<&_h5?+9s1IlbfY1T=0CpfEEYgKVnv^P6IGy>N@clztr`qoi ziP#HLD%UUdCZn9>M|Tuk7Jd3X0$hL|)^DT)-A2x@oXfHr!(C?L!miZ>v&!99H>D;R zdjQ}yv^x-l*8qAtiXy?dwF{({psWX>&VW7M&axx80muVea0|V46LE1u8b8fLR+FS7 zOxl7**CQQ(!C-Y8%pB)?-eq3);EQTTUs?k-%T-T1?8=8))75i_c(m& z=ce@Jn{2!ijeMznX}0=LY3sHXMXI;x4g3OngP+`m}5&4 zzWzWyE`69|IRrfb*a-p11%QwqpcVj)EBmKD*`sEh7ATW7j;~Z8?#C+z$DWoHvg+RI z7mcGH$XE*CLAhQDFEW6O` zG~SS}x%ag#4(%$Z@-c>DZDzLRid)4F>UBve3NIkfSiY2KDlA(DhnsKv5?fb8n^iS2 z=fbFH%c@;k)T$+bt$-pBDaVL+6X*3fCq`;$*&~uh>1ip|?JVQaYjk7(yPPHV~#WTiL zOtCS88i@!6P07_z}PX3Yq@QHZWQtQsYu@O||5B z`T1Be^n~N$ll>U^p#c2y#>YCt>nM2GLVr!_TK)LzJ;Y6YPf*!0q6m+83FA9%m-is6wmMf!rG$^o0TqB;%5_`ENHr7 z*n%H^+`j+w(Uy&oIsxnD^llXy+Mr;Ix7wI0$3?>zfy1Uw6Oh18r^4QcaVO1 zFqPGV{8ukg$wzcP#+;=f)lRJ$Kr{96Y+}%QLxuCc`dfyAU*imiY(@${5@)R0i2|+$ zS&IhOJq>Om$L)XwmbyOExCP`--&$fW9`~$6^83f5{35 zZqbY^JmpMaf}o5OeMU6f?{np^n*3Osr+zSx;(}4?6a3-PDq| ztc^~#xx+Pa2CC;8-*lzbT>vV03!+yg;Ue*882${e3SHwLk}zYvF;#G!YfBXK&|YQ(qKj?ITh!Y!_s;C^58VJ2XUFuaPdd>hks|vwL z0^~eNQjM-FVslaU@FqA|h|?h);T~|V5R}>x#ao6zY5@)YP=*fv=S|No&_c9VBGlRZ5{pCdXrFGUj47 zUmI9X!vRYJNU#hXp2s5?1Dedt>g8cBbk3OtR=wvfTQ#cDrL0ZXHI>F@#+j8L0b$h2 zrX&!7aGXQ~oZKj)7qZCcdxh(!?DUPjx2fHAWtm6?2c<%k1QSEp%A`SgF@;4@8`&+; zfHgsg6<}f!07UQxv#?POXjCL{1-OJpBywPT84TZS!KDp~5G%P$yB$LTTTReTzku6u zR;-tBcy`d0Lm2lIHeMIYlbu=Hc0SlITer{Xy=#wY0KkM-cesL8rJ${L2dE266UJ(Q^m;A( zOmu@w@L?5+KsXeA7cFGWml=^JqgrOmU^VrGUh}P zX~i8QT6!vf91)O^?jd2B+Kd6!mgyl0^n+1VCf zFwTwhnutWm)_}N~5hgi6(Y6jC9=J%OjNJ9hiR7qhNk|yLvj%gu$+VPFv<#rq`gk&J zfE%8cMAg-UC3X)d&UH4J%@`l9zUj;+u)ieO$+y zvMso>6szgZs1V6;SJOjx51*R*b|XUgy}*asnPto$r&(-~Z!_KK^x9UV#wR-fh20kT z$z>}f)-fp5q6bB$x{Y_Mgq6bnO-2L|wsGAoaK6h38nM|_a_xCaPRho(K2uajDUm}; zQW~+8Lr}T@ll$)98WM-)*__ROnPS9sRh_rXl*O&*bvQXl)&)8Q7Y08xyM>S8+dR>< zTv`YQbk(RQC%q0}jmv_M0@ZL{Snml|k<;4VMc-PT@1`1EW+tF9`t08|xY(vv3Tn!C@lj{90XADPykKADbH~ z$-3S%vY}}j^+CBuN+A2-hEe|S+`^lS?Jn(w7B5H^rC059iR|;#a*-f$oAMrbB@W}; zg42`e6Vd_+X~$1!u0O*x{EUu-Il=fxI}^S7upxv8F5dvVwLW<>M7_mN#Xk+V7DT50aGiB2cXZ82 zZ9i_fX)Cd!TBX{4?p~G|OOxogN!QBYUE|u~-fBW2zP3>0L7+VEE-Y9;C5(do*Mpr8 zpm(t6ZBxfC<`XJQm_4@_lUYOq(i{p?wrAw$Q8k<>+UBJ11jN`5Yb#2&D&vEAlE^O~ zlv6TgLk)>Cf}}jI_rZN}RzZgk0B7{DR0appSDlza#m)^CJ3h90YLILu1MfHsUMO}{ zKoR!_>k9}E`(OAIO$XanUcMj8v52!~dz5jcwIOC;ntIQv80My-zjtV1oca0s=|;R6 zYPFs!+YCzMB=qlsCAu3)uUn;B$$Pzv+NY|OL-q1OyRKG#CD=J4v0h(Y{*q4N_7M{p zcyL|^$6!rugf1Mdhcsh=<0QW5Rp8H&lyHB%aAA|{ONO02HF23l#<89(W^f5jhZIj59J9N3+uO3QZ@Caj$?G;iC^nE zr6$dO%=la_X$WpqhTE{xO;+vIa>m0F2mnkq(1QD-KKqVSJkw^<`n~yJoUe}^>@W4i z`Rm3NQJZ+7JYLkvTxeOQqCeC-m0#>F_PkE{5qcf?<%&Ne;?y}t9UFp%9V5~sOGr>u z$x=Y(Voo*e0(ZH#Q(89xoH+K_k~dKu#uzkA@h1hQ;nn^fj3?-a$zTM6LFBzF6mzTP zHWPgEeW3fh(~pb~mfbpk4RcRX66*%Zw9|3z{=9aZ?(>r8BM3cj=h&E?TM2_>ZVbIj zH-jToObKS}EQ$cq4=TX`fg ziCu@`>rd@rWEysnV5ak`9D<&N!XhZdI_He2yI|REz`lyHM+a)7;AT&9RH4sR@#A$=HJnmQ0gPG0? za)jf9L|_#isrO6L$yXZp-!*Pb8vTelQ7+Ou4kKRHyQHV(OzYh0t%B(cYOsZdLaWm?d|H2saF-9#P6ihS1%zJ-H#;F1+i(w zGT9^&4s9p13kyqqyVd796U5tvtO4N^)Q^1ZT6z@QyClUKKbL5{MAZW@P+huslR5ue zKOdyb{$rc{R5oWVayBFJ-35eg*(O=m$H@?pb1yNT8Hd&CZt=%vl!Xr?NUlT)BJ9C9 z7A^%BIU|_OytemL+#%k@R8Kc4ILE0X)%1+XS$De<$@ZbSg1F2s>fjAKq_m^ysnQSx z&+;m;(tJhcgxZ--!0|lOrgNFI)15k{#a~u>()I7O;9q2V2NHqNcDr&ojnb|JrzA#E z^1eltTeN7O{~((l?X<`c;H`U;voco4($SpyjduQMg`1fSFYslA=E}Y4cdOWqoFA7}qFFun@^F$BKJzmG$e#!)#fb^zItN zaX3=(;5KC!g=sMEb}f zaW%@PKTSHYG)>pLUTSaeP&Zo$H<#$2i2kfp;EY~8nyB^&wyB}mIG zps*f6-~d68(`O_4APy03ORUW6xJPv}n?7av8L53L@)5fpL{D6ne9}(P$lzA#nnw9P zov|~K&t)s3PxA-`O0pf~(IHQ%rv1A)J8c?nqTFNNvq=;jbMKkts09lEs)!we8(SCc zTCwIxbf7LaLkpSn4pX@Md8kig9N<3MdJ;-vmXFQ~D+F$TRM`tR3# zNr_2JIwmwj0S2}7eBdT+AEEnxrW1>}Gp94}AO4DjGxpMr5*$!$0A=HC- z199;tHx$%l19-Q%>+eW%kOe5q^l#=OhE5B>NZFuA(wx(-72;eK{83_XY4PFLKQ7&F z9Ynf!b!lsjOC0HuK#6+vbk;0e$o^X}-gwln#v~!kOSnnM_nLUDjARWC$R_*45RSAV zIb?Ra{f3u&P`=(Ir7D*?b>G~#lQQ`T+41)!R?eoax)qvpH>06lwd)HVNXZ6z%cqWr zpBhRJTg7V!T1(o%G6UKjOH&l7^9&Li0E8o7=x<9$d88mbFFV{73T!N7*_%2S0r78g zDdD?kD>ZlB!jq)_A2(DGxLsTf+a$ZcarQZRs2)#916T)rCE8pqISf9gx>NW+Vrfo- z7dy%MlxE52!Vy5agHB@MQ?42$@At>@@Y{N0s~w#qqZskt2HKK5E`QCbqlS08x9LDQ zkKd55CQL`^4trbGp$;V)h9lKlE!ouDS#{m3dYOWh#E`cWUl)5K)eMbxG@+vj{llr)~xq7AaI&ZMaU zO4s3`EJ{n)1|_Vdo1ZUFr9DLQ1NN2~+^rFqjPVt`zZKDXG7Cy*_Q!MNezp&BGq-WK z>{A@O0vOgWK#6r7A_7lw3u?_|zI!<=!9|z5) zMU%=&n78P6Uuh=gPi=ZD?9N=GN~whn2<1|)ltGn|1J~u3TnqxxjpQhAB;X0*BA&Ze z=|?vL^9LTadM!2l_Oa^-6r@Ou$$%Fp4d4wqZh7cXPgU!eVeom+HEOeEF62NSTf$yVY#U8wHOY>0lFVBA9Y{ca z%pwpLk8GCG&ZMI2s9|~zK|G+%G3=d)$4v#`dlN+an2^0t(U>N`LQ#UHBXC_?l8h7L z!i+>?#+4}mKxdBWP#JB%_rA9AA0h>+!U}XSmk?)GuTKIY9K;|iJrN{)8w<2hfPh4- z+b5VwQ4G%@&tGW7=<=EbXFUqLx8*IpZJI2fjef8V;bdWiwiOG|C%&S=-|T03JMvL3 z^m(s<1*_iFx9p?&5c0$RUJh5<7R;NOhnaHkz7;IsC3dwY5)-ePFgJpLWgd-g8EjK` zE7F#^$xG1xCw+p9L0>mbW+x6q7vI zc``nMZXYs=mFxfmzhcv9nYEKmK^J{jL{n!pYd0-fo>owUjlgM4^tKHb z`~k-UBUj<_1hwjDsyO8#7`Zq|3yDoWKZj*j?PEpJ5ill zx~S(ya#2TJ7h_jGFMW``)zbVbo;u{9Ct!!X)@!r-@JO!70}@mqjoUWDrbncfnKm7x z@qu@&`L?zX{I;girx*k|toXN~(`#X@TL3TKq6v<5Bxi!#h7cjsy&i)Ag9T1p z-F#Qo1A3y|fBzu8o_0LXP2a!YFt*7zxCh#Odx!PQW&i&|xt1P`yW;t3Fd;sy1DpZ( zi+eGNo96h+tioL9JvKC3BqAf z2@E0^cbBGLJaKd1%$a?7rF5jK&Nyv20eW|&xcG0|ewse_YrY>>wkxmA^ckM%@qO_N zyCy0nE!MO0#usdryO!>55#1xD;WVB7Eqs*|@-H*A{rr4=5A1mci0B|;0HO1({w@we zww18;Vr@sNtelze@gh>n}R3l)3Ng z`X=!hAVq-Bmi8BmhOA$;LCfEHmZqn(PZm!L;{1Uo@R~Wu`&OTAC<78>akA&O5+KH5!}s&J(D$qOa&^(~c_2?b+@S^|7g z_xC8l*7pc{90`j7V?bEw77_@ACjhH_YB%-i6ouksS{hnRfHyMdEq#|l)YL!X?)H5; z^?QHQ^3*PbR6Hr+KbNSj`VO0F$-FE-i{2k8sUvi-q>BLV=90TvV} zFggqgiveZGSSS_>3BrM3phzkb8HFV^*Ev!m*=UuTsFcq=>ZNc$n_m62c2m50=j$zJ zYt_5|dc8fKT^@USwRd?nXH}BlQFdSbq;3)F+!pm))U$B6Mpve~TsMBahTOf?gj8KJ zs*x+u;_cihAQ=k$QBTb;py#c5Yw=;Z-Om;v0f73BjO0gr4R}6!&BjroAYINv_cWpa zXAsB3G=6!P#;I_crp-*cKM#rHfRH5F66`U{R92_3!8EADFZn{UGup&8n0%S>K0Iv9 zmyOKS`@MwJtV~~LF9M!i)*Y{p%|A30aj^O+DRo+wTu1ixW8%0iXp=>XUEwveA5R?t zb$l}a&vx(#%M%6y!GO3}E*1<0gn^K-P%I=Yg@S`1sRV`*3*T9FdiMP_=D7QH=W~5+ znbpx;cdaWc;3eg*0&~^y@p?U<{w}5N|KzVp{_xdv7OhNr`?eeWQ>oAMU8{arCg-U` zqd;}&W3h14|D4}(-L==@e)}jN{#xRZv3dh|7sYCR$H&JCi?V${qRzIEdbaqg!4E9d z)+e?%V{nF!G-#QIr!z@@!Ia?5{@#$Z5qF$&_5IM!V5m9jYuUmRKmu9RfsWxAO6-;b zR-CN!ct*CIz912W20nX-|9%03L4dGeOc)~y0>ObWpe!gF5QZpx&0^~E?vr;E$!S+t zF5A>sLv7x*H{`ed_L1)k*4^b}ORWd|86FsqhsIUouY|rSO^NkmM2kG}#zGw)ohWl} zs!gM&l*;YTO+8N@8$XWt`fHN<{=Mp&46;ka8bQj{xZC1k0(6uX@@OU=BcishWva_; zyvLJ*2BZG=`Q#k#lqeUEZn75Wf_f+Vt%FuLBy{OyAC-}iH%FYr@om23~rvTH>k^u(-u)tU_79<6ng&>Mt?^5Petz^A-a;6JOS8@ut4dr&X z9EjZA=6gE<*75H0>dX7t;V0UOGv$^TXVstM3Uu?Fu-S%h!&k^J>RV)+cfVC=nk!AT zM*aTep~C`@^adQ3TQD3pRh=8B@-tyU_rFbT7uYfF?$3QI=iBDP|46(4ckFy`&Q220 zuhB2_o`oynp6>bpR{I9qrUyT}A9g6lybT`zu2db?wo#tY_trE<$&Fp}r_W+VTJJ$S z1I5__&;JQ-+=4y1{l_pyn2F+C`hpI*^QAFM>*ZU=>{*fSutb$1kOnf5OY!@WAWID6P^xBAu;$op4 zBRSlogD7{LS%{2R*hOT{Wg|4(A)sZ(u7HIRhj?JmUKwcA8_TJfv`&%mzU+Jcfl*QV z45vg{gUnycQx@j4xVY-vuJp4EYy)78Y~`a94oC|8J%7iFV>~Z)6F6{JGaK9_8Vcn3 z8dv-v$xw2aMQF=i|u4WeMp4hFe%Fq-Q3p+kE)k*;VuAp ze*&W6~$X|Kf@={c+e8OF%#Y>)6tba60Cwb+?-JGRDJPMU8)WkW7*?kon+A5>@ zibVu_)60Hrd$nzpX*la>{ADS1BUPL`g`mjDS@?_KS5`n@;H~3Y5QM;}jOYM6BN#copObP zzGd^%j&C#S8`LT|^evn0f{R82NC9sRA1E~omKQ6Kl5m;%hwH&l#3Vtl1smo*k;>hx zyi!OqP=)l62=UlWKM#Cj-fbv)?ABUPow8X8UweaX02DPb4J6fa)TJb93W-|jOfa6K zm9OQIRnf1%qPvOEG;iF+btSAebQFrahDr;OYh?3K=^X5Jp@Hkq=7}PgWPGrM@En|X z_E59uy5A|EIR0$&mFt~S2lW$_1aQ~NaxyXC7Agcg-|iz(qBmlpXaZ%ULtU`A13Y~i zAC^uw8q=ZL7ph9rsj1EY=$DctOb}le3ELOIy-^Ut+f<2b9_w%>9zau5DgO$ty+56A z_!tP1W)wV=yX0>vBa8IgU%Qekv)Slz!lcb9nYq?r9l#zTRLotj?!3a0^1z zQzhFEcK}GTj2hS%*lgxq!N`*fBY96lu|2>k0^5nK<%PmH!IH5nhQDq4T(PM6CWGRJ z@bv9ZzY!qsdoQO!zN+=4QCO##H_-U^?aWh(@9T#K)UJj7R>J%#YoMR%w7pocR0k$i zrwLOQ{JN|V3xtfJcZRW+H;OA=fu^ayZRdG=qItt^K{nP#0ROP7dFQgh(fHAM+b{D> zRzO(7gz(^0#`4@=>;v5#AXzNZPVV8$dRpzCQj;<~$gGWhphEFN6WDW=hgcoY-XYk@sBm;g5l6n?Q~mV9Z0Y%A6nK52eQ=bt_G?clUxRxruoKlYbDk_qlci`*Vynw3A~{e>+}Z*LP0 z@v5jRf13=cy_|2>yIteWdZc7OVjU^|N%mS`dx6|MDoAVUlW9qFaMc$hXCMp)UFYad z0j{%t4wRo;=y)Vm@F;9;xd7Z64ZkcwgIi+V>aaW*e<}{Y;xtB(bZIBBp*Zz$qpn8V z6dGUSzEirFV6dlDsZaJ2$$KS`U$1h|XZrQC&z+?R_7b%m-+c~(-&+zNtjnOqV`4sg z^QIK&jy5=&LhL!x$IsNxskCA#on%T!DC9gU-CBNab*d!AlYK_1=YOW%Ro7c4n{Aub zyx65zhMa-95gJ_n)?75K#OBAsd5Z)JeW`$QJ|E5Q#2qJDxy^5c8q0(G&B&@rQ^Zeg z|1@tv`w%OW^{Pk|9IYa$l&N~dH$y7%_w`p6;lpl>nw?~Q3YgvT!3)+K zevEM|`w{RFNCeP7uy01m%e$Z!Q|;9>`$%^mXW^PEdxF_Lrs8ZU;FE^$W^A zSX}cxui!mBtUx+k9SaU-jzPSK`4a6liTG`Cx;+3u0tY|UUxV3Gb+0ylS`-c4lLflv z%w`|V0q-W=WAi?2R+)`>ksAsTro|`Z{^;@0!17ued4Vu_-4Zxcn z1Jl>Y#z2O>Bj&&z|!?0A!GL&(m5)$_$R9V33#+Yz+_| zSFI3wa$m|K2!;b;>dI^F)06D6^+&wM0iXcj7%06F0MC6rJuMTcfo&Q7VcJGRPR+K z1_B}XJ%OPE0P>%X}bD7FCEc8sAT#n%JKPCm=_z)SJ(r|5>gDuLM~0?Sid#i|WE z!J@JmUn@7igNO2rPJ`&1C294&xfTQHFDXN1K-UzwLvn4;rO_R5FFp2C{SqLtAUVA>agZG+cfi*kDDPaZuV&3u<(&RZ?|oTuba z@KQ-q_i)T7wj!v9&Rmy63Pmv3$dx(8z{rpWtm2Lf=LV2TbGs{!hDdSt6>)4kf%S_< zJ(fPRKcmSr(?X)oin4%Hqr3PNdGxoHy4@?><9d%Mh{xr;c8V82$^dyVP2bofaJ{Qf zW?^WhKmVzt*DqF01V3fbX!3{pME-!3mb>wqVJ9XE_{Ty*o(QK~uSIG0>T+)oq>0i% z##@Mcp;@`J_37D7PZVtgcH`1kfi=1f@xea2p~NATT-cj<4KN0JMeUtY?J!us66Cet zo5T^=6fRBleiQ>Z!cqIU=R{I3gw}cb9fOSxOz+5wBs)yi^}!Y6hpeg8r76c=&jkcc zGki*p)lRzwM6C@BI)i0{I}Ap0k|wo9M!B9pRC~)HJ4lG^i+g+EI5bEku6bv1uj)E_ zhT0U3!pv&FaimT8pD<+OTgP&gQ+zVsrHA1#u zrR{h29RA$;w|@SX96&1f&mJ|<4KDM7;t&lY`N05Lv()?;Pi=YIDc!B)VDqT~T8vc! zy&)JB^2LMpKuBU1*~h!0!Rd7j6K&s8D|Mn$8)i|f=DczKykJPuMLN*0)~oc1 z;(_!r%M|ZWEZSD>LS}Flcf&eA>;n-oj<%1-rt9@5Uz|?^CJ;F&6D{QkoCz5oAx?s@pk+Gp)rd+mMBIx~ke6WJI2Z4Q37qQj>fOK+JhVu;Hg z>`GB{X-%DKmQ_?_6`!v)(YNy?RCe!jVlg$6XY=CXS`~{{4BY7zsXevP@EEcnuMNH_ zq(5VPBTDR)^?r3d!kcpE#*SE1)Qj1wxhUeBcZQ((pgbGCi+k(Mnspy@L_7z@o+T5`Z$nbSGr9LOuF3BSw598*)Ww{m2Wc28^ zo7yNI38Bmd4-0mM-*T6q3JGdBIfUEaC~GweJZvz#5rWCRFP8o8#wQ2Il*cVScbTXp zE~Y(;)X!SQXx{oR$wG15^{&T5-Nw~^Qcc~a^-Q}csOqIshn^>{qSLGBdg_rEiZ#X` zg{7UYU@-AD_Uf7|7!zjZUGQo8CeHX4gPNR6^UnvH_upD@3&A^NpXC}gODXUXpV|4Z zJnW%&DQp@1-lYk}A*-Bkt}d>e0^=ZYyEYr%9NC; zN#_)mT8~9q($4g$fYcA?*lPXuvhdz8*>m-&wIiG&thNFf>5-p=HPZ=v-sJu05x1e>%my`bxA@^qlhG@Yy7}PIpkSi*f$<{%Y!g zN@0zoX1e9<^4;yuL9JJ^el|qf%r>8YUenyWsoLzlP&h^BRwuf!_9oT*EO~zAJ;K)I z$77U^zv(^MPrU)o<)+~t+SCIwOe!OXpY9po&6B>q$}ZHA^Hy&Bi9NXxrn7qnH?{wj z8=FRz1H!5Fi{*ha9_G`I=18841)tXVxwZT0YL|pIvjs8pk6wEK|Ipsd$JBI`h<14r z&5NYh4@^FmN~YTwZQhId<+2=EuJl}F$}TJCtNDx7N^irwgPC*xyT7m2jiYwm_0OeV zKB{h8l0N5svc&)COERiS`|{N?Pl|bCLd$Z0%cq60luy$n?1@Bd&uAa|2fB5bw5AyA z&nx(`DSPXiWZ7&zPIsng7*!s_<>5}r+#szO&)(AyHty^8qLWc%Fp_P1fVj1Rd#seeo6oOAa4MB+wkCw`3X+K z@AbjOvwEier^#pf({{rpvq5hj#g3~z&Ap>q8R(j7QnN$3oR>CM?!ukSsF-q0!IoiI0S<*YqzRZcsdnvA-un z{!z*JFr)}Xa7hn;IzM&Oq$MN5Y?AwG!7YJ|#QbtiQB#==-k-IUdvT+XYNw{4@KxF4 zS2EaxW_A~N{TK9;<0Q_{=Wp#&`G*V~IhP$0h@8yKuc^Ny{S<#N_-kuo_gQ+-$)z=o zN@J@2#mnK}t4uOqHJRPUK5AP(o1I#k45_@vG$?W=BE)3mknV8?zg8&S{N0qAa?8at zuBs;!Plp8sqb?)%87X{r5Cq0yhnQ=dpTBNB%YXjh(CR{DUB}7Od4|%@ERwpUw^ZBv z3tDG63QKSE$$58X_=o_~QfdnH?X6w|Z5Rc@G34H9s?rcdVrH>W$6X}lPja0)I`K98 z(RHk={7l8vY4|Bf`^4x+>MN>czdgIe?24AQXKQK) zxl0p{89ApiDz)5wJt?k#7CEw_%0rPM6Q#Dt$EyzpTjoA&iz0J$K24pI9{twxQmv1P zp6s}^Fi^!(PEV`g)QPeD0bwbB4F3}$Bs8<}E+70ih;VGXOam@fl9#`d{5#v723^)K z=$a}Oe*DQzwDPH!af?a&Jzc=4RY+>vd$y!@{~x2zv|QVGdlDy#zE6F#-xk&L_j1iR zNO0nOdn~K(V^;rtO^Uy$!Az)r&(5M>b~WRZ^ZN{g#M`n`2PS<9NoHqt z3g1Y>(74a*FqC%%DMLAu7#|j8G~e)p)zPMkS+4h|su3Z6IEF3r3wBbK!H&Jj-L90+ zrBI$jcZs=WKewoi<-q*s@gdq*$W5qJJ}@NZnL1()UQap5^yOp{L;4r5YoJ zjz^3%cCSkar@p)m%fgDf^bA2~wZMk{sjwd}<4&A* zxgUAieW?GYnYgYZxw>|3q)l7&eQ#lnvlz*~0U-?_LH|Y>g_nG)tt{qw!&xNdl?z+= zG8M~u4*ix#eCpG^zw7e_ZJpX>HI}i0W~0O#@Z`2Yj_Vnp@0+@3u4Tb@hNL8p(s~|# z;gzi04ZKe6wbRN&%oeF~oBZ3gkB_3g#1bxj+?^i(Novf(D=bKqchcP<;vm5tm}PH- z#qMVBw%n!=Ec#1VxfG|EGp~Cx;C(J@N7}xX*X>>Y-rP$mZv01tsmiw4NzpuV$L1!GlXH2H(^4K`piw|-c=vDeCrMtDAsUwr7S#KjNh&Bq2*cB)Fxm}kfM0@=B zye2O^L?%7{K;g4%HM7{3?(>Y?sP*1WS83wjZlR_ATVe9bj+;J=r+&X8vh(bRX%+PX zBNKLhRZ($h8UFBacEX_!6Li1r#7`Tl@~PoeAX&lkh{ zasdh*jm{Y!1Jqv4E{+KVbsc z8-;tHdkY#aimEtkRIa8N%sSVJV#>3)#1|YspcFUdx&A_7|J5zVJ#%4-f+zKD{E4fe z9ZxEIFSMv6N1(mW;oDVq-nEY`3R0W(NK`6^#5Dq{;BK3rR$-bwJ*Zw-&R?^s zpR6qKX&5m(m$sFN{xCYVB-P5G^&rxAu)tu`-I-``ziw&&MxJJc!+<_ztN>Zz1+A`} z+ycznK4BKW7m_ItN*jDpdnNsg2HLX(^hOlD2m&DoTLHRD-#^R{5N0Y0UR}T5xw^&k2#0BT|!vm$}~S`on`U1E*OaUC8(g)3uG2D~!0J;QfyPYZJCp{5gAbVKm61kGR3y@OR_sD$1yqKIyGM~RGN@H%Qh)X1;TzUb6;pbjf*f(> zwpR1}ODeB~OEUhlXhc*d7_N;(=k8d}b2av|RitXAJ_%|x&T*_;(+YABxz9f%!&SDp z9TVo#XH<{HEIzM|hMj($$)TkfI#5p7x zzqWa>(Z_x6xZSPQIGp=yKc(H@bwmF4%56jQ7s>Qyr0OXq%z;FLGV}epYaiqe?D%4X z#)sS=QXjQlFiCDtT4vqS7&OnM%P0K)5`-PzlB^rUan|f-e?-_}r$M(M#EE5)JeP++isB1TsczlqZYdZLV2wdlTtf% zRR}vxL!oxFd7YI!*(Kx-QTW{n$G4oL?IHJW({*<=Wcjh-94Qaj5Bok+B6+~bM*Cy* z(peqrOBT(l2>WQ2D+;&o-*I;H@6d75mYKBDWqp{Q&&0&R!6TD*HSda@W6E<}7Pa*) zuWj+Mv*xhZMLVy5bk-W_)N0Ca+27t779FL%_a=BDmMxFTJkh!7TIL?j{cqyrvh{Hd zLbi{`^_893LtS0mz0NBJMZujZ1<~~R*IB#;I??o6Q5veJg{Ow|I3c(jn z25RGkj*AmrsQ1KfybA&g^#s;H3Hc4hpAKsGFc2H_=&`6LV+*4F&EflqKaGY?YR{*E>Yol5|jqzIR%iv z9msyNG?;L@iK~9{wn%lhfBo9rJpP7Ux0U*vJjRR#B36}K>0D6)68-Bu!$wXD90`bf zPnq3I`f{VPOP7G<|H>ZV%3WFb&9%A z2*?!8K78KJ1N3FJ3Iy_3g62NqjTI%LI9#tjx2GjNl)>jvpb>wF!OmEsS7W(9Q7yRB z?2q%z>E6V9-=51U%6MH&MzpMBqtb}PPdT@>E;aYNhvH`rwg24r=A_aJtgsY16UmWJ z$;NRsx8f-#5Nu)~M4tHMv#CcBi!i5Bkuavw-s0DtZ%&V0lqQWF$2+`2BGNfL{V?i% zcX6ny8r#n&Tb1(ru;y!sC>xny=G*?W^!D-MOVlr=l=+?!Dm!_-V?^r#4??29Iu@IWU6nxk9 zWGSg&Oh-P0L|WK|fo1;mwk*>Sb&*S6zOwKY&e$H^NSf$_MzeCpM#Im_sk=VxId(N# zwhBk7I~TF+H0Z1|((gtM6?te}G8o-kiCS5;E#rF^AY{1s?5cdkejuMe(@I7LuRov1 zMj`zvXRb%FcTJ)ld^cujA}2sFHZL~9=^-nFdfGm<;-9f8e&LZ5shDgd3~i0H)inK# zeOe?PTcuq1JQ(3*eT1#3R291>u>3kVBCK|7ZR5F0ul@O@xRbr_+{a2NV%?pm?*;n~Rpoa9WOwVA4<;>RA_YA& zVva7U8aueRs-&MvVOSq7HjRgt7mP(K1wSV-Z3(k*r8%d2^;`KBd+#n!Pv0z$k)n%f za&yYN9igBDj@@^39`#@;_F;LP4W*=xKCOemi_92RbMxo>kEH4B*l=|utPScqnVxYg z)Df^1+b0{JHw&3AGT|{^dVEKeq1WNp1zcUNBaTW39C_5NwGaQB=ED{7iv*1R$rzVy zzZ>7DzBl2tEn%cE##Py-W4h+>oa%+=&T5&~5kU)rfRmu#gC1G-xas3f;6$-0Z^4w? zaC*~Rf-@_3)xY_dU9QmbRZMl}?y$XhYs^ZP4~Hisg^TRRJs_cW>Wh<>sea+}8&X7-V?-KdMl z6y4nTDE7f`QjYgH<IhizSXNyT<(iIz7UuY_ukU|x+Irkh}3`&aXSq~(S6e12dNn1 zb_8L;*&TA`h%s-5o+rO&{EG17Jw=;JOlhx})NJXvJS<%;eC~ng@J(P#rH-}Ct81Kn zfaFQ%8?|2|p9Cr$h=?b&%~}+z_h~q1Zz2zh-`R77qek@3nW zF4g0;c~);nb@$OtPVy*@rTwP!z`ms&rl8(*V_CmTbtOpt@`aF=>hEKuOYs|q_MQ6E z$!5spp)H)WI;U4Np!fT4oQid2np|4FC0;*?UD`Mtlgp+q6;D>(%C31_e`EMwvcbq) z@_HEVGsDOEq+$G5ez?8A(v7vnH-y{8_3`cKCH99qQW>Yp#7nr<6Jq$EQ}JJi8CmV#@c3jSui#gP+H{NIZF2nD*mTU=)Qy<3;m@?gSCgso$+Odiw5y2ZO*UoLOUo9S zWv?fk3_WU_JX{|qSKg>dD%@?OI3d{dk(&9eV980;!IW#a=1+*M;m%Fj>Yr-qQKBSG zxXwnV>uB1V{4+R#Re=JtAw@ja8!2xsAZ>zr#WS#Xfu8%To#&^;rccq*DijxEN| zyQY{)gv4e$-;_hXYk%EwVXF3-PwR9^nm{|Vkw+x2`nugR$xls0kZhqYp z|NB>5y6;rD>BO3fByO`Z%%k~<;PhOd@Yk? z=K9qiG*_PD7;=dbvQxC2M78lXQU%7xbRNw7r|t7=Ss;>@TmsbuXAn(>>scfv?483;$SQ z`OQ?8Cav4GH=NW!rVzp7kyK?j`+DE=iHcv6GFNc>WR%q~$xQ|4)k?Oh8|jf@CdQ}j z^Fa@zrRL@3>TfP<^rS2l**4=5Z^clBky>VYPN>w* zIr)?vcZ*gA9C0HG^;Qq^MKkTzNz5j)D~``8=yg}ArO@dmLB6Nab)^UlG^G>&3@VxdtA!Yv_4 zQ1Owy*YjuAvOB2vTD`;L-^X~OIU|!Zhxv7;6+f?V9zDtqVpDF4e@%=q3Z%)^SCm2O zw@)%WndQu+Vq9YkTv^Pfx?XNWUEJDQE2nYOmfs6eFk$a4aW#8FE%nJsAx%k2M{vy@ z0o$5=C9csI~ulde`7XY zSxbSYd#!0^R-2}@ZOcF5BJx8cN_S0M z;`6UP8Sh=(nm!NS4ZV`&%qU-AVk_`8$lT?2*3Tl3Oh3k*@?~9_yQ|aV{B4S1qPOWg z6)91clHNmMq{@k9!C3I?s_uE!3EZIVQ4A!_Q6G80px+_*!^Y^NMCe`lx|A7Ilgx14 z&8MtX-YP@R$J9=HUibMGl=oU^HCwHi$7)a-vY|{b663$s-2{;vvn0*_bKmvSUU+}~ zB9xp$;D?$m_4>VkrFf;HMTxV){-Mb6<+hzkDa7lLaIa-jnj7crHRfVkk8hqhb*~Yv z(vR-6oZ-h%{klf2_X6pE!DU6!TXgTT)G+6j9qF95>mi}{kPS}Dt@d-7JsB7@J$Eyi zcwWsG5wqEB7Zk#4fTY!qlMwr-j=DN?eVkd0^L5WH9*YP%@ne=s(8PK54rUD?YF@MM zReieX+3Hw^(P@}d@aFz2w`dcpTl}dXWnO06QenA2FsQJPar72kovV@2AHC9|Ha`7{ z>BW$-urk*~29-7G*ZM8~eqT~5nU1GN zU%ko}u6l$U5mojn8ui@eyB6nj#iL--dK&NaN{#lpU5Joq0HyUi?9C(J5cI(^6Kj`*f5EuD;8&4Qt)9~qPfyn#SjcBi3`Mvx3Z%pQ{ z`gUfZ%rBFK`BHU0a_*JvraZ0dKf@8z6OAaNWm^W2WKZ1-%-uB<$;!pQ9! z?ZjO&J>{j5m0YF4 z*gsxlm~N_I9^_!<$B=ZOeVABn6mLQ;G-fTi>Nn-`y5W6gm%c}B%&}8kT_J9VZrbRS zCui}SAcS}($L}TA*3&OpDd%}^(Nx-}xCg;s>CTUf#M@K`3s6b#9+!WRKaCCJ0;2;V zPN%#_=MM1^>*7+cWKwC?0_Ci~g#UVClXbqAQY*(=)HKRdB7AuE!1L?&d~XVi`o8ET z%#X~iIy#H% zt6RbDI?rPX=NdwTx$-Gr%MDzgNk4H)Cw9M6TKV?L@%NFKDa9?4| ze?1LyY*TpIJ9AW3FBoNTIe<7t(4xqHyv3DhaGEk-w>oE^DP-tMY^9rABhCZtbF8)K z{bx5i6r4*l12cFIuqLOH2P5y>85?X7r+a4jlra>&q^?VRNWWC??#Ck5ZZlY!V{pAP z4=-k)bhjvU+%kn;Cgy$D&e3$tVn*(Vn^iX*t~F>1 z{8Eifkv)4tXDGszM0j)kHYF2^iQa=ekJVn`D=CJs=ma??8pH_TzF4&qjo2*+BUbV84O*{DH`6^`joS3nqXMlN6_0}u> zv@}N#|KxGsgTUANE8Y^>Rp$OhtM|r8tvM$5hdF;ncEo<4<&Gw=jTjXuq?;P;4`pm* zV3rJ(!^dD23uRF~J3nDa)img{ij1jnG#)C~CVbo1Qcz=baXIeL<3-^L-WVIR;>pO9 zXghr4?HXcZkx`nGTLSiq8E1x*EO^6=o&3kyCXFSy^#pV7ralU0Fo=zB zk=#A!FY90}siov9{7P?P|MQvcMXlpS`IZQhS*HaAC4XSfybPI8fJI18)HIsaC zjIb`Bpx2@|x2qnW(R{O7J~^#E<{mI6Fk5j5b<$&@D5z8n9Z?!&b}mo}7-}(@LRa%a1uWK)LZE>IKyqN(MN6K zyz9-7FzX}gPxpNCH#PxdV^3^*^rPx(5tb|EZ<-!H?wT^y+quCmY(aS`iJ4vto z;O2FlzwE2va9vFO)^EO!^GLQm!u`bZiQ2d3{Us8Jyrypc%Uk!W+mc_bruX=y?Iwu3 zOc`x}nTBS`70G5cN=xh?$@r$^Kln=HB0Y_*$i8Ay{q#$}cv)EcgZ#?Xlz4;7rT6SDKoF4)#YhmT*)1Mt-}D(MoCfs8Dg7( zbJ~ulf*RE$`(~4=MHNq(bHoZ01s)`zR-_pOGJm#zqRbnmOvxYrZhcpX<8lv8I&U&< z=Z)ZKZ}7yCOVflu_1cZxTTg5SK9nqtS+Z`Dkn%)5X^m5l-7^jrG4a&*brH)LpAZ@6 zR6h35eg1CLn7bl;`_>B{6>%qumWQY+N1*`aq@Q_@E=ebGEkh0)QmQ+11qt?mIdA+_i=h1aiC$?b$Hkhd+3~2mpB_zyRpK z|8D6%M+&PZJa#eIR9+0g@3jCr!DMyXKQ;)n8WOB{ok?wV}}5=1P|yo z|Eb4w*V@VBpC$nCvA4GQcN#7A;J&M(rHi$b4Y~~WU1xh2TbLmCasJcj-)6I0|C2{= z?O}s1gWk~jgx(%b%>SgZxjenBoM1Z9)64VEg#4oi5tcr8;H3Q7{%-S+0vkPSMVLf` z-u_=D{!#z+N_~C~_pZWLuVbjmF`Z8XDmy60Fyts#5OQ$#0em40Zzasf0EoNmQlYRk zwWrq~r^4i)9wMN-(P?sME85xU4c#*udZ@dDR>1Awx_?Pbc9`e?Pu8E;2!N4>0~f{x zxGwD>nE>FA!`?~Y0yTlvodF=)1^^Wd*@RE&QUO2)`=+9Rz=cFZ22HyG0IdU*2~h3< zK!*T;fd|SBD61jskU?mc5|kED%0mf%yORDg08DjoxUfxXMp*X<)-i&4=8)R}Fw;U{ zS(YML?g30I1HkA4)51{3!!pybJj|!N2J16GTLhs^&~_>{04QO*RKFl^p&s^+*$wTc zg#Ue^30?Lc=1W76kPfJW`IJ^r?+e=@hY-U$J&|+T6`(wNU`^|zjeS`Ua zP`X09YGE7DM>z1{rWt|xInY;zu+0V7XA&GI+$Vr#Q7@nrgZ`y~e&&Pd!8QBxpL#?@ zFb~>50R4=tgw(*a2mr+Jpe5ahZ4p2_;Nr(3fp)%z?Lz-iyn{fS$e}&-a7`0J{}3d? zIpPKY7q){3eN7DeCxYX+0Otdr9_F(^`2o&tFYMzwEE5CsgFK8S0RA2?gwxwWdN?23cxiU1-K!;05=m4;5Hcn-08aj4~zgjrVM~5=?(CV z83A4pHNcC;26#C_01uv|@h0Q|-mw|Lr!WTiLc{=H>kQz#xdZ%IMu1;(2jF)-2l(r5 zfPjbq5b#z20_|)-;1dT3QXK$6V;CTqn*&JHK0xvq1EgLnK!ykdWcqJ_EYbkTZ-W52 zB?kxz@BkqPJs^~u1B5osfbd=yAbfTc5atpC!b&ed*zyJt_U!}0sn>vTO&btlQ2-+H zQ9yKY84!sd0V1_)fXMhWAaY*?M31HcQNbP{`j!fahMnOd+XIMEo`9I^01)4_0>oBt z0dZ6pAWr)Yh|698;*LjvccVaih+R^e_sC9{*{JFx&OKQe+wdwe~SHS z3-8DOJ&4qW0<78pV-WFl^@it=|86>P-}=8n1n}sSfQbztnlQHfRbE}0wAgY4m}>go|49f z8cfo+I8b1q{rtaU!XW_g)C(~3|2qG(q7{FEu7?J#!~08*|Cb(Z*1zkJ{-vk>OApUs z|7nN$FFng&dal3pm;Tc8{iWysOApVD|LIr!FTLDfdilTf=!pAoJ7H}3k3E`y>9zjS z8~mj={7Y}~m)`O({oTLx_J8T!{?fburHALv|JdXAmp=3_{r&&yu@3%MEIx#j-v)uP z1Oev=0pl{(B%}e-1(|?sLKYz~R$@&-)*w3&bh%Mj2VRF^tw1^%_{cs<~S*%}>uaE)A7}PO9+4@f!3&wD)GsrLm#>GG7(EX$BDu$Fo8ett6 ztFUSyFs5L^^8{8I1dbgm5&~luRuiNG@*YwELAT!mX@oCG;28Z^$uZ3F=^+!HDa3njD#fd_%(MNmKpAn;n^Pd#*5^gdcb z{`h|NpE`f+gY$)+TdZ>^(R~p?p#RY}Bk&_51guvq!5d?V!35GyFAxt515Kf2)ImM-bRIq5y&}i}sTarqh1SObOi#8 zDGq?KO$9KKasZPg3t(PU0hrRY08>{LV7fX3%ovz1yb3VeH2~(k5WvFm0$5yr080rA zU^%7$tS8z4tDFNag<&}Ts?hyO0CAlMAZ%-(nGyg|8VV2tGXSyg39xC00XBypz*e9G z*mhX}J0=-mmlXo+@1FtoNdmxOt^+vA3;@Ud1;9yZ1vrfo0B6A-;1VMNt`HNz)p-nX zedz#haw5R3kp#G-!T|T665vrK06fwA08fVl;CT}PypVZ-mqrKhK12Y#L3n+&9R%=6 z?EyYF2f$Z41^9O@0Di0ffx!fKcomAT*5zgl^J+FxmzX zrUe7S5>7x^p9=`PP5|L>A|RX>1cb-tfQZN!5HaZkB7samq)-ls^zQ*8`xZbHJ`0Gl z;B{BCF(B$G1Vk$r05R@2K+M4oh-F3ru`w1P4xt3Z2~>diO%Nb%Y6isp_<(o@2N3Um z1}G%Fwz~KLpu{=>O63Tk%!&c(9=z^)ObXu?i~v-b8bG!81Jvve{K4!cxF#&Tt-auS z1qRMGe{vUa>X^{W` diff --git a/src/adafruit_circuitplayground/test/sample.wav b/src/adafruit_circuitplayground/test/sample.wav deleted file mode 100644 index 362feec5a6c6d167193fc975a2175264968ab671..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210158 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≤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 z ze+tn!w7%tI!JUt`JqZC|>$J3k)TK4QDX%TCzq5F1ax{g1~@MaZ$O<{{=aHc)!u1_N02cX zi*JSgn{eX82krr0Y2D+}^x1sD=e*AHR;?S|5No-ZzK$7=5n?{V8OA>`&qOyx9aTVd z$fV;Iju1hu7z55-MGY`%K}hjnvADAXiAdrxb#cw?)I&FaHP>jYjV`G zI@qeP0pX_8sTW2E2}lsfBKGg~W+FU8QFwc(82bOr7*N!^cmoQ4mlJ)AOhuAlFX@tX zjbw%KhJ3j`7?_%Ng+)ulBLU(VR}ER;S8Gtpv}qXNW6vHDKxE6wrECHv2!(gz0$mvl zeSgi&F_dXBOK=~?l6uOyQ&ZUC+4$)sFK+FhfJ)jEa}cFkFeE&F`-i`yLS1G~)Auw- z^Y5yU)GEUo`D92gYiyC3j3r=v(8pyO$!kCpiW?ioNcphwL9=`!+2}q<1m!+>CydGx zoRBC1jroxM36zCd`9;rKGV#_dy>>$KpsiTIFG?644d+1|z96neS?>f_TNNlem!7`$ ztND(hf5{+`nb@>xppG=#-T83O+MNerAU)zzSyJ1~@8Q+IYTodkB6grXiT^4HOieh0 zh?~$CyMd?sU1KQd)kwreWkIWI5p=E&b$h}?9@D&u+2UwUKuc>T<~1Q(@v+6K*1hS-BB7IyVPfG=yw9E4shf1QI+|Cxks5UK9|!lgnP|HN?$z z^rTNxcy76nZBF)X(aca-De3y_Fur`$MXZa22(h%d@S^LTI@;;3?zDh+g3O?8todEd zr@wrfi$m+#akS_epq5$mlrf_GD-Dp8jsH0t$gz=091Wwe7TrKwjb~ z_H(VO4+u}7JViVcsrXh)S-H?g=wgJovYrqb>bmyhY#sA|v7oK0UT1JWiwNf%3y^w% zEs;^c6NSYJ&il_gnENtl7wLRAtVxD0vJM0B_-7t`>$y7C^`%_8$bor+ji){L^{=k| zc447W{+_k=Xs*Y~MPx}F&{r>Zf?1&tlS=UK&;<+w`je#p12oar`^$wp_iO9)+<03t z!0Z-jD{Q4+S$A$E;@nj=y1u!DMkURRDpNoWG^6lLurpnboF01vi(h})C9=|t-$*Y_ZPcC9N zE1&36YgI@gx>)*Sm%6Ib2O=$xzFqWmzIcTOi0XfE$)8%t`NvME;jtpk-j*4AfcY zc3XChtn)w{ga@aIqtq;kz;W{~HRuE1LNa>(X~v;EHj%x}_| zRLQB&)CPrex3>@NKriBrUULD>9jAo@VmLYgRX8TY@V+wvfi#K@>FA8M7e<3elp=%~0RBr?o~huLS!E12=4sV~#*f@sblff>7U?p^?Z?k-f| zJALzzvdf3Z2Ce!R*6L6bPg%p8a>cbTUa1-gb=j>CAs5JV zAPmijaAMUUgu)Wichp&c=$4L=4eJ@&j{D*+V|(PvB&wmEOSv~;gNGI<&FW3HZ@3Ay za782RGiw1mY#MGiSeizDkd@-tdo3BWrISC;L9m=G(p)jsNuN0qI8LonDCVdw86Ll$ z|EeXjwUucTl&FPrYe)`(Pr8N@ST5OnoPc3Eca^}tQ>ZHa{Pk0NZmVZQDJ~Y)ql4%- zo-@oWJKHUxcY}+Ib4OknA3{81em}A($E@bOL(_JXUEl6fc~)psNeT-E=HwTE!-V1; z#4l?CZ4>mTCBfjsAZT)I#PS8E@ltz+SKAm$j$p&%5t5tj`LNhZayFP&Jq; zxfVeFZ1gc1+$9VLQQoK`k^zeC4FVG}#yftM<69kin-Z$C*{Aonp5Z zj(UuSN-ECi*F--xBE>F-xp1B9Tqk4nE+&7gv{B}RQ@YArI|xuRrYSyPZ$|%|Ix(pd zEjP{t>!&f`3kp@*+L;!Q&&^0q*R3j1@EyKu%^}JQvk*X}IE(tTCf#6wI ziBF2U(g%){{Eord&q#GC4x8a74GM(?Nk`BR*7ErsQpQA;O1=hT^H#I4_GQgUgoQq} z4WESQP94l(v(Bk*9P;S;KIyJ%D(b>4SnelXhg+wSS*B=ZANr^Mj6i*uEh!aT%gX-2bl5H?Kq|#G8?>84>R`??6g>LyL7Pl=>$pj4rQH^CWCaVBm-QwwXIJO7xmj1K zh*NQudUS&e6Yqa|#Za>eagtL_ZLju`$wLY}lFq>>f#eFga^3g9-HUM`aF-dp0TtKH z#y;l&+fTP0$kv3T*A)U4mos5JHxlZDjFYq70Op1&D73=O2T;yeio?V_ge9AixM!zkwbDbO0aePq7Xp zURWb5>L?13B~EE1aB*te zQ2yLs#NEyDoaZ%66|k0!1D{U9Xa1?br={H_v;J5nZg@oz9>m`2 zfpNyaFakWBb}&0)U5l5Jd^qalDjq`%_stLAMRW=8{@$vfjX~rJqAXUyj?u`q1@a5s zlwpdjo%rvDJehgX1oPMhZNbW5?5x)$;*yj>hDOBCm?^9Uq+z=J+v zbXI!Y(lcT7d_{b{(!~_Xp&g$4(_#=0{%GF?AG3GeqhwNJVB>)ZZ7E6 z0TP-1%{DMuDK?s~VsRcu-^=}#8Fg*9qt&>&o9{)uryKmVUyOB)C%N5i7>eF;WUSye z8$Q#{Am69C`Yb{9!vsfq_ci7j4-$!^liAr(IU_rfp&Mhd@a_DJ|BhJkgtngDnw&*c z1U+)Q^k3qmLthnXyi6m3DJwDMzULmRZYsxqjWTAvRr!lt%TvXG0QN~v4LTSc!}eK< zv}3{q=9~gu02zcMSl`#2_Qo-WF>{Q>*{y3V-PI^&T{PpiwE26}_o3r+e{Z$o^p0Fo ztk5@qZ7!9uEJ?40+FmSWG!pSfA>$7mVja;DKth@Q|G2v}Vj@&!O8Dba=2h6(Sx(dk zMd5F)ZMpZvV}`$9$(>NG@o#hV=KC)P&3h0aN>6 z@7sJ&>^~I#U>KJ4i~HXYU?!zqU^R3 zO%>nrql>?!)!!_Kv?t_TKXFRPwG|H76R#;k^4E@h&Ia7{b2Dch;0OWW1E2>09soE1 zkP+5s!(@d?ktSSqd^I`L_#Gb|YoZO3tFGg*%Fcd#W3)}A)*=#nqF5X=^l{WdOinHz6eJ*oC8;q=>aK*k%4JUH zu4a|8>ZT9fK5Sn@RX*mHPRbzYRX*ea&Q$_<3!DVU$C~_26z2P>O!ZEqz96^Cc*5@U z3+tx^++8{Kci!CHcP?*zO5$o%-Ge_JlC zD=w4IuHPeXxlJ7pj#IW|XvdJbJK}DMxhV^cZrg8VDhz8$ow%QG8eKJ&b2n#UQcM4a z7vmuz`v#CE8$*_q`^W=pQ-RS?qK-~O!Riy1RgafmmYZ+RPcN!oYOIC9e*^!i)H|rr zhbhJ52qm)N;zyr>@zXQ*IVajns?-)0gv_LYLSP_3ow@+f@o<89($q-CjKsk%k^mq` zKp7GhN|`yvNG6x^p({3O7=Ks@pP`C|4$YO<$Lel?(^-p zl<0rqc+lmqJ2io|K7j(M<})wkdx|{n@DR=7iv~m=;70)xnf}!#icpDCn$L)9Phr)L z{tqGg6o=>$yeAXv>nrp!+>0N{KUr~jgQHoEPbuS}Tan(Lt)>n=%r&Wwq-lIRz1ZC4 z%CQZ6+b@$cDUF`fQ*E$=q}=fK{jIA+-lTeigKE((j`lvolupkHOC5`Q-hb>*z4NzS z>Cc}_b?d1{dFYy4ak9#+ibSqMXSS)D!&Dr>J<=Fr;E3%KK$l@CZh;Dgcg1QG8LN)1 zW|th6?}*xL?)IN6>&@#k>RcwRpzh_$Ih$lv3|X1iBw1;q>Q$Q&;Dp*+ZsVaqJpecW z0I(SWfE|DcQ$Mc%A7&dgN=&J1+luO5LtUHqnZ~c5(im?}L~!jAyB(%4j z#(q#OuG&-)7sAdblj|F=)8hUIhi_?J{)y5K(KX1Ew6nw}2y1H1-6McJbTq7_0^udXE2=Tq=KYQv5p@&>Qx?YE?(zc6X*C;mbOJKNrY zjNacn@O6rP?$>I6w9S}|Ml)gJW57mCzqLh|mP zzX|BoRbwDzyAwLrp89BRa>=`^3Wunk@nD`+g9oKuG96nicNP>LMT$!ikj>6ZslE_30(G}e$M1A^OD`xC7KVG>6-8f?y`bTka7nhQ6l}h z`y)BdAC}THl`WFh*-_q0g%2o!tO1^BUEj+W*6~;A_Lj}Y)aiK|4E`-W+znQ;r~^(- z+EqfwUvWp7sUf~J1nvs5q(-pmN?>}rtOZm^ru_TYNl|$L7ZOEdSC2L_SJLn5gGze_ zp4sftxaON1XuG9%FHgrY^+9Z+8ugIAyp*U2VnCB}O?ivWwlNXdzv><{=$@|s=ny%7 zimQy5f2~4nAF4?SW)oB{rmZH0BcRbkhRY&m?M*Wc`$CDk6n9ZUcGp|*%Ffz({iBmg zPCWc^Va3Ivg1by?YJ_g*7X^V-Am%3Xf$%k9~zDSP^Yemc(% z{P;u6wZlofS88RR+<3&1#SA+~sji^xDG`{$i#z3-O{ExGB=WGaLB3K!)gun&ct}eu zAc;r~*H<+h&&tlg2tn(UR_a|-A(NNZv4bKH@FRc#00Rs`n`STn03Zr_dgY~01z512 zd2{1el)Dc-z$5T-rOyU=rW&WcDbpUdwT*a!TIyoUPciJiM&PhZ?U)N zIf}!wc6lNhCn%6iG6X`q_x{V!9!}{2Qyj%2meERrJ^(AVmsMN7;*n*62#}Os8t9D= zif=ifpjh;v4hFdix=so*5WBxH6Mgoyrith%2Wc)?2MMKManej+xVLp9>#^w+HgI7s z2y(kj)T6YKYMw(_^SnOVL~AwBog)5Z_!M3)4gGIv$+amaUm4Vqsj)32 z#Q1DmJW-)QwkxMtd`b=6qG6ntX+y7>v_#VDO@f%Fdk8&&VQHSmQ@?)6=f*2VS)-O@g-pO{Tn^8#IFCzK_O zD0NhJ(9+AXyH0Iwpdu4}Xr*Z&c69%~o(G)R{ze42N-+0Tk8a@Zc^HIYAO^II?hS2L zvq#68Y4Or{jqV^4L7B1 z9=6Hio>~R$FwG)=B-p#Pesrt^zSv1)0GSJAH!pnfpdoJFv^!QHqJ5_c1nG5w1D@!B z|5+q#wr%FN*NI~a@l^i#*o3Z!{5_hx?^ONaiqC~O$y^YA^WcKp7%r8du=3J}Imh&B zekGg^_nX>j@q!E9mb6Bfh>d`6sFqF_6%68*4HSGq}XSoOg5Y#9(8WaVC17Sdza25;+ zf}uhvP(~36ghXKyzfX^TJp0$1=X1?fOrF<}#M1MN$yZ@N@q6h(`-ji!UwRLR%U;dS zm%pp$w;%GZw)(~TeV4g3G}G$6vM;4K-}5KMWWJnMj@i&hWv;9hkUP_We@nHn&o4#s zmiwQR{j!Qi41N4N>;LC9K3`%8yXH)iJac`@)NT~(Tiz$rC`x#PGPk2!;$TBo9Fg^n z`@%Uwe#?eCbPfDg6=*$jXqQ6BDSQ_ZeyIx-v0Lt_2wH>qpa0)~CqjWxU{n?i1%m-# zpqPjj3KW8&5tu|K5i_1MRkxhudebW$Yg@S2I=tiOj+rWkpTY3C$9v)YmfjP+T_60a zHNQ8TOgVeIwS7FO!o{2S`q%0I3HZr7CQGIIaPa##f?=t8{{9L7m)mOfurwKOKXMta z^_X>ACJ5{Gm)}jH7*AOZm8*#js@T0%evV1LounQ-8K(h(wPkKOHgsXq00UJTEz}Qeq36X$~xJTuMHwE{`z?lF~uDsh9@KD?20Y;*LM=Y%pA{L0A2uv5Xz(&)T@x#9V@DLgl z355ZWz^E)33kHP&WFVL*5*V59tmBVSTFbuUHENM`vxKQoH@??lV7pPa`nf!xZ>!1s z$Nm3VzODUc_VG15`Lw?cTy`GfKmGjqe4n_|619yVIy}8*>!X!jFTV`?Y_sY5t}A{U z!fY<*A4bu;@$hV9w$6L(Ies+Pw}Gfh#zvXz&gbxWduXkQ8z1&pnqI2z8Y$P>AOqVWQMrc5Kcl>6WZntfv z=~ZTDe)$#Uaw;_Xwp9+HyR*!HUg4`xIW=G7;nJ&oo@uGi{4ZC3J+#sNm6*TNz7zch z67Dm}-%wENXB*e2eaB@}-AuxR###KW1&3+<62npnxyUmati-D48wDKKuhPB8|1s7c zHPAV2U`rt{j4_@RG{0ueEd|M=27Dy(B9tZOMA=1=ifc`1-V=tA3n3H{ow>}s6T1dR z1OXfY6cj8p7z+*p;bB0iEN2S^LV-}ASSUeL^X=c)ITb3kb(-Asr7EvDwrV7(5cuEm z<2(yr`|kO7eeTw_`_F%W*CWkKwzMiwryuOA2+OlOqE445qq<9cDe?E!hd-_VjbCoZ zA3^DLSUYZm2Jm=SIhy><`@iScp|2U8Qf}zS-KY zC_*4-T|t%>NC4Rk=z>lIL9oFXt`-Z0hJ#?Bh$s>Y1V&*Hm_*KZ_0DyjckRsc&bKXc zrxdG{=Z+Ox=x_gDQuNNP&^*g+D)$SAzthq4pR-1~1KH2XE7|wwqZW@!QAl?9PJ;`g zRkw(7|I_|&P2b;i79s`Cq@5!^bKzs5=V4HH{nb`}WK-9M6PwZX(O*G9ik-D+H{h(H zxyylKm-3+-f}j70`f6Ej>bfCF0^}DdETB{ribkMvxDka0o&A6R{qBndV8EC#77P`N zh9L-yA`%FR`*Gi1edS)cwR?TE(qt;_Yn6F*VBaa?DQbQdqowp~AzvrN)nDcRS@?Y$ z(L~X1YJ)g_vE&a5{P+I!_2@Pf_&=LjQyz5`b%|kzi${~jQG)G7I(Uya;iP2InqR%9 z>fU-~d0&;A=qq&q6q{NowydW5{=4`OLHWcKPhBXbSW{&){)P@T%~537xdqh z9ke|(+svgRdN{vxyQcB<4nL+5Q2Li}gG7FahEcX-vp&kfrB6d0FD3v6rn+z zhA;o@_-T?+ki-m4O8DhvDNQb5;ZgBmWGK0p{atZp;D+F#8jWmp){{8C2by}NSJ&9? zb!?@lkoR(@c!)fGG_Uaqa&d;6>}?|80RtKs^)YYkd%JjBOIYkl&-NG>X!ucqk(7VT zc}uEL7L#4Qd}f)toZVR0{uPg+b_p}Y6O8Dq5z_0u8=#ck$ zldEJQE&rkv609VSYLe+Nz}^g-z=*TpVd!xJ=7Mb9)frjb3I>|J8escO`uT5}5J;lA zEB2O`@1i+4l4m_=9@I_UiU6dX{9V@qJO3RKHTIgd3CvA$8R+n@v7k5g_Q z%A95+3;~x=gS|ma?sMTq7~;&`sa!eiHzdhvL;i-X&8A5us44GwGb77=iXJcVbee8L zha`~yV){S|9)wHbu{2Bbb`xhgDLGZ=MxjG5lbDM-^~i3Zww^a<)~d($VNRw6A3PCZ z|5%WwKaBEPTuft^IKPeNXfkDlmK`3V8?sAb*;&=>;AG!%(>58mt5X6JxRpUUnv@|+ zs5Kj6a%RQUYJAvYt=fh8uI7lAWd5An>>sfmjq4ih z3T3*xS8s2TPK^4UdS_4qRrK<@OlyC)tt3rPS6|nxl~=%#H`O)N>VvGcsbcPFH|K?> zzd+Y5Z1NE9&%qEl66bhg3GV>^ZIG*K*5bKmRbByucmlLvf9s^~Js7%S20Bh!ImsfR z7h8PktzFOdi{acBuBXE|;V$fDRGPi}dxfPMw8!GrcyA`TcM51KL9*Z?ssT=n(Dq?G zD{pbnl0(g&o<$%>|J*lg;#t?WK+T`M3oJUcTCHjC^qi?T!&w{B7p`ZzJ+e*vEfy3y5F-3q{+U|*>kSZYe1TDRmZx4XryxsR4ybZBzc2Ywe8ii?@`|mD zOH2hX2VgP(F~DNr-(n}j^nas&!?d*$^4%X_K>Oe#EP3}N8o#U*Ee@+oJn+y;Qs@U= zW`+{*MfbsMJ-5M;FlYpHJLVw*RD#7Ttp$eloNAfD3ppx2nM*pRFn|YXX{=tn*Xu=M z_H%C?VPE8BQb6-ecYb+pZW$X}0N8Mp(N+nYB{fq1`2z*oR}*(zTeOF)SO#CX%~McH zdd%Bz73}o2lzP-+Yxu>GPQP0;L_DXpe;><$xh`c485vNb=ekYSYTDh!orSCNBA5W< zu2}hOOx(a$SwLU?igu`czvi5J=eIqU5Q|{-NHhE@K5R8{+&L|=d3t}y3$z9LLpt#_l z3Q&77l^j5^$w>`T8jRH_uMr%2f#2A!7@HVWo47nyJ5wb4_Lv)NJ|&k$Q_eHR=JOOU zsWWBKX-zsB)@vh2??=mgsWeP@91R9tZ04Iu?wF;@3}3k#maExZYBGZ)#cUPcj~$X5 zb$?nD*DoW8&@jB+ zisZ&M*AF%3?@Jb`jxY(E^sjcq2GtUn0R9^^+V3BEbc%IB!Gx!ZYsm`3u&<(M&95vs zF+CA9;7^XMyxHq0$eYn*nw{bcZfgn(G3r-HXJ3*DC{8$f4$mc5hHv$n$z2(vl?rOo z#-jQ<ngIza9wO|N4lqMv4|J4y)mHvsJgo{x zh~FwH^FAVtixIJoorJ2R#rQWunabTuBsv9zxn3s|`tRS|?n+DvhVXll&{WFI#WwJ& z`%qSa8|@^$EyBpaeo2&{tH`m@GVex46^~+7AydsDcbyx0=YxPzHs+wL`(RM@z#`1l z3^=tyStwQg_oFC@2%SKRmWy{5+pYL!T(k#YU9@28m_F_icVn1eD2fr=?>8&KeQ2rQ zT69*4w|^-P)z@y;dxbIxl=z7*qh6+(uBIYfV*jcKyXs7X`}3X^%9P~r!Mp>q!io23 z3@R7YU|jY1hNCKJ!NXa+@*Ny0F`mDn(bKk@iSKkH5u4*VTZClIo(mGC5W&`s8TT3- zEoe9gsx<6iFaS{6r0l^M2%{#5vvmJ}q}i@WXr-%ev|0G%E<-)$>yZ1`n(Kh4QF^*~ znv-yN-JMA@oJ_L^{ z(6p|q;WX*BKXagl6+3DAOh$7Kp)cDO*yKr}o{9LN@e@}a_62~)4F57}_8+2ioM#H* z>s|1d{sy?hC%hd_AnyOm4CxY8^9la#(=XW3135!T9dIz66!%1n+oIPB7^!$eZ8?pl zp(E`n15ojPZ%lMmTIGge_8-o3zYD5b)d~OVn}rY_E*^da?}pA{%~EgYdHC!T!H*v) zc{A0~Mrc%&8n+C?$9;cmNXc3VE$<|OzbbXJkxJ5mZ%Y_^_bI*rg~j4 zpteCvB7a`}lH<rWAIO3|4LrMZ`=#qv@+do%$D&?@h(TN%Qc^vN&hcjyw!rxelEN z2+brqaPbgRCSJPSTRS?1c^KbXKc1Lkh>4PJCdl_zg>53$oSqZWRxm zrW}Wu3dTq+x(aG%o~NHDi1AP-AFZLl1!#Fd1Y@wMwL_SR+e&!$7edL0a)xzmaY1g_ z?kky|IKl#KQx@CDN)EZeJ+|&G?W<_SuirV9U?H=Mqs5 zdvWU({t}^MN?oL{T;_U2-ODk9Gd8`7#?otDTC(k5s-W@vF97u@+k>(EPkM@+J`s9L zyZ>eI2Hp;pRz>YhpzDdB$~CrAx@oz03oRg1(xnw63Vlt`za>-&T^{Q|;%OYf0S(16 z0bdIPD%DBwzFsf~qPS4P-0S?j27wcY1yTuUL%^zC%wRWBV8Pe zI_G1$ni_14d&HP`?hl@O3P-dYF!FkSR9hxZaBAiu1i*aDhFx}#5BSte86;?MzwCs% zTEPJse>Whi-ghG(e(D2&LqW*+e5JD7T>x}dlU3tVq*t-*#~3#@Ap>sRR zkqU@bZdeXB^C8p7z#|WRQa%+vqk2PTh&F_=lF^_Jha$TQ-^7Z_N7BnP=~jmQ3X5$N za;pfHYfHL3T&NUX@P6rcO7O1Qj^dT%=Yt%17gakr?G9R~>;=R;)u2p3gk>soj;Irq z@p+AqD0a_6Ukh&^+y&UK1T993NZv*-rZ7IQnB<>;Y1XH&{=8bar1S1$b9KodQUe;&%ENO?d0Lp`^pR&Gll`$9#^pTUlv-l&b#LJ==5Bp~Kdmr2 z&?^ai6Rt2LSox4_L^)UeOu=S_op*!k&0D8cUYg^pfmQQ0lwLaMMj+z#xTwW+dj z=J^zj65l+rx4PdSdcx-S0HlVuz4IXBDko?X(R5*D1RaKLbsV@-B?}yaFsPYry&?pG*b z4=Vhrd~1WiD}X+&rW4o{({CB}223FTABx(;+Pgj4{H{%MZ*I0<7+ssq+T5P4Pb-b^E(;qtZ|71CM2eOEo%k$v=w#SOdc-AdD;wbGF{$^4OrB?v4qrXrM0Z-B2kh%%Nx^LFHJMcD!*+%9#>MEFJ%^s*nIU z@s@WU`uGbs2c)mzet@7tns{%w;SN2#$=@V4PceKVMP$wxE|JlDN)Z>`aTzvZ${Ppy7f3s_R}+F)5prCZba-tx3Rb)kXRb1MTP2Z^aQSiW^y8@K-mQ)R+=?UX|v z#gs~si^UyA9_U!o)?yjH3&o-&o5R_w!xnOC&Yr6JKPTrKqPyQJ8{^iX@lmEQ-K}fZ zHMX~Y=a4dwkCqZ4gy3DZFVKev7n_nIff)e;t8%(;A}J}V{Pp)U!?Ad}XcqfwtY={{ zhXbmIM5r;w9-=fUISG_Qg24_g8xWXPV$3E%ct_5WC}u{YQ$seBbhmvolOxJ{d_UA6 z_(iq~zM0a0>WITNYK#j-yO?9Gzlc9 zx?TyOQdUa%@a=8j#%og)^mG3sp{0t+RK6u*8d5Y29EUHdbcs{xn&4uV;9nHlC>)Ta zSO_vmDtL*2L4LHO=G^z{!ba8*UTR za{CmCLw$CXenG)0e{_FQ_dLseqi*dYZrW*3r-QiS30)tfd}d!hIXY``(Lw81&}L`0SrUDfCB49fEDIIyKZR4?2-VdI_f-$O z;y+fS;NKFy`Tsac|E2~1J=JMBv_KYV z(iOOCy>IC{@Wt&q{kKb)38=Qbaul(4en;-El%3ew<~FsX76tziu?by83z%tychvgb6?q9qbytvbL%-55h`& ztcddJ5Lj$2kuI0XeXnACI(T@&Vm;!P2j6K7n;ux>Zfx$Z* z(3e!YGQBddDd<`sL>;S!JnCiw?Kee}Z=N}bYWg$W^NS~Bm*jis4iG*X#9ziVx>w~(_Tsl;%g2gC z>}g6&5(#vh;l|uK>*qUlx&!V!vL!UBKUxRyGb)QA0U#7CG#Ctpg8^W`oGcg(1_FU$ z&{!yS3I#$XFo_)Mq`mdc^E%dUXBu2pMw2*Lfbac(HCp|AAAEl}Y!LWYe`T{H@6Yr6 z@ZYDY?q|Ea81i#e57zZJoMVq%Y}rq}>&x6!cBe2iRq?AsRjNE)hp*hp{bUcJc|2dJ zLC3ZowRpGj5bw1yo%CKu_&`jxP$DL(H-zFk!fxVNoY zZm6NLio|Uqp6Vpj8^{KxWdn>++Yk_i1$Y1Z>;7WJ0btNr&=m_20>MDAP(&0F1j0cP z7)1_lF5Pp+`qehO)TyoNmzB?5RK^26Pt4bPQGULCOfUXjw`aTJ+_-DwaEHwa)sNiG z&_uLI(D{k?troKt$XsamV6%bq?Wlh`}=Po>80yDbL`=40G1lq~Sk^5NI5 z*YUj`N8=1$gYPK(JwLtt_rO1Y@JZghQ;|cxmUNQ+=`u!tUeOtH?rrxP#5q^(zch6} z77f^b=WbDRjY-sIpnr+xw2@iG{0R)2!R)zDiRDZE+k%e~rRAflU0D{*_){wL)cA^+ zf{>{ofhHX-K)jH!DJVd2ObEh*|J(on{`|p!(3n&h6AFUDps;8xC<_h(#6Yl6BohdP zf+c&*;k`KRr!wl&lIUD$l#qQN$<4O%?DIA9et-4byNtgUyAS4(_Z^>pYSf(sTy!1`v-gVD;q&Ei zL!KP~KK5JWzwN4R9iASaXNQozU4)cbwj;y5?W6T9x)YJ;r(fUAquGuewn*QU{RjCt z_M{9E{*MwKOVakB;9a_+>AgN2@wz?VNS>$*5MkYqFt!r-7SJC%U1P)MIKp}b7f@WG;_X%@M2ttB&Z~yc6H({W_+$>iM5d^|Qs7OLn z2$<^?#eI9~y4O72I=-r2UR~|KXqh$yox%Mq++Mct4*);f{GVq2%z1F{TWjd=OX54I z*ppp;*+%ZG|7Gw$>UvA^lsepZPvO|9dRDiorNEU>vm0E*C&af>_vl7UcQG#CvA z0>PlL&@L4V6#~IPs8D1h2#CTZ0G;{gS)Ft7w^akGm8z2yUcM=Nv8wF<|NK3|H$k%D zN%P>{1OM=U6mA50-b}ChZ{fYI{{K+W&l#!eKFR$oj$9_?Vld;<>TuBt2cIxw=9hSn zqdtK_A}`8xEt0dlqOW{OD;*ArN~Hy*>vJJ<*1>6WPKj|-8&THg@Q3S(-ubcx_LSb= zSzj9myDmUYG?Ia2CXoFu3U0iBjzC5f7w_=@|M*%I7J|WoFks9$3kd|mK#+vM6-cIa zk!<7AONd2X$)#Nc-r>S>YxaL>S6Yi5ezP4$?|1&##%DpDPf0&~wCRsauMfAn$l9jq zR_J~oEz|kCzQLbkJr6>6E{jn(6s+2}F0Oatep_ac`CV44sG59FEl-fJrJ%e?cZT|^ zvt=Akq^|!>H6^Dl)g<~3g^RoRM@{`{ICyWsHF}Cqq!o#yxXY{##S|!N#n6LZHasD5 zl7-$x+HpE@?n2^>4oM=6B8e{8;#LonB1Y&%^Lav$Id@I!i2-83m{2xC1%iVim_%S9 z3;NA#INc(lQmuAhYGNMG-aqwj-2`-wjif_?1ZI`(Mw6LA=?r2mpj(odZB_8$;aNB|5*_Vp85xPZ^F(T;>L z`CO=ft}CJUvNV2s*gD=wV*k`U?*i#X>qYbffObx@THsovOcWnwTVz1G-eq>35dnCZA~47HF8A@_}fXGfyu2lzy-`G5NO zRec5D`}vn)69ME8s`wr$5F|&*25}!b6_J&MOqW>Z+SG@^mNq-pk%|63pXvLmrb|Ak z*0L6P4(Sin#Xh`{hoL3sy3fJ8yMoqPYk@z~bm}E7`#0>pS@chr;wQEF27nSTYBaa2 z!t1!?2gc1fX9~@k2${jxA~*Ki(p-9i#&MVqVOMhEq6tZyIzVg0)Xi{w8|!IyDR-{S)SiPI4@AJOPZ2k?!2c5-#;41qQ~TVP8WeDJnXk{2I++LM_{bn& zNY6W=ySFQHk2bCzHx(rB-53%|DP=*`pxa{bpNWUZd|=Ius})H^x8j~2!SMEcXCSAo zU9X$}-^Qxhq2XGAhZm(s+W|?1yoGN%d)kT9 zfsR=rTNbRS_U#ptG3u#t{zB4Zr#A3)f~+Hg!*(($$6P)oL52Mq z`@3eYe`BJbI6R-_p<=5!C_D~r^-$Di+x}TFz;BlHX~R@hzbfak;x^5P$cZ+?AjXlx z&m3fgP5O-D+?FkOa{=e3$2ky}k`Hy4z0eFU1wIo7dqaW|Ctq^L^S5O5eRLXGPRRCB zH&1xL1nknOydpghme>)=lqJypqpZb!fkC)^FWJALDK=6HvL$$B6qVM(zi80|ng~x0 zK5!uHlXTgNcV0yqgZippT~v+3s29ooSzJS%l8SNm!0m^6NUANR#T@p8R4 z8QuMtF`!!K`?Gh!bOW^`JIHS@#rW=SrA?f$eKsn>WAMJsJckS%aW@?p9?L@~lKvh5 zF(T81)cw%_kzM{2Aa@HFVXVVckrSr`*;B$(Q-nxzx^a+%^qVA&$849~X*LiSXwu3z zZA19`k4q=%-1C^iVv%l+>#fKae8bF>cQ8^SS*h@!= zhc$99=p7<+U$)oQhNTUrYX?sg=>$n+$7~*gRm12E)AV|s9|U5V4VaHkPcd!pf+!Gw!Ab)2OIR9Z za{F1zWrbC>+#B(m+Uoilm8*#wXh)Q!bdyL$ikhbQqSvMooNg}of?#SZstGVQ#{gviBVx;dXg{Q9a4L-O7PRYr^ z06cKG3Y^VVO5?yQ(9Wd;O0Ki_#yN>sotz+mwb%#!;_M@Kv3apfq0GroQ?c z8Pq7vFPm7CyN}Erb=B+6@u0Y*X}~`y4FQI@V2ZWT6+mnxd7Vv0HWBzTT)z?-ZAYa= ze%JO6(51tBU-?7IGw89D9aI-fqLrmDt&ecq*G?ymWvBtF>q+qTxFT$63+>eJ%_pIi z2-j<5BKmc}JF}>UPuA7!N?ak<8(=BI#q7%zO=gea@1*rLu%QODq@X6|JH-!vAQFn40KBZdSU=uaSS z_BK`gnk)v&MRq$*Ye5YjsC*XBu)u2dj4SzUPPZ}TL*U;GwD-0H0PT0iQQEOS@B3^L_uUVYc3XY7Qt|Jb9G4O|(G-)=NWa7<^du1@+0x6e81d&5AdJGgKJ+?eroW6;R5A-@x?oPeJx!AY)zqKO>Fk z|InP}vx!L9*gEku)o(y~ zeBR9H4^!MH$RKB-xZy+lCCA?mdT<*C-b4-qKpby7N_T-5U-A@WE*NPFD{w)@x`gke z`>oB%cUj}V1JRf5#mJ5;*^njvC<+pJ7eyE;f(z|~)!3t4-mMX3!)2-{VYcN&E= z>iUQV)pqx#kbomh8pi@9u|#}et6g^CSNdL}8jcx7D0f{S`vcj_BG!zgdzGB{;E$BNps620K1KKn^YelMSB z22jM&;)lDVw$rg8B&G@_*u;~IFA zdtFZ?@5_z04YDC^J|rf<2=8RU)D-Xyt56DyHBt#|<1I*u7~JKuXh26N`76T2_1k9W zWv&PZSjDyS=tEZtusZwdX8W46>3DcgUs&@f@Fa_4wfEM9v( zE@%)<}Geqq5R$;fa zJ*>e$=5aA~!?P;+C%o}5Tp3oc$~{;s5)%`m4Y=V}fg-*HVPf#M_hfd@6?by@5klYz zrjaG9Znxu2MAPelcIWhqoCb}c;MNxr8|SqiNO#ZAOm(jkZaapy^h9A?j{(hZsBJfs zcLQ+3nRuX&Ki_TP z?pSiB41($<9#5dDc72?K)+L6AbYc=zarp{GXZZVS=q+JV_JiK4Mmhu9{lnztTk3w} zaETcbWiQwGpri~BmgAao{J-TmoXLAY+rIBZRVz%2|HtiY#>#Ocqplf??@ zMJ(z`iVq%8xkULxZ>%FYhdI{$Q34lMgnZg=gPn&)(@JUnk)RzceVj*vuw(0)l>m}Z zKxJwUZ-suN3%kIT87VOq(MYnPuwoBsKpas)N`#tJn6q0Rdtkx*VNYe6=c!X@laK$)VJg2UJ-) z^g8ukuS_cEU_+o$<8f%q2Xv6Z&>v&}3#6*>r63K0Ww@5{%ackff0 z1*)0uyr4?&hSXi&u=+WGEM(zM?`3}+#Rt_B1gc$-DnYb{$|^c68kMP!Pc!dyu8N47w>rd_s%cXo8QORqfuq#)vaUkWd5B}j ztB87em)#e4Xet}lI1B)*q<1N{^PkoWKO<_3pX1hiD06G)6CG0WxA64K#Oano4NJD4 z-}b$tjm>m$@?6s!dh=>Cb-zwX%6uc8M!L~e8Z3l; zP%c9om;UU{D`6e;8qap%=l@pU!wAkbk1=rib=*6Q;1R6qH=BOYK}Nq6HBZ_kH#;YX zQ#MtwO>saJ7(#(+6K=0t3WsrKp@IQxn!M<*W?ypRf{kND0zW2f)`=3()D9;4h=@yNC}DWEyDc&BE6f zCpd;n?ZtVaH%K7j1!u}O_C@OGys(FOR1AtiXPSsVBBlCwd9MOi5pQ{rFkgc(Czx)& zrCG@ED*4@MxXFKt^)@}EPFRf0UR&1rd0c>|VuPbcSoMh$$Ek30Lk7!}E0R&8#d_+- zG;M!G1u}CWBoQahS4sjaq`6w_!>pymq@aKovq*YUwcDozA(3}2dv#rit%AYEFwMcL z-pScLw%GL}Th5yi#vIq|w&)0nt{H|b@`dbM#$PY$2h!+UF~)0eQE_AmIA5O64h~N7 zt?2&vU=*TIs0G%Vv(^5y?9?{Y#5@enZ3B1YSl56H#7se!rRO2Z8$7INGzH}E!4dlw z-$Sh*Bc)4pFS7KajN84fTp_s$4hE4&+c_*HGH1M$2)0^cB@Xv_Y9y4rn;E#(Y4_;kfR}^|_P65ev!oUx%l^%H zU^~Y*r>M1nWFr=orOagIh@x%~+5JmuWYCwNmo5lmjgjQy#!M9-ip2tO`YgWW%3OlM zAPbUvY@8$Ps;n-cHlZhtKFkkM^u{huf^AAtOegLSqGDHI*8kT1{+tC#Gx!Q*Z&6Kq z{_{kTBR@5)q(Z7r%?3?pp-lr3EpEr3Mxmy5*;Y_4L{>R;x6H@Je7hi`mx!k=oP%wQy^ko z$J2}j7jiJGlF4gppXKwJg5$N5=@vangSgh?0zcgcIp9iX<_T8@Ff(+YWwTVcHN50Z zSYiC|vuOhVO3Q7Vn)6n(k`8dAOL5aM#KmbIc{S71^;?Nat6O;kgpTMwO07{@PF$uP z;5(V|R_tG!H4SA>qFOPV3arL zn|gdy-Rzu}v9|J59nSt7M7&b+2ThW%SHy3twh|43GB5g!7?~&W5y>SrG9bI?YL%VK zgcS$G^pp@Xax-E2z@ZsEI2Cpu3r_31yLMg^aZZEX9!L-u8q9C<`>YP$R<#kse8BBm zJW#r^(O3G*e%nyuh?+5eVt_j9ks|Dcwt(wMZ@8U{f9KNP-jd56KkOq%t;AspusOlY4fuH9DC&}={M$0D5@i|0pcrTk)$aoDkR{<2uMoM|$F}s)3creA4;){@t=&s{gU~@A;i> z-;MQhyY+pT`5%16xP%fmz#VY`u%YtgA zZ3JiuTcb?hD%g+6|y=Bt%s=OA7@$*0zZ zIYN2#*J7F*Q&~T0&AE$hQrs$sx;^- z-PTN+x~@60EiNkRL0|n{&6E3YBFSqeK7_yTXdY|Bs^n4JL}o!eD|vWzkj|5bHNT&S zkLT_8vgS8?tH}3Xk8PHocJ^0~Z!sj<5@~4l{k{#SrvABZuRHY6k~3MEQ=DR4ciBpJ zsjmn&P9vfP2Aa7HXD-vPI61Dy4X zXzGPaB-2ZFjf&92+~29~6Jyx5V6rCSeailPe6#$0!uN6b`XyW43y^5>i_Au; zF3zo=H1X-@?)2H$_>=n987y&f9BEo@`SbfHUoP~Mwfyqhw*SG|&v6}j{|O(T+Q#SREEfmYJVGqPP?68GqOOaqP>{^r#&2Zm&2faFDJDd*CnMg zEdu7Y5=wq6eTPYBQb#q@n5eO`b+oLk`R{`BYK-W0{+*A-2#RRYUKNm@D)NXhWB@=B zzyTZ-EHoJm1%lyXz?je!3k42A6+P} zI?c<=lytQkjw@h519SD_7YSH zUwioq=sNBRU;2yWIa$i}M;#y6ASFMErP%0D| z48kl|w5{Bi$1|#UlZ9qu=<{UbFZ2k|>rRwrFngRdgc3#*CZ`#r2 zN9KPyKLkxD#5oT$)7l71)J?2_e437uxS$w7@5j*^1Ls9b8C~0ce;GQ>f-u_+wiofQ z8pgaY>y+GvkJSZNCf0~0AC;*wmKVGUf_5yGR=L;^SP=x5rM|#N(BL!{3<-k)WFkmH zBM6)V{M@gvm->Gn9qU%y<5hj@UB<3geQK$|RqZ~jZRxLHus&Wkt^c&%S`~loUl(OJ z)!*T4n&=*=gFXx|VIk795hXT+pHsjwBD*ufDrv7wTH z5rqZc;d}mm3IjobFkmbg4F!b;V8B@@G9Zw`-`CBV8mh{?<1Xc9gp%ehD?t6kKhyjA zud3(e`)hmO&!1oJ^L2f{Y&CuVU$1Fc#QnKFrFVC0t+(y{s;(-Ymmifou$fPf{I}(! zQk^=aD*Ai2-A=CkmCKBJL%wv07gx$S;`E=WB94*$Z9Cjkgw9%S9 z(qO90HXoudTauyP2HVyCdEa+7|K=lt0Vu}UE)FGH>BlS=sfjg1NI&pMw^vyU*A_%? zI&4&kp_3S7jtCumIX3o_GN@WZpP#yRwrM@Lje?;KVWCK1EGiQU0>OZ=;4E|#2?9bB zfI^pA$Xy8pA#rk{0v|U0bLIz%`P}>0U-QxB{@^~=_+$F~b@+Wef}v5R+2#*o(&) zAJGK1XPJh-iR^drjcH0M+-n}JnD&1KREhjX!6FFbZ2`EiK{X5Sf>95UGx*gN6Cxzp zcFftGevTAjd1?yTS<6P{cxUh@)U|gq`ipE&jDWQPx7+KfD?~~`*5(O6tIPAaX>a2A z2b@6)e$qxK7D*1^PZVpSQvU$`d`m^&mh$vd(0x{Z0w}_!4>NRPbZ8tKQr6{Qm4P#KxAu+3Z|%{C^cP!l3CC&D zjse2&CrnVcA5|QzN@7@a$M=Jm-Q*sK4XD>tVxuR?l5D)Gf+$MR`2^r*%Ks77`v>!e z$Vx1v+=^p;+RT$v8>bLN5FoA2ki(_lw)$Mx=-KHZ9JHA+Tjav=SMz!;tbtMGpbxLz z;1Je~m!rf=HK^5U(^ut?*L$jxSKU%Uqa)&>9w+~*k+UASB~%2W-cOn2e~ zN2$*gDHr=jmme0TgB~jkxLR~5-SCtSJ2UFaXDqeL!L07 zEtX5l^MYoSR62F!=)_$-xpiM2g=K-FFW!()uQEHFL*Lh6;JoQp+$kiO9oO+k$u+sAz8G3P zzmpRN)?Vuw6I!?L3@V3{&VX6@xnmz{1D+5=T7>PcYXwPIQqAwEeWc{e#?Y;q( z#-tb~8~%y-6j$#GGQz&3Qq**43l}PCT}GnhiTy~p5YC|tvIe3d?GJ!zxTAz@{Ei

0`oAv;E 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 diff --git a/src/adafruit_circuitplayground/test/test_express.py b/src/adafruit_circuitplayground/test/test_express.py deleted file mode 100644 index 0732d9641..000000000 --- a/src/adafruit_circuitplayground/test/test_express.py +++ /dev/null @@ -1,115 +0,0 @@ -import pytest -from unittest import mock - -import playsound -from ..express import Express -from ..pixel import Pixel -from .. import constants as CONSTANTS - - -class TestExpress(object): - def setup_method(self): - self.cpx = Express() - self.__state = {} - self.__state[CONSTANTS.EXPRESS_STATE.BRIGHTNESS] = 1.0 - self.__state[CONSTANTS.EXPRESS_STATE.BUTTON_A] = False - self.__state[CONSTANTS.EXPRESS_STATE.BUTTON_B] = False - self.__state[CONSTANTS.EXPRESS_STATE.PIXELS] = [(255, 0, 0)] * 10 - self.__state[CONSTANTS.EXPRESS_STATE.RED_LED] = False - self.__state[CONSTANTS.EXPRESS_STATE.SWITCH] = False - self.pixels = Pixel(self.__state) - self.__speaker_enabled = False - - def test_acceleration(self): - mock_motion_x = 10 - mock_motion_y = -10 - mock_motion_z = -20 - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.MOTION_X] = mock_motion_x - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.MOTION_Y] = mock_motion_y - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.MOTION_Z] = mock_motion_z - accel = self.cpx.acceleration - assert accel[0] == 10 - assert accel[1] == -10 - assert accel[2] == -20 - - def test_button_a(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.BUTTON_A] = True - assert self.cpx.button_a - - def test_button_b(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.BUTTON_B] = True - assert self.cpx.button_b - - def test_taps(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.DETECT_TAPS] = 2 - assert 2 == self.cpx.detect_taps - - @pytest.mark.parametrize("taps, expected", [(1, 1), (2, 2), (3, 1)]) - def test_taps_setter(self, taps, expected): - self.cpx.detect_taps = taps - assert expected == self.cpx.detect_taps - - def test_red_led(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.RED_LED] = True - assert self.cpx.red_led - - def test_red_led_int(self): - self.cpx.red_led = 3 - assert self.cpx.red_led - - def test_red_led_string(self): - self.cpx.red_led = "foo" - assert self.cpx.red_led - - def test_switch(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.SWITCH] = True - assert self.cpx.switch - - def test_temperature(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TEMPERATURE] = 31 - assert 31 == self.cpx.temperature - - def test_light(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.LIGHT] = 255 - assert 255 == self.cpx.light - - def test_shake(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.SHAKE] = True - assert self.cpx.shake() - - def test_touch_A1(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][0] = True - assert self.cpx.touch_A1 - - def test_touch_A2(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][1] = True - assert self.cpx.touch_A2 - - def test_touch_A3(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][2] = True - assert self.cpx.touch_A3 - - def test_touch_A4(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][3] = True - assert self.cpx.touch_A4 - - def test_touch_A5(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][4] = True - assert self.cpx.touch_A5 - - def test_touch_A6(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][5] = True - assert self.cpx.touch_A6 - - def test_touch_A7(self): - self.cpx._Express__state[CONSTANTS.EXPRESS_STATE.TOUCH][6] = True - assert self.cpx.touch_A7 - - def test_play_file_mp4_wrong_type(self): - with pytest.raises(TypeError): - self.cpx.play_file("sample.mp4") - - def test_play_file_mp4(self): - playsound.playsound = mock.Mock() - self.cpx.play_file("sample.wav") - playsound.playsound.assert_called_once() diff --git a/src/adafruit_circuitplayground/test/test_pixel.py b/src/adafruit_circuitplayground/test/test_pixel.py deleted file mode 100644 index e1179939b..000000000 --- a/src/adafruit_circuitplayground/test/test_pixel.py +++ /dev/null @@ -1,117 +0,0 @@ -import pytest - -from ..pixel import Pixel -from .. import constants as CONSTANTS - - -class TestPixel(object): - def setup_method(self): - state = {} - state[CONSTANTS.EXPRESS_STATE.BRIGHTNESS] = 1.0 - state[CONSTANTS.EXPRESS_STATE.BUTTON_A] = False - state[CONSTANTS.EXPRESS_STATE.BUTTON_B] = False - state[CONSTANTS.EXPRESS_STATE.PIXELS] = [(255, 0, 0), (0, 255, 0), (0, 0, 255)] - state[CONSTANTS.EXPRESS_STATE.RED_LED] = False - state[CONSTANTS.EXPRESS_STATE.SWITCH] = False - self.pixel = Pixel(state) - - def test_get_item_out_of_bounds(self): - with pytest.raises(IndexError): - p = self.pixel[3] - - def test_get_item(self): - assert (0, 0, 255) == self.pixel[2] - - def test_get_item_splice(self): - assert [(255, 0, 0), (0, 255, 0)] == self.pixel[0:2] - - def test_set_item(self): - self.pixel[1] = (50, 50, 50) - assert (50, 50, 50) == self.pixel[1] - - def test_set_item_splice(self): - self.pixel[0:1] = [(100, 100, 100), (0, 0, 100)] - assert (100, 100, 100) == self.pixel[0] - assert (0, 0, 100) == self.pixel[1] - - def test_set_item_out_of_bounds(self): - with pytest.raises(IndexError): - self.pixel[3] = (0, 0, 0) - - def test_set_item_invalid(self): - with pytest.raises(ValueError): - self.pixel[0] = "hello" - - def test_len(self): - assert 3 == len(self.pixel) - - @pytest.mark.parametrize("index, expected", [(0, True), (3, False)]) - def test_valid_index(self, index, expected): - assert self.pixel._Pixel__valid_index(index) == expected - - def test_fill(self): - self.pixel.fill((123, 123, 123)) - assert all( - p == (123, 123, 123) - for p in self.pixel._Pixel__state[CONSTANTS.EXPRESS_STATE.PIXELS] - ) - - @pytest.mark.parametrize( - "val, expected", - [([3, 4, 5], (3, 4, 5)), (432, (0, 1, 176)), ((1, 2, 3), (1, 2, 3))], - ) - def test_extract_pixel_values_not_slice(self, val, expected): - assert expected == self.pixel._Pixel__extract_pixel_value(val) - - @pytest.mark.parametrize( - "val, expected", - [ - ([[3, 4, 5], [6, 7, 8]], [(3, 4, 5), (6, 7, 8)]), - ([444555, 666777], [(6, 200, 139), (10, 44, 153)]), - ([(10, 10, 10), (20, 20, 20)], [(10, 10, 10), (20, 20, 20)]), - ], - ) - def test_extract_pixel_values_slice(self, val, expected): - assert expected == self.pixel._Pixel__extract_pixel_value(val, is_slice=True) - - @pytest.mark.parametrize("val", [[1, 2, 3, 4], [1, 2], 0.3]) - def test_extract_pixel_values_fail(self, val): - with pytest.raises(ValueError): - self.pixel._Pixel__extract_pixel_value(val) - - def test_hex_to_rgb_fail(self): - with pytest.raises(ValueError): - self.pixel._Pixel__hex_to_rgb("x") - - @pytest.mark.parametrize( - "hex, expected", - [ - ("0xffffff", (255, 255, 255)), - ("0x0", (0, 0, 0)), - ("0xff0000", (255, 0, 0)), - ("0xabcdef", (171, 205, 239)), - ], - ) - def test_hex_to_rgb(self, hex, expected): - assert expected == self.pixel._Pixel__hex_to_rgb(hex) - - @pytest.mark.parametrize( - "pixValue, expected", - [(0, True), (200, True), (255, True), (-1, False), (256, False), ("1", False)], - ) - def test_valid_rgb_value(self, pixValue, expected): - assert expected == self.pixel._Pixel__valid_rgb_value(pixValue) - - def test_get_brightness(self): - self.pixel._Pixel__state[CONSTANTS.EXPRESS_STATE.BRIGHTNESS] = 0.4 - assert 0.4 == pytest.approx(self.pixel.brightness) - - @pytest.mark.parametrize("brightness", [-0.1, 1.1]) - def test_set_brightness_fail(self, brightness): - with pytest.raises(ValueError): - self.pixel.brightness = brightness - - @pytest.mark.parametrize("brightness", [0, 1, 0.4, 0.333]) - def test_set_brightness(self, brightness): - self.pixel.brightness = brightness - assert self.pixel._Pixel__valid_brightness(brightness) diff --git a/src/base_circuitpython/__init__.py b/src/base_circuitpython/__init__.py deleted file mode 100644 index 398a3936b..000000000 --- a/src/base_circuitpython/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -import pathlib -import os -import sys - -abs_path = pathlib.Path(__file__).parent.absolute() -clue_path = os.path.join(abs_path, "../clue") -sys.path.insert(0, os.path.join(abs_path)) -sys.path.insert(0, os.path.join(clue_path)) diff --git a/src/base_circuitpython/base_cp_constants.py b/src/base_circuitpython/base_cp_constants.py deleted file mode 100644 index bd93e5576..000000000 --- a/src/base_circuitpython/base_cp_constants.py +++ /dev/null @@ -1,82 +0,0 @@ -class CLUE_STATE: - BUTTON_A = "button_a" - BUTTON_B = "button_b" - PRESSED_BUTTONS = "pressed_buttons" - SEA_LEVEL_PRESSURE = "sea_level_pressure" - TEMPERATURE = "temperature" - PROXIMITY = "proximity" - GESTURE = "gesture" - HUMIDITY = "humidity" - PRESSURE = "pressure" - PIXEL = "pixel" - # Accelerometer - MOTION_X = "motion_x" - MOTION_Y = "motion_y" - MOTION_Z = "motion_z" - # Light/color sensor - LIGHT_R = "light_r" - LIGHT_G = "light_g" - LIGHT_B = "light_b" - LIGHT_C = "light_c" - # Magnetometer - MAGNET_X = "magnet_x" - MAGNET_Y = "magnet_y" - MAGNET_Z = "magnet_z" - # Gyroscope - GYRO_X = "gyro_x" - GYRO_Y = "gyro_y" - GYRO_Z = "gyro_z" - # LEDs - RED_LED = "red_led" - WHITE_LEDS = "white_leds" - - -CPX = "CPX" -CLUE = "CLUE" -PIXELS = "pixels" -SHAKE = "shake" - -CLUE_PIN = "D18" - -CLUE = "CLUE" -BASE_64 = "display_base64" -IMG_DIR_NAME = "img" -SCREEN_HEIGHT_WIDTH = 240 - -EXPECTED_INPUT_BUTTONS = set([CLUE_STATE.BUTTON_A, CLUE_STATE.BUTTON_B]) - -ALL_EXPECTED_INPUT_EVENTS = set( - [ - CLUE_STATE.TEMPERATURE, - CLUE_STATE.LIGHT_R, - CLUE_STATE.LIGHT_G, - CLUE_STATE.LIGHT_B, - CLUE_STATE.LIGHT_C, - CLUE_STATE.MOTION_X, - CLUE_STATE.MOTION_Y, - CLUE_STATE.MOTION_Z, - CLUE_STATE.HUMIDITY, - CLUE_STATE.PRESSURE, - CLUE_STATE.PROXIMITY, - CLUE_STATE.GESTURE, - CLUE_STATE.GYRO_X, - CLUE_STATE.GYRO_Y, - CLUE_STATE.GYRO_Z, - CLUE_STATE.MAGNET_X, - CLUE_STATE.MAGNET_Y, - CLUE_STATE.MAGNET_Z, - ] -) - -BMP_IMG = "BMP" - -BMP_IMG_ENDING = ".bmp" - -NO_VALID_IMGS_ERR = "No valid images" - -BLINKA_BMP = "blinka.bmp" -CLUE_TERMINAL_LINE_HEIGHT = 16 -CLUE_TERMINAL_LINE_NUM_MAX = 15 -CLUE_TERMINAL_X_OFFSET = 15 -CLUE_TERMINAL_Y_OFFSET = 5 -CLUE_TERMINAL_LINE_BREAK_AMT = 37 diff --git a/src/base_circuitpython/board.py b/src/base_circuitpython/board.py deleted file mode 100644 index 8bef9ed4f..000000000 --- a/src/base_circuitpython/board.py +++ /dev/null @@ -1,128 +0,0 @@ -# dummy class for references to board display to work -# https://learn.adafruit.com/arduino-to-circuitpython/the-board-module - - -import terminal_handler - - -class __Display: - def __init__(self): - self.active_group = None - self.terminal = terminal_handler.Terminal() - - def show(self, group=None): - if group != self.active_group: - self.active_group = group - - if group == None: - self.terminal._Terminal__draw() - return - - # if the group has no attribute called - # "draw", then it is liable for updating itself - # when it calls show - if hasattr(group, "_Group__draw"): - group._Group__draw() - - -DISPLAY = __Display() - -# default pin for neopixel, -# shows that this could -# refer to the CPX -# or CLUE neopixel pin -NEOPIXEL = "D00" - -# ETC PINS WITHIN THE CLUE THAT MAY BE REFERENCED -# found by runing print(dir(board)) on clue -A0 = 0 -A1 = 0 -A2 = 0 -A3 = 0 -A4 = 0 -A5 = 0 -A6 = 0 -A7 = 0 - -ACCELEROMETER_GYRO_INTERRUPT = 0 - -BUTTON_A = 0 -BUTTON_B = 0 - -D0 = 0 -D1 = 0 -D2 = 0 -D3 = 0 -D4 = 0 -D5 = 0 -D6 = 0 -D7 = 0 -D8 = 0 -D9 = 0 -D10 = 0 -D11 = 0 -D12 = 0 -D13 = 0 -D14 = 0 -D15 = 0 -D16 = 0 -D17 = 0 -D18 = 0 -D19 = 0 -D20 = 0 - -I2C = 0 - -L = 0 - -MICROPHONE_CLOCK = 0 -MICROPHONE_DATA = 0 - -MISO = 0 -MOSI = 0 - -P0 = 0 -P1 = 0 -P2 = 0 -P3 = 0 -P4 = 0 -P5 = 0 -P6 = 0 -P7 = 0 -P8 = 0 -P9 = 0 -P10 = 0 -P11 = 0 -P12 = 0 -P13 = 0 -P14 = 0 -P15 = 0 -P16 = 0 -P17 = 0 -P18 = 0 -P19 = 0 -P20 = 0 - -PROXIMITY_LIGHT_INTERRUPT = 0 - -RX = 0 -SCK = 0 -SCL = 0 -SDA = 0 - -SPEAKER = 0 - -SPI = 0 - -TFT_BACKLIGHT = 0 -TFT_CS = 0 -TFT_DC = 0 -TFT_MOSI = 0 -TFT_RESET = 0 -TFT_SCK = 0 - -TX = 0 - -UART = 0 - -WHITE_LEDS = 0 diff --git a/src/base_circuitpython/digitalio.py b/src/base_circuitpython/digitalio.py deleted file mode 100644 index 604db72c3..000000000 --- a/src/base_circuitpython/digitalio.py +++ /dev/null @@ -1,17 +0,0 @@ -# dummy class for neopixel library to work - -# original implementation docs for digitalio: -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/digitalio/__init__.html - - -class DigitalInOut: - def __init__(self, pin): - self.pin = pin - pass - - def deinit(self): - pass - - -class Direction: - OUTPUT = 0 diff --git a/src/base_circuitpython/displayio/__init__.py b/src/base_circuitpython/displayio/__init__.py deleted file mode 100644 index a926bf965..000000000 --- a/src/base_circuitpython/displayio/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# Displayio implementation loosely based on the -# displayio package in Adafruit CircuitPython - -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/__init__.html - -from .bitmap import Bitmap -from .group import Group -from .palette import Palette - -# references to img and bmp_img are for testing purposes -from .tile_grid import TileGrid diff --git a/src/base_circuitpython/displayio/bitmap.py b/src/base_circuitpython/displayio/bitmap.py deleted file mode 100644 index c913dff2b..000000000 --- a/src/base_circuitpython/displayio/bitmap.py +++ /dev/null @@ -1,105 +0,0 @@ -from . import constants as CONSTANTS - -# Bitmap implementation loosely based on the -# displayio.Bitmap class in Adafruit CircuitPython - -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/Bitmap.html - -# The colour of a certain pixel is interpreted -# within the TileGrid instance that the object -# lives within. Each pixel is an integer value -# that refers to the colours in the palette via index. - - -class Bitmap: - """ - .. currentmodule:: displayio - - `Bitmap` -- Stores values in a 2D array - ========================================================================== - - Stores values of a certain size in a 2D array - - .. class:: Bitmap(width, height, value_count) - - Create a Bitmap object with the given fixed size. Each pixel stores a value that is used to - index into a corresponding palette. This enables differently colored sprites to share the - underlying Bitmap. value_count is used to minimize the memory used to store the Bitmap. - - :param int width: The number of values wide - :param int height: The number of values high - :param int value_count: The number of possible pixel values. - - """ - - def __init__(self, width, height, value_count=255): - self.__width = width - self.__height = height - self.values = bytearray(width * height) - - @property - def width(self): - """ - .. attribute:: width - - Width of the bitmap. (read only) - - """ - return self.__width - - @property - def height(self): - """ - .. attribute:: height - - Height of the bitmap. (read only) - - """ - return self.__height - - def __setitem__(self, index, value): - """ - .. method:: __setitem__(index, value) - - Sets the value at the given index. The index can either be an x,y tuple or an int equal - to ``y * width + x``. - - This allows you to:: - - bitmap[0,1] = 3 - - """ - if isinstance(index, tuple): - if index[0] >= self.width or index[1] >= self.height: - raise IndexError(CONSTANTS.PIXEL_OUT_OF_BOUNDS) - - index = index[0] + index[1] * self.width - - try: - self.values[index] = value - except IndexError: - raise IndexError(CONSTANTS.PIXEL_OUT_OF_BOUNDS) - - def __getitem__(self, index): - """ - .. method:: __getitem__(index) - - Returns the value at the given index. The index can either be an x,y tuple or an int equal - to ``y * width + x``. - - This allows you to:: - - print(bitmap[0,1]) - - """ - - if isinstance(index, tuple): - if index[0] >= self.width or index[1] >= self.height: - raise IndexError(CONSTANTS.PIXEL_OUT_OF_BOUNDS) - - index = index[0] + index[1] * self.width - - try: - return self.values[index] - except IndexError: - raise IndexError(CONSTANTS.PIXEL_OUT_OF_BOUNDS) diff --git a/src/base_circuitpython/displayio/color_type.py b/src/base_circuitpython/displayio/color_type.py deleted file mode 100644 index c56347315..000000000 --- a/src/base_circuitpython/displayio/color_type.py +++ /dev/null @@ -1,12 +0,0 @@ -# Datatype for the items within a palette -class _ColorType: - def __init__(self, rgb888): - self.rgb888 = rgb888 - self.transparent = False - - def __eq__(self, other): - return ( - isinstance(other, _ColorType) - and self.rgb888 == other.rgb888 - and self.transparent == other.transparent - ) diff --git a/src/base_circuitpython/displayio/constants.py b/src/base_circuitpython/displayio/constants.py deleted file mode 100644 index bca672472..000000000 --- a/src/base_circuitpython/displayio/constants.py +++ /dev/null @@ -1,12 +0,0 @@ -PIXEL_OUT_OF_BOUNDS = "pixel coordinates out of bounds" -PALETTE_OUT_OF_RANGE = "Palette index out of range" -TILE_OUT_OF_BOUNDS = "Tile index out of bounds" -INCORR_SUBCLASS = "Layer must be a Group or TileGrid subclass." -LAYER_ALREADY_IN_GROUP = "Layer already in a group." -GROUP_FULL = "Group Full" -SCALE_TOO_SMALL = "scale must be >= 1" - -SCREEN_HEIGHT_WIDTH = 240 - -CLUE = "CLUE" -BASE_64 = "display_base64" diff --git a/src/base_circuitpython/displayio/group.py b/src/base_circuitpython/displayio/group.py deleted file mode 100644 index 5acc1f2a8..000000000 --- a/src/base_circuitpython/displayio/group.py +++ /dev/null @@ -1,354 +0,0 @@ -import base64 -from io import BytesIO -from PIL import Image -import adafruit_display_text - -from displayio.tile_grid import TileGrid -from . import constants as CONSTANTS - -import common -import board -import sys - -# Group implementation loosely based on the -# displayio.Group class in Adafruit CircuitPython -# (with only the functions needed for the CLUE) - -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/Group.html - - -class Group: - """ - `Group` -- Group together sprites and subgroups - ========================================================================== - - Manage a group of sprites and groups and how they are inter-related. - - .. class:: Group(*, max_size=4, scale=1, x=0, y=0) - Create a Group of a given size and scale. Scale is in one dimension. For example, scale=2 - leads to a layer's pixel being 2x2 pixels when in the group. - :param int max_size: The maximum group size. - :param int scale: Scale of layer pixels in one dimension. - :param int x: Initial x position within the parent. - :param int y: Initial y position within the parent. - """ - - def __init__( - self, - max_size=sys.maxsize, - scale=1, - x=0, - y=0, - check_active_group_ref=True, - auto_write=True, - ): - self.__check_active_group_ref = check_active_group_ref - self.__auto_write = auto_write - self.__contents = [] - self.__max_size = max_size - - if scale < 1: - raise ValueError(CONSTANTS.SCALE_TOO_SMALL) - - self.__scale = scale - """ - .. attribute:: scale - - Scales each pixel within the Group in both directions. For example, when scale=2 each pixel - will be represented by 2x2 pixels. - - """ - self.__x = x - """ - .. attribute:: x - - X position of the Group in the parent. - - """ - self.__y = y - """ - .. attribute:: y - - Y position of the Group in the parent. - """ - self.__parent = None - self.__hidden = False - - @property - def x(self): - return self.__x - - @x.setter - def x(self, val): - if self.__x != val: - self.__x = val - self.__elem_changed() - - @property - def y(self): - return self.__y - - @y.setter - def y(self, val): - if self.__y != val: - self.__y = val - self.__elem_changed() - - @property - def scale(self): - return self.__scale - - @scale.setter - def scale(self, val): - if val < 1: - raise ValueError(CONSTANTS.SCALE_TOO_SMALL) - - if self.__scale != val: - self.__scale = val - self.__elem_changed() - - @property - def hidden(self): - """ - .. attribute:: hidden - - True when the Group and all of it's layers are not visible. When False, the Group's layers - are visible if they haven't been hidden. - """ - return self.__hidden - - @hidden.setter - def hidden(self, val): - changed = val != self.__hidden - self.__hidden = val - for elem in self.__contents: - elem.hidden = val - - if changed: - self.__elem_changed() - - def append(self, item): - """ - .. method:: append(layer) - - Append a layer to the group. It will be drawn above other layers. - """ - self.__prepare_for_add(item) - self.__contents.append(item) - self.__elem_changed() - - def insert(self, idx, item): - """ - .. method:: insert(index, layer) - - Insert a layer into the group. - """ - self.__prepare_for_add(item) - self.__contents.insert(idx, item) - self.__elem_changed() - - def index(self, layer): - """ - .. method:: index(layer) - - Returns the index of the first copy of layer. Raises ValueError if not found. - """ - for idx, elem in enumerate(self.__contents): - if elem == layer: - return idx - - return ValueError() - - def pop(self, i=-1): - """ - .. method:: pop(i=-1) - - Remove the ith item and return it. - """ - item = self.__contents.pop(i) - self.__set_parent(item, None) - self.__elem_changed() - return item - - def remove(self, layer): - """ - .. method:: remove(layer) - - Remove the first copy of layer. Raises ValueError if it is not present. - """ - idx = self.index(layer) - item = self.__contents[idx] - - self.__set_parent(item, None) - self.__contents.pop(idx) - self.__elem_changed() - - def __delitem__(self, index): - """ - .. method:: __delitem__(index) - - Deletes the value at the given index. - - This allows you to:: - - del group[0] - """ - item = self.__contents[index] - self.__set_parent(item, None) - del self.__contents[index] - self.__elem_changed() - - def __getitem__(self, index): - """ - .. method:: __getitem__(index) - - Returns the value at the given index. - - This allows you to:: - - print(group[0]) - - """ - return self.__contents[index] - - def __setitem__(self, index, val): - """ - .. method:: __setitem__(index, value) - - Sets the value at the given index. - - This allows you to:: - - group[0] = sprite - """ - old_val = self.__contents[index] - - self.__contents[index] = val - if old_val != val: - self.__elem_changed() - - def __len__(self): - """ - .. method:: __len__() - - Returns the number of layers in a Group - """ - if not self.__contents: - return 0 - else: - return len(self.__contents) - - @property - def __in_group(self): - return self.__parent != None - - def __prepare_for_add(self, item): - if len(self.__contents) == self.__max_size: - raise RuntimeError(CONSTANTS.GROUP_FULL) - elif not isinstance(item, TileGrid) and not isinstance(item, Group): - raise ValueError(CONSTANTS.INCORR_SUBCLASS) - elif (isinstance(item, Group) and item._Group__in_group) or ( - isinstance(item, TileGrid) and item._TileGrid__in_group - ): - raise ValueError(CONSTANTS.LAYER_ALREADY_IN_GROUP) - self.__set_parent(item, self) - - def __set_parent(self, item, val): - if isinstance(item, TileGrid): - item._TileGrid__parent = val - else: - item._Group__parent = val - - def __elem_changed(self): - # Ensure that this group is what the board is currently showing. - # Otherwise, don't bother to draw it. - if self.__auto_write: - self.__trigger_draw() - - def __trigger_draw(self): - # select the correct parent to draw from if necessary - if self.__check_active_group_ref and board.DISPLAY.active_group == self: - self.__draw() - - elif self.__in_group: - # If a sub-group is modified, propagate to top level to - # see if one of the parents are the current active group. - self.__parent._Group__elem_changed() - - def __draw(self, img=None, x=0, y=0, scale=None, show=True): - # this function is not a part of the orignal implementation - # it is what draws itself and its children and potentially shows it to the - # frontend - if img == None: - img = Image.new( - "RGBA", - (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), - (0, 0, 0, 0), - ) - if scale is None: - scale = self.scale - else: - scale *= self.scale - - try: - if isinstance(self, adafruit_display_text.label.Label): - # adafruit_display_text has some positioning considerations - # that need to be handled. - - # This was found manually, display must be positioned upwards - # 1 unit (1 unit * scale = scale) - y -= scale - - # Group is positioned against anchored_position (already incorporated into self.x and self.y), - # which is positioned against anchor_point - - x += self._anchor_point[0] - y += self._anchor_point[1] - except AttributeError: - pass - - for elem in self.__contents: - if not elem.hidden: - if isinstance(elem, Group): - img = elem._Group__draw( - img=img, x=x + self.x, y=y + self.y, scale=scale, show=False, - ) - else: - img = elem._TileGrid__draw( - img=img, x=x + self.x, y=y + self.y, scale=scale - ) - - # show should only be true to the highest parent group - if show: - self.__show(img) - - # return value only used if this is within another group - return img - - def __show(self, img): - # sends current img to the frontend - buffered = BytesIO() - img.save(buffered, format="BMP") - byte_base64 = base64.b64encode(buffered.getvalue()) - img_str = str(byte_base64)[2:-1] - - sendable_json = {CONSTANTS.BASE_64: img_str} - - if common.utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - sendable_json, CONSTANTS.CLUE - ) - else: - common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) - - def __len__(self): - if not self.__contents: - return 0 - else: - return len(self.__contents) - - def pop(self, i=-1): - item = self.__contents.pop(i) - item.parent = None - self.__elem_changed() - return item diff --git a/src/base_circuitpython/displayio/palette.py b/src/base_circuitpython/displayio/palette.py deleted file mode 100644 index b954d982b..000000000 --- a/src/base_circuitpython/displayio/palette.py +++ /dev/null @@ -1,81 +0,0 @@ -from .color_type import _ColorType -from . import constants as CONSTANTS - -# Palette implementation loosely based on the -# displayio.Palette class in Adafruit CircuitPython -# (with only the functions needed for the CLUE) - -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/Palette.html - - -class Palette: - """ - `Palette` -- Stores a mapping from bitmap pixel palette_indexes to display colors - ========================================================================================= - - Map a pixel palette_index to a full color. Colors are transformed to the display's format internally to - save memory. - - .. class:: Palette(color_count) - - Create a Palette object to store a set number of colors. - - :param int color_count: The number of colors in the Palette - """ - - def __init__(self, color_count): - self.__color_count = color_count - self.__contents = [] - - # set all colours to black by default - for i in range(self.__color_count): - self.__contents.append(_ColorType((0, 0, 0))) - - def __setitem__(self, index, value): - """ - .. method:: __setitem__(index, value) - - Sets the pixel color at the given index. The index should be an integer in the range 0 to color_count-1. - - The value argument represents a color, and can be from 0x000000 to 0xFFFFFF (to represent an RGB value). - Value can be an int, bytes (3 bytes (RGB) or 4 bytes (RGB + pad byte)), bytearray, - or a tuple or list of 3 integers. - - This allows you to:: - - palette[0] = 0xFFFFFF # set using an integer - palette[1] = b'\xff\xff\x00' # set using 3 bytes - palette[2] = b'\xff\xff\x00\x00' # set using 4 bytes - palette[3] = bytearray(b'\x00\x00\xFF') # set using a bytearay of 3 or 4 bytes - palette[4] = (10, 20, 30) # set using a tuple of 3 integers - - """ - if index >= self.__color_count: - raise IndexError(CONSTANTS.PALETTE_OUT_OF_RANGE) - - self.__contents[index].rgb888 = value - - def __len__(self): - """ - .. method:: __len__() - - Returns the number of colors in a Palette - - """ - return self.__color_count - - def make_transparent(self, index): - """ - .. method:: make_transparent(palette_index) - """ - self.__toggle_transparency(index, True) - - def make_opaque(self, index): - """ - .. method:: make_opaque(palette_index) - """ - self.__toggle_transparency(index, False) - - def __toggle_transparency(self, index, transparency): - if self.__contents[index]: - self.__contents[index].transparent = transparency diff --git a/src/base_circuitpython/displayio/test/__init__.py b/src/base_circuitpython/displayio/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/base_circuitpython/displayio/test/img/group_test_result.bmp b/src/base_circuitpython/displayio/test/img/group_test_result.bmp deleted file mode 100644 index 3dfdad5fce9797b69f25281ee08d44dad30c16e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeIwv5lQo7zW{MlRL$71ytYyoYNMK&LQ_ZN@H&)@%=`+aWrBJh&HT+Gjd zUw(r>BX9`l`H=A5KtRtoSo95tfSwNt?+pa>e1k>ba0ux6knr9>K+iW=^bLoAo(~D{ z4FvRjgGJwP2e1k>ba0ux6knr9>K+iW=^bLoA zo(~D{4FvRjgGJwP2|Eu&|R(dXt#jWRB({pJoZavqUo=anK>$%qS zTpEj8&$XuK(pcPjt~EWE#^TmjP0yvVxb<9XdM=H{t>;?Pb7?GYJ=dC^ zOJi~Cxz_Yt8jD-cwWjCNSloK9H9eQc;?{Gm>A5r(x1MWF&!w@r^;~OuE{(;l=UUTq zX)JC%*P5P7V{z-b*7RH&i(AjNrsvXF+YfaCk zvAFeIYkDq?#jWRB({pJoZavqUo=anK>$%qSTpEj8&$XuK(pcPjt~EWE#^TmjP0yvVxb<9XdM=H{t>;?Pb7?GYJ=dC^OJi~Cxz_Yt8jD-cwWjCNSloK9H9eQc z;?{Gm>A5r(x1MWF&!w@r^;~OuE{(;l=UUTqX)JC%*P5P7V{z-b*7RH&i(AjNrsvXF z+8JWb7|P?1oXUa(ETN#=hCp(3Fvvjd(7y-q;S>jvFl0(veDd!2xu*A2SA1oT`Q_BsJQuN!oK3Fx^r>~#Wq zUN`9e63}yL*y{xJyl&9_C7|chu-6IbdEKD8JWb7|P?1oXUa z(ETN#=hCp(3Fvvjd(7y-q;S>jvFl0(veDd!2xu z*A2SA1oT`Q_BsJQuN!oK3Fx^r>~#WqUN`9e63}yL*y{xJyl&9_C7|chu-6IbdEKD< zOF+-1VXqU=^SVLzmw=v2!(Jz#=XHbbF9AK5hP_Te&+7)=UjlkA4SSt{p4Sb!zXbGL z8umH?J+B*de+lThH0*T(dR{l^{u0o0Y1r!o^t^7+{UxC1(y-SF=y~0s`%6I2rD3lV L(DS-M_m{xmwbZOQ diff --git a/src/base_circuitpython/displayio/test/test_bitmap.py b/src/base_circuitpython/displayio/test/test_bitmap.py deleted file mode 100644 index 2967aa632..000000000 --- a/src/base_circuitpython/displayio/test/test_bitmap.py +++ /dev/null @@ -1,44 +0,0 @@ -import pytest -from ..bitmap import Bitmap -from .. import constants as CONSTANTS - - -class TestBitmap(object): - @pytest.mark.parametrize("x, y", [(1, 1), (2, 6), (0, 0)]) - def test_create_bitmap(self, x, y): - bitmap = Bitmap(x, y) - - @pytest.mark.parametrize("x, y, palette_num", [(1, 1, 4), (2, 3, 6), (4, 4, 9)]) - def test_set_and_get_pixel(self, x, y, palette_num): - bitmap = Bitmap(5, 5) - bitmap[x, y] = palette_num - assert palette_num == bitmap[x, y] - - @pytest.mark.parametrize("i, palette_num", [(1, 1), (24, 2)]) - def test_set_and_get_pixel_singular_index(self, i, palette_num): - bitmap = Bitmap(5, 5) - bitmap[i] = palette_num - assert palette_num == bitmap[i] - - @pytest.mark.parametrize( - "x_size, y_size, x_coord, y_coord", - [(1, 1, 0, 4), (1, 1, 4, 0), (200, 200, 300, 1), (200, 200, 1, 300)], - ) - def test_get_set_index_err(self, x_size, y_size, x_coord, y_coord): - bitmap = Bitmap(x_size, y_size) - - with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): - bitmap[x_coord, y_coord] = 0 - - with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): - val = bitmap[x_coord, y_coord] - - @pytest.mark.parametrize("x_size, y_size, i", [(1, 1, 3), (200, 200, 40000)]) - def test_get_set_index_err_singular_index(self, x_size, y_size, i): - bitmap = Bitmap(x_size, y_size) - - with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): - bitmap[i] = 0 - - with pytest.raises(IndexError, match=CONSTANTS.PIXEL_OUT_OF_BOUNDS): - val = bitmap[i] diff --git a/src/base_circuitpython/displayio/test/test_group.py b/src/base_circuitpython/displayio/test/test_group.py deleted file mode 100644 index 3e4b3601e..000000000 --- a/src/base_circuitpython/displayio/test/test_group.py +++ /dev/null @@ -1,174 +0,0 @@ -import sys -import os -import pytest -import pathlib - -from unittest import mock - -from common import utils - -from displayio.tile_grid import TileGrid -from displayio.group import Group -from displayio.palette import Palette -from displayio.bitmap import Bitmap -from .. import constants as CONSTANTS -from PIL import Image - - -class TestGroup(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - self.dummy_bitmap = Bitmap(500, 500) - self.dummy_palette = Palette(5) - self.dummy_pos = (0, 0) - - utils.send_to_simulator = mock.Mock() - - def test_append_tilegrid_group_to_group(self): - tg1 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - tg2 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - g1 = Group(max_size=10) - g2 = Group(max_size=10) - - g2.append(g1) - g2.append(tg1) - g2.append(tg2) - - assert len(g2._Group__contents) == 3 - assert len(g1._Group__contents) == 0 - - @pytest.mark.parametrize("group_item", [(""), (5), ((4, 5))]) - def test_incorr_subclass(self, group_item): - g1 = Group(max_size=10) - with pytest.raises(ValueError, match=CONSTANTS.INCORR_SUBCLASS): - g1.append(group_item) - - @pytest.mark.parametrize("scale", [(0), (-2)]) - def test_invalid_scale(self, scale): - with pytest.raises(ValueError, match=CONSTANTS.SCALE_TOO_SMALL): - g1 = Group(scale=scale) - - def test_layer_already_in_group(self): - g1 = Group(max_size=4) - - tg1 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - tg2 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - g1.append(tg1) - - # should allow this, since it checks equality by reference: - g1.append(tg2) - - # should throw error for same group by reference - with pytest.raises(ValueError, match=CONSTANTS.LAYER_ALREADY_IN_GROUP): - g1.append(tg1) - - def test_group_full(self): - g1 = Group(max_size=1) - - tg1 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - tg2 = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - position=self.dummy_pos, - ) - - g1.append(tg1) - - with pytest.raises(RuntimeError, match=CONSTANTS.GROUP_FULL): - g1.append(tg2) - - @pytest.mark.parametrize( - "size_w,size_h,draw_w,draw_h,accent_colors,x_offset,y_offset,scale_sub,scale_main", - [ - ( - (30, 27), - (63, 34), - (10, 11), - (40, 20), - ((244, 266, 23), (134, 26, 3)), - 3, - 9, - 2, - 3, - ) - ], - ) - def test_draw_group( - self, - size_w, - size_h, - draw_w, - draw_h, - accent_colors, - x_offset, - y_offset, - scale_sub, - scale_main, - ): - palette = Palette(3) - palette[1] = accent_colors[0] - palette[2] = accent_colors[1] - - bmp_1 = Bitmap(size_w[0], size_h[0]) - bmp_2 = Bitmap(size_w[1], size_h[1]) - - for i in range(draw_h[0]): - for j in range(draw_w[0]): - try: - bmp_1[j, i] = 1 - except IndexError: - continue - - for i in range(draw_h[1]): - for j in range(draw_w[1]): - try: - bmp_2[j, i] = 2 - except IndexError: - continue - - tg = TileGrid(bitmap=bmp_1, pixel_shader=palette, position=(0, 0)) - tg2 = TileGrid(bitmap=bmp_2, pixel_shader=palette, position=(50, 50)) - - group_main = Group(max_size=10, scale=scale_main, check_active_group_ref=False) - group_sub = Group(max_size=10, scale=scale_sub) - - group_sub.append(tg) - group_main.append(group_sub) - group_main.append(tg2) - img = group_main._Group__draw() - - img.putalpha(255) - expected = Image.open( - os.path.join(self.abs_path, "img", "group_test_result.bmp") - ) - expected.putalpha(255) - bmp_img_expected = expected.load() - bmp_img = img.load() - for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - assert bmp_img_expected[j, i] == bmp_img[j, i] diff --git a/src/base_circuitpython/displayio/test/test_palette.py b/src/base_circuitpython/displayio/test/test_palette.py deleted file mode 100644 index 8b0d1aa38..000000000 --- a/src/base_circuitpython/displayio/test/test_palette.py +++ /dev/null @@ -1,31 +0,0 @@ -import pytest -from ..palette import Palette -from .. import constants as CONSTANTS -from ..color_type import _ColorType - - -class TestPalette(object): - @pytest.mark.parametrize( - "color_count, palette_num, val", - [(11, 5, (255, 255, 255)), (1, 0, (255, 0, 255)), (4, 3, (0, 0, 0))], - ) - def test_get_and_set_palette(self, color_count, palette_num, val): - palette = Palette(color_count) - palette[palette_num] = val - assert palette._Palette__contents[palette_num] == _ColorType(val) - - @pytest.mark.parametrize("palette_size, palette_index", [(3, 7), (0, 0), (3, 3)]) - def test_get_and_set_palette_err(self, palette_size, palette_index): - palette = Palette(palette_size) - with pytest.raises(IndexError, match=CONSTANTS.PALETTE_OUT_OF_RANGE): - palette[palette_index] = 0 - - def test_set_transparency(self): - palette = Palette(5) - assert palette._Palette__contents[2].transparent == False - - palette.make_transparent(2) - assert palette._Palette__contents[2].transparent == True - - palette.make_opaque(2) - assert palette._Palette__contents[2].transparent == False diff --git a/src/base_circuitpython/displayio/test/test_tile_grid.py b/src/base_circuitpython/displayio/test/test_tile_grid.py deleted file mode 100644 index 1f2d9d5fa..000000000 --- a/src/base_circuitpython/displayio/test/test_tile_grid.py +++ /dev/null @@ -1,173 +0,0 @@ -import pytest -from PIL import Image -from ..tile_grid import TileGrid -from ..palette import Palette -from ..bitmap import Bitmap -from .. import constants as CONSTANTS - - -class TestTileGrid(object): - def setup_method(self): - self.dummy_bitmap = Bitmap(500, 500) - self.dummy_palette = Palette(5) - self.dummy_pos = (0, 0) - - @pytest.mark.parametrize( - "bitmap_w,bitmap_h,palette_num,tile_width,tile_height,position", - [(1, 1, 3, 1, 1, (0, 5)), (5, 7, 4, 2, 3, (0, 5))], - ) - def test_basic_constructor( - self, bitmap_w, bitmap_h, palette_num, tile_width, tile_height, position - ): - # constructor with position tuple - tg1 = TileGrid( - bitmap=Bitmap(bitmap_w, bitmap_h), - pixel_shader=Palette(palette_num), - tile_width=tile_width, - tile_height=tile_height, - position=position, - ) - - # alternate constructor with no position tuple - - tg2 = TileGrid( - bitmap=Bitmap(bitmap_w, bitmap_h), - pixel_shader=Palette(palette_num), - tile_width=tile_width, - tile_height=tile_height, - x=position[0], - y=position[1], - ) - - tile_grids = [tg1, tg2] - - for tg in tile_grids: - assert tg._TileGrid__bitmap.width == bitmap_w - assert tg._TileGrid__bitmap.height == bitmap_h - assert len(tg.pixel_shader._Palette__contents) == palette_num - assert tg._TileGrid__tile_width == tile_width - assert tg._TileGrid__tile_height == tile_height - assert tg.x == position[0] - assert tg.y == position[1] - - # alternate constructor with no height and width -> takes the bitmap's height and width - tg3 = TileGrid( - bitmap=Bitmap(bitmap_w, bitmap_h), - pixel_shader=Palette(palette_num), - x=position[0], - y=position[1], - ) - - assert tg3._TileGrid__bitmap.width == bitmap_w - assert tg3._TileGrid__bitmap.height == bitmap_h - assert len(tg3.pixel_shader._Palette__contents) == palette_num - assert tg3._TileGrid__tile_width == bitmap_w - assert tg3._TileGrid__tile_height == bitmap_h - assert tg3.x == position[0] - assert tg3.y == position[1] - - @pytest.mark.parametrize( - "w, h, x, y", [(5, 5, 2, 1), (2, 7, 0, 0), (66, 88, 65, 87)] - ) - def test_tile_set_get(self, w, h, x, y): - tg = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - tile_width=w, - tile_height=h, - position=self.dummy_pos, - ) - - tg_x_y = tg[x, y] - assert tg_x_y == tg._TileGrid__bitmap[x, y] - - @pytest.mark.parametrize( - "w, h, x, y", [(55, 56, 100, 1), (55, 56, 0, 56), (66, 88, 66, 88)] - ) - def test_tile_out_of_bounds(self, w, h, x, y): - tg = TileGrid( - bitmap=self.dummy_bitmap, - pixel_shader=self.dummy_palette, - tile_width=w, - tile_height=h, - position=self.dummy_pos, - ) - with pytest.raises(IndexError, match=CONSTANTS.TILE_OUT_OF_BOUNDS): - tg_x_y = tg[x, y] - - @pytest.mark.parametrize( - "size_w, size_h, x, y, draw_w, draw_h, bg_color, accent_color, x_offset, y_offset, scale", - [ - (10, 10, 5, 5, 5, 5, (3, 0, 0, 255), (244, 255, 23, 255), 2, 0, 2), - (100, 30, 2, 3, 6, 3, (255, 255, 255, 255), (45, 45, 77, 255), 0, 7, 5), - ], - ) - def test_draw( - self, - size_w, - size_h, - x, - y, - draw_w, - draw_h, - bg_color, - accent_color, - x_offset, - y_offset, - scale, - ): - - palette = Palette(2) - palette[0] = bg_color - palette[1] = accent_color - - bmp = Bitmap(size_w, size_h) - - for i in range(size_h): - for j in range(size_w): - bmp[j, i] = 0 - - for i in range(y, y + draw_h): - for j in range(x, x + draw_w): - try: - bmp[j, i] = 1 - except IndexError: - continue - - tg = TileGrid(bitmap=bmp, pixel_shader=palette, position=(0, 0)) - tg2 = TileGrid(bitmap=bmp, pixel_shader=palette, position=(0, 0)) - img = Image.new( - "RGBA", (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - # without scaling, test output - img = tg._TileGrid__draw(img, x_offset, y_offset, 1) - bmp_img = img.load() - for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - if (i in range(y_offset + y, y_offset + y + draw_h)) and ( - j in range(x_offset + x, x_offset + x + draw_w) - ): - assert bmp_img[j, i] == accent_color - elif (i in range(y_offset, y_offset + size_h)) and ( - j in range(x_offset, x_offset + size_w) - ): - assert bmp_img[j, i] == bg_color - - img = Image.new( - "RGBA", (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - # with scaling, test output - img = tg._TileGrid__draw(img, x_offset, y_offset, scale) - bmp_img = img.load() - for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - if ( - i in range(y_offset + y * scale, y_offset + (y + draw_h) * scale) - ) and ( - j in range(x_offset + x * scale, x_offset + (x + draw_w) * scale) - ): - assert bmp_img[j, i] == accent_color - elif (i in range(y_offset * scale, (y_offset + draw_h) * scale)) and ( - j in range(x_offset * scale, (x_offset + draw_w) * scale) - ): - assert bmp_img[j, i] == bg_color diff --git a/src/base_circuitpython/displayio/tile_grid.py b/src/base_circuitpython/displayio/tile_grid.py deleted file mode 100644 index ad948cfde..000000000 --- a/src/base_circuitpython/displayio/tile_grid.py +++ /dev/null @@ -1,280 +0,0 @@ -from PIL import Image, ImageColor -from . import constants as CONSTANTS -import threading -import queue -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# TileGrid implementation loosely based on the -# displayio.TileGrid class in Adafruit CircuitPython -# (with only the functions needed for the CLUE) -# this version of the class only supports a single tile, -# therefore, get/set functionality is a bit different. - -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/TileGrid.html - - -class TileGrid: - """ - `TileGrid` -- A grid of tiles sourced out of one bitmap - ========================================================================== - - Position a grid of tiles sourced from a bitmap and pixel_shader combination. Multiple grids - can share bitmaps and pixel shaders. - - A single tile grid is also known as a Sprite. - - .. class:: TileGrid(bitmap, *, pixel_shader, width=1, height=1, tile_width=None, tile_height=None, default_tile=0, x=0, y=0) - - Create a TileGrid object. The bitmap is source for 2d pixels. The pixel_shader is used to - convert the value and its location to a display native pixel color. This may be a simple color - palette lookup, a gradient, a pattern or a color transformer. - - tile_width and tile_height match the height of the bitmap by default. - - :param displayio.Bitmap bitmap: The bitmap storing one or more tiles. - :param displayio.Palette pixel_shader: The pixel shader that produces colors from values - :param int width: Width of the grid in tiles. - :param int height: Height of the grid in tiles. - :param int tile_width: Width of a single tile in pixels. Defaults to the full Bitmap and must evenly divide into the Bitmap's dimensions. - :param int tile_height: Height of a single tile in pixels. Defaults to the full Bitmap and must evenly divide into the Bitmap's dimensions. - :param int default_tile: Default tile index to show. - :param int x: Initial x position of the left edge within the parent. - :param int y: Initial y position of the top edge within the parent. - """ - - def __init__( - self, - bitmap, - pixel_shader, - default_tile=0, - tile_width=None, - tile_height=None, - x=0, - y=0, - position=None, - ): - self.x = None - """ - .. attribute:: x - - X position of the left edge in the parent. - """ - self.y = None - """ - .. attribute:: y - - Y position of the top edge in the parent. - """ - self.pixel_shader = pixel_shader - """ - .. attribute:: pixel_shader - - The pixel shader of the tilegrid. - """ - self.hidden = False - """ - .. attribute:: hidden - - True when the TileGrid is hidden. This may be False even when a part of a hidden Group. - """ - - self.__bitmap = bitmap - self.__tile_width = None - self.__tile_height = None - - if tile_width is None: - self.__tile_width = bitmap.width - else: - self.__tile_width = tile_width - - if tile_height is None: - self.__tile_height = bitmap.height - else: - self.__tile_height = tile_height - - if position and isinstance(position, tuple): - self.x = position[0] - self.y = position[1] - else: - self.x = x - self.y = y - - self.__parent = None - - # unimplemented features - self.__flip_x = False - self.__flip_y = False - self.__transpose_xy = False - - telemetry_py.send_telemetry(TelemetryEvent.CLUE_API_TILE_GRID) - - @property - def flip_x(self): - """ - .. attribute:: flip_x - - If true, the left edge rendered will be the right edge of the right-most tile. - """ - return self.__flip_x - - @flip_x.setter - def flip_x(self, val): - utils.print_for_unimplemented_functions(TileGrid.flip_x.__name_) - self.__flip_x = val - - @property - def flip_y(self): - - """ - .. attribute:: flip_y - - If true, the top edge rendered will be the bottom edge of the bottom-most tile. - """ - return self.__flip_y - - @flip_y.setter - def flip_y(self, val): - utils.print_for_unimplemented_functions(TileGrid.flip_y.__name_) - self.__flip_y = val - - @property - def transpose_xy(self): - - """ - .. attribute:: transpose_xy - - If true, the TileGrid's axis will be swapped. When combined with mirroring, any 90 degree - rotation can be achieved along with the corresponding mirrored version. - """ - return self.__transpose_xy - - @transpose_xy.setter - def transpose_xy(self, val): - utils.print_for_unimplemented_functions(TileGrid.transpose_xy.__name_) - self.__transpose_xy = val - - # setitem for an index simply gets the index of the bitmap - # rather than the tile index - def __setitem__(self, index, value): - """ - .. method:: __setitem__(index, tile_index) - Sets the tile index at the given index. The index can either be an x,y tuple or an int equal - to ``y * width + x``. - - This allows you to:: - - grid[0] = 10 - - or:: - - grid[0,0] = 10 - """ - if isinstance(index, tuple): - if index[0] >= self.__tile_width or index[1] >= self.__tile_height: - raise IndexError(CONSTANTS.TILE_OUT_OF_BOUNDS) - - self.__bitmap[index] = value - - # getitem for an index simply gets the index of the bitmap - # rather than the tile index - def __getitem__(self, index): - """ - .. method:: __getitem__(index) - Returns the tile index at the given index. The index can either be an x,y tuple or an int equal - to ``y * width + x``. - - This allows you to:: - - print(grid[0]) - """ - if isinstance(index, tuple): - if index[0] >= self.__tile_width or index[1] >= self.__tile_height: - raise IndexError(CONSTANTS.TILE_OUT_OF_BOUNDS) - - return self.__bitmap[index] - - @property - def __in_group(self): - return self.__parent != None - - # methods that are not in the origin class: - - def __draw(self, img, x, y, scale): - # draw the current bitmap with - # appropriate scale on the global bmp_img - x = self.x * scale + x - y = self.y * scale + y - - new_shape = self.__draw_group( - x, y, 0, self.__tile_height, 0, self.__tile_width, scale - ) - - img.paste(new_shape, (x, y), new_shape) - return img - - def __draw_group(self, x, y, y_start, y_end, x_start, x_end, scale): - height = y_end - y_start - width = x_end - x_start - - this_img = Image.new("RGBA", (width * scale, height * scale), (0, 0, 0, 0)) - this_img.putalpha(0) - this_bmp_img = this_img.load() - - for i in range(y_start, y_end): - for j in range(x_start, x_end): - x_offset = j * scale - y_offset = i * scale - - x_max = min(x_offset + scale, width * scale) - y_max = min(y_offset + scale, height * scale) - - curr_val = self.__bitmap[j, i] - palette_obj = self.pixel_shader._Palette__contents[curr_val] - - transparent = palette_obj.transparent - - if not transparent and x_offset >= 0 and y_offset >= 0: - - curr_colour = palette_obj.rgb888 - self.__fill_pixel( - curr_val, - curr_colour, - x_offset, - y_offset, - scale, - x_max, - y_max, - this_bmp_img, - ) - - return this_img - - # helper method for drawing pixels on bmp_img - # given the src, offset, and scale - def __fill_pixel( - self, - curr_val, - curr_colour, - x_offset, - y_offset, - scale, - x_max, - y_max, - this_bmp_img, - ): - - for new_y in range(y_offset, y_max): - for new_x in range(x_offset, x_max): - try: - if isinstance(curr_colour, tuple): - this_bmp_img[new_x, new_y] = curr_colour - else: - this_bmp_img[new_x, new_y] = ( - (curr_colour >> 16) & 255, - (curr_colour >> 8) & 255, - (curr_colour) & 255, - ) - except IndexError: - pass diff --git a/src/base_circuitpython/fontio.py b/src/base_circuitpython/fontio.py deleted file mode 100644 index 3c7e567bd..000000000 --- a/src/base_circuitpython/fontio.py +++ /dev/null @@ -1,14 +0,0 @@ -# dummy library for adafruit_bitmap_font to work - -# original implementation docs for fontio: -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/fontio/__init__.html - -# file taken from adafruit_bitmap_font's examples: -# https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font/blob/master/test/fontio.py -import collections -import displayio - -Glyph = collections.namedtuple( - "Glyph", - ["bitmap", "tile_index", "width", "height", "dx", "dy", "shift_x", "shift_y"], -) diff --git a/src/base_circuitpython/fonts/ter-u12n.bdf b/src/base_circuitpython/fonts/ter-u12n.bdf deleted file mode 100644 index 390d0a1e8..000000000 --- a/src/base_circuitpython/fonts/ter-u12n.bdf +++ /dev/null @@ -1,25240 +0,0 @@ -STARTFONT 2.1 -FONT -xos4-Terminus-Medium-R-Normal--12-120-72-72-C-60-ISO10646-1 -SIZE 12 72 72 -FONTBOUNDINGBOX 6 12 0 -2 -STARTPROPERTIES 20 -FAMILY_NAME "Terminus" -FOUNDRY "xos4" -SETWIDTH_NAME "Normal" -ADD_STYLE_NAME "" -COPYRIGHT "Copyright (C) 2018 Dimitar Toshkov Zhekov" -NOTICE "Licensed under the SIL Open Font License, Version 1.1" -WEIGHT_NAME "Medium" -SLANT "R" -PIXEL_SIZE 12 -POINT_SIZE 120 -RESOLUTION_X 72 -RESOLUTION_Y 72 -SPACING "C" -AVERAGE_WIDTH 60 -CHARSET_REGISTRY "ISO10646" -CHARSET_ENCODING "1" -MIN_SPACE 6 -FONT_ASCENT 10 -FONT_DESCENT 2 -DEFAULT_CHAR 65533 -ENDPROPERTIES -CHARS 1326 -STARTCHAR char0 -ENCODING 0 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -D8 -88 -00 -88 -88 -00 -88 -D8 -00 -00 -ENDCHAR -STARTCHAR space -ENCODING 32 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR exclam -ENCODING 33 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -20 -20 -20 -00 -20 -20 -00 -00 -ENDCHAR -STARTCHAR quotedbl -ENCODING 34 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -50 -50 -50 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR numbersign -ENCODING 35 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -F8 -50 -50 -F8 -50 -50 -00 -00 -ENDCHAR -STARTCHAR dollar -ENCODING 36 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -A8 -A0 -70 -28 -A8 -70 -20 -00 -ENDCHAR -STARTCHAR percent -ENCODING 37 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -48 -A8 -50 -10 -20 -28 -54 -48 -00 -00 -ENDCHAR -STARTCHAR ampersand -ENCODING 38 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -50 -20 -68 -90 -90 -68 -00 -00 -ENDCHAR -STARTCHAR quotesingle -ENCODING 39 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -20 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR parenleft -ENCODING 40 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -40 -40 -40 -40 -20 -10 -00 -00 -ENDCHAR -STARTCHAR parenright -ENCODING 41 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -10 -10 -10 -10 -20 -40 -00 -00 -ENDCHAR -STARTCHAR asterisk -ENCODING 42 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -50 -20 -F8 -20 -50 -00 -00 -00 -ENDCHAR -STARTCHAR plus -ENCODING 43 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -20 -20 -F8 -20 -20 -00 -00 -00 -ENDCHAR -STARTCHAR comma -ENCODING 44 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -20 -20 -40 -00 -ENDCHAR -STARTCHAR hyphen -ENCODING 45 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -F8 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR period -ENCODING 46 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -20 -20 -00 -00 -ENDCHAR -STARTCHAR slash -ENCODING 47 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -08 -10 -10 -20 -20 -40 -40 -00 -00 -ENDCHAR -STARTCHAR zero -ENCODING 48 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -98 -A8 -C8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR one -ENCODING 49 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -60 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR two -ENCODING 50 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -08 -10 -20 -40 -F8 -00 -00 -ENDCHAR -STARTCHAR three -ENCODING 51 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -08 -30 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR four -ENCODING 52 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -18 -28 -48 -88 -F8 -08 -08 -00 -00 -ENDCHAR -STARTCHAR five -ENCODING 53 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -F0 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR six -ENCODING 54 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -80 -80 -F0 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR seven -ENCODING 55 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -08 -08 -10 -10 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR eight -ENCODING 56 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -70 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR nine -ENCODING 57 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -78 -08 -08 -70 -00 -00 -ENDCHAR -STARTCHAR colon -ENCODING 58 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -20 -20 -00 -00 -20 -20 -00 -00 -ENDCHAR -STARTCHAR semicolon -ENCODING 59 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -20 -20 -00 -00 -20 -20 -40 -00 -ENDCHAR -STARTCHAR less -ENCODING 60 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -10 -20 -40 -20 -10 -08 -00 -00 -ENDCHAR -STARTCHAR equal -ENCODING 61 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -00 -00 -F8 -00 -00 -00 -00 -ENDCHAR -STARTCHAR greater -ENCODING 62 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -20 -10 -08 -10 -20 -40 -00 -00 -ENDCHAR -STARTCHAR question -ENCODING 63 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -10 -20 -00 -20 -20 -00 -00 -ENDCHAR -STARTCHAR at -ENCODING 64 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -98 -A8 -A8 -98 -80 -78 -00 -00 -ENDCHAR -STARTCHAR A -ENCODING 65 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR B -ENCODING 66 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -F0 -88 -88 -88 -F0 -00 -00 -ENDCHAR -STARTCHAR C -ENCODING 67 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -80 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR D -ENCODING 68 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -90 -88 -88 -88 -88 -90 -E0 -00 -00 -ENDCHAR -STARTCHAR E -ENCODING 69 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR F -ENCODING 70 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -F0 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR G -ENCODING 71 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -80 -B8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR H -ENCODING 72 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -F8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR I -ENCODING 73 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR J -ENCODING 74 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -38 -10 -10 -10 -10 -90 -90 -60 -00 -00 -ENDCHAR -STARTCHAR K -ENCODING 75 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -90 -A0 -C0 -C0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR L -ENCODING 76 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -80 -80 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR M -ENCODING 77 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -D8 -A8 -A8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR N -ENCODING 78 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -C8 -A8 -98 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR O -ENCODING 79 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR P -ENCODING 80 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -88 -F0 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR Q -ENCODING 81 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -A8 -70 -08 -00 -ENDCHAR -STARTCHAR R -ENCODING 82 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -88 -F0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR S -ENCODING 83 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -70 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR T -ENCODING 84 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -20 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR U -ENCODING 85 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR V -ENCODING 86 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -50 -50 -50 -20 -20 -00 -00 -ENDCHAR -STARTCHAR W -ENCODING 87 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -A8 -A8 -D8 -88 -00 -00 -ENDCHAR -STARTCHAR X -ENCODING 88 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -20 -20 -50 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Y -ENCODING 89 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR Z -ENCODING 90 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -08 -10 -20 -40 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR bracketleft -ENCODING 91 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -40 -40 -40 -40 -40 -40 -70 -00 -00 -ENDCHAR -STARTCHAR backslash -ENCODING 92 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -20 -20 -10 -10 -08 -08 -00 -00 -ENDCHAR -STARTCHAR bracketright -ENCODING 93 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -10 -10 -10 -10 -10 -10 -70 -00 -00 -ENDCHAR -STARTCHAR asciicircum -ENCODING 94 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -50 -88 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR underscore -ENCODING 95 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -F8 -00 -ENDCHAR -STARTCHAR grave -ENCODING 96 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR a -ENCODING 97 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR b -ENCODING 98 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -F0 -88 -88 -88 -88 -F0 -00 -00 -ENDCHAR -STARTCHAR c -ENCODING 99 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR d -ENCODING 100 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -08 -78 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR e -ENCODING 101 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR f -ENCODING 102 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -18 -20 -70 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR g -ENCODING 103 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR h -ENCODING 104 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR i -ENCODING 105 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -00 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR j -ENCODING 106 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -08 -08 -00 -18 -08 -08 -08 -08 -08 -48 -30 -ENDCHAR -STARTCHAR k -ENCODING 107 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -48 -50 -60 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR l -ENCODING 108 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR m -ENCODING 109 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -A8 -A8 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR n -ENCODING 110 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR o -ENCODING 111 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR p -ENCODING 112 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -F0 -80 -80 -ENDCHAR -STARTCHAR q -ENCODING 113 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -88 -88 -88 -88 -78 -08 -08 -ENDCHAR -STARTCHAR r -ENCODING 114 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -B8 -C0 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR s -ENCODING 115 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -80 -70 -08 -08 -F0 -00 -00 -ENDCHAR -STARTCHAR t -ENCODING 116 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -20 -20 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR u -ENCODING 117 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR v -ENCODING 118 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -50 -50 -20 -20 -00 -00 -ENDCHAR -STARTCHAR w -ENCODING 119 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -A8 -A8 -A8 -70 -00 -00 -ENDCHAR -STARTCHAR x -ENCODING 120 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -50 -20 -20 -50 -88 -00 -00 -ENDCHAR -STARTCHAR y -ENCODING 121 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR z -ENCODING 122 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -10 -20 -40 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR braceleft -ENCODING 123 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -18 -20 -20 -40 -20 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR bar -ENCODING 124 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -20 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR braceright -ENCODING 125 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -10 -10 -08 -10 -10 -10 -60 -00 -00 -ENDCHAR -STARTCHAR asciitilde -ENCODING 126 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -48 -A8 -90 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR nbspace -ENCODING 160 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR exclamdown -ENCODING 161 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -00 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR cent -ENCODING 162 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -70 -A8 -A0 -A0 -A8 -70 -20 -00 -ENDCHAR -STARTCHAR sterling -ENCODING 163 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -30 -48 -40 -F0 -40 -40 -48 -F8 -00 -00 -ENDCHAR -STARTCHAR currency -ENCODING 164 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -30 -48 -48 -30 -48 -00 -00 -00 -ENDCHAR -STARTCHAR yen -ENCODING 165 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -20 -70 -20 -70 -20 -00 -00 -ENDCHAR -STARTCHAR brokenbar -ENCODING 166 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -20 -00 -00 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR section -ENCODING 167 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -30 -48 -20 -50 -48 -28 -10 -48 -30 -00 -00 -ENDCHAR -STARTCHAR dieresis -ENCODING 168 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR copyright -ENCODING 169 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -84 -B4 -A4 -A4 -B4 -84 -78 -00 -00 -ENDCHAR -STARTCHAR ordfeminine -ENCODING 170 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -08 -38 -48 -38 -00 -78 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR guillemotleft -ENCODING 171 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -14 -28 -50 -A0 -50 -28 -14 -00 -00 -ENDCHAR -STARTCHAR logicalnot -ENCODING 172 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -08 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR softhyphen -ENCODING 173 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -78 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR registered -ENCODING 174 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -84 -B4 -AC -B4 -AC -84 -78 -00 -00 -ENDCHAR -STARTCHAR macron -ENCODING 175 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR degree -ENCODING 176 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -50 -20 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR plusminus -ENCODING 177 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -20 -F8 -20 -20 -00 -F8 -00 -00 -ENDCHAR -STARTCHAR twosuperior -ENCODING 178 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -30 -48 -10 -20 -78 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR threesuperior -ENCODING 179 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -70 -08 -30 -08 -70 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR acute -ENCODING 180 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR mu -ENCODING 181 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -98 -E8 -80 -80 -ENDCHAR -STARTCHAR paragraph -ENCODING 182 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -A8 -A8 -A8 -68 -28 -28 -28 -00 -00 -ENDCHAR -STARTCHAR periodcentered -ENCODING 183 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -20 -20 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR cedilla -ENCODING 184 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -20 -20 -40 -ENDCHAR -STARTCHAR onesuperior -ENCODING 185 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -10 -30 -10 -10 -38 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR ordmasculine -ENCODING 186 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -48 -48 -48 -30 -00 -78 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR guillemotright -ENCODING 187 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -A0 -50 -28 -14 -28 -50 -A0 -00 -00 -ENDCHAR -STARTCHAR onequarter -ENCODING 188 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -C0 -44 -48 -50 -20 -48 -98 -28 -78 -08 -08 -ENDCHAR -STARTCHAR onehalf -ENCODING 189 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -C0 -44 -48 -50 -20 -40 -98 -24 -08 -10 -3C -ENDCHAR -STARTCHAR threequarters -ENCODING 190 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -E0 -10 -60 -14 -E8 -10 -24 -4C -94 -3C -04 -04 -ENDCHAR -STARTCHAR questiondown -ENCODING 191 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -00 -20 -40 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Agrave -ENCODING 192 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Aacute -ENCODING 193 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Acircumflex -ENCODING 194 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Atilde -ENCODING 195 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Adieresis -ENCODING 196 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Aring -ENCODING 197 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR AE -ENCODING 198 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -7C -90 -90 -FC -90 -90 -90 -9C -00 -00 -ENDCHAR -STARTCHAR Ccedilla -ENCODING 199 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -80 -80 -80 -88 -70 -20 -40 -ENDCHAR -STARTCHAR Egrave -ENCODING 200 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Eacute -ENCODING 201 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Ecircumflex -ENCODING 202 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Edieresis -ENCODING 203 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Igrave -ENCODING 204 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Iacute -ENCODING 205 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Icircumflex -ENCODING 206 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Idieresis -ENCODING 207 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Eth -ENCODING 208 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -90 -88 -E8 -88 -88 -90 -E0 -00 -00 -ENDCHAR -STARTCHAR Ntilde -ENCODING 209 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -88 -88 -C8 -A8 -98 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Ograve -ENCODING 210 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Oacute -ENCODING 211 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Ocircumflex -ENCODING 212 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Otilde -ENCODING 213 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Odieresis -ENCODING 214 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR multiply -ENCODING 215 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -50 -20 -50 -88 -00 -00 -00 -ENDCHAR -STARTCHAR Oslash -ENCODING 216 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -74 -88 -98 -A8 -C8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Ugrave -ENCODING 217 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Uacute -ENCODING 218 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Ucircumflex -ENCODING 219 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Udieresis -ENCODING 220 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Yacute -ENCODING 221 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR Thorn -ENCODING 222 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -F0 -88 -88 -88 -F0 -80 -80 -00 -00 -ENDCHAR -STARTCHAR germandbls -ENCODING 223 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -90 -90 -F0 -88 -88 -C8 -B0 -00 -00 -ENDCHAR -STARTCHAR agrave -ENCODING 224 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR aacute -ENCODING 225 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR acircumflex -ENCODING 226 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR atilde -ENCODING 227 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR adieresis -ENCODING 228 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR aring -ENCODING 229 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR ae -ENCODING 230 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -28 -68 -B0 -A0 -78 -00 -00 -ENDCHAR -STARTCHAR ccedilla -ENCODING 231 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -80 -80 -88 -70 -20 -40 -ENDCHAR -STARTCHAR egrave -ENCODING 232 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR eacute -ENCODING 233 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR ecircumflex -ENCODING 234 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR edieresis -ENCODING 235 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR igrave -ENCODING 236 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR iacute -ENCODING 237 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR icircumflex -ENCODING 238 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR idieresis -ENCODING 239 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR eth -ENCODING 240 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -A0 -40 -A0 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR ntilde -ENCODING 241 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR ograve -ENCODING 242 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR oacute -ENCODING 243 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR ocircumflex -ENCODING 244 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR otilde -ENCODING 245 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR odieresis -ENCODING 246 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR divide -ENCODING 247 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -20 -00 -F8 -00 -20 -20 -00 -00 -ENDCHAR -STARTCHAR oslash -ENCODING 248 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -74 -98 -A8 -C8 -88 -70 -00 -00 -ENDCHAR -STARTCHAR ugrave -ENCODING 249 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR uacute -ENCODING 250 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR ucircumflex -ENCODING 251 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR udieresis -ENCODING 252 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR yacute -ENCODING 253 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR thorn -ENCODING 254 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -F0 -88 -88 -88 -88 -F0 -80 -80 -ENDCHAR -STARTCHAR ydieresis -ENCODING 255 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR Amacron -ENCODING 256 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR amacron -ENCODING 257 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Abreve -ENCODING 258 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR abreve -ENCODING 259 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Aogonek -ENCODING 260 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -F8 -88 -88 -88 -10 -0C -ENDCHAR -STARTCHAR aogonek -ENCODING 261 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -08 -78 -88 -88 -78 -10 -0C -ENDCHAR -STARTCHAR Cacute -ENCODING 262 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -70 -88 -80 -80 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR cacute -ENCODING 263 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -70 -88 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Ccircumflex -ENCODING 264 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -70 -88 -80 -80 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR ccircumflex -ENCODING 265 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -70 -88 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Cdotaccent -ENCODING 266 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -70 -88 -80 -80 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR cdotaccent -ENCODING 267 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -88 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Ccaron -ENCODING 268 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -80 -80 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR ccaron -ENCODING 269 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -88 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Dcaron -ENCODING 270 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -A0 -40 -E0 -90 -88 -88 -88 -88 -90 -E0 -00 -00 -ENDCHAR -STARTCHAR dcaron -ENCODING 271 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -08 -08 -78 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Dcroat -ENCODING 272 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -90 -88 -E8 -88 -88 -90 -E0 -00 -00 -ENDCHAR -STARTCHAR dcroat -ENCODING 273 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -3C -08 -78 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Emacron -ENCODING 274 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR emacron -ENCODING 275 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR Ebreve -ENCODING 276 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR ebreve -ENCODING 277 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR Edotaccent -ENCODING 278 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR edotaccent -ENCODING 279 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR Eogonek -ENCODING 280 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -F0 -80 -80 -80 -F8 -10 -0C -ENDCHAR -STARTCHAR eogonek -ENCODING 281 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -F8 -80 -80 -78 -20 -18 -ENDCHAR -STARTCHAR Ecaron -ENCODING 282 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR ecaron -ENCODING 283 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR Gcircumflex -ENCODING 284 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -70 -88 -80 -80 -B8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR gcircumflex -ENCODING 285 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR Gbreve -ENCODING 286 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -80 -80 -B8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR gbreve -ENCODING 287 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR Gdotaccent -ENCODING 288 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -70 -88 -80 -80 -B8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR gdotaccent -ENCODING 289 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR Gcommaaccent -ENCODING 290 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -80 -B8 -88 -88 -70 -20 -40 -ENDCHAR -STARTCHAR gcommaaccent -ENCODING 291 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR Hcircumflex -ENCODING 292 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -88 -88 -88 -F8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR hcircumflex -ENCODING 293 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -80 -80 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Hbar -ENCODING 294 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -48 -FC -48 -78 -48 -48 -48 -48 -00 -00 -ENDCHAR -STARTCHAR hbar -ENCODING 295 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -F0 -40 -70 -48 -48 -48 -48 -00 -00 -ENDCHAR -STARTCHAR Itilde -ENCODING 296 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR itilde -ENCODING 297 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Imacron -ENCODING 298 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR imacron -ENCODING 299 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Ibreve -ENCODING 300 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR ibreve -ENCODING 301 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Iogonek -ENCODING 302 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -20 -20 -20 -20 -20 -20 -70 -20 -18 -ENDCHAR -STARTCHAR iogonek -ENCODING 303 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -00 -60 -20 -20 -20 -20 -70 -20 -18 -ENDCHAR -STARTCHAR Idotaccent -ENCODING 304 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR dotlessi -ENCODING 305 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR IJ -ENCODING 306 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -88 -A8 -A8 -90 -00 -00 -ENDCHAR -STARTCHAR ij -ENCODING 307 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -88 -88 -00 -98 -88 -88 -88 -88 -88 -28 -10 -ENDCHAR -STARTCHAR Jcircumflex -ENCODING 308 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -28 -38 -10 -10 -10 -10 -90 -90 -60 -00 -00 -ENDCHAR -STARTCHAR jcircumflex -ENCODING 309 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -14 -18 -08 -08 -08 -08 -08 -48 -30 -ENDCHAR -STARTCHAR Kcommaaccent -ENCODING 310 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -90 -A0 -C0 -C0 -A0 -90 -A8 -20 -40 -ENDCHAR -STARTCHAR kcommaaccent -ENCODING 311 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -48 -50 -60 -60 -50 -68 -20 -40 -ENDCHAR -STARTCHAR kgreenlandic -ENCODING 312 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -48 -50 -60 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR Lacute -ENCODING 313 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -40 -80 -80 -80 -80 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR lacute -ENCODING 314 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -60 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Lcommaaccent -ENCODING 315 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -80 -80 -80 -80 -80 -F8 -20 -40 -ENDCHAR -STARTCHAR lcommaaccent -ENCODING 316 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -20 -20 -20 -20 -20 -20 -70 -20 -40 -ENDCHAR -STARTCHAR Lcaron -ENCODING 317 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -80 -80 -80 -80 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR lcaron -ENCODING 318 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -60 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Ldot -ENCODING 319 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -80 -90 -90 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR ldot -ENCODING 320 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -20 -20 -24 -24 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Lslash -ENCODING 321 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -40 -60 -C0 -40 -40 -7C -00 -00 -ENDCHAR -STARTCHAR lslash -ENCODING 322 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -20 -20 -30 -60 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Nacute -ENCODING 323 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -88 -88 -C8 -A8 -98 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR nacute -ENCODING 324 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Ncommaaccent -ENCODING 325 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -C8 -A8 -98 -88 -88 -A8 -20 -40 -ENDCHAR -STARTCHAR ncommaaccent -ENCODING 326 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -A8 -20 -40 -ENDCHAR -STARTCHAR Ncaron -ENCODING 327 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -88 -88 -C8 -A8 -98 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR ncaron -ENCODING 328 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR napostrophe -ENCODING 329 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -40 -40 -80 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Eng -ENCODING 330 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -C8 -A8 -98 -88 -88 -88 -08 -10 -ENDCHAR -STARTCHAR eng -ENCODING 331 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -88 -08 -10 -ENDCHAR -STARTCHAR Omacron -ENCODING 332 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR omacron -ENCODING 333 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Obreve -ENCODING 334 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR obreve -ENCODING 335 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Ohungarumlaut -ENCODING 336 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR ohungarumlaut -ENCODING 337 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR OE -ENCODING 338 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -7C -90 -90 -9C -90 -90 -90 -7C -00 -00 -ENDCHAR -STARTCHAR oe -ENCODING 339 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -A8 -A8 -B0 -A0 -78 -00 -00 -ENDCHAR -STARTCHAR Racute -ENCODING 340 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -F0 -88 -88 -88 -F0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR racute -ENCODING 341 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -B8 -C0 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR Rcommaaccent -ENCODING 342 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -88 -F0 -A0 -90 -A8 -20 -40 -ENDCHAR -STARTCHAR rcommaaccent -ENCODING 343 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -B8 -C0 -80 -80 -80 -C0 -40 -80 -ENDCHAR -STARTCHAR Rcaron -ENCODING 344 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -F0 -88 -88 -88 -F0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR rcaron -ENCODING 345 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -B8 -C0 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR Sacute -ENCODING 346 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -70 -88 -80 -70 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR sacute -ENCODING 347 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -78 -80 -70 -08 -08 -F0 -00 -00 -ENDCHAR -STARTCHAR Scircumflex -ENCODING 348 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -70 -88 -80 -70 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR scircumflex -ENCODING 349 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -78 -80 -70 -08 -08 -F0 -00 -00 -ENDCHAR -STARTCHAR Scedilla -ENCODING 350 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -70 -08 -08 -88 -70 -20 -40 -ENDCHAR -STARTCHAR scedilla -ENCODING 351 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -80 -70 -08 -08 -F0 -20 -40 -ENDCHAR -STARTCHAR Scaron -ENCODING 352 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -80 -70 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR scaron -ENCODING 353 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -78 -80 -70 -08 -08 -F0 -00 -00 -ENDCHAR -STARTCHAR Tcedilla -ENCODING 354 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -20 -20 -20 -20 -20 -30 -10 -20 -ENDCHAR -STARTCHAR tcedilla -ENCODING 355 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -20 -20 -20 -20 -18 -10 -20 -ENDCHAR -STARTCHAR Tcaron -ENCODING 356 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -F8 -20 -20 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR tcaron -ENCODING 357 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -20 -20 -70 -20 -20 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR Tbar -ENCODING 358 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -20 -70 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR tbar -ENCODING 359 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -20 -70 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR Utilde -ENCODING 360 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR utilde -ENCODING 361 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Umacron -ENCODING 362 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR umacron -ENCODING 363 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Ubreve -ENCODING 364 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR ubreve -ENCODING 365 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Uring -ENCODING 366 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -A8 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uring -ENCODING 367 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -A8 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Uhungarumlaut -ENCODING 368 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uhungarumlaut -ENCODING 369 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR Uogonek -ENCODING 370 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -88 -88 -88 -70 -20 -18 -ENDCHAR -STARTCHAR uogonek -ENCODING 371 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -78 -10 -0C -ENDCHAR -STARTCHAR Wcircumflex -ENCODING 372 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -88 -88 -88 -88 -A8 -A8 -D8 -88 -00 -00 -ENDCHAR -STARTCHAR wcircumflex -ENCODING 373 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -88 -88 -A8 -A8 -A8 -70 -00 -00 -ENDCHAR -STARTCHAR Ycircumflex -ENCODING 374 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR ycircumflex -ENCODING 375 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -50 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR Ydieresis -ENCODING 376 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR Zacute -ENCODING 377 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -F8 -08 -10 -20 -40 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR zacute -ENCODING 378 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -F8 -10 -20 -40 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Zdotaccent -ENCODING 379 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -F8 -08 -10 -20 -40 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR zdotaccent -ENCODING 380 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -F8 -10 -20 -40 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Zcaron -ENCODING 381 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -F8 -08 -10 -20 -40 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR zcaron -ENCODING 382 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -F8 -10 -20 -40 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR longs -ENCODING 383 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -18 -20 -20 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni0186 -ENCODING 390 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -08 -08 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni018E -ENCODING 398 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -08 -08 -78 -08 -08 -08 -F8 -00 -00 -ENDCHAR -STARTCHAR Schwa -ENCODING 399 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -08 -08 -F8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni0190 -ENCODING 400 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -60 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR florin -ENCODING 402 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -28 -20 -70 -20 -20 -20 -20 -A0 -40 -ENDCHAR -STARTCHAR uni019D -ENCODING 413 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -C8 -A8 -98 -88 -88 -C8 -40 -80 -ENDCHAR -STARTCHAR uni019E -ENCODING 414 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -88 -08 -08 -ENDCHAR -STARTCHAR uni01B5 -ENCODING 437 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -08 -10 -F8 -20 -40 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR uni01B6 -ENCODING 438 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -10 -78 -20 -40 -F8 -00 -00 -ENDCHAR -STARTCHAR Ezh -ENCODING 439 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -08 -10 -30 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni01CD -ENCODING 461 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni01CE -ENCODING 462 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR uni01CF -ENCODING 463 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR uni01D0 -ENCODING 464 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR uni01D1 -ENCODING 465 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni01D2 -ENCODING 466 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni01D3 -ENCODING 467 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni01D4 -ENCODING 468 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -ENDCHAR -STARTCHAR uni01DC -ENCODING 476 -SWIDTH 1000 0 -DWIDTH 6 0 -BBX 5 10 0 0 -BITMAP -40 -20 -88 -00 -88 -88 -88 -88 -88 -78 -ENDCHAR -STARTCHAR uni01E2 -ENCODING 482 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -78 -00 -7C -90 -90 -FC -90 -90 -90 -9C -00 -00 -ENDCHAR -STARTCHAR uni01E3 -ENCODING 483 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -70 -28 -68 -B0 -A0 -78 -00 -00 -ENDCHAR -STARTCHAR uni01E4 -ENCODING 484 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -80 -80 -B8 -88 -9C -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni01E5 -ENCODING 485 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -88 -9C -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR Gcaron -ENCODING 486 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -80 -80 -B8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR gcaron -ENCODING 487 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR uni01E8 -ENCODING 488 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -88 -90 -A0 -C0 -C0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR uni01E9 -ENCODING 489 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -40 -40 -48 -50 -60 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR uni01EA -ENCODING 490 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -88 -70 -20 -18 -ENDCHAR -STARTCHAR uni01EB -ENCODING 491 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -70 -20 -18 -ENDCHAR -STARTCHAR uni01EC -ENCODING 492 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -70 -88 -88 -88 -88 -88 -88 -70 -20 -18 -ENDCHAR -STARTCHAR uni01ED -ENCODING 493 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -70 -88 -88 -88 -88 -70 -20 -18 -ENDCHAR -STARTCHAR uni01EE -ENCODING 494 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -F8 -08 -10 -30 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni01EF -ENCODING 495 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -F8 -08 -10 -30 -08 -08 -88 -70 -ENDCHAR -STARTCHAR uni01F0 -ENCODING 496 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -14 -08 -18 -08 -08 -08 -08 -08 -48 -30 -ENDCHAR -STARTCHAR uni01F4 -ENCODING 500 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -70 -88 -80 -80 -B8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni01F5 -ENCODING 501 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR AEacute -ENCODING 508 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -10 -7C -90 -90 -FC -90 -90 -90 -9C -00 -00 -ENDCHAR -STARTCHAR aeacute -ENCODING 509 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -70 -28 -68 -B0 -A0 -78 -00 -00 -ENDCHAR -STARTCHAR Oslashacute -ENCODING 510 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -74 -88 -98 -A8 -C8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR oslashacute -ENCODING 511 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -74 -98 -A8 -C8 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Scommaaccent -ENCODING 536 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -70 -08 -08 -88 -70 -20 -40 -ENDCHAR -STARTCHAR scommaaccent -ENCODING 537 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -80 -70 -08 -08 -F0 -20 -40 -ENDCHAR -STARTCHAR Tcommaaccent -ENCODING 538 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -20 -20 -20 -20 -20 -30 -10 -20 -ENDCHAR -STARTCHAR tcommaaccent -ENCODING 539 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -20 -20 -20 -20 -18 -08 -10 -ENDCHAR -STARTCHAR uni0232 -ENCODING 562 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni0233 -ENCODING 563 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR dotlessj -ENCODING 567 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -18 -08 -08 -08 -08 -08 -48 -30 -ENDCHAR -STARTCHAR uni0254 -ENCODING 596 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni0258 -ENCODING 600 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -F8 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR schwa -ENCODING 601 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -08 -F8 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni025B -ENCODING 603 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -60 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni0272 -ENCODING 626 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -C8 -40 -80 -ENDCHAR -STARTCHAR ezh -ENCODING 658 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -08 -10 -30 -08 -08 -88 -70 -ENDCHAR -STARTCHAR commaturnedmod -ENCODING 699 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR afii57929 -ENCODING 700 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR afii64937 -ENCODING 701 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -10 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR circumflex -ENCODING 710 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR caron -ENCODING 711 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR breve -ENCODING 728 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR dotaccent -ENCODING 729 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR ogonek -ENCODING 731 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -10 -20 -18 -ENDCHAR -STARTCHAR tilde -ENCODING 732 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR hungarumlaut -ENCODING 733 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR gravecomb -ENCODING 768 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR acutecomb -ENCODING 769 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni0302 -ENCODING 770 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR tildecomb -ENCODING 771 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni0304 -ENCODING 772 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni0305 -ENCODING 773 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -F8 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni0306 -ENCODING 774 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni0307 -ENCODING 775 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni0308 -ENCODING 776 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni030A -ENCODING 778 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -50 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni030B -ENCODING 779 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni030C -ENCODING 780 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni0329 -ENCODING 809 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -20 -20 -ENDCHAR -STARTCHAR tonos -ENCODING 900 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR dieresistonos -ENCODING 901 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -50 -50 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR Alphatonos -ENCODING 902 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR anoteleia -ENCODING 903 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -20 -20 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR Epsilontonos -ENCODING 904 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Etatonos -ENCODING 905 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -88 -88 -88 -F8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Iotatonos -ENCODING 906 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Omicrontonos -ENCODING 908 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Upsilontonos -ENCODING 910 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR Omegatonos -ENCODING 911 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -80 -70 -88 -88 -88 -88 -88 -50 -D8 -00 -00 -ENDCHAR -STARTCHAR iotadieresistonos -ENCODING 912 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -50 -50 -60 -20 -20 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR Alpha -ENCODING 913 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Beta -ENCODING 914 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -F0 -88 -88 -88 -F0 -00 -00 -ENDCHAR -STARTCHAR Gamma -ENCODING 915 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -80 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR Delta -ENCODING 916 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -50 -50 -88 -88 -88 -F8 -00 -00 -ENDCHAR -STARTCHAR Epsilon -ENCODING 917 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Zeta -ENCODING 918 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -08 -10 -20 -40 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Eta -ENCODING 919 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -F8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Theta -ENCODING 920 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -A8 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Iota -ENCODING 921 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Kappa -ENCODING 922 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -90 -A0 -C0 -C0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR Lambda -ENCODING 923 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -50 -50 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Mu -ENCODING 924 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -D8 -A8 -A8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Nu -ENCODING 925 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -C8 -A8 -98 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Xi -ENCODING 926 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -00 -00 -70 -00 -00 -00 -F8 -00 -00 -ENDCHAR -STARTCHAR Omicron -ENCODING 927 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR Pi -ENCODING 928 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -88 -88 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Rho -ENCODING 929 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -88 -F0 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR Sigma -ENCODING 931 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -40 -20 -10 -10 -20 -40 -F8 -00 -00 -ENDCHAR -STARTCHAR Tau -ENCODING 932 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -20 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR Upsilon -ENCODING 933 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR Phi -ENCODING 934 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -A8 -A8 -A8 -A8 -70 -20 -00 -00 -ENDCHAR -STARTCHAR Chi -ENCODING 935 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -20 -20 -50 -88 -88 -00 -00 -ENDCHAR -STARTCHAR Psi -ENCODING 936 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -A8 -A8 -A8 -A8 -A8 -70 -20 -20 -00 -00 -ENDCHAR -STARTCHAR Omega -ENCODING 937 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -50 -D8 -00 -00 -ENDCHAR -STARTCHAR Iotadieresis -ENCODING 938 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR Upsilondieresis -ENCODING 939 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR alphatonos -ENCODING 940 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -68 -90 -90 -90 -90 -68 -00 -00 -ENDCHAR -STARTCHAR epsilontonos -ENCODING 941 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -70 -88 -60 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR etatonos -ENCODING 942 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -F0 -88 -88 -88 -88 -88 -08 -08 -ENDCHAR -STARTCHAR iotatonos -ENCODING 943 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -60 -20 -20 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR upsilondieresistonos -ENCODING 944 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -50 -50 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR alpha -ENCODING 945 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -68 -90 -90 -90 -90 -68 -00 -00 -ENDCHAR -STARTCHAR beta -ENCODING 946 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -90 -90 -F0 -88 -88 -88 -F0 -80 -80 -ENDCHAR -STARTCHAR gamma -ENCODING 947 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -50 -50 -20 -20 -20 -ENDCHAR -STARTCHAR delta -ENCODING 948 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -40 -20 -70 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR epsilon -ENCODING 949 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -60 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR zeta -ENCODING 950 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -10 -20 -40 -80 -80 -80 -70 -08 -10 -ENDCHAR -STARTCHAR eta -ENCODING 951 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -88 -08 -08 -ENDCHAR -STARTCHAR theta -ENCODING 952 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -30 -48 -48 -78 -48 -48 -48 -30 -00 -00 -ENDCHAR -STARTCHAR iota -ENCODING 953 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -60 -20 -20 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR kappa -ENCODING 954 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -48 -50 -60 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR lambda -ENCODING 955 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -20 -20 -50 -50 -88 -88 -00 -00 -ENDCHAR -STARTCHAR mugreek -ENCODING 956 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -98 -E8 -80 -80 -ENDCHAR -STARTCHAR nu -ENCODING 957 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -50 -50 -20 -20 -00 -00 -ENDCHAR -STARTCHAR xi -ENCODING 958 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -80 -80 -70 -80 -80 -80 -70 -08 -10 -ENDCHAR -STARTCHAR omicron -ENCODING 959 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR pi -ENCODING 960 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR rho -ENCODING 961 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -F0 -80 -80 -ENDCHAR -STARTCHAR sigma1 -ENCODING 962 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -80 -80 -80 -70 -08 -10 -ENDCHAR -STARTCHAR sigma -ENCODING 963 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -90 -90 -90 -90 -60 -00 -00 -ENDCHAR -STARTCHAR tau -ENCODING 964 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -20 -20 -20 -20 -10 -00 -00 -ENDCHAR -STARTCHAR upsilon -ENCODING 965 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR phi -ENCODING 966 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -90 -A8 -A8 -A8 -A8 -70 -20 -20 -ENDCHAR -STARTCHAR chi -ENCODING 967 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -50 -20 -20 -50 -88 -88 -ENDCHAR -STARTCHAR psi -ENCODING 968 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -A8 -A8 -A8 -A8 -A8 -70 -20 -20 -ENDCHAR -STARTCHAR omega -ENCODING 969 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -50 -88 -A8 -A8 -A8 -50 -00 -00 -ENDCHAR -STARTCHAR iotadieresis -ENCODING 970 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -60 -20 -20 -20 -20 -18 -00 -00 -ENDCHAR -STARTCHAR upsilondieresis -ENCODING 971 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR omicrontonos -ENCODING 972 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR upsilontonos -ENCODING 973 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR omegatonos -ENCODING 974 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -50 -88 -A8 -A8 -A8 -50 -00 -00 -ENDCHAR -STARTCHAR theta1 -ENCODING 977 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -30 -48 -48 -3C -08 -C8 -48 -30 -00 -00 -ENDCHAR -STARTCHAR phi1 -ENCODING 981 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -70 -A8 -A8 -A8 -A8 -70 -20 -00 -ENDCHAR -STARTCHAR uni03F0 -ENCODING 1008 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -C4 -28 -10 -20 -50 -8C -00 -00 -ENDCHAR -STARTCHAR uni03F1 -ENCODING 1009 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -F0 -80 -70 -ENDCHAR -STARTCHAR uni03F2 -ENCODING 1010 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni03F3 -ENCODING 1011 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -08 -08 -00 -18 -08 -08 -08 -08 -08 -48 -30 -ENDCHAR -STARTCHAR uni03F4 -ENCODING 1012 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -F8 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni03F5 -ENCODING 1013 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -80 -F0 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR uni03F6 -ENCODING 1014 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -08 -78 -08 -08 -F0 -00 -00 -ENDCHAR -STARTCHAR uni0400 -ENCODING 1024 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR afii10023 -ENCODING 1025 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR afii10051 -ENCODING 1026 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -40 -40 -70 -48 -48 -48 -48 -08 -10 -ENDCHAR -STARTCHAR afii10052 -ENCODING 1027 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -F8 -80 -80 -80 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR afii10053 -ENCODING 1028 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -F0 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10054 -ENCODING 1029 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -70 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10055 -ENCODING 1030 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR afii10056 -ENCODING 1031 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR afii10057 -ENCODING 1032 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -38 -10 -10 -10 -10 -90 -90 -60 -00 -00 -ENDCHAR -STARTCHAR afii10058 -ENCODING 1033 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -A0 -B0 -A8 -A8 -A8 -A8 -B0 -00 -00 -ENDCHAR -STARTCHAR afii10059 -ENCODING 1034 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -A0 -A0 -B0 -E8 -A8 -A8 -A8 -B0 -00 -00 -ENDCHAR -STARTCHAR afii10060 -ENCODING 1035 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -40 -40 -70 -48 -48 -48 -48 -00 -00 -ENDCHAR -STARTCHAR afii10061 -ENCODING 1036 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -20 -88 -90 -A0 -C0 -C0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR uni040D -ENCODING 1037 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -88 -88 -98 -A8 -C8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10062 -ENCODING 1038 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -88 -88 -88 -88 -78 -08 -08 -70 -00 -00 -ENDCHAR -STARTCHAR afii10145 -ENCODING 1039 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -88 -88 -88 -F8 -20 -20 -ENDCHAR -STARTCHAR afii10017 -ENCODING 1040 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10018 -ENCODING 1041 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -80 -80 -F0 -88 -88 -88 -F0 -00 -00 -ENDCHAR -STARTCHAR afii10019 -ENCODING 1042 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -F0 -88 -88 -88 -F0 -00 -00 -ENDCHAR -STARTCHAR afii10020 -ENCODING 1043 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -80 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR afii10021 -ENCODING 1044 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -38 -48 -48 -48 -48 -48 -48 -FC -84 -00 -ENDCHAR -STARTCHAR afii10022 -ENCODING 1045 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR afii10024 -ENCODING 1046 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -A8 -A8 -A8 -70 -70 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR afii10025 -ENCODING 1047 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -08 -30 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10026 -ENCODING 1048 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -98 -A8 -C8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10027 -ENCODING 1049 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -88 -88 -98 -A8 -C8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10028 -ENCODING 1050 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -90 -A0 -C0 -C0 -A0 -90 -88 -00 -00 -ENDCHAR -STARTCHAR afii10029 -ENCODING 1051 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -38 -48 -48 -48 -48 -48 -48 -88 -00 -00 -ENDCHAR -STARTCHAR afii10030 -ENCODING 1052 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -D8 -A8 -A8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10031 -ENCODING 1053 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -F8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10032 -ENCODING 1054 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10033 -ENCODING 1055 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -88 -88 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10034 -ENCODING 1056 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -88 -88 -88 -F0 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR afii10035 -ENCODING 1057 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -80 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10036 -ENCODING 1058 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -20 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR afii10037 -ENCODING 1059 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -78 -08 -08 -70 -00 -00 -ENDCHAR -STARTCHAR afii10038 -ENCODING 1060 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -70 -A8 -A8 -A8 -A8 -A8 -A8 -70 -20 -00 -ENDCHAR -STARTCHAR afii10039 -ENCODING 1061 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -20 -20 -50 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10040 -ENCODING 1062 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -88 -88 -88 -7C -04 -04 -ENDCHAR -STARTCHAR afii10041 -ENCODING 1063 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -78 -08 -08 -08 -00 -00 -ENDCHAR -STARTCHAR afii10042 -ENCODING 1064 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -A8 -A8 -A8 -A8 -A8 -A8 -A8 -78 -00 -00 -ENDCHAR -STARTCHAR afii10043 -ENCODING 1065 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -A8 -A8 -A8 -A8 -A8 -A8 -A8 -7C -04 -04 -ENDCHAR -STARTCHAR afii10044 -ENCODING 1066 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -C0 -40 -70 -48 -48 -48 -48 -70 -00 -00 -ENDCHAR -STARTCHAR afii10045 -ENCODING 1067 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -C8 -A8 -A8 -A8 -A8 -C8 -00 -00 -ENDCHAR -STARTCHAR afii10046 -ENCODING 1068 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -70 -48 -48 -48 -48 -70 -00 -00 -ENDCHAR -STARTCHAR afii10047 -ENCODING 1069 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -08 -38 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10048 -ENCODING 1070 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -90 -A8 -A8 -A8 -E8 -A8 -A8 -90 -00 -00 -ENDCHAR -STARTCHAR afii10049 -ENCODING 1071 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -88 -88 -88 -78 -28 -48 -88 -00 -00 -ENDCHAR -STARTCHAR afii10065 -ENCODING 1072 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR afii10066 -ENCODING 1073 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -80 -F0 -88 -88 -88 -88 -F0 -00 -00 -ENDCHAR -STARTCHAR afii10067 -ENCODING 1074 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -90 -90 -F0 -88 -88 -88 -F0 -00 -00 -ENDCHAR -STARTCHAR afii10068 -ENCODING 1075 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -80 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR afii10069 -ENCODING 1076 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR afii10070 -ENCODING 1077 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR afii10072 -ENCODING 1078 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -A8 -A8 -70 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR afii10073 -ENCODING 1079 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -30 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10074 -ENCODING 1080 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR afii10075 -ENCODING 1081 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR afii10076 -ENCODING 1082 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -48 -50 -60 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR afii10077 -ENCODING 1083 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -38 -48 -48 -48 -48 -88 -00 -00 -ENDCHAR -STARTCHAR afii10078 -ENCODING 1084 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -D8 -A8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10079 -ENCODING 1085 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10080 -ENCODING 1086 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10081 -ENCODING 1087 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii10082 -ENCODING 1088 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -F0 -80 -80 -ENDCHAR -STARTCHAR afii10083 -ENCODING 1089 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -80 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10084 -ENCODING 1090 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR afii10085 -ENCODING 1091 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR afii10086 -ENCODING 1092 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -70 -A8 -A8 -A8 -A8 -70 -20 -00 -ENDCHAR -STARTCHAR afii10087 -ENCODING 1093 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -50 -20 -20 -50 -88 -00 -00 -ENDCHAR -STARTCHAR afii10088 -ENCODING 1094 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -7C -04 -04 -ENDCHAR -STARTCHAR afii10089 -ENCODING 1095 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -78 -08 -08 -00 -00 -ENDCHAR -STARTCHAR afii10090 -ENCODING 1096 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -A8 -A8 -A8 -A8 -A8 -78 -00 -00 -ENDCHAR -STARTCHAR afii10091 -ENCODING 1097 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -A8 -A8 -A8 -A8 -A8 -7C -04 -04 -ENDCHAR -STARTCHAR afii10092 -ENCODING 1098 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -C0 -40 -70 -48 -48 -70 -00 -00 -ENDCHAR -STARTCHAR afii10093 -ENCODING 1099 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -C8 -A8 -A8 -C8 -00 -00 -ENDCHAR -STARTCHAR afii10094 -ENCODING 1100 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -40 -40 -70 -48 -48 -70 -00 -00 -ENDCHAR -STARTCHAR afii10095 -ENCODING 1101 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -38 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10096 -ENCODING 1102 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -90 -A8 -A8 -E8 -A8 -90 -00 -00 -ENDCHAR -STARTCHAR afii10097 -ENCODING 1103 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -88 -88 -78 -28 -48 -00 -00 -ENDCHAR -STARTCHAR uni0450 -ENCODING 1104 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR afii10071 -ENCODING 1105 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR afii10099 -ENCODING 1106 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -F0 -40 -70 -48 -48 -48 -48 -08 -10 -ENDCHAR -STARTCHAR afii10100 -ENCODING 1107 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -20 -F8 -80 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR afii10101 -ENCODING 1108 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -E0 -80 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10102 -ENCODING 1109 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -80 -70 -08 -08 -F0 -00 -00 -ENDCHAR -STARTCHAR afii10103 -ENCODING 1110 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -00 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR afii10104 -ENCODING 1111 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR afii10105 -ENCODING 1112 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -08 -08 -00 -18 -08 -08 -08 -08 -08 -48 -30 -ENDCHAR -STARTCHAR afii10106 -ENCODING 1113 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -60 -A0 -B0 -A8 -A8 -B0 -00 -00 -ENDCHAR -STARTCHAR afii10107 -ENCODING 1114 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -A0 -A0 -F0 -A8 -A8 -B0 -00 -00 -ENDCHAR -STARTCHAR afii10108 -ENCODING 1115 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -F0 -40 -70 -48 -48 -48 -48 -00 -00 -ENDCHAR -STARTCHAR afii10109 -ENCODING 1116 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -10 -48 -50 -60 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR uni045D -ENCODING 1117 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -20 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR afii10110 -ENCODING 1118 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR afii10193 -ENCODING 1119 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -F8 -20 -20 -ENDCHAR -STARTCHAR afii10146 -ENCODING 1122 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -F0 -40 -70 -48 -48 -48 -70 -00 -00 -ENDCHAR -STARTCHAR afii10194 -ENCODING 1123 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -E0 -40 -70 -48 -48 -70 -00 -00 -ENDCHAR -STARTCHAR uni046A -ENCODING 1130 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -88 -50 -20 -70 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR uni046B -ENCODING 1131 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -50 -20 -70 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR afii10050 -ENCODING 1168 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -F8 -80 -80 -80 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR afii10098 -ENCODING 1169 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -08 -F8 -80 -80 -80 -80 -80 -00 -00 -ENDCHAR -STARTCHAR uni0492 -ENCODING 1170 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -7C -40 -40 -40 -F0 -40 -40 -40 -00 -00 -ENDCHAR -STARTCHAR uni0493 -ENCODING 1171 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -40 -40 -F0 -40 -40 -00 -00 -ENDCHAR -STARTCHAR uni0494 -ENCODING 1172 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -80 -F0 -88 -88 -88 -08 -10 -ENDCHAR -STARTCHAR uni0495 -ENCODING 1173 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -80 -80 -E0 -90 -90 -10 -20 -ENDCHAR -STARTCHAR uni0496 -ENCODING 1174 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -A8 -A8 -A8 -70 -70 -A8 -A8 -AC -04 -04 -ENDCHAR -STARTCHAR uni0497 -ENCODING 1175 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -A8 -A8 -70 -A8 -A8 -AC -04 -04 -ENDCHAR -STARTCHAR uni0498 -ENCODING 1176 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -08 -30 -08 -08 -88 -70 -20 -20 -ENDCHAR -STARTCHAR uni0499 -ENCODING 1177 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -30 -08 -88 -70 -20 -20 -ENDCHAR -STARTCHAR uni049A -ENCODING 1178 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -90 -A0 -C0 -C0 -A0 -90 -8C -04 -04 -ENDCHAR -STARTCHAR uni049B -ENCODING 1179 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -48 -50 -60 -60 -50 -4C -04 -04 -ENDCHAR -STARTCHAR uni049C -ENCODING 1180 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -84 -A8 -B0 -E0 -E0 -B0 -A8 -84 -00 -00 -ENDCHAR -STARTCHAR uni049D -ENCODING 1181 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -A8 -B0 -E0 -E0 -B0 -A8 -00 -00 -ENDCHAR -STARTCHAR uni04A0 -ENCODING 1184 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -C4 -48 -50 -60 -60 -50 -48 -44 -00 -00 -ENDCHAR -STARTCHAR uni04A1 -ENCODING 1185 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -C8 -50 -60 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR uni04A2 -ENCODING 1186 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -F8 -88 -88 -88 -8C -04 -04 -ENDCHAR -STARTCHAR uni04A3 -ENCODING 1187 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -F8 -88 -88 -8C -04 -04 -ENDCHAR -STARTCHAR uni04A4 -ENCODING 1188 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -9C -90 -90 -F0 -90 -90 -90 -90 -00 -00 -ENDCHAR -STARTCHAR uni04A5 -ENCODING 1189 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -9C -90 -F0 -90 -90 -90 -00 -00 -ENDCHAR -STARTCHAR uni04AA -ENCODING 1194 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -80 -80 -80 -80 -88 -70 -20 -20 -ENDCHAR -STARTCHAR uni04AB -ENCODING 1195 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -80 -80 -88 -70 -20 -20 -ENDCHAR -STARTCHAR uni04AE -ENCODING 1198 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni04AF -ENCODING 1199 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -50 -50 -20 -20 -20 -ENDCHAR -STARTCHAR uni04B0 -ENCODING 1200 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -50 -20 -70 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni04B1 -ENCODING 1201 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -50 -50 -20 -70 -20 -ENDCHAR -STARTCHAR uni04B2 -ENCODING 1202 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -50 -20 -20 -50 -88 -8C -04 -04 -ENDCHAR -STARTCHAR uni04B3 -ENCODING 1203 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -50 -20 -20 -50 -8C -04 -04 -ENDCHAR -STARTCHAR uni04B6 -ENCODING 1206 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -78 -08 -08 -0C -04 -04 -ENDCHAR -STARTCHAR uni04B7 -ENCODING 1207 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -78 -08 -0C -04 -04 -ENDCHAR -STARTCHAR uni04B8 -ENCODING 1208 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -A8 -A8 -78 -28 -28 -08 -00 -00 -ENDCHAR -STARTCHAR uni04B9 -ENCODING 1209 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -A8 -A8 -78 -28 -08 -00 -00 -ENDCHAR -STARTCHAR uni04BA -ENCODING 1210 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -80 -F0 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni04BB -ENCODING 1211 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -80 -80 -F0 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni04C0 -ENCODING 1216 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR uni04C1 -ENCODING 1217 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -A8 -A8 -A8 -70 -70 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR uni04C2 -ENCODING 1218 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -A8 -A8 -70 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR uni04CF -ENCODING 1231 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -20 -20 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR uni04D0 -ENCODING 1232 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni04D1 -ENCODING 1233 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR uni04D2 -ENCODING 1234 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni04D3 -ENCODING 1235 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -08 -78 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR uni04D4 -ENCODING 1236 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -7C -90 -90 -FC -90 -90 -90 -9C -00 -00 -ENDCHAR -STARTCHAR uni04D5 -ENCODING 1237 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -28 -68 -B0 -A0 -78 -00 -00 -ENDCHAR -STARTCHAR uni04D6 -ENCODING 1238 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -20 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR uni04D7 -ENCODING 1239 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -20 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR uni04D8 -ENCODING 1240 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -08 -08 -F8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR afii10846 -ENCODING 1241 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -08 -F8 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04DA -ENCODING 1242 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -08 -08 -F8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04DB -ENCODING 1243 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -08 -F8 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04DC -ENCODING 1244 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -A8 -A8 -A8 -70 -70 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR uni04DD -ENCODING 1245 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -A8 -A8 -70 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR uni04DE -ENCODING 1246 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -08 -30 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04DF -ENCODING 1247 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -30 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04E2 -ENCODING 1250 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -88 -88 -98 -A8 -C8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni04E3 -ENCODING 1251 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR uni04E4 -ENCODING 1252 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -88 -88 -98 -A8 -C8 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni04E5 -ENCODING 1253 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -88 -88 -88 -88 -88 -78 -00 -00 -ENDCHAR -STARTCHAR uni04E6 -ENCODING 1254 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04E7 -ENCODING 1255 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04E8 -ENCODING 1256 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -F8 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04E9 -ENCODING 1257 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -F8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04EA -ENCODING 1258 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -88 -88 -F8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04EB -ENCODING 1259 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -F8 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04EC -ENCODING 1260 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -70 -88 -08 -38 -08 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04ED -ENCODING 1261 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -70 -88 -38 -08 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni04EE -ENCODING 1262 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -70 -00 -88 -88 -88 -88 -78 -08 -08 -70 -00 -00 -ENDCHAR -STARTCHAR uni04EF -ENCODING 1263 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -00 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR uni04F0 -ENCODING 1264 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -88 -88 -88 -88 -78 -08 -08 -70 -00 -00 -ENDCHAR -STARTCHAR uni04F1 -ENCODING 1265 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR uni04F2 -ENCODING 1266 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -88 -88 -88 -88 -78 -08 -08 -70 -00 -00 -ENDCHAR -STARTCHAR uni04F3 -ENCODING 1267 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR uni04F4 -ENCODING 1268 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -88 -88 -88 -88 -78 -08 -08 -08 -00 -00 -ENDCHAR -STARTCHAR uni04F5 -ENCODING 1269 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -88 -88 -88 -78 -08 -08 -00 -00 -ENDCHAR -STARTCHAR uni04F8 -ENCODING 1272 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -88 -88 -C8 -A8 -A8 -A8 -A8 -C8 -00 -00 -ENDCHAR -STARTCHAR uni04F9 -ENCODING 1273 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -88 -88 -C8 -A8 -A8 -C8 -00 -00 -ENDCHAR -STARTCHAR uni1E0C -ENCODING 7692 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -E0 -90 -88 -88 -88 -88 -90 -E0 -20 -20 -ENDCHAR -STARTCHAR uni1E0D -ENCODING 7693 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -08 -78 -88 -88 -88 -88 -78 -20 -20 -ENDCHAR -STARTCHAR Klinebelow -ENCODING 7732 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -90 -A0 -C0 -C0 -A0 -90 -88 -00 -70 -ENDCHAR -STARTCHAR klinebelow -ENCODING 7733 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -48 -50 -60 -60 -50 -48 -00 -70 -ENDCHAR -STARTCHAR uni1E36 -ENCODING 7734 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -80 -80 -80 -80 -80 -F8 -20 -20 -ENDCHAR -STARTCHAR uni1E37 -ENCODING 7735 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -60 -20 -20 -20 -20 -20 -20 -70 -20 -20 -ENDCHAR -STARTCHAR uni1E40 -ENCODING 7744 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -88 -D8 -A8 -A8 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni1E41 -ENCODING 7745 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -F0 -A8 -A8 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR uni1E42 -ENCODING 7746 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -D8 -A8 -A8 -88 -88 -88 -88 -20 -20 -ENDCHAR -STARTCHAR uni1E43 -ENCODING 7747 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -A8 -A8 -A8 -A8 -A8 -10 -10 -ENDCHAR -STARTCHAR uni1E44 -ENCODING 7748 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -88 -88 -C8 -A8 -98 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni1E45 -ENCODING 7749 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni1E46 -ENCODING 7750 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -C8 -A8 -98 -88 -88 -88 -20 -20 -ENDCHAR -STARTCHAR uni1E47 -ENCODING 7751 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -88 -88 -20 -20 -ENDCHAR -STARTCHAR uni1E6C -ENCODING 7788 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -20 -20 -20 -20 -20 -20 -10 -10 -ENDCHAR -STARTCHAR uni1E6D -ENCODING 7789 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -20 -20 -20 -20 -18 -10 -10 -ENDCHAR -STARTCHAR Edotbelow -ENCODING 7864 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -80 -80 -F0 -80 -80 -80 -F8 -20 -20 -ENDCHAR -STARTCHAR edotbelow -ENCODING 7865 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -F8 -80 -80 -78 -20 -20 -ENDCHAR -STARTCHAR Etilde -ENCODING 7868 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -F8 -80 -80 -F0 -80 -80 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR etilde -ENCODING 7869 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -70 -88 -F8 -80 -80 -78 -00 -00 -ENDCHAR -STARTCHAR uni1ECA -ENCODING 7882 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -20 -20 -20 -20 -20 -20 -70 -20 -20 -ENDCHAR -STARTCHAR uni1ECB -ENCODING 7883 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -00 -60 -20 -20 -20 -20 -70 -20 -20 -ENDCHAR -STARTCHAR Odotbelow -ENCODING 7884 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -88 -70 -20 -20 -ENDCHAR -STARTCHAR odotbelow -ENCODING 7885 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -70 -20 -20 -ENDCHAR -STARTCHAR uni1EE4 -ENCODING 7908 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -88 -88 -88 -70 -20 -20 -ENDCHAR -STARTCHAR uni1EE5 -ENCODING 7909 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -78 -20 -20 -ENDCHAR -STARTCHAR Ytilde -ENCODING 7928 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -28 -50 -88 -88 -50 -50 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR ytilde -ENCODING 7929 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -28 -50 -88 -88 -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR uni2000 -ENCODING 8192 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2001 -ENCODING 8193 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR enspace -ENCODING 8194 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2003 -ENCODING 8195 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2004 -ENCODING 8196 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2005 -ENCODING 8197 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2006 -ENCODING 8198 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2007 -ENCODING 8199 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2008 -ENCODING 8200 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2009 -ENCODING 8201 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni200A -ENCODING 8202 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni200B -ENCODING 8203 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR afii61664 -ENCODING 8204 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR afii301 -ENCODING 8205 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR afii299 -ENCODING 8206 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR afii300 -ENCODING 8207 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR hyphentwo -ENCODING 8208 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -78 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2011 -ENCODING 8209 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -78 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR figuredash -ENCODING 8210 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -F8 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR endash -ENCODING 8211 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -F8 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR emdash -ENCODING 8212 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -F8 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR afii00208 -ENCODING 8213 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -F8 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR dblverticalbar -ENCODING 8214 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -50 -50 -50 -50 -50 -50 -00 -00 -ENDCHAR -STARTCHAR underscoredbl -ENCODING 8215 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -F8 -00 -F8 -ENDCHAR -STARTCHAR quoteleft -ENCODING 8216 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -10 -20 -20 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR quoteright -ENCODING 8217 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -40 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR quotesinglbase -ENCODING 8218 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -20 -20 -40 -00 -ENDCHAR -STARTCHAR quotereversed -ENCODING 8219 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -10 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR quotedblleft -ENCODING 8220 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -28 -50 -50 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR quotedblright -ENCODING 8221 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -28 -28 -50 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR quotedblbase -ENCODING 8222 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -50 -50 -A0 -00 -ENDCHAR -STARTCHAR uni201F -ENCODING 8223 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -A0 -A0 -50 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR dagger -ENCODING 8224 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -20 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR daggerdbl -ENCODING 8225 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -20 -20 -20 -20 -70 -20 -00 -00 -ENDCHAR -STARTCHAR bullet -ENCODING 8226 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -30 -78 -78 -30 -00 -00 -00 -00 -ENDCHAR -STARTCHAR ellipsis -ENCODING 8230 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR perthousand -ENCODING 8240 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -44 -A8 -50 -20 -40 -A8 -54 -28 -00 -00 -ENDCHAR -STARTCHAR minute -ENCODING 8242 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -20 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR second -ENCODING 8243 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -50 -50 -50 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR guilsinglleft -ENCODING 8249 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -10 -20 -40 -20 -10 -08 -00 -00 -ENDCHAR -STARTCHAR guilsinglright -ENCODING 8250 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -20 -10 -08 -10 -20 -40 -00 -00 -ENDCHAR -STARTCHAR exclamdbl -ENCODING 8252 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -50 -50 -50 -00 -50 -50 -00 -00 -ENDCHAR -STARTCHAR overline -ENCODING 8254 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -F8 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2070 -ENCODING 8304 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -30 -48 -48 -48 -30 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2071 -ENCODING 8305 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -00 -60 -20 -20 -70 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2074 -ENCODING 8308 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -08 -18 -28 -78 -08 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2075 -ENCODING 8309 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -70 -40 -70 -08 -70 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2076 -ENCODING 8310 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -30 -40 -70 -48 -30 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2077 -ENCODING 8311 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -78 -08 -10 -20 -20 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2078 -ENCODING 8312 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -30 -48 -30 -48 -30 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2079 -ENCODING 8313 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -30 -48 -38 -08 -30 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni207A -ENCODING 8314 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -20 -F8 -20 -20 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni207B -ENCODING 8315 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -78 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni207C -ENCODING 8316 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -00 -78 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni207D -ENCODING 8317 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -10 -20 -20 -20 -10 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni207E -ENCODING 8318 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -20 -10 -10 -10 -20 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR nsuperior -ENCODING 8319 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -70 -48 -48 -48 -48 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2080 -ENCODING 8320 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -48 -48 -48 -30 -00 -00 -ENDCHAR -STARTCHAR uni2081 -ENCODING 8321 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -10 -30 -10 -10 -38 -00 -00 -ENDCHAR -STARTCHAR uni2082 -ENCODING 8322 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -48 -10 -20 -78 -00 -00 -ENDCHAR -STARTCHAR uni2083 -ENCODING 8323 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -70 -08 -30 -08 -70 -00 -00 -ENDCHAR -STARTCHAR uni2084 -ENCODING 8324 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -08 -18 -28 -78 -08 -00 -00 -ENDCHAR -STARTCHAR uni2085 -ENCODING 8325 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -70 -40 -70 -08 -70 -00 -00 -ENDCHAR -STARTCHAR uni2086 -ENCODING 8326 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -40 -70 -48 -30 -00 -00 -ENDCHAR -STARTCHAR uni2087 -ENCODING 8327 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -78 -08 -10 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni2088 -ENCODING 8328 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -48 -30 -48 -30 -00 -00 -ENDCHAR -STARTCHAR uni2089 -ENCODING 8329 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -48 -38 -08 -30 -00 -00 -ENDCHAR -STARTCHAR uni208A -ENCODING 8330 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -20 -20 -F8 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni208B -ENCODING 8331 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -78 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni208C -ENCODING 8332 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -78 -00 -78 -00 -00 -00 -ENDCHAR -STARTCHAR uni208D -ENCODING 8333 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -10 -20 -20 -20 -10 -00 -00 -ENDCHAR -STARTCHAR uni208E -ENCODING 8334 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -20 -10 -10 -10 -20 -00 -00 -ENDCHAR -STARTCHAR uni2090 -ENCODING 8336 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -08 -38 -48 -38 -00 -00 -ENDCHAR -STARTCHAR uni2091 -ENCODING 8337 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -48 -78 -40 -38 -00 -00 -ENDCHAR -STARTCHAR uni2092 -ENCODING 8338 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -48 -48 -48 -30 -00 -00 -ENDCHAR -STARTCHAR uni2093 -ENCODING 8339 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -88 -50 -20 -50 -88 -00 -00 -ENDCHAR -STARTCHAR uni2094 -ENCODING 8340 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -70 -08 -78 -48 -30 -00 -00 -ENDCHAR -STARTCHAR uni2095 -ENCODING 8341 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -40 -70 -48 -48 -48 -48 -00 -00 -ENDCHAR -STARTCHAR uni2096 -ENCODING 8342 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -40 -48 -50 -60 -50 -48 -00 -00 -ENDCHAR -STARTCHAR uni2097 -ENCODING 8343 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -60 -20 -20 -20 -20 -70 -00 -00 -ENDCHAR -STARTCHAR uni2098 -ENCODING 8344 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -F0 -A8 -A8 -A8 -A8 -00 -00 -ENDCHAR -STARTCHAR uni209A -ENCODING 8346 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -70 -48 -48 -48 -70 -40 -40 -ENDCHAR -STARTCHAR peseta -ENCODING 8359 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -C0 -A0 -A0 -C8 -9C -88 -88 -84 -00 -00 -ENDCHAR -STARTCHAR Euro -ENCODING 8364 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -38 -44 -F0 -40 -F0 -44 -38 -00 -00 -ENDCHAR -STARTCHAR uni20AE -ENCODING 8366 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -20 -30 -60 -30 -60 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni2102 -ENCODING 8450 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -A8 -A0 -A0 -A0 -A0 -A8 -70 -00 -00 -ENDCHAR -STARTCHAR uni210E -ENCODING 8462 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -80 -F0 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni210F -ENCODING 8463 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -F0 -40 -70 -48 -48 -48 -48 -00 -00 -ENDCHAR -STARTCHAR uni2115 -ENCODING 8469 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -C8 -A8 -D8 -A8 -98 -88 -88 -00 -00 -ENDCHAR -STARTCHAR afii61352 -ENCODING 8470 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -94 -94 -D0 -F0 -F0 -B4 -90 -94 -00 -00 -ENDCHAR -STARTCHAR uni211A -ENCODING 8474 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -C8 -A8 -A8 -A8 -A8 -A8 -70 -18 -00 -ENDCHAR -STARTCHAR uni211D -ENCODING 8477 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -A8 -A8 -A8 -B0 -B0 -A8 -E4 -00 -00 -ENDCHAR -STARTCHAR trademark -ENCODING 8482 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F4 -5C -54 -54 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2124 -ENCODING 8484 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -18 -28 -50 -A0 -C0 -80 -F8 -00 -00 -ENDCHAR -STARTCHAR Ohm -ENCODING 8486 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -50 -D8 -00 -00 -ENDCHAR -STARTCHAR aleph -ENCODING 8501 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -48 -48 -24 -68 -90 -90 -88 -48 -00 -00 -ENDCHAR -STARTCHAR arrowleft -ENCODING 8592 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -60 -FC -60 -20 -00 -00 -00 -00 -ENDCHAR -STARTCHAR arrowup -ENCODING 8593 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -F8 -20 -20 -20 -20 -20 -00 -00 -ENDCHAR -STARTCHAR arrowright -ENCODING 8594 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -10 -18 -FC -18 -10 -00 -00 -00 -00 -ENDCHAR -STARTCHAR arrowdown -ENCODING 8595 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -20 -20 -20 -F8 -70 -20 -00 -00 -ENDCHAR -STARTCHAR arrowboth -ENCODING 8596 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -CC -FC -CC -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR arrowupdn -ENCODING 8597 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -F8 -20 -20 -F8 -70 -20 -00 -00 -ENDCHAR -STARTCHAR uni21A4 -ENCODING 8612 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -24 -64 -FC -64 -24 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni21A6 -ENCODING 8614 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -90 -98 -FC -98 -90 -00 -00 -00 -00 -ENDCHAR -STARTCHAR arrowupdnbse -ENCODING 8616 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -F8 -20 -F8 -70 -20 -F8 -00 -00 -ENDCHAR -STARTCHAR carriagereturn -ENCODING 8629 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -08 -08 -28 -68 -F8 -60 -20 -00 -00 -ENDCHAR -STARTCHAR uni21BB -ENCODING 8635 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -30 -50 -94 -84 -84 -84 -78 -00 -00 -ENDCHAR -STARTCHAR uni21CB -ENCODING 8651 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -40 -FC -00 -FC -08 -10 -00 -00 -00 -ENDCHAR -STARTCHAR uni21CC -ENCODING 8652 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -08 -FC -00 -FC -40 -20 -00 -00 -00 -ENDCHAR -STARTCHAR arrowdblleft -ENCODING 8656 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -7C -E0 -7C -20 -00 -00 -00 -00 -ENDCHAR -STARTCHAR arrowdblup -ENCODING 8657 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -F8 -50 -50 -50 -50 -50 -00 -00 -ENDCHAR -STARTCHAR arrowdblright -ENCODING 8658 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -10 -F8 -1C -F8 -10 -00 -00 -00 -00 -ENDCHAR -STARTCHAR arrowdbldown -ENCODING 8659 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -50 -50 -50 -F8 -70 -20 -00 -00 -ENDCHAR -STARTCHAR arrowdblboth -ENCODING 8660 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -FC -CC -FC -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni21D5 -ENCODING 8661 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -F8 -50 -50 -F8 -70 -20 -00 -00 -ENDCHAR -STARTCHAR universal -ENCODING 8704 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -F8 -50 -50 -50 -20 -20 -00 -00 -ENDCHAR -STARTCHAR existential -ENCODING 8707 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -F8 -08 -08 -F8 -08 -08 -F8 -00 -00 -ENDCHAR -STARTCHAR uni2204 -ENCODING 8708 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -F8 -28 -28 -F8 -48 -48 -F8 -80 -00 -ENDCHAR -STARTCHAR emptyset -ENCODING 8709 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -70 -98 -A8 -A8 -C8 -70 -80 -00 -00 -ENDCHAR -STARTCHAR increment -ENCODING 8710 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -50 -50 -88 -88 -88 -F8 -00 -00 -ENDCHAR -STARTCHAR gradient -ENCODING 8711 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -88 -88 -88 -50 -50 -20 -20 -00 -00 -ENDCHAR -STARTCHAR element -ENCODING 8712 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -38 -40 -80 -F8 -80 -40 -38 -00 -00 -ENDCHAR -STARTCHAR notelement -ENCODING 8713 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -38 -50 -90 -F8 -A0 -60 -78 -40 -00 -ENDCHAR -STARTCHAR uni220A -ENCODING 8714 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -78 -80 -F8 -80 -78 -00 -00 -00 -ENDCHAR -STARTCHAR suchthat -ENCODING 8715 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -E0 -10 -08 -F8 -08 -10 -E0 -00 -00 -ENDCHAR -STARTCHAR uni220C -ENCODING 8716 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -80 -E0 -50 -48 -F8 -28 -30 -F0 -10 -00 -ENDCHAR -STARTCHAR uni220D -ENCODING 8717 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -08 -F8 -08 -F0 -00 -00 -00 -ENDCHAR -STARTCHAR minus -ENCODING 8722 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -F8 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2213 -ENCODING 8723 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -F8 -00 -20 -20 -F8 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni2214 -ENCODING 8724 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -00 -20 -20 -F8 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni2215 -ENCODING 8725 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -08 -10 -20 -40 -80 -00 -00 -00 -ENDCHAR -STARTCHAR uni2216 -ENCODING 8726 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -80 -40 -20 -10 -08 -00 -00 -00 -ENDCHAR -STARTCHAR bulletoperator -ENCODING 8729 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -30 -78 -30 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR radical -ENCODING 8730 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -0C -08 -08 -08 -88 -88 -48 -28 -18 -00 -00 -ENDCHAR -STARTCHAR infinity -ENCODING 8734 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -50 -A8 -A8 -A8 -50 -00 -00 -00 -00 -ENDCHAR -STARTCHAR orthogonal -ENCODING 8735 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -80 -80 -80 -80 -F8 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2225 -ENCODING 8741 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -50 -50 -50 -50 -50 -50 -50 -50 -00 -00 -ENDCHAR -STARTCHAR logicaland -ENCODING 8743 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -20 -20 -50 -50 -88 -88 -00 -00 -ENDCHAR -STARTCHAR logicalor -ENCODING 8744 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -50 -50 -20 -20 -00 -00 -ENDCHAR -STARTCHAR intersection -ENCODING 8745 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR union -ENCODING 8746 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR approxequal -ENCODING 8776 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -68 -B0 -00 -68 -B0 -00 -00 -00 -ENDCHAR -STARTCHAR notequal -ENCODING 8800 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -F8 -20 -40 -F8 -80 -00 -00 -00 -ENDCHAR -STARTCHAR equivalence -ENCODING 8801 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -00 -F8 -00 -F8 -00 -00 -00 -ENDCHAR -STARTCHAR lessequal -ENCODING 8804 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -10 -20 -40 -80 -40 -20 -10 -00 -F8 -00 -00 -ENDCHAR -STARTCHAR greaterequal -ENCODING 8805 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -40 -20 -10 -08 -10 -20 -40 -00 -F8 -00 -00 -ENDCHAR -STARTCHAR uni226A -ENCODING 8810 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -14 -28 -50 -A0 -50 -28 -14 -00 -00 -ENDCHAR -STARTCHAR uni226B -ENCODING 8811 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -A0 -50 -28 -14 -28 -50 -A0 -00 -00 -ENDCHAR -STARTCHAR propersubset -ENCODING 8834 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -78 -80 -80 -80 -80 -78 -00 -00 -00 -ENDCHAR -STARTCHAR propersuperset -ENCODING 8835 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -F0 -08 -08 -08 -08 -F0 -00 -00 -00 -ENDCHAR -STARTCHAR reflexsubset -ENCODING 8838 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -80 -80 -80 -80 -78 -00 -F8 -00 -00 -ENDCHAR -STARTCHAR reflexsuperset -ENCODING 8839 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F0 -08 -08 -08 -08 -F0 -00 -F8 -00 -00 -ENDCHAR -STARTCHAR perpendicular -ENCODING 8869 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -20 -20 -20 -20 -20 -F8 -00 -00 -ENDCHAR -STARTCHAR uni22C2 -ENCODING 8898 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uni22C3 -ENCODING 8899 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -88 -88 -88 -88 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR uni2300 -ENCODING 8960 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -08 -70 -98 -A8 -A8 -C8 -70 -80 -00 -00 -ENDCHAR -STARTCHAR house -ENCODING 8962 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -20 -50 -88 -88 -88 -F8 -00 -00 -ENDCHAR -STARTCHAR uni2308 -ENCODING 8968 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -40 -40 -40 -40 -40 -40 -40 -00 -00 -ENDCHAR -STARTCHAR uni2309 -ENCODING 8969 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -10 -10 -10 -10 -10 -10 -10 -00 -00 -ENDCHAR -STARTCHAR uni230A -ENCODING 8970 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -40 -40 -40 -40 -40 -40 -40 -70 -00 -00 -ENDCHAR -STARTCHAR uni230B -ENCODING 8971 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -10 -10 -10 -10 -10 -10 -70 -00 -00 -ENDCHAR -STARTCHAR revlogicalnot -ENCODING 8976 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F8 -80 -80 -80 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2319 -ENCODING 8985 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -80 -80 -80 -F8 -00 -00 -00 -00 -ENDCHAR -STARTCHAR integraltp -ENCODING 8992 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -10 -28 -28 -20 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR integralbt -ENCODING 8993 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -20 -20 -A0 -A0 -40 -00 -00 -ENDCHAR -STARTCHAR uni239B -ENCODING 9115 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -10 -10 -20 -20 -20 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR uni239C -ENCODING 9116 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR uni239D -ENCODING 9117 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -40 -40 -40 -40 -20 -20 -20 -10 -10 -08 -ENDCHAR -STARTCHAR uni239E -ENCODING 9118 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -20 -20 -10 -10 -10 -08 -08 -08 -08 -08 -08 -ENDCHAR -STARTCHAR uni239F -ENCODING 9119 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -ENDCHAR -STARTCHAR uni23A0 -ENCODING 9120 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -08 -08 -08 -08 -10 -10 -10 -20 -20 -40 -ENDCHAR -STARTCHAR uni23A1 -ENCODING 9121 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -78 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR uni23A2 -ENCODING 9122 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR uni23A3 -ENCODING 9123 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -78 -ENDCHAR -STARTCHAR uni23A4 -ENCODING 9124 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -78 -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -ENDCHAR -STARTCHAR uni23A5 -ENCODING 9125 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -ENDCHAR -STARTCHAR uni23A6 -ENCODING 9126 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -08 -78 -ENDCHAR -STARTCHAR uni23A7 -ENCODING 9127 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -0C -10 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni23A8 -ENCODING 9128 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -C0 -C0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni23A9 -ENCODING 9129 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -10 -0C -ENDCHAR -STARTCHAR uni23AB -ENCODING 9131 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -C0 -20 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -ENDCHAR -STARTCHAR uni23AC -ENCODING 9132 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -10 -10 -10 -10 -0C -0C -10 -10 -10 -10 -10 -ENDCHAR -STARTCHAR uni23AD -ENCODING 9133 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -20 -C0 -ENDCHAR -STARTCHAR uni23AE -ENCODING 9134 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni23AF -ENCODING 9135 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni23BA -ENCODING 9146 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -FC -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni23BB -ENCODING 9147 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -FC -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni23BC -ENCODING 9148 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -FC -00 -00 -00 -ENDCHAR -STARTCHAR uni23BD -ENCODING 9149 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -FC -ENDCHAR -STARTCHAR uni23D0 -ENCODING 9168 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2409 -ENCODING 9225 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -90 -90 -F0 -90 -90 -00 -7C -10 -10 -10 -10 -00 -ENDCHAR -STARTCHAR uni240A -ENCODING 9226 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -80 -80 -80 -F0 -00 -3C -20 -38 -20 -20 -00 -ENDCHAR -STARTCHAR uni240B -ENCODING 9227 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -88 -88 -88 -50 -20 -00 -7C -10 -10 -10 -10 -00 -ENDCHAR -STARTCHAR uni240C -ENCODING 9228 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -F0 -80 -E0 -80 -80 -00 -3C -20 -38 -20 -20 -00 -ENDCHAR -STARTCHAR uni240D -ENCODING 9229 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -60 -90 -80 -90 -60 -00 -38 -24 -38 -28 -24 -00 -ENDCHAR -STARTCHAR uni2424 -ENCODING 9252 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -90 -D0 -B0 -90 -90 -00 -20 -20 -20 -20 -3C -00 -ENDCHAR -STARTCHAR SF100000 -ENCODING 9472 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2501 -ENCODING 9473 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -FC -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF110000 -ENCODING 9474 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2503 -ENCODING 9475 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -30 -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2508 -ENCODING 9480 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -A8 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2509 -ENCODING 9481 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -A8 -A8 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni250A -ENCODING 9482 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -00 -20 -20 -00 -20 -20 -00 -20 -20 -00 -ENDCHAR -STARTCHAR uni250B -ENCODING 9483 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -00 -30 -30 -00 -30 -30 -00 -30 -30 -00 -ENDCHAR -STARTCHAR SF010000 -ENCODING 9484 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -3C -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni250D -ENCODING 9485 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -3C -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni250E -ENCODING 9486 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -3C -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni250F -ENCODING 9487 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -3C -3C -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR SF030000 -ENCODING 9488 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -E0 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2511 -ENCODING 9489 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -E0 -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2512 -ENCODING 9490 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -F0 -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2513 -ENCODING 9491 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -F0 -F0 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR SF020000 -ENCODING 9492 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -3C -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2515 -ENCODING 9493 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -3C -3C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2516 -ENCODING 9494 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -3C -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2517 -ENCODING 9495 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -3C -3C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF040000 -ENCODING 9496 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -E0 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2519 -ENCODING 9497 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -E0 -E0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni251A -ENCODING 9498 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -F0 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni251B -ENCODING 9499 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -F0 -F0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF080000 -ENCODING 9500 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -3C -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni251D -ENCODING 9501 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -3C -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni251E -ENCODING 9502 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -3C -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni251F -ENCODING 9503 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -3C -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2520 -ENCODING 9504 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -3C -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2521 -ENCODING 9505 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -3C -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2522 -ENCODING 9506 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -3C -3C -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2523 -ENCODING 9507 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -3C -3C -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR SF090000 -ENCODING 9508 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -E0 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2525 -ENCODING 9509 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -E0 -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2526 -ENCODING 9510 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -F0 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2527 -ENCODING 9511 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -F0 -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2528 -ENCODING 9512 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -F0 -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2529 -ENCODING 9513 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -F0 -F0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni252A -ENCODING 9514 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -F0 -F0 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni252B -ENCODING 9515 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -F0 -F0 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR SF060000 -ENCODING 9516 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni252D -ENCODING 9517 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni252E -ENCODING 9518 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni252F -ENCODING 9519 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -FC -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2530 -ENCODING 9520 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2531 -ENCODING 9521 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -F0 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2532 -ENCODING 9522 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -3C -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2533 -ENCODING 9523 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -FC -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR SF070000 -ENCODING 9524 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2535 -ENCODING 9525 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -E0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2536 -ENCODING 9526 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -3C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2537 -ENCODING 9527 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -FC -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2538 -ENCODING 9528 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2539 -ENCODING 9529 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -F0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni253A -ENCODING 9530 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -3C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni253B -ENCODING 9531 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -FC -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF050000 -ENCODING 9532 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni253D -ENCODING 9533 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni253E -ENCODING 9534 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni253F -ENCODING 9535 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -FC -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2540 -ENCODING 9536 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2541 -ENCODING 9537 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2542 -ENCODING 9538 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2543 -ENCODING 9539 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2544 -ENCODING 9540 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2545 -ENCODING 9541 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -F0 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2546 -ENCODING 9542 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -3C -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2547 -ENCODING 9543 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -FC -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2548 -ENCODING 9544 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -FC -FC -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni2549 -ENCODING 9545 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -F0 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni254A -ENCODING 9546 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -3C -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni254B -ENCODING 9547 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -FC -FC -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR SF430000 -ENCODING 9552 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -FC -00 -FC -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF240000 -ENCODING 9553 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -50 -50 -50 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF510000 -ENCODING 9554 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -3C -20 -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF520000 -ENCODING 9555 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -7C -50 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF390000 -ENCODING 9556 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -7C -40 -5C -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF220000 -ENCODING 9557 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -E0 -20 -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF210000 -ENCODING 9558 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -F0 -50 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF250000 -ENCODING 9559 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -F0 -10 -D0 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF500000 -ENCODING 9560 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -3C -20 -3C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF490000 -ENCODING 9561 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -50 -7C -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF380000 -ENCODING 9562 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -5C -40 -7C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF280000 -ENCODING 9563 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -E0 -20 -E0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF270000 -ENCODING 9564 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -50 -F0 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF260000 -ENCODING 9565 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -D0 -10 -F0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF360000 -ENCODING 9566 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -3C -20 -3C -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF370000 -ENCODING 9567 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -50 -5C -50 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF420000 -ENCODING 9568 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -5C -40 -5C -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF190000 -ENCODING 9569 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -E0 -20 -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF200000 -ENCODING 9570 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -50 -D0 -50 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF230000 -ENCODING 9571 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -D0 -10 -D0 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF470000 -ENCODING 9572 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -FC -00 -FC -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF480000 -ENCODING 9573 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -50 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF410000 -ENCODING 9574 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -FC -00 -DC -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF450000 -ENCODING 9575 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -FC -00 -FC -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF460000 -ENCODING 9576 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -50 -FC -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF400000 -ENCODING 9577 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -DC -00 -FC -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF540000 -ENCODING 9578 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -FC -20 -FC -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF530000 -ENCODING 9579 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -50 -FC -50 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR SF440000 -ENCODING 9580 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -50 -50 -50 -50 -DC -00 -DC -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR uni256D -ENCODING 9581 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -0C -10 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni256E -ENCODING 9582 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -80 -40 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni256F -ENCODING 9583 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -40 -80 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2570 -ENCODING 9584 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -10 -0C -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2571 -ENCODING 9585 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -04 -04 -08 -08 -10 -10 -20 -20 -40 -40 -80 -80 -ENDCHAR -STARTCHAR uni2572 -ENCODING 9586 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -80 -40 -40 -20 -20 -10 -10 -08 -08 -04 -04 -ENDCHAR -STARTCHAR uni2573 -ENCODING 9587 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -84 -84 -48 -48 -30 -30 -30 -30 -48 -48 -84 -84 -ENDCHAR -STARTCHAR uni2574 -ENCODING 9588 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -E0 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2575 -ENCODING 9589 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -20 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2576 -ENCODING 9590 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -3C -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2577 -ENCODING 9591 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -20 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni2578 -ENCODING 9592 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -E0 -E0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2579 -ENCODING 9593 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -30 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni257A -ENCODING 9594 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -3C -3C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni257B -ENCODING 9595 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -30 -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni257C -ENCODING 9596 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -3C -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni257D -ENCODING 9597 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -20 -20 -20 -20 -20 -30 -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR uni257E -ENCODING 9598 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -E0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni257F -ENCODING 9599 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -30 -30 -30 -30 -30 -30 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR upblock -ENCODING 9600 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -FC -FC -FC -FC -FC -FC -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2581 -ENCODING 9601 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -FC -ENDCHAR -STARTCHAR uni2582 -ENCODING 9602 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -FC -FC -FC -ENDCHAR -STARTCHAR uni2583 -ENCODING 9603 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -FC -FC -FC -FC -ENDCHAR -STARTCHAR dnblock -ENCODING 9604 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR uni2585 -ENCODING 9605 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -FC -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR uni2586 -ENCODING 9606 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -FC -FC -FC -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR uni2587 -ENCODING 9607 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -FC -FC -FC -FC -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR block -ENCODING 9608 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -FC -FC -FC -FC -FC -FC -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR uni2589 -ENCODING 9609 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -ENDCHAR -STARTCHAR uni258A -ENCODING 9610 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -ENDCHAR -STARTCHAR uni258B -ENCODING 9611 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -ENDCHAR -STARTCHAR lfblock -ENCODING 9612 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -E0 -E0 -E0 -E0 -E0 -E0 -E0 -E0 -E0 -E0 -E0 -E0 -ENDCHAR -STARTCHAR uni258D -ENCODING 9613 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -ENDCHAR -STARTCHAR uni258E -ENCODING 9614 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR uni258F -ENCODING 9615 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR rtblock -ENCODING 9616 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -1C -1C -1C -1C -1C -1C -1C -1C -1C -1C -1C -1C -ENDCHAR -STARTCHAR ltshade -ENCODING 9617 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -90 -24 -90 -24 -90 -24 -90 -24 -90 -24 -90 -24 -ENDCHAR -STARTCHAR shade -ENCODING 9618 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -A8 -54 -A8 -54 -A8 -54 -A8 -54 -A8 -54 -A8 -54 -ENDCHAR -STARTCHAR dkshade -ENCODING 9619 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -D8 -B4 -D8 -B4 -D8 -B4 -D8 -B4 -D8 -B4 -D8 -B4 -ENDCHAR -STARTCHAR uni2596 -ENCODING 9622 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -E0 -E0 -E0 -E0 -E0 -E0 -ENDCHAR -STARTCHAR uni2597 -ENCODING 9623 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -1C -1C -1C -1C -1C -1C -ENDCHAR -STARTCHAR uni2598 -ENCODING 9624 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -E0 -E0 -E0 -E0 -E0 -E0 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2599 -ENCODING 9625 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -E0 -E0 -E0 -E0 -E0 -E0 -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR uni259A -ENCODING 9626 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -E0 -E0 -E0 -E0 -E0 -E0 -1C -1C -1C -1C -1C -1C -ENDCHAR -STARTCHAR uni259B -ENCODING 9627 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -FC -FC -FC -FC -FC -FC -E0 -E0 -E0 -E0 -E0 -E0 -ENDCHAR -STARTCHAR uni259C -ENCODING 9628 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -FC -FC -FC -FC -FC -FC -1C -1C -1C -1C -1C -1C -ENDCHAR -STARTCHAR uni259D -ENCODING 9629 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -1C -1C -1C -1C -1C -1C -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni259E -ENCODING 9630 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -1C -1C -1C -1C -1C -1C -E0 -E0 -E0 -E0 -E0 -E0 -ENDCHAR -STARTCHAR uni259F -ENCODING 9631 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -1C -1C -1C -1C -1C -1C -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR filledbox -ENCODING 9632 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -78 -78 -78 -78 -78 -00 -00 -00 -00 -ENDCHAR -STARTCHAR filledrect -ENCODING 9644 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -F8 -F8 -F8 -00 -00 -ENDCHAR -STARTCHAR uni25AE -ENCODING 9646 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -00 -00 -ENDCHAR -STARTCHAR triagup -ENCODING 9650 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -30 -30 -78 -78 -FC -FC -00 -00 -00 -ENDCHAR -STARTCHAR uni25B6 -ENCODING 9654 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -C0 -F0 -FC -FC -F0 -C0 -00 -00 -00 -ENDCHAR -STARTCHAR triagrt -ENCODING 9658 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -C0 -F0 -FC -FC -F0 -C0 -00 -00 -00 -ENDCHAR -STARTCHAR triagdn -ENCODING 9660 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -FC -FC -78 -78 -30 -30 -00 -00 -00 -ENDCHAR -STARTCHAR uni25C0 -ENCODING 9664 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -0C -3C -FC -FC -3C -0C -00 -00 -00 -ENDCHAR -STARTCHAR triaglf -ENCODING 9668 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -0C -3C -FC -FC -3C -0C -00 -00 -00 -ENDCHAR -STARTCHAR blackdiamond -ENCODING 9670 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -70 -F8 -70 -20 -00 -00 -00 -00 -ENDCHAR -STARTCHAR lozenge -ENCODING 9674 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -50 -88 -50 -20 -00 -00 -00 -00 -ENDCHAR -STARTCHAR circle -ENCODING 9675 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -30 -48 -48 -30 -00 -00 -00 -00 -ENDCHAR -STARTCHAR H18533 -ENCODING 9679 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -30 -78 -78 -30 -00 -00 -00 -00 -ENDCHAR -STARTCHAR invbullet -ENCODING 9688 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -FC -FC -FC -FC -CC -84 -84 -CC -FC -FC -FC -FC -ENDCHAR -STARTCHAR invcircle -ENCODING 9689 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -FC -FC -FC -FC -CC -B4 -B4 -CC -FC -FC -FC -FC -ENDCHAR -STARTCHAR smileface -ENCODING 9786 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -84 -CC -84 -B4 -B4 -84 -78 -00 -00 -ENDCHAR -STARTCHAR invsmileface -ENCODING 9787 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -FC -B4 -FC -84 -CC -FC -78 -00 -00 -ENDCHAR -STARTCHAR sun -ENCODING 9788 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -A8 -70 -D8 -70 -A8 -20 -00 -00 -ENDCHAR -STARTCHAR female -ENCODING 9792 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -70 -88 -88 -88 -70 -20 -F8 -20 -00 -00 -ENDCHAR -STARTCHAR male -ENCODING 9794 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -3C -0C -14 -70 -88 -88 -88 -70 -00 -00 -ENDCHAR -STARTCHAR spade -ENCODING 9824 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -20 -70 -F8 -F8 -70 -20 -70 -00 -00 -ENDCHAR -STARTCHAR club -ENCODING 9827 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -20 -70 -20 -A8 -F8 -A8 -20 -70 -00 -00 -ENDCHAR -STARTCHAR heart -ENCODING 9829 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -50 -F8 -F8 -F8 -70 -70 -20 -00 -00 -ENDCHAR -STARTCHAR diamond -ENCODING 9830 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -20 -70 -F8 -70 -20 -00 -00 -00 -00 -ENDCHAR -STARTCHAR musicalnote -ENCODING 9834 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -48 -78 -40 -40 -40 -40 -80 -00 -00 -ENDCHAR -STARTCHAR musicalnotedbl -ENCODING 9835 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -78 -48 -78 -48 -48 -48 -48 -50 -80 -00 -ENDCHAR -STARTCHAR uni2713 -ENCODING 10003 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -04 -04 -08 -88 -90 -50 -20 -20 -00 -00 -ENDCHAR -STARTCHAR uni2714 -ENCODING 10004 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -0C -0C -18 -D8 -F0 -70 -60 -60 -00 -00 -ENDCHAR -STARTCHAR uni2717 -ENCODING 10007 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -48 -28 -10 -10 -28 -24 -40 -40 -00 -00 -ENDCHAR -STARTCHAR uni2718 -ENCODING 10008 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -18 -D8 -70 -30 -78 -6C -C0 -C0 -00 -00 -ENDCHAR -STARTCHAR uni27E8 -ENCODING 10216 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -10 -10 -20 -20 -40 -20 -20 -10 -10 -00 -00 -ENDCHAR -STARTCHAR uni27E9 -ENCODING 10217 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -40 -40 -20 -20 -10 -20 -20 -40 -40 -00 -00 -ENDCHAR -STARTCHAR uni27EA -ENCODING 10218 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -28 -28 -50 -50 -A0 -50 -50 -28 -28 -00 -00 -ENDCHAR -STARTCHAR uni27EB -ENCODING 10219 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -A0 -A0 -50 -50 -28 -50 -50 -A0 -A0 -00 -00 -ENDCHAR -STARTCHAR uni2800 -ENCODING 10240 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2801 -ENCODING 10241 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2802 -ENCODING 10242 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2803 -ENCODING 10243 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2804 -ENCODING 10244 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2805 -ENCODING 10245 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2806 -ENCODING 10246 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2807 -ENCODING 10247 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2808 -ENCODING 10248 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2809 -ENCODING 10249 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni280A -ENCODING 10250 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni280B -ENCODING 10251 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni280C -ENCODING 10252 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni280D -ENCODING 10253 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni280E -ENCODING 10254 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni280F -ENCODING 10255 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2810 -ENCODING 10256 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2811 -ENCODING 10257 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2812 -ENCODING 10258 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2813 -ENCODING 10259 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2814 -ENCODING 10260 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2815 -ENCODING 10261 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2816 -ENCODING 10262 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2817 -ENCODING 10263 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2818 -ENCODING 10264 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2819 -ENCODING 10265 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni281A -ENCODING 10266 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni281B -ENCODING 10267 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni281C -ENCODING 10268 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni281D -ENCODING 10269 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni281E -ENCODING 10270 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni281F -ENCODING 10271 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -40 -40 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2820 -ENCODING 10272 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2821 -ENCODING 10273 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2822 -ENCODING 10274 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2823 -ENCODING 10275 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2824 -ENCODING 10276 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2825 -ENCODING 10277 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2826 -ENCODING 10278 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2827 -ENCODING 10279 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2828 -ENCODING 10280 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2829 -ENCODING 10281 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni282A -ENCODING 10282 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni282B -ENCODING 10283 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni282C -ENCODING 10284 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni282D -ENCODING 10285 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni282E -ENCODING 10286 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni282F -ENCODING 10287 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2830 -ENCODING 10288 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2831 -ENCODING 10289 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2832 -ENCODING 10290 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2833 -ENCODING 10291 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2834 -ENCODING 10292 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2835 -ENCODING 10293 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2836 -ENCODING 10294 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2837 -ENCODING 10295 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2838 -ENCODING 10296 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2839 -ENCODING 10297 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni283A -ENCODING 10298 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni283B -ENCODING 10299 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -08 -08 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni283C -ENCODING 10300 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni283D -ENCODING 10301 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni283E -ENCODING 10302 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni283F -ENCODING 10303 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -48 -48 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni2840 -ENCODING 10304 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2841 -ENCODING 10305 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2842 -ENCODING 10306 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2843 -ENCODING 10307 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2844 -ENCODING 10308 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2845 -ENCODING 10309 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2846 -ENCODING 10310 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2847 -ENCODING 10311 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2848 -ENCODING 10312 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2849 -ENCODING 10313 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni284A -ENCODING 10314 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni284B -ENCODING 10315 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni284C -ENCODING 10316 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni284D -ENCODING 10317 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni284E -ENCODING 10318 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni284F -ENCODING 10319 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2850 -ENCODING 10320 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2851 -ENCODING 10321 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2852 -ENCODING 10322 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2853 -ENCODING 10323 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2854 -ENCODING 10324 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2855 -ENCODING 10325 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2856 -ENCODING 10326 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2857 -ENCODING 10327 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2858 -ENCODING 10328 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2859 -ENCODING 10329 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni285A -ENCODING 10330 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni285B -ENCODING 10331 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -00 -00 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni285C -ENCODING 10332 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni285D -ENCODING 10333 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni285E -ENCODING 10334 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni285F -ENCODING 10335 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -40 -40 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2860 -ENCODING 10336 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2861 -ENCODING 10337 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2862 -ENCODING 10338 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2863 -ENCODING 10339 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2864 -ENCODING 10340 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2865 -ENCODING 10341 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2866 -ENCODING 10342 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2867 -ENCODING 10343 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2868 -ENCODING 10344 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2869 -ENCODING 10345 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni286A -ENCODING 10346 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni286B -ENCODING 10347 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni286C -ENCODING 10348 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni286D -ENCODING 10349 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni286E -ENCODING 10350 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni286F -ENCODING 10351 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2870 -ENCODING 10352 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2871 -ENCODING 10353 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2872 -ENCODING 10354 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2873 -ENCODING 10355 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2874 -ENCODING 10356 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2875 -ENCODING 10357 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2876 -ENCODING 10358 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2877 -ENCODING 10359 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2878 -ENCODING 10360 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2879 -ENCODING 10361 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni287A -ENCODING 10362 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni287B -ENCODING 10363 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -08 -08 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni287C -ENCODING 10364 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni287D -ENCODING 10365 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni287E -ENCODING 10366 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni287F -ENCODING 10367 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -48 -48 -00 -40 -40 -00 -ENDCHAR -STARTCHAR uni2880 -ENCODING 10368 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2881 -ENCODING 10369 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2882 -ENCODING 10370 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2883 -ENCODING 10371 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2884 -ENCODING 10372 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2885 -ENCODING 10373 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2886 -ENCODING 10374 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2887 -ENCODING 10375 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2888 -ENCODING 10376 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2889 -ENCODING 10377 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni288A -ENCODING 10378 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni288B -ENCODING 10379 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni288C -ENCODING 10380 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni288D -ENCODING 10381 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni288E -ENCODING 10382 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni288F -ENCODING 10383 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2890 -ENCODING 10384 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2891 -ENCODING 10385 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2892 -ENCODING 10386 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2893 -ENCODING 10387 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2894 -ENCODING 10388 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2895 -ENCODING 10389 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2896 -ENCODING 10390 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2897 -ENCODING 10391 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2898 -ENCODING 10392 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni2899 -ENCODING 10393 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni289A -ENCODING 10394 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni289B -ENCODING 10395 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -00 -00 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni289C -ENCODING 10396 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni289D -ENCODING 10397 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni289E -ENCODING 10398 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni289F -ENCODING 10399 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -40 -40 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A0 -ENCODING 10400 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A1 -ENCODING 10401 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A2 -ENCODING 10402 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A3 -ENCODING 10403 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A4 -ENCODING 10404 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A5 -ENCODING 10405 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A6 -ENCODING 10406 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A7 -ENCODING 10407 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A8 -ENCODING 10408 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28A9 -ENCODING 10409 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28AA -ENCODING 10410 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28AB -ENCODING 10411 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28AC -ENCODING 10412 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28AD -ENCODING 10413 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28AE -ENCODING 10414 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28AF -ENCODING 10415 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B0 -ENCODING 10416 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B1 -ENCODING 10417 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B2 -ENCODING 10418 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B3 -ENCODING 10419 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B4 -ENCODING 10420 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B5 -ENCODING 10421 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B6 -ENCODING 10422 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B7 -ENCODING 10423 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B8 -ENCODING 10424 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28B9 -ENCODING 10425 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28BA -ENCODING 10426 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28BB -ENCODING 10427 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -08 -08 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28BC -ENCODING 10428 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28BD -ENCODING 10429 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28BE -ENCODING 10430 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28BF -ENCODING 10431 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -48 -48 -00 -08 -08 -00 -ENDCHAR -STARTCHAR uni28C0 -ENCODING 10432 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C1 -ENCODING 10433 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C2 -ENCODING 10434 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C3 -ENCODING 10435 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C4 -ENCODING 10436 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C5 -ENCODING 10437 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C6 -ENCODING 10438 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C7 -ENCODING 10439 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C8 -ENCODING 10440 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28C9 -ENCODING 10441 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28CA -ENCODING 10442 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28CB -ENCODING 10443 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28CC -ENCODING 10444 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28CD -ENCODING 10445 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28CE -ENCODING 10446 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28CF -ENCODING 10447 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D0 -ENCODING 10448 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D1 -ENCODING 10449 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D2 -ENCODING 10450 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D3 -ENCODING 10451 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D4 -ENCODING 10452 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D5 -ENCODING 10453 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D6 -ENCODING 10454 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D7 -ENCODING 10455 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D8 -ENCODING 10456 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28D9 -ENCODING 10457 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28DA -ENCODING 10458 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28DB -ENCODING 10459 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -00 -00 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28DC -ENCODING 10460 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28DD -ENCODING 10461 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28DE -ENCODING 10462 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28DF -ENCODING 10463 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -40 -40 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E0 -ENCODING 10464 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E1 -ENCODING 10465 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E2 -ENCODING 10466 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E3 -ENCODING 10467 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E4 -ENCODING 10468 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -00 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E5 -ENCODING 10469 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -00 -00 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E6 -ENCODING 10470 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -40 -40 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E7 -ENCODING 10471 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -40 -40 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E8 -ENCODING 10472 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28E9 -ENCODING 10473 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28EA -ENCODING 10474 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28EB -ENCODING 10475 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28EC -ENCODING 10476 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -00 -00 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28ED -ENCODING 10477 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -00 -00 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28EE -ENCODING 10478 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -40 -40 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28EF -ENCODING 10479 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -40 -40 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F0 -ENCODING 10480 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F1 -ENCODING 10481 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F2 -ENCODING 10482 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F3 -ENCODING 10483 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F4 -ENCODING 10484 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -08 -08 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F5 -ENCODING 10485 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -08 -08 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F6 -ENCODING 10486 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -48 -48 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F7 -ENCODING 10487 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -40 -40 -00 -48 -48 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F8 -ENCODING 10488 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28F9 -ENCODING 10489 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28FA -ENCODING 10490 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28FB -ENCODING 10491 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -08 -08 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28FC -ENCODING 10492 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -08 -08 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28FD -ENCODING 10493 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -08 -08 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28FE -ENCODING 10494 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -08 -08 -00 -48 -48 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni28FF -ENCODING 10495 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -48 -48 -00 -48 -48 -00 -48 -48 -00 -48 -48 -00 -ENDCHAR -STARTCHAR uni2E2C -ENCODING 11820 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -88 -88 -00 -00 -88 -88 -00 -00 -ENDCHAR -STARTCHAR uniE0A0 -ENCODING 57504 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -90 -B8 -90 -90 -90 -20 -40 -80 -80 -80 -80 -ENDCHAR -STARTCHAR uniE0A1 -ENCODING 57505 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -80 -80 -80 -F0 -00 -24 -34 -2C -24 -24 -00 -ENDCHAR -STARTCHAR uniE0A2 -ENCODING 57506 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -30 -48 -48 -48 -FC -FC -CC -CC -FC -FC -00 -ENDCHAR -STARTCHAR uniE0B0 -ENCODING 57520 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -C0 -E0 -F0 -F8 -FC -FC -F8 -F0 -E0 -C0 -80 -ENDCHAR -STARTCHAR uniE0B1 -ENCODING 57521 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -80 -40 -20 -10 -08 -04 -04 -08 -10 -20 -40 -80 -ENDCHAR -STARTCHAR uniE0B2 -ENCODING 57522 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -04 -0C -1C -3C -7C -FC -FC -7C -3C -1C -0C -04 -ENDCHAR -STARTCHAR uniE0B3 -ENCODING 57523 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -04 -08 -10 -20 -40 -80 -80 -40 -20 -10 -08 -04 -ENDCHAR -STARTCHAR uniF6BE -ENCODING 63166 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -00 -00 -18 -08 -08 -08 -08 -08 -48 -30 -ENDCHAR -STARTCHAR uniFFFD -ENCODING 65533 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 12 0 -2 -BITMAP -00 -00 -F8 -88 -88 -88 -88 -88 -88 -F8 -00 -00 -ENDCHAR -ENDFONT diff --git a/src/base_circuitpython/img/blinka.bmp b/src/base_circuitpython/img/blinka.bmp deleted file mode 100644 index 0466a02d426e7aa64e8bef4656187276c6f963e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172856 zcmeI&F-ikL6adiG*3K$eSxHb31<@c1!CtVjxAF{@dxX@f0)ppA?I}D$ZV>;@m}Nm2 zOK0JQ*=5)X%g@`-=QG)d$JzUS(|xYvn8vaBIrf@K%$jCD)(;PwbfgPT1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0Rn#t++I$v&hCGomq+dL=yf-``JcD)1p@yrus&`FW3`*d zq?@<%ml)5d^N2Gt{NJM$0D-c=V)7CrXK$atIgRsq^Z60gyL=O?1nLpEIX_viz9Mgj z=Sb$1IG53^jzu7{T5%rB!xCp%AQ$S`*08fthO%0}KyEx@ zw^`d<|HBetSs?FqL^7+)Whkrl3-lXz!^%9I*Z&hlNT3&pd`|zN^lxso`Je9o3nm0c zB#`zrV$ZqVZnx`sys*)|k2IqAg-T#3khe9WL`ObH|16n@IOby%NG(TKq9yYfAD@_; F<{QoHq!<7I diff --git a/src/base_circuitpython/neopixel_write.py b/src/base_circuitpython/neopixel_write.py deleted file mode 100644 index 341215f35..000000000 --- a/src/base_circuitpython/neopixel_write.py +++ /dev/null @@ -1,55 +0,0 @@ -# overriden neopixel_write library to write to frontend - -# original implementation docs for neopixel_write: -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/neopixel_write/__init__.html - - -import pathlib -import sys -import os - -import common -from adafruit_circuitplayground import cp -import base_cp_constants as CONSTANTS - - -def neopixel_write(gpio, buf): - """Write buf out on the given DigitalInOut.""" - - if len(tuple(buf)) > 0: - # if we are explicitly given - # the clue pin, that means that - # the clue is definitely the active device - # because the constructor for the - # clue is what calls neopixel - # with the clue pin argument - if gpio.pin != CONSTANTS.CLUE_PIN: - send_cpx(buf) - send_clue(buf) - - -def send_clue(buf): - sendable_json = {CONSTANTS.PIXELS: tuple(buf)} - if common.utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - sendable_json, CONSTANTS.CLUE - ) - else: - common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) - - -def send_cpx(buf): - buf_list = list(buf) - ret_list = [] - temp_list = [] - for idx, elem in enumerate(buf_list): - if idx % 3 == 0 and idx != 0: - ret_list.append(tuple(temp_list)) - temp_list = [] - temp_list.append(elem) - - if len(temp_list) == 3: - ret_list.append(tuple(temp_list)) - - max_index = min(len(ret_list), 10) - cp.pixels[0:max_index] = ret_list[0:max_index] diff --git a/src/base_circuitpython/pulseio.py b/src/base_circuitpython/pulseio.py deleted file mode 100644 index f69a45836..000000000 --- a/src/base_circuitpython/pulseio.py +++ /dev/null @@ -1,16 +0,0 @@ -from common import utils - - -class PulseIn: - def __init__(self, pin, maxlen=2, *, idle_state=False): - utils.print_for_unimplemented_functions(PulseIn.__init__.__qualname__) - - -class PulseOut: - def __init__(self, carrier): - utils.print_for_unimplemented_functions(PulseOut.__init__.__qualname__) - - -class PWMOut: - def __init__(self, pin, *, duty_cycle=0, frequency=500, variable_frequency=False): - utils.print_for_unimplemented_functions(PWMOut.__init__.__qualname__) diff --git a/src/base_circuitpython/terminal_handler.py b/src/base_circuitpython/terminal_handler.py deleted file mode 100644 index 83130f0b0..000000000 --- a/src/base_circuitpython/terminal_handler.py +++ /dev/null @@ -1,108 +0,0 @@ -from PIL import Image -import threading -import os -import base64 -from io import BytesIO -import time -import collections -import pathlib - -from common import utils -import board -import base_cp_constants as CONSTANTS -import displayio -import terminalio - - -class Terminal: - def __init__(self): - self.__output_values = collections.deque() - self.__lock = threading.Lock() - self.__abs_path = pathlib.Path(__file__).parent.absolute() - self.__base_img = Image.open( - os.path.join(self.__abs_path, CONSTANTS.IMG_DIR_NAME, CONSTANTS.BLINKA_BMP) - ) - - def __create_newline(self, str_list): - self.__lock.acquire() - for string in str_list: - self.__output_values.appendleft(string) - - over = len(self.__output_values) - CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX - - # max CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX items in output_values - if over > 0: - for i in range(over): - self.__output_values.pop() - - self.__lock.release() - - def __draw(self, no_verif=False): - - import adafruit_display_text.label - - # no need to check the active group within the Group class - # since the caller of draw already did - splash = displayio.Group( - max_size=20, check_active_group_ref=False, auto_write=False - ) - - self.__lock.acquire() - - # since the text starts from the bottom, - # we need to find an offset if there are empty spots - - # handling of output_values already ensures that there are - # max CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX items in output_values deque - num_empty_slots = CONSTANTS.CLUE_TERMINAL_LINE_NUM_MAX - len( - self.__output_values - ) - curr_y = CONSTANTS.CLUE_TERMINAL_Y_OFFSET + ( - CONSTANTS.CLUE_TERMINAL_LINE_HEIGHT * num_empty_slots - ) - for output_val in reversed(self.__output_values): - if len(output_val): - text_area = adafruit_display_text.label.Label( - terminalio.FONT, text=output_val, line_spacing=1.25 - ) - - text_area.y = curr_y - text_area.x = CONSTANTS.CLUE_TERMINAL_X_OFFSET - splash.append(text_area) - - curr_y += CONSTANTS.CLUE_TERMINAL_LINE_HEIGHT - - self.__lock.release() - - splash._Group__draw(img=self.__base_img.copy()) - - def add_str_to_terminal(self, curr_display_string=""): - - line_break_amt = CONSTANTS.CLUE_TERMINAL_LINE_BREAK_AMT - - # characters until forced newline - newline_expected_val = line_break_amt - out_str = "" - new_strs = [] - for idx, d in enumerate(curr_display_string): - # handle custom or forced newline - if d == "\n" or newline_expected_val == 0: - new_strs.append(out_str) - out_str = "" - newline_expected_val = line_break_amt - - # if it was a custom newline, no longer need to - # process the character - if d == "\n": - continue - else: - newline_expected_val -= 1 - out_str += d - new_strs.append(out_str) - - self.__create_newline(new_strs) - - # only go ahead to draw the screen - # if the terminal is actively on the screen - if board.DISPLAY.active_group == None: - self.__draw() diff --git a/src/base_circuitpython/terminalio.py b/src/base_circuitpython/terminalio.py deleted file mode 100644 index 58abb7fc4..000000000 --- a/src/base_circuitpython/terminalio.py +++ /dev/null @@ -1,15 +0,0 @@ -# overriden terminalio library, which uses -# adafruit_bitmap_font to load the default font - -# original implementation docs for terminalio: -# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/terminalio/__init__.html - -from adafruit_bitmap_font import bitmap_font # pylint: disable=wrong-import-position - -import os -import pathlib - -abs_path = pathlib.Path(__file__).parent.absolute() - -# load default font -FONT = bitmap_font.load_font(os.path.join(abs_path, "fonts", "ter-u12n.bdf")) diff --git a/src/base_circuitpython/test/__init__.py b/src/base_circuitpython/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/base_circuitpython/test/test_terminal_handler.py b/src/base_circuitpython/test/test_terminal_handler.py deleted file mode 100644 index 22a8986af..000000000 --- a/src/base_circuitpython/test/test_terminal_handler.py +++ /dev/null @@ -1,61 +0,0 @@ -import pytest - -import base_circuitpython.terminal_handler -from common import utils -from unittest import mock - - -class TestTerminal(object): - def setup_method(self): - - utils.send_to_simulator = mock.Mock() - - @pytest.mark.parametrize( - "str_vals", - [ - (["potato", "Lorem ipsum"]), - ([""]), - ([".......", "123456", "", "test"]), - (["123456789 123456789 123456789 1234567"]), - ], - ) - def test_single_line(self, str_vals): - self.terminal = base_circuitpython.terminal_handler.Terminal() - for s in str_vals: - self.terminal.add_str_to_terminal(s) - - result = list(self.terminal._Terminal__output_values) - result.reverse() - - # output should just be the reversed version since all lines - # don't have newline or exceed 37 characters - assert str_vals == result - - @pytest.mark.parametrize( - "str_vals, expected", - [ - ( - ["\nCode done running. Waiting for reload."], - [".", "Code done running. Waiting for reload", ""], - ), - ( - ["TESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTEST"], - ["ESTTESTTEST", "TESTTESTTESTTESTTESTTESTTESTTESTTESTT"], - ), - ( - ["\nCode done running. Waiting for reload.", "........."], - [".........", ".", "Code done running. Waiting for reload", ""], - ), - ( - ["TEST TEST TEST TEST TEST ", "..."], - ["...", " ", "TEST TEST TEST TEST TEST "], - ), - ], - ) - def test_multiline(self, str_vals, expected): - self.terminal = base_circuitpython.terminal_handler.Terminal() - for s in str_vals: - self.terminal.add_str_to_terminal(s) - - result = list(self.terminal._Terminal__output_values) - assert result == expected diff --git a/src/check_if_venv.py b/src/check_if_venv.py deleted file mode 100644 index 45fd3dd2b..000000000 --- a/src/check_if_venv.py +++ /dev/null @@ -1,11 +0,0 @@ -# from https://stackoverflow.com/questions/1871549/determine-if-python-is-running-inside-virtualenv -import sys - -isVenv = hasattr(sys, "real_prefix") or ( - hasattr(sys, "base_prefix") and sys.base_prefix != sys.prefix -) - -# prints result for frontend to read -# 1 -> is a venv -# 0 -> is NOT a venv -print(int(isVenv)) diff --git a/src/check_python_dependencies.py b/src/check_python_dependencies.py deleted file mode 100644 index 6c51463c7..000000000 --- a/src/check_python_dependencies.py +++ /dev/null @@ -1,36 +0,0 @@ -# from https://stackoverflow.com/questions/16294819/check-if-my-python-has-all-required-packages -import sys -import pkg_resources -import python_constants as CONSTANTS - - -def check_for_dependencies(): - with open(f"{sys.path[0]}/requirements.txt") as f: - dependencies = [x.strip() for x in f.readlines()] - - cleaned_dependencies = [] - - # getting names of packages from tar.gz files - - # FOR PRE-DOWNLOADED TAR.GZ FILES, ENSURE THAT - # THERE ARE NO DASHES AFTER THE ONE THAT IS - # AT THE END OF THE PACKAGE NAME. - # So, it would be: - # {package_name}-{trailing_verison_info}.tar.gz - for dep in dependencies: - if len(dep) > 7 and dep.strip()[-7:] == ".tar.gz": - last_dash = dep.rfind("-") - dep = dep[:last_dash] - - cleaned_dependencies.append(dep) - - # here, if a dependency is not met, a DistributionNotFound or VersionConflict - # exception is caught and replaced with a new exception with a clearer description. - try: - pkg_resources.require(cleaned_dependencies) - except (pkg_resources.DistributionNotFound, pkg_resources.VersionConflict) as e: - raise Exception(CONSTANTS.DEPEND_ERR) - - -if __name__ == "__main__": - check_for_dependencies() diff --git a/src/clue/__init__.py b/src/clue/__init__.py deleted file mode 100644 index c34e9688b..000000000 --- a/src/clue/__init__.py +++ /dev/null @@ -1 +0,0 @@ -import base_circuitpython diff --git a/src/clue/adafruit_clue.py b/src/clue/adafruit_clue.py deleted file mode 100644 index 059573021..000000000 --- a/src/clue/adafruit_clue.py +++ /dev/null @@ -1,852 +0,0 @@ -# The MIT License (MIT) -# -# Copyright (c) 2020 Kattni Rembor for Adafruit Industries -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -""" -`adafruit_clue` -================================================================================ - -A high level library representing all the features of the Adafruit CLUE. - - -* Author(s): Kattni Rembor - -Implementation Notes --------------------- - -**Hardware:** - -.. "* `Adafruit CLUE - nRF52840 Express with Bluetooth LE `_" - -**Software and Dependencies:** - -* Adafruit CircuitPython firmware for the supported boards: - https://github.com/adafruit/circuitpython/releases - - * Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice - * Adafruit's Register library: https://github.com/adafruit/Adafruit_CircuitPython_Register - * Adafruit's LSM6DS CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_LSM6DS - * Adafruit's LIS3MDL CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_LIS3MDL - * Adafruit's APDS9960 CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_APDS9960 - * Adafruit's BMP280 CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_BMP280 - * Adafruit's SHT31D CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_SHT31D - * Adafruit's NeoPixel CircuitPython Library: - https://github.com/adafruit/Adafruit_CircuitPython_NeoPixel -""" - -import common -from base_circuitpython import base_cp_constants as CONSTANTS -import neopixel -import time -import array -import math -from PIL import Image -import pathlib -import sys -import os -import board - -abs_path = pathlib.Path(__file__).parent.absolute() -sys.path.insert(0, os.path.join(abs_path)) - -# REVISED VERSION OF THE ADAFRUIT CLUE LIBRARY FOR DSX - -__version__ = "0.0.0-auto.0" -__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_CLUE.git" - - -class _ClueSimpleTextDisplay: - """Easily display lines of text on CLUE display.""" - - def __init__( - self, - title=None, - title_color=0xFFFFFF, - title_scale=1, # pylint: disable=too-many-arguments - text_scale=1, - font=None, - colors=None, - ): - import displayio - import terminalio - from adafruit_display_text import label - - if not colors: - colors = ( - Clue.VIOLET, - Clue.GREEN, - Clue.RED, - Clue.CYAN, - Clue.ORANGE, - Clue.BLUE, - Clue.MAGENTA, - Clue.SKY, - Clue.YELLOW, - Clue.PURPLE, - ) - - self._display = board.DISPLAY - self._colors = colors - self._label = label - self._font = terminalio.FONT - if font: - self._font = font - self.text_scale = text_scale - self.text_group = displayio.Group(max_size=20, scale=self.text_scale) - if title: - # Fail gracefully if title is longer than 60 characters. - if len(title) > 60: - raise ValueError("Title must be 60 characters or less.") - - title = label.Label( - self._font, - text=title, - max_glyphs=60, - color=title_color, - scale=title_scale, - ) - title.x = 0 - title.y = 8 * self.text_scale - self._y = title.y + 18 * self.text_scale - - self.text_group.append(title) - else: - self._y = 3 * self.text_scale - - self._lines = [] - for num in range(1): - self._lines.append(self.add_text_line(color=colors[num % len(colors)])) - - def __getitem__(self, item): - """Fetch the Nth text line Group""" - if len(self._lines) - 1 < item: - for _ in range(item - (len(self._lines) - 1)): - self._lines.append( - self.add_text_line(color=self._colors[item % len(self._colors)]) - ) - return self._lines[item] - - def add_text_line(self, color=0xFFFFFF): - """Adds a line on the display of the specified color and returns the label object.""" - text_label = self._label.Label(self._font, text="", max_glyphs=45, color=color) - text_label.x = 0 - text_label.y = self._y - self._y = text_label.y + 13 * self.text_scale - self.text_group.append(text_label) - - return text_label - - def show(self): - """Call show() to display the data list.""" - self._display.show(self.text_group) - - def show_terminal(self): - """Revert to terminalio screen.""" - self._display.show(None) - - -class Clue: # pylint: disable=too-many-instance-attributes, too-many-public-methods - """Represents a single CLUE.""" - - # Color variables available for import. - RED = (255, 0, 0) - YELLOW = (255, 255, 0) - ORANGE = (255, 150, 0) - GREEN = (0, 255, 0) - TEAL = (0, 255, 120) - CYAN = (0, 255, 255) - BLUE = (0, 0, 255) - PURPLE = (180, 0, 255) - MAGENTA = (255, 0, 150) - WHITE = (255, 255, 255) - BLACK = (0, 0, 0) - - GOLD = (255, 222, 30) - PINK = (242, 90, 255) - AQUA = (50, 255, 255) - JADE = (0, 255, 40) - AMBER = (255, 100, 0) - VIOLET = (255, 0, 255) - SKY = (0, 180, 255) - - RAINBOW = (RED, ORANGE, YELLOW, GREEN, BLUE, PURPLE) - - def __init__(self): - self.__state = {} - self.__state[CONSTANTS.CLUE_STATE.BUTTON_A] = False - self.__state[CONSTANTS.CLUE_STATE.BUTTON_B] = False - self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS] = set() - self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE] = 1013.25 - self.__state[CONSTANTS.CLUE_STATE.TEMPERATURE] = 0 - self.__state[CONSTANTS.CLUE_STATE.PROXIMITY] = 0 - self.__state[CONSTANTS.CLUE_STATE.GESTURE] = "" - self.__state[CONSTANTS.CLUE_STATE.HUMIDITY] = 0 - self.__state[CONSTANTS.CLUE_STATE.PRESSURE] = 1013 - self.__state[CONSTANTS.CLUE_STATE.PIXEL] = neopixel.NeoPixel( - pin=CONSTANTS.CLUE_PIN, n=1, pixel_order=neopixel.RGB - ) - # Accelerometer - self.__state[CONSTANTS.CLUE_STATE.MOTION_X] = 0 - self.__state[CONSTANTS.CLUE_STATE.MOTION_Y] = 0 - self.__state[CONSTANTS.CLUE_STATE.MOTION_Z] = 0 - # Light/color sensor - self.__state[CONSTANTS.CLUE_STATE.LIGHT_R] = 0 - self.__state[CONSTANTS.CLUE_STATE.LIGHT_G] = 0 - self.__state[CONSTANTS.CLUE_STATE.LIGHT_B] = 0 - self.__state[CONSTANTS.CLUE_STATE.LIGHT_C] = 0 - # Magnetometer - self.__state[CONSTANTS.CLUE_STATE.MAGNET_X] = 0 - self.__state[CONSTANTS.CLUE_STATE.MAGNET_Y] = 0 - self.__state[CONSTANTS.CLUE_STATE.MAGNET_Z] = 0 - # Gyroscope - self.__state[CONSTANTS.CLUE_STATE.GYRO_X] = 0 - self.__state[CONSTANTS.CLUE_STATE.GYRO_Y] = 0 - self.__state[CONSTANTS.CLUE_STATE.GYRO_Z] = 0 - # LEDs - self.__state[CONSTANTS.CLUE_STATE.RED_LED] = False - self.__state[CONSTANTS.CLUE_STATE.WHITE_LEDS] = False - - self.button_mapping = { - CONSTANTS.CLUE_STATE.BUTTON_A: "A", - CONSTANTS.CLUE_STATE.BUTTON_B: "B", - } - self.display = board.DISPLAY - - @property - def button_a(self): - """``True`` when Button A is pressed. ``False`` if not. - This example prints when button A is pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.button_a: - print("Button A pressed") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_BUTTON_A - ) - return self.__state[CONSTANTS.CLUE_STATE.BUTTON_A] - - @property - def button_b(self): - """``True`` when Button B is pressed. ``False`` if not. - This example prints when button B is pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.button_b: - print("Button B pressed") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_BUTTON_B - ) - return self.__state[CONSTANTS.CLUE_STATE.BUTTON_B] - - @property - def were_pressed(self): - """Returns a set of the buttons that have been pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print(clue.were_pressed) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_WERE_PRESSED - ) - ret = self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS].copy() - self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS].clear() - return ret - - @property - def acceleration(self): - """Obtain acceleration data from the x, y and z axes. - This example prints the values. Try moving the board to see how the printed values change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Accel: {:.2f} {:.2f} {:.2f}".format(*clue.acceleration)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_ACCELERATION - ) - return ( - self.__state[CONSTANTS.CLUE_STATE.MOTION_X], - self.__state[CONSTANTS.CLUE_STATE.MOTION_Y], - self.__state[CONSTANTS.CLUE_STATE.MOTION_Z], - ) - - def shake(self, shake_threshold=30, avg_count=10, total_delay=0.1): - """Detect when the accelerometer is shaken. Optional parameters: - :param shake_threshold: Increase or decrease to change shake sensitivity. This - requires a minimum value of 10. 10 is the total - acceleration if the board is not moving, therefore - anything less than 10 will erroneously report a constant - shake detected. (Default 30) - :param avg_count: The number of readings taken and used for the average - acceleration. (Default 10) - :param total_delay: The total time in seconds it takes to obtain avg_count - readings from acceleration. (Default 0.1) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SHAKE - ) - is_shaken = self.__state[CONSTANTS.CLUE_STATE.GESTURE] == CONSTANTS.SHAKE - return is_shaken - - @property - def color(self): - """The red, green, blue, and clear light values. (r, g, b, c) - This example prints the values. Try holding something up to the sensor to see the values - change. Works best with white LEDs enabled. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Color: R: {} G: {} B: {} C: {}".format(*clue.color)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_COLOR - ) - return ( - self.__state[CONSTANTS.CLUE_STATE.LIGHT_R], - self.__state[CONSTANTS.CLUE_STATE.LIGHT_G], - self.__state[CONSTANTS.CLUE_STATE.LIGHT_B], - self.__state[CONSTANTS.CLUE_STATE.LIGHT_C], - ) - - @property - def temperature(self): - """The temperature in degrees Celsius. - This example prints the value. Try touching the sensor to see the value change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - print("Temperature: {:.1f}C".format(clue.temperature)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TEMPERATURE - ) - return self.__state[CONSTANTS.CLUE_STATE.TEMPERATURE] - - @property - def magnetic(self): - """Obtain x, y, z magnetic values in microteslas. - This example prints the values. Try moving the board to see how the printed values change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Magnetic: {:.3f} {:.3f} {:.3f}".format(*clue.magnetic)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_MAGNETIC - ) - return ( - self.__state[CONSTANTS.CLUE_STATE.MAGNET_X], - self.__state[CONSTANTS.CLUE_STATE.MAGNET_Y], - self.__state[CONSTANTS.CLUE_STATE.MAGNET_Z], - ) - - @property - def proximity(self): - """A relative proximity to the sensor in values from 0 - 255. - This example prints the value. Try moving your hand towards and away from the front of the - board to see how the printed values change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Proximity: {}".format(clue.proximity)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_PROXIMITY - ) - return self.__state[CONSTANTS.CLUE_STATE.PROXIMITY] - - @property - def gyro(self): - """Obtain x, y, z angular velocity values in degrees/second. - This example prints the values. Try moving the board to see how the printed values change. - print("Gyro: {:.2f} {:.2f} {:.2f}".format(*clue.gyro)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_GYRO - ) - return ( - self.__state[CONSTANTS.CLUE_STATE.GYRO_X], - self.__state[CONSTANTS.CLUE_STATE.GYRO_Y], - self.__state[CONSTANTS.CLUE_STATE.GYRO_Z], - ) - - @property - def gesture(self): - """A gesture code if gesture is detected. Shows ``0`` if no gesture detected. - ``1`` if an UP gesture is detected, ``2`` if DOWN, ``3`` if LEFT, and ``4`` if RIGHT. - This example prints the gesture values. Try moving your hand up, down, left or right over - the sensor to see the value change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Gesture: {}".format(clue.gesture)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_GESTURE - ) - gesture_mapping = {"": 0, "up": 1, "down": 2, "left": 3, "right": 4} - return gesture_mapping.get(self.__state[CONSTANTS.CLUE_STATE.GESTURE], 0) - - @property - def humidity(self): - """The measured relative humidity in percent. - This example prints the value. Try breathing on the sensor to see the values change. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - print("Humidity: {:.1f}%".format(clue.humidity)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_HUMIDITY - ) - return self.__state[CONSTANTS.CLUE_STATE.HUMIDITY] - - @property - def pressure(self): - """The barometric pressure in hectoPascals. - This example prints the value. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - print("Pressure: {:.3f}hPa".format(clue.pressure)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_PRESSURE - ) - return self.__state[CONSTANTS.CLUE_STATE.PRESSURE] - - @property - def altitude(self): - """The altitude in meters based on the sea level pressure at your location. You must set - ``sea_level_pressure`` to receive an accurate reading. - This example prints the value. Try moving the board vertically to see the value change. - .. code-block:: python - from adafruit_clue import clue - clue.sea_level_pressure = 1015 - print("Altitude: {:.1f}m".format(clue.altitude)) - """ - # National Oceanic and Atmospheric Administration (NOAA) formula for converting atmospheric pressure to pressure altitude. - OUTSIDE_MULTIPLER_CONSTANT = 44330 - POWER_CONSTANT = 0.1903 - WHOLE_CONSTANT = 1 - - altitude = OUTSIDE_MULTIPLER_CONSTANT * ( - WHOLE_CONSTANT - - math.pow( - self.__state[CONSTANTS.CLUE_STATE.PRESSURE] - / self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE], - POWER_CONSTANT, - ) - ) - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_ALTITUDE - ) - return altitude - - @property - def sea_level_pressure(self): - """Set to the pressure at sea level at your location, before reading altitude for - the most accurate altitude measurement. - This example prints the value. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - clue.sea_level_pressure = 1015 - print("Pressure: {:.3f}hPa".format(clue.pressure)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SEA_LEVEL_PRESSURE - ) - return self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE] - - @sea_level_pressure.setter - def sea_level_pressure(self, value): - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SEA_LEVEL_PRESSURE - ) - self.__state[CONSTANTS.CLUE_STATE.SEA_LEVEL_PRESSURE] = value - - @property - def pixel(self): - """The NeoPixel RGB LED. - This example turns the NeoPixel purple. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - clue.pixel.fill((255, 0, 255)) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_PIXEL - ) - return self.__state[CONSTANTS.CLUE_STATE.PIXEL] - - @property - def touch_0(self): - """Not Implemented! - - Detect touch on capacitive touch pad 0. - .. image :: ../docs/_static/pad_0.jpg - :alt: Pad 0 - This example prints when pad 0 is touched. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.touch_0: - print("Touched pad 0") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TOUCH - ) - common.utils.print_for_unimplemented_functions("touch_0") - - @property - def touch_1(self): - """Not Implemented! - - Detect touch on capacitive touch pad 1. - .. image :: ../docs/_static/pad_1.jpg - :alt: Pad 1 - This example prints when pad 1 is touched. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.touch_1: - print("Touched pad 1") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TOUCH - ) - common.utils.print_for_unimplemented_functions("touch_1") - - @property - def touch_2(self): - """Not Implemented! - - Detect touch on capacitive touch pad 2. - .. image :: ../docs/_static/pad_2.jpg - :alt: Pad 2 - This example prints when pad 2 is touched. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.touch_2: - print("Touched pad 2") - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TOUCH - ) - common.utils.print_for_unimplemented_functions("touch_2") - - @property - def white_leds(self): - """The red led next to the USB plug labeled LED. - .. image :: ../docs/_static/white_leds.jpg - :alt: White LEDs - This example turns on the white LEDs. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - clue.white_leds = True - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_WHITE_LEDS - ) - return self.__state[CONSTANTS.CLUE_STATE.WHITE_LEDS] - - @white_leds.setter - def white_leds(self, value): - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_WHITE_LEDS - ) - self.__set_leds(CONSTANTS.CLUE_STATE.WHITE_LEDS, value) - - @property - def red_led(self): - """The red led next to the USB plug labeled LED. - .. image :: ../docs/_static/red_led.jpg - :alt: Red LED - This example turns on the red LED. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - clue.red_led = True - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_RED_LED - ) - return self.__state[CONSTANTS.CLUE_STATE.RED_LED] - - @red_led.setter - def red_led(self, value): - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_RED_LED - ) - self.__set_leds(CONSTANTS.CLUE_STATE.RED_LED, value) - - def play_tone(self, frequency, duration): - """ Not Implemented! - Produce a tone using the speaker. Try changing frequency to change - the pitch of the tone. - :param int frequency: The frequency of the tone in Hz - :param float duration: The duration of the tone in seconds - .. image :: ../docs/_static/speaker.jpg - :alt: Speaker - This example plays a 880 Hz tone for a duration of 1 second. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - clue.play_tone(880, 1) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions(Clue.play_tone.__name__) - - def start_tone(self, frequency): - """ Not Implemented! - Produce a tone using the speaker. Try changing frequency to change - the pitch of the tone. - :param int frequency: The frequency of the tone in Hz - .. image :: ../docs/_static/speaker.jpg - :alt: Speaker - This example plays a 523Hz tone when button A is pressed and a 587Hz tone when button B is - pressed, only while the buttons are being pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.button_a: - clue.start_tone(523) - elif clue.button_b: - clue.start_tone(587) - else: - clue.stop_tone() - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions(Clue.start_tone.__name__) - - def stop_tone(self): - """ Not Implemented! - Use with start_tone to stop the tone produced. - .. image :: ../docs/_static/speaker.jpg - :alt: Speaker - This example plays a 523Hz tone when button A is pressed and a 587Hz tone when button B is - pressed, only while the buttons are being pressed. - To use with the CLUE: - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.button_a: - clue.start_tone(523) - elif clue.button_b: - clue.start_tone(587) - else: - clue.stop_tone() - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions(Clue.stop_tone.__name__) - - @property - def sound_level(self): - """Not Implemented! - Obtain the sound level from the microphone (sound sensor). - .. image :: ../docs/_static/microphone.jpg - :alt: Microphone (sound sensor) - This example prints the sound levels. Try clapping or blowing on - the microphone to see the levels change. - .. code-block:: python - from adafruit_clue import clue - while True: - print(clue.sound_level) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions("sound_level") - - def loud_sound(self, sound_threshold=200): - """Not Implemented! - Utilise a loud sound as an input. - :param int sound_threshold: Threshold sound level must exceed to return true (Default: 200) - .. image :: ../docs/_static/microphone.jpg - :alt: Microphone (sound sensor) - This example turns the NeoPixel LED blue each time you make a loud sound. - Try clapping or blowing onto the microphone to trigger it. - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.loud_sound(): - clue.pixel.fill((0, 50, 0)) - else: - clue.pixel.fill(0) - You may find that the code is not responding how you would like. - If this is the case, you can change the loud sound threshold to - make it more or less responsive. Setting it to a higher number - means it will take a louder sound to trigger. Setting it to a - lower number will take a quieter sound to trigger. The following - example shows the threshold being set to a higher number than - the default. - .. code-block:: python - from adafruit_clue import clue - while True: - if clue.loud_sound(sound_threshold=300): - clue.pixel.fill((0, 50, 0)) - else: - clue.pixel.fill(0) - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_SOUND - ) - common.utils.print_for_unimplemented_functions(Clue.loud_sound.__name__) - - @staticmethod - def simple_text_display( - title=None, - title_color=(255, 255, 255), - title_scale=1, # pylint: disable=too-many-arguments - text_scale=1, - font=None, - colors=None, - ): - """Display lines of text on the CLUE display. Lines of text are created in order as shown - in the example below. If you skip a number, the line will be shown blank on the display, - e.g. if you include ``[0]`` and ``[2]``, the second line on the display will be empty, and - the text specified for lines 0 and 2 will be displayed on the first and third line. - Remember, Python begins counting at 0, so the first line on the display is 0 in the code. - - Setup occurs before the loop. For data to be dynamically updated on the display, you must - include the data call in the loop by using ``.text =``. For example, if setup is saved as - ``clue_data = display_clue_data()`` then ``clue_data[0].text = clue.proximity`` must be - inside the ``while True:`` loop for the proximity data displayed to update as the - values change. You must call ``show()`` at the end of the list for anything to display. - See example below for usage. - - :param str title: The title displayed above the data. Set ``title="Title text"`` to provide - a title. Defaults to None. - :param title_color: The color of the title. Not necessary if no title is provided. Defaults - to white (255, 255, 255). - :param int title_scale: Scale the size of the title. Not necessary if no title is provided. - Defaults to 1. - :param int text_scale: Scale the size of the data lines. Scales the title as well. - Defaults to 1. - :param str font: The font to use to display the title and data. Defaults to built in - ``terminalio.FONT``. - :param colors: A list of colors for the lines of data on the display. If you provide a - single color, all lines will be that color. Otherwise it will cycle through - the list you provide if the list is less than the number of lines displayed. - Default colors are used if ``colors`` is not set. For example, if creating - two lines of data, ``colors=((255, 255, 255), (255, 0, 0))`` would set the - first line white and the second line red, and if you created four lines of - data with the same setup, it would alternate white and red. - - .. image :: ../docs/_static/display_clue_data.jpg - :alt: Display Clue Data demo - - This example displays three lines with acceleration, gyro and magnetic data on the display. - Remember to call ``show()`` after the list to update the display. - - .. code-block:: python - - from adafruit_clue import clue - - clue_data = clue.simple_text_display(title="CLUE Sensor Data!", title_scale=2) - - while True: - clue_data[0].text = "Acceleration: {:.2f} {:.2f} {:.2f}".format(*clue.acceleration) - clue_data[1].text = "Gyro: {:.2f} {:.2f} {:.2f}".format(*clue.gyro) - clue_data[2].text = "Magnetic: {:.3f} {:.3f} {:.3f}".format(*clue.magnetic) - clue_data.show() - """ - common.telemetry.telemetry_py.send_telemetry( - common.telemetry_events.TelemetryEvent.CLUE_API_TEXT_DISPLAY - ) - return _ClueSimpleTextDisplay( - title=title, - title_color=title_color, - title_scale=title_scale, - text_scale=text_scale, - font=font, - colors=colors, - ) - - def update_state(self, new_state): - for event in new_state.keys(): - if event in CONSTANTS.EXPECTED_INPUT_BUTTONS: - self.__update_button(event, new_state.get(event)) - elif event in CONSTANTS.ALL_EXPECTED_INPUT_EVENTS: - if self.__state[event] != new_state[event]: - self.__state[event] = new_state.get(event) - - # helpers - def __update_button(self, button, value): - if value: - self.__state[CONSTANTS.CLUE_STATE.PRESSED_BUTTONS].add( - self.button_mapping[button] - ) - self.__state[button] = value - - def __set_leds(self, led, value): - value = bool(value) - self.__state[led] = value - sendable_json = {led: value} - if common.utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - sendable_json, CONSTANTS.CLUE - ) - else: - common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) - - -clue = Clue() # pylint: disable=invalid-name -"""Object that is automatically created on import. - - To use, simply import it from the module: - - .. code-block:: python - - from adafruit_clue import clue -""" diff --git a/src/clue/adafruit_display_text/label.py b/src/clue/adafruit_display_text/label.py deleted file mode 100644 index f7bab0b7f..000000000 --- a/src/clue/adafruit_display_text/label.py +++ /dev/null @@ -1,280 +0,0 @@ -# The MIT License (MIT) -# -# Copyright (c) 2019 Scott Shawcroft for Adafruit Industries LLC -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -""" -`adafruit_display_text.label` -==================================================== - -Displays text labels using CircuitPython's displayio. - -* Author(s): Scott Shawcroft - -Implementation Notes --------------------- - -**Hardware:** - -**Software and Dependencies:** - -* Adafruit CircuitPython firmware for the supported boards: - https://github.com/adafruit/circuitpython/releases - -""" - -import displayio - -__version__ = "0.0.0-auto.0" -__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git" - - -class Label(displayio.Group): - """A label displaying a string of text. The origin point set by ``x`` and ``y`` - properties will be the left edge of the bounding box, and in the center of a M - glyph (if its one line), or the (number of lines * linespacing + M)/2. That is, - it will try to have it be center-left as close as possible. - - :param Font font: A font class that has ``get_bounding_box`` and ``get_glyph``. - Must include a capital M for measuring character size. - :param str text: Text to display - :param int max_glyphs: The largest quantity of glyphs we will display - :param int color: Color of all text in RGB hex - :param double line_spacing: Line spacing of text to display""" - - def __init__( - self, - font, - *, - x=0, - y=0, - text=None, - max_glyphs=None, - color=0xFFFFFF, - background_color=None, - line_spacing=1.25, - **kwargs - ): - if not max_glyphs and not text: - raise RuntimeError("Please provide a max size, or initial text") - if not max_glyphs: - max_glyphs = len(text) - super().__init__(max_size=max_glyphs, auto_write=False, **kwargs) - self.width = max_glyphs - self.font = font - self._text = None - self._anchor_point = (0, 0) - self.x = x - self.y = y - - self.palette = displayio.Palette(2) - if background_color is not None: - self.palette[0] = background_color - self.palette.make_opaque(0) - self._transparent_background = False - else: - self.palette[0] = 0 - self.palette.make_transparent(0) - self._transparent_background = True - self.palette[1] = color - - bounds = self.font.get_bounding_box() - self.height = bounds[1] - self._line_spacing = line_spacing - self._boundingbox = None - - if text is not None: - self._update_text(str(text)) - - def _update_text(self, new_text): # pylint: disable=too-many-locals - x = 0 - y = 0 - i = 0 - old_c = 0 - y_offset = int( - ( - self.font.get_glyph(ord("M")).height - - new_text.count("\n") * self.height * self.line_spacing - ) - / 2 - ) - # print("y offset from baseline", y_offset) - left = right = top = bottom = 0 - for character in new_text: - if character == "\n": - y += int(self.height * self._line_spacing) - x = 0 - continue - glyph = self.font.get_glyph(ord(character)) - if not glyph: - continue - right = max(right, x + glyph.width) - if y == 0: # first line, find the Ascender height - top = min(top, -glyph.height + y_offset) - bottom = max(bottom, y - glyph.dy + y_offset) - position_y = y - glyph.height - glyph.dy + y_offset - position_x = x + glyph.dx - if ( - not self._text - or old_c >= len(self._text) - or character != self._text[old_c] - ): - try: - face = displayio.TileGrid( - glyph.bitmap, - pixel_shader=self.palette, - default_tile=glyph.tile_index, - tile_width=glyph.width, - tile_height=glyph.height, - position=(position_x, position_y), - ) - except TypeError: - face = displayio.TileGrid( - glyph.bitmap, - pixel_shader=self.palette, - default_tile=glyph.tile_index, - tile_width=glyph.width, - tile_height=glyph.height, - x=position_x, - y=position_y, - ) - if i < len(self): - self[i] = face - else: - self.append(face) - elif self._text and character == self._text[old_c]: - try: - self[i].position = (position_x, position_y) - except AttributeError: - self[i].x = position_x - self[i].y = position_y - - x += glyph.shift_x - - # TODO skip this for control sequences or non-printables. - i += 1 - old_c += 1 - # skip all non-prinables in the old string - while ( - self._text - and old_c < len(self._text) - and ( - self._text[old_c] == "\n" - or not self.font.get_glyph(ord(self._text[old_c])) - ) - ): - old_c += 1 - # Remove the rest - while len(self) > i: - self.pop() - self._text = new_text - self._boundingbox = (left, top, left + right, bottom - top) - - @property - def bounding_box(self): - """An (x, y, w, h) tuple that completely covers all glyphs. The - first two numbers are offset from the x, y origin of this group""" - return tuple(self._boundingbox) - - @property - def line_spacing(self): - """The amount of space between lines of text, in multiples of the font's - bounding-box height. (E.g. 1.0 is the bounding-box height)""" - return self._line_spacing - - @line_spacing.setter - def line_spacing(self, spacing): - if self._line_spacing != spacing: - self._line_spacing = spacing - self._Group__trigger_draw() - - @property - def color(self): - """Color of the text as an RGB hex number.""" - return self.palette[1] - - @color.setter - def color(self, new_color): - self.palette[1] = new_color - self._Group__trigger_draw() - - @property - def background_color(self): - """Color of the background as an RGB hex number.""" - if not self._transparent_background: - return self.palette[0] - return None - - @background_color.setter - def background_color(self, new_color): - if new_color is not None: - self.palette[0] = new_color - self.palette.make_opaque(0) - self._transparent_background = False - else: - self.palette[0] = 0 - self.palette.make_transparent(0) - self._transparent_background = True - - self._Group__trigger_draw() - - @property - def text(self): - """Text to display.""" - return self._text - - @text.setter - def text(self, new_text): - # APR 2, 2O2O -> - # Added manual trigger to update text since - # on-screen text updating is a lot faster this way. - - # Previously, the group was set to auto_write=True - # and each letter in the group was individually - # drawn and sent to the front-end display. - if new_text != self._text: - self._update_text(str(new_text)) - self._Group__trigger_draw() - - @property - def anchor_point(self): - """Point that anchored_position moves relative to. - Tuple with decimal percentage of width and height. - (E.g. (0,0) is top left, (1.0, 0.5): is middle right.)""" - return self._anchor_point - - @anchor_point.setter - def anchor_point(self, new_anchor_point): - if self._anchor_point != new_anchor_point: - self._Group__trigger_draw() - - @property - def anchored_position(self): - """Position relative to the anchor_point. Tuple containing x,y - pixel coordinates.""" - return ( - self.x - self._boundingbox[2] * self._anchor_point[0], - self.y - self._boundingbox[3] * self._anchor_point[1], - ) - - @anchored_position.setter - def anchored_position(self, new_position): - self.x = int(new_position[0] - (self._boundingbox[2] * self._anchor_point[0])) - self.y = int(new_position[1] - (self._boundingbox[3] * self._anchor_point[1])) - self._Group__trigger_draw() diff --git a/src/clue/adafruit_slideshow.py b/src/clue/adafruit_slideshow.py deleted file mode 100644 index aa1fb6b65..000000000 --- a/src/clue/adafruit_slideshow.py +++ /dev/null @@ -1,407 +0,0 @@ -from PIL import Image - -import os -import base64 -from io import BytesIO -from base_circuitpython import base_cp_constants as CONSTANTS -import time -from random import shuffle -import common -import board - -# taken from adafruit -# https://github.com/adafruit/Adafruit_CircuitPython_Slideshow/blob/master/adafruit_slideshow.py - - -class PlayBackOrder: - """Defines possible slideshow playback orders.""" - - # pylint: disable=too-few-public-methods - ALPHABETICAL = 0 - """Orders by alphabetical sort of filenames""" - - RANDOM = 1 - """Randomly shuffles the images""" - # pylint: enable=too-few-public-methods - - -class PlayBackDirection: - """Defines possible slideshow playback directions.""" - - # pylint: disable=too-few-public-methods - BACKWARD = -1 - """The next image is before the current image. When alphabetically sorted, this is towards A.""" - - FORWARD = 1 - """The next image is after the current image. When alphabetically sorted, this is towards Z.""" - # pylint: enable=too-few-public-methods - - -# custom -class SlideShow: - """ - Class for displaying a slideshow of .bmp images on displays. - :param str folder: Specify the folder containing the image files, in quotes. Default is - the root directory, ``"/"``. - :param PlayBackOrder order: The order in which the images display. You can choose random - (``RANDOM``) or alphabetical (``ALPHABETICAL``). Default is - ``ALPHABETICAL``. - :param bool loop: Specify whether to loop the images or play through the list once. `True` - if slideshow will continue to loop, ``False`` if it will play only once. - Default is ``True``. - :param int dwell: The number of seconds each image displays, in seconds. Default is 3. - :param bool fade_effect: Specify whether to include the fade effect between images. ``True`` - tells the code to fade the backlight up and down between image display - transitions. ``False`` maintains max brightness on the backlight between - image transitions. Default is ``True``. - :param bool auto_advance: Specify whether to automatically advance after dwell seconds. ``True`` - if slideshow should auto play, ``False`` if you want to control advancement - manually. Default is ``True``. - :param PlayBackDirection direction: The playback direction. - Example code for Hallowing Express. With this example, the slideshow will play through once - in alphabetical order: - .. code-block:: python - from adafruit_slideshow import PlayBackOrder, SlideShow - import board - import pulseio - slideshow = SlideShow(board.DISPLAY, pulseio.PWMOut(board.TFT_BACKLIGHT), folder="/", - loop=False, order=PlayBackOrder.ALPHABETICAL) - while slideshow.update(): - pass - Example code for Hallowing Express. Sets ``dwell`` to 0 seconds, turns ``auto_advance`` off, - and uses capacitive touch to advance backwards and forwards through the images and to control - the brightness level of the backlight: - .. code-block:: python - from adafruit_slideshow import PlayBackOrder, SlideShow, PlayBackDirection - import touchio - import board - import pulseio - forward_button = touchio.TouchIn(board.TOUCH4) - back_button = touchio.TouchIn(board.TOUCH1) - brightness_up = touchio.TouchIn(board.TOUCH3) - brightness_down = touchio.TouchIn(board.TOUCH2) - slideshow = SlideShow(board.DISPLAY, pulseio.PWMOut(board.TFT_BACKLIGHT), folder="/", - auto_advance=False, dwell=0) - while True: - if forward_button.value: - slideshow.direction = PlayBackDirection.FORWARD - slideshow.advance() - if back_button.value: - slideshow.direction = PlayBackDirection.BACKWARD - slideshow.advance() - if brightness_up.value: - slideshow.brightness += 0.001 - elif brightness_down.value: - slideshow.brightness -= 0.001 - """ - - def __init__( - self, - display, - backlight_pwm=None, - *, - folder=".", - order=PlayBackOrder.ALPHABETICAL, - loop=True, - dwell=3, - fade_effect=True, - auto_advance=True, - direction=PlayBackDirection.FORWARD, - ): - self._BASE_DWELL = 0.3 - self._BASE_DWELL_DARK = 0.7 - self._NO_FADE_TRANSITION_INCREMENTS = 18 - - self.auto_advance = auto_advance - """Enable auto-advance based on dwell time. Set to ``False`` to manually control.""" - - self.loop = loop - """Specifies whether to loop through the images continuously or play through the list once. - ``True`` will continue to loop, ``False`` will play only once.""" - - self.fade_effect = fade_effect - """Whether to include the fade effect between images. ``True`` tells the code to fade the - backlight up and down between image display transitions. ``False`` maintains max - brightness on the backlight between image transitions.""" - - self.dwell = self._BASE_DWELL + dwell - """The number of seconds each image displays, in seconds.""" - - self.direction = direction - """Specify the playback direction. Default is ``PlayBackDirection.FORWARD``. Can also be - ``PlayBackDirection.BACKWARD``.""" - - self.advance = self.__advance_with_fade - """Displays the next image. Returns True when a new image was displayed, False otherwise. - """ - - self.fade_frames = 8 - - # assign new advance method if fade is disabled - if not fade_effect: - self.advance = self.__advance_no_fade - - self._img_start = None - - self.brightness = 1.0 - - # blank screen for start - self._curr_img_handle = Image.new( - "RGBA", (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - - # if path is relative, this makes sure that - # it's relative to the users's code file - abs_path_parent_dir = os.path.abspath( - os.path.join(common.utils.abs_path_to_user_file, os.pardir) - ) - abs_path_folder = os.path.normpath(os.path.join(abs_path_parent_dir, folder)) - - self.folder = abs_path_folder - - # get files within specified directory - self.dirs = os.listdir(self.folder) - - self._order = order - self._curr_img = "" - self._current_image_index = None - - # load images into main queue - self.__load_images() - - display.show(self) - # show the first working image - self.advance() - - common.telemetry.telemetry_py.send_telemetry( - common.telemetry.TelemetryEvent.CLUE_API_SLIDESHOW - ) - - @property - def current_image_name(self): - """Returns the current image name.""" - return self._curr_img - - @property - def order(self): - """Specifies the order in which the images are displayed. Options are random (``RANDOM``) or - alphabetical (``ALPHABETICAL``). Default is ``RANDOM``.""" - return self._order - - @order.setter - def order(self, order): - if order not in [PlayBackOrder.ALPHABETICAL, PlayBackOrder.RANDOM]: - raise ValueError("Order must be either 'RANDOM' or 'ALPHABETICAL'") - - self._order = order - self.__load_images() - - @property - def brightness(self): - """Brightness of the backlight when an image is displaying. Clamps to 0 to 1.0""" - return self._brightness - - @brightness.setter - def brightness(self, brightness): - if brightness < 0: - brightness = 0 - elif brightness > 1.0: - brightness = 1.0 - self._brightness = brightness - - def update(self): - """Updates the slideshow to the next image.""" - now = time.monotonic() - if not self.auto_advance or now - self._img_start < self.dwell: - return True - - return self.advance() - - def __get_next_img(self): - - if self.direction == PlayBackDirection.FORWARD: - if self._current_image_index == None: - self._current_image_index = 0 - else: - self._current_image_index += 1 - - if self._current_image_index >= len(self.dir_imgs): - - if self.loop: - self._current_image_index = 0 - self.__load_images() - else: - self._current_image_index = len(self.dir_imgs) - 10 - return "" - - else: - if self._current_image_index == None: - self._current_image_index = len(self.dir_imgs) - 1 - else: - self._current_image_index -= 1 - - if self._current_image_index < 0: - if self.loop: - self._current_image_index = len(self.dir_imgs) - 1 - self.__load_images() - else: - self._current_image_index = 0 - return "" - - img = self.dir_imgs[self._current_image_index] - return img - - def __load_images(self): - self.dir_imgs = [] - for d in self.dirs: - try: - new_path = os.path.join(self.folder, d) - - # only add bmp imgs - if os.path.splitext(new_path)[-1] == CONSTANTS.BMP_IMG_ENDING: - self.dir_imgs.append(new_path) - except Image.UnidentifiedImageError as e: - continue - - if not len(self.dir_imgs): - raise RuntimeError(CONSTANTS.NO_VALID_IMGS_ERR) - - if self._order == PlayBackOrder.RANDOM: - shuffle(self.dir_imgs) - else: - self.dir_imgs.sort() - - def __advance_with_fade(self): - if board.DISPLAY.active_group != self: - return - - old_img = self._curr_img_handle - advance_sucessful = False - - while not advance_sucessful: - new_path = self.__get_next_img() - if new_path == "": - self._img_start = time.monotonic() - return False - - try: - new_img = Image.open(new_path) - - new_img = new_img.convert("RGBA") - new_img.putalpha(255) - - new_img = new_img.crop( - (0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - - if new_img.size[0] < 240 or new_img.size[1] < 240: - black_overlay = Image.new( - "RGBA", - CONSTANTS.SCREEN_HEIGHT_WIDTH, - CONSTANTS.SCREEN_HEIGHT_WIDTH, - ) - black_overlay.paste(new_img) - new_img = black_overlay - - black_overlay = Image.new("RGBA", new_img.size) - advance_sucessful = True - except Image.UnidentifiedImageError as e: - pass - - # fade out old photo - for i in range(self.fade_frames, -1, -1): - sendable_img = Image.blend( - black_overlay, old_img, i * self.brightness / self.fade_frames - ) - self.__send(sendable_img) - - time.sleep(self._BASE_DWELL_DARK) - - # fade in new photo - for i in range(self.fade_frames + 1): - sendable_img = Image.blend( - black_overlay, new_img, i * self.brightness / self.fade_frames - ) - self.__send(sendable_img) - - self._curr_img_handle = new_img - self._curr_img = new_path - self._img_start = time.monotonic() - return True - - def __advance_no_fade(self): - if board.DISPLAY.active_group != self: - return - - old_img = self._curr_img_handle - - advance_sucessful = False - - while not advance_sucessful: - new_path = self.__get_next_img() - if new_path == "": - self._img_start = time.monotonic() - return False - - try: - new_img = Image.open(new_path) - - new_img = new_img.crop( - (0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - - if ( - new_img.size[0] < CONSTANTS.SCREEN_HEIGHT_WIDTH - or new_img.size[1] < CONSTANTS.SCREEN_HEIGHT_WIDTH - ): - black_overlay = Image.new( - "RGBA", - CONSTANTS.SCREEN_HEIGHT_WIDTH, - CONSTANTS.SCREEN_HEIGHT_WIDTH, - ) - black_overlay.paste(new_img) - new_img = black_overlay - - self._curr_img = new_path - - new_img = new_img.convert("RGBA") - new_img.putalpha(255) - advance_sucessful = True - except Image.UnidentifiedImageError as e: - pass - - if self.brightness < 1.0: - black_overlay = Image.new("RGBA", new_img.size) - new_img = Image.blend(black_overlay, new_img, self.brightness) - - # gradually scroll new img over old img - for i in range(self._NO_FADE_TRANSITION_INCREMENTS + 1): - curr_y = ( - i * CONSTANTS.SCREEN_HEIGHT_WIDTH / self._NO_FADE_TRANSITION_INCREMENTS - ) - img_piece = new_img.crop((0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, curr_y)) - old_img.paste(img_piece) - self.__send(old_img) - - self._curr_img_handle = new_img - self._curr_img = new_path - self._img_start = time.monotonic() - return True - - def __send(self, img): - # sends current bmp_img to the frontend - buffered = BytesIO() - img.save(buffered, format=CONSTANTS.BMP_IMG) - byte_base64 = base64.b64encode(buffered.getvalue()) - - # only send the base_64 string contents - img_str = str(byte_base64)[2:-1] - - sendable_json = {CONSTANTS.BASE_64: img_str} - - if common.utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - sendable_json, CONSTANTS.CLUE - ) - else: - common.utils.send_to_simulator(sendable_json, CONSTANTS.CLUE) diff --git a/src/clue/test/__init__.py b/src/clue/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/clue/test/img/test_clue_text_1.bmp b/src/clue/test/img/test_clue_text_1.bmp deleted file mode 100644 index 7ea72fe2cea4b656b69e41a9a262552dc2a18a7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeI4(UIK95kyxqK;JS!7Mub4mwV@cT#yMeNFJ<;Q=Hsn7pk{sFc{7*-UbLJva_li z4;2gsBkunBuRs3%*S8-(f5fkU#IOJT{PmZ&zlVySSpV;Q8V7E>gsfzwZ*2mbzjeKHpKkW1iJ6*zUzG1x#O#yu6;7;`4zC9zg4gFC-b!k z_zd{T-FKataQq6>GZX!3mDl=t2CY8sd+mz$TJ-lIpuwmEAV(rzIrWN@d}`ADx*Cp~ zn~=MJ`zw00Ip&up;NLx8#2x7ndFf>bM~@-&BeQdcaKzH7h3b$(0d+`6u^PzcLri(Z z_aLBoIOuhb?tkmCU+p}%o}c`jK>m59`#gNd>NDqOWv`XY9j{3V1RhR+S$#NC8bSa9 z5P$##AOHafKmY>Yn!x+}TVBIkZko!dDn$I`Jy)fbalhtsRd-d@K5`UBK)?z3gml{T zsXbX8U#&VF_r1USHR-Efg@!;9@CoU3W#!5BK3V1WdFPs}`_>LPXC~ki(&@@4l72;? ztF3-I?hpNAN!O(FP{ktzCet#Rx6LZg&vmYPruz^zxl+}2!#@K7n~-ihirqlAt z^b+~`cNjgYl{Y~{;Nb*(SFclA7f_4pkEhY*Ni%gehD6L<}L*y&vTUuIY#WxO*Q0*4XE(erz3_2cpKr*Zn} zgwE?{Abz|2beZcqzeC`81acb3`*m>L&p&~GaW2Q~oaem*J3-(|z^Bo5uK(g(9)58y zq0YJP!0!-v9s!@m)UkI6UHPa3c|OgqN+k#gJdJ?QrzTUo`)ZnDA@;8p^4qOwEh z*VRmVeqDRAcE0sp$U`6|$}a(_lcuE*zM8r^nV2%kj%coyg=T7e8nQmWv2y_H|emZ?$ZS6L9au?5Z`{F~O zBjEGX>6O~ZM7gefRAF|m{oTp1I;2ns1O!$H_(XNO>*IOPr0=T}$79jNA651dOjb+$!l26 zr01)XyJWfUX>y0aB7r(%S?GS(s>`JBs}sj#v5`Nz?#_S@0Vm)yBOM|yPgbpbE)7+B z^q5SQgs5gZbw?Zs+(*ENuLO2>}Q|00Izz00bZa z0SG_<0uX=z1l9@gZx`#VNWMM+=K1x%(aBF3BdRG)Ehqiqu8g=1PUf}RiAj|@44G&( zaaO8oCLQ^?g`YW=eASoGuSUSXlBSB%Q7us#9zI4CvP+Fnq^&)D;KL)q2l&aldosZ=D^y z*0ryCANTLmwW>OP65k#D$^_=$F<0x|zjf^pj+>L$_gK}{@qPE`+PONl|KvqjdIbXU z5%bbv21kz}GE<%KWhzt6T=IKX$x)LK)f^l>hNy)@=b9O|sDbRS&iTmwl?lYq#1)_H zV|p%5`ZDz>r@mCp$f;pD%BZuPE~9{#L^vNcrHa))%4lgWZq3iTv3fLt{9ZW^8WL^l zj%x)%xSzT@o==^bIxStT`}NG;t?F7^&(k^egk2Kw)brqc zbprmCeKuTs#CtrdGCL#_Re1G`+CNG&!^`8%?QNj)}_y#j^0#(5ZzDB$mvSL zubFgI5|8?kR#iH~W9DUgc{R0)I3auEfB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX?} zodllze>sTl^1Ac5ltExh;K}o>v;3}obpXWc6VRW2nwE)^uTulz%UsWFR%LlE&08sn zfPh9tC~}_j-mR|tY8zrt=auvLUg$FusMAuN)XN9?2my)cT|JrcfWP4o>c#tEm+jmgFm(jyk*Vy2jj5+Ys@S_bfl#-QT^^sH@4R z`tGbS^t|iZzjpI{>h3Y^)ZKkvTUV>&d*!M-zHeQ1$E(~=?RQVQUdhz+c-0xS6RR}pYBH(5I}>gZ%gZyh zwmO~2-nXS7)b@ucfo<*R#iboS=i>OA*+eTN{&Aq5m#0=B^I@jrNoCv|^pMeG2>r;MI9i&BPx~maxw}lowAVu%^^dlxb+GsOJS=gM_QwbuH+zUsbf-=*feeeusgU~?YA%xjpU!Q6ZdbHdF_B9@PH z(;KGVteR}f(s>B@w4CRydDHJo;Q90X{2jmRx8uEDfdKRT3SWUUKmY;|fB*y_009U< z00IzrpZ+ADX=LMHn=`+MZQXHyx7wlZ;*RItPwlI&=c}1q$#_rnI)VD7+;RTyyRLiX zYW3G0@BgT7b@#f9JDzucexCVi_FT#M?&x&_D{NOXzT>U=mD=Ccv)lJpf8`xLgT9YI z_g%c(N@h=frS{e{JgR56@2&pIc|3!@k3jcbyxU4U#9!ha>>r@A%owVmG6v#ag=?hNjCwVm&^=;H{i@L$RJ32)7NZKwD2>}or|JA?aO zZRfAldIo(Tfg|{@^t|=7dwO=YoxgInuD0{N=Ss%&=yd`sY%^2u-7YIVyV~^E_nPy0yGTsxt zPGE)YO2&6w$#4EBP*StMB`EdQZ<=YrDLk zZ6)J*^g4kRwwdYfxmUN^_3!+y+xi=I9sGprnJ($)@y=Cy(z{h3XFq}YTsi;xrM$LV w^^Bjk^Sd3rc15q8XCwq88Il86E`aR{Pgpe zU%&nM^Us&p-ydIpfB)z2Hy=N|rq`d>zyJ2#$6tT{Uid!&0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7csfqx17^8Lrx|Nixl|FQTQehuwUW=`fOJ?-1vKe=I}Cp)Ke z{+5$(Px6^*b9*cEEi>I`XPaAR=36HBC;7~r%-NswlW*U-CvTh1X>#)INj@`eZf|A2 zWv2V=Y;)_(e9PqiB%hg+Is0>d^6fkKXHV{PZkgP-`BqQsZ~OM{c7FP9yQl4M^-p`Y^X>PxecqFE=5wEO%jCYzw|ZKC z+qZYO^V4_RJ#Bxhf7-L1Z@;(g^PZeDpZlC!CiiW=)zkXhzP-DhpT67fY5QCK)1K{o z`@L)qBf-M8P>dT!;XJ?);hztunO+0M7$+xG3ATl-t@ww~#}{jSz?E1x~nx!sog?9Bai zp7w0#Z{6SSobKB_w|ZKC+qZYO^ZD*{Znxz=J99ssr#;*GTlcp+r~7u#t)AB3_U+y6 ze7-xK+ikhe&fHJuY0q~4*8T0y>Au}_tEct1eS3F1pYKlRc3bYVGxyVZ+OwU%b$`2a zx^MT~>S_IL-`+jR=eH+wc4j{JZQjm**1OZ+)$VNjX@ASN{q)`J$+`7R_tVbIPv^WX zzs-G{xAUL%?(}!HJKKKR-|}rgeK&h@Zavfev@`S5Id98vbKmCe{Aay8{ax+Owx9O5 zeA`do&7PcF&vZZS%=~oD+w$Aow|P7NS?^ANSG%+Ar~NJ8_S1K>C+F5P-A_9=^4Zzu z?cde<^PZMz`~0@e?b}=XeD|dDB%hf!x3@B%ncTNI^KH&=TPF7#`Rr_S-f%K!&q=;z zp7i9mZEo-0+UL6`ohSLsw7I>N`OM_L&6#g=e%ms+-^gcYoAZW~IeSj>E%T%&zio4S z_trk&J?T8jXQs{Vt;}a8_ifI6oAcY2$^Aw?JKLN$oXpvCl5d$OJ^5{$+q<{+`R+;Q zNj@`eZf|8iGr4bb=G&a#woLA~^ZC}3d3tAi>sC+e-`-E}pXRskpY~7h-_B3(Z~5t+ z+dZv+dp~uU=C|*k_D}EM&QI@e`RSe8J*|IxKXsVqx9^|!Pw(H(Pw#K}>7Cm>t$%wz zb(rS2@1OQh@88Z(@6UYRmUCuK=KMD2lW*TGGrfPBe}~_jH|KnE+jjoshL*|Oa&Gyy Z&u?>X`FGw=@1N%1;kW0_Isfl%e*nkUw}=1$ diff --git a/src/clue/test/img/test_display_text_2.bmp b/src/clue/test/img/test_display_text_2.bmp deleted file mode 100644 index c08c37fe02c3cabf6a774b181a985bbe629605e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeIx(M`iJ5CG7?0DLn76LbLnJ0;(&z!!5c10!(skY(vma7bHF@}f98U7WM~e0@9~ zo^Gel>k#81#{1W}neHQsE8f4}O{b9wPXYu85FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAVA={0&mYRZNZFxmx&_rVcvbg`An`=pIM>L*G&I*ByPJBY*-*V zp*6$GAe35#m2rai)oP}HI}&FF&ut5gbi(!L)b6dBrMuepIr??$J7j4`jnA)ptC{g? zIn#;nL7+eDzC&vNTrShEd%1WIr|CETc|XSn@~;1vncl8n{g`pqdl1N;slBu`b1tiF n%cwRJoNFz0wkPlp`?(?K-s%q91OWj81PBlyK!5;&Zv{R8Ce|~( diff --git a/src/clue/test/img/test_display_text_3.bmp b/src/clue/test/img/test_display_text_3.bmp deleted file mode 100644 index 3b68886396ece1aee9d6df5771e9a874a2679c36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeIw!EGK#3EEoHUAZ9dAfDA*k9DaP9Kfizb z>yNizKi^)zUthmJ|Ns5;_T}}z*U#(x@6T`l{{Hs|{}LcTfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjX*gusvPpLUh*fIrqr*q+3NANaLgjn=;Ot46nf zZ%^XFTl1$Mw39v!aQpo_3EPvn@OJx8KWHa?8sPT(brQBGapCRupMKCz`ZU1p_v<8V zPvXMc?LYmXo%Csd+wa#&*q+3Nx7&aEK|ATw0Jq<-ldwIB3vajo^n-TNrvYxiUngOE z5*OZX|LF(qq)!9fe!ot__9TZ~Sgg1ZSih&2oT|wUPWH++xPHQHu5+p; zH#pfV+u-^Mv$@Wxn%v-IuWWzt~|4NmsTHn@JmY_4;v zCO0_QE8F1u3A4G*shZs2WUp+4>nF_SI;U!KgOk0o4X&Rso9mpa$qi2S$~L%u!fdW{ zswOu$*(=-N`U$hS&Z(N*;AF3CgX<^E<~pZpa)Xn-vJI}EFq`X~s>uyb_R2Q6e!^_7 zbE+mcIN2-P;Q9%(xz4GY+~8!dY=i43%;q|$YI1{&2oT|wUPWH++xPHQH zu5+p;H#pfV+u-^Mv$@Wxn%v-IuWWzt~|4NmsTHn@Jm zY_4;vCO0_QE8F1u3A4G*smeB(`DDGas*jp5o9mn^ujTh$XBt`6?|uEhOJH&rS+A@r z^T~Q;Rart+wZP;qvR+wLJ@wUT)+?*J%HZ$s5t!UX)+?*ZOtM~CRhCdyEik!@tXEc5 zPknWo^~$QQGWh#@1SWTp^~$O;ldM-(l_gYF3ry}J>y=g2Q(v8Cy|SvS4F3KefyrHD zy|SvzB)LbeM` zzOl((?NBb&3GP9%ILFC_BAbYe$)z%uq?=Dch%*~^bhhiuiweAb6#bWHb6SFaK=dl49w)n(sOx$@`ES|A$3DPsZv~PJ^ z0eQad(?0Tx$@3$h{kC6Po^SiKkNjft{K#jY^rcHgmyY>+E{!UeFPxl5soqSW1ZnA* zDV9c+%NI`0qf~DuP=d5{%oIzb%H<0u=TWLR6DUDiI%bNcQRVW5lk+Imn+cR4Egdt( z(x`Iz!pV7*>U4pnb(Uz*~q=QnpJaeuI9iA@VPBxZ$%jKnGd7#o;s*X<<=wxH5w_IL2 zmIo@mrRw-(flfA-dduadV|k#`TdIyv7U*PSskdBSI+h12y`}2-WPwgLI=$IEPtMgm zS@qrmoosY^vud84t9i2Oy#+ei==5gQJULhMWYv2Mbh6Ru&8m5FuI9MfV^F+V}+&6ialCD6&nQg6AOkNF8oZ@#QbfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C79wqSY{r%_P7k>Aj$G-kPV)BJc8g)cqV(RwoeB=py z=!F9NvN3V;g|J2)5tx{|eLEj{0v~#zz`kruoO~gyQAY$Orf%QPN1nikUMR3H8xtpA z2y4_4fr+WxxAT!F@Szt9?90Z)$rr*Jbwprd>h|q?jQXbSAh#>B}@Ozp=7CZ=xR&c~m_0!@K^*_b%FiK+d# zz{J$;+xhr&SfDAeFB=mlH!-yz7nqp3eLEk24hu8|_GM$@?w{Pd;&tZY4 zz`kruoZQ6Jeq3N;>h|q?{5dSp6xf%IiIba{+K&rNOx?bnk3WY6ngaW>F>!JeQ#%0y z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0yhx& E7mPcEsQ>@~ diff --git a/src/clue/test/img/test_image_shapes_1.bmp b/src/clue/test/img/test_image_shapes_1.bmp deleted file mode 100644 index 6719a7f8d6f1788d8c28c8c7a9d839f2cc4a8435..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeIuOAUZP5JbTN0i2P5f)%iLRAL1|IDqD(f>b9j+05RmuWcLaUQ0_lzJ{9f%JRQY z_4FR9P9s2o009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ j009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7csfnNw*yLO6e diff --git a/src/clue/test/img/test_image_shapes_2.bmp b/src/clue/test/img/test_image_shapes_2.bmp deleted file mode 100644 index ae1f7618d0b2a21643e1668654c47d3932eef879..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeIw+erjb6hzUh0r+hQMqmK`8>OijkQt2aBLbn=Agh@Mao`lQ*e|coZ};cxdA{DK z>;3qB@6O}(*Y#ZAzdxMs_vaty+&lyb5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBm_1kUYLpXe8x{m%kb%-8OJX7$@50X;|XW+wuAp0GL^3FtY3H#-r~ z^MuvWNI=gKyxEC>o+qr1Mgn?{;LT11^gLm8G!oEr1aEdCpyvszqmh7~BY3kD0XS!dO=Lp{HL_p6IR!1WNJxB0nCjxq&usRwE=sAKnI}yH2t@U*G1}uh-Y7>FfN{{Fwj#^UL(|y8U9BE*=C35FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNB!O<=lQ?mf3H z=qv)q3%oTvU8Z}__s);MJQE2l6nH85Uc>+V{cG3@*LN6!V+7Wh{CD1}K4zCpStKy0 zdHDI=cbgrIHy77;A+lR#LE&37D8Sm$pUV@T7gCaLYD1XQ6oo=R+|)NaEuiPLsP&oxdT#2Qofgn@TGV%0V%(%1^@s6 diff --git a/src/clue/test/img/test_image_shapes_4.bmp b/src/clue/test/img/test_image_shapes_4.bmp deleted file mode 100644 index be810780ba72a7f1955073e58b1f243f530dcca3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeI)QBoUM5Cu>r3&?ktkQI0V{?972l`JSbAOa&%Wm-m{?s>YJqk=MSpkL4FTjOyR z_V>TP{qy_b`StDi{@3ySzt{KQ4u2j$I=+sd|M!o>%lnVQ;qc@|fB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pkHwYXuUpHK_Z+&Ee%s3w&c_psx1_61#0nfMIoxnNIcQ;uz zP}a276{yV$WF;hP+S$$NUI}C+Bx~BrTWwY#Do{O3CWta@>ZJ_$Vy1ow6mMjy%NYuNY=EKx7w^gRzk9-o!y-7l|WWPvZk%P)n)~< z5|TCT?B;Z@1hNv6HErdsHY<>okgREEH>Z0gkd=_EX)ABFS%IvCWKBD}Io&IPtb}Au zTY0O^3S=cDYuee(>0SwBB_wOw%3Ez#AS)qR)6Q;A_evluAz9N_-fFV~SqaISc6M{R zR{~iH$(pwER+|;bN=VkUvzybs639wO*0hzk+N{7GCFJn*bm{G6a7WXgM)K=j39L`Z zDZ_`S!=<-#&euKKRtzxX)d@2>c}Q7LcDlG4$J8!uBzN2>&n;oTkY|xj4q)@_TjaSb%$M^l(#^4m zZ70vMt21~ZFrMeeoAWR4&u-DhcK273=l$*ck*|0*&%HP2kM7TI(T|+e>#j|nuXFNM z83OX0u_serCoq`j_J@rto;N&lT(|az{VI8W*wyax!p?aP``~!5zVPOUly({9*NYB| z@p;?}VfMVS=P)0y{Tz_659E30!QKAyC;mQoImYM556>IhuX-0J%JVMPyqk-Z=iRJ& z7Z)neyIAv{E^_lodwAYcyf(j9dET7dfrA3_Jcz6H3V{tH?O|iZf_HYNJnwAbkAJzF zMB2^y@q=_HS18YSvIt{z2@FTt&ADq)`dlk87HMI=b_Kq!S70F0!rZ$e-99JK8fjtv z9KNrf5NL|DFi$K;&#wr4`TysC`T6JPB>T_IzvAwDCIvp9YDu2lhu$3mKW?_adR!009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5(rAaMK_uB+ZYn9QdMd|qHxn4kZpxEFzL z0eS8g)o-PMJg?MucDH~$cZ=$`Qb3+p>N~qzK%Tor^;;<*&nxwv-7O%`-J<%f6p-hY z`p)hakmqhu{Z||9zO%ap=yi(uU-2(F5Evny2 z0eN1j@9b^?dF~d~Z>4}duhe&Tw}3o%i|V&hK%Q6XJG)yzp1Vc$TPYyVEA^e-Eg;X` zqWY~Akmr^9&h8eF=WbE`Rtm`TN_}T{3&?Y~sD3L2+j-Qs3F# z0`lA~s^3Zhd0wgS>}~;h?iST=rGPxI)OU8bfIN4L>bFuro>%HSyIVk>yG8X|DIm`) z^_|@R`Vk;NfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk a1PBlyK!5-N0t5&UAV7cs0RjYO1^x$f_BIRv diff --git a/src/clue/test/img/test_image_shapes_5.bmp b/src/clue/test/img/test_image_shapes_5.bmp deleted file mode 100644 index e5473f83d5742c6a45046fad223e2cdcdf3d1995..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172854 zcmeI)?Qvs85Qb4f0Q@EdBG>@;+xOKyDsN%NtC`lB2O+9} zKmYpi_pgW3tydtckgREYZ_e(OKvp4H(^lTrdIhoy$(pwJ=ImYxWEGM%ZRKsP zS0Jm9tZ931&hC{!Rv}r_R^HZn1+ogsnzr}m>|P0E6_Pb=tydtckgREYZ_e(OKvp4H(^lTrdIhoy$(pwJ=ImYxWEGM%ZRKsP zS0Jm9tZ931&hC{!Rv}r_R^HZn1+ogsnzr}m>|P0E6_Pb=tydtckgREYZ_e(OKvp4H(^lTrdIhoy$(pwJ=ImYxWEGM%ZRKsP zS0Jm9tZ931&hC{!Rv}r_R^HZn1+ogsnzr}m>|P0E6_Pb=tydtckgREYZ_e(OKvp4H(^lTrdIdIA$l>Yf+Si-GhNgWR$sac* zFki@9!-uECwXbvM^V4qX@(gn!Fj>fR$=4dL*WbpycpVl9oCMwiIkvUpV?oI;@7{0Y zp5C!N2wVuf1+rov$9LZAA1!|JqxW%7yLb@zB=8={ryn%^>33p&|C`C{Cv8bL-BRwh ztM>fOm@j&M-Y?hQCFUzVOFB8gJI}sG&-aS?de4%+ za~84N={ff53|UwdtO z{+g5Dl_8+#jC(TW*901SzWaxbFMQtck>hLE{;7E>6_*F0Oeu zFH+CDx$0fKP(APBn)mb~S5Ml9=RM`M`fJtm>f{b=6wq@cuB|5oR!rK5jfo51*_nFY z*@fSFxzGP!tkc`h7QSu`dh=(iB<;=l<{eD`a0>yKGc177^8&O-dP*76b`}>iJ7^MZR==_y+)_NVhKaJg&JVqS0q z>pkV7pH2Nc$)|WeeJ!K8Q_^By#=p|DKBaQJ^zA)9_k5gr+2i@eo?hajuh%h_9qn1` z2<)oo7t;Sx_V&XWX6IBcSIVSG&##=y}H7sXYRE?s2v2jKIV7eB-}w?f%is4LbFsfSwoqzc|Xj zG(NieenvpgdY&n-=TtrGxu>j|UG=Qzneuv0)w7;^%9`0#&w8FIujf=f>$#__nO*g) z=b7?)PSvxXd&-*GRnK~!DX-^LJ?purteIW)tmm2XdQR1|o_org*;UVao++>AR6Xmt zr>vP>^{nTa@_J6yvz~j(n%Py)dY&n-=TtrGxu>j|UG=Qzneuv0)w7;^%9`0#&w8FI zujf=f>$#__nO*g)=b7?)PSvxXd&-*GRnK~!DX-^LJ?purteIW)tmm2XdQR1|o_org z*;UVao++>AR6Xmtr>vP>^{nTa@_J6yvz~j(n%Py)dY&n-=TtrGxu>j|UG=Qzneuv0 z)w7;^%9`0#&w8FIujf=f>$#__nO*g)=b7?)PJOtZdzkDRBB1Axi!$by1oZqRCci01 zVB1MQU5u9_YtjjU%V0LXGJ)jGB!P_w{BgV_R}YfX1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oP8<@E_d! B4ZHvV diff --git a/src/clue/test/img/test_image_text_1.bmp b/src/clue/test/img/test_image_text_1.bmp deleted file mode 100644 index dee4173d2604b57b07aaabb92eb8c5b9057ffeb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230454 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 qN9c#uet_`tL{Z>z?f62Xr~^Y!@q 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 UFu(u<3^2d|0}L?0zzPHZ0zx#fl>h($ diff --git a/src/clue/test/slideshow_pics/pic_1.bmp b/src/clue/test/slideshow_pics/pic_1.bmp deleted file mode 100644 index 0d15550078f61eb5e68515958b9c3a79d376bbbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113974 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 G?EfD(a~m1} diff --git a/src/clue/test/slideshow_pics/pic_2.bmp b/src/clue/test/slideshow_pics/pic_2.bmp deleted file mode 100644 index 345d5820e11be986d573aab47bdf709e48ca9e82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113974 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 diff --git a/src/clue/test/slideshow_pics/pic_3.bmp b/src/clue/test/slideshow_pics/pic_3.bmp deleted file mode 100644 index 78ef7b8a23d5f92e06cffc87c0795af7f6ef884c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 330726 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 diff --git a/src/clue/test/slideshow_pics/pic_6.bmp b/src/clue/test/slideshow_pics/pic_6.bmp deleted file mode 100644 index d3e2540397b43a06c2c748ffe972047b8141ae8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115818 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 C7L5@A diff --git a/src/clue/test/slideshow_pics/pic_8.bmp b/src/clue/test/slideshow_pics/pic_8.bmp deleted file mode 100644 index 2746a30f812280f3aff4b5ca6992f753ced09982..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193734 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 C1~?P| diff --git a/src/clue/test/test_adafruit_clue.py b/src/clue/test/test_adafruit_clue.py deleted file mode 100644 index 0d7204205..000000000 --- a/src/clue/test/test_adafruit_clue.py +++ /dev/null @@ -1,193 +0,0 @@ -import pytest - -import os -import pathlib -from PIL import Image - -from unittest import mock -from unittest.mock import MagicMock, patch - -from common import utils - -import displayio -import terminalio - -from ..adafruit_clue import clue -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS - - -class TestAdafruitClue(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - - self.main_img = Image.new( - "RGBA", - (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), - (0, 0, 0, 0), - ) - - utils.send_to_simulator = mock.Mock() - - def test_clue_display_text(self): - img = Image.open( - os.path.join(self.abs_path, CONSTANTS.IMG_DIR_NAME, f"test_clue_text_1.bmp") - ) - - img.putalpha(255) - expected = img.load() - clue_data = clue.simple_text_display(title="LET'S TEST!", title_scale=2) - - clue_data.text_group._Group__show = self.__send_helper - clue_data.text_group._Group__check_active_group_ref = False - - clue_data[0].text = "Lorem ipsum" - clue_data[1].text = "dolor sit amet, consectetur " - clue_data[2].text = "adipiscing:" - - clue_data[4].text = "e" - clue_data[5].text = "sed do eiusmod" - clue_data[6].text = "tempor incididunt\nut labore" - clue_data[7].text = "ut labore" - - clue_data[10].text = "et dolore" - clue_data[11].text = "magna" - clue_data[12].text = "aliqua\ntestest" - clue_data[13].text = "Ut enim ad" - clue_data[14].text = "Excepteur sint" - clue_data.show() - helper._Helper__test_image_equality(self.main_img.load(), expected) - - def __send_helper(self, image): - self.main_img = image - - def test_buttons(self): - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_A, True) - assert clue.button_a - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_A, False) - assert not clue.button_a - - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_B, True) - assert clue.button_b - clue._Clue__update_button(CONSTANTS.CLUE_STATE.BUTTON_B, False) - assert not clue.button_b - - assert clue.were_pressed == set(["A", "B"]) - assert clue.were_pressed == set() - - @pytest.mark.parametrize( - "mock_x, mock_y, mock_z", [(1, 2, 3), (0, 0, 0), (4, 6, 100)] - ) - def test_acceleration(self, mock_x, mock_y, mock_z): - clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_X] = mock_x - clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_Y] = mock_y - clue._Clue__state[CONSTANTS.CLUE_STATE.MOTION_Z] = mock_z - assert clue.acceleration == (mock_x, mock_y, mock_z) - - @pytest.mark.parametrize( - "mock_color_r, mock_color_g,mock_color_b,mock_color_c", - [(1, 2, 3, 4), (255, 255, 255, 255), (120, 140, 160, 180)], - ) - def test_color(self, mock_color_r, mock_color_g, mock_color_b, mock_color_c): - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_R] = mock_color_r - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_G] = mock_color_g - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_B] = mock_color_b - clue._Clue__state[CONSTANTS.CLUE_STATE.LIGHT_C] = mock_color_c - assert clue.color == (mock_color_r, mock_color_g, mock_color_b, mock_color_c) - - @pytest.mark.parametrize("mock_temperature", [-10, 0, 10]) - def test_temperature(self, mock_temperature): - clue._Clue__state[CONSTANTS.CLUE_STATE.TEMPERATURE] = mock_temperature - assert clue.temperature == mock_temperature - - @pytest.mark.parametrize( - "mock_magnetic_x, mock_magnetic_y, mock_magnetic_z", - [(1, 2, 3), (100, 150, 200), (10, 5, 15)], - ) - def test_magnetic(self, mock_magnetic_x, mock_magnetic_y, mock_magnetic_z): - clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_X] = mock_magnetic_x - clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_Y] = mock_magnetic_y - clue._Clue__state[CONSTANTS.CLUE_STATE.MAGNET_Z] = mock_magnetic_z - assert clue.magnetic == (mock_magnetic_x, mock_magnetic_y, mock_magnetic_z,) - - @pytest.mark.parametrize("mock_distance", (0, 10, 250, 255)) - def test_proximity(self, mock_distance): - clue._Clue__state[CONSTANTS.CLUE_STATE.PROXIMITY] = mock_distance - assert clue.proximity == mock_distance - - @pytest.mark.parametrize( - "mock_gyro_x, mock_gyro_y, mock_gyro_z", - [(1, 2, 3), (100, 150, 200), (10, 5, 15)], - ) - def test_gyro(self, mock_gyro_x, mock_gyro_y, mock_gyro_z): - clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_X] = mock_gyro_x - clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_Y] = mock_gyro_y - clue._Clue__state[CONSTANTS.CLUE_STATE.GYRO_Z] = mock_gyro_z - assert clue.gyro == (mock_gyro_x, mock_gyro_y, mock_gyro_z) - - @pytest.mark.parametrize( - "gesture_word, gesture_number", - [("", 0), ("up", 1), ("down", 2), ("left", 3), ("right", 4)], - ) - def test_gesture(self, gesture_word, gesture_number): - clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = gesture_word - assert clue.gesture == gesture_number - - def test_shake(self): - NONE = "none" - SHAKE = "shake" - clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = SHAKE - assert clue.shake() - clue._Clue__state[CONSTANTS.CLUE_STATE.GESTURE] = NONE - assert not clue.shake() - - @pytest.mark.parametrize("mock_humidity", [0, 10, 50, 100]) - def test_humidity(self, mock_humidity): - clue._Clue__state[CONSTANTS.CLUE_STATE.HUMIDITY] = mock_humidity - assert clue.humidity == mock_humidity - - @pytest.mark.parametrize("mock_pressure", [0, 10, 50, 100]) - def test_pressure(self, mock_pressure): - clue._Clue__state[CONSTANTS.CLUE_STATE.PRESSURE] = mock_pressure - assert clue.pressure == mock_pressure - - @pytest.mark.parametrize( - "mock_pressure, mock_sea_level_pressure, expected_altitude", - [ - (1000, 1015, 125.42255615546036), - (1030, 1015, -123.93061640175468), - (1020, 1013, -58.13176263932101), - ], - ) - def test_altitude(self, mock_pressure, mock_sea_level_pressure, expected_altitude): - clue.sea_level_pressure = mock_sea_level_pressure - clue._Clue__state[CONSTANTS.CLUE_STATE.PRESSURE] = mock_pressure - assert expected_altitude == pytest.approx(clue.altitude) - - @pytest.mark.parametrize("mock_sea_level_pressure", [1040, 1015, 1013]) - def test_sea_level_pressure(self, mock_sea_level_pressure): - clue.sea_level_pressure = mock_sea_level_pressure - assert mock_sea_level_pressure == clue.sea_level_pressure - - @pytest.mark.parametrize( - "mock_color", [(255, 0, 0), (255, 255, 255), (123, 123, 123)] - ) - def test_pixel(self, mock_color): - clue.pixel.fill(mock_color) - assert clue.pixel[0] == mock_color - - @pytest.mark.parametrize( - "value, expected", - [(True, True), (False, False), (1, True), ("a", True), (0, False), ("", False)], - ) - def test_red_led(self, value, expected): - clue.red_led = value - assert clue.red_led == expected - - @pytest.mark.parametrize( - "value, expected", - [(True, True), (False, False), (1, True), ("a", True), (0, False), ("", False)], - ) - def test_white_leds(self, value, expected): - clue.white_leds = value - assert clue.white_leds == expected diff --git a/src/clue/test/test_adafruit_display_shapes.py b/src/clue/test/test_adafruit_display_shapes.py deleted file mode 100644 index 8c1c3c303..000000000 --- a/src/clue/test/test_adafruit_display_shapes.py +++ /dev/null @@ -1,81 +0,0 @@ -import pytest -import pathlib -import os - -import displayio - -from PIL import Image -from unittest import mock - -from common import utils - - -from adafruit_display_shapes.rect import Rect -from adafruit_display_shapes.circle import Circle -from adafruit_display_shapes.roundrect import RoundRect - -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS -import board - - -class TestAdafruitDisplayShapes(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - - utils.send_to_simulator = mock.Mock() - self.main_img = Image.new( - "RGBA", - (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), - (0, 0, 0, 0), - ) - - def test_shapes(self): - - expected_images = [] - for i in range(5): - img = Image.open( - os.path.join( - self.abs_path, - CONSTANTS.IMG_DIR_NAME, - f"test_image_shapes_{i+1}.bmp", - ) - ) - - img.putalpha(255) - expected_images.append(img.load()) - - # TAKEN FROM ADAFRUIT'S DISPLAY SHAPES LIBRARY - # https://github.com/ladyada/Adafruit_CircuitPython_Display_Shapes/blob/master/examples/display_shapes_simpletest.py - splash = displayio.Group(max_size=10) - splash._Group__show = self.__send_helper - board.DISPLAY.show(splash) - color_bitmap = displayio.Bitmap(320, 240, 1) - color_palette = displayio.Palette(1) - color_palette[0] = 0xFFFFFF - bg_sprite = displayio.TileGrid( - color_bitmap, x=0, y=0, pixel_shader=color_palette - ) - splash.append(bg_sprite) - helper._Helper__test_image_equality(self.main_img.load(), expected_images[0]) - - rect = Rect(80, 20, 41, 41, fill=0x00FF00) - splash.append(rect) - helper._Helper__test_image_equality(self.main_img.load(), expected_images[1]) - circle = Circle(100, 100, 20, fill=0x00FF00, outline=0xFF00FF) - splash.append(circle) - - helper._Helper__test_image_equality(self.main_img.load(), expected_images[2]) - - rect2 = Rect(50, 100, 61, 81, outline=0x0, stroke=3) - splash.append(rect2) - - helper._Helper__test_image_equality(self.main_img.load(), expected_images[3]) - - roundrect = RoundRect(10, 10, 61, 81, 10, fill=0x0, outline=0xFF00FF, stroke=6) - splash.append(roundrect) - - helper._Helper__test_image_equality(self.main_img.load(), expected_images[4]) - - def __send_helper(self, image): - self.main_img = image diff --git a/src/clue/test/test_adafruit_display_text.py b/src/clue/test/test_adafruit_display_text.py deleted file mode 100644 index 922230275..000000000 --- a/src/clue/test/test_adafruit_display_text.py +++ /dev/null @@ -1,65 +0,0 @@ -import pytest - -import os -import sys -import pathlib -from PIL import Image -from unittest import mock - -from common import utils - -import displayio -import terminalio - -from adafruit_display_text import label - -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS - -# to keep track of test # to find right expected bmp -test_count = 0 - - -class TestAdafruitDisplayText(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - # Create a new black (default) image - utils.send_to_simulator = mock.Mock() - - @pytest.mark.parametrize( - "text, x,y, scale, color", - [ - ("Hello World", 1, 10, 4, (0, 22, 103)), - ("WWWWwwwmMMmmm", 30, 6, 1, (190, 173, 222)), - ("wOooo00ooo", 104, 49, 9, 0xEFEFEF), - ("!!!\n yay!", 100, 100, 5, (200, 200, 255)), - ], - ) - def test_display_text(self, text, x, y, scale, color): - global test_count - - expected_image = Image.open( - os.path.join( - self.abs_path, - CONSTANTS.IMG_DIR_NAME, - f"test_display_text_{test_count+1}.bmp", - ) - ) - expected_image.convert("RGBA") - expected_image.putalpha(255) - loaded_img = expected_image.load() - - text_area = label.Label( - terminalio.FONT, - text=text, - scale=scale, - color=color, - check_active_group_ref=False, - ) - text_area.x = x - text_area.y = y - - main_img = text_area._Group__draw() - - helper._Helper__test_image_equality(main_img.load(), loaded_img) - test_count += 1 diff --git a/src/clue/test/test_adafruit_slideshow.py b/src/clue/test/test_adafruit_slideshow.py deleted file mode 100644 index 1f966b15a..000000000 --- a/src/clue/test/test_adafruit_slideshow.py +++ /dev/null @@ -1,100 +0,0 @@ -from ..adafruit_slideshow import SlideShow, PlayBackDirection, PlayBackOrder -import board -import pathlib -import os - -from PIL import Image -from .test_helpers import helper -from base_circuitpython import base_cp_constants as CONSTANTS - -from unittest import mock - -from common import utils - - -class TestAdafruitSlideShow(object): - def setup_method(self): - self.abs_path = pathlib.Path(__file__).parent.absolute() - - # Create a new black (default) image - self.main_img = Image.new( - "RGBA", - (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), - (0, 0, 0, 0), - ) - - utils.send_to_simulator = mock.Mock() - - def test_slideshow(self): - - pic_dir = os.path.join(self.abs_path, "slideshow_pics") - slideshow_images = [] - for i in range(8): - img = Image.open(os.path.join(pic_dir, f"pic_{i+1}.bmp")) - img = img.convert("RGBA") - img.putalpha(255) - - img = img.crop( - (0, 0, CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH) - ) - - if img.size[0] < 240 or img.size[1] < 240: - black_overlay = Image.new( - "RGBA", - CONSTANTS.SCREEN_HEIGHT_WIDTH, - CONSTANTS.SCREEN_HEIGHT_WIDTH, - ) - black_overlay.paste(img) - img = black_overlay - - slideshow_images.append(img) - - # Create the slideshow object that plays through once alphabetically. - slideshow = SlideShow( - board.DISPLAY, - dwell=3, - folder=pic_dir, - loop=True, - fade_effect=True, - auto_advance=True, - order=PlayBackOrder.ALPHABETICAL, - direction=PlayBackDirection.FORWARD, - ) - - slideshow._SlideShow__send = self.__send_helper - - # first image's appear time is unstable,since it fades/scrolls in - # can only predict following ones... - - for i in range(1, 8): - slideshow.advance() - helper._Helper__test_image_equality( - self.main_img.load(), slideshow_images[i].load() - ) - - # Create the slideshow object that plays through once backwards. - slideshow2 = SlideShow( - board.DISPLAY, - dwell=3, - folder=pic_dir, - loop=True, - fade_effect=False, - auto_advance=True, - order=PlayBackOrder.ALPHABETICAL, - direction=PlayBackDirection.BACKWARD, - ) - - slideshow2._SlideShow__send = self.__send_helper - - helper._Helper__test_image_equality( - self.main_img.load(), slideshow_images[7].load() - ) - - for i in range(6, -1, -1): - slideshow2.advance() - helper._Helper__test_image_equality( - self.main_img.load(), slideshow_images[i].load() - ) - - def __send_helper(self, image): - self.main_img = image diff --git a/src/clue/test/test_helpers.py b/src/clue/test/test_helpers.py deleted file mode 100644 index 429965aaf..000000000 --- a/src/clue/test/test_helpers.py +++ /dev/null @@ -1,32 +0,0 @@ -from base_circuitpython import base_cp_constants as CONSTANTS - - -class Helper: - def __test_image_equality(self, image_1, image_2): - for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH): - pixel_1 = image_1[j, i] - pixel_2 = image_2[j, i] - - if not isinstance(pixel_1, tuple): - pixel_1 = self.hex2rgba(pixel_1) - - if not isinstance(pixel_2, tuple): - pixel_2 = self.hex2rgba(pixel_2) - assert pixel_1[0:3] == pixel_2[0:3] - - def hex2rgba(self, curr_colour): - - ret_list = [] - - for i in range(3, -1, -1): - val = (curr_colour >> (2 ** (i + 1))) & 255 - if val == 0: - ret_list.append(0) - else: - ret_list.append(val) - - return tuple(ret_list) - - -helper = Helper() diff --git a/src/common/__init__.py b/src/common/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/common/constants.py b/src/common/constants.py deleted file mode 100644 index c0592c7db..000000000 --- a/src/common/constants.py +++ /dev/null @@ -1,12 +0,0 @@ -MAC_OS = "darwin" - -ERROR_SENDING_EVENT = "Error trying to send event to the process : " - -ACTIVE_DEVICE_FIELD = "active_device" -STATE_FIELD = "state" - -CONNECTION_ATTEMPTS = 10 -TIME_DELAY = 0.03 -DEFAULT_PORT = "5577" - -MICROPYTHON_LIBRARY_NAME = "micropython" diff --git a/src/common/debugger_communication_client.py b/src/common/debugger_communication_client.py deleted file mode 100644 index 08db21b89..000000000 --- a/src/common/debugger_communication_client.py +++ /dev/null @@ -1,104 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -import sys -import json - -# WARNING: importing socketio will sometimes cause errors in normal execution -# try to import common instead of common.debugger_communication_cleint -import socketio - -import copy -import pathlib - -from . import constants as CONSTANTS -from . import utils -import threading -import os -import python_constants as TOPLEVEL_CONSTANTS - -from adafruit_circuitplayground.express import cpx -from adafruit_circuitplayground.constants import CPX - -# add ref for micropython and clue -abs_path_to_parent_dir = os.path.dirname( - os.path.join(pathlib.Path(__file__).parent, "..", "..") -) -sys.path.insert( - 0, os.path.join(abs_path_to_parent_dir, TOPLEVEL_CONSTANTS.MICROPYTHON_LIBRARY_NAME) -) - -sys.path.insert(0, os.path.join(abs_path_to_parent_dir, TOPLEVEL_CONSTANTS.CLUE_DIR)) - -from microbit.__model.microbit_model import __mb as mb -from microbit.__model.constants import MICROBIT - -from base_circuitpython.base_cp_constants import CLUE -from adafruit_clue import clue - -device_dict = {CPX: cpx, MICROBIT: mb, CLUE: clue} -processing_state_event = threading.Event() -previous_state = {} - -# similar to utils.send_to_simulator, but for debugging -# (needs handle to device-specific debugger) -def debug_send_to_simulator(state, active_device): - global previous_state - if state != previous_state: - previous_state = copy.deepcopy(state) - - updated_state = utils.update_state_with_device_name(state, active_device) - message = utils.create_message(updated_state) - - update_state(json.dumps(message)) - - -# Create Socket Client -sio = socketio.Client(reconnection_attempts=CONSTANTS.CONNECTION_ATTEMPTS) - -# TODO: Get port from process_user_code.py via childprocess communication - - -# Initialize connection -def init_connection(port=CONSTANTS.DEFAULT_PORT): - sio.connect("http://localhost:{}".format(port)) - - -# Transfer the user's inputs to the API -def __update_api_state(data): - try: - event_state = json.loads(data) - active_device_string = event_state.get(CONSTANTS.ACTIVE_DEVICE_FIELD) - - if active_device_string is not None: - active_device = device_dict.get(active_device_string) - if active_device is not None: - active_device.update_state(event_state.get(CONSTANTS.STATE_FIELD)) - - except Exception as e: - print(CONSTANTS.ERROR_SENDING_EVENT, e, file=sys.stderr, flush=True) - - -# Method : Update State -def update_state(state): - processing_state_event.clear() - sio.emit("updateState", state) - processing_state_event.wait() - - -# Event : Button pressed (A, B, A+B, Switch) -# or Sensor changed (Temperature, light, Motion) -@sio.on("input_changed") -def input_changed(data): - sio.emit("receivedState", data) - __update_api_state(data) - - -@sio.on("received_state") -def received_state(data): - processing_state_event.set() - - -@sio.on("process_disconnect") -def process_disconnect(data): - sio.disconnect() diff --git a/src/common/telemetry.py b/src/common/telemetry.py deleted file mode 100644 index fd4a8537c..000000000 --- a/src/common/telemetry.py +++ /dev/null @@ -1,35 +0,0 @@ -import sys - -from applicationinsights import TelemetryClient -from common import constants as CONSTANTS -from .telemetry_events import TelemetryEvent - - -class Telemetry: - def __init__(self): - # State of the telemetry - self.__enable_telemetry = True - self.telemetry_client = TelemetryClient("__AIKEY__") - self.telemetry_state = dict.fromkeys( - [name for name, _ in TelemetryEvent.__members__.items()], False - ) - self.extension_name = "Device Simulator Express" - - def send_telemetry(self, event_name: TelemetryEvent): - if ( - self.__enable_telemetry - and self.telemetry_available() - and not self.telemetry_state[event_name.name] - and not sys.platform.startswith(CONSTANTS.MAC_OS) - ): - self.telemetry_client.track_event( - f"{self.extension_name}/{event_name.value}" - ) - self.telemetry_client.flush() - self.telemetry_state[event_name.name] = True - - def telemetry_available(self): - return self.telemetry_client.context.instrumentation_key == "__AIKEY__" - - -telemetry_py = Telemetry() diff --git a/src/common/telemetry_events.py b/src/common/telemetry_events.py deleted file mode 100644 index a140c823b..000000000 --- a/src/common/telemetry_events.py +++ /dev/null @@ -1,65 +0,0 @@ -import enum - - -class TelemetryEvent(enum.Enum): - CPX_API_ACCELERATION = "CPX.API.ACCELERATION" - CPX_API_BUTTON_A = "CPX.API.BUTTON.A" - CPX_API_BUTTON_B = "CPX.API.BUTTON.B" - CPX_API_SWITCH = "CPX.API.SWITCH" - CPX_API_TEMPERATURE = "CPX.API.TEMPERATURE" - CPX_API_BRIGHTNESS = "CPX.API.BRIGHTNESS" - CPX_API_LIGHT = "CPX.API.LIGHT" - CPX_API_TOUCH = "CPX.API.TOUCH" - CPX_API_SHAKE = "CPX.API.SHAKE" - CPX_API_TAPPED = "CPX.API.TAPPED" - CPX_API_PLAY_FILE = "CPX.API.PLAY.FILE" - CPX_API_PLAY_TONE = "CPX.API.PLAY.TONE" - CPX_API_START_TONE = "CPX.API.START.TONE" - CPX_API_STOP_TONE = "CPX.API.STOP.TONE" - CPX_API_DETECT_TAPS = "CPX.API.DETECT.TAPS" - CPX_API_ADJUST_THRESHOLD = "CPX.API.ADJUST.THRESHOLD" - CPX_API_RED_LED = "CPX.API.RED.LED" - CPX_API_PIXELS = "CPX.API.PIXELS" - MICROBIT_API_TEMPERATURE = "MICROBIT.API.TEMPERATURE" - MICROBIT_API_ACCELEROMETER = "MICROBIT.API.ACCELEROMETER" - MICROBIT_API_GESTURE = "MICROBIT.API.GESTURE" - MICROBIT_API_DISPLAY_SCROLL = "MICROBIT.API.DISPLAY.SCROLL" - MICROBIT_API_DISPLAY_SHOW = "MICROBIT.API.DISPLAY.SHOW" - MICROBIT_API_DISPLAY_OTHER = "MICROBIT.API.DISPLAY_OTHER" - MICROBIT_API_LIGHT_LEVEL = "MICROBIT.API.LIGHT.LEVEL" - MICROBIT_API_IMAGE_CREATION = "MICROBIT.API.IMAGE.CREATION" - MICROBIT_API_IMAGE_OTHER = "MICROBIT.API.IMAGE.OTHER" - MICROBIT_API_IMAGE_STATIC = "MICROBIT.API.IMAGE.STATIC" - MICROBIT_API_BUTTON = "MICROBIT.API.BUTTON" - MICROBIT_API_COMPASS = "MICROBIT.API.COMPASS" - MICROBIT_API_I2C = "MICROBIT.API.I2C" - MICROBIT_API_SPI = "MICROBIT.API.SPI" - MICROBIT_API_AUDIO = "MICROBIT.API.AUDIO" - MICROBIT_API_MUSIC = "MICROBIT.API.MUSIC" - MICROBIT_API_NEOPIXEL = "MICROBIT.API.NEOPIXEL" - MICROBIT_API_RADIO = "MICROBIT.API.RADIO" - MICROBIT_API_SPEECH = "MICROBIT.API.SPEECH" - MICROBIT_API_UTIME = "MICROBIT.API.UTIME" - CLUE_API_ACCELERATION = "CLUE.API.ACCELERATION" - CLUE_API_BUTTON_A = "CLUE.API.BUTTON.A" - CLUE_API_BUTTON_B = "CLUE.API.BUTTON.B" - CLUE_API_WERE_PRESSED = "CLUE.API.WERE.PRESSED" - CLUE_API_SHAKE = "CLUE.API.SHAKE" - CLUE_API_COLOR = "CLUE.API.COLOR" - CLUE_API_TEMPERATURE = "CLUE.API.TEMPERATURE" - CLUE_API_MAGNETIC = "CLUE.API.MAGNETIC" - CLUE_API_PROXIMITY = "CLUE.API.PROXIMITY" - CLUE_API_GYRO = "CLUE.API.GYRO" - CLUE_API_GESTURE = "CLUE.API.GESTURE" - CLUE_API_HUMIDITY = "CLUE.API.HUMIDITY" - CLUE_API_PRESSURE = "CLUE.API.PRESSURE" - CLUE_API_ALTITUDE = "CLUE.API.ALTITUDE" - CLUE_API_SEA_LEVEL_PRESSURE = "CLUE.API.SEA.LEVEL.PRESSURE" - CLUE_API_PIXEL = "CLUE.API.PIXEL" - CLUE_API_TOUCH = "CLUE.API.TOUCH" - CLUE_API_WHITE_LEDS = "CLUE.API.WHITE.LEDS" - CLUE_API_RED_LED = "CLUE.API.RED.LED" - CLUE_API_SOUND = "CLUE.API.SOUND" - CLUE_API_TEXT_DISPLAY = "CLUE.API.TEXT.DISPLAY" - CLUE_API_SLIDESHOW = "CLUE.API.SLIDESHOW" - CLUE_API_TILE_GRID = "CLUE.API.TILE.GRID" diff --git a/src/common/test/__init__.py b/src/common/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/common/test/test_debugger_communication_client.py b/src/common/test/test_debugger_communication_client.py deleted file mode 100644 index fea21211e..000000000 --- a/src/common/test/test_debugger_communication_client.py +++ /dev/null @@ -1,193 +0,0 @@ -import pytest -import json # Remove -from unittest import mock -import socketio -import threading -import os -import sys - -from common import constants as CONSTANTS - -abs_path_to_parent_dir = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "..", ".." -) - -sys.path.insert(0, abs_path_to_parent_dir) -# Insert absolute path to Micropython libraries for micro:bit into sys.path -abs_path_to_micropython_lib = os.path.join( - abs_path_to_parent_dir, CONSTANTS.MICROPYTHON_LIBRARY_NAME -) - -sys.path.insert(0, abs_path_to_micropython_lib) - -from common import debugger_communication_client -from adafruit_circuitplayground import express -from adafruit_circuitplayground.constants import CPX - - -class TestDebuggerCommunicationClient(object): - @mock.patch("socketio.Client.connect") - def test_init_connection(self, mock_connect): - mock_connect.return_value = None - debugger_communication_client.init_connection() - mock_connect.assert_called_once() - - def test_init_connection1(self): - socketio.Client.connect = mock.Mock() - socketio.Client.connect.return_value = None - debugger_communication_client.init_connection() - socketio.Client.connect.assert_called_once() - - def test_update_state(self): - threading.Event.clear = mock.Mock() - threading.Event.wait = mock.Mock() - socketio.Client.emit = mock.Mock() - socketio.Client.emit.return_value = None - debugger_communication_client.update_state( - {CONSTANTS.ACTIVE_DEVICE_FIELD: CPX, CONSTANTS.STATE_FIELD: {}} - ) - socketio.Client.emit.assert_called_once() - - @mock.patch.dict( - express.cpx._Express__state, - { - "brightness": 1.0, - "button_a": False, - "button_b": False, - "pixels": [ - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - ], - "red_led": False, - "switch": False, - "temperature": 0, - "light": 0, - "motion_x": 0, - "motion_y": 0, - "motion_z": 0, - "touch": [False] * 7, - "shake": False, - }, - clear=True, - ) - def test_button_press(self): - data = { - CONSTANTS.ACTIVE_DEVICE_FIELD: CPX, - CONSTANTS.STATE_FIELD: {"button_a": True, "button_b": True, "switch": True}, - } - expected_data = { - "brightness": 1.0, - "button_a": True, - "button_b": True, - "pixels": [ - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - ], - "red_led": False, - "switch": True, - "temperature": 0, - "light": 0, - "motion_x": 0, - "motion_y": 0, - "motion_z": 0, - "touch": [False] * 7, - "shake": False, - } - serialized_data = json.dumps(data) - debugger_communication_client.input_changed(serialized_data) - assert expected_data == express.cpx._Express__state - - @mock.patch.dict( - express.cpx._Express__state, - { - "brightness": 1.0, - "button_a": False, - "button_b": False, - "pixels": [ - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - ], - "red_led": False, - "switch": False, - "temperature": 0, - "light": 0, - "motion_x": 0, - "motion_y": 0, - "motion_z": 0, - "touch": [False] * 7, - "shake": False, - }, - clear=True, - ) - def test_input_changed(self): - data = { - CONSTANTS.ACTIVE_DEVICE_FIELD: CPX, - CONSTANTS.STATE_FIELD: { - "temperature": 1, - "light": 2, - "motion_x": 3, - "motion_y": 4, - "motion_z": 5, - }, - } - expected_data = { - "brightness": 1.0, - "button_a": False, - "button_b": False, - "pixels": [ - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - (0, 0, 0), - ], - "red_led": False, - "switch": False, - "temperature": 1, - "light": 2, - "motion_x": 3, - "motion_y": 4, - "motion_z": 5, - "touch": [False] * 7, - "shake": False, - } - serialized_data = json.dumps(data) - debugger_communication_client.input_changed(serialized_data) - assert expected_data == express.cpx._Express__state - - @mock.patch("builtins.print") - @mock.patch.dict(express.cpx._Express__state, {}, clear=True) - def test_update_api_state_fail(self, mocked_print): - data = [] - debugger_communication_client.input_changed(data) - # Exception is caught and a print is stated to stderr - mocked_print.assert_called_once() diff --git a/src/common/test/test_utils.py b/src/common/test/test_utils.py deleted file mode 100644 index 11e7c8a2e..000000000 --- a/src/common/test/test_utils.py +++ /dev/null @@ -1,32 +0,0 @@ -import sys - -from unittest import mock - -from common import constants as CONSTANTS -from common import utils - - -class TestUtils(object): - def test_remove_leading_slashes(self): - original = "///a//b/" - expected = "a//b/" - assert expected == utils.remove_leading_slashes(original) - - def test_escape_notOSX(self): - _utils_sys = utils.sys - if sys.platform.startswith(CONSTANTS.MAC_OS): - utils.sys = mock.MagicMock() - utils.sys.configure_mock(platform="win32") - original = "a b" - assert original == utils.escape_if_OSX(original) - utils.sys = _utils_sys - - def test_escape_isOSX(self): - _utils_sys = utils.sys - if not sys.platform.startswith(CONSTANTS.MAC_OS): - utils.sys = mock.MagicMock() - utils.sys.configure_mock(platform="darwin") - original = "a b" - expected = "a%20b" - assert expected == utils.escape_if_OSX(original) - utils.sys = _utils_sys diff --git a/src/common/utils.py b/src/common/utils.py deleted file mode 100644 index d6d241b2f..000000000 --- a/src/common/utils.py +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -from . import constants as CONSTANTS -import json -import copy -import time -import sys - -previous_state = {} - -abs_path_to_user_file = "" -debug_mode = False - - -def update_state_with_device_name(state, device_name): - updated_state = dict(state) - - state_ext = { - "device_name": device_name, - } - updated_state.update(state_ext) - - return updated_state - - -def create_message(msg, send_type="state"): - if isinstance(msg, dict): - msg = json.dumps(msg) - - message = {"type": send_type, "data": msg} - return message - - -def send_to_simulator(state, device_name): - global previous_state - - updated_state = update_state_with_device_name(state, device_name) - message = create_message(updated_state) - - if updated_state != previous_state: - previous_state = copy.deepcopy(updated_state) - print(json.dumps(message) + "\0", end="", file=sys.__stdout__, flush=True) - time.sleep(CONSTANTS.TIME_DELAY) - - -def send_print_to_simulator(raw_msg): - data_str = str(raw_msg) - message = create_message(data_str, "print") - print(json.dumps(message) + "\0", file=sys.__stdout__, flush=True) - time.sleep(CONSTANTS.TIME_DELAY) - - -def remove_leading_slashes(string): - string = string.lstrip("\\/") - return string - - -def escape_if_OSX(file_name): - if sys.platform == CONSTANTS.MAC_OS: - file_name = file_name.replace(" ", "%20") - return file_name - - -def print_for_unimplemented_functions(function_name): - msg = f"'{function_name}' is not implemented in the simulator but it will work on the actual device!\n" - send_print_to_simulator(msg) diff --git a/src/constants.ts b/src/constants.ts deleted file mode 100644 index b14d875f0..000000000 --- a/src/constants.ts +++ /dev/null @@ -1,555 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as path from "path"; -import { MessageItem } from "vscode"; -import * as nls from "vscode-nls"; - -// Debugger Server -export const SERVER_INFO = { - DEFAULT_SERVER_PORT: 5577, - ERROR_CODE_INIT_SERVER: "ERROR_INIT_SERVER", - SERVER_PORT_CONFIGURATION: "deviceSimulatorExpress.debuggerServerPort", -}; - -const localize: nls.LocalizeFunc = nls.config({ - messageFormat: nls.MessageFormat.file, -})(); - -export const CONFIG = { - CONFIG_ENV_ON_SWITCH: - "deviceSimulatorExpress.configNewEnvironmentUponSwitch", - PYTHON_PATH: "python.pythonPath", - SHOW_DEPENDENCY_INSTALL: "deviceSimulatorExpress.showDependencyInstall", - SHOW_NEW_FILE_POPUP: "deviceSimulatorExpress.showNewFilePopup", -}; - -export const CONSTANTS = { - WEBVIEW_TYPE: { - SIMULATOR: "simulator", - TUTORIAL: "tutorial", - }, - DEBUG_CONFIGURATION_TYPE: "deviceSimulatorExpress", - DEVICE_NAME: { - CPX: "CPX", - MICROBIT: "micro:bit", - CLUE: "CLUE", - }, - DEVICE_NAME_FORMAL: { - CPX: "Circuit Playground Express", - MICROBIT: "micro:bit", - CLUE: "CLUE", - }, - SCRIPT_PATH: { - SIMULATOR: "out/simulator.js", - VSCODE_API: "out/vscode_import.js", - }, - ERROR: { - BAD_PYTHON_PATH: - 'Your interpreter is not pointing to a valid Python executable. Please select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application', - COMPORT_UNKNOWN_ERROR: - "Writing to COM port (GetOverlappedResult): Unknown error code 121", - CPX_FILE_ERROR: localize( - "error.cpxFileFormat", - "The cpx.json file format is not correct." - ), - DEBUGGER_SERVER_INIT_FAILED: (port: number) => { - return localize( - "error.debuggerServerInitFailed", - `Warning : The Debugger Server cannot be opened. Please try to free the port ${port} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.` - ); - }, - DEBUGGING_SESSION_IN_PROGESS: localize( - "error.debuggingSessionInProgress", - "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n" - ), - DEPENDENCY_DOWNLOAD_ERROR: - "Dependency download could not be completed. Functionality may be limited. Please review the installation docs.", - - FAILED_TO_OPEN_SERIAL_PORT: (port: string): string => { - return localize( - "error.failedToOpenSerialPort", - `[ERROR] Failed to open serial port ${port}.` - ); - }, - FAILED_TO_OPEN_SERIAL_PORT_DUE_TO: (port: string, error: any) => { - return localize( - "error.failedToOpenSerialPortDueTo", - `[ERROR] Failed to open serial port ${port} due to error: ${error}. \n` - ); - }, - INSTALLATION_ERROR: localize( - "error.installationError", - "Installation Error" - ), - - INVALID_FILE_EXTENSION_DEBUG: localize( - "error.invalidFileExtensionDebug", - "The file you tried to run isn't a Python file." - ), - INVALID_PYTHON_PATH: localize( - "error.invalidPythonPath", - 'We found that your selected Python interpreter version is too low to run the extension. Please upgrade to version 3.7+ or select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application.' - ), - LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT: localize( - "error.lowPythonVersionForMicrobitDeployment", - "To deploy your code to the micro:bit, you must be using Python 3.3+" - ), - NO_DEVICE: localize( - "error.noDevice", - "The device is not detected. Please double check if your board is connected and/or properly formatted" - ), - NO_FILE_TO_RUN: localize( - "error.noFileToRun", - '[ERROR] We can\'t find a Python file to run. Please make sure you select or open a new ".py" code file, or use the "New File" command to get started and see useful links.\n' - ), - NO_FILE_TO_DEPLOY: localize( - "error.noFileToDeploy", - "[ERROR] We can't find a Python file to deploy to your device.\n" - ), - NO_FOLDER_OPENED: localize( - "error.noFolderCreated", - "In order to use the Serial Monitor, you need to open a folder and reload VS Code." - ), - NO_PROGRAM_FOUND_DEBUG: localize( - "error.noProgramFoundDebug", - "Cannot find a program to debug." - ), - NO_PYTHON_PATH: localize( - "error.noPythonPath", - "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again." - ), - RECONNECT_DEVICE: localize( - "error.reconnectDevice", - "Please disconnect your Circuit Playground Express and try again." - ), - STDERR: (data: string) => { - return localize("error.stderr", `\n[ERROR] ${data} \n`); - }, - UNEXPECTED_MESSAGE: localize( - "error.unexpectedMessage", - "Webview sent an unexpected message" - ), - }, - FILESYSTEM: { - BASE_CIRCUITPYTHON: "base_circuitpython", - CLUE: "clue", - PYTHON_VENV_DIR: "venv", - MICROPYTHON_DIRECTORY: "micropython", - OUTPUT_DIRECTORY: "out", - }, - INFO: { - ALREADY_SUCCESSFUL_INSTALL: localize( - "info.successfulInstall", - "Your current configuration is already successfully set up for the Device Simulator Expresss." - ), - ARE_YOU_SURE: localize( - "info.areYouSure", - "Are you sure you don't want to install the dependencies? The extension can't run without installing them." - ), - CLOSED_SERIAL_PORT: (port: string) => { - return localize( - "info.closedSerialPort", - `[DONE] Closed the serial port - ${port} \n` - ); - }, - COMPLETED_MESSAGE: "Completed", - CPX_JSON_ALREADY_GENERATED: localize( - "info.cpxJsonAlreadyGenerated", - "cpx.json has already been generated." - ), - DEPLOY_DEVICE: localize( - "info.deployDevice", - "\n[INFO] Deploying code to the device...\n" - ), - DEPLOY_SIMULATOR: localize( - "info.deploySimulator", - "\n[INFO] Deploying code to the simulator...\n" - ), - DEPLOY_SUCCESS: localize( - "info.deploySuccess", - "\n[INFO] Code successfully copied! Your device should be loading and ready to go shortly.\n" - ), - EXTENSION_ACTIVATED: localize( - "info.extensionActivated", - "Congratulations, your extension Device Simulator Express is now active!" - ), - FILE_SELECTED: (filePath: string) => { - return localize( - "info.fileSelected", - `[INFO] File selected : ${filePath} \n` - ); - }, - FIRST_TIME_WEBVIEW: localize( - "info.firstTimeWebview", - 'To reopen the simulator select the command "Open Simulator" from command palette.' - ), - INSTALLING_PYTHON_VENV: localize( - "info.installingPythonVenv", - "A virtual environment is currently being created. The required Python packages will be installed. You will be prompted a message telling you when the installation is done." - ), - INSTALL_PYTHON_DEPS: localize( - "info.installPythonDependencies", - "Do you want us to try and install this extension's dependencies on your selected Python interpreter for you?" - ), - INSTALL_PYTHON_VENV: localize( - "info.installPythonVenv", - "Do you want us to try and install this extension's dependencies via virtual environment for you?" - ), - NEW_FILE: localize( - "info.newFile", - "New to Python or the Circuit Playground Express? We are here to help!" - ), - NO_DEVICE_CHOSEN_TO_DEPLOY_TO: localize( - "info.noDeviceChosenToDeployTo", - "\n[INFO] No device was selected to deploy to.\n" - ), - NO_DEVICE_CHOSEN_TO_SIMULATE_TO: localize( - "info.noDeviceChosenToSimulateTo", - "\n[INFO] No device was selected to simulate.\n" - ), - NO_DEVICE_CHOSEN_FOR_NEW_FILE: localize( - "info.noDeviceChosenForNewFile", - "\n[INFO] No device was selected to open a template file for.\n" - ), - OPENED_SERIAL_PORT: (port: string) => { - return localize( - "info.openedSerialPort", - `[INFO] Opened the serial port - ${port} \n` - ); - }, - OPENING_SERIAL_PORT: (port: string) => { - return localize( - "info.openingSerialPort", - `[STARTING] Opening the serial port - ${port} \n` - ); - }, - PLEASE_OPEN_FOLDER: localize( - "info.pleaseOpenFolder", - "Please open a folder first." - ), - REDIRECT: localize("info.redirect", "You are being redirected."), - RUNNING_CODE: localize("info.runningCode", "Running user code"), - SUCCESSFUL_INSTALL: localize( - "info.successfulInstall", - "Successfully set up the Python environment." - ), - THIRD_PARTY_WEBSITE_ADAFRUIT: localize( - "info.thirdPartyWebsiteAdafruit", - 'By clicking "Agree and Proceed" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit\'s privacy policy' - ), - THIRD_PARTY_WEBSITE_PIP: localize( - "info.thirdPartyWebsitePip", - 'By clicking "Agree and Proceed" you will be redirected to pip.pypa.io, a third party website not managed by Microsoft. Please note that your activity on pip.pypa.io is subject to PyPA\'s privacy policy' - ), - THIRD_PARTY_WEBSITE_PYTHON: localize( - "info.thirdPartyWebsitePython", - 'By clicking "Agree and Proceed" you will be redirected to python.org, a third party website not managed by Microsoft. Please note that your activity on python.org is subject to Python\'s privacy policy' - ), - UPDATED_TO_EXTENSION_VENV: localize( - "info.updatedToExtensionsVenv", - "Automatically updated interpreter to point to extension's virtual environment." - ), - WELCOME_OUTPUT_TAB: localize( - "info.welcomeOutputTab", - "Welcome to the Device Simulator Express output tab!\n\n" - ), - }, - LABEL: { - WEBVIEW_PANEL: localize( - "label.webviewPanel", - "Device Simulator Express" - ), - }, - LINKS: { - DOWNLOAD_PIP: "https://pip.pypa.io/en/stable/installing/", - DOWNLOAD_PYTHON: "https://www.python.org/downloads/", - EXAMPLE_CODE: - "https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples", - CPX_HELP: - "https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart", - CLUE_HELP: "https://learn.adafruit.com/adafruit-clue/circuitpython", - INSTALL: - "https://github.com/microsoft/vscode-python-devicesimulator/blob/dev/docs/install.md", - PRIVACY: "https://www.adafruit.com/privacy", - TUTORIALS: - "https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library", - }, - MISC: { - SELECT_PORT_PLACEHOLDER: localize( - "misc.selectPortPlaceholder", - "Select a serial port" - ), - SERIAL_MONITOR_NAME: localize( - "misc.serialMonitorName", - "Device Simulator Express Serial Monitor" - ), - SERIAL_MONITOR_TEST_IF_OPEN: localize( - "misc.testIfPortOpen", - "Test if serial port is open" - ), - }, - NAME: localize("name", "Device Simulator Express"), - TEMPLATE: { - CPX: "cpx_template.py", - MICROBIT: "microbit_template.py", - CLUE: "clue_template.py", - }, - WARNING: { - ACCEPT_AND_RUN: localize( - "warning.agreeAndRun", - "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk." - ), - INVALID_BAUD_RATE: localize( - "warning.invalidBaudRate", - "Invalid baud rate, keep baud rate unchanged." - ), - NO_RATE_SELECTED: localize( - "warning.noRateSelected", - "No rate is selected, keep baud rate unchanged." - ), - NO_SERIAL_PORT_SELECTED: localize( - "warning.noSerialPortSelected", - "No serial port was selected, please select a serial port first" - ), - SERIAL_MONITOR_ALREADY_OPENED: (port: string) => { - return localize( - "warning.serialMonitorAlreadyOpened", - `Serial monitor is already opened for ${port} \n` - ); - }, - SERIAL_MONITOR_NOT_STARTED: localize( - "warning.serialMonitorNotStarted", - "Serial monitor has not been started." - ), - SERIAL_PORT_NOT_STARTED: localize( - "warning.serialPortNotStarted", - "Serial port has not been started.\n" - ), - }, -}; - -export enum CONFIG_KEYS { - ENABLE_USB_DETECTION = "deviceSimulatorExpress.enableUSBDetection", -} - -export enum TelemetryEventName { - FAILED_TO_OPEN_SIMULATOR = "SIMULATOR.FAILED_TO_OPEN", - - // Debugger - CPX_DEBUGGER_INIT_SUCCESS = "CPX.DEBUGGER.INIT.SUCCESS", - CPX_DEBUGGER_INIT_FAIL = "CPX.DEBUGGER.INIT.FAIL", - MICROBIT_DEBUGGER_INIT_SUCCESS = "MICROBIT.DEBUGGER.INIT.SUCCESS", - MICROBIT_DEBUGGER_INIT_FAIL = "MICROBIT.DEBUGGER.INIT.FAIL", - CLUE_DEBUGGER_INIT_SUCCESS = "CLUE.DEBUGGER.INIT.SUCCESS", - CLUE_DEBUGGER_INIT_FAIL = "CLUE.DEBUGGER.INIT.FAIL", - - // Extension commands - COMMAND_RUN_SIMULATOR_BUTTON = "COMMAND.RUN.SIMULATOR_BUTTON", - COMMAND_RUN_PALETTE = "COMMAND.RUN.PALETTE", - COMMAND_INSTALL_EXTENSION_DEPENDENCIES = "COMMAND.INSTALL.EXTENSION.DEPENDENCIES", - COMMAND_SERIAL_MONITOR_CHOOSE_PORT = "COMMAND.SERIAL_MONITOR.CHOOSE_PORT", - COMMAND_SERIAL_MONITOR_OPEN = "COMMAND.SERIAL_MONITOR.OPEN", - COMMAND_SERIAL_MONITOR_BAUD_RATE = "COMMAND.SERIAL_MONITOR.BAUD_RATE", - COMMAND_SERIAL_MONITOR_CLOSE = "COMMAND.SERIAL_MONITOR.CLOSE", - COMMAND_GETTING_STARTED = "COMMAND.GETTING_STARTED", - - CPX_COMMAND_DEPLOY_DEVICE = "CPX.COMMAND.DEPLOY.DEVICE", - CPX_COMMAND_NEW_FILE = "CPX.COMMAND.NEW.FILE.CPX", - CPX_COMMAND_OPEN_SIMULATOR = "CPX.COMMAND.OPEN.SIMULATOR", - - MICROBIT_COMMAND_DEPLOY_DEVICE = "MICROBIT.COMMAND.DEPLOY.DEVICE", - MICROBIT_COMMAND_NEW_FILE = "MICROBIT.COMMAND.NEW.FILE", - MICROBIT_COMMAND_OPEN_SIMULATOR = "MICROBIT.COMMAND.OPEN.SIMULATOR", - - CLUE_COMMAND_DEPLOY_DEVICE = "CLUE.COMMAND.DEPLOY.DEVICE", - CLUE_COMMAND_NEW_FILE = "CLUE.COMMAND.NEW.FILE.CPX", - CLUE_COMMAND_OPEN_SIMULATOR = "CLUE.COMMAND.OPEN.SIMULATOR", - - // Simulator interaction - CPX_SIMULATOR_BUTTON_A = "CPX.SIMULATOR.BUTTON.A", - CPX_SIMULATOR_BUTTON_B = "CPX.SIMULATOR.BUTTON.B", - CPX_SIMULATOR_BUTTON_AB = "CPX.SIMULATOR.BUTTON.AB", - CPX_SIMULATOR_SWITCH = "CPX.SIMULATOR.SWITCH", - - MICROBIT_SIMULATOR_BUTTON_A = "MICROBIT.SIMULATOR.BUTTON.A", - MICROBIT_SIMULATOR_BUTTON_B = "MICROBIT.SIMULATOR.BUTTON.B", - MICROBIT_SIMULATOR_BUTTON_AB = "MICROBIT.SIMULATOR.BUTTON.AB", - - CLUE_SIMULATOR_BUTTON_A = "CLUE.SIMULATOR.BUTTON.A", - CLUE_SIMULATOR_BUTTON_B = "CLUE.SIMULATOR.BUTTON.B", - CLUE_SIMULATOR_BUTTON_AB = "CLUE.SIMULATOR.BUTTON.AB", - - // Sensors - CPX_SIMULATOR_TEMPERATURE_SENSOR = "CPX.SIMULATOR.TEMPERATURE", - CPX_SIMULATOR_LIGHT_SENSOR = "CPX.SIMULATOR.LIGHT", - CPX_SIMULATOR_MOTION_SENSOR = "CPX.SIMULATOR.MOTION", - CPX_SIMULATOR_SHAKE = "CPX.SIMULATOR.SHAKE", - CPX_SIMULATOR_CAPACITIVE_TOUCH = "CPX.SIMULATOR.CAPACITIVE.TOUCH", - - MICROBIT_SIMULATOR_TEMPERATURE_SENSOR = "MICROBIT.SIMULATOR.TEMPERATURE", - MICROBIT_SIMULATOR_LIGHT_SENSOR = "MICROBIT.SIMULATOR.LIGHT", - MICROBIT_SIMULATOR_MOTION_SENSOR = "MICROBIT.SIMULATOR.MOTION", - MICROBIT_SIMULATOR_GESTURE_SENSOR = "MICROBIT.SIMULATOR.GESTURE", - - CLUE_SIMULATOR_TEMPERATURE_SENSOR = "CLUE.SIMULATOR.TEMPERATURE", - CLUE_SIMULATOR_LIGHT_SENSOR = "CLUE.SIMULATOR.LIGHT", - CLUE_SIMULATOR_MOTION_SENSOR = "CLUE.SIMULATOR.MOTION", - CLUE_SIMULATOR_GESTURE_SENSOR = "CLUE.SIMULATOR.GESTURE", - CLUE_SIMULATOR_PRESSURE_SENSOR = "CLUE.SIMULATOR.PRESSURE", - CLUE_SIMULATOR_PROXIMITY_SENSOR = "CLUE.SIMULATOR.PROXIMITY", - CLUE_SIMULATOR_HUMIDITY_SENSOR = "CLUE.SIMULATOR.HUMIDITY", - CLUE_SIMULATOR_GYRO_SENSOR = "CLUE.SIMULATOR.GYRO", - CLUE_SIMULATOR_MAGNET_SENSOR = "CLUE.SIMULATOR.MAGNET", - - // Pop-up dialog - CPX_CLICK_DIALOG_DONT_SHOW = "CPX.CLICK.DIALOG.DONT.SHOW", - CPX_CLICK_DIALOG_EXAMPLE_CODE = "CPX.CLICK.DIALOG.EXAMPLE.CODE", - CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CPX.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", - CPX_CLICK_DIALOG_TUTORIALS = "CPX.CLICK.DIALOG.TUTORIALS", - - CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CLUE.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", - - ERROR_PYTHON_PROCESS = "ERROR.PYTHON.PROCESS", - - CPX_ERROR_COMMAND_NEW_FILE = "CPX.ERROR.COMMAND.NEW.FILE", - CPX_ERROR_DEPLOY_WITHOUT_DEVICE = "CPX.ERROR.DEPLOY.WITHOUT.DEVICE", - CPX_ERROR_PYTHON_DEVICE_PROCESS = "CPX.ERROR.PYTHON.DEVICE.PROCESS", - CPX_SUCCESS_COMMAND_DEPLOY_DEVICE = "CPX.SUCCESS.COMMAND.DEPLOY.DEVICE", - - MICROBIT_ERROR_COMMAND_NEW_FILE = "MICROBIT.ERROR.COMMAND.NEW.FILE", - MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE = "MICROBIT.ERROR.DEPLOY.WITHOUT.DEVICE", - MICROBIT_ERROR_PYTHON_DEVICE_PROCESS = "MICROBIT.ERROR.PYTHON.DEVICE.PROCESS", - MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE = "MICROBIT.SUCCESS.COMMAND.DEPLOY.DEVICE", - - CLUE_ERROR_COMMAND_NEW_FILE = "CLUE.ERROR.COMMAND.NEW.FILE", - CLUE_ERROR_DEPLOY_WITHOUT_DEVICE = "CLUE.ERROR.DEPLOY.WITHOUT.DEVICE", - CLUE_ERROR_PYTHON_DEVICE_PROCESS = "CLUE.ERROR.PYTHON.DEVICE.PROCESS", - CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE = "CLUE.SUCCESS.COMMAND.DEPLOY.DEVICE", - - // Performance - CPX_PERFORMANCE_DEPLOY_DEVICE = "CPX.PERFORMANCE.DEPLOY.DEVICE", - CPX_PERFORMANCE_NEW_FILE = "CPX.PERFORMANCE.NEW.FILE", - CPX_PERFORMANCE_OPEN_SIMULATOR = "CPX.PERFORMANCE.OPEN.SIMULATOR", - - MICROBIT_PERFORMANCE_DEPLOY_DEVICE = "MICROBIT.PERFORMANCE.DEPLOY.DEVICE", - MICROBIT_PERFORMANCE_NEW_FILE = "MICROBIT.PERFORMANCE.NEW.FILE", - MICROBIT_PERFORMANCE_OPEN_SIMULATOR = "MICROBIT.PERFORMANCE.OPEN.SIMULATOR", - - CLUE_PERFORMANCE_DEPLOY_DEVICE = "CLUE.PERFORMANCE.DEPLOY.DEVICE", - CLUE_PERFORMANCE_NEW_FILE = "CLUE.PERFORMANCE.NEW.FILE", - CLUE_PERFORMANCE_OPEN_SIMULATOR = "CLUE.PERFORMANCE.OPEN.SIMULATOR", - - // Venv options - SETUP_VENV_CREATION_ERR = "SETUP.VENV.CREATION.ERR", - SETUP_NO_PIP = "SETUP.NO.PIP", - SETUP_DEP_INSTALL_FAIL = "SETUP.DEP.INSTALL.FAIL", - SETUP_AUTO_RESOLVE_PYTHON_PATH = "SETUP.AUTO.RESOLVE.PYTHON.PATH", - SETUP_NO_PYTHON_PATH = "SETUP.NO.PYTHON.PATH", - SETUP_DOWNLOAD_PYTHON = "SETUP.DOWNLOAD.PYTHON", - SETUP_INVALID_PYTHON_INTERPRETER_PATH = "SETUP.INVALID.PYTHON.INTERPRETER.PATH", - SETUP_INVALID_PYTHON_VER = "SETUP.INVALID.PYTHON.VER", - SETUP_INSTALL_VENV = "SETUP.INSTALL.VENV", - SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL = "SETUP.ORIGINAL.INTERPRETER.DEP.INSTALL", - SETUP_HAS_VENV = "SETUP.HAS.VENV", - SETUP_NO_DEPS_INSTALLED = "SETUP.NO.DEPS.INSTALLED", -} -export const DEFAULT_DEVICE = CONSTANTS.DEVICE_NAME.CPX; - -// tslint:disable-next-line: no-namespace -export namespace DialogResponses { - export const ACCEPT_AND_RUN: MessageItem = { - title: localize("dialogResponses.agreeAndRun", "Agree and Run"), - }; - export const AGREE_AND_PROCEED: MessageItem = { - title: localize("dialogResponses.agreeAndProceed", "Agree and Proceed"), - }; - export const CANCEL: MessageItem = { - title: localize("dialogResponses.cancel", "Cancel"), - }; - export const SELECT: MessageItem = { - title: localize("dialogResponses.select", "Select"), - }; - export const HELP: MessageItem = { - title: localize("dialogResponses.help", "I need help"), - }; - export const DONT_SHOW: MessageItem = { - title: localize("dialogResponses.dontShowAgain", "Don't Show Again"), - }; - export const NO: MessageItem = { - title: localize("dialogResponses.No", "No"), - }; - export const INSTALL_NOW: MessageItem = { - title: localize("dialogResponses.installNow", "Install Now"), - }; - export const DONT_INSTALL: MessageItem = { - title: localize("dialogResponses.dontInstall", "Don't Install"), - }; - export const PRIVACY_STATEMENT: MessageItem = { - title: localize("info.privacyStatement", "Privacy Statement"), - }; - export const TUTORIALS: MessageItem = { - title: localize("dialogResponses.tutorials", "Tutorials on Adafruit"), - }; - export const EXAMPLE_CODE: MessageItem = { - title: localize( - "dialogResponses.exampleCode", - "Example Code on GitHub" - ), - }; - export const MESSAGE_UNDERSTOOD: MessageItem = { - title: localize("dialogResponses.messageUnderstood", "Got It"), - }; - export const INSTALL_PIP: MessageItem = { - title: localize( - "dialogResponses.installPip", - "Install from Pip's webpage" - ), - }; - export const INSTALL_PYTHON: MessageItem = { - title: localize( - "dialogResponses.installPython", - "Install from python.org" - ), - }; - export const YES: MessageItem = { - title: localize("dialogResponses.Yes", "Yes"), - }; - export const READ_INSTALL_MD: MessageItem = { - title: localize( - "dialogResponses.readInstall", - "Read installation docs" - ), - }; -} - -export const CPX_CONFIG_FILE = path.join(".vscode", "cpx.json"); - -export const STATUS_BAR_PRIORITY = { - PORT: 20, - OPEN_PORT: 30, - BAUD_RATE: 40, -}; - -export const VERSIONS = { - MIN_PY_VERSION: "Python 3.7.0", -}; - -export const HELPER_FILES = { - CHECK_IF_VENV_PY: "check_if_venv.py", - CHECK_PYTHON_DEPENDENCIES: "check_python_dependencies.py", - DEVICE_PY: "device.py", - PROCESS_USER_CODE_PY: "process_user_code.py", - PYTHON_EXE: "python.exe", - PYTHON: "python", -}; - -export const GLOBAL_ENV_VARS = { - PYTHON: "python", - PYTHON3: "python3", -}; -export const LANGUAGE_VARS = { - PYTHON: { ID: "python", FILE_ENDS: ".py" }, -}; - -export default CONSTANTS; diff --git a/src/cpxWorkspace.ts b/src/cpxWorkspace.ts deleted file mode 100644 index 47239a79a..000000000 --- a/src/cpxWorkspace.ts +++ /dev/null @@ -1,26 +0,0 @@ -import * as fs from "fs"; -import * as path from "path"; -import * as vscode from "vscode"; - -export class CPXWorkspace { - static get rootPath(): string | undefined { - const workspaceFolders = vscode.workspace.workspaceFolders; - if (!workspaceFolders || workspaceFolders.length === 0) { - return undefined; - } - - for (const workspaceFolder of workspaceFolders) { - const workspaceFolderPath = workspaceFolder.uri.fsPath; - const cpxConfigPath = path.join( - workspaceFolderPath, - ".vscode", - "cpx.json" - ); - if (fs.existsSync(cpxConfigPath)) { - return workspaceFolderPath; - } - } - - return workspaceFolders[0].uri.fsPath; - } -} diff --git a/src/debug_user_code.py b/src/debug_user_code.py deleted file mode 100644 index a1ad6cb16..000000000 --- a/src/debug_user_code.py +++ /dev/null @@ -1,95 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -import os -import sys -import traceback -from pathlib import Path -import python_constants as CONSTANTS -import check_python_dependencies -from common import utils - -# will propagate errors if dependencies aren't sufficient -check_python_dependencies.check_for_dependencies() - -abs_path_to_parent_dir = os.path.dirname(os.path.abspath(__file__)) - -# Insert absolute path to Adafruit library for CPX into sys.path -abs_path_to_adafruit_lib = os.path.join( - abs_path_to_parent_dir, CONSTANTS.ADAFRUIT_LIBRARY_NAME -) -sys.path.insert(0, abs_path_to_adafruit_lib) - -# Insert absolute path to Micropython libraries for micro:bit into sys.path -abs_path_to_micropython_lib = os.path.join( - abs_path_to_parent_dir, CONSTANTS.MICROPYTHON_LIBRARY_NAME -) -sys.path.insert(0, abs_path_to_micropython_lib) - -# Insert absolute path to library for CLUE into sys.path -sys.path.insert(0, os.path.join(abs_path_to_parent_dir, CONSTANTS.CLUE)) - -# Insert absolute path to Circuitpython libraries for CLUE into sys.path -sys.path.insert(0, os.path.join(abs_path_to_parent_dir, CONSTANTS.CIRCUITPYTHON)) - -# This import must happen after the sys.path is modified -from common import debugger_communication_client - -# get board so we can get terminal handle -import board - -# get handle to terminal for clue -curr_terminal = board.DISPLAY.terminal - -## Execute User Code ## - -# Get user's code path -abs_path_to_code_file = "" -if len(sys.argv) > 1 and sys.argv[1]: - abs_path_to_code_file = sys.argv[1] -else: - raise FileNotFoundError(CONSTANTS.ERROR_NO_FILE) - -# Get Debugger Server Port -server_port = CONSTANTS.DEFAULT_PORT -if len(sys.argv) > 2: - server_port = sys.argv[2] - -# Init Communication -debugger_communication_client.init_connection(server_port) - -# Init API variables -utils.abs_path_to_user_file = abs_path_to_code_file -utils.debug_mode = True - -# overriding print function so that it shows on clue terminal -def print_decorator(func): - global curr_terminal - - def wrapped_func(*args, **kwargs): - curr_terminal.add_str_to_terminal("".join(str(e) for e in args)) - return func(*args, **kwargs) - - return wrapped_func - - -print = print_decorator(print) - -# Execute the user's code file -with open(abs_path_to_code_file, encoding="utf8") as user_code_file: - curr_terminal.add_str_to_terminal(CONSTANTS.CODE_START_MSG_CLUE) - user_code = user_code_file.read() - try: - codeObj = compile(user_code, abs_path_to_code_file, CONSTANTS.EXEC_COMMAND) - exec(codeObj, {"print": print}) - sys.stdout.flush() - except Exception as e: - exc_type, exc_value, exc_traceback = sys.exc_info() - errorMessage = CONSTANTS.ERROR_TRACEBACK - stackTrace = traceback.format_exception(exc_type, exc_value, exc_traceback) - - for frameIndex in range(2, len(stackTrace) - 1): - errorMessage += "\t" + str(stackTrace[frameIndex]) - print(e, errorMessage, file=sys.stderr, flush=True) - curr_terminal.add_str_to_terminal(CONSTANTS.CODE_FINISHED_MSG_CLUE) - board.DISPLAY.show(None) diff --git a/src/debugger/debugAdapter.ts b/src/debugger/debugAdapter.ts deleted file mode 100644 index 59a78482e..000000000 --- a/src/debugger/debugAdapter.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { DebugAdapterTracker, DebugConsole, DebugSession } from "vscode"; -import { DebuggerCommunicationService } from "../service/debuggerCommunicationService"; -import { MessagingService } from "../service/messagingService"; -import { DEBUG_COMMANDS } from "../view/constants"; - -export class DebugAdapter implements DebugAdapterTracker { - private readonly console: DebugConsole | undefined; - private readonly messagingService: MessagingService; - private debugCommunicationService: DebuggerCommunicationService; - constructor( - debugSession: DebugSession, - messagingService: MessagingService, - debugCommunicationService: DebuggerCommunicationService - ) { - this.console = debugSession.configuration.console; - this.messagingService = messagingService; - this.debugCommunicationService = debugCommunicationService; - } - onWillStartSession() { - // To Implement - } - onWillReceiveMessage(message: any): void { - if (message.command) { - // Only send pertinent debug messages - switch (message.command) { - case DEBUG_COMMANDS.CONTINUE: - this.messagingService.sendStartMessage(); - break; - case DEBUG_COMMANDS.STACK_TRACE: - this.messagingService.sendPauseMessage(); - break; - case DEBUG_COMMANDS.DISCONNECT: - // Triggered on stop event for debugger - if (!message.arguments.restart) { - this.debugCommunicationService.handleStopEvent(); - } - break; - } - } - } - // A debugger error should unlock the webview - onError() { - this.messagingService.sendStartMessage(); - } - // Device is always running when exiting debugging mode - onExit() { - this.messagingService.sendStartMessage(); - } -} diff --git a/src/debugger/debugAdapterFactory.ts b/src/debugger/debugAdapterFactory.ts deleted file mode 100644 index 5b0e2b401..000000000 --- a/src/debugger/debugAdapterFactory.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { - DebugAdapterTracker, - DebugAdapterTrackerFactory, - DebugSession, - ProviderResult, -} from "vscode"; -import { DebuggerCommunicationService } from "../service/debuggerCommunicationService"; -import { MessagingService } from "../service/messagingService"; -import { DebugAdapter } from "./debugAdapter"; - -export class DebugAdapterFactory implements DebugAdapterTrackerFactory { - private debugSession: DebugSession; - private messagingService: MessagingService; - private debugCommunicationService: DebuggerCommunicationService; - constructor( - debugSession: DebugSession, - messagingService: MessagingService, - debugCommunicationService: DebuggerCommunicationService - ) { - this.debugSession = debugSession; - this.messagingService = messagingService; - this.debugCommunicationService = debugCommunicationService; - } - public createDebugAdapterTracker( - session: DebugSession - ): ProviderResult { - return new DebugAdapter( - session, - this.messagingService, - this.debugCommunicationService - ); - } -} diff --git a/src/debuggerCommunicationServer.ts b/src/debuggerCommunicationServer.ts deleted file mode 100644 index 0fa4a65cc..000000000 --- a/src/debuggerCommunicationServer.ts +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as http from "http"; -import * as socketio from "socket.io"; -import { WebviewPanel } from "vscode"; -import { SERVER_INFO } from "./constants"; -import { DeviceSelectionService } from "./service/deviceSelectionService"; - -export const DEBUGGER_MESSAGES = { - EMITTER: { - INPUT_CHANGED: "input_changed", - RECEIVED_STATE: "received_state", - DISCONNECT: "process_disconnect", - }, - LISTENER: { - UPDATE_STATE: "updateState", - RECEIVED_STATE: "receivedState", - DISCONNECT: "disconnect", - }, -}; - -export class DebuggerCommunicationServer { - private port: number; - private serverHttp: http.Server; - private serverIo: socketio.Server; - private simulatorWebview: WebviewPanel | undefined; - private deviceSelectionService: DeviceSelectionService; - private isPendingResponse = false; - private pendingCallbacks: Function[] = []; - - constructor( - webviewPanel: WebviewPanel | undefined, - port = SERVER_INFO.DEFAULT_SERVER_PORT, - deviceSelectionService: DeviceSelectionService - ) { - this.port = port; - this.serverHttp = new http.Server(); - this.initHttpServer(); - - this.serverIo = socketio(this.serverHttp); - this.simulatorWebview = webviewPanel; - this.initEventsHandlers(); - console.info(`Server running on port ${this.port}`); - - this.deviceSelectionService = deviceSelectionService; - } - - // send the message to start closing the connection - public closeConnection(): void { - this.sendDisconnectEvent(); - } - - public setWebview(webviewPanel: WebviewPanel | undefined) { - this.simulatorWebview = webviewPanel; - } - // Events are pushed when the previous processed event is over - public emitInputChanged(newState: string): void { - if (this.isPendingResponse) { - this.pendingCallbacks.push(() => { - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, - newState - ); - }); - } else { - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, - newState - ); - this.isPendingResponse = true; - } - } - public disconnectFromPort() { - this.serverIo.close(); - this.serverHttp.close(); - } - private sendDisconnectEvent() { - this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); - } - - private initHttpServer(): void { - this.serverHttp.listen(this.port); - if (!this.serverHttp.listening) { - throw new Error(SERVER_INFO.ERROR_CODE_INIT_SERVER); - } - } - - private initEventsHandlers(): void { - this.serverIo.on("connection", (socket: any) => { - socket.on(DEBUGGER_MESSAGES.LISTENER.UPDATE_STATE, (data: any) => { - this.handleState(data); - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.RECEIVED_STATE, - {} - ); - }); - socket.on(DEBUGGER_MESSAGES.LISTENER.RECEIVED_STATE, () => { - if (this.pendingCallbacks.length > 0) { - const currentCall = this.pendingCallbacks.shift(); - currentCall(); - this.isPendingResponse = true; - } else { - this.isPendingResponse = false; - } - }); - - socket.on(DEBUGGER_MESSAGES.LISTENER.DISCONNECT, () => { - this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); - if (this.simulatorWebview) { - this.simulatorWebview.webview.postMessage({ - command: "reset-state", - }); - } - }); - }); - } - - private handleState(data: any): void { - try { - const messageToWebview = JSON.parse(data); - if (messageToWebview.type === "state") { - const messageState = JSON.parse(messageToWebview.data); - if ( - this.simulatorWebview && - messageState.device_name === - this.deviceSelectionService.getCurrentActiveDevice() - ) { - this.simulatorWebview.webview.postMessage({ - active_device: this.deviceSelectionService.getCurrentActiveDevice(), - command: "set-state", - state: messageState, - }); - } - } - } catch (err) { - console.error(`Error: Non-JSON output from the process : ${data}`); - } - } -} diff --git a/src/dev-requirements.txt b/src/dev-requirements.txt deleted file mode 100644 index 26f334b51..000000000 --- a/src/dev-requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ --r ./requirements.txt -black==19.10b0 -pytest==5.0.1 \ No newline at end of file diff --git a/src/device.py b/src/device.py deleted file mode 100644 index def9673b0..000000000 --- a/src/device.py +++ /dev/null @@ -1,121 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -from subprocess import check_output -import string -import os -import sys -import shutil -import json -import uflash -import python_constants as CONSTANTS - -if sys.platform == "win32": - # pylint: disable=import-error - import win32api - - -class Device: - def __init__(self, name, file_path): - self.name = name - self.file_path = file_path - self.connected = False - self.error_message = None - - def find_adafruit_device_directory(self): - """ - Check if the Adafruit Device is available/plugged in - """ - found_directory = None - - if sys.platform.startswith(CONSTANTS.LINUX_OS) or sys.platform.startswith( - CONSTANTS.MAC_OS - ): - # Mac or Linux - mounted = ( - check_output(CONSTANTS.MOUNT_COMMAND) - .decode(CONSTANTS.UTF_FORMAT) - .split("\n") - ) - for mount in mounted: - drive_path = mount.split()[2] if mount else "" - if drive_path.endswith(CONSTANTS.ADAFRUIT_DRIVE_NAME): - found_directory = drive_path - break - elif sys.platform == CONSTANTS.WINDOWS_OS: - # Windows - for drive_letter in string.ascii_uppercase: - drive_path = "{}:{}".format(drive_letter, os.sep) - if os.path.exists(drive_path): - drive_name = win32api.GetVolumeInformation(drive_path)[0] - if drive_name == CONSTANTS.ADAFRUIT_DRIVE_NAME: - found_directory = drive_path - break - else: - raise NotImplementedError(CONSTANTS.NOT_SUPPORTED_OS.format(sys.platform)) - - if not found_directory: - self.connected = False - self.error_message = ( - CONSTANTS.NO_ADAFRUIT_DEVICE_DETECTED_ERROR_TITLE, - CONSTANTS.NO_ADAFRUIT_DEVICE_DETECTED_ERROR_DETAIL.format(sys.platform), - ) - else: - self.connected = True - self.error_message = None - return found_directory - - def deployToAdafruitDevice(self): - device_directory = self.find_adafruit_device_directory() - if self.error_message: - print( - "{}:\t{}".format(self.error_message[0], self.error_message[1]), - file=sys.stderr, - flush=True, - ) - if self.connected: - original_file_name = self.file_path.rsplit(os.sep, 1)[-1] - if original_file_name == "code.py" or original_file_name == "main.py": - dest_path = os.path.join(device_directory, original_file_name) - else: - dest_path = os.path.join(device_directory, "code.py") - shutil.copyfile(self.file_path, dest_path) - message = {"type": "complete"} - else: - message = {"type": "no-device"} - return message - - def deployToMicrobit(self): - # Temporarily redirecting stdout because there are some print statements in uflash library - fake_stdout = open(os.devnull, "w") - _stdout = sys.stdout - sys.stdout = fake_stdout - - try: - uflash.flash(path_to_python=self.file_path) - message = {"type": "complete"} - except RuntimeError: - message = {"type": "low-python-version"} - except IOError: - self.error_message = CONSTANTS.NO_MICROBIT_DETECTED_ERROR_TITLE - print( - self.error_message, file=sys.stderr, flush=True, - ) - message = {"type": "no-device"} - - sys.stdout = _stdout - return message - - def deploy(self): - if self.name == CONSTANTS.MICROBIT: - return self.deployToMicrobit() - elif self.name == CONSTANTS.CPX or self.name == CONSTANTS.CLUE: - return self.deployToAdafruitDevice() - else: - return {"type": "no-device"} - - -if __name__ == "__main__": - device = Device(sys.argv[1], sys.argv[2]) - message = device.deploy() - print(json.dumps(message), flush=True) diff --git a/src/deviceContext.ts b/src/deviceContext.ts deleted file mode 100644 index a4f0afd2e..000000000 --- a/src/deviceContext.ts +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Credit: A majority of this code was taken from the Visual Studio Code Arduino extension with some modifications to suit our purposes. - -import * as fs from "fs"; -import * as path from "path"; -import * as vscode from "vscode"; -import CONSTANTS, { CPX_CONFIG_FILE } from "./constants"; -import { CPXWorkspace } from "./cpxWorkspace"; -import * as utils from "./extension_utils/utils"; - -export class DeviceContext implements vscode.Disposable { - public static getInstance(): DeviceContext { - return DeviceContext._deviceContext; - } - - private static _deviceContext: DeviceContext = new DeviceContext(); - - private _onDidChange = new vscode.EventEmitter(); - private _watcher: vscode.FileSystemWatcher; - private _vscodeWatcher: vscode.FileSystemWatcher; - private _port!: string; - - private constructor() { - if (vscode.workspace && CPXWorkspace.rootPath) { - this._watcher = vscode.workspace.createFileSystemWatcher( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ); - this._vscodeWatcher = vscode.workspace.createFileSystemWatcher( - path.join(CPXWorkspace.rootPath, ".vscode"), - true, - true, - false - ); - - // Reloads the config into the code if the cpx config file has changed - this._watcher.onDidCreate(() => this.loadContext()); - this._watcher.onDidChange(() => this.loadContext()); - this._watcher.onDidDelete(() => this.loadContext()); - - this._vscodeWatcher.onDidDelete(() => this.loadContext()); - } - } - - public loadContext(): Thenable { - return vscode.workspace.findFiles(CPX_CONFIG_FILE, null, 1).then( - files => { - let cpxConfigJson: any = {}; - if (files && files.length > 0) { - const configFile = files[0]; - cpxConfigJson = utils.tryParseJSON( - fs.readFileSync(configFile.fsPath, "utf8") - ); - if (cpxConfigJson) { - this._port = cpxConfigJson.port; - this._onDidChange.fire(); - } else { - console.error(CONSTANTS.ERROR.CPX_FILE_ERROR); - } - } else { - this._port = null; - this._onDidChange.fire(); - } - return this; - }, - reason => { - this._port = null; - this._onDidChange.fire(); - return this; - } - ); - } - - public saveContext() { - if (!CPXWorkspace.rootPath) { - return; - } - const cpxConfigFile = path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE); - let cpxConfigJson: any = {}; - if (utils.fileExistsSync(cpxConfigFile)) { - cpxConfigJson = utils.tryParseJSON( - fs.readFileSync(cpxConfigFile, "utf8") - ); - } - if (!cpxConfigJson) { - // log and notify user error - return; - } - cpxConfigJson.port = this.port; - - utils.mkdirRecursivelySync(path.dirname(cpxConfigFile)); - fs.writeFileSync( - cpxConfigFile, - JSON.stringify( - cpxConfigJson, - (key, value) => { - if (value === null) { - return undefined; - } - return value; - }, - 4 - ) - ); - } - - public dispose() { - if (this._watcher) { - this._watcher.dispose(); - } - - if (this._vscodeWatcher) { - this._vscodeWatcher.dispose(); - } - } - - public async initialize() { - if ( - CPXWorkspace.rootPath && - utils.fileExistsSync( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ) - ) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.CPX_JSON_ALREADY_GENERATED - ); - return; - } else { - if (!CPXWorkspace.rootPath) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.PLEASE_OPEN_FOLDER - ); - return; - } - } - } - - public get onDidChange(): vscode.Event { - return this._onDidChange.event; - } - - public get port() { - return this._port; - } - - public set port(value: string) { - this._port = value; - this.saveContext(); - } -} diff --git a/src/extension.ts b/src/extension.ts deleted file mode 100644 index 5940217dc..000000000 --- a/src/extension.ts +++ /dev/null @@ -1,1101 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as cp from "child_process"; -import * as fs from "fs"; -import * as open from "open"; -import * as path from "path"; -import * as vscode from "vscode"; -import { - CONFIG, - CONSTANTS, - CPX_CONFIG_FILE, - DialogResponses, - GLOBAL_ENV_VARS, - HELPER_FILES, - LANGUAGE_VARS, - SERVER_INFO, - TelemetryEventName, -} from "./constants"; -import { CPXWorkspace } from "./cpxWorkspace"; -import { DebugAdapterFactory } from "./debugger/debugAdapterFactory"; -import { DebuggerCommunicationServer } from "./debuggerCommunicationServer"; -import * as utils from "./extension_utils/utils"; -import { SerialMonitor } from "./serialMonitor"; -import { DebuggerCommunicationService } from "./service/debuggerCommunicationService"; -import { DeviceSelectionService } from "./service/deviceSelectionService"; -import { FileSelectionService } from "./service/fileSelectionService"; -import { MessagingService } from "./service/messagingService"; -import { PopupService } from "./service/PopupService"; -import { SetupService } from "./service/setupService"; -import { TelemetryHandlerService } from "./service/telemetryHandlerService"; -import { WebviewService } from "./service/webviewService"; -import { SimulatorDebugConfigurationProvider } from "./simulatorDebugConfigurationProvider"; -import getPackageInfo from "./telemetry/getPackageInfo"; -import TelemetryAI from "./telemetry/telemetryAI"; -import { UsbDetector } from "./usbDetector"; -import { - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, - WEBVIEW_TYPES, -} from "./view/constants"; - -let telemetryAI: TelemetryAI; -let pythonExecutablePath: string = GLOBAL_ENV_VARS.PYTHON; -let configFileCreated: boolean = false; -let inDebugMode: boolean = false; -// Notification booleans -let firstTimeClosed: boolean = true; -let shouldShowRunCodePopup: boolean = true; - -let setupService: SetupService; -const deviceSelectionService = new DeviceSelectionService(); -const messagingService = new MessagingService(deviceSelectionService); -const debuggerCommunicationService = new DebuggerCommunicationService(); -const fileSelectionService = new FileSelectionService(messagingService); - -let pythonProcessDataBuffer: string[]; - -export let outChannel: vscode.OutputChannel | undefined; - -const sendCurrentDeviceMessage = (currentPanel: vscode.WebviewPanel) => { - if (currentPanel) { - currentPanel.webview.postMessage({ - command: VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE, - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } -}; -// Extension activation -export async function activate(context: vscode.ExtensionContext) { - telemetryAI = new TelemetryAI(context); - setupService = new SetupService(telemetryAI); - let currentPanel: vscode.WebviewPanel | undefined; - let childProcess: cp.ChildProcess | undefined; - let messageListener: vscode.Disposable; - let activeEditorListener: vscode.Disposable; - const webviewService = new WebviewService(context, deviceSelectionService); - const telemetryHandlerService = new TelemetryHandlerService( - telemetryAI, - deviceSelectionService - ); - const formalNameToNickNameMapping = { - [CONSTANTS.DEVICE_NAME_FORMAL.CPX]: CONSTANTS.DEVICE_NAME.CPX, - [CONSTANTS.DEVICE_NAME_FORMAL.MICROBIT]: CONSTANTS.DEVICE_NAME.MICROBIT, - [CONSTANTS.DEVICE_NAME_FORMAL.CLUE]: CONSTANTS.DEVICE_NAME.CLUE, - }; - - // Add our library path to settings.json for autocomplete functionality - updatePythonExtraPaths(); - - // ignore import errors so that adafruit_circuitplayground library - // doesn't trigger lint errors - updatePylintArgs(context); - - pythonExecutablePath = await setupService.setupEnv(context); - - try { - utils.generateCPXConfig(); - configFileCreated = true; - } catch (err) { - console.info("Failed to create the CPX config file."); - configFileCreated = false; - } - - if (pythonExecutablePath === "") { - return; - } - - if (outChannel === undefined) { - outChannel = vscode.window.createOutputChannel(CONSTANTS.NAME); - utils.logToOutputChannel(outChannel, CONSTANTS.INFO.WELCOME_OUTPUT_TAB); - } - - vscode.workspace.onDidSaveTextDocument( - async (document: vscode.TextDocument) => { - await fileSelectionService.updateCurrentFileFromTextFile(document); - } - ); - - const currVersionReleaseName = - "release_note_" + getPackageInfo(context).extensionVersion; - const viewedReleaseNote = context.globalState.get( - currVersionReleaseName, - false - ); - - if (!viewedReleaseNote) { - PopupService.openReleaseNote(); - context.globalState.update(currVersionReleaseName, true); - } - - const openWebview = () => { - if (currentPanel && currentPanel.webview) { - messagingService.setWebview(currentPanel.webview); - currentPanel.webview.html = webviewService.getWebviewContent( - WEBVIEW_TYPES.SIMULATOR, - true, - currentPanel - ); - currentPanel.reveal(vscode.ViewColumn.Beside); - } else { - currentPanel = vscode.window.createWebviewPanel( - CONSTANTS.WEBVIEW_TYPE.SIMULATOR, - CONSTANTS.LABEL.WEBVIEW_PANEL, - { preserveFocus: true, viewColumn: vscode.ViewColumn.Beside }, - { - // Only allow the webview to access resources in our extension's media directory - localResourceRoots: [ - vscode.Uri.file( - path.join( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY - ) - ), - ], - enableScripts: true, - } - ); - - currentPanel.webview.html = webviewService.getWebviewContent( - WEBVIEW_TYPES.SIMULATOR, - true, - currentPanel - ); - messagingService.setWebview(currentPanel.webview); - - if (messageListener !== undefined) { - messageListener.dispose(); - const index = context.subscriptions.indexOf(messageListener); - if (index > -1) { - context.subscriptions.splice(index, 1); - } - } - - if (activeEditorListener !== undefined) { - activeEditorListener.dispose(); - const index = context.subscriptions.indexOf( - activeEditorListener - ); - if (index > -1) { - context.subscriptions.splice(index, 1); - } - } - - if (currentPanel) { - // Handle messages from webview - messageListener = currentPanel.webview.onDidReceiveMessage( - message => { - const messageJson = JSON.stringify({ - active_device: deviceSelectionService.getCurrentActiveDevice(), - state: message.text, - }); - switch (message.command) { - case WEBVIEW_MESSAGES.BUTTON_PRESS: - // Send input to the Python process - telemetryHandlerService.handleButtonPressTelemetry( - message.text - ); - console.log(`About to write ${messageJson} \n`); - if ( - inDebugMode && - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .emitInputChanged(messageJson); - } else if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - break; - case WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP: - console.log(`Play button ${messageJson} \n`); - if (message.text.state as boolean) { - fileSelectionService.setPathAndSendMessage( - message.text.selected_file - ); - fileSelectionService.findCurrentTextDocument(); - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_RUN_SIMULATOR_BUTTON - ); - runSimulatorCommand(); - } else { - killProcessIfRunning(); - } - - if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - - break; - case WEBVIEW_MESSAGES.GESTURE: - case WEBVIEW_MESSAGES.SENSOR_CHANGED: - telemetryHandlerService.handleGestureTelemetry( - message.text - ); - console.log(`Sensor changed ${messageJson} \n`); - if ( - inDebugMode && - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .emitInputChanged(messageJson); - } else if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - break; - case WEBVIEW_MESSAGES.REFRESH_SIMULATOR: - console.log("Refresh button"); - runSimulatorCommand(); - break; - case WEBVIEW_MESSAGES.SLIDER_TELEMETRY: - telemetryHandlerService.handleSensorTelemetry( - message.text - ); - break; - case WEBVIEW_MESSAGES.SWITCH_DEVICE: - deviceSelectionService.setCurrentActiveDevice( - message.text.active_device - ); - killProcessIfRunning(); - break; - default: - vscode.window.showInformationMessage( - CONSTANTS.ERROR.UNEXPECTED_MESSAGE - ); - break; - } - }, - undefined, - context.subscriptions - ); - - activeEditorListener = utils.addVisibleTextEditorCallback( - currentPanel, - context - ); - } - - currentPanel.onDidDispose( - () => { - currentPanel = undefined; - if ( - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .setWebview(undefined); - } - killProcessIfRunning(); - if (firstTimeClosed) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.FIRST_TIME_WEBVIEW - ); - firstTimeClosed = false; - } - }, - undefined, - context.subscriptions - ); - } - sendCurrentDeviceMessage(currentPanel); - }; - - // Open Simulator on the webview - const openSimulator: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.openSimulator", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_SIMULATE_TO, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - deviceSelectionService.setCurrentActiveDevice(device); - const telemetryEvents = telemetryHandlerService.getTelemetryEventsForOpenSimulator( - device - ); - telemetryAI.trackFeatureUsage( - telemetryEvents.openSimulatorTelemetryEvent - ); - telemetryAI.runWithLatencyMeasure( - openWebview, - telemetryEvents.openSimulatorPerformanceTelemetryEvent - ); - } - ); - - const gettingStartedOpen: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.gettingStarted", - () => { - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_GETTING_STARTED - ); - webviewService.openTutorialPanel(); - } - ); - - const openTemplateFile = (template: string) => { - const fileName = template; - const filePath = - __dirname + path.sep + "templates" + path.sep + fileName; - const file = fs.readFileSync(filePath, "utf8"); - const showNewFilePopup: boolean = vscode.workspace - .getConfiguration() - .get(CONFIG.SHOW_NEW_FILE_POPUP); - - if (showNewFilePopup && template === CONSTANTS.TEMPLATE.CPX) { - vscode.window - .showInformationMessage( - CONSTANTS.INFO.NEW_FILE, - DialogResponses.DONT_SHOW, - DialogResponses.EXAMPLE_CODE, - DialogResponses.TUTORIALS - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.DONT_SHOW) { - vscode.workspace - .getConfiguration() - .update(CONFIG.SHOW_NEW_FILE_POPUP, false); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_DONT_SHOW - ); - } else if (selection === DialogResponses.EXAMPLE_CODE) { - open(CONSTANTS.LINKS.EXAMPLE_CODE); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_EXAMPLE_CODE - ); - } else if (selection === DialogResponses.TUTORIALS) { - const okAction = () => { - open(CONSTANTS.LINKS.TUTORIALS); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_TUTORIALS - ); - }; - utils.showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT - ); - } - }); - } - - // tslint:disable-next-line: ban-comma-operator - vscode.workspace - .openTextDocument({ - content: file, - language: LANGUAGE_VARS.PYTHON.ID, - }) - .then((template: vscode.TextDocument) => { - vscode.window.showTextDocument(template, 1, false).then(() => { - openWebview(); - }); - }), - // tslint:disable-next-line: no-unused-expression - (error: any) => { - telemetryHandlerService.handleNewFileErrorTelemetry(); - console.error(`Failed to open a new text document: ${error}`); - }; - }; - - const newFile: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.newFile", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_FOR_NEW_FILE, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - deviceSelectionService.setCurrentActiveDevice(device); - - const deviceToTemplateMapping = { - [CONSTANTS.DEVICE_NAME.CPX]: CONSTANTS.TEMPLATE.CPX, - [CONSTANTS.DEVICE_NAME.MICROBIT]: CONSTANTS.TEMPLATE.MICROBIT, - [CONSTANTS.DEVICE_NAME.CLUE]: CONSTANTS.TEMPLATE.CLUE, - }; - const templateFile = deviceToTemplateMapping[device]; - - const telemetryEvents = telemetryHandlerService.getTelemetryEventsForNewFile( - device - ); - - telemetryAI.trackFeatureUsage( - telemetryEvents.newFileTelemetryEvent - ); - telemetryAI.runWithLatencyMeasure( - () => openTemplateFile(templateFile), - telemetryEvents.newFilePerformanceTelemetryEvent - ); - } - ); - - const installDependencies: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.installDependencies", - async () => { - pythonExecutablePath = await setupService.setupEnv(context, true); - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_INSTALL_EXTENSION_DEPENDENCIES - ); - } - ); - - const killProcessIfRunning = () => { - if (childProcess !== undefined) { - if (currentPanel) { - currentPanel.webview.postMessage({ - command: "reset-state", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } - // TODO: We need to check the process was correctly killed - childProcess.kill(); - childProcess = undefined; - } - }; - - const runSimulatorCommand = async () => { - pythonProcessDataBuffer = []; - // Prevent running new code if a debug session is active - if (inDebugMode) { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.DEBUGGING_SESSION_IN_PROGESS - ); - return; - } - if (shouldShowRunCodePopup) { - const shouldExitCommand = await vscode.window - .showWarningMessage( - CONSTANTS.WARNING.ACCEPT_AND_RUN, - DialogResponses.ACCEPT_AND_RUN, - DialogResponses.CANCEL - ) - .then((selection: vscode.MessageItem | undefined) => { - let hasAccepted = true; - if (selection === DialogResponses.ACCEPT_AND_RUN) { - shouldShowRunCodePopup = false; - hasAccepted = false; - } - return hasAccepted; - }); - // Don't run users code if they don't accept - if (shouldExitCommand) { - return; - } - } - - openWebview(); - - if (!currentPanel) { - return; - } - - console.info(CONSTANTS.INFO.RUNNING_CODE); - - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_SIMULATOR, - true - ); - - killProcessIfRunning(); - - await fileSelectionService.updateCurrentFileFromEditor( - vscode.window.activeTextEditor - ); - - if (fileSelectionService.getCurrentFileAbsPath() === "") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_RUN, - true - ); - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FILE_TO_RUN, - DialogResponses.MESSAGE_UNDERSTOOD - ); - } else { - // Save on run - await fileSelectionService.getCurrentTextDocument().save(); - - if ( - !fileSelectionService - .getCurrentTextDocument() - .fileName.endsWith(LANGUAGE_VARS.PYTHON.FILE_ENDS) - ) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_RUN, - true - ); - return; - } - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.FILE_SELECTED( - fileSelectionService.getCurrentFileAbsPath() - ) - ); - - // Activate the run webview button - currentPanel.webview.postMessage({ - command: "activate-play", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - const args = [ - utils.getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.PROCESS_USER_CODE_PY - ), - fileSelectionService.getCurrentFileAbsPath(), - JSON.stringify({ enable_telemetry: utils.getTelemetryState() }), - ]; - childProcess = cp.spawn(pythonExecutablePath, args); - - let dataFromTheProcess = ""; - let oldMessage = ""; - - // Data received from Python process - childProcess.stdout.on("data", data => { - dataFromTheProcess = data.toString(); - if (currentPanel) { - // NOTE: parts of the flow regarding pythonProcessDataBuffer - // are needed for the CLUE simulator to properly receive - // base_64 strings on UNIX systems. - - // added any incomplete data to beginning - const processedData = pythonProcessDataBuffer - .join("") - .concat(dataFromTheProcess); - pythonProcessDataBuffer = []; - - // Process the data from the process and send one state at a time - processedData.split("\0").forEach(message => { - if ( - currentPanel && - message.length > 0 && - message !== oldMessage - ) { - oldMessage = message; - let messageToWebview; - // Check the message is a JSON - try { - messageToWebview = JSON.parse(message); - // Check the JSON is a state - switch (messageToWebview.type) { - case "state": - const messageData = JSON.parse( - messageToWebview.data - ); - if ( - messageData.device_name === - deviceSelectionService.getCurrentActiveDevice() - ) { - messagingService.sendMessageToWebview( - VSCODE_MESSAGES_TO_WEBVIEW.SET_STATE, - messageData - ); - } - break; - - case "print": - console.log( - `Process print statement output = ${messageToWebview.data}` - ); - utils.logToOutputChannel( - outChannel, - `[PRINT] ${messageToWebview.data}` - ); - break; - - default: - console.log( - `Non-state JSON output from the process : ${messageToWebview}` - ); - break; - } - } catch (err) { - if (err instanceof SyntaxError) { - // if not a JSON string, it is incomplete - // add to beginning of next strings - pythonProcessDataBuffer.push(message); - } else { - console.log( - `Errored output: ${messageToWebview}` - ); - } - } - } - }); - } - }); - - // Std error output - childProcess.stderr.on("data", data => { - console.error( - `Error from the Python process through stderr: ${data}` - ); - telemetryAI.trackFeatureUsage( - TelemetryEventName.ERROR_PYTHON_PROCESS - ); - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.STDERR(data), - true - ); - if (currentPanel) { - currentPanel.webview.postMessage({ - active_device: deviceSelectionService.getCurrentActiveDevice(), - command: "reset-state", - }); - } - }); - - // When the process is done - childProcess.on("end", (code: number) => { - console.info(`Command execution exited with code: ${code}`); - }); - } - }; - - // Send message to the webview - const runSimulator: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.runSimulator", - () => { - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_RUN_PALETTE - ); - runSimulatorCommand(); - } - ); - - const deployCode = async (device: string) => { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_DEVICE, - true - ); - - await fileSelectionService.updateCurrentFileFromEditor( - vscode.window.activeTextEditor - ); - - if (fileSelectionService.getCurrentFileAbsPath() === "") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, - true - ); - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, - DialogResponses.MESSAGE_UNDERSTOOD - ); - } else { - await fileSelectionService.getCurrentTextDocument().save(); - - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.FILE_SELECTED( - fileSelectionService.getCurrentFileAbsPath() - ) - ); - - const deviceProcess = cp.spawn(pythonExecutablePath, [ - utils.getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.DEVICE_PY - ), - device, - fileSelectionService.getCurrentFileAbsPath(), - ]); - - let dataFromTheProcess = ""; - - // Data received from Python process - deviceProcess.stdout.on("data", data => { - dataFromTheProcess = data.toString(); - - let messageToWebview; - try { - messageToWebview = JSON.parse(dataFromTheProcess); - if (messageToWebview.type === "complete") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_SUCCESS, - true - ); - } - telemetryHandlerService.handleDeployToDeviceFinishedTelemetry( - messageToWebview, - device - ); - } catch (err) { - console.log( - `Non-JSON output from the process : ${dataFromTheProcess}` - ); - } - }); - - // Std error output - deviceProcess.stderr.on("data", data => { - telemetryHandlerService.handleDeployToDeviceErrorTelemetry( - data, - device - ); - console.error( - `Error from the Python device process through stderr: ${data}` - ); - utils.logToOutputChannel( - outChannel, - `[ERROR] ${data} \n`, - true - ); - }); - - // When the process is done - deviceProcess.on("end", (code: number) => { - console.info(`Command execution exited with code: ${code}`); - }); - } - }; - - const deployToDevice: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.deployToDevice", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_DEPLOY_TO, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - - const telemetryEvents = telemetryHandlerService.getTelemetryEventsForStartingDeployToDevice( - device - ); - - telemetryAI.trackFeatureUsage(telemetryEvents.deployTelemetryEvent); - telemetryAI.runWithLatencyMeasure(() => { - deployCode(device); - }, telemetryEvents.deployPerformanceTelemetryEvent); - } - ); - - let serialMonitor: SerialMonitor | undefined; - if (configFileCreated) { - serialMonitor = SerialMonitor.getInstance(); - context.subscriptions.push(serialMonitor); - } - - const selectSerialPort: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.selectSerialPort", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.selectSerialPort(null, null); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CHOOSE_PORT); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const openSerialMonitor: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.openSerialMonitor", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure( - serialMonitor.openSerialMonitor.bind(serialMonitor), - TelemetryEventName.COMMAND_SERIAL_MONITOR_OPEN - ); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const changeBaudRate: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.changeBaudRate", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure( - serialMonitor.changeBaudRate.bind(serialMonitor), - TelemetryEventName.COMMAND_SERIAL_MONITOR_BAUD_RATE - ); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const closeSerialMonitor: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.closeSerialMonitor", - (port, showWarning = true) => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.closeSerialMonitor(port, showWarning); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const showReleaseNote = vscode.commands.registerCommand( - "deviceSimulatorExpress.", - (port, showWarning = true) => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.closeSerialMonitor(port, showWarning); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - UsbDetector.getInstance().initialize(context.extensionPath); - UsbDetector.getInstance().startListening(); - - if ( - CPXWorkspace.rootPath && - (utils.fileExistsSync( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ) || - vscode.window.activeTextEditor) - ) { - (() => { - if (!SerialMonitor.getInstance().initialized) { - SerialMonitor.getInstance().initialize(); - } - })(); - } - - // Debugger configuration - const simulatorDebugConfiguration = new SimulatorDebugConfigurationProvider( - utils.getPathToScript(context, "out/", "debug_user_code.py") - ); - - const debugAdapterFactory = new DebugAdapterFactory( - vscode.debug.activeDebugSession, - messagingService, - debuggerCommunicationService - ); - vscode.debug.registerDebugAdapterTrackerFactory( - LANGUAGE_VARS.PYTHON.ID, - debugAdapterFactory - ); - // On Debug Session Start: Init comunication - const debugSessionsStarted = vscode.debug.onDidStartDebugSession(() => { - if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { - // Reinitialize process - killProcessIfRunning(); - inDebugMode = true; - - try { - // Shut down existing server on debug restart - if (debuggerCommunicationService.getCurrentDebuggerServer()) { - debuggerCommunicationService.resetCurrentDebuggerServer(); - } - - debuggerCommunicationService.setCurrentDebuggerServer( - new DebuggerCommunicationServer( - currentPanel, - utils.getServerPortConfig(), - deviceSelectionService - ) - ); - - telemetryHandlerService.handleDebuggerTelemetry(); - - openWebview(); - if (currentPanel) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .setWebview(currentPanel); - currentPanel.webview.postMessage({ - active_device: deviceSelectionService.getCurrentActiveDevice(), - command: "activate-play", - }); - } - } catch (err) { - if (err.message === SERVER_INFO.ERROR_CODE_INIT_SERVER) { - console.error( - `Error trying to init the server on port ${utils.getServerPortConfig()}` - ); - - telemetryHandlerService.handleDebuggerFailTelemetry(); - - vscode.window.showErrorMessage( - CONSTANTS.ERROR.DEBUGGER_SERVER_INIT_FAILED( - utils.getServerPortConfig() - ) - ); - } - } - } - }); - - // On Debug Session Stop: Stop communiation - const debugSessionStopped = vscode.debug.onDidTerminateDebugSession(() => { - if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { - inDebugMode = false; - simulatorDebugConfiguration.deviceSimulatorExpressDebug = false; - if (debuggerCommunicationService.getCurrentDebuggerServer()) { - debuggerCommunicationService.resetCurrentDebuggerServer(); - } - if (currentPanel) { - currentPanel.webview.postMessage({ - command: "reset-state", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } - } - }); - - const configsChanged = vscode.workspace.onDidChangeConfiguration( - async () => { - if (utils.checkConfig(CONFIG.CONFIG_ENV_ON_SWITCH)) { - pythonExecutablePath = await setupService.setupEnv(context); - } - } - ); - - context.subscriptions.push( - installDependencies, - runSimulator, - changeBaudRate, - closeSerialMonitor, - deployToDevice, - newFile, - openSimulator, - openSerialMonitor, - selectSerialPort, - gettingStartedOpen, - vscode.debug.registerDebugConfigurationProvider( - CONSTANTS.DEBUG_CONFIGURATION_TYPE, - simulatorDebugConfiguration - ), - debugSessionsStarted, - debugSessionStopped, - configsChanged - ); -} - -const updatePythonExtraPaths = () => { - updateConfigLists( - "python.autoComplete.extraPaths", - [ - __dirname, - path.join(__dirname, CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY), - path.join(__dirname, CONSTANTS.FILESYSTEM.CLUE), - path.join(__dirname, CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON), - ], - vscode.ConfigurationTarget.Global - ); -}; - -const updatePylintArgs = (context: vscode.ExtensionContext) => { - const outPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY - ); - const micropythonPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY - ); - - const cluePath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.CLUE - ); - - const baseCircuitPythonPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON - ); - // update pylint args to extend system path - // to include python libs local to extention - updateConfigLists( - "python.linting.pylintArgs", - [ - "--init-hook", - `import sys; sys.path.extend([\"${outPath}\",\"${micropythonPath}\",\"${cluePath}\",\"${baseCircuitPythonPath}\"])`, - ], - vscode.ConfigurationTarget.Workspace - ); -}; - -const updateConfigLists = ( - section: string, - newItems: string[], - scope: vscode.ConfigurationTarget -) => { - // function for adding elements to configuration arrays - const currentExtraItems: string[] = - vscode.workspace.getConfiguration().get(section) || []; - const extraItemsSet: Set = new Set( - currentExtraItems.concat(newItems) - ); - - vscode.workspace - .getConfiguration() - .update(section, Array.from(extraItemsSet), scope); -}; - -// this method is called when your extension is deactivated -export async function deactivate() { - const monitor: SerialMonitor = SerialMonitor.getInstance(); - await monitor.closeSerialMonitor(null, false); - UsbDetector.getInstance().stopListening(); -} diff --git a/src/extension_utils/utils.ts b/src/extension_utils/utils.ts deleted file mode 100644 index b7be3b71c..000000000 --- a/src/extension_utils/utils.ts +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as cp from "child_process"; -import * as fs from "fs"; -import * as path from "path"; -import * as util from "util"; -import * as vscode from "vscode"; -import { - CONSTANTS, - CPX_CONFIG_FILE, - DialogResponses, - GLOBAL_ENV_VARS, - SERVER_INFO, -} from "../constants"; -import { CPXWorkspace } from "../cpxWorkspace"; -import { DeviceContext } from "../deviceContext"; - -export const exec = util.promisify(cp.exec); - -const errorChannel = vscode.window.createOutputChannel( - CONSTANTS.ERROR.INSTALLATION_ERROR -); - -// tslint:disable-next-line: export-name -export const getPathToScript = ( - context: vscode.ExtensionContext, - folderName: string, - fileName: string = "" -) => { - const onDiskPath = vscode.Uri.file( - path.join(context.extensionPath, folderName, fileName) - ); - const scriptPath = onDiskPath.with({ scheme: "vscode-resource" }); - return scriptPath.fsPath; -}; - -export const showPrivacyModal = ( - okAction: () => void, - thirdPartyDisclaimer: string -) => { - vscode.window - .showInformationMessage( - `${thirdPartyDisclaimer}: ${CONSTANTS.LINKS.PRIVACY}`, - DialogResponses.AGREE_AND_PROCEED, - DialogResponses.CANCEL - ) - .then((privacySelection: vscode.MessageItem | undefined) => { - if (privacySelection === DialogResponses.AGREE_AND_PROCEED) { - okAction(); - } else if (privacySelection === DialogResponses.CANCEL) { - // do nothing - } - }); -}; - -export const logToOutputChannel = ( - outChannel: vscode.OutputChannel | undefined, - message: string, - show: boolean = false -): void => { - if (outChannel) { - if (show) { - outChannel.show(true); - } - outChannel.append(message); - } -}; - -export function tryParseJSON(jsonString: string): any | boolean { - try { - const jsonObj = JSON.parse(jsonString); - if (jsonObj && typeof jsonObj === "object") { - return jsonObj; - } - } catch (exception) {} - - return false; -} - -export function fileExistsSync(filePath: string): boolean { - try { - return fs.statSync(filePath).isFile(); - } catch (error) { - return false; - } -} - -export function mkdirRecursivelySync(dirPath: string): void { - if (directoryExistsSync(dirPath)) { - return; - } - const dirname = path.dirname(dirPath); - if (path.normalize(dirname) === path.normalize(dirPath)) { - fs.mkdirSync(dirPath); - } else if (directoryExistsSync(dirname)) { - fs.mkdirSync(dirPath); - } else { - mkdirRecursivelySync(dirname); - fs.mkdirSync(dirPath); - } -} - -export function directoryExistsSync(dirPath: string): boolean { - try { - return fs.statSync(dirPath).isDirectory(); - } catch (e) { - return false; - } -} - -/** - * This method pads the current string with another string (repeated, if needed) - * so that the resulting string reaches the given length. - * The padding is applied from the start (left) of the current string. - */ -export function padStart( - sourceString: string, - targetLength: number, - padString?: string -): string { - if (!sourceString) { - return sourceString; - } - - if (!(String.prototype as any).padStart) { - // https://github.com/uxitten/polyfill/blob/master/string.polyfill.js - padString = String(padString || " "); - if (sourceString.length > targetLength) { - return sourceString; - } else { - targetLength = targetLength - sourceString.length; - if (targetLength > padString.length) { - padString += padString.repeat(targetLength / padString.length); // append to original to ensure we are longer than needed - } - return padString.slice(0, targetLength) + sourceString; - } - } else { - return (sourceString as any).padStart(targetLength, padString); - } -} - -export function convertToHex(num: number, width = 0): string { - return padStart(num.toString(16), width, "0"); -} - -export function generateCPXConfig(): void { - const deviceContext: DeviceContext = DeviceContext.getInstance(); - const cpxJson = { - port: deviceContext.port, - }; - const cpxConfigFilePath: string = path.join( - CPXWorkspace.rootPath, - CPX_CONFIG_FILE - ); - mkdirRecursivelySync(path.dirname(cpxConfigFilePath)); - fs.writeFileSync(cpxConfigFilePath, JSON.stringify(cpxJson, null, 4)); -} - -export const addVisibleTextEditorCallback = ( - currentPanel: vscode.WebviewPanel, - context: vscode.ExtensionContext -): vscode.Disposable => { - const initialPythonEditors = filterForPythonFiles( - vscode.window.visibleTextEditors - ); - currentPanel.webview.postMessage({ - command: "visible-editors", - state: { activePythonEditors: initialPythonEditors }, - }); - return vscode.window.onDidChangeVisibleTextEditors( - (textEditors: vscode.TextEditor[]) => { - const activePythonEditors = filterForPythonFiles(textEditors); - currentPanel.webview.postMessage({ - command: "visible-editors", - state: { activePythonEditors }, - }); - }, - {}, - context.subscriptions - ); -}; - -export const filterForPythonFiles = (textEditors: vscode.TextEditor[]) => { - return textEditors - .filter(editor => editor.document.languageId === GLOBAL_ENV_VARS.PYTHON) - .map(editor => editor.document.fileName); -}; - -export const getActiveEditorFromPath = ( - filePath: string -): vscode.TextDocument => { - const activeEditor = vscode.window.visibleTextEditors.find( - (editor: vscode.TextEditor) => editor.document.fileName === filePath - ); - return activeEditor ? activeEditor.document : undefined; -}; - -export const getServerPortConfig = (): number => { - // tslint:disable: no-backbone-get-set-outside-model prefer-type-cast - if ( - vscode.workspace - .getConfiguration() - .has(SERVER_INFO.SERVER_PORT_CONFIGURATION) - ) { - return vscode.workspace - .getConfiguration() - .get(SERVER_INFO.SERVER_PORT_CONFIGURATION) as number; - } - return SERVER_INFO.DEFAULT_SERVER_PORT; -}; - -export const checkConfig = (configName: string): boolean => { - return vscode.workspace.getConfiguration().get(configName) === true; -}; - -export const getConfig = (configName: string): string => { - return vscode.workspace.getConfiguration().get(configName); -}; - -export const createEscapedPath = (...pieces: string[]) => { - const initialPath: string = path.join(...pieces); - - // escape all special characters - // https://stackoverflow.com/questions/1779858/how-do-i-escape-a-string-for-a-shell-command-in-node - return `"` + initialPath.replace(/(["'$`\\])/g, "\\$1") + `"`; -}; - -export const getTelemetryState = () => { - return vscode.workspace - .getConfiguration() - .get("telemetry.enableTelemetry", true); -}; diff --git a/src/install_dependencies.py b/src/install_dependencies.py deleted file mode 100644 index 00fe81d37..000000000 --- a/src/install_dependencies.py +++ /dev/null @@ -1,9 +0,0 @@ -import subprocess -import sys -import pathlib -import os - -os.chdir(str(pathlib.Path(__file__).parent.parent.absolute())) -subprocess.check_call( - [sys.executable, "-m", "pip", "install", "-r", "./out/requirements.txt"] -) diff --git a/src/latest_release_note.ts b/src/latest_release_note.ts deleted file mode 100644 index ed9357870..000000000 --- a/src/latest_release_note.ts +++ /dev/null @@ -1,38 +0,0 @@ -// TODO: find a better way of loading html into a string -export const LATEST_RELEASE_NOTE = `

Device Simulator Express Release Notes 🤖

-

Device Simulator Express, a Microsoft Garage project, allows you to code microcontrollers without the hardware on hand! You can program your Adafruit Circuit Playground Express (CPX), your BBC micro:bit or the Adafruit CLUE!

-
- LIGHTGESTUREPROXIMITY -
- -

📝 April 22, 2020

-

Changes:

-
    -
  • Increased precision for certain sensors on the CLUE and CPX.
  • -
-

Fixes:

-
    -
  • Fixed bugs within the CLUE slideshow library and debugger.
  • -
- -

📝 April 20, 2020

-

-

We're back with a full release for the Adafruit CLUE 🐍🔍.

-

-

Changes:

-
    -
  • The Adafruit CLUE is enabled by default.
  • -
  • The "Getting Started" page now includes some guidance on the debugger.
  • -
-

Fixes:

-
    -
  • Implemented fix for the switch on the CPX.
  • -
  • The CLUE debugger's LEDs can now correctly show on the UI.
  • -
  • The dependency installation process is fixed, and users without Git installed can now run setup.
  • -
- -

- -

PS: You can read about the DSX team in the article here!

-

Create something wonderful ✨🙌,
-       - The Device Simulator Express Team

`; diff --git a/src/micropython/__init__.py b/src/micropython/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/micropython/audio.py b/src/micropython/audio.py deleted file mode 100644 index 36a336465..000000000 --- a/src/micropython/audio.py +++ /dev/null @@ -1,39 +0,0 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/audio.html. - - -def play(source, wait=True, pin="pin0", return_pin=None): - """ - This function is not implemented in the simulator. - - Play the source to completion. - - ``source`` is an iterable, each element of which must be an ``AudioFrame``. - - If ``wait`` is ``True``, this function will block until the source is exhausted. - - ``pin`` specifies which pin the speaker is connected to. - - ``return_pin`` specifies a differential pin to connect to the speaker - instead of ground. - """ - utils.print_for_unimplemented_functions(play.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_AUDIO) - - -class AudioFrame: - """ - This class is not implemented in the simulator. - - An ``AudioFrame`` object is a list of 32 samples each of which is a signed byte - (whole number between -128 and 127). - - It takes just over 4 ms to play a single frame. - """ - - def __init__(self): - utils.print_for_unimplemented_functions(AudioFrame.__init__.__qualname__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_AUDIO) diff --git a/src/micropython/microbit/__init__.py b/src/micropython/microbit/__init__.py deleted file mode 100644 index 478fcff42..000000000 --- a/src/micropython/microbit/__init__.py +++ /dev/null @@ -1,52 +0,0 @@ -from .__model.image import Image -from .__model.microbit_model import __mb -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -accelerometer = __mb.accelerometer -button_a = __mb.button_a -button_b = __mb.button_b -compass = __mb.compass -display = __mb.display -i2c = __mb.i2c -spi = __mb.spi - - -def panic(n): - """ - Enter a panic mode. Requires restart. Pass in an arbitrary integer <= 255 to indicate a status - """ - __mb.panic(n) - - -def reset(): - """ - Restart the board. - """ - __mb.reset() - - -def sleep(n): - """ - Wait for ``n`` milliseconds. One second is 1000 milliseconds, so:: - microbit.sleep(1000) - will pause the execution for one second. ``n`` can be an integer or - a floating point number. - """ - __mb.sleep(n) - - -def running_time(): - """ - Return the number of milliseconds since the board was switched on or - restarted. - """ - return __mb.running_time() - - -def temperature(): - """ - Return the temperature of the micro:bit in degrees Celcius. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_TEMPERATURE) - return __mb.temperature() diff --git a/src/micropython/microbit/__model/accelerometer.py b/src/micropython/microbit/__model/accelerometer.py deleted file mode 100644 index 4b28d35ee..000000000 --- a/src/micropython/microbit/__model/accelerometer.py +++ /dev/null @@ -1,136 +0,0 @@ -from . import constants as CONSTANTS -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - - -class Accelerometer: - # The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/accelerometer.html. - def __init__(self): - self.__x = 0 - self.__y = 0 - self.__z = 0 - self.__current_gesture = "" - self.__prev_gestures = set() - self.__gestures = [] - - def get_x(self): - """ - Get the acceleration measurement in the ``x`` axis, as a positive or - negative integer, depending on the direction. The measurement is given in - milli-g. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_ACCELEROMETER) - return self.__x - - def get_y(self): - """ - Get the acceleration measurement in the ``y`` axis, as a positive or - negative integer, depending on the direction. The measurement is given in - milli-g. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_ACCELEROMETER) - return self.__y - - def get_z(self): - """ - Get the acceleration measurement in the ``z`` axis, as a positive or - negative integer, depending on the direction. The measurement is given in - milli-g. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_ACCELEROMETER) - return self.__z - - def get_values(self): - """ - Get the acceleration measurements in all axes at once, as a three-element - tuple of integers ordered as X, Y, Z. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_ACCELEROMETER) - return (self.__x, self.__y, self.__z) - - def current_gesture(self): - """ - Return the name of the current gesture. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_GESTURE) - self.__add_current_gesture_to_gesture_lists() - return self.__current_gesture - - def is_gesture(self, name): - """ - Return True or False to indicate if the named gesture is currently active. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_GESTURE) - self.__add_current_gesture_to_gesture_lists() - if name not in CONSTANTS.GESTURES: - raise ValueError(CONSTANTS.INVALID_GESTURE_ERR) - return name == self.__current_gesture - - def was_gesture(self, name): - """ - Return True or False to indicate if the named gesture was active since the - last [was_gesture] call. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_GESTURE) - self.__add_current_gesture_to_gesture_lists() - if name not in CONSTANTS.GESTURES: - raise ValueError(CONSTANTS.INVALID_GESTURE_ERR) - was_gesture = name in self.__prev_gestures - self.__prev_gestures.clear() - return was_gesture - - def get_gestures(self): - """ - Return a tuple of the gesture history. The most recent is listed last. - Also clears the gesture history before returning. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_GESTURE) - self.__add_current_gesture_to_gesture_lists() - gestures = tuple(self.__gestures) - self.__gestures.clear() - return gestures - - # Helpers and Hidden Functions - - def __get_accel(self, axis): - if axis == "x": - return self.get_x() - elif axis == "y": - return self.get_y() - elif axis == "z": - return self.get_z() - - def __set_accel(self, axis, accel): - if accel < CONSTANTS.MIN_ACCELERATION or accel > CONSTANTS.MAX_ACCELERATION: - raise ValueError(CONSTANTS.INVALID_ACCEL_ERR) - if axis == "x": - self.__x = accel - elif axis == "y": - self.__y = accel - elif axis == "z": - self.__z = accel - - def __set_gesture(self, gesture): - if gesture in CONSTANTS.GESTURES: - self.__current_gesture = gesture - elif gesture == "": - self.__current_gesture = "" - else: - raise ValueError(CONSTANTS.INVALID_GESTURE_ERR) - - def __add_current_gesture_to_gesture_lists(self): - if self.__current_gesture in CONSTANTS.GESTURES: - self.__gestures.append(self.__current_gesture) - self.__prev_gestures.add(self.__current_gesture) - - def __update_motion(self, axis, accel): - if accel is not None: - previous_accel = self.__get_accel(axis) - if accel != previous_accel: - self.__set_accel(axis, accel) - - def __update_gesture(self, gesture): - if gesture is not None: - previous_gesture = self.__current_gesture - if previous_gesture != gesture: - self.__set_gesture(gesture) diff --git a/src/micropython/microbit/__model/button.py b/src/micropython/microbit/__model/button.py deleted file mode 100644 index 1bbe4ddbc..000000000 --- a/src/micropython/microbit/__model/button.py +++ /dev/null @@ -1,59 +0,0 @@ -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - - -class Button: - # The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/button.html. - def __init__(self): - self.__pressed = False - self.__presses = 0 - self.__prev_pressed = False - - def is_pressed(self): - """ - Returns ``True`` if the specified button ``button`` is currently being - held down, and ``False`` otherwise. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_BUTTON) - return self.__pressed - - def was_pressed(self): - """ - Returns ``True`` or ``False`` to indicate if the button was pressed - (went from up to down) since the device started or the last time this - method was called. Calling this method will clear the press state so - that the button must be pressed again before this method will return - ``True`` again. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_BUTTON) - res = self.__prev_pressed - self.__prev_pressed = False - return res - - def get_presses(self): - """ - Returns the running total of button presses, and resets this total - to zero before returning. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_BUTTON) - res = self.__presses - self.__presses = 0 - return res - - def __press_down(self): - self.__pressed = True - self.__prev_pressed = True - self.__presses += 1 - - def __release(self): - self.__pressed = False - - def __update(self, is_button_pressed): - if is_button_pressed is not None: - was_button_pressed = self.is_pressed() - - if is_button_pressed != was_button_pressed: - if is_button_pressed: - self.__press_down() - else: - self.__release() diff --git a/src/micropython/microbit/__model/compass.py b/src/micropython/microbit/__model/compass.py deleted file mode 100644 index 56eb43911..000000000 --- a/src/micropython/microbit/__model/compass.py +++ /dev/null @@ -1,88 +0,0 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - - -class Compass: - # The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/compass.html. - def calibrate(self): - """ - This function is not implemented in the simulator. - - Starts the calibration process. When this function is called on the physical device, an instructive message will be scrolled to the user after which they will need to rotate the device in order to draw a circle on the LED display on the actual device. - """ - utils.print_for_unimplemented_functions(Compass.calibrate.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) - - def is_calibrated(self): - """ - This function is not implemented in the simulator. - - Returns ``True`` if the compass has been successfully calibrated, and - returns ``False`` otherwise. - """ - utils.print_for_unimplemented_functions(Compass.is_calibrated.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) - - def clear_calibration(self): - """ - This function is not implemented in the simulator. - - Undoes the calibration, making the compass uncalibrated again. - """ - utils.print_for_unimplemented_functions(Compass.clear_calibration.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) - - def get_x(self): - """ - This function is not implemented in the simulator. - - Gives the reading of the magnetic field strength on the ``x`` axis in nano - tesla, as a positive or negative integer, depending on the direction of the - field. - """ - utils.print_for_unimplemented_functions(Compass.get_x.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) - - def get_y(self): - """ - This function is not implemented in the simulator. - - Gives the reading of the magnetic field strength on the ``y`` axis in nano - tesla, as a positive or negative integer, depending on the direction of the - field. - """ - utils.print_for_unimplemented_functions(Compass.get_y.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) - - def get_z(self): - """ - This function is not implemented in the simulator. - - Gives the reading of the magnetic field strength on the ``z`` axis in nano - tesla, as a positive or negative integer, depending on the direction of the - field. - """ - utils.print_for_unimplemented_functions(Compass.get_z.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) - - def heading(self): - """ - This function is not implemented in the simulator. - - Gives the compass heading, calculated from the above readings, as an - integer in the range from 0 to 360, representing the angle in degrees, - clockwise, with north as 0. - """ - utils.print_for_unimplemented_functions(Compass.heading.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) - - def get_field_strength(self): - """ - This function is not implemented in the simulator. - - Returns an integer indication of the magnitude of the magnetic field around - the device in nano tesla. - """ - utils.print_for_unimplemented_functions(Compass.get_field_strength.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_COMPASS) diff --git a/src/micropython/microbit/__model/constants.py b/src/micropython/microbit/__model/constants.py deleted file mode 100644 index 3e05b8b90..000000000 --- a/src/micropython/microbit/__model/constants.py +++ /dev/null @@ -1,169 +0,0 @@ -MICROBIT = "micro:bit" - -# string arguments for constructor -BLANK_5X5 = "00000:00000:00000:00000:00000:" - -# pre-defined image patterns -IMAGE_PATTERNS = { - "HEART": "09090:99999:99999:09990:00900:", - "HEART_SMALL": "00000:09090:09990:00900:00000:", - "HAPPY": "00000:09090:00000:90009:09990:", - "SMILE": "00000:00000:00000:90009:09990:", - "SAD": "00000:09090:00000:09990:90009:", - "CONFUSED": "00000:09090:00000:09090:90909:", - "ANGRY": "90009:09090:00000:99999:90909:", - "ASLEEP": "00000:99099:00000:09990:00000:", - "SURPRISED": "09090:00000:00900:09090:00900:", - "SILLY": "90009:00000:99999:00909:00999:", - "FABULOUS": "99999:99099:00000:09090:09990:", - "MEH": "09090:00000:00090:00900:09000:", - "YES": "00000:00009:00090:90900:09000:", - "NO": "90009:09090:00900:09090:90009:", - "CLOCK12": "00900:00900:00900:00000:00000:", - "CLOCK11": "09000:09000:00900:00000:00000:", - "CLOCK10": "00000:99000:00900:00000:00000:", - "CLOCK9": "00000:00000:99900:00000:00000:", - "CLOCK8": "00000:00000:00900:99000:00000:", - "CLOCK7": "00000:00000:00900:09000:09000:", - "CLOCK6": "00000:00000:00900:00900:00900:", - "CLOCK5": "00000:00000:00900:00090:00090:", - "CLOCK4": "00000:00000:00900:00099:00000:", - "CLOCK3": "00000:00000:00999:00000:00000:", - "CLOCK2": "00000:00099:00900:00000:00000:", - "CLOCK1": "00090:00090:00900:00000:00000:", - "ARROW_N": "00900:09990:90909:00900:00900:", - "ARROW_NE": "00999:00099:00909:09000:90000:", - "ARROW_E": "00900:00090:99999:00090:00900:", - "ARROW_SE": "90000:09000:00909:00099:00999:", - "ARROW_S": "00900:00900:90909:09990:00900:", - "ARROW_SW": "00009:00090:90900:99000:99900:", - "ARROW_W": "00900:09000:99999:09000:00900:", - "ARROW_NW": "99900:99000:90900:00090:00009:", - "TRIANGLE": "00000:00900:09090:99999:00000:", - "TRIANGLE_LEFT": "90000:99000:90900:90090:99999:", - "CHESSBOARD": "09090:90909:09090:90909:09090:", - "DIAMOND": "00900:09090:90009:09090:00900:", - "DIAMOND_SMALL": "00000:00900:09090:00900:00000:", - "SQUARE": "99999:90009:90009:90009:99999:", - "SQUARE_SMALL": "00000:09990:09090:09990:00000:", - "RABBIT": "90900:90900:99990:99090:99990:", - "COW": "90009:90009:99999:09990:00900:", - "MUSIC_CROTCHET": "00900:00900:00900:99900:99900:", - "MUSIC_QUAVER": "00900:00990:00909:99900:99900:", - "MUSIC_QUAVERS": "09999:09009:09009:99099:99099:", - "PITCHFORK": "90909:90909:99999:00900:00900:", - "XMAS": "00900:09990:00900:09990:99999:", - "PACMAN": "09999:99090:99900:99990:09999:", - "TARGET": "00900:09990:99099:09990:00900:", - "TSHIRT": "99099:99999:09990:09990:09990:", - "ROLLERSKATE": "00099:00099:99999:99999:09090:", - "DUCK": "09900:99900:09999:09990:00000:", - "HOUSE": "00900:09990:99999:09990:09090:", - "TORTOISE": "00000:09990:99999:09090:00000:", - "BUTTERFLY": "99099:99999:00900:99999:99099:", - "STICKFIGURE": "00900:99999:00900:09090:90009:", - "GHOST": "99999:90909:99999:99999:90909:", - "SWORD": "00900:00900:00900:09990:00900:", - "GIRAFFE": "99000:09000:09000:09990:09090:", - "SKULL": "09990:90909:99999:09990:09990:", - "UMBRELLA": "09990:99999:00900:90900:09900:", - "SNAKE": "99000:99099:09090:09990:00000:", -} - -IMAGE_TUPLE_LOOKUP = { - "ALL_CLOCKS": [ - "CLOCK12", - "CLOCK11", - "CLOCK10", - "CLOCK9", - "CLOCK8", - "CLOCK7", - "CLOCK6", - "CLOCK5", - "CLOCK4", - "CLOCK3", - "CLOCK2", - "CLOCK1", - ], - "ALL_ARROWS": [ - "ARROW_N", - "ARROW_NE", - "ARROW_E", - "ARROW_SE", - "ARROW_S", - "ARROW_SW", - "ARROW_W", - "ARROW_NW", - ], -} - -# 5x5 Alphabet -# Taken from https://raw.githubusercontent.com/micropython/micropython/264d80c84e034541bd6e4b461bfece4443ffd0ac/ports/nrf/boards/microbit/modules/microbitfont.h -ALPHABET = b"\x00\x00\x00\x00\x00\x08\x08\x08\x00\x08\x0a\x4a\x40\x00\x00\x0a\x5f\xea\x5f\xea\x0e\xd9\x2e\xd3\x6e\x19\x32\x44\x89\x33\x0c\x92\x4c\x92\x4d\x08\x08\x00\x00\x00\x04\x88\x08\x08\x04\x08\x04\x84\x84\x88\x00\x0a\x44\x8a\x40\x00\x04\x8e\xc4\x80\x00\x00\x00\x04\x88\x00\x00\x0e\xc0\x00\x00\x00\x00\x08\x00\x01\x22\x44\x88\x10\x0c\x92\x52\x52\x4c\x04\x8c\x84\x84\x8e\x1c\x82\x4c\x90\x1e\x1e\xc2\x44\x92\x4c\x06\xca\x52\x5f\xe2\x1f\xf0\x1e\xc1\x3e\x02\x44\x8e\xd1\x2e\x1f\xe2\x44\x88\x10\x0e\xd1\x2e\xd1\x2e\x0e\xd1\x2e\xc4\x88\x00\x08\x00\x08\x00\x00\x04\x80\x04\x88\x02\x44\x88\x04\x82\x00\x0e\xc0\x0e\xc0\x08\x04\x82\x44\x88\x0e\xd1\x26\xc0\x04\x0e\xd1\x35\xb3\x6c\x0c\x92\x5e\xd2\x52\x1c\x92\x5c\x92\x5c\x0e\xd0\x10\x10\x0e\x1c\x92\x52\x52\x5c\x1e\xd0\x1c\x90\x1e\x1e\xd0\x1c\x90\x10\x0e\xd0\x13\x71\x2e\x12\x52\x5e\xd2\x52\x1c\x88\x08\x08\x1c\x1f\xe2\x42\x52\x4c\x12\x54\x98\x14\x92\x10\x10\x10\x10\x1e\x11\x3b\x75\xb1\x31\x11\x39\x35\xb3\x71\x0c\x92\x52\x52\x4c\x1c\x92\x5c\x90\x10\x0c\x92\x52\x4c\x86\x1c\x92\x5c\x92\x51\x0e\xd0\x0c\x82\x5c\x1f\xe4\x84\x84\x84\x12\x52\x52\x52\x4c\x11\x31\x31\x2a\x44\x11\x31\x35\xbb\x71\x12\x52\x4c\x92\x52\x11\x2a\x44\x84\x84\x1e\xc4\x88\x10\x1e\x0e\xc8\x08\x08\x0e\x10\x08\x04\x82\x41\x0e\xc2\x42\x42\x4e\x04\x8a\x40\x00\x00\x00\x00\x00\x00\x1f\x08\x04\x80\x00\x00\x00\x0e\xd2\x52\x4f\x10\x10\x1c\x92\x5c\x00\x0e\xd0\x10\x0e\x02\x42\x4e\xd2\x4e\x0c\x92\x5c\x90\x0e\x06\xc8\x1c\x88\x08\x0e\xd2\x4e\xc2\x4c\x10\x10\x1c\x92\x52\x08\x00\x08\x08\x08\x02\x40\x02\x42\x4c\x10\x14\x98\x14\x92\x08\x08\x08\x08\x06\x00\x1b\x75\xb1\x31\x00\x1c\x92\x52\x52\x00\x0c\x92\x52\x4c\x00\x1c\x92\x5c\x90\x00\x0e\xd2\x4e\xc2\x00\x0e\xd0\x10\x10\x00\x06\xc8\x04\x98\x08\x08\x0e\xc8\x07\x00\x12\x52\x52\x4f\x00\x11\x31\x2a\x44\x00\x11\x31\x35\xbb\x00\x12\x4c\x8c\x92\x00\x11\x2a\x44\x98\x00\x1e\xc4\x88\x1e\x06\xc4\x8c\x84\x86\x08\x08\x08\x08\x08\x18\x08\x0c\x88\x18\x00\x00\x0c\x83\x60" -# We support ASCII characters between these indexes on the microbit -ASCII_START = 32 -ASCII_END = 126 -SPACE_BETWEEN_LETTERS_WIDTH = 1 -WHITESPACE_WIDTH = 3 - -# numerical LED values -LED_HEIGHT = 5 -LED_WIDTH = 5 -BRIGHTNESS_MIN = 0 -BRIGHTNESS_MAX = 9 - -# sensor max/min values -MAX_TEMPERATURE = 125 -MIN_TEMPERATURE = -55 -MAX_LIGHT_LEVEL = 255 -MIN_LIGHT_LEVEL = 0 -MAX_ACCELERATION = 1023 -MIN_ACCELERATION = -1023 - -GESTURES = set( - [ - "up", - "down", - "left", - "right", - "face up", - "face down", - "freefall", - "3g", - "6g", - "8g", - "shake", - ] -) - -# error messages -BRIGHTNESS_ERR = "brightness out of bounds" -COPY_ERR_MESSAGE = "please call copy function first" -INCORR_IMAGE_SIZE = "image data is incorrect size" -INDEX_ERR = "index out of bounds" -NOT_IMPLEMENTED_ERROR = "This method is not implemented by the simulator" -UNSUPPORTED_ADD_TYPE = "unsupported types for __add__:" -SAME_SIZE_ERR = "images must be the same size" -INVALID_GESTURE_ERR = "invalid gesture" -INVALID_ACCEL_ERR = "invalid acceleration" -INVALID_LIGHT_LEVEL_ERR = "invalid light level" -INVALID_TEMPERATURE_ERR = "invalid temperature" - -TIME_DELAY = 0.03 - -EXPECTED_INPUT_BUTTONS = [ - "button_a", - "button_b", -] - -EXPECTED_INPUT_ACCEL = { - "motion_x": "x", - "motion_y": "y", - "motion_z": "z", -} - -EXPECTED_INPUT_LIGHT = "light" - -EXPECTED_INPUT_TEMP = "temperature" - -EXPECTED_INPUT_GESTURE = "gesture" diff --git a/src/micropython/microbit/__model/display.py b/src/micropython/microbit/__model/display.py deleted file mode 100644 index 523811db0..000000000 --- a/src/micropython/microbit/__model/display.py +++ /dev/null @@ -1,369 +0,0 @@ -import copy -import time -import threading -import common - -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent -from . import constants as CONSTANTS -from .image import Image - - -class Display: - # The implementation based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/display.html. - - def __init__(self): - self.__image = Image() - self.__on = True - self.__light_level = 0 - self.__blank_image = Image() - - self.__current_pid = None - self.__lock = threading.Lock() - - def scroll(self, value, delay=150, wait=True, loop=False, monospace=False): - """ - Scrolls ``value`` horizontally on the display. If ``value`` is an integer or float it is - first converted to a string using ``str()``. The ``delay`` parameter controls how fast - the text is scrolling. - - If ``wait`` is ``True``, this function will block until the animation is - finished, otherwise the animation will happen in the background. - - If ``loop`` is ``True``, the animation will repeat forever. - - If ``monospace`` is ``True``, the characters will all take up 5 pixel-columns - in width, otherwise there will be exactly 1 blank pixel-column between each - character as they scroll. - - Note that the ``wait``, ``loop`` and ``monospace`` arguments must be specified - using their keyword. - """ - if not wait: - thread = threading.Thread( - target=self.scroll, args=(value, delay, True, loop, monospace) - ) - thread.start() - return - - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_SCROLL) - - # Set current_pid to the thread's identifier - self.__lock.acquire() - self.__current_pid = threading.get_ident() - self.__lock.release() - - if isinstance(value, (str, int, float)): - value = str(value) - else: - raise TypeError(f"can't convert {type(value)} object to str implicitly") - - letters = [] - for c in value: - if monospace: - letters.append(Display.__get_image_from_char(c)) - letters.append( - Image(CONSTANTS.SPACE_BETWEEN_LETTERS_WIDTH, CONSTANTS.LED_HEIGHT) - ) - else: - if c == " ": - letters.append( - Image(CONSTANTS.WHITESPACE_WIDTH, CONSTANTS.LED_HEIGHT) - ) - else: - letters.append( - Display.__strip_unlit_columns(Display.__get_image_from_char(c)) - ) - letters.append( - Image( - CONSTANTS.SPACE_BETWEEN_LETTERS_WIDTH, CONSTANTS.LED_HEIGHT, - ) - ) - appended_image = Display.__create_scroll_image(letters) - - while True: - # Show the scrolled image one square at a time. - for x in range(appended_image.width() - CONSTANTS.LED_WIDTH + 1): - self.__lock.acquire() - - # If show or scroll is called again, there will be a different pid and break - if self.__current_pid != threading.get_ident(): - self.__lock.release() - break - - self.__image.blit( - appended_image, x, 0, CONSTANTS.LED_WIDTH, CONSTANTS.LED_HEIGHT - ) - self.__lock.release() - self.__update_client() - - Display.sleep_ms(delay) - - if not loop: - break - - def show(self, value, delay=400, wait=True, loop=False, clear=False): - """ - Display the ``image``. - - If ``value`` is a string, float or integer, display letters/digits in sequence. - Otherwise, if ``value`` is an iterable sequence of images, display these images in sequence. - Each letter, digit or image is shown with ``delay`` milliseconds between them. - - If ``wait`` is ``True``, this function will block until the animation is - finished, otherwise the animation will happen in the background. - - If ``loop`` is ``True``, the animation will repeat forever. - - If ``clear`` is ``True``, the display will be cleared after the iterable has finished. - - Note that the ``wait``, ``loop`` and ``clear`` arguments must be specified - using their keyword. - """ - if not wait: - thread = threading.Thread( - target=self.show, args=(value, delay, True, loop, clear) - ) - thread.start() - return - - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_SHOW) - - # Set current_pid to the thread's identifier - self.__lock.acquire() - self.__current_pid = threading.get_ident() - self.__lock.release() - - images = [] - use_delay = False - if isinstance(value, Image): - images.append(value.crop(0, 0, CONSTANTS.LED_WIDTH, CONSTANTS.LED_HEIGHT)) - elif isinstance(value, (str, int, float)): - chars = list(str(value)) - for c in chars: - images.append(Display.__get_image_from_char(c)) - if len(chars) > 1: - use_delay = True - else: - # Check if iterable - try: - _ = iter(value) - except TypeError as e: - raise e - - for elem in value: - if isinstance(elem, Image): - images.append( - elem.crop(0, 0, CONSTANTS.LED_WIDTH, CONSTANTS.LED_HEIGHT) - ) - elif isinstance(elem, str) and len(elem) == 1: - images.append(Display.__get_image_from_char(elem)) - # If elem is not char or image, break without iterating through rest of list - else: - break - use_delay = True - - while True: - for image in images: - self.__lock.acquire() - - # If show or scroll is called again, there will be a different pid and break - if self.__current_pid != threading.get_ident(): - self.__lock.release() - break - - self.__image = image - self.__lock.release() - self.__update_client() - - if use_delay: - Display.sleep_ms(delay) - - if not loop: - break - if clear: - self.clear() - - def get_pixel(self, x, y): - """ - Return the brightness of the LED at column ``x`` and row ``y`` as an - integer between 0 (off) and 9 (bright). - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_OTHER) - self.__lock.acquire() - pixel = self.__image.get_pixel(x, y) - self.__lock.release() - return pixel - - def set_pixel(self, x, y, value): - """ - Set the brightness of the LED at column ``x`` and row ``y`` to ``value``, - which has to be an integer between 0 and 9. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_OTHER) - self.__lock.acquire() - self.__image.set_pixel(x, y, value) - self.__lock.release() - self.__update_client() - - def clear(self): - """ - Set the brightness of all LEDs to 0 (off). - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_OTHER) - self.__lock.acquire() - self.__image = Image() - self.__lock.release() - self.__update_client() - - def on(self): - """ - Use on() to turn on the display. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_OTHER) - self.__on = True - - def off(self): - """ - Use off() to turn off the display. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_OTHER) - self.__on = False - - def is_on(self): - """ - Returns ``True`` if the display is on, otherwise returns ``False``. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_DISPLAY_OTHER) - return self.__on - - def read_light_level(self): - """ - Use the display's LEDs in reverse-bias mode to sense the amount of light - falling on the display. Returns an integer between 0 and 255 representing - the light level, with larger meaning more light. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_LIGHT_LEVEL) - return self.__light_level - - def __set_light_level(self, level): - if level < CONSTANTS.MIN_LIGHT_LEVEL or level > CONSTANTS.MAX_LIGHT_LEVEL: - raise ValueError(CONSTANTS.INVALID_LIGHT_LEVEL_ERR) - else: - self.__light_level = level - - # Helpers - - def __get_array(self): - self.__lock.acquire() - if self.is_on(): - leds = copy.deepcopy(self.__image._Image__LED) - else: - leds = self.__blank_image._Image__LED - self.__lock.release() - return leds - - @staticmethod - def __get_image_from_char(c): - # If c is not between the ASCII alphabet we cover, make it a question mark - if ord(c) < CONSTANTS.ASCII_START or ord(c) > CONSTANTS.ASCII_END: - c = "?" - offset = (ord(c) - CONSTANTS.ASCII_START) * CONSTANTS.LED_WIDTH - representative_bytes = CONSTANTS.ALPHABET[ - offset : offset + CONSTANTS.LED_HEIGHT - ] - return Image(Display.__convert_bytearray_to_image_str(representative_bytes)) - - # Removes columns that are not lit - @staticmethod - def __strip_unlit_columns(image): - min_index = CONSTANTS.LED_WIDTH - 1 - max_index = 0 - for row in image._Image__LED: - for index, bit in enumerate(row): - if bit > 0: - min_index = min(min_index, index) - max_index = max(max_index, index) - return image.crop(min_index, 0, max_index - min_index + 1, CONSTANTS.LED_HEIGHT) - - # This method is different from Image's __bytes_to_array. - # This one requires a conversion from binary of the ALPHABET constant to an image. - @staticmethod - def __convert_bytearray_to_image_str(byte_array): - arr = [] - for b in byte_array: - # Convert byte to binary - b_as_bits = str(bin(b))[2:] - sub_arr = [] - while len(sub_arr) < 5: - # Iterate throught bits - # If there is a 1 at b, then the pixel at column b is lit - for bit in b_as_bits[::-1]: - if len(sub_arr) < 5: - sub_arr.insert(0, int(bit) * CONSTANTS.BRIGHTNESS_MAX) - else: - break - # Add 0s to the front until the list is 5 long - while len(sub_arr) < 5: - sub_arr.insert(0, 0) - arr.append(sub_arr) - image_str = "" - for row in arr: - for elem in row: - image_str += str(elem) - image_str += ":" - return image_str - - @staticmethod - def __insert_blank_column(image): - for row in image._Image__LED: - row.append(0) - - @staticmethod - def __create_scroll_image(images): - blank_5x5_image = Image() - front_of_scroll_image = Image(4, 5) - images.insert(0, front_of_scroll_image) - - scroll_image = Image._Image__append_images(images) - end_of_scroll_image = Image() - # Insert columns of 0s until the ending is a 5x5 blank - end_of_scroll_image.blit( - scroll_image, - scroll_image.width() - CONSTANTS.LED_WIDTH, - 0, - CONSTANTS.LED_WIDTH, - CONSTANTS.LED_HEIGHT, - ) - while not Image._Image__same_image(end_of_scroll_image, blank_5x5_image): - Display.__insert_blank_column(scroll_image) - end_of_scroll_image.blit( - scroll_image, - scroll_image.width() - CONSTANTS.LED_WIDTH, - 0, - CONSTANTS.LED_WIDTH, - CONSTANTS.LED_HEIGHT, - ) - - return scroll_image - - def __update_client(self): - sendable_json = {"leds": self.__get_array()} - - if common.utils.debug_mode: - common.debugger_communication_client.debug_send_to_simulator( - sendable_json, CONSTANTS.MICROBIT - ) - else: - common.utils.send_to_simulator(sendable_json, CONSTANTS.MICROBIT) - - def __update_light_level(self, new_light_level): - if new_light_level is not None: - previous_light_level = self.read_light_level() - if new_light_level != previous_light_level: - self.__set_light_level(new_light_level) - - @staticmethod - def sleep_ms(ms): - time.sleep(ms / 1000) diff --git a/src/micropython/microbit/__model/i2c.py b/src/micropython/microbit/__model/i2c.py deleted file mode 100644 index 2c83868d2..000000000 --- a/src/micropython/microbit/__model/i2c.py +++ /dev/null @@ -1,51 +0,0 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - - -class I2c: - # The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/i2c.html. - def init(self, freq=100000, sda="pin20", scl="pin19"): - """ - This function is not implemented in the simulator. - - Re-initialize peripheral with the specified clock frequency ``freq`` on the - specified ``sda`` and ``scl`` pins. - - Warning: - - Changing the I²C pins from defaults will make the accelerometer and - compass stop working, as they are connected internally to those pins. - """ - utils.print_for_unimplemented_functions(I2c.init.__qualname__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_I2C) - - def scan(self): - """ - This function is not implemented in the simulator. - - Scan the bus for devices. Returns a list of 7-bit addresses corresponding - to those devices that responded to the scan. - """ - utils.print_for_unimplemented_functions(I2c.scan.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_I2C) - - def read(self, addr, n, repeat=False): - """ - This function is not implemented in the simulator. - - Read ``n`` bytes from the device with 7-bit address ``addr``. If ``repeat`` - is ``True``, no stop bit will be sent. - """ - utils.print_for_unimplemented_functions(I2c.read.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_I2C) - - def write(self, addr, buf, repeat=False): - """ - This function is not implemented in the simulator. - - Write bytes from ``buf`` to the device with 7-bit address ``addr``. If - ``repeat`` is ``True``, no stop bit will be sent. - """ - utils.print_for_unimplemented_functions(I2c.write.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_I2C) diff --git a/src/micropython/microbit/__model/image.py b/src/micropython/microbit/__model/image.py deleted file mode 100644 index a525ea6e1..000000000 --- a/src/micropython/microbit/__model/image.py +++ /dev/null @@ -1,539 +0,0 @@ -from . import constants as CONSTANTS -from .producer_property import ProducerProperty -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - - -class Image: - """ - If ``string`` is used, it has to consist of digits 0-9 arranged into - lines, describing the image, for example:: - - image = Image("90009:" - "09090:" - "00900:" - "09090:" - "90009") - - will create a 5×5 image of an X. The end of a line is indicated by a colon. - It's also possible to use a newline (\\n) to indicate the end of a line - like this:: - - image = Image("90009\\n" - "09090\\n" - "00900\\n" - "09090\\n" - "90009") - - The other form creates an empty image with ``width`` columns and - ``height`` rows. Optionally ``buffer`` can be an array of - ``width``×``height`` integers in range 0-9 to initialize the image:: - - Image(2, 2, b'\x08\x08\x08\x08') - - or:: - - Image(2, 2, bytearray([9,9,9,9])) - - Will create a 2 x 2 pixel image at full brightness. - - .. note:: - - Keyword arguments cannot be passed to ``buffer``. - """ - - # Attributes assigned (to functions) later; - # having this here helps the pylint. - HEART = None - HEART_SMALL = None - HAPPY = None - SMILE = None - SAD = None - CONFUSED = None - ANGRY = None - ASLEEP = None - SURPRISED = None - SILLY = None - FABULOUS = None - MEH = None - YES = None - NO = None - CLOCK12 = None - CLOCK11 = None - CLOCK10 = None - CLOCK9 = None - CLOCK8 = None - CLOCK7 = None - CLOCK6 = None - CLOCK5 = None - CLOCK4 = None - CLOCK3 = None - CLOCK2 = None - CLOCK1 = None - ARROW_N = None - ARROW_NE = None - ARROW_E = None - ARROW_SE = None - ARROW_S = None - ARROW_SW = None - ARROW_W = None - ARROW_NW = None - TRIANGLE = None - TRIANGLE_LEFT = None - CHESSBOARD = None - DIAMOND = None - DIAMOND_SMALL = None - SQUARE = None - SQUARE_SMALL = None - RABBIT = None - COW = None - MUSIC_CROTCHET = None - MUSIC_QUAVER = None - MUSIC_QUAVERS = None - PITCHFORK = None - XMAS = None - PACMAN = None - TARGET = None - TSHIRT = None - ROLLERSKATE = None - DUCK = None - HOUSE = None - TORTOISE = None - BUTTERFLY = None - STICKFIGURE = None - GHOST = None - SWORD = None - GIRAFFE = None - SKULL = None - UMBRELLA = None - SNAKE = None - ALL_CLOCKS = None - ALL_ARROWS = None - - # implementing image model as described here: - # https://microbit-micropython.readthedocs.io/en/v1.0.1/image.html - - def __init__(self, *args, **kwargs): - # Depending on the number of arguments - # in constructor, it treat args differently. - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_CREATION) - if len(args) == 0: - # default constructor - self.__LED = self.__string_to_square_array(CONSTANTS.BLANK_5X5) - elif len(args) == 1: - pattern = args[0] - if isinstance(pattern, str): - self.__LED = self.__string_to_square_array(pattern) - else: - raise TypeError("Image(s) takes a string") - else: - - width = args[0] - height = args[1] - - if width < 0 or height < 0: - # This is not in original, but ideally, - # image should fail non-silently - raise ValueError(CONSTANTS.INDEX_ERR) - - if len(args) == 3: - # This option is for potential third bytearray arguments - byte_arr = args[2] - self.__LED = self.__bytes_to_array(width, height, byte_arr) - else: - self.__LED = self.__create_leds(width, height) - self.read_only = False - - def width(self): - """ - Return the number of columns in the image. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - if len(self.__LED) > 0: - return len(self.__LED[0]) - else: - return 0 - - def height(self): - """ - Return the numbers of rows in the image. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - return len(self.__LED) - - def set_pixel(self, x, y, value): - """ - Set the brightness of the pixel at column ``x`` and row ``y`` to the - ``value``, which has to be between 0 (dark) and 9 (bright). - - This method will raise an exception when called on any of the built-in - read-only images, like ``Image.HEART``. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - if self.read_only: - raise TypeError(CONSTANTS.COPY_ERR_MESSAGE) - elif not self.__valid_pos(x, y): - raise ValueError(CONSTANTS.INDEX_ERR) - elif not self.__valid_brightness(value): - raise ValueError(CONSTANTS.BRIGHTNESS_ERR) - else: - self.__LED[y][x] = value - - def get_pixel(self, x, y): - """ - Return the brightness of pixel at column ``x`` and row ``y`` as an - integer between 0 and 9. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - if self.__valid_pos(x, y): - return self.__LED[y][x] - else: - raise ValueError(CONSTANTS.INDEX_ERR) - - def shift_up(self, n): - """ - Return a new image created by shifting the picture up by ``n`` rows. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - return self.__shift_vertical(-n) - - def shift_down(self, n): - """ - Return a new image created by shifting the picture down by ``n`` rows. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - return self.__shift_vertical(n) - - def shift_right(self, n): - """ - Return a new image created by shifting the picture right by ``n`` - columns. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - return self.__shift_horizontal(n) - - def shift_left(self, n): - """ - Return a new image created by shifting the picture left by ``n`` - columns. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - return self.__shift_horizontal(-n) - - def crop(self, x, y, w, h): - """ - Return a new image by cropping the picture to a width of ``w`` and a - height of ``h``, starting with the pixel at column ``x`` and row ``y``. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - res = Image(w, h) - res.blit(self, x, y, w, h) - return res - - def copy(self): - """ - Return an exact copy of the image. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - return Image(self.__create_string()) - - # This inverts the brightness of each LED. - # ie: Pixel that is at brightness 4 would become brightness 5 - # and pixel that is at brightness 9 would become brightness 0. - def invert(self): - """ - Return a new image by inverting the brightness of the pixels in the - source image. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - for y in range(self.height()): - for x in range(self.width()): - self.set_pixel(x, y, CONSTANTS.BRIGHTNESS_MAX - self.get_pixel(x, y)) - - # This fills all LEDs with same brightness. - def fill(self, value): - """ - Set the brightness of all the pixels in the image to the - ``value``, which has to be between 0 (dark) and 9 (bright). - - This method will raise an exception when called on any of the built-in - read-only images, like ``Image.HEART``. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - for y in range(self.height()): - for x in range(self.width()): - self.set_pixel(x, y, value) - - # This transposes a certain area (w x h) on src onto the current image. - def blit(self, src, x, y, w, h, xdest=0, ydest=0): - """ - Copy the rectangle defined by ``x``, ``y``, ``w``, ``h`` from the image ``src`` into - this image at ``xdest``, ``ydest``. - Areas in the source rectangle, but outside the source image are treated as having a value of 0. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - if not src.__valid_pos(x, y): - raise ValueError(CONSTANTS.INDEX_ERR) - - for count_y in range(h): - for count_x in range(w): - if self.__valid_pos(xdest + count_x, ydest + count_y): - if src.__valid_pos(x + count_x, y + count_y): - transfer_pixel = src.get_pixel(x + count_x, y + count_y) - else: - transfer_pixel = 0 - self.set_pixel(xdest + count_x, ydest + count_y, transfer_pixel) - - # This adds two images (if other object is not an image, throws error). - # The images must be the same size. - def __add__(self, other): - """ - Create a new image by adding the brightness values from the two images for each pixel. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - if not isinstance(other, Image): - raise TypeError( - CONSTANTS.UNSUPPORTED_ADD_TYPE + f"'{type(self)}', '{type(other)}'" - ) - elif not (other.height() == self.height() and other.width() == self.width()): - raise ValueError(CONSTANTS.SAME_SIZE_ERR) - else: - res = Image(self.width(), self.height()) - - for y in range(self.height()): - for x in range(self.width()): - sum_value = other.get_pixel(x, y) + self.get_pixel(x, y) - display_result = min(CONSTANTS.BRIGHTNESS_MAX, sum_value) - res.set_pixel(x, y, display_result) - - return res - - # This multiplies image by number (if other factor is not a number, it throws an error). - def __mul__(self, other): - """ - Create a new image by multiplying the brightness of each pixel by n. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - try: - float_val = float(other) - except TypeError: - raise TypeError(f"can't convert {type(other)} to float") - - res = Image(self.width(), self.height()) - - for y in range(self.height()): - for x in range(self.width()): - product = self.get_pixel(x, y) * float_val - res.set_pixel(x, y, min(CONSTANTS.BRIGHTNESS_MAX, product)) - - return res - - def __repr__(self): - """ - Get a compact string representation of the image. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - ret_str = "Image('" - for index_y in range(self.height()): - ret_str += self.__row_to_str(index_y) - - ret_str += "')" - - return ret_str - - def __str__(self): - """ - Get a readable string representation of the image. - """ - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_OTHER) - ret_str = "Image('\n" - for index_y in range(self.height()): - ret_str += "\t" + self.__row_to_str(index_y) + "\n" - - ret_str += "')" - - return ret_str - - # HELPER FUNCTIONS - - # This create 2D array of off LEDs with - # width w and height h - def __create_leds(self, w, h): - arr = [] - for _ in range(h): - sub_arr = [] - for _ in range(w): - sub_arr.append(0) - arr.append(sub_arr) - - return arr - - # This turns byte array to 2D array for LED field. - def __bytes_to_array(self, width, height, byte_arr): - bytes_translated = bytes(byte_arr) - - if not len(bytes_translated) == height * width: - raise ValueError(CONSTANTS.INCORR_IMAGE_SIZE) - - arr = [] - sub_arr = [] - - for index, elem in enumerate(bytes_translated): - if index % width == 0 and index != 0: - arr.append(sub_arr) - sub_arr = [] - - sub_arr.append(elem) - - arr.append(sub_arr) - return arr - - # This converts string (with different rows separated by ":") - # to 2d array arrangement. - def __string_to_square_array(self, pattern): - initial_array, max_subarray_len = self.__string_directly_to_array(pattern) - - # Fill in empty spaces in w x h matrix. - for arr_y in initial_array: - num_extra_spaces = max_subarray_len - len(arr_y) - for _ in range(num_extra_spaces): - arr_y.append(0) - - return initial_array - - def __string_directly_to_array(self, pattern): - # The result may have spaces in the 2D array - # and may uneven sub-array lengths - arr = [] - sub_arr = [] - - max_subarray_len = 0 - - for elem in pattern: - if elem == ":" or elem == "\n": - if len(sub_arr) > max_subarray_len: - max_subarray_len = len(sub_arr) - arr.append(sub_arr) - sub_arr = [] - else: - sub_arr.append(int(elem)) - - if ( - len(pattern) > 0 - and not str(pattern)[-1] == ":" - and not str(pattern)[-1] == "\n" - and len(sub_arr) != 0 - ): - if len(sub_arr) > max_subarray_len: - max_subarray_len = len(sub_arr) - arr.append(sub_arr) - - return arr, max_subarray_len - - def __valid_brightness(self, value): - return value >= CONSTANTS.BRIGHTNESS_MIN and value <= CONSTANTS.BRIGHTNESS_MAX - - def __valid_pos(self, x, y): - return x >= 0 and x < self.width() and y >= 0 and y < self.height() - - def __shift_vertical(self, n): - res = Image(self.width(), self.height()) - - if n > 0: - # down - res.blit(self, 0, 0, self.width(), self.height() - n, 0, n) - else: - # up - if self.__valid_pos(0, abs(n)): - res.blit(self, 0, abs(n), self.width(), self.height() - abs(n), 0, 0) - - return res - - def __shift_horizontal(self, n): - res = Image(self.width(), self.height()) - if n > 0: - # right - res.blit(self, 0, 0, self.width() - n, self.height(), n, 0) - else: - # left - if self.__valid_pos(abs(n), 0): - res.blit(self, abs(n), 0, self.width() - abs(n), self.height(), 0, 0) - - return res - - def __create_string(self): - ret_str = "" - for index_y in range(self.height()): - ret_str += self.__row_to_str(index_y) - return ret_str - - def __row_to_str(self, y): - new_str = "" - for x in range(self.width()): - new_str += str(self.get_pixel(x, y)) - - new_str += ":" - - return new_str - - @staticmethod - def __append_images(images): - width = 0 - height = 0 - for image in images: - width += image.width() - height = max(height, image.height()) - res = Image(width, height) - x_ind = 0 - for image in images: - res.blit(image, 0, 0, image.width(), image.height(), xdest=x_ind) - x_ind += image.width() - return res - - @staticmethod - def __same_image(i1, i2): - if i1.width() != i2.width() or i1.height() != i2.height(): - return False - for y in range(i1.height()): - for x in range(i1.width()): - if i1.get_pixel(x, y) != i2.get_pixel(x, y): - return False - return True - - -# This is for generating functions like Image.HEART -# that return a new read-only Image -def create_const_func(func_name): - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_IMAGE_STATIC) - - def func(*args): - const_instance = Image(CONSTANTS.IMAGE_PATTERNS[func_name]) - const_instance.read_only = True - return const_instance - - func.__name__ = func_name - return ProducerProperty(func) - - -# for attributes like Image.ALL_CLOCKS -# that return tuples -def create_const_list_func(func_name): - def func(*args): - collection_names = CONSTANTS.IMAGE_TUPLE_LOOKUP[func_name] - ret_list = [] - for image_name in collection_names: - const_instance = Image(CONSTANTS.IMAGE_PATTERNS[image_name]) - const_instance.read_only = True - ret_list.append(const_instance) - - return tuple(ret_list) - - func.__name__ = func_name - return ProducerProperty(func) - - -for name in CONSTANTS.IMAGE_PATTERNS.keys(): - setattr(Image, name, create_const_func(name)) - -for name in CONSTANTS.IMAGE_TUPLE_LOOKUP.keys(): - setattr(Image, name, create_const_list_func(name)) diff --git a/src/micropython/microbit/__model/microbit_model.py b/src/micropython/microbit/__model/microbit_model.py deleted file mode 100644 index 1f78e35ae..000000000 --- a/src/micropython/microbit/__model/microbit_model.py +++ /dev/null @@ -1,98 +0,0 @@ -import time - -from common import utils -from .accelerometer import Accelerometer -from .button import Button -from .compass import Compass -from .display import Display -from .i2c import I2c -from .spi import SPI -from . import constants as CONSTANTS - - -class MicrobitModel: - def __init__(self): - # State in the Python process - self.accelerometer = Accelerometer() - self.button_a = Button() - self.button_b = Button() - self.compass = Compass() - self.display = Display() - self.i2c = I2c() - self.spi = SPI() - - self.__start_time = time.time() - self.__temperature = 0 - self.__microbit_button_dict = { - "button_a": self.button_a, - "button_b": self.button_b, - } - - def panic(self, n): - # Due to the shim, there is another call frame. - utils.print_for_unimplemented_functions(MicrobitModel.panic.__name__) - - def reset(self): - # Due to the shim, there is another call frame. - utils.print_for_unimplemented_functions(MicrobitModel.reset.__name__) - - def sleep(self, n): - time.sleep(n / 1000) - - def running_time(self): - print(f"time. time: {time.time()}") - return time.time() - self.__start_time - - def temperature(self): - return self.__temperature - - def __set_temperature(self, temperature): - if ( - temperature < CONSTANTS.MIN_TEMPERATURE - or temperature > CONSTANTS.MAX_TEMPERATURE - ): - raise ValueError(CONSTANTS.INVALID_TEMPERATURE_ERR) - else: - self.__temperature = temperature - - def update_state(self, new_state): - self.__update_buttons(new_state) - self.__update_motion(new_state) - self.__update_light(new_state) - self.__update_temp(new_state) - self.__update_gesture(new_state) - - # helpers - def __update_buttons(self, new_state): - # get button pushes - for button_name in CONSTANTS.EXPECTED_INPUT_BUTTONS: - button = self.__microbit_button_dict[button_name] - button._Button__update(new_state.get(button_name)) - - def __update_motion(self, new_state): - # set motion_x, motion_y, motion_z - for name, direction in CONSTANTS.EXPECTED_INPUT_ACCEL.items(): - self.accelerometer._Accelerometer__update_motion( - direction, new_state.get(name) - ) - - def __update_light(self, new_state): - # set light level - new_light_level = new_state.get(CONSTANTS.EXPECTED_INPUT_LIGHT) - self.display._Display__update_light_level(new_light_level) - - def __update_temp(self, new_state): - # set temperature - new_temp = new_state.get(CONSTANTS.EXPECTED_INPUT_TEMP) - if new_temp is not None: - previous_temp = self.temperature() - if new_temp != previous_temp: - self._MicrobitModel__set_temperature(new_temp) - - def __update_gesture(self, new_state): - # set gesture - new_gesture = new_state.get(CONSTANTS.EXPECTED_INPUT_GESTURE) - self.accelerometer._Accelerometer__update_gesture(new_gesture) - - -__mb = MicrobitModel() diff --git a/src/micropython/microbit/__model/producer_property.py b/src/micropython/microbit/__model/producer_property.py deleted file mode 100644 index f67f23261..000000000 --- a/src/micropython/microbit/__model/producer_property.py +++ /dev/null @@ -1,3 +0,0 @@ -class ProducerProperty(property): - def __get__(self, cls, owner): - return classmethod(self.fget).__get__(cls, owner)() diff --git a/src/micropython/microbit/__model/spi.py b/src/micropython/microbit/__model/spi.py deleted file mode 100644 index d455e30b0..000000000 --- a/src/micropython/microbit/__model/spi.py +++ /dev/null @@ -1,66 +0,0 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - - -class SPI: - # The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/spi.html. - def init( - baudrate=1000000, bits=8, mode=0, sclk="pin13", mosi="pin15", miso="pin14" - ): - """ - This function is not implemented in the simulator. - - Initialize SPI communication with the specified parameters on the - specified ``pins``. Note that for correct communication, the parameters - have to be the same on both communicating devices. - - The ``baudrate`` defines the speed of communication. - - The ``bits`` defines the size of bytes being transmitted. Currently only - ``bits=8`` is supported. However, this may change in the future. - - The ``mode`` determines the combination of clock polarity and phase - according to the following convention, with polarity as the high order bit - and phase as the low order bit: - - Polarity (aka CPOL) 0 means that the clock is at logic value 0 when idle - and goes high (logic value 1) when active; polarity 1 means the clock is - at logic value 1 when idle and goes low (logic value 0) when active. Phase - (aka CPHA) 0 means that data is sampled on the leading edge of the clock, - and 1 means on the trailing edge. - - The ``sclk``, ``mosi`` and ``miso`` arguments specify the pins to use for - each type of signal. - """ - utils.print_for_unimplemented_functions(SPI.init.__qualname__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPI) - - def read(self, nbytes): - """ - This function is not implemented in the simulator. - - Read at most ``nbytes``. Returns what was read. - """ - utils.print_for_unimplemented_functions(SPI.read.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPI) - - def write(self, buffer): - """ - This function is not implemented in the simulator. - - Write the ``buffer`` of bytes to the bus. - """ - utils.print_for_unimplemented_functions(SPI.write.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPI) - - def write_readinto(self, out, in_): - """ - This function is not implemented in the simulator. - - Write the ``out`` buffer to the bus and read any response into the ``in_`` - buffer. The length of the buffers should be the same. The buffers can be - the same object. - """ - utils.print_for_unimplemented_functions(SPI.write_readinto.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPI) diff --git a/src/micropython/microbit/test/__init__.py b/src/micropython/microbit/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/micropython/microbit/test/test_accelerometer.py b/src/micropython/microbit/test/test_accelerometer.py deleted file mode 100644 index 241f63df1..000000000 --- a/src/micropython/microbit/test/test_accelerometer.py +++ /dev/null @@ -1,104 +0,0 @@ -import pytest -from unittest import mock - -from ..__model.accelerometer import Accelerometer -from ..__model import constants as CONSTANTS - - -class TestAccelerometer(object): - def setup_method(self): - self.accelerometer = Accelerometer() - - @pytest.mark.parametrize( - "accel", - [ - CONSTANTS.MIN_ACCELERATION, - CONSTANTS.MIN_ACCELERATION + 1, - 100, - CONSTANTS.MAX_ACCELERATION - 1, - CONSTANTS.MAX_ACCELERATION, - ], - ) - def test_x_y_z(self, accel): - self.accelerometer._Accelerometer__set_accel("x", accel) - assert accel == self.accelerometer.get_x() - self.accelerometer._Accelerometer__set_accel("y", accel) - assert accel == self.accelerometer.get_y() - self.accelerometer._Accelerometer__set_accel("z", accel) - assert accel == self.accelerometer.get_z() - - @pytest.mark.parametrize("axis", ["x", "y", "z"]) - def test_x_y_z_invalid_accel(self, axis): - with pytest.raises(ValueError): - self.accelerometer._Accelerometer__set_accel( - axis, CONSTANTS.MAX_ACCELERATION + 1 - ) - with pytest.raises(ValueError): - self.accelerometer._Accelerometer__set_accel( - axis, CONSTANTS.MIN_ACCELERATION - 1 - ) - - @pytest.mark.parametrize( - "accels", - [ - (23, 25, 26), - (204, 234, -534), - (CONSTANTS.MIN_ACCELERATION + 10, 234, CONSTANTS.MAX_ACCELERATION), - ], - ) - def test_get_values(self, accels): - self.accelerometer._Accelerometer__set_accel("x", accels[0]) - self.accelerometer._Accelerometer__set_accel("y", accels[1]) - self.accelerometer._Accelerometer__set_accel("z", accels[2]) - assert accels == self.accelerometer.get_values() - - @pytest.mark.parametrize("gesture", ["up", "face down", "freefall", "8g"]) - def test_current_gesture(self, gesture): - self.accelerometer._Accelerometer__set_gesture(gesture) - assert gesture == self.accelerometer.current_gesture() - - @pytest.mark.parametrize("gesture", ["up", "face down", "freefall", "8g"]) - def test_is_gesture(self, gesture): - self.accelerometer._Accelerometer__set_gesture(gesture) - assert self.accelerometer.is_gesture(gesture) - for g in CONSTANTS.GESTURES: - if g != gesture: - assert not self.accelerometer.is_gesture(g) - - def test_is_gesture_error(self): - with pytest.raises(ValueError): - self.accelerometer.is_gesture("sideways") - - def test_was_gesture(self): - mock_gesture_up = "up" - mock_gesture_down = "down" - - assert not self.accelerometer.was_gesture(mock_gesture_up) - self.accelerometer._Accelerometer__set_gesture(mock_gesture_up) - self.accelerometer.current_gesture() # Call is needed for gesture detection so it can be added to the lists. - self.accelerometer._Accelerometer__set_gesture("") - assert self.accelerometer.was_gesture(mock_gesture_up) - assert not self.accelerometer.was_gesture(mock_gesture_up) - - def test_was_gesture_error(self): - with pytest.raises(ValueError): - self.accelerometer.was_gesture("sideways") - - def test_get_gestures(self): - mock_gesture_up = "up" - mock_gesture_down = "down" - mock_gesture_freefall = "freefall" - - self.accelerometer._Accelerometer__set_gesture(mock_gesture_up) - self.accelerometer.current_gesture() # Call is needed for gesture detection so it can be added to the lists. - self.accelerometer._Accelerometer__set_gesture(mock_gesture_down) - self.accelerometer.current_gesture() - self.accelerometer._Accelerometer__set_gesture(mock_gesture_freefall) - self.accelerometer.current_gesture() - self.accelerometer._Accelerometer__set_gesture("") - assert ( - mock_gesture_up, - mock_gesture_down, - mock_gesture_freefall, - ) == self.accelerometer.get_gestures() - assert () == self.accelerometer.get_gestures() diff --git a/src/micropython/microbit/test/test_button.py b/src/micropython/microbit/test/test_button.py deleted file mode 100644 index 31e9d6720..000000000 --- a/src/micropython/microbit/test/test_button.py +++ /dev/null @@ -1,46 +0,0 @@ -import pytest -from ..__model.button import Button - - -class TestButton(object): - def setup_method(self): - self.button = Button() - - def test_press_down(self): - self.button._Button__press_down() - assert self.button._Button__presses == 1 - assert self.button._Button__pressed - assert self.button._Button__prev_pressed - self.button._Button__press_down() - assert self.button._Button__presses == 2 - assert self.button._Button__pressed - assert self.button._Button__prev_pressed - - def test_release(self): - self.button._Button__pressed = True - self.button._Button__prev_pressed = False - self.button._Button__release() - assert not self.button._Button__pressed - - def test_is_pressed(self): - assert not self.button.is_pressed() - self.button._Button__press_down() - assert self.button.is_pressed() - - def test_was_pressed(self): - assert not self.button.was_pressed() - self.button._Button__press_down() - self.button._Button__release() - assert self.button.was_pressed() - # Button resets __prev_pressed after was_pressed() is called. - assert not self.button.was_pressed() - - @pytest.mark.parametrize("presses", [1, 2, 4]) - def test_get_presses(self, presses): - assert 0 == self.button.get_presses() - for i in range(presses): - self.button._Button__press_down() - self.button._Button__release() - assert presses == self.button.get_presses() - # Presses is reset to 0 after get_presses() is called. - assert 0 == self.button.get_presses() diff --git a/src/micropython/microbit/test/test_display.py b/src/micropython/microbit/test/test_display.py deleted file mode 100644 index 1055c8870..000000000 --- a/src/micropython/microbit/test/test_display.py +++ /dev/null @@ -1,185 +0,0 @@ -import pytest -import threading -from unittest import mock -from common import utils - -from ..__model import constants as CONSTANTS -from ..__model.display import Display -from ..__model.image import Image - - -STR_A = "09900:90090:99990:90090:90090" -STR_QUESTION_MARK = "09990:90009:00990:00000:00900" -STR_EXCLAMATION_MARK = "09000:09000:09000:00000:09000:" -STR_SIX = "00090:00900:09990:90009:09990" - - -class TestDisplay(object): - def setup_method(self): - self.display = Display() - utils.send_to_simulator = mock.Mock() - - @pytest.mark.parametrize("x, y, brightness", [(1, 1, 4), (2, 3, 6), (4, 4, 9)]) - def test_set_and_get_pixel(self, x, y, brightness): - self.display.set_pixel(x, y, brightness) - assert brightness == self.display.get_pixel(x, y) - - @pytest.mark.parametrize("x, y", [(5, 0), (0, -1), (0, 5)]) - def test_get_pixel_error(self, x, y): - with pytest.raises(ValueError, match=CONSTANTS.INDEX_ERR): - self.display.get_pixel(x, y) - - @pytest.mark.parametrize( - "x, y, brightness, err_msg", - [ - (5, 0, 0, CONSTANTS.INDEX_ERR), - (0, -1, 0, CONSTANTS.INDEX_ERR), - (0, 0, -1, CONSTANTS.BRIGHTNESS_ERR), - ], - ) - def test_set_pixel_error(self, x, y, brightness, err_msg): - with pytest.raises(ValueError, match=err_msg): - self.display.set_pixel(x, y, brightness) - - def test_clear(self): - self.display.set_pixel(2, 3, 7) - self.display.set_pixel(3, 4, 6) - self.display.set_pixel(4, 4, 9) - assert not self.__is_clear() - self.display.clear() - assert self.__is_clear() - - def test_on_off(self): - self.display.on() - assert self.display.is_on() - self.display.off() - assert not self.display.is_on() - - def test_show_one_image(self): - img = Image() - img.set_pixel(0, 0, 8) - img.set_pixel(0, 1, 9) - img.set_pixel(0, 2, 7) - img.set_pixel(2, 2, 6) - self.display.show(img, delay=0) - assert Image._Image__same_image(img, self.display._Display__image) - - def test_show_different_size_image(self): - img = Image(3, 7) - img.set_pixel(1, 1, 9) - img.set_pixel(2, 6, 9) # Will not be on display - expected = Image(5, 5) - expected.set_pixel(1, 1, 9) - self.display.show(img, delay=0) - assert Image._Image__same_image(expected, self.display._Display__image) - - def test_show_smaller_image(self): - img = Image(2, 2) - img.set_pixel(1, 1, 9) - expected = Image(5, 5) - expected.set_pixel(1, 1, 9) - self.display.show(img, delay=0) - assert Image._Image__same_image(expected, self.display._Display__image) - - @pytest.mark.parametrize( - "value, expected_str", - [ - ("!", STR_EXCLAMATION_MARK), - ("A", STR_A), - (" ", CONSTANTS.BLANK_5X5), - (6, STR_SIX), - ("\x7F", STR_QUESTION_MARK), # Character is out of our ASCII range - ], - ) - def test_show_char(self, value, expected_str): - expected = Image(expected_str) - self.display.show(value, delay=0) - assert Image._Image__same_image(expected, self.display._Display__image) - - def test_show_char_with_clear(self): - image = Image(STR_EXCLAMATION_MARK) - self.display.show(image, delay=0, clear=True) - assert self.__is_clear() - - def test_show_iterable(self): - expected = Image(STR_A) - value = [Image(STR_EXCLAMATION_MARK), "A", "ab"] - self.display.show(value, delay=0) - assert Image._Image__same_image(expected, self.display._Display__image) - - def test_show_non_iterable(self): - with pytest.raises(TypeError): - self.display.show(TestDisplay()) - - def test_scroll(self): - self.display.scroll("a b") - self.__is_clear() - - def test_scroll_type_error(self): - with pytest.raises(TypeError): - self.display.scroll(["a", 1]) - - # Should change these threaded tests to test behaviour in the future - def test_show_threaded(self): - threading.Thread = mock.Mock() - self.display.show("a", delay=0, wait=False) - threading.Thread.assert_called_once() - - def test_scroll_threaded(self): - threading.Thread = mock.Mock() - self.display.scroll("test", delay=0, wait=False) - threading.Thread.assert_called_once() - - def test_get_array(self): - self.display.set_pixel(3, 3, 3) - self.display.off() - assert self.display._Display__get_array() == [ - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - ] - - self.display.on() - assert self.display._Display__get_array() == [ - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 3, 0], - [0, 0, 0, 0, 0], - ] - - # The second show call should immedaitely stop the first show call. - # Therefore the final result of display should be 6. - def test_async_tests(self): - self.display.show("MMMMMMMMMMMMMM", delay=100, wait=False) - self.display.show("6", delay=0) - assert Image._Image__same_image(Image(STR_SIX), self.display._Display__image) - - @pytest.mark.parametrize( - "light_level", - [ - CONSTANTS.MIN_LIGHT_LEVEL, - CONSTANTS.MIN_LIGHT_LEVEL + 1, - 100, - CONSTANTS.MAX_LIGHT_LEVEL - 1, - CONSTANTS.MAX_LIGHT_LEVEL, - ], - ) - def test_light_level(self, light_level): - self.display._Display__set_light_level(light_level) - assert light_level == self.display.read_light_level() - - @pytest.mark.parametrize( - "invalid_light_level", - [CONSTANTS.MIN_LIGHT_LEVEL - 1, CONSTANTS.MAX_LIGHT_LEVEL + 1], - ) - def test_invalid_light_level(self, invalid_light_level): - with pytest.raises(ValueError): - self.display._Display__set_light_level(invalid_light_level) - - # Helpers - def __is_clear(self): - i = Image(CONSTANTS.BLANK_5X5) - return Image._Image__same_image(i, self.display._Display__image) diff --git a/src/micropython/microbit/test/test_image.py b/src/micropython/microbit/test/test_image.py deleted file mode 100644 index 5ea150230..000000000 --- a/src/micropython/microbit/test/test_image.py +++ /dev/null @@ -1,283 +0,0 @@ -import pytest -from ..__model.image import Image - -from ..__model import constants as CONSTANTS - - -class TestImage(object): - def setup_method(self): - self.image = Image() - self.image_heart = Image(CONSTANTS.IMAGE_PATTERNS["HEART"]) - - @pytest.mark.parametrize("x, y, brightness", [(1, 1, 4), (2, 3, 6), (4, 4, 9)]) - def test_get_set_pixel(self, x, y, brightness): - self.image.set_pixel(x, y, brightness) - assert brightness == self.image.get_pixel(x, y) - - @pytest.mark.parametrize("x, y", [(5, 0), (0, -1), (0, 5)]) - def test_get_pixel_error(self, x, y): - with pytest.raises(ValueError, match=CONSTANTS.INDEX_ERR): - self.image.get_pixel(x, y) - - @pytest.mark.parametrize( - "x, y, brightness, err_msg", - [ - (5, 0, 0, CONSTANTS.INDEX_ERR), - (0, -1, 0, CONSTANTS.INDEX_ERR), - (0, 0, -1, CONSTANTS.BRIGHTNESS_ERR), - ], - ) - def test_set_pixel_error(self, x, y, brightness, err_msg): - with pytest.raises(ValueError, match=err_msg): - self.image.set_pixel(x, y, brightness) - - @pytest.mark.parametrize( - "image, height, width", - [ - (Image(), 5, 5), - (Image(3, 3), 3, 3), - (Image(""), 0, 0), - (Image("00:00000"), 2, 5), - (Image("0000:0000"), 2, 4), - ], - ) - def test_width_and_height(self, image, height, width): - print(str(image)) - assert image.height() == height - assert image.width() == width - - @pytest.mark.parametrize( - "x, y, w, h, x_dest, y_dest, actual", - [ - (0, 0, 3, 2, 2, 1, Image("00000:00090:00999:00000:00000:")), - (0, 0, 3, 3, 8, 8, Image("00000:00000:00000:00000:00000:")), - (3, 0, 3, 3, 0, 0, Image("90000:99000:99000:00000:00000:")), - (3, 0, 7, 7, 0, 0, Image("90000:99000:99000:90000:00000:")), - ], - ) - def test_blit_heart(self, x, y, w, h, x_dest, y_dest, actual): - result = Image() - result.blit(self.image_heart, x, y, w, h, x_dest, y_dest) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "x, y, w, h, x_dest, y_dest, actual", - [ - (1, 1, 2, 4, 3, 3, Image("09090:99999:99999:09999:00999:")), - (0, 0, 3, 3, 8, 8, Image(CONSTANTS.IMAGE_PATTERNS["HEART"])), - (0, 0, 7, 7, 0, 0, Image(CONSTANTS.IMAGE_PATTERNS["HEART"])), - (3, 0, 7, 7, 0, 0, Image("90000:99000:99000:90000:00000:")), - ], - ) - def test_blit_heart_nonblank(self, x, y, w, h, x_dest, y_dest, actual): - result = Image(CONSTANTS.IMAGE_PATTERNS["HEART"]) - src = Image(CONSTANTS.IMAGE_PATTERNS["HEART"]) - result.blit(src, x, y, w, h, x_dest, y_dest) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "x, y, w, h, x_dest, y_dest", [(5, 6, 2, 4, 3, 3), (5, 0, 3, 3, 8, 8)] - ) - def test_blit_heart_valueerror(self, x, y, w, h, x_dest, y_dest): - result = Image(CONSTANTS.IMAGE_PATTERNS["HEART"]) - with pytest.raises(ValueError, match=CONSTANTS.INDEX_ERR): - result.blit(self.image_heart, x, y, w, h, x_dest, y_dest) - - @pytest.mark.parametrize( - "image1, image2", [(Image(2, 2, bytearray([4, 4, 4, 4])), Image("44:44"))] - ) - def test_constructor_bytearray(self, image1, image2): - assert image1._Image__LED == image2._Image__LED - - @pytest.mark.parametrize( - "x, y, w, h, actual", [(1, 1, 2, 4, Image("99:99:99:09:"))] - ) - def test_crop_heart(self, x, y, w, h, actual): - result = self.image_heart.crop(1, 1, 2, 4) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, actual", [(Image("99:99:99:00:"), Image("22:22:22:22:"))] - ) - def test_fill(self, target, actual): - target.fill(2) - assert target._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, actual", [(Image("012:345:678:900:"), Image("987:654:321:099:"))] - ) - def test_invert(self, target, actual): - target.invert() - assert target._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, value, actual", - [ - (Image("012:345:678:900:"), 1, Image("001:034:067:090:")), - (Image("012:345:678:900:"), 6, Image("000:000:000:000:")), - (Image("012:345:678:900:"), -1, Image("120:450:780:000:")), - ], - ) - def test_shift_right(self, target, value, actual): - result = target.shift_right(value) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, value, actual", - [ - (Image("012:345:678:900:"), 2, Image("200:500:800:000:")), - (Image("012:345:678:900:"), 6, Image("000:000:000:000:")), - (Image("012:345:678:900:"), -2, Image("000:003:006:009:")), - ], - ) - def test_shift_left(self, target, value, actual): - result = target.shift_left(value) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, value, actual", - [ - (Image("012:345:678:900:"), 2, Image("678:900:000:000:")), - (Image("012:345:678:900:"), 6, Image("000:000:000:000:")), - (Image("012:345:678:900:"), -2, Image("000:000:012:345:")), - ], - ) - def test_shift_up(self, target, value, actual): - result = target.shift_up(value) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, value, actual", - [ - (Image("012:345:678:900:"), 1, Image("000:012:345:678")), - (Image("012:345:678:900:"), 6, Image("000:000:000:000:")), - (Image("012:345:678:900:"), -1, Image("345:678:900:000:")), - ], - ) - def test_shift_down(self, target, value, actual): - result = target.shift_down(value) - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize("target", [(Image("012:345:678:900:"))]) - def test_copy(self, target): - result = target.copy() - assert result._Image__LED == target._Image__LED - - @pytest.mark.parametrize( - "target, multiplier, actual", - [ - (Image("012:345:678:900:"), 2, Image("024:689:999:900:")), - (Image("012:345:678:900:"), 0, Image("000:000:000:000:")), - ], - ) - def test_multiply(self, target, multiplier, actual): - result = target * multiplier - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, multiplier", - [ - (Image("012:345:678:900:"), []), - (Image("012:345:678:900:"), Image("000:000:000:000:")), - ], - ) - def test_multiply_error(self, target, multiplier): - - with pytest.raises( - TypeError, match=f"can't convert {type(multiplier)} to float" - ): - target * multiplier - - @pytest.mark.parametrize( - "target, value, actual", - [ - ( - Image("012:345:678:900:"), - Image("024:689:999:900:"), - Image("036:999:999:900:"), - ), - ( - Image("999:999:999:000:"), - Image("999:999:999:000:"), - Image("999:999:999:000:"), - ), - ], - ) - def test_add(self, target, value, actual): - result = target + value - assert result._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "target, value, err_message", - [ - ( - Image("012:345:678:900:"), - 2, - CONSTANTS.UNSUPPORTED_ADD_TYPE + f"'{type(Image())}', '{type(2)}'", - ), - ( - Image("012:345:678:900:"), - [], - CONSTANTS.UNSUPPORTED_ADD_TYPE + f"'{type(Image())}', '{type([])}'", - ), - ], - ) - def test_add_typeerror(self, target, value, err_message): - with pytest.raises(TypeError, match=err_message): - target + value - - @pytest.mark.parametrize( - "target, value", [(Image(2, 3), Image(3, 3)), (Image(2, 1), Image(0, 0))] - ) - def test_add_valueerror(self, target, value): - with pytest.raises(ValueError, match=CONSTANTS.SAME_SIZE_ERR): - target + value - - @pytest.mark.parametrize( - "initial, actual", - [ - (Image("0:000:00:0000:"), Image("0000:0000:0000:0000:")), - (Image("12125:1212:12:1:"), Image("12125:12120:12000:10000:")), - ], - ) - def test_uneven_strings(self, initial, actual): - assert initial._Image__LED == actual._Image__LED - - @pytest.mark.parametrize( - "image, repr_actual, str_actual", - [ - ( - Image("05150:05050:05050:99999:09990:"), - "Image('05150:05050:05050:99999:09990:')", - "Image('\n 05150:\n 05050:\n 05050:\n 99999:\n 09990:\n')", - ), - (Image(""), "Image('')", "Image('\n')"), - ( - Image("00000:00000:00000:00000:00000:"), - "Image('00000:00000:00000:00000:00000:')", - "Image('\n 00000:\n 00000:\n 00000:\n 00000:\n 00000:\n')", - ), - ( - Image("00:00:00:00:"), - "Image('00:00:00:00:')", - "Image('\n 00:\n 00:\n 00:\n 00:\n')", - ), - ], - ) - def test_str(self, image, repr_actual, str_actual): - repr_output = repr(image) - str_output = str(image) - assert repr_actual == repr_output - assert str_actual == str_output - - @pytest.mark.parametrize( - "const, actual", - [ - (Image.SNAKE, Image(CONSTANTS.IMAGE_PATTERNS["SNAKE"])), - (Image.PITCHFORK, Image(CONSTANTS.IMAGE_PATTERNS["PITCHFORK"])), - ], - ) - def test_image_constants(self, const, actual): - assert const._Image__LED == actual._Image__LED - with pytest.raises(TypeError, match=CONSTANTS.COPY_ERR_MESSAGE): - const.set_pixel(0, 0, 5) diff --git a/src/micropython/microbit/test/test_init.py b/src/micropython/microbit/test/test_init.py deleted file mode 100644 index aebbc805a..000000000 --- a/src/micropython/microbit/test/test_init.py +++ /dev/null @@ -1,45 +0,0 @@ -import time - -import pytest -from unittest import mock - -from .. import * -from ..__model.microbit_model import MicrobitModel - -# tests methods in __init__.py - - -class TestShim(object): - def test_sleep(self): - # Save pointer to function about to be mocked - real_function = MicrobitModel.sleep - - milliseconds = 100 - MicrobitModel.sleep = mock.Mock() - sleep(milliseconds) - MicrobitModel.sleep.assert_called_with(milliseconds) - - # Restore original function - MicrobitModel.sleep = real_function - - def test_running_time(self): - # Save pointer to function about to be mocked - real_function = MicrobitModel.running_time - - MicrobitModel.running_time = mock.Mock() - running_time() - MicrobitModel.running_time.assert_called_once() - - # Restore original function - MicrobitModel.running_time = real_function - - def test_temperature(self): - # Save pointer to function about to be mocked - real_function = MicrobitModel.temperature - - MicrobitModel.temperature = mock.Mock() - temperature() - MicrobitModel.temperature.asser_called_once() - - # Restore original function - MicrobitModel.temperature = real_function diff --git a/src/micropython/microbit/test/test_microbit_model.py b/src/micropython/microbit/test/test_microbit_model.py deleted file mode 100644 index 4e06c6c36..000000000 --- a/src/micropython/microbit/test/test_microbit_model.py +++ /dev/null @@ -1,48 +0,0 @@ -import time - -import pytest -from unittest import mock -from ..__model import constants as CONSTANTS -from ..__model.microbit_model import MicrobitModel - - -class TestMicrobitModel(object): - def setup_method(self): - self.__mb = MicrobitModel() - - @pytest.mark.parametrize("value", [9, 30, 1999]) - def test_sleep(self, value): - time.sleep = mock.Mock() - self.__mb.sleep(value) - time.sleep.assert_called_with(value / 1000) - - def test_running_time(self): - mock_start_time = 10 - mock_end_time = 300 - self.__mb._MicrobitModel__start_time = mock_start_time - time.time = mock.MagicMock(return_value=mock_end_time) - assert mock_end_time - mock_start_time == pytest.approx( - self.__mb.running_time() - ) - - @pytest.mark.parametrize( - "temperature", - [ - CONSTANTS.MIN_TEMPERATURE, - CONSTANTS.MIN_TEMPERATURE + 1, - 0, - CONSTANTS.MAX_TEMPERATURE - 1, - CONSTANTS.MAX_TEMPERATURE, - ], - ) - def test_temperature(self, temperature): - self.__mb._MicrobitModel__set_temperature(temperature) - assert temperature == self.__mb.temperature() - - @pytest.mark.parametrize( - "invalid_temperature", - [CONSTANTS.MIN_TEMPERATURE - 1, CONSTANTS.MAX_TEMPERATURE + 1], - ) - def test_invalid_temperature(self, invalid_temperature): - with pytest.raises(ValueError): - self.__mb._MicrobitModel__set_temperature(invalid_temperature) diff --git a/src/micropython/music.py b/src/micropython/music.py deleted file mode 100644 index ad25816a6..000000000 --- a/src/micropython/music.py +++ /dev/null @@ -1,109 +0,0 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/music.html. - - -def set_tempo(ticks=4, bpm=120): - """ - This function is not implemented in the simulator. - - Sets the approximate tempo for playback. - - A number of ticks (expressed as an integer) constitute a beat. Each beat is to be played at a certain frequency per minute (expressed as the more familiar BPM - beats per minute - also as an integer). - - Suggested default values allow the following useful behaviour: - - * ``music.set_tempo()`` - reset the tempo to default of ticks = 4, bpm = 120 - * ``music.set_tempo(ticks=8)`` - change the "definition" of a beat - * ``music.set_tempo(bpm=180)`` - just change the tempo - - To work out the length of a tick in milliseconds is very simple arithmetic: ``60000/bpm/ticks_per_beat`` . For the default values that's ``60000/120/4 = 125 milliseconds`` or ``1 beat = 500 milliseconds``. - """ - utils.print_for_unimplemented_functions(set_tempo.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def get_tempo(): - """ - This function is not implemented in the simulator. - - Gets the current tempo as a tuple of integers: ``(ticks, bpm)``. - """ - utils.print_for_unimplemented_functions(get_tempo.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def play(music, pin="microbit.pin0", wait=True, loop=False): - """ - This function is not implemented in the simulator. - - Plays ``music`` containing the musical DSL defined above. - - If ``music`` is a string it is expected to be a single note such as, - ``'c1:4'``. - - If ``music`` is specified as a list of notes (as defined in the section on - the musical DSL, above) then they are played one after the other to perform - a melody. - - In both cases, the ``duration`` and ``octave`` values are reset to - their defaults before the music (whatever it may be) is played. - - An optional argument to specify the output pin can be used to override the - default of ``microbit.pin0``. - - If ``wait`` is set to ``True``, this function is blocking. - - If ``loop`` is set to ``True``, the tune repeats until ``stop`` is called - (see below) or the blocking call is interrupted. - """ - utils.print_for_unimplemented_functions(play.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def pitch(frequency, duration=-1, pin="microbit.pin0", wait=True): - """ - This function is not implemented in the simulator. - - Plays a pitch at the integer frequency given for the specified number of - milliseconds. For example, if the frequency is set to 440 and the length to - 1000 then we hear a standard concert A for one second. - - Note that you can only play one pitch on one pin at any one time. - - If ``wait`` is set to ``True``, this function is blocking. - - If ``duration`` is negative the pitch is played continuously until either the - blocking call is interrupted or, in the case of a background call, a new - frequency is set or ``stop`` is called (see below). - """ - utils.print_for_unimplemented_functions(pitch.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def stop(pin="microbit.pin0"): - """ - This function is not implemented in the simulator. - - Stops all music playback on a given pin, eg. ``music.stop(pin1)``. - If no pin is given, eg. ``music.stop()`` pin0 is assumed. - """ - utils.print_for_unimplemented_functions(stop.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) - - -def reset(): - """ - This function is not implemented in the simulator. - - Resets the state of the following attributes in the following way: - - * ``ticks = 4`` - * ``bpm = 120`` - * ``duration = 4`` - * ``octave = 4`` - """ - utils.print_for_unimplemented_functions(reset.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_MUSIC) diff --git a/src/micropython/radio.py b/src/micropython/radio.py deleted file mode 100644 index ac6d24fe3..000000000 --- a/src/micropython/radio.py +++ /dev/null @@ -1,180 +0,0 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/radio.html. - -RATE_250KBIT = "" - -RATE_1MBIT = "" - -RATE_2MBIT = "" - - -def on(): - """ - This function is not implemented in the simulator. - - Turns the radio on. This needs to be explicitly called since the radio - draws power and takes up memory that you may otherwise need. - """ - utils.print_for_unimplemented_functions(on.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def off(): - """ - This function is not implemented in the simulator. - - Turns off the radio, thus saving power and memory - """ - utils.print_for_unimplemented_functions(off.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def config(**kwargs): - """ - This function is not implemented in the simulator. - - Configures various keyword based settings relating to the radio. The - available settings and their sensible default values are listed below. - - The ``length`` (default=32) defines the maximum length, in bytes, of a - message sent via the radio. It can be up to 251 bytes long (254 - 3 bytes - for S0, LENGTH and S1 preamble). - - The ``queue`` (default=3) specifies the number of messages that can be - stored on the incoming message queue. If there are no spaces left on the - queue for incoming messages, then the incoming message is dropped. - - The ``channel`` (default=7) can be an integer value from 0 to 83 - (inclusive) that defines an arbitrary "channel" to which the radio is - tuned. Messages will be sent via this channel and only messages received - via this channel will be put onto the incoming message queue. Each step is - 1MHz wide, based at 2400MHz. - - The ``power`` (default=6) is an integer value from 0 to 7 (inclusive) to - indicate the strength of signal used when broadcasting a message. The - higher the value the stronger the signal, but the more power is consumed - by the device. The numbering translates to positions in the following list - of dBm (decibel milliwatt) values: -30, -20, -16, -12, -8, -4, 0, 4. - - The ``address`` (default=0x75626974) is an arbitrary name, expressed as a - 32-bit address, that's used to filter incoming packets at the hardware - level, keeping only those that match the address you set. The default used - by other micro:bit related platforms is the default setting used here. - - The ``group`` (default=0) is an 8-bit value (0-255) used with the - ``address`` when filtering messages. Conceptually, "address" is like a - house/office address and "group" is like the person at that address to - which you want to send your message. - - The ``data_rate`` (default=radio.RATE_1MBIT) indicates the speed at which - data throughput takes place. Can be one of the following contants defined - in the ``radio`` module : ``RATE_250KBIT``, ``RATE_1MBIT`` or - ``RATE_2MBIT``. - - If ``config`` is not called then the defaults described above are assumed. - """ - utils.print_for_unimplemented_functions(config.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def reset(): - """ - This function is not implemented in the simulator. - - Reset the settings to their default values (as listed in the documentation - for the ``config`` function above). - """ - utils.print_for_unimplemented_functions(reset.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def send_bytes(message): - """ - This function is not implemented in the simulator. - - Sends a message containing bytes. - """ - utils.print_for_unimplemented_functions(send_bytes.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def receive_bytes(): - """ - This function is not implemented in the simulator. - - Receive the next incoming message on the message queue. Returns ``None`` if - there are no pending messages. Messages are returned as bytes. - """ - utils.print_for_unimplemented_functions(receive_bytes.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def receive_bytes_into(buffer): - """ - This function is not implemented in the simulator. - - Receive the next incoming message on the message queue. Copies the message - into ``buffer``, trimming the end of the message if necessary. - Returns ``None`` if there are no pending messages, otherwise it returns the length - of the message (which might be more than the length of the buffer). - """ - utils.print_for_unimplemented_functions(receive_bytes_into.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def send(message): - """ - This function is not implemented in the simulator. - - Sends a message containing bytes. - """ - utils.print_for_unimplemented_functions(send.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def receive(): - """ - This function is not implemented in the simulator. - - Works in exactly the same way as ``receive_bytes`` but returns - whatever was sent. - - Currently, it's equivalent to ``str(receive_bytes(), 'utf8')`` but with a - check that the the first three bytes are ``b'\x01\x00\x01'`` (to make it - compatible with other platforms that may target the micro:bit). It strips - the prepended bytes before converting to a string. - - A ``ValueError`` exception is raised if conversion to string fails. - """ - utils.print_for_unimplemented_functions(receive.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) - - -def receive_full(): - """ - This function is not implemented in the simulator. - - Returns a tuple containing three values representing the next incoming - message on the message queue. If there are no pending messages then - ``None`` is returned. - - The three values in the tuple represent: - - * the next incoming message on the message queue as bytes. - * the RSSI (signal strength): a value between 0 (strongest) and -255 (weakest) as measured in dBm. - * a microsecond timestamp: the value returned by ``time.ticks_us()`` when the message was received. - - For example:: - - details = radio.receive_full() - if details: - msg, rssi, timestamp = details - - This function is useful for providing information needed for triangulation - and/or triliteration with other micro:bit devices. - """ - utils.print_for_unimplemented_functions(receive_full.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_RADIO) diff --git a/src/micropython/speech.py b/src/micropython/speech.py deleted file mode 100644 index e92458a96..000000000 --- a/src/micropython/speech.py +++ /dev/null @@ -1,61 +0,0 @@ -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/speech.html. - - -def translate(words): - """ - This function is not implemented in the simulator. - - Given English words in the string ``words``, return a string containing - a best guess at the appropriate phonemes to pronounce. The output is - generated from this - `text to phoneme translation table `_. - - This function should be used to generate a first approximation of phonemes - that can be further hand-edited to improve accuracy, inflection and - emphasis. - """ - utils.print_for_unimplemented_functions(translate.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) - - -def pronounce(phonemes, pitch=64, speed=72, mouth=128, throat=128): - """ - This function is not implemented in the simulator. - - Pronounce the phonemes in the string ``phonemes``. See below for details of - how to use phonemes to finely control the output of the speech synthesiser. - Override the optional pitch, speed, mouth and throat settings to change the - timbre (quality) of the voice. - """ - utils.print_for_unimplemented_functions(pronounce.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) - - -def say(words, pitch=64, speed=72, mouth=128, throat=128): - """ - This function is not implemented in the simulator. - - Say the English words in the string ``words``. The result is semi-accurate - for English. Override the optional pitch, speed, mouth and throat - settings to change the timbre (quality) of the voice. This is a short-hand - equivalent of: ``speech.pronounce(speech.translate(words))`` - """ - utils.print_for_unimplemented_functions(say.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) - - -def sing(phonemes, pitch=64, speed=72, mouth=128, throat=128): - """ - This function is not implemented in the simulator. - - Sing the phonemes contained in the string ``phonemes``. Changing the pitch - and duration of the note is described below. Override the optional pitch, - speed, mouth and throat settings to change the timbre (quality) of the - voice. - """ - utils.print_for_unimplemented_functions(sing.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_SPEECH) diff --git a/src/micropython/utime.py b/src/micropython/utime.py deleted file mode 100644 index 9ae5ee4df..000000000 --- a/src/micropython/utime.py +++ /dev/null @@ -1,132 +0,0 @@ -import time - -from common import utils -from common.telemetry import telemetry_py -from common.telemetry_events import TelemetryEvent - -# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/utime.html. - - -def sleep(seconds): - """ - Sleep for the given number of seconds. You can use a floating-point number - to sleep for a fractional number of seconds, or use the - :func:`utime.sleep_ms()` and :func:`utime.sleep_us()` functions. - """ - time.sleep(seconds) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def sleep_ms(ms): - """ - Delay for given number of milliseconds, should be positive or 0. - """ - time.sleep(ms / 1000) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def sleep_us(us): - """ - Delay for given number of microseconds, should be positive or 0. - """ - time.sleep(us / 1000000) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def ticks_ms(): - """ - This function is not implemented in the simulator. - - Returns an increasing millisecond counter with an arbitrary reference point, - that wraps around after some value. - """ - utils.print_for_unimplemented_functions(ticks_ms.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def ticks_us(): - """ - This function is not implemented in the simulator. - - Just like :func:`utime.ticks_ms()` above, but in microseconds. - """ - utils.print_for_unimplemented_functions(ticks_us.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def ticks_add(ticks, delta): - """ - This function is not implemented in the simulator. - - Offset ticks value by a given number, which can be either positive or - negative. Given a ticks value, this function allows to calculate ticks - value delta ticks before or after it, following modular-arithmetic - definition of tick values. - - Example: - - .. code-block:: python - - # Find out what ticks value there was 100ms ago - print(ticks_add(time.ticks_ms(), -100)) - - # Calculate deadline for operation and test for it - deadline = ticks_add(time.ticks_ms(), 200) - while ticks_diff(deadline, time.ticks_ms()) > 0: - do_a_little_of_something() - - # Find out TICKS_MAX used by this port - print(ticks_add(0, -1)) - """ - utils.print_for_unimplemented_functions(ticks_add.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) - - -def ticks_diff(ticks1, ticks2): - """ - This function is not implemented in the simulator. - - Measure ticks difference between values returned from - :func:`utime.ticks_ms()` or :func:`ticks_us()` functions, as a signed value - which may wrap around. - - The argument order is the same as for subtraction operator, - ``ticks_diff(ticks1, ticks2)`` has the same meaning as ``ticks1 - ticks2``. - - :func:`utime.ticks_diff()` is designed to accommodate various usage - patterns, among them: - - Polling with timeout. In this case, the order of events is known, and you - will deal only with positive results of :func:`utime.ticks_diff()`: - - .. code-block:: python - - # Wait for GPIO pin to be asserted, but at most 500us - start = time.ticks_us() - while pin.value() == 0: - if time.ticks_diff(time.ticks_us(), start) > 500: - raise TimeoutError - - - Scheduling events. In this case, :func:`utime.ticks_diff()` result may be - negative if an event is overdue: - - - .. code-block:: python - - # This code snippet is not optimized - now = time.ticks_ms() - scheduled_time = task.scheduled_time() - if ticks_diff(scheduled_time, now) > 0: - print("Too early, let's nap") - sleep_ms(ticks_diff(scheduled_time, now)) - task.run() - elif ticks_diff(scheduled_time, now) == 0: - print("Right at time!") - task.run() - elif ticks_diff(scheduled_time, now) < 0: - print("Oops, running late, tell task to run faster!") - task.run(run_faster=true) - """ - utils.print_for_unimplemented_functions(ticks_diff.__name__) - telemetry_py.send_telemetry(TelemetryEvent.MICROBIT_API_UTIME) diff --git a/src/process_user_code.py b/src/process_user_code.py deleted file mode 100644 index 4b17792a6..000000000 --- a/src/process_user_code.py +++ /dev/null @@ -1,152 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -import os -import io -import sys -import copy -import json -import threading -import traceback -import python_constants as CONSTANTS -from pathlib import Path -import check_python_dependencies - -# will propagate errors if dependencies aren't sufficient -check_python_dependencies.check_for_dependencies() - -read_val = "" -threads = [] -# Redirecting the process stdout -user_stdout = io.StringIO() -sys.stdout = user_stdout - -abs_path_to_parent_dir = os.path.dirname(os.path.abspath(__file__)) - -# Insert absolute path to library for CLUE into sys.path -sys.path.insert(0, os.path.join(abs_path_to_parent_dir, CONSTANTS.CLUE_DIR)) - -# Insert absolute path to Circuitpython libraries for CLUE into sys.path -sys.path.insert(0, os.path.join(abs_path_to_parent_dir, CONSTANTS.CIRCUITPYTHON)) - -# Insert absolute path to Adafruit library for CPX into sys.path -abs_path_to_adafruit_lib = os.path.join( - abs_path_to_parent_dir, CONSTANTS.ADAFRUIT_LIBRARY_NAME -) -sys.path.insert(0, abs_path_to_adafruit_lib) - -# Insert absolute path to Micropython libraries for micro:bit into sys.path -abs_path_to_micropython_lib = os.path.join( - abs_path_to_parent_dir, CONSTANTS.MICROPYTHON_LIBRARY_NAME -) -sys.path.insert(0, abs_path_to_micropython_lib) - -# This import must happen after the sys.path is modified -from common.telemetry import telemetry_py -from common import utils -from adafruit_circuitplayground.express import cpx -from adafruit_circuitplayground.constants import CPX - -from microbit.__model.microbit_model import __mb as mb -from microbit.__model.constants import MICROBIT - -from adafruit_clue import clue -from base_circuitpython.base_cp_constants import CLUE -import board - -# get handle to terminal for clue -curr_terminal = board.DISPLAY.terminal - -# Handle User Inputs Thread -class UserInput(threading.Thread): - def __init__(self): - threading.Thread.__init__(self) - - def run(self): - device_dict = {CPX: cpx, MICROBIT: mb, CLUE: clue} - while True: - read_val = sys.stdin.readline() - sys.stdin.flush() - try: - new_state_message = json.loads(read_val) - device = new_state_message.get(CONSTANTS.ACTIVE_DEVICE_FIELD) - new_state = new_state_message.get(CONSTANTS.STATE_FIELD, {}) - if device in device_dict: - device_dict[device].update_state(new_state) - else: - raise Exception(CONSTANTS.DEVICE_NOT_IMPLEMENTED_ERROR) - - except Exception as e: - print(CONSTANTS.ERROR_SENDING_EVENT, e, file=sys.stderr, flush=True) - - -user_input = UserInput() -threads.append(user_input) -user_input.start() - - -# Handle User's Print Statements Thread -def handle_user_prints(): - global user_stdout - global curr_terminal - while True: - if user_stdout.getvalue(): - message = {"type": "print", "data": user_stdout.getvalue()} - - # when I use the value for user_stdout.getvalue() directly - # as the argument for add_str_to_terminal, it only sends the first - # line of the stream. - - # hence, I parse it out of the message dict and take off the - # extra newline at the end. - - data_str = str(message["data"]) - curr_terminal.add_str_to_terminal(data_str[:-1]) - print(json.dumps(message) + "\0", file=sys.__stdout__, flush=True) - user_stdout.truncate(0) - user_stdout.seek(0) - - -user_prints = threading.Thread(target=handle_user_prints) -threads.append(user_prints) -user_prints.start() - - -# Execute User Code Thread -def execute_user_code(abs_path_to_code_file): - global curr_terminal - curr_terminal.add_str_to_terminal(CONSTANTS.CODE_START_MSG_CLUE) - utils.abs_path_to_user_file = abs_path_to_code_file - # Execute the user's code.py file - with open(abs_path_to_code_file, encoding="utf8") as user_code_file: - user_code = user_code_file.read() - try: - codeObj = compile(user_code, abs_path_to_code_file, CONSTANTS.EXEC_COMMAND) - exec(codeObj, {}) - sys.stdout.flush() - except Exception as e: - exc_type, exc_value, exc_traceback = sys.exc_info() - errorMessage = CONSTANTS.ERROR_TRACEBACK - stackTrace = traceback.format_exception(exc_type, exc_value, exc_traceback) - - for frameIndex in range(2, len(stackTrace) - 1): - errorMessage += "\t" + str(stackTrace[frameIndex]) - print(e, errorMessage, file=sys.stderr, flush=True) - - curr_terminal.add_str_to_terminal(errorMessage) - - curr_terminal.add_str_to_terminal(CONSTANTS.CODE_FINISHED_MSG_CLUE) - board.DISPLAY.show(None) - - -user_code = threading.Thread(args=(sys.argv[1],), target=execute_user_code) -telemetry_state = json.loads(sys.argv[2]) - -telemetry_py._Telemetry__enable_telemetry = telemetry_state.get( - CONSTANTS.ENABLE_TELEMETRY, True -) -threads.append(user_code) -user_code.start() - -for thread in threads: - thread.join() diff --git a/src/python_constants.py b/src/python_constants.py deleted file mode 100644 index f469ec149..000000000 --- a/src/python_constants.py +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -ACTIVE_DEVICE_FIELD = "active_device" - -ADAFRUIT_DRIVE_NAME = "CIRCUITPY" - -DEPEND_ERR = 'The required dependencies aren\'t downloaded. Please use CTRL+SHIFT+P to open the command palette and select "Device Simulator Express: Install Extension Dependencies".' - -DEVICE_NOT_IMPLEMENTED_ERROR = "Device not implemented." - -ENABLE_TELEMETRY = "enable_telemetry" - -EXEC_COMMAND = "exec" -ERROR_SENDING_EVENT = "Error trying to send event to the process : " -ERROR_TRACEBACK = "\n\tTraceback of code execution : \n" -ERROR_NO_FILE = "Error : No file was passed to the process to execute.\n" - -ADAFRUIT_LIBRARY_NAME = "adafruit_circuitplayground" -MICROPYTHON_LIBRARY_NAME = "micropython" - -LINUX_OS = "linux" - -MAC_OS = "darwin" -MOUNT_COMMAND = "mount" - -NO_ADAFRUIT_DEVICE_DETECTED_ERROR_TITLE = ( - "No Adafruit device (Circuit Playground Express or Clue) detected" -) -NO_ADAFRUIT_DEVICE_DETECTED_ERROR_DETAIL = ( - "Could not find drive with name 'CIRCUITPYTHON'. Detected OS: {}" -) -NO_MICROBIT_DETECTED_ERROR_TITLE = "No micro:bit detected" -NOT_SUPPORTED_OS = 'The OS "{}" not supported.' -NOT_IMPLEMENTED_ERROR = "This method is not implemented by the simulator" - -STATE_FIELD = "state" - -UTF_FORMAT = "utf-8" - -WINDOWS_OS = "win32" - -DEFAULT_PORT = "5577" - -CPX = "CPX" - -MICROBIT = "micro:bit" - -CLUE = "CLUE" -CLUE_DIR = "clue" - -CIRCUITPYTHON = "base_circuitpython" - -CODE_START_MSG_CLUE = "soft reboot\ncode.py output:" -CODE_FINISHED_MSG_CLUE = "\nCode done running. Waiting for reload." diff --git a/src/requirements.txt b/src/requirements.txt deleted file mode 100644 index c13eef60b..000000000 --- a/src/requirements.txt +++ /dev/null @@ -1,12 +0,0 @@ -playsound==1.2.2 -applicationinsights==0.11.9 -python-socketio==4.3.1 -requests==2.22.0 -pywin32==227; platform_system == "Windows" -PyObjC; platform_system == "darwin" -uflash==1.3.0 -adafruit-circuitpython-fancyled==1.3.3 -Pillow==8.1.1 -adafruit-circuitpython-bitmap_font==1.1.0 -adafruit-circuitpython-display-shapes==1.2.0 -adafruit-circuitpython-neopixel==5.0.0 \ No newline at end of file diff --git a/src/serialMonitor.ts b/src/serialMonitor.ts deleted file mode 100644 index f3685cd58..000000000 --- a/src/serialMonitor.ts +++ /dev/null @@ -1,310 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Credit: A majority of this code was taken from the Visual Studio Code Arduino extension with some modifications to suit our purposes. - -import * as vscode from "vscode"; -import CONSTANTS, { DialogResponses, STATUS_BAR_PRIORITY } from "./constants"; -import { DeviceContext } from "./deviceContext"; -import { outChannel } from "./extension"; -import { logToOutputChannel } from "./extension_utils/utils"; -import { SerialPortControl } from "./serialPortControl"; - -export interface ISerialPortDetail { - path: string; - manufacturer: string; - vendorId: string; - productId: string; -} - -export class SerialMonitor implements vscode.Disposable { - public static DEFAULT_BAUD_RATE: number = 115200; - - public static listBaudRates(): number[] { - return [ - 300, - 1200, - 2400, - 4800, - 9600, - 19200, - 38400, - 57600, - 74880, - 115200, - 230400, - 250000, - ]; - } - - public static getInstance(): SerialMonitor { - if (SerialMonitor._serialMonitor === null) { - SerialMonitor._serialMonitor = new SerialMonitor(); - } - return SerialMonitor._serialMonitor; - } - - private static _serialMonitor: SerialMonitor | null = null; - - private _currentPort!: string; - private _currentBaudRate!: number; - private _outputChannel!: vscode.OutputChannel; - private _serialPortControl: SerialPortControl | null = null; - private _baudRateStatusBar!: vscode.StatusBarItem; - private _openPortStatusBar!: vscode.StatusBarItem; - private _portsStatusBar!: vscode.StatusBarItem; - - private constructor() { - const deviceContext = DeviceContext.getInstance(); - deviceContext.onDidChange(() => { - if (deviceContext.port) { - if (!this.initialized) { - this.initialize(); - } - this.updatePortListStatus(null); - } - }); - } - - public initialize() { - const defaultBaudRate: number = SerialMonitor.DEFAULT_BAUD_RATE; - this._outputChannel = vscode.window.createOutputChannel( - CONSTANTS.MISC.SERIAL_MONITOR_NAME - ); - this._currentBaudRate = defaultBaudRate; - this._portsStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.PORT - ); - this._portsStatusBar.command = - "deviceSimulatorExpress.common.selectSerialPort"; - this._portsStatusBar.tooltip = "Select Serial Port"; - this._portsStatusBar.show(); - - this._openPortStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.OPEN_PORT - ); - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.openSerialMonitor"; - this._openPortStatusBar.text = `$(plug)`; - this._openPortStatusBar.tooltip = "Open Serial Monitor"; - this._openPortStatusBar.show(); - - this._baudRateStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.BAUD_RATE - ); - this._baudRateStatusBar.command = - "deviceSimulatorExpress.common.changeBaudRate"; - this._baudRateStatusBar.tooltip = "Baud Rate"; - this._baudRateStatusBar.text = defaultBaudRate.toString(); - this.updatePortListStatus(null); - } - - public async selectSerialPort(vid: string | null, pid: string | null) { - const lists = await SerialPortControl.list(); - if (!lists.length) { - vscode.window.showInformationMessage( - "No serial message is available." - ); - return; - } - - if (vid && pid) { - const valueOfVid = parseInt(vid, 16); - const valueOfPid = parseInt(pid, 16); - const foundPort = lists.find(port => { - if (port.productId && port.vendorId) { - return ( - parseInt(port.productId, 16) === valueOfPid && - parseInt(port.vendorId, 16) === valueOfVid - ); - } - return false; - }); - if ( - foundPort && - !(this._serialPortControl && this._serialPortControl.isActive) - ) { - this.updatePortListStatus(foundPort.path); - } - } else { - const chosen = await vscode.window.showQuickPick( - lists - .map( - (port: ISerialPortDetail): vscode.QuickPickItem => { - return { - description: port.manufacturer, - label: port.path, - }; - } - ) - .sort((a, b): number => { - return a.label === b.label - ? 0 - : a.label > b.label - ? 1 - : -1; - }) as vscode.QuickPickItem[], - { placeHolder: CONSTANTS.MISC.SELECT_PORT_PLACEHOLDER } - ); - - if (chosen && chosen.label) { - this.updatePortListStatus(chosen.label); - } - } - } - - public async openSerialMonitor() { - if (!this._currentPort) { - const ans = await vscode.window.showInformationMessage( - CONSTANTS.WARNING.NO_SERIAL_PORT_SELECTED, - DialogResponses.SELECT, - DialogResponses.CANCEL - ); - if (ans === DialogResponses.SELECT) { - await this.selectSerialPort(null, null); - } - if (!this._currentPort) { - return; - } - } - - if (this._serialPortControl) { - if (this._currentPort !== this._serialPortControl.currentPort) { - await this._serialPortControl.changePort(this._currentPort); - } else if (this._serialPortControl.isActive) { - vscode.window.showWarningMessage( - `Serial Monitor is already opened for ${this._currentPort}` - ); - return; - } - } else { - this._serialPortControl = new SerialPortControl( - this._currentPort, - this._currentBaudRate, - this._outputChannel - ); - } - - if (!this._serialPortControl.currentPort) { - console.error( - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT(this._currentPort) - ); - return; - } - - try { - await this._serialPortControl.open(); - this.updatePortStatus(true); - } catch (error) { - logToOutputChannel( - outChannel, - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT_DUE_TO( - this._currentPort, - error - ), - true - ); - } - } - - public get initialized(): boolean { - return !!this._outputChannel; - } - - public dispose() { - if (this._serialPortControl && this._serialPortControl.isActive) { - return this._serialPortControl.stop(); - } - } - - public async changeBaudRate() { - const baudRates = SerialMonitor.listBaudRates(); - const chosen = await vscode.window.showQuickPick( - baudRates.map(baudRate => baudRate.toString()) - ); - - if (!chosen) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.NO_RATE_SELECTED, - true - ); - return; - } - - if (!parseInt(chosen, 10)) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.INVALID_BAUD_RATE, - true - ); - return; - } - - if (!this._serialPortControl) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.SERIAL_MONITOR_NOT_STARTED, - true - ); - return; - } - - const selectedRate: number = parseInt(chosen, 10); - await this._serialPortControl.changeBaudRate(selectedRate); - this._currentBaudRate = selectedRate; - this._baudRateStatusBar.text = chosen; - } - - public async closeSerialMonitor(port: string, showWarning: boolean = true) { - if (this._serialPortControl) { - if (port && port !== this._serialPortControl.currentPort) { - // Port is not opened - return false; - } - const result = await this._serialPortControl.stop(); - this.updatePortStatus(false); - return result; - } else if (!port && showWarning) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.SERIAL_PORT_NOT_STARTED, - true - ); - return false; - } - } - - private updatePortStatus(isOpened: boolean) { - if (isOpened) { - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.closeSerialMonitor"; - this._openPortStatusBar.text = `$(x)`; - this._openPortStatusBar.tooltip = "Close Serial Monitor"; - this._baudRateStatusBar.show(); - } else { - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.openSerialMonitor"; - this._openPortStatusBar.text = `$(plug)`; - this._openPortStatusBar.tooltip = "Open Serial Monitor"; - this._baudRateStatusBar.hide(); - } - } - - private updatePortListStatus(port: string | null) { - const deviceContext = DeviceContext.getInstance(); - if (port) { - deviceContext.port = port; - } - this._currentPort = deviceContext.port; - - if (deviceContext.port) { - this._portsStatusBar.text = deviceContext.port; - } else { - this._portsStatusBar.text = " - {renderOptions(props.options)} - - ); -}; - -const renderOptions = (options: string[]) => { - return options.map((name, index) => { - return ( - - ); - }); -}; diff --git a/src/view/components/clue/Clue.spec.tsx b/src/view/components/clue/Clue.spec.tsx deleted file mode 100644 index c69b4ebe7..000000000 --- a/src/view/components/clue/Clue.spec.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { Clue } from "./Clue"; - -describe("Clue component", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); diff --git a/src/view/components/clue/Clue.tsx b/src/view/components/clue/Clue.tsx deleted file mode 100644 index 546f136ee..000000000 --- a/src/view/components/clue/Clue.tsx +++ /dev/null @@ -1,158 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { - GESTURES_CLUE, - SENSOR_LIST, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, -} from "../../constants"; -import "../../styles/Simulator.css"; -import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; -import { sendMessage } from "../../utils/MessageUtils"; -import { CLUE_TOOLBAR_ICON_ID } from "../toolbar/SensorModalUtils"; -import ToolBar from "../toolbar/ToolBar"; -import { ClueSimulator } from "./ClueSimulator"; - -// Component grouping the functionality for micro:bit functionalities -interface IState { - sensors: { [key: string]: number }; - currentSelectedGesture: string; -} -const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT_R]: 0, - [SENSOR_LIST.LIGHT_G]: 0, - [SENSOR_LIST.LIGHT_B]: 0, - [SENSOR_LIST.LIGHT_C]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - [SENSOR_LIST.HUMIDITY]: 0, - [SENSOR_LIST.PRESSURE]: 1013, - [SENSOR_LIST.PROXIMITY]: 0, - [SENSOR_LIST.GYRO_X]: 0, - [SENSOR_LIST.GYRO_Y]: 0, - [SENSOR_LIST.GYRO_Z]: 0, - [SENSOR_LIST.MAGNET_X]: 0, - [SENSOR_LIST.MAGNET_Y]: 0, - [SENSOR_LIST.MAGNET_Z]: 0, - }, - currentSelectedGesture: GESTURES_CLUE[0], -}; - -export class Clue extends React.Component<{}, IState> { - state = DEFAULT_STATE; - - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; - - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; - updateGesture = (event: React.ChangeEvent) => { - this.setState({ currentSelectedGesture: event.target.value }); - }; - sendGesture = (isActive: boolean) => { - if (this.state.currentSelectedGesture) { - if (isActive) { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: this.state.currentSelectedGesture, - }); - } else { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: "", - }); - } - } - }; -} - -const CLUE_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - label: CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.LEDS, - image: TOOLBAR_SVG.NEO_PIXEL_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.TEMPERATURE, - image: TOOLBAR_SVG.TEMPERATURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.LIGHT, - image: TOOLBAR_SVG.LIGHT_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, - image: TOOLBAR_SVG.MOTION_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.HUMIDITY, - image: TOOLBAR_SVG.HUMIDITY_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.PRESSURE, - image: TOOLBAR_SVG.PRESSURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.PROXIMITY, - image: TOOLBAR_SVG.PROXIMITY_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GESTURE, - image: TOOLBAR_SVG.GESTURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GYROSCOPE, - image: TOOLBAR_SVG.GYROSCOPE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, - image: TOOLBAR_SVG.MAGNET_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GPIO, - image: TOOLBAR_SVG.GPIO_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.SOUND, - image: TOOLBAR_SVG.SOUND_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.SPEAKER, - image: TOOLBAR_SVG.SPEAKER_SVG, - }, -]; diff --git a/src/view/components/clue/ClueImage.tsx b/src/view/components/clue/ClueImage.tsx deleted file mode 100644 index 85694d4e0..000000000 --- a/src/view/components/clue/ClueImage.tsx +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { BUTTON_CLASSNAME, VIEW_STATE } from "../../constants"; -import CONSTANTS, { BUTTON_STYLING_CLASSES } from "../../constants"; -import { ViewStateContext } from "../../context"; -import { ClueSvg, IRefObject } from "./Clue_svg"; - -interface EventTriggers { - onMouseUp: (event: Event, buttonKey: string) => void; - onMouseDown: (event: Event, buttonKey: string) => void; - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; -} -interface IProps { - eventTriggers: EventTriggers; - displayMessage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; -} - -export enum BUTTONS_KEYS { - BTN_A = "BTN_A", - BTN_B = "BTN_B", - BTN_AB = "BTN_AB", -} -// Displays the SVG and call necessary svg modification. -export class ClueImage extends React.Component { - private svgRef: React.RefObject = React.createRef(); - constructor(props: IProps) { - super(props); - } - componentDidMount() { - const svgElement = this.svgRef.current; - if (svgElement) { - setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); - this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); - } - } - componentDidUpdate() { - if (this.context === VIEW_STATE.PAUSE && this.svgRef.current) { - disableAllButtons(this.svgRef.current.getButtons()); - } else if (this.context === VIEW_STATE.RUNNING && this.svgRef.current) { - setupAllButtons( - this.props.eventTriggers, - this.svgRef.current.getButtons() - ); - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.eventTriggers.onKeyEvent(event, true, event.key); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.eventTriggers.onKeyEvent(event, false, event.key); - }; - render() { - return ( - - ); - } - public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { - const button = this.svgRef.current?.getButtons()[key].current; - if (button) { - button.focus(); - if (isActive) { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.KEYPRESSED - ); - } else { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.DEFAULT - ); - } - button.setAttribute("pressed", `${isActive}`); - button.setAttribute("aria-pressed", `${isActive}`); - } - } -} - -ClueImage.contextType = ViewStateContext; -const setupButton = ( - buttonElement: SVGRectElement, - eventTriggers: EventTriggers, - key: string -) => { - buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); - buttonElement.onmousedown = e => { - buttonElement.focus(); - eventTriggers.onMouseDown(e, key); - }; - buttonElement.onmouseup = e => { - eventTriggers.onMouseUp(e, key); - }; - - buttonElement.onkeydown = e => { - // ensure that the keydown is enter, - // or else it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - eventTriggers.onKeyEvent(e, true, key); - } - }; - buttonElement.onkeyup = e => { - eventTriggers.onKeyEvent(e, false, key); - }; -}; -const setupAllButtons = ( - eventTriggers: EventTriggers, - buttonRefs: IRefObject -) => { - for (const [key, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - setupButton(ref.current, eventTriggers, key); - } - } -}; -const disableAllButtons = (buttonRefs: IRefObject) => { - for (const [, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - // to implement - ref.current.onmousedown = null; - ref.current.onmouseup = null; - ref.current.onkeydown = null; - ref.current.onkeyup = null; - ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); - } - } -}; diff --git a/src/view/components/clue/ClueSimulator.tsx b/src/view/components/clue/ClueSimulator.tsx deleted file mode 100644 index a15f101f8..000000000 --- a/src/view/components/clue/ClueSimulator.tsx +++ /dev/null @@ -1,304 +0,0 @@ -import * as React from "react"; -import { - AB_BUTTONS_KEYS, - CONSTANTS, - DEFAULT_IMG_CLUE, - DEVICE_LIST_KEY, - VIEW_STATE, - WEBVIEW_MESSAGES, -} from "../../constants"; -import { ViewStateContext } from "../../context"; -import "../../styles/Simulator.css"; -import "../../styles/Simulator.css"; -import PlayLogo from "../../svgs/play_svg"; -import StopLogo from "../../svgs/stop_svg"; -import { sendMessage } from "../../utils/MessageUtils"; -import ActionBar from "../simulator/ActionBar"; -import { BUTTONS_KEYS, ClueImage } from "./ClueImage"; - -export const DEFAULT_CLUE_STATE: IClueState = { - buttons: { button_a: false, button_b: false }, - displayMessage: DEFAULT_IMG_CLUE, - leds: { - neopixel: [0, 0, 0], - isRedLedOn: false, - isWhiteLedOn: false, - }, -}; - -interface IState { - active_editors: string[]; - running_file?: string; - play_button: boolean; - selected_file: string; - clue: IClueState; - currently_selected_file: string; -} - -interface IClueState { - buttons: { button_a: boolean; button_b: boolean }; - displayMessage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; -} -export class ClueSimulator extends React.Component { - private imageRef: React.RefObject = React.createRef(); - constructor() { - super({}); - this.state = { - clue: DEFAULT_CLUE_STATE, - play_button: false, - selected_file: "", - active_editors: [], - running_file: undefined, - currently_selected_file: "", - }; - this.onKeyEvent = this.onKeyEvent.bind(this); - } - handleMessage = (event: any): void => { - const message = event.data; - if (message.active_device !== DEVICE_LIST_KEY.CLUE) { - return; - } - switch (message.command) { - case "reset-state": - this.setState({ - clue: DEFAULT_CLUE_STATE, - play_button: false, - }); - break; - case "set-state": - this.handleStateChangeMessage(message); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - clue: { - ...this.state.clue, - displayMessage: DEFAULT_IMG_CLUE, - }, - }); - break; - case "visible-editors": - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } - - break; - } - }; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } - - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
- -
- -
- -
- ); - } - protected togglePlayClick = () => { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - }; - protected onSelectFile(event: React.FocusEvent) { - this.setState({ - selected_file: event.currentTarget.value, - }); - } - protected refreshSimulatorClick = () => { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - }; - protected handleButtonClick = (key: string, isActive: boolean) => { - let newButtonState = this.state.clue.buttons; - switch (key) { - case AB_BUTTONS_KEYS.BTN_A: - newButtonState.button_a = isActive; - break; - case AB_BUTTONS_KEYS.BTN_B: - newButtonState.button_b = isActive; - break; - case AB_BUTTONS_KEYS.BTN_AB: - newButtonState = { - button_a: isActive, - button_b: isActive, - }; - break; - } - sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); - this.setState({ - clue: { - ...this.state.clue, - buttons: newButtonState, - }, - }); - }; - - protected onMouseUp = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, false); - }; - - protected onMouseDown = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, true); - }; - - protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { - event.stopPropagation(); - if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(key, active); - if (key === BUTTONS_KEYS.BTN_A) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if (key === BUTTONS_KEYS.BTN_B) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if (key === BUTTONS_KEYS.BTN_AB) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } - } - protected handleStateChangeMessage(message: any) { - if (message.state.display_base64 != null) { - this.setState({ - clue: { - ...this.state.clue, - displayMessage: message.state.display_base64, - }, - }); - } else if (message.state.pixels != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - neopixel: message.state.pixels, - }, - }, - }); - } else if (message.state.white_leds != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - isWhiteLedOn: message.state.white_leds, - }, - }, - }); - } else if (message.state.red_led != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - isRedLedOn: message.state.red_led, - }, - }, - }); - } - } -} -ClueSimulator.contextType = ViewStateContext; diff --git a/src/view/components/clue/Clue_svg.tsx b/src/view/components/clue/Clue_svg.tsx deleted file mode 100644 index bcbf4e6d2..000000000 --- a/src/view/components/clue/Clue_svg.tsx +++ /dev/null @@ -1,1184 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { CLUE_LEDS_COLORS, CONSTANTS } from "../../constants"; -import "../../styles/SimulatorSvg.css"; -import svg from "../cpx/Svg_utils"; -import { DEFAULT_CLUE_STATE } from "./ClueSimulator"; -export interface IRefObject { - [key: string]: React.RefObject; -} -interface IProps { - displayImage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; -} -export class ClueSvg extends React.Component { - private svgRef: React.RefObject = React.createRef(); - private ledsRefs = { - neopixel: React.createRef(), - redLed: React.createRef(), - whiteLeds: [ - React.createRef(), - React.createRef(), - ], - }; - private gradientRefs = { - neopixel: React.createRef(), - whiteLed: React.createRef(), - redLed: React.createRef(), - }; - - private buttonRefs: IRefObject = { - BTN_A: React.createRef(), - BTN_B: React.createRef(), - BTN_AB: React.createRef(), - }; - - private displayRef: React.RefObject = React.createRef(); - - public getSvgRef(): React.RefObject { - return this.svgRef; - } - public getButtons(): IRefObject { - return this.buttonRefs; - } - public getDisplayRef(): React.RefObject { - return this.displayRef; - } - componentDidMount() { - this.updateSvg(); - } - componentDidUpdate() { - this.updateSvg(); - } - - render() { - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - - LIGHT - - - GESTURE - - - P - - R - - - O - - - XIMI - - - T - - - Y - - - - - - - - - - - - - - Red LED - - - - - Neopixel - - - - -
- ); - } - private updateSvg() { - this.updateDisplay(); - this.updateNeopixel(); - this.updateLeds(); - } - - private updateDisplay() { - if (this.props.displayImage) { - this.displayRef.current?.setAttribute( - "href", - `data:image/png;base64,${this.props.displayImage}` - ); - } - } - - private updateNeopixel() { - const { neopixel } = this.props.leds; - const rgbColor = `rgb(${neopixel[0] + - (255 - neopixel[0]) * CONSTANTS.LED_TINT_FACTOR}, - ${neopixel[1] + - (255 - neopixel[1]) * CONSTANTS.LED_TINT_FACTOR},${neopixel[2] + - (255 - neopixel[2]) * CONSTANTS.LED_TINT_FACTOR})`; - - this.ledsRefs.neopixel.current?.setAttribute("fill", rgbColor); - - if (neopixel === DEFAULT_CLUE_STATE.leds.neopixel) { - this.gradientRefs.neopixel.current?.setAttribute( - "stop-opacity", - "0" - ); - } else { - this.gradientRefs.neopixel.current?.setAttribute( - "stop-opacity", - "1" - ); - } - this.gradientRefs.neopixel.current?.setAttribute( - "stop-color", - rgbColor - ); - } - private updateLeds() { - // update white led - const { isWhiteLedOn, isRedLedOn } = this.props.leds; - - this.ledsRefs.whiteLeds.map( - (ledRef: React.RefObject) => { - svg.setLed( - isWhiteLedOn, - CLUE_LEDS_COLORS.WHITE_LEDS_OFF, - CLUE_LEDS_COLORS.WHITE_LEDS_ON, - ledRef.current, - this.gradientRefs.whiteLed.current - ); - } - ); - svg.setLed( - isRedLedOn, - CLUE_LEDS_COLORS.RED_LED_OFF, - CLUE_LEDS_COLORS.RED_LED_ON, - this.ledsRefs.redLed.current, - this.gradientRefs.redLed.current - ); - } -} diff --git a/src/view/components/clue/__snapshots__/Clue.spec.tsx.snap b/src/view/components/clue/__snapshots__/Clue.spec.tsx.snap deleted file mode 100644 index dce8f43ff..000000000 --- a/src/view/components/clue/__snapshots__/Clue.spec.tsx.snap +++ /dev/null @@ -1,2202 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Clue component should render correctly 1`] = ` -Array [ -
-
- The simulator will run the .py file you have focused on. -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - LIGHT - - - GESTURE - - - P - - R - - - O - - - XIMI - - - T - - - Y - - - - - - - - - - - - - - Red LED - - - - - Neopixel - - - - -
-
-
- - -
-
, -
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
, -] -`; diff --git a/src/view/components/cpx/Accessibility_utils.ts b/src/view/components/cpx/Accessibility_utils.ts deleted file mode 100644 index afdadb2ac..000000000 --- a/src/view/components/cpx/Accessibility_utils.ts +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Helpers designed to help to make a simulator accessible. -namespace accessibility { - export function makeFocusable(elem: SVGElement): void { - elem.setAttribute("focusable", "true"); - elem.setAttribute("tabindex", "0"); - } - - export function setAria( - elem: Element, - role?: string, - label?: string - ): void { - if (role && !elem.hasAttribute("role")) { - elem.setAttribute("role", role); - } - - if (label && !elem.hasAttribute("aria-label")) { - elem.setAttribute("aria-label", label); - } - } -} - -export default accessibility; diff --git a/src/view/components/cpx/Cpx.spec.tsx b/src/view/components/cpx/Cpx.spec.tsx deleted file mode 100644 index 24c53d551..000000000 --- a/src/view/components/cpx/Cpx.spec.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { Cpx } from "./Cpx"; - -describe("CPX component", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); diff --git a/src/view/components/cpx/Cpx.tsx b/src/view/components/cpx/Cpx.tsx deleted file mode 100644 index d91728fba..000000000 --- a/src/view/components/cpx/Cpx.tsx +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { CPX_TOOLBAR_ICON_ID } from "../../components/toolbar/SensorModalUtils"; -import ToolBar from "../../components/toolbar/ToolBar"; -import { SENSOR_LIST, VSCODE_MESSAGES_TO_WEBVIEW } from "../../constants"; -import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; -import Simulator from "./CpxSimulator"; - -// Component grouping the functionality for circuit playground express -const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - }, -}; - -export class Cpx extends React.Component { - state = DEFAULT_STATE; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; - - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; -} - -const CPX_TOOLBAR_BUTTONS: Array<{ label: any; image: any }> = [ - { - image: TOOLBAR_SVG.SLIDER_SWITCH_SVG, - label: CPX_TOOLBAR_ICON_ID.SWITCH, - }, - { - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - label: CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, - }, - { - image: TOOLBAR_SVG.RED_LED_SVG, - label: CPX_TOOLBAR_ICON_ID.RED_LED, - }, - { - image: TOOLBAR_SVG.SOUND_SVG, - label: CPX_TOOLBAR_ICON_ID.SOUND, - }, - { - image: TOOLBAR_SVG.TEMPERATURE_SVG, - label: CPX_TOOLBAR_ICON_ID.TEMPERATURE, - }, - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: CPX_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.NEO_PIXEL_SVG, - label: CPX_TOOLBAR_ICON_ID.NEO_PIXEL, - }, - { - image: TOOLBAR_SVG.SPEAKER_SVG, - label: CPX_TOOLBAR_ICON_ID.SPEAKER, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: CPX_TOOLBAR_ICON_ID.MOTION, - }, - { - image: TOOLBAR_SVG.IR_SVG, - label: CPX_TOOLBAR_ICON_ID.IR, - }, - { - image: TOOLBAR_SVG.GPIO_SVG, - label: CPX_TOOLBAR_ICON_ID.GPIO, - }, -]; diff --git a/src/view/components/cpx/CpxImage.tsx b/src/view/components/cpx/CpxImage.tsx deleted file mode 100644 index 48aef4e64..000000000 --- a/src/view/components/cpx/CpxImage.tsx +++ /dev/null @@ -1,406 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import CONSTANTS from "../../constants"; -import accessibility from "./Accessibility_utils"; -import CPX_SVG from "./Cpx_svg"; -import * as SvgStyle from "./Cpx_svg_style"; -import svg from "./Svg_utils"; - -interface IProps { - pixels: number[][]; - red_led: boolean; - brightness: number; - switch: boolean; - on: boolean; - onKeyEvent: (event: KeyboardEvent, active: boolean) => void; - onMouseUp: (button: HTMLElement, event: Event) => void; - onMouseDown: (button: HTMLElement, event: Event) => void; - onMouseLeave: (button: HTMLElement, event: Event) => void; -} - -export class CpxImage extends React.Component { - componentDidMount() { - const svgElement = window.document.getElementById("cpx_svg"); - if (svgElement) { - initSvgStyle(svgElement, this.props.brightness); - setupButtons(this.props); - setupPins(this.props); - this.setupKeyPresses(this.props.onKeyEvent); - setupSwitch(this.props); - this.updateImage(); - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - componentDidUpdate() { - this.updateImage(); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the switch, run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.S) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.onKeyEvent(event, true); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.onKeyEvent(event, false); - }; - render() { - return CPX_SVG; - } - private updateImage() { - updateNeopixels(this.props); - updateRedLED(this.props.red_led); - updatePowerLED(this.props.on); - updateSwitch(this.props.switch); - } -} - -const makeButton = ( - g: SVGElement, - left: number, - top: number, - id: string -): { outer: SVGElement; inner: SVGElement } => { - const buttonCornerRadius = SvgStyle.BUTTON_CORNER_RADIUS; - const buttonWidth = SvgStyle.BUTTON_WIDTH; - const buttonCircleRadius = SvgStyle.BUTTON_CIRCLE_RADIUS; - const btng = svg.child(g, "g", { class: "sim-button-group" }); - svg.child(btng, "rect", { - fill: SvgStyle.BUTTON_OUTER, - height: buttonWidth, - id: id + "_OUTER", - rx: buttonCornerRadius, - ry: buttonCornerRadius, - width: buttonWidth, - x: left, - y: top, - }); - - const outer = btng; - const inner = svg.child(btng, "circle", { - id: id + "_INNER", - cx: left + buttonWidth / 2, - cy: top + buttonWidth / 2, - r: buttonCircleRadius, - fill: SvgStyle.BUTTON_NEUTRAL, - }); - - return { outer, inner }; -}; - -const initSvgStyle = (svgElement: HTMLElement, brightness: number): void => { - const style: SVGStyleElement = svg.child( - svgElement, - "style", - {} - ) as SVGStyleElement; - style.textContent = SvgStyle.SVG_STYLE; - - // Filters for the glow effect (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) - const defs: SVGDefsElement = svg.child( - svgElement, - "defs", - {} - ) as SVGDefsElement; - - const g = svg.createElement("g") as SVGElement; - svgElement.appendChild(g); - - const glow = svg.child(defs, "filter", { - height: "120%", - id: "filterglow", - width: "120%", - x: "-5%", - y: "-5%", - }); - svg.child(glow, "feGaussianBlur", { stdDeviation: "5", result: "glow" }); - const merge = svg.child(glow, "feMerge", {}); - for (let i = 0; i < 3; ++i) { - svg.child(merge, "feMergeNode", { in: "glow" }); - } - - const neopixelglow = svg.child(defs, "filter", { - height: "600%", - id: "neopixelglow", - width: "600%", - x: "-300%", - y: "-300%", - }); - svg.child(neopixelglow, "feGaussianBlur", { - result: "coloredBlur", - stdDeviation: "4.3", - }); - const neopixelmerge = svg.child(neopixelglow, "feMerge", {}); - svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); - svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); - svg.child(neopixelmerge, "feMergeNode", { in: "SourceGraphic" }); - - // Brightness - const neopixelfeComponentTransfer = svg.child( - neopixelglow, - "feComponentTransfer", - {} - ); - svg.child(neopixelfeComponentTransfer, "feFuncR", { - id: "brightnessFilterR", - type: "linear", - slope: brightness, - }); - svg.child(neopixelfeComponentTransfer, "feFuncG", { - id: "brightnessFilterG", - slope: brightness, - type: "linear", - }); - svg.child(neopixelfeComponentTransfer, "feFuncB", { - id: "brightnessFilterB", - slope: brightness, - type: "linear", - }); - - // BTN A+B - const outerBtn = (left: number, top: number, label: string) => { - return makeButton(g, left, top, "BTN_AB"); - }; - - const ab = outerBtn(165, SvgStyle.MB_HEIGHT - 15, "A+B"); - const abtext = svg.child(ab.outer, "text", { - class: "sim-text-outside", - x: SvgStyle.BUTTON_TEXT_BASELINE, - y: SvgStyle.MB_HEIGHT - 18, - }) as SVGTextElement; - abtext.textContent = "A+B"; -}; - -const updateNeopixels = (props: IProps): void => { - for (let i = 0; i < props.pixels.length; i++) { - const led = window.document.getElementById(`NEOPIXEL_${i}`); - if (led) { - setNeopixel(led, props.pixels[i], props.brightness); - } - } -}; - -const updateRedLED = (propsRedLED: boolean): void => { - const redLED = window.document.getElementById("SERIAL_LED"); - if (redLED) { - redLED.style.fill = propsRedLED - ? SvgStyle.RED_LED_ON - : SvgStyle.RED_LED_OFF; - } -}; - -const updatePowerLED = (propsPowerLED: boolean): void => { - const powerLED = window.document.getElementById("PWR_LED"); - if (powerLED) { - powerLED.style.fill = propsPowerLED - ? SvgStyle.POWER_LED_ON - : SvgStyle.POWER_LED_OFF; - } -}; - -const setNeopixel = ( - led: HTMLElement, - pixValue: number[], - brightness: number -): void => { - if (isLightOn(pixValue) && brightness > 0) { - // Neopixels style (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) - changeBrightness("brightnessFilterR", brightness); - changeBrightness("brightnessFilterG", brightness); - changeBrightness("brightnessFilterB", brightness); - - let [hue, sat, lum] = SvgStyle.rgbToHsl([ - pixValue[0], - pixValue[1], - pixValue[2], - ]); - const innerLum = Math.max( - lum * SvgStyle.INTENSITY_FACTOR, - SvgStyle.MIN_INNER_LUM - ); - lum = (lum * 90) / 100 + 10; // at least 10% luminosity for the stroke - - led.style.filter = `url(#neopixelglow)`; - led.style.fill = `hsl(${hue}, ${sat}%, ${innerLum}%)`; - led.style.stroke = `hsl(${hue}, ${sat}%, ${Math.min( - lum * 3, - SvgStyle.MAX_STROKE_LUM - )}%)`; - led.style.strokeWidth = `1.5`; - } else { - led.style.fill = SvgStyle.OFF_COLOR; - led.style.filter = `none`; - led.style.stroke = `none`; - } -}; - -const isLightOn = (pixValue: number[]): boolean => { - return !pixValue.every(val => { - return val === 0; - }); -}; - -const changeBrightness = (filterID: string, brightness: number): void => { - const brightnessFilter: HTMLElement | null = window.document.getElementById( - filterID - ); - if (brightnessFilter) { - brightnessFilter.setAttribute("slope", brightness.toString()); - } -}; - -const setupButtons = (props: IProps): void => { - const outButtons = ["A_OUTER", "B_OUTER", "AB_OUTER"]; - const inButtons = ["A_INNER", "B_INNER", "AB_INNER"]; - outButtons.forEach(buttonName => { - const button = window.document.getElementById("BTN_" + buttonName); - - if (button) { - setupButton(button, "sim-button-outer", props); - } - }); - inButtons.forEach(buttonName => { - const button = window.document.getElementById("BTN_" + buttonName); - if (button) { - setupButton(button, "sim-button", props); - } - }); -}; - -const setupPins = (props: IProps): void => { - const pins = [ - "PIN_A1", - "PIN_A2", - "PIN_A3", - "PIN_A4", - "PIN_A5", - "PIN_A6", - "PIN_A7", - ]; - pins.forEach(pinName => { - const pin = window.document.getElementById(pinName); - - if (pin) { - const svgPin = (pin as unknown) as SVGElement; - svg.addClass(svgPin, `sim-${pinName}-touch`); - accessibility.makeFocusable(svgPin); - svgPin.onmouseup = e => props.onMouseUp(pin, e); - svgPin.onkeyup = e => props.onKeyEvent(e, false); - svgPin.onmousedown = e => props.onMouseDown(pin, e); - svgPin.onkeydown = e => props.onKeyEvent(e, true); - accessibility.setAria( - svgPin, - "button", - `Touch pin ${pinName.substr(pinName.length - 2)}` - ); - } - }); -}; - -const addButtonLabels = (button: HTMLElement) => { - let label = ""; - if (button.id.match(/AB/) !== null) { - label = "a+b"; - } else if (button.id.match(/A/) !== null) { - label = "a"; - } else if (button.id.match(/B/) !== null) { - label = "b"; - } - accessibility.setAria(button, "button", label); -}; - -const setupButton = (button: HTMLElement, className: string, props: IProps) => { - const svgButton = (button as unknown) as SVGElement; - svg.addClass(svgButton, className); - addButtonLabels(button); - if (className.match(/outer/) !== null) { - accessibility.makeFocusable(svgButton); - } - svgButton.onmousedown = e => props.onMouseDown(button, e); - svgButton.onmouseup = e => props.onMouseUp(button, e); - svgButton.onkeydown = e => { - // ensure that the keydown is enter. - // Or else, if the key is a shortcut instead, - // it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - props.onKeyEvent(e, true); - } - }; - svgButton.onkeyup = e => props.onKeyEvent(e, false); - svgButton.onmouseleave = e => props.onMouseLeave(button, e); -}; - -const setupSwitch = (props: IProps): void => { - const switchElement = window.document.getElementById("SWITCH"); - const swInnerElement = window.document.getElementById("SWITCH_INNER"); - const swHousingElement = window.document.getElementById("SWITCH_HOUSING"); - - if (switchElement && swInnerElement && swHousingElement) { - const svgSwitch: SVGElement = (switchElement as unknown) as SVGElement; - const svgSwitchInner: SVGElement = (swInnerElement as unknown) as SVGElement; - const svgSwitchHousing: SVGElement = (swHousingElement as unknown) as SVGElement; - - svg.addClass(svgSwitch, "sim-slide-switch"); - - svgSwitch.onmouseup = e => props.onMouseUp(switchElement, e); - svgSwitchInner.onmouseup = e => props.onMouseUp(swInnerElement, e); - svgSwitchHousing.onmouseup = e => props.onMouseUp(swHousingElement, e); - svgSwitch.onkeyup = e => props.onKeyEvent(e, false); - - accessibility.makeFocusable(svgSwitch); - accessibility.setAria(svgSwitch, "button", "On/Off Switch"); - } -}; - -export const updateSwitch = (switchState: boolean): void => { - const switchElement = window.document.getElementById("SWITCH"); - const switchInner = (window.document.getElementById( - "SWITCH_INNER" - ) as unknown) as SVGElement; - - if (switchElement && switchInner) { - svg.addClass(switchInner, "sim-slide-switch-inner"); - - if (!switchState) { - svg.addClass(switchInner, "on"); - switchInner.setAttribute("transform", "translate(-5,0)"); - } else { - svg.removeClass(switchInner, "on"); - switchInner.removeAttribute("transform"); - } - switchElement.setAttribute("aria-pressed", switchState.toString()); - } -}; -export const updatePinTouch = (pinState: boolean, id: string): void => { - console.log(`updating ${id} with ${pinState}`); - const pinElement = window.document.getElementById(id); - const pinSvg: SVGElement = (pinElement as unknown) as SVGElement; - - if (pinElement && pinSvg) { - pinElement.setAttribute("aria-pressed", pinState.toString()); - pinState - ? svg.addClass(pinSvg, "pin-pressed") - : svg.removeClass(pinSvg, "pin-pressed"); - } -}; - -export default CpxImage; diff --git a/src/view/components/cpx/CpxSimulator.tsx b/src/view/components/cpx/CpxSimulator.tsx deleted file mode 100644 index b0d77f441..000000000 --- a/src/view/components/cpx/CpxSimulator.tsx +++ /dev/null @@ -1,392 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { CONSTANTS, DEVICE_LIST_KEY, WEBVIEW_MESSAGES } from "../../constants"; -import { sendMessage } from "../../utils/MessageUtils"; - -import "../../styles/Simulator.css"; -import PlayLogo from "../../svgs/play_svg"; -import StopLogo from "../../svgs/stop_svg"; -import ActionBar from "../simulator/ActionBar"; -import { BUTTON_NEUTRAL, BUTTON_PRESSED } from "./Cpx_svg_style"; -import { CpxImage, updatePinTouch, updateSwitch } from "./CpxImage"; - -interface ICpxState { - pixels: number[][]; - brightness: number; - red_led: boolean; - button_a: boolean; - button_b: boolean; - switch: boolean; - touch: boolean[]; - shake: boolean; -} - -interface IState { - active_editors: string[]; - running_file: string; - selected_file: string; - cpx: ICpxState; - play_button: boolean; - currently_selected_file: string; -} - -const DEFAULT_CPX_STATE: ICpxState = { - brightness: 1.0, - button_a: false, - button_b: false, - pixels: [ - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - ], - red_led: false, - switch: false, - touch: [false, false, false, false, false, false, false], - shake: false, -}; - -class Simulator extends React.Component<{}, IState> { - constructor(props: Readonly<{}>) { - super(props); - this.state = { - active_editors: [], - cpx: DEFAULT_CPX_STATE, - play_button: false, - running_file: "", - selected_file: "", - currently_selected_file: "", - }; - - this.handleClick = this.handleClick.bind(this); - this.onKeyEvent = this.onKeyEvent.bind(this); - this.onMouseDown = this.onMouseDown.bind(this); - this.onMouseUp = this.onMouseUp.bind(this); - this.onMouseLeave = this.onMouseLeave.bind(this); - this.togglePlayClick = this.togglePlayClick.bind(this); - this.refreshSimulatorClick = this.refreshSimulatorClick.bind(this); - } - - handleMessage = (event: any): void => { - const message = event.data; // The JSON data our extension sent - if (message.active_device !== DEVICE_LIST_KEY.CPX) { - return; - } - switch (message.command) { - case "reset-state": - console.log("Clearing the state"); - this.setState({ - cpx: DEFAULT_CPX_STATE, - play_button: false, - }); - break; - case "set-state": - console.log( - "Setting the state: " + JSON.stringify(message.state) - ); - this.setState({ - cpx: message.state, - play_button: true, - }); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - }); - break; - case "visible-editors": - console.log( - "Setting active editors", - message.state.activePythonEditors - ); - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - console.log("Setting current file", message.state.running_file); - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } - break; - } - }; - - componentDidMount() { - console.log("Mounted"); - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
-
- -
- -
- ); - } - - protected togglePlayClick() { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - } - - protected refreshSimulatorClick() { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - } - - protected onKeyEvent(event: KeyboardEvent, active: boolean) { - let element; - const target = event.target as SVGElement; - // Guard Clause - if (target === undefined) { - return; - } - - if ([event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER)) { - element = window.document.getElementById(target.id); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_A - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_B - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_AB - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.S) - ) { - element = window.document.getElementById(CONSTANTS.ID_NAME.SWITCH); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } else { - if (event.shiftKey) { - switch (event.code) { - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_ONE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A1 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_TWO: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A2 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_THREE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A3 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FOUR: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A4 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FIVE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A5 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SIX: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A6 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SEVEN: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A7 - ); - break; - } - } - } - if (element) { - event.preventDefault(); - this.handleClick(element, active); - element.focus(); - } - } - protected onMouseDown(button: HTMLElement, event: Event) { - event.preventDefault(); - this.handleClick(button, true); - button.focus(); - } - - protected onMouseUp(button: HTMLElement, event: Event) { - event.preventDefault(); - this.handleClick(button, false); - } - - protected onMouseLeave(button: HTMLElement, event: Event) { - event.preventDefault(); - - if (button.getAttribute("pressed") === "true") { - this.handleClick(button, false); - } - } - - private handleClick(element: HTMLElement, active: boolean) { - let newState; - let message; - if (element.id.includes("BTN")) { - newState = this.handleButtonClick(element, active); - message = "button-press"; - } else if (element.id.includes("SWITCH")) { - newState = this.handleSwitchClick(); - message = "button-press"; - } else if (element.id.includes("PIN")) { - newState = this.handleTouchPinClick(element, active); - message = "sensor-changed"; - } else { - return; - } - - if (newState && message) { - sendMessage(message, newState); - } - } - - private handleButtonClick(button: HTMLElement, active: boolean) { - const ButtonA: boolean = button.id.match(/BTN_A/) !== null; - const ButtonB: boolean = button.id.match(/BTN_B/) !== null; - const ButtonAB: boolean = button.id.match(/BTN_AB/) !== null; - let innerButton; - let newState; - - if (ButtonAB) { - innerButton = window.document.getElementById("BTN_AB_INNER"); - newState = { - button_a: active, - button_b: active, - }; - this.setState({ ...this.state, ...newState }); - } else if (ButtonA) { - innerButton = window.document.getElementById("BTN_A_INNER"); - newState = { - button_a: active, - }; - this.setState({ ...this.state, ...newState }); - } else if (ButtonB) { - innerButton = window.document.getElementById("BTN_B_INNER"); - newState = { - button_b: active, - }; - this.setState({ ...this.state, ...newState }); - } - - if (innerButton) { - innerButton.style.fill = this.getButtonColor(active); - } - - button.setAttribute("pressed", `${active}`); - return newState; - } - - private getButtonColor(pressed: boolean) { - const buttonUps = BUTTON_NEUTRAL; - const buttonDown = BUTTON_PRESSED; - return pressed ? buttonDown : buttonUps; - } - - private handleSwitchClick() { - const switchIsOn = !this.state.cpx.switch; - updateSwitch(switchIsOn); - this.setState({ - ...this.state, - cpx: { ...this.state.cpx, switch: switchIsOn }, - }); - return { switch: switchIsOn }; - } - - private handleTouchPinClick(pin: HTMLElement, active: boolean): any { - let cpxState = this.state.cpx; - const pinIndex = parseInt(pin.id.charAt(pin.id.length - 1)) - 1; - const pinState = cpxState.touch; - pinState[pinIndex] = active; - cpxState = { ...cpxState, touch: pinState }; - this.setState({ ...this.state, ...cpxState }); - updatePinTouch(active, pin.id); - return { touch: pinState }; - } -} - -export default Simulator; diff --git a/src/view/components/cpx/Cpx_svg.tsx b/src/view/components/cpx/Cpx_svg.tsx deleted file mode 100644 index 55864d460..000000000 --- a/src/view/components/cpx/Cpx_svg.tsx +++ /dev/null @@ -1,3002 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/boardsvg.ts - -import * as React from "react"; - -export const CPX_SVG = ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -); - -export default CPX_SVG; diff --git a/src/view/components/cpx/Cpx_svg_style.tsx b/src/view/components/cpx/Cpx_svg_style.tsx deleted file mode 100644 index 4eff14480..000000000 --- a/src/view/components/cpx/Cpx_svg_style.tsx +++ /dev/null @@ -1,302 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts#L477 - -export const MB_WIDTH = 180.09375; -export const MB_HEIGHT = 179.22874; - -export const OFF_COLOR = "#c8c8c8"; -export const MAX_STROKE_LUM = 75; -export const MIN_INNER_LUM = 85; -export const INTENSITY_FACTOR = 1.3; -export const RED_LED_ON: string = "#FF7777"; -export const RED_LED_OFF: string = "#FFFFFF"; -export const BUTTON_NEUTRAL: string = "#000000"; -export const BUTTON_PRESSED: string = "#FFA500"; -export const BUTTON_OUTER: string = "#DCDCDC"; -export const BUTTON_CORNER_RADIUS: number = 2; -export const BUTTON_WIDTH: number = 10; -export const BUTTON_CIRCLE_RADIUS: number = 3; -export const BUTTON_TEXT_BASELINE: number = 163; -export const POWER_LED_ON: string = "#00FF00"; -export const POWER_LED_OFF: string = "#FFFFFF"; - -// Adapted from : https://github.com/microsoft/pxt/blob/master/pxtsim/simlib.ts -export function rgbToHsl( - rgb: [number, number, number] -): [number, number, number] { - const [r, g, b] = rgb; - const [r$, g$, b$] = [r / 255, g / 255, b / 255]; - const cMin = Math.min(r$, g$, b$); - const cMax = Math.max(r$, g$, b$); - const cDelta = cMax - cMin; - let h: number = 0, - s: number, - l: number; - const maxAndMin = cMax + cMin; - - // Luminosity - l = (maxAndMin / 2) * 100; - - if (cDelta === 0) { - s = 0; - h = 0; - } else { - // Hue - switch (cMax) { - case r$: - h = 60 * (((g$ - b$) / cDelta) % 6); - break; - case g$: - h = 60 * ((b$ - r$) / cDelta + 2); - break; - case b$: - h = 60 * ((r$ - g$) / cDelta + 4); - break; - } - - // Saturation - l > 50 - ? (s = 100 * (cDelta / (2 - maxAndMin))) - : (s = 100 * (cDelta / maxAndMin)); - } - - return [Math.floor(h), Math.floor(s), Math.floor(l)]; -} - -export const SVG_STYLE = ` - svg.sim { - box-sizing: border-box; - width: 100%; - height: 100%; - display: block; - } - svg.sim.grayscale { - -moz-filter: grayscale(1); - -webkit-filter: grayscale(1); - filter: grayscale(1); - } - .sim-button { - pointer-events: none; - } - - .sim-button-outer { - cursor: pointer; - } - .sim-button-outer:hover { - stroke-width: 1px; - stroke: orange !important; - } - .sim-button-nut { - fill:#704A4A; - pointer-events:none; - } - .sim-button-nut:hover { - stroke:1px solid #704A4A; - } - - .sim-pin-touch.touched:hover { - stroke:darkorange; - } - - .sim-led-back:hover { - stroke:#fff; - stroke-width:3px; - } - .sim-led:hover { - stroke:#ff7f7f; - stroke-width:3px; - } - - .sim-systemled { - fill:#333; - stroke:#555; - stroke-width: 1px; - } - - .sim-light-level-button { - stroke:#f1c40f; - stroke-width: 1px; - } - - .sim-pin-level-button { - stroke:darkorange; - stroke-width: 1px; - } - - .sim-sound-level-button { - stroke:#7f8c8d; - stroke-width: 1px; - } - - .sim-antenna { - stroke:#555; - stroke-width: 2px; - } - - .sim-text { - font-family:"Lucida Console", Monaco, monospace; - font-size:8px; - fill:#fff; - pointer-events: none; user-select: none; - } - .sim-text-outside{ - font-size:8px; - fill: var(--vscode-descriptionForeground); - } - .sim-text.small { - font-size:6px; - } - .sim-text.inverted { - fill:#000; - } - - .sim-text-pin { - font-family:"Lucida Console", Monaco, monospace; - font-size:5px; - fill:#fff; - pointer-events: none; - } - - .sim-thermometer { - stroke:#aaa; - stroke-width: 1px; - } - - #rgbledcircle:hover { - r:8px; - } - - #SWITCH_HOVER { - cursor: pointer; - } - .sim-slide-switch:hover #SWITCH_HOVER { - stroke:orange !important; - stroke-width: 1px; - } - - .sim-slide-switch-inner.on { - fill:#ff0000 !important; - } - - /* animations */ - .sim-theme-glow { - animation-name: sim-theme-glow-animation; - animation-timing-function: ease-in-out; - animation-direction: alternate; - animation-iteration-count: infinite; - animation-duration: 1.25s; - } - @keyframes sim-theme-glow-animation { - from { opacity: 1; } - to { opacity: 0.75; } - } - - .sim-flash { - animation-name: sim-flash-animation; - animation-duration: 0.1s; - } - - @keyframes sim-flash-animation { - from { fill: yellow; } - to { fill: default; } - } - - .sim-flash-stroke { - animation-name: sim-flash-stroke-animation; - animation-duration: 0.4s; - animation-timing-function: ease-in; - } - - @keyframes sim-flash-stroke-animation { - from { stroke: yellow; } - to { stroke: default; } - } - - - .sim-sound-stroke { - animation-name: sim-sound-stroke-animation; - animation-duration: 0.4s; - } - - @keyframes sim-sound-stroke-animation { - from { stroke: yellow; } - to { stroke: default; } - } - - /* wireframe */ - .sim-wireframe * { - fill: none; - stroke: black; - } - .sim-wireframe .sim-display, - .sim-wireframe .sim-led, - .sim-wireframe .sim-led-back, - .sim-wireframe .sim-head, - .sim-wireframe .sim-theme, - .sim-wireframe .sim-button-group, - .sim-wireframe .sim-button-label, - .sim-wireframe .sim-button, - .sim-wireframe .sim-text-pin - { - visibility: hidden; - } - .sim-wireframe .sim-label - { - stroke: none; - fill: #777; - } - .sim-wireframe .sim-board { - stroke-width: 2px; - } - *:focus { - outline: none; - } - - .sim-button-outer:focus, - .sim-slide-switch:focus, - .sim-thermometer:focus, - .sim-button-group:focus .sim-button-outer, - .sim-light-level-button:focus, - .sim-sound-level-button:focus { - stroke: #4D90FE; - stroke-width: 2px !important; - } - - .no-drag { - user-drag: none; - user-select: none; - -moz-user-select: none; - -webkit-user-drag: none; - -webkit-user-select: none; - -ms-user-select: none; - } - - .sim-PIN_A1-touch:hover, - .sim-PIN_A2-touch:hover, - .sim-PIN_A3-touch:hover, - .sim-PIN_A4-touch:hover, - .sim-PIN_A5-touch:hover, - .sim-PIN_A6-touch:hover, - .sim-PIN_A7-touch:hover{ - stroke:orange !important; - stroke-width:1px; - } - - .sim-PIN_A1-touch:focus, - .sim-PIN_A2-touch:focus, - .sim-PIN_A3-touch:focus, - .sim-PIN_A4-touch:focus, - .sim-PIN_A5-touch:focus, - .sim-PIN_A6-touch:focus, - .sim-PIN_A7-touch:focus{ - stroke:#4D90FE; - stroke-width:2px; - } - - .pin-pressed{ - stroke:orange !important; - stroke-width:1px; - } -`; diff --git a/src/view/components/cpx/Svg_utils.tsx b/src/view/components/cpx/Svg_utils.tsx deleted file mode 100644 index 92836b923..000000000 --- a/src/view/components/cpx/Svg_utils.tsx +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Adapted from : https://github.com/microsoft/pxt/blob/master/pxtsim/svg.ts - -// tslint:disable-next-line: no-namespace -namespace svg { - export function addClass(el: SVGElement, cls: string) { - if (el.classList) { - el.classList.add(cls); - } else if (el.className.baseVal.indexOf(cls) < 0) { - el.className.baseVal += " " + cls; - } - } - - export function removeClass(el: SVGElement, cls: string) { - if (el.classList) { - el.classList.remove(cls); - } else { - el.className.baseVal = el.className.baseVal - .replace(cls, "") - .replace(/\s{2,}/, " "); - } - } - - export function hydrate(el: SVGElement, props: any) { - for (const k in props) { - if (k == "title") { - svg.title(el, props[k]); - } else { - el.setAttributeNS(null, k, props[k]); - } - } - } - - export function createElement(name: string, props?: any): SVGElement { - const newElement = document.createElementNS( - "http://www.w3.org/2000/svg", - name - ); - if (props) { - svg.hydrate(newElement, props); - } - return newElement; - } - - export function child( - parent: Element, - name: string, - props?: any - ): SVGElement { - const childElement = svg.createElement(name, props); - parent.appendChild(childElement); - return childElement; - } - - export function fill(el: SVGElement, c: string) { - el.style.fill = c; - } - - export function filter(el: SVGElement, c: string) { - el.style.filter = c; - } - - export function fills(els: SVGElement[], c: string) { - els.forEach(el => (el.style.fill = c)); - } - - export function mkTitle(txt: string): SVGTitleElement { - const t = svg.createElement("title") as SVGTitleElement; - t.textContent = txt; - return t; - } - - export function title(el: SVGElement, txt: string): SVGTitleElement { - const t = mkTitle(txt); - el.appendChild(t); - return t; - } - - export function setLed( - ledStatus: boolean, - offColor: string, - onColor: string, - ledElement: SVGElement | null, - gradientStopElement: SVGStopElement | null - ) { - if (ledStatus) { - ledElement?.setAttribute("fill", onColor); - gradientStopElement?.setAttribute("stop-opacity", "1"); - } else { - ledElement?.setAttribute("fill", offColor); - gradientStopElement?.setAttribute("stop-opacity", "0"); - } - } -} - -export default svg; diff --git a/src/view/components/cpx/__snapshots__/Cpx.spec.tsx.snap b/src/view/components/cpx/__snapshots__/Cpx.spec.tsx.snap deleted file mode 100644 index 960f9b501..000000000 --- a/src/view/components/cpx/__snapshots__/Cpx.spec.tsx.snap +++ /dev/null @@ -1,4666 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`CPX component should render correctly 1`] = ` -Array [ -
-
- The simulator will run the .py file you have focused on. -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
-
, -
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
, -] -`; diff --git a/src/view/components/microbit/Microbit.spec.tsx b/src/view/components/microbit/Microbit.spec.tsx deleted file mode 100644 index e948a1988..000000000 --- a/src/view/components/microbit/Microbit.spec.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { Microbit } from "./Microbit"; - -describe("Microbit component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); diff --git a/src/view/components/microbit/Microbit.tsx b/src/view/components/microbit/Microbit.tsx deleted file mode 100644 index b85565e67..000000000 --- a/src/view/components/microbit/Microbit.tsx +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { MICROBIT_TOOLBAR_ICON_ID } from "../../components/toolbar/SensorModalUtils"; -import { - GESTURES_MICROBIT, - SENSOR_LIST, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, -} from "../../constants"; -import "../../styles/Simulator.css"; -import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; -import { sendMessage } from "../../utils/MessageUtils"; -import ToolBar from "../toolbar/ToolBar"; -import { MicrobitSimulator } from "./MicrobitSimulator"; - -// Component grouping the functionality for micro:bit functionalities -interface IState { - sensors: { [key: string]: number }; - currentSelectedGesture?: string; -} -const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - }, - currentSelectedGesture: GESTURES_MICROBIT[0], -}; - -export class Microbit extends React.Component<{}, IState> { - state = DEFAULT_STATE; - - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; - - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; - updateGesture = (event: React.ChangeEvent) => { - this.setState({ currentSelectedGesture: event.target.value }); - }; - sendGesture = (isActive: boolean) => { - if (this.state.currentSelectedGesture) { - if (isActive) { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: this.state.currentSelectedGesture, - }); - } else { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: "", - }); - } - } - }; -} - -const MICROBIT_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, - }, - { - image: TOOLBAR_SVG.RED_LED_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LEDS, - }, - { - image: TOOLBAR_SVG.TEMPERATURE_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, - }, - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - }, - { - image: TOOLBAR_SVG.GESTURE_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.GESTURE, - }, - { - image: TOOLBAR_SVG.GPIO_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.GPIO, - }, - { - image: TOOLBAR_SVG.COMPASS_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.COMPASS, - }, - { - image: TOOLBAR_SVG.SPEAKER_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.SOUND, - }, - { - image: TOOLBAR_SVG.WIRELESS_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.WIRELESS, - }, -]; diff --git a/src/view/components/microbit/MicrobitImage.tsx b/src/view/components/microbit/MicrobitImage.tsx deleted file mode 100644 index a216dceef..000000000 --- a/src/view/components/microbit/MicrobitImage.tsx +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { BUTTON_CLASSNAME, VIEW_STATE } from "../../constants"; -import CONSTANTS, { BUTTON_STYLING_CLASSES } from "../../constants"; -import { ViewStateContext } from "../../context"; -import { IRefObject, MicrobitSvg } from "./Microbit_svg"; - -interface EventTriggers { - onMouseUp: (event: Event, buttonKey: string) => void; - onMouseDown: (event: Event, buttonKey: string) => void; - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; -} -interface IProps { - eventTriggers: EventTriggers; - leds: number[][]; -} - -export enum BUTTONS_KEYS { - BTN_A = "BTN_A", - BTN_B = "BTN_B", - BTN_AB = "BTN_AB", -} -// Displays the SVG and call necessary svg modification. -export class MicrobitImage extends React.Component { - private svgRef: React.RefObject = React.createRef(); - constructor(props: IProps) { - super(props); - } - componentDidMount() { - const svgElement = this.svgRef.current; - if (svgElement) { - updateAllLeds(this.props.leds, svgElement.getLeds()); - setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); - this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); - } - } - componentDidUpdate() { - if (this.svgRef.current) { - updateAllLeds(this.props.leds, this.svgRef.current.getLeds()); - if (this.context === VIEW_STATE.PAUSE) { - disableAllButtons(this.svgRef.current.getButtons()); - } else if (this.context === VIEW_STATE.RUNNING) { - setupAllButtons( - this.props.eventTriggers, - this.svgRef.current.getButtons() - ); - } - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.eventTriggers.onKeyEvent(event, true, event.key); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.eventTriggers.onKeyEvent(event, false, event.key); - }; - render() { - return ; - } - public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { - const button = this.svgRef.current?.getButtons()[key].current; - if (button) { - button.focus(); - if (isActive) { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.KEYPRESSED - ); - } else { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.DEFAULT - ); - } - button.setAttribute("pressed", `${isActive}`); - button.setAttribute("aria-pressed", `${isActive}`); - } - } -} - -MicrobitImage.contextType = ViewStateContext; -const setupButton = ( - buttonElement: SVGRectElement, - eventTriggers: EventTriggers, - key: string -) => { - buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); - - buttonElement.onmousedown = e => { - buttonElement.focus(); - eventTriggers.onMouseDown(e, key); - }; - buttonElement.onmouseup = e => { - eventTriggers.onMouseUp(e, key); - }; - - buttonElement.onkeydown = e => { - // ensure that the keydown is enter, - // or else it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - eventTriggers.onKeyEvent(e, true, key); - } - }; - buttonElement.onkeyup = e => { - eventTriggers.onKeyEvent(e, false, key); - }; -}; -const setupAllButtons = ( - eventTriggers: EventTriggers, - buttonRefs: IRefObject -) => { - for (const [key, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - setupButton(ref.current, eventTriggers, key); - } - } -}; -const disableAllButtons = (buttonRefs: IRefObject) => { - for (const [, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - // to implement - ref.current.onmousedown = null; - ref.current.onmouseup = null; - ref.current.onkeydown = null; - ref.current.onkeyup = null; - ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); - } - } -}; -const updateAllLeds = ( - leds: number[][], - ledRefs: Array>> -) => { - for (let j = 0; j < leds.length; j++) { - for (let i = 0; i < leds[0].length; i++) { - const ledElement = ledRefs[j][i].current; - if (ledElement) { - setupLed(ledElement, leds[i][j]); - } - } - } -}; -const setupLed = (ledElement: SVGRectElement, brightness: number) => { - ledElement.style.opacity = (brightness / 10).toString(); -}; diff --git a/src/view/components/microbit/MicrobitSimulator.tsx b/src/view/components/microbit/MicrobitSimulator.tsx deleted file mode 100644 index d3507710c..000000000 --- a/src/view/components/microbit/MicrobitSimulator.tsx +++ /dev/null @@ -1,259 +0,0 @@ -import * as React from "react"; -import { - AB_BUTTONS_KEYS, - CONSTANTS, - DEVICE_LIST_KEY, - VIEW_STATE, - WEBVIEW_MESSAGES, -} from "../../constants"; -import { ViewStateContext } from "../../context"; -import PlayLogo from "../../svgs/play_svg"; -import StopLogo from "../../svgs/stop_svg"; -import { sendMessage } from "../../utils/MessageUtils"; -import ActionBar from "../simulator/ActionBar"; -import { BUTTONS_KEYS, MicrobitImage } from "./MicrobitImage"; - -const DEFAULT_MICROBIT_STATE: IMicrobitState = { - leds: [ - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - ], - buttons: { button_a: false, button_b: false }, -}; - -interface IState { - active_editors: string[]; - running_file?: string; - currently_selected_file: string; - play_button: boolean; - selected_file: string; - microbit: IMicrobitState; - sendGesture?: (isActive: boolean) => void; -} - -interface IMicrobitState { - leds: number[][]; - buttons: { button_a: boolean; button_b: boolean }; -} -export class MicrobitSimulator extends React.Component { - private imageRef: React.RefObject = React.createRef(); - constructor() { - super({}); - this.state = { - microbit: DEFAULT_MICROBIT_STATE, - play_button: false, - selected_file: "", - active_editors: [], - running_file: undefined, - currently_selected_file: "", - }; - this.onKeyEvent = this.onKeyEvent.bind(this); - } - handleMessage = (event: any): void => { - const message = event.data; - - if (message.active_device !== DEVICE_LIST_KEY.MICROBIT) { - return; - } - - switch (message.command) { - case "reset-state": - this.setState({ - microbit: DEFAULT_MICROBIT_STATE, - play_button: false, - }); - break; - case "set-state": - this.setState({ - microbit: { - ...this.state.microbit, - leds: message.state.leds, - }, - }); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - }); - break; - case "visible-editors": - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } - - break; - } - }; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } - - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
-
- -
- -
- ); - } - - protected togglePlayClick = () => { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - }; - - protected refreshSimulatorClick = () => { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - }; - protected handleButtonClick = (key: string, isActive: boolean) => { - let newButtonState = this.state.microbit.buttons; - switch (key) { - case AB_BUTTONS_KEYS.BTN_A: - newButtonState.button_a = isActive; - break; - case AB_BUTTONS_KEYS.BTN_B: - newButtonState.button_b = isActive; - break; - case AB_BUTTONS_KEYS.BTN_AB: - newButtonState = { - button_a: isActive, - button_b: isActive, - }; - break; - } - sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); - this.setState({ - microbit: { - ...this.state.microbit, - buttons: newButtonState, - }, - }); - }; - - protected onMouseUp = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, false); - }; - - protected onMouseDown = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, true); - }; - - protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { - event.stopPropagation(); - if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(key, active); - if (key === BUTTONS_KEYS.BTN_A) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if (key === BUTTONS_KEYS.BTN_B) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if (key === BUTTONS_KEYS.BTN_AB) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); - - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); - - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); - - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } - } -} -MicrobitSimulator.contextType = ViewStateContext; diff --git a/src/view/components/microbit/Microbit_svg.tsx b/src/view/components/microbit/Microbit_svg.tsx deleted file mode 100644 index c3d95fdbb..000000000 --- a/src/view/components/microbit/Microbit_svg.tsx +++ /dev/null @@ -1,1890 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// Adapted from : https://makecode.microbit.org/#editor - -import * as React from "react"; -import "../../styles/SimulatorSvg.css"; - -export interface IRefObject { - [key: string]: React.RefObject; -} -/* tslint:disable */ - -const N_LED_COLUMN = 5; -const N_LED_ROW = 5; -export class MicrobitSvg extends React.Component { - constructor(props: Readonly<{}>) { - super(props); - for (let j = 0; j < N_LED_ROW; j++) { - const led_row: React.RefObject[] = []; - for (let i = 0; i < N_LED_COLUMN; i++) { - led_row.push(React.createRef()); - } - this.ledRefs.push(led_row); - } - } - private svgRef: React.RefObject = React.createRef(); - - private buttonRefs: IRefObject = { - BTN_A: React.createRef(), - BTN_B: React.createRef(), - BTN_AB: React.createRef(), - }; - - private ledRefs: React.RefObject[][] = []; - public getSvgRef(): React.RefObject { - return this.svgRef; - } - public getButtons(): IRefObject { - return this.buttonRefs; - } - public getLeds(): React.RefObject[][] { - return this.ledRefs; - } - - render() { - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (0,0) - - - - (1,0) - - - - (2,0) - - - - (3,0) - - - - (4,0) - - - - (0,1) - - - - (1,1) - - - - (2,1) - - - - (3,1) - - - - (4,1) - - - - (0,2) - - - - (1,2) - - - - (2,2) - - - - (3,2) - - - - (4,2) - - - - (0,3) - - - - (1,3) - - - - (2,3) - - - - (3,3) - - - - (4,3) - - - - (0,4) - - - - (1,4) - - - - (2,4) - - - - (3,4) - - - - (4,4) - - - - - - - - - - P0, ANALOG IN - - - P1, ANALOG IN - - - P2, ANALOG IN - - - P3, ANALOG IN, LED Col 1 - - - P4, ANALOG IN, LED Col 2 - - - P5, BUTTON A - - - P6, LED Col 9 - - - P7, LED Col 8 - - - P8 - - - P9, LED Col 7 - - - P10, ANALOG IN, LED Col 3 - - - P11, BUTTON B - - - P12, RESERVED ACCESSIBILITY - - - P13, SPI - SCK - - - P14, SPI - MISO - - - P15, SPI - MOSI - - - P16, SPI - Chip Select - - - P17, +3v3 - - - P18, +3v3 - - - P19, I2C - SCL - - - P20, I2C - SDA - - - GND - - - GND - - - +3v3 - - - GND - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - - - - - - - - - - - - - - -
- ); - } -} diff --git a/src/view/components/microbit/__snapshots__/Microbit.spec.tsx.snap b/src/view/components/microbit/__snapshots__/Microbit.spec.tsx.snap deleted file mode 100644 index 9e167bbca..000000000 --- a/src/view/components/microbit/__snapshots__/Microbit.spec.tsx.snap +++ /dev/null @@ -1,3238 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Microbit component should render correctly 1`] = ` -Array [ -
-
- The simulator will run the .py file you have focused on. -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (0,0) - - - - - - (1,0) - - - - - - (2,0) - - - - - - (3,0) - - - - - - (4,0) - - - - - - (0,1) - - - - - - (1,1) - - - - - - (2,1) - - - - - - (3,1) - - - - - - (4,1) - - - - - - (0,2) - - - - - - (1,2) - - - - - - (2,2) - - - - - - (3,2) - - - - - - (4,2) - - - - - - (0,3) - - - - - - (1,3) - - - - - - (2,3) - - - - - - (3,3) - - - - - - (4,3) - - - - - - (0,4) - - - - - - (1,4) - - - - - - (2,4) - - - - - - (3,4) - - - - - - (4,4) - - - - - - - - - - - - P0, ANALOG IN - - - - - P1, ANALOG IN - - - - - P2, ANALOG IN - - - - - P3, ANALOG IN, LED Col 1 - - - - - P4, ANALOG IN, LED Col 2 - - - - - P5, BUTTON A - - - - - P6, LED Col 9 - - - - - P7, LED Col 8 - - - - - P8 - - - - - P9, LED Col 7 - - - - - P10, ANALOG IN, LED Col 3 - - - - - P11, BUTTON B - - - - - P12, RESERVED ACCESSIBILITY - - - - - P13, SPI - SCK - - - - - P14, SPI - MISO - - - - - P15, SPI - MOSI - - - - - P16, SPI - Chip Select - - - - - P17, +3v3 - - - - - P18, +3v3 - - - - - P19, I2C - SCL - - - - - P20, I2C - SDA - - - - - GND - - - - - GND - - - - - +3v3 - - - - - GND - - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
-
, -
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
, -] -`; diff --git a/src/view/components/simulator/ActionBar.tsx b/src/view/components/simulator/ActionBar.tsx deleted file mode 100644 index b760817b8..000000000 --- a/src/view/components/simulator/ActionBar.tsx +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { CONSTANTS } from "../../constants"; -import RefreshLogo from "../../svgs/refresh_svg"; -import Button from "../Button"; - -interface IProps { - onTogglePlay: (event: React.MouseEvent) => void; - onToggleRefresh: (event: React.MouseEvent) => void; - playStopImage: JSX.Element; - playStopLabel: string; -} - -// Component including the actions done on the Simulator (play/stop, refresh) - -class ActionBar extends React.Component { - public render() { - const { - onTogglePlay, - onToggleRefresh, - playStopImage, - playStopLabel, - } = this.props; - return ( -
-
- ); - } -} -export default ActionBar; diff --git a/src/view/components/toolbar/GenericSliderComponent.tsx b/src/view/components/toolbar/GenericSliderComponent.tsx deleted file mode 100644 index 273896621..000000000 --- a/src/view/components/toolbar/GenericSliderComponent.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import * as React from "react"; -import { SENSOR_LIST } from "../../constants"; -import { ISensorProps, ISliderProps } from "../../viewUtils"; -import InputSlider from "./InputSlider"; - -interface IProps { - axisProperties: ISensorProps; - axisValues: { - // key is accessed with axisLabel - [key: string]: number; - }; - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void; -} -export const GenericSliderComponent: React.FC = props => { - return ( -
- {props.axisProperties.sliderProps.map( - (sliderProperties: ISliderProps, index: number) => { - return ( - - -
-
- ); - } - )} -
- ); -}; diff --git a/src/view/components/toolbar/Gesture.tsx b/src/view/components/toolbar/Gesture.tsx deleted file mode 100644 index a89a3bd5c..000000000 --- a/src/view/components/toolbar/Gesture.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import * as React from "react"; -import { CONSTANTS } from "../../constants"; -import { Dropdown } from "../Dropdown"; -import SensorButton from "./SensorButton"; - -const GESTURE_BUTTON_MESSAGE = "Send Gesture"; -interface IProps { - gestures: string[]; - onSelectGestures?: (event: React.ChangeEvent) => void; - onSendGesture?: (isActive: boolean) => void; -} -export class Gesture extends React.Component { - private sensorButtonRef: React.RefObject = React.createRef(); - render() { - return ( -
- - { - if (this.props.onSendGesture) { - this.props.onSendGesture(true); - } - }} - onMouseUp={() => { - if (this.props.onSendGesture) { - this.props.onSendGesture(false); - } - }} - onKeyDown={this.handleOnKeyDown} - onKeyUp={this.handleOnKeyUp} - type="gesture" - /> -
- ); - } - private handleOnKeyDown = (e: React.KeyboardEvent) => { - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - this.sensorButtonRef!.current!.setButtonClass(true); - if (this.props.onSendGesture) { - this.props.onSendGesture(true); - } - } - }; - - private handleOnKeyUp = ( - e: React.KeyboardEvent, - onSendGesture?: (isActive: boolean) => void - ) => { - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - this.sensorButtonRef!.current!.setButtonClass(false); - - if (this.props.onSendGesture) { - this.props.onSendGesture(false); - } - } - }; -} diff --git a/src/view/components/toolbar/InputSlider.tsx b/src/view/components/toolbar/InputSlider.tsx deleted file mode 100644 index adfbcef60..000000000 --- a/src/view/components/toolbar/InputSlider.tsx +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { SENSOR_LIST, VIEW_STATE, WEBVIEW_MESSAGES } from "../../constants"; -import { ViewStateContext } from "../../context"; -import "../../styles/InputSlider.css"; -import { sendMessage } from "../../utils/MessageUtils"; -import { ISliderProps } from "../../viewUtils"; - -class InputSlider extends React.Component { - constructor(props: ISliderProps) { - super(props); - this.state = { - value: this.props.value, - }; - - this.handleOnChange = this.handleOnChange.bind(this); - this.validateRange = this.validateRange.bind(this); - } - - render() { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; - - const nbDecimals = - this.props.step.toString().split(".")[1]?.length || 0; - return ( -
- {this.props.axisLabel} - 0 ? 1 : 0}}[0-9]{0,${nbDecimals}}$`} - onKeyUp={this.handleOnChange} - style={{ width: this.getMaximumBoxWidth() + "ch" }} - aria-label={`${this.props.type} sensor input ${this.props.axisLabel}`} - /> - - - {this.props.minValue} - {this.props.maxValue} - - - - {this.props.minLabel} - {this.props.maxLabel} - - -
- ); - } - - private getMaximumBoxWidth = () => { - return ( - Math.max( - this.props.minValue.toString().length, - this.props.maxValue.toString().length - ) + 2 - ); - }; - - private handleOnChange = (event: any) => { - const validatedValue = this.validateRange(this.updateValue(event)); - const newSensorState = this.writeMessage(validatedValue); - if (newSensorState) { - sendMessage(WEBVIEW_MESSAGES.SENSOR_CHANGED, newSensorState); - } - }; - - private writeMessage = (valueTowrite: number) => { - let value = valueTowrite; - if (value > this.props.maxValue || value < this.props.minValue) { - value = parseInt(this.state.value, 10); - } - - return this.props.type && this.state.value !== undefined - ? { [this.props.type]: value } - : undefined; - }; - - private updateValue = (event: any) => { - const newValue = event.target.validity.valid - ? event.target.value - : this.state.value; - if (this.props.onUpdateValue) { - this.props.onUpdateValue(this.props.type as SENSOR_LIST, newValue); - } - return newValue; - }; - - private sendTelemetry = () => { - sendMessage(WEBVIEW_MESSAGES.SLIDER_TELEMETRY, this.props.type); - }; - - private validateRange = (valueString: string) => { - let valueInt = parseFloat(valueString); - if (valueInt < this.props.minValue) { - valueInt = this.props.minValue; - this.setState({ value: valueInt }); - } else if (valueInt > this.props.maxValue) { - valueInt = this.props.maxValue; - this.setState({ value: valueInt }); - } - return valueInt; - }; -} -InputSlider.contextType = ViewStateContext; - -export default InputSlider; diff --git a/src/view/components/toolbar/SensorButton.tsx b/src/view/components/toolbar/SensorButton.tsx deleted file mode 100644 index b50759bd4..000000000 --- a/src/view/components/toolbar/SensorButton.tsx +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { VIEW_STATE } from "../../constants"; -import { ViewStateContext } from "../../context"; -import "../../styles/SensorButton.css"; -import { ISensorButtonProps } from "../../viewUtils"; - -class SensorButton extends React.Component { - private buttonRef: React.RefObject = React.createRef(); - - public setButtonClass = (isActive: boolean) => { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; - - if (isActive && !isInputDisabled) { - this.buttonRef.current?.setAttribute( - "class", - "sensor-button active-button" - ); - } else if (this.buttonRef.current) { - this.buttonRef!.current!.setAttribute("class", "sensor-button"); - } - }; - render() { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; - - return ( - - ); - } -} -SensorButton.contextType = ViewStateContext; -export default SensorButton; diff --git a/src/view/components/toolbar/SensorModalUtils.tsx b/src/view/components/toolbar/SensorModalUtils.tsx deleted file mode 100644 index c7ea53f85..000000000 --- a/src/view/components/toolbar/SensorModalUtils.tsx +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. -import * as React from "react"; -import { SENSOR_LIST } from "../../constants"; -import { ARROW_RIGHT_SVG } from "../../svgs/arrow_right_svg"; -import * as CLUE_MODAL from "./clue/ClueModalContent"; -import * as CPX_MODAL from "./cpx/CpxModalContent"; -import * as MICROBIT_MODAL from "./microbit/MicrobitModalContent"; - -export const TRY_IT_MAKE_CODE = ( - -); - -export const FEATURE_REQUEST_ON_GITHUB = ( - -); - -export const TOOLBAR_ICON_LABEL = { - GPIO: "GPIO", - IR: "IR", - LEFT_EDGE: "left-edge", - LIGHT: "Light sensor", - MOTION: "Motion Sensor", - NEO_PIXEL: "Neo Pixels", - PUSH_BUTTON: "Push Button", - RED_LED: "Red LED", - RIGHT_EDGE: "right-edge", - SOUND: "Sound Sensor", - SPEAKER: "Speaker", - SWITCH: "Switch", - TAG_INPUT: "Tag Input", - TAG_OUTPUT: "Tag Output", - TEMPERATURE: "Temperature Sensor", - WIRELESS: "Bluetooth and Radio", -}; -export const CPX_TOOLBAR_ICON_ID = { - GPIO: "toolbar-gpio", - IR: "toolbar-ir-sensor", - LEFT_EDGE: "left-edge", - LIGHT: "toolbar-light-sensor", - MOTION: "toolbar-motion-sensor", - NEO_PIXEL: "toolbar-neo-pixels", - PUSH_BUTTON: "toolbar-a-b-push", - RED_LED: "toolbar-red-led", - RIGHT_EDGE: "right-edge", - SOUND: "toolbar-sound-sensor", - SPEAKER: "toolbar-speaker", - SWITCH: "toolbar-slider-switch", - TEMPERATURE: "toolbar-temperature-sensor", -}; - -export const MICROBIT_TOOLBAR_ICON_ID = { - TEMPERATURE: "toolbar-microbit-temperature-sensor", - LIGHT: "toolbar-microbit-light-sensor", - ACCELEROMETER: "toolbar-accelerometer-sensor", - LEDS: "toolbar-microbit-led", - PUSH_BUTTON: "toolbar-microbit-a-b-push", - GPIO: "toolbar-gpio", - SOUND: "toolbar-microbit-sound", - WIRELESS: "toolbar-microbit-wireless", - GESTURE: "toolbar-microbit-gesture-sensor", - COMPASS: "toolbar-microbit-compass-sensor", -}; - -export const CLUE_TOOLBAR_ICON_ID = { - TEMPERATURE: "toolbar-clue-temperature-sensor", - LIGHT: "toolbar-clue-light-sensor", - ACCELEROMETER: "toolbar-clue-accelerometer-sensor", - LEDS: "toolbar-clue-led", - PUSH_BUTTON: "toolbar-clue-a-b-push", - GPIO: "toolbar-clue-gpio", - SPEAKER: "toolbar-speaker", - SOUND: "toolbar-clue-sound-sensor", - PRESSURE: "toolbar-clue-pressure-sensor", - HUMIDITY: "toolbar-clue-humidity-sensor", - GESTURE: "toolbar-clue-gesture-sensor", - PROXIMITY: "toolbar-clue-proximity-sensor", - BLUETOOTH: "toolbar-clue-bluetooth", - MAGNETOSCOPE: "toolbar-clue-magnet-sensor", - GYROSCOPE: "toolbar-clue-gyroscope-sensor", -}; - -export interface IModalContent { - components: any; - descriptionText: string; - descriptionTitle: string; - id: string; - tagInput: any; - tagOutput: any; - tryItDescription: string; -} - -export const DEFAULT_MODAL_CONTENT: IModalContent = { - descriptionTitle: "default", - tagInput: undefined, - tagOutput: undefined, - descriptionText: "none", - tryItDescription: "none", - components: undefined, - id: "none", -}; - -export const LABEL_TO_MODAL_CONTENT_CONSTRUCTOR = new Map([ - [CPX_TOOLBAR_ICON_ID.GPIO, CPX_MODAL.GPIO_CONTENT], - [CPX_TOOLBAR_ICON_ID.IR, CPX_MODAL.IR_CONTENT], - [CPX_TOOLBAR_ICON_ID.LIGHT, CPX_MODAL.LIGHT_CONTENT], - [CPX_TOOLBAR_ICON_ID.MOTION, CPX_MODAL.MOTION_CONTENT], - [CPX_TOOLBAR_ICON_ID.NEO_PIXEL, CPX_MODAL.NEOP_CONTENT], - [CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, CPX_MODAL.PUSHB_CONTENT], - [CPX_TOOLBAR_ICON_ID.RED_LED, CPX_MODAL.RED_LED_CONTENT], - [CPX_TOOLBAR_ICON_ID.SOUND, CPX_MODAL.SOUND_CONTENT], - [CPX_TOOLBAR_ICON_ID.SPEAKER, CPX_MODAL.SPEAKER_CONTENT], - [CPX_TOOLBAR_ICON_ID.SWITCH, CPX_MODAL.SWITCH_CONTENT], - [CPX_TOOLBAR_ICON_ID.TEMPERATURE, CPX_MODAL.TEMPERATURE_CONTENT], - [ - MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - MICROBIT_MODAL.ACCELEROMETER_CONTENT, - ], - [MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, MICROBIT_MODAL.TEMPERATURE_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.LIGHT, MICROBIT_MODAL.LIGHT_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.LEDS, MICROBIT_MODAL.LED_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, MICROBIT_MODAL.BUTTON_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.GPIO, MICROBIT_MODAL.GPIO_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.SOUND, MICROBIT_MODAL.SOUND_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.WIRELESS, MICROBIT_MODAL.WIRELESS_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], - [CLUE_TOOLBAR_ICON_ID.TEMPERATURE, CLUE_MODAL.TEMPERATURE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, CLUE_MODAL.BUTTON_CONTENT], - [CLUE_TOOLBAR_ICON_ID.GPIO, CLUE_MODAL.GPIO_CONTENT], - [CLUE_TOOLBAR_ICON_ID.LIGHT, CLUE_MODAL.LIGHT_CONTENT], - [CLUE_TOOLBAR_ICON_ID.LEDS, CLUE_MODAL.LED_CONTENT], - [CLUE_TOOLBAR_ICON_ID.SOUND, CLUE_MODAL.SOUND_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PRESSURE, CLUE_MODAL.PRESSURE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.HUMIDITY, CLUE_MODAL.HUMIDITY_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PROXIMITY, CLUE_MODAL.PROXIMITY_CONTENT], - [CLUE_TOOLBAR_ICON_ID.BLUETOOTH, CLUE_MODAL.BLUETOOTH_CONTENT], - [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.SPEAKER, CLUE_MODAL.SPEAKER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.GYROSCOPE, CLUE_MODAL.GYROSCOPE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, CLUE_MODAL.MAGNETOSCOPE_CONTENT], -]); - -export const getModalContent = ( - label: string, - onUpdateValue: (onUpdateValue: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number }, - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void -) => { - if (label === CLUE_TOOLBAR_ICON_ID.GESTURE) { - return CLUE_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); - } else if (label === MICROBIT_TOOLBAR_ICON_ID.GESTURE) { - return MICROBIT_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); - } - const modalContentConstructor = LABEL_TO_MODAL_CONTENT_CONSTRUCTOR.get( - label - ); - if (modalContentConstructor) { - return modalContentConstructor(onUpdateValue, sensorValues); - } else { - return; - } -}; diff --git a/src/view/components/toolbar/ToolBar.tsx b/src/view/components/toolbar/ToolBar.tsx deleted file mode 100644 index a2a3ee1a2..000000000 --- a/src/view/components/toolbar/ToolBar.tsx +++ /dev/null @@ -1,221 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. -import { initializeIcons } from "@uifabric/icons"; -import { Callout, TooltipHost } from "office-ui-fabric-react"; -import { IconButton } from "office-ui-fabric-react"; -import * as React from "react"; -import { - FormattedMessage, - injectIntl, - WrappedComponentProps, -} from "react-intl"; -import { SENSOR_LIST } from "../../constants"; -import "../../styles/ToolBar.css"; -import Button from "../Button"; -import { - DEFAULT_MODAL_CONTENT, - getModalContent, - IModalContent, -} from "./SensorModalUtils"; - -interface IToolbarState { - currentOpenedId: string; - showModal: boolean; - isDescriptionVisible: boolean; -} - -interface IProps extends WrappedComponentProps { - buttonList: Array<{ - label: any; - image: any; - }>; - onUpdateSensor: (sensor: SENSOR_LIST, value: number) => void; - sensorValues: { [key: string]: number }; - onSelectGesture?: (event: React.ChangeEvent) => void; - sendGesture?: (isActive: boolean) => void; -} - -class ToolBar extends React.Component { - private readonly TOOLBAR_BUTTON_WIDTH: number = 32; - - constructor(props: IProps) { - super(props); - initializeIcons(); - this.state = { - currentOpenedId: "", - isDescriptionVisible: false, - showModal: false, - }; - } - - public render() { - const { buttonList } = this.props; - return ( -
-
-
- {buttonList.map( - (currrentButton: any, index: number) => { - return ( - ( - - ), - }} - key={index} - > -
- {this.getIconModal()} -
-
- ); - } - - private handleOnClick = ( - event: React.MouseEvent, - label: string - ) => { - if ( - !this.state.showModal && - this.state.currentOpenedId === "" && - this.state.currentOpenedId !== label - ) { - this.openModal(label); - } else { - this.closeCurrentModal(); - if (this.state.currentOpenedId !== label) { - this.openModal(label); - } - } - }; - - private changePressedState(id: string, pressed: boolean) { - const elt = window.document.getElementById(`${id}-button`); - if (elt) { - pressed - ? elt.classList.add("button-pressed") - : elt.classList.remove("button-pressed"); - } - } - private closeCurrentModal = () => { - this.changePressedState(this.state.currentOpenedId, false); - this.setState({ - currentOpenedId: "", - showModal: false, - }); - }; - - private openModal = (label: string) => { - this.setState({ - currentOpenedId: label, - showModal: true, - }); - this.changePressedState(label, true); - }; - - private onShowDescriptionClicked = (): void => { - this.setState({ - isDescriptionVisible: !this.state.isDescriptionVisible, - }); - }; - - private onDescriptionDismiss = (): void => { - this.setState({ - isDescriptionVisible: false, - }); - }; - - private getIconModal() { - if ( - !this.state.showModal || - !getModalContent( - this.state.currentOpenedId, - this.props.onUpdateSensor, - this.props.sensorValues, - this.props.onSelectGesture, - this.props.sendGesture - ) - ) { - return null; - } - - const content = getModalContent( - this.state.currentOpenedId, - this.props.onUpdateSensor, - this.props.sensorValues, - this.props.onSelectGesture, - this.props.sendGesture - ) as IModalContent; - - const components = content - ? content.components - : DEFAULT_MODAL_CONTENT.components; - - return ( -
-
- - - {content.tagInput} - {content.tagOutput} - - -
-
- {this.state.isDescriptionVisible && ( - -
- -
-
- )} -
-
- - - -
- -
{components}
-
-
- ); - } -} - -export default injectIntl(ToolBar); diff --git a/src/view/components/toolbar/Toolbar.spec.tsx b/src/view/components/toolbar/Toolbar.spec.tsx deleted file mode 100644 index bd122082e..000000000 --- a/src/view/components/toolbar/Toolbar.spec.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { SENSOR_LIST } from "../../constants"; -import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; -import { MICROBIT_TOOLBAR_ICON_ID } from "./SensorModalUtils"; -import Toolbar from "./ToolBar"; - -const MOCK_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - }, -]; -const mockUpdateSensors = () => { - return; -}; -const mockInitialValues = { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, -}; -describe("Toolbar component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); diff --git a/src/view/components/toolbar/__snapshots__/Toolbar.spec.tsx.snap b/src/view/components/toolbar/__snapshots__/Toolbar.spec.tsx.snap deleted file mode 100644 index de9a7a42d..000000000 --- a/src/view/components/toolbar/__snapshots__/Toolbar.spec.tsx.snap +++ /dev/null @@ -1,143 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Toolbar component should render correctly 1`] = ` -
-
-
-
- -
-
- -
-
-
-
-`; diff --git a/src/view/components/toolbar/clue/ClueModalContent.tsx b/src/view/components/toolbar/clue/ClueModalContent.tsx deleted file mode 100644 index 250e61388..000000000 --- a/src/view/components/toolbar/clue/ClueModalContent.tsx +++ /dev/null @@ -1,318 +0,0 @@ -import * as React from "react"; -import { GESTURES_CLUE, SENSOR_LIST } from "../../../constants"; -import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; -import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; -import { GenericSliderComponent } from "../GenericSliderComponent"; -import { Gesture } from "../Gesture"; -import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; -import * as SENSOR_PROPERTIES from "./ClueSensorProperties"; - -export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-clue-temperature-sensor.description", - descriptionTitle: "toolbar-clue-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-temperature-sensor.tryItDescription", - }; -}; - -export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-gpio.description", - tryItDescription: "toolbar-clue-gpio.tryItDescription", - components: undefined, - id: "GPIO", - }; -}; - -export const ACCELEROMETER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const accelerometerSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-accelerometer-sensor.description", - descriptionTitle: "toolbar-clue-accelerometer-sensor.title", - id: "accelerometer", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-accelerometer-sensor.tryItDescription", - }; -}; -export const GYROSCOPE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const gyroSensorValues = { - X: sensorValues[SENSOR_LIST.GYRO_X], - Y: sensorValues[SENSOR_LIST.GYRO_Y], - Z: sensorValues[SENSOR_LIST.GYRO_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-gyroscope-sensor.description", - descriptionTitle: "toolbar-clue-gyroscope-sensor.title", - id: "gyroscope", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-gyroscope-sensor.tryItDescription", - }; -}; -export const MAGNETOSCOPE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const magnetSensorValues = { - X: sensorValues[SENSOR_LIST.MAGNET_X], - Y: sensorValues[SENSOR_LIST.MAGNET_Y], - Z: sensorValues[SENSOR_LIST.MAGNET_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-magnet-sensor.description", - descriptionTitle: "toolbar-clue-magnet-sensor.title", - id: "magnetoscope", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-magnet-sensor.tryItDescription", - }; -}; - -export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const lightSensorValues = { - R: sensorValues[SENSOR_LIST.LIGHT_R], - G: sensorValues[SENSOR_LIST.LIGHT_G], - B: sensorValues[SENSOR_LIST.LIGHT_B], - C: sensorValues[SENSOR_LIST.LIGHT_C], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-light-sensor.description", - descriptionTitle: "toolbar-clue-light-sensor.title", - id: "light_sensor", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-light-sensor.tryItDescription", - }; -}; - -export const HUMIDITY_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const humiditySensorValues = { - H: sensorValues[SENSOR_LIST.HUMIDITY], - }; - return { - descriptionTitle: "toolbar-clue-humidity-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-humidity-sensor.description", - tryItDescription: "toolbar-clue-humidity-sensor.tryItDescription", - components: [ - , - ], - id: "humidity_sensor", - }; -}; - -export const GESTURE_CONTENT = ( - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-gesture-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-gesture-sensor.description", - tryItDescription: "toolbar-clue-gesture-sensor.tryItDescription", - components: [ - , - ], - id: "gesture_sensor", - }; -}; - -export const PROXIMITY_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const proximitySensorValues = { - P: sensorValues[SENSOR_LIST.PROXIMITY], - }; - return { - descriptionTitle: "toolbar-clue-proximity-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-proximity-sensor.description", - tryItDescription: "toolbar-clue-proximity-sensor.tryItDescription", - components: [ - , - ], - id: "proximity_sensor", - }; -}; - -export const PRESSURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const pressureSensorValues = { - P: sensorValues[SENSOR_LIST.PRESSURE], - }; - return { - descriptionTitle: "toolbar-clue-pressure-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-pressure-sensor.description", - tryItDescription: "toolbar-clue-pressure-sensor.tryItDescription", - components: [ - , - ], - id: "pressure_sensor", - }; -}; - -export const BUTTON_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-a-b-push.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-clue-a-b-push.description", - tryItDescription: "toolbar-clue-a-b-push.tryItDescription", - components: undefined, - id: "microbit_button", - }; -}; - -export const BLUETOOTH_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-bluetooth.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-clue-bluetooth.description", - tryItDescription: "toolbar-clue-bluetooth.tryItDescription", - components: undefined, - id: "bluetooth", - }; -}; - -export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-sound-sensor.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-sound-sensor.description", - tryItDescription: "toolbar-clue-sound-sensor.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "sound_sensor", - }; -}; - -export const LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-clue-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-led.description", - tryItDescription: "toolbar-clue-led.tryItDescription", - components: undefined, - id: "clue_neopixel", - }; -}; - -export const SPEAKER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-speaker.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-speaker.description", - tryItDescription: "toolbar-speaker.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "speaker", - }; -}; diff --git a/src/view/components/toolbar/clue/ClueSensorProperties.tsx b/src/view/components/toolbar/clue/ClueSensorProperties.tsx deleted file mode 100644 index ccb8d8e1b..000000000 --- a/src/view/components/toolbar/clue/ClueSensorProperties.tsx +++ /dev/null @@ -1,216 +0,0 @@ -import { SENSOR_LIST } from "../../../constants"; -import { ISensorProps, ISliderProps } from "../../../viewUtils"; - -const CLUE_SLIDER_R: ISliderProps = { - axisLabel: "R", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_R, - step: 1, -}; - -const CLUE_SLIDER_G: ISliderProps = { - axisLabel: "G", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_G, - step: 1, -}; - -const CLUE_SLIDER_B: ISliderProps = { - axisLabel: "B", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_B, - step: 1, -}; -const CLUE_SLIDER_C: ISliderProps = { - axisLabel: "C", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_C, - step: 1, -}; - -export const CLUE_LIGHT_PROPERTIES: ISensorProps = { - LABEL: "Light Sensor", - sliderProps: [CLUE_SLIDER_R, CLUE_SLIDER_G, CLUE_SLIDER_B, CLUE_SLIDER_C], - unitLabel: "Lux", -}; - -// Range for magnet found here https://www.adafruit.com/product/4479 -const CLUE_MAGNET_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_X, - step: 0.1, -}; -const CLUE_MAGNET_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_Y, - step: 0.1, -}; -const CLUE_MAGNET_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_Z, - step: 0.1, -}; - -export const CLUE_MAGNET_PROPERTIES: ISensorProps = { - LABEL: "Magnetoscope", - sliderProps: [CLUE_MAGNET_X, CLUE_MAGNET_Y, CLUE_MAGNET_Z], - unitLabel: "μT", -}; -const CLUE_GYRO_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_X, - step: 0.1, -}; -const CLUE_GYRO_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_Y, - step: 0.1, -}; -const CLUE_GYRO_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_Z, - step: 0.1, -}; - -export const CLUE_GYRO_PROPERTIES: ISensorProps = { - LABEL: "Gyroscope", - sliderProps: [CLUE_GYRO_X, CLUE_GYRO_Y, CLUE_GYRO_Z], - unitLabel: "deg/s", -}; - -export const CLUE_HUMIDITY_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "H", - maxLabel: "Max", - maxValue: 100, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.HUMIDITY, - step: 0.1, - }, - ], - unitLabel: "%", -}; -export const CLUE__PROXIMITY_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "P", - maxLabel: "Max", - maxValue: 255, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.PROXIMITY, - step: 1, - }, - ], - unitLabel: "", -}; -export const CLUE_PRESSURE_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "P", - maxLabel: "Max", - maxValue: 1100, - minLabel: "Min", - minValue: 800, - type: SENSOR_LIST.PRESSURE, - step: 0.1, - }, - ], - unitLabel: "hPa", -}; -const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 1023, - minLabel: "Left", - minValue: -1023, - type: SENSOR_LIST.MOTION_X, - step: 0.1, -}; - -const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 1023, - minLabel: "Back", - minValue: -1023, - type: SENSOR_LIST.MOTION_Y, - step: 0.1, -}; - -const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 1023, - minLabel: "Up", - minValue: -1023, - type: SENSOR_LIST.MOTION_Z, - step: 0.1, -}; - -export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "m/s2", -}; - -const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 0.1, -}; - -export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", -}; diff --git a/src/view/components/toolbar/cpx/CpxModalContent.tsx b/src/view/components/toolbar/cpx/CpxModalContent.tsx deleted file mode 100644 index 55166eb2a..000000000 --- a/src/view/components/toolbar/cpx/CpxModalContent.tsx +++ /dev/null @@ -1,198 +0,0 @@ -import * as React from "react"; -import { SENSOR_LIST } from "../../../constants"; -import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; -import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; -import { GenericSliderComponent } from "../GenericSliderComponent"; -import { - FEATURE_REQUEST_ON_GITHUB, - IModalContent, - TRY_IT_MAKE_CODE, -} from "../SensorModalUtils"; -import * as SENSOR_PROPERTIES from "./CpxSensorProperties"; - -export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-gpio.description", - tryItDescription: "toolbar-gpio.tryItDescription", - components: undefined, - id: "GPIO", - }; -}; - -export const IR_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-ir-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-ir-sensor.description", - tryItDescription: "toolbar-ir-sensor.tryItDescription", - components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], - id: "IR", - }; -}; -export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const lightSensorValues = { - L: sensorValues[SENSOR_LIST.LIGHT], - }; - return { - descriptionTitle: "toolbar-light-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-light-sensor.description", - tryItDescription: "toolbar-light-sensor.tryItDescription", - components: [ - , - ], - id: "light_sensor", - }; -}; -export const MOTION_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const motionSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - descriptionTitle: "toolbar-motion-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-motion-sensor.description", - tryItDescription: "toolbar-motion-sensor.tryItDescription", - components: [ - , - TRY_IT_MAKE_CODE, - FEATURE_REQUEST_ON_GITHUB, - ], - id: "motion_sensor", - }; -}; -export const NEOP_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-neo-pixels.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-neo-pixels.description", - tryItDescription: "toolbar-neo-pixels.tryItDescription", - components: undefined, - id: "neon_pixel", - }; -}; -export const PUSHB_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-a-b-push.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-a-b-push.description", - tryItDescription: "toolbar-a-b-push.tryItDescription", - components: undefined, - id: "push_btn", - }; -}; -export const RED_LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-red-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-red-led.description", - tryItDescription: "toolbar-red-led.tryItDescription", - components: undefined, - id: "red_LED", - }; -}; -export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-sound-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-sound-sensor.description", - tryItDescription: "toolbar-sound-sensor.tryItDescription", - components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], - id: "sound_sensor", - }; -}; -export const SWITCH_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-slider-switch.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-slider-switch.description", - tryItDescription: "toolbar-slider-switch.tryItDescription", - components: undefined, - id: "slider_switch", - }; -}; -export const SPEAKER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-speaker.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-speaker.description", - tryItDescription: "toolbar-speaker.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "speaker", - }; -}; -export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-temperature-sensor.description", - descriptionTitle: "toolbar-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-temperature-sensor.tryItDescription", - }; -}; diff --git a/src/view/components/toolbar/cpx/CpxSensorProperties.tsx b/src/view/components/toolbar/cpx/CpxSensorProperties.tsx deleted file mode 100644 index f91f91469..000000000 --- a/src/view/components/toolbar/cpx/CpxSensorProperties.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import { SENSOR_LIST } from "../../../constants"; -import { ISensorProps, ISliderProps } from "../../../viewUtils"; - -const LIGHT_SLIDER_PROPS: ISliderProps = { - maxValue: 320, - minValue: 0, - minLabel: "Dark", - maxLabel: "Bright", - type: "light", - axisLabel: "L", - step: 1, -}; - -export const LIGHT_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Light sensor", - sliderProps: [LIGHT_SLIDER_PROPS], - unitLabel: "Lux", -}; - -const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 0.1, -}; -export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", -}; - -const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 78, - minLabel: "Left", - minValue: -78, - type: SENSOR_LIST.MOTION_X, - step: 1, -}; -const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 78, - minLabel: "Back", - minValue: -78, - type: SENSOR_LIST.MOTION_Y, - step: 1, -}; -const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 78, - minLabel: "Up", - minValue: -78, - type: SENSOR_LIST.MOTION_Z, - step: 1, -}; - -export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "Lux", -}; diff --git a/src/view/components/toolbar/microbit/MicrobitModalContent.tsx b/src/view/components/toolbar/microbit/MicrobitModalContent.tsx deleted file mode 100644 index 6d4ae76ef..000000000 --- a/src/view/components/toolbar/microbit/MicrobitModalContent.tsx +++ /dev/null @@ -1,187 +0,0 @@ -import * as React from "react"; -import { GESTURES_MICROBIT, SENSOR_LIST } from "../../../constants"; -import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; -import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; -import { GenericSliderComponent } from "../GenericSliderComponent"; -import { Gesture } from "../Gesture"; -import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; -import * as SENSOR_PROPERTIES from "./MicrobitSensorProperties"; - -export const ACCELEROMETER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - // this object will be accessed with the axis label - const accelerometerSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-accelerometer-sensor.description", - descriptionTitle: "toolbar-accelerometer-sensor.title", - id: "accelerometer", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-accelerometer-sensor.tryItDescription", - }; -}; -export const LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-led.description", - tryItDescription: "toolbar-microbit-led.tryItDescription", - components: undefined, - id: "microbit_LED", - }; -}; - -export const BUTTON_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-a-b-push.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-microbit-a-b-push.description", - tryItDescription: "toolbar-microbit-a-b-push.tryItDescription", - components: undefined, - id: "microbit_button", - }; -}; -export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-sound.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-sound.description", - tryItDescription: "toolbar-microbit-sound.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_sound", - }; -}; -export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-gpio.description", - tryItDescription: "toolbar-microbit-gpio.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_gpio", - }; -}; -export const COMPASS_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-compass-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-compass-sensor.description", - tryItDescription: "toolbar-microbit-compass-sensor.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_compass", - }; -}; -export const WIRELESS_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-wireless.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-wireless.description", - tryItDescription: "toolbar-microbit-wireless.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_wireless", - }; -}; -export const GESTURE_CONTENT = ( - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void -): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-gesture-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-microbit-gesture-sensor.description", - tryItDescription: "toolbar-microbit-gesture-sensor.tryItDescription", - components: [ - , - ], - id: "gesture_sensor", - }; -}; -export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const lightSensorValues = { - L: sensorValues[SENSOR_LIST.LIGHT], - }; - return { - descriptionTitle: "toolbar-light-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-light-sensor.description", - tryItDescription: "toolbar-light-sensor.tryItDescription", - components: [ - , - ], - id: "light_sensor", - }; -}; - -export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } -): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-temperature-sensor.description", - descriptionTitle: "toolbar-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-temperature-sensor.tryItDescription", - }; -}; diff --git a/src/view/components/toolbar/microbit/MicrobitSensorProperties.tsx b/src/view/components/toolbar/microbit/MicrobitSensorProperties.tsx deleted file mode 100644 index c32b00477..000000000 --- a/src/view/components/toolbar/microbit/MicrobitSensorProperties.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import { SENSOR_LIST } from "../../../constants"; -import { ISensorProps, ISliderProps } from "../../../viewUtils"; - -const LIGHT_SLIDER_PROPS: ISliderProps = { - maxValue: 255, - minValue: 0, - minLabel: "Dark", - maxLabel: "Bright", - type: "light", - axisLabel: "L", - step: 1, -}; - -export const LIGHT_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Light sensor", - sliderProps: [LIGHT_SLIDER_PROPS], - unitLabel: "Lux", -}; - -const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 1023, - minLabel: "Left", - minValue: -1023, - type: SENSOR_LIST.MOTION_X, - step: 1, -}; - -const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 1023, - minLabel: "Back", - minValue: -1023, - type: SENSOR_LIST.MOTION_Y, - step: 1, -}; - -const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 1023, - minLabel: "Up", - minValue: -1023, - type: SENSOR_LIST.MOTION_Z, - step: 1, -}; - -export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "m/s2", -}; - -const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 1, -}; - -export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", -}; diff --git a/src/view/constants.ts b/src/view/constants.ts deleted file mode 100644 index 56dda92af..000000000 --- a/src/view/constants.ts +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license.a - -// Key events -export const CONSTANTS = { - CURRENTLY_RUNNING: (file: string) => { - return `Currently running: ${file}`; - }, - DEVICE_NAME: { - CPX: "CPX", - MICROBIT: "micro:bit", - }, - ID_NAME: { - BUTTON_A: "BTN_A_OUTER", - BUTTON_AB: "BTN_AB_OUTER", - BUTTON_B: "BTN_B_OUTER", - PIN_A1: "PIN_A1", - PIN_A2: "PIN_A2", - PIN_A3: "PIN_A3", - PIN_A4: "PIN_A4", - PIN_A5: "PIN_A5", - PIN_A6: "PIN_A6", - PIN_A7: "PIN_A7", - PLAY_BUTTON: "play-button", - REFRESH_BUTTON: "refresh-button", - STOP_BUTTON: "stop-button", - SWITCH: "SWITCH", - }, - KEYBOARD_KEYS: { - A: "KeyA", - B: "KeyB", - C: "KeyC", - CAPITAL_R: "R", - CAPITAL_F: "F", - ENTER: "Enter", - S: "KeyS", - NUMERIC_ONE: "Digit1", - NUMERIC_TWO: "Digit2", - NUMERIC_THREE: "Digit3", - NUMERIC_FOUR: "Digit4", - NUMERIC_FIVE: "Digit5", - NUMERIC_SIX: "Digit6", - NUMERIC_SEVEN: "Digit7", - }, - FILES_PLACEHOLDER: - "The simulator will run the .py file you have focused on.", - SIMULATOR_BUTTON_WIDTH: 60, - TOOLBAR_INFO: `Explore what's on the board:`, - LED_TINT_FACTOR: 0.5, -}; -export const AB_BUTTONS_KEYS = { - BTN_A: "BTN_A", - BTN_B: "BTN_B", - BTN_AB: "BTN_AB", -}; -export const BUTTON_CLASSNAME = { - ACTIVE: "sim-button-group", - DEACTIVATED: "sim-button-group-deactivated", -}; -export const BUTTON_STYLING_CLASSES = { - DEFAULT: "sim-button-outer", - KEYPRESSED: "sim-button-key-press", -}; -export const CLUE_LEDS_COLORS = { - WHITE_LEDS_OFF: "#ffde00", - WHITE_LEDS_ON: "white", - RED_LED_OFF: "#808080", - RED_LED_ON: "red", -}; -export enum DEVICE_LIST_KEY { - CPX = "CPX", - MICROBIT = "micro:bit", - CLUE = "CLUE", -} - -// Pauses on Debug mode alter the state of the view -export enum VIEW_STATE { - PAUSE = "debug-pause", - RUNNING = "running", -} - -// -export enum WEBVIEW_MESSAGES { - SWITCH_DEVICE = "switch-device", - REFRESH_SIMULATOR = "refresh-simulator", - TOGGLE_PLAY_STOP = "toggle-play-stop", - BUTTON_PRESS = "button-press", - SENSOR_CHANGED = "sensor-changed", - GESTURE = "gesture", - SLIDER_TELEMETRY = "slider-telemetry", -} - -export enum VSCODE_MESSAGES_TO_WEBVIEW { - SET_DEVICE = "set-device", - PAUSE_DEVICE = "pause-device", - RUN_DEVICE = "run-device", - RESET = "reset-state", - CURRENT_FILE = "current-file", - SET_STATE = "set-state", -} -export enum DEBUG_COMMANDS { - STACK_TRACE = "stackTrace", - CONTINUE = "continue", - DISCONNECT = "disconnect", -} -export enum SENSOR_LIST { - TEMPERATURE = "temperature", - LIGHT = "light", - ACCELEROMETER = "accelerometer", - MOTION_X = "motion_x", - MOTION_Y = "motion_y", - MOTION_Z = "motion_z", - LIGHT_R = "light_r", - LIGHT_G = "light_g", - LIGHT_B = "light_b", - LIGHT_C = "light_c", - HUMIDITY = "humidity", - PRESSURE = "pressure", - PROXIMITY = "proximity", - MAGNET_X = "magnet_x", - MAGNET_Y = "magnet_y", - MAGNET_Z = "magnet_z", - GYRO_X = "gyro_x", - GYRO_Y = "gyro_y", - GYRO_Z = "gyro_z", -} - -export const GESTURES_MICROBIT = [ - "shake", - "up", - "down", - "left", - "right", - "face up", - "face down", - "freefall", - "3g", - "6g", - "8g", -]; -export const GESTURES_CLUE = ["up", "down", "left", "right", "shake"]; - -export enum WEBVIEW_ATTRIBUTES_KEY { - INITIAL_DEVICE = "initial_device", - TYPE = "webview_type", -} -export enum WEBVIEW_TYPES { - SIMULATOR = "simulator", - GETTING_STARTED = "getting_started", -} -export const DEFAULT_IMG_CLUE = `/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAEBAQEBAQEBA -QEBAQEBAQICAQEBAQMCAgICAwMEBAMDAwMEBAYFBAQFBAMDBQcFBQYGBgYGBAUHBwcGBwYGBgb/2wBDAQEBAQEBAQMCAgMGBAMEB -gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgb/wAARCAJYAlgDASIAAhEBAxEB/8QAHwAAA -QUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0Kxw -RVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl -5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBA -QAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRC -hYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkp -aanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD/AD/6KKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo -oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK -KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC -iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig -AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP//Z`; - -export default CONSTANTS; diff --git a/src/view/container/device/Device.spec.tsx b/src/view/container/device/Device.spec.tsx deleted file mode 100644 index 491d4e2a5..000000000 --- a/src/view/container/device/Device.spec.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { DEVICE_LIST_KEY } from "../../constants"; -import { Device } from "./Device"; - -describe("Device component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); diff --git a/src/view/container/device/Device.tsx b/src/view/container/device/Device.tsx deleted file mode 100644 index dd30d2dc6..000000000 --- a/src/view/container/device/Device.tsx +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import { Clue } from "../../components/clue/Clue"; -import { Cpx } from "../../components/cpx/Cpx"; -import { Microbit } from "../../components/microbit/Microbit"; -import { DEVICE_LIST_KEY } from "../../constants"; - -interface IProps { - currentSelectedDevice: string; -} -// Container to switch between multiple devices - -export class Device extends React.Component { - constructor(props: IProps) { - super(props); - } - render() { - const { currentSelectedDevice } = this.props; - - return ( -
- - {loadSelectedDevice(currentSelectedDevice)} - -
- ); - } -} -const loadSelectedDevice = (currentSelectedDevice: string) => { - switch (currentSelectedDevice) { - case DEVICE_LIST_KEY.CPX: - return ; - case DEVICE_LIST_KEY.MICROBIT: - return ; - case DEVICE_LIST_KEY.CLUE: - return ; - default: - return null; - } -}; diff --git a/src/view/container/device/__snapshots__/Device.spec.tsx.snap b/src/view/container/device/__snapshots__/Device.spec.tsx.snap deleted file mode 100644 index cd2e25d19..000000000 --- a/src/view/container/device/__snapshots__/Device.spec.tsx.snap +++ /dev/null @@ -1,3240 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Device component should render correctly 1`] = ` -
-
-
- The simulator will run the .py file you have focused on. -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (0,0) - - - - - - (1,0) - - - - - - (2,0) - - - - - - (3,0) - - - - - - (4,0) - - - - - - (0,1) - - - - - - (1,1) - - - - - - (2,1) - - - - - - (3,1) - - - - - - (4,1) - - - - - - (0,2) - - - - - - (1,2) - - - - - - (2,2) - - - - - - (3,2) - - - - - - (4,2) - - - - - - (0,3) - - - - - - (1,3) - - - - - - (2,3) - - - - - - (3,3) - - - - - - (4,3) - - - - - - (0,4) - - - - - - (1,4) - - - - - - (2,4) - - - - - - (3,4) - - - - - - (4,4) - - - - - - - - - - - - P0, ANALOG IN - - - - - P1, ANALOG IN - - - - - P2, ANALOG IN - - - - - P3, ANALOG IN, LED Col 1 - - - - - P4, ANALOG IN, LED Col 2 - - - - - P5, BUTTON A - - - - - P6, LED Col 9 - - - - - P7, LED Col 8 - - - - - P8 - - - - - P9, LED Col 7 - - - - - P10, ANALOG IN, LED Col 3 - - - - - P11, BUTTON B - - - - - P12, RESERVED ACCESSIBILITY - - - - - P13, SPI - SCK - - - - - P14, SPI - MISO - - - - - P15, SPI - MOSI - - - - - P16, SPI - Chip Select - - - - - P17, +3v3 - - - - - P18, +3v3 - - - - - P19, I2C - SCL - - - - - P20, I2C - SDA - - - - - GND - - - - - GND - - - - - +3v3 - - - - - GND - - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
-
-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-`; diff --git a/src/view/context.ts b/src/view/context.ts deleted file mode 100644 index 24fafc556..000000000 --- a/src/view/context.ts +++ /dev/null @@ -1,6 +0,0 @@ -import * as React from "react"; -import { VIEW_STATE } from "./constants"; - -// View is running by default - -export const ViewStateContext = React.createContext(VIEW_STATE.RUNNING); diff --git a/src/view/index.css b/src/view/index.css deleted file mode 100644 index 918c31f9e..000000000 --- a/src/view/index.css +++ /dev/null @@ -1,13 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Joti+One"); - -body { - margin: 0; - padding: 0; - font-family: sans-serif; -} - -html, -body { - overflow: hidden; - height: 100%; -} diff --git a/src/view/index.tsx b/src/view/index.tsx deleted file mode 100644 index 32e7400b1..000000000 --- a/src/view/index.tsx +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import App from "./App"; - -import "./index.css"; - -const messageEn = require("./translations/en.json"); -const locale = "en"; - -const message = { - en: messageEn, -}; -ReactDOM.render( - - - , - document.getElementById("root") -); diff --git a/src/view/pages/__snapshots__/gettingStarted.spec.tsx.snap b/src/view/pages/__snapshots__/gettingStarted.spec.tsx.snap deleted file mode 100644 index 18dac92ce..000000000 --- a/src/view/pages/__snapshots__/gettingStarted.spec.tsx.snap +++ /dev/null @@ -1,901 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`GettingStartedPage component should render correctly 1`] = ` -
-

- Getting started -

- -

- Copy these snippets of code to a .py file and run the simulator -

-
-

- Tutorial for Circuit Playground Express -

-

- > Import the Circuit Playground library to use it (This is required) -

- -
-        from adafruit_circuitplayground import cp
-      
-
-

- > Turn on the little red LED -

- -
-        while True:
-      
-
-            cp.red_led = True
-      
-
-

- > Turn up red LED when button A is clicked -

- -
-        while True:
-      
-
-            if cp.button_a:
-      
-
-                cp.red_led = True
-      
-
-

- > Light up the first neopixel blue -

- -
-        cp.pixels[0] = (0, 0, 255)
-      
-
-

- And much more! These links have more tutorials: -

-

- - Getting started with CPX and CircuitPython - -

-

- - More example code - -

-

- Keyboard Shortcuts -

-
    -
  • - Push Button: - - A - - for Button A, - - B - - for Button B, - - C - - for Buttons A & B -
  • -
  • - Refresh the simulator: - - Shift - - + - - R - -
  • -
  • - Run the simulator: - - Shift - - + - - F - -
  • -
-
-
-

- Tutorial for micro:bit -

-

- > Import the micro:bit library to use it (This is required) -

- -
-        from microbit import *
-      
-
-

- > Light up your micro:bit with love by showing a heart -

- -
-        display.show(Image.HEART)
-      
-
-

- > Use your micro:bit to tell the world how you’re feeling -

- -
-        while True:
-      
-
-            if button_a.is_pressed():
-      
-
-                display.show(Image.HAPPY)
-      
-
-            if button_b.is_pressed():
-      
-
-                display.show(Image.SAD)
-      
-
-

- > Read then display the temperature -

- -
-        while True:
-      
-
-            temp = temperature()
-      
-
-            display.show(temp)
-      
-
-

- > Display your name with the scroll functionality -

- -
-        while True:
-      
-
-            display.show("Your name")
-      
-
-

- And much more! These links have more tutorials: -

-

- - Microbit Tutorials - -

-

- - Microbit official documentation - -

-

- Keyboard Shortcuts -

-
    -
  • - Push Button: - - A - - for Button A, - - B - - for Button B, - - C - - for Buttons A & B -
  • -
  • - Refresh the simulator: - - Shift - - + - - R - -
  • -
  • - Run the simulator: - - Shift - - + - - F - -
  • -
-
-
-

- Tutorial for CLUE -

-

- > Import the the main CLUE library (This is required) -

- -
-        from adafruit_clue import clue
-      
-
-

- > Display text on the CLUE and change the text when a button is pressed -

- -
-        clue_data = clue.simple_text_display(title="CLUE!")
-      
-
-        while True:
-      
-
-            clue_data[1].text = "Hello World!"
-      
-
-            if clue.button_a:
-      
-
-                clue_data[5].text = "A is pressed!"
-      
-
-            else:
-      
-
-                clue_data[5].text = "A is not pressed!"
-      
-
-            clue_data.show()
-      
-
-

- > Create a slide show on the CLUE -

-

- Make sure there are bitmap (.bmp) pictures of your choice in the same directory as the code file. -

- -
-        import board
-      
-
-        from adafruit_slideshow import SlideShow
-      
-
-         
-      
-
-        slideshow = SlideShow(clue.display, auto_advance=True, dwell=3, fade_effect=True)
-      
-
-        while slideshow.update():
-      
-
-            pass
-      
-
-

- > Light up the neopixel green -

- -
-        clue.pixel.fill(clue.GREEN)
-      
-
-

- > Display sensor data on the CLUE -

- -
-        clue_data = clue.simple_text_display(title="CLUE Sensor Data!", title_scale=2)
-      
-
-        while True:
-      
-
-            clue_data[0].text = "Acceleration: 
-        {}
-         
-        {}
-         
-        {}
-        ".format(*clue.acceleration)
-      
-
-            clue_data[1].text = "Gyro: 
-        {}
-         
-        {}
-         
-        {}
-        ".format(*clue.gyro)
-      
-
-            clue_data[2].text = "Magnetic: 
-        {}
-         
-        {}
-         
-        {}
-        ".format(*clue.magnetic)
-      
-
-            clue_data[3].text = "Pressure: 
-        {}
-        hPa".format(clue.pressure)
-      
-
-            clue_data[4].text = "Altitude: 
-        {}
-        m".format(clue.altitude)
-      
-
-            clue_data[5].text = "Temperature: 
-        {}
-        C".format(clue.temperature)
-      
-
-            clue_data[6].text = "Humidity: 
-        {}
-        %".format(clue.humidity)
-      
-
-            clue_data[7].text = "Proximity: 
-        {}
-        ".format(clue.proximity)
-      
-
-            clue_data[8].text = "Gesture: 
-        {}
-        ".format(clue.gesture)
-      
-
-            clue_data[9].text = "Color: R: 
-        {}
-         G: 
-        {}
-         B: 
-        {}
-         C: 
-        {}
-        ".format(*clue.color)
-      
-
-            clue_data[10].text = "Button A: 
-        {}
-        ".format(clue.button_a)
-      
-
-            clue_data[11].text = "Button B: 
-        {}
-        ".format(clue.button_b)
-      
-
-            clue_data.show()
-      
-
-

- > Draw a blue rectangle on the screen -

- -
-        import board
-      
-
-        import displayio
-      
-
-        from adafruit_display_shapes.rect import Rect
-      
-
-         
-      
-
-        splash = displayio.Group(max_size=20)
-      
-
-        board.DISPLAY.show(splash)
-      
-
-         
-      
-
-        rect = Rect(80, 20, 41, 41, fill=0x0000FF)
-      
-
-        splash.append(rect)
-      
-
-

- And much more! These links have more tutorials: -

-

- - Getting started with CLUE and CircuitPython - -

-

- - More example code - -

-

- Keyboard Shortcuts -

-
    -
  • - Push Button: - - A - - for Button A, - - B - - for Button B, - - C - - for Buttons A & B -
  • -
  • - Refresh the simulator: - - Shift - - + - - R - -
  • -
  • - Run the simulator: - - Shift - - + - - F - -
  • -
  • - Capacitive Touch Sensor: - - Shift - - + - - 1 - - ~ - - 7 - - for GPIO pins A1 - A7 -
  • -
  • - Slider Switch: - - Shift - - + - - S - -
  • -
-
-
-

- Tutorial for using the debugger -

-

- > Enter debug mode -

-

- Press - - F5 - - or go to - - Run -> Start Debugging - -

- Start debugging -

- > Set a breakpoint or multiple breakpoints -

-

- Stopping at a breakpoint pauses the program at that particular place. -

-

- Use the debug toolbar or the shortcuts below -

- Debugger Toolbar -
    -
  • - - F5 - - to continue / pause -
  • -
  • - - F10 - - to step over (execute current statement and all functions that it calls and stop before the next statement) -
  • -
  • - - F11 - - to step into (stop at first statement of first function called from first line) -
  • -
  • - - Shift - - + - - F11 - - to step out (run current function to end) -
  • -
  • - - Ctrl - - + - - Shift - - + - - F11 - - to restart -
  • -
  • - - Shift - - + - - F5 - - to stop -
  • -
- debugging experience -

- > Observe the device's state on the "Variables" tab on the left when stopped at a breakpoint -

- Debugger Variables -

- And much more! These links have more tutorials: -

-

- - Learn more about debugging in VS Code - -

-
-
-`; diff --git a/src/view/pages/gettingStarted.css b/src/view/pages/gettingStarted.css deleted file mode 100644 index d312598b1..000000000 --- a/src/view/pages/gettingStarted.css +++ /dev/null @@ -1,56 +0,0 @@ -.inv { - display: none; -} - -.codeText { - overflow-x: auto; - white-space: pre-wrap; - word-wrap: break-word; -} - -li:not(:last-child) { - margin-bottom: 6px; -} - -.normalFontWeight { - font-weight: normal; -} - -.deviceSelector { - width: 250px; - border: 1px solid var(--vscode-dropdown-border); - background-color: var(--vscode-dropdown-background); - color: var(--vscode-dropdown-foreground); - margin: 0 0 5px; - padding: 8px; - border-radius: 5px; - font-size: 12px; - padding-right: 30px; -} - -.deviceSelector optgroup { - background-color: var(--vscode-dropdown-listBackground); - color: var(--vscode-dropdown-foreground); -} - -.deviceSelector option { - background-color: var(--vscode-dropdown-listBackground); - color: var(--vscode-dropdown-foreground); -} - -.codeBox { - display: block; - width: 90%; - margin: 10px; - padding: 15px; - text-align: left; - background: none; - border: 1px solid grey; - border-radius: 4px; - background-color: var(--vscode-textCodeBlock-background); -} - -.container { - text-align: left; - padding: 0 10px 20px 10px; -} diff --git a/src/view/pages/gettingStarted.spec.tsx b/src/view/pages/gettingStarted.spec.tsx deleted file mode 100644 index 278d5ed4b..000000000 --- a/src/view/pages/gettingStarted.spec.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { IntlProvider } from "react-intl"; -import * as testRenderer from "react-test-renderer"; -import { GettingStartedPage } from "./gettingStarted"; - -describe("GettingStartedPage component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); -}); diff --git a/src/view/pages/gettingStarted.tsx b/src/view/pages/gettingStarted.tsx deleted file mode 100644 index 2477594e7..000000000 --- a/src/view/pages/gettingStarted.tsx +++ /dev/null @@ -1,281 +0,0 @@ -import * as React from "react"; -import "./gettingStarted.css"; - -export class GettingStartedPage extends React.Component { - private selectRef: React.RefObject = React.createRef(); - - componentDidMount() { - this.selectRef.current?.addEventListener("change", (event: any) => { - const visibleElement = document.querySelector(".visibleElement"); - const target = document.getElementById(event!.target!.value); - if (visibleElement !== null) { - visibleElement.className = "inv"; - } - if (target !== null) { - target.className = "visibleElement"; - } - }); - } - - render() { - return ( - -
-

Getting started

- -

- Copy these snippets of code to a .py file and run the - simulator -

- {/* prettier-ignore */} -
-

Tutorial for Circuit Playground Express

-

- > Import the Circuit Playground library to use it (This is required) -

- -
from adafruit_circuitplayground import cp
-
-

> Turn on the little red LED

- -
while True:
-
    cp.red_led = True
-
-

> Turn up red LED when button A is clicked

- -
while True:
-
    if cp.button_a:
-
        cp.red_led = True
-
-

> Light up the first neopixel blue

- -
cp.pixels[0] = (0, 0, 255)
-
-

And much more! These links have more tutorials:

-

- - Getting started with CPX and CircuitPython - -

-

- - More example code - -

-

Keyboard Shortcuts

-
    -
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • -
  • Refresh the simulator: Shift + R
  • -
  • Run the simulator: Shift + F
  • -
-
- {/* prettier-ignore */} -
-

Tutorial for micro:bit

-

- > Import the micro:bit library to use it (This is - required) -

- -
from microbit import *
-
-

- > Light up your micro:bit with love by showing a - heart -

- -
display.show(Image.HEART)
-
-

- > Use your micro:bit to tell the world how you’re - feeling -

- -
while True:
-
    if button_a.is_pressed():
-
        display.show(Image.HAPPY)
-
    if button_b.is_pressed():
-
        display.show(Image.SAD)
-
-

> Read then display the temperature

- -
while True:
-
    temp = temperature()
-
    display.show(temp)
-
-

- > Display your name with the scroll functionality -

- -
while True:
-
    display.show("Your name")
-
-

And much more! These links have more tutorials:

-

- - Microbit Tutorials - -

-

- - Microbit official documentation - -

-

Keyboard Shortcuts

-
    -
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • -
  • Refresh the simulator: Shift + R
  • -
  • Run the simulator: Shift + F
  • -
-
- {/* prettier-ignore */} -
-

Tutorial for CLUE

-

- > Import the the main CLUE library (This is - required) -

- -
from adafruit_clue import clue
-
-

- > Display text on the CLUE and change the text when - a button is pressed -

- -
-                                clue_data = clue.simple_text_display(title="CLUE!")
-                            
-
while True:
-
    clue_data[1].text = "Hello World!"
-
    if clue.button_a:
-
        clue_data[5].text = "A is pressed!"
-
    else:
-
        clue_data[5].text = "A is not pressed!"
-
    clue_data.show()
-
-

> Create a slide show on the CLUE

-

- Make sure there are bitmap (.bmp) pictures of your choice in the same directory - as the code file. -

- -
import board
-
from adafruit_slideshow import SlideShow
-
 
-
slideshow = SlideShow(clue.display, auto_advance=True, dwell=3, fade_effect=True)
-                            
-
while slideshow.update():
-
    pass
-
-

> Light up the neopixel green

- -
clue.pixel.fill(clue.GREEN)
-
-

> Display sensor data on the CLUE

- -
clue_data = clue.simple_text_display(title="CLUE Sensor Data!", title_scale=2)
-
while True:
-
    clue_data[0].text = "Acceleration: {"{}"} {"{}"} {"{}"}".format(*clue.acceleration)
-
    clue_data[1].text = "Gyro: {"{}"} {"{}"} {"{}"}".format(*clue.gyro)
-
    clue_data[2].text = "Magnetic: {"{}"} {"{}"} {"{}"}".format(*clue.magnetic)
-
    clue_data[3].text = "Pressure: {"{}"}hPa".format(clue.pressure)
-
    clue_data[4].text = "Altitude: {"{}"}m".format(clue.altitude)
-
    clue_data[5].text = "Temperature: {"{}"}C".format(clue.temperature)
-
    clue_data[6].text = "Humidity: {"{}"}%".format(clue.humidity)
-
    clue_data[7].text = "Proximity: {"{}"}".format(clue.proximity)
-
    clue_data[8].text = "Gesture: {"{}"}".format(clue.gesture)
-
    clue_data[9].text = "Color: R: {"{}"} G: {"{}"} B: {"{}"} C: {"{}"}".format(*clue.color)
-
    clue_data[10].text = "Button A: {"{}"}".format(clue.button_a)
-
    clue_data[11].text = "Button B: {"{}"}".format(clue.button_b)
-
    clue_data.show()
-
-

> Draw a blue rectangle on the screen

- -
import board
-
import displayio
-
from adafruit_display_shapes.rect import Rect
-
 
-
splash = displayio.Group(max_size=20)
-
board.DISPLAY.show(splash)
-
 
-
rect = Rect(80, 20, 41, 41, fill=0x0000FF)
-
splash.append(rect)
-
-

And much more! These links have more tutorials:

-

- - Getting started with CLUE and CircuitPython - -

-

- - More example code - -

-

Keyboard Shortcuts

-
    -
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • -
  • Refresh the simulator: Shift + R
  • -
  • Run the simulator: Shift + F
  • -
  • Capacitive Touch Sensor: Shift + 1 ~ 7 for GPIO pins A1 - A7
  • -
  • Slider Switch: Shift + S
  • -
-
- {/* prettier-ignore */} -
-

Tutorial for using the debugger

-

- > Enter debug mode -

-

Press F5 or go to Run -> Start Debugging

- Start debugging -

- > Set a breakpoint or multiple breakpoints -

-

Stopping at a breakpoint pauses the program at that particular place.

-

Use the debug toolbar or the shortcuts below

- Debugger Toolbar -
    -
  • F5 to continue / pause
  • -
  • F10 to step over (execute current statement and all functions that it calls and stop before the next statement)
  • -
  • F11 to step into (stop at first statement of first function called from first line)
  • -
  • Shift + F11 to step out (run current function to end)
  • -
  • Ctrl + Shift + F11 to restart
  • -
  • Shift + F5 to stop
  • -
- debugging experience -

- > Observe the device's state on the "Variables" tab on the left when stopped at a breakpoint -

- Debugger Variables -

And much more! These links have more tutorials:

-

- - Learn more about debugging in VS Code - -

-
-
-
- ); - } -} diff --git a/src/view/pages/gettingStartedPictures/debugger/debugger_vars.png b/src/view/pages/gettingStartedPictures/debugger/debugger_vars.png deleted file mode 100644 index 267f461ef3e2c2a5828a1db3bff454c7eecff476..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44993 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

IqyB?WD=aWcD#Ji7HNax7-GQ>11cdloxpL( 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

xd9?>F(T_Er zym&K6!IPx|%r~`jNlxgr@++cA^3^`0!xnX9hx}CT^9xi!M9~{wl@Qd*SYsx=srl9& zP*Rs}JAG;(NUO3Eh~;C0-sF6lkXwAFpjV%NMm6_E{U1RlmjaA4$81yiQ)<&4X?7!D ztUsiguns|DPxLe)QPHXcM$}(%cg&Eq_qnX3Ql(}OR6|t{D|>1^RBjzqb%ywi4isbNCmq@_k;cN=*?}NV`Gw-7SU#iFQ~1r6ds)m zo%Yp0=&$v)?;C%%nz|CY@bf9<(*GXBGTjL-T@_wJaPU#9$=e3N;FeU&f@?oCnrsbg zMGY{J<)tElWJj95KU|ym4g!&VoDI;Ok(D7gi;Gq6)h#HabS?Xe-`I zXsYbuFDoWj12&`dk&5wlNg~=R?Pte=vZj&@6;*<|h7!O@O&Rc*;TtrDj@Ck{wT~vxti|US;l*H`d2!K#DWJO1$O$=Mwb=NJipO1 zE!S|Zs%8Ds#XC{xeL@_gPChH7mod7YbqDCH(z1=Fb>em_-GU)k?gcYVo8#c9K{*r- z-ZJ9A@87>8Y)rf259AuNP_M%86@53TFgJ!YHc#sCd~=);R5Y$%!+AsFRs#N_T|;=w zhvLp4G5v7co9QXJb@V1Ln?iFRs1}MfFvCQX6sQXEd);5vM^(HGEOv z{=?4KNrW&1E-`qlcn>gD`-_wde_CircU{Z8UWqQ8$=Ff^g5cwDz|@xgYrGN5e44Z@ z1;{B&6WUwnJ~ChSX@tzJJ=HW=gTdddav8w@TkP(2Jd|e!dGPxqojZadIaEcI5~uwP zo+`VCpCMs0F=b@#TPWFaY<4Lu4+`1I@Rh`zIHp!U=ShE-+o8iV$ihVR;?@FyY+(h@ z0NoVg&DKcag|TNJepMtk1u{OU4dzn4TEyzW_K7^#> zy_ko-goZKln0wR7-OR7~QG|(n3t`3RRngc}HlSxf1m&q2>9QAB(;5GGx%Si>REa?# zvA^hpeatzI1H0yLFpg?b2oui-RxdY{Ei82lgkmF8Jpf?q$}VT8OF$Y?pAC4y{8yE; zlP&BIAaNBu%5EH8KY?BC`|t)B&&OG!EGi`(+&CU|4H}!4l#m->A`;^PdQ*mE(~71A}VnT4>gLpJi*_C6?&>?GPci|)-?zCgb2OA z6C2y{6F0EtGI~xU;oSW29$Ed*&kFNE2n$&5`S-XumAr_m>C;f#LTa+yjwW4-KJyLO zF&I;{FcOVDyzL09#J;H_?Xo5@q7cy#T ze+DT>O8)aF&#!#<{TcEu7|!byTGjZ87)vKqW zfQ(_I1_}gx5BA$re?5DG`3ALo2A<7w@z%XZaBqbxSSXEr9T3GccZoAS@7A2Pm257f z3_%Z2iU5~=HZGrvq~(NXbppD7y*Tf>5#Na|&h5l<+sc|E9_Vvvsxz!FJyKZ5>bl>` zZw~rom|rP>@E*Q2pXR%E8q3*_i0XB&IeKxHn{j@Ze_vYwQd#3}aWy)}EKn5ZB$uwn z(93#Ut)%W33i9NiCN@D<#4_$QpMCSM<9|2(Jk~xGt{Id%!hu4k+OmW~=j^VArGniu z$ZD5XT$y{_A)WH#27MsIjqw*3m^;pp%zm4qHxi2@-5!0|9xVDL%*&;s;tJEuAPFU z)({>3Q!77xt79>Kg1h^v)C}}bfN*y`ypimRDGI%~xo&P>%s#mzZtF#vZXQ2KOE!%b zd)R8q$VYp>YlZ&K(LGb$@OgJ&w{z`Bn>fCDj zjZ=W`)Z?=#()dY^5x2{ONBW3r%!2=A}(grcT9p<3W96-+Ol5bc}# z>rO-Ac(yNM6n@DtcxkFk8gYH_7-wo0lzY2)8GZgiE)5dvDqf?xF>_0^9d5i|J>(O3 zE4HT2US&3xhgx+LRLr;L*1Ym1E2c}lLT@NymyMzA8UAQ^7=KS-{xtxIP)_R7g)}n7 z-}uEyu!|PDwrp?4a8QBOJ=j9(NJF1FQ)qK9@ZM0su4?toq+5d+#a|vuktAZsV2++7ww+q+$*klO!ojhTGyxi(?+&=+#<3n%& diff --git a/src/view/pages/gettingStartedPictures/debugger/debugging.gif b/src/view/pages/gettingStartedPictures/debugger/debugging.gif deleted file mode 100644 index 5d42a436ae20b4fc76a2c10f2f78716dd566fdc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 652131 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

-{vN#&nJiSL3j06_uncZcf!BiE7`5^=;>N!Y%Y! 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 z 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

YO>2rMouP(dHVz(BKRCpxD{& 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%0ANooijZsdO7H)43a( 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 diff --git a/src/view/pages/gettingStartedPictures/debugger/start_debugging.jpg b/src/view/pages/gettingStartedPictures/debugger/start_debugging.jpg deleted file mode 100644 index 3d39fbf6618e891ba856af8820192b2a5cb1b64f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51011 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 Cdeq7Q diff --git a/src/view/pages/gettingStartedPictures/debugger/toolbar.png b/src/view/pages/gettingStartedPictures/debugger/toolbar.png deleted file mode 100644 index 754e68e03fbe5eff10db43c4c97871faf02d3184..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4635 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 OZ=kLgT(ex=4*Ngaowt7g diff --git a/src/view/react-app-env.d.ts b/src/view/react-app-env.d.ts deleted file mode 100644 index 6431bc5fc..000000000 --- a/src/view/react-app-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/src/view/styles/Button.css b/src/view/styles/Button.css deleted file mode 100644 index c30ed1360..000000000 --- a/src/view/styles/Button.css +++ /dev/null @@ -1,50 +0,0 @@ -.button { - height: 32px; - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-debugToolBar-background); -} - -.button-icon { - fill: var(--vscode-badgeForegroundOverride); -} - -.button-rectangle { - stroke: var(--vscode-badgeForegroundOverride); -} - -.play-button { - border-radius: 8px 0px 0px 8px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); -} - -.refresh-button { - border-radius: 0px 8px 8px 0px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); -} - -.button:focus, -.button:hover { - background-color: var(--vscode-terminal-selectionBackground); -} - -.button:active { - background-color: var(--vscode-editor-selectionHighlightBackground); -} - -.toolbar-button { - border: none; -} - -.toolbar-button:hover { - outline: none; -} - -.edge-button { - pointer-events: none; - border: none; -} - -.button-pressed { - background-color: var(--vscode-button-background); - outline: none; -} diff --git a/src/view/styles/Dropdown.css b/src/view/styles/Dropdown.css deleted file mode 100644 index b69b14c74..000000000 --- a/src/view/styles/Dropdown.css +++ /dev/null @@ -1,24 +0,0 @@ -.dropdown { - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-foreground); - border-radius: 2px; - box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.22); - color: var(--vscode-foreground); - height: 32px; - width: 100%; -} - -select.dropdown:hover, -select.dropdown:focus, -select.dropdown:active { - outline: 1px solid var(--vscode-button-background); -} - -option { - height: 32px; - background: var(--vscode-debugToolBar-background); - outline: 0; - align-items: center; - font-size: 14px; - color: var(--vscode-foreground); -} diff --git a/src/view/styles/InputSlider.css b/src/view/styles/InputSlider.css deleted file mode 100644 index b51dae8f3..000000000 --- a/src/view/styles/InputSlider.css +++ /dev/null @@ -1,103 +0,0 @@ -:root { - --slider-gray-color: #cccccc; - --slider-width: 240px; -} -.inputSlider { - height: 48px; - margin-bottom: 60px; - display: table-cell; -} -.sliderValue { - -webkit-appearance: none; - text-align: center; - width: 48px; - height: 32px; - background-color: var(--vscode-editor-background); - margin-right: 15px; - margin-top: auto; - margin-bottom: auto; - margin-left: 5px; - color: var(--badgeForegroundOverride); - border-radius: 2px; - font-size: 16px; - font-weight: bold; - border-width: 1px; - border-radius: 2px; - border-color: var(--vscode-highContrastButtonBorderOverride-color); -} - -.slider { - -webkit-appearance: none; - background-color: var(--slider-gray-color); - height: 1px; - width: var(--slider-width); - vertical-align: middle; -} -.slider::-webkit-slider-thumb { - -webkit-appearance: none; - appearance: none; - width: 16px; - height: 16px; - border-radius: 50%; - background: var(--vscode-textLink-activeForeground); - cursor: pointer; -} - -.slider::-webkit-slider-runnable-track:focus, -.inputSlider:focus, -.slider:focus { - outline: none; -} - -.sliderValue:focus, -.sliderValue:hover { - -webkit-appearance: none; - color: var(--vscode-textLink-activeForeground); - outline: 1px solid var(--vscode-textLink-activeForeground); -} -.maxLabel, -.minLabel { - display: inline-block; - position: absolute; - vertical-align: top; -} - -.maxLabel { - right: 0; -} - -.minLabel { - left: 0; -} - -.sliderArea, -.sliderValue { - display: inline-block; - vertical-align: middle; -} - -.sliderArea { - width: var(--slider-width); - height: 49px; -} -.downLabelArea { - width: var(--slider-width); - height: 15px; - margin-top: 10px; - position: relative; - font-size: 14px; -} -.upLabelArea { - width: var(--slider-width); - height: 15px; - margin-bottom: 10px; - position: relative; - font-weight: bolder; - font-size: 16px; -} - -.slider, -.upLabelArea, -.downLabelArea { - display: block; -} diff --git a/src/view/styles/LightSensorBar.css b/src/view/styles/LightSensorBar.css deleted file mode 100644 index 5d0abac42..000000000 --- a/src/view/styles/LightSensorBar.css +++ /dev/null @@ -1,20 +0,0 @@ -.title { - font-size: 14px; - text-align: left; - font-weight: bold; -} - -.header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; -} - -.lightSensorBar { - -webkit-appearance: none; - margin-top: 10px; - width: 400px; - margin-left: auto; - margin-right: auto; - padding-bottom: 16px; -} diff --git a/src/view/styles/MotionSensorBar.css b/src/view/styles/MotionSensorBar.css deleted file mode 100644 index 8ea39c23c..000000000 --- a/src/view/styles/MotionSensorBar.css +++ /dev/null @@ -1,20 +0,0 @@ -.title { - font-size: 14px; - text-align: left; -} - -.header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; -} - -.MotionSensorBar { - width: 100%; - margin-left: auto; - margin-right: auto; -} - -.sensor-button-container { - padding: 10px 0; -} diff --git a/src/view/styles/SensorButton.css b/src/view/styles/SensorButton.css deleted file mode 100644 index 21241eca2..000000000 --- a/src/view/styles/SensorButton.css +++ /dev/null @@ -1,29 +0,0 @@ -.sensor-button { - color: var(--vscode-badgeForegroundOverride); - text-align: center; - background-color: var(--vscode-button-background); - width: 100%; - height: 32px; - font-weight: bolder; - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - padding: 4px; -} - -.sensor-button:focus, -.sensor-button:active { - outline-width: thick; - outline-offset: 4px; - outline: 2px solid var(--vscode-focusBorder); - background-color: var(--vscode-button-hoverBackground); -} - -.sensor-button:active, -.active-button { - opacity: 0.5; -} - -.sensor-button:hover { - background-color: var(--vscode-button-hoverBackground); -} diff --git a/src/view/styles/Simulator.css b/src/view/styles/Simulator.css deleted file mode 100644 index 016cc8855..000000000 --- a/src/view/styles/Simulator.css +++ /dev/null @@ -1,83 +0,0 @@ -.simulator { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - max-width: 700px; - max-height: 700px; - margin-left: auto; - margin-right: auto; -} - -.buttons { - display: flex; - flex-direction: row; - padding-top: 20px; - justify-content: center; -} - -.file-selector { - padding: 20px; - width: 80%; - height: 30px; - border: 1px solid var(--vscode-debugToolBar-background); - border-radius: 3px; -} - -.shake-pressed { - /* Start the shake animation and make the animation last for 0.5 seconds */ - animation: shake 0.5s; - - /* When the animation is finished, start again */ - animation-iteration-count: infinite; -} - -@keyframes shake { - 0% { - transform: translate(1px, 1px) rotate(0deg); - } - 10% { - transform: translate(-1px, -2px) rotate(-1deg); - } - 20% { - transform: translate(-3px, 0px) rotate(1deg); - } - 30% { - transform: translate(3px, 2px) rotate(0deg); - } - 40% { - transform: translate(1px, -1px) rotate(1deg); - } - 50% { - transform: translate(-1px, 2px) rotate(-1deg); - } - 60% { - transform: translate(-3px, 1px) rotate(0deg); - } - 70% { - transform: translate(3px, 1px) rotate(-1deg); - } - 80% { - transform: translate(-1px, -1px) rotate(1deg); - } - 90% { - transform: translate(1px, 2px) rotate(0deg); - } - 100% { - transform: translate(1px, -2px) rotate(-1deg); - } -} - -.microbit-container { - max-width: 350px; - padding: 20px; -} -.clue-container { - width: 100%; - max-width: 500px; - padding: 20px; -} -.cpx-container { - width: 100%; - padding-top: 10px; -} diff --git a/src/view/styles/SimulatorSvg.css b/src/view/styles/SimulatorSvg.css deleted file mode 100644 index c9266c4a3..000000000 --- a/src/view/styles/SimulatorSvg.css +++ /dev/null @@ -1,290 +0,0 @@ -.microbit-svg { - padding: 0 0 0 10px; -} -svg.sim { - box-sizing: border-box; - width: 100%; - height: 100%; - display: block; -} -svg.sim.grayscale { - -moz-filter: grayscale(1); - -webkit-filter: grayscale(1); - filter: grayscale(1); -} -.sim-button-group { - cursor: pointer; -} -.sim-button { - pointer-events: none; - fill: "rgb(17, 17, 17)"; -} -.sim-button-group > .sim-button:active { - fill: orange; -} -.sim-text-outside { - font-size: 25px; - fill: var(--vscode-foreground); -} -.sim-board, -.sim-display, -sim-button { - fill: #111; -} -.sim-button-group > .sim-button-outer:hover { - stroke: orange; - stroke-width: 4px; -} -.sim-button-group > .sim-button-outer:active { - fill: orange; -} -.sim-button-outer { - fill: #7e7272; -} - -.sim-button-key-press { - fill: orange; -} - -.sim-button-nut { - fill: #704a4a; - pointer-events: none; -} - -.sim-systemled { - fill: #333; - stroke: #555; - stroke-width: 1px; -} -.sim-light-level-button { - stroke: #fff; - stroke-width: 3px; -} -.sim-antenna { - stroke: #555; - stroke-width: 2px; -} -.sim-text { - font-family: "Lucida Console", Monaco, monospace; - font-size: 25px; - fill: #fff; - pointer-events: none; -} -.sim-text-pin { - font-family: "Lucida Console", Monaco, monospace; - font-size: 20px; - fill: #fff; - pointer-events: none; -} -.sim-thermometer { - stroke: #aaa; - stroke-width: 3px; -} -/* animations */ -.sim-flash { - animation-name: sim-flash-animation; - animation-duration: 0.1s; -} -@keyframes sim-flash-animation { - from { - fill: yellow; - } - to { - fill: default; - } -} -.sim-flash-stroke { - animation-name: sim-flash-stroke-animation; - animation-duration: 0.4s; - animation-timing-function: ease-in; -} -@keyframes sim-flash-stroke-animation { - from { - stroke: yellow; - } - to { - stroke: default; - } -} -/* wireframe */ -.sim-wireframe * { - fill: none; - stroke: black; -} -.sim-wireframe .sim-display, -.sim-wireframe .sim-led, -.sim-wireframe .sim-led-back, -.sim-wireframe .sim-head, -.sim-wireframe .sim-theme, -.sim-wireframe .sim-button-group, -.sim-wireframe .sim-button-label, -.sim-wireframe .sim-button, -.sim-wireframe .sim-text-pin { - visibility: hidden; -} -.sim-wireframe .sim-label { - stroke: none; - fill: #777; -} -.sim-label, -.sim-button-label { - fill: #000; -} -.sim-wireframe .sim-board { - stroke-width: 2px; -} -*:focus { - outline: none; -} -.sim-button-group:focus { - stroke: #4d90fe; - stroke-width: 4px; -} -.sim-button-group:focus { - stroke: #4d90fe; - stroke-width: 4px; -} -*:focus .sim-button-outer, -.sim-pin:focus, -.sim-thermometer:focus, -.sim-shake:focus, -.no-drag, -.sim-text, -.sim-text-pin { - user-drag: none; - user-select: none; - -moz-user-select: none; - -webkit-user-drag: none; - -webkit-user-select: none; - -ms-user-select: none; -} -.sim-button { - stroke: none; -} -.sim-button:active { - stroke: none; -} -.cls-1 { - fill: #097054; -} -.cls-1, -.cls-14, -.cls-23, -.cls-9 { - stroke: #000; -} -.cls-1, -.cls-11, -.cls-12, -.cls-14, -.cls-17, -.cls-22, -.cls-23, -.cls-3, -.cls-4, -.cls-5, -.cls-6, -.cls-9 { - stroke-miterlimit: 10; -} -.cls-1, -.cls-23 { - stroke-width: 1.99px; -} -.cls-18, -.cls-2 { - fill: #fff; -} -.cls-11, -.cls-12, -.cls-17, -.cls-23, -.cls-3, -.cls-4, -.cls-5, -.cls-6, -.cls-7, -.cls-8 { - fill: none; -} -.cls-11, -.cls-12, -.cls-17, -.cls-3, -.cls-4, -.cls-5, -.cls-6, -.cls-7, -.cls-8 { - stroke: #fff; -} -.cls-3 { - stroke-width: 2px; -} -.cls-12, -.cls-17, -.cls-4, -.cls-5, -.cls-6, -.cls-7, -.cls-8 { - stroke-linecap: round; -} -.cls-4, -.cls-7 { - stroke-width: 1.63px; -} -.cls-5 { - stroke-width: 1.41px; -} -.cls-6 { - stroke-width: 1.6px; -} -.cls-7, -.cls-8 { - stroke-linejoin: round; -} -.cls-8 { - stroke-width: 1.63px; -} -.cls-10, -.cls-9 { - fill: #7e7272; -} -.cls-22, -.cls-9 { - stroke-width: 1.5px; -} -.cls-12 { - stroke-width: 1.71px; -} - -.cls-14 { - stroke-width: 0.25px; -} - -.cls-17 { - stroke-width: 2.02px; -} -.cls-18 { - font-size: 7px; - font-family: SegoeUI-Bold, Segoe UI; - font-weight: 700; - letter-spacing: -0.02em; -} -.cls-19 { - letter-spacing: -0.03em; -} -.cls-20 { - letter-spacing: -0.05em; -} -.cls-21 { - letter-spacing: 0em; -} -.cls-22 { - stroke: #7e7272; -} -.sim-text-outside-clue { - font-size: 14px; - fill: var(--vscode-foreground); -} diff --git a/src/view/styles/TemperatureSensorBar.css b/src/view/styles/TemperatureSensorBar.css deleted file mode 100644 index dfab0b7cd..000000000 --- a/src/view/styles/TemperatureSensorBar.css +++ /dev/null @@ -1,18 +0,0 @@ -.title { - font-size: 14px; - text-align: left; - font-weight: bold; -} - -.header { - -webkit-appearance: none; - height: 30px; - margin-bottom: 2px; -} -.temperatureSensorBar { - margin-top: 10px; - width: 440px; - margin-left: auto; - margin-right: auto; - padding-bottom: 16px; -} diff --git a/src/view/styles/ToolBar.css b/src/view/styles/ToolBar.css deleted file mode 100644 index faca0569c..000000000 --- a/src/view/styles/ToolBar.css +++ /dev/null @@ -1,182 +0,0 @@ -.toolbar-parent { - background: var(--vscode-debugToolBar-background); - width: fit-content; - border-radius: 2px; - height: fit-content; - margin-left: auto; - margin-right: auto; - margin-top: 24px; - margin-bottom: 50px; -} - -.toolbar { - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - display: flex; - flex-direction: column; - align-content: center; - align-items: center; -} - -.toolbar-icon { - min-width: 360px; - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - border-width: 1px; - border-style: solid; - padding: 0px 8px 0px 8px; -} - -.tag, -.title { - display: inline; -} - -.sensor_modal { - vertical-align: middle; - width: 360px; - overflow-y: visible; - overflow-x: hidden; - position: relative; - height: fit-content; - padding-left: 16px; - box-shadow: none; - margin-left: 1px; -} - -.title { - -webkit-appearance: none; - font-size: 16px; - font-weight: bolder; - color: var(--vscode-badgeForegroundOverride); - text-align: left; - margin-right: 40px; - position: absolute; - left: 0; - padding-left: inherit; - width: 320px; -} - -.info-icon { - background: var(--vscode-debugToolBar-background); - border-color: var(--vscode-highContrastButtonBorderOverride-color); - color: var(--vscode-badgeForegroundOverride); - border-width: 1px; - border-style: solid; - padding: 0px 4px; - float: right; - left: 25px; - margin-top: -10px; -} - -.info-icon:hover { - background-color: var(--vscode-terminal-selectionBackground); - color: var(--vscode-badgeForegroundOverride); -} - -.info-icon:active { - background-color: var(--vscode-editor-selectionHighlightBackground); - color: var(--vscode-badgeForegroundOverride); -} - -.tag { - position: absolute; - left: 200px; -} - -.description-callout { - box-shadow: 0px 0px 20px rgba(0, 0, 0, 30%); - padding: "210px 214px 214px 210px"; - border: 2px solid var(--vscode-highContrastButtonBorderOverride-color); -} - -.description-callout .ms-Callout-beak { - background-color: var(--vscode-debugToolBar-background); -} - -.description-callout .ms-Callout-main { - background-color: var(--vscode-debugToolBar-background); - overflow-x: hidden; - overflow-y: auto; - margin: -1px; -} - -.try-it-description { - -webkit-appearance: none; - font-size: 14px; - background: var(--vscode-debugToolBar-background); - word-wrap: break-word; - width: 320px; - height: "100%"; - margin-top: 15px; - text-align: left; - line-height: 17px; - font-weight: 100; -} - -.description { - -webkit-appearance: none; - color: var(--vscode-badgeForegroundOverride); - font-size: 14px; - word-wrap: break-word; - width: 320px; - height: "100%"; - text-align: left; - font-weight: 400; - padding: 10px 0px 10px 10px; - margin: 10px; - overflow-y: hidden; -} - -.title_group { - margin-top: 20px; - width: fit-content; - padding-left: 16px; -} - -.try_area { - position: relative; - padding-bottom: 30px; - text-align: left; - line-height: 17px; - font-weight: 100; - opacity: 90%; - font-size: 14px; - word-wrap: break-word; - padding-right: 10px; -} - -.link-parent { - padding-top: 12px; - -webkit-appearance: none; - color: var(--vscode-textLink-foreground); - text-align: right; - text-decoration: none; - font-weight: bold; -} - -.link-parent:hover { - -webkit-appearance: none; - color: var(--vscode-textLink-activeForeground); - text-decoration: none; -} - -.link { - -webkit-appearance: none; - text-decoration: none; -} - -.gesture-container { - display: "flex"; - justify-content: "space-between"; - flex-direction: "column"; - align-items: "center"; - height: 750; - padding-top: 10px; -} - -.generic-slider-component { - padding-top: 10px; -} diff --git a/src/view/svgs/arrow_right_svg.tsx b/src/view/svgs/arrow_right_svg.tsx deleted file mode 100644 index 7eead7979..000000000 --- a/src/view/svgs/arrow_right_svg.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import * as React from "react"; - -export const ARROW_RIGHT_SVG = ( - - - -); - -export default ARROW_RIGHT_SVG; diff --git a/src/view/svgs/close_svg.tsx b/src/view/svgs/close_svg.tsx deleted file mode 100644 index ac05bedfc..000000000 --- a/src/view/svgs/close_svg.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import * as React from "react"; - -export const CLOSE_SVG = ( - - - - -); - -export default CLOSE_SVG; diff --git a/src/view/svgs/play_svg.tsx b/src/view/svgs/play_svg.tsx deleted file mode 100644 index 0da21aa9d..000000000 --- a/src/view/svgs/play_svg.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import * as React from "react"; - -export const PLAY_SVG = ( - - - -); - -export default PLAY_SVG; diff --git a/src/view/svgs/refresh_svg.tsx b/src/view/svgs/refresh_svg.tsx deleted file mode 100644 index 340ad03f8..000000000 --- a/src/view/svgs/refresh_svg.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import * as React from "react"; -import "../styles/Button.css"; - -export const REFRESH_SVG = ( - - - -); - -export default REFRESH_SVG; diff --git a/src/view/svgs/stop_svg.tsx b/src/view/svgs/stop_svg.tsx deleted file mode 100644 index a89175f66..000000000 --- a/src/view/svgs/stop_svg.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import * as React from "react"; - -export const STOP_SVG = ( - - - -); - -export default STOP_SVG; diff --git a/src/view/svgs/tag_input_svg.tsx b/src/view/svgs/tag_input_svg.tsx deleted file mode 100644 index 13a507504..000000000 --- a/src/view/svgs/tag_input_svg.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import * as React from "react"; - -export const TAG_INPUT_SVG = ( - - - - -); - -export default TAG_INPUT_SVG; diff --git a/src/view/svgs/tag_output_svg.tsx b/src/view/svgs/tag_output_svg.tsx deleted file mode 100644 index 745175db5..000000000 --- a/src/view/svgs/tag_output_svg.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import * as React from "react"; - -export const TAG_OUTPUT_SVG = ( - - - - -); - -export default TAG_OUTPUT_SVG; diff --git a/src/view/svgs/toolbar_svg.tsx b/src/view/svgs/toolbar_svg.tsx deleted file mode 100644 index 52de70b86..000000000 --- a/src/view/svgs/toolbar_svg.tsx +++ /dev/null @@ -1,740 +0,0 @@ -import * as React from "react"; -import { TOOLBAR_ICON_LABEL } from "../components/toolbar/SensorModalUtils"; -import "../styles/Button.css"; - -export const LEFT_EDGE_SVG = ( - - - - - - - - - - -); -export const RIGHT_EDGE_SVG = ( - - - - - - - - - - -); - -export const GPIO_SVG = ( - - Created with Sketch. - - - - - - -); - -export const IR_SVG = ( - - Created with Sketch. - - - - - - - - -); - -export const LIGHT_SVG = ( - - - - - - - - - - - -); - -export const MOTION_SVG = ( - - - - - - - - - - - -); - -export const NEO_PIXEL_SVG = ( - - Created with Sketch. - - - - - - - - - - - - - - - -); - -export const PUSH_BUTTON_SVG = ( - - Created with Sketch. - - - - - - - - - -); - -export const RED_LED_SVG = ( - - Created with Sketch. - - - - - - - - - -); - -export const SLIDER_SWITCH_SVG = ( - - Created with Sketch. - - - - - - - - - -); - -export const SOUND_SVG = ( - - Created with Sketch. - - - - - - - - - - - -); - -export const SPEAKER_SVG = ( - - Created with Sketch. - - - - - - - - -); - -export const TEMPERATURE_SVG = ( - - - - - - - - - -); - -export const WIRELESS_SVG = ( - - - - - - - - - -); -export default LEFT_EDGE_SVG; - -export const GESTURE_SVG = ( - - - - - - - - - - - - - - - - - - -); -export const HUMIDITY_SVG = ( - - - - - - - - - - - - - -); -export const PRESSURE_SVG = ( - - - - - - - - - - - - - - - - - - - - - -); -export const PROXIMITY_SVG = ( - - - - - - - - - - - - - - - - - - - - -); -export const MAGNET_SVG = ( - - - - - -); -export const GYROSCOPE_SVG = ( - - - - - - - - - - - - - -); -export const COMPASS_SVG = ( - - - - - -); diff --git a/src/view/translations/en.json b/src/view/translations/en.json deleted file mode 100644 index 0a873c763..000000000 --- a/src/view/translations/en.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "toolbar-gpio.description": "8 GPIOs on the device! Pin A1 - A7 can also be used as capacitive touch sensors, and A0 is a true analog output pin.", - "toolbar-gpio.title": "GPIO", - "toolbar-gpio.tryItDescription": "Use your mouse to interact with the pin A1 - A7 or use your keyboard SHIFT + ”1” - “7”.", - "toolbar-ir-sensor.description": "Allows you to send commands to the device with a remote control, or even send messages between multiple devices! You can also do very simple proximity sensing since it reads the reflected light.", - "toolbar-ir-sensor.title": "IR Transmit & Receiver", - "toolbar-ir-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-light-sensor.description": "An analog light sensor can be used to detect ambient light, with similar spectral response to the human eye.", - "toolbar-light-sensor.title": "Light Sensor", - "toolbar-light-sensor.tryItDescription": "Change the brightness detected by the sensor here!", - "toolbar-motion-sensor.description": "Detects acceleration in X, Y and Z orientations. It can also detect 'tap' and 'double tap' strikes on the board and when the board is shaken.", - "toolbar-motion-sensor.title": "Motion Sensor", - "toolbar-motion-sensor.tryItDescription": "Change the acceleration here and click or click on the button to simulate a shake. The tap feature is not supported by the Device Simulator Express. If you would like to see the 'tap' feature implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-neo-pixels.description": "The 10 full color RGB LEDs surrounding the outer edge of the boards can be set to any color. Great for beautiful lighting effects!", - "toolbar-neo-pixels.title": "NeoPixels", - "toolbar-neo-pixels.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-a-b-push.description": "Two push buttons A and B are connected to digital pin #4 (Left) and #5 (Right) each.", - "toolbar-a-b-push.title": "Push Buttons", - "toolbar-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-red-led.description": "This Red LED is connected to the digital #13 GPIO pin. It can be very handy when you want an indicator LED.", - "toolbar-red-led.title": "Red LED", - "toolbar-red-led.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-sound-sensor.description": "A digital microphone can detect audio volume and even perform basic FFT functions but cannot read it like an analog voltage.", - "toolbar-sound-sensor.title": "Sound Sensor", - "toolbar-sound-sensor.tryItDescription": "If you would like to see the sound sensor implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-slider-switch.description": "This slide switch returns True or False depending on whether it's ON or OFF and can be used as a toggle switch in your code!", - "toolbar-slider-switch.title": "Slider Switch", - "toolbar-slider-switch.tryItDescription": "Click it with your mouse or press 'S' on your keyboard to switch it ON and OFF!", - "toolbar-speaker.description": "This speaker can play a .wav file and different tones and also has a class D amplifier that is connected to an output A0 pin built in! You can turn it off using the shutdown control on pin #11 on the physical device.", - "toolbar-speaker.title": "Speaker", - "toolbar-speaker.tryItDescription": "Right now the tones are not supported on the simulator. If you would like to see tones implemented, please +1 the feature addition issue on GitHub! Regardless, you can play it on your device!", - "toolbar-temperature-sensor.description": "This sensor uses an NTC thermistor to sense temperature an calculate it with the analog voltage on analog pin #A9.", - "toolbar-temperature-sensor.title": "Temperature Sensor", - "toolbar-temperature-sensor.tryItDescription": "You can set the temperature in degrees Celsius.", - "toolbar-accelerometer-sensor.title": "Accelerometer", - "toolbar-accelerometer-sensor.description": "An accelerometer measures the acceleration of your micro:bit; this component senses when the micro:bit is moved.", - "toolbar-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", - "toolbar-microbit-light-sensor.title": "Light Sensor", - "toolbar-microbit-temperature-sensor.title": "Temperature Sensor", - "toolbar-microbit-led.title": "LEDs", - "toolbar-microbit-led.description": "The microbit has 25 LEDs for you to play with. The LEDs have 9 levels of brightness.", - "toolbar-microbit-led.tryItDescription": "Run your code and see the LEDs light up!", - "toolbar-microbit-a-b-push.title": "Buttons", - "toolbar-microbit-a-b-push.description": "There are two buttons on the front of the micro:bit (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", - "toolbar-microbit-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-microbit-sound.title": "Sound", - "toolbar-microbit-sound.description": "Your BBC micro:bit can be programmed to make a wide variety of sounds - from single notes, tones and beats to your own musical compositions.", - "toolbar-microbit-sound.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-gpio.title": "GPIO (Pins)", - "toolbar-microbit-gpio.description": "On the bottom edge of your BBC micro:bit there are 25 gold strips, called pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", - "toolbar-microbit-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-wireless.title": "Bluetooth & Radio", - "toolbar-microbit-wireless.description": "micro:bits can use radio waves and bluetooth services to communicate with each other.", - - "toolbar-microbit-wireless.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-gesture-sensor.title": "Gesture", - "toolbar-microbit-gesture-sensor.description": "If you move your BBC micro:bit in a certain way (as a gesture) then the micro:bit is able to detect this. It can recognize the following gestures: up, down, left, right, face up, face down, freefall, 3g, 6g, 8g, and shake.", - - "toolbar-microbit-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", - "toolbar-microbit-compass-sensor.title": "Compass", - "toolbar-microbit-compass-sensor.description": "A digital compass is an input sensor that detects magnetic fields. Your BBC micro:bit has an inbuilt compass that can detect the direction in which it is facing.", - "toolbar-microbit-compass-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-temperature-sensor.title": "Temperature", - "toolbar-clue-temperature-sensor.description": "CLUE uses the BMP280 sensor, an environmental sensor with temperature. This precision sensor from Bosch is the best low-cost, precision sensing solution for measuring temperature with ±1.0°C accuracy.", - - "toolbar-clue-temperature-sensor.tryItDescription": "You can simulate the temperature in your code!", - - "toolbar-clue-light-sensor.title": "Light/Color Sensor", - "toolbar-clue-light-sensor.description": "The light sensor uses APDS9960 and is able to return the red, blue, green and clear light.", - "toolbar-clue-light-sensor.tryItDescription": "You can set the color values of the light detected.", - "toolbar-clue-accelerometer-sensor.title": "Accelerometer", - "toolbar-clue-accelerometer-sensor.description": " The 3-axis accelerometer, can tell you which direction is down towards the Earth (by measuring gravity) or how fast the board is accelerating in 3D space.", - "toolbar-clue-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", - "toolbar-clue-led.title": "Neopixel", - "toolbar-clue-led.description": "The CLUE has one full RGB LED (NeoPixel) on the back of the device.", - - "toolbar-clue-led.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-clue-a-b-push.title": "Buttons", - "toolbar-clue-a-b-push.description": "There are two buttons on the front of the CLUE (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", - "toolbar-clue-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-clue-gpio.title": "Input/Output (GPIO)", - "toolbar-clue-gpio.description": "On the bottom edge of your CLUE, you have 25 pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", - "toolbar-clue-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-sound-sensor.title": "Sound", - "toolbar-clue-sound-sensor.description": "The CLUE uses a PDM MEMS microphone. PDM is a little like 1-bit PWM. You clock the mic with a 1 MHz - 3 MHz clock rate, and on the data line you'll get a square wave out that syncs with the clock.", - "toolbar-clue-sound-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-pressure-sensor.title": "Pressure", - "toolbar-clue-pressure-sensor.description": "CLUE uses the BMP280 sensor for barometric pressure. Because pressure changes with altitude, you can also use it as an altimeter with ±1 meter accuracy.", - - "toolbar-clue-pressure-sensor.tryItDescription": "You can set the pressure here in hectoPascals (hPa).", - "toolbar-clue-humidity-sensor.title": "Humidity", - "toolbar-clue-humidity-sensor.description": "The SHT30-D sensor has an excellent ±2% relative humidity and ±0.5°C accuracy for most uses.", - "toolbar-clue-humidity-sensor.tryItDescription": "You can set the humidity in percentage (%) here.", - "toolbar-clue-gesture-sensor.title": "Gesture", - "toolbar-clue-gesture-sensor.description": "The gesture sensor can detect directional gestures (left to right, right to left, up to down, down to up), but in theory more complicated gestures like zig-zag, clockwise or counterclockwise circle, near to far, etc. could also be detected with additional code. ", - "toolbar-clue-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", - "toolbar-clue-proximity-sensor.title": "Proximity", - "toolbar-clue-proximity-sensor.description": "The proximity sensor uses APDS9960 and is able to return how close an object is to the front of the sensor. This is a number from 0 to 255 where the higher the number the closer an object is to the sensor. You won't be able to translate this into an absolute value in units like inches or millimeters, you can only see how it changes relative to other values.", - - "toolbar-clue-proximity-sensor.tryItDescription": "Set relative proximity to the sensor in values from 0 - 255, where 0 means very close and 255 means very far.", - - "toolbar-clue-bluetooth.title": "Bluetooth", - "toolbar-clue-bluetooth.description": "You can transmit data over Bluetooth to a computer or mobile device for data plotting and logging, or save it to the built in storage.", - "toolbar-clue-bluetooth.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! ", - "toolbar-clue-speaker.description": "The CLUE has a buzzer/speaker for playing tones and beeps.", - "toolbar-clue-magnet-sensor.title": "Magnetometer", - "toolbar-clue-magnet-sensor.description": "Sense the magnetic fields that surround us with this handy triple-axis magnetometer (compass) module. Magnetometers can sense where the strongest magnetic force is coming from, generally used to detect magnetic north, but can also be used for measuring magnetic fields.", - "toolbar-clue-magnet-sensor.tryItDescription": "You can set the magnetic field value in microTeslas (uT).", - "toolbar-clue-gyroscope-sensor.title": "Gyroscope", - "toolbar-clue-gyroscope-sensor.description": "The 3-axis gyroscope that can measure spin and twist users LSM6DS33.", - "toolbar-clue-gyroscope-sensor.tryItDescription": "Set the angular velocity in degrees/second." -} diff --git a/src/view/tsconfig.json b/src/view/tsconfig.json deleted file mode 100644 index 28c6454e0..000000000 --- a/src/view/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "compilerOptions": { - "module": "esnext", - "moduleResolution": "node", - "target": "es6", - "outDir": "out", - "lib": ["es6", "dom"], - "jsx": "react", - "sourceMap": true, - "rootDir": "..", - "strict": true, - "noUnusedLocals": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "experimentalDecorators": true - }, - "exclude": ["node_modules"], - "include": ["./index.tsx"] -} diff --git a/src/view/utils/MessageUtils.tsx b/src/view/utils/MessageUtils.tsx deleted file mode 100644 index 41e093455..000000000 --- a/src/view/utils/MessageUtils.tsx +++ /dev/null @@ -1,12 +0,0 @@ -interface vscode { - postMessage(message: any): void; -} - -declare const vscode: vscode; - -export const sendMessage = ( - type: string, - state: TState -) => { - vscode.postMessage({ command: type, text: state }); -}; diff --git a/src/view/viewUtils.tsx b/src/view/viewUtils.tsx deleted file mode 100644 index 1335d039f..000000000 --- a/src/view/viewUtils.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { SENSOR_LIST } from "./constants"; - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. -export interface ISliderProps { - minValue: number; - maxValue: number; - maxLabel: string; - minLabel: string; - type: string | SENSOR_LIST; - axisLabel: string; - value?: number; - onUpdateValue?: (sensor: SENSOR_LIST, value: number) => void; - step: number; -} - -export interface ISensorButtonProps { - label: string; - type: string; - onMouseUp?: (event: React.PointerEvent) => void; - onMouseDown?: (event: React.PointerEvent) => void; - onKeyUp?: (event: React.KeyboardEvent) => void; - onKeyDown?: (event: React.KeyboardEvent) => void; -} -export interface ISensorProps { - LABEL: string; - sliderProps: ISliderProps[]; - unitLabel: string; -} - -export const X_SLIDER_INDEX = 0; -export const Y_SLIDER_INDEX = 1; -export const Z_SLIDER_INDEX = 2; diff --git a/src/vscode_import.ts b/src/vscode_import.ts deleted file mode 100644 index d9b935355..000000000 --- a/src/vscode_import.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare const acquireVsCodeApi; - -const vscode = acquireVsCodeApi(); From ef13ae84143256997b06b79732af61e536698cae Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Thu, 14 Dec 2023 07:57:40 +0200 Subject: [PATCH 35/64] squash! --- package.json | 607 +++++++++++++++++++++++++-------------------------- 1 file changed, 294 insertions(+), 313 deletions(-) diff --git a/package.json b/package.json index 2e730e244..3bb641a24 100644 --- a/package.json +++ b/package.json @@ -1,327 +1,308 @@ { - "name": "__EXTENSIONNAME__", - "displayName": "__DISPLAYNAME__", - "description": "__DESCRIPTION__", - "version": "0.0.0-UNTRACKEDVERSION", - "publisher": "__PUBLISHER__", - "instrumentationKey": "__AIKEY__", - "icon": "assets/icon.png", - "engines": { - "vscode": "1.43.0" - }, - "categories": [ - "Other" + "name": "__EXTENSIONNAME__", + "displayName": "__DISPLAYNAME__", + "description": "__DESCRIPTION__", + "version": "0.0.0-UNTRACKEDVERSION", + "publisher": "__PUBLISHER__", + "instrumentationKey": "__AIKEY__", + "icon": "assets/icon.png", + "preview": true, + "license": "MIT", + "homepage": "https://github.com/microsoft/vscode-python-devicesimulator", + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode-python-devicesimulator" + }, + "bugs": { + "url": "https://github.com/microsoft/vscode-python-devicesimulator/issues" + }, + "activationEvents": [ + "onCommand:deviceSimulatorExpress.common.installDependencies", + "onCommand:deviceSimulatorExpress.common.openSerialMonitor", + "onCommand:deviceSimulatorExpress.common.runSimulator", + "onCommand:deviceSimulatorExpress.common.selectSerialPort", + "onCommand:deviceSimulatorExpress.common.gettingStarted", + "onCommand:deviceSimulatorExpress.common.deployToDevice", + "onCommand:deviceSimulatorExpress.common.newFile", + "onCommand:deviceSimulatorExpress.common.openSimulator", + "onDebug" + ], + "main": "./out/extension.js", + "contributes": { + "commands": [ + { + "command": "deviceSimulatorExpress.common.installDependencies", + "title": "%deviceSimulatorExpressExtension.commands.common.installDependencies%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.changeBaudRate", + "title": "%deviceSimulatorExpressExtension.commands.common.changeBaudRate%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.closeSerialMonitor", + "title": "%deviceSimulatorExpressExtension.commands.common.closeSerialMonitor%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.openSerialMonitor", + "title": "%deviceSimulatorExpressExtension.commands.common.openSerialMonitor%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.selectSerialPort", + "title": "%deviceSimulatorExpressExtension.commands.common.selectSerialPort%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.runSimulator", + "title": "%deviceSimulatorExpressExtension.commands.common.runSimulator%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.gettingStarted", + "title": "%deviceSimulatorExpressExtension.commands.common.gettingStarted%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.deployToDevice", + "title": "%deviceSimulatorExpressExtension.commands.common.deployToDevice%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.newFile", + "title": "%deviceSimulatorExpressExtension.commands.common.newFile%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + }, + { + "command": "deviceSimulatorExpress.common.openSimulator", + "title": "%deviceSimulatorExpressExtension.commands.common.openSimulator%", + "category": "%deviceSimulatorExpressExtension.commands.common.label%" + } ], - "preview": true, - "license": "MIT", - "homepage": "https://github.com/microsoft/vscode-python-devicesimulator", - "repository": { - "type": "git", - "url": "https://github.com/microsoft/vscode-python-devicesimulator" - }, - "bugs": { - "url": "https://github.com/microsoft/vscode-python-devicesimulator/issues" - }, - "keywords": [ - "python", - "CircuitPython", - "Adafruit", - "microbit", - "MicroPython" + "colors": [ + { + "id": "highContrastButtonBorderOverride.color", + "description": "Color for the high contrast border updated", + "defaults": { + "dark": "debugToolBar.background", + "light": "debugToolBar.background", + "highContrast": "#6FC3DF" + } + }, + { + "id": "badgeForegroundOverride", + "description": "Color that fixes the issue with midnight blue ", + "defaults": { + "dark": "#FFFFFF", + "light": "badge.foreground", + "highContrast": "#FFFFFF" + } + } ], - "activationEvents": [ - "onCommand:deviceSimulatorExpress.common.installDependencies", - "onCommand:deviceSimulatorExpress.common.openSerialMonitor", - "onCommand:deviceSimulatorExpress.common.runSimulator", - "onCommand:deviceSimulatorExpress.common.selectSerialPort", - "onCommand:deviceSimulatorExpress.common.gettingStarted", - "onCommand:deviceSimulatorExpress.common.deployToDevice", - "onCommand:deviceSimulatorExpress.common.newFile", - "onCommand:deviceSimulatorExpress.common.openSimulator", - "onDebug" + "configuration": { + "type": "object", + "title": "%deviceSimulatorExpressExtension.configuration.title%", + "properties": { + "deviceSimulatorExpress.configNewEnvironmentUponSwitch": { + "type": "boolean", + "default": false, + "description": "%deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange%", + "scope": "resource" + }, + "deviceSimulatorExpress.enableUSBDetection": { + "type": "boolean", + "default": true + }, + "deviceSimulatorExpress.showDependencyInstall": { + "type": "boolean", + "default": true, + "description": "%deviceSimulatorExpressExtension.configuration.properties.dependencyChecker%", + "scope": "resource" + }, + "deviceSimulatorExpress.showNewFilePopup": { + "type": "boolean", + "default": true, + "scope": "resource" + }, + "deviceSimulatorExpress.debuggerServerPort": { + "type": "number", + "default": 5577, + "description": "%deviceSimulatorExpressExtension.configuration.properties.debuggerPort%", + "scope": "resource" + } + } + }, + "breakpoints": [ + { + "language": "python" + } ], - "main": "./out/extension.js", - "contributes": { - "commands": [ - { - "command": "deviceSimulatorExpress.common.installDependencies", - "title": "%deviceSimulatorExpressExtension.commands.common.installDependencies%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.changeBaudRate", - "title": "%deviceSimulatorExpressExtension.commands.common.changeBaudRate%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.closeSerialMonitor", - "title": "%deviceSimulatorExpressExtension.commands.common.closeSerialMonitor%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.openSerialMonitor", - "title": "%deviceSimulatorExpressExtension.commands.common.openSerialMonitor%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.selectSerialPort", - "title": "%deviceSimulatorExpressExtension.commands.common.selectSerialPort%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.runSimulator", - "title": "%deviceSimulatorExpressExtension.commands.common.runSimulator%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.gettingStarted", - "title": "%deviceSimulatorExpressExtension.commands.common.gettingStarted%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.deployToDevice", - "title": "%deviceSimulatorExpressExtension.commands.common.deployToDevice%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.newFile", - "title": "%deviceSimulatorExpressExtension.commands.common.newFile%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - }, - { - "command": "deviceSimulatorExpress.common.openSimulator", - "title": "%deviceSimulatorExpressExtension.commands.common.openSimulator%", - "category": "%deviceSimulatorExpressExtension.commands.common.label%" - } + "debuggers": [ + { + "type": "deviceSimulatorExpress", + "label": "Device Simulator Express Debugger", + "languages": [ + "python" ], - "colors": [ - { - "id": "highContrastButtonBorderOverride.color", - "description": "Color for the high contrast border updated", - "defaults": { - "dark": "debugToolBar.background", - "light": "debugToolBar.background", - "highContrast": "#6FC3DF" - } - }, - { - "id": "badgeForegroundOverride", - "description": "Color that fixes the issue with midnight blue ", - "defaults": { - "dark": "#FFFFFF", - "light": "badge.foreground", - "highContrast": "#FFFFFF" - } - } - ], - "configuration": { - "type": "object", - "title": "%deviceSimulatorExpressExtension.configuration.title%", + "configurationAttributes": { + "launch": { "properties": { - "deviceSimulatorExpress.configNewEnvironmentUponSwitch": { - "type": "boolean", - "default": false, - "description": "%deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange%", - "scope": "resource" - }, - "deviceSimulatorExpress.enableUSBDetection": { - "type": "boolean", - "default": true - }, - "deviceSimulatorExpress.showDependencyInstall": { - "type": "boolean", - "default": true, - "description": "%deviceSimulatorExpressExtension.configuration.properties.dependencyChecker%", - "scope": "resource" - }, - "deviceSimulatorExpress.showNewFilePopup": { - "type": "boolean", - "default": true, - "scope": "resource" - }, - "deviceSimulatorExpress.debuggerServerPort": { - "type": "number", - "default": 5577, - "description": "%deviceSimulatorExpressExtension.configuration.properties.debuggerPort%", - "scope": "resource" + "program": { + "type": "string", + "description": "Absolute path to the code file.", + "default": "${file}" + }, + "stopOnEntry": { + "type": "boolean", + "description": "Automatically stop after launch.", + "default": true + }, + "console": { + "enum": [ + "internalConsole", + "integratedTerminal", + "externalTerminal" + ], + "description": "Where to launch the debug target: internal console, integrated terminal, or external terminal.", + "default": "integratedTerminal" + }, + "args": { + "type": "array", + "description": "Command line arguments passed to the program.", + "default": [], + "items": { + "filePath": "string", + "serverPort": "string" + } + }, + "rules": { + "type": "array", + "description": "Debugger rules.", + "default": [], + "items": { + "path": "string", + "include": "boolean" } + } } + } }, - "breakpoints": [ - { - "language": "python" - } + "initialConfigurations": [ + { + "type": "deviceSimulatorExpress", + "request": "launch", + "name": "Device Simulator Express Debugger", + "console": "integratedTerminal" + } ], - "debuggers": [ - { - "type": "deviceSimulatorExpress", - "label": "Device Simulator Express Debugger", - "languages": [ - "python" - ], - "configurationAttributes": { - "launch": { - "properties": { - "program": { - "type": "string", - "description": "Absolute path to the code file.", - "default": "${file}" - }, - "stopOnEntry": { - "type": "boolean", - "description": "Automatically stop after launch.", - "default": true - }, - "console": { - "enum": [ - "internalConsole", - "integratedTerminal", - "externalTerminal" - ], - "description": "Where to launch the debug target: internal console, integrated terminal, or external terminal.", - "default": "integratedTerminal" - }, - "args": { - "type": "array", - "description": "Command line arguments passed to the program.", - "default": [], - "items": { - "filePath": "string", - "serverPort": "string" - } - }, - "rules": { - "type": "array", - "description": "Debugger rules.", - "default": [], - "items": { - "path": "string", - "include": "boolean" - } - } - } - } - }, - "initialConfigurations": [ - { - "type": "deviceSimulatorExpress", - "request": "launch", - "name": "Device Simulator Express Debugger", - "console": "integratedTerminal" - } - ], - "configurationSnippets": [ - { - "label": "Device Simulator Express Debugger : Launch", - "description": "Device Simulator Express Debugger - A configuration for debugging a python code file for the Device Simulator Express simulator.", - "body": { - "type": "deviceSimulatorExpress", - "request": "launch", - "name": "Device Simulator Express Debugger", - "console": "integratedTerminal" - } - } - ] + "configurationSnippets": [ + { + "label": "Device Simulator Express Debugger : Launch", + "description": "Device Simulator Express Debugger - A configuration for debugging a python code file for the Device Simulator Express simulator.", + "body": { + "type": "deviceSimulatorExpress", + "request": "launch", + "name": "Device Simulator Express Debugger", + "console": "integratedTerminal" } + } ] - }, - "scripts": { - "start": "webpack-dev-server", - "vscode:prepublish": "npm run compile", - "build": "gulp build", - "clean": "gulp clean", - "compile": "npm-run-all compile:*", - "compile:extension": "gulp compile", - "compile:views": "webpack --mode development", - "watch": "npm-run-all -p watch:*", - "watch:extension": "tsc --watch", - "watch:views": "webpack --watch --mode development", - "pretest": "npm run compile", - "test": "npm-run-all test:*", - "test:extension-tests": "node ./out/test/runTest.js", - "test:ts": "jest", - "test:api-tests": "pytest src", - "lint": "npm-run-all lint:*", - "lint:ts": "tslint -c tslint.json src/**/*.{ts,tsx}", - "lint:python": "pylint src", - "format": "npm-run-all format:*", - "format:ts": "prettier --config .prettierrc.yaml --write src/**/*.{css,ts,tsx}", - "format:python": "black src", - "check": "npm-run-all check:*", - "check:ts": "prettier --config .prettierrc.yaml --check src/**/*.{css,ts,tsx}", - "check:python": "black src --check", - "package": "vsce package" - }, - "devDependencies": { - "@types/glob": "7.1.1", - "@types/node": "10.12.21", - "@types/react": "16.8.6", - "@types/react-dom": "16.8.4", - "@types/vscode": "1.45.1", - "css-loader": "1.0.0", - "del": "4.0.0", - "event-stream": "4.0.1", - "gulp": "4.0.2", - "gulp-cli": "2.1.0", - "gulp-filter": "5.1.0", - "gulp-sourcemaps": "2.6.5", - "gulp-typescript": "5.0.1", - "less": "3.7.0", - "less-loader": "4.1.0", - "mocha": "6.1.4", - "npm-run-all": "4.1.3", - "prettier": "1.19.1", - "react-scripts": "3.4.0", - "style-loader": "0.21.0", - "ts-import-plugin": "1.5.4", - "ts-loader": "4.4.2", - "tslint": "5.12.1", - "tslint-config-prettier": "1.18.0", - "tslint-microsoft-contrib": "6.1.0", - "tslint-react": "3.6.0", - "tslint-react-hooks": "2.0.0", - "typescript": "3.8.3", - "typescript-react-intl": "0.4.0", - "version-from-git": "1.1.1", - "vsce": "1.47.0", - "vscode-nls-dev": "3.2.6", - "vscode-test": "1.0.0", - "webpack": "4.15.1", - "webpack-cli": "3.0.8" - }, - "dependencies": { - "@babel/preset-typescript": "7.8.3", - "@testing-library/jest-dom": "5.0.2", - "@testing-library/react": "9.4.0", - "@types/jest": "24.9.0", - "@types/open": "6.1.0", - "@types/react-test-renderer": "16.9.0", - "@types/socket.io": "2.1.2", - "babel-jest": "25.1.0", - "compare-versions": "3.5.1", - "eventemitter2": "5.0.1", - "glob": "7.1.4", - "jest": "25.1.0", - "jest-transform-css": "2.0.0", - "office-ui-fabric-react": "7.105.12", - "open": "6.4.0", - "os": "0.1.1", - "react": "16.9.0", - "react-dom": "16.9.0", - "react-intl": "3.1.9", - "react-test-renderer": "16.9.0", - "socket.io": "2.4.0", - "svg-inline-react": "3.1.0", - "ts-jest": "25.0.0", - "usb-native": "5.0.1", - "util": "0.12.1", - "vscode-extension-telemetry": "0.1.1", - "vscode-nls": "4.1.0" - }, - "eslintConfig": { - "extends": "react-app" - }, - "extensionDependencies": [ - "ms-python.python" + } ] + }, + "scripts": { + "start": "webpack-dev-server", + "vscode:prepublish": "npm run compile", + "build": "gulp build", + "clean": "gulp clean", + "compile": "npm-run-all compile:*", + "compile:extension": "gulp compile", + "compile:views": "webpack --mode development", + "watch": "npm-run-all -p watch:*", + "watch:extension": "tsc --watch", + "watch:views": "webpack --watch --mode development", + "pretest": "npm run compile", + "test": "npm-run-all test:*", + "test:extension-tests": "node ./out/test/runTest.js", + "test:ts": "jest", + "test:api-tests": "pytest src", + "lint:ts": "tslint -c tslint.json src/**/*.{ts,tsx}", + "lint:python": "pylint src", + "format": "npm-run-all format:*", + "format:ts": "prettier --config .prettierrc.yaml --write src/**/*.{css,ts,tsx}", + "format:python": "black src", + "check": "npm-run-all check:*", + "check:ts": "prettier --config .prettierrc.yaml --check src/**/*.{css,ts,tsx}", + "check:python": "black src --check", + "package": "vsce package" + }, + "devDependencies": { + "@types/glob": "7.1.1", + "@types/node": "10.12.21", + "@types/react": "16.8.6", + "@types/react-dom": "16.8.4", + "@types/vscode": "1.45.1", + "css-loader": "1.0.0", + "del": "4.0.0", + "event-stream": "4.0.1", + "gulp": "4.0.2", + "gulp-cli": "2.1.0", + "gulp-filter": "5.1.0", + "gulp-sourcemaps": "2.6.5", + "gulp-typescript": "5.0.1", + "less": "3.7.0", + "less-loader": "4.1.0", + "mocha": "6.1.4", + "npm-run-all": "4.1.3", + "react-scripts": "3.4.0", + "style-loader": "0.21.0", + "ts-import-plugin": "1.5.4", + "ts-loader": "4.4.2", + "tslint-config-prettier": "1.18.0", + "tslint-microsoft-contrib": "6.1.0", + "tslint-react": "3.6.0", + "tslint-react-hooks": "2.0.0", + "typescript": "3.8.3", + "typescript-react-intl": "0.4.0", + "version-from-git": "1.1.1", + "vsce": "1.47.0", + "vscode-nls-dev": "3.2.6", + "vscode-test": "1.0.0", + "webpack": "4.15.1", + "webpack-cli": "3.0.8" + }, + "dependencies": { + "@babel/preset-typescript": "7.8.3", + "@testing-library/jest-dom": "5.0.2", + "@testing-library/react": "9.4.0", + "@types/jest": "24.9.0", + "@types/open": "6.1.0", + "@types/react-test-renderer": "16.9.0", + "@types/socket.io": "2.1.2", + "babel-jest": "25.1.0", + "compare-versions": "3.5.1", + "eventemitter2": "5.0.1", + "glob": "7.1.4", + "jest": "25.1.0", + "jest-transform-css": "2.0.0", + "office-ui-fabric-react": "7.105.12", + "open": "6.4.0", + "os": "0.1.1", + "react": "16.9.0", + "react-dom": "16.9.0", + "react-intl": "3.1.9", + "react-test-renderer": "16.9.0", + "socket.io": "2.4.0", + "svg-inline-react": "3.1.0", + "ts-jest": "25.0.0", + "usb-native": "5.0.1", + "util": "0.12.1", + "vscode-extension-telemetry": "0.1.1", + "vscode-nls": "4.1.0" + }, + "extensionDependencies": [ + "ms-python.python" + ] } From 06c154e56ba1fd0bff6303490d794a0a88bd8648 Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Thu, 14 Dec 2023 11:28:59 +0200 Subject: [PATCH 36/64] squash! --- package.json | 100 +++++++++++++++++++++++++-------------------------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/package.json b/package.json index 3bb641a24..0600e4cb3 100644 --- a/package.json +++ b/package.json @@ -239,68 +239,68 @@ "package": "vsce package" }, "devDependencies": { - "@types/glob": "7.1.1", - "@types/node": "10.12.21", - "@types/react": "16.8.6", - "@types/react-dom": "16.8.4", - "@types/vscode": "1.45.1", - "css-loader": "1.0.0", - "del": "4.0.0", + "@types/glob": "8.1.0", + "@types/node": "20.10.4", + "@types/react": "18.2.45", + "@types/react-dom": "18.2.17", + "@types/vscode": "1.85.0", + "css-loader": "6.8.1", + "del": "7.1.0", "event-stream": "4.0.1", "gulp": "4.0.2", - "gulp-cli": "2.1.0", - "gulp-filter": "5.1.0", - "gulp-sourcemaps": "2.6.5", + "gulp-cli": "2.3.0", + "gulp-filter": "9.0.1", + "gulp-sourcemaps": "3.0.0", "gulp-typescript": "5.0.1", - "less": "3.7.0", - "less-loader": "4.1.0", - "mocha": "6.1.4", - "npm-run-all": "4.1.3", - "react-scripts": "3.4.0", - "style-loader": "0.21.0", - "ts-import-plugin": "1.5.4", - "ts-loader": "4.4.2", + "less": "4.2.0", + "less-loader": "11.1.3", + "mocha": "10.2.0", + "npm-run-all": "4.1.5", + "react-scripts": "5.0.1", + "style-loader": "3.3.3", + "ts-import-plugin": "3.0.0", + "ts-loader": "9.5.1", "tslint-config-prettier": "1.18.0", "tslint-microsoft-contrib": "6.1.0", - "tslint-react": "3.6.0", - "tslint-react-hooks": "2.0.0", - "typescript": "3.8.3", - "typescript-react-intl": "0.4.0", + "tslint-react": "4.1.0", + "tslint-react-hooks": "2.2.2", + "typescript": "5.3.3", + "typescript-react-intl": "0.4.1", "version-from-git": "1.1.1", "vsce": "1.47.0", - "vscode-nls-dev": "3.2.6", + "vscode-nls-dev": "4.0.4", "vscode-test": "1.0.0", - "webpack": "4.15.1", - "webpack-cli": "3.0.8" + "webpack": "5.89.0", + "webpack-cli": "5.1.4" }, "dependencies": { - "@babel/preset-typescript": "7.8.3", - "@testing-library/jest-dom": "5.0.2", - "@testing-library/react": "9.4.0", - "@types/jest": "24.9.0", + "@babel/preset-typescript": "7.23.3", + "@testing-library/jest-dom": "6.1.5", + "@testing-library/react": "14.1.2", + "@types/jest": "29.5.11", "@types/open": "6.1.0", - "@types/react-test-renderer": "16.9.0", - "@types/socket.io": "2.1.2", - "babel-jest": "25.1.0", - "compare-versions": "3.5.1", - "eventemitter2": "5.0.1", - "glob": "7.1.4", - "jest": "25.1.0", - "jest-transform-css": "2.0.0", - "office-ui-fabric-react": "7.105.12", - "open": "6.4.0", - "os": "0.1.1", - "react": "16.9.0", - "react-dom": "16.9.0", - "react-intl": "3.1.9", - "react-test-renderer": "16.9.0", - "socket.io": "2.4.0", - "svg-inline-react": "3.1.0", - "ts-jest": "25.0.0", - "usb-native": "5.0.1", - "util": "0.12.1", + "@types/react-test-renderer": "18.0.7", + "@types/socket.io": "3.0.1", + "babel-jest": "29.7.0", + "compare-versions": "6.1.0", + "eventemitter2": "6.4.9", + "glob": "10.3.10", + "jest": "29.7.0", + "jest-transform-css": "6.0.1", + "office-ui-fabric-react": "7.204.0", + "open": "9.1.0", + "os": "0.1.2", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-intl": "6.5.5", + "react-test-renderer": "18.2.0", + "socket.io": "4.7.2", + "svg-inline-react": "3.2.1", + "ts-jest": "29.1.1", + "usb-native": "6.0.0", + "util": "0.12.5", "vscode-extension-telemetry": "0.1.1", - "vscode-nls": "4.1.0" + "vscode-nls": "5.2.0" }, "extensionDependencies": [ "ms-python.python" From aa6b2b46b89645c6099dc72932b695b556cbea8d Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Fri, 15 Dec 2023 12:05:59 +0200 Subject: [PATCH 37/64] squash! --- Source/constants.ts | 1014 +-- Source/cpxWorkspace.ts | 36 +- Source/debugger/debugAdapter.ts | 84 +- Source/debugger/debugAdapterFactory.ts | 50 +- Source/debuggerCommunicationServer.ts | 235 +- Source/deviceContext.ts | 274 +- Source/extension.ts | 2080 +++--- Source/extension_utils/utils.ts | 300 +- Source/serialMonitor.ts | 522 +- Source/serialPortControl.ts | 362 +- Source/service/PopupService.ts | 18 +- .../service/debuggerCommunicationService.ts | 44 +- Source/service/deviceSelectionService.ts | 14 +- Source/service/fileSelectionService.ts | 169 +- Source/service/messagingService.ts | 57 +- Source/service/setupService.ts | 1130 ++-- Source/service/telemetryHandlerService.ts | 1054 +-- Source/service/webviewService.ts | 147 +- Source/simulatorDebugConfigurationProvider.ts | 143 +- Source/telemetry/getPackageInfo.ts | 86 +- Source/telemetry/telemetryAI.ts | 134 +- Source/usbDetector.ts | 194 +- Source/view/App.spec.tsx | 40 +- Source/view/App.tsx | 152 +- Source/view/components/Button.tsx | 46 +- Source/view/components/Dropdown.tsx | 44 +- Source/view/components/clue/Clue.spec.tsx | 40 +- Source/view/components/clue/Clue.tsx | 262 +- Source/view/components/clue/ClueImage.tsx | 256 +- Source/view/components/clue/ClueSimulator.tsx | 550 +- Source/view/components/clue/Clue_svg.tsx | 2319 +++---- .../components/cpx/Accessibility_utils.ts | 32 +- Source/view/components/cpx/Cpx.spec.tsx | 40 +- Source/view/components/cpx/Cpx.tsx | 164 +- Source/view/components/cpx/CpxImage.tsx | 688 +- Source/view/components/cpx/CpxSimulator.tsx | 730 +- Source/view/components/cpx/Cpx_svg.tsx | 5982 ++++++++--------- Source/view/components/cpx/Cpx_svg_style.tsx | 68 +- Source/view/components/cpx/Svg_utils.tsx | 156 +- .../components/microbit/Microbit.spec.tsx | 40 +- Source/view/components/microbit/Microbit.tsx | 206 +- .../components/microbit/MicrobitImage.tsx | 264 +- .../components/microbit/MicrobitSimulator.tsx | 452 +- .../view/components/microbit/Microbit_svg.tsx | 3742 +++++------ .../view/components/simulator/ActionBar.tsx | 60 +- .../toolbar/GenericSliderComponent.tsx | 66 +- Source/view/components/toolbar/Gesture.tsx | 118 +- .../view/components/toolbar/InputSlider.tsx | 212 +- .../view/components/toolbar/SensorButton.tsx | 60 +- .../components/toolbar/SensorModalUtils.tsx | 275 +- Source/view/components/toolbar/ToolBar.tsx | 394 +- .../view/components/toolbar/Toolbar.spec.tsx | 78 +- .../toolbar/clue/ClueModalContent.tsx | 504 +- .../toolbar/clue/ClueSensorProperties.tsx | 312 +- .../toolbar/cpx/CpxModalContent.tsx | 310 +- .../toolbar/cpx/CpxSensorProperties.tsx | 96 +- .../toolbar/microbit/MicrobitModalContent.tsx | 292 +- .../microbit/MicrobitSensorProperties.tsx | 96 +- Source/view/constants.ts | 220 +- Source/view/container/device/Device.spec.tsx | 40 +- Source/view/container/device/Device.tsx | 48 +- Source/view/index.tsx | 10 +- Source/view/pages/gettingStarted.spec.tsx | 40 +- Source/view/pages/gettingStarted.tsx | 759 ++- Source/view/svgs/arrow_right_svg.tsx | 30 +- Source/view/svgs/close_svg.tsx | 40 +- Source/view/svgs/play_svg.tsx | 26 +- Source/view/svgs/refresh_svg.tsx | 28 +- Source/view/svgs/stop_svg.tsx | 30 +- Source/view/svgs/tag_input_svg.tsx | 42 +- Source/view/svgs/tag_output_svg.tsx | 40 +- Source/view/svgs/toolbar_svg.tsx | 1334 ++-- Source/view/translations/en.json | 204 +- Source/view/utils/MessageUtils.tsx | 8 +- Source/view/viewUtils.tsx | 36 +- gulpfile.js | 290 +- jest.config.js | 49 +- locales/en/out/constants.i18n.json | 84 +- locales/en/package.i18n.json | 32 +- misc/usbmapping.json | 31 +- package.nls.json | 32 +- tslint.json | 64 +- webpack.config.js | 162 +- 83 files changed, 15592 insertions(+), 15380 deletions(-) diff --git a/Source/constants.ts b/Source/constants.ts index b14d875f0..14bfd28e5 100644 --- a/Source/constants.ts +++ b/Source/constants.ts @@ -7,549 +7,549 @@ import * as nls from "vscode-nls"; // Debugger Server export const SERVER_INFO = { - DEFAULT_SERVER_PORT: 5577, - ERROR_CODE_INIT_SERVER: "ERROR_INIT_SERVER", - SERVER_PORT_CONFIGURATION: "deviceSimulatorExpress.debuggerServerPort", + DEFAULT_SERVER_PORT: 5577, + ERROR_CODE_INIT_SERVER: "ERROR_INIT_SERVER", + SERVER_PORT_CONFIGURATION: "deviceSimulatorExpress.debuggerServerPort", }; const localize: nls.LocalizeFunc = nls.config({ - messageFormat: nls.MessageFormat.file, + messageFormat: nls.MessageFormat.file, })(); export const CONFIG = { - CONFIG_ENV_ON_SWITCH: - "deviceSimulatorExpress.configNewEnvironmentUponSwitch", - PYTHON_PATH: "python.pythonPath", - SHOW_DEPENDENCY_INSTALL: "deviceSimulatorExpress.showDependencyInstall", - SHOW_NEW_FILE_POPUP: "deviceSimulatorExpress.showNewFilePopup", + CONFIG_ENV_ON_SWITCH: + "deviceSimulatorExpress.configNewEnvironmentUponSwitch", + PYTHON_PATH: "python.pythonPath", + SHOW_DEPENDENCY_INSTALL: "deviceSimulatorExpress.showDependencyInstall", + SHOW_NEW_FILE_POPUP: "deviceSimulatorExpress.showNewFilePopup", }; export const CONSTANTS = { - WEBVIEW_TYPE: { - SIMULATOR: "simulator", - TUTORIAL: "tutorial", - }, - DEBUG_CONFIGURATION_TYPE: "deviceSimulatorExpress", - DEVICE_NAME: { - CPX: "CPX", - MICROBIT: "micro:bit", - CLUE: "CLUE", - }, - DEVICE_NAME_FORMAL: { - CPX: "Circuit Playground Express", - MICROBIT: "micro:bit", - CLUE: "CLUE", - }, - SCRIPT_PATH: { - SIMULATOR: "out/simulator.js", - VSCODE_API: "out/vscode_import.js", - }, - ERROR: { - BAD_PYTHON_PATH: - 'Your interpreter is not pointing to a valid Python executable. Please select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application', - COMPORT_UNKNOWN_ERROR: - "Writing to COM port (GetOverlappedResult): Unknown error code 121", - CPX_FILE_ERROR: localize( - "error.cpxFileFormat", - "The cpx.json file format is not correct." - ), - DEBUGGER_SERVER_INIT_FAILED: (port: number) => { - return localize( - "error.debuggerServerInitFailed", - `Warning : The Debugger Server cannot be opened. Please try to free the port ${port} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.` - ); - }, - DEBUGGING_SESSION_IN_PROGESS: localize( - "error.debuggingSessionInProgress", - "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n" - ), - DEPENDENCY_DOWNLOAD_ERROR: - "Dependency download could not be completed. Functionality may be limited. Please review the installation docs.", - - FAILED_TO_OPEN_SERIAL_PORT: (port: string): string => { - return localize( - "error.failedToOpenSerialPort", - `[ERROR] Failed to open serial port ${port}.` - ); - }, - FAILED_TO_OPEN_SERIAL_PORT_DUE_TO: (port: string, error: any) => { - return localize( - "error.failedToOpenSerialPortDueTo", - `[ERROR] Failed to open serial port ${port} due to error: ${error}. \n` - ); - }, - INSTALLATION_ERROR: localize( - "error.installationError", - "Installation Error" - ), - - INVALID_FILE_EXTENSION_DEBUG: localize( - "error.invalidFileExtensionDebug", - "The file you tried to run isn't a Python file." - ), - INVALID_PYTHON_PATH: localize( - "error.invalidPythonPath", - 'We found that your selected Python interpreter version is too low to run the extension. Please upgrade to version 3.7+ or select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application.' - ), - LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT: localize( - "error.lowPythonVersionForMicrobitDeployment", - "To deploy your code to the micro:bit, you must be using Python 3.3+" - ), - NO_DEVICE: localize( - "error.noDevice", - "The device is not detected. Please double check if your board is connected and/or properly formatted" - ), - NO_FILE_TO_RUN: localize( - "error.noFileToRun", - '[ERROR] We can\'t find a Python file to run. Please make sure you select or open a new ".py" code file, or use the "New File" command to get started and see useful links.\n' - ), - NO_FILE_TO_DEPLOY: localize( - "error.noFileToDeploy", - "[ERROR] We can't find a Python file to deploy to your device.\n" - ), - NO_FOLDER_OPENED: localize( - "error.noFolderCreated", - "In order to use the Serial Monitor, you need to open a folder and reload VS Code." - ), - NO_PROGRAM_FOUND_DEBUG: localize( - "error.noProgramFoundDebug", - "Cannot find a program to debug." - ), - NO_PYTHON_PATH: localize( - "error.noPythonPath", - "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again." - ), - RECONNECT_DEVICE: localize( - "error.reconnectDevice", - "Please disconnect your Circuit Playground Express and try again." - ), - STDERR: (data: string) => { - return localize("error.stderr", `\n[ERROR] ${data} \n`); - }, - UNEXPECTED_MESSAGE: localize( - "error.unexpectedMessage", - "Webview sent an unexpected message" - ), - }, - FILESYSTEM: { - BASE_CIRCUITPYTHON: "base_circuitpython", - CLUE: "clue", - PYTHON_VENV_DIR: "venv", - MICROPYTHON_DIRECTORY: "micropython", - OUTPUT_DIRECTORY: "out", - }, - INFO: { - ALREADY_SUCCESSFUL_INSTALL: localize( - "info.successfulInstall", - "Your current configuration is already successfully set up for the Device Simulator Expresss." - ), - ARE_YOU_SURE: localize( - "info.areYouSure", - "Are you sure you don't want to install the dependencies? The extension can't run without installing them." - ), - CLOSED_SERIAL_PORT: (port: string) => { - return localize( - "info.closedSerialPort", - `[DONE] Closed the serial port - ${port} \n` - ); - }, - COMPLETED_MESSAGE: "Completed", - CPX_JSON_ALREADY_GENERATED: localize( - "info.cpxJsonAlreadyGenerated", - "cpx.json has already been generated." - ), - DEPLOY_DEVICE: localize( - "info.deployDevice", - "\n[INFO] Deploying code to the device...\n" - ), - DEPLOY_SIMULATOR: localize( - "info.deploySimulator", - "\n[INFO] Deploying code to the simulator...\n" - ), - DEPLOY_SUCCESS: localize( - "info.deploySuccess", - "\n[INFO] Code successfully copied! Your device should be loading and ready to go shortly.\n" - ), - EXTENSION_ACTIVATED: localize( - "info.extensionActivated", - "Congratulations, your extension Device Simulator Express is now active!" - ), - FILE_SELECTED: (filePath: string) => { - return localize( - "info.fileSelected", - `[INFO] File selected : ${filePath} \n` - ); - }, - FIRST_TIME_WEBVIEW: localize( - "info.firstTimeWebview", - 'To reopen the simulator select the command "Open Simulator" from command palette.' - ), - INSTALLING_PYTHON_VENV: localize( - "info.installingPythonVenv", - "A virtual environment is currently being created. The required Python packages will be installed. You will be prompted a message telling you when the installation is done." - ), - INSTALL_PYTHON_DEPS: localize( - "info.installPythonDependencies", - "Do you want us to try and install this extension's dependencies on your selected Python interpreter for you?" - ), - INSTALL_PYTHON_VENV: localize( - "info.installPythonVenv", - "Do you want us to try and install this extension's dependencies via virtual environment for you?" - ), - NEW_FILE: localize( - "info.newFile", - "New to Python or the Circuit Playground Express? We are here to help!" - ), - NO_DEVICE_CHOSEN_TO_DEPLOY_TO: localize( - "info.noDeviceChosenToDeployTo", - "\n[INFO] No device was selected to deploy to.\n" - ), - NO_DEVICE_CHOSEN_TO_SIMULATE_TO: localize( - "info.noDeviceChosenToSimulateTo", - "\n[INFO] No device was selected to simulate.\n" - ), - NO_DEVICE_CHOSEN_FOR_NEW_FILE: localize( - "info.noDeviceChosenForNewFile", - "\n[INFO] No device was selected to open a template file for.\n" - ), - OPENED_SERIAL_PORT: (port: string) => { - return localize( - "info.openedSerialPort", - `[INFO] Opened the serial port - ${port} \n` - ); - }, - OPENING_SERIAL_PORT: (port: string) => { - return localize( - "info.openingSerialPort", - `[STARTING] Opening the serial port - ${port} \n` - ); - }, - PLEASE_OPEN_FOLDER: localize( - "info.pleaseOpenFolder", - "Please open a folder first." - ), - REDIRECT: localize("info.redirect", "You are being redirected."), - RUNNING_CODE: localize("info.runningCode", "Running user code"), - SUCCESSFUL_INSTALL: localize( - "info.successfulInstall", - "Successfully set up the Python environment." - ), - THIRD_PARTY_WEBSITE_ADAFRUIT: localize( - "info.thirdPartyWebsiteAdafruit", - 'By clicking "Agree and Proceed" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit\'s privacy policy' - ), - THIRD_PARTY_WEBSITE_PIP: localize( - "info.thirdPartyWebsitePip", - 'By clicking "Agree and Proceed" you will be redirected to pip.pypa.io, a third party website not managed by Microsoft. Please note that your activity on pip.pypa.io is subject to PyPA\'s privacy policy' - ), - THIRD_PARTY_WEBSITE_PYTHON: localize( - "info.thirdPartyWebsitePython", - 'By clicking "Agree and Proceed" you will be redirected to python.org, a third party website not managed by Microsoft. Please note that your activity on python.org is subject to Python\'s privacy policy' - ), - UPDATED_TO_EXTENSION_VENV: localize( - "info.updatedToExtensionsVenv", - "Automatically updated interpreter to point to extension's virtual environment." - ), - WELCOME_OUTPUT_TAB: localize( - "info.welcomeOutputTab", - "Welcome to the Device Simulator Express output tab!\n\n" - ), - }, - LABEL: { - WEBVIEW_PANEL: localize( - "label.webviewPanel", - "Device Simulator Express" - ), - }, - LINKS: { - DOWNLOAD_PIP: "https://pip.pypa.io/en/stable/installing/", - DOWNLOAD_PYTHON: "https://www.python.org/downloads/", - EXAMPLE_CODE: - "https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples", - CPX_HELP: - "https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart", - CLUE_HELP: "https://learn.adafruit.com/adafruit-clue/circuitpython", - INSTALL: - "https://github.com/microsoft/vscode-python-devicesimulator/blob/dev/docs/install.md", - PRIVACY: "https://www.adafruit.com/privacy", - TUTORIALS: - "https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library", - }, - MISC: { - SELECT_PORT_PLACEHOLDER: localize( - "misc.selectPortPlaceholder", - "Select a serial port" - ), - SERIAL_MONITOR_NAME: localize( - "misc.serialMonitorName", - "Device Simulator Express Serial Monitor" - ), - SERIAL_MONITOR_TEST_IF_OPEN: localize( - "misc.testIfPortOpen", - "Test if serial port is open" - ), - }, - NAME: localize("name", "Device Simulator Express"), - TEMPLATE: { - CPX: "cpx_template.py", - MICROBIT: "microbit_template.py", - CLUE: "clue_template.py", - }, - WARNING: { - ACCEPT_AND_RUN: localize( - "warning.agreeAndRun", - "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk." - ), - INVALID_BAUD_RATE: localize( - "warning.invalidBaudRate", - "Invalid baud rate, keep baud rate unchanged." - ), - NO_RATE_SELECTED: localize( - "warning.noRateSelected", - "No rate is selected, keep baud rate unchanged." - ), - NO_SERIAL_PORT_SELECTED: localize( - "warning.noSerialPortSelected", - "No serial port was selected, please select a serial port first" - ), - SERIAL_MONITOR_ALREADY_OPENED: (port: string) => { - return localize( - "warning.serialMonitorAlreadyOpened", - `Serial monitor is already opened for ${port} \n` - ); - }, - SERIAL_MONITOR_NOT_STARTED: localize( - "warning.serialMonitorNotStarted", - "Serial monitor has not been started." - ), - SERIAL_PORT_NOT_STARTED: localize( - "warning.serialPortNotStarted", - "Serial port has not been started.\n" - ), - }, + WEBVIEW_TYPE: { + SIMULATOR: "simulator", + TUTORIAL: "tutorial", + }, + DEBUG_CONFIGURATION_TYPE: "deviceSimulatorExpress", + DEVICE_NAME: { + CPX: "CPX", + MICROBIT: "micro:bit", + CLUE: "CLUE", + }, + DEVICE_NAME_FORMAL: { + CPX: "Circuit Playground Express", + MICROBIT: "micro:bit", + CLUE: "CLUE", + }, + SCRIPT_PATH: { + SIMULATOR: "out/simulator.js", + VSCODE_API: "out/vscode_import.js", + }, + ERROR: { + BAD_PYTHON_PATH: + 'Your interpreter is not pointing to a valid Python executable. Please select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application', + COMPORT_UNKNOWN_ERROR: + "Writing to COM port (GetOverlappedResult): Unknown error code 121", + CPX_FILE_ERROR: localize( + "error.cpxFileFormat", + "The cpx.json file format is not correct.", + ), + DEBUGGER_SERVER_INIT_FAILED: (port: number) => { + return localize( + "error.debuggerServerInitFailed", + `Warning : The Debugger Server cannot be opened. Please try to free the port ${port} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.`, + ); + }, + DEBUGGING_SESSION_IN_PROGESS: localize( + "error.debuggingSessionInProgress", + "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n", + ), + DEPENDENCY_DOWNLOAD_ERROR: + "Dependency download could not be completed. Functionality may be limited. Please review the installation docs.", + + FAILED_TO_OPEN_SERIAL_PORT: (port: string): string => { + return localize( + "error.failedToOpenSerialPort", + `[ERROR] Failed to open serial port ${port}.`, + ); + }, + FAILED_TO_OPEN_SERIAL_PORT_DUE_TO: (port: string, error: any) => { + return localize( + "error.failedToOpenSerialPortDueTo", + `[ERROR] Failed to open serial port ${port} due to error: ${error}. \n`, + ); + }, + INSTALLATION_ERROR: localize( + "error.installationError", + "Installation Error", + ), + + INVALID_FILE_EXTENSION_DEBUG: localize( + "error.invalidFileExtensionDebug", + "The file you tried to run isn't a Python file.", + ), + INVALID_PYTHON_PATH: localize( + "error.invalidPythonPath", + 'We found that your selected Python interpreter version is too low to run the extension. Please upgrade to version 3.7+ or select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application.', + ), + LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT: localize( + "error.lowPythonVersionForMicrobitDeployment", + "To deploy your code to the micro:bit, you must be using Python 3.3+", + ), + NO_DEVICE: localize( + "error.noDevice", + "The device is not detected. Please double check if your board is connected and/or properly formatted", + ), + NO_FILE_TO_RUN: localize( + "error.noFileToRun", + '[ERROR] We can\'t find a Python file to run. Please make sure you select or open a new ".py" code file, or use the "New File" command to get started and see useful links.\n', + ), + NO_FILE_TO_DEPLOY: localize( + "error.noFileToDeploy", + "[ERROR] We can't find a Python file to deploy to your device.\n", + ), + NO_FOLDER_OPENED: localize( + "error.noFolderCreated", + "In order to use the Serial Monitor, you need to open a folder and reload VS Code.", + ), + NO_PROGRAM_FOUND_DEBUG: localize( + "error.noProgramFoundDebug", + "Cannot find a program to debug.", + ), + NO_PYTHON_PATH: localize( + "error.noPythonPath", + "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again.", + ), + RECONNECT_DEVICE: localize( + "error.reconnectDevice", + "Please disconnect your Circuit Playground Express and try again.", + ), + STDERR: (data: string) => { + return localize("error.stderr", `\n[ERROR] ${data} \n`); + }, + UNEXPECTED_MESSAGE: localize( + "error.unexpectedMessage", + "Webview sent an unexpected message", + ), + }, + FILESYSTEM: { + BASE_CIRCUITPYTHON: "base_circuitpython", + CLUE: "clue", + PYTHON_VENV_DIR: "venv", + MICROPYTHON_DIRECTORY: "micropython", + OUTPUT_DIRECTORY: "out", + }, + INFO: { + ALREADY_SUCCESSFUL_INSTALL: localize( + "info.successfulInstall", + "Your current configuration is already successfully set up for the Device Simulator Expresss.", + ), + ARE_YOU_SURE: localize( + "info.areYouSure", + "Are you sure you don't want to install the dependencies? The extension can't run without installing them.", + ), + CLOSED_SERIAL_PORT: (port: string) => { + return localize( + "info.closedSerialPort", + `[DONE] Closed the serial port - ${port} \n`, + ); + }, + COMPLETED_MESSAGE: "Completed", + CPX_JSON_ALREADY_GENERATED: localize( + "info.cpxJsonAlreadyGenerated", + "cpx.json has already been generated.", + ), + DEPLOY_DEVICE: localize( + "info.deployDevice", + "\n[INFO] Deploying code to the device...\n", + ), + DEPLOY_SIMULATOR: localize( + "info.deploySimulator", + "\n[INFO] Deploying code to the simulator...\n", + ), + DEPLOY_SUCCESS: localize( + "info.deploySuccess", + "\n[INFO] Code successfully copied! Your device should be loading and ready to go shortly.\n", + ), + EXTENSION_ACTIVATED: localize( + "info.extensionActivated", + "Congratulations, your extension Device Simulator Express is now active!", + ), + FILE_SELECTED: (filePath: string) => { + return localize( + "info.fileSelected", + `[INFO] File selected : ${filePath} \n`, + ); + }, + FIRST_TIME_WEBVIEW: localize( + "info.firstTimeWebview", + 'To reopen the simulator select the command "Open Simulator" from command palette.', + ), + INSTALLING_PYTHON_VENV: localize( + "info.installingPythonVenv", + "A virtual environment is currently being created. The required Python packages will be installed. You will be prompted a message telling you when the installation is done.", + ), + INSTALL_PYTHON_DEPS: localize( + "info.installPythonDependencies", + "Do you want us to try and install this extension's dependencies on your selected Python interpreter for you?", + ), + INSTALL_PYTHON_VENV: localize( + "info.installPythonVenv", + "Do you want us to try and install this extension's dependencies via virtual environment for you?", + ), + NEW_FILE: localize( + "info.newFile", + "New to Python or the Circuit Playground Express? We are here to help!", + ), + NO_DEVICE_CHOSEN_TO_DEPLOY_TO: localize( + "info.noDeviceChosenToDeployTo", + "\n[INFO] No device was selected to deploy to.\n", + ), + NO_DEVICE_CHOSEN_TO_SIMULATE_TO: localize( + "info.noDeviceChosenToSimulateTo", + "\n[INFO] No device was selected to simulate.\n", + ), + NO_DEVICE_CHOSEN_FOR_NEW_FILE: localize( + "info.noDeviceChosenForNewFile", + "\n[INFO] No device was selected to open a template file for.\n", + ), + OPENED_SERIAL_PORT: (port: string) => { + return localize( + "info.openedSerialPort", + `[INFO] Opened the serial port - ${port} \n`, + ); + }, + OPENING_SERIAL_PORT: (port: string) => { + return localize( + "info.openingSerialPort", + `[STARTING] Opening the serial port - ${port} \n`, + ); + }, + PLEASE_OPEN_FOLDER: localize( + "info.pleaseOpenFolder", + "Please open a folder first.", + ), + REDIRECT: localize("info.redirect", "You are being redirected."), + RUNNING_CODE: localize("info.runningCode", "Running user code"), + SUCCESSFUL_INSTALL: localize( + "info.successfulInstall", + "Successfully set up the Python environment.", + ), + THIRD_PARTY_WEBSITE_ADAFRUIT: localize( + "info.thirdPartyWebsiteAdafruit", + 'By clicking "Agree and Proceed" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit\'s privacy policy', + ), + THIRD_PARTY_WEBSITE_PIP: localize( + "info.thirdPartyWebsitePip", + 'By clicking "Agree and Proceed" you will be redirected to pip.pypa.io, a third party website not managed by Microsoft. Please note that your activity on pip.pypa.io is subject to PyPA\'s privacy policy', + ), + THIRD_PARTY_WEBSITE_PYTHON: localize( + "info.thirdPartyWebsitePython", + 'By clicking "Agree and Proceed" you will be redirected to python.org, a third party website not managed by Microsoft. Please note that your activity on python.org is subject to Python\'s privacy policy', + ), + UPDATED_TO_EXTENSION_VENV: localize( + "info.updatedToExtensionsVenv", + "Automatically updated interpreter to point to extension's virtual environment.", + ), + WELCOME_OUTPUT_TAB: localize( + "info.welcomeOutputTab", + "Welcome to the Device Simulator Express output tab!\n\n", + ), + }, + LABEL: { + WEBVIEW_PANEL: localize( + "label.webviewPanel", + "Device Simulator Express", + ), + }, + LINKS: { + DOWNLOAD_PIP: "https://pip.pypa.io/en/stable/installing/", + DOWNLOAD_PYTHON: "https://www.python.org/downloads/", + EXAMPLE_CODE: + "https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples", + CPX_HELP: + "https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart", + CLUE_HELP: "https://learn.adafruit.com/adafruit-clue/circuitpython", + INSTALL: + "https://github.com/microsoft/vscode-python-devicesimulator/blob/dev/docs/install.md", + PRIVACY: "https://www.adafruit.com/privacy", + TUTORIALS: + "https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library", + }, + MISC: { + SELECT_PORT_PLACEHOLDER: localize( + "misc.selectPortPlaceholder", + "Select a serial port", + ), + SERIAL_MONITOR_NAME: localize( + "misc.serialMonitorName", + "Device Simulator Express Serial Monitor", + ), + SERIAL_MONITOR_TEST_IF_OPEN: localize( + "misc.testIfPortOpen", + "Test if serial port is open", + ), + }, + NAME: localize("name", "Device Simulator Express"), + TEMPLATE: { + CPX: "cpx_template.py", + MICROBIT: "microbit_template.py", + CLUE: "clue_template.py", + }, + WARNING: { + ACCEPT_AND_RUN: localize( + "warning.agreeAndRun", + "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk.", + ), + INVALID_BAUD_RATE: localize( + "warning.invalidBaudRate", + "Invalid baud rate, keep baud rate unchanged.", + ), + NO_RATE_SELECTED: localize( + "warning.noRateSelected", + "No rate is selected, keep baud rate unchanged.", + ), + NO_SERIAL_PORT_SELECTED: localize( + "warning.noSerialPortSelected", + "No serial port was selected, please select a serial port first", + ), + SERIAL_MONITOR_ALREADY_OPENED: (port: string) => { + return localize( + "warning.serialMonitorAlreadyOpened", + `Serial monitor is already opened for ${port} \n`, + ); + }, + SERIAL_MONITOR_NOT_STARTED: localize( + "warning.serialMonitorNotStarted", + "Serial monitor has not been started.", + ), + SERIAL_PORT_NOT_STARTED: localize( + "warning.serialPortNotStarted", + "Serial port has not been started.\n", + ), + }, }; export enum CONFIG_KEYS { - ENABLE_USB_DETECTION = "deviceSimulatorExpress.enableUSBDetection", + ENABLE_USB_DETECTION = "deviceSimulatorExpress.enableUSBDetection", } export enum TelemetryEventName { - FAILED_TO_OPEN_SIMULATOR = "SIMULATOR.FAILED_TO_OPEN", - - // Debugger - CPX_DEBUGGER_INIT_SUCCESS = "CPX.DEBUGGER.INIT.SUCCESS", - CPX_DEBUGGER_INIT_FAIL = "CPX.DEBUGGER.INIT.FAIL", - MICROBIT_DEBUGGER_INIT_SUCCESS = "MICROBIT.DEBUGGER.INIT.SUCCESS", - MICROBIT_DEBUGGER_INIT_FAIL = "MICROBIT.DEBUGGER.INIT.FAIL", - CLUE_DEBUGGER_INIT_SUCCESS = "CLUE.DEBUGGER.INIT.SUCCESS", - CLUE_DEBUGGER_INIT_FAIL = "CLUE.DEBUGGER.INIT.FAIL", - - // Extension commands - COMMAND_RUN_SIMULATOR_BUTTON = "COMMAND.RUN.SIMULATOR_BUTTON", - COMMAND_RUN_PALETTE = "COMMAND.RUN.PALETTE", - COMMAND_INSTALL_EXTENSION_DEPENDENCIES = "COMMAND.INSTALL.EXTENSION.DEPENDENCIES", - COMMAND_SERIAL_MONITOR_CHOOSE_PORT = "COMMAND.SERIAL_MONITOR.CHOOSE_PORT", - COMMAND_SERIAL_MONITOR_OPEN = "COMMAND.SERIAL_MONITOR.OPEN", - COMMAND_SERIAL_MONITOR_BAUD_RATE = "COMMAND.SERIAL_MONITOR.BAUD_RATE", - COMMAND_SERIAL_MONITOR_CLOSE = "COMMAND.SERIAL_MONITOR.CLOSE", - COMMAND_GETTING_STARTED = "COMMAND.GETTING_STARTED", - - CPX_COMMAND_DEPLOY_DEVICE = "CPX.COMMAND.DEPLOY.DEVICE", - CPX_COMMAND_NEW_FILE = "CPX.COMMAND.NEW.FILE.CPX", - CPX_COMMAND_OPEN_SIMULATOR = "CPX.COMMAND.OPEN.SIMULATOR", - - MICROBIT_COMMAND_DEPLOY_DEVICE = "MICROBIT.COMMAND.DEPLOY.DEVICE", - MICROBIT_COMMAND_NEW_FILE = "MICROBIT.COMMAND.NEW.FILE", - MICROBIT_COMMAND_OPEN_SIMULATOR = "MICROBIT.COMMAND.OPEN.SIMULATOR", - - CLUE_COMMAND_DEPLOY_DEVICE = "CLUE.COMMAND.DEPLOY.DEVICE", - CLUE_COMMAND_NEW_FILE = "CLUE.COMMAND.NEW.FILE.CPX", - CLUE_COMMAND_OPEN_SIMULATOR = "CLUE.COMMAND.OPEN.SIMULATOR", - - // Simulator interaction - CPX_SIMULATOR_BUTTON_A = "CPX.SIMULATOR.BUTTON.A", - CPX_SIMULATOR_BUTTON_B = "CPX.SIMULATOR.BUTTON.B", - CPX_SIMULATOR_BUTTON_AB = "CPX.SIMULATOR.BUTTON.AB", - CPX_SIMULATOR_SWITCH = "CPX.SIMULATOR.SWITCH", - - MICROBIT_SIMULATOR_BUTTON_A = "MICROBIT.SIMULATOR.BUTTON.A", - MICROBIT_SIMULATOR_BUTTON_B = "MICROBIT.SIMULATOR.BUTTON.B", - MICROBIT_SIMULATOR_BUTTON_AB = "MICROBIT.SIMULATOR.BUTTON.AB", - - CLUE_SIMULATOR_BUTTON_A = "CLUE.SIMULATOR.BUTTON.A", - CLUE_SIMULATOR_BUTTON_B = "CLUE.SIMULATOR.BUTTON.B", - CLUE_SIMULATOR_BUTTON_AB = "CLUE.SIMULATOR.BUTTON.AB", - - // Sensors - CPX_SIMULATOR_TEMPERATURE_SENSOR = "CPX.SIMULATOR.TEMPERATURE", - CPX_SIMULATOR_LIGHT_SENSOR = "CPX.SIMULATOR.LIGHT", - CPX_SIMULATOR_MOTION_SENSOR = "CPX.SIMULATOR.MOTION", - CPX_SIMULATOR_SHAKE = "CPX.SIMULATOR.SHAKE", - CPX_SIMULATOR_CAPACITIVE_TOUCH = "CPX.SIMULATOR.CAPACITIVE.TOUCH", - - MICROBIT_SIMULATOR_TEMPERATURE_SENSOR = "MICROBIT.SIMULATOR.TEMPERATURE", - MICROBIT_SIMULATOR_LIGHT_SENSOR = "MICROBIT.SIMULATOR.LIGHT", - MICROBIT_SIMULATOR_MOTION_SENSOR = "MICROBIT.SIMULATOR.MOTION", - MICROBIT_SIMULATOR_GESTURE_SENSOR = "MICROBIT.SIMULATOR.GESTURE", - - CLUE_SIMULATOR_TEMPERATURE_SENSOR = "CLUE.SIMULATOR.TEMPERATURE", - CLUE_SIMULATOR_LIGHT_SENSOR = "CLUE.SIMULATOR.LIGHT", - CLUE_SIMULATOR_MOTION_SENSOR = "CLUE.SIMULATOR.MOTION", - CLUE_SIMULATOR_GESTURE_SENSOR = "CLUE.SIMULATOR.GESTURE", - CLUE_SIMULATOR_PRESSURE_SENSOR = "CLUE.SIMULATOR.PRESSURE", - CLUE_SIMULATOR_PROXIMITY_SENSOR = "CLUE.SIMULATOR.PROXIMITY", - CLUE_SIMULATOR_HUMIDITY_SENSOR = "CLUE.SIMULATOR.HUMIDITY", - CLUE_SIMULATOR_GYRO_SENSOR = "CLUE.SIMULATOR.GYRO", - CLUE_SIMULATOR_MAGNET_SENSOR = "CLUE.SIMULATOR.MAGNET", - - // Pop-up dialog - CPX_CLICK_DIALOG_DONT_SHOW = "CPX.CLICK.DIALOG.DONT.SHOW", - CPX_CLICK_DIALOG_EXAMPLE_CODE = "CPX.CLICK.DIALOG.EXAMPLE.CODE", - CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CPX.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", - CPX_CLICK_DIALOG_TUTORIALS = "CPX.CLICK.DIALOG.TUTORIALS", - - CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CLUE.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", - - ERROR_PYTHON_PROCESS = "ERROR.PYTHON.PROCESS", - - CPX_ERROR_COMMAND_NEW_FILE = "CPX.ERROR.COMMAND.NEW.FILE", - CPX_ERROR_DEPLOY_WITHOUT_DEVICE = "CPX.ERROR.DEPLOY.WITHOUT.DEVICE", - CPX_ERROR_PYTHON_DEVICE_PROCESS = "CPX.ERROR.PYTHON.DEVICE.PROCESS", - CPX_SUCCESS_COMMAND_DEPLOY_DEVICE = "CPX.SUCCESS.COMMAND.DEPLOY.DEVICE", - - MICROBIT_ERROR_COMMAND_NEW_FILE = "MICROBIT.ERROR.COMMAND.NEW.FILE", - MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE = "MICROBIT.ERROR.DEPLOY.WITHOUT.DEVICE", - MICROBIT_ERROR_PYTHON_DEVICE_PROCESS = "MICROBIT.ERROR.PYTHON.DEVICE.PROCESS", - MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE = "MICROBIT.SUCCESS.COMMAND.DEPLOY.DEVICE", - - CLUE_ERROR_COMMAND_NEW_FILE = "CLUE.ERROR.COMMAND.NEW.FILE", - CLUE_ERROR_DEPLOY_WITHOUT_DEVICE = "CLUE.ERROR.DEPLOY.WITHOUT.DEVICE", - CLUE_ERROR_PYTHON_DEVICE_PROCESS = "CLUE.ERROR.PYTHON.DEVICE.PROCESS", - CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE = "CLUE.SUCCESS.COMMAND.DEPLOY.DEVICE", - - // Performance - CPX_PERFORMANCE_DEPLOY_DEVICE = "CPX.PERFORMANCE.DEPLOY.DEVICE", - CPX_PERFORMANCE_NEW_FILE = "CPX.PERFORMANCE.NEW.FILE", - CPX_PERFORMANCE_OPEN_SIMULATOR = "CPX.PERFORMANCE.OPEN.SIMULATOR", - - MICROBIT_PERFORMANCE_DEPLOY_DEVICE = "MICROBIT.PERFORMANCE.DEPLOY.DEVICE", - MICROBIT_PERFORMANCE_NEW_FILE = "MICROBIT.PERFORMANCE.NEW.FILE", - MICROBIT_PERFORMANCE_OPEN_SIMULATOR = "MICROBIT.PERFORMANCE.OPEN.SIMULATOR", - - CLUE_PERFORMANCE_DEPLOY_DEVICE = "CLUE.PERFORMANCE.DEPLOY.DEVICE", - CLUE_PERFORMANCE_NEW_FILE = "CLUE.PERFORMANCE.NEW.FILE", - CLUE_PERFORMANCE_OPEN_SIMULATOR = "CLUE.PERFORMANCE.OPEN.SIMULATOR", - - // Venv options - SETUP_VENV_CREATION_ERR = "SETUP.VENV.CREATION.ERR", - SETUP_NO_PIP = "SETUP.NO.PIP", - SETUP_DEP_INSTALL_FAIL = "SETUP.DEP.INSTALL.FAIL", - SETUP_AUTO_RESOLVE_PYTHON_PATH = "SETUP.AUTO.RESOLVE.PYTHON.PATH", - SETUP_NO_PYTHON_PATH = "SETUP.NO.PYTHON.PATH", - SETUP_DOWNLOAD_PYTHON = "SETUP.DOWNLOAD.PYTHON", - SETUP_INVALID_PYTHON_INTERPRETER_PATH = "SETUP.INVALID.PYTHON.INTERPRETER.PATH", - SETUP_INVALID_PYTHON_VER = "SETUP.INVALID.PYTHON.VER", - SETUP_INSTALL_VENV = "SETUP.INSTALL.VENV", - SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL = "SETUP.ORIGINAL.INTERPRETER.DEP.INSTALL", - SETUP_HAS_VENV = "SETUP.HAS.VENV", - SETUP_NO_DEPS_INSTALLED = "SETUP.NO.DEPS.INSTALLED", + FAILED_TO_OPEN_SIMULATOR = "SIMULATOR.FAILED_TO_OPEN", + + // Debugger + CPX_DEBUGGER_INIT_SUCCESS = "CPX.DEBUGGER.INIT.SUCCESS", + CPX_DEBUGGER_INIT_FAIL = "CPX.DEBUGGER.INIT.FAIL", + MICROBIT_DEBUGGER_INIT_SUCCESS = "MICROBIT.DEBUGGER.INIT.SUCCESS", + MICROBIT_DEBUGGER_INIT_FAIL = "MICROBIT.DEBUGGER.INIT.FAIL", + CLUE_DEBUGGER_INIT_SUCCESS = "CLUE.DEBUGGER.INIT.SUCCESS", + CLUE_DEBUGGER_INIT_FAIL = "CLUE.DEBUGGER.INIT.FAIL", + + // Extension commands + COMMAND_RUN_SIMULATOR_BUTTON = "COMMAND.RUN.SIMULATOR_BUTTON", + COMMAND_RUN_PALETTE = "COMMAND.RUN.PALETTE", + COMMAND_INSTALL_EXTENSION_DEPENDENCIES = "COMMAND.INSTALL.EXTENSION.DEPENDENCIES", + COMMAND_SERIAL_MONITOR_CHOOSE_PORT = "COMMAND.SERIAL_MONITOR.CHOOSE_PORT", + COMMAND_SERIAL_MONITOR_OPEN = "COMMAND.SERIAL_MONITOR.OPEN", + COMMAND_SERIAL_MONITOR_BAUD_RATE = "COMMAND.SERIAL_MONITOR.BAUD_RATE", + COMMAND_SERIAL_MONITOR_CLOSE = "COMMAND.SERIAL_MONITOR.CLOSE", + COMMAND_GETTING_STARTED = "COMMAND.GETTING_STARTED", + + CPX_COMMAND_DEPLOY_DEVICE = "CPX.COMMAND.DEPLOY.DEVICE", + CPX_COMMAND_NEW_FILE = "CPX.COMMAND.NEW.FILE.CPX", + CPX_COMMAND_OPEN_SIMULATOR = "CPX.COMMAND.OPEN.SIMULATOR", + + MICROBIT_COMMAND_DEPLOY_DEVICE = "MICROBIT.COMMAND.DEPLOY.DEVICE", + MICROBIT_COMMAND_NEW_FILE = "MICROBIT.COMMAND.NEW.FILE", + MICROBIT_COMMAND_OPEN_SIMULATOR = "MICROBIT.COMMAND.OPEN.SIMULATOR", + + CLUE_COMMAND_DEPLOY_DEVICE = "CLUE.COMMAND.DEPLOY.DEVICE", + CLUE_COMMAND_NEW_FILE = "CLUE.COMMAND.NEW.FILE.CPX", + CLUE_COMMAND_OPEN_SIMULATOR = "CLUE.COMMAND.OPEN.SIMULATOR", + + // Simulator interaction + CPX_SIMULATOR_BUTTON_A = "CPX.SIMULATOR.BUTTON.A", + CPX_SIMULATOR_BUTTON_B = "CPX.SIMULATOR.BUTTON.B", + CPX_SIMULATOR_BUTTON_AB = "CPX.SIMULATOR.BUTTON.AB", + CPX_SIMULATOR_SWITCH = "CPX.SIMULATOR.SWITCH", + + MICROBIT_SIMULATOR_BUTTON_A = "MICROBIT.SIMULATOR.BUTTON.A", + MICROBIT_SIMULATOR_BUTTON_B = "MICROBIT.SIMULATOR.BUTTON.B", + MICROBIT_SIMULATOR_BUTTON_AB = "MICROBIT.SIMULATOR.BUTTON.AB", + + CLUE_SIMULATOR_BUTTON_A = "CLUE.SIMULATOR.BUTTON.A", + CLUE_SIMULATOR_BUTTON_B = "CLUE.SIMULATOR.BUTTON.B", + CLUE_SIMULATOR_BUTTON_AB = "CLUE.SIMULATOR.BUTTON.AB", + + // Sensors + CPX_SIMULATOR_TEMPERATURE_SENSOR = "CPX.SIMULATOR.TEMPERATURE", + CPX_SIMULATOR_LIGHT_SENSOR = "CPX.SIMULATOR.LIGHT", + CPX_SIMULATOR_MOTION_SENSOR = "CPX.SIMULATOR.MOTION", + CPX_SIMULATOR_SHAKE = "CPX.SIMULATOR.SHAKE", + CPX_SIMULATOR_CAPACITIVE_TOUCH = "CPX.SIMULATOR.CAPACITIVE.TOUCH", + + MICROBIT_SIMULATOR_TEMPERATURE_SENSOR = "MICROBIT.SIMULATOR.TEMPERATURE", + MICROBIT_SIMULATOR_LIGHT_SENSOR = "MICROBIT.SIMULATOR.LIGHT", + MICROBIT_SIMULATOR_MOTION_SENSOR = "MICROBIT.SIMULATOR.MOTION", + MICROBIT_SIMULATOR_GESTURE_SENSOR = "MICROBIT.SIMULATOR.GESTURE", + + CLUE_SIMULATOR_TEMPERATURE_SENSOR = "CLUE.SIMULATOR.TEMPERATURE", + CLUE_SIMULATOR_LIGHT_SENSOR = "CLUE.SIMULATOR.LIGHT", + CLUE_SIMULATOR_MOTION_SENSOR = "CLUE.SIMULATOR.MOTION", + CLUE_SIMULATOR_GESTURE_SENSOR = "CLUE.SIMULATOR.GESTURE", + CLUE_SIMULATOR_PRESSURE_SENSOR = "CLUE.SIMULATOR.PRESSURE", + CLUE_SIMULATOR_PROXIMITY_SENSOR = "CLUE.SIMULATOR.PROXIMITY", + CLUE_SIMULATOR_HUMIDITY_SENSOR = "CLUE.SIMULATOR.HUMIDITY", + CLUE_SIMULATOR_GYRO_SENSOR = "CLUE.SIMULATOR.GYRO", + CLUE_SIMULATOR_MAGNET_SENSOR = "CLUE.SIMULATOR.MAGNET", + + // Pop-up dialog + CPX_CLICK_DIALOG_DONT_SHOW = "CPX.CLICK.DIALOG.DONT.SHOW", + CPX_CLICK_DIALOG_EXAMPLE_CODE = "CPX.CLICK.DIALOG.EXAMPLE.CODE", + CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CPX.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", + CPX_CLICK_DIALOG_TUTORIALS = "CPX.CLICK.DIALOG.TUTORIALS", + + CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE = "CLUE.CLICK.DIALOG.HELP.DEPLOY.TO.DEVICE", + + ERROR_PYTHON_PROCESS = "ERROR.PYTHON.PROCESS", + + CPX_ERROR_COMMAND_NEW_FILE = "CPX.ERROR.COMMAND.NEW.FILE", + CPX_ERROR_DEPLOY_WITHOUT_DEVICE = "CPX.ERROR.DEPLOY.WITHOUT.DEVICE", + CPX_ERROR_PYTHON_DEVICE_PROCESS = "CPX.ERROR.PYTHON.DEVICE.PROCESS", + CPX_SUCCESS_COMMAND_DEPLOY_DEVICE = "CPX.SUCCESS.COMMAND.DEPLOY.DEVICE", + + MICROBIT_ERROR_COMMAND_NEW_FILE = "MICROBIT.ERROR.COMMAND.NEW.FILE", + MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE = "MICROBIT.ERROR.DEPLOY.WITHOUT.DEVICE", + MICROBIT_ERROR_PYTHON_DEVICE_PROCESS = "MICROBIT.ERROR.PYTHON.DEVICE.PROCESS", + MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE = "MICROBIT.SUCCESS.COMMAND.DEPLOY.DEVICE", + + CLUE_ERROR_COMMAND_NEW_FILE = "CLUE.ERROR.COMMAND.NEW.FILE", + CLUE_ERROR_DEPLOY_WITHOUT_DEVICE = "CLUE.ERROR.DEPLOY.WITHOUT.DEVICE", + CLUE_ERROR_PYTHON_DEVICE_PROCESS = "CLUE.ERROR.PYTHON.DEVICE.PROCESS", + CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE = "CLUE.SUCCESS.COMMAND.DEPLOY.DEVICE", + + // Performance + CPX_PERFORMANCE_DEPLOY_DEVICE = "CPX.PERFORMANCE.DEPLOY.DEVICE", + CPX_PERFORMANCE_NEW_FILE = "CPX.PERFORMANCE.NEW.FILE", + CPX_PERFORMANCE_OPEN_SIMULATOR = "CPX.PERFORMANCE.OPEN.SIMULATOR", + + MICROBIT_PERFORMANCE_DEPLOY_DEVICE = "MICROBIT.PERFORMANCE.DEPLOY.DEVICE", + MICROBIT_PERFORMANCE_NEW_FILE = "MICROBIT.PERFORMANCE.NEW.FILE", + MICROBIT_PERFORMANCE_OPEN_SIMULATOR = "MICROBIT.PERFORMANCE.OPEN.SIMULATOR", + + CLUE_PERFORMANCE_DEPLOY_DEVICE = "CLUE.PERFORMANCE.DEPLOY.DEVICE", + CLUE_PERFORMANCE_NEW_FILE = "CLUE.PERFORMANCE.NEW.FILE", + CLUE_PERFORMANCE_OPEN_SIMULATOR = "CLUE.PERFORMANCE.OPEN.SIMULATOR", + + // Venv options + SETUP_VENV_CREATION_ERR = "SETUP.VENV.CREATION.ERR", + SETUP_NO_PIP = "SETUP.NO.PIP", + SETUP_DEP_INSTALL_FAIL = "SETUP.DEP.INSTALL.FAIL", + SETUP_AUTO_RESOLVE_PYTHON_PATH = "SETUP.AUTO.RESOLVE.PYTHON.PATH", + SETUP_NO_PYTHON_PATH = "SETUP.NO.PYTHON.PATH", + SETUP_DOWNLOAD_PYTHON = "SETUP.DOWNLOAD.PYTHON", + SETUP_INVALID_PYTHON_INTERPRETER_PATH = "SETUP.INVALID.PYTHON.INTERPRETER.PATH", + SETUP_INVALID_PYTHON_VER = "SETUP.INVALID.PYTHON.VER", + SETUP_INSTALL_VENV = "SETUP.INSTALL.VENV", + SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL = "SETUP.ORIGINAL.INTERPRETER.DEP.INSTALL", + SETUP_HAS_VENV = "SETUP.HAS.VENV", + SETUP_NO_DEPS_INSTALLED = "SETUP.NO.DEPS.INSTALLED", } export const DEFAULT_DEVICE = CONSTANTS.DEVICE_NAME.CPX; // tslint:disable-next-line: no-namespace export namespace DialogResponses { - export const ACCEPT_AND_RUN: MessageItem = { - title: localize("dialogResponses.agreeAndRun", "Agree and Run"), - }; - export const AGREE_AND_PROCEED: MessageItem = { - title: localize("dialogResponses.agreeAndProceed", "Agree and Proceed"), - }; - export const CANCEL: MessageItem = { - title: localize("dialogResponses.cancel", "Cancel"), - }; - export const SELECT: MessageItem = { - title: localize("dialogResponses.select", "Select"), - }; - export const HELP: MessageItem = { - title: localize("dialogResponses.help", "I need help"), - }; - export const DONT_SHOW: MessageItem = { - title: localize("dialogResponses.dontShowAgain", "Don't Show Again"), - }; - export const NO: MessageItem = { - title: localize("dialogResponses.No", "No"), - }; - export const INSTALL_NOW: MessageItem = { - title: localize("dialogResponses.installNow", "Install Now"), - }; - export const DONT_INSTALL: MessageItem = { - title: localize("dialogResponses.dontInstall", "Don't Install"), - }; - export const PRIVACY_STATEMENT: MessageItem = { - title: localize("info.privacyStatement", "Privacy Statement"), - }; - export const TUTORIALS: MessageItem = { - title: localize("dialogResponses.tutorials", "Tutorials on Adafruit"), - }; - export const EXAMPLE_CODE: MessageItem = { - title: localize( - "dialogResponses.exampleCode", - "Example Code on GitHub" - ), - }; - export const MESSAGE_UNDERSTOOD: MessageItem = { - title: localize("dialogResponses.messageUnderstood", "Got It"), - }; - export const INSTALL_PIP: MessageItem = { - title: localize( - "dialogResponses.installPip", - "Install from Pip's webpage" - ), - }; - export const INSTALL_PYTHON: MessageItem = { - title: localize( - "dialogResponses.installPython", - "Install from python.org" - ), - }; - export const YES: MessageItem = { - title: localize("dialogResponses.Yes", "Yes"), - }; - export const READ_INSTALL_MD: MessageItem = { - title: localize( - "dialogResponses.readInstall", - "Read installation docs" - ), - }; + export const ACCEPT_AND_RUN: MessageItem = { + title: localize("dialogResponses.agreeAndRun", "Agree and Run"), + }; + export const AGREE_AND_PROCEED: MessageItem = { + title: localize("dialogResponses.agreeAndProceed", "Agree and Proceed"), + }; + export const CANCEL: MessageItem = { + title: localize("dialogResponses.cancel", "Cancel"), + }; + export const SELECT: MessageItem = { + title: localize("dialogResponses.select", "Select"), + }; + export const HELP: MessageItem = { + title: localize("dialogResponses.help", "I need help"), + }; + export const DONT_SHOW: MessageItem = { + title: localize("dialogResponses.dontShowAgain", "Don't Show Again"), + }; + export const NO: MessageItem = { + title: localize("dialogResponses.No", "No"), + }; + export const INSTALL_NOW: MessageItem = { + title: localize("dialogResponses.installNow", "Install Now"), + }; + export const DONT_INSTALL: MessageItem = { + title: localize("dialogResponses.dontInstall", "Don't Install"), + }; + export const PRIVACY_STATEMENT: MessageItem = { + title: localize("info.privacyStatement", "Privacy Statement"), + }; + export const TUTORIALS: MessageItem = { + title: localize("dialogResponses.tutorials", "Tutorials on Adafruit"), + }; + export const EXAMPLE_CODE: MessageItem = { + title: localize( + "dialogResponses.exampleCode", + "Example Code on GitHub", + ), + }; + export const MESSAGE_UNDERSTOOD: MessageItem = { + title: localize("dialogResponses.messageUnderstood", "Got It"), + }; + export const INSTALL_PIP: MessageItem = { + title: localize( + "dialogResponses.installPip", + "Install from Pip's webpage", + ), + }; + export const INSTALL_PYTHON: MessageItem = { + title: localize( + "dialogResponses.installPython", + "Install from python.org", + ), + }; + export const YES: MessageItem = { + title: localize("dialogResponses.Yes", "Yes"), + }; + export const READ_INSTALL_MD: MessageItem = { + title: localize( + "dialogResponses.readInstall", + "Read installation docs", + ), + }; } export const CPX_CONFIG_FILE = path.join(".vscode", "cpx.json"); export const STATUS_BAR_PRIORITY = { - PORT: 20, - OPEN_PORT: 30, - BAUD_RATE: 40, + PORT: 20, + OPEN_PORT: 30, + BAUD_RATE: 40, }; export const VERSIONS = { - MIN_PY_VERSION: "Python 3.7.0", + MIN_PY_VERSION: "Python 3.7.0", }; export const HELPER_FILES = { - CHECK_IF_VENV_PY: "check_if_venv.py", - CHECK_PYTHON_DEPENDENCIES: "check_python_dependencies.py", - DEVICE_PY: "device.py", - PROCESS_USER_CODE_PY: "process_user_code.py", - PYTHON_EXE: "python.exe", - PYTHON: "python", + CHECK_IF_VENV_PY: "check_if_venv.py", + CHECK_PYTHON_DEPENDENCIES: "check_python_dependencies.py", + DEVICE_PY: "device.py", + PROCESS_USER_CODE_PY: "process_user_code.py", + PYTHON_EXE: "python.exe", + PYTHON: "python", }; export const GLOBAL_ENV_VARS = { - PYTHON: "python", - PYTHON3: "python3", + PYTHON: "python", + PYTHON3: "python3", }; export const LANGUAGE_VARS = { - PYTHON: { ID: "python", FILE_ENDS: ".py" }, + PYTHON: { ID: "python", FILE_ENDS: ".py" }, }; export default CONSTANTS; diff --git a/Source/cpxWorkspace.ts b/Source/cpxWorkspace.ts index 47239a79a..af944e065 100644 --- a/Source/cpxWorkspace.ts +++ b/Source/cpxWorkspace.ts @@ -3,24 +3,24 @@ import * as path from "path"; import * as vscode from "vscode"; export class CPXWorkspace { - static get rootPath(): string | undefined { - const workspaceFolders = vscode.workspace.workspaceFolders; - if (!workspaceFolders || workspaceFolders.length === 0) { - return undefined; - } + static get rootPath(): string | undefined { + const workspaceFolders = vscode.workspace.workspaceFolders; + if (!workspaceFolders || workspaceFolders.length === 0) { + return undefined; + } - for (const workspaceFolder of workspaceFolders) { - const workspaceFolderPath = workspaceFolder.uri.fsPath; - const cpxConfigPath = path.join( - workspaceFolderPath, - ".vscode", - "cpx.json" - ); - if (fs.existsSync(cpxConfigPath)) { - return workspaceFolderPath; - } - } + for (const workspaceFolder of workspaceFolders) { + const workspaceFolderPath = workspaceFolder.uri.fsPath; + const cpxConfigPath = path.join( + workspaceFolderPath, + ".vscode", + "cpx.json", + ); + if (fs.existsSync(cpxConfigPath)) { + return workspaceFolderPath; + } + } - return workspaceFolders[0].uri.fsPath; - } + return workspaceFolders[0].uri.fsPath; + } } diff --git a/Source/debugger/debugAdapter.ts b/Source/debugger/debugAdapter.ts index 59a78482e..cfa1e4063 100644 --- a/Source/debugger/debugAdapter.ts +++ b/Source/debugger/debugAdapter.ts @@ -4,46 +4,46 @@ import { MessagingService } from "../service/messagingService"; import { DEBUG_COMMANDS } from "../view/constants"; export class DebugAdapter implements DebugAdapterTracker { - private readonly console: DebugConsole | undefined; - private readonly messagingService: MessagingService; - private debugCommunicationService: DebuggerCommunicationService; - constructor( - debugSession: DebugSession, - messagingService: MessagingService, - debugCommunicationService: DebuggerCommunicationService - ) { - this.console = debugSession.configuration.console; - this.messagingService = messagingService; - this.debugCommunicationService = debugCommunicationService; - } - onWillStartSession() { - // To Implement - } - onWillReceiveMessage(message: any): void { - if (message.command) { - // Only send pertinent debug messages - switch (message.command) { - case DEBUG_COMMANDS.CONTINUE: - this.messagingService.sendStartMessage(); - break; - case DEBUG_COMMANDS.STACK_TRACE: - this.messagingService.sendPauseMessage(); - break; - case DEBUG_COMMANDS.DISCONNECT: - // Triggered on stop event for debugger - if (!message.arguments.restart) { - this.debugCommunicationService.handleStopEvent(); - } - break; - } - } - } - // A debugger error should unlock the webview - onError() { - this.messagingService.sendStartMessage(); - } - // Device is always running when exiting debugging mode - onExit() { - this.messagingService.sendStartMessage(); - } + private readonly console: DebugConsole | undefined; + private readonly messagingService: MessagingService; + private debugCommunicationService: DebuggerCommunicationService; + constructor( + debugSession: DebugSession, + messagingService: MessagingService, + debugCommunicationService: DebuggerCommunicationService, + ) { + this.console = debugSession.configuration.console; + this.messagingService = messagingService; + this.debugCommunicationService = debugCommunicationService; + } + onWillStartSession() { + // To Implement + } + onWillReceiveMessage(message: any): void { + if (message.command) { + // Only send pertinent debug messages + switch (message.command) { + case DEBUG_COMMANDS.CONTINUE: + this.messagingService.sendStartMessage(); + break; + case DEBUG_COMMANDS.STACK_TRACE: + this.messagingService.sendPauseMessage(); + break; + case DEBUG_COMMANDS.DISCONNECT: + // Triggered on stop event for debugger + if (!message.arguments.restart) { + this.debugCommunicationService.handleStopEvent(); + } + break; + } + } + } + // A debugger error should unlock the webview + onError() { + this.messagingService.sendStartMessage(); + } + // Device is always running when exiting debugging mode + onExit() { + this.messagingService.sendStartMessage(); + } } diff --git a/Source/debugger/debugAdapterFactory.ts b/Source/debugger/debugAdapterFactory.ts index 5b0e2b401..87c0f7652 100644 --- a/Source/debugger/debugAdapterFactory.ts +++ b/Source/debugger/debugAdapterFactory.ts @@ -1,33 +1,33 @@ import { - DebugAdapterTracker, - DebugAdapterTrackerFactory, - DebugSession, - ProviderResult, + DebugAdapterTracker, + DebugAdapterTrackerFactory, + DebugSession, + ProviderResult, } from "vscode"; import { DebuggerCommunicationService } from "../service/debuggerCommunicationService"; import { MessagingService } from "../service/messagingService"; import { DebugAdapter } from "./debugAdapter"; export class DebugAdapterFactory implements DebugAdapterTrackerFactory { - private debugSession: DebugSession; - private messagingService: MessagingService; - private debugCommunicationService: DebuggerCommunicationService; - constructor( - debugSession: DebugSession, - messagingService: MessagingService, - debugCommunicationService: DebuggerCommunicationService - ) { - this.debugSession = debugSession; - this.messagingService = messagingService; - this.debugCommunicationService = debugCommunicationService; - } - public createDebugAdapterTracker( - session: DebugSession - ): ProviderResult { - return new DebugAdapter( - session, - this.messagingService, - this.debugCommunicationService - ); - } + private debugSession: DebugSession; + private messagingService: MessagingService; + private debugCommunicationService: DebuggerCommunicationService; + constructor( + debugSession: DebugSession, + messagingService: MessagingService, + debugCommunicationService: DebuggerCommunicationService, + ) { + this.debugSession = debugSession; + this.messagingService = messagingService; + this.debugCommunicationService = debugCommunicationService; + } + public createDebugAdapterTracker( + session: DebugSession, + ): ProviderResult { + return new DebugAdapter( + session, + this.messagingService, + this.debugCommunicationService, + ); + } } diff --git a/Source/debuggerCommunicationServer.ts b/Source/debuggerCommunicationServer.ts index 0fa4a65cc..eb9355c9b 100644 --- a/Source/debuggerCommunicationServer.ts +++ b/Source/debuggerCommunicationServer.ts @@ -8,133 +8,134 @@ import { SERVER_INFO } from "./constants"; import { DeviceSelectionService } from "./service/deviceSelectionService"; export const DEBUGGER_MESSAGES = { - EMITTER: { - INPUT_CHANGED: "input_changed", - RECEIVED_STATE: "received_state", - DISCONNECT: "process_disconnect", - }, - LISTENER: { - UPDATE_STATE: "updateState", - RECEIVED_STATE: "receivedState", - DISCONNECT: "disconnect", - }, + EMITTER: { + INPUT_CHANGED: "input_changed", + RECEIVED_STATE: "received_state", + DISCONNECT: "process_disconnect", + }, + LISTENER: { + UPDATE_STATE: "updateState", + RECEIVED_STATE: "receivedState", + DISCONNECT: "disconnect", + }, }; export class DebuggerCommunicationServer { - private port: number; - private serverHttp: http.Server; - private serverIo: socketio.Server; - private simulatorWebview: WebviewPanel | undefined; - private deviceSelectionService: DeviceSelectionService; - private isPendingResponse = false; - private pendingCallbacks: Function[] = []; + private port: number; + private serverHttp: http.Server; + private serverIo: socketio.Server; + private simulatorWebview: WebviewPanel | undefined; + private deviceSelectionService: DeviceSelectionService; + private isPendingResponse = false; + private pendingCallbacks: Function[] = []; - constructor( - webviewPanel: WebviewPanel | undefined, - port = SERVER_INFO.DEFAULT_SERVER_PORT, - deviceSelectionService: DeviceSelectionService - ) { - this.port = port; - this.serverHttp = new http.Server(); - this.initHttpServer(); + constructor( + webviewPanel: WebviewPanel | undefined, + port = SERVER_INFO.DEFAULT_SERVER_PORT, + deviceSelectionService: DeviceSelectionService, + ) { + this.port = port; + this.serverHttp = new http.Server(); + this.initHttpServer(); - this.serverIo = socketio(this.serverHttp); - this.simulatorWebview = webviewPanel; - this.initEventsHandlers(); - console.info(`Server running on port ${this.port}`); + this.serverIo = socketio(this.serverHttp); + this.simulatorWebview = webviewPanel; + this.initEventsHandlers(); + console.info(`Server running on port ${this.port}`); - this.deviceSelectionService = deviceSelectionService; - } + this.deviceSelectionService = deviceSelectionService; + } - // send the message to start closing the connection - public closeConnection(): void { - this.sendDisconnectEvent(); - } + // send the message to start closing the connection + public closeConnection(): void { + this.sendDisconnectEvent(); + } - public setWebview(webviewPanel: WebviewPanel | undefined) { - this.simulatorWebview = webviewPanel; - } - // Events are pushed when the previous processed event is over - public emitInputChanged(newState: string): void { - if (this.isPendingResponse) { - this.pendingCallbacks.push(() => { - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, - newState - ); - }); - } else { - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, - newState - ); - this.isPendingResponse = true; - } - } - public disconnectFromPort() { - this.serverIo.close(); - this.serverHttp.close(); - } - private sendDisconnectEvent() { - this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); - } + public setWebview(webviewPanel: WebviewPanel | undefined) { + this.simulatorWebview = webviewPanel; + } + // Events are pushed when the previous processed event is over + public emitInputChanged(newState: string): void { + if (this.isPendingResponse) { + this.pendingCallbacks.push(() => { + this.serverIo.emit( + DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, + newState, + ); + }); + } else { + this.serverIo.emit( + DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, + newState, + ); + this.isPendingResponse = true; + } + } + public disconnectFromPort() { + this.serverIo.close(); + this.serverHttp.close(); + } + private sendDisconnectEvent() { + this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); + } - private initHttpServer(): void { - this.serverHttp.listen(this.port); - if (!this.serverHttp.listening) { - throw new Error(SERVER_INFO.ERROR_CODE_INIT_SERVER); - } - } + private initHttpServer(): void { + this.serverHttp.listen(this.port); + if (!this.serverHttp.listening) { + throw new Error(SERVER_INFO.ERROR_CODE_INIT_SERVER); + } + } - private initEventsHandlers(): void { - this.serverIo.on("connection", (socket: any) => { - socket.on(DEBUGGER_MESSAGES.LISTENER.UPDATE_STATE, (data: any) => { - this.handleState(data); - this.serverIo.emit( - DEBUGGER_MESSAGES.EMITTER.RECEIVED_STATE, - {} - ); - }); - socket.on(DEBUGGER_MESSAGES.LISTENER.RECEIVED_STATE, () => { - if (this.pendingCallbacks.length > 0) { - const currentCall = this.pendingCallbacks.shift(); - currentCall(); - this.isPendingResponse = true; - } else { - this.isPendingResponse = false; - } - }); + private initEventsHandlers(): void { + this.serverIo.on("connection", (socket: any) => { + socket.on(DEBUGGER_MESSAGES.LISTENER.UPDATE_STATE, (data: any) => { + this.handleState(data); + this.serverIo.emit( + DEBUGGER_MESSAGES.EMITTER.RECEIVED_STATE, + {}, + ); + }); + socket.on(DEBUGGER_MESSAGES.LISTENER.RECEIVED_STATE, () => { + if (this.pendingCallbacks.length > 0) { + const currentCall = this.pendingCallbacks.shift(); + currentCall(); + this.isPendingResponse = true; + } else { + this.isPendingResponse = false; + } + }); - socket.on(DEBUGGER_MESSAGES.LISTENER.DISCONNECT, () => { - this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); - if (this.simulatorWebview) { - this.simulatorWebview.webview.postMessage({ - command: "reset-state", - }); - } - }); - }); - } + socket.on(DEBUGGER_MESSAGES.LISTENER.DISCONNECT, () => { + this.serverIo.emit(DEBUGGER_MESSAGES.EMITTER.DISCONNECT, {}); + if (this.simulatorWebview) { + this.simulatorWebview.webview.postMessage({ + command: "reset-state", + }); + } + }); + }); + } - private handleState(data: any): void { - try { - const messageToWebview = JSON.parse(data); - if (messageToWebview.type === "state") { - const messageState = JSON.parse(messageToWebview.data); - if ( - this.simulatorWebview && - messageState.device_name === - this.deviceSelectionService.getCurrentActiveDevice() - ) { - this.simulatorWebview.webview.postMessage({ - active_device: this.deviceSelectionService.getCurrentActiveDevice(), - command: "set-state", - state: messageState, - }); - } - } - } catch (err) { - console.error(`Error: Non-JSON output from the process : ${data}`); - } - } + private handleState(data: any): void { + try { + const messageToWebview = JSON.parse(data); + if (messageToWebview.type === "state") { + const messageState = JSON.parse(messageToWebview.data); + if ( + this.simulatorWebview && + messageState.device_name === + this.deviceSelectionService.getCurrentActiveDevice() + ) { + this.simulatorWebview.webview.postMessage({ + active_device: + this.deviceSelectionService.getCurrentActiveDevice(), + command: "set-state", + state: messageState, + }); + } + } + } catch (err) { + console.error(`Error: Non-JSON output from the process : ${data}`); + } + } } diff --git a/Source/deviceContext.ts b/Source/deviceContext.ts index a4f0afd2e..bafd2858e 100644 --- a/Source/deviceContext.ts +++ b/Source/deviceContext.ts @@ -11,141 +11,141 @@ import { CPXWorkspace } from "./cpxWorkspace"; import * as utils from "./extension_utils/utils"; export class DeviceContext implements vscode.Disposable { - public static getInstance(): DeviceContext { - return DeviceContext._deviceContext; - } - - private static _deviceContext: DeviceContext = new DeviceContext(); - - private _onDidChange = new vscode.EventEmitter(); - private _watcher: vscode.FileSystemWatcher; - private _vscodeWatcher: vscode.FileSystemWatcher; - private _port!: string; - - private constructor() { - if (vscode.workspace && CPXWorkspace.rootPath) { - this._watcher = vscode.workspace.createFileSystemWatcher( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ); - this._vscodeWatcher = vscode.workspace.createFileSystemWatcher( - path.join(CPXWorkspace.rootPath, ".vscode"), - true, - true, - false - ); - - // Reloads the config into the code if the cpx config file has changed - this._watcher.onDidCreate(() => this.loadContext()); - this._watcher.onDidChange(() => this.loadContext()); - this._watcher.onDidDelete(() => this.loadContext()); - - this._vscodeWatcher.onDidDelete(() => this.loadContext()); - } - } - - public loadContext(): Thenable { - return vscode.workspace.findFiles(CPX_CONFIG_FILE, null, 1).then( - files => { - let cpxConfigJson: any = {}; - if (files && files.length > 0) { - const configFile = files[0]; - cpxConfigJson = utils.tryParseJSON( - fs.readFileSync(configFile.fsPath, "utf8") - ); - if (cpxConfigJson) { - this._port = cpxConfigJson.port; - this._onDidChange.fire(); - } else { - console.error(CONSTANTS.ERROR.CPX_FILE_ERROR); - } - } else { - this._port = null; - this._onDidChange.fire(); - } - return this; - }, - reason => { - this._port = null; - this._onDidChange.fire(); - return this; - } - ); - } - - public saveContext() { - if (!CPXWorkspace.rootPath) { - return; - } - const cpxConfigFile = path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE); - let cpxConfigJson: any = {}; - if (utils.fileExistsSync(cpxConfigFile)) { - cpxConfigJson = utils.tryParseJSON( - fs.readFileSync(cpxConfigFile, "utf8") - ); - } - if (!cpxConfigJson) { - // log and notify user error - return; - } - cpxConfigJson.port = this.port; - - utils.mkdirRecursivelySync(path.dirname(cpxConfigFile)); - fs.writeFileSync( - cpxConfigFile, - JSON.stringify( - cpxConfigJson, - (key, value) => { - if (value === null) { - return undefined; - } - return value; - }, - 4 - ) - ); - } - - public dispose() { - if (this._watcher) { - this._watcher.dispose(); - } - - if (this._vscodeWatcher) { - this._vscodeWatcher.dispose(); - } - } - - public async initialize() { - if ( - CPXWorkspace.rootPath && - utils.fileExistsSync( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ) - ) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.CPX_JSON_ALREADY_GENERATED - ); - return; - } else { - if (!CPXWorkspace.rootPath) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.PLEASE_OPEN_FOLDER - ); - return; - } - } - } - - public get onDidChange(): vscode.Event { - return this._onDidChange.event; - } - - public get port() { - return this._port; - } - - public set port(value: string) { - this._port = value; - this.saveContext(); - } + public static getInstance(): DeviceContext { + return DeviceContext._deviceContext; + } + + private static _deviceContext: DeviceContext = new DeviceContext(); + + private _onDidChange = new vscode.EventEmitter(); + private _watcher: vscode.FileSystemWatcher; + private _vscodeWatcher: vscode.FileSystemWatcher; + private _port!: string; + + private constructor() { + if (vscode.workspace && CPXWorkspace.rootPath) { + this._watcher = vscode.workspace.createFileSystemWatcher( + path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE), + ); + this._vscodeWatcher = vscode.workspace.createFileSystemWatcher( + path.join(CPXWorkspace.rootPath, ".vscode"), + true, + true, + false, + ); + + // Reloads the config into the code if the cpx config file has changed + this._watcher.onDidCreate(() => this.loadContext()); + this._watcher.onDidChange(() => this.loadContext()); + this._watcher.onDidDelete(() => this.loadContext()); + + this._vscodeWatcher.onDidDelete(() => this.loadContext()); + } + } + + public loadContext(): Thenable { + return vscode.workspace.findFiles(CPX_CONFIG_FILE, null, 1).then( + (files) => { + let cpxConfigJson: any = {}; + if (files && files.length > 0) { + const configFile = files[0]; + cpxConfigJson = utils.tryParseJSON( + fs.readFileSync(configFile.fsPath, "utf8"), + ); + if (cpxConfigJson) { + this._port = cpxConfigJson.port; + this._onDidChange.fire(); + } else { + console.error(CONSTANTS.ERROR.CPX_FILE_ERROR); + } + } else { + this._port = null; + this._onDidChange.fire(); + } + return this; + }, + (reason) => { + this._port = null; + this._onDidChange.fire(); + return this; + }, + ); + } + + public saveContext() { + if (!CPXWorkspace.rootPath) { + return; + } + const cpxConfigFile = path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE); + let cpxConfigJson: any = {}; + if (utils.fileExistsSync(cpxConfigFile)) { + cpxConfigJson = utils.tryParseJSON( + fs.readFileSync(cpxConfigFile, "utf8"), + ); + } + if (!cpxConfigJson) { + // log and notify user error + return; + } + cpxConfigJson.port = this.port; + + utils.mkdirRecursivelySync(path.dirname(cpxConfigFile)); + fs.writeFileSync( + cpxConfigFile, + JSON.stringify( + cpxConfigJson, + (key, value) => { + if (value === null) { + return undefined; + } + return value; + }, + 4, + ), + ); + } + + public dispose() { + if (this._watcher) { + this._watcher.dispose(); + } + + if (this._vscodeWatcher) { + this._vscodeWatcher.dispose(); + } + } + + public async initialize() { + if ( + CPXWorkspace.rootPath && + utils.fileExistsSync( + path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE), + ) + ) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.CPX_JSON_ALREADY_GENERATED, + ); + return; + } else { + if (!CPXWorkspace.rootPath) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.PLEASE_OPEN_FOLDER, + ); + return; + } + } + } + + public get onDidChange(): vscode.Event { + return this._onDidChange.event; + } + + public get port() { + return this._port; + } + + public set port(value: string) { + this._port = value; + this.saveContext(); + } } diff --git a/Source/extension.ts b/Source/extension.ts index 5940217dc..b60b934e7 100644 --- a/Source/extension.ts +++ b/Source/extension.ts @@ -7,15 +7,15 @@ import * as open from "open"; import * as path from "path"; import * as vscode from "vscode"; import { - CONFIG, - CONSTANTS, - CPX_CONFIG_FILE, - DialogResponses, - GLOBAL_ENV_VARS, - HELPER_FILES, - LANGUAGE_VARS, - SERVER_INFO, - TelemetryEventName, + CONFIG, + CONSTANTS, + CPX_CONFIG_FILE, + DialogResponses, + GLOBAL_ENV_VARS, + HELPER_FILES, + LANGUAGE_VARS, + SERVER_INFO, + TelemetryEventName, } from "./constants"; import { CPXWorkspace } from "./cpxWorkspace"; import { DebugAdapterFactory } from "./debugger/debugAdapterFactory"; @@ -35,9 +35,9 @@ import getPackageInfo from "./telemetry/getPackageInfo"; import TelemetryAI from "./telemetry/telemetryAI"; import { UsbDetector } from "./usbDetector"; import { - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, - WEBVIEW_TYPES, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_MESSAGES, + WEBVIEW_TYPES, } from "./view/constants"; let telemetryAI: TelemetryAI; @@ -59,1043 +59,1055 @@ let pythonProcessDataBuffer: string[]; export let outChannel: vscode.OutputChannel | undefined; const sendCurrentDeviceMessage = (currentPanel: vscode.WebviewPanel) => { - if (currentPanel) { - currentPanel.webview.postMessage({ - command: VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE, - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } + if (currentPanel) { + currentPanel.webview.postMessage({ + command: VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE, + active_device: deviceSelectionService.getCurrentActiveDevice(), + }); + } }; // Extension activation export async function activate(context: vscode.ExtensionContext) { - telemetryAI = new TelemetryAI(context); - setupService = new SetupService(telemetryAI); - let currentPanel: vscode.WebviewPanel | undefined; - let childProcess: cp.ChildProcess | undefined; - let messageListener: vscode.Disposable; - let activeEditorListener: vscode.Disposable; - const webviewService = new WebviewService(context, deviceSelectionService); - const telemetryHandlerService = new TelemetryHandlerService( - telemetryAI, - deviceSelectionService - ); - const formalNameToNickNameMapping = { - [CONSTANTS.DEVICE_NAME_FORMAL.CPX]: CONSTANTS.DEVICE_NAME.CPX, - [CONSTANTS.DEVICE_NAME_FORMAL.MICROBIT]: CONSTANTS.DEVICE_NAME.MICROBIT, - [CONSTANTS.DEVICE_NAME_FORMAL.CLUE]: CONSTANTS.DEVICE_NAME.CLUE, - }; - - // Add our library path to settings.json for autocomplete functionality - updatePythonExtraPaths(); - - // ignore import errors so that adafruit_circuitplayground library - // doesn't trigger lint errors - updatePylintArgs(context); - - pythonExecutablePath = await setupService.setupEnv(context); - - try { - utils.generateCPXConfig(); - configFileCreated = true; - } catch (err) { - console.info("Failed to create the CPX config file."); - configFileCreated = false; - } - - if (pythonExecutablePath === "") { - return; - } - - if (outChannel === undefined) { - outChannel = vscode.window.createOutputChannel(CONSTANTS.NAME); - utils.logToOutputChannel(outChannel, CONSTANTS.INFO.WELCOME_OUTPUT_TAB); - } - - vscode.workspace.onDidSaveTextDocument( - async (document: vscode.TextDocument) => { - await fileSelectionService.updateCurrentFileFromTextFile(document); - } - ); - - const currVersionReleaseName = - "release_note_" + getPackageInfo(context).extensionVersion; - const viewedReleaseNote = context.globalState.get( - currVersionReleaseName, - false - ); - - if (!viewedReleaseNote) { - PopupService.openReleaseNote(); - context.globalState.update(currVersionReleaseName, true); - } - - const openWebview = () => { - if (currentPanel && currentPanel.webview) { - messagingService.setWebview(currentPanel.webview); - currentPanel.webview.html = webviewService.getWebviewContent( - WEBVIEW_TYPES.SIMULATOR, - true, - currentPanel - ); - currentPanel.reveal(vscode.ViewColumn.Beside); - } else { - currentPanel = vscode.window.createWebviewPanel( - CONSTANTS.WEBVIEW_TYPE.SIMULATOR, - CONSTANTS.LABEL.WEBVIEW_PANEL, - { preserveFocus: true, viewColumn: vscode.ViewColumn.Beside }, - { - // Only allow the webview to access resources in our extension's media directory - localResourceRoots: [ - vscode.Uri.file( - path.join( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY - ) - ), - ], - enableScripts: true, - } - ); - - currentPanel.webview.html = webviewService.getWebviewContent( - WEBVIEW_TYPES.SIMULATOR, - true, - currentPanel - ); - messagingService.setWebview(currentPanel.webview); - - if (messageListener !== undefined) { - messageListener.dispose(); - const index = context.subscriptions.indexOf(messageListener); - if (index > -1) { - context.subscriptions.splice(index, 1); - } - } - - if (activeEditorListener !== undefined) { - activeEditorListener.dispose(); - const index = context.subscriptions.indexOf( - activeEditorListener - ); - if (index > -1) { - context.subscriptions.splice(index, 1); - } - } - - if (currentPanel) { - // Handle messages from webview - messageListener = currentPanel.webview.onDidReceiveMessage( - message => { - const messageJson = JSON.stringify({ - active_device: deviceSelectionService.getCurrentActiveDevice(), - state: message.text, - }); - switch (message.command) { - case WEBVIEW_MESSAGES.BUTTON_PRESS: - // Send input to the Python process - telemetryHandlerService.handleButtonPressTelemetry( - message.text - ); - console.log(`About to write ${messageJson} \n`); - if ( - inDebugMode && - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .emitInputChanged(messageJson); - } else if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - break; - case WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP: - console.log(`Play button ${messageJson} \n`); - if (message.text.state as boolean) { - fileSelectionService.setPathAndSendMessage( - message.text.selected_file - ); - fileSelectionService.findCurrentTextDocument(); - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_RUN_SIMULATOR_BUTTON - ); - runSimulatorCommand(); - } else { - killProcessIfRunning(); - } - - if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - - break; - case WEBVIEW_MESSAGES.GESTURE: - case WEBVIEW_MESSAGES.SENSOR_CHANGED: - telemetryHandlerService.handleGestureTelemetry( - message.text - ); - console.log(`Sensor changed ${messageJson} \n`); - if ( - inDebugMode && - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .emitInputChanged(messageJson); - } else if (childProcess) { - childProcess.stdin.write( - messageJson + "\n" - ); - } - break; - case WEBVIEW_MESSAGES.REFRESH_SIMULATOR: - console.log("Refresh button"); - runSimulatorCommand(); - break; - case WEBVIEW_MESSAGES.SLIDER_TELEMETRY: - telemetryHandlerService.handleSensorTelemetry( - message.text - ); - break; - case WEBVIEW_MESSAGES.SWITCH_DEVICE: - deviceSelectionService.setCurrentActiveDevice( - message.text.active_device - ); - killProcessIfRunning(); - break; - default: - vscode.window.showInformationMessage( - CONSTANTS.ERROR.UNEXPECTED_MESSAGE - ); - break; - } - }, - undefined, - context.subscriptions - ); - - activeEditorListener = utils.addVisibleTextEditorCallback( - currentPanel, - context - ); - } - - currentPanel.onDidDispose( - () => { - currentPanel = undefined; - if ( - debuggerCommunicationService.getCurrentDebuggerServer() - ) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .setWebview(undefined); - } - killProcessIfRunning(); - if (firstTimeClosed) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.FIRST_TIME_WEBVIEW - ); - firstTimeClosed = false; - } - }, - undefined, - context.subscriptions - ); - } - sendCurrentDeviceMessage(currentPanel); - }; - - // Open Simulator on the webview - const openSimulator: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.openSimulator", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_SIMULATE_TO, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - deviceSelectionService.setCurrentActiveDevice(device); - const telemetryEvents = telemetryHandlerService.getTelemetryEventsForOpenSimulator( - device - ); - telemetryAI.trackFeatureUsage( - telemetryEvents.openSimulatorTelemetryEvent - ); - telemetryAI.runWithLatencyMeasure( - openWebview, - telemetryEvents.openSimulatorPerformanceTelemetryEvent - ); - } - ); - - const gettingStartedOpen: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.gettingStarted", - () => { - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_GETTING_STARTED - ); - webviewService.openTutorialPanel(); - } - ); - - const openTemplateFile = (template: string) => { - const fileName = template; - const filePath = - __dirname + path.sep + "templates" + path.sep + fileName; - const file = fs.readFileSync(filePath, "utf8"); - const showNewFilePopup: boolean = vscode.workspace - .getConfiguration() - .get(CONFIG.SHOW_NEW_FILE_POPUP); - - if (showNewFilePopup && template === CONSTANTS.TEMPLATE.CPX) { - vscode.window - .showInformationMessage( - CONSTANTS.INFO.NEW_FILE, - DialogResponses.DONT_SHOW, - DialogResponses.EXAMPLE_CODE, - DialogResponses.TUTORIALS - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.DONT_SHOW) { - vscode.workspace - .getConfiguration() - .update(CONFIG.SHOW_NEW_FILE_POPUP, false); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_DONT_SHOW - ); - } else if (selection === DialogResponses.EXAMPLE_CODE) { - open(CONSTANTS.LINKS.EXAMPLE_CODE); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_EXAMPLE_CODE - ); - } else if (selection === DialogResponses.TUTORIALS) { - const okAction = () => { - open(CONSTANTS.LINKS.TUTORIALS); - telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_TUTORIALS - ); - }; - utils.showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT - ); - } - }); - } - - // tslint:disable-next-line: ban-comma-operator - vscode.workspace - .openTextDocument({ - content: file, - language: LANGUAGE_VARS.PYTHON.ID, - }) - .then((template: vscode.TextDocument) => { - vscode.window.showTextDocument(template, 1, false).then(() => { - openWebview(); - }); - }), - // tslint:disable-next-line: no-unused-expression - (error: any) => { - telemetryHandlerService.handleNewFileErrorTelemetry(); - console.error(`Failed to open a new text document: ${error}`); - }; - }; - - const newFile: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.newFile", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_FOR_NEW_FILE, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - deviceSelectionService.setCurrentActiveDevice(device); - - const deviceToTemplateMapping = { - [CONSTANTS.DEVICE_NAME.CPX]: CONSTANTS.TEMPLATE.CPX, - [CONSTANTS.DEVICE_NAME.MICROBIT]: CONSTANTS.TEMPLATE.MICROBIT, - [CONSTANTS.DEVICE_NAME.CLUE]: CONSTANTS.TEMPLATE.CLUE, - }; - const templateFile = deviceToTemplateMapping[device]; - - const telemetryEvents = telemetryHandlerService.getTelemetryEventsForNewFile( - device - ); - - telemetryAI.trackFeatureUsage( - telemetryEvents.newFileTelemetryEvent - ); - telemetryAI.runWithLatencyMeasure( - () => openTemplateFile(templateFile), - telemetryEvents.newFilePerformanceTelemetryEvent - ); - } - ); - - const installDependencies: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.installDependencies", - async () => { - pythonExecutablePath = await setupService.setupEnv(context, true); - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_INSTALL_EXTENSION_DEPENDENCIES - ); - } - ); - - const killProcessIfRunning = () => { - if (childProcess !== undefined) { - if (currentPanel) { - currentPanel.webview.postMessage({ - command: "reset-state", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } - // TODO: We need to check the process was correctly killed - childProcess.kill(); - childProcess = undefined; - } - }; - - const runSimulatorCommand = async () => { - pythonProcessDataBuffer = []; - // Prevent running new code if a debug session is active - if (inDebugMode) { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.DEBUGGING_SESSION_IN_PROGESS - ); - return; - } - if (shouldShowRunCodePopup) { - const shouldExitCommand = await vscode.window - .showWarningMessage( - CONSTANTS.WARNING.ACCEPT_AND_RUN, - DialogResponses.ACCEPT_AND_RUN, - DialogResponses.CANCEL - ) - .then((selection: vscode.MessageItem | undefined) => { - let hasAccepted = true; - if (selection === DialogResponses.ACCEPT_AND_RUN) { - shouldShowRunCodePopup = false; - hasAccepted = false; - } - return hasAccepted; - }); - // Don't run users code if they don't accept - if (shouldExitCommand) { - return; - } - } - - openWebview(); - - if (!currentPanel) { - return; - } - - console.info(CONSTANTS.INFO.RUNNING_CODE); - - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_SIMULATOR, - true - ); - - killProcessIfRunning(); - - await fileSelectionService.updateCurrentFileFromEditor( - vscode.window.activeTextEditor - ); - - if (fileSelectionService.getCurrentFileAbsPath() === "") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_RUN, - true - ); - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FILE_TO_RUN, - DialogResponses.MESSAGE_UNDERSTOOD - ); - } else { - // Save on run - await fileSelectionService.getCurrentTextDocument().save(); - - if ( - !fileSelectionService - .getCurrentTextDocument() - .fileName.endsWith(LANGUAGE_VARS.PYTHON.FILE_ENDS) - ) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_RUN, - true - ); - return; - } - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.FILE_SELECTED( - fileSelectionService.getCurrentFileAbsPath() - ) - ); - - // Activate the run webview button - currentPanel.webview.postMessage({ - command: "activate-play", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - const args = [ - utils.getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.PROCESS_USER_CODE_PY - ), - fileSelectionService.getCurrentFileAbsPath(), - JSON.stringify({ enable_telemetry: utils.getTelemetryState() }), - ]; - childProcess = cp.spawn(pythonExecutablePath, args); - - let dataFromTheProcess = ""; - let oldMessage = ""; - - // Data received from Python process - childProcess.stdout.on("data", data => { - dataFromTheProcess = data.toString(); - if (currentPanel) { - // NOTE: parts of the flow regarding pythonProcessDataBuffer - // are needed for the CLUE simulator to properly receive - // base_64 strings on UNIX systems. - - // added any incomplete data to beginning - const processedData = pythonProcessDataBuffer - .join("") - .concat(dataFromTheProcess); - pythonProcessDataBuffer = []; - - // Process the data from the process and send one state at a time - processedData.split("\0").forEach(message => { - if ( - currentPanel && - message.length > 0 && - message !== oldMessage - ) { - oldMessage = message; - let messageToWebview; - // Check the message is a JSON - try { - messageToWebview = JSON.parse(message); - // Check the JSON is a state - switch (messageToWebview.type) { - case "state": - const messageData = JSON.parse( - messageToWebview.data - ); - if ( - messageData.device_name === - deviceSelectionService.getCurrentActiveDevice() - ) { - messagingService.sendMessageToWebview( - VSCODE_MESSAGES_TO_WEBVIEW.SET_STATE, - messageData - ); - } - break; - - case "print": - console.log( - `Process print statement output = ${messageToWebview.data}` - ); - utils.logToOutputChannel( - outChannel, - `[PRINT] ${messageToWebview.data}` - ); - break; - - default: - console.log( - `Non-state JSON output from the process : ${messageToWebview}` - ); - break; - } - } catch (err) { - if (err instanceof SyntaxError) { - // if not a JSON string, it is incomplete - // add to beginning of next strings - pythonProcessDataBuffer.push(message); - } else { - console.log( - `Errored output: ${messageToWebview}` - ); - } - } - } - }); - } - }); - - // Std error output - childProcess.stderr.on("data", data => { - console.error( - `Error from the Python process through stderr: ${data}` - ); - telemetryAI.trackFeatureUsage( - TelemetryEventName.ERROR_PYTHON_PROCESS - ); - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.STDERR(data), - true - ); - if (currentPanel) { - currentPanel.webview.postMessage({ - active_device: deviceSelectionService.getCurrentActiveDevice(), - command: "reset-state", - }); - } - }); - - // When the process is done - childProcess.on("end", (code: number) => { - console.info(`Command execution exited with code: ${code}`); - }); - } - }; - - // Send message to the webview - const runSimulator: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.runSimulator", - () => { - telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_RUN_PALETTE - ); - runSimulatorCommand(); - } - ); - - const deployCode = async (device: string) => { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_DEVICE, - true - ); - - await fileSelectionService.updateCurrentFileFromEditor( - vscode.window.activeTextEditor - ); - - if (fileSelectionService.getCurrentFileAbsPath() === "") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, - true - ); - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, - DialogResponses.MESSAGE_UNDERSTOOD - ); - } else { - await fileSelectionService.getCurrentTextDocument().save(); - - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.FILE_SELECTED( - fileSelectionService.getCurrentFileAbsPath() - ) - ); - - const deviceProcess = cp.spawn(pythonExecutablePath, [ - utils.getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.DEVICE_PY - ), - device, - fileSelectionService.getCurrentFileAbsPath(), - ]); - - let dataFromTheProcess = ""; - - // Data received from Python process - deviceProcess.stdout.on("data", data => { - dataFromTheProcess = data.toString(); - - let messageToWebview; - try { - messageToWebview = JSON.parse(dataFromTheProcess); - if (messageToWebview.type === "complete") { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.DEPLOY_SUCCESS, - true - ); - } - telemetryHandlerService.handleDeployToDeviceFinishedTelemetry( - messageToWebview, - device - ); - } catch (err) { - console.log( - `Non-JSON output from the process : ${dataFromTheProcess}` - ); - } - }); - - // Std error output - deviceProcess.stderr.on("data", data => { - telemetryHandlerService.handleDeployToDeviceErrorTelemetry( - data, - device - ); - console.error( - `Error from the Python device process through stderr: ${data}` - ); - utils.logToOutputChannel( - outChannel, - `[ERROR] ${data} \n`, - true - ); - }); - - // When the process is done - deviceProcess.on("end", (code: number) => { - console.info(`Command execution exited with code: ${code}`); - }); - } - }; - - const deployToDevice: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.deployToDevice", - async () => { - const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL) - ); - - if (!chosen_device) { - utils.logToOutputChannel( - outChannel, - CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_DEPLOY_TO, - true - ); - return; - } - - const device = formalNameToNickNameMapping[chosen_device]; - - const telemetryEvents = telemetryHandlerService.getTelemetryEventsForStartingDeployToDevice( - device - ); - - telemetryAI.trackFeatureUsage(telemetryEvents.deployTelemetryEvent); - telemetryAI.runWithLatencyMeasure(() => { - deployCode(device); - }, telemetryEvents.deployPerformanceTelemetryEvent); - } - ); - - let serialMonitor: SerialMonitor | undefined; - if (configFileCreated) { - serialMonitor = SerialMonitor.getInstance(); - context.subscriptions.push(serialMonitor); - } - - const selectSerialPort: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.selectSerialPort", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.selectSerialPort(null, null); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CHOOSE_PORT); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const openSerialMonitor: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.openSerialMonitor", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure( - serialMonitor.openSerialMonitor.bind(serialMonitor), - TelemetryEventName.COMMAND_SERIAL_MONITOR_OPEN - ); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const changeBaudRate: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.changeBaudRate", - () => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure( - serialMonitor.changeBaudRate.bind(serialMonitor), - TelemetryEventName.COMMAND_SERIAL_MONITOR_BAUD_RATE - ); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const closeSerialMonitor: vscode.Disposable = vscode.commands.registerCommand( - "deviceSimulatorExpress.common.closeSerialMonitor", - (port, showWarning = true) => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.closeSerialMonitor(port, showWarning); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - const showReleaseNote = vscode.commands.registerCommand( - "deviceSimulatorExpress.", - (port, showWarning = true) => { - if (serialMonitor) { - telemetryAI.runWithLatencyMeasure(() => { - serialMonitor.closeSerialMonitor(port, showWarning); - }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); - } else { - vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED - ); - console.info("Serial monitor is not defined."); - } - } - ); - - UsbDetector.getInstance().initialize(context.extensionPath); - UsbDetector.getInstance().startListening(); - - if ( - CPXWorkspace.rootPath && - (utils.fileExistsSync( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) - ) || - vscode.window.activeTextEditor) - ) { - (() => { - if (!SerialMonitor.getInstance().initialized) { - SerialMonitor.getInstance().initialize(); - } - })(); - } - - // Debugger configuration - const simulatorDebugConfiguration = new SimulatorDebugConfigurationProvider( - utils.getPathToScript(context, "out/", "debug_user_code.py") - ); - - const debugAdapterFactory = new DebugAdapterFactory( - vscode.debug.activeDebugSession, - messagingService, - debuggerCommunicationService - ); - vscode.debug.registerDebugAdapterTrackerFactory( - LANGUAGE_VARS.PYTHON.ID, - debugAdapterFactory - ); - // On Debug Session Start: Init comunication - const debugSessionsStarted = vscode.debug.onDidStartDebugSession(() => { - if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { - // Reinitialize process - killProcessIfRunning(); - inDebugMode = true; - - try { - // Shut down existing server on debug restart - if (debuggerCommunicationService.getCurrentDebuggerServer()) { - debuggerCommunicationService.resetCurrentDebuggerServer(); - } - - debuggerCommunicationService.setCurrentDebuggerServer( - new DebuggerCommunicationServer( - currentPanel, - utils.getServerPortConfig(), - deviceSelectionService - ) - ); - - telemetryHandlerService.handleDebuggerTelemetry(); - - openWebview(); - if (currentPanel) { - debuggerCommunicationService - .getCurrentDebuggerServer() - .setWebview(currentPanel); - currentPanel.webview.postMessage({ - active_device: deviceSelectionService.getCurrentActiveDevice(), - command: "activate-play", - }); - } - } catch (err) { - if (err.message === SERVER_INFO.ERROR_CODE_INIT_SERVER) { - console.error( - `Error trying to init the server on port ${utils.getServerPortConfig()}` - ); - - telemetryHandlerService.handleDebuggerFailTelemetry(); - - vscode.window.showErrorMessage( - CONSTANTS.ERROR.DEBUGGER_SERVER_INIT_FAILED( - utils.getServerPortConfig() - ) - ); - } - } - } - }); - - // On Debug Session Stop: Stop communiation - const debugSessionStopped = vscode.debug.onDidTerminateDebugSession(() => { - if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { - inDebugMode = false; - simulatorDebugConfiguration.deviceSimulatorExpressDebug = false; - if (debuggerCommunicationService.getCurrentDebuggerServer()) { - debuggerCommunicationService.resetCurrentDebuggerServer(); - } - if (currentPanel) { - currentPanel.webview.postMessage({ - command: "reset-state", - active_device: deviceSelectionService.getCurrentActiveDevice(), - }); - } - } - }); - - const configsChanged = vscode.workspace.onDidChangeConfiguration( - async () => { - if (utils.checkConfig(CONFIG.CONFIG_ENV_ON_SWITCH)) { - pythonExecutablePath = await setupService.setupEnv(context); - } - } - ); - - context.subscriptions.push( - installDependencies, - runSimulator, - changeBaudRate, - closeSerialMonitor, - deployToDevice, - newFile, - openSimulator, - openSerialMonitor, - selectSerialPort, - gettingStartedOpen, - vscode.debug.registerDebugConfigurationProvider( - CONSTANTS.DEBUG_CONFIGURATION_TYPE, - simulatorDebugConfiguration - ), - debugSessionsStarted, - debugSessionStopped, - configsChanged - ); + telemetryAI = new TelemetryAI(context); + setupService = new SetupService(telemetryAI); + let currentPanel: vscode.WebviewPanel | undefined; + let childProcess: cp.ChildProcess | undefined; + let messageListener: vscode.Disposable; + let activeEditorListener: vscode.Disposable; + const webviewService = new WebviewService(context, deviceSelectionService); + const telemetryHandlerService = new TelemetryHandlerService( + telemetryAI, + deviceSelectionService, + ); + const formalNameToNickNameMapping = { + [CONSTANTS.DEVICE_NAME_FORMAL.CPX]: CONSTANTS.DEVICE_NAME.CPX, + [CONSTANTS.DEVICE_NAME_FORMAL.MICROBIT]: CONSTANTS.DEVICE_NAME.MICROBIT, + [CONSTANTS.DEVICE_NAME_FORMAL.CLUE]: CONSTANTS.DEVICE_NAME.CLUE, + }; + + // Add our library path to settings.json for autocomplete functionality + updatePythonExtraPaths(); + + // ignore import errors so that adafruit_circuitplayground library + // doesn't trigger lint errors + updatePylintArgs(context); + + pythonExecutablePath = await setupService.setupEnv(context); + + try { + utils.generateCPXConfig(); + configFileCreated = true; + } catch (err) { + console.info("Failed to create the CPX config file."); + configFileCreated = false; + } + + if (pythonExecutablePath === "") { + return; + } + + if (outChannel === undefined) { + outChannel = vscode.window.createOutputChannel(CONSTANTS.NAME); + utils.logToOutputChannel(outChannel, CONSTANTS.INFO.WELCOME_OUTPUT_TAB); + } + + vscode.workspace.onDidSaveTextDocument( + async (document: vscode.TextDocument) => { + await fileSelectionService.updateCurrentFileFromTextFile(document); + }, + ); + + const currVersionReleaseName = + "release_note_" + getPackageInfo(context).extensionVersion; + const viewedReleaseNote = context.globalState.get( + currVersionReleaseName, + false, + ); + + if (!viewedReleaseNote) { + PopupService.openReleaseNote(); + context.globalState.update(currVersionReleaseName, true); + } + + const openWebview = () => { + if (currentPanel && currentPanel.webview) { + messagingService.setWebview(currentPanel.webview); + currentPanel.webview.html = webviewService.getWebviewContent( + WEBVIEW_TYPES.SIMULATOR, + true, + currentPanel, + ); + currentPanel.reveal(vscode.ViewColumn.Beside); + } else { + currentPanel = vscode.window.createWebviewPanel( + CONSTANTS.WEBVIEW_TYPE.SIMULATOR, + CONSTANTS.LABEL.WEBVIEW_PANEL, + { preserveFocus: true, viewColumn: vscode.ViewColumn.Beside }, + { + // Only allow the webview to access resources in our extension's media directory + localResourceRoots: [ + vscode.Uri.file( + path.join( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + ), + ), + ], + enableScripts: true, + }, + ); + + currentPanel.webview.html = webviewService.getWebviewContent( + WEBVIEW_TYPES.SIMULATOR, + true, + currentPanel, + ); + messagingService.setWebview(currentPanel.webview); + + if (messageListener !== undefined) { + messageListener.dispose(); + const index = context.subscriptions.indexOf(messageListener); + if (index > -1) { + context.subscriptions.splice(index, 1); + } + } + + if (activeEditorListener !== undefined) { + activeEditorListener.dispose(); + const index = + context.subscriptions.indexOf(activeEditorListener); + if (index > -1) { + context.subscriptions.splice(index, 1); + } + } + + if (currentPanel) { + // Handle messages from webview + messageListener = currentPanel.webview.onDidReceiveMessage( + (message) => { + const messageJson = JSON.stringify({ + active_device: + deviceSelectionService.getCurrentActiveDevice(), + state: message.text, + }); + switch (message.command) { + case WEBVIEW_MESSAGES.BUTTON_PRESS: + // Send input to the Python process + telemetryHandlerService.handleButtonPressTelemetry( + message.text, + ); + console.log(`About to write ${messageJson} \n`); + if ( + inDebugMode && + debuggerCommunicationService.getCurrentDebuggerServer() + ) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .emitInputChanged(messageJson); + } else if (childProcess) { + childProcess.stdin.write( + messageJson + "\n", + ); + } + break; + case WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP: + console.log(`Play button ${messageJson} \n`); + if (message.text.state as boolean) { + fileSelectionService.setPathAndSendMessage( + message.text.selected_file, + ); + fileSelectionService.findCurrentTextDocument(); + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_RUN_SIMULATOR_BUTTON, + ); + runSimulatorCommand(); + } else { + killProcessIfRunning(); + } + + if (childProcess) { + childProcess.stdin.write( + messageJson + "\n", + ); + } + + break; + case WEBVIEW_MESSAGES.GESTURE: + case WEBVIEW_MESSAGES.SENSOR_CHANGED: + telemetryHandlerService.handleGestureTelemetry( + message.text, + ); + console.log(`Sensor changed ${messageJson} \n`); + if ( + inDebugMode && + debuggerCommunicationService.getCurrentDebuggerServer() + ) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .emitInputChanged(messageJson); + } else if (childProcess) { + childProcess.stdin.write( + messageJson + "\n", + ); + } + break; + case WEBVIEW_MESSAGES.REFRESH_SIMULATOR: + console.log("Refresh button"); + runSimulatorCommand(); + break; + case WEBVIEW_MESSAGES.SLIDER_TELEMETRY: + telemetryHandlerService.handleSensorTelemetry( + message.text, + ); + break; + case WEBVIEW_MESSAGES.SWITCH_DEVICE: + deviceSelectionService.setCurrentActiveDevice( + message.text.active_device, + ); + killProcessIfRunning(); + break; + default: + vscode.window.showInformationMessage( + CONSTANTS.ERROR.UNEXPECTED_MESSAGE, + ); + break; + } + }, + undefined, + context.subscriptions, + ); + + activeEditorListener = utils.addVisibleTextEditorCallback( + currentPanel, + context, + ); + } + + currentPanel.onDidDispose( + () => { + currentPanel = undefined; + if ( + debuggerCommunicationService.getCurrentDebuggerServer() + ) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .setWebview(undefined); + } + killProcessIfRunning(); + if (firstTimeClosed) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.FIRST_TIME_WEBVIEW, + ); + firstTimeClosed = false; + } + }, + undefined, + context.subscriptions, + ); + } + sendCurrentDeviceMessage(currentPanel); + }; + + // Open Simulator on the webview + const openSimulator: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.openSimulator", + async () => { + const chosen_device = await vscode.window.showQuickPick( + Object.values(CONSTANTS.DEVICE_NAME_FORMAL), + ); + + if (!chosen_device) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_SIMULATE_TO, + true, + ); + return; + } + + const device = formalNameToNickNameMapping[chosen_device]; + deviceSelectionService.setCurrentActiveDevice(device); + const telemetryEvents = + telemetryHandlerService.getTelemetryEventsForOpenSimulator( + device, + ); + telemetryAI.trackFeatureUsage( + telemetryEvents.openSimulatorTelemetryEvent, + ); + telemetryAI.runWithLatencyMeasure( + openWebview, + telemetryEvents.openSimulatorPerformanceTelemetryEvent, + ); + }, + ); + + const gettingStartedOpen: vscode.Disposable = + vscode.commands.registerCommand( + "deviceSimulatorExpress.common.gettingStarted", + () => { + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_GETTING_STARTED, + ); + webviewService.openTutorialPanel(); + }, + ); + + const openTemplateFile = (template: string) => { + const fileName = template; + const filePath = + __dirname + path.sep + "templates" + path.sep + fileName; + const file = fs.readFileSync(filePath, "utf8"); + const showNewFilePopup: boolean = vscode.workspace + .getConfiguration() + .get(CONFIG.SHOW_NEW_FILE_POPUP); + + if (showNewFilePopup && template === CONSTANTS.TEMPLATE.CPX) { + vscode.window + .showInformationMessage( + CONSTANTS.INFO.NEW_FILE, + DialogResponses.DONT_SHOW, + DialogResponses.EXAMPLE_CODE, + DialogResponses.TUTORIALS, + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.DONT_SHOW) { + vscode.workspace + .getConfiguration() + .update(CONFIG.SHOW_NEW_FILE_POPUP, false); + telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_CLICK_DIALOG_DONT_SHOW, + ); + } else if (selection === DialogResponses.EXAMPLE_CODE) { + open(CONSTANTS.LINKS.EXAMPLE_CODE); + telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_CLICK_DIALOG_EXAMPLE_CODE, + ); + } else if (selection === DialogResponses.TUTORIALS) { + const okAction = () => { + open(CONSTANTS.LINKS.TUTORIALS); + telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_CLICK_DIALOG_TUTORIALS, + ); + }; + utils.showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT, + ); + } + }); + } + + // tslint:disable-next-line: ban-comma-operator + vscode.workspace + .openTextDocument({ + content: file, + language: LANGUAGE_VARS.PYTHON.ID, + }) + .then((template: vscode.TextDocument) => { + vscode.window.showTextDocument(template, 1, false).then(() => { + openWebview(); + }); + }), + // tslint:disable-next-line: no-unused-expression + (error: any) => { + telemetryHandlerService.handleNewFileErrorTelemetry(); + console.error(`Failed to open a new text document: ${error}`); + }; + }; + + const newFile: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.newFile", + async () => { + const chosen_device = await vscode.window.showQuickPick( + Object.values(CONSTANTS.DEVICE_NAME_FORMAL), + ); + + if (!chosen_device) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.NO_DEVICE_CHOSEN_FOR_NEW_FILE, + true, + ); + return; + } + + const device = formalNameToNickNameMapping[chosen_device]; + deviceSelectionService.setCurrentActiveDevice(device); + + const deviceToTemplateMapping = { + [CONSTANTS.DEVICE_NAME.CPX]: CONSTANTS.TEMPLATE.CPX, + [CONSTANTS.DEVICE_NAME.MICROBIT]: CONSTANTS.TEMPLATE.MICROBIT, + [CONSTANTS.DEVICE_NAME.CLUE]: CONSTANTS.TEMPLATE.CLUE, + }; + const templateFile = deviceToTemplateMapping[device]; + + const telemetryEvents = + telemetryHandlerService.getTelemetryEventsForNewFile(device); + + telemetryAI.trackFeatureUsage( + telemetryEvents.newFileTelemetryEvent, + ); + telemetryAI.runWithLatencyMeasure( + () => openTemplateFile(templateFile), + telemetryEvents.newFilePerformanceTelemetryEvent, + ); + }, + ); + + const installDependencies: vscode.Disposable = + vscode.commands.registerCommand( + "deviceSimulatorExpress.common.installDependencies", + async () => { + pythonExecutablePath = await setupService.setupEnv( + context, + true, + ); + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_INSTALL_EXTENSION_DEPENDENCIES, + ); + }, + ); + + const killProcessIfRunning = () => { + if (childProcess !== undefined) { + if (currentPanel) { + currentPanel.webview.postMessage({ + command: "reset-state", + active_device: + deviceSelectionService.getCurrentActiveDevice(), + }); + } + // TODO: We need to check the process was correctly killed + childProcess.kill(); + childProcess = undefined; + } + }; + + const runSimulatorCommand = async () => { + pythonProcessDataBuffer = []; + // Prevent running new code if a debug session is active + if (inDebugMode) { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.DEBUGGING_SESSION_IN_PROGESS, + ); + return; + } + if (shouldShowRunCodePopup) { + const shouldExitCommand = await vscode.window + .showWarningMessage( + CONSTANTS.WARNING.ACCEPT_AND_RUN, + DialogResponses.ACCEPT_AND_RUN, + DialogResponses.CANCEL, + ) + .then((selection: vscode.MessageItem | undefined) => { + let hasAccepted = true; + if (selection === DialogResponses.ACCEPT_AND_RUN) { + shouldShowRunCodePopup = false; + hasAccepted = false; + } + return hasAccepted; + }); + // Don't run users code if they don't accept + if (shouldExitCommand) { + return; + } + } + + openWebview(); + + if (!currentPanel) { + return; + } + + console.info(CONSTANTS.INFO.RUNNING_CODE); + + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.DEPLOY_SIMULATOR, + true, + ); + + killProcessIfRunning(); + + await fileSelectionService.updateCurrentFileFromEditor( + vscode.window.activeTextEditor, + ); + + if (fileSelectionService.getCurrentFileAbsPath() === "") { + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.NO_FILE_TO_RUN, + true, + ); + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FILE_TO_RUN, + DialogResponses.MESSAGE_UNDERSTOOD, + ); + } else { + // Save on run + await fileSelectionService.getCurrentTextDocument().save(); + + if ( + !fileSelectionService + .getCurrentTextDocument() + .fileName.endsWith(LANGUAGE_VARS.PYTHON.FILE_ENDS) + ) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.NO_FILE_TO_RUN, + true, + ); + return; + } + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.FILE_SELECTED( + fileSelectionService.getCurrentFileAbsPath(), + ), + ); + + // Activate the run webview button + currentPanel.webview.postMessage({ + command: "activate-play", + active_device: deviceSelectionService.getCurrentActiveDevice(), + }); + const args = [ + utils.getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.PROCESS_USER_CODE_PY, + ), + fileSelectionService.getCurrentFileAbsPath(), + JSON.stringify({ enable_telemetry: utils.getTelemetryState() }), + ]; + childProcess = cp.spawn(pythonExecutablePath, args); + + let dataFromTheProcess = ""; + let oldMessage = ""; + + // Data received from Python process + childProcess.stdout.on("data", (data) => { + dataFromTheProcess = data.toString(); + if (currentPanel) { + // NOTE: parts of the flow regarding pythonProcessDataBuffer + // are needed for the CLUE simulator to properly receive + // base_64 strings on UNIX systems. + + // added any incomplete data to beginning + const processedData = pythonProcessDataBuffer + .join("") + .concat(dataFromTheProcess); + pythonProcessDataBuffer = []; + + // Process the data from the process and send one state at a time + processedData.split("\0").forEach((message) => { + if ( + currentPanel && + message.length > 0 && + message !== oldMessage + ) { + oldMessage = message; + let messageToWebview; + // Check the message is a JSON + try { + messageToWebview = JSON.parse(message); + // Check the JSON is a state + switch (messageToWebview.type) { + case "state": + const messageData = JSON.parse( + messageToWebview.data, + ); + if ( + messageData.device_name === + deviceSelectionService.getCurrentActiveDevice() + ) { + messagingService.sendMessageToWebview( + VSCODE_MESSAGES_TO_WEBVIEW.SET_STATE, + messageData, + ); + } + break; + + case "print": + console.log( + `Process print statement output = ${messageToWebview.data}`, + ); + utils.logToOutputChannel( + outChannel, + `[PRINT] ${messageToWebview.data}`, + ); + break; + + default: + console.log( + `Non-state JSON output from the process : ${messageToWebview}`, + ); + break; + } + } catch (err) { + if (err instanceof SyntaxError) { + // if not a JSON string, it is incomplete + // add to beginning of next strings + pythonProcessDataBuffer.push(message); + } else { + console.log( + `Errored output: ${messageToWebview}`, + ); + } + } + } + }); + } + }); + + // Std error output + childProcess.stderr.on("data", (data) => { + console.error( + `Error from the Python process through stderr: ${data}`, + ); + telemetryAI.trackFeatureUsage( + TelemetryEventName.ERROR_PYTHON_PROCESS, + ); + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.STDERR(data), + true, + ); + if (currentPanel) { + currentPanel.webview.postMessage({ + active_device: + deviceSelectionService.getCurrentActiveDevice(), + command: "reset-state", + }); + } + }); + + // When the process is done + childProcess.on("end", (code: number) => { + console.info(`Command execution exited with code: ${code}`); + }); + } + }; + + // Send message to the webview + const runSimulator: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.runSimulator", + () => { + telemetryAI.trackFeatureUsage( + TelemetryEventName.COMMAND_RUN_PALETTE, + ); + runSimulatorCommand(); + }, + ); + + const deployCode = async (device: string) => { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.DEPLOY_DEVICE, + true, + ); + + await fileSelectionService.updateCurrentFileFromEditor( + vscode.window.activeTextEditor, + ); + + if (fileSelectionService.getCurrentFileAbsPath() === "") { + utils.logToOutputChannel( + outChannel, + CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, + true, + ); + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, + DialogResponses.MESSAGE_UNDERSTOOD, + ); + } else { + await fileSelectionService.getCurrentTextDocument().save(); + + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.FILE_SELECTED( + fileSelectionService.getCurrentFileAbsPath(), + ), + ); + + const deviceProcess = cp.spawn(pythonExecutablePath, [ + utils.getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.DEVICE_PY, + ), + device, + fileSelectionService.getCurrentFileAbsPath(), + ]); + + let dataFromTheProcess = ""; + + // Data received from Python process + deviceProcess.stdout.on("data", (data) => { + dataFromTheProcess = data.toString(); + + let messageToWebview; + try { + messageToWebview = JSON.parse(dataFromTheProcess); + if (messageToWebview.type === "complete") { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.DEPLOY_SUCCESS, + true, + ); + } + telemetryHandlerService.handleDeployToDeviceFinishedTelemetry( + messageToWebview, + device, + ); + } catch (err) { + console.log( + `Non-JSON output from the process : ${dataFromTheProcess}`, + ); + } + }); + + // Std error output + deviceProcess.stderr.on("data", (data) => { + telemetryHandlerService.handleDeployToDeviceErrorTelemetry( + data, + device, + ); + console.error( + `Error from the Python device process through stderr: ${data}`, + ); + utils.logToOutputChannel( + outChannel, + `[ERROR] ${data} \n`, + true, + ); + }); + + // When the process is done + deviceProcess.on("end", (code: number) => { + console.info(`Command execution exited with code: ${code}`); + }); + } + }; + + const deployToDevice: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.deployToDevice", + async () => { + const chosen_device = await vscode.window.showQuickPick( + Object.values(CONSTANTS.DEVICE_NAME_FORMAL), + ); + + if (!chosen_device) { + utils.logToOutputChannel( + outChannel, + CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_DEPLOY_TO, + true, + ); + return; + } + + const device = formalNameToNickNameMapping[chosen_device]; + + const telemetryEvents = + telemetryHandlerService.getTelemetryEventsForStartingDeployToDevice( + device, + ); + + telemetryAI.trackFeatureUsage(telemetryEvents.deployTelemetryEvent); + telemetryAI.runWithLatencyMeasure(() => { + deployCode(device); + }, telemetryEvents.deployPerformanceTelemetryEvent); + }, + ); + + let serialMonitor: SerialMonitor | undefined; + if (configFileCreated) { + serialMonitor = SerialMonitor.getInstance(); + context.subscriptions.push(serialMonitor); + } + + const selectSerialPort: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.selectSerialPort", + () => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure(() => { + serialMonitor.selectSerialPort(null, null); + }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CHOOSE_PORT); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED, + ); + console.info("Serial monitor is not defined."); + } + }, + ); + + const openSerialMonitor: vscode.Disposable = + vscode.commands.registerCommand( + "deviceSimulatorExpress.common.openSerialMonitor", + () => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure( + serialMonitor.openSerialMonitor.bind(serialMonitor), + TelemetryEventName.COMMAND_SERIAL_MONITOR_OPEN, + ); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED, + ); + console.info("Serial monitor is not defined."); + } + }, + ); + + const changeBaudRate: vscode.Disposable = vscode.commands.registerCommand( + "deviceSimulatorExpress.common.changeBaudRate", + () => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure( + serialMonitor.changeBaudRate.bind(serialMonitor), + TelemetryEventName.COMMAND_SERIAL_MONITOR_BAUD_RATE, + ); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED, + ); + console.info("Serial monitor is not defined."); + } + }, + ); + + const closeSerialMonitor: vscode.Disposable = + vscode.commands.registerCommand( + "deviceSimulatorExpress.common.closeSerialMonitor", + (port, showWarning = true) => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure(() => { + serialMonitor.closeSerialMonitor(port, showWarning); + }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED, + ); + console.info("Serial monitor is not defined."); + } + }, + ); + + const showReleaseNote = vscode.commands.registerCommand( + "deviceSimulatorExpress.", + (port, showWarning = true) => { + if (serialMonitor) { + telemetryAI.runWithLatencyMeasure(() => { + serialMonitor.closeSerialMonitor(port, showWarning); + }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); + } else { + vscode.window.showErrorMessage( + CONSTANTS.ERROR.NO_FOLDER_OPENED, + ); + console.info("Serial monitor is not defined."); + } + }, + ); + + UsbDetector.getInstance().initialize(context.extensionPath); + UsbDetector.getInstance().startListening(); + + if ( + CPXWorkspace.rootPath && + (utils.fileExistsSync( + path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE), + ) || + vscode.window.activeTextEditor) + ) { + (() => { + if (!SerialMonitor.getInstance().initialized) { + SerialMonitor.getInstance().initialize(); + } + })(); + } + + // Debugger configuration + const simulatorDebugConfiguration = new SimulatorDebugConfigurationProvider( + utils.getPathToScript(context, "out/", "debug_user_code.py"), + ); + + const debugAdapterFactory = new DebugAdapterFactory( + vscode.debug.activeDebugSession, + messagingService, + debuggerCommunicationService, + ); + vscode.debug.registerDebugAdapterTrackerFactory( + LANGUAGE_VARS.PYTHON.ID, + debugAdapterFactory, + ); + // On Debug Session Start: Init comunication + const debugSessionsStarted = vscode.debug.onDidStartDebugSession(() => { + if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { + // Reinitialize process + killProcessIfRunning(); + inDebugMode = true; + + try { + // Shut down existing server on debug restart + if (debuggerCommunicationService.getCurrentDebuggerServer()) { + debuggerCommunicationService.resetCurrentDebuggerServer(); + } + + debuggerCommunicationService.setCurrentDebuggerServer( + new DebuggerCommunicationServer( + currentPanel, + utils.getServerPortConfig(), + deviceSelectionService, + ), + ); + + telemetryHandlerService.handleDebuggerTelemetry(); + + openWebview(); + if (currentPanel) { + debuggerCommunicationService + .getCurrentDebuggerServer() + .setWebview(currentPanel); + currentPanel.webview.postMessage({ + active_device: + deviceSelectionService.getCurrentActiveDevice(), + command: "activate-play", + }); + } + } catch (err) { + if (err.message === SERVER_INFO.ERROR_CODE_INIT_SERVER) { + console.error( + `Error trying to init the server on port ${utils.getServerPortConfig()}`, + ); + + telemetryHandlerService.handleDebuggerFailTelemetry(); + + vscode.window.showErrorMessage( + CONSTANTS.ERROR.DEBUGGER_SERVER_INIT_FAILED( + utils.getServerPortConfig(), + ), + ); + } + } + } + }); + + // On Debug Session Stop: Stop communiation + const debugSessionStopped = vscode.debug.onDidTerminateDebugSession(() => { + if (simulatorDebugConfiguration.deviceSimulatorExpressDebug) { + inDebugMode = false; + simulatorDebugConfiguration.deviceSimulatorExpressDebug = false; + if (debuggerCommunicationService.getCurrentDebuggerServer()) { + debuggerCommunicationService.resetCurrentDebuggerServer(); + } + if (currentPanel) { + currentPanel.webview.postMessage({ + command: "reset-state", + active_device: + deviceSelectionService.getCurrentActiveDevice(), + }); + } + } + }); + + const configsChanged = vscode.workspace.onDidChangeConfiguration( + async () => { + if (utils.checkConfig(CONFIG.CONFIG_ENV_ON_SWITCH)) { + pythonExecutablePath = await setupService.setupEnv(context); + } + }, + ); + + context.subscriptions.push( + installDependencies, + runSimulator, + changeBaudRate, + closeSerialMonitor, + deployToDevice, + newFile, + openSimulator, + openSerialMonitor, + selectSerialPort, + gettingStartedOpen, + vscode.debug.registerDebugConfigurationProvider( + CONSTANTS.DEBUG_CONFIGURATION_TYPE, + simulatorDebugConfiguration, + ), + debugSessionsStarted, + debugSessionStopped, + configsChanged, + ); } const updatePythonExtraPaths = () => { - updateConfigLists( - "python.autoComplete.extraPaths", - [ - __dirname, - path.join(__dirname, CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY), - path.join(__dirname, CONSTANTS.FILESYSTEM.CLUE), - path.join(__dirname, CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON), - ], - vscode.ConfigurationTarget.Global - ); + updateConfigLists( + "python.autoComplete.extraPaths", + [ + __dirname, + path.join(__dirname, CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY), + path.join(__dirname, CONSTANTS.FILESYSTEM.CLUE), + path.join(__dirname, CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON), + ], + vscode.ConfigurationTarget.Global, + ); }; const updatePylintArgs = (context: vscode.ExtensionContext) => { - const outPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY - ); - const micropythonPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY - ); - - const cluePath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.CLUE - ); - - const baseCircuitPythonPath: string = utils.createEscapedPath( - context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON - ); - // update pylint args to extend system path - // to include python libs local to extention - updateConfigLists( - "python.linting.pylintArgs", - [ - "--init-hook", - `import sys; sys.path.extend([\"${outPath}\",\"${micropythonPath}\",\"${cluePath}\",\"${baseCircuitPythonPath}\"])`, - ], - vscode.ConfigurationTarget.Workspace - ); + const outPath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + ); + const micropythonPath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY, + ); + + const cluePath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + CONSTANTS.FILESYSTEM.CLUE, + ); + + const baseCircuitPythonPath: string = utils.createEscapedPath( + context.extensionPath, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON, + ); + // update pylint args to extend system path + // to include python libs local to extention + updateConfigLists( + "python.linting.pylintArgs", + [ + "--init-hook", + `import sys; sys.path.extend([\"${outPath}\",\"${micropythonPath}\",\"${cluePath}\",\"${baseCircuitPythonPath}\"])`, + ], + vscode.ConfigurationTarget.Workspace, + ); }; const updateConfigLists = ( - section: string, - newItems: string[], - scope: vscode.ConfigurationTarget + section: string, + newItems: string[], + scope: vscode.ConfigurationTarget, ) => { - // function for adding elements to configuration arrays - const currentExtraItems: string[] = - vscode.workspace.getConfiguration().get(section) || []; - const extraItemsSet: Set = new Set( - currentExtraItems.concat(newItems) - ); - - vscode.workspace - .getConfiguration() - .update(section, Array.from(extraItemsSet), scope); + // function for adding elements to configuration arrays + const currentExtraItems: string[] = + vscode.workspace.getConfiguration().get(section) || []; + const extraItemsSet: Set = new Set( + currentExtraItems.concat(newItems), + ); + + vscode.workspace + .getConfiguration() + .update(section, Array.from(extraItemsSet), scope); }; // this method is called when your extension is deactivated export async function deactivate() { - const monitor: SerialMonitor = SerialMonitor.getInstance(); - await monitor.closeSerialMonitor(null, false); - UsbDetector.getInstance().stopListening(); + const monitor: SerialMonitor = SerialMonitor.getInstance(); + await monitor.closeSerialMonitor(null, false); + UsbDetector.getInstance().stopListening(); } diff --git a/Source/extension_utils/utils.ts b/Source/extension_utils/utils.ts index b7be3b71c..922414b0c 100644 --- a/Source/extension_utils/utils.ts +++ b/Source/extension_utils/utils.ts @@ -7,11 +7,11 @@ import * as path from "path"; import * as util from "util"; import * as vscode from "vscode"; import { - CONSTANTS, - CPX_CONFIG_FILE, - DialogResponses, - GLOBAL_ENV_VARS, - SERVER_INFO, + CONSTANTS, + CPX_CONFIG_FILE, + DialogResponses, + GLOBAL_ENV_VARS, + SERVER_INFO, } from "../constants"; import { CPXWorkspace } from "../cpxWorkspace"; import { DeviceContext } from "../deviceContext"; @@ -19,94 +19,94 @@ import { DeviceContext } from "../deviceContext"; export const exec = util.promisify(cp.exec); const errorChannel = vscode.window.createOutputChannel( - CONSTANTS.ERROR.INSTALLATION_ERROR + CONSTANTS.ERROR.INSTALLATION_ERROR, ); // tslint:disable-next-line: export-name export const getPathToScript = ( - context: vscode.ExtensionContext, - folderName: string, - fileName: string = "" + context: vscode.ExtensionContext, + folderName: string, + fileName: string = "", ) => { - const onDiskPath = vscode.Uri.file( - path.join(context.extensionPath, folderName, fileName) - ); - const scriptPath = onDiskPath.with({ scheme: "vscode-resource" }); - return scriptPath.fsPath; + const onDiskPath = vscode.Uri.file( + path.join(context.extensionPath, folderName, fileName), + ); + const scriptPath = onDiskPath.with({ scheme: "vscode-resource" }); + return scriptPath.fsPath; }; export const showPrivacyModal = ( - okAction: () => void, - thirdPartyDisclaimer: string + okAction: () => void, + thirdPartyDisclaimer: string, ) => { - vscode.window - .showInformationMessage( - `${thirdPartyDisclaimer}: ${CONSTANTS.LINKS.PRIVACY}`, - DialogResponses.AGREE_AND_PROCEED, - DialogResponses.CANCEL - ) - .then((privacySelection: vscode.MessageItem | undefined) => { - if (privacySelection === DialogResponses.AGREE_AND_PROCEED) { - okAction(); - } else if (privacySelection === DialogResponses.CANCEL) { - // do nothing - } - }); + vscode.window + .showInformationMessage( + `${thirdPartyDisclaimer}: ${CONSTANTS.LINKS.PRIVACY}`, + DialogResponses.AGREE_AND_PROCEED, + DialogResponses.CANCEL, + ) + .then((privacySelection: vscode.MessageItem | undefined) => { + if (privacySelection === DialogResponses.AGREE_AND_PROCEED) { + okAction(); + } else if (privacySelection === DialogResponses.CANCEL) { + // do nothing + } + }); }; export const logToOutputChannel = ( - outChannel: vscode.OutputChannel | undefined, - message: string, - show: boolean = false + outChannel: vscode.OutputChannel | undefined, + message: string, + show: boolean = false, ): void => { - if (outChannel) { - if (show) { - outChannel.show(true); - } - outChannel.append(message); - } + if (outChannel) { + if (show) { + outChannel.show(true); + } + outChannel.append(message); + } }; export function tryParseJSON(jsonString: string): any | boolean { - try { - const jsonObj = JSON.parse(jsonString); - if (jsonObj && typeof jsonObj === "object") { - return jsonObj; - } - } catch (exception) {} - - return false; + try { + const jsonObj = JSON.parse(jsonString); + if (jsonObj && typeof jsonObj === "object") { + return jsonObj; + } + } catch (exception) {} + + return false; } export function fileExistsSync(filePath: string): boolean { - try { - return fs.statSync(filePath).isFile(); - } catch (error) { - return false; - } + try { + return fs.statSync(filePath).isFile(); + } catch (error) { + return false; + } } export function mkdirRecursivelySync(dirPath: string): void { - if (directoryExistsSync(dirPath)) { - return; - } - const dirname = path.dirname(dirPath); - if (path.normalize(dirname) === path.normalize(dirPath)) { - fs.mkdirSync(dirPath); - } else if (directoryExistsSync(dirname)) { - fs.mkdirSync(dirPath); - } else { - mkdirRecursivelySync(dirname); - fs.mkdirSync(dirPath); - } + if (directoryExistsSync(dirPath)) { + return; + } + const dirname = path.dirname(dirPath); + if (path.normalize(dirname) === path.normalize(dirPath)) { + fs.mkdirSync(dirPath); + } else if (directoryExistsSync(dirname)) { + fs.mkdirSync(dirPath); + } else { + mkdirRecursivelySync(dirname); + fs.mkdirSync(dirPath); + } } export function directoryExistsSync(dirPath: string): boolean { - try { - return fs.statSync(dirPath).isDirectory(); - } catch (e) { - return false; - } + try { + return fs.statSync(dirPath).isDirectory(); + } catch (e) { + return false; + } } /** @@ -115,119 +115,121 @@ export function directoryExistsSync(dirPath: string): boolean { * The padding is applied from the start (left) of the current string. */ export function padStart( - sourceString: string, - targetLength: number, - padString?: string + sourceString: string, + targetLength: number, + padString?: string, ): string { - if (!sourceString) { - return sourceString; - } - - if (!(String.prototype as any).padStart) { - // https://github.com/uxitten/polyfill/blob/master/string.polyfill.js - padString = String(padString || " "); - if (sourceString.length > targetLength) { - return sourceString; - } else { - targetLength = targetLength - sourceString.length; - if (targetLength > padString.length) { - padString += padString.repeat(targetLength / padString.length); // append to original to ensure we are longer than needed - } - return padString.slice(0, targetLength) + sourceString; - } - } else { - return (sourceString as any).padStart(targetLength, padString); - } + if (!sourceString) { + return sourceString; + } + + if (!(String.prototype as any).padStart) { + // https://github.com/uxitten/polyfill/blob/master/string.polyfill.js + padString = String(padString || " "); + if (sourceString.length > targetLength) { + return sourceString; + } else { + targetLength = targetLength - sourceString.length; + if (targetLength > padString.length) { + padString += padString.repeat(targetLength / padString.length); // append to original to ensure we are longer than needed + } + return padString.slice(0, targetLength) + sourceString; + } + } else { + return (sourceString as any).padStart(targetLength, padString); + } } export function convertToHex(num: number, width = 0): string { - return padStart(num.toString(16), width, "0"); + return padStart(num.toString(16), width, "0"); } export function generateCPXConfig(): void { - const deviceContext: DeviceContext = DeviceContext.getInstance(); - const cpxJson = { - port: deviceContext.port, - }; - const cpxConfigFilePath: string = path.join( - CPXWorkspace.rootPath, - CPX_CONFIG_FILE - ); - mkdirRecursivelySync(path.dirname(cpxConfigFilePath)); - fs.writeFileSync(cpxConfigFilePath, JSON.stringify(cpxJson, null, 4)); + const deviceContext: DeviceContext = DeviceContext.getInstance(); + const cpxJson = { + port: deviceContext.port, + }; + const cpxConfigFilePath: string = path.join( + CPXWorkspace.rootPath, + CPX_CONFIG_FILE, + ); + mkdirRecursivelySync(path.dirname(cpxConfigFilePath)); + fs.writeFileSync(cpxConfigFilePath, JSON.stringify(cpxJson, null, 4)); } export const addVisibleTextEditorCallback = ( - currentPanel: vscode.WebviewPanel, - context: vscode.ExtensionContext + currentPanel: vscode.WebviewPanel, + context: vscode.ExtensionContext, ): vscode.Disposable => { - const initialPythonEditors = filterForPythonFiles( - vscode.window.visibleTextEditors - ); - currentPanel.webview.postMessage({ - command: "visible-editors", - state: { activePythonEditors: initialPythonEditors }, - }); - return vscode.window.onDidChangeVisibleTextEditors( - (textEditors: vscode.TextEditor[]) => { - const activePythonEditors = filterForPythonFiles(textEditors); - currentPanel.webview.postMessage({ - command: "visible-editors", - state: { activePythonEditors }, - }); - }, - {}, - context.subscriptions - ); + const initialPythonEditors = filterForPythonFiles( + vscode.window.visibleTextEditors, + ); + currentPanel.webview.postMessage({ + command: "visible-editors", + state: { activePythonEditors: initialPythonEditors }, + }); + return vscode.window.onDidChangeVisibleTextEditors( + (textEditors: vscode.TextEditor[]) => { + const activePythonEditors = filterForPythonFiles(textEditors); + currentPanel.webview.postMessage({ + command: "visible-editors", + state: { activePythonEditors }, + }); + }, + {}, + context.subscriptions, + ); }; export const filterForPythonFiles = (textEditors: vscode.TextEditor[]) => { - return textEditors - .filter(editor => editor.document.languageId === GLOBAL_ENV_VARS.PYTHON) - .map(editor => editor.document.fileName); + return textEditors + .filter( + (editor) => editor.document.languageId === GLOBAL_ENV_VARS.PYTHON, + ) + .map((editor) => editor.document.fileName); }; export const getActiveEditorFromPath = ( - filePath: string + filePath: string, ): vscode.TextDocument => { - const activeEditor = vscode.window.visibleTextEditors.find( - (editor: vscode.TextEditor) => editor.document.fileName === filePath - ); - return activeEditor ? activeEditor.document : undefined; + const activeEditor = vscode.window.visibleTextEditors.find( + (editor: vscode.TextEditor) => editor.document.fileName === filePath, + ); + return activeEditor ? activeEditor.document : undefined; }; export const getServerPortConfig = (): number => { - // tslint:disable: no-backbone-get-set-outside-model prefer-type-cast - if ( - vscode.workspace - .getConfiguration() - .has(SERVER_INFO.SERVER_PORT_CONFIGURATION) - ) { - return vscode.workspace - .getConfiguration() - .get(SERVER_INFO.SERVER_PORT_CONFIGURATION) as number; - } - return SERVER_INFO.DEFAULT_SERVER_PORT; + // tslint:disable: no-backbone-get-set-outside-model prefer-type-cast + if ( + vscode.workspace + .getConfiguration() + .has(SERVER_INFO.SERVER_PORT_CONFIGURATION) + ) { + return vscode.workspace + .getConfiguration() + .get(SERVER_INFO.SERVER_PORT_CONFIGURATION) as number; + } + return SERVER_INFO.DEFAULT_SERVER_PORT; }; export const checkConfig = (configName: string): boolean => { - return vscode.workspace.getConfiguration().get(configName) === true; + return vscode.workspace.getConfiguration().get(configName) === true; }; export const getConfig = (configName: string): string => { - return vscode.workspace.getConfiguration().get(configName); + return vscode.workspace.getConfiguration().get(configName); }; export const createEscapedPath = (...pieces: string[]) => { - const initialPath: string = path.join(...pieces); + const initialPath: string = path.join(...pieces); - // escape all special characters - // https://stackoverflow.com/questions/1779858/how-do-i-escape-a-string-for-a-shell-command-in-node - return `"` + initialPath.replace(/(["'$`\\])/g, "\\$1") + `"`; + // escape all special characters + // https://stackoverflow.com/questions/1779858/how-do-i-escape-a-string-for-a-shell-command-in-node + return `"` + initialPath.replace(/(["'$`\\])/g, "\\$1") + `"`; }; export const getTelemetryState = () => { - return vscode.workspace - .getConfiguration() - .get("telemetry.enableTelemetry", true); + return vscode.workspace + .getConfiguration() + .get("telemetry.enableTelemetry", true); }; diff --git a/Source/serialMonitor.ts b/Source/serialMonitor.ts index f3685cd58..a6829f313 100644 --- a/Source/serialMonitor.ts +++ b/Source/serialMonitor.ts @@ -11,300 +11,288 @@ import { logToOutputChannel } from "./extension_utils/utils"; import { SerialPortControl } from "./serialPortControl"; export interface ISerialPortDetail { - path: string; - manufacturer: string; - vendorId: string; - productId: string; + path: string; + manufacturer: string; + vendorId: string; + productId: string; } export class SerialMonitor implements vscode.Disposable { - public static DEFAULT_BAUD_RATE: number = 115200; + public static DEFAULT_BAUD_RATE: number = 115200; - public static listBaudRates(): number[] { - return [ - 300, - 1200, - 2400, - 4800, - 9600, - 19200, - 38400, - 57600, - 74880, - 115200, - 230400, - 250000, - ]; - } + public static listBaudRates(): number[] { + return [ + 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 74880, 115200, + 230400, 250000, + ]; + } - public static getInstance(): SerialMonitor { - if (SerialMonitor._serialMonitor === null) { - SerialMonitor._serialMonitor = new SerialMonitor(); - } - return SerialMonitor._serialMonitor; - } + public static getInstance(): SerialMonitor { + if (SerialMonitor._serialMonitor === null) { + SerialMonitor._serialMonitor = new SerialMonitor(); + } + return SerialMonitor._serialMonitor; + } - private static _serialMonitor: SerialMonitor | null = null; + private static _serialMonitor: SerialMonitor | null = null; - private _currentPort!: string; - private _currentBaudRate!: number; - private _outputChannel!: vscode.OutputChannel; - private _serialPortControl: SerialPortControl | null = null; - private _baudRateStatusBar!: vscode.StatusBarItem; - private _openPortStatusBar!: vscode.StatusBarItem; - private _portsStatusBar!: vscode.StatusBarItem; + private _currentPort!: string; + private _currentBaudRate!: number; + private _outputChannel!: vscode.OutputChannel; + private _serialPortControl: SerialPortControl | null = null; + private _baudRateStatusBar!: vscode.StatusBarItem; + private _openPortStatusBar!: vscode.StatusBarItem; + private _portsStatusBar!: vscode.StatusBarItem; - private constructor() { - const deviceContext = DeviceContext.getInstance(); - deviceContext.onDidChange(() => { - if (deviceContext.port) { - if (!this.initialized) { - this.initialize(); - } - this.updatePortListStatus(null); - } - }); - } + private constructor() { + const deviceContext = DeviceContext.getInstance(); + deviceContext.onDidChange(() => { + if (deviceContext.port) { + if (!this.initialized) { + this.initialize(); + } + this.updatePortListStatus(null); + } + }); + } - public initialize() { - const defaultBaudRate: number = SerialMonitor.DEFAULT_BAUD_RATE; - this._outputChannel = vscode.window.createOutputChannel( - CONSTANTS.MISC.SERIAL_MONITOR_NAME - ); - this._currentBaudRate = defaultBaudRate; - this._portsStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.PORT - ); - this._portsStatusBar.command = - "deviceSimulatorExpress.common.selectSerialPort"; - this._portsStatusBar.tooltip = "Select Serial Port"; - this._portsStatusBar.show(); + public initialize() { + const defaultBaudRate: number = SerialMonitor.DEFAULT_BAUD_RATE; + this._outputChannel = vscode.window.createOutputChannel( + CONSTANTS.MISC.SERIAL_MONITOR_NAME, + ); + this._currentBaudRate = defaultBaudRate; + this._portsStatusBar = vscode.window.createStatusBarItem( + vscode.StatusBarAlignment.Right, + STATUS_BAR_PRIORITY.PORT, + ); + this._portsStatusBar.command = + "deviceSimulatorExpress.common.selectSerialPort"; + this._portsStatusBar.tooltip = "Select Serial Port"; + this._portsStatusBar.show(); - this._openPortStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.OPEN_PORT - ); - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.openSerialMonitor"; - this._openPortStatusBar.text = `$(plug)`; - this._openPortStatusBar.tooltip = "Open Serial Monitor"; - this._openPortStatusBar.show(); + this._openPortStatusBar = vscode.window.createStatusBarItem( + vscode.StatusBarAlignment.Right, + STATUS_BAR_PRIORITY.OPEN_PORT, + ); + this._openPortStatusBar.command = + "deviceSimulatorExpress.common.openSerialMonitor"; + this._openPortStatusBar.text = `$(plug)`; + this._openPortStatusBar.tooltip = "Open Serial Monitor"; + this._openPortStatusBar.show(); - this._baudRateStatusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.BAUD_RATE - ); - this._baudRateStatusBar.command = - "deviceSimulatorExpress.common.changeBaudRate"; - this._baudRateStatusBar.tooltip = "Baud Rate"; - this._baudRateStatusBar.text = defaultBaudRate.toString(); - this.updatePortListStatus(null); - } + this._baudRateStatusBar = vscode.window.createStatusBarItem( + vscode.StatusBarAlignment.Right, + STATUS_BAR_PRIORITY.BAUD_RATE, + ); + this._baudRateStatusBar.command = + "deviceSimulatorExpress.common.changeBaudRate"; + this._baudRateStatusBar.tooltip = "Baud Rate"; + this._baudRateStatusBar.text = defaultBaudRate.toString(); + this.updatePortListStatus(null); + } - public async selectSerialPort(vid: string | null, pid: string | null) { - const lists = await SerialPortControl.list(); - if (!lists.length) { - vscode.window.showInformationMessage( - "No serial message is available." - ); - return; - } + public async selectSerialPort(vid: string | null, pid: string | null) { + const lists = await SerialPortControl.list(); + if (!lists.length) { + vscode.window.showInformationMessage( + "No serial message is available.", + ); + return; + } - if (vid && pid) { - const valueOfVid = parseInt(vid, 16); - const valueOfPid = parseInt(pid, 16); - const foundPort = lists.find(port => { - if (port.productId && port.vendorId) { - return ( - parseInt(port.productId, 16) === valueOfPid && - parseInt(port.vendorId, 16) === valueOfVid - ); - } - return false; - }); - if ( - foundPort && - !(this._serialPortControl && this._serialPortControl.isActive) - ) { - this.updatePortListStatus(foundPort.path); - } - } else { - const chosen = await vscode.window.showQuickPick( - lists - .map( - (port: ISerialPortDetail): vscode.QuickPickItem => { - return { - description: port.manufacturer, - label: port.path, - }; - } - ) - .sort((a, b): number => { - return a.label === b.label - ? 0 - : a.label > b.label - ? 1 - : -1; - }) as vscode.QuickPickItem[], - { placeHolder: CONSTANTS.MISC.SELECT_PORT_PLACEHOLDER } - ); + if (vid && pid) { + const valueOfVid = parseInt(vid, 16); + const valueOfPid = parseInt(pid, 16); + const foundPort = lists.find((port) => { + if (port.productId && port.vendorId) { + return ( + parseInt(port.productId, 16) === valueOfPid && + parseInt(port.vendorId, 16) === valueOfVid + ); + } + return false; + }); + if ( + foundPort && + !(this._serialPortControl && this._serialPortControl.isActive) + ) { + this.updatePortListStatus(foundPort.path); + } + } else { + const chosen = await vscode.window.showQuickPick( + lists + .map((port: ISerialPortDetail): vscode.QuickPickItem => { + return { + description: port.manufacturer, + label: port.path, + }; + }) + .sort((a, b): number => { + return a.label === b.label + ? 0 + : a.label > b.label + ? 1 + : -1; + }) as vscode.QuickPickItem[], + { placeHolder: CONSTANTS.MISC.SELECT_PORT_PLACEHOLDER }, + ); - if (chosen && chosen.label) { - this.updatePortListStatus(chosen.label); - } - } - } + if (chosen && chosen.label) { + this.updatePortListStatus(chosen.label); + } + } + } - public async openSerialMonitor() { - if (!this._currentPort) { - const ans = await vscode.window.showInformationMessage( - CONSTANTS.WARNING.NO_SERIAL_PORT_SELECTED, - DialogResponses.SELECT, - DialogResponses.CANCEL - ); - if (ans === DialogResponses.SELECT) { - await this.selectSerialPort(null, null); - } - if (!this._currentPort) { - return; - } - } + public async openSerialMonitor() { + if (!this._currentPort) { + const ans = await vscode.window.showInformationMessage( + CONSTANTS.WARNING.NO_SERIAL_PORT_SELECTED, + DialogResponses.SELECT, + DialogResponses.CANCEL, + ); + if (ans === DialogResponses.SELECT) { + await this.selectSerialPort(null, null); + } + if (!this._currentPort) { + return; + } + } - if (this._serialPortControl) { - if (this._currentPort !== this._serialPortControl.currentPort) { - await this._serialPortControl.changePort(this._currentPort); - } else if (this._serialPortControl.isActive) { - vscode.window.showWarningMessage( - `Serial Monitor is already opened for ${this._currentPort}` - ); - return; - } - } else { - this._serialPortControl = new SerialPortControl( - this._currentPort, - this._currentBaudRate, - this._outputChannel - ); - } + if (this._serialPortControl) { + if (this._currentPort !== this._serialPortControl.currentPort) { + await this._serialPortControl.changePort(this._currentPort); + } else if (this._serialPortControl.isActive) { + vscode.window.showWarningMessage( + `Serial Monitor is already opened for ${this._currentPort}`, + ); + return; + } + } else { + this._serialPortControl = new SerialPortControl( + this._currentPort, + this._currentBaudRate, + this._outputChannel, + ); + } - if (!this._serialPortControl.currentPort) { - console.error( - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT(this._currentPort) - ); - return; - } + if (!this._serialPortControl.currentPort) { + console.error( + CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT(this._currentPort), + ); + return; + } - try { - await this._serialPortControl.open(); - this.updatePortStatus(true); - } catch (error) { - logToOutputChannel( - outChannel, - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT_DUE_TO( - this._currentPort, - error - ), - true - ); - } - } + try { + await this._serialPortControl.open(); + this.updatePortStatus(true); + } catch (error) { + logToOutputChannel( + outChannel, + CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT_DUE_TO( + this._currentPort, + error, + ), + true, + ); + } + } - public get initialized(): boolean { - return !!this._outputChannel; - } + public get initialized(): boolean { + return !!this._outputChannel; + } - public dispose() { - if (this._serialPortControl && this._serialPortControl.isActive) { - return this._serialPortControl.stop(); - } - } + public dispose() { + if (this._serialPortControl && this._serialPortControl.isActive) { + return this._serialPortControl.stop(); + } + } - public async changeBaudRate() { - const baudRates = SerialMonitor.listBaudRates(); - const chosen = await vscode.window.showQuickPick( - baudRates.map(baudRate => baudRate.toString()) - ); + public async changeBaudRate() { + const baudRates = SerialMonitor.listBaudRates(); + const chosen = await vscode.window.showQuickPick( + baudRates.map((baudRate) => baudRate.toString()), + ); - if (!chosen) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.NO_RATE_SELECTED, - true - ); - return; - } + if (!chosen) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.NO_RATE_SELECTED, + true, + ); + return; + } - if (!parseInt(chosen, 10)) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.INVALID_BAUD_RATE, - true - ); - return; - } + if (!parseInt(chosen, 10)) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.INVALID_BAUD_RATE, + true, + ); + return; + } - if (!this._serialPortControl) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.SERIAL_MONITOR_NOT_STARTED, - true - ); - return; - } + if (!this._serialPortControl) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.SERIAL_MONITOR_NOT_STARTED, + true, + ); + return; + } - const selectedRate: number = parseInt(chosen, 10); - await this._serialPortControl.changeBaudRate(selectedRate); - this._currentBaudRate = selectedRate; - this._baudRateStatusBar.text = chosen; - } + const selectedRate: number = parseInt(chosen, 10); + await this._serialPortControl.changeBaudRate(selectedRate); + this._currentBaudRate = selectedRate; + this._baudRateStatusBar.text = chosen; + } - public async closeSerialMonitor(port: string, showWarning: boolean = true) { - if (this._serialPortControl) { - if (port && port !== this._serialPortControl.currentPort) { - // Port is not opened - return false; - } - const result = await this._serialPortControl.stop(); - this.updatePortStatus(false); - return result; - } else if (!port && showWarning) { - logToOutputChannel( - outChannel, - CONSTANTS.WARNING.SERIAL_PORT_NOT_STARTED, - true - ); - return false; - } - } + public async closeSerialMonitor(port: string, showWarning: boolean = true) { + if (this._serialPortControl) { + if (port && port !== this._serialPortControl.currentPort) { + // Port is not opened + return false; + } + const result = await this._serialPortControl.stop(); + this.updatePortStatus(false); + return result; + } else if (!port && showWarning) { + logToOutputChannel( + outChannel, + CONSTANTS.WARNING.SERIAL_PORT_NOT_STARTED, + true, + ); + return false; + } + } - private updatePortStatus(isOpened: boolean) { - if (isOpened) { - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.closeSerialMonitor"; - this._openPortStatusBar.text = `$(x)`; - this._openPortStatusBar.tooltip = "Close Serial Monitor"; - this._baudRateStatusBar.show(); - } else { - this._openPortStatusBar.command = - "deviceSimulatorExpress.common.openSerialMonitor"; - this._openPortStatusBar.text = `$(plug)`; - this._openPortStatusBar.tooltip = "Open Serial Monitor"; - this._baudRateStatusBar.hide(); - } - } + private updatePortStatus(isOpened: boolean) { + if (isOpened) { + this._openPortStatusBar.command = + "deviceSimulatorExpress.common.closeSerialMonitor"; + this._openPortStatusBar.text = `$(x)`; + this._openPortStatusBar.tooltip = "Close Serial Monitor"; + this._baudRateStatusBar.show(); + } else { + this._openPortStatusBar.command = + "deviceSimulatorExpress.common.openSerialMonitor"; + this._openPortStatusBar.text = `$(plug)`; + this._openPortStatusBar.tooltip = "Open Serial Monitor"; + this._baudRateStatusBar.hide(); + } + } - private updatePortListStatus(port: string | null) { - const deviceContext = DeviceContext.getInstance(); - if (port) { - deviceContext.port = port; - } - this._currentPort = deviceContext.port; + private updatePortListStatus(port: string | null) { + const deviceContext = DeviceContext.getInstance(); + if (port) { + deviceContext.port = port; + } + this._currentPort = deviceContext.port; - if (deviceContext.port) { - this._portsStatusBar.text = deviceContext.port; - } else { - this._portsStatusBar.text = ""; + } + } } diff --git a/Source/serialPortControl.ts b/Source/serialPortControl.ts index 64d8d010a..8ffbc3e9a 100644 --- a/Source/serialPortControl.ts +++ b/Source/serialPortControl.ts @@ -9,188 +9,188 @@ import { CONSTANTS } from "./constants"; import { logToOutputChannel } from "./extension_utils/utils"; interface ISerialPortDetail { - path: string; - manufacturer: string; - vendorId: string; - productId: string; + path: string; + manufacturer: string; + vendorId: string; + productId: string; } export class SerialPortControl { - public static get serialport(): any { - if (!SerialPortControl._serialport) { - SerialPortControl._serialport = require("usb-native").SerialPort; - } - return SerialPortControl._serialport; - } - - public static list(): Promise { - return new Promise((resolve, reject) => { - SerialPortControl.serialport.list().then( - ports => resolve(ports), - err => reject(err) - ); - }); - } - - private static _serialport: any; - - private _currentPort: string; - private _currentBaudRate: number; - private _currentSerialPort: any; - - public constructor( - port: string, - baudRate: number, - private _outputChannel: OutputChannel - ) { - this._currentPort = port; - this._currentBaudRate = baudRate; - } - - public get isActive(): boolean { - return this._currentSerialPort && this._currentSerialPort.isOpen; - } - - public get currentPort(): string { - return this._currentPort; - } - - public open(): Promise { - logToOutputChannel( - this._outputChannel, - CONSTANTS.INFO.OPENING_SERIAL_PORT(this._currentPort) - ); - return new Promise((resolve, reject) => { - if (this._currentSerialPort && this._currentSerialPort.isOpen) { - this._currentSerialPort.close((err: any) => { - if (err) { - return reject(err); - } - this._currentSerialPort = null; - return this.open().then( - () => { - resolve(); - }, - error => { - reject(error); - } - ); - }); - } else { - this._currentSerialPort = new SerialPortControl.serialport( - this._currentPort, - { baudRate: this._currentBaudRate } - ); - this._outputChannel.show(); - this._currentSerialPort.on("open", () => { - this._currentSerialPort.write( - CONSTANTS.MISC.SERIAL_MONITOR_TEST_IF_OPEN + os.EOL, - (err: any) => { - if ( - err && - !( - err.message.indexOf( - CONSTANTS.ERROR.COMPORT_UNKNOWN_ERROR - ) >= 0 - ) - ) { - logToOutputChannel( - this._outputChannel, - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT( - this._currentPort - ) - ); - logToOutputChannel( - this._outputChannel, - CONSTANTS.ERROR.RECONNECT_DEVICE - ); - reject(err); - } else { - logToOutputChannel( - this._outputChannel, - CONSTANTS.INFO.OPENED_SERIAL_PORT( - this._currentPort - ) - ); - resolve(); - } - } - ); - }); - } - - this._currentSerialPort.on("data", (event: any) => { - logToOutputChannel(this._outputChannel, event.toString()); - }); - - this._currentSerialPort.on("error", (error: any) => { - logToOutputChannel(this._outputChannel, error.toString()); - }); - }); - } - - public changePort(newPort: string): Promise { - return new Promise((resolve, reject) => { - if (newPort === this._currentPort) { - resolve(); - return; - } - this._currentPort = newPort; - if (!this._currentSerialPort || !this.isActive) { - resolve(); - return; - } - this._currentSerialPort.close((error: any) => { - if (error) { - reject(error); - } else { - this._currentSerialPort = null; - resolve(); - } - }); - }); - } - - public stop(): Promise { - return new Promise((resolve, reject) => { - if (!this._currentSerialPort || !this.isActive) { - resolve(false); - return; - } - this._currentSerialPort.close((error: any) => { - if (this._outputChannel) { - logToOutputChannel( - this._outputChannel, - CONSTANTS.INFO.CLOSED_SERIAL_PORT(this._currentPort) - ); - } - this._currentSerialPort = null; - if (error) { - reject(error); - } else { - resolve(true); - } - }); - }); - } - - public changeBaudRate(newBaudRate: number): Promise { - return new Promise((resolve, reject) => { - this._currentBaudRate = newBaudRate; - if (!this._currentSerialPort || !this.isActive) { - resolve(); - return; - } - this._currentSerialPort.update( - { baudRate: this._currentBaudRate }, - (error: any) => { - if (error) { - reject(error); - } else { - resolve(); - } - } - ); - }); - } + public static get serialport(): any { + if (!SerialPortControl._serialport) { + SerialPortControl._serialport = require("usb-native").SerialPort; + } + return SerialPortControl._serialport; + } + + public static list(): Promise { + return new Promise((resolve, reject) => { + SerialPortControl.serialport.list().then( + (ports) => resolve(ports), + (err) => reject(err), + ); + }); + } + + private static _serialport: any; + + private _currentPort: string; + private _currentBaudRate: number; + private _currentSerialPort: any; + + public constructor( + port: string, + baudRate: number, + private _outputChannel: OutputChannel, + ) { + this._currentPort = port; + this._currentBaudRate = baudRate; + } + + public get isActive(): boolean { + return this._currentSerialPort && this._currentSerialPort.isOpen; + } + + public get currentPort(): string { + return this._currentPort; + } + + public open(): Promise { + logToOutputChannel( + this._outputChannel, + CONSTANTS.INFO.OPENING_SERIAL_PORT(this._currentPort), + ); + return new Promise((resolve, reject) => { + if (this._currentSerialPort && this._currentSerialPort.isOpen) { + this._currentSerialPort.close((err: any) => { + if (err) { + return reject(err); + } + this._currentSerialPort = null; + return this.open().then( + () => { + resolve(); + }, + (error) => { + reject(error); + }, + ); + }); + } else { + this._currentSerialPort = new SerialPortControl.serialport( + this._currentPort, + { baudRate: this._currentBaudRate }, + ); + this._outputChannel.show(); + this._currentSerialPort.on("open", () => { + this._currentSerialPort.write( + CONSTANTS.MISC.SERIAL_MONITOR_TEST_IF_OPEN + os.EOL, + (err: any) => { + if ( + err && + !( + err.message.indexOf( + CONSTANTS.ERROR.COMPORT_UNKNOWN_ERROR, + ) >= 0 + ) + ) { + logToOutputChannel( + this._outputChannel, + CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT( + this._currentPort, + ), + ); + logToOutputChannel( + this._outputChannel, + CONSTANTS.ERROR.RECONNECT_DEVICE, + ); + reject(err); + } else { + logToOutputChannel( + this._outputChannel, + CONSTANTS.INFO.OPENED_SERIAL_PORT( + this._currentPort, + ), + ); + resolve(); + } + }, + ); + }); + } + + this._currentSerialPort.on("data", (event: any) => { + logToOutputChannel(this._outputChannel, event.toString()); + }); + + this._currentSerialPort.on("error", (error: any) => { + logToOutputChannel(this._outputChannel, error.toString()); + }); + }); + } + + public changePort(newPort: string): Promise { + return new Promise((resolve, reject) => { + if (newPort === this._currentPort) { + resolve(); + return; + } + this._currentPort = newPort; + if (!this._currentSerialPort || !this.isActive) { + resolve(); + return; + } + this._currentSerialPort.close((error: any) => { + if (error) { + reject(error); + } else { + this._currentSerialPort = null; + resolve(); + } + }); + }); + } + + public stop(): Promise { + return new Promise((resolve, reject) => { + if (!this._currentSerialPort || !this.isActive) { + resolve(false); + return; + } + this._currentSerialPort.close((error: any) => { + if (this._outputChannel) { + logToOutputChannel( + this._outputChannel, + CONSTANTS.INFO.CLOSED_SERIAL_PORT(this._currentPort), + ); + } + this._currentSerialPort = null; + if (error) { + reject(error); + } else { + resolve(true); + } + }); + }); + } + + public changeBaudRate(newBaudRate: number): Promise { + return new Promise((resolve, reject) => { + this._currentBaudRate = newBaudRate; + if (!this._currentSerialPort || !this.isActive) { + resolve(); + return; + } + this._currentSerialPort.update( + { baudRate: this._currentBaudRate }, + (error: any) => { + if (error) { + reject(error); + } else { + resolve(); + } + }, + ); + }); + } } diff --git a/Source/service/PopupService.ts b/Source/service/PopupService.ts index d5aadbff4..e6193c933 100644 --- a/Source/service/PopupService.ts +++ b/Source/service/PopupService.ts @@ -3,14 +3,14 @@ import * as vscode from "vscode"; import { LATEST_RELEASE_NOTE } from "../latest_release_note"; export class PopupService { - public static openReleaseNote() { - const panel = vscode.window.createWebviewPanel( - "releaseNote", - "Release Note", - vscode.ViewColumn.One, - {} - ); + public static openReleaseNote() { + const panel = vscode.window.createWebviewPanel( + "releaseNote", + "Release Note", + vscode.ViewColumn.One, + {}, + ); - panel.webview.html = LATEST_RELEASE_NOTE; - } + panel.webview.html = LATEST_RELEASE_NOTE; + } } diff --git a/Source/service/debuggerCommunicationService.ts b/Source/service/debuggerCommunicationService.ts index b37b1c2ed..1e47024f1 100644 --- a/Source/service/debuggerCommunicationService.ts +++ b/Source/service/debuggerCommunicationService.ts @@ -1,27 +1,27 @@ import { DebuggerCommunicationServer } from "../debuggerCommunicationServer"; export class DebuggerCommunicationService { - private currentDebuggerServer?: DebuggerCommunicationServer; - private previousDebuggerServerToDisconnect?: DebuggerCommunicationServer; + private currentDebuggerServer?: DebuggerCommunicationServer; + private previousDebuggerServerToDisconnect?: DebuggerCommunicationServer; - public setCurrentDebuggerServer(debugServer: DebuggerCommunicationServer) { - this.currentDebuggerServer = debugServer; - } - // Used for restart and stop event - public resetCurrentDebuggerServer() { - if (this.currentDebuggerServer) { - this.currentDebuggerServer.closeConnection(); - } - this.previousDebuggerServerToDisconnect = this.currentDebuggerServer; - this.currentDebuggerServer = undefined; - } - public getCurrentDebuggerServer() { - return this.currentDebuggerServer; - } - // Only used for stop event - public handleStopEvent() { - if (this.previousDebuggerServerToDisconnect) { - this.previousDebuggerServerToDisconnect.disconnectFromPort(); - } - } + public setCurrentDebuggerServer(debugServer: DebuggerCommunicationServer) { + this.currentDebuggerServer = debugServer; + } + // Used for restart and stop event + public resetCurrentDebuggerServer() { + if (this.currentDebuggerServer) { + this.currentDebuggerServer.closeConnection(); + } + this.previousDebuggerServerToDisconnect = this.currentDebuggerServer; + this.currentDebuggerServer = undefined; + } + public getCurrentDebuggerServer() { + return this.currentDebuggerServer; + } + // Only used for stop event + public handleStopEvent() { + if (this.previousDebuggerServerToDisconnect) { + this.previousDebuggerServerToDisconnect.disconnectFromPort(); + } + } } diff --git a/Source/service/deviceSelectionService.ts b/Source/service/deviceSelectionService.ts index 39a8b5988..15f8bc2f2 100644 --- a/Source/service/deviceSelectionService.ts +++ b/Source/service/deviceSelectionService.ts @@ -1,12 +1,12 @@ import { DEFAULT_DEVICE } from "../constants"; export class DeviceSelectionService { - private currentActiveDevice: string = DEFAULT_DEVICE; + private currentActiveDevice: string = DEFAULT_DEVICE; - public getCurrentActiveDevice(): string { - return this.currentActiveDevice; - } - public setCurrentActiveDevice(newActiveDevice: string) { - this.currentActiveDevice = newActiveDevice; - } + public getCurrentActiveDevice(): string { + return this.currentActiveDevice; + } + public setCurrentActiveDevice(newActiveDevice: string) { + this.currentActiveDevice = newActiveDevice; + } } diff --git a/Source/service/fileSelectionService.ts b/Source/service/fileSelectionService.ts index d5b0eea11..411c157be 100644 --- a/Source/service/fileSelectionService.ts +++ b/Source/service/fileSelectionService.ts @@ -5,91 +5,92 @@ import { DeviceSelectionService } from "./deviceSelectionService"; import { MessagingService } from "./messagingService"; export class FileSelectionService { - private currentFileAbsPath: string = ""; - private currentTextDocument: vscode.TextDocument; - private messagingService: MessagingService; + private currentFileAbsPath: string = ""; + private currentTextDocument: vscode.TextDocument; + private messagingService: MessagingService; - constructor(messagingService: MessagingService) { - this.messagingService = messagingService; - } + constructor(messagingService: MessagingService) { + this.messagingService = messagingService; + } - public getCurrentFileAbsPath() { - return this.currentFileAbsPath; - } - public getCurrentTextDocument() { - return this.currentTextDocument; - } - public updateCurrentFileFromTextFile = async ( - activeTextDocument: vscode.TextDocument | undefined - ) => { - if (activeTextDocument) { - await this.updateCurrentFileFromEditor({ - document: activeTextDocument, - } as vscode.TextEditor); - } else { - return; - } - }; - public updateCurrentFileFromEditor = async ( - activeTextDocument: vscode.TextEditor | undefined - ) => { - if ( - activeTextDocument && - activeTextDocument.document && - activeTextDocument.document.languageId === "python" - ) { - this.setPathAndSendMessage(activeTextDocument.document.fileName); - this.currentTextDocument = activeTextDocument.document; - } else if (this.currentFileAbsPath === "") { - this.setPathAndSendMessage(this.getActivePythonFile() || ""); - } - if ( - this.currentTextDocument && - this.getActiveEditorFromPath(this.currentTextDocument.fileName) === - undefined - ) { - await vscode.window.showTextDocument( - this.currentTextDocument, - vscode.ViewColumn.One - ); - } - }; - public findCurrentTextDocument() { - if (this.currentFileAbsPath) { - const foundDocument = this.getActiveEditorFromPath( - this.currentFileAbsPath - ); - if (foundDocument !== undefined) { - this.currentTextDocument = foundDocument; - } - } - } + public getCurrentFileAbsPath() { + return this.currentFileAbsPath; + } + public getCurrentTextDocument() { + return this.currentTextDocument; + } + public updateCurrentFileFromTextFile = async ( + activeTextDocument: vscode.TextDocument | undefined, + ) => { + if (activeTextDocument) { + await this.updateCurrentFileFromEditor({ + document: activeTextDocument, + } as vscode.TextEditor); + } else { + return; + } + }; + public updateCurrentFileFromEditor = async ( + activeTextDocument: vscode.TextEditor | undefined, + ) => { + if ( + activeTextDocument && + activeTextDocument.document && + activeTextDocument.document.languageId === "python" + ) { + this.setPathAndSendMessage(activeTextDocument.document.fileName); + this.currentTextDocument = activeTextDocument.document; + } else if (this.currentFileAbsPath === "") { + this.setPathAndSendMessage(this.getActivePythonFile() || ""); + } + if ( + this.currentTextDocument && + this.getActiveEditorFromPath(this.currentTextDocument.fileName) === + undefined + ) { + await vscode.window.showTextDocument( + this.currentTextDocument, + vscode.ViewColumn.One, + ); + } + }; + public findCurrentTextDocument() { + if (this.currentFileAbsPath) { + const foundDocument = this.getActiveEditorFromPath( + this.currentFileAbsPath, + ); + if (foundDocument !== undefined) { + this.currentTextDocument = foundDocument; + } + } + } - public setPathAndSendMessage = (newFilePath: string) => { - this.currentFileAbsPath = newFilePath; - this.messagingService.sendMessageToWebview( - VSCODE_MESSAGES_TO_WEBVIEW.CURRENT_FILE, - { - running_file: newFilePath, - } - ); - }; - private getActiveEditorFromPath = ( - filePath: string - ): vscode.TextDocument => { - const activeEditor = vscode.window.visibleTextEditors.find( - (editor: vscode.TextEditor) => editor.document.fileName === filePath - ); - return activeEditor ? activeEditor.document : undefined; - }; - private getActivePythonFile = () => { - const editors: vscode.TextEditor[] = vscode.window.visibleTextEditors; - const activeEditor = editors.find( - editor => editor.document.languageId === LANGUAGE_VARS.PYTHON.ID - ); - if (activeEditor) { - this.currentTextDocument = activeEditor.document; - } - return activeEditor ? activeEditor.document.fileName : ""; - }; + public setPathAndSendMessage = (newFilePath: string) => { + this.currentFileAbsPath = newFilePath; + this.messagingService.sendMessageToWebview( + VSCODE_MESSAGES_TO_WEBVIEW.CURRENT_FILE, + { + running_file: newFilePath, + }, + ); + }; + private getActiveEditorFromPath = ( + filePath: string, + ): vscode.TextDocument => { + const activeEditor = vscode.window.visibleTextEditors.find( + (editor: vscode.TextEditor) => + editor.document.fileName === filePath, + ); + return activeEditor ? activeEditor.document : undefined; + }; + private getActivePythonFile = () => { + const editors: vscode.TextEditor[] = vscode.window.visibleTextEditors; + const activeEditor = editors.find( + (editor) => editor.document.languageId === LANGUAGE_VARS.PYTHON.ID, + ); + if (activeEditor) { + this.currentTextDocument = activeEditor.document; + } + return activeEditor ? activeEditor.document.fileName : ""; + }; } diff --git a/Source/service/messagingService.ts b/Source/service/messagingService.ts index c702ee268..a10caf3e8 100644 --- a/Source/service/messagingService.ts +++ b/Source/service/messagingService.ts @@ -4,34 +4,35 @@ import * as fs from "fs"; import { VSCODE_MESSAGES_TO_WEBVIEW } from "../view/constants"; import { DeviceSelectionService } from "./deviceSelectionService"; export class MessagingService { - private currentWebviewTarget: Webview | undefined; - private deviceSelectionService: DeviceSelectionService; + private currentWebviewTarget: Webview | undefined; + private deviceSelectionService: DeviceSelectionService; - constructor(deviceSelectionService: DeviceSelectionService) { - this.deviceSelectionService = deviceSelectionService; - } - public setWebview(webview: Webview) { - this.currentWebviewTarget = webview; - } + constructor(deviceSelectionService: DeviceSelectionService) { + this.deviceSelectionService = deviceSelectionService; + } + public setWebview(webview: Webview) { + this.currentWebviewTarget = webview; + } - // Send a message to webview if it exists - public sendMessageToWebview(command: string, stateToSend: Object) { - if (this.currentWebviewTarget) { - this.currentWebviewTarget.postMessage({ - command, - active_device: this.deviceSelectionService.getCurrentActiveDevice(), - state: { ...stateToSend }, - }); - } - } - public sendStartMessage() { - this.currentWebviewTarget.postMessage({ - command: VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE, - }); - } - public sendPauseMessage() { - this.currentWebviewTarget.postMessage({ - command: VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE, - }); - } + // Send a message to webview if it exists + public sendMessageToWebview(command: string, stateToSend: Object) { + if (this.currentWebviewTarget) { + this.currentWebviewTarget.postMessage({ + command, + active_device: + this.deviceSelectionService.getCurrentActiveDevice(), + state: { ...stateToSend }, + }); + } + } + public sendStartMessage() { + this.currentWebviewTarget.postMessage({ + command: VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE, + }); + } + public sendPauseMessage() { + this.currentWebviewTarget.postMessage({ + command: VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE, + }); + } } diff --git a/Source/service/setupService.ts b/Source/service/setupService.ts index f5c80e037..d50f7aaf8 100644 --- a/Source/service/setupService.ts +++ b/Source/service/setupService.ts @@ -3,574 +3,576 @@ import * as os from "os"; import * as path from "path"; import * as vscode from "vscode"; import { - CONFIG, - CONSTANTS, - DialogResponses, - GLOBAL_ENV_VARS, - HELPER_FILES, - TelemetryEventName, - VERSIONS, + CONFIG, + CONSTANTS, + DialogResponses, + GLOBAL_ENV_VARS, + HELPER_FILES, + TelemetryEventName, + VERSIONS, } from "../constants"; import { - checkConfig, - createEscapedPath, - exec, - getConfig, - getPathToScript, - showPrivacyModal, + checkConfig, + createEscapedPath, + exec, + getConfig, + getPathToScript, + showPrivacyModal, } from "../extension_utils/utils"; import TelemetryAI from "../telemetry/telemetryAI"; export class SetupService { - private telemetryAI: TelemetryAI; - - constructor(telemetryAI: TelemetryAI) { - this.telemetryAI = telemetryAI; - } - - public setupEnv = async ( - context: vscode.ExtensionContext, - needsResponse: boolean = false - ) => { - const originalPythonExecutablePath = await this.getCurrentPythonExecutablePath(); - if (originalPythonExecutablePath === "") { - return; - } - let pythonExecutablePath = originalPythonExecutablePath; - const pythonExecutableName: string = - os.platform() === "win32" - ? HELPER_FILES.PYTHON_EXE - : HELPER_FILES.PYTHON; - - if ( - !(await this.areDependenciesInstalled( - context, - pythonExecutablePath - )) - ) { - // environment needs to install dependencies - if (!(await this.checkIfVenv(context, pythonExecutablePath))) { - const pythonExecutablePathVenv = await this.getPythonVenv( - context, - pythonExecutableName - ); - if (await this.hasVenv(context)) { - // venv in extention exists with wrong dependencies - - if ( - !(await this.areDependenciesInstalled( - context, - pythonExecutablePathVenv - )) - ) { - pythonExecutablePath = await this.installDependenciesWrapper( - context, - pythonExecutablePathVenv, - pythonExecutablePath - ); - } else { - pythonExecutablePath = pythonExecutablePathVenv; - } - } else { - pythonExecutablePath = await this.promptInstallVenv( - context, - originalPythonExecutablePath, - pythonExecutableName - ); - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INSTALL_VENV - ); - } - - if (pythonExecutablePath === pythonExecutablePathVenv) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.UPDATED_TO_EXTENSION_VENV - ); - vscode.workspace - .getConfiguration() - .update(CONFIG.PYTHON_PATH, pythonExecutablePath); - } - } else { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_HAS_VENV - ); - } - if (pythonExecutablePath === originalPythonExecutablePath) { - // going with original interpreter, either because - // already in venv or error in creating custom venv - if (checkConfig(CONFIG.SHOW_DEPENDENCY_INSTALL)) { - await vscode.window - .showInformationMessage( - CONSTANTS.INFO.INSTALL_PYTHON_DEPS, - DialogResponses.INSTALL_NOW, - DialogResponses.DONT_INSTALL - ) - .then( - async ( - installChoice: vscode.MessageItem | undefined - ) => { - if ( - installChoice === - DialogResponses.INSTALL_NOW - ) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL - ); - await this.installDependenciesWrapper( - context, - pythonExecutablePath - ); - } else { - await vscode.window - .showInformationMessage( - CONSTANTS.INFO.ARE_YOU_SURE, - DialogResponses.INSTALL_NOW, - DialogResponses.DONT_INSTALL - ) - .then( - async ( - installChoice2: - | vscode.MessageItem - | undefined - ) => { - if ( - installChoice2 === - DialogResponses.INSTALL_NOW - ) { - await this.installDependenciesWrapper( - context, - pythonExecutablePath - ); - } else { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_NO_DEPS_INSTALLED - ); - } - } - ); - } - } - ); - } - } - } else if (needsResponse) { - vscode.window.showInformationMessage( - CONSTANTS.INFO.ALREADY_SUCCESSFUL_INSTALL - ); - } - - return pythonExecutablePath; - }; - - public getCurrentPythonExecutablePath = async ( - isTryingPython3: boolean = false - ) => { - let originalPythonExecutablePath = ""; - const systemPythonVar = isTryingPython3 - ? GLOBAL_ENV_VARS.PYTHON3 - : GLOBAL_ENV_VARS.PYTHON; - // try to get name from interpreter - try { - originalPythonExecutablePath = getConfig(CONFIG.PYTHON_PATH); - } catch (err) { - originalPythonExecutablePath = systemPythonVar; - } - - if ( - originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON3 || - originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON || - originalPythonExecutablePath === "" - ) { - // catching any instance where the python path needs to be resolved - // from an system variable - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_AUTO_RESOLVE_PYTHON_PATH - ); - try { - const { stdout } = await this.executePythonCommand( - systemPythonVar, - `-c "import sys; print(sys.executable)"` - ); - originalPythonExecutablePath = stdout.trim(); - } catch (err) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_NO_PYTHON_PATH - ); - if (isTryingPython3) { - // if trying python3 failed, that means that BOTH - // python and python3 failed as system variables - // so that means that there is no python - vscode.window - .showErrorMessage( - CONSTANTS.ERROR.NO_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.INSTALL_PYTHON) { - const okAction = () => { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON - ); - open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON - ); - } - }); - // no python installed, cannot get path - return ""; - } else { - // "python" didn't resolve to anything, trying "python3" - return this.getCurrentPythonExecutablePath(true); - } - } - if ( - !(await this.validatePythonVersion( - originalPythonExecutablePath - )) - ) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_VER - ); - if (isTryingPython3) { - // if we're trying python3, it means we already tried python and it - // all doesn't seem to work, but it got this far, so it means that - // their system python3 version is still not above 3.7, but they - // don't have a path selected. - vscode.window - .showInformationMessage( - CONSTANTS.ERROR.INVALID_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON - ) - .then( - (installChoice: vscode.MessageItem | undefined) => { - if ( - installChoice === - DialogResponses.INSTALL_PYTHON - ) { - const okAction = () => { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON - ); - open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO - .THIRD_PARTY_WEBSITE_PYTHON - ); - } - } - ); - return ""; - } else { - // otherwise, we ran the "python" system variable - // and we can try python3 - return this.getCurrentPythonExecutablePath(true); - } - } - } else { - // should only be applicable if the user defined their own path - - // fix path to be absolute - if (!path.isAbsolute(originalPythonExecutablePath)) { - originalPythonExecutablePath = path.join( - vscode.workspace.rootPath, - originalPythonExecutablePath - ); - } - - if (!fs.existsSync(originalPythonExecutablePath)) { - await vscode.window.showErrorMessage( - CONSTANTS.ERROR.BAD_PYTHON_PATH - ); - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_INTERPRETER_PATH - ); - return ""; - } - - if ( - !(await this.validatePythonVersion( - originalPythonExecutablePath - )) - ) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_VER - ); - vscode.window - .showInformationMessage( - CONSTANTS.ERROR.INVALID_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON - ) - .then((installChoice: vscode.MessageItem | undefined) => { - if (installChoice === DialogResponses.INSTALL_PYTHON) { - const okAction = () => { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON - ); - open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON - ); - } - }); - return ""; - } - } - - return originalPythonExecutablePath; - }; - - public isPipInstalled = async (pythonExecutablePath: string) => { - try { - await this.executePythonCommand(pythonExecutablePath, " -m pip"); - return true; - } catch (err) { - vscode.window - .showErrorMessage( - `We found that you may not have Pip installed on your interpreter at ${pythonExecutablePath}, please install it and try again.`, - DialogResponses.INSTALL_PIP - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.INSTALL_PIP) { - const okAction = () => { - open(CONSTANTS.LINKS.DOWNLOAD_PIP); - }; - showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PIP - ); - } - }); - return false; - } - }; - - public checkIfVenv = async ( - context: vscode.ExtensionContext, - pythonExecutablePath: string - ) => { - const venvCheckerPath: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.CHECK_IF_VENV_PY - ); - const { stdout } = await this.executePythonCommand( - pythonExecutablePath, - `"${venvCheckerPath}"` - ); - return stdout.trim() === "1"; - }; - - public executePythonCommand = async ( - pythonExecutablePath: string, - command: string - ) => { - return exec(`${createEscapedPath(pythonExecutablePath)} ${command}`); - }; - - public validatePythonVersion = async (pythonExecutablePath: string) => { - const { stdout } = await this.executePythonCommand( - pythonExecutablePath, - "--version" - ); - if (stdout < VERSIONS.MIN_PY_VERSION) { - return false; - } else { - return true; - } - }; - - public hasVenv = async (context: vscode.ExtensionContext) => { - const pathToEnv: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR - ); - - return fs.existsSync(pathToEnv); - }; - - public promptInstallVenv = ( - context: vscode.ExtensionContext, - pythonExecutable: string, - pythonExecutableName: string - ) => { - return vscode.window - .showInformationMessage( - CONSTANTS.INFO.INSTALL_PYTHON_VENV, - DialogResponses.YES, - DialogResponses.NO - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.YES) { - return this.installPythonVenv( - context, - pythonExecutable, - pythonExecutableName - ); - } else { - // return pythonExecutable, notifying the caller - // that the user was unwilling to create venv - // and by default, this will trigger the extension to - // try using pythonExecutable - return pythonExecutable; - } - }); - }; - - public getPythonVenv = async ( - context: vscode.ExtensionContext, - pythonExecutableName: string - ) => { - const subFolder = os.platform() === "win32" ? "Scripts" : "bin"; - - return getPathToScript( - context, - path.join(CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR, subFolder), - pythonExecutableName - ); - }; - - public installPythonVenv = async ( - context: vscode.ExtensionContext, - pythonExecutable: string, - pythonExecutableName: string - ) => { - const pathToEnv: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR - ); - - vscode.window.showInformationMessage( - CONSTANTS.INFO.INSTALLING_PYTHON_VENV - ); - - const pythonPath: string = await this.getPythonVenv( - context, - pythonExecutableName - ); - - try { - // make venv - // run command to download dependencies to out/python_libs - await this.executePythonCommand( - pythonExecutable, - `-m venv "${pathToEnv}"` - ); - } catch (err) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_VENV_CREATION_ERR - ); - vscode.window - .showErrorMessage( - `Virtual environment for download could not be completed. Using original interpreter at: ${pythonExecutable}. If you're on Linux, try running "sudo apt-get install python3-venv".`, - DialogResponses.READ_INSTALL_MD - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.READ_INSTALL_MD) { - open(CONSTANTS.LINKS.INSTALL); - } - }); - - console.error(err); - - return pythonExecutable; - } - - return this.installDependenciesWrapper( - context, - pythonPath, - pythonExecutable - ); - }; - - public areDependenciesInstalled = async ( - context: vscode.ExtensionContext, - pythonPath: string - ) => { - const dependencyCheckerPath: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.CHECK_PYTHON_DEPENDENCIES - ); - try { - // python script will throw exception - // if not all dependencies are downloaded - const { stdout } = await this.executePythonCommand( - pythonPath, - `"${dependencyCheckerPath}"` - ); - - // output for debugging purposes - console.info(stdout); - return true; - } catch (err) { - return false; - } - }; - - public installDependencies = async ( - context: vscode.ExtensionContext, - pythonPath: string - ) => { - const requirementsPyInstallPath: string = getPathToScript( - context, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - "install_dependencies.py" - ); - - if (!this.isPipInstalled(pythonPath)) { - this.telemetryAI.trackFeatureUsage(TelemetryEventName.SETUP_NO_PIP); - return false; - } - - try { - const { stdout } = await this.executePythonCommand( - pythonPath, - `"${requirementsPyInstallPath}"` - ); - console.log(`DSE ${stdout}`); - vscode.window.showInformationMessage( - CONSTANTS.INFO.SUCCESSFUL_INSTALL - ); - return true; - } catch (err) { - console.log(`DSE ${err}`); - return false; - } - }; - - public installDependenciesWrapper = async ( - context: vscode.ExtensionContext, - pythonPath: string, - backupPythonPath: string = "" - ) => { - let errMessage = CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR; - if (backupPythonPath !== "") { - errMessage = `${errMessage} Using original interpreter at: ${backupPythonPath}.`; - } - if (!(await this.installDependencies(context, pythonPath))) { - vscode.window - .showErrorMessage( - CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR, - DialogResponses.READ_INSTALL_MD - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.READ_INSTALL_MD) { - open(CONSTANTS.LINKS.INSTALL); - } - }); - - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DEP_INSTALL_FAIL - ); - return backupPythonPath; - } - return pythonPath; - }; + private telemetryAI: TelemetryAI; + + constructor(telemetryAI: TelemetryAI) { + this.telemetryAI = telemetryAI; + } + + public setupEnv = async ( + context: vscode.ExtensionContext, + needsResponse: boolean = false, + ) => { + const originalPythonExecutablePath = + await this.getCurrentPythonExecutablePath(); + if (originalPythonExecutablePath === "") { + return; + } + let pythonExecutablePath = originalPythonExecutablePath; + const pythonExecutableName: string = + os.platform() === "win32" + ? HELPER_FILES.PYTHON_EXE + : HELPER_FILES.PYTHON; + + if ( + !(await this.areDependenciesInstalled( + context, + pythonExecutablePath, + )) + ) { + // environment needs to install dependencies + if (!(await this.checkIfVenv(context, pythonExecutablePath))) { + const pythonExecutablePathVenv = await this.getPythonVenv( + context, + pythonExecutableName, + ); + if (await this.hasVenv(context)) { + // venv in extention exists with wrong dependencies + + if ( + !(await this.areDependenciesInstalled( + context, + pythonExecutablePathVenv, + )) + ) { + pythonExecutablePath = + await this.installDependenciesWrapper( + context, + pythonExecutablePathVenv, + pythonExecutablePath, + ); + } else { + pythonExecutablePath = pythonExecutablePathVenv; + } + } else { + pythonExecutablePath = await this.promptInstallVenv( + context, + originalPythonExecutablePath, + pythonExecutableName, + ); + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INSTALL_VENV, + ); + } + + if (pythonExecutablePath === pythonExecutablePathVenv) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.UPDATED_TO_EXTENSION_VENV, + ); + vscode.workspace + .getConfiguration() + .update(CONFIG.PYTHON_PATH, pythonExecutablePath); + } + } else { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_HAS_VENV, + ); + } + if (pythonExecutablePath === originalPythonExecutablePath) { + // going with original interpreter, either because + // already in venv or error in creating custom venv + if (checkConfig(CONFIG.SHOW_DEPENDENCY_INSTALL)) { + await vscode.window + .showInformationMessage( + CONSTANTS.INFO.INSTALL_PYTHON_DEPS, + DialogResponses.INSTALL_NOW, + DialogResponses.DONT_INSTALL, + ) + .then( + async ( + installChoice: vscode.MessageItem | undefined, + ) => { + if ( + installChoice === + DialogResponses.INSTALL_NOW + ) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL, + ); + await this.installDependenciesWrapper( + context, + pythonExecutablePath, + ); + } else { + await vscode.window + .showInformationMessage( + CONSTANTS.INFO.ARE_YOU_SURE, + DialogResponses.INSTALL_NOW, + DialogResponses.DONT_INSTALL, + ) + .then( + async ( + installChoice2: + | vscode.MessageItem + | undefined, + ) => { + if ( + installChoice2 === + DialogResponses.INSTALL_NOW + ) { + await this.installDependenciesWrapper( + context, + pythonExecutablePath, + ); + } else { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_NO_DEPS_INSTALLED, + ); + } + }, + ); + } + }, + ); + } + } + } else if (needsResponse) { + vscode.window.showInformationMessage( + CONSTANTS.INFO.ALREADY_SUCCESSFUL_INSTALL, + ); + } + + return pythonExecutablePath; + }; + + public getCurrentPythonExecutablePath = async ( + isTryingPython3: boolean = false, + ) => { + let originalPythonExecutablePath = ""; + const systemPythonVar = isTryingPython3 + ? GLOBAL_ENV_VARS.PYTHON3 + : GLOBAL_ENV_VARS.PYTHON; + // try to get name from interpreter + try { + originalPythonExecutablePath = getConfig(CONFIG.PYTHON_PATH); + } catch (err) { + originalPythonExecutablePath = systemPythonVar; + } + + if ( + originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON3 || + originalPythonExecutablePath === GLOBAL_ENV_VARS.PYTHON || + originalPythonExecutablePath === "" + ) { + // catching any instance where the python path needs to be resolved + // from an system variable + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_AUTO_RESOLVE_PYTHON_PATH, + ); + try { + const { stdout } = await this.executePythonCommand( + systemPythonVar, + `-c "import sys; print(sys.executable)"`, + ); + originalPythonExecutablePath = stdout.trim(); + } catch (err) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_NO_PYTHON_PATH, + ); + if (isTryingPython3) { + // if trying python3 failed, that means that BOTH + // python and python3 failed as system variables + // so that means that there is no python + vscode.window + .showErrorMessage( + CONSTANTS.ERROR.NO_PYTHON_PATH, + DialogResponses.INSTALL_PYTHON, + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.INSTALL_PYTHON) { + const okAction = () => { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DOWNLOAD_PYTHON, + ); + open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON, + ); + } + }); + // no python installed, cannot get path + return ""; + } else { + // "python" didn't resolve to anything, trying "python3" + return this.getCurrentPythonExecutablePath(true); + } + } + if ( + !(await this.validatePythonVersion( + originalPythonExecutablePath, + )) + ) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INVALID_PYTHON_VER, + ); + if (isTryingPython3) { + // if we're trying python3, it means we already tried python and it + // all doesn't seem to work, but it got this far, so it means that + // their system python3 version is still not above 3.7, but they + // don't have a path selected. + vscode.window + .showInformationMessage( + CONSTANTS.ERROR.INVALID_PYTHON_PATH, + DialogResponses.INSTALL_PYTHON, + ) + .then( + (installChoice: vscode.MessageItem | undefined) => { + if ( + installChoice === + DialogResponses.INSTALL_PYTHON + ) { + const okAction = () => { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DOWNLOAD_PYTHON, + ); + open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO + .THIRD_PARTY_WEBSITE_PYTHON, + ); + } + }, + ); + return ""; + } else { + // otherwise, we ran the "python" system variable + // and we can try python3 + return this.getCurrentPythonExecutablePath(true); + } + } + } else { + // should only be applicable if the user defined their own path + + // fix path to be absolute + if (!path.isAbsolute(originalPythonExecutablePath)) { + originalPythonExecutablePath = path.join( + vscode.workspace.rootPath, + originalPythonExecutablePath, + ); + } + + if (!fs.existsSync(originalPythonExecutablePath)) { + await vscode.window.showErrorMessage( + CONSTANTS.ERROR.BAD_PYTHON_PATH, + ); + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INVALID_PYTHON_INTERPRETER_PATH, + ); + return ""; + } + + if ( + !(await this.validatePythonVersion( + originalPythonExecutablePath, + )) + ) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_INVALID_PYTHON_VER, + ); + vscode.window + .showInformationMessage( + CONSTANTS.ERROR.INVALID_PYTHON_PATH, + DialogResponses.INSTALL_PYTHON, + ) + .then((installChoice: vscode.MessageItem | undefined) => { + if (installChoice === DialogResponses.INSTALL_PYTHON) { + const okAction = () => { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DOWNLOAD_PYTHON, + ); + open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON, + ); + } + }); + return ""; + } + } + + return originalPythonExecutablePath; + }; + + public isPipInstalled = async (pythonExecutablePath: string) => { + try { + await this.executePythonCommand(pythonExecutablePath, " -m pip"); + return true; + } catch (err) { + vscode.window + .showErrorMessage( + `We found that you may not have Pip installed on your interpreter at ${pythonExecutablePath}, please install it and try again.`, + DialogResponses.INSTALL_PIP, + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.INSTALL_PIP) { + const okAction = () => { + open(CONSTANTS.LINKS.DOWNLOAD_PIP); + }; + showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PIP, + ); + } + }); + return false; + } + }; + + public checkIfVenv = async ( + context: vscode.ExtensionContext, + pythonExecutablePath: string, + ) => { + const venvCheckerPath: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.CHECK_IF_VENV_PY, + ); + const { stdout } = await this.executePythonCommand( + pythonExecutablePath, + `"${venvCheckerPath}"`, + ); + return stdout.trim() === "1"; + }; + + public executePythonCommand = async ( + pythonExecutablePath: string, + command: string, + ) => { + return exec(`${createEscapedPath(pythonExecutablePath)} ${command}`); + }; + + public validatePythonVersion = async (pythonExecutablePath: string) => { + const { stdout } = await this.executePythonCommand( + pythonExecutablePath, + "--version", + ); + if (stdout < VERSIONS.MIN_PY_VERSION) { + return false; + } else { + return true; + } + }; + + public hasVenv = async (context: vscode.ExtensionContext) => { + const pathToEnv: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR, + ); + + return fs.existsSync(pathToEnv); + }; + + public promptInstallVenv = ( + context: vscode.ExtensionContext, + pythonExecutable: string, + pythonExecutableName: string, + ) => { + return vscode.window + .showInformationMessage( + CONSTANTS.INFO.INSTALL_PYTHON_VENV, + DialogResponses.YES, + DialogResponses.NO, + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.YES) { + return this.installPythonVenv( + context, + pythonExecutable, + pythonExecutableName, + ); + } else { + // return pythonExecutable, notifying the caller + // that the user was unwilling to create venv + // and by default, this will trigger the extension to + // try using pythonExecutable + return pythonExecutable; + } + }); + }; + + public getPythonVenv = async ( + context: vscode.ExtensionContext, + pythonExecutableName: string, + ) => { + const subFolder = os.platform() === "win32" ? "Scripts" : "bin"; + + return getPathToScript( + context, + path.join(CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR, subFolder), + pythonExecutableName, + ); + }; + + public installPythonVenv = async ( + context: vscode.ExtensionContext, + pythonExecutable: string, + pythonExecutableName: string, + ) => { + const pathToEnv: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR, + ); + + vscode.window.showInformationMessage( + CONSTANTS.INFO.INSTALLING_PYTHON_VENV, + ); + + const pythonPath: string = await this.getPythonVenv( + context, + pythonExecutableName, + ); + + try { + // make venv + // run command to download dependencies to out/python_libs + await this.executePythonCommand( + pythonExecutable, + `-m venv "${pathToEnv}"`, + ); + } catch (err) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_VENV_CREATION_ERR, + ); + vscode.window + .showErrorMessage( + `Virtual environment for download could not be completed. Using original interpreter at: ${pythonExecutable}. If you're on Linux, try running "sudo apt-get install python3-venv".`, + DialogResponses.READ_INSTALL_MD, + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.READ_INSTALL_MD) { + open(CONSTANTS.LINKS.INSTALL); + } + }); + + console.error(err); + + return pythonExecutable; + } + + return this.installDependenciesWrapper( + context, + pythonPath, + pythonExecutable, + ); + }; + + public areDependenciesInstalled = async ( + context: vscode.ExtensionContext, + pythonPath: string, + ) => { + const dependencyCheckerPath: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + HELPER_FILES.CHECK_PYTHON_DEPENDENCIES, + ); + try { + // python script will throw exception + // if not all dependencies are downloaded + const { stdout } = await this.executePythonCommand( + pythonPath, + `"${dependencyCheckerPath}"`, + ); + + // output for debugging purposes + console.info(stdout); + return true; + } catch (err) { + return false; + } + }; + + public installDependencies = async ( + context: vscode.ExtensionContext, + pythonPath: string, + ) => { + const requirementsPyInstallPath: string = getPathToScript( + context, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + "install_dependencies.py", + ); + + if (!this.isPipInstalled(pythonPath)) { + this.telemetryAI.trackFeatureUsage(TelemetryEventName.SETUP_NO_PIP); + return false; + } + + try { + const { stdout } = await this.executePythonCommand( + pythonPath, + `"${requirementsPyInstallPath}"`, + ); + console.log(`DSE ${stdout}`); + vscode.window.showInformationMessage( + CONSTANTS.INFO.SUCCESSFUL_INSTALL, + ); + return true; + } catch (err) { + console.log(`DSE ${err}`); + return false; + } + }; + + public installDependenciesWrapper = async ( + context: vscode.ExtensionContext, + pythonPath: string, + backupPythonPath: string = "", + ) => { + let errMessage = CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR; + if (backupPythonPath !== "") { + errMessage = `${errMessage} Using original interpreter at: ${backupPythonPath}.`; + } + if (!(await this.installDependencies(context, pythonPath))) { + vscode.window + .showErrorMessage( + CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR, + DialogResponses.READ_INSTALL_MD, + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.READ_INSTALL_MD) { + open(CONSTANTS.LINKS.INSTALL); + } + }); + + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.SETUP_DEP_INSTALL_FAIL, + ); + return backupPythonPath; + } + return pythonPath; + }; } diff --git a/Source/service/telemetryHandlerService.ts b/Source/service/telemetryHandlerService.ts index f16141f65..edfe86475 100644 --- a/Source/service/telemetryHandlerService.ts +++ b/Source/service/telemetryHandlerService.ts @@ -6,551 +6,551 @@ import TelemetryAI from "../telemetry/telemetryAI"; import { DeviceSelectionService } from "./deviceSelectionService"; export class TelemetryHandlerService { - private telemetryAI: TelemetryAI; - private deviceSelectionService: DeviceSelectionService; + private telemetryAI: TelemetryAI; + private deviceSelectionService: DeviceSelectionService; - constructor( - telemetryAI: TelemetryAI, - deviceSelectionService: DeviceSelectionService - ) { - this.telemetryAI = telemetryAI; - this.deviceSelectionService = deviceSelectionService; - } + constructor( + telemetryAI: TelemetryAI, + deviceSelectionService: DeviceSelectionService, + ) { + this.telemetryAI = telemetryAI; + this.deviceSelectionService = deviceSelectionService; + } - public handleDebuggerTelemetry = () => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_DEBUGGER_INIT_SUCCESS - ); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_DEBUGGER_INIT_SUCCESS - ); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_DEBUGGER_INIT_SUCCESS - ); - break; - default: - break; - } - }; + public handleDebuggerTelemetry = () => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_DEBUGGER_INIT_SUCCESS, + ); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_DEBUGGER_INIT_SUCCESS, + ); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_DEBUGGER_INIT_SUCCESS, + ); + break; + default: + break; + } + }; - public handleDebuggerFailTelemetry = () => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_DEBUGGER_INIT_FAIL - ); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_DEBUGGER_INIT_FAIL - ); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_DEBUGGER_INIT_FAIL - ); - break; - default: - break; - } - }; + public handleDebuggerFailTelemetry = () => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_DEBUGGER_INIT_FAIL, + ); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_DEBUGGER_INIT_FAIL, + ); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_DEBUGGER_INIT_FAIL, + ); + break; + default: + break; + } + }; - public handleButtonPressTelemetry = (buttonState: any) => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.handleCPXButtonPressTelemetry(buttonState); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.handleMicrobitButtonPressTelemetry(buttonState); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.handleClueButtonPressTelemetry(buttonState); - break; - default: - break; - } - }; + public handleButtonPressTelemetry = (buttonState: any) => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.handleCPXButtonPressTelemetry(buttonState); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.handleMicrobitButtonPressTelemetry(buttonState); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.handleClueButtonPressTelemetry(buttonState); + break; + default: + break; + } + }; - public handleGestureTelemetry = (sensorState: any) => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.handleCPXGestureTelemetry(sensorState); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - break; - default: - break; - } - }; + public handleGestureTelemetry = (sensorState: any) => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.handleCPXGestureTelemetry(sensorState); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + break; + default: + break; + } + }; - public handleSensorTelemetry = (sensor: string) => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.handleCPXSensorTelemetry(sensor); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.handleMicrobitSensorTelemetry(sensor); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.handleClueSensorTelemetry(sensor); - break; - default: - break; - } - }; + public handleSensorTelemetry = (sensor: string) => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.handleCPXSensorTelemetry(sensor); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.handleMicrobitSensorTelemetry(sensor); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.handleClueSensorTelemetry(sensor); + break; + default: + break; + } + }; - public handleCPXButtonPressTelemetry = (buttonState: any) => { - if (buttonState.button_a && buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_BUTTON_AB - ); - } else if (buttonState.button_a) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_BUTTON_A - ); - } else if (buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_BUTTON_B - ); - } else if (buttonState.switch) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_SWITCH - ); - } - }; + public handleCPXButtonPressTelemetry = (buttonState: any) => { + if (buttonState.button_a && buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_BUTTON_AB, + ); + } else if (buttonState.button_a) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_BUTTON_A, + ); + } else if (buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_BUTTON_B, + ); + } else if (buttonState.switch) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_SWITCH, + ); + } + }; - public handleCPXGestureTelemetry = (sensorState: any) => { - if (sensorState.shake) { - this.handleCPXSensorTelemetry("shake"); - } else if (sensorState.touch) { - this.handleCPXSensorTelemetry("touch"); - } - }; + public handleCPXGestureTelemetry = (sensorState: any) => { + if (sensorState.shake) { + this.handleCPXSensorTelemetry("shake"); + } else if (sensorState.touch) { + this.handleCPXSensorTelemetry("touch"); + } + }; - public handleCPXSensorTelemetry = (sensor: string) => { - switch (sensor) { - case "temperature": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_TEMPERATURE_SENSOR - ); - break; - case "light": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_LIGHT_SENSOR - ); - break; - case "motion_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR - ); - break; - case "shake": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_SHAKE - ); - break; - case "touch": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_CAPACITIVE_TOUCH - ); - break; - } - }; + public handleCPXSensorTelemetry = (sensor: string) => { + switch (sensor) { + case "temperature": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_TEMPERATURE_SENSOR, + ); + break; + case "light": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_LIGHT_SENSOR, + ); + break; + case "motion_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR, + ); + break; + case "motion_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR, + ); + break; + case "motion_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR, + ); + break; + case "shake": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_SHAKE, + ); + break; + case "touch": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_SIMULATOR_CAPACITIVE_TOUCH, + ); + break; + } + }; - public handleMicrobitButtonPressTelemetry = (buttonState: any) => { - if (buttonState.button_a && buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_AB - ); - } else if (buttonState.button_a) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_A - ); - } else if (buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_B - ); - } - }; + public handleMicrobitButtonPressTelemetry = (buttonState: any) => { + if (buttonState.button_a && buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_AB, + ); + } else if (buttonState.button_a) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_A, + ); + } else if (buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_B, + ); + } + }; - public handleMicrobitSensorTelemetry = (sensor: string) => { - switch (sensor) { - case "temperature": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_TEMPERATURE_SENSOR - ); - break; - case "light": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_LIGHT_SENSOR - ); - break; - case "motion_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR - ); - break; - case "gesture": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_GESTURE_SENSOR - ); - break; - } - }; + public handleMicrobitSensorTelemetry = (sensor: string) => { + switch (sensor) { + case "temperature": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_TEMPERATURE_SENSOR, + ); + break; + case "light": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_LIGHT_SENSOR, + ); + break; + case "motion_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR, + ); + break; + case "motion_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR, + ); + break; + case "motion_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR, + ); + break; + case "gesture": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_SIMULATOR_GESTURE_SENSOR, + ); + break; + } + }; - public handleClueButtonPressTelemetry = (buttonState: any) => { - if (buttonState.button_a && buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_BUTTON_AB - ); - } else if (buttonState.button_a) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_BUTTON_A - ); - } else if (buttonState.button_b) { - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_BUTTON_B - ); - } - }; + public handleClueButtonPressTelemetry = (buttonState: any) => { + if (buttonState.button_a && buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_BUTTON_AB, + ); + } else if (buttonState.button_a) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_BUTTON_A, + ); + } else if (buttonState.button_b) { + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_BUTTON_B, + ); + } + }; - public handleClueSensorTelemetry = (sensor: string) => { - switch (sensor) { - case "temperature": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_TEMPERATURE_SENSOR - ); - break; - case "light_r": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "light_g": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "light_b": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "light_c": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR - ); - break; - case "motion_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR - ); - break; - case "motion_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR - ); - break; - case "gesture": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GESTURE_SENSOR - ); - break; - case "humidity": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_HUMIDITY_SENSOR - ); - break; - case "pressure": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_PRESSURE_SENSOR - ); - break; - case "proximity": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_PROXIMITY_SENSOR - ); - break; - case "gyro_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR - ); - break; - case "gyro_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR - ); - break; - case "gyro_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR - ); - break; - case "magnet_x": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR - ); - break; - case "magnet_y": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR - ); - break; - case "magnet_z": - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR - ); - break; - } - }; + public handleClueSensorTelemetry = (sensor: string) => { + switch (sensor) { + case "temperature": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_TEMPERATURE_SENSOR, + ); + break; + case "light_r": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR, + ); + break; + case "light_g": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR, + ); + break; + case "light_b": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR, + ); + break; + case "light_c": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR, + ); + break; + case "motion_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR, + ); + break; + case "motion_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR, + ); + break; + case "motion_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR, + ); + break; + case "gesture": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GESTURE_SENSOR, + ); + break; + case "humidity": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_HUMIDITY_SENSOR, + ); + break; + case "pressure": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_PRESSURE_SENSOR, + ); + break; + case "proximity": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_PROXIMITY_SENSOR, + ); + break; + case "gyro_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR, + ); + break; + case "gyro_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR, + ); + break; + case "gyro_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR, + ); + break; + case "magnet_x": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR, + ); + break; + case "magnet_y": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR, + ); + break; + case "magnet_z": + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR, + ); + break; + } + }; - public handleNewFileErrorTelemetry = () => { - switch (this.deviceSelectionService.getCurrentActiveDevice()) { - case CONSTANTS.DEVICE_NAME.CPX: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_ERROR_COMMAND_NEW_FILE - ); - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_ERROR_COMMAND_NEW_FILE - ); - break; - case CONSTANTS.DEVICE_NAME.CLUE: - this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_ERROR_COMMAND_NEW_FILE - ); - break; - default: - break; - } - }; + public handleNewFileErrorTelemetry = () => { + switch (this.deviceSelectionService.getCurrentActiveDevice()) { + case CONSTANTS.DEVICE_NAME.CPX: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CPX_ERROR_COMMAND_NEW_FILE, + ); + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.MICROBIT_ERROR_COMMAND_NEW_FILE, + ); + break; + case CONSTANTS.DEVICE_NAME.CLUE: + this.telemetryAI.trackFeatureUsage( + TelemetryEventName.CLUE_ERROR_COMMAND_NEW_FILE, + ); + break; + default: + break; + } + }; - public getTelemetryEventsForStartingDeployToDevice = (device: string) => { - let deployTelemetryEvent: string; - let deployPerformanceTelemetryEvent: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - deployTelemetryEvent = - TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; - deployPerformanceTelemetryEvent = - TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - deployTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; - deployPerformanceTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - deployTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; - deployPerformanceTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; - break; - } - return { - deployTelemetryEvent, - deployPerformanceTelemetryEvent, - }; - }; + public getTelemetryEventsForStartingDeployToDevice = (device: string) => { + let deployTelemetryEvent: string; + let deployPerformanceTelemetryEvent: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + deployTelemetryEvent = + TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; + deployPerformanceTelemetryEvent = + TelemetryEventName.CPX_COMMAND_DEPLOY_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + deployTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; + deployPerformanceTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_DEPLOY_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + deployTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; + deployPerformanceTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_DEPLOY_DEVICE; + break; + } + return { + deployTelemetryEvent, + deployPerformanceTelemetryEvent, + }; + }; - public handleDeployToDeviceErrorTelemetry = ( - data: string, - device: string - ) => { - let telemetryErrorName: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - telemetryErrorName = - TelemetryEventName.CPX_ERROR_PYTHON_DEVICE_PROCESS; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - telemetryErrorName = - TelemetryEventName.MICROBIT_ERROR_PYTHON_DEVICE_PROCESS; - case CONSTANTS.DEVICE_NAME.CLUE: - telemetryErrorName = - TelemetryEventName.CLUE_ERROR_PYTHON_DEVICE_PROCESS; - } - this.telemetryAI.trackFeatureUsage(telemetryErrorName, { - error: `${data}`, - }); - }; + public handleDeployToDeviceErrorTelemetry = ( + data: string, + device: string, + ) => { + let telemetryErrorName: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + telemetryErrorName = + TelemetryEventName.CPX_ERROR_PYTHON_DEVICE_PROCESS; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + telemetryErrorName = + TelemetryEventName.MICROBIT_ERROR_PYTHON_DEVICE_PROCESS; + case CONSTANTS.DEVICE_NAME.CLUE: + telemetryErrorName = + TelemetryEventName.CLUE_ERROR_PYTHON_DEVICE_PROCESS; + } + this.telemetryAI.trackFeatureUsage(telemetryErrorName, { + error: `${data}`, + }); + }; - public handleDeployToDeviceFinishedTelemetry = ( - message: any, - device: string - ) => { - let successCommandDeployDevice: string; - let errorCommandDeployWithoutDevice: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - successCommandDeployDevice = - TelemetryEventName.CPX_SUCCESS_COMMAND_DEPLOY_DEVICE; - errorCommandDeployWithoutDevice = - TelemetryEventName.CPX_ERROR_DEPLOY_WITHOUT_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - successCommandDeployDevice = - TelemetryEventName.MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE; - errorCommandDeployWithoutDevice = - TelemetryEventName.MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - successCommandDeployDevice = - TelemetryEventName.CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE; - errorCommandDeployWithoutDevice = - TelemetryEventName.CLUE_ERROR_DEPLOY_WITHOUT_DEVICE; - break; - } + public handleDeployToDeviceFinishedTelemetry = ( + message: any, + device: string, + ) => { + let successCommandDeployDevice: string; + let errorCommandDeployWithoutDevice: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + successCommandDeployDevice = + TelemetryEventName.CPX_SUCCESS_COMMAND_DEPLOY_DEVICE; + errorCommandDeployWithoutDevice = + TelemetryEventName.CPX_ERROR_DEPLOY_WITHOUT_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + successCommandDeployDevice = + TelemetryEventName.MICROBIT_SUCCESS_COMMAND_DEPLOY_DEVICE; + errorCommandDeployWithoutDevice = + TelemetryEventName.MICROBIT_ERROR_DEPLOY_WITHOUT_DEVICE; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + successCommandDeployDevice = + TelemetryEventName.CLUE_SUCCESS_COMMAND_DEPLOY_DEVICE; + errorCommandDeployWithoutDevice = + TelemetryEventName.CLUE_ERROR_DEPLOY_WITHOUT_DEVICE; + break; + } - switch (message.type) { - case "complete": - this.telemetryAI.trackFeatureUsage(successCommandDeployDevice); - break; - case "no-device": - this.telemetryAI.trackFeatureUsage( - errorCommandDeployWithoutDevice - ); - if ( - device === CONSTANTS.DEVICE_NAME.CPX || - device === CONSTANTS.DEVICE_NAME.CLUE - ) { - vscode.window - .showErrorMessage( - CONSTANTS.ERROR.NO_DEVICE, - DialogResponses.HELP - ) - .then((selection: vscode.MessageItem | undefined) => { - if (selection === DialogResponses.HELP) { - const okAction = () => { - let helpLink: string; - let helpTelemetryEvent: string; - if (device === CONSTANTS.DEVICE_NAME.CPX) { - helpLink = CONSTANTS.LINKS.CPX_HELP; - helpTelemetryEvent = - TelemetryEventName.CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; - } else if ( - device === CONSTANTS.DEVICE_NAME.CLUE - ) { - helpLink = CONSTANTS.LINKS.CLUE_HELP; - helpTelemetryEvent = - TelemetryEventName.CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; - } - open(helpLink); - this.telemetryAI.trackFeatureUsage( - helpTelemetryEvent - ); - }; - utils.showPrivacyModal( - okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT - ); - } - }); - } else if (device === CONSTANTS.DEVICE_NAME.MICROBIT) { - vscode.window.showErrorMessage(CONSTANTS.ERROR.NO_DEVICE); - } - break; - case "low-python-version": - vscode.window.showErrorMessage( - CONSTANTS.ERROR.LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT - ); - break; - default: - console.log( - `Non-state JSON output from the process : ${message}` - ); - break; - } - }; + switch (message.type) { + case "complete": + this.telemetryAI.trackFeatureUsage(successCommandDeployDevice); + break; + case "no-device": + this.telemetryAI.trackFeatureUsage( + errorCommandDeployWithoutDevice, + ); + if ( + device === CONSTANTS.DEVICE_NAME.CPX || + device === CONSTANTS.DEVICE_NAME.CLUE + ) { + vscode.window + .showErrorMessage( + CONSTANTS.ERROR.NO_DEVICE, + DialogResponses.HELP, + ) + .then((selection: vscode.MessageItem | undefined) => { + if (selection === DialogResponses.HELP) { + const okAction = () => { + let helpLink: string; + let helpTelemetryEvent: string; + if (device === CONSTANTS.DEVICE_NAME.CPX) { + helpLink = CONSTANTS.LINKS.CPX_HELP; + helpTelemetryEvent = + TelemetryEventName.CPX_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; + } else if ( + device === CONSTANTS.DEVICE_NAME.CLUE + ) { + helpLink = CONSTANTS.LINKS.CLUE_HELP; + helpTelemetryEvent = + TelemetryEventName.CLUE_CLICK_DIALOG_HELP_DEPLOY_TO_DEVICE; + } + open(helpLink); + this.telemetryAI.trackFeatureUsage( + helpTelemetryEvent, + ); + }; + utils.showPrivacyModal( + okAction, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT, + ); + } + }); + } else if (device === CONSTANTS.DEVICE_NAME.MICROBIT) { + vscode.window.showErrorMessage(CONSTANTS.ERROR.NO_DEVICE); + } + break; + case "low-python-version": + vscode.window.showErrorMessage( + CONSTANTS.ERROR.LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT, + ); + break; + default: + console.log( + `Non-state JSON output from the process : ${message}`, + ); + break; + } + }; - public getTelemetryEventsForOpenSimulator = (device: string) => { - let openSimulatorTelemetryEvent: string; - let openSimulatorPerformanceTelemetryEvent: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - openSimulatorTelemetryEvent = - TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; - openSimulatorPerformanceTelemetryEvent = - TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - openSimulatorTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; - openSimulatorPerformanceTelemetryEvent = - TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - openSimulatorTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; - openSimulatorPerformanceTelemetryEvent = - TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; - break; - } - return { - openSimulatorTelemetryEvent, - openSimulatorPerformanceTelemetryEvent, - }; - }; + public getTelemetryEventsForOpenSimulator = (device: string) => { + let openSimulatorTelemetryEvent: string; + let openSimulatorPerformanceTelemetryEvent: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + openSimulatorTelemetryEvent = + TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; + openSimulatorPerformanceTelemetryEvent = + TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + openSimulatorTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; + openSimulatorPerformanceTelemetryEvent = + TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + openSimulatorTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; + openSimulatorPerformanceTelemetryEvent = + TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; + break; + } + return { + openSimulatorTelemetryEvent, + openSimulatorPerformanceTelemetryEvent, + }; + }; - public getTelemetryEventsForNewFile = (device: string) => { - let newFileTelemetryEvent: string; - let newFilePerformanceTelemetryEvent: string; - switch (device) { - case CONSTANTS.DEVICE_NAME.CPX: - newFileTelemetryEvent = - TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; - newFilePerformanceTelemetryEvent = - TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.MICROBIT: - newFileTelemetryEvent = - TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; - newFilePerformanceTelemetryEvent = - TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; - break; - case CONSTANTS.DEVICE_NAME.CLUE: - newFileTelemetryEvent = - TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; - newFilePerformanceTelemetryEvent = - TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; - break; - } - return { - newFileTelemetryEvent, - newFilePerformanceTelemetryEvent, - }; - }; + public getTelemetryEventsForNewFile = (device: string) => { + let newFileTelemetryEvent: string; + let newFilePerformanceTelemetryEvent: string; + switch (device) { + case CONSTANTS.DEVICE_NAME.CPX: + newFileTelemetryEvent = + TelemetryEventName.CPX_COMMAND_OPEN_SIMULATOR; + newFilePerformanceTelemetryEvent = + TelemetryEventName.CPX_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.MICROBIT: + newFileTelemetryEvent = + TelemetryEventName.MICROBIT_COMMAND_OPEN_SIMULATOR; + newFilePerformanceTelemetryEvent = + TelemetryEventName.MICROBIT_PERFORMANCE_OPEN_SIMULATOR; + break; + case CONSTANTS.DEVICE_NAME.CLUE: + newFileTelemetryEvent = + TelemetryEventName.CLUE_COMMAND_OPEN_SIMULATOR; + newFilePerformanceTelemetryEvent = + TelemetryEventName.CLUE_PERFORMANCE_OPEN_SIMULATOR; + break; + } + return { + newFileTelemetryEvent, + newFilePerformanceTelemetryEvent, + }; + }; } diff --git a/Source/service/webviewService.ts b/Source/service/webviewService.ts index 2b6add591..5d05122ee 100644 --- a/Source/service/webviewService.ts +++ b/Source/service/webviewService.ts @@ -6,47 +6,46 @@ import { DeviceSelectionService } from "./deviceSelectionService"; // Manages different type of webview export class WebviewService { - private tutorialPanel: vscode.WebviewPanel | undefined; - private context: vscode.ExtensionContext; - private deviceSelectionService: DeviceSelectionService; + private tutorialPanel: vscode.WebviewPanel | undefined; + private context: vscode.ExtensionContext; + private deviceSelectionService: DeviceSelectionService; - constructor( - context: vscode.ExtensionContext, - deviceSelectionService: DeviceSelectionService - ) { - this.context = context; - this.deviceSelectionService = deviceSelectionService; - } + constructor( + context: vscode.ExtensionContext, + deviceSelectionService: DeviceSelectionService, + ) { + this.context = context; + this.deviceSelectionService = deviceSelectionService; + } - public openTutorialPanel() { - if (this.tutorialPanel) { - this.tutorialPanel.reveal(vscode.ViewColumn.Beside); - } else { - this.createTutorialPanel(); - } - } + public openTutorialPanel() { + if (this.tutorialPanel) { + this.tutorialPanel.reveal(vscode.ViewColumn.Beside); + } else { + this.createTutorialPanel(); + } + } - public getWebviewContent( - webviewType: string, - hasDevice: boolean, - panel: vscode.WebviewPanel - ) { - const onDiskPath = vscode.Uri.file( - this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.SIMULATOR) - ); - const scriptSrc = panel.webview.asWebviewUri(onDiskPath); + public getWebviewContent( + webviewType: string, + hasDevice: boolean, + panel: vscode.WebviewPanel, + ) { + const onDiskPath = vscode.Uri.file( + this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.SIMULATOR), + ); + const scriptSrc = panel.webview.asWebviewUri(onDiskPath); - const vscodeImportPath = vscode.Uri.file( - this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.VSCODE_API) - ); - const vscodeImportPathSrc = panel.webview.asWebviewUri( - vscodeImportPath - ); + const vscodeImportPath = vscode.Uri.file( + this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.VSCODE_API), + ); + const vscodeImportPathSrc = + panel.webview.asWebviewUri(vscodeImportPath); - const attributeString = this.getAttributeString(webviewType, hasDevice); - const nonce = getNonce(); + const attributeString = this.getAttributeString(webviewType, hasDevice); + const nonce = getNonce(); - return ` + return ` @@ -64,49 +63,49 @@ export class WebviewService { < /html>`; - } + } - private createTutorialPanel() { - this.tutorialPanel = vscode.window.createWebviewPanel( - CONSTANTS.WEBVIEW_TYPE.TUTORIAL, - CONSTANTS.LABEL.WEBVIEW_PANEL, - { preserveFocus: true, viewColumn: vscode.ViewColumn.One }, - { - enableScripts: true, - retainContextWhenHidden: true, - } - ); - this.tutorialPanel.webview.html = this.getWebviewContent( - WEBVIEW_TYPES.GETTING_STARTED, - false, - this.tutorialPanel - ); - this.tutorialPanel.onDidDispose(() => { - this.disposeTutorialPanel(); - }); - } + private createTutorialPanel() { + this.tutorialPanel = vscode.window.createWebviewPanel( + CONSTANTS.WEBVIEW_TYPE.TUTORIAL, + CONSTANTS.LABEL.WEBVIEW_PANEL, + { preserveFocus: true, viewColumn: vscode.ViewColumn.One }, + { + enableScripts: true, + retainContextWhenHidden: true, + }, + ); + this.tutorialPanel.webview.html = this.getWebviewContent( + WEBVIEW_TYPES.GETTING_STARTED, + false, + this.tutorialPanel, + ); + this.tutorialPanel.onDidDispose(() => { + this.disposeTutorialPanel(); + }); + } - private disposeTutorialPanel() { - this.tutorialPanel = undefined; - } - private getAttributeString(webviewType: string, hasDevice: boolean) { - if (hasDevice) { - return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} ${ - WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE - }=${this.deviceSelectionService.getCurrentActiveDevice()} `; - } else { - return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} `; - } - } + private disposeTutorialPanel() { + this.tutorialPanel = undefined; + } + private getAttributeString(webviewType: string, hasDevice: boolean) { + if (hasDevice) { + return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} ${ + WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE + }=${this.deviceSelectionService.getCurrentActiveDevice()} `; + } else { + return `${WEBVIEW_ATTRIBUTES_KEY.TYPE}=${webviewType} `; + } + } } // Nonce generator taken from vscode extension samples found here: // https://github.com/microsoft/vscode-extension-samples/blob/master/custom-editor-sample/src/util.ts function getNonce() { - let text = ""; - const possible = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - for (let i = 0; i < 32; i++) { - text += possible.charAt(Math.floor(Math.random() * possible.length)); - } - return text; + let text = ""; + const possible = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + for (let i = 0; i < 32; i++) { + text += possible.charAt(Math.floor(Math.random() * possible.length)); + } + return text; } diff --git a/Source/simulatorDebugConfigurationProvider.ts b/Source/simulatorDebugConfigurationProvider.ts index 2b6725f22..44ffa2fb1 100644 --- a/Source/simulatorDebugConfigurationProvider.ts +++ b/Source/simulatorDebugConfigurationProvider.ts @@ -6,79 +6,80 @@ import { CONSTANTS, DialogResponses } from "./constants"; import { getServerPortConfig } from "./extension_utils/utils"; export class SimulatorDebugConfigurationProvider - implements vscode.DebugConfigurationProvider { - public deviceSimulatorExpressDebug: boolean; + implements vscode.DebugConfigurationProvider +{ + public deviceSimulatorExpressDebug: boolean; - constructor(private pathToScript: string) { - this.deviceSimulatorExpressDebug = false; - } + constructor(private pathToScript: string) { + this.deviceSimulatorExpressDebug = false; + } - /** - * Modify the debug configuration just before a debug session is being launched. - */ - public resolveDebugConfiguration( - folder: vscode.WorkspaceFolder | undefined, - config: vscode.DebugConfiguration, - token?: vscode.CancellationToken - ): vscode.ProviderResult { - const activeTextEditor = vscode.window.activeTextEditor; + /** + * Modify the debug configuration just before a debug session is being launched. + */ + public resolveDebugConfiguration( + folder: vscode.WorkspaceFolder | undefined, + config: vscode.DebugConfiguration, + token?: vscode.CancellationToken, + ): vscode.ProviderResult { + const activeTextEditor = vscode.window.activeTextEditor; - // Create a configuration if no launch.json exists or if it's empty - if (!config.type && !config.request && !config.name) { - if ( - activeTextEditor && - activeTextEditor.document.languageId === "python" - ) { - config.type = "deviceSimulatorExpress"; - config.request = "launch"; - config.name = "Device Simulator Express Debugger"; - config.console = "integratedTerminal"; - } - } - // Check config type - if (config.type === CONSTANTS.DEBUG_CONFIGURATION_TYPE) { - this.deviceSimulatorExpressDebug = true; - if (activeTextEditor) { - const currentFilePath = activeTextEditor.document.fileName; + // Create a configuration if no launch.json exists or if it's empty + if (!config.type && !config.request && !config.name) { + if ( + activeTextEditor && + activeTextEditor.document.languageId === "python" + ) { + config.type = "deviceSimulatorExpress"; + config.request = "launch"; + config.name = "Device Simulator Express Debugger"; + config.console = "integratedTerminal"; + } + } + // Check config type + if (config.type === CONSTANTS.DEBUG_CONFIGURATION_TYPE) { + this.deviceSimulatorExpressDebug = true; + if (activeTextEditor) { + const currentFilePath = activeTextEditor.document.fileName; - // Check file type and name - if (!(activeTextEditor.document.languageId === "python")) { - return vscode.window - .showErrorMessage( - CONSTANTS.ERROR.INVALID_FILE_EXTENSION_DEBUG - ) - .then(() => { - return undefined; // Abort launch - }); - } - // Set the new configuration type so the python debugger can take over - config.type = "python"; - // Set process_user_code path as program - config.program = this.pathToScript; - // Set user's code path and server's port as args - config.args = [ - currentFilePath, - getServerPortConfig().toString(), - ]; - // Set rules - config.rules = [ - { path: this.pathToScript, include: false }, - { - module: "adafruit_circuitplayground", - include: false, - }, - { module: "playsound", include: false }, - ]; - } - } - // Abort / show error message if can't find process_user_code.py - if (!config.program) { - return vscode.window - .showErrorMessage(CONSTANTS.ERROR.NO_PROGRAM_FOUND_DEBUG) - .then(() => { - return undefined; // Abort launch - }); - } - return config; - } + // Check file type and name + if (!(activeTextEditor.document.languageId === "python")) { + return vscode.window + .showErrorMessage( + CONSTANTS.ERROR.INVALID_FILE_EXTENSION_DEBUG, + ) + .then(() => { + return undefined; // Abort launch + }); + } + // Set the new configuration type so the python debugger can take over + config.type = "python"; + // Set process_user_code path as program + config.program = this.pathToScript; + // Set user's code path and server's port as args + config.args = [ + currentFilePath, + getServerPortConfig().toString(), + ]; + // Set rules + config.rules = [ + { path: this.pathToScript, include: false }, + { + module: "adafruit_circuitplayground", + include: false, + }, + { module: "playsound", include: false }, + ]; + } + } + // Abort / show error message if can't find process_user_code.py + if (!config.program) { + return vscode.window + .showErrorMessage(CONSTANTS.ERROR.NO_PROGRAM_FOUND_DEBUG) + .then(() => { + return undefined; // Abort launch + }); + } + return config; + } } diff --git a/Source/telemetry/getPackageInfo.ts b/Source/telemetry/getPackageInfo.ts index cd8d42ab7..e4652d912 100644 --- a/Source/telemetry/getPackageInfo.ts +++ b/Source/telemetry/getPackageInfo.ts @@ -3,55 +3,53 @@ import * as path from "path"; import * as vscode from "vscode"; export interface IPackageJson { - name?: string; - version?: string; - instrumentationKey: string; + name?: string; + version?: string; + instrumentationKey: string; } const getPackagePath = (context: vscode.ExtensionContext) => { - const onDiskPath = vscode.Uri.file( - path.join(context.extensionPath, "package.json") - ); - const packagePath = onDiskPath.with({ scheme: "vscode-resource" }); + const onDiskPath = vscode.Uri.file( + path.join(context.extensionPath, "package.json"), + ); + const packagePath = onDiskPath.with({ scheme: "vscode-resource" }); - return packagePath; + return packagePath; }; -export default function getPackageInfo( - context: vscode.ExtensionContext -): { - extensionName: string; - extensionVersion: string; - instrumentationKey: string; +export default function getPackageInfo(context: vscode.ExtensionContext): { + extensionName: string; + extensionVersion: string; + instrumentationKey: string; } { - let packageJson: IPackageJson; - const packagePath = getPackagePath(context); - - try { - packageJson = JSON.parse(fs.readFileSync(packagePath.fsPath, "utf8")); - } catch (error) { - console.error(`Failed to read from package.json: ${error}`); - throw new Error(`Failed to read from package.json: ${error}`); - } - - const extensionName: string | undefined = packageJson.name; - const extensionVersion: string | undefined = packageJson.version; - const instrumentationKey: string | undefined = - packageJson.instrumentationKey; - - if (!extensionName) { - throw new Error( - "Extension's package.json is missing instrumentation key." - ); - } - - if (!extensionVersion) { - throw new Error("Extension's package.json is missing version."); - } - - if (!extensionVersion) { - throw new Error("Extension's package.json is missing version."); - } - - return { extensionName, extensionVersion, instrumentationKey }; + let packageJson: IPackageJson; + const packagePath = getPackagePath(context); + + try { + packageJson = JSON.parse(fs.readFileSync(packagePath.fsPath, "utf8")); + } catch (error) { + console.error(`Failed to read from package.json: ${error}`); + throw new Error(`Failed to read from package.json: ${error}`); + } + + const extensionName: string | undefined = packageJson.name; + const extensionVersion: string | undefined = packageJson.version; + const instrumentationKey: string | undefined = + packageJson.instrumentationKey; + + if (!extensionName) { + throw new Error( + "Extension's package.json is missing instrumentation key.", + ); + } + + if (!extensionVersion) { + throw new Error("Extension's package.json is missing version."); + } + + if (!extensionVersion) { + throw new Error("Extension's package.json is missing version."); + } + + return { extensionName, extensionVersion, instrumentationKey }; } diff --git a/Source/telemetry/telemetryAI.ts b/Source/telemetry/telemetryAI.ts index 4dbf5ca41..56c8cb1f2 100644 --- a/Source/telemetry/telemetryAI.ts +++ b/Source/telemetry/telemetryAI.ts @@ -4,80 +4,76 @@ import getPackageInfo from "./getPackageInfo"; // tslint:disable-next-line:export-name export default class TelemetryAI { - private static telemetryReporter: TelemetryReporter; - private static enableTelemetry: boolean | undefined; + private static telemetryReporter: TelemetryReporter; + private static enableTelemetry: boolean | undefined; - constructor(vscodeContext: vscode.ExtensionContext) { - TelemetryAI.telemetryReporter = this.createTelemetryReporter( - vscodeContext - ); - TelemetryAI.enableTelemetry = vscode.workspace - .getConfiguration() - .get("telemetry.enableTelemetry"); - if (TelemetryAI.enableTelemetry === undefined) { - TelemetryAI.enableTelemetry = true; - } - } + constructor(vscodeContext: vscode.ExtensionContext) { + TelemetryAI.telemetryReporter = + this.createTelemetryReporter(vscodeContext); + TelemetryAI.enableTelemetry = vscode.workspace + .getConfiguration() + .get("telemetry.enableTelemetry"); + if (TelemetryAI.enableTelemetry === undefined) { + TelemetryAI.enableTelemetry = true; + } + } - public getExtensionName(context: vscode.ExtensionContext): string { - const { extensionName } = getPackageInfo(context); - return extensionName; - } + public getExtensionName(context: vscode.ExtensionContext): string { + const { extensionName } = getPackageInfo(context); + return extensionName; + } - public getExtensionVersionNumber(context: vscode.ExtensionContext): string { - const { extensionVersion } = getPackageInfo(context); - return extensionVersion; - } + public getExtensionVersionNumber(context: vscode.ExtensionContext): string { + const { extensionVersion } = getPackageInfo(context); + return extensionVersion; + } - public sendTelemetryIfEnabled( - eventName: string, - properties?: { [key: string]: string }, - measurements?: { [key: string]: number } - ) { - if (TelemetryAI.enableTelemetry) { - TelemetryAI.telemetryReporter.sendTelemetryEvent( - eventName, - properties, - measurements - ); - } - } + public sendTelemetryIfEnabled( + eventName: string, + properties?: { [key: string]: string }, + measurements?: { [key: string]: number }, + ) { + if (TelemetryAI.enableTelemetry) { + TelemetryAI.telemetryReporter.sendTelemetryEvent( + eventName, + properties, + measurements, + ); + } + } - public trackFeatureUsage( - eventName: string, - eventProperties?: { [key: string]: string } - ) { - this.sendTelemetryIfEnabled(eventName, eventProperties); - } + public trackFeatureUsage( + eventName: string, + eventProperties?: { [key: string]: string }, + ) { + this.sendTelemetryIfEnabled(eventName, eventProperties); + } - public runWithLatencyMeasure( - functionToRun: () => void, - eventName: string - ): void { - const numberOfNanosecondsInSecond: number = 1000000000; - const startTime: number = Number(process.hrtime.bigint()); - functionToRun(); - const latency: number = Number(process.hrtime.bigint()) - startTime; - const measurement = { - duration: latency / numberOfNanosecondsInSecond, - }; - this.sendTelemetryIfEnabled(eventName, {}, measurement); - } + public runWithLatencyMeasure( + functionToRun: () => void, + eventName: string, + ): void { + const numberOfNanosecondsInSecond: number = 1000000000; + const startTime: number = Number(process.hrtime.bigint()); + functionToRun(); + const latency: number = Number(process.hrtime.bigint()) - startTime; + const measurement = { + duration: latency / numberOfNanosecondsInSecond, + }; + this.sendTelemetryIfEnabled(eventName, {}, measurement); + } - private createTelemetryReporter( - context: vscode.ExtensionContext - ): TelemetryReporter { - const { - extensionName, - extensionVersion, - instrumentationKey, - } = getPackageInfo(context); - const reporter: TelemetryReporter = new TelemetryReporter( - extensionName, - extensionVersion, - instrumentationKey - ); - context.subscriptions.push(reporter); - return reporter; - } + private createTelemetryReporter( + context: vscode.ExtensionContext, + ): TelemetryReporter { + const { extensionName, extensionVersion, instrumentationKey } = + getPackageInfo(context); + const reporter: TelemetryReporter = new TelemetryReporter( + extensionName, + extensionVersion, + instrumentationKey, + ); + context.subscriptions.push(reporter); + return reporter; + } } diff --git a/Source/usbDetector.ts b/Source/usbDetector.ts index 6d28bb9fb..a0151d7fc 100644 --- a/Source/usbDetector.ts +++ b/Source/usbDetector.ts @@ -12,101 +12,101 @@ import * as utils from "./extension_utils/utils"; import { SerialMonitor } from "./serialMonitor"; export class UsbDetector { - public static getInstance(): UsbDetector { - if (!UsbDetector._instance) { - UsbDetector._instance = new UsbDetector(); - } - return UsbDetector._instance; - } - - private static _instance: UsbDetector; - - private _usbDetector: any; - - private _boardDescriptors: any = null; - - private _extensionRoot: string = null; - - private constructor() {} - - public initialize(extensionRoot: string) { - this._extensionRoot = extensionRoot; - } - - public async startListening() { - const workspaceConfig = vscode.workspace.getConfiguration(); - const enableUSBDetection = workspaceConfig.get( - CONFIG_KEYS.ENABLE_USB_DETECTION - ); - - if (os.platform() === "linux" || !enableUSBDetection) { - return; - } - this._usbDetector = require("usb-native").detector; - - if (!this._usbDetector) { - return; - } - - if (this._extensionRoot === null) { - throw new Error("UsbDetector should be initialized before using."); - } - - this._usbDetector.on("add", async (device: any) => { - if (device.vendorId && device.productId) { - const deviceDescriptor = this.getUsbDeviceDescriptor( - utils.convertToHex(device.vendorId, 4), - utils.convertToHex(device.productId, 4), - this._extensionRoot - ); - - // Not supported device for discovery - if (!deviceDescriptor) { - return; - } - - const boardKey = `${deviceDescriptor.package}:${deviceDescriptor.architecture}:${deviceDescriptor.id}`; - // Log that a board was detected - if (!SerialMonitor.getInstance().initialized) { - SerialMonitor.getInstance().initialize(); - } - } - }); - } - - public stopListening() { - if (this._usbDetector) { - this._usbDetector.stopMonitoring(); - } - } - - private getUsbDeviceDescriptor( - vendorId: string, - productId: string, - extensionRoot: string - ): any { - if (!this._boardDescriptors) { - this._boardDescriptors = []; - const fileContent = fs.readFileSync( - path.join(extensionRoot, "misc", "usbmapping.json"), - "utf8" - ); - const boardIndexes: [] = JSON.parse(fileContent); - boardIndexes.forEach((boardIndex: any) => { - boardIndex.boards.forEach((board: any) => { - board.indexFile = boardIndex.index_file; - }); - this._boardDescriptors = this._boardDescriptors.concat( - boardIndex.boards - ); - }); - } - return this._boardDescriptors.find((obj: any) => { - return ( - obj.vid === vendorId && - (obj.pid === productId || - (obj.pid.indexOf && obj.pid.indexOf(productId) >= 0)) - ); - }); - } + public static getInstance(): UsbDetector { + if (!UsbDetector._instance) { + UsbDetector._instance = new UsbDetector(); + } + return UsbDetector._instance; + } + + private static _instance: UsbDetector; + + private _usbDetector: any; + + private _boardDescriptors: any = null; + + private _extensionRoot: string = null; + + private constructor() {} + + public initialize(extensionRoot: string) { + this._extensionRoot = extensionRoot; + } + + public async startListening() { + const workspaceConfig = vscode.workspace.getConfiguration(); + const enableUSBDetection = workspaceConfig.get( + CONFIG_KEYS.ENABLE_USB_DETECTION, + ); + + if (os.platform() === "linux" || !enableUSBDetection) { + return; + } + this._usbDetector = require("usb-native").detector; + + if (!this._usbDetector) { + return; + } + + if (this._extensionRoot === null) { + throw new Error("UsbDetector should be initialized before using."); + } + + this._usbDetector.on("add", async (device: any) => { + if (device.vendorId && device.productId) { + const deviceDescriptor = this.getUsbDeviceDescriptor( + utils.convertToHex(device.vendorId, 4), + utils.convertToHex(device.productId, 4), + this._extensionRoot, + ); + + // Not supported device for discovery + if (!deviceDescriptor) { + return; + } + + const boardKey = `${deviceDescriptor.package}:${deviceDescriptor.architecture}:${deviceDescriptor.id}`; + // Log that a board was detected + if (!SerialMonitor.getInstance().initialized) { + SerialMonitor.getInstance().initialize(); + } + } + }); + } + + public stopListening() { + if (this._usbDetector) { + this._usbDetector.stopMonitoring(); + } + } + + private getUsbDeviceDescriptor( + vendorId: string, + productId: string, + extensionRoot: string, + ): any { + if (!this._boardDescriptors) { + this._boardDescriptors = []; + const fileContent = fs.readFileSync( + path.join(extensionRoot, "misc", "usbmapping.json"), + "utf8", + ); + const boardIndexes: [] = JSON.parse(fileContent); + boardIndexes.forEach((boardIndex: any) => { + boardIndex.boards.forEach((board: any) => { + board.indexFile = boardIndex.index_file; + }); + this._boardDescriptors = this._boardDescriptors.concat( + boardIndex.boards, + ); + }); + } + return this._boardDescriptors.find((obj: any) => { + return ( + obj.vid === vendorId && + (obj.pid === productId || + (obj.pid.indexOf && obj.pid.indexOf(productId) >= 0)) + ); + }); + } } diff --git a/Source/view/App.spec.tsx b/Source/view/App.spec.tsx index 66d6fc9d5..2864ceeab 100644 --- a/Source/view/App.spec.tsx +++ b/Source/view/App.spec.tsx @@ -5,24 +5,24 @@ import * as testRenderer from "react-test-renderer"; import App from "./App"; describe("App component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + , + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div, + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/App.tsx b/Source/view/App.tsx index 3e540c8d9..1ce673dc0 100644 --- a/Source/view/App.tsx +++ b/Source/view/App.tsx @@ -4,98 +4,98 @@ import * as React from "react"; import "./App.css"; import { - DEVICE_LIST_KEY, - VIEW_STATE, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_ATTRIBUTES_KEY, - WEBVIEW_TYPES, + DEVICE_LIST_KEY, + VIEW_STATE, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_ATTRIBUTES_KEY, + WEBVIEW_TYPES, } from "./constants"; import { Device } from "./container/device/Device"; import { ViewStateContext } from "./context"; import { GettingStartedPage } from "./pages/gettingStarted"; interface IState { - currentDevice: string; - viewState: VIEW_STATE; - type?: WEBVIEW_TYPES; + currentDevice: string; + viewState: VIEW_STATE; + type?: WEBVIEW_TYPES; } const defaultState = { - currentDevice: DEVICE_LIST_KEY.CPX, - viewState: VIEW_STATE.RUNNING, - type: undefined, + currentDevice: DEVICE_LIST_KEY.CPX, + viewState: VIEW_STATE.RUNNING, + type: undefined, }; class App extends React.Component<{}, IState> { - constructor() { - super({}); - this.state = defaultState; - } - componentDidMount() { - if (document.currentScript) { - const webviewTypeAttribute = document.currentScript.getAttribute( - WEBVIEW_ATTRIBUTES_KEY.TYPE - ) as WEBVIEW_TYPES; - if (webviewTypeAttribute) { - this.setState({ type: webviewTypeAttribute }); - } - if (webviewTypeAttribute === WEBVIEW_TYPES.SIMULATOR) { - const initialDevice = document.currentScript.getAttribute( - WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE - ); + constructor() { + super({}); + this.state = defaultState; + } + componentDidMount() { + if (document.currentScript) { + const webviewTypeAttribute = document.currentScript.getAttribute( + WEBVIEW_ATTRIBUTES_KEY.TYPE, + ) as WEBVIEW_TYPES; + if (webviewTypeAttribute) { + this.setState({ type: webviewTypeAttribute }); + } + if (webviewTypeAttribute === WEBVIEW_TYPES.SIMULATOR) { + const initialDevice = document.currentScript.getAttribute( + WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE, + ); - if (initialDevice) { - this.setState({ currentDevice: initialDevice }); - window.addEventListener("message", this.handleMessage); - } - } - } - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } + if (initialDevice) { + this.setState({ currentDevice: initialDevice }); + window.addEventListener("message", this.handleMessage); + } + } + } + } + componentWillUnmount() { + window.removeEventListener("message", this.handleMessage); + } - render() { - return ( -
-
- - {this.loadContent()} - -
-
- ); - } - loadContent = () => { - console.log(this.state.type); - switch (this.state.type) { - case WEBVIEW_TYPES.GETTING_STARTED: - return ; - case WEBVIEW_TYPES.SIMULATOR: - return ( - - ); - } - return; - }; + render() { + return ( +
+
+ + {this.loadContent()} + +
+
+ ); + } + loadContent = () => { + console.log(this.state.type); + switch (this.state.type) { + case WEBVIEW_TYPES.GETTING_STARTED: + return ; + case WEBVIEW_TYPES.SIMULATOR: + return ( + + ); + } + return; + }; - handleMessage = (event: any): void => { - const message = event.data; + handleMessage = (event: any): void => { + const message = event.data; - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE: - if (message.active_device !== this.state.currentDevice) { - this.setState({ currentDevice: message.active_device }); - } - break; - case VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE: - this.setState({ viewState: VIEW_STATE.RUNNING }); - break; - case VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE: - this.setState({ viewState: VIEW_STATE.PAUSE }); - break; - } - }; + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.SET_DEVICE: + if (message.active_device !== this.state.currentDevice) { + this.setState({ currentDevice: message.active_device }); + } + break; + case VSCODE_MESSAGES_TO_WEBVIEW.RUN_DEVICE: + this.setState({ viewState: VIEW_STATE.RUNNING }); + break; + case VSCODE_MESSAGES_TO_WEBVIEW.PAUSE_DEVICE: + this.setState({ viewState: VIEW_STATE.PAUSE }); + break; + } + }; } export default App; diff --git a/Source/view/components/Button.tsx b/Source/view/components/Button.tsx index db5034b9d..9b37ff7ce 100644 --- a/Source/view/components/Button.tsx +++ b/Source/view/components/Button.tsx @@ -2,33 +2,33 @@ import * as React from "react"; import "../styles/Button.css"; export interface IButtonProps { - label: string; - image: any; - focusable: boolean; - styleLabel: string; - width: number; - onClick: (event: React.MouseEvent) => void; + label: string; + image: any; + focusable: boolean; + styleLabel: string; + width: number; + onClick: (event: React.MouseEvent) => void; } // Functional Component render -const Button: React.FC = props => { - const iconSvg: SVGElement = props.image as SVGElement; - const buttonStyle = { width: props.width }; - const tabIndex = props.focusable ? 0 : -1; +const Button: React.FC = (props) => { + const iconSvg: SVGElement = props.image as SVGElement; + const buttonStyle = { width: props.width }; + const tabIndex = props.focusable ? 0 : -1; - return ( - - ); + return ( + + ); }; export default Button; diff --git a/Source/view/components/Dropdown.tsx b/Source/view/components/Dropdown.tsx index e5506383a..f56492e49 100644 --- a/Source/view/components/Dropdown.tsx +++ b/Source/view/components/Dropdown.tsx @@ -5,31 +5,31 @@ import * as React from "react"; import "../styles/Dropdown.css"; export interface IDropdownProps { - options: string[]; - // styleLabel: string; - name: string; - onSelect?: (event: React.ChangeEvent) => void; + options: string[]; + // styleLabel: string; + name: string; + onSelect?: (event: React.ChangeEvent) => void; } -export const Dropdown: React.FC = props => { - return ( - - ); +export const Dropdown: React.FC = (props) => { + return ( + + ); }; const renderOptions = (options: string[]) => { - return options.map((name, index) => { - return ( - - ); - }); + return options.map((name, index) => { + return ( + + ); + }); }; diff --git a/Source/view/components/clue/Clue.spec.tsx b/Source/view/components/clue/Clue.spec.tsx index 55d065bce..c0364154c 100644 --- a/Source/view/components/clue/Clue.spec.tsx +++ b/Source/view/components/clue/Clue.spec.tsx @@ -5,25 +5,25 @@ import * as testRenderer from "react-test-renderer"; import { Clue } from "./Clue"; describe("Clue component", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + , + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div, + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/components/clue/Clue.tsx b/Source/view/components/clue/Clue.tsx index 552ff54c3..e587a23bc 100644 --- a/Source/view/components/clue/Clue.tsx +++ b/Source/view/components/clue/Clue.tsx @@ -3,10 +3,10 @@ import * as React from "react"; import { - GESTURES_CLUE, - SENSOR_LIST, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, + GESTURES_CLUE, + SENSOR_LIST, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_MESSAGES, } from "../../constants"; import "../../styles/Simulator.css"; import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; @@ -17,142 +17,142 @@ import { ClueSimulator } from "./ClueSimulator"; // Component grouping the functionality for micro:bit functionalities interface IState { - sensors: { [key: string]: number }; - currentSelectedGesture: string; + sensors: { [key: string]: number }; + currentSelectedGesture: string; } const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT_R]: 0, - [SENSOR_LIST.LIGHT_G]: 0, - [SENSOR_LIST.LIGHT_B]: 0, - [SENSOR_LIST.LIGHT_C]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - [SENSOR_LIST.HUMIDITY]: 0, - [SENSOR_LIST.PRESSURE]: 1013, - [SENSOR_LIST.PROXIMITY]: 0, - [SENSOR_LIST.GYRO_X]: 0, - [SENSOR_LIST.GYRO_Y]: 0, - [SENSOR_LIST.GYRO_Z]: 0, - [SENSOR_LIST.MAGNET_X]: 0, - [SENSOR_LIST.MAGNET_Y]: 0, - [SENSOR_LIST.MAGNET_Z]: 0, - }, - currentSelectedGesture: GESTURES_CLUE[0], + sensors: { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT_R]: 0, + [SENSOR_LIST.LIGHT_G]: 0, + [SENSOR_LIST.LIGHT_B]: 0, + [SENSOR_LIST.LIGHT_C]: 0, + [SENSOR_LIST.MOTION_X]: 0, + [SENSOR_LIST.MOTION_Y]: 0, + [SENSOR_LIST.MOTION_Z]: 0, + [SENSOR_LIST.HUMIDITY]: 0, + [SENSOR_LIST.PRESSURE]: 1013, + [SENSOR_LIST.PROXIMITY]: 0, + [SENSOR_LIST.GYRO_X]: 0, + [SENSOR_LIST.GYRO_Y]: 0, + [SENSOR_LIST.GYRO_Z]: 0, + [SENSOR_LIST.MAGNET_X]: 0, + [SENSOR_LIST.MAGNET_Y]: 0, + [SENSOR_LIST.MAGNET_Z]: 0, + }, + currentSelectedGesture: GESTURES_CLUE[0], }; export class Clue extends React.Component<{}, IState> { - state = DEFAULT_STATE; + state = DEFAULT_STATE; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + handleMessage = (event: any): void => { + const message = event.data; - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; - updateGesture = (event: React.ChangeEvent) => { - this.setState({ currentSelectedGesture: event.target.value }); - }; - sendGesture = (isActive: boolean) => { - if (this.state.currentSelectedGesture) { - if (isActive) { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: this.state.currentSelectedGesture, - }); - } else { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: "", - }); - } - } - }; + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.RESET: + this.setState({ ...DEFAULT_STATE }); + break; + } + }; + render() { + return ( + + + + + ); + } + updateSensor = (sensor: SENSOR_LIST, value: number) => { + this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); + }; + updateGesture = (event: React.ChangeEvent) => { + this.setState({ currentSelectedGesture: event.target.value }); + }; + sendGesture = (isActive: boolean) => { + if (this.state.currentSelectedGesture) { + if (isActive) { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: this.state.currentSelectedGesture, + }); + } else { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: "", + }); + } + } + }; } const CLUE_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - label: CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.LEDS, - image: TOOLBAR_SVG.NEO_PIXEL_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.TEMPERATURE, - image: TOOLBAR_SVG.TEMPERATURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.LIGHT, - image: TOOLBAR_SVG.LIGHT_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, - image: TOOLBAR_SVG.MOTION_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.HUMIDITY, - image: TOOLBAR_SVG.HUMIDITY_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.PRESSURE, - image: TOOLBAR_SVG.PRESSURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.PROXIMITY, - image: TOOLBAR_SVG.PROXIMITY_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GESTURE, - image: TOOLBAR_SVG.GESTURE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GYROSCOPE, - image: TOOLBAR_SVG.GYROSCOPE_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, - image: TOOLBAR_SVG.MAGNET_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.GPIO, - image: TOOLBAR_SVG.GPIO_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.SOUND, - image: TOOLBAR_SVG.SOUND_SVG, - }, - { - label: CLUE_TOOLBAR_ICON_ID.SPEAKER, - image: TOOLBAR_SVG.SPEAKER_SVG, - }, + { + label: CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, + image: TOOLBAR_SVG.PUSH_BUTTON_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.LEDS, + image: TOOLBAR_SVG.NEO_PIXEL_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.TEMPERATURE, + image: TOOLBAR_SVG.TEMPERATURE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.LIGHT, + image: TOOLBAR_SVG.LIGHT_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, + image: TOOLBAR_SVG.MOTION_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.HUMIDITY, + image: TOOLBAR_SVG.HUMIDITY_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.PRESSURE, + image: TOOLBAR_SVG.PRESSURE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.PROXIMITY, + image: TOOLBAR_SVG.PROXIMITY_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.GESTURE, + image: TOOLBAR_SVG.GESTURE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.GYROSCOPE, + image: TOOLBAR_SVG.GYROSCOPE_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, + image: TOOLBAR_SVG.MAGNET_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.GPIO, + image: TOOLBAR_SVG.GPIO_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.SOUND, + image: TOOLBAR_SVG.SOUND_SVG, + }, + { + label: CLUE_TOOLBAR_ICON_ID.SPEAKER, + image: TOOLBAR_SVG.SPEAKER_SVG, + }, ]; diff --git a/Source/view/components/clue/ClueImage.tsx b/Source/view/components/clue/ClueImage.tsx index b3c3edcf2..9c02b6f21 100644 --- a/Source/view/components/clue/ClueImage.tsx +++ b/Source/view/components/clue/ClueImage.tsx @@ -8,149 +8,153 @@ import { ViewStateContext } from "../../context"; import { ClueSvg, IRefObject } from "./Clue_svg"; interface EventTriggers { - onMouseUp: (event: Event, buttonKey: string) => void; - onMouseDown: (event: Event, buttonKey: string) => void; - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; + onMouseUp: (event: Event, buttonKey: string) => void; + onMouseDown: (event: Event, buttonKey: string) => void; + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; } interface IProps { - eventTriggers: EventTriggers; - displayMessage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; + eventTriggers: EventTriggers; + displayMessage: string; + leds: { + neopixel: number[]; + isRedLedOn: boolean; + isWhiteLedOn: boolean; + }; } export enum BUTTONS_KEYS { - BTN_A = "BTN_A", - BTN_B = "BTN_B", - BTN_AB = "BTN_AB", + BTN_A = "BTN_A", + BTN_B = "BTN_B", + BTN_AB = "BTN_AB", } // Displays the SVG and call necessary svg modification. export class ClueImage extends React.Component { - private svgRef: React.RefObject = React.createRef(); - constructor(props: IProps) { - super(props); - } - componentDidMount() { - const svgElement = this.svgRef.current; - if (svgElement) { - setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); - this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); - } - } - componentDidUpdate() { - if (this.context === VIEW_STATE.PAUSE && this.svgRef.current) { - disableAllButtons(this.svgRef.current.getButtons()); - } else if (this.context === VIEW_STATE.RUNNING && this.svgRef.current) { - setupAllButtons( - this.props.eventTriggers, - this.svgRef.current.getButtons() - ); - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.eventTriggers.onKeyEvent(event, true, event.key); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.eventTriggers.onKeyEvent(event, false, event.key); - }; - render() { - return ( - - ); - } - public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { - const button = this.svgRef.current?.getButtons()[key].current; - if (button) { - button.focus(); - if (isActive) { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.KEYPRESSED - ); - } else { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.DEFAULT - ); - } - button.setAttribute("pressed", `${isActive}`); - button.setAttribute("aria-pressed", `${isActive}`); - } - } + private svgRef: React.RefObject = React.createRef(); + constructor(props: IProps) { + super(props); + } + componentDidMount() { + const svgElement = this.svgRef.current; + if (svgElement) { + setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); + this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); + } + } + componentDidUpdate() { + if (this.context === VIEW_STATE.PAUSE && this.svgRef.current) { + disableAllButtons(this.svgRef.current.getButtons()); + } else if (this.context === VIEW_STATE.RUNNING && this.svgRef.current) { + setupAllButtons( + this.props.eventTriggers, + this.svgRef.current.getButtons(), + ); + } + } + componentWillUnmount() { + window.document.removeEventListener("keydown", this.handleKeyDown); + window.document.removeEventListener("keyup", this.handleKeyUp); + } + setupKeyPresses = ( + onKeyEvent: ( + event: KeyboardEvent, + active: boolean, + key: string, + ) => void, + ) => { + window.document.addEventListener("keydown", this.handleKeyDown); + window.document.addEventListener("keyup", this.handleKeyUp); + }; + handleKeyDown = (event: KeyboardEvent) => { + const keyEvents = [event.key, event.code]; + // Don't listen to keydown events for the run button, restart button and enter key + if ( + !( + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) + ) + ) { + this.props.eventTriggers.onKeyEvent(event, true, event.key); + } + }; + handleKeyUp = (event: KeyboardEvent) => { + this.props.eventTriggers.onKeyEvent(event, false, event.key); + }; + render() { + return ( + + ); + } + public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { + const button = this.svgRef.current?.getButtons()[key].current; + if (button) { + button.focus(); + if (isActive) { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.KEYPRESSED, + ); + } else { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.DEFAULT, + ); + } + button.setAttribute("pressed", `${isActive}`); + button.setAttribute("aria-pressed", `${isActive}`); + } + } } ClueImage.contextType = ViewStateContext; const setupButton = ( - buttonElement: SVGRectElement, - eventTriggers: EventTriggers, - key: string + buttonElement: SVGRectElement, + eventTriggers: EventTriggers, + key: string, ) => { - buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); - buttonElement.onmousedown = e => { - buttonElement.focus(); - eventTriggers.onMouseDown(e, key); - }; - buttonElement.onmouseup = e => { - eventTriggers.onMouseUp(e, key); - }; + buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); + buttonElement.onmousedown = (e) => { + buttonElement.focus(); + eventTriggers.onMouseDown(e, key); + }; + buttonElement.onmouseup = (e) => { + eventTriggers.onMouseUp(e, key); + }; - buttonElement.onkeydown = e => { - // ensure that the keydown is enter, - // or else it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - eventTriggers.onKeyEvent(e, true, key); - } - }; - buttonElement.onkeyup = e => { - eventTriggers.onKeyEvent(e, false, key); - }; + buttonElement.onkeydown = (e) => { + // ensure that the keydown is enter, + // or else it may register shortcuts twice + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + eventTriggers.onKeyEvent(e, true, key); + } + }; + buttonElement.onkeyup = (e) => { + eventTriggers.onKeyEvent(e, false, key); + }; }; const setupAllButtons = ( - eventTriggers: EventTriggers, - buttonRefs: IRefObject + eventTriggers: EventTriggers, + buttonRefs: IRefObject, ) => { - for (const [key, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - setupButton(ref.current, eventTriggers, key); - } - } + for (const [key, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + setupButton(ref.current, eventTriggers, key); + } + } }; const disableAllButtons = (buttonRefs: IRefObject) => { - for (const [, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - // to implement - ref.current.onmousedown = null; - ref.current.onmouseup = null; - ref.current.onkeydown = null; - ref.current.onkeyup = null; - ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); - } - } + for (const [, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + // to implement + ref.current.onmousedown = null; + ref.current.onmouseup = null; + ref.current.onkeydown = null; + ref.current.onkeyup = null; + ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); + } + } }; diff --git a/Source/view/components/clue/ClueSimulator.tsx b/Source/view/components/clue/ClueSimulator.tsx index a15f101f8..b12f81629 100644 --- a/Source/view/components/clue/ClueSimulator.tsx +++ b/Source/view/components/clue/ClueSimulator.tsx @@ -1,11 +1,11 @@ import * as React from "react"; import { - AB_BUTTONS_KEYS, - CONSTANTS, - DEFAULT_IMG_CLUE, - DEVICE_LIST_KEY, - VIEW_STATE, - WEBVIEW_MESSAGES, + AB_BUTTONS_KEYS, + CONSTANTS, + DEFAULT_IMG_CLUE, + DEVICE_LIST_KEY, + VIEW_STATE, + WEBVIEW_MESSAGES, } from "../../constants"; import { ViewStateContext } from "../../context"; import "../../styles/Simulator.css"; @@ -17,288 +17,288 @@ import ActionBar from "../simulator/ActionBar"; import { BUTTONS_KEYS, ClueImage } from "./ClueImage"; export const DEFAULT_CLUE_STATE: IClueState = { - buttons: { button_a: false, button_b: false }, - displayMessage: DEFAULT_IMG_CLUE, - leds: { - neopixel: [0, 0, 0], - isRedLedOn: false, - isWhiteLedOn: false, - }, + buttons: { button_a: false, button_b: false }, + displayMessage: DEFAULT_IMG_CLUE, + leds: { + neopixel: [0, 0, 0], + isRedLedOn: false, + isWhiteLedOn: false, + }, }; interface IState { - active_editors: string[]; - running_file?: string; - play_button: boolean; - selected_file: string; - clue: IClueState; - currently_selected_file: string; + active_editors: string[]; + running_file?: string; + play_button: boolean; + selected_file: string; + clue: IClueState; + currently_selected_file: string; } interface IClueState { - buttons: { button_a: boolean; button_b: boolean }; - displayMessage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; + buttons: { button_a: boolean; button_b: boolean }; + displayMessage: string; + leds: { + neopixel: number[]; + isRedLedOn: boolean; + isWhiteLedOn: boolean; + }; } export class ClueSimulator extends React.Component { - private imageRef: React.RefObject = React.createRef(); - constructor() { - super({}); - this.state = { - clue: DEFAULT_CLUE_STATE, - play_button: false, - selected_file: "", - active_editors: [], - running_file: undefined, - currently_selected_file: "", - }; - this.onKeyEvent = this.onKeyEvent.bind(this); - } - handleMessage = (event: any): void => { - const message = event.data; - if (message.active_device !== DEVICE_LIST_KEY.CLUE) { - return; - } - switch (message.command) { - case "reset-state": - this.setState({ - clue: DEFAULT_CLUE_STATE, - play_button: false, - }); - break; - case "set-state": - this.handleStateChangeMessage(message); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - clue: { - ...this.state.clue, - displayMessage: DEFAULT_IMG_CLUE, - }, - }); - break; - case "visible-editors": - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } + private imageRef: React.RefObject = React.createRef(); + constructor() { + super({}); + this.state = { + clue: DEFAULT_CLUE_STATE, + play_button: false, + selected_file: "", + active_editors: [], + running_file: undefined, + currently_selected_file: "", + }; + this.onKeyEvent = this.onKeyEvent.bind(this); + } + handleMessage = (event: any): void => { + const message = event.data; + if (message.active_device !== DEVICE_LIST_KEY.CLUE) { + return; + } + switch (message.command) { + case "reset-state": + this.setState({ + clue: DEFAULT_CLUE_STATE, + play_button: false, + }); + break; + case "set-state": + this.handleStateChangeMessage(message); + break; + case "activate-play": + const newRunningFile = this.state.currently_selected_file; + this.setState({ + play_button: !this.state.play_button, + running_file: newRunningFile, + clue: { + ...this.state.clue, + displayMessage: DEFAULT_IMG_CLUE, + }, + }); + break; + case "visible-editors": + this.setState({ + active_editors: message.state.activePythonEditors, + }); + break; + case "current-file": + if (this.state.play_button) { + this.setState({ + currently_selected_file: message.state.running_file, + }); + } else { + this.setState({ + running_file: message.state.running_file, + currently_selected_file: message.state.running_file, + }); + } - break; - } - }; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } + break; + } + }; + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } + componentWillUnmount() { + window.removeEventListener("message", this.handleMessage); + } - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
+ render() { + const playStopImage = this.state.play_button ? StopLogo : PlayLogo; + const playStopLabel = this.state.play_button ? "stop" : "play"; + return ( +
+
+ {this.state.running_file && this.state.play_button + ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) + : CONSTANTS.FILES_PLACEHOLDER} +
-
- -
- -
- ); - } - protected togglePlayClick = () => { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - }; - protected onSelectFile(event: React.FocusEvent) { - this.setState({ - selected_file: event.currentTarget.value, - }); - } - protected refreshSimulatorClick = () => { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - }; - protected handleButtonClick = (key: string, isActive: boolean) => { - let newButtonState = this.state.clue.buttons; - switch (key) { - case AB_BUTTONS_KEYS.BTN_A: - newButtonState.button_a = isActive; - break; - case AB_BUTTONS_KEYS.BTN_B: - newButtonState.button_b = isActive; - break; - case AB_BUTTONS_KEYS.BTN_AB: - newButtonState = { - button_a: isActive, - button_b: isActive, - }; - break; - } - sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); - this.setState({ - clue: { - ...this.state.clue, - buttons: newButtonState, - }, - }); - }; +
+ +
+ +
+ ); + } + protected togglePlayClick = () => { + const button = + window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || + window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { + selected_file: this.state.selected_file, + state: !this.state.play_button, + }); + }; + protected onSelectFile(event: React.FocusEvent) { + this.setState({ + selected_file: event.currentTarget.value, + }); + } + protected refreshSimulatorClick = () => { + const button = window.document.getElementById( + CONSTANTS.ID_NAME.REFRESH_BUTTON, + ); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); + }; + protected handleButtonClick = (key: string, isActive: boolean) => { + let newButtonState = this.state.clue.buttons; + switch (key) { + case AB_BUTTONS_KEYS.BTN_A: + newButtonState.button_a = isActive; + break; + case AB_BUTTONS_KEYS.BTN_B: + newButtonState.button_b = isActive; + break; + case AB_BUTTONS_KEYS.BTN_AB: + newButtonState = { + button_a: isActive, + button_b: isActive, + }; + break; + } + sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); + this.setState({ + clue: { + ...this.state.clue, + buttons: newButtonState, + }, + }); + }; - protected onMouseUp = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, false); - }; + protected onMouseUp = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, false); + }; - protected onMouseDown = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, true); - }; + protected onMouseDown = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, true); + }; - protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { - event.stopPropagation(); - if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(key, active); - if (key === BUTTONS_KEYS.BTN_A) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if (key === BUTTONS_KEYS.BTN_B) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if (key === BUTTONS_KEYS.BTN_AB) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } - } - protected handleStateChangeMessage(message: any) { - if (message.state.display_base64 != null) { - this.setState({ - clue: { - ...this.state.clue, - displayMessage: message.state.display_base64, - }, - }); - } else if (message.state.pixels != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - neopixel: message.state.pixels, - }, - }, - }); - } else if (message.state.white_leds != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - isWhiteLedOn: message.state.white_leds, - }, - }, - }); - } else if (message.state.red_led != null) { - this.setState({ - clue: { - ...this.state.clue, - leds: { - ...this.state.clue.leds, - isRedLedOn: message.state.red_led, - }, - }, - }); - } - } + protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { + event.stopPropagation(); + if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(key, active); + if (key === BUTTONS_KEYS.BTN_A) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active, + ); + } else if (key === BUTTONS_KEYS.BTN_B) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active, + ); + } else if (key === BUTTONS_KEYS.BTN_AB) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active, + ); + } + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active, + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active, + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active, + ); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { + this.togglePlayClick(); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { + this.refreshSimulatorClick(); + } + } + protected handleStateChangeMessage(message: any) { + if (message.state.display_base64 != null) { + this.setState({ + clue: { + ...this.state.clue, + displayMessage: message.state.display_base64, + }, + }); + } else if (message.state.pixels != null) { + this.setState({ + clue: { + ...this.state.clue, + leds: { + ...this.state.clue.leds, + neopixel: message.state.pixels, + }, + }, + }); + } else if (message.state.white_leds != null) { + this.setState({ + clue: { + ...this.state.clue, + leds: { + ...this.state.clue.leds, + isWhiteLedOn: message.state.white_leds, + }, + }, + }); + } else if (message.state.red_led != null) { + this.setState({ + clue: { + ...this.state.clue, + leds: { + ...this.state.clue.leds, + isRedLedOn: message.state.red_led, + }, + }, + }); + } + } } ClueSimulator.contextType = ViewStateContext; diff --git a/Source/view/components/clue/Clue_svg.tsx b/Source/view/components/clue/Clue_svg.tsx index b67b1f0f9..04612e70f 100644 --- a/Source/view/components/clue/Clue_svg.tsx +++ b/Source/view/components/clue/Clue_svg.tsx @@ -7,1178 +7,1179 @@ import "../../styles/SimulatorSvg.css"; import svg from "../cpx/Svg_utils"; import { DEFAULT_CLUE_STATE } from "./ClueSimulator"; export interface IRefObject { - [key: string]: React.RefObject; + [key: string]: React.RefObject; } interface IProps { - displayImage: string; - leds: { - neopixel: number[]; - isRedLedOn: boolean; - isWhiteLedOn: boolean; - }; + displayImage: string; + leds: { + neopixel: number[]; + isRedLedOn: boolean; + isWhiteLedOn: boolean; + }; } export class ClueSvg extends React.Component { - private svgRef: React.RefObject = React.createRef(); - private ledsRefs = { - neopixel: React.createRef(), - redLed: React.createRef(), - whiteLeds: [ - React.createRef(), - React.createRef(), - ], - }; - private gradientRefs = { - neopixel: React.createRef(), - whiteLed: React.createRef(), - redLed: React.createRef(), - }; + private svgRef: React.RefObject = React.createRef(); + private ledsRefs = { + neopixel: React.createRef(), + redLed: React.createRef(), + whiteLeds: [ + React.createRef(), + React.createRef(), + ], + }; + private gradientRefs = { + neopixel: React.createRef(), + whiteLed: React.createRef(), + redLed: React.createRef(), + }; - private buttonRefs: IRefObject = { - BTN_A: React.createRef(), - BTN_B: React.createRef(), - BTN_AB: React.createRef(), - }; + private buttonRefs: IRefObject = { + BTN_A: React.createRef(), + BTN_B: React.createRef(), + BTN_AB: React.createRef(), + }; - private displayRef: React.RefObject = React.createRef(); + private displayRef: React.RefObject = React.createRef(); - public getSvgRef(): React.RefObject { - return this.svgRef; - } - public getButtons(): IRefObject { - return this.buttonRefs; - } - public getDisplayRef(): React.RefObject { - return this.displayRef; - } - componentDidMount() { - this.updateSvg(); - } - componentDidUpdate() { - this.updateSvg(); - } + public getSvgRef(): React.RefObject { + return this.svgRef; + } + public getButtons(): IRefObject { + return this.buttonRefs; + } + public getDisplayRef(): React.RefObject { + return this.displayRef; + } + componentDidMount() { + this.updateSvg(); + } + componentDidUpdate() { + this.updateSvg(); + } - render() { - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + render() { + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - A+B - - - + + + + + + + + + + + + + + + + + + + + + + + + + + A+B + + + - - - - - - - LIGHT - - - GESTURE - - - P - - R - - - O - - - XIMI - - - T - - - Y - - - - - - - - - - - - - - Red LED - - - - - Neopixel - - - - -
- ); - } - private updateSvg() { - this.updateDisplay(); - this.updateNeopixel(); - this.updateLeds(); - } + + + + + + + LIGHT + + + GESTURE + + + P + + R + + + O + + + XIMI + + + T + + + Y + + + + + + + + + + + + + + Red LED + + + + + Neopixel + + + + +
+ ); + } + private updateSvg() { + this.updateDisplay(); + this.updateNeopixel(); + this.updateLeds(); + } - private updateDisplay() { - if (this.props.displayImage) { - this.displayRef.current?.setAttribute( - "href", - `data:image/png;base64,${this.props.displayImage}` - ); - } - } + private updateDisplay() { + if (this.props.displayImage) { + this.displayRef.current?.setAttribute( + "href", + `data:image/png;base64,${this.props.displayImage}`, + ); + } + } - private updateNeopixel() { - const { neopixel } = this.props.leds; - const rgbColor = `rgb(${neopixel[0] + - (255 - neopixel[0]) * CONSTANTS.LED_TINT_FACTOR}, - ${neopixel[1] + - (255 - neopixel[1]) * CONSTANTS.LED_TINT_FACTOR},${neopixel[2] + - (255 - neopixel[2]) * CONSTANTS.LED_TINT_FACTOR})`; + private updateNeopixel() { + const { neopixel } = this.props.leds; + const rgbColor = `rgb(${ + neopixel[0] + (255 - neopixel[0]) * CONSTANTS.LED_TINT_FACTOR + }, + ${neopixel[1] + (255 - neopixel[1]) * CONSTANTS.LED_TINT_FACTOR},${ + neopixel[2] + (255 - neopixel[2]) * CONSTANTS.LED_TINT_FACTOR + })`; - this.ledsRefs.neopixel.current?.setAttribute("fill", rgbColor); + this.ledsRefs.neopixel.current?.setAttribute("fill", rgbColor); - if (neopixel === DEFAULT_CLUE_STATE.leds.neopixel) { - this.gradientRefs.neopixel.current?.setAttribute( - "stop-opacity", - "0" - ); - } else { - this.gradientRefs.neopixel.current?.setAttribute( - "stop-opacity", - "1" - ); - } - this.gradientRefs.neopixel.current?.setAttribute( - "stop-color", - rgbColor - ); - } - private updateLeds() { - // update white led - const { isWhiteLedOn, isRedLedOn } = this.props.leds; + if (neopixel === DEFAULT_CLUE_STATE.leds.neopixel) { + this.gradientRefs.neopixel.current?.setAttribute( + "stop-opacity", + "0", + ); + } else { + this.gradientRefs.neopixel.current?.setAttribute( + "stop-opacity", + "1", + ); + } + this.gradientRefs.neopixel.current?.setAttribute( + "stop-color", + rgbColor, + ); + } + private updateLeds() { + // update white led + const { isWhiteLedOn, isRedLedOn } = this.props.leds; - this.ledsRefs.whiteLeds.map( - (ledRef: React.RefObject) => { - svg.setLed( - isWhiteLedOn, - CLUE_LEDS_COLORS.WHITE_LEDS_OFF, - CLUE_LEDS_COLORS.WHITE_LEDS_ON, - ledRef.current, - this.gradientRefs.whiteLed.current - ); - } - ); - svg.setLed( - isRedLedOn, - CLUE_LEDS_COLORS.RED_LED_OFF, - CLUE_LEDS_COLORS.RED_LED_ON, - this.ledsRefs.redLed.current, - this.gradientRefs.redLed.current - ); - } + this.ledsRefs.whiteLeds.map( + (ledRef: React.RefObject) => { + svg.setLed( + isWhiteLedOn, + CLUE_LEDS_COLORS.WHITE_LEDS_OFF, + CLUE_LEDS_COLORS.WHITE_LEDS_ON, + ledRef.current, + this.gradientRefs.whiteLed.current, + ); + }, + ); + svg.setLed( + isRedLedOn, + CLUE_LEDS_COLORS.RED_LED_OFF, + CLUE_LEDS_COLORS.RED_LED_ON, + this.ledsRefs.redLed.current, + this.gradientRefs.redLed.current, + ); + } } diff --git a/Source/view/components/cpx/Accessibility_utils.ts b/Source/view/components/cpx/Accessibility_utils.ts index afdadb2ac..a7d62bcfa 100644 --- a/Source/view/components/cpx/Accessibility_utils.ts +++ b/Source/view/components/cpx/Accessibility_utils.ts @@ -3,24 +3,24 @@ // Helpers designed to help to make a simulator accessible. namespace accessibility { - export function makeFocusable(elem: SVGElement): void { - elem.setAttribute("focusable", "true"); - elem.setAttribute("tabindex", "0"); - } + export function makeFocusable(elem: SVGElement): void { + elem.setAttribute("focusable", "true"); + elem.setAttribute("tabindex", "0"); + } - export function setAria( - elem: Element, - role?: string, - label?: string - ): void { - if (role && !elem.hasAttribute("role")) { - elem.setAttribute("role", role); - } + export function setAria( + elem: Element, + role?: string, + label?: string, + ): void { + if (role && !elem.hasAttribute("role")) { + elem.setAttribute("role", role); + } - if (label && !elem.hasAttribute("aria-label")) { - elem.setAttribute("aria-label", label); - } - } + if (label && !elem.hasAttribute("aria-label")) { + elem.setAttribute("aria-label", label); + } + } } export default accessibility; diff --git a/Source/view/components/cpx/Cpx.spec.tsx b/Source/view/components/cpx/Cpx.spec.tsx index 3b5bdfb6a..8a28a545c 100644 --- a/Source/view/components/cpx/Cpx.spec.tsx +++ b/Source/view/components/cpx/Cpx.spec.tsx @@ -5,25 +5,25 @@ import * as testRenderer from "react-test-renderer"; import { Cpx } from "./Cpx"; describe("CPX component", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + , + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div, + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/components/cpx/Cpx.tsx b/Source/view/components/cpx/Cpx.tsx index 02560623a..2da890fac 100644 --- a/Source/view/components/cpx/Cpx.tsx +++ b/Source/view/components/cpx/Cpx.tsx @@ -10,95 +10,95 @@ import Simulator from "./CpxSimulator"; // Component grouping the functionality for circuit playground express const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - }, + sensors: { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT]: 0, + [SENSOR_LIST.MOTION_X]: 0, + [SENSOR_LIST.MOTION_Y]: 0, + [SENSOR_LIST.MOTION_Z]: 0, + }, }; export class Cpx extends React.Component { - state = DEFAULT_STATE; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } + state = DEFAULT_STATE; + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + handleMessage = (event: any): void => { + const message = event.data; - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.RESET: + this.setState({ ...DEFAULT_STATE }); + break; + } + }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; + render() { + return ( + + + + + ); + } + updateSensor = (sensor: SENSOR_LIST, value: number) => { + this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); + }; } const CPX_TOOLBAR_BUTTONS: Array<{ label: any; image: any }> = [ - { - image: TOOLBAR_SVG.SLIDER_SWITCH_SVG, - label: CPX_TOOLBAR_ICON_ID.SWITCH, - }, - { - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - label: CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, - }, - { - image: TOOLBAR_SVG.RED_LED_SVG, - label: CPX_TOOLBAR_ICON_ID.RED_LED, - }, - { - image: TOOLBAR_SVG.SOUND_SVG, - label: CPX_TOOLBAR_ICON_ID.SOUND, - }, - { - image: TOOLBAR_SVG.TEMPERATURE_SVG, - label: CPX_TOOLBAR_ICON_ID.TEMPERATURE, - }, - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: CPX_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.NEO_PIXEL_SVG, - label: CPX_TOOLBAR_ICON_ID.NEO_PIXEL, - }, - { - image: TOOLBAR_SVG.SPEAKER_SVG, - label: CPX_TOOLBAR_ICON_ID.SPEAKER, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: CPX_TOOLBAR_ICON_ID.MOTION, - }, - { - image: TOOLBAR_SVG.IR_SVG, - label: CPX_TOOLBAR_ICON_ID.IR, - }, - { - image: TOOLBAR_SVG.GPIO_SVG, - label: CPX_TOOLBAR_ICON_ID.GPIO, - }, + { + image: TOOLBAR_SVG.SLIDER_SWITCH_SVG, + label: CPX_TOOLBAR_ICON_ID.SWITCH, + }, + { + image: TOOLBAR_SVG.PUSH_BUTTON_SVG, + label: CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, + }, + { + image: TOOLBAR_SVG.RED_LED_SVG, + label: CPX_TOOLBAR_ICON_ID.RED_LED, + }, + { + image: TOOLBAR_SVG.SOUND_SVG, + label: CPX_TOOLBAR_ICON_ID.SOUND, + }, + { + image: TOOLBAR_SVG.TEMPERATURE_SVG, + label: CPX_TOOLBAR_ICON_ID.TEMPERATURE, + }, + { + image: TOOLBAR_SVG.LIGHT_SVG, + label: CPX_TOOLBAR_ICON_ID.LIGHT, + }, + { + image: TOOLBAR_SVG.NEO_PIXEL_SVG, + label: CPX_TOOLBAR_ICON_ID.NEO_PIXEL, + }, + { + image: TOOLBAR_SVG.SPEAKER_SVG, + label: CPX_TOOLBAR_ICON_ID.SPEAKER, + }, + { + image: TOOLBAR_SVG.MOTION_SVG, + label: CPX_TOOLBAR_ICON_ID.MOTION, + }, + { + image: TOOLBAR_SVG.IR_SVG, + label: CPX_TOOLBAR_ICON_ID.IR, + }, + { + image: TOOLBAR_SVG.GPIO_SVG, + label: CPX_TOOLBAR_ICON_ID.GPIO, + }, ]; diff --git a/Source/view/components/cpx/CpxImage.tsx b/Source/view/components/cpx/CpxImage.tsx index 48aef4e64..0244d5a1b 100644 --- a/Source/view/components/cpx/CpxImage.tsx +++ b/Source/view/components/cpx/CpxImage.tsx @@ -9,398 +9,400 @@ import * as SvgStyle from "./Cpx_svg_style"; import svg from "./Svg_utils"; interface IProps { - pixels: number[][]; - red_led: boolean; - brightness: number; - switch: boolean; - on: boolean; - onKeyEvent: (event: KeyboardEvent, active: boolean) => void; - onMouseUp: (button: HTMLElement, event: Event) => void; - onMouseDown: (button: HTMLElement, event: Event) => void; - onMouseLeave: (button: HTMLElement, event: Event) => void; + pixels: number[][]; + red_led: boolean; + brightness: number; + switch: boolean; + on: boolean; + onKeyEvent: (event: KeyboardEvent, active: boolean) => void; + onMouseUp: (button: HTMLElement, event: Event) => void; + onMouseDown: (button: HTMLElement, event: Event) => void; + onMouseLeave: (button: HTMLElement, event: Event) => void; } export class CpxImage extends React.Component { - componentDidMount() { - const svgElement = window.document.getElementById("cpx_svg"); - if (svgElement) { - initSvgStyle(svgElement, this.props.brightness); - setupButtons(this.props); - setupPins(this.props); - this.setupKeyPresses(this.props.onKeyEvent); - setupSwitch(this.props); - this.updateImage(); - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - componentDidUpdate() { - this.updateImage(); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the switch, run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.S) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.onKeyEvent(event, true); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.onKeyEvent(event, false); - }; - render() { - return CPX_SVG; - } - private updateImage() { - updateNeopixels(this.props); - updateRedLED(this.props.red_led); - updatePowerLED(this.props.on); - updateSwitch(this.props.switch); - } + componentDidMount() { + const svgElement = window.document.getElementById("cpx_svg"); + if (svgElement) { + initSvgStyle(svgElement, this.props.brightness); + setupButtons(this.props); + setupPins(this.props); + this.setupKeyPresses(this.props.onKeyEvent); + setupSwitch(this.props); + this.updateImage(); + } + } + componentWillUnmount() { + window.document.removeEventListener("keydown", this.handleKeyDown); + window.document.removeEventListener("keyup", this.handleKeyUp); + } + componentDidUpdate() { + this.updateImage(); + } + setupKeyPresses = ( + onKeyEvent: (event: KeyboardEvent, active: boolean) => void, + ) => { + window.document.addEventListener("keydown", this.handleKeyDown); + window.document.addEventListener("keyup", this.handleKeyUp); + }; + + handleKeyDown = (event: KeyboardEvent) => { + const keyEvents = [event.key, event.code]; + // Don't listen to keydown events for the switch, run button, restart button and enter key + if ( + !( + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.S) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) + ) + ) { + this.props.onKeyEvent(event, true); + } + }; + handleKeyUp = (event: KeyboardEvent) => { + this.props.onKeyEvent(event, false); + }; + render() { + return CPX_SVG; + } + private updateImage() { + updateNeopixels(this.props); + updateRedLED(this.props.red_led); + updatePowerLED(this.props.on); + updateSwitch(this.props.switch); + } } const makeButton = ( - g: SVGElement, - left: number, - top: number, - id: string + g: SVGElement, + left: number, + top: number, + id: string, ): { outer: SVGElement; inner: SVGElement } => { - const buttonCornerRadius = SvgStyle.BUTTON_CORNER_RADIUS; - const buttonWidth = SvgStyle.BUTTON_WIDTH; - const buttonCircleRadius = SvgStyle.BUTTON_CIRCLE_RADIUS; - const btng = svg.child(g, "g", { class: "sim-button-group" }); - svg.child(btng, "rect", { - fill: SvgStyle.BUTTON_OUTER, - height: buttonWidth, - id: id + "_OUTER", - rx: buttonCornerRadius, - ry: buttonCornerRadius, - width: buttonWidth, - x: left, - y: top, - }); - - const outer = btng; - const inner = svg.child(btng, "circle", { - id: id + "_INNER", - cx: left + buttonWidth / 2, - cy: top + buttonWidth / 2, - r: buttonCircleRadius, - fill: SvgStyle.BUTTON_NEUTRAL, - }); - - return { outer, inner }; + const buttonCornerRadius = SvgStyle.BUTTON_CORNER_RADIUS; + const buttonWidth = SvgStyle.BUTTON_WIDTH; + const buttonCircleRadius = SvgStyle.BUTTON_CIRCLE_RADIUS; + const btng = svg.child(g, "g", { class: "sim-button-group" }); + svg.child(btng, "rect", { + fill: SvgStyle.BUTTON_OUTER, + height: buttonWidth, + id: id + "_OUTER", + rx: buttonCornerRadius, + ry: buttonCornerRadius, + width: buttonWidth, + x: left, + y: top, + }); + + const outer = btng; + const inner = svg.child(btng, "circle", { + id: id + "_INNER", + cx: left + buttonWidth / 2, + cy: top + buttonWidth / 2, + r: buttonCircleRadius, + fill: SvgStyle.BUTTON_NEUTRAL, + }); + + return { outer, inner }; }; const initSvgStyle = (svgElement: HTMLElement, brightness: number): void => { - const style: SVGStyleElement = svg.child( - svgElement, - "style", - {} - ) as SVGStyleElement; - style.textContent = SvgStyle.SVG_STYLE; - - // Filters for the glow effect (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) - const defs: SVGDefsElement = svg.child( - svgElement, - "defs", - {} - ) as SVGDefsElement; - - const g = svg.createElement("g") as SVGElement; - svgElement.appendChild(g); - - const glow = svg.child(defs, "filter", { - height: "120%", - id: "filterglow", - width: "120%", - x: "-5%", - y: "-5%", - }); - svg.child(glow, "feGaussianBlur", { stdDeviation: "5", result: "glow" }); - const merge = svg.child(glow, "feMerge", {}); - for (let i = 0; i < 3; ++i) { - svg.child(merge, "feMergeNode", { in: "glow" }); - } - - const neopixelglow = svg.child(defs, "filter", { - height: "600%", - id: "neopixelglow", - width: "600%", - x: "-300%", - y: "-300%", - }); - svg.child(neopixelglow, "feGaussianBlur", { - result: "coloredBlur", - stdDeviation: "4.3", - }); - const neopixelmerge = svg.child(neopixelglow, "feMerge", {}); - svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); - svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); - svg.child(neopixelmerge, "feMergeNode", { in: "SourceGraphic" }); - - // Brightness - const neopixelfeComponentTransfer = svg.child( - neopixelglow, - "feComponentTransfer", - {} - ); - svg.child(neopixelfeComponentTransfer, "feFuncR", { - id: "brightnessFilterR", - type: "linear", - slope: brightness, - }); - svg.child(neopixelfeComponentTransfer, "feFuncG", { - id: "brightnessFilterG", - slope: brightness, - type: "linear", - }); - svg.child(neopixelfeComponentTransfer, "feFuncB", { - id: "brightnessFilterB", - slope: brightness, - type: "linear", - }); - - // BTN A+B - const outerBtn = (left: number, top: number, label: string) => { - return makeButton(g, left, top, "BTN_AB"); - }; - - const ab = outerBtn(165, SvgStyle.MB_HEIGHT - 15, "A+B"); - const abtext = svg.child(ab.outer, "text", { - class: "sim-text-outside", - x: SvgStyle.BUTTON_TEXT_BASELINE, - y: SvgStyle.MB_HEIGHT - 18, - }) as SVGTextElement; - abtext.textContent = "A+B"; + const style: SVGStyleElement = svg.child( + svgElement, + "style", + {}, + ) as SVGStyleElement; + style.textContent = SvgStyle.SVG_STYLE; + + // Filters for the glow effect (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) + const defs: SVGDefsElement = svg.child( + svgElement, + "defs", + {}, + ) as SVGDefsElement; + + const g = svg.createElement("g") as SVGElement; + svgElement.appendChild(g); + + const glow = svg.child(defs, "filter", { + height: "120%", + id: "filterglow", + width: "120%", + x: "-5%", + y: "-5%", + }); + svg.child(glow, "feGaussianBlur", { stdDeviation: "5", result: "glow" }); + const merge = svg.child(glow, "feMerge", {}); + for (let i = 0; i < 3; ++i) { + svg.child(merge, "feMergeNode", { in: "glow" }); + } + + const neopixelglow = svg.child(defs, "filter", { + height: "600%", + id: "neopixelglow", + width: "600%", + x: "-300%", + y: "-300%", + }); + svg.child(neopixelglow, "feGaussianBlur", { + result: "coloredBlur", + stdDeviation: "4.3", + }); + const neopixelmerge = svg.child(neopixelglow, "feMerge", {}); + svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); + svg.child(neopixelmerge, "feMergeNode", { in: "coloredBlur" }); + svg.child(neopixelmerge, "feMergeNode", { in: "SourceGraphic" }); + + // Brightness + const neopixelfeComponentTransfer = svg.child( + neopixelglow, + "feComponentTransfer", + {}, + ); + svg.child(neopixelfeComponentTransfer, "feFuncR", { + id: "brightnessFilterR", + type: "linear", + slope: brightness, + }); + svg.child(neopixelfeComponentTransfer, "feFuncG", { + id: "brightnessFilterG", + slope: brightness, + type: "linear", + }); + svg.child(neopixelfeComponentTransfer, "feFuncB", { + id: "brightnessFilterB", + slope: brightness, + type: "linear", + }); + + // BTN A+B + const outerBtn = (left: number, top: number, label: string) => { + return makeButton(g, left, top, "BTN_AB"); + }; + + const ab = outerBtn(165, SvgStyle.MB_HEIGHT - 15, "A+B"); + const abtext = svg.child(ab.outer, "text", { + class: "sim-text-outside", + x: SvgStyle.BUTTON_TEXT_BASELINE, + y: SvgStyle.MB_HEIGHT - 18, + }) as SVGTextElement; + abtext.textContent = "A+B"; }; const updateNeopixels = (props: IProps): void => { - for (let i = 0; i < props.pixels.length; i++) { - const led = window.document.getElementById(`NEOPIXEL_${i}`); - if (led) { - setNeopixel(led, props.pixels[i], props.brightness); - } - } + for (let i = 0; i < props.pixels.length; i++) { + const led = window.document.getElementById(`NEOPIXEL_${i}`); + if (led) { + setNeopixel(led, props.pixels[i], props.brightness); + } + } }; const updateRedLED = (propsRedLED: boolean): void => { - const redLED = window.document.getElementById("SERIAL_LED"); - if (redLED) { - redLED.style.fill = propsRedLED - ? SvgStyle.RED_LED_ON - : SvgStyle.RED_LED_OFF; - } + const redLED = window.document.getElementById("SERIAL_LED"); + if (redLED) { + redLED.style.fill = propsRedLED + ? SvgStyle.RED_LED_ON + : SvgStyle.RED_LED_OFF; + } }; const updatePowerLED = (propsPowerLED: boolean): void => { - const powerLED = window.document.getElementById("PWR_LED"); - if (powerLED) { - powerLED.style.fill = propsPowerLED - ? SvgStyle.POWER_LED_ON - : SvgStyle.POWER_LED_OFF; - } + const powerLED = window.document.getElementById("PWR_LED"); + if (powerLED) { + powerLED.style.fill = propsPowerLED + ? SvgStyle.POWER_LED_ON + : SvgStyle.POWER_LED_OFF; + } }; const setNeopixel = ( - led: HTMLElement, - pixValue: number[], - brightness: number + led: HTMLElement, + pixValue: number[], + brightness: number, ): void => { - if (isLightOn(pixValue) && brightness > 0) { - // Neopixels style (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) - changeBrightness("brightnessFilterR", brightness); - changeBrightness("brightnessFilterG", brightness); - changeBrightness("brightnessFilterB", brightness); - - let [hue, sat, lum] = SvgStyle.rgbToHsl([ - pixValue[0], - pixValue[1], - pixValue[2], - ]); - const innerLum = Math.max( - lum * SvgStyle.INTENSITY_FACTOR, - SvgStyle.MIN_INNER_LUM - ); - lum = (lum * 90) / 100 + 10; // at least 10% luminosity for the stroke - - led.style.filter = `url(#neopixelglow)`; - led.style.fill = `hsl(${hue}, ${sat}%, ${innerLum}%)`; - led.style.stroke = `hsl(${hue}, ${sat}%, ${Math.min( - lum * 3, - SvgStyle.MAX_STROKE_LUM - )}%)`; - led.style.strokeWidth = `1.5`; - } else { - led.style.fill = SvgStyle.OFF_COLOR; - led.style.filter = `none`; - led.style.stroke = `none`; - } + if (isLightOn(pixValue) && brightness > 0) { + // Neopixels style (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) + changeBrightness("brightnessFilterR", brightness); + changeBrightness("brightnessFilterG", brightness); + changeBrightness("brightnessFilterB", brightness); + + let [hue, sat, lum] = SvgStyle.rgbToHsl([ + pixValue[0], + pixValue[1], + pixValue[2], + ]); + const innerLum = Math.max( + lum * SvgStyle.INTENSITY_FACTOR, + SvgStyle.MIN_INNER_LUM, + ); + lum = (lum * 90) / 100 + 10; // at least 10% luminosity for the stroke + + led.style.filter = `url(#neopixelglow)`; + led.style.fill = `hsl(${hue}, ${sat}%, ${innerLum}%)`; + led.style.stroke = `hsl(${hue}, ${sat}%, ${Math.min( + lum * 3, + SvgStyle.MAX_STROKE_LUM, + )}%)`; + led.style.strokeWidth = `1.5`; + } else { + led.style.fill = SvgStyle.OFF_COLOR; + led.style.filter = `none`; + led.style.stroke = `none`; + } }; const isLightOn = (pixValue: number[]): boolean => { - return !pixValue.every(val => { - return val === 0; - }); + return !pixValue.every((val) => { + return val === 0; + }); }; const changeBrightness = (filterID: string, brightness: number): void => { - const brightnessFilter: HTMLElement | null = window.document.getElementById( - filterID - ); - if (brightnessFilter) { - brightnessFilter.setAttribute("slope", brightness.toString()); - } + const brightnessFilter: HTMLElement | null = + window.document.getElementById(filterID); + if (brightnessFilter) { + brightnessFilter.setAttribute("slope", brightness.toString()); + } }; const setupButtons = (props: IProps): void => { - const outButtons = ["A_OUTER", "B_OUTER", "AB_OUTER"]; - const inButtons = ["A_INNER", "B_INNER", "AB_INNER"]; - outButtons.forEach(buttonName => { - const button = window.document.getElementById("BTN_" + buttonName); - - if (button) { - setupButton(button, "sim-button-outer", props); - } - }); - inButtons.forEach(buttonName => { - const button = window.document.getElementById("BTN_" + buttonName); - if (button) { - setupButton(button, "sim-button", props); - } - }); + const outButtons = ["A_OUTER", "B_OUTER", "AB_OUTER"]; + const inButtons = ["A_INNER", "B_INNER", "AB_INNER"]; + outButtons.forEach((buttonName) => { + const button = window.document.getElementById("BTN_" + buttonName); + + if (button) { + setupButton(button, "sim-button-outer", props); + } + }); + inButtons.forEach((buttonName) => { + const button = window.document.getElementById("BTN_" + buttonName); + if (button) { + setupButton(button, "sim-button", props); + } + }); }; const setupPins = (props: IProps): void => { - const pins = [ - "PIN_A1", - "PIN_A2", - "PIN_A3", - "PIN_A4", - "PIN_A5", - "PIN_A6", - "PIN_A7", - ]; - pins.forEach(pinName => { - const pin = window.document.getElementById(pinName); - - if (pin) { - const svgPin = (pin as unknown) as SVGElement; - svg.addClass(svgPin, `sim-${pinName}-touch`); - accessibility.makeFocusable(svgPin); - svgPin.onmouseup = e => props.onMouseUp(pin, e); - svgPin.onkeyup = e => props.onKeyEvent(e, false); - svgPin.onmousedown = e => props.onMouseDown(pin, e); - svgPin.onkeydown = e => props.onKeyEvent(e, true); - accessibility.setAria( - svgPin, - "button", - `Touch pin ${pinName.substr(pinName.length - 2)}` - ); - } - }); + const pins = [ + "PIN_A1", + "PIN_A2", + "PIN_A3", + "PIN_A4", + "PIN_A5", + "PIN_A6", + "PIN_A7", + ]; + pins.forEach((pinName) => { + const pin = window.document.getElementById(pinName); + + if (pin) { + const svgPin = pin as unknown as SVGElement; + svg.addClass(svgPin, `sim-${pinName}-touch`); + accessibility.makeFocusable(svgPin); + svgPin.onmouseup = (e) => props.onMouseUp(pin, e); + svgPin.onkeyup = (e) => props.onKeyEvent(e, false); + svgPin.onmousedown = (e) => props.onMouseDown(pin, e); + svgPin.onkeydown = (e) => props.onKeyEvent(e, true); + accessibility.setAria( + svgPin, + "button", + `Touch pin ${pinName.substr(pinName.length - 2)}`, + ); + } + }); }; const addButtonLabels = (button: HTMLElement) => { - let label = ""; - if (button.id.match(/AB/) !== null) { - label = "a+b"; - } else if (button.id.match(/A/) !== null) { - label = "a"; - } else if (button.id.match(/B/) !== null) { - label = "b"; - } - accessibility.setAria(button, "button", label); + let label = ""; + if (button.id.match(/AB/) !== null) { + label = "a+b"; + } else if (button.id.match(/A/) !== null) { + label = "a"; + } else if (button.id.match(/B/) !== null) { + label = "b"; + } + accessibility.setAria(button, "button", label); }; const setupButton = (button: HTMLElement, className: string, props: IProps) => { - const svgButton = (button as unknown) as SVGElement; - svg.addClass(svgButton, className); - addButtonLabels(button); - if (className.match(/outer/) !== null) { - accessibility.makeFocusable(svgButton); - } - svgButton.onmousedown = e => props.onMouseDown(button, e); - svgButton.onmouseup = e => props.onMouseUp(button, e); - svgButton.onkeydown = e => { - // ensure that the keydown is enter. - // Or else, if the key is a shortcut instead, - // it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - props.onKeyEvent(e, true); - } - }; - svgButton.onkeyup = e => props.onKeyEvent(e, false); - svgButton.onmouseleave = e => props.onMouseLeave(button, e); + const svgButton = button as unknown as SVGElement; + svg.addClass(svgButton, className); + addButtonLabels(button); + if (className.match(/outer/) !== null) { + accessibility.makeFocusable(svgButton); + } + svgButton.onmousedown = (e) => props.onMouseDown(button, e); + svgButton.onmouseup = (e) => props.onMouseUp(button, e); + svgButton.onkeydown = (e) => { + // ensure that the keydown is enter. + // Or else, if the key is a shortcut instead, + // it may register shortcuts twice + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + props.onKeyEvent(e, true); + } + }; + svgButton.onkeyup = (e) => props.onKeyEvent(e, false); + svgButton.onmouseleave = (e) => props.onMouseLeave(button, e); }; const setupSwitch = (props: IProps): void => { - const switchElement = window.document.getElementById("SWITCH"); - const swInnerElement = window.document.getElementById("SWITCH_INNER"); - const swHousingElement = window.document.getElementById("SWITCH_HOUSING"); - - if (switchElement && swInnerElement && swHousingElement) { - const svgSwitch: SVGElement = (switchElement as unknown) as SVGElement; - const svgSwitchInner: SVGElement = (swInnerElement as unknown) as SVGElement; - const svgSwitchHousing: SVGElement = (swHousingElement as unknown) as SVGElement; - - svg.addClass(svgSwitch, "sim-slide-switch"); - - svgSwitch.onmouseup = e => props.onMouseUp(switchElement, e); - svgSwitchInner.onmouseup = e => props.onMouseUp(swInnerElement, e); - svgSwitchHousing.onmouseup = e => props.onMouseUp(swHousingElement, e); - svgSwitch.onkeyup = e => props.onKeyEvent(e, false); - - accessibility.makeFocusable(svgSwitch); - accessibility.setAria(svgSwitch, "button", "On/Off Switch"); - } + const switchElement = window.document.getElementById("SWITCH"); + const swInnerElement = window.document.getElementById("SWITCH_INNER"); + const swHousingElement = window.document.getElementById("SWITCH_HOUSING"); + + if (switchElement && swInnerElement && swHousingElement) { + const svgSwitch: SVGElement = switchElement as unknown as SVGElement; + const svgSwitchInner: SVGElement = + swInnerElement as unknown as SVGElement; + const svgSwitchHousing: SVGElement = + swHousingElement as unknown as SVGElement; + + svg.addClass(svgSwitch, "sim-slide-switch"); + + svgSwitch.onmouseup = (e) => props.onMouseUp(switchElement, e); + svgSwitchInner.onmouseup = (e) => props.onMouseUp(swInnerElement, e); + svgSwitchHousing.onmouseup = (e) => + props.onMouseUp(swHousingElement, e); + svgSwitch.onkeyup = (e) => props.onKeyEvent(e, false); + + accessibility.makeFocusable(svgSwitch); + accessibility.setAria(svgSwitch, "button", "On/Off Switch"); + } }; export const updateSwitch = (switchState: boolean): void => { - const switchElement = window.document.getElementById("SWITCH"); - const switchInner = (window.document.getElementById( - "SWITCH_INNER" - ) as unknown) as SVGElement; - - if (switchElement && switchInner) { - svg.addClass(switchInner, "sim-slide-switch-inner"); - - if (!switchState) { - svg.addClass(switchInner, "on"); - switchInner.setAttribute("transform", "translate(-5,0)"); - } else { - svg.removeClass(switchInner, "on"); - switchInner.removeAttribute("transform"); - } - switchElement.setAttribute("aria-pressed", switchState.toString()); - } + const switchElement = window.document.getElementById("SWITCH"); + const switchInner = window.document.getElementById( + "SWITCH_INNER", + ) as unknown as SVGElement; + + if (switchElement && switchInner) { + svg.addClass(switchInner, "sim-slide-switch-inner"); + + if (!switchState) { + svg.addClass(switchInner, "on"); + switchInner.setAttribute("transform", "translate(-5,0)"); + } else { + svg.removeClass(switchInner, "on"); + switchInner.removeAttribute("transform"); + } + switchElement.setAttribute("aria-pressed", switchState.toString()); + } }; export const updatePinTouch = (pinState: boolean, id: string): void => { - console.log(`updating ${id} with ${pinState}`); - const pinElement = window.document.getElementById(id); - const pinSvg: SVGElement = (pinElement as unknown) as SVGElement; - - if (pinElement && pinSvg) { - pinElement.setAttribute("aria-pressed", pinState.toString()); - pinState - ? svg.addClass(pinSvg, "pin-pressed") - : svg.removeClass(pinSvg, "pin-pressed"); - } + console.log(`updating ${id} with ${pinState}`); + const pinElement = window.document.getElementById(id); + const pinSvg: SVGElement = pinElement as unknown as SVGElement; + + if (pinElement && pinSvg) { + pinElement.setAttribute("aria-pressed", pinState.toString()); + pinState + ? svg.addClass(pinSvg, "pin-pressed") + : svg.removeClass(pinSvg, "pin-pressed"); + } }; export default CpxImage; diff --git a/Source/view/components/cpx/CpxSimulator.tsx b/Source/view/components/cpx/CpxSimulator.tsx index b0d77f441..bf90cfed4 100644 --- a/Source/view/components/cpx/CpxSimulator.tsx +++ b/Source/view/components/cpx/CpxSimulator.tsx @@ -13,380 +13,380 @@ import { BUTTON_NEUTRAL, BUTTON_PRESSED } from "./Cpx_svg_style"; import { CpxImage, updatePinTouch, updateSwitch } from "./CpxImage"; interface ICpxState { - pixels: number[][]; - brightness: number; - red_led: boolean; - button_a: boolean; - button_b: boolean; - switch: boolean; - touch: boolean[]; - shake: boolean; + pixels: number[][]; + brightness: number; + red_led: boolean; + button_a: boolean; + button_b: boolean; + switch: boolean; + touch: boolean[]; + shake: boolean; } interface IState { - active_editors: string[]; - running_file: string; - selected_file: string; - cpx: ICpxState; - play_button: boolean; - currently_selected_file: string; + active_editors: string[]; + running_file: string; + selected_file: string; + cpx: ICpxState; + play_button: boolean; + currently_selected_file: string; } const DEFAULT_CPX_STATE: ICpxState = { - brightness: 1.0, - button_a: false, - button_b: false, - pixels: [ - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - [0, 0, 0], - ], - red_led: false, - switch: false, - touch: [false, false, false, false, false, false, false], - shake: false, + brightness: 1.0, + button_a: false, + button_b: false, + pixels: [ + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + ], + red_led: false, + switch: false, + touch: [false, false, false, false, false, false, false], + shake: false, }; class Simulator extends React.Component<{}, IState> { - constructor(props: Readonly<{}>) { - super(props); - this.state = { - active_editors: [], - cpx: DEFAULT_CPX_STATE, - play_button: false, - running_file: "", - selected_file: "", - currently_selected_file: "", - }; - - this.handleClick = this.handleClick.bind(this); - this.onKeyEvent = this.onKeyEvent.bind(this); - this.onMouseDown = this.onMouseDown.bind(this); - this.onMouseUp = this.onMouseUp.bind(this); - this.onMouseLeave = this.onMouseLeave.bind(this); - this.togglePlayClick = this.togglePlayClick.bind(this); - this.refreshSimulatorClick = this.refreshSimulatorClick.bind(this); - } - - handleMessage = (event: any): void => { - const message = event.data; // The JSON data our extension sent - if (message.active_device !== DEVICE_LIST_KEY.CPX) { - return; - } - switch (message.command) { - case "reset-state": - console.log("Clearing the state"); - this.setState({ - cpx: DEFAULT_CPX_STATE, - play_button: false, - }); - break; - case "set-state": - console.log( - "Setting the state: " + JSON.stringify(message.state) - ); - this.setState({ - cpx: message.state, - play_button: true, - }); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - }); - break; - case "visible-editors": - console.log( - "Setting active editors", - message.state.activePythonEditors - ); - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - console.log("Setting current file", message.state.running_file); - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } - break; - } - }; - - componentDidMount() { - console.log("Mounted"); - window.addEventListener("message", this.handleMessage); - } - - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
-
- -
- -
- ); - } - - protected togglePlayClick() { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - } - - protected refreshSimulatorClick() { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - } - - protected onKeyEvent(event: KeyboardEvent, active: boolean) { - let element; - const target = event.target as SVGElement; - // Guard Clause - if (target === undefined) { - return; - } - - if ([event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER)) { - element = window.document.getElementById(target.id); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_A - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_B - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) - ) { - element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_AB - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.S) - ) { - element = window.document.getElementById(CONSTANTS.ID_NAME.SWITCH); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } else { - if (event.shiftKey) { - switch (event.code) { - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_ONE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A1 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_TWO: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A2 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_THREE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A3 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FOUR: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A4 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FIVE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A5 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SIX: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A6 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SEVEN: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A7 - ); - break; - } - } - } - if (element) { - event.preventDefault(); - this.handleClick(element, active); - element.focus(); - } - } - protected onMouseDown(button: HTMLElement, event: Event) { - event.preventDefault(); - this.handleClick(button, true); - button.focus(); - } - - protected onMouseUp(button: HTMLElement, event: Event) { - event.preventDefault(); - this.handleClick(button, false); - } - - protected onMouseLeave(button: HTMLElement, event: Event) { - event.preventDefault(); - - if (button.getAttribute("pressed") === "true") { - this.handleClick(button, false); - } - } - - private handleClick(element: HTMLElement, active: boolean) { - let newState; - let message; - if (element.id.includes("BTN")) { - newState = this.handleButtonClick(element, active); - message = "button-press"; - } else if (element.id.includes("SWITCH")) { - newState = this.handleSwitchClick(); - message = "button-press"; - } else if (element.id.includes("PIN")) { - newState = this.handleTouchPinClick(element, active); - message = "sensor-changed"; - } else { - return; - } - - if (newState && message) { - sendMessage(message, newState); - } - } - - private handleButtonClick(button: HTMLElement, active: boolean) { - const ButtonA: boolean = button.id.match(/BTN_A/) !== null; - const ButtonB: boolean = button.id.match(/BTN_B/) !== null; - const ButtonAB: boolean = button.id.match(/BTN_AB/) !== null; - let innerButton; - let newState; - - if (ButtonAB) { - innerButton = window.document.getElementById("BTN_AB_INNER"); - newState = { - button_a: active, - button_b: active, - }; - this.setState({ ...this.state, ...newState }); - } else if (ButtonA) { - innerButton = window.document.getElementById("BTN_A_INNER"); - newState = { - button_a: active, - }; - this.setState({ ...this.state, ...newState }); - } else if (ButtonB) { - innerButton = window.document.getElementById("BTN_B_INNER"); - newState = { - button_b: active, - }; - this.setState({ ...this.state, ...newState }); - } - - if (innerButton) { - innerButton.style.fill = this.getButtonColor(active); - } - - button.setAttribute("pressed", `${active}`); - return newState; - } - - private getButtonColor(pressed: boolean) { - const buttonUps = BUTTON_NEUTRAL; - const buttonDown = BUTTON_PRESSED; - return pressed ? buttonDown : buttonUps; - } - - private handleSwitchClick() { - const switchIsOn = !this.state.cpx.switch; - updateSwitch(switchIsOn); - this.setState({ - ...this.state, - cpx: { ...this.state.cpx, switch: switchIsOn }, - }); - return { switch: switchIsOn }; - } - - private handleTouchPinClick(pin: HTMLElement, active: boolean): any { - let cpxState = this.state.cpx; - const pinIndex = parseInt(pin.id.charAt(pin.id.length - 1)) - 1; - const pinState = cpxState.touch; - pinState[pinIndex] = active; - cpxState = { ...cpxState, touch: pinState }; - this.setState({ ...this.state, ...cpxState }); - updatePinTouch(active, pin.id); - return { touch: pinState }; - } + constructor(props: Readonly<{}>) { + super(props); + this.state = { + active_editors: [], + cpx: DEFAULT_CPX_STATE, + play_button: false, + running_file: "", + selected_file: "", + currently_selected_file: "", + }; + + this.handleClick = this.handleClick.bind(this); + this.onKeyEvent = this.onKeyEvent.bind(this); + this.onMouseDown = this.onMouseDown.bind(this); + this.onMouseUp = this.onMouseUp.bind(this); + this.onMouseLeave = this.onMouseLeave.bind(this); + this.togglePlayClick = this.togglePlayClick.bind(this); + this.refreshSimulatorClick = this.refreshSimulatorClick.bind(this); + } + + handleMessage = (event: any): void => { + const message = event.data; // The JSON data our extension sent + if (message.active_device !== DEVICE_LIST_KEY.CPX) { + return; + } + switch (message.command) { + case "reset-state": + console.log("Clearing the state"); + this.setState({ + cpx: DEFAULT_CPX_STATE, + play_button: false, + }); + break; + case "set-state": + console.log( + "Setting the state: " + JSON.stringify(message.state), + ); + this.setState({ + cpx: message.state, + play_button: true, + }); + break; + case "activate-play": + const newRunningFile = this.state.currently_selected_file; + + this.setState({ + play_button: !this.state.play_button, + running_file: newRunningFile, + }); + break; + case "visible-editors": + console.log( + "Setting active editors", + message.state.activePythonEditors, + ); + this.setState({ + active_editors: message.state.activePythonEditors, + }); + break; + case "current-file": + console.log("Setting current file", message.state.running_file); + if (this.state.play_button) { + this.setState({ + currently_selected_file: message.state.running_file, + }); + } else { + this.setState({ + running_file: message.state.running_file, + currently_selected_file: message.state.running_file, + }); + } + break; + } + }; + + componentDidMount() { + console.log("Mounted"); + window.addEventListener("message", this.handleMessage); + } + + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + + render() { + const playStopImage = this.state.play_button ? StopLogo : PlayLogo; + const playStopLabel = this.state.play_button ? "stop" : "play"; + return ( +
+
+ {this.state.running_file && this.state.play_button + ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) + : CONSTANTS.FILES_PLACEHOLDER} +
+
+ +
+ +
+ ); + } + + protected togglePlayClick() { + const button = + window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || + window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { + selected_file: this.state.selected_file, + state: !this.state.play_button, + }); + } + + protected refreshSimulatorClick() { + const button = window.document.getElementById( + CONSTANTS.ID_NAME.REFRESH_BUTTON, + ); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); + } + + protected onKeyEvent(event: KeyboardEvent, active: boolean) { + let element; + const target = event.target as SVGElement; + // Guard Clause + if (target === undefined) { + return; + } + + if ([event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER)) { + element = window.document.getElementById(target.id); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) + ) { + element = window.document.getElementById( + CONSTANTS.ID_NAME.BUTTON_A, + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) + ) { + element = window.document.getElementById( + CONSTANTS.ID_NAME.BUTTON_B, + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) + ) { + element = window.document.getElementById( + CONSTANTS.ID_NAME.BUTTON_AB, + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.S) + ) { + element = window.document.getElementById(CONSTANTS.ID_NAME.SWITCH); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { + this.togglePlayClick(); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { + this.refreshSimulatorClick(); + } else { + if (event.shiftKey) { + switch (event.code) { + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_ONE: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A1, + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_TWO: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A2, + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_THREE: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A3, + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FOUR: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A4, + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FIVE: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A5, + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SIX: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A6, + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SEVEN: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A7, + ); + break; + } + } + } + if (element) { + event.preventDefault(); + this.handleClick(element, active); + element.focus(); + } + } + protected onMouseDown(button: HTMLElement, event: Event) { + event.preventDefault(); + this.handleClick(button, true); + button.focus(); + } + + protected onMouseUp(button: HTMLElement, event: Event) { + event.preventDefault(); + this.handleClick(button, false); + } + + protected onMouseLeave(button: HTMLElement, event: Event) { + event.preventDefault(); + + if (button.getAttribute("pressed") === "true") { + this.handleClick(button, false); + } + } + + private handleClick(element: HTMLElement, active: boolean) { + let newState; + let message; + if (element.id.includes("BTN")) { + newState = this.handleButtonClick(element, active); + message = "button-press"; + } else if (element.id.includes("SWITCH")) { + newState = this.handleSwitchClick(); + message = "button-press"; + } else if (element.id.includes("PIN")) { + newState = this.handleTouchPinClick(element, active); + message = "sensor-changed"; + } else { + return; + } + + if (newState && message) { + sendMessage(message, newState); + } + } + + private handleButtonClick(button: HTMLElement, active: boolean) { + const ButtonA: boolean = button.id.match(/BTN_A/) !== null; + const ButtonB: boolean = button.id.match(/BTN_B/) !== null; + const ButtonAB: boolean = button.id.match(/BTN_AB/) !== null; + let innerButton; + let newState; + + if (ButtonAB) { + innerButton = window.document.getElementById("BTN_AB_INNER"); + newState = { + button_a: active, + button_b: active, + }; + this.setState({ ...this.state, ...newState }); + } else if (ButtonA) { + innerButton = window.document.getElementById("BTN_A_INNER"); + newState = { + button_a: active, + }; + this.setState({ ...this.state, ...newState }); + } else if (ButtonB) { + innerButton = window.document.getElementById("BTN_B_INNER"); + newState = { + button_b: active, + }; + this.setState({ ...this.state, ...newState }); + } + + if (innerButton) { + innerButton.style.fill = this.getButtonColor(active); + } + + button.setAttribute("pressed", `${active}`); + return newState; + } + + private getButtonColor(pressed: boolean) { + const buttonUps = BUTTON_NEUTRAL; + const buttonDown = BUTTON_PRESSED; + return pressed ? buttonDown : buttonUps; + } + + private handleSwitchClick() { + const switchIsOn = !this.state.cpx.switch; + updateSwitch(switchIsOn); + this.setState({ + ...this.state, + cpx: { ...this.state.cpx, switch: switchIsOn }, + }); + return { switch: switchIsOn }; + } + + private handleTouchPinClick(pin: HTMLElement, active: boolean): any { + let cpxState = this.state.cpx; + const pinIndex = parseInt(pin.id.charAt(pin.id.length - 1)) - 1; + const pinState = cpxState.touch; + pinState[pinIndex] = active; + cpxState = { ...cpxState, touch: pinState }; + this.setState({ ...this.state, ...cpxState }); + updatePinTouch(active, pin.id); + return { touch: pinState }; + } } export default Simulator; diff --git a/Source/view/components/cpx/Cpx_svg.tsx b/Source/view/components/cpx/Cpx_svg.tsx index 55864d460..e86d5ac2f 100644 --- a/Source/view/components/cpx/Cpx_svg.tsx +++ b/Source/view/components/cpx/Cpx_svg.tsx @@ -6,2997 +6,2997 @@ import * as React from "react"; export const CPX_SVG = ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); export default CPX_SVG; diff --git a/Source/view/components/cpx/Cpx_svg_style.tsx b/Source/view/components/cpx/Cpx_svg_style.tsx index 4eff14480..643a936f5 100644 --- a/Source/view/components/cpx/Cpx_svg_style.tsx +++ b/Source/view/components/cpx/Cpx_svg_style.tsx @@ -24,45 +24,45 @@ export const POWER_LED_OFF: string = "#FFFFFF"; // Adapted from : https://github.com/microsoft/pxt/blob/master/pxtsim/simlib.ts export function rgbToHsl( - rgb: [number, number, number] + rgb: [number, number, number], ): [number, number, number] { - const [r, g, b] = rgb; - const [r$, g$, b$] = [r / 255, g / 255, b / 255]; - const cMin = Math.min(r$, g$, b$); - const cMax = Math.max(r$, g$, b$); - const cDelta = cMax - cMin; - let h: number = 0, - s: number, - l: number; - const maxAndMin = cMax + cMin; + const [r, g, b] = rgb; + const [r$, g$, b$] = [r / 255, g / 255, b / 255]; + const cMin = Math.min(r$, g$, b$); + const cMax = Math.max(r$, g$, b$); + const cDelta = cMax - cMin; + let h: number = 0, + s: number, + l: number; + const maxAndMin = cMax + cMin; - // Luminosity - l = (maxAndMin / 2) * 100; + // Luminosity + l = (maxAndMin / 2) * 100; - if (cDelta === 0) { - s = 0; - h = 0; - } else { - // Hue - switch (cMax) { - case r$: - h = 60 * (((g$ - b$) / cDelta) % 6); - break; - case g$: - h = 60 * ((b$ - r$) / cDelta + 2); - break; - case b$: - h = 60 * ((r$ - g$) / cDelta + 4); - break; - } + if (cDelta === 0) { + s = 0; + h = 0; + } else { + // Hue + switch (cMax) { + case r$: + h = 60 * (((g$ - b$) / cDelta) % 6); + break; + case g$: + h = 60 * ((b$ - r$) / cDelta + 2); + break; + case b$: + h = 60 * ((r$ - g$) / cDelta + 4); + break; + } - // Saturation - l > 50 - ? (s = 100 * (cDelta / (2 - maxAndMin))) - : (s = 100 * (cDelta / maxAndMin)); - } + // Saturation + l > 50 + ? (s = 100 * (cDelta / (2 - maxAndMin))) + : (s = 100 * (cDelta / maxAndMin)); + } - return [Math.floor(h), Math.floor(s), Math.floor(l)]; + return [Math.floor(h), Math.floor(s), Math.floor(l)]; } export const SVG_STYLE = ` diff --git a/Source/view/components/cpx/Svg_utils.tsx b/Source/view/components/cpx/Svg_utils.tsx index 92836b923..4c7188cdb 100644 --- a/Source/view/components/cpx/Svg_utils.tsx +++ b/Source/view/components/cpx/Svg_utils.tsx @@ -5,94 +5,94 @@ // tslint:disable-next-line: no-namespace namespace svg { - export function addClass(el: SVGElement, cls: string) { - if (el.classList) { - el.classList.add(cls); - } else if (el.className.baseVal.indexOf(cls) < 0) { - el.className.baseVal += " " + cls; - } - } + export function addClass(el: SVGElement, cls: string) { + if (el.classList) { + el.classList.add(cls); + } else if (el.className.baseVal.indexOf(cls) < 0) { + el.className.baseVal += " " + cls; + } + } - export function removeClass(el: SVGElement, cls: string) { - if (el.classList) { - el.classList.remove(cls); - } else { - el.className.baseVal = el.className.baseVal - .replace(cls, "") - .replace(/\s{2,}/, " "); - } - } + export function removeClass(el: SVGElement, cls: string) { + if (el.classList) { + el.classList.remove(cls); + } else { + el.className.baseVal = el.className.baseVal + .replace(cls, "") + .replace(/\s{2,}/, " "); + } + } - export function hydrate(el: SVGElement, props: any) { - for (const k in props) { - if (k == "title") { - svg.title(el, props[k]); - } else { - el.setAttributeNS(null, k, props[k]); - } - } - } + export function hydrate(el: SVGElement, props: any) { + for (const k in props) { + if (k == "title") { + svg.title(el, props[k]); + } else { + el.setAttributeNS(null, k, props[k]); + } + } + } - export function createElement(name: string, props?: any): SVGElement { - const newElement = document.createElementNS( - "http://www.w3.org/2000/svg", - name - ); - if (props) { - svg.hydrate(newElement, props); - } - return newElement; - } + export function createElement(name: string, props?: any): SVGElement { + const newElement = document.createElementNS( + "http://www.w3.org/2000/svg", + name, + ); + if (props) { + svg.hydrate(newElement, props); + } + return newElement; + } - export function child( - parent: Element, - name: string, - props?: any - ): SVGElement { - const childElement = svg.createElement(name, props); - parent.appendChild(childElement); - return childElement; - } + export function child( + parent: Element, + name: string, + props?: any, + ): SVGElement { + const childElement = svg.createElement(name, props); + parent.appendChild(childElement); + return childElement; + } - export function fill(el: SVGElement, c: string) { - el.style.fill = c; - } + export function fill(el: SVGElement, c: string) { + el.style.fill = c; + } - export function filter(el: SVGElement, c: string) { - el.style.filter = c; - } + export function filter(el: SVGElement, c: string) { + el.style.filter = c; + } - export function fills(els: SVGElement[], c: string) { - els.forEach(el => (el.style.fill = c)); - } + export function fills(els: SVGElement[], c: string) { + els.forEach((el) => (el.style.fill = c)); + } - export function mkTitle(txt: string): SVGTitleElement { - const t = svg.createElement("title") as SVGTitleElement; - t.textContent = txt; - return t; - } + export function mkTitle(txt: string): SVGTitleElement { + const t = svg.createElement("title") as SVGTitleElement; + t.textContent = txt; + return t; + } - export function title(el: SVGElement, txt: string): SVGTitleElement { - const t = mkTitle(txt); - el.appendChild(t); - return t; - } + export function title(el: SVGElement, txt: string): SVGTitleElement { + const t = mkTitle(txt); + el.appendChild(t); + return t; + } - export function setLed( - ledStatus: boolean, - offColor: string, - onColor: string, - ledElement: SVGElement | null, - gradientStopElement: SVGStopElement | null - ) { - if (ledStatus) { - ledElement?.setAttribute("fill", onColor); - gradientStopElement?.setAttribute("stop-opacity", "1"); - } else { - ledElement?.setAttribute("fill", offColor); - gradientStopElement?.setAttribute("stop-opacity", "0"); - } - } + export function setLed( + ledStatus: boolean, + offColor: string, + onColor: string, + ledElement: SVGElement | null, + gradientStopElement: SVGStopElement | null, + ) { + if (ledStatus) { + ledElement?.setAttribute("fill", onColor); + gradientStopElement?.setAttribute("stop-opacity", "1"); + } else { + ledElement?.setAttribute("fill", offColor); + gradientStopElement?.setAttribute("stop-opacity", "0"); + } + } } export default svg; diff --git a/Source/view/components/microbit/Microbit.spec.tsx b/Source/view/components/microbit/Microbit.spec.tsx index 386086866..37945bb96 100644 --- a/Source/view/components/microbit/Microbit.spec.tsx +++ b/Source/view/components/microbit/Microbit.spec.tsx @@ -5,25 +5,25 @@ import * as testRenderer from "react-test-renderer"; import { Microbit } from "./Microbit"; describe("Microbit component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + , + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div, + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/components/microbit/Microbit.tsx b/Source/view/components/microbit/Microbit.tsx index e10c0bfb9..bfc78aa28 100644 --- a/Source/view/components/microbit/Microbit.tsx +++ b/Source/view/components/microbit/Microbit.tsx @@ -4,10 +4,10 @@ import * as React from "react"; import { MICROBIT_TOOLBAR_ICON_ID } from "../../components/toolbar/SensorModalUtils"; import { - GESTURES_MICROBIT, - SENSOR_LIST, - VSCODE_MESSAGES_TO_WEBVIEW, - WEBVIEW_MESSAGES, + GESTURES_MICROBIT, + SENSOR_LIST, + VSCODE_MESSAGES_TO_WEBVIEW, + WEBVIEW_MESSAGES, } from "../../constants"; import "../../styles/Simulator.css"; import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; @@ -17,114 +17,114 @@ import { MicrobitSimulator } from "./MicrobitSimulator"; // Component grouping the functionality for micro:bit functionalities interface IState { - sensors: { [key: string]: number }; - currentSelectedGesture?: string; + sensors: { [key: string]: number }; + currentSelectedGesture?: string; } const DEFAULT_STATE = { - sensors: { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, - [SENSOR_LIST.MOTION_X]: 0, - [SENSOR_LIST.MOTION_Y]: 0, - [SENSOR_LIST.MOTION_Z]: 0, - }, - currentSelectedGesture: GESTURES_MICROBIT[0], + sensors: { + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT]: 0, + [SENSOR_LIST.MOTION_X]: 0, + [SENSOR_LIST.MOTION_Y]: 0, + [SENSOR_LIST.MOTION_Z]: 0, + }, + currentSelectedGesture: GESTURES_MICROBIT[0], }; export class Microbit extends React.Component<{}, IState> { - state = DEFAULT_STATE; + state = DEFAULT_STATE; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } - componentWillUnmount() { - // Make sure to remove the DOM listener when the component is unmounted. - window.removeEventListener("message", this.handleMessage); - } - handleMessage = (event: any): void => { - const message = event.data; + componentWillUnmount() { + // Make sure to remove the DOM listener when the component is unmounted. + window.removeEventListener("message", this.handleMessage); + } + handleMessage = (event: any): void => { + const message = event.data; - switch (message.command) { - case VSCODE_MESSAGES_TO_WEBVIEW.RESET: - this.setState({ ...DEFAULT_STATE }); - break; - } - }; - render() { - return ( - - - - - ); - } - updateSensor = (sensor: SENSOR_LIST, value: number) => { - this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); - }; - updateGesture = (event: React.ChangeEvent) => { - this.setState({ currentSelectedGesture: event.target.value }); - }; - sendGesture = (isActive: boolean) => { - if (this.state.currentSelectedGesture) { - if (isActive) { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: this.state.currentSelectedGesture, - }); - } else { - sendMessage(WEBVIEW_MESSAGES.GESTURE, { - gesture: "", - }); - } - } - }; + switch (message.command) { + case VSCODE_MESSAGES_TO_WEBVIEW.RESET: + this.setState({ ...DEFAULT_STATE }); + break; + } + }; + render() { + return ( + + + + + ); + } + updateSensor = (sensor: SENSOR_LIST, value: number) => { + this.setState({ sensors: { ...this.state.sensors, [sensor]: value } }); + }; + updateGesture = (event: React.ChangeEvent) => { + this.setState({ currentSelectedGesture: event.target.value }); + }; + sendGesture = (isActive: boolean) => { + if (this.state.currentSelectedGesture) { + if (isActive) { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: this.state.currentSelectedGesture, + }); + } else { + sendMessage(WEBVIEW_MESSAGES.GESTURE, { + gesture: "", + }); + } + } + }; } const MICROBIT_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, - }, - { - image: TOOLBAR_SVG.RED_LED_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LEDS, - }, - { - image: TOOLBAR_SVG.TEMPERATURE_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, - }, - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - }, - { - image: TOOLBAR_SVG.GESTURE_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.GESTURE, - }, - { - image: TOOLBAR_SVG.GPIO_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.GPIO, - }, - { - image: TOOLBAR_SVG.COMPASS_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.COMPASS, - }, - { - image: TOOLBAR_SVG.SPEAKER_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.SOUND, - }, - { - image: TOOLBAR_SVG.WIRELESS_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.WIRELESS, - }, + { + image: TOOLBAR_SVG.PUSH_BUTTON_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, + }, + { + image: TOOLBAR_SVG.RED_LED_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.LEDS, + }, + { + image: TOOLBAR_SVG.TEMPERATURE_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, + }, + { + image: TOOLBAR_SVG.LIGHT_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, + }, + { + image: TOOLBAR_SVG.MOTION_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, + }, + { + image: TOOLBAR_SVG.GESTURE_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.GESTURE, + }, + { + image: TOOLBAR_SVG.GPIO_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.GPIO, + }, + { + image: TOOLBAR_SVG.COMPASS_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.COMPASS, + }, + { + image: TOOLBAR_SVG.SPEAKER_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.SOUND, + }, + { + image: TOOLBAR_SVG.WIRELESS_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.WIRELESS, + }, ]; diff --git a/Source/view/components/microbit/MicrobitImage.tsx b/Source/view/components/microbit/MicrobitImage.tsx index c9e95216a..b2fa83922 100644 --- a/Source/view/components/microbit/MicrobitImage.tsx +++ b/Source/view/components/microbit/MicrobitImage.tsx @@ -8,159 +8,163 @@ import { ViewStateContext } from "../../context"; import { IRefObject, MicrobitSvg } from "./Microbit_svg"; interface EventTriggers { - onMouseUp: (event: Event, buttonKey: string) => void; - onMouseDown: (event: Event, buttonKey: string) => void; - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; + onMouseUp: (event: Event, buttonKey: string) => void; + onMouseDown: (event: Event, buttonKey: string) => void; + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void; } interface IProps { - eventTriggers: EventTriggers; - leds: number[][]; + eventTriggers: EventTriggers; + leds: number[][]; } export enum BUTTONS_KEYS { - BTN_A = "BTN_A", - BTN_B = "BTN_B", - BTN_AB = "BTN_AB", + BTN_A = "BTN_A", + BTN_B = "BTN_B", + BTN_AB = "BTN_AB", } // Displays the SVG and call necessary svg modification. export class MicrobitImage extends React.Component { - private svgRef: React.RefObject = React.createRef(); - constructor(props: IProps) { - super(props); - } - componentDidMount() { - const svgElement = this.svgRef.current; - if (svgElement) { - updateAllLeds(this.props.leds, svgElement.getLeds()); - setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); - this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); - } - } - componentDidUpdate() { - if (this.svgRef.current) { - updateAllLeds(this.props.leds, this.svgRef.current.getLeds()); - if (this.context === VIEW_STATE.PAUSE) { - disableAllButtons(this.svgRef.current.getButtons()); - } else if (this.context === VIEW_STATE.RUNNING) { - setupAllButtons( - this.props.eventTriggers, - this.svgRef.current.getButtons() - ); - } - } - } - componentWillUnmount() { - window.document.removeEventListener("keydown", this.handleKeyDown); - window.document.removeEventListener("keyup", this.handleKeyUp); - } - setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void - ) => { - window.document.addEventListener("keydown", this.handleKeyDown); - window.document.addEventListener("keyup", this.handleKeyUp); - }; - handleKeyDown = (event: KeyboardEvent) => { - const keyEvents = [event.key, event.code]; - // Don't listen to keydown events for the run button, restart button and enter key - if ( - !( - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || - keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) - ) { - this.props.eventTriggers.onKeyEvent(event, true, event.key); - } - }; - handleKeyUp = (event: KeyboardEvent) => { - this.props.eventTriggers.onKeyEvent(event, false, event.key); - }; - render() { - return ; - } - public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { - const button = this.svgRef.current?.getButtons()[key].current; - if (button) { - button.focus(); - if (isActive) { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.KEYPRESSED - ); - } else { - button.children[0].setAttribute( - "class", - BUTTON_STYLING_CLASSES.DEFAULT - ); - } - button.setAttribute("pressed", `${isActive}`); - button.setAttribute("aria-pressed", `${isActive}`); - } - } + private svgRef: React.RefObject = React.createRef(); + constructor(props: IProps) { + super(props); + } + componentDidMount() { + const svgElement = this.svgRef.current; + if (svgElement) { + updateAllLeds(this.props.leds, svgElement.getLeds()); + setupAllButtons(this.props.eventTriggers, svgElement.getButtons()); + this.setupKeyPresses(this.props.eventTriggers.onKeyEvent); + } + } + componentDidUpdate() { + if (this.svgRef.current) { + updateAllLeds(this.props.leds, this.svgRef.current.getLeds()); + if (this.context === VIEW_STATE.PAUSE) { + disableAllButtons(this.svgRef.current.getButtons()); + } else if (this.context === VIEW_STATE.RUNNING) { + setupAllButtons( + this.props.eventTriggers, + this.svgRef.current.getButtons(), + ); + } + } + } + componentWillUnmount() { + window.document.removeEventListener("keydown", this.handleKeyDown); + window.document.removeEventListener("keyup", this.handleKeyUp); + } + setupKeyPresses = ( + onKeyEvent: ( + event: KeyboardEvent, + active: boolean, + key: string, + ) => void, + ) => { + window.document.addEventListener("keydown", this.handleKeyDown); + window.document.addEventListener("keyup", this.handleKeyUp); + }; + handleKeyDown = (event: KeyboardEvent) => { + const keyEvents = [event.key, event.code]; + // Don't listen to keydown events for the run button, restart button and enter key + if ( + !( + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) || + keyEvents.includes(CONSTANTS.KEYBOARD_KEYS.ENTER) + ) + ) { + this.props.eventTriggers.onKeyEvent(event, true, event.key); + } + }; + handleKeyUp = (event: KeyboardEvent) => { + this.props.eventTriggers.onKeyEvent(event, false, event.key); + }; + render() { + return ; + } + public updateButtonAttributes(key: BUTTONS_KEYS, isActive: boolean) { + const button = this.svgRef.current?.getButtons()[key].current; + if (button) { + button.focus(); + if (isActive) { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.KEYPRESSED, + ); + } else { + button.children[0].setAttribute( + "class", + BUTTON_STYLING_CLASSES.DEFAULT, + ); + } + button.setAttribute("pressed", `${isActive}`); + button.setAttribute("aria-pressed", `${isActive}`); + } + } } MicrobitImage.contextType = ViewStateContext; const setupButton = ( - buttonElement: SVGRectElement, - eventTriggers: EventTriggers, - key: string + buttonElement: SVGRectElement, + eventTriggers: EventTriggers, + key: string, ) => { - buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); + buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); - buttonElement.onmousedown = e => { - buttonElement.focus(); - eventTriggers.onMouseDown(e, key); - }; - buttonElement.onmouseup = e => { - eventTriggers.onMouseUp(e, key); - }; + buttonElement.onmousedown = (e) => { + buttonElement.focus(); + eventTriggers.onMouseDown(e, key); + }; + buttonElement.onmouseup = (e) => { + eventTriggers.onMouseUp(e, key); + }; - buttonElement.onkeydown = e => { - // ensure that the keydown is enter, - // or else it may register shortcuts twice - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - eventTriggers.onKeyEvent(e, true, key); - } - }; - buttonElement.onkeyup = e => { - eventTriggers.onKeyEvent(e, false, key); - }; + buttonElement.onkeydown = (e) => { + // ensure that the keydown is enter, + // or else it may register shortcuts twice + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + eventTriggers.onKeyEvent(e, true, key); + } + }; + buttonElement.onkeyup = (e) => { + eventTriggers.onKeyEvent(e, false, key); + }; }; const setupAllButtons = ( - eventTriggers: EventTriggers, - buttonRefs: IRefObject + eventTriggers: EventTriggers, + buttonRefs: IRefObject, ) => { - for (const [key, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - setupButton(ref.current, eventTriggers, key); - } - } + for (const [key, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + setupButton(ref.current, eventTriggers, key); + } + } }; const disableAllButtons = (buttonRefs: IRefObject) => { - for (const [, ref] of Object.entries(buttonRefs)) { - if (ref.current) { - // to implement - ref.current.onmousedown = null; - ref.current.onmouseup = null; - ref.current.onkeydown = null; - ref.current.onkeyup = null; - ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); - } - } + for (const [, ref] of Object.entries(buttonRefs)) { + if (ref.current) { + // to implement + ref.current.onmousedown = null; + ref.current.onmouseup = null; + ref.current.onkeydown = null; + ref.current.onkeyup = null; + ref.current.setAttribute("class", BUTTON_CLASSNAME.DEACTIVATED); + } + } }; const updateAllLeds = ( - leds: number[][], - ledRefs: Array>> + leds: number[][], + ledRefs: Array>>, ) => { - for (let j = 0; j < leds.length; j++) { - for (let i = 0; i < leds[0].length; i++) { - const ledElement = ledRefs[j][i].current; - if (ledElement) { - setupLed(ledElement, leds[i][j]); - } - } - } + for (let j = 0; j < leds.length; j++) { + for (let i = 0; i < leds[0].length; i++) { + const ledElement = ledRefs[j][i].current; + if (ledElement) { + setupLed(ledElement, leds[i][j]); + } + } + } }; const setupLed = (ledElement: SVGRectElement, brightness: number) => { - ledElement.style.opacity = (brightness / 10).toString(); + ledElement.style.opacity = (brightness / 10).toString(); }; diff --git a/Source/view/components/microbit/MicrobitSimulator.tsx b/Source/view/components/microbit/MicrobitSimulator.tsx index 467efcaaa..3c4c79a76 100644 --- a/Source/view/components/microbit/MicrobitSimulator.tsx +++ b/Source/view/components/microbit/MicrobitSimulator.tsx @@ -1,10 +1,10 @@ import * as React from "react"; import { - AB_BUTTONS_KEYS, - CONSTANTS, - DEVICE_LIST_KEY, - VIEW_STATE, - WEBVIEW_MESSAGES, + AB_BUTTONS_KEYS, + CONSTANTS, + DEVICE_LIST_KEY, + VIEW_STATE, + WEBVIEW_MESSAGES, } from "../../constants"; import { ViewStateContext } from "../../context"; import PlayLogo from "../../svgs/play_svg"; @@ -14,246 +14,246 @@ import ActionBar from "../simulator/ActionBar"; import { BUTTONS_KEYS, MicrobitImage } from "./MicrobitImage"; const DEFAULT_MICROBIT_STATE: IMicrobitState = { - leds: [ - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - ], - buttons: { button_a: false, button_b: false }, + leds: [ + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + ], + buttons: { button_a: false, button_b: false }, }; interface IState { - active_editors: string[]; - running_file?: string; - currently_selected_file: string; - play_button: boolean; - selected_file: string; - microbit: IMicrobitState; - sendGesture?: (isActive: boolean) => void; + active_editors: string[]; + running_file?: string; + currently_selected_file: string; + play_button: boolean; + selected_file: string; + microbit: IMicrobitState; + sendGesture?: (isActive: boolean) => void; } interface IMicrobitState { - leds: number[][]; - buttons: { button_a: boolean; button_b: boolean }; + leds: number[][]; + buttons: { button_a: boolean; button_b: boolean }; } export class MicrobitSimulator extends React.Component { - private imageRef: React.RefObject = React.createRef(); - constructor() { - super({}); - this.state = { - microbit: DEFAULT_MICROBIT_STATE, - play_button: false, - selected_file: "", - active_editors: [], - running_file: undefined, - currently_selected_file: "", - }; - this.onKeyEvent = this.onKeyEvent.bind(this); - } - handleMessage = (event: any): void => { - const message = event.data; + private imageRef: React.RefObject = React.createRef(); + constructor() { + super({}); + this.state = { + microbit: DEFAULT_MICROBIT_STATE, + play_button: false, + selected_file: "", + active_editors: [], + running_file: undefined, + currently_selected_file: "", + }; + this.onKeyEvent = this.onKeyEvent.bind(this); + } + handleMessage = (event: any): void => { + const message = event.data; - if (message.active_device !== DEVICE_LIST_KEY.MICROBIT) { - return; - } + if (message.active_device !== DEVICE_LIST_KEY.MICROBIT) { + return; + } - switch (message.command) { - case "reset-state": - this.setState({ - microbit: DEFAULT_MICROBIT_STATE, - play_button: false, - }); - break; - case "set-state": - this.setState({ - microbit: { - ...this.state.microbit, - leds: message.state.leds, - }, - }); - break; - case "activate-play": - const newRunningFile = this.state.currently_selected_file; - this.setState({ - play_button: !this.state.play_button, - running_file: newRunningFile, - }); - break; - case "visible-editors": - this.setState({ - active_editors: message.state.activePythonEditors, - }); - break; - case "current-file": - if (this.state.play_button) { - this.setState({ - currently_selected_file: message.state.running_file, - }); - } else { - this.setState({ - running_file: message.state.running_file, - currently_selected_file: message.state.running_file, - }); - } + switch (message.command) { + case "reset-state": + this.setState({ + microbit: DEFAULT_MICROBIT_STATE, + play_button: false, + }); + break; + case "set-state": + this.setState({ + microbit: { + ...this.state.microbit, + leds: message.state.leds, + }, + }); + break; + case "activate-play": + const newRunningFile = this.state.currently_selected_file; + this.setState({ + play_button: !this.state.play_button, + running_file: newRunningFile, + }); + break; + case "visible-editors": + this.setState({ + active_editors: message.state.activePythonEditors, + }); + break; + case "current-file": + if (this.state.play_button) { + this.setState({ + currently_selected_file: message.state.running_file, + }); + } else { + this.setState({ + running_file: message.state.running_file, + currently_selected_file: message.state.running_file, + }); + } - break; - } - }; - componentDidMount() { - window.addEventListener("message", this.handleMessage); - } - componentWillUnmount() { - window.removeEventListener("message", this.handleMessage); - } + break; + } + }; + componentDidMount() { + window.addEventListener("message", this.handleMessage); + } + componentWillUnmount() { + window.removeEventListener("message", this.handleMessage); + } - render() { - const playStopImage = this.state.play_button ? StopLogo : PlayLogo; - const playStopLabel = this.state.play_button ? "stop" : "play"; - return ( -
-
- {this.state.running_file && this.state.play_button - ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) - : CONSTANTS.FILES_PLACEHOLDER} -
-
- -
- -
- ); - } + render() { + const playStopImage = this.state.play_button ? StopLogo : PlayLogo; + const playStopLabel = this.state.play_button ? "stop" : "play"; + return ( +
+
+ {this.state.running_file && this.state.play_button + ? CONSTANTS.CURRENTLY_RUNNING(this.state.running_file) + : CONSTANTS.FILES_PLACEHOLDER} +
+
+ +
+ +
+ ); + } - protected togglePlayClick = () => { - const button = - window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || - window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - selected_file: this.state.selected_file, - state: !this.state.play_button, - }); - }; + protected togglePlayClick = () => { + const button = + window.document.getElementById(CONSTANTS.ID_NAME.PLAY_BUTTON) || + window.document.getElementById(CONSTANTS.ID_NAME.STOP_BUTTON); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { + selected_file: this.state.selected_file, + state: !this.state.play_button, + }); + }; - protected refreshSimulatorClick = () => { - const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON - ); - if (button) { - button.focus(); - } - sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); - }; - protected handleButtonClick = (key: string, isActive: boolean) => { - let newButtonState = this.state.microbit.buttons; - switch (key) { - case AB_BUTTONS_KEYS.BTN_A: - newButtonState.button_a = isActive; - break; - case AB_BUTTONS_KEYS.BTN_B: - newButtonState.button_b = isActive; - break; - case AB_BUTTONS_KEYS.BTN_AB: - newButtonState = { - button_a: isActive, - button_b: isActive, - }; - break; - } - sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); - this.setState({ - microbit: { - ...this.state.microbit, - buttons: newButtonState, - }, - }); - }; + protected refreshSimulatorClick = () => { + const button = window.document.getElementById( + CONSTANTS.ID_NAME.REFRESH_BUTTON, + ); + if (button) { + button.focus(); + } + sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); + }; + protected handleButtonClick = (key: string, isActive: boolean) => { + let newButtonState = this.state.microbit.buttons; + switch (key) { + case AB_BUTTONS_KEYS.BTN_A: + newButtonState.button_a = isActive; + break; + case AB_BUTTONS_KEYS.BTN_B: + newButtonState.button_b = isActive; + break; + case AB_BUTTONS_KEYS.BTN_AB: + newButtonState = { + button_a: isActive, + button_b: isActive, + }; + break; + } + sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); + this.setState({ + microbit: { + ...this.state.microbit, + buttons: newButtonState, + }, + }); + }; - protected onMouseUp = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, false); - }; + protected onMouseUp = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, false); + }; - protected onMouseDown = (event: Event, key: string) => { - event.preventDefault(); - this.handleButtonClick(key, true); - }; + protected onMouseDown = (event: Event, key: string) => { + event.preventDefault(); + this.handleButtonClick(key, true); + }; - protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { - event.stopPropagation(); - if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(key, active); - if (key === BUTTONS_KEYS.BTN_A) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if (key === BUTTONS_KEYS.BTN_B) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if (key === BUTTONS_KEYS.BTN_AB) { - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); + protected onKeyEvent(event: KeyboardEvent, active: boolean, key: string) { + event.stopPropagation(); + if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(key, active); + if (key === BUTTONS_KEYS.BTN_A) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active, + ); + } else if (key === BUTTONS_KEYS.BTN_B) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active, + ); + } else if (key === BUTTONS_KEYS.BTN_AB) { + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active, + ); + } + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_A, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_A, + active, + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_B, - active - ); - } else if ( - [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && - this.context === VIEW_STATE.RUNNING - ) { - this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_B, + active, + ); + } else if ( + [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && + this.context === VIEW_STATE.RUNNING + ) { + this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); - this.imageRef.current?.updateButtonAttributes( - BUTTONS_KEYS.BTN_AB, - active - ); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { - this.togglePlayClick(); - } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { - this.refreshSimulatorClick(); - } - } + this.imageRef.current?.updateButtonAttributes( + BUTTONS_KEYS.BTN_AB, + active, + ); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { + this.togglePlayClick(); + } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { + this.refreshSimulatorClick(); + } + } } MicrobitSimulator.contextType = ViewStateContext; diff --git a/Source/view/components/microbit/Microbit_svg.tsx b/Source/view/components/microbit/Microbit_svg.tsx index 22854c38f..6471998e9 100644 --- a/Source/view/components/microbit/Microbit_svg.tsx +++ b/Source/view/components/microbit/Microbit_svg.tsx @@ -7,1884 +7,1884 @@ import * as React from "react"; import "../../styles/SimulatorSvg.css"; export interface IRefObject { - [key: string]: React.RefObject; + [key: string]: React.RefObject; } /* tslint:disable */ const N_LED_COLUMN = 5; const N_LED_ROW = 5; export class MicrobitSvg extends React.Component { - constructor(props: Readonly<{}>) { - super(props); - for (let j = 0; j < N_LED_ROW; j++) { - const led_row: React.RefObject[] = []; - for (let i = 0; i < N_LED_COLUMN; i++) { - led_row.push(React.createRef()); - } - this.ledRefs.push(led_row); - } - } - private svgRef: React.RefObject = React.createRef(); + constructor(props: Readonly<{}>) { + super(props); + for (let j = 0; j < N_LED_ROW; j++) { + const led_row: React.RefObject[] = []; + for (let i = 0; i < N_LED_COLUMN; i++) { + led_row.push(React.createRef()); + } + this.ledRefs.push(led_row); + } + } + private svgRef: React.RefObject = React.createRef(); - private buttonRefs: IRefObject = { - BTN_A: React.createRef(), - BTN_B: React.createRef(), - BTN_AB: React.createRef(), - }; + private buttonRefs: IRefObject = { + BTN_A: React.createRef(), + BTN_B: React.createRef(), + BTN_AB: React.createRef(), + }; - private ledRefs: React.RefObject[][] = []; - public getSvgRef(): React.RefObject { - return this.svgRef; - } - public getButtons(): IRefObject { - return this.buttonRefs; - } - public getLeds(): React.RefObject[][] { - return this.ledRefs; - } + private ledRefs: React.RefObject[][] = []; + public getSvgRef(): React.RefObject { + return this.svgRef; + } + public getButtons(): IRefObject { + return this.buttonRefs; + } + public getLeds(): React.RefObject[][] { + return this.ledRefs; + } - render() { - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (0,0) - - - - (1,0) - - - - (2,0) - - - - (3,0) - - - - (4,0) - - - - (0,1) - - - - (1,1) - - - - (2,1) - - - - (3,1) - - - - (4,1) - - - - (0,2) - - - - (1,2) - - - - (2,2) - - - - (3,2) - - - - (4,2) - - - - (0,3) - - - - (1,3) - - - - (2,3) - - - - (3,3) - - - - (4,3) - - - - (0,4) - - - - (1,4) - - - - (2,4) - - - - (3,4) - - - - (4,4) - - - - - - - - - - P0, ANALOG IN - - - P1, ANALOG IN - - - P2, ANALOG IN - - - P3, ANALOG IN, LED Col 1 - - - P4, ANALOG IN, LED Col 2 - - - P5, BUTTON A - - - P6, LED Col 9 - - - P7, LED Col 8 - - - P8 - - - P9, LED Col 7 - - - P10, ANALOG IN, LED Col 3 - - - P11, BUTTON B - - - P12, RESERVED ACCESSIBILITY - - - P13, SPI - SCK - - - P14, SPI - MISO - - - P15, SPI - MOSI - - - P16, SPI - Chip Select - - - P17, +3v3 - - - P18, +3v3 - - - P19, I2C - SCL - - - P20, I2C - SDA - - - GND - - - GND - - - +3v3 - - - GND - - - - - - - - - - - - - - - - - - - - - - A+B - - - - - - - - - - - - - - - - - - - - - - - -
- ); - } + render() { + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (0,0) + + + + (1,0) + + + + (2,0) + + + + (3,0) + + + + (4,0) + + + + (0,1) + + + + (1,1) + + + + (2,1) + + + + (3,1) + + + + (4,1) + + + + (0,2) + + + + (1,2) + + + + (2,2) + + + + (3,2) + + + + (4,2) + + + + (0,3) + + + + (1,3) + + + + (2,3) + + + + (3,3) + + + + (4,3) + + + + (0,4) + + + + (1,4) + + + + (2,4) + + + + (3,4) + + + + (4,4) + + + + + + + + + + P0, ANALOG IN + + + P1, ANALOG IN + + + P2, ANALOG IN + + + P3, ANALOG IN, LED Col 1 + + + P4, ANALOG IN, LED Col 2 + + + P5, BUTTON A + + + P6, LED Col 9 + + + P7, LED Col 8 + + + P8 + + + P9, LED Col 7 + + + P10, ANALOG IN, LED Col 3 + + + P11, BUTTON B + + + P12, RESERVED ACCESSIBILITY + + + P13, SPI - SCK + + + P14, SPI - MISO + + + P15, SPI - MOSI + + + P16, SPI - Chip Select + + + P17, +3v3 + + + P18, +3v3 + + + P19, I2C - SCL + + + P20, I2C - SDA + + + GND + + + GND + + + +3v3 + + + GND + + + + + + + + + + + + + + + + + + + + + + A+B + + + + + + + + + + + + + + + + + + + + + + + +
+ ); + } } diff --git a/Source/view/components/simulator/ActionBar.tsx b/Source/view/components/simulator/ActionBar.tsx index b760817b8..151d3758a 100644 --- a/Source/view/components/simulator/ActionBar.tsx +++ b/Source/view/components/simulator/ActionBar.tsx @@ -7,42 +7,38 @@ import RefreshLogo from "../../svgs/refresh_svg"; import Button from "../Button"; interface IProps { - onTogglePlay: (event: React.MouseEvent) => void; - onToggleRefresh: (event: React.MouseEvent) => void; - playStopImage: JSX.Element; - playStopLabel: string; + onTogglePlay: (event: React.MouseEvent) => void; + onToggleRefresh: (event: React.MouseEvent) => void; + playStopImage: JSX.Element; + playStopLabel: string; } // Component including the actions done on the Simulator (play/stop, refresh) class ActionBar extends React.Component { - public render() { - const { - onTogglePlay, - onToggleRefresh, - playStopImage, - playStopLabel, - } = this.props; - return ( -
-
- ); - } + public render() { + const { onTogglePlay, onToggleRefresh, playStopImage, playStopLabel } = + this.props; + return ( +
+
+ ); + } } export default ActionBar; diff --git a/Source/view/components/toolbar/GenericSliderComponent.tsx b/Source/view/components/toolbar/GenericSliderComponent.tsx index 747721075..5fa4e79f8 100644 --- a/Source/view/components/toolbar/GenericSliderComponent.tsx +++ b/Source/view/components/toolbar/GenericSliderComponent.tsx @@ -4,38 +4,38 @@ import { ISensorProps, ISliderProps } from "../../viewUtils"; import InputSlider from "./InputSlider"; interface IProps { - axisProperties: ISensorProps; - axisValues: { - // key is accessed with axisLabel - [key: string]: number; - }; - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void; + axisProperties: ISensorProps; + axisValues: { + // key is accessed with axisLabel + [key: string]: number; + }; + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void; } -export const GenericSliderComponent: React.FC = props => { - return ( -
- {props.axisProperties.sliderProps.map( - (sliderProperties: ISliderProps, index: number) => { - return ( - - -
-
- ); - } - )} -
- ); +export const GenericSliderComponent: React.FC = (props) => { + return ( +
+ {props.axisProperties.sliderProps.map( + (sliderProperties: ISliderProps, index: number) => { + return ( + + +
+
+ ); + }, + )} +
+ ); }; diff --git a/Source/view/components/toolbar/Gesture.tsx b/Source/view/components/toolbar/Gesture.tsx index 4cf941f13..dcca09bd5 100644 --- a/Source/view/components/toolbar/Gesture.tsx +++ b/Source/view/components/toolbar/Gesture.tsx @@ -5,67 +5,67 @@ import SensorButton from "./SensorButton"; const GESTURE_BUTTON_MESSAGE = "Send Gesture"; interface IProps { - gestures: string[]; - onSelectGestures?: (event: React.ChangeEvent) => void; - onSendGesture?: (isActive: boolean) => void; + gestures: string[]; + onSelectGestures?: (event: React.ChangeEvent) => void; + onSendGesture?: (isActive: boolean) => void; } export class Gesture extends React.Component { - private sensorButtonRef: React.RefObject = React.createRef(); - render() { - return ( -
- - { - if (this.props.onSendGesture) { - this.props.onSendGesture(true); - } - }} - onMouseUp={() => { - if (this.props.onSendGesture) { - this.props.onSendGesture(false); - } - }} - onKeyDown={this.handleOnKeyDown} - onKeyUp={this.handleOnKeyUp} - type="gesture" - /> -
- ); - } - private handleOnKeyDown = (e: React.KeyboardEvent) => { - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - this.sensorButtonRef!.current!.setButtonClass(true); - if (this.props.onSendGesture) { - this.props.onSendGesture(true); - } - } - }; + private sensorButtonRef: React.RefObject = React.createRef(); + render() { + return ( +
+ + { + if (this.props.onSendGesture) { + this.props.onSendGesture(true); + } + }} + onMouseUp={() => { + if (this.props.onSendGesture) { + this.props.onSendGesture(false); + } + }} + onKeyDown={this.handleOnKeyDown} + onKeyUp={this.handleOnKeyUp} + type="gesture" + /> +
+ ); + } + private handleOnKeyDown = (e: React.KeyboardEvent) => { + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + this.sensorButtonRef!.current!.setButtonClass(true); + if (this.props.onSendGesture) { + this.props.onSendGesture(true); + } + } + }; - private handleOnKeyUp = ( - e: React.KeyboardEvent, - onSendGesture?: (isActive: boolean) => void - ) => { - if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { - this.sensorButtonRef!.current!.setButtonClass(false); + private handleOnKeyUp = ( + e: React.KeyboardEvent, + onSendGesture?: (isActive: boolean) => void, + ) => { + if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { + this.sensorButtonRef!.current!.setButtonClass(false); - if (this.props.onSendGesture) { - this.props.onSendGesture(false); - } - } - }; + if (this.props.onSendGesture) { + this.props.onSendGesture(false); + } + } + }; } diff --git a/Source/view/components/toolbar/InputSlider.tsx b/Source/view/components/toolbar/InputSlider.tsx index adfbcef60..8f5fd1161 100644 --- a/Source/view/components/toolbar/InputSlider.tsx +++ b/Source/view/components/toolbar/InputSlider.tsx @@ -9,122 +9,122 @@ import { sendMessage } from "../../utils/MessageUtils"; import { ISliderProps } from "../../viewUtils"; class InputSlider extends React.Component { - constructor(props: ISliderProps) { - super(props); - this.state = { - value: this.props.value, - }; + constructor(props: ISliderProps) { + super(props); + this.state = { + value: this.props.value, + }; - this.handleOnChange = this.handleOnChange.bind(this); - this.validateRange = this.validateRange.bind(this); - } + this.handleOnChange = this.handleOnChange.bind(this); + this.validateRange = this.validateRange.bind(this); + } - render() { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; + render() { + const isInputDisabled = this.context === VIEW_STATE.PAUSE; - const nbDecimals = - this.props.step.toString().split(".")[1]?.length || 0; - return ( -
- {this.props.axisLabel} - 0 ? 1 : 0}}[0-9]{0,${nbDecimals}}$`} - onKeyUp={this.handleOnChange} - style={{ width: this.getMaximumBoxWidth() + "ch" }} - aria-label={`${this.props.type} sensor input ${this.props.axisLabel}`} - /> - - - {this.props.minValue} - {this.props.maxValue} - - - - {this.props.minLabel} - {this.props.maxLabel} - - -
- ); - } + const nbDecimals = + this.props.step.toString().split(".")[1]?.length || 0; + return ( +
+ {this.props.axisLabel} + 0 ? 1 : 0}}[0-9]{0,${nbDecimals}}$`} + onKeyUp={this.handleOnChange} + style={{ width: this.getMaximumBoxWidth() + "ch" }} + aria-label={`${this.props.type} sensor input ${this.props.axisLabel}`} + /> + + + {this.props.minValue} + {this.props.maxValue} + + + + {this.props.minLabel} + {this.props.maxLabel} + + +
+ ); + } - private getMaximumBoxWidth = () => { - return ( - Math.max( - this.props.minValue.toString().length, - this.props.maxValue.toString().length - ) + 2 - ); - }; + private getMaximumBoxWidth = () => { + return ( + Math.max( + this.props.minValue.toString().length, + this.props.maxValue.toString().length, + ) + 2 + ); + }; - private handleOnChange = (event: any) => { - const validatedValue = this.validateRange(this.updateValue(event)); - const newSensorState = this.writeMessage(validatedValue); - if (newSensorState) { - sendMessage(WEBVIEW_MESSAGES.SENSOR_CHANGED, newSensorState); - } - }; + private handleOnChange = (event: any) => { + const validatedValue = this.validateRange(this.updateValue(event)); + const newSensorState = this.writeMessage(validatedValue); + if (newSensorState) { + sendMessage(WEBVIEW_MESSAGES.SENSOR_CHANGED, newSensorState); + } + }; - private writeMessage = (valueTowrite: number) => { - let value = valueTowrite; - if (value > this.props.maxValue || value < this.props.minValue) { - value = parseInt(this.state.value, 10); - } + private writeMessage = (valueTowrite: number) => { + let value = valueTowrite; + if (value > this.props.maxValue || value < this.props.minValue) { + value = parseInt(this.state.value, 10); + } - return this.props.type && this.state.value !== undefined - ? { [this.props.type]: value } - : undefined; - }; + return this.props.type && this.state.value !== undefined + ? { [this.props.type]: value } + : undefined; + }; - private updateValue = (event: any) => { - const newValue = event.target.validity.valid - ? event.target.value - : this.state.value; - if (this.props.onUpdateValue) { - this.props.onUpdateValue(this.props.type as SENSOR_LIST, newValue); - } - return newValue; - }; + private updateValue = (event: any) => { + const newValue = event.target.validity.valid + ? event.target.value + : this.state.value; + if (this.props.onUpdateValue) { + this.props.onUpdateValue(this.props.type as SENSOR_LIST, newValue); + } + return newValue; + }; - private sendTelemetry = () => { - sendMessage(WEBVIEW_MESSAGES.SLIDER_TELEMETRY, this.props.type); - }; + private sendTelemetry = () => { + sendMessage(WEBVIEW_MESSAGES.SLIDER_TELEMETRY, this.props.type); + }; - private validateRange = (valueString: string) => { - let valueInt = parseFloat(valueString); - if (valueInt < this.props.minValue) { - valueInt = this.props.minValue; - this.setState({ value: valueInt }); - } else if (valueInt > this.props.maxValue) { - valueInt = this.props.maxValue; - this.setState({ value: valueInt }); - } - return valueInt; - }; + private validateRange = (valueString: string) => { + let valueInt = parseFloat(valueString); + if (valueInt < this.props.minValue) { + valueInt = this.props.minValue; + this.setState({ value: valueInt }); + } else if (valueInt > this.props.maxValue) { + valueInt = this.props.maxValue; + this.setState({ value: valueInt }); + } + return valueInt; + }; } InputSlider.contextType = ViewStateContext; diff --git a/Source/view/components/toolbar/SensorButton.tsx b/Source/view/components/toolbar/SensorButton.tsx index b50759bd4..1111bd7c0 100644 --- a/Source/view/components/toolbar/SensorButton.tsx +++ b/Source/view/components/toolbar/SensorButton.tsx @@ -8,39 +8,39 @@ import "../../styles/SensorButton.css"; import { ISensorButtonProps } from "../../viewUtils"; class SensorButton extends React.Component { - private buttonRef: React.RefObject = React.createRef(); + private buttonRef: React.RefObject = React.createRef(); - public setButtonClass = (isActive: boolean) => { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; + public setButtonClass = (isActive: boolean) => { + const isInputDisabled = this.context === VIEW_STATE.PAUSE; - if (isActive && !isInputDisabled) { - this.buttonRef.current?.setAttribute( - "class", - "sensor-button active-button" - ); - } else if (this.buttonRef.current) { - this.buttonRef!.current!.setAttribute("class", "sensor-button"); - } - }; - render() { - const isInputDisabled = this.context === VIEW_STATE.PAUSE; + if (isActive && !isInputDisabled) { + this.buttonRef.current?.setAttribute( + "class", + "sensor-button active-button", + ); + } else if (this.buttonRef.current) { + this.buttonRef!.current!.setAttribute("class", "sensor-button"); + } + }; + render() { + const isInputDisabled = this.context === VIEW_STATE.PAUSE; - return ( - - ); - } + return ( + + ); + } } SensorButton.contextType = ViewStateContext; export default SensorButton; diff --git a/Source/view/components/toolbar/SensorModalUtils.tsx b/Source/view/components/toolbar/SensorModalUtils.tsx index c7ea53f85..4eff1c0ed 100644 --- a/Source/view/components/toolbar/SensorModalUtils.tsx +++ b/Source/view/components/toolbar/SensorModalUtils.tsx @@ -8,169 +8,168 @@ import * as CPX_MODAL from "./cpx/CpxModalContent"; import * as MICROBIT_MODAL from "./microbit/MicrobitModalContent"; export const TRY_IT_MAKE_CODE = ( - + ); export const FEATURE_REQUEST_ON_GITHUB = ( - + ); export const TOOLBAR_ICON_LABEL = { - GPIO: "GPIO", - IR: "IR", - LEFT_EDGE: "left-edge", - LIGHT: "Light sensor", - MOTION: "Motion Sensor", - NEO_PIXEL: "Neo Pixels", - PUSH_BUTTON: "Push Button", - RED_LED: "Red LED", - RIGHT_EDGE: "right-edge", - SOUND: "Sound Sensor", - SPEAKER: "Speaker", - SWITCH: "Switch", - TAG_INPUT: "Tag Input", - TAG_OUTPUT: "Tag Output", - TEMPERATURE: "Temperature Sensor", - WIRELESS: "Bluetooth and Radio", + GPIO: "GPIO", + IR: "IR", + LEFT_EDGE: "left-edge", + LIGHT: "Light sensor", + MOTION: "Motion Sensor", + NEO_PIXEL: "Neo Pixels", + PUSH_BUTTON: "Push Button", + RED_LED: "Red LED", + RIGHT_EDGE: "right-edge", + SOUND: "Sound Sensor", + SPEAKER: "Speaker", + SWITCH: "Switch", + TAG_INPUT: "Tag Input", + TAG_OUTPUT: "Tag Output", + TEMPERATURE: "Temperature Sensor", + WIRELESS: "Bluetooth and Radio", }; export const CPX_TOOLBAR_ICON_ID = { - GPIO: "toolbar-gpio", - IR: "toolbar-ir-sensor", - LEFT_EDGE: "left-edge", - LIGHT: "toolbar-light-sensor", - MOTION: "toolbar-motion-sensor", - NEO_PIXEL: "toolbar-neo-pixels", - PUSH_BUTTON: "toolbar-a-b-push", - RED_LED: "toolbar-red-led", - RIGHT_EDGE: "right-edge", - SOUND: "toolbar-sound-sensor", - SPEAKER: "toolbar-speaker", - SWITCH: "toolbar-slider-switch", - TEMPERATURE: "toolbar-temperature-sensor", + GPIO: "toolbar-gpio", + IR: "toolbar-ir-sensor", + LEFT_EDGE: "left-edge", + LIGHT: "toolbar-light-sensor", + MOTION: "toolbar-motion-sensor", + NEO_PIXEL: "toolbar-neo-pixels", + PUSH_BUTTON: "toolbar-a-b-push", + RED_LED: "toolbar-red-led", + RIGHT_EDGE: "right-edge", + SOUND: "toolbar-sound-sensor", + SPEAKER: "toolbar-speaker", + SWITCH: "toolbar-slider-switch", + TEMPERATURE: "toolbar-temperature-sensor", }; export const MICROBIT_TOOLBAR_ICON_ID = { - TEMPERATURE: "toolbar-microbit-temperature-sensor", - LIGHT: "toolbar-microbit-light-sensor", - ACCELEROMETER: "toolbar-accelerometer-sensor", - LEDS: "toolbar-microbit-led", - PUSH_BUTTON: "toolbar-microbit-a-b-push", - GPIO: "toolbar-gpio", - SOUND: "toolbar-microbit-sound", - WIRELESS: "toolbar-microbit-wireless", - GESTURE: "toolbar-microbit-gesture-sensor", - COMPASS: "toolbar-microbit-compass-sensor", + TEMPERATURE: "toolbar-microbit-temperature-sensor", + LIGHT: "toolbar-microbit-light-sensor", + ACCELEROMETER: "toolbar-accelerometer-sensor", + LEDS: "toolbar-microbit-led", + PUSH_BUTTON: "toolbar-microbit-a-b-push", + GPIO: "toolbar-gpio", + SOUND: "toolbar-microbit-sound", + WIRELESS: "toolbar-microbit-wireless", + GESTURE: "toolbar-microbit-gesture-sensor", + COMPASS: "toolbar-microbit-compass-sensor", }; export const CLUE_TOOLBAR_ICON_ID = { - TEMPERATURE: "toolbar-clue-temperature-sensor", - LIGHT: "toolbar-clue-light-sensor", - ACCELEROMETER: "toolbar-clue-accelerometer-sensor", - LEDS: "toolbar-clue-led", - PUSH_BUTTON: "toolbar-clue-a-b-push", - GPIO: "toolbar-clue-gpio", - SPEAKER: "toolbar-speaker", - SOUND: "toolbar-clue-sound-sensor", - PRESSURE: "toolbar-clue-pressure-sensor", - HUMIDITY: "toolbar-clue-humidity-sensor", - GESTURE: "toolbar-clue-gesture-sensor", - PROXIMITY: "toolbar-clue-proximity-sensor", - BLUETOOTH: "toolbar-clue-bluetooth", - MAGNETOSCOPE: "toolbar-clue-magnet-sensor", - GYROSCOPE: "toolbar-clue-gyroscope-sensor", + TEMPERATURE: "toolbar-clue-temperature-sensor", + LIGHT: "toolbar-clue-light-sensor", + ACCELEROMETER: "toolbar-clue-accelerometer-sensor", + LEDS: "toolbar-clue-led", + PUSH_BUTTON: "toolbar-clue-a-b-push", + GPIO: "toolbar-clue-gpio", + SPEAKER: "toolbar-speaker", + SOUND: "toolbar-clue-sound-sensor", + PRESSURE: "toolbar-clue-pressure-sensor", + HUMIDITY: "toolbar-clue-humidity-sensor", + GESTURE: "toolbar-clue-gesture-sensor", + PROXIMITY: "toolbar-clue-proximity-sensor", + BLUETOOTH: "toolbar-clue-bluetooth", + MAGNETOSCOPE: "toolbar-clue-magnet-sensor", + GYROSCOPE: "toolbar-clue-gyroscope-sensor", }; export interface IModalContent { - components: any; - descriptionText: string; - descriptionTitle: string; - id: string; - tagInput: any; - tagOutput: any; - tryItDescription: string; + components: any; + descriptionText: string; + descriptionTitle: string; + id: string; + tagInput: any; + tagOutput: any; + tryItDescription: string; } export const DEFAULT_MODAL_CONTENT: IModalContent = { - descriptionTitle: "default", - tagInput: undefined, - tagOutput: undefined, - descriptionText: "none", - tryItDescription: "none", - components: undefined, - id: "none", + descriptionTitle: "default", + tagInput: undefined, + tagOutput: undefined, + descriptionText: "none", + tryItDescription: "none", + components: undefined, + id: "none", }; export const LABEL_TO_MODAL_CONTENT_CONSTRUCTOR = new Map([ - [CPX_TOOLBAR_ICON_ID.GPIO, CPX_MODAL.GPIO_CONTENT], - [CPX_TOOLBAR_ICON_ID.IR, CPX_MODAL.IR_CONTENT], - [CPX_TOOLBAR_ICON_ID.LIGHT, CPX_MODAL.LIGHT_CONTENT], - [CPX_TOOLBAR_ICON_ID.MOTION, CPX_MODAL.MOTION_CONTENT], - [CPX_TOOLBAR_ICON_ID.NEO_PIXEL, CPX_MODAL.NEOP_CONTENT], - [CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, CPX_MODAL.PUSHB_CONTENT], - [CPX_TOOLBAR_ICON_ID.RED_LED, CPX_MODAL.RED_LED_CONTENT], - [CPX_TOOLBAR_ICON_ID.SOUND, CPX_MODAL.SOUND_CONTENT], - [CPX_TOOLBAR_ICON_ID.SPEAKER, CPX_MODAL.SPEAKER_CONTENT], - [CPX_TOOLBAR_ICON_ID.SWITCH, CPX_MODAL.SWITCH_CONTENT], - [CPX_TOOLBAR_ICON_ID.TEMPERATURE, CPX_MODAL.TEMPERATURE_CONTENT], - [ - MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - MICROBIT_MODAL.ACCELEROMETER_CONTENT, - ], - [MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, MICROBIT_MODAL.TEMPERATURE_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.LIGHT, MICROBIT_MODAL.LIGHT_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.LEDS, MICROBIT_MODAL.LED_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, MICROBIT_MODAL.BUTTON_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.GPIO, MICROBIT_MODAL.GPIO_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.SOUND, MICROBIT_MODAL.SOUND_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.WIRELESS, MICROBIT_MODAL.WIRELESS_CONTENT], - [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], - [CLUE_TOOLBAR_ICON_ID.TEMPERATURE, CLUE_MODAL.TEMPERATURE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, CLUE_MODAL.BUTTON_CONTENT], - [CLUE_TOOLBAR_ICON_ID.GPIO, CLUE_MODAL.GPIO_CONTENT], - [CLUE_TOOLBAR_ICON_ID.LIGHT, CLUE_MODAL.LIGHT_CONTENT], - [CLUE_TOOLBAR_ICON_ID.LEDS, CLUE_MODAL.LED_CONTENT], - [CLUE_TOOLBAR_ICON_ID.SOUND, CLUE_MODAL.SOUND_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PRESSURE, CLUE_MODAL.PRESSURE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.HUMIDITY, CLUE_MODAL.HUMIDITY_CONTENT], - [CLUE_TOOLBAR_ICON_ID.PROXIMITY, CLUE_MODAL.PROXIMITY_CONTENT], - [CLUE_TOOLBAR_ICON_ID.BLUETOOTH, CLUE_MODAL.BLUETOOTH_CONTENT], - [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.SPEAKER, CLUE_MODAL.SPEAKER_CONTENT], - [CLUE_TOOLBAR_ICON_ID.GYROSCOPE, CLUE_MODAL.GYROSCOPE_CONTENT], - [CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, CLUE_MODAL.MAGNETOSCOPE_CONTENT], + [CPX_TOOLBAR_ICON_ID.GPIO, CPX_MODAL.GPIO_CONTENT], + [CPX_TOOLBAR_ICON_ID.IR, CPX_MODAL.IR_CONTENT], + [CPX_TOOLBAR_ICON_ID.LIGHT, CPX_MODAL.LIGHT_CONTENT], + [CPX_TOOLBAR_ICON_ID.MOTION, CPX_MODAL.MOTION_CONTENT], + [CPX_TOOLBAR_ICON_ID.NEO_PIXEL, CPX_MODAL.NEOP_CONTENT], + [CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, CPX_MODAL.PUSHB_CONTENT], + [CPX_TOOLBAR_ICON_ID.RED_LED, CPX_MODAL.RED_LED_CONTENT], + [CPX_TOOLBAR_ICON_ID.SOUND, CPX_MODAL.SOUND_CONTENT], + [CPX_TOOLBAR_ICON_ID.SPEAKER, CPX_MODAL.SPEAKER_CONTENT], + [CPX_TOOLBAR_ICON_ID.SWITCH, CPX_MODAL.SWITCH_CONTENT], + [CPX_TOOLBAR_ICON_ID.TEMPERATURE, CPX_MODAL.TEMPERATURE_CONTENT], + [ + MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, + MICROBIT_MODAL.ACCELEROMETER_CONTENT, + ], + [MICROBIT_TOOLBAR_ICON_ID.TEMPERATURE, MICROBIT_MODAL.TEMPERATURE_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.LIGHT, MICROBIT_MODAL.LIGHT_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.LEDS, MICROBIT_MODAL.LED_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.PUSH_BUTTON, MICROBIT_MODAL.BUTTON_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.GPIO, MICROBIT_MODAL.GPIO_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.SOUND, MICROBIT_MODAL.SOUND_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.WIRELESS, MICROBIT_MODAL.WIRELESS_CONTENT], + [MICROBIT_TOOLBAR_ICON_ID.COMPASS, MICROBIT_MODAL.COMPASS_CONTENT], + [CLUE_TOOLBAR_ICON_ID.TEMPERATURE, CLUE_MODAL.TEMPERATURE_CONTENT], + [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], + [CLUE_TOOLBAR_ICON_ID.PUSH_BUTTON, CLUE_MODAL.BUTTON_CONTENT], + [CLUE_TOOLBAR_ICON_ID.GPIO, CLUE_MODAL.GPIO_CONTENT], + [CLUE_TOOLBAR_ICON_ID.LIGHT, CLUE_MODAL.LIGHT_CONTENT], + [CLUE_TOOLBAR_ICON_ID.LEDS, CLUE_MODAL.LED_CONTENT], + [CLUE_TOOLBAR_ICON_ID.SOUND, CLUE_MODAL.SOUND_CONTENT], + [CLUE_TOOLBAR_ICON_ID.PRESSURE, CLUE_MODAL.PRESSURE_CONTENT], + [CLUE_TOOLBAR_ICON_ID.HUMIDITY, CLUE_MODAL.HUMIDITY_CONTENT], + [CLUE_TOOLBAR_ICON_ID.PROXIMITY, CLUE_MODAL.PROXIMITY_CONTENT], + [CLUE_TOOLBAR_ICON_ID.BLUETOOTH, CLUE_MODAL.BLUETOOTH_CONTENT], + [CLUE_TOOLBAR_ICON_ID.ACCELEROMETER, CLUE_MODAL.ACCELEROMETER_CONTENT], + [CLUE_TOOLBAR_ICON_ID.SPEAKER, CLUE_MODAL.SPEAKER_CONTENT], + [CLUE_TOOLBAR_ICON_ID.GYROSCOPE, CLUE_MODAL.GYROSCOPE_CONTENT], + [CLUE_TOOLBAR_ICON_ID.MAGNETOSCOPE, CLUE_MODAL.MAGNETOSCOPE_CONTENT], ]); export const getModalContent = ( - label: string, - onUpdateValue: (onUpdateValue: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number }, - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void + label: string, + onUpdateValue: (onUpdateValue: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, + onSelectGestures?: (event: React.ChangeEvent) => void, + sendGesture?: (isActive: boolean) => void, ) => { - if (label === CLUE_TOOLBAR_ICON_ID.GESTURE) { - return CLUE_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); - } else if (label === MICROBIT_TOOLBAR_ICON_ID.GESTURE) { - return MICROBIT_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); - } - const modalContentConstructor = LABEL_TO_MODAL_CONTENT_CONSTRUCTOR.get( - label - ); - if (modalContentConstructor) { - return modalContentConstructor(onUpdateValue, sensorValues); - } else { - return; - } + if (label === CLUE_TOOLBAR_ICON_ID.GESTURE) { + return CLUE_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); + } else if (label === MICROBIT_TOOLBAR_ICON_ID.GESTURE) { + return MICROBIT_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); + } + const modalContentConstructor = + LABEL_TO_MODAL_CONTENT_CONSTRUCTOR.get(label); + if (modalContentConstructor) { + return modalContentConstructor(onUpdateValue, sensorValues); + } else { + return; + } }; diff --git a/Source/view/components/toolbar/ToolBar.tsx b/Source/view/components/toolbar/ToolBar.tsx index a2a3ee1a2..8a7e3c768 100644 --- a/Source/view/components/toolbar/ToolBar.tsx +++ b/Source/view/components/toolbar/ToolBar.tsx @@ -5,217 +5,217 @@ import { Callout, TooltipHost } from "office-ui-fabric-react"; import { IconButton } from "office-ui-fabric-react"; import * as React from "react"; import { - FormattedMessage, - injectIntl, - WrappedComponentProps, + FormattedMessage, + injectIntl, + WrappedComponentProps, } from "react-intl"; import { SENSOR_LIST } from "../../constants"; import "../../styles/ToolBar.css"; import Button from "../Button"; import { - DEFAULT_MODAL_CONTENT, - getModalContent, - IModalContent, + DEFAULT_MODAL_CONTENT, + getModalContent, + IModalContent, } from "./SensorModalUtils"; interface IToolbarState { - currentOpenedId: string; - showModal: boolean; - isDescriptionVisible: boolean; + currentOpenedId: string; + showModal: boolean; + isDescriptionVisible: boolean; } interface IProps extends WrappedComponentProps { - buttonList: Array<{ - label: any; - image: any; - }>; - onUpdateSensor: (sensor: SENSOR_LIST, value: number) => void; - sensorValues: { [key: string]: number }; - onSelectGesture?: (event: React.ChangeEvent) => void; - sendGesture?: (isActive: boolean) => void; + buttonList: Array<{ + label: any; + image: any; + }>; + onUpdateSensor: (sensor: SENSOR_LIST, value: number) => void; + sensorValues: { [key: string]: number }; + onSelectGesture?: (event: React.ChangeEvent) => void; + sendGesture?: (isActive: boolean) => void; } class ToolBar extends React.Component { - private readonly TOOLBAR_BUTTON_WIDTH: number = 32; - - constructor(props: IProps) { - super(props); - initializeIcons(); - this.state = { - currentOpenedId: "", - isDescriptionVisible: false, - showModal: false, - }; - } - - public render() { - const { buttonList } = this.props; - return ( -
-
-
- {buttonList.map( - (currrentButton: any, index: number) => { - return ( - ( - - ), - }} - key={index} - > -
- {this.getIconModal()} -
-
- ); - } - - private handleOnClick = ( - event: React.MouseEvent, - label: string - ) => { - if ( - !this.state.showModal && - this.state.currentOpenedId === "" && - this.state.currentOpenedId !== label - ) { - this.openModal(label); - } else { - this.closeCurrentModal(); - if (this.state.currentOpenedId !== label) { - this.openModal(label); - } - } - }; - - private changePressedState(id: string, pressed: boolean) { - const elt = window.document.getElementById(`${id}-button`); - if (elt) { - pressed - ? elt.classList.add("button-pressed") - : elt.classList.remove("button-pressed"); - } - } - private closeCurrentModal = () => { - this.changePressedState(this.state.currentOpenedId, false); - this.setState({ - currentOpenedId: "", - showModal: false, - }); - }; - - private openModal = (label: string) => { - this.setState({ - currentOpenedId: label, - showModal: true, - }); - this.changePressedState(label, true); - }; - - private onShowDescriptionClicked = (): void => { - this.setState({ - isDescriptionVisible: !this.state.isDescriptionVisible, - }); - }; - - private onDescriptionDismiss = (): void => { - this.setState({ - isDescriptionVisible: false, - }); - }; - - private getIconModal() { - if ( - !this.state.showModal || - !getModalContent( - this.state.currentOpenedId, - this.props.onUpdateSensor, - this.props.sensorValues, - this.props.onSelectGesture, - this.props.sendGesture - ) - ) { - return null; - } - - const content = getModalContent( - this.state.currentOpenedId, - this.props.onUpdateSensor, - this.props.sensorValues, - this.props.onSelectGesture, - this.props.sendGesture - ) as IModalContent; - - const components = content - ? content.components - : DEFAULT_MODAL_CONTENT.components; - - return ( -
-
- - - {content.tagInput} - {content.tagOutput} - - -
-
- {this.state.isDescriptionVisible && ( - -
- -
-
- )} -
-
- - - -
- -
{components}
-
-
- ); - } + private readonly TOOLBAR_BUTTON_WIDTH: number = 32; + + constructor(props: IProps) { + super(props); + initializeIcons(); + this.state = { + currentOpenedId: "", + isDescriptionVisible: false, + showModal: false, + }; + } + + public render() { + const { buttonList } = this.props; + return ( +
+
+
+ {buttonList.map( + (currrentButton: any, index: number) => { + return ( + ( + + ), + }} + key={index} + > +
+ {this.getIconModal()} +
+
+ ); + } + + private handleOnClick = ( + event: React.MouseEvent, + label: string, + ) => { + if ( + !this.state.showModal && + this.state.currentOpenedId === "" && + this.state.currentOpenedId !== label + ) { + this.openModal(label); + } else { + this.closeCurrentModal(); + if (this.state.currentOpenedId !== label) { + this.openModal(label); + } + } + }; + + private changePressedState(id: string, pressed: boolean) { + const elt = window.document.getElementById(`${id}-button`); + if (elt) { + pressed + ? elt.classList.add("button-pressed") + : elt.classList.remove("button-pressed"); + } + } + private closeCurrentModal = () => { + this.changePressedState(this.state.currentOpenedId, false); + this.setState({ + currentOpenedId: "", + showModal: false, + }); + }; + + private openModal = (label: string) => { + this.setState({ + currentOpenedId: label, + showModal: true, + }); + this.changePressedState(label, true); + }; + + private onShowDescriptionClicked = (): void => { + this.setState({ + isDescriptionVisible: !this.state.isDescriptionVisible, + }); + }; + + private onDescriptionDismiss = (): void => { + this.setState({ + isDescriptionVisible: false, + }); + }; + + private getIconModal() { + if ( + !this.state.showModal || + !getModalContent( + this.state.currentOpenedId, + this.props.onUpdateSensor, + this.props.sensorValues, + this.props.onSelectGesture, + this.props.sendGesture, + ) + ) { + return null; + } + + const content = getModalContent( + this.state.currentOpenedId, + this.props.onUpdateSensor, + this.props.sensorValues, + this.props.onSelectGesture, + this.props.sendGesture, + ) as IModalContent; + + const components = content + ? content.components + : DEFAULT_MODAL_CONTENT.components; + + return ( +
+
+ + + {content.tagInput} + {content.tagOutput} + + +
+
+ {this.state.isDescriptionVisible && ( + +
+ +
+
+ )} +
+
+ + + +
+ +
{components}
+
+
+ ); + } } export default injectIntl(ToolBar); diff --git a/Source/view/components/toolbar/Toolbar.spec.tsx b/Source/view/components/toolbar/Toolbar.spec.tsx index 7598ff1c0..429c58ebd 100644 --- a/Source/view/components/toolbar/Toolbar.spec.tsx +++ b/Source/view/components/toolbar/Toolbar.spec.tsx @@ -8,50 +8,50 @@ import { MICROBIT_TOOLBAR_ICON_ID } from "./SensorModalUtils"; import Toolbar from "./ToolBar"; const MOCK_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ - { - image: TOOLBAR_SVG.LIGHT_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, - }, - { - image: TOOLBAR_SVG.MOTION_SVG, - label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, - }, + { + image: TOOLBAR_SVG.LIGHT_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.LIGHT, + }, + { + image: TOOLBAR_SVG.MOTION_SVG, + label: MICROBIT_TOOLBAR_ICON_ID.ACCELEROMETER, + }, ]; const mockUpdateSensors = () => { - return; + return; }; const mockInitialValues = { - [SENSOR_LIST.TEMPERATURE]: 0, - [SENSOR_LIST.LIGHT]: 0, + [SENSOR_LIST.TEMPERATURE]: 0, + [SENSOR_LIST.LIGHT]: 0, }; describe("Toolbar component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + , + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div, + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/components/toolbar/clue/ClueModalContent.tsx b/Source/view/components/toolbar/clue/ClueModalContent.tsx index b4fc4a136..02b4db110 100644 --- a/Source/view/components/toolbar/clue/ClueModalContent.tsx +++ b/Source/view/components/toolbar/clue/ClueModalContent.tsx @@ -8,311 +8,311 @@ import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; import * as SENSOR_PROPERTIES from "./ClueSensorProperties"; export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-clue-temperature-sensor.description", - descriptionTitle: "toolbar-clue-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-temperature-sensor.tryItDescription", - }; + const temperatureSensorValues = { + T: sensorValues[SENSOR_LIST.TEMPERATURE], + }; + return { + components: [ + , + ], + descriptionText: "toolbar-clue-temperature-sensor.description", + descriptionTitle: "toolbar-clue-temperature-sensor.title", + id: "temperature", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-temperature-sensor.tryItDescription", + }; }; export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-gpio.description", - tryItDescription: "toolbar-clue-gpio.tryItDescription", - components: undefined, - id: "GPIO", - }; + return { + descriptionTitle: "toolbar-clue-gpio.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-gpio.description", + tryItDescription: "toolbar-clue-gpio.tryItDescription", + components: undefined, + id: "GPIO", + }; }; export const ACCELEROMETER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - const accelerometerSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-accelerometer-sensor.description", - descriptionTitle: "toolbar-clue-accelerometer-sensor.title", - id: "accelerometer", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-accelerometer-sensor.tryItDescription", - }; + const accelerometerSensorValues = { + X: sensorValues[SENSOR_LIST.MOTION_X], + Y: sensorValues[SENSOR_LIST.MOTION_Y], + Z: sensorValues[SENSOR_LIST.MOTION_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-accelerometer-sensor.description", + descriptionTitle: "toolbar-clue-accelerometer-sensor.title", + id: "accelerometer", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-accelerometer-sensor.tryItDescription", + }; }; export const GYROSCOPE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - const gyroSensorValues = { - X: sensorValues[SENSOR_LIST.GYRO_X], - Y: sensorValues[SENSOR_LIST.GYRO_Y], - Z: sensorValues[SENSOR_LIST.GYRO_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-gyroscope-sensor.description", - descriptionTitle: "toolbar-clue-gyroscope-sensor.title", - id: "gyroscope", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-gyroscope-sensor.tryItDescription", - }; + const gyroSensorValues = { + X: sensorValues[SENSOR_LIST.GYRO_X], + Y: sensorValues[SENSOR_LIST.GYRO_Y], + Z: sensorValues[SENSOR_LIST.GYRO_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-gyroscope-sensor.description", + descriptionTitle: "toolbar-clue-gyroscope-sensor.title", + id: "gyroscope", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-gyroscope-sensor.tryItDescription", + }; }; export const MAGNETOSCOPE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - const magnetSensorValues = { - X: sensorValues[SENSOR_LIST.MAGNET_X], - Y: sensorValues[SENSOR_LIST.MAGNET_Y], - Z: sensorValues[SENSOR_LIST.MAGNET_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-magnet-sensor.description", - descriptionTitle: "toolbar-clue-magnet-sensor.title", - id: "magnetoscope", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-magnet-sensor.tryItDescription", - }; + const magnetSensorValues = { + X: sensorValues[SENSOR_LIST.MAGNET_X], + Y: sensorValues[SENSOR_LIST.MAGNET_Y], + Z: sensorValues[SENSOR_LIST.MAGNET_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-magnet-sensor.description", + descriptionTitle: "toolbar-clue-magnet-sensor.title", + id: "magnetoscope", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-magnet-sensor.tryItDescription", + }; }; export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - const lightSensorValues = { - R: sensorValues[SENSOR_LIST.LIGHT_R], - G: sensorValues[SENSOR_LIST.LIGHT_G], - B: sensorValues[SENSOR_LIST.LIGHT_B], - C: sensorValues[SENSOR_LIST.LIGHT_C], - }; - return { - components: ( - - ), - descriptionText: "toolbar-clue-light-sensor.description", - descriptionTitle: "toolbar-clue-light-sensor.title", - id: "light_sensor", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-clue-light-sensor.tryItDescription", - }; + const lightSensorValues = { + R: sensorValues[SENSOR_LIST.LIGHT_R], + G: sensorValues[SENSOR_LIST.LIGHT_G], + B: sensorValues[SENSOR_LIST.LIGHT_B], + C: sensorValues[SENSOR_LIST.LIGHT_C], + }; + return { + components: ( + + ), + descriptionText: "toolbar-clue-light-sensor.description", + descriptionTitle: "toolbar-clue-light-sensor.title", + id: "light_sensor", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-clue-light-sensor.tryItDescription", + }; }; export const HUMIDITY_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - const humiditySensorValues = { - H: sensorValues[SENSOR_LIST.HUMIDITY], - }; - return { - descriptionTitle: "toolbar-clue-humidity-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-humidity-sensor.description", - tryItDescription: "toolbar-clue-humidity-sensor.tryItDescription", - components: [ - , - ], - id: "humidity_sensor", - }; + const humiditySensorValues = { + H: sensorValues[SENSOR_LIST.HUMIDITY], + }; + return { + descriptionTitle: "toolbar-clue-humidity-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-humidity-sensor.description", + tryItDescription: "toolbar-clue-humidity-sensor.tryItDescription", + components: [ + , + ], + id: "humidity_sensor", + }; }; export const GESTURE_CONTENT = ( - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void + onSelectGestures?: (event: React.ChangeEvent) => void, + sendGesture?: (isActive: boolean) => void, ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-gesture-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-gesture-sensor.description", - tryItDescription: "toolbar-clue-gesture-sensor.tryItDescription", - components: [ - , - ], - id: "gesture_sensor", - }; + return { + descriptionTitle: "toolbar-clue-gesture-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-gesture-sensor.description", + tryItDescription: "toolbar-clue-gesture-sensor.tryItDescription", + components: [ + , + ], + id: "gesture_sensor", + }; }; export const PROXIMITY_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - const proximitySensorValues = { - P: sensorValues[SENSOR_LIST.PROXIMITY], - }; - return { - descriptionTitle: "toolbar-clue-proximity-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-proximity-sensor.description", - tryItDescription: "toolbar-clue-proximity-sensor.tryItDescription", - components: [ - , - ], - id: "proximity_sensor", - }; + const proximitySensorValues = { + P: sensorValues[SENSOR_LIST.PROXIMITY], + }; + return { + descriptionTitle: "toolbar-clue-proximity-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-proximity-sensor.description", + tryItDescription: "toolbar-clue-proximity-sensor.tryItDescription", + components: [ + , + ], + id: "proximity_sensor", + }; }; export const PRESSURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - const pressureSensorValues = { - P: sensorValues[SENSOR_LIST.PRESSURE], - }; - return { - descriptionTitle: "toolbar-clue-pressure-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-clue-pressure-sensor.description", - tryItDescription: "toolbar-clue-pressure-sensor.tryItDescription", - components: [ - , - ], - id: "pressure_sensor", - }; + const pressureSensorValues = { + P: sensorValues[SENSOR_LIST.PRESSURE], + }; + return { + descriptionTitle: "toolbar-clue-pressure-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-clue-pressure-sensor.description", + tryItDescription: "toolbar-clue-pressure-sensor.tryItDescription", + components: [ + , + ], + id: "pressure_sensor", + }; }; export const BUTTON_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-a-b-push.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-clue-a-b-push.description", - tryItDescription: "toolbar-clue-a-b-push.tryItDescription", - components: undefined, - id: "microbit_button", - }; + return { + descriptionTitle: "toolbar-clue-a-b-push.title", + tagInput: undefined, + tagOutput: TAG_INPUT_SVG, + descriptionText: "toolbar-clue-a-b-push.description", + tryItDescription: "toolbar-clue-a-b-push.tryItDescription", + components: undefined, + id: "microbit_button", + }; }; export const BLUETOOTH_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-bluetooth.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-clue-bluetooth.description", - tryItDescription: "toolbar-clue-bluetooth.tryItDescription", - components: undefined, - id: "bluetooth", - }; + return { + descriptionTitle: "toolbar-clue-bluetooth.title", + tagInput: undefined, + tagOutput: TAG_INPUT_SVG, + descriptionText: "toolbar-clue-bluetooth.description", + tryItDescription: "toolbar-clue-bluetooth.tryItDescription", + components: undefined, + id: "bluetooth", + }; }; export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-sound-sensor.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-sound-sensor.description", - tryItDescription: "toolbar-clue-sound-sensor.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "sound_sensor", - }; + return { + descriptionTitle: "toolbar-clue-sound-sensor.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-sound-sensor.description", + tryItDescription: "toolbar-clue-sound-sensor.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "sound_sensor", + }; }; export const LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - return { - descriptionTitle: "toolbar-clue-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-led.description", - tryItDescription: "toolbar-clue-led.tryItDescription", - components: undefined, - id: "clue_neopixel", - }; + return { + descriptionTitle: "toolbar-clue-led.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-led.description", + tryItDescription: "toolbar-clue-led.tryItDescription", + components: undefined, + id: "clue_neopixel", + }; }; export const SPEAKER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - return { - descriptionTitle: "toolbar-speaker.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-clue-speaker.description", - tryItDescription: "toolbar-speaker.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "speaker", - }; + return { + descriptionTitle: "toolbar-speaker.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-clue-speaker.description", + tryItDescription: "toolbar-speaker.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "speaker", + }; }; diff --git a/Source/view/components/toolbar/clue/ClueSensorProperties.tsx b/Source/view/components/toolbar/clue/ClueSensorProperties.tsx index f8194eeb3..ad40283f8 100644 --- a/Source/view/components/toolbar/clue/ClueSensorProperties.tsx +++ b/Source/view/components/toolbar/clue/ClueSensorProperties.tsx @@ -2,215 +2,215 @@ import { SENSOR_LIST } from "../../../constants"; import { ISensorProps, ISliderProps } from "../../../viewUtils"; const CLUE_SLIDER_R: ISliderProps = { - axisLabel: "R", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_R, - step: 1, + axisLabel: "R", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_R, + step: 1, }; const CLUE_SLIDER_G: ISliderProps = { - axisLabel: "G", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_G, - step: 1, + axisLabel: "G", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_G, + step: 1, }; const CLUE_SLIDER_B: ISliderProps = { - axisLabel: "B", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_B, - step: 1, + axisLabel: "B", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_B, + step: 1, }; const CLUE_SLIDER_C: ISliderProps = { - axisLabel: "C", - maxLabel: "Max", - maxValue: 65535, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.LIGHT_C, - step: 1, + axisLabel: "C", + maxLabel: "Max", + maxValue: 65535, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.LIGHT_C, + step: 1, }; export const CLUE_LIGHT_PROPERTIES: ISensorProps = { - LABEL: "Light Sensor", - sliderProps: [CLUE_SLIDER_R, CLUE_SLIDER_G, CLUE_SLIDER_B, CLUE_SLIDER_C], - unitLabel: "Lux", + LABEL: "Light Sensor", + sliderProps: [CLUE_SLIDER_R, CLUE_SLIDER_G, CLUE_SLIDER_B, CLUE_SLIDER_C], + unitLabel: "Lux", }; // Range for magnet found here https://www.adafruit.com/product/4479 const CLUE_MAGNET_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_X, - step: 0.1, + axisLabel: "X", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.MAGNET_X, + step: 0.1, }; const CLUE_MAGNET_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_Y, - step: 0.1, + axisLabel: "Y", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.MAGNET_Y, + step: 0.1, }; const CLUE_MAGNET_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.MAGNET_Z, - step: 0.1, + axisLabel: "Z", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.MAGNET_Z, + step: 0.1, }; export const CLUE_MAGNET_PROPERTIES: ISensorProps = { - LABEL: "Magnetoscope", - sliderProps: [CLUE_MAGNET_X, CLUE_MAGNET_Y, CLUE_MAGNET_Z], - unitLabel: "μT", + LABEL: "Magnetoscope", + sliderProps: [CLUE_MAGNET_X, CLUE_MAGNET_Y, CLUE_MAGNET_Z], + unitLabel: "μT", }; const CLUE_GYRO_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_X, - step: 0.1, + axisLabel: "X", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.GYRO_X, + step: 0.1, }; const CLUE_GYRO_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_Y, - step: 0.1, + axisLabel: "Y", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.GYRO_Y, + step: 0.1, }; const CLUE_GYRO_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Max", - minLabel: "Min", - maxValue: 1000, - minValue: -1000, - type: SENSOR_LIST.GYRO_Z, - step: 0.1, + axisLabel: "Z", + maxLabel: "Max", + minLabel: "Min", + maxValue: 1000, + minValue: -1000, + type: SENSOR_LIST.GYRO_Z, + step: 0.1, }; export const CLUE_GYRO_PROPERTIES: ISensorProps = { - LABEL: "Gyroscope", - sliderProps: [CLUE_GYRO_X, CLUE_GYRO_Y, CLUE_GYRO_Z], - unitLabel: "deg/s", + LABEL: "Gyroscope", + sliderProps: [CLUE_GYRO_X, CLUE_GYRO_Y, CLUE_GYRO_Z], + unitLabel: "deg/s", }; export const CLUE_HUMIDITY_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "H", - maxLabel: "Max", - maxValue: 100, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.HUMIDITY, - step: 0.1, - }, - ], - unitLabel: "%", + LABEL: "Humidity Sensor", + sliderProps: [ + { + axisLabel: "H", + maxLabel: "Max", + maxValue: 100, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.HUMIDITY, + step: 0.1, + }, + ], + unitLabel: "%", }; export const CLUE__PROXIMITY_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "P", - maxLabel: "Max", - maxValue: 255, - minLabel: "Min", - minValue: 0, - type: SENSOR_LIST.PROXIMITY, - step: 1, - }, - ], - unitLabel: "", + LABEL: "Humidity Sensor", + sliderProps: [ + { + axisLabel: "P", + maxLabel: "Max", + maxValue: 255, + minLabel: "Min", + minValue: 0, + type: SENSOR_LIST.PROXIMITY, + step: 1, + }, + ], + unitLabel: "", }; export const CLUE_PRESSURE_PROPERTIES: ISensorProps = { - LABEL: "Humidity Sensor", - sliderProps: [ - { - axisLabel: "P", - maxLabel: "Max", - maxValue: 1100, - minLabel: "Min", - minValue: 800, - type: SENSOR_LIST.PRESSURE, - step: 0.1, - }, - ], - unitLabel: "hPa", + LABEL: "Humidity Sensor", + sliderProps: [ + { + axisLabel: "P", + maxLabel: "Max", + maxValue: 1100, + minLabel: "Min", + minValue: 800, + type: SENSOR_LIST.PRESSURE, + step: 0.1, + }, + ], + unitLabel: "hPa", }; const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 1023, - minLabel: "Left", - minValue: -1023, - type: SENSOR_LIST.MOTION_X, - step: 0.1, + axisLabel: "X", + maxLabel: "Right", + maxValue: 1023, + minLabel: "Left", + minValue: -1023, + type: SENSOR_LIST.MOTION_X, + step: 0.1, }; const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 1023, - minLabel: "Back", - minValue: -1023, - type: SENSOR_LIST.MOTION_Y, - step: 0.1, + axisLabel: "Y", + maxLabel: "Front", + maxValue: 1023, + minLabel: "Back", + minValue: -1023, + type: SENSOR_LIST.MOTION_Y, + step: 0.1, }; const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 1023, - minLabel: "Up", - minValue: -1023, - type: SENSOR_LIST.MOTION_Z, - step: 0.1, + axisLabel: "Z", + maxLabel: "Down", + maxValue: 1023, + minLabel: "Up", + minValue: -1023, + type: SENSOR_LIST.MOTION_Z, + step: 0.1, }; export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "m/s2", + LABEL: "Motion sensor", + sliderProps: [ + MOTION_SLIDER_PROPS_X, + MOTION_SLIDER_PROPS_Y, + MOTION_SLIDER_PROPS_Z, + ], + unitLabel: "m/s2", }; const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 0.1, + axisLabel: "T", + maxLabel: "Hot", + maxValue: 125, + minLabel: "Cold", + minValue: -55, + type: SENSOR_LIST.TEMPERATURE, + step: 0.1, }; export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", + LABEL: "Temperature sensor", + sliderProps: [TEMPERATURE_SLIDER_PROPS], + unitLabel: "°C", }; diff --git a/Source/view/components/toolbar/cpx/CpxModalContent.tsx b/Source/view/components/toolbar/cpx/CpxModalContent.tsx index 55166eb2a..a4ce05518 100644 --- a/Source/view/components/toolbar/cpx/CpxModalContent.tsx +++ b/Source/view/components/toolbar/cpx/CpxModalContent.tsx @@ -4,195 +4,195 @@ import { TAG_INPUT_SVG } from "../../../svgs/tag_input_svg"; import { TAG_OUTPUT_SVG } from "../../../svgs/tag_output_svg"; import { GenericSliderComponent } from "../GenericSliderComponent"; import { - FEATURE_REQUEST_ON_GITHUB, - IModalContent, - TRY_IT_MAKE_CODE, + FEATURE_REQUEST_ON_GITHUB, + IModalContent, + TRY_IT_MAKE_CODE, } from "../SensorModalUtils"; import * as SENSOR_PROPERTIES from "./CpxSensorProperties"; export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - return { - descriptionTitle: "toolbar-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-gpio.description", - tryItDescription: "toolbar-gpio.tryItDescription", - components: undefined, - id: "GPIO", - }; + return { + descriptionTitle: "toolbar-gpio.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-gpio.description", + tryItDescription: "toolbar-gpio.tryItDescription", + components: undefined, + id: "GPIO", + }; }; export const IR_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - return { - descriptionTitle: "toolbar-ir-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-ir-sensor.description", - tryItDescription: "toolbar-ir-sensor.tryItDescription", - components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], - id: "IR", - }; + return { + descriptionTitle: "toolbar-ir-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-ir-sensor.description", + tryItDescription: "toolbar-ir-sensor.tryItDescription", + components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], + id: "IR", + }; }; export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - const lightSensorValues = { - L: sensorValues[SENSOR_LIST.LIGHT], - }; - return { - descriptionTitle: "toolbar-light-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-light-sensor.description", - tryItDescription: "toolbar-light-sensor.tryItDescription", - components: [ - , - ], - id: "light_sensor", - }; + const lightSensorValues = { + L: sensorValues[SENSOR_LIST.LIGHT], + }; + return { + descriptionTitle: "toolbar-light-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-light-sensor.description", + tryItDescription: "toolbar-light-sensor.tryItDescription", + components: [ + , + ], + id: "light_sensor", + }; }; export const MOTION_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - const motionSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - descriptionTitle: "toolbar-motion-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-motion-sensor.description", - tryItDescription: "toolbar-motion-sensor.tryItDescription", - components: [ - , - TRY_IT_MAKE_CODE, - FEATURE_REQUEST_ON_GITHUB, - ], - id: "motion_sensor", - }; + const motionSensorValues = { + X: sensorValues[SENSOR_LIST.MOTION_X], + Y: sensorValues[SENSOR_LIST.MOTION_Y], + Z: sensorValues[SENSOR_LIST.MOTION_Z], + }; + return { + descriptionTitle: "toolbar-motion-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-motion-sensor.description", + tryItDescription: "toolbar-motion-sensor.tryItDescription", + components: [ + , + TRY_IT_MAKE_CODE, + FEATURE_REQUEST_ON_GITHUB, + ], + id: "motion_sensor", + }; }; export const NEOP_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - return { - descriptionTitle: "toolbar-neo-pixels.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-neo-pixels.description", - tryItDescription: "toolbar-neo-pixels.tryItDescription", - components: undefined, - id: "neon_pixel", - }; + return { + descriptionTitle: "toolbar-neo-pixels.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-neo-pixels.description", + tryItDescription: "toolbar-neo-pixels.tryItDescription", + components: undefined, + id: "neon_pixel", + }; }; export const PUSHB_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - return { - descriptionTitle: "toolbar-a-b-push.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-a-b-push.description", - tryItDescription: "toolbar-a-b-push.tryItDescription", - components: undefined, - id: "push_btn", - }; + return { + descriptionTitle: "toolbar-a-b-push.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-a-b-push.description", + tryItDescription: "toolbar-a-b-push.tryItDescription", + components: undefined, + id: "push_btn", + }; }; export const RED_LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - return { - descriptionTitle: "toolbar-red-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-red-led.description", - tryItDescription: "toolbar-red-led.tryItDescription", - components: undefined, - id: "red_LED", - }; + return { + descriptionTitle: "toolbar-red-led.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-red-led.description", + tryItDescription: "toolbar-red-led.tryItDescription", + components: undefined, + id: "red_LED", + }; }; export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - return { - descriptionTitle: "toolbar-sound-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-sound-sensor.description", - tryItDescription: "toolbar-sound-sensor.tryItDescription", - components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], - id: "sound_sensor", - }; + return { + descriptionTitle: "toolbar-sound-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-sound-sensor.description", + tryItDescription: "toolbar-sound-sensor.tryItDescription", + components: [TRY_IT_MAKE_CODE, FEATURE_REQUEST_ON_GITHUB], + id: "sound_sensor", + }; }; export const SWITCH_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - return { - descriptionTitle: "toolbar-slider-switch.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-slider-switch.description", - tryItDescription: "toolbar-slider-switch.tryItDescription", - components: undefined, - id: "slider_switch", - }; + return { + descriptionTitle: "toolbar-slider-switch.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-slider-switch.description", + tryItDescription: "toolbar-slider-switch.tryItDescription", + components: undefined, + id: "slider_switch", + }; }; export const SPEAKER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - return { - descriptionTitle: "toolbar-speaker.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-speaker.description", - tryItDescription: "toolbar-speaker.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "speaker", - }; + return { + descriptionTitle: "toolbar-speaker.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-speaker.description", + tryItDescription: "toolbar-speaker.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "speaker", + }; }; export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-temperature-sensor.description", - descriptionTitle: "toolbar-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-temperature-sensor.tryItDescription", - }; + const temperatureSensorValues = { + T: sensorValues[SENSOR_LIST.TEMPERATURE], + }; + return { + components: [ + , + ], + descriptionText: "toolbar-temperature-sensor.description", + descriptionTitle: "toolbar-temperature-sensor.title", + id: "temperature", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-temperature-sensor.tryItDescription", + }; }; diff --git a/Source/view/components/toolbar/cpx/CpxSensorProperties.tsx b/Source/view/components/toolbar/cpx/CpxSensorProperties.tsx index f91f91469..478eb36c0 100644 --- a/Source/view/components/toolbar/cpx/CpxSensorProperties.tsx +++ b/Source/view/components/toolbar/cpx/CpxSensorProperties.tsx @@ -2,70 +2,70 @@ import { SENSOR_LIST } from "../../../constants"; import { ISensorProps, ISliderProps } from "../../../viewUtils"; const LIGHT_SLIDER_PROPS: ISliderProps = { - maxValue: 320, - minValue: 0, - minLabel: "Dark", - maxLabel: "Bright", - type: "light", - axisLabel: "L", - step: 1, + maxValue: 320, + minValue: 0, + minLabel: "Dark", + maxLabel: "Bright", + type: "light", + axisLabel: "L", + step: 1, }; export const LIGHT_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Light sensor", - sliderProps: [LIGHT_SLIDER_PROPS], - unitLabel: "Lux", + LABEL: "Light sensor", + sliderProps: [LIGHT_SLIDER_PROPS], + unitLabel: "Lux", }; const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 0.1, + axisLabel: "T", + maxLabel: "Hot", + maxValue: 125, + minLabel: "Cold", + minValue: -55, + type: SENSOR_LIST.TEMPERATURE, + step: 0.1, }; export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", + LABEL: "Temperature sensor", + sliderProps: [TEMPERATURE_SLIDER_PROPS], + unitLabel: "°C", }; const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 78, - minLabel: "Left", - minValue: -78, - type: SENSOR_LIST.MOTION_X, - step: 1, + axisLabel: "X", + maxLabel: "Right", + maxValue: 78, + minLabel: "Left", + minValue: -78, + type: SENSOR_LIST.MOTION_X, + step: 1, }; const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 78, - minLabel: "Back", - minValue: -78, - type: SENSOR_LIST.MOTION_Y, - step: 1, + axisLabel: "Y", + maxLabel: "Front", + maxValue: 78, + minLabel: "Back", + minValue: -78, + type: SENSOR_LIST.MOTION_Y, + step: 1, }; const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 78, - minLabel: "Up", - minValue: -78, - type: SENSOR_LIST.MOTION_Z, - step: 1, + axisLabel: "Z", + maxLabel: "Down", + maxValue: 78, + minLabel: "Up", + minValue: -78, + type: SENSOR_LIST.MOTION_Z, + step: 1, }; export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "Lux", + LABEL: "Motion sensor", + sliderProps: [ + MOTION_SLIDER_PROPS_X, + MOTION_SLIDER_PROPS_Y, + MOTION_SLIDER_PROPS_Z, + ], + unitLabel: "Lux", }; diff --git a/Source/view/components/toolbar/microbit/MicrobitModalContent.tsx b/Source/view/components/toolbar/microbit/MicrobitModalContent.tsx index c53cf5554..26e59ffcd 100644 --- a/Source/view/components/toolbar/microbit/MicrobitModalContent.tsx +++ b/Source/view/components/toolbar/microbit/MicrobitModalContent.tsx @@ -8,180 +8,180 @@ import { FEATURE_REQUEST_ON_GITHUB, IModalContent } from "../SensorModalUtils"; import * as SENSOR_PROPERTIES from "./MicrobitSensorProperties"; export const ACCELEROMETER_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - // this object will be accessed with the axis label - const accelerometerSensorValues = { - X: sensorValues[SENSOR_LIST.MOTION_X], - Y: sensorValues[SENSOR_LIST.MOTION_Y], - Z: sensorValues[SENSOR_LIST.MOTION_Z], - }; - return { - components: ( - - ), - descriptionText: "toolbar-accelerometer-sensor.description", - descriptionTitle: "toolbar-accelerometer-sensor.title", - id: "accelerometer", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-accelerometer-sensor.tryItDescription", - }; + // this object will be accessed with the axis label + const accelerometerSensorValues = { + X: sensorValues[SENSOR_LIST.MOTION_X], + Y: sensorValues[SENSOR_LIST.MOTION_Y], + Z: sensorValues[SENSOR_LIST.MOTION_Z], + }; + return { + components: ( + + ), + descriptionText: "toolbar-accelerometer-sensor.description", + descriptionTitle: "toolbar-accelerometer-sensor.title", + id: "accelerometer", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-accelerometer-sensor.tryItDescription", + }; }; export const LED_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-led.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-led.description", - tryItDescription: "toolbar-microbit-led.tryItDescription", - components: undefined, - id: "microbit_LED", - }; + return { + descriptionTitle: "toolbar-microbit-led.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-led.description", + tryItDescription: "toolbar-microbit-led.tryItDescription", + components: undefined, + id: "microbit_LED", + }; }; export const BUTTON_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-a-b-push.title", - tagInput: undefined, - tagOutput: TAG_INPUT_SVG, - descriptionText: "toolbar-microbit-a-b-push.description", - tryItDescription: "toolbar-microbit-a-b-push.tryItDescription", - components: undefined, - id: "microbit_button", - }; + return { + descriptionTitle: "toolbar-microbit-a-b-push.title", + tagInput: undefined, + tagOutput: TAG_INPUT_SVG, + descriptionText: "toolbar-microbit-a-b-push.description", + tryItDescription: "toolbar-microbit-a-b-push.tryItDescription", + components: undefined, + id: "microbit_button", + }; }; export const SOUND_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-sound.title", - tagInput: undefined, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-sound.description", - tryItDescription: "toolbar-microbit-sound.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_sound", - }; + return { + descriptionTitle: "toolbar-microbit-sound.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-sound.description", + tryItDescription: "toolbar-microbit-sound.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_sound", + }; }; export const GPIO_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-gpio.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-gpio.description", - tryItDescription: "toolbar-microbit-gpio.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_gpio", - }; + return { + descriptionTitle: "toolbar-microbit-gpio.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-gpio.description", + tryItDescription: "toolbar-microbit-gpio.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_gpio", + }; }; export const COMPASS_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-compass-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-compass-sensor.description", - tryItDescription: "toolbar-microbit-compass-sensor.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_compass", - }; + return { + descriptionTitle: "toolbar-microbit-compass-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-compass-sensor.description", + tryItDescription: "toolbar-microbit-compass-sensor.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_compass", + }; }; export const WIRELESS_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-wireless.title", - tagInput: TAG_INPUT_SVG, - tagOutput: TAG_OUTPUT_SVG, - descriptionText: "toolbar-microbit-wireless.description", - tryItDescription: "toolbar-microbit-wireless.tryItDescription", - components: [FEATURE_REQUEST_ON_GITHUB], - id: "microbit_wireless", - }; + return { + descriptionTitle: "toolbar-microbit-wireless.title", + tagInput: TAG_INPUT_SVG, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-wireless.description", + tryItDescription: "toolbar-microbit-wireless.tryItDescription", + components: [FEATURE_REQUEST_ON_GITHUB], + id: "microbit_wireless", + }; }; export const GESTURE_CONTENT = ( - onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void + onSelectGestures?: (event: React.ChangeEvent) => void, + sendGesture?: (isActive: boolean) => void, ): IModalContent => { - return { - descriptionTitle: "toolbar-microbit-gesture-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-microbit-gesture-sensor.description", - tryItDescription: "toolbar-microbit-gesture-sensor.tryItDescription", - components: [ - , - ], - id: "gesture_sensor", - }; + return { + descriptionTitle: "toolbar-microbit-gesture-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-microbit-gesture-sensor.description", + tryItDescription: "toolbar-microbit-gesture-sensor.tryItDescription", + components: [ + , + ], + id: "gesture_sensor", + }; }; export const LIGHT_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - const lightSensorValues = { - L: sensorValues[SENSOR_LIST.LIGHT], - }; - return { - descriptionTitle: "toolbar-light-sensor.title", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - descriptionText: "toolbar-light-sensor.description", - tryItDescription: "toolbar-light-sensor.tryItDescription", - components: [ - , - ], - id: "light_sensor", - }; + const lightSensorValues = { + L: sensorValues[SENSOR_LIST.LIGHT], + }; + return { + descriptionTitle: "toolbar-light-sensor.title", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + descriptionText: "toolbar-light-sensor.description", + tryItDescription: "toolbar-light-sensor.tryItDescription", + components: [ + , + ], + id: "light_sensor", + }; }; export const TEMPERATURE_CONTENT = ( - onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, - sensorValues: { [key: string]: number } + onUpdateValue: (sensor: SENSOR_LIST, value: number) => void, + sensorValues: { [key: string]: number }, ): IModalContent => { - const temperatureSensorValues = { - T: sensorValues[SENSOR_LIST.TEMPERATURE], - }; - return { - components: [ - , - ], - descriptionText: "toolbar-temperature-sensor.description", - descriptionTitle: "toolbar-temperature-sensor.title", - id: "temperature", - tagInput: TAG_INPUT_SVG, - tagOutput: undefined, - tryItDescription: "toolbar-temperature-sensor.tryItDescription", - }; + const temperatureSensorValues = { + T: sensorValues[SENSOR_LIST.TEMPERATURE], + }; + return { + components: [ + , + ], + descriptionText: "toolbar-temperature-sensor.description", + descriptionTitle: "toolbar-temperature-sensor.title", + id: "temperature", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-temperature-sensor.tryItDescription", + }; }; diff --git a/Source/view/components/toolbar/microbit/MicrobitSensorProperties.tsx b/Source/view/components/toolbar/microbit/MicrobitSensorProperties.tsx index c32b00477..4a8974625 100644 --- a/Source/view/components/toolbar/microbit/MicrobitSensorProperties.tsx +++ b/Source/view/components/toolbar/microbit/MicrobitSensorProperties.tsx @@ -2,73 +2,73 @@ import { SENSOR_LIST } from "../../../constants"; import { ISensorProps, ISliderProps } from "../../../viewUtils"; const LIGHT_SLIDER_PROPS: ISliderProps = { - maxValue: 255, - minValue: 0, - minLabel: "Dark", - maxLabel: "Bright", - type: "light", - axisLabel: "L", - step: 1, + maxValue: 255, + minValue: 0, + minLabel: "Dark", + maxLabel: "Bright", + type: "light", + axisLabel: "L", + step: 1, }; export const LIGHT_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Light sensor", - sliderProps: [LIGHT_SLIDER_PROPS], - unitLabel: "Lux", + LABEL: "Light sensor", + sliderProps: [LIGHT_SLIDER_PROPS], + unitLabel: "Lux", }; const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 1023, - minLabel: "Left", - minValue: -1023, - type: SENSOR_LIST.MOTION_X, - step: 1, + axisLabel: "X", + maxLabel: "Right", + maxValue: 1023, + minLabel: "Left", + minValue: -1023, + type: SENSOR_LIST.MOTION_X, + step: 1, }; const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 1023, - minLabel: "Back", - minValue: -1023, - type: SENSOR_LIST.MOTION_Y, - step: 1, + axisLabel: "Y", + maxLabel: "Front", + maxValue: 1023, + minLabel: "Back", + minValue: -1023, + type: SENSOR_LIST.MOTION_Y, + step: 1, }; const MOTION_SLIDER_PROPS_Z: ISliderProps = { - axisLabel: "Z", - maxLabel: "Down", - maxValue: 1023, - minLabel: "Up", - minValue: -1023, - type: SENSOR_LIST.MOTION_Z, - step: 1, + axisLabel: "Z", + maxLabel: "Down", + maxValue: 1023, + minLabel: "Up", + minValue: -1023, + type: SENSOR_LIST.MOTION_Z, + step: 1, }; export const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "m/s2", + LABEL: "Motion sensor", + sliderProps: [ + MOTION_SLIDER_PROPS_X, + MOTION_SLIDER_PROPS_Y, + MOTION_SLIDER_PROPS_Z, + ], + unitLabel: "m/s2", }; const TEMPERATURE_SLIDER_PROPS: ISliderProps = { - axisLabel: "T", - maxLabel: "Hot", - maxValue: 125, - minLabel: "Cold", - minValue: -55, - type: SENSOR_LIST.TEMPERATURE, - step: 1, + axisLabel: "T", + maxLabel: "Hot", + maxValue: 125, + minLabel: "Cold", + minValue: -55, + type: SENSOR_LIST.TEMPERATURE, + step: 1, }; export const TEMPERATURE_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Temperature sensor", - sliderProps: [TEMPERATURE_SLIDER_PROPS], - unitLabel: "°C", + LABEL: "Temperature sensor", + sliderProps: [TEMPERATURE_SLIDER_PROPS], + unitLabel: "°C", }; diff --git a/Source/view/constants.ts b/Source/view/constants.ts index 56dda92af..2503ff43c 100644 --- a/Source/view/constants.ts +++ b/Source/view/constants.ts @@ -3,150 +3,150 @@ // Key events export const CONSTANTS = { - CURRENTLY_RUNNING: (file: string) => { - return `Currently running: ${file}`; - }, - DEVICE_NAME: { - CPX: "CPX", - MICROBIT: "micro:bit", - }, - ID_NAME: { - BUTTON_A: "BTN_A_OUTER", - BUTTON_AB: "BTN_AB_OUTER", - BUTTON_B: "BTN_B_OUTER", - PIN_A1: "PIN_A1", - PIN_A2: "PIN_A2", - PIN_A3: "PIN_A3", - PIN_A4: "PIN_A4", - PIN_A5: "PIN_A5", - PIN_A6: "PIN_A6", - PIN_A7: "PIN_A7", - PLAY_BUTTON: "play-button", - REFRESH_BUTTON: "refresh-button", - STOP_BUTTON: "stop-button", - SWITCH: "SWITCH", - }, - KEYBOARD_KEYS: { - A: "KeyA", - B: "KeyB", - C: "KeyC", - CAPITAL_R: "R", - CAPITAL_F: "F", - ENTER: "Enter", - S: "KeyS", - NUMERIC_ONE: "Digit1", - NUMERIC_TWO: "Digit2", - NUMERIC_THREE: "Digit3", - NUMERIC_FOUR: "Digit4", - NUMERIC_FIVE: "Digit5", - NUMERIC_SIX: "Digit6", - NUMERIC_SEVEN: "Digit7", - }, - FILES_PLACEHOLDER: - "The simulator will run the .py file you have focused on.", - SIMULATOR_BUTTON_WIDTH: 60, - TOOLBAR_INFO: `Explore what's on the board:`, - LED_TINT_FACTOR: 0.5, + CURRENTLY_RUNNING: (file: string) => { + return `Currently running: ${file}`; + }, + DEVICE_NAME: { + CPX: "CPX", + MICROBIT: "micro:bit", + }, + ID_NAME: { + BUTTON_A: "BTN_A_OUTER", + BUTTON_AB: "BTN_AB_OUTER", + BUTTON_B: "BTN_B_OUTER", + PIN_A1: "PIN_A1", + PIN_A2: "PIN_A2", + PIN_A3: "PIN_A3", + PIN_A4: "PIN_A4", + PIN_A5: "PIN_A5", + PIN_A6: "PIN_A6", + PIN_A7: "PIN_A7", + PLAY_BUTTON: "play-button", + REFRESH_BUTTON: "refresh-button", + STOP_BUTTON: "stop-button", + SWITCH: "SWITCH", + }, + KEYBOARD_KEYS: { + A: "KeyA", + B: "KeyB", + C: "KeyC", + CAPITAL_R: "R", + CAPITAL_F: "F", + ENTER: "Enter", + S: "KeyS", + NUMERIC_ONE: "Digit1", + NUMERIC_TWO: "Digit2", + NUMERIC_THREE: "Digit3", + NUMERIC_FOUR: "Digit4", + NUMERIC_FIVE: "Digit5", + NUMERIC_SIX: "Digit6", + NUMERIC_SEVEN: "Digit7", + }, + FILES_PLACEHOLDER: + "The simulator will run the .py file you have focused on.", + SIMULATOR_BUTTON_WIDTH: 60, + TOOLBAR_INFO: `Explore what's on the board:`, + LED_TINT_FACTOR: 0.5, }; export const AB_BUTTONS_KEYS = { - BTN_A: "BTN_A", - BTN_B: "BTN_B", - BTN_AB: "BTN_AB", + BTN_A: "BTN_A", + BTN_B: "BTN_B", + BTN_AB: "BTN_AB", }; export const BUTTON_CLASSNAME = { - ACTIVE: "sim-button-group", - DEACTIVATED: "sim-button-group-deactivated", + ACTIVE: "sim-button-group", + DEACTIVATED: "sim-button-group-deactivated", }; export const BUTTON_STYLING_CLASSES = { - DEFAULT: "sim-button-outer", - KEYPRESSED: "sim-button-key-press", + DEFAULT: "sim-button-outer", + KEYPRESSED: "sim-button-key-press", }; export const CLUE_LEDS_COLORS = { - WHITE_LEDS_OFF: "#ffde00", - WHITE_LEDS_ON: "white", - RED_LED_OFF: "#808080", - RED_LED_ON: "red", + WHITE_LEDS_OFF: "#ffde00", + WHITE_LEDS_ON: "white", + RED_LED_OFF: "#808080", + RED_LED_ON: "red", }; export enum DEVICE_LIST_KEY { - CPX = "CPX", - MICROBIT = "micro:bit", - CLUE = "CLUE", + CPX = "CPX", + MICROBIT = "micro:bit", + CLUE = "CLUE", } // Pauses on Debug mode alter the state of the view export enum VIEW_STATE { - PAUSE = "debug-pause", - RUNNING = "running", + PAUSE = "debug-pause", + RUNNING = "running", } // export enum WEBVIEW_MESSAGES { - SWITCH_DEVICE = "switch-device", - REFRESH_SIMULATOR = "refresh-simulator", - TOGGLE_PLAY_STOP = "toggle-play-stop", - BUTTON_PRESS = "button-press", - SENSOR_CHANGED = "sensor-changed", - GESTURE = "gesture", - SLIDER_TELEMETRY = "slider-telemetry", + SWITCH_DEVICE = "switch-device", + REFRESH_SIMULATOR = "refresh-simulator", + TOGGLE_PLAY_STOP = "toggle-play-stop", + BUTTON_PRESS = "button-press", + SENSOR_CHANGED = "sensor-changed", + GESTURE = "gesture", + SLIDER_TELEMETRY = "slider-telemetry", } export enum VSCODE_MESSAGES_TO_WEBVIEW { - SET_DEVICE = "set-device", - PAUSE_DEVICE = "pause-device", - RUN_DEVICE = "run-device", - RESET = "reset-state", - CURRENT_FILE = "current-file", - SET_STATE = "set-state", + SET_DEVICE = "set-device", + PAUSE_DEVICE = "pause-device", + RUN_DEVICE = "run-device", + RESET = "reset-state", + CURRENT_FILE = "current-file", + SET_STATE = "set-state", } export enum DEBUG_COMMANDS { - STACK_TRACE = "stackTrace", - CONTINUE = "continue", - DISCONNECT = "disconnect", + STACK_TRACE = "stackTrace", + CONTINUE = "continue", + DISCONNECT = "disconnect", } export enum SENSOR_LIST { - TEMPERATURE = "temperature", - LIGHT = "light", - ACCELEROMETER = "accelerometer", - MOTION_X = "motion_x", - MOTION_Y = "motion_y", - MOTION_Z = "motion_z", - LIGHT_R = "light_r", - LIGHT_G = "light_g", - LIGHT_B = "light_b", - LIGHT_C = "light_c", - HUMIDITY = "humidity", - PRESSURE = "pressure", - PROXIMITY = "proximity", - MAGNET_X = "magnet_x", - MAGNET_Y = "magnet_y", - MAGNET_Z = "magnet_z", - GYRO_X = "gyro_x", - GYRO_Y = "gyro_y", - GYRO_Z = "gyro_z", + TEMPERATURE = "temperature", + LIGHT = "light", + ACCELEROMETER = "accelerometer", + MOTION_X = "motion_x", + MOTION_Y = "motion_y", + MOTION_Z = "motion_z", + LIGHT_R = "light_r", + LIGHT_G = "light_g", + LIGHT_B = "light_b", + LIGHT_C = "light_c", + HUMIDITY = "humidity", + PRESSURE = "pressure", + PROXIMITY = "proximity", + MAGNET_X = "magnet_x", + MAGNET_Y = "magnet_y", + MAGNET_Z = "magnet_z", + GYRO_X = "gyro_x", + GYRO_Y = "gyro_y", + GYRO_Z = "gyro_z", } export const GESTURES_MICROBIT = [ - "shake", - "up", - "down", - "left", - "right", - "face up", - "face down", - "freefall", - "3g", - "6g", - "8g", + "shake", + "up", + "down", + "left", + "right", + "face up", + "face down", + "freefall", + "3g", + "6g", + "8g", ]; export const GESTURES_CLUE = ["up", "down", "left", "right", "shake"]; export enum WEBVIEW_ATTRIBUTES_KEY { - INITIAL_DEVICE = "initial_device", - TYPE = "webview_type", + INITIAL_DEVICE = "initial_device", + TYPE = "webview_type", } export enum WEBVIEW_TYPES { - SIMULATOR = "simulator", - GETTING_STARTED = "getting_started", + SIMULATOR = "simulator", + GETTING_STARTED = "getting_started", } export const DEFAULT_IMG_CLUE = `/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAEBAQEBAQEBA QEBAQEBAQICAQEBAQMCAgICAwMEBAMDAwMEBAYFBAQFBAMDBQcFBQYGBgYGBAUHBwcGBwYGBgb/2wBDAQEBAQEBAQMCAgMGBAMEB diff --git a/Source/view/container/device/Device.spec.tsx b/Source/view/container/device/Device.spec.tsx index 0423721ef..3835280a7 100644 --- a/Source/view/container/device/Device.spec.tsx +++ b/Source/view/container/device/Device.spec.tsx @@ -6,25 +6,25 @@ import { DEVICE_LIST_KEY } from "../../constants"; import { Device } from "./Device"; describe("Device component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + , + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div, + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/container/device/Device.tsx b/Source/view/container/device/Device.tsx index dd30d2dc6..41705059e 100644 --- a/Source/view/container/device/Device.tsx +++ b/Source/view/container/device/Device.tsx @@ -8,35 +8,35 @@ import { Microbit } from "../../components/microbit/Microbit"; import { DEVICE_LIST_KEY } from "../../constants"; interface IProps { - currentSelectedDevice: string; + currentSelectedDevice: string; } // Container to switch between multiple devices export class Device extends React.Component { - constructor(props: IProps) { - super(props); - } - render() { - const { currentSelectedDevice } = this.props; + constructor(props: IProps) { + super(props); + } + render() { + const { currentSelectedDevice } = this.props; - return ( -
- - {loadSelectedDevice(currentSelectedDevice)} - -
- ); - } + return ( +
+ + {loadSelectedDevice(currentSelectedDevice)} + +
+ ); + } } const loadSelectedDevice = (currentSelectedDevice: string) => { - switch (currentSelectedDevice) { - case DEVICE_LIST_KEY.CPX: - return ; - case DEVICE_LIST_KEY.MICROBIT: - return ; - case DEVICE_LIST_KEY.CLUE: - return ; - default: - return null; - } + switch (currentSelectedDevice) { + case DEVICE_LIST_KEY.CPX: + return ; + case DEVICE_LIST_KEY.MICROBIT: + return ; + case DEVICE_LIST_KEY.CLUE: + return ; + default: + return null; + } }; diff --git a/Source/view/index.tsx b/Source/view/index.tsx index 32e7400b1..bdb101f2b 100644 --- a/Source/view/index.tsx +++ b/Source/view/index.tsx @@ -12,11 +12,11 @@ const messageEn = require("./translations/en.json"); const locale = "en"; const message = { - en: messageEn, + en: messageEn, }; ReactDOM.render( - - - , - document.getElementById("root") + + + , + document.getElementById("root"), ); diff --git a/Source/view/pages/gettingStarted.spec.tsx b/Source/view/pages/gettingStarted.spec.tsx index 12554fdfb..a309b2a71 100644 --- a/Source/view/pages/gettingStarted.spec.tsx +++ b/Source/view/pages/gettingStarted.spec.tsx @@ -5,25 +5,25 @@ import * as testRenderer from "react-test-renderer"; import { GettingStartedPage } from "./gettingStarted"; describe("GettingStartedPage component ", () => { - it("should render correctly", () => { - const component = testRenderer - .create( - - - - ) - .toJSON(); - expect(component).toMatchSnapshot(); - }); + it("should render correctly", () => { + const component = testRenderer + .create( + + + , + ) + .toJSON(); + expect(component).toMatchSnapshot(); + }); - it("should render without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render( - - - , - div - ); - ReactDOM.unmountComponentAtNode(div); - }); + it("should render without crashing", () => { + const div = document.createElement("div"); + ReactDOM.render( + + + , + div, + ); + ReactDOM.unmountComponentAtNode(div); + }); }); diff --git a/Source/view/pages/gettingStarted.tsx b/Source/view/pages/gettingStarted.tsx index c58be7145..7a41138ee 100644 --- a/Source/view/pages/gettingStarted.tsx +++ b/Source/view/pages/gettingStarted.tsx @@ -2,280 +2,491 @@ import * as React from "react"; import "./gettingStarted.css"; export class GettingStartedPage extends React.Component { - private selectRef: React.RefObject = React.createRef(); + private selectRef: React.RefObject = React.createRef(); - componentDidMount() { - this.selectRef.current?.addEventListener("change", (event: any) => { - const visibleElement = document.querySelector(".visibleElement"); - const target = document.getElementById(event!.target!.value); - if (visibleElement !== null) { - visibleElement.className = "inv"; - } - if (target !== null) { - target.className = "visibleElement"; - } - }); - } + componentDidMount() { + this.selectRef.current?.addEventListener("change", (event: any) => { + const visibleElement = document.querySelector(".visibleElement"); + const target = document.getElementById(event!.target!.value); + if (visibleElement !== null) { + visibleElement.className = "inv"; + } + if (target !== null) { + target.className = "visibleElement"; + } + }); + } - render() { - return ( - -
-

Getting started

- -

- Copy these snippets of code to a .py file and run the - simulator -

- {/* prettier-ignore */} -
-

Tutorial for Circuit Playground Express

-

- > Import the Circuit Playground library to use it (This is required) -

- -
from adafruit_circuitplayground import cp
-
-

> Turn on the little red LED

- -
while True:
-
    cp.red_led = True
-
-

> Turn up red LED when button A is clicked

- -
while True:
-
    if cp.button_a:
-
        cp.red_led = True
-
-

> Light up the first neopixel blue

- -
cp.pixels[0] = (0, 0, 255)
-
-

And much more! These links have more tutorials:

-

- - Getting started with CPX and CircuitPython - -

-

- - More example code - -

-

Keyboard Shortcuts

-
    -
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • -
  • Refresh the simulator: Shift + R
  • -
  • Run the simulator: Shift + F
  • -
-
- {/* prettier-ignore */} -
-

Tutorial for micro:bit

-

- > Import the micro:bit library to use it (This is - required) -

- -
from microbit import *
-
-

- > Light up your micro:bit with love by showing a - heart -

- -
display.show(Image.HEART)
-
-

- > Use your micro:bit to tell the world how you’re - feeling -

- -
while True:
-
    if button_a.is_pressed():
-
        display.show(Image.HAPPY)
-
    if button_b.is_pressed():
-
        display.show(Image.SAD)
-
-

> Read then display the temperature

- -
while True:
-
    temp = temperature()
-
    display.show(temp)
-
-

- > Display your name with the scroll functionality -

- -
while True:
-
    display.show("Your name")
-
-

And much more! These links have more tutorials:

-

- - Microbit Tutorials - -

-

- - Microbit official documentation - -

-

Keyboard Shortcuts

-
    -
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • -
  • Refresh the simulator: Shift + R
  • -
  • Run the simulator: Shift + F
  • -
-
- {/* prettier-ignore */} -
-

Tutorial for CLUE

-

- > Import the the main CLUE library (This is - required) -

- -
from adafruit_clue import clue
-
-

- > Display text on the CLUE and change the text when - a button is pressed -

- -
-                                clue_data = clue.simple_text_display(title="CLUE!")
-                            
-
while True:
-
    clue_data[1].text = "Hello World!"
-
    if clue.button_a:
-
        clue_data[5].text = "A is pressed!"
-
    else:
-
        clue_data[5].text = "A is not pressed!"
-
    clue_data.show()
-
-

> Create a slide show on the CLUE

-

- Make sure there are bitmap (.bmp) pictures of your choice in the same directory - as the code file. -

- -
import board
-
from adafruit_slideshow import SlideShow
-
 
-
slideshow = SlideShow(clue.display, auto_advance=True, dwell=3, fade_effect=True)
-                            
-
while slideshow.update():
-
    pass
-
-

> Light up the neopixel green

- -
clue.pixel.fill(clue.GREEN)
-
-

> Display sensor data on the CLUE

- -
clue_data = clue.simple_text_display(title="CLUE Sensor Data!", title_scale=2)
-
while True:
-
    clue_data[0].text = "Acceleration: {"{}"} {"{}"} {"{}"}".format(*clue.acceleration)
-
    clue_data[1].text = "Gyro: {"{}"} {"{}"} {"{}"}".format(*clue.gyro)
-
    clue_data[2].text = "Magnetic: {"{}"} {"{}"} {"{}"}".format(*clue.magnetic)
-
    clue_data[3].text = "Pressure: {"{}"}hPa".format(clue.pressure)
-
    clue_data[4].text = "Altitude: {"{}"}m".format(clue.altitude)
-
    clue_data[5].text = "Temperature: {"{}"}C".format(clue.temperature)
-
    clue_data[6].text = "Humidity: {"{}"}%".format(clue.humidity)
-
    clue_data[7].text = "Proximity: {"{}"}".format(clue.proximity)
-
    clue_data[8].text = "Gesture: {"{}"}".format(clue.gesture)
-
    clue_data[9].text = "Color: R: {"{}"} G: {"{}"} B: {"{}"} C: {"{}"}".format(*clue.color)
-
    clue_data[10].text = "Button A: {"{}"}".format(clue.button_a)
-
    clue_data[11].text = "Button B: {"{}"}".format(clue.button_b)
-
    clue_data.show()
-
-

> Draw a blue rectangle on the screen

- -
import board
-
import displayio
-
from adafruit_display_shapes.rect import Rect
-
 
-
splash = displayio.Group(max_size=20)
-
board.DISPLAY.show(splash)
-
 
-
rect = Rect(80, 20, 41, 41, fill=0x0000FF)
-
splash.append(rect)
-
-

And much more! These links have more tutorials:

-

- - Getting started with CLUE and CircuitPython - -

-

- - More example code - -

-

Keyboard Shortcuts

-
    -
  • Push Button: A for Button A, B for Button B, C for Buttons A & B
  • -
  • Refresh the simulator: Shift + R
  • -
  • Run the simulator: Shift + F
  • -
  • Capacitive Touch Sensor: Shift + 1 ~ 7 for GPIO pins A1 - A7
  • -
  • Slider Switch: Shift + S
  • -
-
- {/* prettier-ignore */} -
-

Tutorial for using the debugger

-

- > Enter debug mode -

-

Press F5 or go to Run -> Start Debugging

- Start debugging -

- > Set a breakpoint or multiple breakpoints -

-

Stopping at a breakpoint pauses the program at that particular place.

-

Use the debug toolbar or the shortcuts below

- Debugger Toolbar -
    -
  • F5 to continue / pause
  • -
  • F10 to step over (execute current statement and all functions that it calls and stop before the next statement)
  • -
  • F11 to step into (stop at first statement of first function called from first line)
  • -
  • Shift + F11 to step out (run current function to end)
  • -
  • Ctrl + Shift + F11 to restart
  • -
  • Shift + F5 to stop
  • -
- debugging experience -

- > Observe the device's state on the "Variables" tab on the left when stopped at a breakpoint -

- Debugger Variables -

And much more! These links have more tutorials:

-

- - Learn more about debugging in VS Code - -

-
-
-
- ); - } + render() { + return ( + +
+

Getting started

+ +

+ Copy these snippets of code to a .py file and run the + simulator +

+ {/* prettier-ignore */} +
+

Tutorial for Circuit Playground Express

+

+ > Import the Circuit Playground library to use it + (This is required) +

+ +
+								from adafruit_circuitplayground import cp
+							
+
+

+ {" "} + > Turn on the little red LED +

+ +
while True:
+
 cp.red_led = True
+
+

+ {" "} + > Turn up red LED when button A is clicked +

+ +
while True:
+
 if cp.button_a:
+
 cp.red_led = True
+
+

+ {" "} + > Light up the first neopixel blue +

+ +
+								cp.pixels[0] = (0, 0, 255)
+							
+
+

+ And much more! These links have more tutorials: +

+

+ + Getting started with CPX and CircuitPython + +

+

+ + More example code + +

+

Keyboard Shortcuts

+
    +
  • + Push Button: A for Button A,{" "} + B for Button B, C for + Buttons A & B +
  • +
  • + Refresh the simulator: Shift +{" "} + R +
  • +
  • + Run the simulator: Shift +{" "} + F +
  • +
+
+ {/* prettier-ignore */} +
+

Tutorial for micro:bit

+

+ > Import the micro:bit library to use it (This is + required) +

+ +
+								from microbit import *
+							
+
+

+ > Light up your micro:bit with love by showing a + heart +

+ +
+								display.show(Image.HEART)
+							
+
+

+ > Use your micro:bit to tell the world how you’re + feeling +

+ +
while True:
+
+								{" "}
+								if button_a.is_pressed():
+							
+
+								{" "}
+								display.show(Image.HAPPY)
+							
+
+								{" "}
+								if button_b.is_pressed():
+							
+
+								{" "}
+								display.show(Image.SAD)
+							
+
+

+ {" "} + > Read then display the temperature +

+ +
while True:
+
+								{" "}
+								temp = temperature()
+							
+
 display.show(temp)
+
+

+ > Display your name with the scroll functionality +

+ +
while True:
+
+								{" "}
+								display.show("Your name")
+							
+
+

+ And much more! These links have more tutorials: +

+

+ + Microbit Tutorials + +

+

+ + Microbit official documentation + +

+

Keyboard Shortcuts

+
    +
  • + Push Button: A for Button A,{" "} + B for Button B, C for + Buttons A & B +
  • +
  • + Refresh the simulator: Shift +{" "} + R +
  • +
  • + Run the simulator: Shift +{" "} + F +
  • +
+
+ {/* prettier-ignore */} +
+

Tutorial for CLUE

+

+ > Import the the main CLUE library (This is + required) +

+ +
+								from adafruit_clue import clue
+							
+
+

+ > Display text on the CLUE and change the text when + a button is pressed +

+ +
+								clue_data =
+								clue.simple_text_display(title="CLUE!")
+							
+
while True:
+
+								{" "}
+								clue_data[1].text = "Hello World!"
+							
+
 if clue.button_a:
+
+								{" "}
+								clue_data[5].text = "A is pressed!"
+							
+
 else:
+
+								{" "}
+								clue_data[5].text = "A is not pressed!"
+							
+
 clue_data.show()
+
+

+ {" "} + > Create a slide show on the CLUE +

+

+ Make sure there are bitmap (.bmp) pictures of your + choice in the same directory as the code file. +

+ +
import board
+
+								from adafruit_slideshow import SlideShow
+							
+
 
+
+								slideshow = SlideShow(clue.display,
+								auto_advance=True, dwell=3, fade_effect=True)
+							
+
+								while slideshow.update():
+							
+
 pass
+
+

+ {" "} + > Light up the neopixel green +

+ +
+								clue.pixel.fill(clue.GREEN)
+							
+
+

+ {" "} + > Display sensor data on the CLUE +

+ +
+								clue_data = clue.simple_text_display(title="CLUE
+								Sensor Data!", title_scale=2)
+							
+
while True:
+
+								{" "}
+								clue_data[0].text = "Acceleration: {"{}"} {"{}"}{" "}
+								{"{}"}".format(*clue.acceleration)
+							
+
+								{" "}
+								clue_data[1].text = "Gyro: {"{}"} {"{}"} {"{}"}
+								".format(*clue.gyro)
+							
+
+								{" "}
+								clue_data[2].text = "Magnetic: {"{}"} {"{}"}{" "}
+								{"{}"}".format(*clue.magnetic)
+							
+
+								{" "}
+								clue_data[3].text = "Pressure: {"{}"}
+								hPa".format(clue.pressure)
+							
+
+								{" "}
+								clue_data[4].text = "Altitude: {"{}"}
+								m".format(clue.altitude)
+							
+
+								{" "}
+								clue_data[5].text = "Temperature: {"{}"}
+								C".format(clue.temperature)
+							
+
+								{" "}
+								clue_data[6].text = "Humidity: {"{}"}
+								%".format(clue.humidity)
+							
+
+								{" "}
+								clue_data[7].text = "Proximity: {"{}"}
+								".format(clue.proximity)
+							
+
+								{" "}
+								clue_data[8].text = "Gesture: {"{}"}
+								".format(clue.gesture)
+							
+
+								{" "}
+								clue_data[9].text = "Color: R: {"{}"} G: {"{}"}{" "}
+								B: {"{}"} C: {"{}"}".format(*clue.color)
+							
+
+								{" "}
+								clue_data[10].text = "Button A: {"{}"}
+								".format(clue.button_a)
+							
+
+								{" "}
+								clue_data[11].text = "Button B: {"{}"}
+								".format(clue.button_b)
+							
+
 clue_data.show()
+
+

+ {" "} + > Draw a blue rectangle on the screen +

+ +
import board
+
import displayio
+
+								from adafruit_display_shapes.rect import Rect
+							
+
 
+
+								splash = displayio.Group(max_size=20)
+							
+
+								board.DISPLAY.show(splash)
+							
+
 
+
+								rect = Rect(80, 20, 41, 41, fill=0x0000FF)
+							
+
splash.append(rect)
+
+

+ And much more! These links have more tutorials: +

+

+ + Getting started with CLUE and CircuitPython + +

+

+ + More example code + +

+

Keyboard Shortcuts

+
    +
  • + Push Button: A for Button A,{" "} + B for Button B, C for + Buttons A & B +
  • +
  • + Refresh the simulator: Shift +{" "} + R +
  • +
  • + Run the simulator: Shift +{" "} + F +
  • +
  • + Capacitive Touch Sensor: Shift +{" "} + 1 ~ 7 for GPIO pins A1 - + A7 +
  • +
  • + Slider Switch: Shift + S +
  • +
+
+ {/* prettier-ignore */} +
+

Tutorial for using the debugger

+

> Enter debug mode

+

+ Press F5 or go to{" "} + Run -> Start Debugging +

+ Start debugging +

+ > Set a breakpoint or multiple breakpoints +

+

+ Stopping at a breakpoint pauses the program at that + particular place. +

+

Use the debug toolbar or the shortcuts below

+ Debugger Toolbar +
    +
  • + F5 to continue / pause +
  • +
  • + F10 to step over (execute current + statement and all functions that it calls and + stop before the next statement) +
  • +
  • + F11 to step into (stop at first + statement of first function called from first + line) +
  • +
  • + Shift + F11 to step out + (run current function to end) +
  • +
  • + Ctrl + Shift +{" "} + F11 to restart +
  • +
  • + Shift + F5 to stop +
  • +
+ debugging experience +

+ > Observe the device's state on the "Variables" tab + on the left when stopped at a breakpoint +

+ Debugger Variables +

+ And much more! These links have more tutorials: +

+

+ + Learn more about debugging in VS Code + +

+
+
+
+ ); + } } diff --git a/Source/view/svgs/arrow_right_svg.tsx b/Source/view/svgs/arrow_right_svg.tsx index 7eead7979..b7beaa0f4 100644 --- a/Source/view/svgs/arrow_right_svg.tsx +++ b/Source/view/svgs/arrow_right_svg.tsx @@ -1,21 +1,21 @@ import * as React from "react"; export const ARROW_RIGHT_SVG = ( - - - + + + ); export default ARROW_RIGHT_SVG; diff --git a/Source/view/svgs/close_svg.tsx b/Source/view/svgs/close_svg.tsx index ac05bedfc..22a836710 100644 --- a/Source/view/svgs/close_svg.tsx +++ b/Source/view/svgs/close_svg.tsx @@ -1,26 +1,26 @@ import * as React from "react"; export const CLOSE_SVG = ( - - - - + + + + ); export default CLOSE_SVG; diff --git a/Source/view/svgs/play_svg.tsx b/Source/view/svgs/play_svg.tsx index 0da21aa9d..6e9baae0e 100644 --- a/Source/view/svgs/play_svg.tsx +++ b/Source/view/svgs/play_svg.tsx @@ -1,19 +1,19 @@ import * as React from "react"; export const PLAY_SVG = ( - - - + + + ); export default PLAY_SVG; diff --git a/Source/view/svgs/refresh_svg.tsx b/Source/view/svgs/refresh_svg.tsx index 340ad03f8..b654138d6 100644 --- a/Source/view/svgs/refresh_svg.tsx +++ b/Source/view/svgs/refresh_svg.tsx @@ -2,20 +2,20 @@ import * as React from "react"; import "../styles/Button.css"; export const REFRESH_SVG = ( - - - + + + ); export default REFRESH_SVG; diff --git a/Source/view/svgs/stop_svg.tsx b/Source/view/svgs/stop_svg.tsx index a89175f66..528528bf1 100644 --- a/Source/view/svgs/stop_svg.tsx +++ b/Source/view/svgs/stop_svg.tsx @@ -1,21 +1,21 @@ import * as React from "react"; export const STOP_SVG = ( - - - + + + ); export default STOP_SVG; diff --git a/Source/view/svgs/tag_input_svg.tsx b/Source/view/svgs/tag_input_svg.tsx index 13a507504..b0337ccb0 100644 --- a/Source/view/svgs/tag_input_svg.tsx +++ b/Source/view/svgs/tag_input_svg.tsx @@ -1,27 +1,27 @@ import * as React from "react"; export const TAG_INPUT_SVG = ( - - - - + + + + ); export default TAG_INPUT_SVG; diff --git a/Source/view/svgs/tag_output_svg.tsx b/Source/view/svgs/tag_output_svg.tsx index 745175db5..320ac866f 100644 --- a/Source/view/svgs/tag_output_svg.tsx +++ b/Source/view/svgs/tag_output_svg.tsx @@ -1,26 +1,26 @@ import * as React from "react"; export const TAG_OUTPUT_SVG = ( - - - - + + + + ); export default TAG_OUTPUT_SVG; diff --git a/Source/view/svgs/toolbar_svg.tsx b/Source/view/svgs/toolbar_svg.tsx index 52de70b86..81f17865f 100644 --- a/Source/view/svgs/toolbar_svg.tsx +++ b/Source/view/svgs/toolbar_svg.tsx @@ -3,738 +3,738 @@ import { TOOLBAR_ICON_LABEL } from "../components/toolbar/SensorModalUtils"; import "../styles/Button.css"; export const LEFT_EDGE_SVG = ( - - - - - - - - - - + + + + + + + + + + ); export const RIGHT_EDGE_SVG = ( - - - - - - - - - - + + + + + + + + + + ); export const GPIO_SVG = ( - - Created with Sketch. - - - - - - + + Created with Sketch. + + + + + + ); export const IR_SVG = ( - - Created with Sketch. - - - - - - - - + + Created with Sketch. + + + + + + + + ); export const LIGHT_SVG = ( - - - - - - - - - - - + + + + + + + + + + + ); export const MOTION_SVG = ( - - - - - - - - - - - + + + + + + + + + + + ); export const NEO_PIXEL_SVG = ( - - Created with Sketch. - - - - - - - - - - - - - - - + + Created with Sketch. + + + + + + + + + + + + + + + ); export const PUSH_BUTTON_SVG = ( - - Created with Sketch. - - - - - - - - - + + Created with Sketch. + + + + + + + + + ); export const RED_LED_SVG = ( - - Created with Sketch. - - - - - - - - - + + Created with Sketch. + + + + + + + + + ); export const SLIDER_SWITCH_SVG = ( - - Created with Sketch. - - - - - - - - - + + Created with Sketch. + + + + + + + + + ); export const SOUND_SVG = ( - - Created with Sketch. - - - - - - - - - - - + + Created with Sketch. + + + + + + + + + + + ); export const SPEAKER_SVG = ( - - Created with Sketch. - - - - - - - - + + Created with Sketch. + + + + + + + + ); export const TEMPERATURE_SVG = ( - - - - - - - - - + + + + + + + + + ); export const WIRELESS_SVG = ( - - - - - - - - - + + + + + + + + + ); export default LEFT_EDGE_SVG; export const GESTURE_SVG = ( - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + ); export const HUMIDITY_SVG = ( - - - - + + + - - - - - - - - - + /> + + + ); export const PRESSURE_SVG = ( - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + ); export const PROXIMITY_SVG = ( - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + ); export const MAGNET_SVG = ( - - - + + - - + /> + + ); export const GYROSCOPE_SVG = ( - - - + + + - - - - - - - - - + + + + + + + + + ); export const COMPASS_SVG = ( - - - - - + + + + + ); diff --git a/Source/view/translations/en.json b/Source/view/translations/en.json index c5e6ebed9..6583386d6 100644 --- a/Source/view/translations/en.json +++ b/Source/view/translations/en.json @@ -1,112 +1,112 @@ { - "toolbar-gpio.description": "8 GPIOs on the device! Pin A1 - A7 can also be used as capacitive touch sensors, and A0 is a true analog output pin.", - "toolbar-gpio.title": "GPIO", - "toolbar-gpio.tryItDescription": "Use your mouse to interact with the pin A1 - A7 or use your keyboard SHIFT + ”1” - “7”.", - "toolbar-ir-sensor.description": "Allows you to send commands to the device with a remote control, or even send messages between multiple devices! You can also do very simple proximity sensing since it reads the reflected light.", - "toolbar-ir-sensor.title": "IR Transmit & Receiver", - "toolbar-ir-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-light-sensor.description": "An analog light sensor can be used to detect ambient light, with similar spectral response to the human eye.", - "toolbar-light-sensor.title": "Light Sensor", - "toolbar-light-sensor.tryItDescription": "Change the brightness detected by the sensor here!", - "toolbar-motion-sensor.description": "Detects acceleration in X, Y and Z orientations. It can also detect 'tap' and 'double tap' strikes on the board and when the board is shaken.", - "toolbar-motion-sensor.title": "Motion Sensor", - "toolbar-motion-sensor.tryItDescription": "Change the acceleration here and click or click on the button to simulate a shake. The tap feature is not supported by the Device Simulator Express. If you would like to see the 'tap' feature implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-neo-pixels.description": "The 10 full color RGB LEDs surrounding the outer edge of the boards can be set to any color. Great for beautiful lighting effects!", - "toolbar-neo-pixels.title": "NeoPixels", - "toolbar-neo-pixels.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-a-b-push.description": "Two push buttons A and B are connected to digital pin #4 (Left) and #5 (Right) each.", - "toolbar-a-b-push.title": "Push Buttons", - "toolbar-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-red-led.description": "This Red LED is connected to the digital #13 GPIO pin. It can be very handy when you want an indicator LED.", - "toolbar-red-led.title": "Red LED", - "toolbar-red-led.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-sound-sensor.description": "A digital microphone can detect audio volume and even perform basic FFT functions but cannot read it like an analog voltage.", - "toolbar-sound-sensor.title": "Sound Sensor", - "toolbar-sound-sensor.tryItDescription": "If you would like to see the sound sensor implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-slider-switch.description": "This slide switch returns True or False depending on whether it's ON or OFF and can be used as a toggle switch in your code!", - "toolbar-slider-switch.title": "Slider Switch", - "toolbar-slider-switch.tryItDescription": "Click it with your mouse or press 'S' on your keyboard to switch it ON and OFF!", - "toolbar-speaker.description": "This speaker can play a .wav file and different tones and also has a class D amplifier that is connected to an output A0 pin built in! You can turn it off using the shutdown control on pin #11 on the physical device.", - "toolbar-speaker.title": "Speaker", - "toolbar-speaker.tryItDescription": "Right now the tones are not supported on the simulator. If you would like to see tones implemented, please +1 the feature addition issue on GitHub! Regardless, you can play it on your device!", - "toolbar-temperature-sensor.description": "This sensor uses an NTC thermistor to sense temperature an calculate it with the analog voltage on analog pin #A9.", - "toolbar-temperature-sensor.title": "Temperature Sensor", - "toolbar-temperature-sensor.tryItDescription": "You can set the temperature in degrees Celsius.", - "toolbar-accelerometer-sensor.title": "Accelerometer", - "toolbar-accelerometer-sensor.description": "An accelerometer measures the acceleration of your micro:bit; this component senses when the micro:bit is moved.", - "toolbar-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", - "toolbar-microbit-light-sensor.title": "Light Sensor", - "toolbar-microbit-temperature-sensor.title": "Temperature Sensor", - "toolbar-microbit-led.title": "LEDs", - "toolbar-microbit-led.description": "The microbit has 25 LEDs for you to play with. The LEDs have 9 levels of brightness.", - "toolbar-microbit-led.tryItDescription": "Run your code and see the LEDs light up!", - "toolbar-microbit-a-b-push.title": "Buttons", - "toolbar-microbit-a-b-push.description": "There are two buttons on the front of the micro:bit (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", - "toolbar-microbit-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-microbit-sound.title": "Sound", - "toolbar-microbit-sound.description": "Your BBC micro:bit can be programmed to make a wide variety of sounds - from single notes, tones and beats to your own musical compositions.", - "toolbar-microbit-sound.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-gpio.title": "GPIO (Pins)", - "toolbar-microbit-gpio.description": "On the bottom edge of your BBC micro:bit there are 25 gold strips, called pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", - "toolbar-microbit-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-wireless.title": "Bluetooth & Radio", - "toolbar-microbit-wireless.description": "micro:bits can use radio waves and bluetooth services to communicate with each other.", + "toolbar-gpio.description": "8 GPIOs on the device! Pin A1 - A7 can also be used as capacitive touch sensors, and A0 is a true analog output pin.", + "toolbar-gpio.title": "GPIO", + "toolbar-gpio.tryItDescription": "Use your mouse to interact with the pin A1 - A7 or use your keyboard SHIFT + ”1” - “7”.", + "toolbar-ir-sensor.description": "Allows you to send commands to the device with a remote control, or even send messages between multiple devices! You can also do very simple proximity sensing since it reads the reflected light.", + "toolbar-ir-sensor.title": "IR Transmit & Receiver", + "toolbar-ir-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-light-sensor.description": "An analog light sensor can be used to detect ambient light, with similar spectral response to the human eye.", + "toolbar-light-sensor.title": "Light Sensor", + "toolbar-light-sensor.tryItDescription": "Change the brightness detected by the sensor here!", + "toolbar-motion-sensor.description": "Detects acceleration in X, Y and Z orientations. It can also detect 'tap' and 'double tap' strikes on the board and when the board is shaken.", + "toolbar-motion-sensor.title": "Motion Sensor", + "toolbar-motion-sensor.tryItDescription": "Change the acceleration here and click or click on the button to simulate a shake. The tap feature is not supported by the Device Simulator Express. If you would like to see the 'tap' feature implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-neo-pixels.description": "The 10 full color RGB LEDs surrounding the outer edge of the boards can be set to any color. Great for beautiful lighting effects!", + "toolbar-neo-pixels.title": "NeoPixels", + "toolbar-neo-pixels.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-a-b-push.description": "Two push buttons A and B are connected to digital pin #4 (Left) and #5 (Right) each.", + "toolbar-a-b-push.title": "Push Buttons", + "toolbar-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", + "toolbar-red-led.description": "This Red LED is connected to the digital #13 GPIO pin. It can be very handy when you want an indicator LED.", + "toolbar-red-led.title": "Red LED", + "toolbar-red-led.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-sound-sensor.description": "A digital microphone can detect audio volume and even perform basic FFT functions but cannot read it like an analog voltage.", + "toolbar-sound-sensor.title": "Sound Sensor", + "toolbar-sound-sensor.tryItDescription": "If you would like to see the sound sensor implemented, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-slider-switch.description": "This slide switch returns True or False depending on whether it's ON or OFF and can be used as a toggle switch in your code!", + "toolbar-slider-switch.title": "Slider Switch", + "toolbar-slider-switch.tryItDescription": "Click it with your mouse or press 'S' on your keyboard to switch it ON and OFF!", + "toolbar-speaker.description": "This speaker can play a .wav file and different tones and also has a class D amplifier that is connected to an output A0 pin built in! You can turn it off using the shutdown control on pin #11 on the physical device.", + "toolbar-speaker.title": "Speaker", + "toolbar-speaker.tryItDescription": "Right now the tones are not supported on the simulator. If you would like to see tones implemented, please +1 the feature addition issue on GitHub! Regardless, you can play it on your device!", + "toolbar-temperature-sensor.description": "This sensor uses an NTC thermistor to sense temperature an calculate it with the analog voltage on analog pin #A9.", + "toolbar-temperature-sensor.title": "Temperature Sensor", + "toolbar-temperature-sensor.tryItDescription": "You can set the temperature in degrees Celsius.", + "toolbar-accelerometer-sensor.title": "Accelerometer", + "toolbar-accelerometer-sensor.description": "An accelerometer measures the acceleration of your micro:bit; this component senses when the micro:bit is moved.", + "toolbar-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", + "toolbar-microbit-light-sensor.title": "Light Sensor", + "toolbar-microbit-temperature-sensor.title": "Temperature Sensor", + "toolbar-microbit-led.title": "LEDs", + "toolbar-microbit-led.description": "The microbit has 25 LEDs for you to play with. The LEDs have 9 levels of brightness.", + "toolbar-microbit-led.tryItDescription": "Run your code and see the LEDs light up!", + "toolbar-microbit-a-b-push.title": "Buttons", + "toolbar-microbit-a-b-push.description": "There are two buttons on the front of the micro:bit (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", + "toolbar-microbit-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", + "toolbar-microbit-sound.title": "Sound", + "toolbar-microbit-sound.description": "Your BBC micro:bit can be programmed to make a wide variety of sounds - from single notes, tones and beats to your own musical compositions.", + "toolbar-microbit-sound.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-microbit-gpio.title": "GPIO (Pins)", + "toolbar-microbit-gpio.description": "On the bottom edge of your BBC micro:bit there are 25 gold strips, called pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", + "toolbar-microbit-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-microbit-wireless.title": "Bluetooth & Radio", + "toolbar-microbit-wireless.description": "micro:bits can use radio waves and bluetooth services to communicate with each other.", - "toolbar-microbit-wireless.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", - "toolbar-microbit-gesture-sensor.title": "Gesture", - "toolbar-microbit-gesture-sensor.description": "If you move your BBC micro:bit in a certain way (as a gesture) then the micro:bit is able to detect this. It can recognize the following gestures: up, down, left, right, face up, face down, freefall, 3g, 6g, 8g, and shake.", + "toolbar-microbit-wireless.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! For now, you can try it on MakeCode!", + "toolbar-microbit-gesture-sensor.title": "Gesture", + "toolbar-microbit-gesture-sensor.description": "If you move your BBC micro:bit in a certain way (as a gesture) then the micro:bit is able to detect this. It can recognize the following gestures: up, down, left, right, face up, face down, freefall, 3g, 6g, 8g, and shake.", - "toolbar-microbit-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", - "toolbar-microbit-compass-sensor.title": "Compass", - "toolbar-microbit-compass-sensor.description": "A digital compass is an input sensor that detects magnetic fields. Your BBC micro:bit has an inbuilt compass that can detect the direction in which it is facing.", - "toolbar-microbit-compass-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-temperature-sensor.title": "Temperature", - "toolbar-clue-temperature-sensor.description": "CLUE uses the BMP280 sensor, an environmental sensor with temperature. This precision sensor from Bosch is the best low-cost, precision sensing solution for measuring temperature with ±1.0°C accuracy.", + "toolbar-microbit-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", + "toolbar-microbit-compass-sensor.title": "Compass", + "toolbar-microbit-compass-sensor.description": "A digital compass is an input sensor that detects magnetic fields. Your BBC micro:bit has an inbuilt compass that can detect the direction in which it is facing.", + "toolbar-microbit-compass-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", + "toolbar-clue-temperature-sensor.title": "Temperature", + "toolbar-clue-temperature-sensor.description": "CLUE uses the BMP280 sensor, an environmental sensor with temperature. This precision sensor from Bosch is the best low-cost, precision sensing solution for measuring temperature with ±1.0°C accuracy.", - "toolbar-clue-temperature-sensor.tryItDescription": "You can simulate the temperature in your code!", + "toolbar-clue-temperature-sensor.tryItDescription": "You can simulate the temperature in your code!", - "toolbar-clue-light-sensor.title": "Light/Color Sensor", - "toolbar-clue-light-sensor.description": "The light sensor uses APDS9960 and is able to return the red, blue, green and clear light.", - "toolbar-clue-light-sensor.tryItDescription": "You can set the color values of the light detected.", - "toolbar-clue-accelerometer-sensor.title": "Accelerometer", - "toolbar-clue-accelerometer-sensor.description": " The 3-axis accelerometer, can tell you which direction is down towards the Earth (by measuring gravity) or how fast the board is accelerating in 3D space.", - "toolbar-clue-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", - "toolbar-clue-led.title": "Neopixel", - "toolbar-clue-led.description": "The CLUE has one full RGB LED (NeoPixel) on the back of the device.", + "toolbar-clue-light-sensor.title": "Light/Color Sensor", + "toolbar-clue-light-sensor.description": "The light sensor uses APDS9960 and is able to return the red, blue, green and clear light.", + "toolbar-clue-light-sensor.tryItDescription": "You can set the color values of the light detected.", + "toolbar-clue-accelerometer-sensor.title": "Accelerometer", + "toolbar-clue-accelerometer-sensor.description": " The 3-axis accelerometer, can tell you which direction is down towards the Earth (by measuring gravity) or how fast the board is accelerating in 3D space.", + "toolbar-clue-accelerometer-sensor.tryItDescription": "Set the acceleration with the sliders.", + "toolbar-clue-led.title": "Neopixel", + "toolbar-clue-led.description": "The CLUE has one full RGB LED (NeoPixel) on the back of the device.", - "toolbar-clue-led.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-clue-a-b-push.title": "Buttons", - "toolbar-clue-a-b-push.description": "There are two buttons on the front of the CLUE (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", - "toolbar-clue-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", - "toolbar-clue-gpio.title": "Input/Output (GPIO)", - "toolbar-clue-gpio.description": "On the bottom edge of your CLUE, you have 25 pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", - "toolbar-clue-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-sound-sensor.title": "Sound", - "toolbar-clue-sound-sensor.description": "The CLUE uses a PDM MEMS microphone. PDM is a little like 1-bit PWM. You clock the mic with a 1 MHz - 3 MHz clock rate, and on the data line you'll get a square wave out that syncs with the clock.", - "toolbar-clue-sound-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", - "toolbar-clue-pressure-sensor.title": "Pressure", - "toolbar-clue-pressure-sensor.description": "CLUE uses the BMP280 sensor for barometric pressure. Because pressure changes with altitude, you can also use it as an altimeter with ±1 meter accuracy.", + "toolbar-clue-led.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-clue-a-b-push.title": "Buttons", + "toolbar-clue-a-b-push.description": "There are two buttons on the front of the CLUE (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", + "toolbar-clue-a-b-push.tryItDescription": "Click them with your mouse or by pressing “A” and/or “B” on your keyboard!", + "toolbar-clue-gpio.title": "Input/Output (GPIO)", + "toolbar-clue-gpio.description": "On the bottom edge of your CLUE, you have 25 pins. These pins allow you to really get creative. You can create circuits, connect external things like buzzers and motors and make your own fun projects.", + "toolbar-clue-gpio.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", + "toolbar-clue-sound-sensor.title": "Sound", + "toolbar-clue-sound-sensor.description": "The CLUE uses a PDM MEMS microphone. PDM is a little like 1-bit PWM. You clock the mic with a 1 MHz - 3 MHz clock rate, and on the data line you'll get a square wave out that syncs with the clock.", + "toolbar-clue-sound-sensor.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub!", + "toolbar-clue-pressure-sensor.title": "Pressure", + "toolbar-clue-pressure-sensor.description": "CLUE uses the BMP280 sensor for barometric pressure. Because pressure changes with altitude, you can also use it as an altimeter with ±1 meter accuracy.", - "toolbar-clue-pressure-sensor.tryItDescription": "You can set the pressure here in hectoPascals (hPa).", - "toolbar-clue-humidity-sensor.title": "Humidity", - "toolbar-clue-humidity-sensor.description": "The SHT30-D sensor has an excellent ±2% relative humidity and ±0.5°C accuracy for most uses.", - "toolbar-clue-humidity-sensor.tryItDescription": "You can set the humidity in percentage (%) here.", - "toolbar-clue-gesture-sensor.title": "Gesture", - "toolbar-clue-gesture-sensor.description": "The gesture sensor can detect directional gestures (left to right, right to left, up to down, down to up), but in theory more complicated gestures like zig-zag, clockwise or counterclockwise circle, near to far, etc. could also be detected with additional code. ", - "toolbar-clue-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", - "toolbar-clue-proximity-sensor.title": "Proximity", - "toolbar-clue-proximity-sensor.description": "The proximity sensor uses APDS9960 and is able to return how close an object is to the front of the sensor. This is a number from 0 to 255 where the higher the number the closer an object is to the sensor. You won't be able to translate this into an absolute value in units like inches or millimeters, you can only see how it changes relative to other values.", + "toolbar-clue-pressure-sensor.tryItDescription": "You can set the pressure here in hectoPascals (hPa).", + "toolbar-clue-humidity-sensor.title": "Humidity", + "toolbar-clue-humidity-sensor.description": "The SHT30-D sensor has an excellent ±2% relative humidity and ±0.5°C accuracy for most uses.", + "toolbar-clue-humidity-sensor.tryItDescription": "You can set the humidity in percentage (%) here.", + "toolbar-clue-gesture-sensor.title": "Gesture", + "toolbar-clue-gesture-sensor.description": "The gesture sensor can detect directional gestures (left to right, right to left, up to down, down to up), but in theory more complicated gestures like zig-zag, clockwise or counterclockwise circle, near to far, etc. could also be detected with additional code. ", + "toolbar-clue-gesture-sensor.tryItDescription": "Select a gesture and send it by clicking the button.", + "toolbar-clue-proximity-sensor.title": "Proximity", + "toolbar-clue-proximity-sensor.description": "The proximity sensor uses APDS9960 and is able to return how close an object is to the front of the sensor. This is a number from 0 to 255 where the higher the number the closer an object is to the sensor. You won't be able to translate this into an absolute value in units like inches or millimeters, you can only see how it changes relative to other values.", - "toolbar-clue-proximity-sensor.tryItDescription": "Set relative proximity to the sensor in values from 0 - 255, where 0 means very close and 255 means very far.", + "toolbar-clue-proximity-sensor.tryItDescription": "Set relative proximity to the sensor in values from 0 - 255, where 0 means very close and 255 means very far.", - "toolbar-clue-bluetooth.title": "Bluetooth", - "toolbar-clue-bluetooth.description": "You can transmit data over Bluetooth to a computer or mobile device for data plotting and logging, or save it to the built in storage.", - "toolbar-clue-bluetooth.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! ", - "toolbar-clue-speaker.description": "The CLUE has a buzzer/speaker for playing tones and beeps.", - "toolbar-clue-magnet-sensor.title": "Magnetometer", - "toolbar-clue-magnet-sensor.description": "Sense the magnetic fields that surround us with this handy triple-axis magnetometer (compass) module. Magnetometers can sense where the strongest magnetic force is coming from, generally used to detect magnetic north, but can also be used for measuring magnetic fields.", - "toolbar-clue-magnet-sensor.tryItDescription": "You can set the magnetic field value in microTeslas (uT).", - "toolbar-clue-gyroscope-sensor.title": "Gyroscope", - "toolbar-clue-gyroscope-sensor.description": "The 3-axis gyroscope that can measure spin and twist users LSM6DS33.", - "toolbar-clue-gyroscope-sensor.tryItDescription": "Set the angular velocity in degrees/second." + "toolbar-clue-bluetooth.title": "Bluetooth", + "toolbar-clue-bluetooth.description": "You can transmit data over Bluetooth to a computer or mobile device for data plotting and logging, or save it to the built in storage.", + "toolbar-clue-bluetooth.tryItDescription": "If you would like to see this sensor supported, please +1 the feature addition issue on GitHub! ", + "toolbar-clue-speaker.description": "The CLUE has a buzzer/speaker for playing tones and beeps.", + "toolbar-clue-magnet-sensor.title": "Magnetometer", + "toolbar-clue-magnet-sensor.description": "Sense the magnetic fields that surround us with this handy triple-axis magnetometer (compass) module. Magnetometers can sense where the strongest magnetic force is coming from, generally used to detect magnetic north, but can also be used for measuring magnetic fields.", + "toolbar-clue-magnet-sensor.tryItDescription": "You can set the magnetic field value in microTeslas (uT).", + "toolbar-clue-gyroscope-sensor.title": "Gyroscope", + "toolbar-clue-gyroscope-sensor.description": "The 3-axis gyroscope that can measure spin and twist users LSM6DS33.", + "toolbar-clue-gyroscope-sensor.tryItDescription": "Set the angular velocity in degrees/second." } diff --git a/Source/view/utils/MessageUtils.tsx b/Source/view/utils/MessageUtils.tsx index a9fcf9c75..3485204fc 100644 --- a/Source/view/utils/MessageUtils.tsx +++ b/Source/view/utils/MessageUtils.tsx @@ -1,12 +1,12 @@ interface vscode { - postMessage(message: any): void; + postMessage(message: any): void; } declare const vscode: vscode; export const sendMessage = ( - type: string, - state: TState + type: string, + state: TState, ) => { - vscode.postMessage({ command: type, text: state }); + vscode.postMessage({ command: type, text: state }); }; diff --git a/Source/view/viewUtils.tsx b/Source/view/viewUtils.tsx index 1335d039f..a210b8021 100644 --- a/Source/view/viewUtils.tsx +++ b/Source/view/viewUtils.tsx @@ -3,29 +3,29 @@ import { SENSOR_LIST } from "./constants"; // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. export interface ISliderProps { - minValue: number; - maxValue: number; - maxLabel: string; - minLabel: string; - type: string | SENSOR_LIST; - axisLabel: string; - value?: number; - onUpdateValue?: (sensor: SENSOR_LIST, value: number) => void; - step: number; + minValue: number; + maxValue: number; + maxLabel: string; + minLabel: string; + type: string | SENSOR_LIST; + axisLabel: string; + value?: number; + onUpdateValue?: (sensor: SENSOR_LIST, value: number) => void; + step: number; } export interface ISensorButtonProps { - label: string; - type: string; - onMouseUp?: (event: React.PointerEvent) => void; - onMouseDown?: (event: React.PointerEvent) => void; - onKeyUp?: (event: React.KeyboardEvent) => void; - onKeyDown?: (event: React.KeyboardEvent) => void; + label: string; + type: string; + onMouseUp?: (event: React.PointerEvent) => void; + onMouseDown?: (event: React.PointerEvent) => void; + onKeyUp?: (event: React.KeyboardEvent) => void; + onKeyDown?: (event: React.KeyboardEvent) => void; } export interface ISensorProps { - LABEL: string; - sliderProps: ISliderProps[]; - unitLabel: string; + LABEL: string; + sliderProps: ISliderProps[]; + unitLabel: string; } export const X_SLIDER_INDEX = 0; diff --git a/gulpfile.js b/gulpfile.js index 65b6b47a2..4b487177c 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,145 +1,145 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -const gulp = require("gulp"); - -const ts = require("gulp-typescript"); -const sourcemaps = require("gulp-sourcemaps"); -const typescript = require("typescript"); -const del = require("del"); -const es = require("event-stream"); -const vsce = require("vsce"); -const nls = require("vscode-nls-dev"); - -const tsProject = ts.createProject("./tsconfig.json", { typescript }); - -const inlineMap = true; -const inlineSource = false; -const outDest = "out"; - -// A list of all locales supported by VSCode can be found here: https://code.visualstudio.com/docs/getstarted/locales -const languages = [{ folderName: "en", id: "en" }]; - -gulp.task("clean", () => { - return del( - [ - "out/*", - "package.nls.*.json", - "../../dist/*0.0.0-UNTRACKEDVERSION.vsix", - ], - { force: true } - ); -}); - -const pythonToMove = [ - "./src/adafruit_circuitplayground/*.*", - "./src/clue/*.*", - "./src/clue/!(test)/**/*", - "./src/base_circuitpython/**/*", - "./src/micropython/*.*", - "./src/micropython/microbit/*.*", - "./src/micropython/microbit/!(test)/**/*", - "./src/*.py", - "./src/common/*.py", - "./src/dev-requirements.txt", - "./src/requirements.txt", - "./src/templates/*.*" -]; - -gulp.task("python-compile", () => { - // the base option sets the relative root for the set of files, - // preserving the folder structure - return gulp.src(pythonToMove, { base: "./src/" }).pipe(gulp.dest("out")); -}); - -gulp.task("internal-compile", () => { - return compile(false); -}); - -gulp.task("internal-nls-compile", () => { - return compile(true); -}); - -gulp.task("add-locales", () => { - return gulp - .src(["package.nls.json"]) - .pipe(nls.createAdditionalLanguageFiles(languages, "locales")) - .pipe(gulp.dest(".")); -}); - -gulp.task("vsce:publish", () => { - return vsce.publish(); -}); - -gulp.task("vsce:package", () => { - return vsce.createVSIX({ - packagePath: - "../../dist/deviceSimulatorExpress-0.0.0-UNTRACKEDVERSION.vsix", - }); -}); - -gulp.task( - "compile", - gulp.series("clean", "internal-compile", "python-compile", callback => { - callback(); - }) -); - -gulp.task( - "build", - gulp.series( - "clean", - "internal-nls-compile", - "python-compile", - "add-locales", - callback => { - callback(); - } - ) -); - -gulp.task( - "publish", - gulp.series("compile", "vsce:publish", callback => { - callback(); - }) -); - -gulp.task( - "package", - gulp.series("compile", "vsce:package", callback => { - callback(); - }) -); - -//---- internal - -function compile(buildNls) { - var r = tsProject - .src() - .pipe(sourcemaps.init()) - .pipe(tsProject()) - .js.pipe(buildNls ? nls.rewriteLocalizeCalls() : es.through()) - .pipe( - buildNls - ? nls.createAdditionalLanguageFiles(languages, "locales", "out") - : es.through() - ); - - if (inlineMap && inlineSource) { - r = r.pipe(sourcemaps.write()); - } else { - r = r.pipe( - sourcemaps.write("../out", { - // no inlined source - includeContent: inlineSource, - // Return relative source map root directories per file. - sourceRoot: "../src", - }) - ); - } - - return r.pipe(gulp.dest(outDest)); -} +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +const gulp = require("gulp"); + +const ts = require("gulp-typescript"); +const sourcemaps = require("gulp-sourcemaps"); +const typescript = require("typescript"); +const del = require("del"); +const es = require("event-stream"); +const vsce = require("vsce"); +const nls = require("vscode-nls-dev"); + +const tsProject = ts.createProject("./tsconfig.json", { typescript }); + +const inlineMap = true; +const inlineSource = false; +const outDest = "out"; + +// A list of all locales supported by VSCode can be found here: https://code.visualstudio.com/docs/getstarted/locales +const languages = [{ folderName: "en", id: "en" }]; + +gulp.task("clean", () => { + return del( + [ + "out/*", + "package.nls.*.json", + "../../dist/*0.0.0-UNTRACKEDVERSION.vsix", + ], + { force: true }, + ); +}); + +const pythonToMove = [ + "./src/adafruit_circuitplayground/*.*", + "./src/clue/*.*", + "./src/clue/!(test)/**/*", + "./src/base_circuitpython/**/*", + "./src/micropython/*.*", + "./src/micropython/microbit/*.*", + "./src/micropython/microbit/!(test)/**/*", + "./src/*.py", + "./src/common/*.py", + "./src/dev-requirements.txt", + "./src/requirements.txt", + "./src/templates/*.*", +]; + +gulp.task("python-compile", () => { + // the base option sets the relative root for the set of files, + // preserving the folder structure + return gulp.src(pythonToMove, { base: "./src/" }).pipe(gulp.dest("out")); +}); + +gulp.task("internal-compile", () => { + return compile(false); +}); + +gulp.task("internal-nls-compile", () => { + return compile(true); +}); + +gulp.task("add-locales", () => { + return gulp + .src(["package.nls.json"]) + .pipe(nls.createAdditionalLanguageFiles(languages, "locales")) + .pipe(gulp.dest(".")); +}); + +gulp.task("vsce:publish", () => { + return vsce.publish(); +}); + +gulp.task("vsce:package", () => { + return vsce.createVSIX({ + packagePath: + "../../dist/deviceSimulatorExpress-0.0.0-UNTRACKEDVERSION.vsix", + }); +}); + +gulp.task( + "compile", + gulp.series("clean", "internal-compile", "python-compile", (callback) => { + callback(); + }), +); + +gulp.task( + "build", + gulp.series( + "clean", + "internal-nls-compile", + "python-compile", + "add-locales", + (callback) => { + callback(); + }, + ), +); + +gulp.task( + "publish", + gulp.series("compile", "vsce:publish", (callback) => { + callback(); + }), +); + +gulp.task( + "package", + gulp.series("compile", "vsce:package", (callback) => { + callback(); + }), +); + +//---- internal + +function compile(buildNls) { + var r = tsProject + .src() + .pipe(sourcemaps.init()) + .pipe(tsProject()) + .js.pipe(buildNls ? nls.rewriteLocalizeCalls() : es.through()) + .pipe( + buildNls + ? nls.createAdditionalLanguageFiles(languages, "locales", "out") + : es.through(), + ); + + if (inlineMap && inlineSource) { + r = r.pipe(sourcemaps.write()); + } else { + r = r.pipe( + sourcemaps.write("../out", { + // no inlined source + includeContent: inlineSource, + // Return relative source map root directories per file. + sourceRoot: "../src", + }), + ); + } + + return r.pipe(gulp.dest(outDest)); +} diff --git a/jest.config.js b/jest.config.js index 3d7f4f549..c4371f1b0 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,28 +1,25 @@ module.exports = { - // The root of your source code, typically /src - // `` is a token Jest substitutes - roots: ["/src"], - - // Jest transformations -- this adds support for TypeScript - // using ts-jest - transform: { - '^.+\\.tsx?$': 'ts-jest', - ".+\\.(css|styl|less|sass|scss)$": "jest-transform-css" - }, - - // Runs special logic, such as cleaning up components - // when using React Testing Library and adds special - // extended assertions to Jest - setupFilesAfterEnv: [ - "@testing-library/jest-dom/extend-expect" - ], + // The root of your source code, typically /src + // `` is a token Jest substitutes + roots: ["/src"], - // Test spec file resolution pattern - // Matches parent folder `__tests__` and filename - // should contain `test` or `spec`. - testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$", - - // Module file extensions for importing - moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], - - }; \ No newline at end of file + // Jest transformations -- this adds support for TypeScript + // using ts-jest + transform: { + "^.+\\.tsx?$": "ts-jest", + ".+\\.(css|styl|less|sass|scss)$": "jest-transform-css", + }, + + // Runs special logic, such as cleaning up components + // when using React Testing Library and adds special + // extended assertions to Jest + setupFilesAfterEnv: ["@testing-library/jest-dom/extend-expect"], + + // Test spec file resolution pattern + // Matches parent folder `__tests__` and filename + // should contain `test` or `spec`. + testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$", + + // Module file extensions for importing + moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], +}; diff --git a/locales/en/out/constants.i18n.json b/locales/en/out/constants.i18n.json index d6df54300..079866bfc 100644 --- a/locales/en/out/constants.i18n.json +++ b/locales/en/out/constants.i18n.json @@ -1,45 +1,45 @@ { - "dialogResponses.agreeAndRun": "Agree and Run", - "dialogResponses.acceptPrivacy": "Got it", - "dialogResponses.cancel": "Cancel", - "dialogResponses.select": "Select", - "dialogResponses.dontShowAgain": "Don't Show Again", - "dialogResponses.exampleCode": "Example Code on GitHub", - "dialogResponses.help": "I need help", - "dialogResponses.installPython": "Install from python.org", - "dialogResponses.installNow": "Install Now", - "dialogResponses.dontInstall": "Don't Install", - "dialogResponses.tutorials": "Tutorials on Adafruit", - "dialogResponses.readInstall": "Read installation docs", - "error.debuggerServerInitFailed": "Warning : The Debugger Server cannot be opened. Please try to free the port {0} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.", - "error.debuggingSessionInProgress": "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n", - "error.noDevice": "No plugged in boards detected. Please double check if your board is connected and/or properly formatted", - "error.noFileToRun": "\n[ERROR] We can't find the .py file to run. Open up a new .py file, or browse through some examples\n", - "error.noFileToDeploy": "\n[ERROR] We can't find a Python file to deploy to your device.\n", - "error.noFolderCreated": "In order to use the Serial Monitor, you need to open a folder and reload VS Code.", - "error.noProgramFoundDebug": "Cannot find a program to debug.", - "error.noPythonPath": "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again.", - "error.stderr": "\n[ERROR] {0} \n", - "error.unexpectedMessage": "Webview sent an unexpected message", - "info.deployDevice": "\n[INFO] Deploying code to the device...\n", - "info.deploySimulator": "\n[INFO] Deploying code to the simulator...\n", - "info.deploySuccess": "\n[INFO] Code successfully deployed\n", - "info.extensionActivated": "Congratulations, your extension Adafruit_Simulator is now active!", - "info.firstTimeWebview": "To reopen the simulator select the command \"Open Simulator\" from command palette.", - "info.installPythonDependencies": "Do you want us to try and install this extensions dependencies for you?", - "error.invalidFileExtensionDebug": "The file you tried to run isn\\'t a Python file.", - "info.newFile": "New to Python or the Circuit Playground Express? We are here to help!", - "info.noDeviceChosenToDeployTo": "\n[INFO] No device was selected to deploy to.\n", - "info.noDeviceChosenToSimulateTo": "\n[INFO] No device was selected to simulate.\n", - "info.noDeviceChosenForNewFile": "\n[INFO] No device was selected to open a template file for.\n", - "info.redirect": "You are being redirected.", - "info.runningCode": "Running user code", - "info.privacyStatement": "Privacy Statement", - "info.successfulInstall": "Successfully installed Python dependencies.", - "info.thirdPartyWebsite": "By clicking \"Agree and Proceed\" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit's privacy policy", - "info.welcomeOutputTab": "Welcome to the Device Simulator Express output tab!\n\n", - "label.webviewPanel": "Device Simulator Express", - "name": "Device Simulator Express", + "dialogResponses.agreeAndRun": "Agree and Run", + "dialogResponses.acceptPrivacy": "Got it", + "dialogResponses.cancel": "Cancel", + "dialogResponses.select": "Select", + "dialogResponses.dontShowAgain": "Don't Show Again", + "dialogResponses.exampleCode": "Example Code on GitHub", + "dialogResponses.help": "I need help", + "dialogResponses.installPython": "Install from python.org", + "dialogResponses.installNow": "Install Now", + "dialogResponses.dontInstall": "Don't Install", + "dialogResponses.tutorials": "Tutorials on Adafruit", + "dialogResponses.readInstall": "Read installation docs", + "error.debuggerServerInitFailed": "Warning : The Debugger Server cannot be opened. Please try to free the port {0} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.", + "error.debuggingSessionInProgress": "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n", + "error.noDevice": "No plugged in boards detected. Please double check if your board is connected and/or properly formatted", + "error.noFileToRun": "\n[ERROR] We can't find the .py file to run. Open up a new .py file, or browse through some examples\n", + "error.noFileToDeploy": "\n[ERROR] We can't find a Python file to deploy to your device.\n", + "error.noFolderCreated": "In order to use the Serial Monitor, you need to open a folder and reload VS Code.", + "error.noProgramFoundDebug": "Cannot find a program to debug.", + "error.noPythonPath": "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again.", + "error.stderr": "\n[ERROR] {0} \n", + "error.unexpectedMessage": "Webview sent an unexpected message", + "info.deployDevice": "\n[INFO] Deploying code to the device...\n", + "info.deploySimulator": "\n[INFO] Deploying code to the simulator...\n", + "info.deploySuccess": "\n[INFO] Code successfully deployed\n", + "info.extensionActivated": "Congratulations, your extension Adafruit_Simulator is now active!", + "info.firstTimeWebview": "To reopen the simulator select the command \"Open Simulator\" from command palette.", + "info.installPythonDependencies": "Do you want us to try and install this extensions dependencies for you?", + "error.invalidFileExtensionDebug": "The file you tried to run isn\\'t a Python file.", + "info.newFile": "New to Python or the Circuit Playground Express? We are here to help!", + "info.noDeviceChosenToDeployTo": "\n[INFO] No device was selected to deploy to.\n", + "info.noDeviceChosenToSimulateTo": "\n[INFO] No device was selected to simulate.\n", + "info.noDeviceChosenForNewFile": "\n[INFO] No device was selected to open a template file for.\n", + "info.redirect": "You are being redirected.", + "info.runningCode": "Running user code", + "info.privacyStatement": "Privacy Statement", + "info.successfulInstall": "Successfully installed Python dependencies.", + "info.thirdPartyWebsite": "By clicking \"Agree and Proceed\" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit's privacy policy", + "info.welcomeOutputTab": "Welcome to the Device Simulator Express output tab!\n\n", + "label.webviewPanel": "Device Simulator Express", + "name": "Device Simulator Express", - "warning.agreeAndRun": "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk." + "warning.agreeAndRun": "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk." } diff --git a/locales/en/package.i18n.json b/locales/en/package.i18n.json index 4f34f2536..c2a23bf24 100644 --- a/locales/en/package.i18n.json +++ b/locales/en/package.i18n.json @@ -1,17 +1,17 @@ { - "deviceSimulatorExpressExtension.commands.common.installDependencies": "Install Extension Dependencies", - "deviceSimulatorExpressExtension.commands.common.label": "Device Simulator Express", - "deviceSimulatorExpressExtension.commands.common.runSimulator": "Run Simulator", - "deviceSimulatorExpressExtension.commands.common.gettingStarted": "Getting Started", - "deviceSimulatorExpressExtension.commands.common.changeBaudRate": "Change Baud Rate", - "deviceSimulatorExpressExtension.commands.common.closeSerialMonitor": "Close Serial Monitor", - "deviceSimulatorExpressExtension.commands.common.openSerialMonitor": "Open Serial Monitor", - "deviceSimulatorExpressExtension.commands.common.selectSerialPort": "Select Serial Port", - "deviceSimulatorExpressExtension.commands.common.deployToDevice": "Deploy to Device", - "deviceSimulatorExpressExtension.commands.common.openSimulator": "Open Simulator", - "deviceSimulatorExpressExtension.commands.common.newFile": "New File", - "deviceSimulatorExpressExtension.configuration.title": "Device Simulator Express configuration", - "deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange": "When you change the Python interpreter, the Device Simulator Express will automatically configure itself for the required dependencies.", - "deviceSimulatorExpressExtension.configuration.properties.debuggerPort": "The port the Server will listen on for communication with the debugger.", - "deviceSimulatorExpressExtension.configuration.properties.dependencyChecker": "Whether or not to ask if we can download dependencies. If unchecked, the extension will default to never download dependencies, except when automatically creating a virtual environment in the extension files." -} \ No newline at end of file + "deviceSimulatorExpressExtension.commands.common.installDependencies": "Install Extension Dependencies", + "deviceSimulatorExpressExtension.commands.common.label": "Device Simulator Express", + "deviceSimulatorExpressExtension.commands.common.runSimulator": "Run Simulator", + "deviceSimulatorExpressExtension.commands.common.gettingStarted": "Getting Started", + "deviceSimulatorExpressExtension.commands.common.changeBaudRate": "Change Baud Rate", + "deviceSimulatorExpressExtension.commands.common.closeSerialMonitor": "Close Serial Monitor", + "deviceSimulatorExpressExtension.commands.common.openSerialMonitor": "Open Serial Monitor", + "deviceSimulatorExpressExtension.commands.common.selectSerialPort": "Select Serial Port", + "deviceSimulatorExpressExtension.commands.common.deployToDevice": "Deploy to Device", + "deviceSimulatorExpressExtension.commands.common.openSimulator": "Open Simulator", + "deviceSimulatorExpressExtension.commands.common.newFile": "New File", + "deviceSimulatorExpressExtension.configuration.title": "Device Simulator Express configuration", + "deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange": "When you change the Python interpreter, the Device Simulator Express will automatically configure itself for the required dependencies.", + "deviceSimulatorExpressExtension.configuration.properties.debuggerPort": "The port the Server will listen on for communication with the debugger.", + "deviceSimulatorExpressExtension.configuration.properties.dependencyChecker": "Whether or not to ask if we can download dependencies. If unchecked, the extension will default to never download dependencies, except when automatically creating a virtual environment in the extension files." +} diff --git a/misc/usbmapping.json b/misc/usbmapping.json index e3d9519a5..584bd236a 100644 --- a/misc/usbmapping.json +++ b/misc/usbmapping.json @@ -1,18 +1,15 @@ [ - { - "index_file": "https://adafruit.github.io/arduino-board-index/package_adafruit_index.json", - "boards": [ - { - "vid": "239a", - "pid": [ - "8019" - ], - "name": "Adafruit Circuit Playground Express", - "package": "adafruit", - "architecture": "samd", - "id": "cpx" - } - - ] - } -] \ No newline at end of file + { + "index_file": "https://adafruit.github.io/arduino-board-index/package_adafruit_index.json", + "boards": [ + { + "vid": "239a", + "pid": ["8019"], + "name": "Adafruit Circuit Playground Express", + "package": "adafruit", + "architecture": "samd", + "id": "cpx" + } + ] + } +] diff --git a/package.nls.json b/package.nls.json index e662c005a..56d7a34ed 100644 --- a/package.nls.json +++ b/package.nls.json @@ -1,17 +1,17 @@ { - "deviceSimulatorExpressExtension.commands.common.installDependencies": "Install Extension Dependencies", - "deviceSimulatorExpressExtension.commands.common.label": "Device Simulator Express", - "deviceSimulatorExpressExtension.commands.common.runSimulator": "Run Simulator", - "deviceSimulatorExpressExtension.commands.common.gettingStarted": "Getting Started", - "deviceSimulatorExpressExtension.commands.common.changeBaudRate": "Change Baud Rate", - "deviceSimulatorExpressExtension.commands.common.closeSerialMonitor": "Close Serial Monitor", - "deviceSimulatorExpressExtension.commands.common.openSerialMonitor": "Open Serial Monitor", - "deviceSimulatorExpressExtension.commands.common.selectSerialPort": "Select Serial Port", - "deviceSimulatorExpressExtension.commands.common.deployToDevice": "Deploy to Device", - "deviceSimulatorExpressExtension.commands.common.openSimulator": "Open Simulator", - "deviceSimulatorExpressExtension.commands.common.newFile": "New File", - "deviceSimulatorExpressExtension.configuration.title": "Device Simulator Express configuration", - "deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange": "When you change the Python interpreter, the Device Simulator Express will automatically configure itself for the required dependencies.", - "deviceSimulatorExpressExtension.configuration.properties.debuggerPort": "The port the Server will listen on for communication with the debugger.", - "deviceSimulatorExpressExtension.configuration.properties.dependencyChecker": "Whether or not to ask for dependency downloads. If unchecked, the extension will default to never download dependencies, except when automatically creating a virtual environment in the extension files." -} \ No newline at end of file + "deviceSimulatorExpressExtension.commands.common.installDependencies": "Install Extension Dependencies", + "deviceSimulatorExpressExtension.commands.common.label": "Device Simulator Express", + "deviceSimulatorExpressExtension.commands.common.runSimulator": "Run Simulator", + "deviceSimulatorExpressExtension.commands.common.gettingStarted": "Getting Started", + "deviceSimulatorExpressExtension.commands.common.changeBaudRate": "Change Baud Rate", + "deviceSimulatorExpressExtension.commands.common.closeSerialMonitor": "Close Serial Monitor", + "deviceSimulatorExpressExtension.commands.common.openSerialMonitor": "Open Serial Monitor", + "deviceSimulatorExpressExtension.commands.common.selectSerialPort": "Select Serial Port", + "deviceSimulatorExpressExtension.commands.common.deployToDevice": "Deploy to Device", + "deviceSimulatorExpressExtension.commands.common.openSimulator": "Open Simulator", + "deviceSimulatorExpressExtension.commands.common.newFile": "New File", + "deviceSimulatorExpressExtension.configuration.title": "Device Simulator Express configuration", + "deviceSimulatorExpressExtension.configuration.properties.configEnvOnChange": "When you change the Python interpreter, the Device Simulator Express will automatically configure itself for the required dependencies.", + "deviceSimulatorExpressExtension.configuration.properties.debuggerPort": "The port the Server will listen on for communication with the debugger.", + "deviceSimulatorExpressExtension.configuration.properties.dependencyChecker": "Whether or not to ask for dependency downloads. If unchecked, the extension will default to never download dependencies, except when automatically creating a virtual environment in the extension files." +} diff --git a/tslint.json b/tslint.json index 534279116..1a4aa8078 100644 --- a/tslint.json +++ b/tslint.json @@ -1,34 +1,34 @@ { - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": [ - "tslint:latest", - "tslint-react", - "tslint-config-prettier", - "tslint-react-hooks", - "tslint-microsoft-contrib/latest" - ], - "rules": { - "no-implicit-dependencies": [true, "dev"], - "no-string-throw": true, - "no-unused-expression": true, - "no-duplicate-variable": true, - "no-empty": false, - "no-relative-imports": false, - "max-func-body-length": false, - "curly": true, - "class-name": true, - "triple-equals": true, - "object-literal-sort-keys": true, - "react-hooks-nesting": "error", - "ordered-imports": true, - "import-name": false, - "member-access": false, - "no-console": false, - "jsx-boolean-value": false, - "no-unnecessary-semicolons": false, - "no-http-string": false, - "export-name": false, - "interface-name": false - }, - "defaultSeverity": "warning" + "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], + "extends": [ + "tslint:latest", + "tslint-react", + "tslint-config-prettier", + "tslint-react-hooks", + "tslint-microsoft-contrib/latest" + ], + "rules": { + "no-implicit-dependencies": [true, "dev"], + "no-string-throw": true, + "no-unused-expression": true, + "no-duplicate-variable": true, + "no-empty": false, + "no-relative-imports": false, + "max-func-body-length": false, + "curly": true, + "class-name": true, + "triple-equals": true, + "object-literal-sort-keys": true, + "react-hooks-nesting": "error", + "ordered-imports": true, + "import-name": false, + "member-access": false, + "no-console": false, + "jsx-boolean-value": false, + "no-unnecessary-semicolons": false, + "no-http-string": false, + "export-name": false, + "interface-name": false + }, + "defaultSeverity": "warning" } diff --git a/webpack.config.js b/webpack.config.js index 82aae8c6e..95533509a 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -2,85 +2,85 @@ const path = require("path"); const tsImportPlugin = require("ts-import-plugin"); module.exports = { - entry: { - simulator: "./src/view/index.tsx" - }, - output: { - path: path.resolve(__dirname, "out"), - filename: "[name].js" - }, - devServer: { - historyApiFallback: true - }, - devtool: "source-map", - resolve: { - extensions: [".js", ".ts", ".tsx", ".json"] - }, - module: { - rules: [ - { - test: /\.(ts|tsx)$/, - loader: "ts-loader", - options: { - getCustomTransformers: () => ({ - before: [ - tsImportPlugin({ - libraryName: "antd", - libraryDirectory: "es", - style: true - }) - ] - }) - } - }, - { - test: /\.less$/, - use: [ - { - loader: "style-loader" - }, - { - loader: "css-loader", - options: { - importLoaders: 1, - sourceMap: true - } - }, - { - loader: "less-loader", - options: { - javascriptEnabled: true, - sourceMap: true, - modifyVars: { - "@body-background": "var(--background-color)" - } - } - } - ] - }, - { - test: /\.css$/, - use: [ - { - loader: "style-loader" - }, - { - loader: "css-loader" - } - ] - }, - { - test: /\.svg$/, - loader: "svg-inline" - } - ] - } - // When importing a module whose path matches one of the following, just - // assume a corresponding global variable exists and use that instead. - // This is important because it allows us to avoid bundling all of our - // dependencies, which allows browsers to cache those libraries between builds. - // externals: { - // react: "React", - // "react-dom": "ReactDOM" - // } + entry: { + simulator: "./src/view/index.tsx", + }, + output: { + path: path.resolve(__dirname, "out"), + filename: "[name].js", + }, + devServer: { + historyApiFallback: true, + }, + devtool: "source-map", + resolve: { + extensions: [".js", ".ts", ".tsx", ".json"], + }, + module: { + rules: [ + { + test: /\.(ts|tsx)$/, + loader: "ts-loader", + options: { + getCustomTransformers: () => ({ + before: [ + tsImportPlugin({ + libraryName: "antd", + libraryDirectory: "es", + style: true, + }), + ], + }), + }, + }, + { + test: /\.less$/, + use: [ + { + loader: "style-loader", + }, + { + loader: "css-loader", + options: { + importLoaders: 1, + sourceMap: true, + }, + }, + { + loader: "less-loader", + options: { + javascriptEnabled: true, + sourceMap: true, + modifyVars: { + "@body-background": "var(--background-color)", + }, + }, + }, + ], + }, + { + test: /\.css$/, + use: [ + { + loader: "style-loader", + }, + { + loader: "css-loader", + }, + ], + }, + { + test: /\.svg$/, + loader: "svg-inline", + }, + ], + }, + // When importing a module whose path matches one of the following, just + // assume a corresponding global variable exists and use that instead. + // This is important because it allows us to avoid bundling all of our + // dependencies, which allows browsers to cache those libraries between builds. + // externals: { + // react: "React", + // "react-dom": "ReactDOM" + // } }; From 173d094fdff5d178762e02e42e34cb5007274732 Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Sat, 16 Dec 2023 04:34:08 +0200 Subject: [PATCH 38/64] squash! --- CHANGELOG.md | 2 +- CONTRIBUTING.md | 2 +- LICENSE | 46 +- PRIVACY.md | 2 +- README.md | 698 ++++++++++++------------ Source/dev-requirements.txt | 2 +- Source/requirements.txt | 2 +- assets/dark-theme/open-simulator.svg | 8 +- assets/dark-theme/run-on-simulator.svg | 8 +- assets/dark-theme/save-to-board.svg | 8 +- assets/light-theme/open-simulator.svg | 8 +- assets/light-theme/run-on-simulator.svg | 8 +- assets/light-theme/save-to-board.svg | 8 +- 13 files changed, 413 insertions(+), 389 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 230138ddb..67e104650 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,4 +6,4 @@ Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how ## [Unreleased] -- Initial release \ No newline at end of file +- Initial release diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c282e9a1a..ebf23acad 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,4 +11,4 @@ instructions provided by the bot. You will only need to do this once across all This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) -or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. \ No newline at end of file +or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. diff --git a/LICENSE b/LICENSE index 1a7e30ed5..1c80a7489 100644 --- a/LICENSE +++ b/LICENSE @@ -1,23 +1,23 @@ - Project Device Simulator Express - - Copyright (c) Microsoft Corporation. All rights reserved. - - MIT License - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. + Project Device Simulator Express + + Copyright (c) Microsoft Corporation. All rights reserved. + + MIT License + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. diff --git a/PRIVACY.md b/PRIVACY.md index c97adaf9a..aca263491 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -19,4 +19,4 @@ To disable telemetry, follow these steps: 2) Select **Preferences** 3) Select **Settings** 4) Search for `telemetry` -5) Uncheck the **Telemetry: Enable Telemetry** setting \ No newline at end of file +5) Uncheck the **Telemetry: Enable Telemetry** setting diff --git a/README.md b/README.md index fd019ee59..b984c74b4 100644 --- a/README.md +++ b/README.md @@ -1,349 +1,349 @@ -# ⚠️ NOTE: this extension is no longer maintained! ⚠️ - -Please see the [deprecation notice](https://github.com/microsoft/vscode-python-devicesimulator/wiki/Deprecation-of-the-extension) for details. - -# Device Simulator Express, a Microsoft Garage project - -Make without limit! Device Simulator Express, a Microsoft Garage project, allows you to code microcontrollers without the hardware on hand! You can program your Adafruit Circuit Playground Express (CPX), your BBC micro:bit or the Adafruit CLUE! Test and debug your code on the device simulator and see the same -result when you plug in your actual microcontroller. Curious about the output of the device, the serial -monitor allows you to observe the device output. - -## Table of Contents - - [Devices we support](#devices-we-support) - - [Prerequisites](#prerequisites) - - [Adafruit Circuit Playground Express (CPX) Simulator](#adafruit-circuit-playground-express-cpx-simulator) - - [Features](#features) - - [Useful Links](#useful-links) - - [Keyboard Shortcuts](#keyboard-shortcuts) - - [BBC micro:bit Simulator](#bbc-microbit-simulator) - - [Features](#features-1) - - [Useful Links](#useful-links-1) - - [Keyboard Shortcuts](#keyboard-shortcuts-1) - - [Adafruit CLUE Simulator](#adafruit-clue-simulator) - - [Features](#features-2) - - [Useful Links](#useful-links-2) - - [Keyboard Shortcuts](#keyboard-shortcuts-2) - - [How to use](#how-to-use) - - [Commands](#commands) - - [Contribute](#contribute) - - [Provide feedback](#provide-feedback) - - [Privacy and Telemetry Notice](#privacy-and-telemetry-notice) - - [Third Party Notice](#third-party-notice) - - [Troubleshooting Tips](#troubleshooting-tips) - - [License](#license) - - [Notes](#notes) - -## Devices we support - -- [**Adafruit Circuit Playground Express (CPX)**](#adafruit-circuit-playground-express-cpx-simulator) - - [CircuitPlayground Express](#adafruit-circuit-playground-express-cpx-simulator) - -- [**BBC micro:bit**](#bbc-microbit-simulator) - - [bbc micro:bit](#bbc-microbit-simulator) - -- [**Adafruit CLUE**](#adafruit-clue-simulator) - - [Adafruit CLUE](#adafruit-clue-simulator) - -## Build Status - -| Branch | Build Status | -| :------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| dev | [![Build Status](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_apis/build/status/Adafruit/Pacifica-CI?branchName=dev)](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_build/latest?definitionId=304&branchName=dev) | -| staging | [![Build Status](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_apis/build/status/Adafruit/Pacifica-CI?branchName=staging)](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_build/latest?definitionId=304&branchName=staging) | -| master | [![Build Status](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_apis/build/status/Adafruit/Pacifica-CI?branchName=master)](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_build/latest?definitionId=304&branchName=master) | - -## Prerequisites - -The following dependencies are required to install before launching Device Simulator Express. -You will be prompted to install the Python dependencies during the first use. - -- _**[Visual Studio Code](https://code.visualstudio.com/)**_ -- _**[Python 3.7+](https://www.python.org/downloads/)**_: Make sure you've added Python and pip to your PATH in your environment variables. (1) -- _**[Python VS Code extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python)**_: This will be installed automatically from the marketplace when you install Device Simulator Express. - -## Adafruit Circuit Playground Express (CPX) Simulator - -### Features - -- IntelliSense and syntax highlighting for CircuitPython code for the CPX library -- Template file generation -- Integrated Python Debugging for the Simulator -- Serial monitor (available on Windows and Mac only) -- Output panel for the simulator -- Deploy CircuitPython code to the physical device. -- Simulation of the CPX device, including: - - Green LED - - Red LED - - Push Buttons A and B - - Slider Switch - - Speaker: Play .wav file - - 10 NeoPixels - - Light sensor - - Motion sensors - - Acceleration detection - - Device shake detection - - Temperature sensor - - 7 Capacitive Touch sensors - -The simulator supports most of the sensors on CPX except **IR transmitter & Receiver**, **Sound Sensor (microphone)**, **Speaker (Play Tone)** and the **"tap" on Motion Sensor**. -The code related to these sensors can still run on the actual CPX board and be deployed using Device Simulator Express. -As we only support CPX library now, other libraries (i.e. simpleio) can’t run on the simulator. But they will work on the actual device! - -### Useful Links - -- Tutorials and Example Code for Adafruit CPX: - - [Adafruit CPX library tutorial](https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library) - - [Adafruit CPX Examples on GitHub](https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples) - - [Adafruit CPX Guided Tour (Intro for the Hardware)](https://learn.adafruit.com/adafruit-circuit-playground-express/guided-tour) -- Format Adafruit CPX device: - - [Tutorial for formatting Adafruit CPX for CircuitPython](https://learn.adafruit.com/welcome-to-circuitpython/installing-circuitpython) - - [Download Firmware .uf2 file](https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart) - - [Download the latest version of the Adafruit CPX library](https://learn.adafruit.com/welcome-to-circuitpython/circuitpython-libraries) - -### Keyboard Shortcuts - -In Device Simulator Express, you can use keyboard to interact with the device: - -- Push Button: A for Button A, B for Button B, C for Buttons A & B -- Capacitive Touch Sensor: Shift + 1 ~ 7 for GPIO pins A1 - A7 -- Slider Switch: Shift + S -- Refresh the simulator: Shift + R -- Run the simulator: Shift + F - -## BBC micro:bit Simulator - -### Features - -- IntelliSense and syntax highlighting for MicroPython code for the micro:bit library -- Template file generation -- Integrated Python Debugging for the Simulator -- Deploy MicroPython code to the physical device -- Serial monitor (available on Windows and Mac only) -- Simulation of the micro:bit device, including: - - 25 LEDs - - Push Buttons A and B - - Light sensor - - Motion sensors - - Acceleration detection including gesture detection - - Temperature sensor - -### Useful Links - -- Tutorials and Example Code for BBC micro:bit: - - [MicroPython documentation](https://microbit-micropython.readthedocs.io/en/latest/) - - [BBC micro:bit examples on the official micro:bit website](https://microbit.org/projects/make-it-code-it/?filters=python) - -### Keyboard Shortcuts - -- Push Button: A for Button A, B for Button B, C for Buttons A & B -- Refresh the simulator: Shift + R -- Run the simulator: Shift + F - -## Adafruit CLUE Simulator - -### Features - -- IntelliSense and syntax highlighting for CircuitPython code for the following drivers and libraries: - - `adafruit_clue` - - `adafruit_slideshow` - - `adafruit_display_shapes` - - `adafruit_display_text` - - `adafruit_bitmap_font` - - `adafruit_fancyled` - - `neopixel` - - `displayio` -- Template file generation -- Integrated Python Debugging for the Simulator -- Deploy CircuitPython code to the physical device -- Serial monitor (available on Windows and Mac only) -- Simulation of the CLUE device, including: - - 240x240 color screen - - Push Buttons A and B - - Sensors for: - - Temperature - - Light - - Color - - Acceleration - - Humidity - - Pressure - - Proximity - - Gestures - - Gyro - - Magnetic Field - -### Useful Links - -- Tutorials and Example Code for Adafruit CLUE: - - [Adafruit CLUE Overview](https://learn.adafruit.com/adafruit-clue) - - [Adafruit CLUE Examples on GitHub](https://github.com/adafruit/Adafruit_CircuitPython_CLUE/tree/master/examples) - -### Keyboard Shortcuts - -- Push Button: A for Button A, B for Button B, C for Buttons A & B -- Refresh the simulator: Shift + R -- Run the simulator: Shift + F - -## How to use - -To use Device Simulator Express, install the extension from the marketplace and reload VS Code. - -To access many of the commands, you need to open the command palette. This can be done with Ctrl + Shift + P for Windows and Linux / Cmd + Shift + P for Mac. It can also be accessed from the toolbar by going to `View -> Command Palette`. - -### I. Take a look at the "Device Simulator Express: Getting Started" Command. - -1. Type in `"Device Simulator Express: Getting Started"` in the command palette (Ctrl + Shift + P / Cmd + Shift + P to open the command palette). -2. Choose the the device you want to play with from the dropdown. -3. Read, copy and learn some of the things you can do with the simulator! - -Getting Started - -### II. Start with the "Device Simulator Express: New File" Command. - -1. Type in `"Device Simulator Express: New File"` in the command palette (Ctrl + Shift + P / Cmd + Shift + P to open the command palette). -2. Select the device you want to use. -3. Name and save your file somewhere, and we’re good to go! -4. Start with some examples: you can find examples files and tutorials inside the comments at the top of the file. - -"New File" animation - -### III. Start from an existing Python file. - -1. Open the folder or your .py file in Visual Studio Code. -2. Run `Device Simulator Express: Open Simulator` from the command palette or icon in the editor toolbar. -3. Select the device you want to use. - -### IV. Run your code on the simulator. - -1. Run `Run Simulator` from the command palette or use the `Play` button on the simulator webview. - -How to run the simulator animation - -### V. Deploy your code to the physical device - -Before deploying the Python code to your CPX device, you need to format your device by following these tutorials: - -- _For the CPX_: - - - Download the firmware with the .uf2 file (link: https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart). - - Download the lastest versions of the cpx libraries (link: https://learn.adafruit.com/welcome-to-circuitpython/circuitpython-libraries). - -- _For the micro:bit_: - - - Download the firmware with the .hex file (link: https://microbit.org/get-started/user-guide/firmware/). - -- _For the CLUE_: - - Download the latest versions of the cpx libraries and follow the instructions here (link:https://learn.adafruit.com/adafruit-clue/circuitpython). - -1. Plug in your device (make sure it’s formatted properly already). -2. Run the command `"Device Simulator Express: Deploy to Device"`. - -Deploy to Device - -### VI. Use the Serial Monitor for your device (available on Windows and Mac only) - -1. Plug in your device (make sure it’s formatted properly already). -2. Run the command `"Device Simulator Express: Open Serial Monitor"`. -3. Select your baud rate for the serial port. -4. The `print()` statements in your code will show in the output console. - -### VII. Debug your project on the simulator - -1. Add breakpoints in your code -2. Press F5 to enter the debugging mode, and you can start debugging line by line! - -### Commands - -Device Simulator Express provides several commands in the Command Palette (F1 or Ctrl + Shift + P / Cmd + Shift + P for Mac OS) for working with \*.py files: - -- `Device Simulator Express: Getting Started`: Opens a page in VS Code that helps users get started with the extension. Here, users can browse through code that they can use to play with the simulators. -- `Device Simulator Express: Run Simulator`: Runs Python code on the simulator. -- `Device Simulator Express: New File`: Opens an unsaved .py file with template code, also opens the simulator for the selected device. -- `Device Simulator Express: Open Simulator`: Opens the simulator in the simulator window for the selected device -- `Device Simulator Express: Deploy to Device`: Copies the current file to the selected device. -- `Device Simulator Express: Open Serial Monitor`: Opens the serial monitor in the integrated output window. -- `Device Simulator Express: Close Serial Monitor`: Stops the serial monitor and releases the serial port. -- `Device Simulator Express: Change Baud Rate`: Changes the baud rate of the selected serial port. For Adafruit CPX, the default baud rate is 115200. -- `Device Simulator Express: Select Serial Port`: Changes the current serial port. - -## Contribute - -[See here for steps to run the extension locally.](https://github.com/microsoft/vscode-python-devicesimulator/blob/dev/docs/developers-setup.md) - -## Provide feedback - -To add a review for our extension, please do so on the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-python.devicesimulatorexpress) - -To report issues, provide feedback or requests, please use this link: [Provide Feedback](https://github.com/microsoft/vscode-python-devicesimulator/issues). -We would love to hear from you about your experience to keep improving our project. - -## Privacy and Telemetry Notice - -### Data Collection - -The software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft's privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices. - -### Disable Telemetry - -The Microsoft Device Simulator Express Extension for Visual Studio Code collects usage -data and sends it to Microsoft to help improve our products and -services. Read our -[privacy statement](https://privacy.microsoft.com/privacystatement) to -learn more. This extension respects the `telemetry.enableTelemetry` -setting which you can learn more about at -https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting. - -To disable telemetry, follow these steps: - -1. Open **File** (Open **Code** on macOS) -2. Select **Preferences** -3. Select **Settings** -4. Search for `telemetry` -5. Uncheck the **Telemetry: Enable Telemetry** setting - -## Third Party Notice - -A `ThirdPartyNotices.txt` file is provided in the extension's source code listing the appropriate third-party notices. - -## Troubleshooting Tips - -- The first time you install the extension, you'll need to execute the `run` command at least once in order to access auto-completion. -- While running a code file, if you get an error saying it can't find the file, make sure you've clicked on a valid Python code file before running it. -- To open the output panel again after closing it go to VS Code menu: `View -> Output`. -- If you try to deploy to the CPX while it's plugged in but you still get an error saying it cannot find the board, make sure your device is formatted correctly and that its name matches `CIRCUITPY`. -- If you can't get the Simulator communication working while debugging, try to open your `Settings` and check the port used under `"Device Simulator Express: Debugger Server Port"`. You can either change it (usually ports above 5000 should work) or try to free it, then start debugging again. -- When you are using the serial monitor, if you get some unusual error messages, unplug the device and reload the VS Code windows. -- If you're using Ubuntu and having some problems with setting up the environment, try reviewing [this article's](https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-local-programming-environment-on-ubuntu-16-04) "Step 1" section on how to set up Python 3 on Ubuntu 16.04. Then, ensure that you've run `sudo apt-get install -y python3-venv` to allow for virtual environment creation. - -## License - - Device Simulator Express, a Microsoft Garage project - - Copyright (c) Microsoft Corporation. All rights reserved. - - MIT License - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - -## Notes - -1. Make sure that when you type _python_ in a terminal, the command is recognized and you have the correct version. The easiest way to do it is to select the "Add to PATH" option directly when you install Python. Otherwise you can search how to insert it manually. -2. You can choose to see the prompt or not by changing the extension configurations. +# ⚠️ NOTE: this extension is no longer maintained! ⚠️ + +Please see the [deprecation notice](https://github.com/microsoft/vscode-python-devicesimulator/wiki/Deprecation-of-the-extension) for details. + +# Device Simulator Express, a Microsoft Garage project + +Make without limit! Device Simulator Express, a Microsoft Garage project, allows you to code microcontrollers without the hardware on hand! You can program your Adafruit Circuit Playground Express (CPX), your BBC micro:bit or the Adafruit CLUE! Test and debug your code on the device simulator and see the same +result when you plug in your actual microcontroller. Curious about the output of the device, the serial +monitor allows you to observe the device output. + +## Table of Contents + - [Devices we support](#devices-we-support) + - [Prerequisites](#prerequisites) + - [Adafruit Circuit Playground Express (CPX) Simulator](#adafruit-circuit-playground-express-cpx-simulator) + - [Features](#features) + - [Useful Links](#useful-links) + - [Keyboard Shortcuts](#keyboard-shortcuts) + - [BBC micro:bit Simulator](#bbc-microbit-simulator) + - [Features](#features-1) + - [Useful Links](#useful-links-1) + - [Keyboard Shortcuts](#keyboard-shortcuts-1) + - [Adafruit CLUE Simulator](#adafruit-clue-simulator) + - [Features](#features-2) + - [Useful Links](#useful-links-2) + - [Keyboard Shortcuts](#keyboard-shortcuts-2) + - [How to use](#how-to-use) + - [Commands](#commands) + - [Contribute](#contribute) + - [Provide feedback](#provide-feedback) + - [Privacy and Telemetry Notice](#privacy-and-telemetry-notice) + - [Third Party Notice](#third-party-notice) + - [Troubleshooting Tips](#troubleshooting-tips) + - [License](#license) + - [Notes](#notes) + +## Devices we support + +- [**Adafruit Circuit Playground Express (CPX)**](#adafruit-circuit-playground-express-cpx-simulator) + + [CircuitPlayground Express](#adafruit-circuit-playground-express-cpx-simulator) + +- [**BBC micro:bit**](#bbc-microbit-simulator) + + [bbc micro:bit](#bbc-microbit-simulator) + +- [**Adafruit CLUE**](#adafruit-clue-simulator) + + [Adafruit CLUE](#adafruit-clue-simulator) + +## Build Status + +| Branch | Build Status | +| :------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| dev | [![Build Status](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_apis/build/status/Adafruit/Pacifica-CI?branchName=dev)](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_build/latest?definitionId=304&branchName=dev) | +| staging | [![Build Status](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_apis/build/status/Adafruit/Pacifica-CI?branchName=staging)](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_build/latest?definitionId=304&branchName=staging) | +| master | [![Build Status](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_apis/build/status/Adafruit/Pacifica-CI?branchName=master)](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_build/latest?definitionId=304&branchName=master) | + +## Prerequisites + +The following dependencies are required to install before launching Device Simulator Express. +You will be prompted to install the Python dependencies during the first use. + +- _**[Visual Studio Code](https://code.visualstudio.com/)**_ +- _**[Python 3.7+](https://www.python.org/downloads/)**_: Make sure you've added Python and pip to your PATH in your environment variables. (1) +- _**[Python VS Code extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python)**_: This will be installed automatically from the marketplace when you install Device Simulator Express. + +## Adafruit Circuit Playground Express (CPX) Simulator + +### Features + +- IntelliSense and syntax highlighting for CircuitPython code for the CPX library +- Template file generation +- Integrated Python Debugging for the Simulator +- Serial monitor (available on Windows and Mac only) +- Output panel for the simulator +- Deploy CircuitPython code to the physical device. +- Simulation of the CPX device, including: + - Green LED + - Red LED + - Push Buttons A and B + - Slider Switch + - Speaker: Play .wav file + - 10 NeoPixels + - Light sensor + - Motion sensors + - Acceleration detection + - Device shake detection + - Temperature sensor + - 7 Capacitive Touch sensors + +The simulator supports most of the sensors on CPX except **IR transmitter & Receiver**, **Sound Sensor (microphone)**, **Speaker (Play Tone)** and the **"tap" on Motion Sensor**. +The code related to these sensors can still run on the actual CPX board and be deployed using Device Simulator Express. +As we only support CPX library now, other libraries (i.e. simpleio) can’t run on the simulator. But they will work on the actual device! + +### Useful Links + +- Tutorials and Example Code for Adafruit CPX: + - [Adafruit CPX library tutorial](https://learn.adafruit.com/circuitpython-made-easy-on-circuit-playground-express/circuit-playground-express-library) + - [Adafruit CPX Examples on GitHub](https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground/tree/master/examples) + - [Adafruit CPX Guided Tour (Intro for the Hardware)](https://learn.adafruit.com/adafruit-circuit-playground-express/guided-tour) +- Format Adafruit CPX device: + - [Tutorial for formatting Adafruit CPX for CircuitPython](https://learn.adafruit.com/welcome-to-circuitpython/installing-circuitpython) + - [Download Firmware .uf2 file](https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart) + - [Download the latest version of the Adafruit CPX library](https://learn.adafruit.com/welcome-to-circuitpython/circuitpython-libraries) + +### Keyboard Shortcuts + +In Device Simulator Express, you can use keyboard to interact with the device: + +- Push Button: A for Button A, B for Button B, C for Buttons A & B +- Capacitive Touch Sensor: Shift + 1 ~ 7 for GPIO pins A1 - A7 +- Slider Switch: Shift + S +- Refresh the simulator: Shift + R +- Run the simulator: Shift + F + +## BBC micro:bit Simulator + +### Features + +- IntelliSense and syntax highlighting for MicroPython code for the micro:bit library +- Template file generation +- Integrated Python Debugging for the Simulator +- Deploy MicroPython code to the physical device +- Serial monitor (available on Windows and Mac only) +- Simulation of the micro:bit device, including: + - 25 LEDs + - Push Buttons A and B + - Light sensor + - Motion sensors + - Acceleration detection including gesture detection + - Temperature sensor + +### Useful Links + +- Tutorials and Example Code for BBC micro:bit: + - [MicroPython documentation](https://microbit-micropython.readthedocs.io/en/latest/) + - [BBC micro:bit examples on the official micro:bit website](https://microbit.org/projects/make-it-code-it/?filters=python) + +### Keyboard Shortcuts + +- Push Button: A for Button A, B for Button B, C for Buttons A & B +- Refresh the simulator: Shift + R +- Run the simulator: Shift + F + +## Adafruit CLUE Simulator + +### Features + +- IntelliSense and syntax highlighting for CircuitPython code for the following drivers and libraries: + - `adafruit_clue` + - `adafruit_slideshow` + - `adafruit_display_shapes` + - `adafruit_display_text` + - `adafruit_bitmap_font` + - `adafruit_fancyled` + - `neopixel` + - `displayio` +- Template file generation +- Integrated Python Debugging for the Simulator +- Deploy CircuitPython code to the physical device +- Serial monitor (available on Windows and Mac only) +- Simulation of the CLUE device, including: + - 240x240 color screen + - Push Buttons A and B + - Sensors for: + - Temperature + - Light + - Color + - Acceleration + - Humidity + - Pressure + - Proximity + - Gestures + - Gyro + - Magnetic Field + +### Useful Links + +- Tutorials and Example Code for Adafruit CLUE: + - [Adafruit CLUE Overview](https://learn.adafruit.com/adafruit-clue) + - [Adafruit CLUE Examples on GitHub](https://github.com/adafruit/Adafruit_CircuitPython_CLUE/tree/master/examples) + +### Keyboard Shortcuts + +- Push Button: A for Button A, B for Button B, C for Buttons A & B +- Refresh the simulator: Shift + R +- Run the simulator: Shift + F + +## How to use + +To use Device Simulator Express, install the extension from the marketplace and reload VS Code. + +To access many of the commands, you need to open the command palette. This can be done with Ctrl + Shift + P for Windows and Linux / Cmd + Shift + P for Mac. It can also be accessed from the toolbar by going to `View -> Command Palette`. + +### I. Take a look at the "Device Simulator Express: Getting Started" Command. + +1. Type in `"Device Simulator Express: Getting Started"` in the command palette (Ctrl + Shift + P / Cmd + Shift + P to open the command palette). +2. Choose the the device you want to play with from the dropdown. +3. Read, copy and learn some of the things you can do with the simulator! + +Getting Started + +### II. Start with the "Device Simulator Express: New File" Command. + +1. Type in `"Device Simulator Express: New File"` in the command palette (Ctrl + Shift + P / Cmd + Shift + P to open the command palette). +2. Select the device you want to use. +3. Name and save your file somewhere, and we’re good to go! +4. Start with some examples: you can find examples files and tutorials inside the comments at the top of the file. + +"New File" animation + +### III. Start from an existing Python file. + +1. Open the folder or your .py file in Visual Studio Code. +2. Run `Device Simulator Express: Open Simulator` from the command palette or icon in the editor toolbar. +3. Select the device you want to use. + +### IV. Run your code on the simulator. + +1. Run `Run Simulator` from the command palette or use the `Play` button on the simulator webview. + +How to run the simulator animation + +### V. Deploy your code to the physical device + +Before deploying the Python code to your CPX device, you need to format your device by following these tutorials: + +- _For the CPX_: + + - Download the firmware with the .uf2 file (link: https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart). + - Download the lastest versions of the cpx libraries (link: https://learn.adafruit.com/welcome-to-circuitpython/circuitpython-libraries). + +- _For the micro:bit_: + + - Download the firmware with the .hex file (link: https://microbit.org/get-started/user-guide/firmware/). + +- _For the CLUE_: + - Download the latest versions of the cpx libraries and follow the instructions here (link:https://learn.adafruit.com/adafruit-clue/circuitpython). + +1. Plug in your device (make sure it’s formatted properly already). +2. Run the command `"Device Simulator Express: Deploy to Device"`. + +Deploy to Device + +### VI. Use the Serial Monitor for your device (available on Windows and Mac only) + +1. Plug in your device (make sure it’s formatted properly already). +2. Run the command `"Device Simulator Express: Open Serial Monitor"`. +3. Select your baud rate for the serial port. +4. The `print()` statements in your code will show in the output console. + +### VII. Debug your project on the simulator + +1. Add breakpoints in your code +2. Press F5 to enter the debugging mode, and you can start debugging line by line! + +### Commands + +Device Simulator Express provides several commands in the Command Palette (F1 or Ctrl + Shift + P / Cmd + Shift + P for Mac OS) for working with \*.py files: + +- `Device Simulator Express: Getting Started`: Opens a page in VS Code that helps users get started with the extension. Here, users can browse through code that they can use to play with the simulators. +- `Device Simulator Express: Run Simulator`: Runs Python code on the simulator. +- `Device Simulator Express: New File`: Opens an unsaved .py file with template code, also opens the simulator for the selected device. +- `Device Simulator Express: Open Simulator`: Opens the simulator in the simulator window for the selected device +- `Device Simulator Express: Deploy to Device`: Copies the current file to the selected device. +- `Device Simulator Express: Open Serial Monitor`: Opens the serial monitor in the integrated output window. +- `Device Simulator Express: Close Serial Monitor`: Stops the serial monitor and releases the serial port. +- `Device Simulator Express: Change Baud Rate`: Changes the baud rate of the selected serial port. For Adafruit CPX, the default baud rate is 115200. +- `Device Simulator Express: Select Serial Port`: Changes the current serial port. + +## Contribute + +[See here for steps to run the extension locally.](https://github.com/microsoft/vscode-python-devicesimulator/blob/dev/docs/developers-setup.md) + +## Provide feedback + +To add a review for our extension, please do so on the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-python.devicesimulatorexpress) + +To report issues, provide feedback or requests, please use this link: [Provide Feedback](https://github.com/microsoft/vscode-python-devicesimulator/issues). +We would love to hear from you about your experience to keep improving our project. + +## Privacy and Telemetry Notice + +### Data Collection + +The software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft's privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices. + +### Disable Telemetry + +The Microsoft Device Simulator Express Extension for Visual Studio Code collects usage +data and sends it to Microsoft to help improve our products and +services. Read our +[privacy statement](https://privacy.microsoft.com/privacystatement) to +learn more. This extension respects the `telemetry.enableTelemetry` +setting which you can learn more about at +https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting. + +To disable telemetry, follow these steps: + +1. Open **File** (Open **Code** on macOS) +2. Select **Preferences** +3. Select **Settings** +4. Search for `telemetry` +5. Uncheck the **Telemetry: Enable Telemetry** setting + +## Third Party Notice + +A `ThirdPartyNotices.txt` file is provided in the extension's source code listing the appropriate third-party notices. + +## Troubleshooting Tips + +- The first time you install the extension, you'll need to execute the `run` command at least once in order to access auto-completion. +- While running a code file, if you get an error saying it can't find the file, make sure you've clicked on a valid Python code file before running it. +- To open the output panel again after closing it go to VS Code menu: `View -> Output`. +- If you try to deploy to the CPX while it's plugged in but you still get an error saying it cannot find the board, make sure your device is formatted correctly and that its name matches `CIRCUITPY`. +- If you can't get the Simulator communication working while debugging, try to open your `Settings` and check the port used under `"Device Simulator Express: Debugger Server Port"`. You can either change it (usually ports above 5000 should work) or try to free it, then start debugging again. +- When you are using the serial monitor, if you get some unusual error messages, unplug the device and reload the VS Code windows. +- If you're using Ubuntu and having some problems with setting up the environment, try reviewing [this article's](https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-local-programming-environment-on-ubuntu-16-04) "Step 1" section on how to set up Python 3 on Ubuntu 16.04. Then, ensure that you've run `sudo apt-get install -y python3-venv` to allow for virtual environment creation. + +## License + + Device Simulator Express, a Microsoft Garage project + + Copyright (c) Microsoft Corporation. All rights reserved. + + MIT License + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +## Notes + +1. Make sure that when you type _python_ in a terminal, the command is recognized and you have the correct version. The easiest way to do it is to select the "Add to PATH" option directly when you install Python. Otherwise you can search how to insert it manually. +2. You can choose to see the prompt or not by changing the extension configurations. diff --git a/Source/dev-requirements.txt b/Source/dev-requirements.txt index 26f334b51..6b117ff69 100644 --- a/Source/dev-requirements.txt +++ b/Source/dev-requirements.txt @@ -1,3 +1,3 @@ -r ./requirements.txt black==19.10b0 -pytest==5.0.1 \ No newline at end of file +pytest==5.0.1 diff --git a/Source/requirements.txt b/Source/requirements.txt index c13eef60b..3a5fdb5a2 100644 --- a/Source/requirements.txt +++ b/Source/requirements.txt @@ -9,4 +9,4 @@ adafruit-circuitpython-fancyled==1.3.3 Pillow==8.1.1 adafruit-circuitpython-bitmap_font==1.1.0 adafruit-circuitpython-display-shapes==1.2.0 -adafruit-circuitpython-neopixel==5.0.0 \ No newline at end of file +adafruit-circuitpython-neopixel==5.0.0 diff --git a/assets/dark-theme/open-simulator.svg b/assets/dark-theme/open-simulator.svg index 7dc10846a..6bcdc492a 100644 --- a/assets/dark-theme/open-simulator.svg +++ b/assets/dark-theme/open-simulator.svg @@ -1,4 +1,8 @@ - - + + diff --git a/assets/dark-theme/run-on-simulator.svg b/assets/dark-theme/run-on-simulator.svg index 410f09dbd..0582773e9 100644 --- a/assets/dark-theme/run-on-simulator.svg +++ b/assets/dark-theme/run-on-simulator.svg @@ -1,4 +1,8 @@ - - + + diff --git a/assets/dark-theme/save-to-board.svg b/assets/dark-theme/save-to-board.svg index bba02a9e8..c8647fbd6 100644 --- a/assets/dark-theme/save-to-board.svg +++ b/assets/dark-theme/save-to-board.svg @@ -1,4 +1,8 @@ - - + + diff --git a/assets/light-theme/open-simulator.svg b/assets/light-theme/open-simulator.svg index 8e0745d02..ae17edbe8 100644 --- a/assets/light-theme/open-simulator.svg +++ b/assets/light-theme/open-simulator.svg @@ -1,4 +1,8 @@ - - + + diff --git a/assets/light-theme/run-on-simulator.svg b/assets/light-theme/run-on-simulator.svg index e04612cfa..a85fb4c52 100644 --- a/assets/light-theme/run-on-simulator.svg +++ b/assets/light-theme/run-on-simulator.svg @@ -1,4 +1,8 @@ - - + + diff --git a/assets/light-theme/save-to-board.svg b/assets/light-theme/save-to-board.svg index 307c0b1ea..0798693d0 100644 --- a/assets/light-theme/save-to-board.svg +++ b/assets/light-theme/save-to-board.svg @@ -1,4 +1,8 @@ - - + + From 8e920cd10f3f21679729f50962515ee18ed026af Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Sat, 16 Dec 2023 18:04:49 +0200 Subject: [PATCH 39/64] squash! --- .github/dependabot.yml | 13 +++++ .github/workflows/Dependabot.yml | 45 +++++++++++++++ .github/workflows/Node.yml | 94 ++++++++++++++++++++++++++++++++ 3 files changed, 152 insertions(+) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/Dependabot.yml create mode 100644 .github/workflows/Node.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..0bd583317 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,13 @@ +version: 2 + +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" + + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "daily" + versioning-strategy: increase diff --git a/.github/workflows/Dependabot.yml b/.github/workflows/Dependabot.yml new file mode 100644 index 000000000..819f8a170 --- /dev/null +++ b/.github/workflows/Dependabot.yml @@ -0,0 +1,45 @@ +name: Dependabot + +concurrency: + group: Dependabot-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + security-events: write + contents: write + pull-requests: write + +on: + workflow_dispatch: + pull_request: + +jobs: + Approve: + runs-on: ubuntu-latest + + if: ${{ github.actor == 'dependabot[bot]' }} + + steps: + - uses: dependabot/fetch-metadata@v1.6.0 + with: + github-token: "${{ secrets.GITHUB_TOKEN }}" + + - run: gh pr review --approve "$PR_URL" + env: + PR_URL: ${{github.event.pull_request.html_url}} + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} + + Merge: + runs-on: ubuntu-latest + + if: ${{ github.actor == 'dependabot[bot]' }} + + steps: + - uses: dependabot/fetch-metadata@v1.6.0 + with: + github-token: "${{ secrets.GITHUB_TOKEN }}" + + - run: gh pr merge --auto --merge "$PR_URL" + env: + PR_URL: ${{github.event.pull_request.html_url}} + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/.github/workflows/Node.yml b/.github/workflows/Node.yml new file mode 100644 index 000000000..35e34cf9c --- /dev/null +++ b/.github/workflows/Node.yml @@ -0,0 +1,94 @@ +name: Node + +concurrency: + group: Node-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + security-events: write + contents: write + pull-requests: write + +on: + workflow_dispatch: + push: + branches: [main] + pull_request: + branches: [main] + workflow_call: + +jobs: + Pre-Publish: + runs-on: ubuntu-latest + + env: + ADBLOCK: true + TELEMETRY_DISABLED: 1 + ASTRO_TELEMETRY_DISABLED: 1 + AUTOMATEDLAB_TELEMETRY_OPTOUT: 1 + AZURE_CORE_COLLECT_TELEMETRY: 0 + CHOOSENIM_NO_ANALYTICS: 1 + DIEZ_DO_NOT_TRACK: 1 + DO_NOT_TRACK: 1 + DOTNET_CLI_TELEMETRY_OPTOUT: 1 + DOTNET_INTERACTIVE_CLI_TELEMETRY_OPTOUT: 1 + ET_NO_TELEMETRY: 1 + GATSBY_TELEMETRY_DISABLED: 1 + GATSBY_TELEMETRY_OPT_OUT: 1 + GATSBY_TELEMETRY_OPTOUT: 1 + HASURA_GRAPHQL_ENABLE_TELEMETRY: false + HINT_TELEMETRY: off + HOMEBREW_NO_ANALYTICS: 1 + INFLUXD_REPORTING_DISABLED: true + ITERATIVE_DO_NOT_TRACK: 1 + NEXT_TELEMETRY_DEBUG: 1 + NEXT_TELEMETRY_DISABLED: 1 + NG_CLI_ANALYTICS: false + NUXT_TELEMETRY_DISABLED: 1 + PIN_DO_NOT_TRACK: 1 + POWERSHELL_TELEMETRY_OPTOUT: 1 + SAM_CLI_TELEMETRY: 0 + STNOUPGRADE: 1 + STRIPE_CLI_TELEMETRY_OPTOUT: 1 + + strategy: + matrix: + node-version: [18, 19, 20] + + steps: + - uses: actions/checkout@v4.1.1 + + - uses: pnpm/action-setup@v2.4.0 + with: + version: 8.6.12 + run_install: | + - recursive: true + args: [ + --link-workspace-packages=true, + --lockfile-only, + --prefer-frozen-lockfile=false, + --shamefully-hoist=false, + --shared-workspace-lockfile=true, + --strict-peer-dependencies=false, + --unsafe-perm=true + ] + + - uses: actions/setup-node@v4.0.0 + with: + node-version: ${{ matrix.node-version }} + cache: "pnpm" + cache-dependency-path: ./pnpm-lock.yaml + + - run: pnpm install + working-directory: . + + - run: pnpm run build + working-directory: . + + - uses: actions/upload-artifact@v4.0.0 + with: + name: .-Node-${{ matrix.node-version }}-Target + path: ./Target + + - run: pnpm run test + working-directory: . From ce5dcb27bd70b09f6aaa8654909f7388db3e431c Mon Sep 17 00:00:00 2001 From: Nikola Hristov Date: Mon, 18 Dec 2023 03:40:36 +0200 Subject: [PATCH 40/64] squash! --- CHANGELOG.md | 8 +- CODING_STANDARDS.md | 33 +- CONTRIBUTING.md | 24 +- PRIVACY.md | 34 +- README.md | 254 +++++--- SECURITY.md | 5 +- Source/constants.ts | 116 ++-- Source/cpxWorkspace.ts | 2 +- Source/debugger/debugAdapter.ts | 2 +- Source/debugger/debugAdapterFactory.ts | 6 +- Source/debuggerCommunicationServer.ts | 8 +- Source/deviceContext.ts | 20 +- Source/extension.ts | 226 +++---- Source/extension_utils/utils.ts | 28 +- Source/serialMonitor.ts | 38 +- Source/serialPortControl.ts | 28 +- Source/service/PopupService.ts | 2 +- Source/service/fileSelectionService.ts | 17 +- Source/service/setupService.ts | 144 ++--- Source/service/telemetryHandlerService.ts | 118 ++-- Source/service/webviewService.ts | 12 +- Source/simulatorDebugConfigurationProvider.ts | 4 +- Source/telemetry/getPackageInfo.ts | 4 +- Source/telemetry/telemetryAI.ts | 12 +- Source/usbDetector.ts | 10 +- Source/view/App.css | 22 +- Source/view/App.spec.tsx | 4 +- Source/view/App.tsx | 4 +- Source/view/components/Button.tsx | 3 +- Source/view/components/Dropdown.tsx | 3 +- Source/view/components/clue/Clue.spec.tsx | 4 +- Source/view/components/clue/ClueImage.tsx | 16 +- Source/view/components/clue/ClueSimulator.tsx | 14 +- Source/view/components/clue/Clue_svg.tsx | 44 +- .../components/cpx/Accessibility_utils.ts | 2 +- Source/view/components/cpx/Cpx.spec.tsx | 4 +- Source/view/components/cpx/CpxImage.tsx | 20 +- Source/view/components/cpx/CpxSimulator.tsx | 26 +- Source/view/components/cpx/Cpx_svg.tsx | 3 +- Source/view/components/cpx/Cpx_svg_style.tsx | 2 +- Source/view/components/cpx/Svg_utils.tsx | 6 +- .../components/microbit/Microbit.spec.tsx | 4 +- .../components/microbit/MicrobitImage.tsx | 18 +- .../components/microbit/MicrobitSimulator.tsx | 14 +- .../view/components/microbit/Microbit_svg.tsx | 243 +++---- .../toolbar/GenericSliderComponent.tsx | 2 +- Source/view/components/toolbar/Gesture.tsx | 5 +- .../view/components/toolbar/InputSlider.tsx | 2 +- .../view/components/toolbar/SensorButton.tsx | 5 +- .../components/toolbar/SensorModalUtils.tsx | 5 +- Source/view/components/toolbar/ToolBar.tsx | 18 +- .../view/components/toolbar/Toolbar.spec.tsx | 4 +- .../toolbar/clue/ClueModalContent.tsx | 30 +- .../toolbar/cpx/CpxModalContent.tsx | 22 +- .../toolbar/microbit/MicrobitModalContent.tsx | 20 +- Source/view/container/device/Device.spec.tsx | 4 +- Source/view/index.css | 10 +- Source/view/index.tsx | 2 +- Source/view/pages/gettingStarted.css | 60 +- Source/view/pages/gettingStarted.spec.tsx | 4 +- Source/view/styles/Button.css | 34 +- Source/view/styles/Dropdown.css | 28 +- Source/view/styles/InputSlider.css | 116 ++-- Source/view/styles/LightSensorBar.css | 24 +- Source/view/styles/MotionSensorBar.css | 18 +- Source/view/styles/SensorButton.css | 32 +- Source/view/styles/Simulator.css | 122 ++-- Source/view/styles/SimulatorSvg.css | 212 +++--- Source/view/styles/TemperatureSensorBar.css | 22 +- Source/view/styles/ToolBar.css | 232 +++---- Source/view/svgs/arrow_right_svg.tsx | 3 +- Source/view/svgs/close_svg.tsx | 3 +- Source/view/svgs/play_svg.tsx | 3 +- Source/view/svgs/refresh_svg.tsx | 3 +- Source/view/svgs/stop_svg.tsx | 3 +- Source/view/svgs/tag_input_svg.tsx | 3 +- Source/view/svgs/tag_output_svg.tsx | 3 +- Source/view/svgs/toolbar_svg.tsx | 135 ++-- Source/view/tsconfig.json | 34 +- Source/view/utils/MessageUtils.tsx | 2 +- docs/developers-setup.md | 119 ++-- docs/how-to-use.md | 148 +++-- docs/install.md | 61 +- docs/telemetry.md | 12 +- gulpfile.js | 16 +- package.json | 612 +++++++++--------- tsconfig.json | 22 +- 87 files changed, 1931 insertions(+), 1895 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67e104650..1c4b233df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,11 @@ # Change Log -All notable changes to the "embedded-python" extension will be documented in this file. +All notable changes to the "embedded-python" extension will be documented in +this file. -Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. +Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how +to structure this file. ## [Unreleased] -- Initial release +- Initial release diff --git a/CODING_STANDARDS.md b/CODING_STANDARDS.md index 629e68791..a19ef621b 100644 --- a/CODING_STANDARDS.md +++ b/CODING_STANDARDS.md @@ -2,24 +2,31 @@ ## Coding guidelines for TypeScript -- The following standards are inspired from [Coding guidelines for TypeScript](https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines) (which you should follow when something is not specified in this document, although any pre-existing practices in a file being edited trump either style guide). +- The following standards are inspired from + [Coding guidelines for TypeScript](https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines) + (which you should follow when something is not specified in this document, + although any pre-existing practices in a file being edited trump either + style guide). ### Names - Use `PascalCase` for type names. -- Use `I` as a prefix for interface names only when an interface is implemented by a class. +- Use `I` as a prefix for interface names only when an interface is + implemented by a class. - Use `PascalCase` for enum values. - Use `camelCase` for function names. - Use `camelCase` for property names and local variables. -- Do not use `_` as a prefix for private properties (unless used as backing properties). +- Do not use `_` as a prefix for private properties (unless used as backing + properties). - Use whole words in names when possible. ### Types -- Do not export types/functions unless you need to share it across multiple components. +- Do not export types/functions unless you need to share it across multiple + components. - Do not introduce new types/values to the global namespace. -- Shared types should be defined in `types.ts`. - Within a file, type definitions should come first. +- Shared types should be defined in `types.ts`. Within a file, type + definitions should come first. ### null and undefined @@ -37,16 +44,21 @@ Use single quotes for strings. ### Imports - Use ES6 module imports. -- Do not use bare `import *`; all imports should either explicitly pull in an object or import an entire module, otherwise you're implicitly polluting the global namespace and making it difficult to figure out from code examination where a name originates from. +- Do not use bare `import *`; all imports should either explicitly pull in an + object or import an entire module, otherwise you're implicitly polluting the + global namespace and making it difficult to figure out from code examination + where a name originates from. ### Style - Use `prettier` to format `TypeScript` and `JavaScript` code. - Use arrow functions over anonymous function expressions. -- Always surround loop and conditional bodies with curly braces. Statements on the same line are allowed to omit braces. +- Always surround loop and conditional bodies with curly braces. Statements on + the same line are allowed to omit braces. - Open curly braces always go on the same line as whatever necessitates them. - Parenthesized constructs should have no surrounding whitespace. -- A single space follows commas, colons, and semicolons in those constructs. For example: +- A single space follows commas, colons, and semicolons in those constructs. + For example: - `for (var i = 0, n = str.length; i < 10; i++) { }` - `if (x < 10) { }` @@ -58,4 +70,5 @@ Use single quotes for strings. ## Coding Standards for Python -Please follow the [Google Python Style Guide](https://google.github.io/styleguide/pyguide.html). +Please follow the +[Google Python Style Guide](https://google.github.io/styleguide/pyguide.html). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ebf23acad..f0c1cf0b4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,14 +1,18 @@ # Contributing -This project welcomes contributions and suggestions. Most contributions require you to -agree to a Contributor License Agreement (CLA) declaring that you have the right to, -and actually do, grant us the rights to use your contribution. For details, visit -https://cla.microsoft.com. +This project welcomes contributions and suggestions. Most contributions require +you to agree to a Contributor License Agreement (CLA) declaring that you have +the right to, and actually do, grant us the rights to use your contribution. For +details, visit https://cla.microsoft.com. -When you submit a pull request, a CLA-bot will automatically determine whether you need -to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the -instructions provided by the bot. You will only need to do this once across all repositories using our CLA. +When you submit a pull request, a CLA-bot will automatically determine whether +you need to provide a CLA and decorate the PR appropriately (e.g., label, +comment). Simply follow the instructions provided by the bot. You will only need +to do this once across all repositories using our CLA. -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). -For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) -or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. +This project has adopted the +[Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). +For more information see the +[Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or +contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any +additional questions or comments. diff --git a/PRIVACY.md b/PRIVACY.md index aca263491..7ca7ec04b 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -2,21 +2,31 @@ ## Data Collection -The software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft's privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704​​​​​​​. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices. +The software may collect information about you and your use of the software and +send it to Microsoft. Microsoft may use this information to provide services and +improve our products and services. You may turn off the telemetry as described +in the repository. There are also some features in the software that may enable +you and Microsoft to collect data from users of your applications. If you use +these features, you must comply with applicable law, including providing +appropriate notices to users of your applications together with a copy of +Microsoft's privacy statement. Our privacy statement is located at +https://go.microsoft.com/fwlink/?LinkID=824704​​​​​​​. You can learn more about +data collection and use in the help documentation and our privacy statement. +Your use of the software operates as your consent to these practices. ## Disable Telemetry -The Microsoft Device Simulator Express Extension for Visual Studio Code collects usage -data and sends it to Microsoft to help improve our products and -services. Read our -[privacy statement](https://privacy.microsoft.com/privacystatement) to -learn more. This extension respects the `telemetry.enableTelemetry` -setting which you can learn more about at +The Microsoft Device Simulator Express Extension for Visual Studio Code collects +usage data and sends it to Microsoft to help improve our products and services. +Read our [privacy statement](https://privacy.microsoft.com/privacystatement) to +learn more. This extension respects the `telemetry.enableTelemetry` setting +which you can learn more about at https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting. To disable telemetry, follow these steps: -1) Open **File** (Open **Code** on macOS) -2) Select **Preferences** -3) Select **Settings** -4) Search for `telemetry` -5) Uncheck the **Telemetry: Enable Telemetry** setting + +1. Open **File** (Open **Code** on macOS) +2. Select **Preferences** +3. Select **Settings** +4. Search for `telemetry` +5. Uncheck the **Telemetry: Enable Telemetry** setting diff --git a/README.md b/README.md index b984c74b4..78f01934d 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,44 @@ # ⚠️ NOTE: this extension is no longer maintained! ⚠️ -Please see the [deprecation notice](https://github.com/microsoft/vscode-python-devicesimulator/wiki/Deprecation-of-the-extension) for details. +Please see the +[deprecation notice](https://github.com/microsoft/vscode-python-devicesimulator/wiki/Deprecation-of-the-extension) +for details. # Device Simulator Express, a Microsoft Garage project -Make without limit! Device Simulator Express, a Microsoft Garage project, allows you to code microcontrollers without the hardware on hand! You can program your Adafruit Circuit Playground Express (CPX), your BBC micro:bit or the Adafruit CLUE! Test and debug your code on the device simulator and see the same -result when you plug in your actual microcontroller. Curious about the output of the device, the serial -monitor allows you to observe the device output. +Make without limit! Device Simulator Express, a Microsoft Garage project, allows +you to code microcontrollers without the hardware on hand! You can program your +Adafruit Circuit Playground Express (CPX), your BBC micro:bit or the Adafruit +CLUE! Test and debug your code on the device simulator and see the same result +when you plug in your actual microcontroller. Curious about the output of the +device, the serial monitor allows you to observe the device output. ## Table of Contents - - [Devices we support](#devices-we-support) - - [Prerequisites](#prerequisites) - - [Adafruit Circuit Playground Express (CPX) Simulator](#adafruit-circuit-playground-express-cpx-simulator) - - [Features](#features) - - [Useful Links](#useful-links) - - [Keyboard Shortcuts](#keyboard-shortcuts) - - [BBC micro:bit Simulator](#bbc-microbit-simulator) - - [Features](#features-1) - - [Useful Links](#useful-links-1) - - [Keyboard Shortcuts](#keyboard-shortcuts-1) - - [Adafruit CLUE Simulator](#adafruit-clue-simulator) - - [Features](#features-2) - - [Useful Links](#useful-links-2) - - [Keyboard Shortcuts](#keyboard-shortcuts-2) - - [How to use](#how-to-use) - - [Commands](#commands) - - [Contribute](#contribute) - - [Provide feedback](#provide-feedback) - - [Privacy and Telemetry Notice](#privacy-and-telemetry-notice) - - [Third Party Notice](#third-party-notice) - - [Troubleshooting Tips](#troubleshooting-tips) - - [License](#license) - - [Notes](#notes) - + +- [Devices we support](#devices-we-support) +- [Prerequisites](#prerequisites) +- [Adafruit Circuit Playground Express (CPX) Simulator](#adafruit-circuit-playground-express-cpx-simulator) + - [Features](#features) + - [Useful Links](#useful-links) + - [Keyboard Shortcuts](#keyboard-shortcuts) +- [BBC micro:bit Simulator](#bbc-microbit-simulator) + - [Features](#features-1) + - [Useful Links](#useful-links-1) + - [Keyboard Shortcuts](#keyboard-shortcuts-1) +- [Adafruit CLUE Simulator](#adafruit-clue-simulator) + - [Features](#features-2) + - [Useful Links](#useful-links-2) + - [Keyboard Shortcuts](#keyboard-shortcuts-2) +- [How to use](#how-to-use) + - [Commands](#commands) +- [Contribute](#contribute) +- [Provide feedback](#provide-feedback) +- [Privacy and Telemetry Notice](#privacy-and-telemetry-notice) +- [Third Party Notice](#third-party-notice) +- [Troubleshooting Tips](#troubleshooting-tips) +- [License](#license) +- [Notes](#notes) + ## Devices we support - [**Adafruit Circuit Playground Express (CPX)**](#adafruit-circuit-playground-express-cpx-simulator) @@ -57,18 +63,23 @@ monitor allows you to observe the device output. ## Prerequisites -The following dependencies are required to install before launching Device Simulator Express. +The following dependencies are required to install before launching Device +Simulator Express. You will be prompted to install the Python dependencies during the first use. - _**[Visual Studio Code](https://code.visualstudio.com/)**_ -- _**[Python 3.7+](https://www.python.org/downloads/)**_: Make sure you've added Python and pip to your PATH in your environment variables. (1) -- _**[Python VS Code extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python)**_: This will be installed automatically from the marketplace when you install Device Simulator Express. +- _**[Python 3.7+](https://www.python.org/downloads/)**_: Make sure you've + added Python and pip to your PATH in your environment variables. (1) +- _**[Python VS Code extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python)**_: + This will be installed automatically from the marketplace when you install + Device Simulator Express. ## Adafruit Circuit Playground Express (CPX) Simulator ### Features -- IntelliSense and syntax highlighting for CircuitPython code for the CPX library +- IntelliSense and syntax highlighting for CircuitPython code for the CPX + library - Template file generation - Integrated Python Debugging for the Simulator - Serial monitor (available on Windows and Mac only) @@ -88,9 +99,12 @@ You will be prompted to install the Python dependencies during the first use. - Temperature sensor - 7 Capacitive Touch sensors -The simulator supports most of the sensors on CPX except **IR transmitter & Receiver**, **Sound Sensor (microphone)**, **Speaker (Play Tone)** and the **"tap" on Motion Sensor**. -The code related to these sensors can still run on the actual CPX board and be deployed using Device Simulator Express. -As we only support CPX library now, other libraries (i.e. simpleio) can’t run on the simulator. But they will work on the actual device! +The simulator supports most of the sensors on CPX except **IR transmitter & +Receiver**, **Sound Sensor (microphone)**, **Speaker (Play Tone)** and the +**"tap" on Motion Sensor**. The code related to these sensors can still run on +the actual CPX board and be deployed using Device Simulator Express. +As we only support CPX library now, other libraries (i.e. simpleio) can’t run on +the simulator. But they will work on the actual device! ### Useful Links @@ -107,8 +121,10 @@ As we only support CPX library now, other libraries (i.e. simpleio) can’t run In Device Simulator Express, you can use keyboard to interact with the device: -- Push Button: A for Button A, B for Button B, C for Buttons A & B -- Capacitive Touch Sensor: Shift + 1 ~ 7 for GPIO pins A1 - A7 +- Push Button: A for Button A, B for Button B, + C for Buttons A & B +- Capacitive Touch Sensor: Shift + 1 ~ 7 for + GPIO pins A1 - A7 - Slider Switch: Shift + S - Refresh the simulator: Shift + R - Run the simulator: Shift + F @@ -117,7 +133,8 @@ In Device Simulator Express, you can use keyboard to interact with the device: ### Features -- IntelliSense and syntax highlighting for MicroPython code for the micro:bit library +- IntelliSense and syntax highlighting for MicroPython code for the micro:bit + library - Template file generation - Integrated Python Debugging for the Simulator - Deploy MicroPython code to the physical device @@ -138,7 +155,8 @@ In Device Simulator Express, you can use keyboard to interact with the device: ### Keyboard Shortcuts -- Push Button: A for Button A, B for Button B, C for Buttons A & B +- Push Button: A for Button A, B for Button B, + C for Buttons A & B - Refresh the simulator: Shift + R - Run the simulator: Shift + F @@ -146,7 +164,8 @@ In Device Simulator Express, you can use keyboard to interact with the device: ### Features -- IntelliSense and syntax highlighting for CircuitPython code for the following drivers and libraries: +- IntelliSense and syntax highlighting for CircuitPython code for the + following drivers and libraries: - `adafruit_clue` - `adafruit_slideshow` - `adafruit_display_shapes` @@ -182,19 +201,26 @@ In Device Simulator Express, you can use keyboard to interact with the device: ### Keyboard Shortcuts -- Push Button: A for Button A, B for Button B, C for Buttons A & B +- Push Button: A for Button A, B for Button B, + C for Buttons A & B - Refresh the simulator: Shift + R - Run the simulator: Shift + F ## How to use -To use Device Simulator Express, install the extension from the marketplace and reload VS Code. +To use Device Simulator Express, install the extension from the marketplace and +reload VS Code. -To access many of the commands, you need to open the command palette. This can be done with Ctrl + Shift + P for Windows and Linux / Cmd + Shift + P for Mac. It can also be accessed from the toolbar by going to `View -> Command Palette`. +To access many of the commands, you need to open the command palette. This can +be done with Ctrl + Shift + P for Windows and +Linux / Cmd + Shift + P for Mac. It can also be +accessed from the toolbar by going to `View -> Command Palette`. ### I. Take a look at the "Device Simulator Express: Getting Started" Command. -1. Type in `"Device Simulator Express: Getting Started"` in the command palette (Ctrl + Shift + P / Cmd + Shift + P to open the command palette). +1. Type in `"Device Simulator Express: Getting Started"` in the command palette + (Ctrl + Shift + P / Cmd + + Shift + P to open the command palette). 2. Choose the the device you want to play with from the dropdown. 3. Read, copy and learn some of the things you can do with the simulator! @@ -202,40 +228,51 @@ To access many of the commands, you need to open the command palette. This can b ### II. Start with the "Device Simulator Express: New File" Command. -1. Type in `"Device Simulator Express: New File"` in the command palette (Ctrl + Shift + P / Cmd + Shift + P to open the command palette). +1. Type in `"Device Simulator Express: New File"` in the command palette + (Ctrl + Shift + P / Cmd + + Shift + P to open the command palette). 2. Select the device you want to use. 3. Name and save your file somewhere, and we’re good to go! -4. Start with some examples: you can find examples files and tutorials inside the comments at the top of the file. +4. Start with some examples: you can find examples files and tutorials inside + the comments at the top of the file. "New File" animation ### III. Start from an existing Python file. 1. Open the folder or your .py file in Visual Studio Code. -2. Run `Device Simulator Express: Open Simulator` from the command palette or icon in the editor toolbar. +2. Run `Device Simulator Express: Open Simulator` from the command palette or + icon in the editor toolbar. 3. Select the device you want to use. ### IV. Run your code on the simulator. -1. Run `Run Simulator` from the command palette or use the `Play` button on the simulator webview. +1. Run `Run Simulator` from the command palette or use the `Play` button on the + simulator webview. How to run the simulator animation ### V. Deploy your code to the physical device -Before deploying the Python code to your CPX device, you need to format your device by following these tutorials: +Before deploying the Python code to your CPX device, you need to format your +device by following these tutorials: - _For the CPX_: - - Download the firmware with the .uf2 file (link: https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart). - - Download the lastest versions of the cpx libraries (link: https://learn.adafruit.com/welcome-to-circuitpython/circuitpython-libraries). + - Download the firmware with the .uf2 file (link: + https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart). + - Download the lastest versions of the cpx libraries (link: + https://learn.adafruit.com/welcome-to-circuitpython/circuitpython-libraries). - _For the micro:bit_: - - Download the firmware with the .hex file (link: https://microbit.org/get-started/user-guide/firmware/). + - Download the firmware with the .hex file (link: + https://microbit.org/get-started/user-guide/firmware/). - _For the CLUE_: - - Download the latest versions of the cpx libraries and follow the instructions here (link:https://learn.adafruit.com/adafruit-clue/circuitpython). + - Download the latest versions of the cpx libraries and follow the + instructions here + (link:https://learn.adafruit.com/adafruit-clue/circuitpython). 1. Plug in your device (make sure it’s formatted properly already). 2. Run the command `"Device Simulator Express: Deploy to Device"`. @@ -252,21 +289,35 @@ Before deploying the Python code to your CPX device, you need to format your dev ### VII. Debug your project on the simulator 1. Add breakpoints in your code -2. Press F5 to enter the debugging mode, and you can start debugging line by line! +2. Press F5 to enter the debugging mode, and you can start debugging line by + line! ### Commands -Device Simulator Express provides several commands in the Command Palette (F1 or Ctrl + Shift + P / Cmd + Shift + P for Mac OS) for working with \*.py files: - -- `Device Simulator Express: Getting Started`: Opens a page in VS Code that helps users get started with the extension. Here, users can browse through code that they can use to play with the simulators. -- `Device Simulator Express: Run Simulator`: Runs Python code on the simulator. -- `Device Simulator Express: New File`: Opens an unsaved .py file with template code, also opens the simulator for the selected device. -- `Device Simulator Express: Open Simulator`: Opens the simulator in the simulator window for the selected device -- `Device Simulator Express: Deploy to Device`: Copies the current file to the selected device. -- `Device Simulator Express: Open Serial Monitor`: Opens the serial monitor in the integrated output window. -- `Device Simulator Express: Close Serial Monitor`: Stops the serial monitor and releases the serial port. -- `Device Simulator Express: Change Baud Rate`: Changes the baud rate of the selected serial port. For Adafruit CPX, the default baud rate is 115200. -- `Device Simulator Express: Select Serial Port`: Changes the current serial port. +Device Simulator Express provides several commands in the Command Palette +(F1 or Ctrl + Shift + P / +Cmd + Shift + P for Mac OS) for working with +\*.py files: + +- `Device Simulator Express: Getting Started`: Opens a page in VS Code that + helps users get started with the extension. Here, users can browse through + code that they can use to play with the simulators. +- `Device Simulator Express: Run Simulator`: Runs Python code on the + simulator. +- `Device Simulator Express: New File`: Opens an unsaved .py file with + template code, also opens the simulator for the selected device. +- `Device Simulator Express: Open Simulator`: Opens the simulator in the + simulator window for the selected device +- `Device Simulator Express: Deploy to Device`: Copies the current file to the + selected device. +- `Device Simulator Express: Open Serial Monitor`: Opens the serial monitor in + the integrated output window. +- `Device Simulator Express: Close Serial Monitor`: Stops the serial monitor + and releases the serial port. +- `Device Simulator Express: Change Baud Rate`: Changes the baud rate of the + selected serial port. For Adafruit CPX, the default baud rate is 115200. +- `Device Simulator Express: Select Serial Port`: Changes the current serial + port. ## Contribute @@ -274,25 +325,37 @@ Device Simulator Express provides several commands in the Command Palette ( ## Provide feedback -To add a review for our extension, please do so on the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-python.devicesimulatorexpress) +To add a review for our extension, please do so on the +[Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-python.devicesimulatorexpress) -To report issues, provide feedback or requests, please use this link: [Provide Feedback](https://github.com/microsoft/vscode-python-devicesimulator/issues). -We would love to hear from you about your experience to keep improving our project. +To report issues, provide feedback or requests, please use this link: +[Provide Feedback](https://github.com/microsoft/vscode-python-devicesimulator/issues). +We would love to hear from you about your experience to keep improving our +project. ## Privacy and Telemetry Notice ### Data Collection -The software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft's privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices. +The software may collect information about you and your use of the software and +send it to Microsoft. Microsoft may use this information to provide services and +improve our products and services. You may turn off the telemetry as described +in the repository. There are also some features in the software that may enable +you and Microsoft to collect data from users of your applications. If you use +these features, you must comply with applicable law, including providing +appropriate notices to users of your applications together with a copy of +Microsoft's privacy statement. Our privacy statement is located at +https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data +collection and use in the help documentation and our privacy statement. Your use +of the software operates as your consent to these practices. ### Disable Telemetry -The Microsoft Device Simulator Express Extension for Visual Studio Code collects usage -data and sends it to Microsoft to help improve our products and -services. Read our -[privacy statement](https://privacy.microsoft.com/privacystatement) to -learn more. This extension respects the `telemetry.enableTelemetry` -setting which you can learn more about at +The Microsoft Device Simulator Express Extension for Visual Studio Code collects +usage data and sends it to Microsoft to help improve our products and services. +Read our [privacy statement](https://privacy.microsoft.com/privacystatement) to +learn more. This extension respects the `telemetry.enableTelemetry` setting +which you can learn more about at https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting. To disable telemetry, follow these steps: @@ -305,17 +368,34 @@ To disable telemetry, follow these steps: ## Third Party Notice -A `ThirdPartyNotices.txt` file is provided in the extension's source code listing the appropriate third-party notices. +A `ThirdPartyNotices.txt` file is provided in the extension's source code +listing the appropriate third-party notices. ## Troubleshooting Tips -- The first time you install the extension, you'll need to execute the `run` command at least once in order to access auto-completion. -- While running a code file, if you get an error saying it can't find the file, make sure you've clicked on a valid Python code file before running it. -- To open the output panel again after closing it go to VS Code menu: `View -> Output`. -- If you try to deploy to the CPX while it's plugged in but you still get an error saying it cannot find the board, make sure your device is formatted correctly and that its name matches `CIRCUITPY`. -- If you can't get the Simulator communication working while debugging, try to open your `Settings` and check the port used under `"Device Simulator Express: Debugger Server Port"`. You can either change it (usually ports above 5000 should work) or try to free it, then start debugging again. -- When you are using the serial monitor, if you get some unusual error messages, unplug the device and reload the VS Code windows. -- If you're using Ubuntu and having some problems with setting up the environment, try reviewing [this article's](https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-local-programming-environment-on-ubuntu-16-04) "Step 1" section on how to set up Python 3 on Ubuntu 16.04. Then, ensure that you've run `sudo apt-get install -y python3-venv` to allow for virtual environment creation. +- The first time you install the extension, you'll need to execute the `run` + command at least once in order to access auto-completion. +- While running a code file, if you get an error saying it can't find the + file, make sure you've clicked on a valid Python code file before running + it. +- To open the output panel again after closing it go to VS Code menu: + `View -> Output`. +- If you try to deploy to the CPX while it's plugged in but you still get an + error saying it cannot find the board, make sure your device is formatted + correctly and that its name matches `CIRCUITPY`. +- If you can't get the Simulator communication working while debugging, try to + open your `Settings` and check the port used under + `"Device Simulator Express: Debugger Server Port"`. You can either change it + (usually ports above 5000 should work) or try to free it, then start + debugging again. +- When you are using the serial monitor, if you get some unusual error + messages, unplug the device and reload the VS Code windows. +- If you're using Ubuntu and having some problems with setting up the + environment, try reviewing + [this article's](https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-local-programming-environment-on-ubuntu-16-04) + "Step 1" section on how to set up Python 3 on Ubuntu 16.04. Then, ensure + that you've run `sudo apt-get install -y python3-venv` to allow for virtual + environment creation. ## License @@ -345,5 +425,9 @@ A `ThirdPartyNotices.txt` file is provided in the extension's source code listin ## Notes -1. Make sure that when you type _python_ in a terminal, the command is recognized and you have the correct version. The easiest way to do it is to select the "Add to PATH" option directly when you install Python. Otherwise you can search how to insert it manually. -2. You can choose to see the prompt or not by changing the extension configurations. +1. Make sure that when you type _python_ in a terminal, the command is + recognized and you have the correct version. The easiest way to do it is to + select the "Add to PATH" option directly when you install Python. Otherwise + you can search how to insert it manually. +2. You can choose to see the prompt or not by changing the extension + configurations. diff --git a/SECURITY.md b/SECURITY.md index 034e84803..d906fed6e 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -16,6 +16,5 @@ currently being supported with security updates. Use this section to tell people how to report a vulnerability. -Tell them where to go, how often they can expect to get an update on a -reported vulnerability, what to expect if the vulnerability is accepted or -declined, etc. +Tell them where to go, how often they can expect to get an update on a reported +vulnerability, what to expect if the vulnerability is accepted or declined, etc. diff --git a/Source/constants.ts b/Source/constants.ts index 14bfd28e5..fe702c639 100644 --- a/Source/constants.ts +++ b/Source/constants.ts @@ -51,17 +51,17 @@ export const CONSTANTS = { "Writing to COM port (GetOverlappedResult): Unknown error code 121", CPX_FILE_ERROR: localize( "error.cpxFileFormat", - "The cpx.json file format is not correct.", + "The cpx.json file format is not correct." ), DEBUGGER_SERVER_INIT_FAILED: (port: number) => { return localize( "error.debuggerServerInitFailed", - `Warning : The Debugger Server cannot be opened. Please try to free the port ${port} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.`, + `Warning : The Debugger Server cannot be opened. Please try to free the port ${port} if it's already in use or select another one in your Settings 'Device Simulator Express: Debugger Server Port' and start another debug session.\n You can still debug your code but you won't be able to use the Simulator.` ); }, DEBUGGING_SESSION_IN_PROGESS: localize( "error.debuggingSessionInProgress", - "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n", + "[ERROR] A debugging session is currently in progress, please stop it before running your code. \n" ), DEPENDENCY_DOWNLOAD_ERROR: "Dependency download could not be completed. Functionality may be limited. Please review the installation docs.", @@ -69,66 +69,66 @@ export const CONSTANTS = { FAILED_TO_OPEN_SERIAL_PORT: (port: string): string => { return localize( "error.failedToOpenSerialPort", - `[ERROR] Failed to open serial port ${port}.`, + `[ERROR] Failed to open serial port ${port}.` ); }, FAILED_TO_OPEN_SERIAL_PORT_DUE_TO: (port: string, error: any) => { return localize( "error.failedToOpenSerialPortDueTo", - `[ERROR] Failed to open serial port ${port} due to error: ${error}. \n`, + `[ERROR] Failed to open serial port ${port} due to error: ${error}. \n` ); }, INSTALLATION_ERROR: localize( "error.installationError", - "Installation Error", + "Installation Error" ), INVALID_FILE_EXTENSION_DEBUG: localize( "error.invalidFileExtensionDebug", - "The file you tried to run isn't a Python file.", + "The file you tried to run isn't a Python file." ), INVALID_PYTHON_PATH: localize( "error.invalidPythonPath", - 'We found that your selected Python interpreter version is too low to run the extension. Please upgrade to version 3.7+ or select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application.', + 'We found that your selected Python interpreter version is too low to run the extension. Please upgrade to version 3.7+ or select a different interpreter (CTRL+SHIFT+P and type "python.selectInterpreter") and restart the application.' ), LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT: localize( "error.lowPythonVersionForMicrobitDeployment", - "To deploy your code to the micro:bit, you must be using Python 3.3+", + "To deploy your code to the micro:bit, you must be using Python 3.3+" ), NO_DEVICE: localize( "error.noDevice", - "The device is not detected. Please double check if your board is connected and/or properly formatted", + "The device is not detected. Please double check if your board is connected and/or properly formatted" ), NO_FILE_TO_RUN: localize( "error.noFileToRun", - '[ERROR] We can\'t find a Python file to run. Please make sure you select or open a new ".py" code file, or use the "New File" command to get started and see useful links.\n', + '[ERROR] We can\'t find a Python file to run. Please make sure you select or open a new ".py" code file, or use the "New File" command to get started and see useful links.\n' ), NO_FILE_TO_DEPLOY: localize( "error.noFileToDeploy", - "[ERROR] We can't find a Python file to deploy to your device.\n", + "[ERROR] We can't find a Python file to deploy to your device.\n" ), NO_FOLDER_OPENED: localize( "error.noFolderCreated", - "In order to use the Serial Monitor, you need to open a folder and reload VS Code.", + "In order to use the Serial Monitor, you need to open a folder and reload VS Code." ), NO_PROGRAM_FOUND_DEBUG: localize( "error.noProgramFoundDebug", - "Cannot find a program to debug.", + "Cannot find a program to debug." ), NO_PYTHON_PATH: localize( "error.noPythonPath", - "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again.", + "We found that you don't have Python 3 installed on your computer, please install the latest version, add it to your PATH and try again." ), RECONNECT_DEVICE: localize( "error.reconnectDevice", - "Please disconnect your Circuit Playground Express and try again.", + "Please disconnect your Circuit Playground Express and try again." ), STDERR: (data: string) => { return localize("error.stderr", `\n[ERROR] ${data} \n`); }, UNEXPECTED_MESSAGE: localize( "error.unexpectedMessage", - "Webview sent an unexpected message", + "Webview sent an unexpected message" ), }, FILESYSTEM: { @@ -141,124 +141,124 @@ export const CONSTANTS = { INFO: { ALREADY_SUCCESSFUL_INSTALL: localize( "info.successfulInstall", - "Your current configuration is already successfully set up for the Device Simulator Expresss.", + "Your current configuration is already successfully set up for the Device Simulator Expresss." ), ARE_YOU_SURE: localize( "info.areYouSure", - "Are you sure you don't want to install the dependencies? The extension can't run without installing them.", + "Are you sure you don't want to install the dependencies? The extension can't run without installing them." ), CLOSED_SERIAL_PORT: (port: string) => { return localize( "info.closedSerialPort", - `[DONE] Closed the serial port - ${port} \n`, + `[DONE] Closed the serial port - ${port} \n` ); }, COMPLETED_MESSAGE: "Completed", CPX_JSON_ALREADY_GENERATED: localize( "info.cpxJsonAlreadyGenerated", - "cpx.json has already been generated.", + "cpx.json has already been generated." ), DEPLOY_DEVICE: localize( "info.deployDevice", - "\n[INFO] Deploying code to the device...\n", + "\n[INFO] Deploying code to the device...\n" ), DEPLOY_SIMULATOR: localize( "info.deploySimulator", - "\n[INFO] Deploying code to the simulator...\n", + "\n[INFO] Deploying code to the simulator...\n" ), DEPLOY_SUCCESS: localize( "info.deploySuccess", - "\n[INFO] Code successfully copied! Your device should be loading and ready to go shortly.\n", + "\n[INFO] Code successfully copied! Your device should be loading and ready to go shortly.\n" ), EXTENSION_ACTIVATED: localize( "info.extensionActivated", - "Congratulations, your extension Device Simulator Express is now active!", + "Congratulations, your extension Device Simulator Express is now active!" ), FILE_SELECTED: (filePath: string) => { return localize( "info.fileSelected", - `[INFO] File selected : ${filePath} \n`, + `[INFO] File selected : ${filePath} \n` ); }, FIRST_TIME_WEBVIEW: localize( "info.firstTimeWebview", - 'To reopen the simulator select the command "Open Simulator" from command palette.', + 'To reopen the simulator select the command "Open Simulator" from command palette.' ), INSTALLING_PYTHON_VENV: localize( "info.installingPythonVenv", - "A virtual environment is currently being created. The required Python packages will be installed. You will be prompted a message telling you when the installation is done.", + "A virtual environment is currently being created. The required Python packages will be installed. You will be prompted a message telling you when the installation is done." ), INSTALL_PYTHON_DEPS: localize( "info.installPythonDependencies", - "Do you want us to try and install this extension's dependencies on your selected Python interpreter for you?", + "Do you want us to try and install this extension's dependencies on your selected Python interpreter for you?" ), INSTALL_PYTHON_VENV: localize( "info.installPythonVenv", - "Do you want us to try and install this extension's dependencies via virtual environment for you?", + "Do you want us to try and install this extension's dependencies via virtual environment for you?" ), NEW_FILE: localize( "info.newFile", - "New to Python or the Circuit Playground Express? We are here to help!", + "New to Python or the Circuit Playground Express? We are here to help!" ), NO_DEVICE_CHOSEN_TO_DEPLOY_TO: localize( "info.noDeviceChosenToDeployTo", - "\n[INFO] No device was selected to deploy to.\n", + "\n[INFO] No device was selected to deploy to.\n" ), NO_DEVICE_CHOSEN_TO_SIMULATE_TO: localize( "info.noDeviceChosenToSimulateTo", - "\n[INFO] No device was selected to simulate.\n", + "\n[INFO] No device was selected to simulate.\n" ), NO_DEVICE_CHOSEN_FOR_NEW_FILE: localize( "info.noDeviceChosenForNewFile", - "\n[INFO] No device was selected to open a template file for.\n", + "\n[INFO] No device was selected to open a template file for.\n" ), OPENED_SERIAL_PORT: (port: string) => { return localize( "info.openedSerialPort", - `[INFO] Opened the serial port - ${port} \n`, + `[INFO] Opened the serial port - ${port} \n` ); }, OPENING_SERIAL_PORT: (port: string) => { return localize( "info.openingSerialPort", - `[STARTING] Opening the serial port - ${port} \n`, + `[STARTING] Opening the serial port - ${port} \n` ); }, PLEASE_OPEN_FOLDER: localize( "info.pleaseOpenFolder", - "Please open a folder first.", + "Please open a folder first." ), REDIRECT: localize("info.redirect", "You are being redirected."), RUNNING_CODE: localize("info.runningCode", "Running user code"), SUCCESSFUL_INSTALL: localize( "info.successfulInstall", - "Successfully set up the Python environment.", + "Successfully set up the Python environment." ), THIRD_PARTY_WEBSITE_ADAFRUIT: localize( "info.thirdPartyWebsiteAdafruit", - 'By clicking "Agree and Proceed" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit\'s privacy policy', + 'By clicking "Agree and Proceed" you will be redirected to adafruit.com, a third party website not managed by Microsoft. Please note that your activity on adafruit.com is subject to Adafruit\'s privacy policy' ), THIRD_PARTY_WEBSITE_PIP: localize( "info.thirdPartyWebsitePip", - 'By clicking "Agree and Proceed" you will be redirected to pip.pypa.io, a third party website not managed by Microsoft. Please note that your activity on pip.pypa.io is subject to PyPA\'s privacy policy', + 'By clicking "Agree and Proceed" you will be redirected to pip.pypa.io, a third party website not managed by Microsoft. Please note that your activity on pip.pypa.io is subject to PyPA\'s privacy policy' ), THIRD_PARTY_WEBSITE_PYTHON: localize( "info.thirdPartyWebsitePython", - 'By clicking "Agree and Proceed" you will be redirected to python.org, a third party website not managed by Microsoft. Please note that your activity on python.org is subject to Python\'s privacy policy', + 'By clicking "Agree and Proceed" you will be redirected to python.org, a third party website not managed by Microsoft. Please note that your activity on python.org is subject to Python\'s privacy policy' ), UPDATED_TO_EXTENSION_VENV: localize( "info.updatedToExtensionsVenv", - "Automatically updated interpreter to point to extension's virtual environment.", + "Automatically updated interpreter to point to extension's virtual environment." ), WELCOME_OUTPUT_TAB: localize( "info.welcomeOutputTab", - "Welcome to the Device Simulator Express output tab!\n\n", + "Welcome to the Device Simulator Express output tab!\n\n" ), }, LABEL: { WEBVIEW_PANEL: localize( "label.webviewPanel", - "Device Simulator Express", + "Device Simulator Express" ), }, LINKS: { @@ -278,15 +278,15 @@ export const CONSTANTS = { MISC: { SELECT_PORT_PLACEHOLDER: localize( "misc.selectPortPlaceholder", - "Select a serial port", + "Select a serial port" ), SERIAL_MONITOR_NAME: localize( "misc.serialMonitorName", - "Device Simulator Express Serial Monitor", + "Device Simulator Express Serial Monitor" ), SERIAL_MONITOR_TEST_IF_OPEN: localize( "misc.testIfPortOpen", - "Test if serial port is open", + "Test if serial port is open" ), }, NAME: localize("name", "Device Simulator Express"), @@ -298,33 +298,33 @@ export const CONSTANTS = { WARNING: { ACCEPT_AND_RUN: localize( "warning.agreeAndRun", - "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk.", + "By selecting ‘Agree and Run’, you understand the extension executes Python code on your local computer, which may be a potential security risk." ), INVALID_BAUD_RATE: localize( "warning.invalidBaudRate", - "Invalid baud rate, keep baud rate unchanged.", + "Invalid baud rate, keep baud rate unchanged." ), NO_RATE_SELECTED: localize( "warning.noRateSelected", - "No rate is selected, keep baud rate unchanged.", + "No rate is selected, keep baud rate unchanged." ), NO_SERIAL_PORT_SELECTED: localize( "warning.noSerialPortSelected", - "No serial port was selected, please select a serial port first", + "No serial port was selected, please select a serial port first" ), SERIAL_MONITOR_ALREADY_OPENED: (port: string) => { return localize( "warning.serialMonitorAlreadyOpened", - `Serial monitor is already opened for ${port} \n`, + `Serial monitor is already opened for ${port} \n` ); }, SERIAL_MONITOR_NOT_STARTED: localize( "warning.serialMonitorNotStarted", - "Serial monitor has not been started.", + "Serial monitor has not been started." ), SERIAL_PORT_NOT_STARTED: localize( "warning.serialPortNotStarted", - "Serial port has not been started.\n", + "Serial port has not been started.\n" ), }, }; @@ -494,7 +494,7 @@ export namespace DialogResponses { export const EXAMPLE_CODE: MessageItem = { title: localize( "dialogResponses.exampleCode", - "Example Code on GitHub", + "Example Code on GitHub" ), }; export const MESSAGE_UNDERSTOOD: MessageItem = { @@ -503,13 +503,13 @@ export namespace DialogResponses { export const INSTALL_PIP: MessageItem = { title: localize( "dialogResponses.installPip", - "Install from Pip's webpage", + "Install from Pip's webpage" ), }; export const INSTALL_PYTHON: MessageItem = { title: localize( "dialogResponses.installPython", - "Install from python.org", + "Install from python.org" ), }; export const YES: MessageItem = { @@ -518,7 +518,7 @@ export namespace DialogResponses { export const READ_INSTALL_MD: MessageItem = { title: localize( "dialogResponses.readInstall", - "Read installation docs", + "Read installation docs" ), }; } diff --git a/Source/cpxWorkspace.ts b/Source/cpxWorkspace.ts index af944e065..cec9a6289 100644 --- a/Source/cpxWorkspace.ts +++ b/Source/cpxWorkspace.ts @@ -14,7 +14,7 @@ export class CPXWorkspace { const cpxConfigPath = path.join( workspaceFolderPath, ".vscode", - "cpx.json", + "cpx.json" ); if (fs.existsSync(cpxConfigPath)) { return workspaceFolderPath; diff --git a/Source/debugger/debugAdapter.ts b/Source/debugger/debugAdapter.ts index cfa1e4063..9dd7c1dfb 100644 --- a/Source/debugger/debugAdapter.ts +++ b/Source/debugger/debugAdapter.ts @@ -10,7 +10,7 @@ export class DebugAdapter implements DebugAdapterTracker { constructor( debugSession: DebugSession, messagingService: MessagingService, - debugCommunicationService: DebuggerCommunicationService, + debugCommunicationService: DebuggerCommunicationService ) { this.console = debugSession.configuration.console; this.messagingService = messagingService; diff --git a/Source/debugger/debugAdapterFactory.ts b/Source/debugger/debugAdapterFactory.ts index 87c0f7652..8bec8cfc8 100644 --- a/Source/debugger/debugAdapterFactory.ts +++ b/Source/debugger/debugAdapterFactory.ts @@ -15,19 +15,19 @@ export class DebugAdapterFactory implements DebugAdapterTrackerFactory { constructor( debugSession: DebugSession, messagingService: MessagingService, - debugCommunicationService: DebuggerCommunicationService, + debugCommunicationService: DebuggerCommunicationService ) { this.debugSession = debugSession; this.messagingService = messagingService; this.debugCommunicationService = debugCommunicationService; } public createDebugAdapterTracker( - session: DebugSession, + session: DebugSession ): ProviderResult { return new DebugAdapter( session, this.messagingService, - this.debugCommunicationService, + this.debugCommunicationService ); } } diff --git a/Source/debuggerCommunicationServer.ts b/Source/debuggerCommunicationServer.ts index eb9355c9b..3deeff1c4 100644 --- a/Source/debuggerCommunicationServer.ts +++ b/Source/debuggerCommunicationServer.ts @@ -32,7 +32,7 @@ export class DebuggerCommunicationServer { constructor( webviewPanel: WebviewPanel | undefined, port = SERVER_INFO.DEFAULT_SERVER_PORT, - deviceSelectionService: DeviceSelectionService, + deviceSelectionService: DeviceSelectionService ) { this.port = port; this.serverHttp = new http.Server(); @@ -60,13 +60,13 @@ export class DebuggerCommunicationServer { this.pendingCallbacks.push(() => { this.serverIo.emit( DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, - newState, + newState ); }); } else { this.serverIo.emit( DEBUGGER_MESSAGES.EMITTER.INPUT_CHANGED, - newState, + newState ); this.isPendingResponse = true; } @@ -92,7 +92,7 @@ export class DebuggerCommunicationServer { this.handleState(data); this.serverIo.emit( DEBUGGER_MESSAGES.EMITTER.RECEIVED_STATE, - {}, + {} ); }); socket.on(DEBUGGER_MESSAGES.LISTENER.RECEIVED_STATE, () => { diff --git a/Source/deviceContext.ts b/Source/deviceContext.ts index bafd2858e..9144ef23b 100644 --- a/Source/deviceContext.ts +++ b/Source/deviceContext.ts @@ -25,13 +25,13 @@ export class DeviceContext implements vscode.Disposable { private constructor() { if (vscode.workspace && CPXWorkspace.rootPath) { this._watcher = vscode.workspace.createFileSystemWatcher( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE), + path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) ); this._vscodeWatcher = vscode.workspace.createFileSystemWatcher( path.join(CPXWorkspace.rootPath, ".vscode"), true, true, - false, + false ); // Reloads the config into the code if the cpx config file has changed @@ -50,7 +50,7 @@ export class DeviceContext implements vscode.Disposable { if (files && files.length > 0) { const configFile = files[0]; cpxConfigJson = utils.tryParseJSON( - fs.readFileSync(configFile.fsPath, "utf8"), + fs.readFileSync(configFile.fsPath, "utf8") ); if (cpxConfigJson) { this._port = cpxConfigJson.port; @@ -68,7 +68,7 @@ export class DeviceContext implements vscode.Disposable { this._port = null; this._onDidChange.fire(); return this; - }, + } ); } @@ -80,7 +80,7 @@ export class DeviceContext implements vscode.Disposable { let cpxConfigJson: any = {}; if (utils.fileExistsSync(cpxConfigFile)) { cpxConfigJson = utils.tryParseJSON( - fs.readFileSync(cpxConfigFile, "utf8"), + fs.readFileSync(cpxConfigFile, "utf8") ); } if (!cpxConfigJson) { @@ -100,8 +100,8 @@ export class DeviceContext implements vscode.Disposable { } return value; }, - 4, - ), + 4 + ) ); } @@ -119,17 +119,17 @@ export class DeviceContext implements vscode.Disposable { if ( CPXWorkspace.rootPath && utils.fileExistsSync( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE), + path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) ) ) { vscode.window.showInformationMessage( - CONSTANTS.INFO.CPX_JSON_ALREADY_GENERATED, + CONSTANTS.INFO.CPX_JSON_ALREADY_GENERATED ); return; } else { if (!CPXWorkspace.rootPath) { vscode.window.showInformationMessage( - CONSTANTS.INFO.PLEASE_OPEN_FOLDER, + CONSTANTS.INFO.PLEASE_OPEN_FOLDER ); return; } diff --git a/Source/extension.ts b/Source/extension.ts index b60b934e7..d73a05b05 100644 --- a/Source/extension.ts +++ b/Source/extension.ts @@ -77,7 +77,7 @@ export async function activate(context: vscode.ExtensionContext) { const webviewService = new WebviewService(context, deviceSelectionService); const telemetryHandlerService = new TelemetryHandlerService( telemetryAI, - deviceSelectionService, + deviceSelectionService ); const formalNameToNickNameMapping = { [CONSTANTS.DEVICE_NAME_FORMAL.CPX]: CONSTANTS.DEVICE_NAME.CPX, @@ -114,14 +114,14 @@ export async function activate(context: vscode.ExtensionContext) { vscode.workspace.onDidSaveTextDocument( async (document: vscode.TextDocument) => { await fileSelectionService.updateCurrentFileFromTextFile(document); - }, + } ); const currVersionReleaseName = "release_note_" + getPackageInfo(context).extensionVersion; const viewedReleaseNote = context.globalState.get( currVersionReleaseName, - false, + false ); if (!viewedReleaseNote) { @@ -135,7 +135,7 @@ export async function activate(context: vscode.ExtensionContext) { currentPanel.webview.html = webviewService.getWebviewContent( WEBVIEW_TYPES.SIMULATOR, true, - currentPanel, + currentPanel ); currentPanel.reveal(vscode.ViewColumn.Beside); } else { @@ -149,18 +149,18 @@ export async function activate(context: vscode.ExtensionContext) { vscode.Uri.file( path.join( context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - ), + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY + ) ), ], enableScripts: true, - }, + } ); currentPanel.webview.html = webviewService.getWebviewContent( WEBVIEW_TYPES.SIMULATOR, true, - currentPanel, + currentPanel ); messagingService.setWebview(currentPanel.webview); @@ -194,7 +194,7 @@ export async function activate(context: vscode.ExtensionContext) { case WEBVIEW_MESSAGES.BUTTON_PRESS: // Send input to the Python process telemetryHandlerService.handleButtonPressTelemetry( - message.text, + message.text ); console.log(`About to write ${messageJson} \n`); if ( @@ -206,7 +206,7 @@ export async function activate(context: vscode.ExtensionContext) { .emitInputChanged(messageJson); } else if (childProcess) { childProcess.stdin.write( - messageJson + "\n", + messageJson + "\n" ); } break; @@ -214,11 +214,11 @@ export async function activate(context: vscode.ExtensionContext) { console.log(`Play button ${messageJson} \n`); if (message.text.state as boolean) { fileSelectionService.setPathAndSendMessage( - message.text.selected_file, + message.text.selected_file ); fileSelectionService.findCurrentTextDocument(); telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_RUN_SIMULATOR_BUTTON, + TelemetryEventName.COMMAND_RUN_SIMULATOR_BUTTON ); runSimulatorCommand(); } else { @@ -227,7 +227,7 @@ export async function activate(context: vscode.ExtensionContext) { if (childProcess) { childProcess.stdin.write( - messageJson + "\n", + messageJson + "\n" ); } @@ -235,7 +235,7 @@ export async function activate(context: vscode.ExtensionContext) { case WEBVIEW_MESSAGES.GESTURE: case WEBVIEW_MESSAGES.SENSOR_CHANGED: telemetryHandlerService.handleGestureTelemetry( - message.text, + message.text ); console.log(`Sensor changed ${messageJson} \n`); if ( @@ -247,7 +247,7 @@ export async function activate(context: vscode.ExtensionContext) { .emitInputChanged(messageJson); } else if (childProcess) { childProcess.stdin.write( - messageJson + "\n", + messageJson + "\n" ); } break; @@ -257,29 +257,29 @@ export async function activate(context: vscode.ExtensionContext) { break; case WEBVIEW_MESSAGES.SLIDER_TELEMETRY: telemetryHandlerService.handleSensorTelemetry( - message.text, + message.text ); break; case WEBVIEW_MESSAGES.SWITCH_DEVICE: deviceSelectionService.setCurrentActiveDevice( - message.text.active_device, + message.text.active_device ); killProcessIfRunning(); break; default: vscode.window.showInformationMessage( - CONSTANTS.ERROR.UNEXPECTED_MESSAGE, + CONSTANTS.ERROR.UNEXPECTED_MESSAGE ); break; } }, undefined, - context.subscriptions, + context.subscriptions ); activeEditorListener = utils.addVisibleTextEditorCallback( currentPanel, - context, + context ); } @@ -296,13 +296,13 @@ export async function activate(context: vscode.ExtensionContext) { killProcessIfRunning(); if (firstTimeClosed) { vscode.window.showInformationMessage( - CONSTANTS.INFO.FIRST_TIME_WEBVIEW, + CONSTANTS.INFO.FIRST_TIME_WEBVIEW ); firstTimeClosed = false; } }, undefined, - context.subscriptions, + context.subscriptions ); } sendCurrentDeviceMessage(currentPanel); @@ -313,14 +313,14 @@ export async function activate(context: vscode.ExtensionContext) { "deviceSimulatorExpress.common.openSimulator", async () => { const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL), + Object.values(CONSTANTS.DEVICE_NAME_FORMAL) ); if (!chosen_device) { utils.logToOutputChannel( outChannel, CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_SIMULATE_TO, - true, + true ); return; } @@ -329,16 +329,16 @@ export async function activate(context: vscode.ExtensionContext) { deviceSelectionService.setCurrentActiveDevice(device); const telemetryEvents = telemetryHandlerService.getTelemetryEventsForOpenSimulator( - device, + device ); telemetryAI.trackFeatureUsage( - telemetryEvents.openSimulatorTelemetryEvent, + telemetryEvents.openSimulatorTelemetryEvent ); telemetryAI.runWithLatencyMeasure( openWebview, - telemetryEvents.openSimulatorPerformanceTelemetryEvent, + telemetryEvents.openSimulatorPerformanceTelemetryEvent ); - }, + } ); const gettingStartedOpen: vscode.Disposable = @@ -346,10 +346,10 @@ export async function activate(context: vscode.ExtensionContext) { "deviceSimulatorExpress.common.gettingStarted", () => { telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_GETTING_STARTED, + TelemetryEventName.COMMAND_GETTING_STARTED ); webviewService.openTutorialPanel(); - }, + } ); const openTemplateFile = (template: string) => { @@ -367,7 +367,7 @@ export async function activate(context: vscode.ExtensionContext) { CONSTANTS.INFO.NEW_FILE, DialogResponses.DONT_SHOW, DialogResponses.EXAMPLE_CODE, - DialogResponses.TUTORIALS, + DialogResponses.TUTORIALS ) .then((selection: vscode.MessageItem | undefined) => { if (selection === DialogResponses.DONT_SHOW) { @@ -375,23 +375,23 @@ export async function activate(context: vscode.ExtensionContext) { .getConfiguration() .update(CONFIG.SHOW_NEW_FILE_POPUP, false); telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_DONT_SHOW, + TelemetryEventName.CPX_CLICK_DIALOG_DONT_SHOW ); } else if (selection === DialogResponses.EXAMPLE_CODE) { open(CONSTANTS.LINKS.EXAMPLE_CODE); telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_EXAMPLE_CODE, + TelemetryEventName.CPX_CLICK_DIALOG_EXAMPLE_CODE ); } else if (selection === DialogResponses.TUTORIALS) { const okAction = () => { open(CONSTANTS.LINKS.TUTORIALS); telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_CLICK_DIALOG_TUTORIALS, + TelemetryEventName.CPX_CLICK_DIALOG_TUTORIALS ); }; utils.showPrivacyModal( okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT ); } }); @@ -419,14 +419,14 @@ export async function activate(context: vscode.ExtensionContext) { "deviceSimulatorExpress.common.newFile", async () => { const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL), + Object.values(CONSTANTS.DEVICE_NAME_FORMAL) ); if (!chosen_device) { utils.logToOutputChannel( outChannel, CONSTANTS.INFO.NO_DEVICE_CHOSEN_FOR_NEW_FILE, - true, + true ); return; } @@ -445,13 +445,13 @@ export async function activate(context: vscode.ExtensionContext) { telemetryHandlerService.getTelemetryEventsForNewFile(device); telemetryAI.trackFeatureUsage( - telemetryEvents.newFileTelemetryEvent, + telemetryEvents.newFileTelemetryEvent ); telemetryAI.runWithLatencyMeasure( () => openTemplateFile(templateFile), - telemetryEvents.newFilePerformanceTelemetryEvent, + telemetryEvents.newFilePerformanceTelemetryEvent ); - }, + } ); const installDependencies: vscode.Disposable = @@ -460,12 +460,12 @@ export async function activate(context: vscode.ExtensionContext) { async () => { pythonExecutablePath = await setupService.setupEnv( context, - true, + true ); telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_INSTALL_EXTENSION_DEPENDENCIES, + TelemetryEventName.COMMAND_INSTALL_EXTENSION_DEPENDENCIES ); - }, + } ); const killProcessIfRunning = () => { @@ -488,7 +488,7 @@ export async function activate(context: vscode.ExtensionContext) { // Prevent running new code if a debug session is active if (inDebugMode) { vscode.window.showErrorMessage( - CONSTANTS.ERROR.DEBUGGING_SESSION_IN_PROGESS, + CONSTANTS.ERROR.DEBUGGING_SESSION_IN_PROGESS ); return; } @@ -497,7 +497,7 @@ export async function activate(context: vscode.ExtensionContext) { .showWarningMessage( CONSTANTS.WARNING.ACCEPT_AND_RUN, DialogResponses.ACCEPT_AND_RUN, - DialogResponses.CANCEL, + DialogResponses.CANCEL ) .then((selection: vscode.MessageItem | undefined) => { let hasAccepted = true; @@ -524,24 +524,24 @@ export async function activate(context: vscode.ExtensionContext) { utils.logToOutputChannel( outChannel, CONSTANTS.INFO.DEPLOY_SIMULATOR, - true, + true ); killProcessIfRunning(); await fileSelectionService.updateCurrentFileFromEditor( - vscode.window.activeTextEditor, + vscode.window.activeTextEditor ); if (fileSelectionService.getCurrentFileAbsPath() === "") { utils.logToOutputChannel( outChannel, CONSTANTS.ERROR.NO_FILE_TO_RUN, - true, + true ); vscode.window.showErrorMessage( CONSTANTS.ERROR.NO_FILE_TO_RUN, - DialogResponses.MESSAGE_UNDERSTOOD, + DialogResponses.MESSAGE_UNDERSTOOD ); } else { // Save on run @@ -555,15 +555,15 @@ export async function activate(context: vscode.ExtensionContext) { utils.logToOutputChannel( outChannel, CONSTANTS.ERROR.NO_FILE_TO_RUN, - true, + true ); return; } utils.logToOutputChannel( outChannel, CONSTANTS.INFO.FILE_SELECTED( - fileSelectionService.getCurrentFileAbsPath(), - ), + fileSelectionService.getCurrentFileAbsPath() + ) ); // Activate the run webview button @@ -575,7 +575,7 @@ export async function activate(context: vscode.ExtensionContext) { utils.getPathToScript( context, CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.PROCESS_USER_CODE_PY, + HELPER_FILES.PROCESS_USER_CODE_PY ), fileSelectionService.getCurrentFileAbsPath(), JSON.stringify({ enable_telemetry: utils.getTelemetryState() }), @@ -615,7 +615,7 @@ export async function activate(context: vscode.ExtensionContext) { switch (messageToWebview.type) { case "state": const messageData = JSON.parse( - messageToWebview.data, + messageToWebview.data ); if ( messageData.device_name === @@ -623,24 +623,24 @@ export async function activate(context: vscode.ExtensionContext) { ) { messagingService.sendMessageToWebview( VSCODE_MESSAGES_TO_WEBVIEW.SET_STATE, - messageData, + messageData ); } break; case "print": console.log( - `Process print statement output = ${messageToWebview.data}`, + `Process print statement output = ${messageToWebview.data}` ); utils.logToOutputChannel( outChannel, - `[PRINT] ${messageToWebview.data}`, + `[PRINT] ${messageToWebview.data}` ); break; default: console.log( - `Non-state JSON output from the process : ${messageToWebview}`, + `Non-state JSON output from the process : ${messageToWebview}` ); break; } @@ -651,7 +651,7 @@ export async function activate(context: vscode.ExtensionContext) { pythonProcessDataBuffer.push(message); } else { console.log( - `Errored output: ${messageToWebview}`, + `Errored output: ${messageToWebview}` ); } } @@ -663,15 +663,15 @@ export async function activate(context: vscode.ExtensionContext) { // Std error output childProcess.stderr.on("data", (data) => { console.error( - `Error from the Python process through stderr: ${data}`, + `Error from the Python process through stderr: ${data}` ); telemetryAI.trackFeatureUsage( - TelemetryEventName.ERROR_PYTHON_PROCESS, + TelemetryEventName.ERROR_PYTHON_PROCESS ); utils.logToOutputChannel( outChannel, CONSTANTS.ERROR.STDERR(data), - true, + true ); if (currentPanel) { currentPanel.webview.postMessage({ @@ -694,32 +694,32 @@ export async function activate(context: vscode.ExtensionContext) { "deviceSimulatorExpress.common.runSimulator", () => { telemetryAI.trackFeatureUsage( - TelemetryEventName.COMMAND_RUN_PALETTE, + TelemetryEventName.COMMAND_RUN_PALETTE ); runSimulatorCommand(); - }, + } ); const deployCode = async (device: string) => { utils.logToOutputChannel( outChannel, CONSTANTS.INFO.DEPLOY_DEVICE, - true, + true ); await fileSelectionService.updateCurrentFileFromEditor( - vscode.window.activeTextEditor, + vscode.window.activeTextEditor ); if (fileSelectionService.getCurrentFileAbsPath() === "") { utils.logToOutputChannel( outChannel, CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, - true, + true ); vscode.window.showErrorMessage( CONSTANTS.ERROR.NO_FILE_TO_DEPLOY, - DialogResponses.MESSAGE_UNDERSTOOD, + DialogResponses.MESSAGE_UNDERSTOOD ); } else { await fileSelectionService.getCurrentTextDocument().save(); @@ -727,15 +727,15 @@ export async function activate(context: vscode.ExtensionContext) { utils.logToOutputChannel( outChannel, CONSTANTS.INFO.FILE_SELECTED( - fileSelectionService.getCurrentFileAbsPath(), - ), + fileSelectionService.getCurrentFileAbsPath() + ) ); const deviceProcess = cp.spawn(pythonExecutablePath, [ utils.getPathToScript( context, CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.DEVICE_PY, + HELPER_FILES.DEVICE_PY ), device, fileSelectionService.getCurrentFileAbsPath(), @@ -754,16 +754,16 @@ export async function activate(context: vscode.ExtensionContext) { utils.logToOutputChannel( outChannel, CONSTANTS.INFO.DEPLOY_SUCCESS, - true, + true ); } telemetryHandlerService.handleDeployToDeviceFinishedTelemetry( messageToWebview, - device, + device ); } catch (err) { console.log( - `Non-JSON output from the process : ${dataFromTheProcess}`, + `Non-JSON output from the process : ${dataFromTheProcess}` ); } }); @@ -772,15 +772,15 @@ export async function activate(context: vscode.ExtensionContext) { deviceProcess.stderr.on("data", (data) => { telemetryHandlerService.handleDeployToDeviceErrorTelemetry( data, - device, + device ); console.error( - `Error from the Python device process through stderr: ${data}`, + `Error from the Python device process through stderr: ${data}` ); utils.logToOutputChannel( outChannel, `[ERROR] ${data} \n`, - true, + true ); }); @@ -795,14 +795,14 @@ export async function activate(context: vscode.ExtensionContext) { "deviceSimulatorExpress.common.deployToDevice", async () => { const chosen_device = await vscode.window.showQuickPick( - Object.values(CONSTANTS.DEVICE_NAME_FORMAL), + Object.values(CONSTANTS.DEVICE_NAME_FORMAL) ); if (!chosen_device) { utils.logToOutputChannel( outChannel, CONSTANTS.INFO.NO_DEVICE_CHOSEN_TO_DEPLOY_TO, - true, + true ); return; } @@ -811,14 +811,14 @@ export async function activate(context: vscode.ExtensionContext) { const telemetryEvents = telemetryHandlerService.getTelemetryEventsForStartingDeployToDevice( - device, + device ); telemetryAI.trackFeatureUsage(telemetryEvents.deployTelemetryEvent); telemetryAI.runWithLatencyMeasure(() => { deployCode(device); }, telemetryEvents.deployPerformanceTelemetryEvent); - }, + } ); let serialMonitor: SerialMonitor | undefined; @@ -836,11 +836,11 @@ export async function activate(context: vscode.ExtensionContext) { }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CHOOSE_PORT); } else { vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED, + CONSTANTS.ERROR.NO_FOLDER_OPENED ); console.info("Serial monitor is not defined."); } - }, + } ); const openSerialMonitor: vscode.Disposable = @@ -850,15 +850,15 @@ export async function activate(context: vscode.ExtensionContext) { if (serialMonitor) { telemetryAI.runWithLatencyMeasure( serialMonitor.openSerialMonitor.bind(serialMonitor), - TelemetryEventName.COMMAND_SERIAL_MONITOR_OPEN, + TelemetryEventName.COMMAND_SERIAL_MONITOR_OPEN ); } else { vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED, + CONSTANTS.ERROR.NO_FOLDER_OPENED ); console.info("Serial monitor is not defined."); } - }, + } ); const changeBaudRate: vscode.Disposable = vscode.commands.registerCommand( @@ -867,15 +867,15 @@ export async function activate(context: vscode.ExtensionContext) { if (serialMonitor) { telemetryAI.runWithLatencyMeasure( serialMonitor.changeBaudRate.bind(serialMonitor), - TelemetryEventName.COMMAND_SERIAL_MONITOR_BAUD_RATE, + TelemetryEventName.COMMAND_SERIAL_MONITOR_BAUD_RATE ); } else { vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED, + CONSTANTS.ERROR.NO_FOLDER_OPENED ); console.info("Serial monitor is not defined."); } - }, + } ); const closeSerialMonitor: vscode.Disposable = @@ -888,11 +888,11 @@ export async function activate(context: vscode.ExtensionContext) { }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); } else { vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED, + CONSTANTS.ERROR.NO_FOLDER_OPENED ); console.info("Serial monitor is not defined."); } - }, + } ); const showReleaseNote = vscode.commands.registerCommand( @@ -904,11 +904,11 @@ export async function activate(context: vscode.ExtensionContext) { }, TelemetryEventName.COMMAND_SERIAL_MONITOR_CLOSE); } else { vscode.window.showErrorMessage( - CONSTANTS.ERROR.NO_FOLDER_OPENED, + CONSTANTS.ERROR.NO_FOLDER_OPENED ); console.info("Serial monitor is not defined."); } - }, + } ); UsbDetector.getInstance().initialize(context.extensionPath); @@ -917,7 +917,7 @@ export async function activate(context: vscode.ExtensionContext) { if ( CPXWorkspace.rootPath && (utils.fileExistsSync( - path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE), + path.join(CPXWorkspace.rootPath, CPX_CONFIG_FILE) ) || vscode.window.activeTextEditor) ) { @@ -930,17 +930,17 @@ export async function activate(context: vscode.ExtensionContext) { // Debugger configuration const simulatorDebugConfiguration = new SimulatorDebugConfigurationProvider( - utils.getPathToScript(context, "out/", "debug_user_code.py"), + utils.getPathToScript(context, "out/", "debug_user_code.py") ); const debugAdapterFactory = new DebugAdapterFactory( vscode.debug.activeDebugSession, messagingService, - debuggerCommunicationService, + debuggerCommunicationService ); vscode.debug.registerDebugAdapterTrackerFactory( LANGUAGE_VARS.PYTHON.ID, - debugAdapterFactory, + debugAdapterFactory ); // On Debug Session Start: Init comunication const debugSessionsStarted = vscode.debug.onDidStartDebugSession(() => { @@ -959,8 +959,8 @@ export async function activate(context: vscode.ExtensionContext) { new DebuggerCommunicationServer( currentPanel, utils.getServerPortConfig(), - deviceSelectionService, - ), + deviceSelectionService + ) ); telemetryHandlerService.handleDebuggerTelemetry(); @@ -979,15 +979,15 @@ export async function activate(context: vscode.ExtensionContext) { } catch (err) { if (err.message === SERVER_INFO.ERROR_CODE_INIT_SERVER) { console.error( - `Error trying to init the server on port ${utils.getServerPortConfig()}`, + `Error trying to init the server on port ${utils.getServerPortConfig()}` ); telemetryHandlerService.handleDebuggerFailTelemetry(); vscode.window.showErrorMessage( CONSTANTS.ERROR.DEBUGGER_SERVER_INIT_FAILED( - utils.getServerPortConfig(), - ), + utils.getServerPortConfig() + ) ); } } @@ -1017,7 +1017,7 @@ export async function activate(context: vscode.ExtensionContext) { if (utils.checkConfig(CONFIG.CONFIG_ENV_ON_SWITCH)) { pythonExecutablePath = await setupService.setupEnv(context); } - }, + } ); context.subscriptions.push( @@ -1033,11 +1033,11 @@ export async function activate(context: vscode.ExtensionContext) { gettingStartedOpen, vscode.debug.registerDebugConfigurationProvider( CONSTANTS.DEBUG_CONFIGURATION_TYPE, - simulatorDebugConfiguration, + simulatorDebugConfiguration ), debugSessionsStarted, debugSessionStopped, - configsChanged, + configsChanged ); } @@ -1050,31 +1050,31 @@ const updatePythonExtraPaths = () => { path.join(__dirname, CONSTANTS.FILESYSTEM.CLUE), path.join(__dirname, CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON), ], - vscode.ConfigurationTarget.Global, + vscode.ConfigurationTarget.Global ); }; const updatePylintArgs = (context: vscode.ExtensionContext) => { const outPath: string = utils.createEscapedPath( context.extensionPath, - CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, + CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY ); const micropythonPath: string = utils.createEscapedPath( context.extensionPath, CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY, + CONSTANTS.FILESYSTEM.MICROPYTHON_DIRECTORY ); const cluePath: string = utils.createEscapedPath( context.extensionPath, CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.CLUE, + CONSTANTS.FILESYSTEM.CLUE ); const baseCircuitPythonPath: string = utils.createEscapedPath( context.extensionPath, CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON, + CONSTANTS.FILESYSTEM.BASE_CIRCUITPYTHON ); // update pylint args to extend system path // to include python libs local to extention @@ -1084,20 +1084,20 @@ const updatePylintArgs = (context: vscode.ExtensionContext) => { "--init-hook", `import sys; sys.path.extend([\"${outPath}\",\"${micropythonPath}\",\"${cluePath}\",\"${baseCircuitPythonPath}\"])`, ], - vscode.ConfigurationTarget.Workspace, + vscode.ConfigurationTarget.Workspace ); }; const updateConfigLists = ( section: string, newItems: string[], - scope: vscode.ConfigurationTarget, + scope: vscode.ConfigurationTarget ) => { // function for adding elements to configuration arrays const currentExtraItems: string[] = vscode.workspace.getConfiguration().get(section) || []; const extraItemsSet: Set = new Set( - currentExtraItems.concat(newItems), + currentExtraItems.concat(newItems) ); vscode.workspace diff --git a/Source/extension_utils/utils.ts b/Source/extension_utils/utils.ts index 922414b0c..e276605a5 100644 --- a/Source/extension_utils/utils.ts +++ b/Source/extension_utils/utils.ts @@ -19,17 +19,17 @@ import { DeviceContext } from "../deviceContext"; export const exec = util.promisify(cp.exec); const errorChannel = vscode.window.createOutputChannel( - CONSTANTS.ERROR.INSTALLATION_ERROR, + CONSTANTS.ERROR.INSTALLATION_ERROR ); // tslint:disable-next-line: export-name export const getPathToScript = ( context: vscode.ExtensionContext, folderName: string, - fileName: string = "", + fileName: string = "" ) => { const onDiskPath = vscode.Uri.file( - path.join(context.extensionPath, folderName, fileName), + path.join(context.extensionPath, folderName, fileName) ); const scriptPath = onDiskPath.with({ scheme: "vscode-resource" }); return scriptPath.fsPath; @@ -37,13 +37,13 @@ export const getPathToScript = ( export const showPrivacyModal = ( okAction: () => void, - thirdPartyDisclaimer: string, + thirdPartyDisclaimer: string ) => { vscode.window .showInformationMessage( `${thirdPartyDisclaimer}: ${CONSTANTS.LINKS.PRIVACY}`, DialogResponses.AGREE_AND_PROCEED, - DialogResponses.CANCEL, + DialogResponses.CANCEL ) .then((privacySelection: vscode.MessageItem | undefined) => { if (privacySelection === DialogResponses.AGREE_AND_PROCEED) { @@ -57,7 +57,7 @@ export const showPrivacyModal = ( export const logToOutputChannel = ( outChannel: vscode.OutputChannel | undefined, message: string, - show: boolean = false, + show: boolean = false ): void => { if (outChannel) { if (show) { @@ -117,7 +117,7 @@ export function directoryExistsSync(dirPath: string): boolean { export function padStart( sourceString: string, targetLength: number, - padString?: string, + padString?: string ): string { if (!sourceString) { return sourceString; @@ -151,7 +151,7 @@ export function generateCPXConfig(): void { }; const cpxConfigFilePath: string = path.join( CPXWorkspace.rootPath, - CPX_CONFIG_FILE, + CPX_CONFIG_FILE ); mkdirRecursivelySync(path.dirname(cpxConfigFilePath)); fs.writeFileSync(cpxConfigFilePath, JSON.stringify(cpxJson, null, 4)); @@ -159,10 +159,10 @@ export function generateCPXConfig(): void { export const addVisibleTextEditorCallback = ( currentPanel: vscode.WebviewPanel, - context: vscode.ExtensionContext, + context: vscode.ExtensionContext ): vscode.Disposable => { const initialPythonEditors = filterForPythonFiles( - vscode.window.visibleTextEditors, + vscode.window.visibleTextEditors ); currentPanel.webview.postMessage({ command: "visible-editors", @@ -177,23 +177,23 @@ export const addVisibleTextEditorCallback = ( }); }, {}, - context.subscriptions, + context.subscriptions ); }; export const filterForPythonFiles = (textEditors: vscode.TextEditor[]) => { return textEditors .filter( - (editor) => editor.document.languageId === GLOBAL_ENV_VARS.PYTHON, + (editor) => editor.document.languageId === GLOBAL_ENV_VARS.PYTHON ) .map((editor) => editor.document.fileName); }; export const getActiveEditorFromPath = ( - filePath: string, + filePath: string ): vscode.TextDocument => { const activeEditor = vscode.window.visibleTextEditors.find( - (editor: vscode.TextEditor) => editor.document.fileName === filePath, + (editor: vscode.TextEditor) => editor.document.fileName === filePath ); return activeEditor ? activeEditor.document : undefined; }; diff --git a/Source/serialMonitor.ts b/Source/serialMonitor.ts index a6829f313..b4f2cdc56 100644 --- a/Source/serialMonitor.ts +++ b/Source/serialMonitor.ts @@ -59,12 +59,12 @@ export class SerialMonitor implements vscode.Disposable { public initialize() { const defaultBaudRate: number = SerialMonitor.DEFAULT_BAUD_RATE; this._outputChannel = vscode.window.createOutputChannel( - CONSTANTS.MISC.SERIAL_MONITOR_NAME, + CONSTANTS.MISC.SERIAL_MONITOR_NAME ); this._currentBaudRate = defaultBaudRate; this._portsStatusBar = vscode.window.createStatusBarItem( vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.PORT, + STATUS_BAR_PRIORITY.PORT ); this._portsStatusBar.command = "deviceSimulatorExpress.common.selectSerialPort"; @@ -73,7 +73,7 @@ export class SerialMonitor implements vscode.Disposable { this._openPortStatusBar = vscode.window.createStatusBarItem( vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.OPEN_PORT, + STATUS_BAR_PRIORITY.OPEN_PORT ); this._openPortStatusBar.command = "deviceSimulatorExpress.common.openSerialMonitor"; @@ -83,7 +83,7 @@ export class SerialMonitor implements vscode.Disposable { this._baudRateStatusBar = vscode.window.createStatusBarItem( vscode.StatusBarAlignment.Right, - STATUS_BAR_PRIORITY.BAUD_RATE, + STATUS_BAR_PRIORITY.BAUD_RATE ); this._baudRateStatusBar.command = "deviceSimulatorExpress.common.changeBaudRate"; @@ -96,7 +96,7 @@ export class SerialMonitor implements vscode.Disposable { const lists = await SerialPortControl.list(); if (!lists.length) { vscode.window.showInformationMessage( - "No serial message is available.", + "No serial message is available." ); return; } @@ -132,10 +132,10 @@ export class SerialMonitor implements vscode.Disposable { return a.label === b.label ? 0 : a.label > b.label - ? 1 - : -1; + ? 1 + : -1; }) as vscode.QuickPickItem[], - { placeHolder: CONSTANTS.MISC.SELECT_PORT_PLACEHOLDER }, + { placeHolder: CONSTANTS.MISC.SELECT_PORT_PLACEHOLDER } ); if (chosen && chosen.label) { @@ -149,7 +149,7 @@ export class SerialMonitor implements vscode.Disposable { const ans = await vscode.window.showInformationMessage( CONSTANTS.WARNING.NO_SERIAL_PORT_SELECTED, DialogResponses.SELECT, - DialogResponses.CANCEL, + DialogResponses.CANCEL ); if (ans === DialogResponses.SELECT) { await this.selectSerialPort(null, null); @@ -164,7 +164,7 @@ export class SerialMonitor implements vscode.Disposable { await this._serialPortControl.changePort(this._currentPort); } else if (this._serialPortControl.isActive) { vscode.window.showWarningMessage( - `Serial Monitor is already opened for ${this._currentPort}`, + `Serial Monitor is already opened for ${this._currentPort}` ); return; } @@ -172,13 +172,13 @@ export class SerialMonitor implements vscode.Disposable { this._serialPortControl = new SerialPortControl( this._currentPort, this._currentBaudRate, - this._outputChannel, + this._outputChannel ); } if (!this._serialPortControl.currentPort) { console.error( - CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT(this._currentPort), + CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT(this._currentPort) ); return; } @@ -191,9 +191,9 @@ export class SerialMonitor implements vscode.Disposable { outChannel, CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT_DUE_TO( this._currentPort, - error, + error ), - true, + true ); } } @@ -211,14 +211,14 @@ export class SerialMonitor implements vscode.Disposable { public async changeBaudRate() { const baudRates = SerialMonitor.listBaudRates(); const chosen = await vscode.window.showQuickPick( - baudRates.map((baudRate) => baudRate.toString()), + baudRates.map((baudRate) => baudRate.toString()) ); if (!chosen) { logToOutputChannel( outChannel, CONSTANTS.WARNING.NO_RATE_SELECTED, - true, + true ); return; } @@ -227,7 +227,7 @@ export class SerialMonitor implements vscode.Disposable { logToOutputChannel( outChannel, CONSTANTS.WARNING.INVALID_BAUD_RATE, - true, + true ); return; } @@ -236,7 +236,7 @@ export class SerialMonitor implements vscode.Disposable { logToOutputChannel( outChannel, CONSTANTS.WARNING.SERIAL_MONITOR_NOT_STARTED, - true, + true ); return; } @@ -260,7 +260,7 @@ export class SerialMonitor implements vscode.Disposable { logToOutputChannel( outChannel, CONSTANTS.WARNING.SERIAL_PORT_NOT_STARTED, - true, + true ); return false; } diff --git a/Source/serialPortControl.ts b/Source/serialPortControl.ts index 8ffbc3e9a..0abcfa03e 100644 --- a/Source/serialPortControl.ts +++ b/Source/serialPortControl.ts @@ -27,7 +27,7 @@ export class SerialPortControl { return new Promise((resolve, reject) => { SerialPortControl.serialport.list().then( (ports) => resolve(ports), - (err) => reject(err), + (err) => reject(err) ); }); } @@ -41,7 +41,7 @@ export class SerialPortControl { public constructor( port: string, baudRate: number, - private _outputChannel: OutputChannel, + private _outputChannel: OutputChannel ) { this._currentPort = port; this._currentBaudRate = baudRate; @@ -58,7 +58,7 @@ export class SerialPortControl { public open(): Promise { logToOutputChannel( this._outputChannel, - CONSTANTS.INFO.OPENING_SERIAL_PORT(this._currentPort), + CONSTANTS.INFO.OPENING_SERIAL_PORT(this._currentPort) ); return new Promise((resolve, reject) => { if (this._currentSerialPort && this._currentSerialPort.isOpen) { @@ -73,13 +73,13 @@ export class SerialPortControl { }, (error) => { reject(error); - }, + } ); }); } else { this._currentSerialPort = new SerialPortControl.serialport( this._currentPort, - { baudRate: this._currentBaudRate }, + { baudRate: this._currentBaudRate } ); this._outputChannel.show(); this._currentSerialPort.on("open", () => { @@ -90,31 +90,31 @@ export class SerialPortControl { err && !( err.message.indexOf( - CONSTANTS.ERROR.COMPORT_UNKNOWN_ERROR, + CONSTANTS.ERROR.COMPORT_UNKNOWN_ERROR ) >= 0 ) ) { logToOutputChannel( this._outputChannel, CONSTANTS.ERROR.FAILED_TO_OPEN_SERIAL_PORT( - this._currentPort, - ), + this._currentPort + ) ); logToOutputChannel( this._outputChannel, - CONSTANTS.ERROR.RECONNECT_DEVICE, + CONSTANTS.ERROR.RECONNECT_DEVICE ); reject(err); } else { logToOutputChannel( this._outputChannel, CONSTANTS.INFO.OPENED_SERIAL_PORT( - this._currentPort, - ), + this._currentPort + ) ); resolve(); } - }, + } ); }); } @@ -161,7 +161,7 @@ export class SerialPortControl { if (this._outputChannel) { logToOutputChannel( this._outputChannel, - CONSTANTS.INFO.CLOSED_SERIAL_PORT(this._currentPort), + CONSTANTS.INFO.CLOSED_SERIAL_PORT(this._currentPort) ); } this._currentSerialPort = null; @@ -189,7 +189,7 @@ export class SerialPortControl { } else { resolve(); } - }, + } ); }); } diff --git a/Source/service/PopupService.ts b/Source/service/PopupService.ts index e6193c933..84d312467 100644 --- a/Source/service/PopupService.ts +++ b/Source/service/PopupService.ts @@ -8,7 +8,7 @@ export class PopupService { "releaseNote", "Release Note", vscode.ViewColumn.One, - {}, + {} ); panel.webview.html = LATEST_RELEASE_NOTE; diff --git a/Source/service/fileSelectionService.ts b/Source/service/fileSelectionService.ts index 411c157be..5ee5e8ef9 100644 --- a/Source/service/fileSelectionService.ts +++ b/Source/service/fileSelectionService.ts @@ -20,7 +20,7 @@ export class FileSelectionService { return this.currentTextDocument; } public updateCurrentFileFromTextFile = async ( - activeTextDocument: vscode.TextDocument | undefined, + activeTextDocument: vscode.TextDocument | undefined ) => { if (activeTextDocument) { await this.updateCurrentFileFromEditor({ @@ -31,7 +31,7 @@ export class FileSelectionService { } }; public updateCurrentFileFromEditor = async ( - activeTextDocument: vscode.TextEditor | undefined, + activeTextDocument: vscode.TextEditor | undefined ) => { if ( activeTextDocument && @@ -50,14 +50,14 @@ export class FileSelectionService { ) { await vscode.window.showTextDocument( this.currentTextDocument, - vscode.ViewColumn.One, + vscode.ViewColumn.One ); } }; public findCurrentTextDocument() { if (this.currentFileAbsPath) { const foundDocument = this.getActiveEditorFromPath( - this.currentFileAbsPath, + this.currentFileAbsPath ); if (foundDocument !== undefined) { this.currentTextDocument = foundDocument; @@ -71,22 +71,21 @@ export class FileSelectionService { VSCODE_MESSAGES_TO_WEBVIEW.CURRENT_FILE, { running_file: newFilePath, - }, + } ); }; private getActiveEditorFromPath = ( - filePath: string, + filePath: string ): vscode.TextDocument => { const activeEditor = vscode.window.visibleTextEditors.find( - (editor: vscode.TextEditor) => - editor.document.fileName === filePath, + (editor: vscode.TextEditor) => editor.document.fileName === filePath ); return activeEditor ? activeEditor.document : undefined; }; private getActivePythonFile = () => { const editors: vscode.TextEditor[] = vscode.window.visibleTextEditors; const activeEditor = editors.find( - (editor) => editor.document.languageId === LANGUAGE_VARS.PYTHON.ID, + (editor) => editor.document.languageId === LANGUAGE_VARS.PYTHON.ID ); if (activeEditor) { this.currentTextDocument = activeEditor.document; diff --git a/Source/service/setupService.ts b/Source/service/setupService.ts index d50f7aaf8..2b0a26760 100644 --- a/Source/service/setupService.ts +++ b/Source/service/setupService.ts @@ -30,7 +30,7 @@ export class SetupService { public setupEnv = async ( context: vscode.ExtensionContext, - needsResponse: boolean = false, + needsResponse: boolean = false ) => { const originalPythonExecutablePath = await this.getCurrentPythonExecutablePath(); @@ -46,14 +46,14 @@ export class SetupService { if ( !(await this.areDependenciesInstalled( context, - pythonExecutablePath, + pythonExecutablePath )) ) { // environment needs to install dependencies if (!(await this.checkIfVenv(context, pythonExecutablePath))) { const pythonExecutablePathVenv = await this.getPythonVenv( context, - pythonExecutableName, + pythonExecutableName ); if (await this.hasVenv(context)) { // venv in extention exists with wrong dependencies @@ -61,14 +61,14 @@ export class SetupService { if ( !(await this.areDependenciesInstalled( context, - pythonExecutablePathVenv, + pythonExecutablePathVenv )) ) { pythonExecutablePath = await this.installDependenciesWrapper( context, pythonExecutablePathVenv, - pythonExecutablePath, + pythonExecutablePath ); } else { pythonExecutablePath = pythonExecutablePathVenv; @@ -77,16 +77,16 @@ export class SetupService { pythonExecutablePath = await this.promptInstallVenv( context, originalPythonExecutablePath, - pythonExecutableName, + pythonExecutableName ); this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INSTALL_VENV, + TelemetryEventName.SETUP_INSTALL_VENV ); } if (pythonExecutablePath === pythonExecutablePathVenv) { vscode.window.showInformationMessage( - CONSTANTS.INFO.UPDATED_TO_EXTENSION_VENV, + CONSTANTS.INFO.UPDATED_TO_EXTENSION_VENV ); vscode.workspace .getConfiguration() @@ -94,7 +94,7 @@ export class SetupService { } } else { this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_HAS_VENV, + TelemetryEventName.SETUP_HAS_VENV ); } if (pythonExecutablePath === originalPythonExecutablePath) { @@ -105,35 +105,35 @@ export class SetupService { .showInformationMessage( CONSTANTS.INFO.INSTALL_PYTHON_DEPS, DialogResponses.INSTALL_NOW, - DialogResponses.DONT_INSTALL, + DialogResponses.DONT_INSTALL ) .then( async ( - installChoice: vscode.MessageItem | undefined, + installChoice: vscode.MessageItem | undefined ) => { if ( installChoice === DialogResponses.INSTALL_NOW ) { this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL, + TelemetryEventName.SETUP_ORIGINAL_INTERPRETER_DEP_INSTALL ); await this.installDependenciesWrapper( context, - pythonExecutablePath, + pythonExecutablePath ); } else { await vscode.window .showInformationMessage( CONSTANTS.INFO.ARE_YOU_SURE, DialogResponses.INSTALL_NOW, - DialogResponses.DONT_INSTALL, + DialogResponses.DONT_INSTALL ) .then( async ( installChoice2: | vscode.MessageItem - | undefined, + | undefined ) => { if ( installChoice2 === @@ -141,23 +141,23 @@ export class SetupService { ) { await this.installDependenciesWrapper( context, - pythonExecutablePath, + pythonExecutablePath ); } else { this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_NO_DEPS_INSTALLED, + TelemetryEventName.SETUP_NO_DEPS_INSTALLED ); } - }, + } ); } - }, + } ); } } } else if (needsResponse) { vscode.window.showInformationMessage( - CONSTANTS.INFO.ALREADY_SUCCESSFUL_INSTALL, + CONSTANTS.INFO.ALREADY_SUCCESSFUL_INSTALL ); } @@ -165,7 +165,7 @@ export class SetupService { }; public getCurrentPythonExecutablePath = async ( - isTryingPython3: boolean = false, + isTryingPython3: boolean = false ) => { let originalPythonExecutablePath = ""; const systemPythonVar = isTryingPython3 @@ -186,17 +186,17 @@ export class SetupService { // catching any instance where the python path needs to be resolved // from an system variable this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_AUTO_RESOLVE_PYTHON_PATH, + TelemetryEventName.SETUP_AUTO_RESOLVE_PYTHON_PATH ); try { const { stdout } = await this.executePythonCommand( systemPythonVar, - `-c "import sys; print(sys.executable)"`, + `-c "import sys; print(sys.executable)"` ); originalPythonExecutablePath = stdout.trim(); } catch (err) { this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_NO_PYTHON_PATH, + TelemetryEventName.SETUP_NO_PYTHON_PATH ); if (isTryingPython3) { // if trying python3 failed, that means that BOTH @@ -205,19 +205,19 @@ export class SetupService { vscode.window .showErrorMessage( CONSTANTS.ERROR.NO_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON, + DialogResponses.INSTALL_PYTHON ) .then((selection: vscode.MessageItem | undefined) => { if (selection === DialogResponses.INSTALL_PYTHON) { const okAction = () => { this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON, + TelemetryEventName.SETUP_DOWNLOAD_PYTHON ); open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); }; showPrivacyModal( okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON ); } }); @@ -230,11 +230,11 @@ export class SetupService { } if ( !(await this.validatePythonVersion( - originalPythonExecutablePath, + originalPythonExecutablePath )) ) { this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_VER, + TelemetryEventName.SETUP_INVALID_PYTHON_VER ); if (isTryingPython3) { // if we're trying python3, it means we already tried python and it @@ -244,7 +244,7 @@ export class SetupService { vscode.window .showInformationMessage( CONSTANTS.ERROR.INVALID_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON, + DialogResponses.INSTALL_PYTHON ) .then( (installChoice: vscode.MessageItem | undefined) => { @@ -254,17 +254,17 @@ export class SetupService { ) { const okAction = () => { this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON, + TelemetryEventName.SETUP_DOWNLOAD_PYTHON ); open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); }; showPrivacyModal( okAction, CONSTANTS.INFO - .THIRD_PARTY_WEBSITE_PYTHON, + .THIRD_PARTY_WEBSITE_PYTHON ); } - }, + } ); return ""; } else { @@ -280,44 +280,44 @@ export class SetupService { if (!path.isAbsolute(originalPythonExecutablePath)) { originalPythonExecutablePath = path.join( vscode.workspace.rootPath, - originalPythonExecutablePath, + originalPythonExecutablePath ); } if (!fs.existsSync(originalPythonExecutablePath)) { await vscode.window.showErrorMessage( - CONSTANTS.ERROR.BAD_PYTHON_PATH, + CONSTANTS.ERROR.BAD_PYTHON_PATH ); this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_INTERPRETER_PATH, + TelemetryEventName.SETUP_INVALID_PYTHON_INTERPRETER_PATH ); return ""; } if ( !(await this.validatePythonVersion( - originalPythonExecutablePath, + originalPythonExecutablePath )) ) { this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_INVALID_PYTHON_VER, + TelemetryEventName.SETUP_INVALID_PYTHON_VER ); vscode.window .showInformationMessage( CONSTANTS.ERROR.INVALID_PYTHON_PATH, - DialogResponses.INSTALL_PYTHON, + DialogResponses.INSTALL_PYTHON ) .then((installChoice: vscode.MessageItem | undefined) => { if (installChoice === DialogResponses.INSTALL_PYTHON) { const okAction = () => { this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DOWNLOAD_PYTHON, + TelemetryEventName.SETUP_DOWNLOAD_PYTHON ); open(CONSTANTS.LINKS.DOWNLOAD_PYTHON); }; showPrivacyModal( okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PYTHON ); } }); @@ -336,7 +336,7 @@ export class SetupService { vscode.window .showErrorMessage( `We found that you may not have Pip installed on your interpreter at ${pythonExecutablePath}, please install it and try again.`, - DialogResponses.INSTALL_PIP, + DialogResponses.INSTALL_PIP ) .then((selection: vscode.MessageItem | undefined) => { if (selection === DialogResponses.INSTALL_PIP) { @@ -345,7 +345,7 @@ export class SetupService { }; showPrivacyModal( okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PIP, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_PIP ); } }); @@ -355,23 +355,23 @@ export class SetupService { public checkIfVenv = async ( context: vscode.ExtensionContext, - pythonExecutablePath: string, + pythonExecutablePath: string ) => { const venvCheckerPath: string = getPathToScript( context, CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.CHECK_IF_VENV_PY, + HELPER_FILES.CHECK_IF_VENV_PY ); const { stdout } = await this.executePythonCommand( pythonExecutablePath, - `"${venvCheckerPath}"`, + `"${venvCheckerPath}"` ); return stdout.trim() === "1"; }; public executePythonCommand = async ( pythonExecutablePath: string, - command: string, + command: string ) => { return exec(`${createEscapedPath(pythonExecutablePath)} ${command}`); }; @@ -379,7 +379,7 @@ export class SetupService { public validatePythonVersion = async (pythonExecutablePath: string) => { const { stdout } = await this.executePythonCommand( pythonExecutablePath, - "--version", + "--version" ); if (stdout < VERSIONS.MIN_PY_VERSION) { return false; @@ -391,7 +391,7 @@ export class SetupService { public hasVenv = async (context: vscode.ExtensionContext) => { const pathToEnv: string = getPathToScript( context, - CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR, + CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR ); return fs.existsSync(pathToEnv); @@ -400,20 +400,20 @@ export class SetupService { public promptInstallVenv = ( context: vscode.ExtensionContext, pythonExecutable: string, - pythonExecutableName: string, + pythonExecutableName: string ) => { return vscode.window .showInformationMessage( CONSTANTS.INFO.INSTALL_PYTHON_VENV, DialogResponses.YES, - DialogResponses.NO, + DialogResponses.NO ) .then((selection: vscode.MessageItem | undefined) => { if (selection === DialogResponses.YES) { return this.installPythonVenv( context, pythonExecutable, - pythonExecutableName, + pythonExecutableName ); } else { // return pythonExecutable, notifying the caller @@ -427,34 +427,34 @@ export class SetupService { public getPythonVenv = async ( context: vscode.ExtensionContext, - pythonExecutableName: string, + pythonExecutableName: string ) => { const subFolder = os.platform() === "win32" ? "Scripts" : "bin"; return getPathToScript( context, path.join(CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR, subFolder), - pythonExecutableName, + pythonExecutableName ); }; public installPythonVenv = async ( context: vscode.ExtensionContext, pythonExecutable: string, - pythonExecutableName: string, + pythonExecutableName: string ) => { const pathToEnv: string = getPathToScript( context, - CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR, + CONSTANTS.FILESYSTEM.PYTHON_VENV_DIR ); vscode.window.showInformationMessage( - CONSTANTS.INFO.INSTALLING_PYTHON_VENV, + CONSTANTS.INFO.INSTALLING_PYTHON_VENV ); const pythonPath: string = await this.getPythonVenv( context, - pythonExecutableName, + pythonExecutableName ); try { @@ -462,16 +462,16 @@ export class SetupService { // run command to download dependencies to out/python_libs await this.executePythonCommand( pythonExecutable, - `-m venv "${pathToEnv}"`, + `-m venv "${pathToEnv}"` ); } catch (err) { this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_VENV_CREATION_ERR, + TelemetryEventName.SETUP_VENV_CREATION_ERR ); vscode.window .showErrorMessage( `Virtual environment for download could not be completed. Using original interpreter at: ${pythonExecutable}. If you're on Linux, try running "sudo apt-get install python3-venv".`, - DialogResponses.READ_INSTALL_MD, + DialogResponses.READ_INSTALL_MD ) .then((selection: vscode.MessageItem | undefined) => { if (selection === DialogResponses.READ_INSTALL_MD) { @@ -487,25 +487,25 @@ export class SetupService { return this.installDependenciesWrapper( context, pythonPath, - pythonExecutable, + pythonExecutable ); }; public areDependenciesInstalled = async ( context: vscode.ExtensionContext, - pythonPath: string, + pythonPath: string ) => { const dependencyCheckerPath: string = getPathToScript( context, CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - HELPER_FILES.CHECK_PYTHON_DEPENDENCIES, + HELPER_FILES.CHECK_PYTHON_DEPENDENCIES ); try { // python script will throw exception // if not all dependencies are downloaded const { stdout } = await this.executePythonCommand( pythonPath, - `"${dependencyCheckerPath}"`, + `"${dependencyCheckerPath}"` ); // output for debugging purposes @@ -518,12 +518,12 @@ export class SetupService { public installDependencies = async ( context: vscode.ExtensionContext, - pythonPath: string, + pythonPath: string ) => { const requirementsPyInstallPath: string = getPathToScript( context, CONSTANTS.FILESYSTEM.OUTPUT_DIRECTORY, - "install_dependencies.py", + "install_dependencies.py" ); if (!this.isPipInstalled(pythonPath)) { @@ -534,11 +534,11 @@ export class SetupService { try { const { stdout } = await this.executePythonCommand( pythonPath, - `"${requirementsPyInstallPath}"`, + `"${requirementsPyInstallPath}"` ); console.log(`DSE ${stdout}`); vscode.window.showInformationMessage( - CONSTANTS.INFO.SUCCESSFUL_INSTALL, + CONSTANTS.INFO.SUCCESSFUL_INSTALL ); return true; } catch (err) { @@ -550,7 +550,7 @@ export class SetupService { public installDependenciesWrapper = async ( context: vscode.ExtensionContext, pythonPath: string, - backupPythonPath: string = "", + backupPythonPath: string = "" ) => { let errMessage = CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR; if (backupPythonPath !== "") { @@ -560,7 +560,7 @@ export class SetupService { vscode.window .showErrorMessage( CONSTANTS.ERROR.DEPENDENCY_DOWNLOAD_ERROR, - DialogResponses.READ_INSTALL_MD, + DialogResponses.READ_INSTALL_MD ) .then((selection: vscode.MessageItem | undefined) => { if (selection === DialogResponses.READ_INSTALL_MD) { @@ -569,7 +569,7 @@ export class SetupService { }); this.telemetryAI.trackFeatureUsage( - TelemetryEventName.SETUP_DEP_INSTALL_FAIL, + TelemetryEventName.SETUP_DEP_INSTALL_FAIL ); return backupPythonPath; } diff --git a/Source/service/telemetryHandlerService.ts b/Source/service/telemetryHandlerService.ts index edfe86475..e76bea74c 100644 --- a/Source/service/telemetryHandlerService.ts +++ b/Source/service/telemetryHandlerService.ts @@ -11,7 +11,7 @@ export class TelemetryHandlerService { constructor( telemetryAI: TelemetryAI, - deviceSelectionService: DeviceSelectionService, + deviceSelectionService: DeviceSelectionService ) { this.telemetryAI = telemetryAI; this.deviceSelectionService = deviceSelectionService; @@ -21,17 +21,17 @@ export class TelemetryHandlerService { switch (this.deviceSelectionService.getCurrentActiveDevice()) { case CONSTANTS.DEVICE_NAME.CPX: this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_DEBUGGER_INIT_SUCCESS, + TelemetryEventName.CPX_DEBUGGER_INIT_SUCCESS ); break; case CONSTANTS.DEVICE_NAME.MICROBIT: this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_DEBUGGER_INIT_SUCCESS, + TelemetryEventName.MICROBIT_DEBUGGER_INIT_SUCCESS ); break; case CONSTANTS.DEVICE_NAME.CLUE: this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_DEBUGGER_INIT_SUCCESS, + TelemetryEventName.CLUE_DEBUGGER_INIT_SUCCESS ); break; default: @@ -43,17 +43,17 @@ export class TelemetryHandlerService { switch (this.deviceSelectionService.getCurrentActiveDevice()) { case CONSTANTS.DEVICE_NAME.CPX: this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_DEBUGGER_INIT_FAIL, + TelemetryEventName.CPX_DEBUGGER_INIT_FAIL ); break; case CONSTANTS.DEVICE_NAME.MICROBIT: this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_DEBUGGER_INIT_FAIL, + TelemetryEventName.MICROBIT_DEBUGGER_INIT_FAIL ); break; case CONSTANTS.DEVICE_NAME.CLUE: this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_DEBUGGER_INIT_FAIL, + TelemetryEventName.CLUE_DEBUGGER_INIT_FAIL ); break; default: @@ -108,19 +108,19 @@ export class TelemetryHandlerService { public handleCPXButtonPressTelemetry = (buttonState: any) => { if (buttonState.button_a && buttonState.button_b) { this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_BUTTON_AB, + TelemetryEventName.CPX_SIMULATOR_BUTTON_AB ); } else if (buttonState.button_a) { this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_BUTTON_A, + TelemetryEventName.CPX_SIMULATOR_BUTTON_A ); } else if (buttonState.button_b) { this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_BUTTON_B, + TelemetryEventName.CPX_SIMULATOR_BUTTON_B ); } else if (buttonState.switch) { this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_SWITCH, + TelemetryEventName.CPX_SIMULATOR_SWITCH ); } }; @@ -137,37 +137,37 @@ export class TelemetryHandlerService { switch (sensor) { case "temperature": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_TEMPERATURE_SENSOR, + TelemetryEventName.CPX_SIMULATOR_TEMPERATURE_SENSOR ); break; case "light": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_LIGHT_SENSOR, + TelemetryEventName.CPX_SIMULATOR_LIGHT_SENSOR ); break; case "motion_x": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR, + TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR ); break; case "motion_y": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR, + TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR ); break; case "motion_z": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR, + TelemetryEventName.CPX_SIMULATOR_MOTION_SENSOR ); break; case "shake": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_SHAKE, + TelemetryEventName.CPX_SIMULATOR_SHAKE ); break; case "touch": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_SIMULATOR_CAPACITIVE_TOUCH, + TelemetryEventName.CPX_SIMULATOR_CAPACITIVE_TOUCH ); break; } @@ -176,15 +176,15 @@ export class TelemetryHandlerService { public handleMicrobitButtonPressTelemetry = (buttonState: any) => { if (buttonState.button_a && buttonState.button_b) { this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_AB, + TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_AB ); } else if (buttonState.button_a) { this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_A, + TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_A ); } else if (buttonState.button_b) { this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_B, + TelemetryEventName.MICROBIT_SIMULATOR_BUTTON_B ); } }; @@ -193,32 +193,32 @@ export class TelemetryHandlerService { switch (sensor) { case "temperature": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_TEMPERATURE_SENSOR, + TelemetryEventName.MICROBIT_SIMULATOR_TEMPERATURE_SENSOR ); break; case "light": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_LIGHT_SENSOR, + TelemetryEventName.MICROBIT_SIMULATOR_LIGHT_SENSOR ); break; case "motion_x": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR, + TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR ); break; case "motion_y": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR, + TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR ); break; case "motion_z": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR, + TelemetryEventName.MICROBIT_SIMULATOR_MOTION_SENSOR ); break; case "gesture": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_SIMULATOR_GESTURE_SENSOR, + TelemetryEventName.MICROBIT_SIMULATOR_GESTURE_SENSOR ); break; } @@ -227,15 +227,15 @@ export class TelemetryHandlerService { public handleClueButtonPressTelemetry = (buttonState: any) => { if (buttonState.button_a && buttonState.button_b) { this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_BUTTON_AB, + TelemetryEventName.CLUE_SIMULATOR_BUTTON_AB ); } else if (buttonState.button_a) { this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_BUTTON_A, + TelemetryEventName.CLUE_SIMULATOR_BUTTON_A ); } else if (buttonState.button_b) { this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_BUTTON_B, + TelemetryEventName.CLUE_SIMULATOR_BUTTON_B ); } }; @@ -244,92 +244,92 @@ export class TelemetryHandlerService { switch (sensor) { case "temperature": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_TEMPERATURE_SENSOR, + TelemetryEventName.CLUE_SIMULATOR_TEMPERATURE_SENSOR ); break; case "light_r": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR, + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR ); break; case "light_g": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR, + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR ); break; case "light_b": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR, + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR ); break; case "light_c": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR, + TelemetryEventName.CLUE_SIMULATOR_LIGHT_SENSOR ); break; case "motion_x": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR, + TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR ); break; case "motion_y": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR, + TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR ); break; case "motion_z": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR, + TelemetryEventName.CLUE_SIMULATOR_MOTION_SENSOR ); break; case "gesture": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GESTURE_SENSOR, + TelemetryEventName.CLUE_SIMULATOR_GESTURE_SENSOR ); break; case "humidity": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_HUMIDITY_SENSOR, + TelemetryEventName.CLUE_SIMULATOR_HUMIDITY_SENSOR ); break; case "pressure": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_PRESSURE_SENSOR, + TelemetryEventName.CLUE_SIMULATOR_PRESSURE_SENSOR ); break; case "proximity": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_PROXIMITY_SENSOR, + TelemetryEventName.CLUE_SIMULATOR_PROXIMITY_SENSOR ); break; case "gyro_x": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR, + TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR ); break; case "gyro_y": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR, + TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR ); break; case "gyro_z": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR, + TelemetryEventName.CLUE_SIMULATOR_GYRO_SENSOR ); break; case "magnet_x": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR, + TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR ); break; case "magnet_y": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR, + TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR ); break; case "magnet_z": this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR, + TelemetryEventName.CLUE_SIMULATOR_MAGNET_SENSOR ); break; } @@ -339,17 +339,17 @@ export class TelemetryHandlerService { switch (this.deviceSelectionService.getCurrentActiveDevice()) { case CONSTANTS.DEVICE_NAME.CPX: this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CPX_ERROR_COMMAND_NEW_FILE, + TelemetryEventName.CPX_ERROR_COMMAND_NEW_FILE ); break; case CONSTANTS.DEVICE_NAME.MICROBIT: this.telemetryAI.trackFeatureUsage( - TelemetryEventName.MICROBIT_ERROR_COMMAND_NEW_FILE, + TelemetryEventName.MICROBIT_ERROR_COMMAND_NEW_FILE ); break; case CONSTANTS.DEVICE_NAME.CLUE: this.telemetryAI.trackFeatureUsage( - TelemetryEventName.CLUE_ERROR_COMMAND_NEW_FILE, + TelemetryEventName.CLUE_ERROR_COMMAND_NEW_FILE ); break; default: @@ -388,7 +388,7 @@ export class TelemetryHandlerService { public handleDeployToDeviceErrorTelemetry = ( data: string, - device: string, + device: string ) => { let telemetryErrorName: string; switch (device) { @@ -410,7 +410,7 @@ export class TelemetryHandlerService { public handleDeployToDeviceFinishedTelemetry = ( message: any, - device: string, + device: string ) => { let successCommandDeployDevice: string; let errorCommandDeployWithoutDevice: string; @@ -441,7 +441,7 @@ export class TelemetryHandlerService { break; case "no-device": this.telemetryAI.trackFeatureUsage( - errorCommandDeployWithoutDevice, + errorCommandDeployWithoutDevice ); if ( device === CONSTANTS.DEVICE_NAME.CPX || @@ -450,7 +450,7 @@ export class TelemetryHandlerService { vscode.window .showErrorMessage( CONSTANTS.ERROR.NO_DEVICE, - DialogResponses.HELP, + DialogResponses.HELP ) .then((selection: vscode.MessageItem | undefined) => { if (selection === DialogResponses.HELP) { @@ -470,12 +470,12 @@ export class TelemetryHandlerService { } open(helpLink); this.telemetryAI.trackFeatureUsage( - helpTelemetryEvent, + helpTelemetryEvent ); }; utils.showPrivacyModal( okAction, - CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT, + CONSTANTS.INFO.THIRD_PARTY_WEBSITE_ADAFRUIT ); } }); @@ -485,12 +485,12 @@ export class TelemetryHandlerService { break; case "low-python-version": vscode.window.showErrorMessage( - CONSTANTS.ERROR.LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT, + CONSTANTS.ERROR.LOW_PYTHON_VERSION_FOR_MICROBIT_DEPLOYMENT ); break; default: console.log( - `Non-state JSON output from the process : ${message}`, + `Non-state JSON output from the process : ${message}` ); break; } diff --git a/Source/service/webviewService.ts b/Source/service/webviewService.ts index 5d05122ee..01584259b 100644 --- a/Source/service/webviewService.ts +++ b/Source/service/webviewService.ts @@ -12,7 +12,7 @@ export class WebviewService { constructor( context: vscode.ExtensionContext, - deviceSelectionService: DeviceSelectionService, + deviceSelectionService: DeviceSelectionService ) { this.context = context; this.deviceSelectionService = deviceSelectionService; @@ -29,15 +29,15 @@ export class WebviewService { public getWebviewContent( webviewType: string, hasDevice: boolean, - panel: vscode.WebviewPanel, + panel: vscode.WebviewPanel ) { const onDiskPath = vscode.Uri.file( - this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.SIMULATOR), + this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.SIMULATOR) ); const scriptSrc = panel.webview.asWebviewUri(onDiskPath); const vscodeImportPath = vscode.Uri.file( - this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.VSCODE_API), + this.context.asAbsolutePath(CONSTANTS.SCRIPT_PATH.VSCODE_API) ); const vscodeImportPathSrc = panel.webview.asWebviewUri(vscodeImportPath); @@ -73,12 +73,12 @@ export class WebviewService { { enableScripts: true, retainContextWhenHidden: true, - }, + } ); this.tutorialPanel.webview.html = this.getWebviewContent( WEBVIEW_TYPES.GETTING_STARTED, false, - this.tutorialPanel, + this.tutorialPanel ); this.tutorialPanel.onDidDispose(() => { this.disposeTutorialPanel(); diff --git a/Source/simulatorDebugConfigurationProvider.ts b/Source/simulatorDebugConfigurationProvider.ts index 44ffa2fb1..40d153f6a 100644 --- a/Source/simulatorDebugConfigurationProvider.ts +++ b/Source/simulatorDebugConfigurationProvider.ts @@ -20,7 +20,7 @@ export class SimulatorDebugConfigurationProvider public resolveDebugConfiguration( folder: vscode.WorkspaceFolder | undefined, config: vscode.DebugConfiguration, - token?: vscode.CancellationToken, + token?: vscode.CancellationToken ): vscode.ProviderResult { const activeTextEditor = vscode.window.activeTextEditor; @@ -46,7 +46,7 @@ export class SimulatorDebugConfigurationProvider if (!(activeTextEditor.document.languageId === "python")) { return vscode.window .showErrorMessage( - CONSTANTS.ERROR.INVALID_FILE_EXTENSION_DEBUG, + CONSTANTS.ERROR.INVALID_FILE_EXTENSION_DEBUG ) .then(() => { return undefined; // Abort launch diff --git a/Source/telemetry/getPackageInfo.ts b/Source/telemetry/getPackageInfo.ts index e4652d912..6e7044903 100644 --- a/Source/telemetry/getPackageInfo.ts +++ b/Source/telemetry/getPackageInfo.ts @@ -10,7 +10,7 @@ export interface IPackageJson { const getPackagePath = (context: vscode.ExtensionContext) => { const onDiskPath = vscode.Uri.file( - path.join(context.extensionPath, "package.json"), + path.join(context.extensionPath, "package.json") ); const packagePath = onDiskPath.with({ scheme: "vscode-resource" }); @@ -39,7 +39,7 @@ export default function getPackageInfo(context: vscode.ExtensionContext): { if (!extensionName) { throw new Error( - "Extension's package.json is missing instrumentation key.", + "Extension's package.json is missing instrumentation key." ); } diff --git a/Source/telemetry/telemetryAI.ts b/Source/telemetry/telemetryAI.ts index 56c8cb1f2..c0c5ff5ac 100644 --- a/Source/telemetry/telemetryAI.ts +++ b/Source/telemetry/telemetryAI.ts @@ -31,27 +31,27 @@ export default class TelemetryAI { public sendTelemetryIfEnabled( eventName: string, properties?: { [key: string]: string }, - measurements?: { [key: string]: number }, + measurements?: { [key: string]: number } ) { if (TelemetryAI.enableTelemetry) { TelemetryAI.telemetryReporter.sendTelemetryEvent( eventName, properties, - measurements, + measurements ); } } public trackFeatureUsage( eventName: string, - eventProperties?: { [key: string]: string }, + eventProperties?: { [key: string]: string } ) { this.sendTelemetryIfEnabled(eventName, eventProperties); } public runWithLatencyMeasure( functionToRun: () => void, - eventName: string, + eventName: string ): void { const numberOfNanosecondsInSecond: number = 1000000000; const startTime: number = Number(process.hrtime.bigint()); @@ -64,14 +64,14 @@ export default class TelemetryAI { } private createTelemetryReporter( - context: vscode.ExtensionContext, + context: vscode.ExtensionContext ): TelemetryReporter { const { extensionName, extensionVersion, instrumentationKey } = getPackageInfo(context); const reporter: TelemetryReporter = new TelemetryReporter( extensionName, extensionVersion, - instrumentationKey, + instrumentationKey ); context.subscriptions.push(reporter); return reporter; diff --git a/Source/usbDetector.ts b/Source/usbDetector.ts index a0151d7fc..073c99c01 100644 --- a/Source/usbDetector.ts +++ b/Source/usbDetector.ts @@ -36,7 +36,7 @@ export class UsbDetector { public async startListening() { const workspaceConfig = vscode.workspace.getConfiguration(); const enableUSBDetection = workspaceConfig.get( - CONFIG_KEYS.ENABLE_USB_DETECTION, + CONFIG_KEYS.ENABLE_USB_DETECTION ); if (os.platform() === "linux" || !enableUSBDetection) { @@ -57,7 +57,7 @@ export class UsbDetector { const deviceDescriptor = this.getUsbDeviceDescriptor( utils.convertToHex(device.vendorId, 4), utils.convertToHex(device.productId, 4), - this._extensionRoot, + this._extensionRoot ); // Not supported device for discovery @@ -83,13 +83,13 @@ export class UsbDetector { private getUsbDeviceDescriptor( vendorId: string, productId: string, - extensionRoot: string, + extensionRoot: string ): any { if (!this._boardDescriptors) { this._boardDescriptors = []; const fileContent = fs.readFileSync( path.join(extensionRoot, "misc", "usbmapping.json"), - "utf8", + "utf8" ); const boardIndexes: [] = JSON.parse(fileContent); boardIndexes.forEach((boardIndex: any) => { @@ -97,7 +97,7 @@ export class UsbDetector { board.indexFile = boardIndex.index_file; }); this._boardDescriptors = this._boardDescriptors.concat( - boardIndex.boards, + boardIndex.boards ); }); } diff --git a/Source/view/App.css b/Source/view/App.css index 413e9fcbc..dd11b283b 100644 --- a/Source/view/App.css +++ b/Source/view/App.css @@ -1,16 +1,16 @@ .App { - text-align: center; - display: flex; - justify-content: space-between; + text-align: center; + display: flex; + justify-content: space-between; } .App-main { - background-color: var(--vscode-editor-background); - padding: 0px 0.75em 0px 0.75em; - min-height: 100vh; - width: 100%; - margin-top: 24px; - margin-bottom: 53px; - max-height: 400px; - overflow: scroll; + background-color: var(--vscode-editor-background); + padding: 0px 0.75em 0px 0.75em; + min-height: 100vh; + width: 100%; + margin-top: 24px; + margin-bottom: 53px; + max-height: 400px; + overflow: scroll; } diff --git a/Source/view/App.spec.tsx b/Source/view/App.spec.tsx index 2864ceeab..eb12d412f 100644 --- a/Source/view/App.spec.tsx +++ b/Source/view/App.spec.tsx @@ -10,7 +10,7 @@ describe("App component ", () => { .create( - , + ) .toJSON(); expect(component).toMatchSnapshot(); @@ -21,7 +21,7 @@ describe("App component ", () => { , - div, + div ); ReactDOM.unmountComponentAtNode(div); }); diff --git a/Source/view/App.tsx b/Source/view/App.tsx index 1ce673dc0..4b530406e 100644 --- a/Source/view/App.tsx +++ b/Source/view/App.tsx @@ -34,14 +34,14 @@ class App extends React.Component<{}, IState> { componentDidMount() { if (document.currentScript) { const webviewTypeAttribute = document.currentScript.getAttribute( - WEBVIEW_ATTRIBUTES_KEY.TYPE, + WEBVIEW_ATTRIBUTES_KEY.TYPE ) as WEBVIEW_TYPES; if (webviewTypeAttribute) { this.setState({ type: webviewTypeAttribute }); } if (webviewTypeAttribute === WEBVIEW_TYPES.SIMULATOR) { const initialDevice = document.currentScript.getAttribute( - WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE, + WEBVIEW_ATTRIBUTES_KEY.INITIAL_DEVICE ); if (initialDevice) { diff --git a/Source/view/components/Button.tsx b/Source/view/components/Button.tsx index 9b37ff7ce..a7df60dc7 100644 --- a/Source/view/components/Button.tsx +++ b/Source/view/components/Button.tsx @@ -24,8 +24,7 @@ const Button: React.FC = (props) => { role="button" onClick={props.onClick} style={buttonStyle} - tabIndex={tabIndex} - > + tabIndex={tabIndex}> {iconSvg} ); diff --git a/Source/view/components/Dropdown.tsx b/Source/view/components/Dropdown.tsx index f56492e49..16c55e60b 100644 --- a/Source/view/components/Dropdown.tsx +++ b/Source/view/components/Dropdown.tsx @@ -17,8 +17,7 @@ export const Dropdown: React.FC = (props) => { className="dropdown" onChange={props.onSelect} title={props.name} - name={props.name} - > + name={props.name}> {renderOptions(props.options)} ); diff --git a/Source/view/components/clue/Clue.spec.tsx b/Source/view/components/clue/Clue.spec.tsx index c0364154c..e9a6e6c7d 100644 --- a/Source/view/components/clue/Clue.spec.tsx +++ b/Source/view/components/clue/Clue.spec.tsx @@ -10,7 +10,7 @@ describe("Clue component", () => { .create( - , + ) .toJSON(); expect(component).toMatchSnapshot(); @@ -22,7 +22,7 @@ describe("Clue component", () => { , - div, + div ); ReactDOM.unmountComponentAtNode(div); }); diff --git a/Source/view/components/clue/ClueImage.tsx b/Source/view/components/clue/ClueImage.tsx index 9c02b6f21..7bbecc68e 100644 --- a/Source/view/components/clue/ClueImage.tsx +++ b/Source/view/components/clue/ClueImage.tsx @@ -46,7 +46,7 @@ export class ClueImage extends React.Component { } else if (this.context === VIEW_STATE.RUNNING && this.svgRef.current) { setupAllButtons( this.props.eventTriggers, - this.svgRef.current.getButtons(), + this.svgRef.current.getButtons() ); } } @@ -55,11 +55,7 @@ export class ClueImage extends React.Component { window.document.removeEventListener("keyup", this.handleKeyUp); } setupKeyPresses = ( - onKeyEvent: ( - event: KeyboardEvent, - active: boolean, - key: string, - ) => void, + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void ) => { window.document.addEventListener("keydown", this.handleKeyDown); window.document.addEventListener("keyup", this.handleKeyUp); @@ -96,12 +92,12 @@ export class ClueImage extends React.Component { if (isActive) { button.children[0].setAttribute( "class", - BUTTON_STYLING_CLASSES.KEYPRESSED, + BUTTON_STYLING_CLASSES.KEYPRESSED ); } else { button.children[0].setAttribute( "class", - BUTTON_STYLING_CLASSES.DEFAULT, + BUTTON_STYLING_CLASSES.DEFAULT ); } button.setAttribute("pressed", `${isActive}`); @@ -114,7 +110,7 @@ ClueImage.contextType = ViewStateContext; const setupButton = ( buttonElement: SVGRectElement, eventTriggers: EventTriggers, - key: string, + key: string ) => { buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); buttonElement.onmousedown = (e) => { @@ -138,7 +134,7 @@ const setupButton = ( }; const setupAllButtons = ( eventTriggers: EventTriggers, - buttonRefs: IRefObject, + buttonRefs: IRefObject ) => { for (const [key, ref] of Object.entries(buttonRefs)) { if (ref.current) { diff --git a/Source/view/components/clue/ClueSimulator.tsx b/Source/view/components/clue/ClueSimulator.tsx index b12f81629..89323e93e 100644 --- a/Source/view/components/clue/ClueSimulator.tsx +++ b/Source/view/components/clue/ClueSimulator.tsx @@ -162,7 +162,7 @@ export class ClueSimulator extends React.Component { } protected refreshSimulatorClick = () => { const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON, + CONSTANTS.ID_NAME.REFRESH_BUTTON ); if (button) { button.focus(); @@ -214,17 +214,17 @@ export class ClueSimulator extends React.Component { if (key === BUTTONS_KEYS.BTN_A) { this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_A, - active, + active ); } else if (key === BUTTONS_KEYS.BTN_B) { this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_B, - active, + active ); } else if (key === BUTTONS_KEYS.BTN_AB) { this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_AB, - active, + active ); } } else if ( @@ -234,7 +234,7 @@ export class ClueSimulator extends React.Component { this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_A, - active, + active ); } else if ( [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && @@ -243,7 +243,7 @@ export class ClueSimulator extends React.Component { this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_B, - active, + active ); } else if ( [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && @@ -252,7 +252,7 @@ export class ClueSimulator extends React.Component { this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_AB, - active, + active ); } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { this.togglePlayClick(); diff --git a/Source/view/components/clue/Clue_svg.tsx b/Source/view/components/clue/Clue_svg.tsx index 04612e70f..2f09d3321 100644 --- a/Source/view/components/clue/Clue_svg.tsx +++ b/Source/view/components/clue/Clue_svg.tsx @@ -67,8 +67,7 @@ export class ClueSvg extends React.Component { x="0px" y="0px" width="100%" - height="100%" - > + height="100%"> { cy="50%" r="70%" fx="50%" - fy="50%" - > + fy="50%"> { cy="50%" r="70%" fx="50%" - fy="50%" - > + fy="50%"> { cy="50%" r="30%" fx="50%" - fy="50%" - > + fy="50%"> { tabIndex={0} role="button" aria-label="a" - ref={this.buttonRefs.BTN_A} - > + ref={this.buttonRefs.BTN_A}> { tabIndex={0} role="button" aria-label="b" - ref={this.buttonRefs.BTN_B} - > + ref={this.buttonRefs.BTN_B}> { tabIndex={0} role="button" aria-label="ab" - ref={this.buttonRefs.BTN_AB} - > + ref={this.buttonRefs.BTN_AB}> { /> + transform="translate(29.59 11.79) rotate(45.15) scale(1 1.56)"> LIGHT + transform="translate(22.78 18.93) rotate(45.15) scale(1 1.56)"> GESTURE + transform="translate(15.48 26.01) rotate(45.15) scale(1 1.56)"> P R @@ -1127,7 +1117,7 @@ export class ClueSvg extends React.Component { if (this.props.displayImage) { this.displayRef.current?.setAttribute( "href", - `data:image/png;base64,${this.props.displayImage}`, + `data:image/png;base64,${this.props.displayImage}` ); } } @@ -1146,17 +1136,17 @@ export class ClueSvg extends React.Component { if (neopixel === DEFAULT_CLUE_STATE.leds.neopixel) { this.gradientRefs.neopixel.current?.setAttribute( "stop-opacity", - "0", + "0" ); } else { this.gradientRefs.neopixel.current?.setAttribute( "stop-opacity", - "1", + "1" ); } this.gradientRefs.neopixel.current?.setAttribute( "stop-color", - rgbColor, + rgbColor ); } private updateLeds() { @@ -1170,16 +1160,16 @@ export class ClueSvg extends React.Component { CLUE_LEDS_COLORS.WHITE_LEDS_OFF, CLUE_LEDS_COLORS.WHITE_LEDS_ON, ledRef.current, - this.gradientRefs.whiteLed.current, + this.gradientRefs.whiteLed.current ); - }, + } ); svg.setLed( isRedLedOn, CLUE_LEDS_COLORS.RED_LED_OFF, CLUE_LEDS_COLORS.RED_LED_ON, this.ledsRefs.redLed.current, - this.gradientRefs.redLed.current, + this.gradientRefs.redLed.current ); } } diff --git a/Source/view/components/cpx/Accessibility_utils.ts b/Source/view/components/cpx/Accessibility_utils.ts index a7d62bcfa..1ce8d7559 100644 --- a/Source/view/components/cpx/Accessibility_utils.ts +++ b/Source/view/components/cpx/Accessibility_utils.ts @@ -11,7 +11,7 @@ namespace accessibility { export function setAria( elem: Element, role?: string, - label?: string, + label?: string ): void { if (role && !elem.hasAttribute("role")) { elem.setAttribute("role", role); diff --git a/Source/view/components/cpx/Cpx.spec.tsx b/Source/view/components/cpx/Cpx.spec.tsx index 8a28a545c..229140637 100644 --- a/Source/view/components/cpx/Cpx.spec.tsx +++ b/Source/view/components/cpx/Cpx.spec.tsx @@ -10,7 +10,7 @@ describe("CPX component", () => { .create( - , + ) .toJSON(); expect(component).toMatchSnapshot(); @@ -22,7 +22,7 @@ describe("CPX component", () => { , - div, + div ); ReactDOM.unmountComponentAtNode(div); }); diff --git a/Source/view/components/cpx/CpxImage.tsx b/Source/view/components/cpx/CpxImage.tsx index 0244d5a1b..b56b7a31c 100644 --- a/Source/view/components/cpx/CpxImage.tsx +++ b/Source/view/components/cpx/CpxImage.tsx @@ -40,7 +40,7 @@ export class CpxImage extends React.Component { this.updateImage(); } setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean) => void, + onKeyEvent: (event: KeyboardEvent, active: boolean) => void ) => { window.document.addEventListener("keydown", this.handleKeyDown); window.document.addEventListener("keyup", this.handleKeyUp); @@ -78,7 +78,7 @@ const makeButton = ( g: SVGElement, left: number, top: number, - id: string, + id: string ): { outer: SVGElement; inner: SVGElement } => { const buttonCornerRadius = SvgStyle.BUTTON_CORNER_RADIUS; const buttonWidth = SvgStyle.BUTTON_WIDTH; @@ -111,7 +111,7 @@ const initSvgStyle = (svgElement: HTMLElement, brightness: number): void => { const style: SVGStyleElement = svg.child( svgElement, "style", - {}, + {} ) as SVGStyleElement; style.textContent = SvgStyle.SVG_STYLE; @@ -119,7 +119,7 @@ const initSvgStyle = (svgElement: HTMLElement, brightness: number): void => { const defs: SVGDefsElement = svg.child( svgElement, "defs", - {}, + {} ) as SVGDefsElement; const g = svg.createElement("g") as SVGElement; @@ -158,7 +158,7 @@ const initSvgStyle = (svgElement: HTMLElement, brightness: number): void => { const neopixelfeComponentTransfer = svg.child( neopixelglow, "feComponentTransfer", - {}, + {} ); svg.child(neopixelfeComponentTransfer, "feFuncR", { id: "brightnessFilterR", @@ -220,7 +220,7 @@ const updatePowerLED = (propsPowerLED: boolean): void => { const setNeopixel = ( led: HTMLElement, pixValue: number[], - brightness: number, + brightness: number ): void => { if (isLightOn(pixValue) && brightness > 0) { // Neopixels style (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) @@ -235,7 +235,7 @@ const setNeopixel = ( ]); const innerLum = Math.max( lum * SvgStyle.INTENSITY_FACTOR, - SvgStyle.MIN_INNER_LUM, + SvgStyle.MIN_INNER_LUM ); lum = (lum * 90) / 100 + 10; // at least 10% luminosity for the stroke @@ -243,7 +243,7 @@ const setNeopixel = ( led.style.fill = `hsl(${hue}, ${sat}%, ${innerLum}%)`; led.style.stroke = `hsl(${hue}, ${sat}%, ${Math.min( lum * 3, - SvgStyle.MAX_STROKE_LUM, + SvgStyle.MAX_STROKE_LUM )}%)`; led.style.strokeWidth = `1.5`; } else { @@ -309,7 +309,7 @@ const setupPins = (props: IProps): void => { accessibility.setAria( svgPin, "button", - `Touch pin ${pinName.substr(pinName.length - 2)}`, + `Touch pin ${pinName.substr(pinName.length - 2)}` ); } }); @@ -376,7 +376,7 @@ const setupSwitch = (props: IProps): void => { export const updateSwitch = (switchState: boolean): void => { const switchElement = window.document.getElementById("SWITCH"); const switchInner = window.document.getElementById( - "SWITCH_INNER", + "SWITCH_INNER" ) as unknown as SVGElement; if (switchElement && switchInner) { diff --git a/Source/view/components/cpx/CpxSimulator.tsx b/Source/view/components/cpx/CpxSimulator.tsx index bf90cfed4..7e095043b 100644 --- a/Source/view/components/cpx/CpxSimulator.tsx +++ b/Source/view/components/cpx/CpxSimulator.tsx @@ -90,7 +90,7 @@ class Simulator extends React.Component<{}, IState> { break; case "set-state": console.log( - "Setting the state: " + JSON.stringify(message.state), + "Setting the state: " + JSON.stringify(message.state) ); this.setState({ cpx: message.state, @@ -108,7 +108,7 @@ class Simulator extends React.Component<{}, IState> { case "visible-editors": console.log( "Setting active editors", - message.state.activePythonEditors, + message.state.activePythonEditors ); this.setState({ active_editors: message.state.activePythonEditors, @@ -188,7 +188,7 @@ class Simulator extends React.Component<{}, IState> { protected refreshSimulatorClick() { const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON, + CONSTANTS.ID_NAME.REFRESH_BUTTON ); if (button) { button.focus(); @@ -210,19 +210,19 @@ class Simulator extends React.Component<{}, IState> { [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) ) { element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_A, + CONSTANTS.ID_NAME.BUTTON_A ); } else if ( [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) ) { element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_B, + CONSTANTS.ID_NAME.BUTTON_B ); } else if ( [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) ) { element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_AB, + CONSTANTS.ID_NAME.BUTTON_AB ); } else if ( [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.S) @@ -237,43 +237,43 @@ class Simulator extends React.Component<{}, IState> { switch (event.code) { case CONSTANTS.KEYBOARD_KEYS.NUMERIC_ONE: element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A1, + CONSTANTS.ID_NAME.PIN_A1 ); break; case CONSTANTS.KEYBOARD_KEYS.NUMERIC_TWO: element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A2, + CONSTANTS.ID_NAME.PIN_A2 ); break; case CONSTANTS.KEYBOARD_KEYS.NUMERIC_THREE: element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A3, + CONSTANTS.ID_NAME.PIN_A3 ); break; case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FOUR: element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A4, + CONSTANTS.ID_NAME.PIN_A4 ); break; case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FIVE: element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A5, + CONSTANTS.ID_NAME.PIN_A5 ); break; case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SIX: element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A6, + CONSTANTS.ID_NAME.PIN_A6 ); break; case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SEVEN: element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A7, + CONSTANTS.ID_NAME.PIN_A7 ); break; } diff --git a/Source/view/components/cpx/Cpx_svg.tsx b/Source/view/components/cpx/Cpx_svg.tsx index e86d5ac2f..0484dfd11 100644 --- a/Source/view/components/cpx/Cpx_svg.tsx +++ b/Source/view/components/cpx/Cpx_svg.tsx @@ -10,8 +10,7 @@ export const CPX_SVG = ( xmlns="http://www.w3.org/2000/svg" id="cpx_svg" width="45%" - viewBox="0 0 180.094 179.229" - > + viewBox="0 0 180.094 179.229"> diff --git a/Source/view/components/cpx/Cpx_svg_style.tsx b/Source/view/components/cpx/Cpx_svg_style.tsx index 643a936f5..c9f9b2c77 100644 --- a/Source/view/components/cpx/Cpx_svg_style.tsx +++ b/Source/view/components/cpx/Cpx_svg_style.tsx @@ -24,7 +24,7 @@ export const POWER_LED_OFF: string = "#FFFFFF"; // Adapted from : https://github.com/microsoft/pxt/blob/master/pxtsim/simlib.ts export function rgbToHsl( - rgb: [number, number, number], + rgb: [number, number, number] ): [number, number, number] { const [r, g, b] = rgb; const [r$, g$, b$] = [r / 255, g / 255, b / 255]; diff --git a/Source/view/components/cpx/Svg_utils.tsx b/Source/view/components/cpx/Svg_utils.tsx index 4c7188cdb..4776c4a0a 100644 --- a/Source/view/components/cpx/Svg_utils.tsx +++ b/Source/view/components/cpx/Svg_utils.tsx @@ -36,7 +36,7 @@ namespace svg { export function createElement(name: string, props?: any): SVGElement { const newElement = document.createElementNS( "http://www.w3.org/2000/svg", - name, + name ); if (props) { svg.hydrate(newElement, props); @@ -47,7 +47,7 @@ namespace svg { export function child( parent: Element, name: string, - props?: any, + props?: any ): SVGElement { const childElement = svg.createElement(name, props); parent.appendChild(childElement); @@ -83,7 +83,7 @@ namespace svg { offColor: string, onColor: string, ledElement: SVGElement | null, - gradientStopElement: SVGStopElement | null, + gradientStopElement: SVGStopElement | null ) { if (ledStatus) { ledElement?.setAttribute("fill", onColor); diff --git a/Source/view/components/microbit/Microbit.spec.tsx b/Source/view/components/microbit/Microbit.spec.tsx index 37945bb96..67c62cbc2 100644 --- a/Source/view/components/microbit/Microbit.spec.tsx +++ b/Source/view/components/microbit/Microbit.spec.tsx @@ -10,7 +10,7 @@ describe("Microbit component ", () => { .create( - , + ) .toJSON(); expect(component).toMatchSnapshot(); @@ -22,7 +22,7 @@ describe("Microbit component ", () => { , - div, + div ); ReactDOM.unmountComponentAtNode(div); }); diff --git a/Source/view/components/microbit/MicrobitImage.tsx b/Source/view/components/microbit/MicrobitImage.tsx index b2fa83922..18515a425 100644 --- a/Source/view/components/microbit/MicrobitImage.tsx +++ b/Source/view/components/microbit/MicrobitImage.tsx @@ -44,7 +44,7 @@ export class MicrobitImage extends React.Component { } else if (this.context === VIEW_STATE.RUNNING) { setupAllButtons( this.props.eventTriggers, - this.svgRef.current.getButtons(), + this.svgRef.current.getButtons() ); } } @@ -54,11 +54,7 @@ export class MicrobitImage extends React.Component { window.document.removeEventListener("keyup", this.handleKeyUp); } setupKeyPresses = ( - onKeyEvent: ( - event: KeyboardEvent, - active: boolean, - key: string, - ) => void, + onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void ) => { window.document.addEventListener("keydown", this.handleKeyDown); window.document.addEventListener("keyup", this.handleKeyUp); @@ -89,12 +85,12 @@ export class MicrobitImage extends React.Component { if (isActive) { button.children[0].setAttribute( "class", - BUTTON_STYLING_CLASSES.KEYPRESSED, + BUTTON_STYLING_CLASSES.KEYPRESSED ); } else { button.children[0].setAttribute( "class", - BUTTON_STYLING_CLASSES.DEFAULT, + BUTTON_STYLING_CLASSES.DEFAULT ); } button.setAttribute("pressed", `${isActive}`); @@ -107,7 +103,7 @@ MicrobitImage.contextType = ViewStateContext; const setupButton = ( buttonElement: SVGRectElement, eventTriggers: EventTriggers, - key: string, + key: string ) => { buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); @@ -132,7 +128,7 @@ const setupButton = ( }; const setupAllButtons = ( eventTriggers: EventTriggers, - buttonRefs: IRefObject, + buttonRefs: IRefObject ) => { for (const [key, ref] of Object.entries(buttonRefs)) { if (ref.current) { @@ -154,7 +150,7 @@ const disableAllButtons = (buttonRefs: IRefObject) => { }; const updateAllLeds = ( leds: number[][], - ledRefs: Array>>, + ledRefs: Array>> ) => { for (let j = 0; j < leds.length; j++) { for (let i = 0; i < leds[0].length; i++) { diff --git a/Source/view/components/microbit/MicrobitSimulator.tsx b/Source/view/components/microbit/MicrobitSimulator.tsx index 3c4c79a76..3ef219459 100644 --- a/Source/view/components/microbit/MicrobitSimulator.tsx +++ b/Source/view/components/microbit/MicrobitSimulator.tsx @@ -154,7 +154,7 @@ export class MicrobitSimulator extends React.Component { protected refreshSimulatorClick = () => { const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON, + CONSTANTS.ID_NAME.REFRESH_BUTTON ); if (button) { button.focus(); @@ -206,17 +206,17 @@ export class MicrobitSimulator extends React.Component { if (key === BUTTONS_KEYS.BTN_A) { this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_A, - active, + active ); } else if (key === BUTTONS_KEYS.BTN_B) { this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_B, - active, + active ); } else if (key === BUTTONS_KEYS.BTN_AB) { this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_AB, - active, + active ); } } else if ( @@ -227,7 +227,7 @@ export class MicrobitSimulator extends React.Component { this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_A, - active, + active ); } else if ( [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && @@ -237,7 +237,7 @@ export class MicrobitSimulator extends React.Component { this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_B, - active, + active ); } else if ( [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && @@ -247,7 +247,7 @@ export class MicrobitSimulator extends React.Component { this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_AB, - active, + active ); } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { this.togglePlayClick(); diff --git a/Source/view/components/microbit/Microbit_svg.tsx b/Source/view/components/microbit/Microbit_svg.tsx index 6471998e9..fd2ea1ca5 100644 --- a/Source/view/components/microbit/Microbit_svg.tsx +++ b/Source/view/components/microbit/Microbit_svg.tsx @@ -55,16 +55,14 @@ export class MicrobitSvg extends React.Component { y="0px" width="100%" height="100%" - fill="rgba(0,0,0,0)" - > + fill="rgba(0,0,0,0)"> + height="300%"> + height="120%"> @@ -110,8 +107,7 @@ export class MicrobitSvg extends React.Component { x1="0%" y1="0%" x2="0%" - y2="100%" - > + y2="100%"> + y2="100%"> + y2="100%"> + y2="100%"> + y2="100%"> + y2="100%"> + y2="100%"> + y2="100%"> + y2="100%"> + y2="100%"> + y2="100%"> + y2="100%"> + y2="100%"> + y2="100%"> + y2="100%"> + y2="100%"> + y2="100%"> + y2="100%"> + y2="100%"> + y2="100%"> + y2="100%"> + y2="100%"> + y2="100%"> + y2="100%"> + y2="100%"> + }}> (0,0) + }}> (1,0) + }}> (2,0) + }}> (3,0) + }}> (4,0) + }}> (0,1) + }}> (1,1) + }}> (2,1) + }}> (3,1) + }}> (4,1) + }}> (0,2) + }}> (1,2) + }}> (2,2) + }}> (3,2) + }}> (4,2) + }}> (0,3) + }}> (1,3) + }}> (2,3) + }}> (3,3) + }}> (4,3) + }}> (0,4) + }}> (1,4) + }}> (2,4) + }}> (3,4) + }}> (4,4) @@ -1445,29 +1392,25 @@ export class MicrobitSvg extends React.Component { + fill="url(#gradient-pin-0)"> P0, ANALOG IN + fill="url(#gradient-pin-1)"> P1, ANALOG IN + fill="url(#gradient-pin-2)"> P2, ANALOG IN + fill="url(#gradient-pin-3)"> P3, ANALOG IN, LED Col 1 + fill="url(#gradient-pin-4)"> P4, ANALOG IN, LED Col 2 + fill="url(#gradient-pin-5)"> P5, BUTTON A + fill="url(#gradient-pin-6)"> P6, LED Col 9 + fill="url(#gradient-pin-7)"> P7, LED Col 8 + fill="url(#gradient-pin-8)"> P8 + fill="url(#gradient-pin-9)"> P9, LED Col 7 + fill="url(#gradient-pin-10)"> P10, ANALOG IN, LED Col 3 + fill="url(#gradient-pin-11)"> P11, BUTTON B + fill="url(#gradient-pin-12)"> P12, RESERVED ACCESSIBILITY + fill="url(#gradient-pin-13)"> P13, SPI - SCK + fill="url(#gradient-pin-14)"> P14, SPI - MISO + fill="url(#gradient-pin-15)"> P15, SPI - MOSI + fill="url(#gradient-pin-16)"> P16, SPI - Chip Select + fill="url(#gradient-pin-17)"> P17, +3v3 + fill="url(#gradient-pin-18)"> P18, +3v3 + fill="url(#gradient-pin-19)"> P19, I2C - SCL + fill="url(#gradient-pin-20)"> P20, I2C - SDA + fill="url(#gradient-pin-21)"> GND + fill="url(#gradient-pin-22)"> GND + fill="url(#gradient-pin-23)"> +3v3 + fill="url(#gradient-pin-24)"> GND @@ -1681,8 +1603,7 @@ export class MicrobitSvg extends React.Component { role="button" aria-label="a" style={{ fill: "rgb(151, 151, 151)" }} - ref={this.buttonRefs.BTN_A} - > + ref={this.buttonRefs.BTN_A}> + ref={this.buttonRefs.BTN_B}> + ref={this.buttonRefs.BTN_AB}> = (props) => {
); - }, + } )} ); diff --git a/Source/view/components/toolbar/Gesture.tsx b/Source/view/components/toolbar/Gesture.tsx index dcca09bd5..cad53ea8b 100644 --- a/Source/view/components/toolbar/Gesture.tsx +++ b/Source/view/components/toolbar/Gesture.tsx @@ -20,8 +20,7 @@ export class Gesture extends React.Component { flexDirection: "column", justifyContent: "space-between", height: "75px", - }} - > + }}> { private handleOnKeyUp = ( e: React.KeyboardEvent, - onSendGesture?: (isActive: boolean) => void, + onSendGesture?: (isActive: boolean) => void ) => { if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { this.sensorButtonRef!.current!.setButtonClass(false); diff --git a/Source/view/components/toolbar/InputSlider.tsx b/Source/view/components/toolbar/InputSlider.tsx index 8f5fd1161..db78f58d3 100644 --- a/Source/view/components/toolbar/InputSlider.tsx +++ b/Source/view/components/toolbar/InputSlider.tsx @@ -76,7 +76,7 @@ class InputSlider extends React.Component { return ( Math.max( this.props.minValue.toString().length, - this.props.maxValue.toString().length, + this.props.maxValue.toString().length ) + 2 ); }; diff --git a/Source/view/components/toolbar/SensorButton.tsx b/Source/view/components/toolbar/SensorButton.tsx index 1111bd7c0..efd22eb96 100644 --- a/Source/view/components/toolbar/SensorButton.tsx +++ b/Source/view/components/toolbar/SensorButton.tsx @@ -16,7 +16,7 @@ class SensorButton extends React.Component { if (isActive && !isInputDisabled) { this.buttonRef.current?.setAttribute( "class", - "sensor-button active-button", + "sensor-button active-button" ); } else if (this.buttonRef.current) { this.buttonRef!.current!.setAttribute("class", "sensor-button"); @@ -35,8 +35,7 @@ class SensorButton extends React.Component { onKeyUp={this.props.onKeyUp} onKeyDown={this.props.onKeyDown} aria-label={`${this.props.type} sensor`} - className="sensor-button" - > + className="sensor-button"> {this.props.label} ); diff --git a/Source/view/components/toolbar/SensorModalUtils.tsx b/Source/view/components/toolbar/SensorModalUtils.tsx index 4eff1c0ed..57a491960 100644 --- a/Source/view/components/toolbar/SensorModalUtils.tsx +++ b/Source/view/components/toolbar/SensorModalUtils.tsx @@ -19,8 +19,7 @@ export const FEATURE_REQUEST_ON_GITHUB = ( @@ -158,7 +157,7 @@ export const getModalContent = ( onUpdateValue: (onUpdateValue: SENSOR_LIST, value: number) => void, sensorValues: { [key: string]: number }, onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void, + sendGesture?: (isActive: boolean) => void ) => { if (label === CLUE_TOOLBAR_ICON_ID.GESTURE) { return CLUE_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); diff --git a/Source/view/components/toolbar/ToolBar.tsx b/Source/view/components/toolbar/ToolBar.tsx index 8a7e3c768..9bdd48ae5 100644 --- a/Source/view/components/toolbar/ToolBar.tsx +++ b/Source/view/components/toolbar/ToolBar.tsx @@ -65,18 +65,17 @@ class ToolBar extends React.Component { /> ), }} - key={index} - > + key={index}> ); diff --git a/Source/view/components/Dropdown.tsx b/Source/view/components/Dropdown.tsx index 16c55e60b..f56492e49 100644 --- a/Source/view/components/Dropdown.tsx +++ b/Source/view/components/Dropdown.tsx @@ -17,7 +17,8 @@ export const Dropdown: React.FC = (props) => { className="dropdown" onChange={props.onSelect} title={props.name} - name={props.name}> + name={props.name} + > {renderOptions(props.options)} ); diff --git a/Source/view/components/clue/Clue.spec.tsx b/Source/view/components/clue/Clue.spec.tsx index e9a6e6c7d..206e89df8 100644 --- a/Source/view/components/clue/Clue.spec.tsx +++ b/Source/view/components/clue/Clue.spec.tsx @@ -1,4 +1,3 @@ -import * as React from "react"; import * as ReactDOM from "react-dom"; import { IntlProvider } from "react-intl"; import * as testRenderer from "react-test-renderer"; @@ -10,7 +9,7 @@ describe("Clue component", () => { .create( - + , ) .toJSON(); expect(component).toMatchSnapshot(); @@ -22,7 +21,7 @@ describe("Clue component", () => { , - div + div, ); ReactDOM.unmountComponentAtNode(div); }); diff --git a/Source/view/components/clue/ClueImage.tsx b/Source/view/components/clue/ClueImage.tsx index 7bbecc68e..9c02b6f21 100644 --- a/Source/view/components/clue/ClueImage.tsx +++ b/Source/view/components/clue/ClueImage.tsx @@ -46,7 +46,7 @@ export class ClueImage extends React.Component { } else if (this.context === VIEW_STATE.RUNNING && this.svgRef.current) { setupAllButtons( this.props.eventTriggers, - this.svgRef.current.getButtons() + this.svgRef.current.getButtons(), ); } } @@ -55,7 +55,11 @@ export class ClueImage extends React.Component { window.document.removeEventListener("keyup", this.handleKeyUp); } setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void + onKeyEvent: ( + event: KeyboardEvent, + active: boolean, + key: string, + ) => void, ) => { window.document.addEventListener("keydown", this.handleKeyDown); window.document.addEventListener("keyup", this.handleKeyUp); @@ -92,12 +96,12 @@ export class ClueImage extends React.Component { if (isActive) { button.children[0].setAttribute( "class", - BUTTON_STYLING_CLASSES.KEYPRESSED + BUTTON_STYLING_CLASSES.KEYPRESSED, ); } else { button.children[0].setAttribute( "class", - BUTTON_STYLING_CLASSES.DEFAULT + BUTTON_STYLING_CLASSES.DEFAULT, ); } button.setAttribute("pressed", `${isActive}`); @@ -110,7 +114,7 @@ ClueImage.contextType = ViewStateContext; const setupButton = ( buttonElement: SVGRectElement, eventTriggers: EventTriggers, - key: string + key: string, ) => { buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); buttonElement.onmousedown = (e) => { @@ -134,7 +138,7 @@ const setupButton = ( }; const setupAllButtons = ( eventTriggers: EventTriggers, - buttonRefs: IRefObject + buttonRefs: IRefObject, ) => { for (const [key, ref] of Object.entries(buttonRefs)) { if (ref.current) { diff --git a/Source/view/components/clue/ClueSimulator.tsx b/Source/view/components/clue/ClueSimulator.tsx index 89323e93e..b12f81629 100644 --- a/Source/view/components/clue/ClueSimulator.tsx +++ b/Source/view/components/clue/ClueSimulator.tsx @@ -162,7 +162,7 @@ export class ClueSimulator extends React.Component { } protected refreshSimulatorClick = () => { const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON + CONSTANTS.ID_NAME.REFRESH_BUTTON, ); if (button) { button.focus(); @@ -214,17 +214,17 @@ export class ClueSimulator extends React.Component { if (key === BUTTONS_KEYS.BTN_A) { this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_A, - active + active, ); } else if (key === BUTTONS_KEYS.BTN_B) { this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_B, - active + active, ); } else if (key === BUTTONS_KEYS.BTN_AB) { this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_AB, - active + active, ); } } else if ( @@ -234,7 +234,7 @@ export class ClueSimulator extends React.Component { this.handleButtonClick(BUTTONS_KEYS.BTN_A, active); this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_A, - active + active, ); } else if ( [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && @@ -243,7 +243,7 @@ export class ClueSimulator extends React.Component { this.handleButtonClick(BUTTONS_KEYS.BTN_B, active); this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_B, - active + active, ); } else if ( [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && @@ -252,7 +252,7 @@ export class ClueSimulator extends React.Component { this.handleButtonClick(BUTTONS_KEYS.BTN_AB, active); this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_AB, - active + active, ); } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { this.togglePlayClick(); diff --git a/Source/view/components/clue/Clue_svg.tsx b/Source/view/components/clue/Clue_svg.tsx index 2f09d3321..04612e70f 100644 --- a/Source/view/components/clue/Clue_svg.tsx +++ b/Source/view/components/clue/Clue_svg.tsx @@ -67,7 +67,8 @@ export class ClueSvg extends React.Component { x="0px" y="0px" width="100%" - height="100%"> + height="100%" + > { cy="50%" r="70%" fx="50%" - fy="50%"> + fy="50%" + > { cy="50%" r="70%" fx="50%" - fy="50%"> + fy="50%" + > { cy="50%" r="30%" fx="50%" - fy="50%"> + fy="50%" + > { tabIndex={0} role="button" aria-label="a" - ref={this.buttonRefs.BTN_A}> + ref={this.buttonRefs.BTN_A} + > { tabIndex={0} role="button" aria-label="b" - ref={this.buttonRefs.BTN_B}> + ref={this.buttonRefs.BTN_B} + > { tabIndex={0} role="button" aria-label="ab" - ref={this.buttonRefs.BTN_AB}> + ref={this.buttonRefs.BTN_AB} + > { /> + transform="translate(29.59 11.79) rotate(45.15) scale(1 1.56)" + > LIGHT + transform="translate(22.78 18.93) rotate(45.15) scale(1 1.56)" + > GESTURE + transform="translate(15.48 26.01) rotate(45.15) scale(1 1.56)" + > P R @@ -1117,7 +1127,7 @@ export class ClueSvg extends React.Component { if (this.props.displayImage) { this.displayRef.current?.setAttribute( "href", - `data:image/png;base64,${this.props.displayImage}` + `data:image/png;base64,${this.props.displayImage}`, ); } } @@ -1136,17 +1146,17 @@ export class ClueSvg extends React.Component { if (neopixel === DEFAULT_CLUE_STATE.leds.neopixel) { this.gradientRefs.neopixel.current?.setAttribute( "stop-opacity", - "0" + "0", ); } else { this.gradientRefs.neopixel.current?.setAttribute( "stop-opacity", - "1" + "1", ); } this.gradientRefs.neopixel.current?.setAttribute( "stop-color", - rgbColor + rgbColor, ); } private updateLeds() { @@ -1160,16 +1170,16 @@ export class ClueSvg extends React.Component { CLUE_LEDS_COLORS.WHITE_LEDS_OFF, CLUE_LEDS_COLORS.WHITE_LEDS_ON, ledRef.current, - this.gradientRefs.whiteLed.current + this.gradientRefs.whiteLed.current, ); - } + }, ); svg.setLed( isRedLedOn, CLUE_LEDS_COLORS.RED_LED_OFF, CLUE_LEDS_COLORS.RED_LED_ON, this.ledsRefs.redLed.current, - this.gradientRefs.redLed.current + this.gradientRefs.redLed.current, ); } } diff --git a/Source/view/components/cpx/Accessibility_utils.ts b/Source/view/components/cpx/Accessibility_utils.ts index 1ce8d7559..a7d62bcfa 100644 --- a/Source/view/components/cpx/Accessibility_utils.ts +++ b/Source/view/components/cpx/Accessibility_utils.ts @@ -11,7 +11,7 @@ namespace accessibility { export function setAria( elem: Element, role?: string, - label?: string + label?: string, ): void { if (role && !elem.hasAttribute("role")) { elem.setAttribute("role", role); diff --git a/Source/view/components/cpx/Cpx.spec.tsx b/Source/view/components/cpx/Cpx.spec.tsx index 229140637..7f531b9c4 100644 --- a/Source/view/components/cpx/Cpx.spec.tsx +++ b/Source/view/components/cpx/Cpx.spec.tsx @@ -1,4 +1,3 @@ -import * as React from "react"; import * as ReactDOM from "react-dom"; import { IntlProvider } from "react-intl"; import * as testRenderer from "react-test-renderer"; @@ -10,7 +9,7 @@ describe("CPX component", () => { .create( - + , ) .toJSON(); expect(component).toMatchSnapshot(); @@ -22,7 +21,7 @@ describe("CPX component", () => { , - div + div, ); ReactDOM.unmountComponentAtNode(div); }); diff --git a/Source/view/components/cpx/CpxImage.tsx b/Source/view/components/cpx/CpxImage.tsx index b56b7a31c..1e30f030d 100644 --- a/Source/view/components/cpx/CpxImage.tsx +++ b/Source/view/components/cpx/CpxImage.tsx @@ -40,7 +40,7 @@ export class CpxImage extends React.Component { this.updateImage(); } setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean) => void + onKeyEvent: (event: KeyboardEvent, active: boolean) => void, ) => { window.document.addEventListener("keydown", this.handleKeyDown); window.document.addEventListener("keyup", this.handleKeyUp); @@ -78,7 +78,7 @@ const makeButton = ( g: SVGElement, left: number, top: number, - id: string + id: string, ): { outer: SVGElement; inner: SVGElement } => { const buttonCornerRadius = SvgStyle.BUTTON_CORNER_RADIUS; const buttonWidth = SvgStyle.BUTTON_WIDTH; @@ -111,7 +111,7 @@ const initSvgStyle = (svgElement: HTMLElement, brightness: number): void => { const style: SVGStyleElement = svg.child( svgElement, "style", - {} + {}, ) as SVGStyleElement; style.textContent = SvgStyle.SVG_STYLE; @@ -119,7 +119,7 @@ const initSvgStyle = (svgElement: HTMLElement, brightness: number): void => { const defs: SVGDefsElement = svg.child( svgElement, "defs", - {} + {}, ) as SVGDefsElement; const g = svg.createElement("g") as SVGElement; @@ -158,7 +158,7 @@ const initSvgStyle = (svgElement: HTMLElement, brightness: number): void => { const neopixelfeComponentTransfer = svg.child( neopixelglow, "feComponentTransfer", - {} + {}, ); svg.child(neopixelfeComponentTransfer, "feFuncR", { id: "brightnessFilterR", @@ -220,7 +220,7 @@ const updatePowerLED = (propsPowerLED: boolean): void => { const setNeopixel = ( led: HTMLElement, pixValue: number[], - brightness: number + brightness: number, ): void => { if (isLightOn(pixValue) && brightness > 0) { // Neopixels style (Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/board.ts) @@ -235,7 +235,7 @@ const setNeopixel = ( ]); const innerLum = Math.max( lum * SvgStyle.INTENSITY_FACTOR, - SvgStyle.MIN_INNER_LUM + SvgStyle.MIN_INNER_LUM, ); lum = (lum * 90) / 100 + 10; // at least 10% luminosity for the stroke @@ -243,7 +243,7 @@ const setNeopixel = ( led.style.fill = `hsl(${hue}, ${sat}%, ${innerLum}%)`; led.style.stroke = `hsl(${hue}, ${sat}%, ${Math.min( lum * 3, - SvgStyle.MAX_STROKE_LUM + SvgStyle.MAX_STROKE_LUM, )}%)`; led.style.strokeWidth = `1.5`; } else { @@ -309,7 +309,7 @@ const setupPins = (props: IProps): void => { accessibility.setAria( svgPin, "button", - `Touch pin ${pinName.substr(pinName.length - 2)}` + `Touch pin ${pinName.substr(pinName.length - 2)}`, ); } }); @@ -376,18 +376,18 @@ const setupSwitch = (props: IProps): void => { export const updateSwitch = (switchState: boolean): void => { const switchElement = window.document.getElementById("SWITCH"); const switchInner = window.document.getElementById( - "SWITCH_INNER" + "SWITCH_INNER", ) as unknown as SVGElement; if (switchElement && switchInner) { svg.addClass(switchInner, "sim-slide-switch-inner"); - if (!switchState) { - svg.addClass(switchInner, "on"); - switchInner.setAttribute("transform", "translate(-5,0)"); - } else { + if (switchState) { svg.removeClass(switchInner, "on"); switchInner.removeAttribute("transform"); + } else { + svg.addClass(switchInner, "on"); + switchInner.setAttribute("transform", "translate(-5,0)"); } switchElement.setAttribute("aria-pressed", switchState.toString()); } diff --git a/Source/view/components/cpx/CpxSimulator.tsx b/Source/view/components/cpx/CpxSimulator.tsx index 7e095043b..837ed914c 100644 --- a/Source/view/components/cpx/CpxSimulator.tsx +++ b/Source/view/components/cpx/CpxSimulator.tsx @@ -9,8 +9,8 @@ import "../../styles/Simulator.css"; import PlayLogo from "../../svgs/play_svg"; import StopLogo from "../../svgs/stop_svg"; import ActionBar from "../simulator/ActionBar"; -import { BUTTON_NEUTRAL, BUTTON_PRESSED } from "./Cpx_svg_style"; import { CpxImage, updatePinTouch, updateSwitch } from "./CpxImage"; +import { BUTTON_NEUTRAL, BUTTON_PRESSED } from "./Cpx_svg_style"; interface ICpxState { pixels: number[][]; @@ -90,7 +90,7 @@ class Simulator extends React.Component<{}, IState> { break; case "set-state": console.log( - "Setting the state: " + JSON.stringify(message.state) + "Setting the state: " + JSON.stringify(message.state), ); this.setState({ cpx: message.state, @@ -108,7 +108,7 @@ class Simulator extends React.Component<{}, IState> { case "visible-editors": console.log( "Setting active editors", - message.state.activePythonEditors + message.state.activePythonEditors, ); this.setState({ active_editors: message.state.activePythonEditors, @@ -188,7 +188,7 @@ class Simulator extends React.Component<{}, IState> { protected refreshSimulatorClick() { const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON + CONSTANTS.ID_NAME.REFRESH_BUTTON, ); if (button) { button.focus(); @@ -210,19 +210,19 @@ class Simulator extends React.Component<{}, IState> { [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.A) ) { element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_A + CONSTANTS.ID_NAME.BUTTON_A, ); } else if ( [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) ) { element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_B + CONSTANTS.ID_NAME.BUTTON_B, ); } else if ( [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) ) { element = window.document.getElementById( - CONSTANTS.ID_NAME.BUTTON_AB + CONSTANTS.ID_NAME.BUTTON_AB, ); } else if ( [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.S) @@ -232,51 +232,49 @@ class Simulator extends React.Component<{}, IState> { this.togglePlayClick(); } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_R) { this.refreshSimulatorClick(); - } else { - if (event.shiftKey) { - switch (event.code) { - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_ONE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A1 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_TWO: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A2 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_THREE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A3 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FOUR: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A4 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FIVE: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A5 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SIX: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A6 - ); - break; - - case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SEVEN: - element = window.document.getElementById( - CONSTANTS.ID_NAME.PIN_A7 - ); - break; - } + } else if (event.shiftKey) { + switch (event.code) { + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_ONE: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A1, + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_TWO: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A2, + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_THREE: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A3, + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FOUR: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A4, + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_FIVE: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A5, + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SIX: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A6, + ); + break; + + case CONSTANTS.KEYBOARD_KEYS.NUMERIC_SEVEN: + element = window.document.getElementById( + CONSTANTS.ID_NAME.PIN_A7, + ); + break; } } if (element) { diff --git a/Source/view/components/cpx/Cpx_svg.tsx b/Source/view/components/cpx/Cpx_svg.tsx index 0484dfd11..4ccd3dc23 100644 --- a/Source/view/components/cpx/Cpx_svg.tsx +++ b/Source/view/components/cpx/Cpx_svg.tsx @@ -3,14 +3,13 @@ // Adapted from : https://github.com/microsoft/pxt-adafruit/blob/master/sim/visuals/boardsvg.ts -import * as React from "react"; - export const CPX_SVG = ( + viewBox="0 0 180.094 179.229" + > diff --git a/Source/view/components/cpx/Cpx_svg_style.tsx b/Source/view/components/cpx/Cpx_svg_style.tsx index c9f9b2c77..bf9265d20 100644 --- a/Source/view/components/cpx/Cpx_svg_style.tsx +++ b/Source/view/components/cpx/Cpx_svg_style.tsx @@ -24,14 +24,14 @@ export const POWER_LED_OFF: string = "#FFFFFF"; // Adapted from : https://github.com/microsoft/pxt/blob/master/pxtsim/simlib.ts export function rgbToHsl( - rgb: [number, number, number] + rgb: [number, number, number], ): [number, number, number] { const [r, g, b] = rgb; const [r$, g$, b$] = [r / 255, g / 255, b / 255]; const cMin = Math.min(r$, g$, b$); const cMax = Math.max(r$, g$, b$); const cDelta = cMax - cMin; - let h: number = 0, + let h = 0, s: number, l: number; const maxAndMin = cMax + cMin; diff --git a/Source/view/components/cpx/Svg_utils.tsx b/Source/view/components/cpx/Svg_utils.tsx index 4776c4a0a..4c7188cdb 100644 --- a/Source/view/components/cpx/Svg_utils.tsx +++ b/Source/view/components/cpx/Svg_utils.tsx @@ -36,7 +36,7 @@ namespace svg { export function createElement(name: string, props?: any): SVGElement { const newElement = document.createElementNS( "http://www.w3.org/2000/svg", - name + name, ); if (props) { svg.hydrate(newElement, props); @@ -47,7 +47,7 @@ namespace svg { export function child( parent: Element, name: string, - props?: any + props?: any, ): SVGElement { const childElement = svg.createElement(name, props); parent.appendChild(childElement); @@ -83,7 +83,7 @@ namespace svg { offColor: string, onColor: string, ledElement: SVGElement | null, - gradientStopElement: SVGStopElement | null + gradientStopElement: SVGStopElement | null, ) { if (ledStatus) { ledElement?.setAttribute("fill", onColor); diff --git a/Source/view/components/microbit/Microbit.spec.tsx b/Source/view/components/microbit/Microbit.spec.tsx index 67c62cbc2..ee0b53e1c 100644 --- a/Source/view/components/microbit/Microbit.spec.tsx +++ b/Source/view/components/microbit/Microbit.spec.tsx @@ -1,4 +1,3 @@ -import * as React from "react"; import * as ReactDOM from "react-dom"; import { IntlProvider } from "react-intl"; import * as testRenderer from "react-test-renderer"; @@ -10,7 +9,7 @@ describe("Microbit component ", () => { .create( - + , ) .toJSON(); expect(component).toMatchSnapshot(); @@ -22,7 +21,7 @@ describe("Microbit component ", () => { , - div + div, ); ReactDOM.unmountComponentAtNode(div); }); diff --git a/Source/view/components/microbit/MicrobitImage.tsx b/Source/view/components/microbit/MicrobitImage.tsx index 18515a425..b2fa83922 100644 --- a/Source/view/components/microbit/MicrobitImage.tsx +++ b/Source/view/components/microbit/MicrobitImage.tsx @@ -44,7 +44,7 @@ export class MicrobitImage extends React.Component { } else if (this.context === VIEW_STATE.RUNNING) { setupAllButtons( this.props.eventTriggers, - this.svgRef.current.getButtons() + this.svgRef.current.getButtons(), ); } } @@ -54,7 +54,11 @@ export class MicrobitImage extends React.Component { window.document.removeEventListener("keyup", this.handleKeyUp); } setupKeyPresses = ( - onKeyEvent: (event: KeyboardEvent, active: boolean, key: string) => void + onKeyEvent: ( + event: KeyboardEvent, + active: boolean, + key: string, + ) => void, ) => { window.document.addEventListener("keydown", this.handleKeyDown); window.document.addEventListener("keyup", this.handleKeyUp); @@ -85,12 +89,12 @@ export class MicrobitImage extends React.Component { if (isActive) { button.children[0].setAttribute( "class", - BUTTON_STYLING_CLASSES.KEYPRESSED + BUTTON_STYLING_CLASSES.KEYPRESSED, ); } else { button.children[0].setAttribute( "class", - BUTTON_STYLING_CLASSES.DEFAULT + BUTTON_STYLING_CLASSES.DEFAULT, ); } button.setAttribute("pressed", `${isActive}`); @@ -103,7 +107,7 @@ MicrobitImage.contextType = ViewStateContext; const setupButton = ( buttonElement: SVGRectElement, eventTriggers: EventTriggers, - key: string + key: string, ) => { buttonElement.setAttribute("class", BUTTON_CLASSNAME.ACTIVE); @@ -128,7 +132,7 @@ const setupButton = ( }; const setupAllButtons = ( eventTriggers: EventTriggers, - buttonRefs: IRefObject + buttonRefs: IRefObject, ) => { for (const [key, ref] of Object.entries(buttonRefs)) { if (ref.current) { @@ -150,7 +154,7 @@ const disableAllButtons = (buttonRefs: IRefObject) => { }; const updateAllLeds = ( leds: number[][], - ledRefs: Array>> + ledRefs: Array>>, ) => { for (let j = 0; j < leds.length; j++) { for (let i = 0; i < leds[0].length; i++) { diff --git a/Source/view/components/microbit/MicrobitSimulator.tsx b/Source/view/components/microbit/MicrobitSimulator.tsx index 3ef219459..3c4c79a76 100644 --- a/Source/view/components/microbit/MicrobitSimulator.tsx +++ b/Source/view/components/microbit/MicrobitSimulator.tsx @@ -154,7 +154,7 @@ export class MicrobitSimulator extends React.Component { protected refreshSimulatorClick = () => { const button = window.document.getElementById( - CONSTANTS.ID_NAME.REFRESH_BUTTON + CONSTANTS.ID_NAME.REFRESH_BUTTON, ); if (button) { button.focus(); @@ -206,17 +206,17 @@ export class MicrobitSimulator extends React.Component { if (key === BUTTONS_KEYS.BTN_A) { this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_A, - active + active, ); } else if (key === BUTTONS_KEYS.BTN_B) { this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_B, - active + active, ); } else if (key === BUTTONS_KEYS.BTN_AB) { this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_AB, - active + active, ); } } else if ( @@ -227,7 +227,7 @@ export class MicrobitSimulator extends React.Component { this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_A, - active + active, ); } else if ( [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.B) && @@ -237,7 +237,7 @@ export class MicrobitSimulator extends React.Component { this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_B, - active + active, ); } else if ( [event.code, event.key].includes(CONSTANTS.KEYBOARD_KEYS.C) && @@ -247,7 +247,7 @@ export class MicrobitSimulator extends React.Component { this.imageRef.current?.updateButtonAttributes( BUTTONS_KEYS.BTN_AB, - active + active, ); } else if (event.key === CONSTANTS.KEYBOARD_KEYS.CAPITAL_F) { this.togglePlayClick(); diff --git a/Source/view/components/microbit/Microbit_svg.tsx b/Source/view/components/microbit/Microbit_svg.tsx index fd2ea1ca5..6471998e9 100644 --- a/Source/view/components/microbit/Microbit_svg.tsx +++ b/Source/view/components/microbit/Microbit_svg.tsx @@ -55,14 +55,16 @@ export class MicrobitSvg extends React.Component { y="0px" width="100%" height="100%" - fill="rgba(0,0,0,0)"> + fill="rgba(0,0,0,0)" + > + height="300%" + > + height="120%" + > @@ -107,7 +110,8 @@ export class MicrobitSvg extends React.Component { x1="0%" y1="0%" x2="0%" - y2="100%"> + y2="100%" + > + y2="100%" + > + y2="100%" + > + y2="100%" + > + y2="100%" + > + y2="100%" + > + y2="100%" + > + y2="100%" + > + y2="100%" + > + y2="100%" + > + y2="100%" + > + y2="100%" + > + y2="100%" + > + y2="100%" + > + y2="100%" + > + y2="100%" + > + y2="100%" + > + y2="100%" + > + y2="100%" + > + y2="100%" + > + y2="100%" + > + y2="100%" + > + y2="100%" + > + y2="100%" + > + y2="100%" + > + }} + > (0,0) + }} + > (1,0) + }} + > (2,0) + }} + > (3,0) + }} + > (4,0) + }} + > (0,1) + }} + > (1,1) + }} + > (2,1) + }} + > (3,1) + }} + > (4,1) + }} + > (0,2) + }} + > (1,2) + }} + > (2,2) + }} + > (3,2) + }} + > (4,2) + }} + > (0,3) + }} + > (1,3) + }} + > (2,3) + }} + > (3,3) + }} + > (4,3) + }} + > (0,4) + }} + > (1,4) + }} + > (2,4) + }} + > (3,4) + }} + > (4,4) @@ -1392,25 +1445,29 @@ export class MicrobitSvg extends React.Component { + fill="url(#gradient-pin-0)" + > P0, ANALOG IN + fill="url(#gradient-pin-1)" + > P1, ANALOG IN + fill="url(#gradient-pin-2)" + > P2, ANALOG IN + fill="url(#gradient-pin-3)" + > P3, ANALOG IN, LED Col 1 + fill="url(#gradient-pin-4)" + > P4, ANALOG IN, LED Col 2 + fill="url(#gradient-pin-5)" + > P5, BUTTON A + fill="url(#gradient-pin-6)" + > P6, LED Col 9 + fill="url(#gradient-pin-7)" + > P7, LED Col 8 + fill="url(#gradient-pin-8)" + > P8 + fill="url(#gradient-pin-9)" + > P9, LED Col 7 + fill="url(#gradient-pin-10)" + > P10, ANALOG IN, LED Col 3 + fill="url(#gradient-pin-11)" + > P11, BUTTON B + fill="url(#gradient-pin-12)" + > P12, RESERVED ACCESSIBILITY + fill="url(#gradient-pin-13)" + > P13, SPI - SCK + fill="url(#gradient-pin-14)" + > P14, SPI - MISO + fill="url(#gradient-pin-15)" + > P15, SPI - MOSI + fill="url(#gradient-pin-16)" + > P16, SPI - Chip Select + fill="url(#gradient-pin-17)" + > P17, +3v3 + fill="url(#gradient-pin-18)" + > P18, +3v3 + fill="url(#gradient-pin-19)" + > P19, I2C - SCL + fill="url(#gradient-pin-20)" + > P20, I2C - SDA + fill="url(#gradient-pin-21)" + > GND + fill="url(#gradient-pin-22)" + > GND + fill="url(#gradient-pin-23)" + > +3v3 + fill="url(#gradient-pin-24)" + > GND @@ -1603,7 +1681,8 @@ export class MicrobitSvg extends React.Component { role="button" aria-label="a" style={{ fill: "rgb(151, 151, 151)" }} - ref={this.buttonRefs.BTN_A}> + ref={this.buttonRefs.BTN_A} + > + ref={this.buttonRefs.BTN_B} + > + ref={this.buttonRefs.BTN_AB} + > = (props) => {
); - } + }, )} ); diff --git a/Source/view/components/toolbar/Gesture.tsx b/Source/view/components/toolbar/Gesture.tsx index cad53ea8b..dcca09bd5 100644 --- a/Source/view/components/toolbar/Gesture.tsx +++ b/Source/view/components/toolbar/Gesture.tsx @@ -20,7 +20,8 @@ export class Gesture extends React.Component { flexDirection: "column", justifyContent: "space-between", height: "75px", - }}> + }} + > { private handleOnKeyUp = ( e: React.KeyboardEvent, - onSendGesture?: (isActive: boolean) => void + onSendGesture?: (isActive: boolean) => void, ) => { if (e.key === CONSTANTS.KEYBOARD_KEYS.ENTER) { this.sensorButtonRef!.current!.setButtonClass(false); diff --git a/Source/view/components/toolbar/InputSlider.tsx b/Source/view/components/toolbar/InputSlider.tsx index db78f58d3..8f5fd1161 100644 --- a/Source/view/components/toolbar/InputSlider.tsx +++ b/Source/view/components/toolbar/InputSlider.tsx @@ -76,7 +76,7 @@ class InputSlider extends React.Component { return ( Math.max( this.props.minValue.toString().length, - this.props.maxValue.toString().length + this.props.maxValue.toString().length, ) + 2 ); }; diff --git a/Source/view/components/toolbar/SensorButton.tsx b/Source/view/components/toolbar/SensorButton.tsx index efd22eb96..1111bd7c0 100644 --- a/Source/view/components/toolbar/SensorButton.tsx +++ b/Source/view/components/toolbar/SensorButton.tsx @@ -16,7 +16,7 @@ class SensorButton extends React.Component { if (isActive && !isInputDisabled) { this.buttonRef.current?.setAttribute( "class", - "sensor-button active-button" + "sensor-button active-button", ); } else if (this.buttonRef.current) { this.buttonRef!.current!.setAttribute("class", "sensor-button"); @@ -35,7 +35,8 @@ class SensorButton extends React.Component { onKeyUp={this.props.onKeyUp} onKeyDown={this.props.onKeyDown} aria-label={`${this.props.type} sensor`} - className="sensor-button"> + className="sensor-button" + > {this.props.label} ); diff --git a/Source/view/components/toolbar/SensorModalUtils.tsx b/Source/view/components/toolbar/SensorModalUtils.tsx index 57a491960..4eff1c0ed 100644 --- a/Source/view/components/toolbar/SensorModalUtils.tsx +++ b/Source/view/components/toolbar/SensorModalUtils.tsx @@ -19,7 +19,8 @@ export const FEATURE_REQUEST_ON_GITHUB = ( @@ -157,7 +158,7 @@ export const getModalContent = ( onUpdateValue: (onUpdateValue: SENSOR_LIST, value: number) => void, sensorValues: { [key: string]: number }, onSelectGestures?: (event: React.ChangeEvent) => void, - sendGesture?: (isActive: boolean) => void + sendGesture?: (isActive: boolean) => void, ) => { if (label === CLUE_TOOLBAR_ICON_ID.GESTURE) { return CLUE_MODAL.GESTURE_CONTENT(onSelectGestures, sendGesture); diff --git a/Source/view/components/toolbar/ToolBar.tsx b/Source/view/components/toolbar/ToolBar.tsx index 9bdd48ae5..f49c04898 100644 --- a/Source/view/components/toolbar/ToolBar.tsx +++ b/Source/view/components/toolbar/ToolBar.tsx @@ -6,16 +6,16 @@ import { IconButton } from "office-ui-fabric-react"; import * as React from "react"; import { FormattedMessage, - injectIntl, WrappedComponentProps, + injectIntl, } from "react-intl"; import { SENSOR_LIST } from "../../constants"; import "../../styles/ToolBar.css"; import Button from "../Button"; import { DEFAULT_MODAL_CONTENT, - getModalContent, IModalContent, + getModalContent, } from "./SensorModalUtils"; interface IToolbarState { @@ -65,17 +65,18 @@ class ToolBar extends React.Component { /> ), }} - key={index}> + key={index} + >